././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1647479066.693276 sunpy-3.1.5/0000755000175100001710000000000000000000000011724 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/.readthedocs.yaml0000644000175100001710000000046100000000000015154 0ustar00vstsdockerversion: 2 build: os: ubuntu-20.04 tools: python: "3.9" apt_packages: - libopenjp2-7 - graphviz sphinx: builder: html configuration: docs/conf.py fail_on_warning: false python: install: - method: pip extra_requirements: - all - docs path: . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/CHANGELOG.rst0000644000175100001710000060553700000000000013765 0ustar00vstsdocker3.1.5 (2022-03-16) ================== Bug Fixes --------- - Maps created from :meth:`~sunpy.map.GenericMap.resample` and :meth:`~sunpy.map.GenericMap.superpixel` have been fixed in the case where the resampling was not square, and the PCi_j matrix (often a rotation matrix) was not a multiple of the identity matrix. When the PCi_j or CDi_j formalisms are used in the metadata these are now correctly modified, and the CDELT values are left unchanged. (`#5786 `__) - When getting IRIS files from the VSO, Fido was incorrectly labelling them as XML files. (`#5868 `__) - Fixes a bug where the ``cmap`` and ``norm`` keyword arguments were ignored when calling `~sunpy.map.MapSequence.plot`. (`#5889 `__) - Fix parsing of the GOES/XRS netcdf files to ignore leap seconds. (`#5915 `__) - Fixed compatability with ``h5netcdf>0.14`` when loading GOES netcdf files. (`#5920 `__) - Fixes a bug in `~sunpy.map.sources.SJIMap` where undefined variable was used when parsing the wavelength. Also fixes the unit parsing by removing the "corrected" string from the ``BUNIT`` keyword as "corrected DN" cannot be parsed as a valid FITS unit. (`#5968 `__) - Fixed unit handling issue with `.GenericMap` and lowercasing the unit before it submits it to `astropy.units`. (`#5970 `__) Documentation ------------- - Remove the part of the `~sunpy.map.sources.SJIMap` docstring that says it only works on L1 as the data work for L2 and the level checking was not being enforced. (`#5968 `__) 3.1.4 (2022-02-21) ================== Bug Fixes --------- - Fixed plotting and peeking NORH timeseries data with ``pandas`` 1.4.0. (`#5830 `__) - In the case where `sunpy.database.Database.fetch()` successfully downloads only some of the search results, a `~sunpy.database.PartialFetchError` is raised. This fixes a bug where the successful downloads would have been added to the database, but sometimes with incorrect metadata. (`#5835 `__) - `~sunpy.map.sources.HMIMap` now looks for ``'INSTRUME'`` instead of ``'TELESCOP'`` in order to support Helioviewer JPEG2000 versions of HMI data which do not preserve the ``'TELESCOP'`` keyword as expected in the JSOC standard. (`#5886 `__) Documentation ------------- - Added a known issues entry about ``scikit-image`` package version pinning. (`#5865 `__) 3.1.3 (2022-01-06) ================== Bug Fixes --------- - Added automatic conversion of some common but non-standard unit strings in CDF files to astropy unit objects. If sunpy does not recognise the unit string for a particular column, units of ``u.dimensionless_unscaled`` are applied to that column and a warning raised. If you think a given unit should not be dimensionless and support should be added for it in sunpy, please raise an issue at https://github.com/sunpy/sunpy/issues. (`#5692 `__) - In consultation with JSOC, we now limit all JSOC downloads to one connection. This will override all connection user settings passed to the downloader. (`#5714 `__) - Updated the ``plot`` methods on some timeseries classes to correctly label and format the time axis. (`#5720 `__) - Increased the default maximum amount of records returned from HEC to 500 from 10. If the maximum number of records are returned, a message is shown. (`#5738 `__) - Reading a series of CDF files where at least one of them is empty no longer raises an error. A message for each empty file is logged at the DEBUG level. (`#5751 `__) - :func:`sunpy.map.make_fitswcs_header` now includes a PC_ij matrix in the returned header if no rotation is specified. (`#5763 `__) - In the case where a map header has no PC_ij values, CROTA2 != 0, and CDELT1 != CDELT2, the calculation of the map rotation matrix has been fixed. This bug only affected maps with non-zero rotation, no PC matrix in the header, and un-equal scales along the two image axes. (`#5766 `__) Documentation ------------- - Add info about loading CDF files to the API documentation. (`#5735 `__) 3.1.2 (2021-12-02) ================== New Features ------------ - Added support for Python 3.10 (`#5568 `__) Bug Fixes --------- - The default ``id_type`` in :func:`sunpy.coordinates.get_horizons_coord` is now `None` to match the deafult ``id_type`` in astroquery 0.4.4, which will search major bodies first, and if no major bodies are found, then search small bodies. For older versions of astroquery the default ``id_type`` used by :func:`~sunpy.coordinates.get_horizons_coord` is still ``'majorbody'``. (`#5707 `__) - Fixed a long-standing bug where our logger could intercept Astropy warnings in addition to SunPy warnings, and thus could conflict with Astropy's logger. (`#5722 `__) - Updated asdf schemas so that references use URIs, as tags are not supported by the new asdf extensions API. (`#5723 `__) Documentation ------------- - Fixed various plotting issues with the gallery example :ref:`sphx_glr_generated_gallery_units_and_coordinates_AIA_limb_STEREO.py`. (`#5534 `__) - Improved the gallery example :ref:`sphx_glr_generated_gallery_units_and_coordinates_SDO_to_STEREO_Coordinate_Conversion.py` to better illustrate how coordinate transformations interact with submaps and coordinate plotting. (`#5534 `__) Internal Changes ---------------- - Added `packaging `__ as a core dependency as distutils is now deprecated. (`#5713 `__) - `~sunpy.util.exceptions.SunpyWarning` is no longer a subclass of `~astropy.utils.exceptions.AstropyWarning`. (`#5722 `__) 3.1.1 (2021-11-10) ================== Bug Fixes --------- - Fixed reading CDF files when a column has no entries. If this is the case the column will be ignored, and a message logged at DEBUG level. (`#5664 `__) - Fixed the units of `sunpy.map.sources.HMISynopticMap.scale` and `sunpy.map.sources.MDISynopticMap.scale`. (`#5682 `__) - Fixed a bug where custom values in the ``plot_settings`` dictionary were not being propagated to new map instances created when calling map methods (e.g. ``.submap``). (`#5687 `__) Documentation ------------- - Tidy the API Reference section of the documentation and improve the landing page for the docs. (`#5623 `__) Internal Changes ---------------- - `sunpy.map.GenericMap.wcs` now checks that the scale property has the correct units whilst constructing the WCS. (`#5682 `__) 3.1.0 (2021-10-29) ================== Breaking Changes ---------------- - :meth:`sunpy.timeseries.sources.NOAAIndicesTimeSeries.peek` accepts ``plot_type`` as an argument instead of ``type``. (`#5200 `__) - Fill values are now set to `numpy.nan` in ``sunpy.timeseries.sources.noaa`` file parsers. They were previously set to a fill value of ``-1``. (`#5363 `__) - `sunpy.map.GenericMap.date` now looks for more metadata than just DATE-OBS, using new FITS keywords defined in version 4 of the standard. `sunpy.map.GenericMap.date` now returns, in order of preference: 1. The DATE-OBS FITS keyword 2. `~sunpy.map.GenericMap.date_average` 3. `~sunpy.map.GenericMap.date_start` 4. `~sunpy.map.GenericMap.date_end` 5. The current time. If DATE-OBS is present alongside DATE-AVG or DATE-BEG and DATE-END, this results in a behaviour change to favour the new (more precisely defined) keywords. It is recommended to use `~sunpy.map.GenericMap.date_average`, `~sunpy.map.GenericMap.date_start`, or `~sunpy.map.GenericMap.date_end` instead if you need one of these specific times. (`#5449 `__) - :func:`sunpy.io.fits.get_header` no longer automatically tries to add the WAVEUNIT keyword if it isn't present in the header. To replicate the original behaviour do:: header = sunpy.io.fits.get_header(...) waveunit = sunpy.io.fits.extract_waveunit(header) if waveunit is not None: header['WAVEUNIT'] = waveunit The `sunpy.map.GenericMap.waveunit` property still uses :func:`sunpy.io.fits.extract_waveunit` to try and get the waveunit if the WAVEUNIT key isn't present. (`#5501 `__) - `sunpy.map.GenericMap.wcs` no longer passes the whole ``.meta`` dictionary to `astropy.wcs.WCS` when constructing ``.wcs``. Instead each metadata value is manually taken from various map properties, which allows fixes to be made to the WCS without modifying the original map header. We think that `~sunpy.map.GenericMap.wcs` correctly sets all the keys needed for a full WCS header, but if you find anything missing please open an issue on the sunpy issue tracker. (`#5501 `__) Deprecations ------------ - ``sunpy.util.scraper.Scraper`` has been moved into `sunpy.net`, please update your imports to be ``from sunpy.net import Scraper``. (`#5364 `__) - Using "neighbour" as a resampling method in :func:`sunpy.image.resample.resample` is deprecated. Use "nearest" instead, which has the same effect. (`#5480 `__) - The `sunpy.visualization.animator` subpackge has been spun out into the standalone `mpl-animators `_ package, with the exception of `~sunpy.visualization.animator.MapSequenceAnimator`. Please update your imports to replace ``sunpy.visualization.animator`` with ``mpl_animators``. This is primarily because the ``ndcube`` package now relies on the animator classes as well as `sunpy`. (`#5619 `__) Removals -------- - The deprecated ``sunpy.roi.chaincode.Chaincode`` has been removed in favour of `sunpy.net.helio.Chaincode`. (`#5304 `__) - The deprecated ``sunpy.roi.roi`` was removed, there is no direct replacement but `astropy-regions `__ is something to consider. (`#5304 `__) - The deprecated ``sunpy.instr`` has been removed, please use `sunkit_instruments `__. (`#5304 `__) - The deprecated ``sunpy.map.GenericMap.size`` has been removed, please use ``sunpy.map.GenericMap.data.size``. (`#5304 `__) - The deprecated ability to read txt files from `sunpy.timeseries.sources.noaa.NOAAIndicesTimeSeries` and `sunpy.timeseries.sources.noaa.NOAAPredictIndicesTimeSeries` has been removed as the data provided by NOAA is now provided as JSON files. (`#5304 `__) - Removed various deprecated methods on our Fido clients and responses: 1. ``UnifiedResponse.build_table``, ``UnifiedResponse.tables``, ``UnifiedResponse.responses``, ``UnifiedResponse.get_response`` and ``UnifiedResponse.blocks`` as ``UnifiedResponse`` is now an `astropy.table.Table` that is sliceable. 2. ``UnifiedResponse.response_block_properties`` as ``UnifiedResponse.path_format_keys`` was added as a better replacement. 3. ``HECClient.time_query`` as you can now use ``Fido.search`` directly. 4. ``sunpy.net.jsoc.attrs.Keys`` was not used for querying JSOC. 5. ``sunpy.net.jsoc.JSOCClient.search_metadata`` as the functionality this provided was merged into `sunpy.net.jsoc.JSOCClient.search`. 6. ``sunpy.net.vso.VSOClient.link`` as better search support in the client replaces this method. (`#5304 `__) - The deprecated ``sunpy.map.GenericMap.draw_rectangle()`` has been removed, the replacement is :meth:`sunpy.map.GenericMap.draw_quadrangle` (`#5304 `__) - sunpy now errors if the unused ``.rsun`` or ``.heliographic_observer`` attributes are set on a `~astropy.wcs.WCS`. (`#5348 `__) - Support for passing non-unit levels to :meth:`sunpy.map.GenericMap.draw_contours` when map data has units set has been removed, and with now raise an error. (`#5352 `__) - The ``origin`` argument to :meth:`sunpy.map.GenericMap.world_to_pixel` and :meth:`sunpy.map.GenericMap.pixel_to_world` has been removed. (`#5353 `__) - Support for plotting or contouring `~sunpy.map.GenericMap` on axes that are not `~astropy.visualization.wcsaxes.WCSAxes` has been removed. To create a ``WCSAxes``, use the ``projection`` argument when the axes is created, e.g. ``fig.add_subplot(111, projection=my_map)``. (`#5354 `__) - The following search attributes in `sunpy.net.vso.attrs` have been removed: ``['Time', 'Instrument', 'Wavelength', 'Source', 'Provider', 'Level', 'Sample', 'Detector', 'Resolution', 'Physobs']``. Use the equivalent attribute from `sunpy.net.attrs` instead. (`#5355 `__) - The default response format from the VSO client is now a table. (`#5355 `__) - ``sunpy.net.hek.attrs.Time`` has been removed, use `sunpy.net.attrs.Time` instead. (`#5355 `__) New Features ------------ - Ensured that ``plot`` and ``peek`` will output the same figures for all `sunpy.timeseries.TimeSeries` sources. (`#5200 `__) - Added hook file and tests for using PyInstaller with sunpy. (`#5224 `__) - Allows :meth:`sunpy.map.GenericMap.draw_quadrangle` to accept pixel units as input to enable plotting boxes in the pixel space of the map, which can be different from the plot axes. (`#5275 `__) - Added the :func:`~sunpy.coordinates.propagate_with_solar_surface` context manager for transformations, which will automatically apply solar differential rotation when transforming a coordinate between frames with a change in time (``obstime``). (`#5281 `__) - Add support for parsing the observer location from a `~astropy.wcs.WCS` object when using the 'OBSGEO' formulation. This is the recommended way to define the observer location of a ground based observer. (`#5315 `__) - Added a new function, :meth:`sunpy.visualization.draw_limb`, that draws the solar limb as seen from an arbitrary observer coordinate on a world coordinate system aware Axes. (`#5414 `__) - `sunpy.map.GenericMap.rsun_meters` now uses `sunpy.map.GenericMap.rsun_obs` as a fallback to calculate the assumed radius of emission if RSUN_REF metadata isn't present but metadata for `~sunpy.map.GenericMap.rsun_obs` is. (`#5416 `__) - Added :func:`sunpy.coordinates.utils.get_limb_coordinates` to get the solar limb coordinates as seen from a given observer. (`#5417 `__) - Printing the response from a `~sunpy.net.Fido` query now includes the URL where the data files are sourced from. If you develop a third-party `~sunpy.net.Fido` client, support for this can be automatically enabled by adding a ``info_url`` property to your `~sunpy.net.base_client.BaseClient` that returns a URL as a string. (`#5431 `__) - `~sunpy.timeseries.TimeSeries` can now read CDF files that conform to the ISTP/IACG guidelines (https://spdf.gsfc.nasa.gov/sp_use_of_cdf.html). (`#5435 `__) - The properties `~sunpy.map.GenericMap.date_start`, `~sunpy.map.GenericMap.date_end`, and `~sunpy.map.GenericMap.date_average` have been added to be drawn from the relevant FITS metadata, if present in the map header. (`#5449 `__) - Add default color map and normalization for `~sunpy.map.sources.HMISynopticMap` The default color map is 'hmimag' and the default normalization is linear between -1.5e-3 and +1.5e3, the expected normalization for this particular color map. (`#5464 `__) - The headers produced by :func:`~sunpy.map.make_fitswcs_header` now include ``NAXIS``, ``NAXIS1``, and ``NAXIS2`` keywords. (`#5470 `__) - The `~astropy.wcs.WCS` instance returned by the `sunpy.map.GenericMap.wcs` property now includes the shape of the data array. (`#5470 `__) - Added the method :meth:`sunpy.map.GenericMap.reproject_to` for reprojecting a `~sunpy.map.Map` to a different WCS. This method requires the optional package `reproject` to be installed. (`#5470 `__) - Registered the time format ``tai_seconds`` for `astropy.time.Time` (via `~sunpy.time.TimeTaiSeconds`) to support parsing the numerical time format of TAI seconds since 1958-01-01 00:00:00. This format includes UTC leap seconds, and enables equivalent functionality to the ``anytim2tai`` routine in SSW. (`#5489 `__) - Added `sunpy.map.sources.WISPRMap` as a map source for WISPR on Parker Solar Probe. This improves the `~sunpy.map.GenericMap.name` of the map and adds correct information for the `~sunpy.map.GenericMap.processing_level` and `~sunpy.map.GenericMap.exposure_time`. (`#5502 `__) - :func:`sunpy.io.fits.write` can now update the ``data`` and ``header`` of an existing HDU instance, as an alternative to creating a new instance of a specified HDU type. This adds support for writing a HDU (such as :class:`~astropy.io.fits.CompImageHDU`) initialised with non-default keyword arguments. (`#5503 `__) - Added `~sunpy.timeseries.GenericTimeSeries.observatory` to provide observatory information for the timeseries e.g. specific goes satellite number. (`#5556 `__) - :meth:`sunpy.timeseries.GenericTimeSeries.plot` and :meth:`sunpy.timeseries.GenericTimeSeries.peek` will now automatically label the y-axis if all the columns being plotted have the same units. (`#5557 `__) - :meth:`sunpy.timeseries.GenericTimeSeries.plot` and :meth:`sunpy.timeseries.GenericTimeSeries.peek` now have an option ``columns`` that allows plotting a subset of the columns present. (`#5557 `__) - Added a new CDAWeb client, along with helper utilities to `sunpy.net.cdaweb`. (`#5558 `__) - Support for filtering searches with JSOC keywords has been added to ``Fido.search``. (`#5566 `__) - Added support for arithmetic operations between`~sunpy.map.GenericMap` and array-like objects. (`#5614 `__) - Added ``quantity`` attribute to `~sunpy.map.GenericMap` to expose the ``data`` attribute as a `~astropy.units.Quantity` using the ``unit`` attribute. (`#5614 `__) Bug Fixes --------- - :meth:`sunpy.map.GenericMap.superpixel` now keeps the reference coordinate of the WCS projection the same as the input map, and updates the reference pixel accordingly. This fixes inconsistencies in the input and output world coordinate systems when a non-linear projection is used. (`#5295 `__) - Inputs to the ``dimensions`` and ``offset`` arguments to :meth:`sunpy.map.GenericMap.superpixel` in units other than ``u.pix`` (e.g. ```u.kpix``) are now handled correctly. (`#5301 `__) - Fractional inputs to the ``dimensions`` and ``offset`` arguments to :meth:`sunpy.map.GenericMap.superpixel` were previously rounded using `int` in the superpixel algorithm, but not assigned integer values in the new meatadata. This has now been changed so the rounding is correctly reflected in the meatadata. (`#5301 `__) - Remove runtime use of ``astropy.tests.helper.assert_quantity_allclose`` which introduces a runtime dependancy on ``pytest``. (`#5305 `__) - :meth:`sunpy.map.GenericMap.resample` now keeps the reference coordinate of the WCS projection the same as the input map, and updates the reference pixel accordingly. This fixes inconsistencies in the input and output world coordinate systems when a non-linear projection is used. (`#5309 `__) - Fix saving `.GenericMap` to an asdf file with version 2.8.0 of the asdf package. (`#5342 `__) - When the limb is entirely visible, :meth:`sunpy.map.GenericMap.draw_limb` no longer plots an invisible patch for the hidden part of the limb and now returns `None` instead of the invisible patch. Similarly, when the limb is entirely invisible, no patch is drawn for the visible part and `None` is returned instead of the visible patch. (`#5414 `__) - :meth:`sunpy.map.GenericMap.plot` now correctly sets axis labels based on the coordinate system of the axes, and not the coordinate system of the map being plotted. This was previously only an issue if using ``autoalign=True`` when the Map coordinate system was different to the axes coordinate system. (`#5432 `__) - :meth:`sunpy.map.GenericMap.plot` no longer adds a unit string to the axis labels if the axes being plotted on is a WCSAxes. For a WCSAxes, angular units are indicated in the tick labels, and automatically change when the zoom level changes from e.g. degrees to arc-minutes. This could previously lead to situations where the axis label units were incorrect. (`#5432 `__) - Implement automatic fallback to helioviewer mirrors if API is non-functional. (`#5440 `__) - Fixed the incorrect value for the FITS WCS ``LONPOLE`` keyword when using :func:`~sunpy.map.make_fitswcs_header` for certain combinations of WCS projection and reference coordinate. (`#5448 `__) - The date returned by `~sunpy.map.GenericMap.date` for Solar Orbiter/EUI maps has been adjusted to be taken from the DATE-AVG keyword (the middle of the image acquisition period), instead of the DATE-OBS keyword (the beginning of the image acquisition period). This means the observer coordinate now has the correct date. (`#5462 `__) - The ``.unit`` attribute for HMI synoptic maps has been fixed. (`#5467 `__) - When "TAI" is in the date string, `sunpy.map.GenericMap.date` now only raises a warning if the TIMESYS keyword is present and different to "TAI". Previously a warning was raised all the time when "TAI" was in the date string. (`#5468 `__) - Fixed a bug where the property `sunpy.map.GenericMap.rsun_meters` would always internally determine the observer location, even when it is not needed, particularly for Stonyhurst heliographic maps, which have no notion of an observer. Thus, when working with a Stonyhurst heliographic map, a user could get an irrelevant warning message about having to assume an observer location (Earth center). (`#5478 `__) - Fixed the unintended insertion of (assumed) observer location information when accessing the property `sunpy.map.GenericMap.wcs` for Stonyhurst heliographic maps. (`#5478 `__) - Fixed an incorrect value for the FITS WCS ``LONPOLE`` keyword when using :func:`~sunpy.map.make_fitswcs_header` for `~sunpy.coordinates.frames.Helioprojective` maps with certain values of latitude for the reference coordinate. (`#5490 `__) - A non-standard ``CROTA`` keyword included in a `sunpy.map.sources.EUIMap` FITS header is now renamed to the recommended ``CROTA2`` so a warning is no longer raised. (`#5493 `__) - The plotting x-limits of :meth:`sunpy.timeseries.sources.NOAAIndicesTimeSeries.plot` are now adjusted to only include finite points in the timeseries data. (`#5496 `__) - The Hinode/XRT map source now corrects the TIMESYS keyword, fixing the ``.wcs`` property that was previously broken for Hinode/XRT maps. (`#5508 `__) - Updated `sunpy.map.CompositeMap.plot` to support the ``linestyles`` and ``colors`` arguments, in addition to the existing ``linewidths`` argument. (`#5521 `__) - Fixed a bug where rotating a `~sunpy.map.Map` could result in an extremely small shift (at the numerical-precision level) in the mapping from world coordinates to pixels. (`#5553 `__) - Fixed a bug where rotating a `~sunpy.map.Map` that is missing observation-time metadata could result in an incorrect reference coordinate. (`#5553 `__) - Fix a bug where saving a helioprojective or heliocentric coordinate to an asdf file didn't work due to a schema version mismatch if the observer location was a fully specified Stonyhurst heliographic coordinate. (`#5584 `__) - `~sunpy.map.sources.XRTMap` uppercases the ``TIMESYS`` key before checking if the key needs to be fixed. (`#5592 `__) - Fixed passing a URL to :func:`sunpy.io.read_file` on windows. (`#5601 `__) - Fixed a bug where the ``date`` property on `~sunpy.map.sources.HMISynopticMap` returned ``None`` if the ``DATE-OBS`` key was present. (`#5648 `__) Documentation ------------- - Added the gallery example :ref:`sphx_glr_generated_gallery_differential_rotation_comparing_rotation_models.py` to visualize the differences between models of solar differential rotation. (`#5527 `__) - Added an example to how to save out maps as FITS files and load them back in, :ref:`sphx_glr_generated_gallery_saving_and_loading_data_genericmap_in_fits.py`. (`#5544 `__) Internal Changes ---------------- - The `~sunpy.coordinates.frames.Helioprojective` frame now has the convenience property ``angular_radius`` to return the angular radius of the Sun as seen by the observer. (`#5191 `__) - Online tests can now report back status of remote urls and will XFAIL if the remote server is unreachable. (`#5233 `__) - Re-enabled the unit test to check for coordinates consistency with JPL HORIZONS when the matching ephemeris can be specified. (`#5314 `__) - The `~sunpy.timeseries.TimeSeries` factory has been refactored to improve readability and maintainability of the internal code. (`#5411 `__) - `sunpy.map.GenericMap.rsun_obs` no longer emits a warning if the metadata it looks for is not present. Instead the standard photospheric radius is assumed and a log message emitted at the 'info' level. (`#5416 `__) - Nearest-neighbour and linear (the default for :meth:`sunpy.map.GenericMap.resample`) resampling have been significantly sped up. (`#5476 `__) - `sunpy.map.Map` now raises a clear error when the map is constructed if units of either two axes are not angular units. (`#5602 `__) 3.0.1 (2021-07-03) ================== Bug Fixes --------- - Fixed a bug where `~sunpy.map.GenericMap` used to break with keyword arguments. (`#5392 `__) - Fixed a bug where calling :meth:`sunpy.map.GenericMap.draw_contours` on a different WCS could result in an unnecessary expansion of the plot limits. (`#5398 `__) - Fixed incorrect return values from :func:`~sunpy.map.all_corner_coords_from_map` if a rectangular map was provided. (`#5419 `__) - Do not trigger a pytest import in the asdf plugin for saving sunpy coordinate frames. (`#5429 `__) - Constructing a 2D coordinate in the `~sunpy.coordinates.frames.HeliographicCarrington` frame with ``observer='self'`` now raises an error upon creation. When specifying ``observer='self'``, the ``radius`` coordinate component serves as the Sun-observer distance that is necessary to fully define the Carrington heliographic coordinates. (`#5358 `__) - Fixed two bugs with handling the motion of the Sun when transforming between coordinate frames with a change in ``obstime``. These bugs did not affect any results if the context manager :func:`~sunpy.coordinates.transform_with_sun_center` had been used. (`#5381 `__) - Fixed a bug where the ``rsun`` frame attribute could be unintentionally reset to the default value during transformation. This bug primarily affected the transformation of a `~sunpy.coordinates.frames.Helioprojective` coordinate to a `~sunpy.coordinates.frames.HeliographicStonyhurst` frame. (`#5395 `__) - Fixed a bug where creating a `~sunpy.coordinates.frames.HeliographicStonyhurst` frame or a `~sunpy.coordinates.frames.HeliographicCarrington` frame from WCS information failed to make use of any specified ``rsun_ref`` value. (`#5395 `__) - `~sunpy.map.sources.SXTMap` now always returns `None` for the ``wavelength`` attribute. Previously this raised an error. (`#5401 `__) Added/Improved Documentation ---------------------------- - Simplified the "Downloading LASCO C2" gallery example by removing redundant modifications to the metadata before it is loaded by `~sunpy.map.Map`. (`#5402 `__) - Tided up the HMI synoptic map example by removing redundant code and correcting some of the comments. (`#5413 `__) 3.0.0 (2021-05-14) ================== Backwards Incompatible Changes ------------------------------ - ``sunpy.instr`` has been depreacted and will be removed in sunpy 3.1 in favour of `sunkit_instruments`. The code that is under ``sunpy.instr`` is imported via `sunkit_instruments` to ensure backwards comparability. (`#4526 `__) - Several `sunpy.map.GenericMap` attributes have been updated to return `None` when the relevant piece of FITS metadata is missing. These are: - `~sunpy.map.GenericMap.exposure_time`, previously defaulted to zero seconds. - `~sunpy.map.GenericMap.measurement`, previously defaulted to zero. - `~sunpy.map.GenericMap.waveunit`, previously defaulted to ``u.one``. - `~sunpy.map.GenericMap.wavelength`, previously defaulted to zero. (`#5126 `__) - `~sunpy.coordinates.frames.HeliographicStonyhurst` and `~sunpy.coordinates.frames.HeliographicCarrington` no longer automatically convert 2D input to a 3D coordinate during instantiation. Instead, the 2D-to-3D conversion is deferred until the coordinate is transformed to a different frame, or with a call to the method :meth:`~sunpy.coordinates.frames.BaseHeliographic.make_3d`. (`#5211 `__) - Changed URL for the `sunpy.net.dataretriever.sources.noaa.SRSClient` from "ftp://ftp.swpc.noaa.gov/pub/warehouse/" to "ftp://ftp.ngdc.noaa.gov/STP/swpc_products/daily_reports/". The old URL is unsupported and we expect the files will be the same but we can not say with 100% certainty. (`#5173 `__) - Changed `sunpy.net.attrs.Source` to `sunpy.net.attrs.Provider` for the `sunpy.net.dataretriever.sources.gong.GONGClient`. (`#5174 `__) - The ``rsun`` frame attribute of `~sunpy.coordinates.frames.Helioprojective` now converts any input to kilometers. (`#5211 `__) - :meth:`sunpy.map.CompositeMap.plot` now internally calls :meth:`sunpy.map.GenericMap.plot` and :meth:`sunpy.map.GenericMap.draw_contours`, which may affect the plot output of existing user code. (`#5255 `__) - Removed the ``basic_plot`` keyword argument from :meth:`sunpy.map.CompositeMap.peek` due to its unreliability. (`#5255 `__) - ``sunpy.util.sphinx.changelog`` and ``sunpy.util.towncrier`` have been removed and are now in a standalone package `sphinx-changelog `__. (`#5049 `__) Deprecations and Removals ------------------------- - Deprecated ``sunpy.map.GenericMap.draw_rectangle`` in favor of :meth:`~sunpy.map.GenericMap.draw_quadrangle`. (`#5236 `__) - Using `~sunpy.map.GenericMap` plotting methods on an `~matplotlib.axes.Axes` that is not a `~astropy.visualization.wcsaxes.WCSAxes` is deprecated. This previously raised a warning, but is now formally deprecated, and will raise an error in sunpy 3.1. (`#5244 `__) - Deprecated ``sunpy.roi.chaincode.Chaincode`` and created a replacement at `sunpy.net.helio.Chaincode`. This replacement has the following changes: 1. Added support for numpy array as an input (it was broken before). 2. Renamed ``BoundingBox`` to ``boundingbox`` 3. Renamed ``subBoundingBox`` to ``sub_boundingbox`` 4. Now area and length raise `NotImplementedError` (`#5249 `__) - Deprecated ``sunpy.roi.roi``, as it currently has no obvious use and has never seen any real development work. (`#5249 `__) Features -------- - :func:`sunpy.coordinates.get_horizons_coord` can now be given a start time, end time, and number of intervals (or interval length) to query a evenly spaced set of times. See the documentation string for more information and an example. (`#4698 `__) - Added :meth:`sunpy.map.GenericMap.draw_quadrangle` for drawing a quadrangle on a map. A quadrangle has edges that are aligned with lines of constant latitude and longitude, but these can be in a different coordinate system than that of the map. (`#4809 `__) - Added a ``longitude`` keyword argument to :func:`~sunpy.coordinates.sun.carrington_rotation_time` as an alternate way to specify a fractional Carrington rotation. (`#4879 `__) - Colorbar in `sunpy.map.GenericMap.peek` now has a unit label. (`#4930 `__) - The default axes used by ``BaseFuncAnimator.get_animation()`` is now ``BaseFuncAnimator.axes``, instead of the currently active axes (accessed via. :func:`matplotlib.pyplot.gca`). The allows animations to be created on figures created directly using `matplotlib.figure.Figure`. To revert to the previous behaviour of using the current axes, give ``axes=plt.gca()`` to ``get_animation()``. (`#4968 `__) - Added colormaps for Solar Orbiter EUI images. These are used automatically when an EUI image is loaded. (`#5023 `__) - Added the ability to dynamically scale `sunpy.visualization.animator` instances. By specifying the ``clip_interval`` keyword, it will now clip the minimum and maximum at each slider step to the specified interval. (`#5025 `__) - Added a ``sunpy.time.timerange.TimeRange.__contains__`` method to `sunpy.time.TimeRange` that tests if two time ranges overlap. (`#5093 `__) - Added the ability to namespace files downloaded using `sunpy.data.data_manager.manager.DataManager` by prepending the file name with module name. (`#5111 `__) - Added a rigid rotation model to :func:`~sunpy.physics.differential_rotation.diff_rot` via ``rot_type=rigid``, where the rotation rate does not vary with latitude. (`#5132 `__) - Added a :meth:`~sunpy.map.MapSequence.save` method to `sunpy.map.MapSequence` that saves each map of the sequence. (`#5145 `__) - The allowable ``level`` inputs to :meth:`sunpy.map.GenericMap.contour` and :meth:`sunpy.map.GenericMap.draw_contours` have been consolidated. Both methods now accept - Scalars, if the map has no units - Quantities, if the map has units - Percentages (`#5154 `__) - Added support for corrected NOAA SWPC solar region summary data files. (`#5173 `__) - Updated ``sunpy.util.sysinfo.system_info`` to return all optional dependencies of sunpy. (`#5175 `__) - `sunpy.map.Map` now supports the EUI instrument on Solar Orbiter. (`#5210 `__) - `~sunpy.coordinates.frames.HeliographicStonyhurst` and `~sunpy.coordinates.frames.HeliographicCarrington` now have an ``rsun`` frame attribute to specify the radius of the Sun, which defaults to the photospheric radius defined in `sunpy.sun.constants`. This frame attribute is used when converting a 2D coordinate (longitude and latitude, with no specified radial distance) to a 3D coordinate by setting the radial distance to ``rsun`` (i.e., the assumption is that the coordinate is on the surface of the Sun). (`#5211 `__) - Enhanced :meth:`sunpy.map.GenericMap.draw_limb` so that the solar limb can be plotted on axes that correspond to a different map (e.g., with a different observer). The part of the limb that is not visible to the axes's observer because it is on the far side of the Sun is shown as dotted rather than solid. (`#5237 `__) - `~sunpy.util.MetaDict` now saves a copy of the metadata on creation, which can be accessed using the `~sunpy.util.MetaDict.original_meta` property. Three new properties have also been added to query any changes that have been made to metadata: - `~sunpy.util.MetaDict.added_items` - `~sunpy.util.MetaDict.removed_items` - `~sunpy.util.MetaDict.modified_items` As an example, ``my_map.meta.modified_items`` will return a dictionary mapping keys to their original value and current value. (`#5241 `__) - Added :func:`sunpy.map.contains_coordinate` which provides a quick way to see if a world coordinate is contained within the array bounds of a map. (`#5252 `__) - Added an optional keyword argument ``autoalign`` to :meth:`sunpy.map.GenericMap.plot` for plotting a map to axes that correspond to a different WCS. See :ref:`sphx_glr_generated_gallery_map_transformations_autoalign_aia_hmi.py`. (`#5255 `__) - :meth:`sunpy.map.CompositeMap.plot` now properly makes use of WCS information to position and orient maps when overlaying them. (`#5255 `__) Bug Fixes --------- - Fixed the drawing methods of `sunpy.map.GenericMap` (e.g., ``~sunpy.map.GenericMap.draw_rectangle``) so that any text labels will appear in the legend. (`#5019 `__) - Fixed bug in ``sunpy.until.scraper.Scraper`` which caused URL patterns containing backslashes to be incorrectly parsed on Windows. (`#5022 `__) - Constructing a `~sunpy.util.MetaDict` is now more lenient, and accepts any class that inherits from `collections.abc.Mapping`. This fixes a regression where headers read with `astropy.io.fits` raised an error when passed to individual `~sunpy.map` sources. (`#5047 `__) - Added warning to :meth:`sunpy.map.GenericMap.rotate` when specified ``missing`` value is not compatible with the number type of the data array. (`#5051 `__) - Prevented some colormaps being accidentally modified depending on the order and method through which they were accessed. (`#5054 `__) - Reverted change for `sunpy.map.GenericMap.draw_limb` that made it use "add_artist" as it was changing the FOV of the plotted image. (`#5069 `__) - Fixed a bug where some `~sunpy.coordinates.metaframes.RotatedSunFrame` transformations could fail with an ``observer=None`` error. (`#5084 `__) - Fixed bug where `sunpy.data.data_manager.DataManager` would fail to recover upon deleting the sqlite database file. (`#5089 `__) - Fixed a bug where coordinate frames were considered different due to an unintended time difference during time handling at the level of numerical precision (i.e., tens of picoseconds). This resulted in the unexpected use of transformation machinery when transforming a coordinate to its own coordinate frame. (`#5127 `__) - Fixed a bug with failing downloads in 2010 with the `~sunpy.net.dataretriever.sources.noaa.SRSClient`. (`#5159 `__) - If the property `sunpy.map.GenericMap.rsun_obs` needs to calculate the solar angular radius from header information, it now properly uses the ``rsun_ref`` keyword if it is present and does not emit any warning. (`#5172 `__) - Added a "rsun_obs" keyword to the output of :func:`sunpy.map.make_fitswcs_header` if the coordinate argument has a "rsun" frame attribute. (`#5177 `__) - Fixed small inaccuracies in the grid plotted by :meth:`~sunpy.map.GenericMap.draw_grid` for maps that specify a radius of the Sun that is different from the constant in `sunpy.sun.constants`. (`#5211 `__) - Fixed :meth:`sunpy.map.GenericMap.draw_contours` so that the contours from a map can be plotted on axes with a different coordinate system. (`#5239 `__) - When using the cylindrical representation of ``Heliocentric`` to work in the Heliocentric Radial coordinate frame, the ``psi`` component now goes from 0 to 360 degrees instead of -180 to 180 degrees. (`#5242 `__) - Changed ``MDIMap`` to use the "CONTENT" keyword to identify the measurement, similar to ``HMIMap``, and removed the special-case nickname. This fixes the broken title on plots. (`#5257 `__) - :func:`sunpy.coordinates.solar_frame_to_wcs_mapping` now sets the observer auxiliary information when a `~sunpy.coordinates.HeliographicCarrington` frame with ``observer='self'`` is passed. (`#5264 `__) - Calling :func:`sunpy.map.make_fitswcs_header` with a `~sunpy.coordinates.HeliographicCarrington` coordinate that with ``observer='self'`` set now correctly sets the observer information in the header. (`#5264 `__) - :meth:`sunpy.map.GenericMap.superpixel` now keeps the reference coordinate of the WCS projection the same as the input map, and updates the reference pixel accordingly. This fixes inconsistencies in the input and output world coordinate systems when a non-linear projection is used. (`#5295 `__) - Inputs to the ``dimensions`` and ``offset`` arguments to :meth:`sunpy.map.GenericMap.superpixel` in units other than ``u.pix`` (e.g. ```u.kpix``) are now handled correctly. (`#5301 `__) - Fractional inputs to the ``dimensions`` and ``offset`` arguments to :meth:`sunpy.map.GenericMap.superpixel` were previously rounded using `int` in the superpixel algorithm, but not assigned integer values in the new meatadata. This has now been changed so the rounding is correctly reflected in the meatadata. (`#5301 `__) - Remove runtime use of ``astropy.tests.helper.assert_quantity_allclose`` which introduces a runtime dependancy on ``pytest``. (`#5305 `__) - :meth:`sunpy.map.GenericMap.resample` now keeps the reference coordinate of the WCS projection the same as the input map, and updates the reference pixel accordingly. This fixes inconsistencies in the input and output world coordinate systems when a non-linear projection is used. (`#5309 `__) - Fix saving `.GenericMap` to an asdf file with version 2.8.0 of the asdf package. (`#5342 `__) Added/Improved Documentation ---------------------------- - Added a gallery example (:ref:`sphx_glr_generated_gallery_plotting_plot_rectangle.py`) for drawing rectangles on maps. (`#4528 `__) - Added an example (:ref:`sphx_glr_generated_gallery_plotting_wcsaxes_plotting_example.py`) of how pixel and SkyCoords work when plotted with `~astropy.visualization.wcsaxes`. (`#4867 `__) - Added a gallery example (:ref:`sphx_glr_generated_gallery_plotting_plotting_blank_map.py`) on how to create a blank map and mark locations. (`#5077 `__) - Added a gallery example (:ref:`sphx_glr_generated_gallery_plotting_hmi_cutout.py`) demonstrating how to add a HMI zoomed-in region next to a full disk HMI image. (`#5090 `__) - Updated the :ref:`sphx_glr_generated_gallery_computer_vision_techniques_mask_disk.py` example to generate the mask using :func:`sunpy.map.coordinate_is_on_solar_disk`. (`#5114 `__) - Added a gallery example (:ref:`sphx_glr_generated_gallery_map_map_segment.py`) demonstrating how to create a segment of a particular map from transformed coordinates. (`#5121 `__) - For the various subclasses of `~sunpy.map.GenericMap` (e.g., `~sunpy.map.sources.AIAMap`), the online documentation now shows all of the inherited attributes and methods. (`#5142 `__) - Added a documentation string to `~sunpy.map.sources.sdo.HMISynopticMap`. (`#5186 `__) - Added a new gallery example showcasing how to overlay HMI contours on an AIA image. (`#5229 `__) Trivial/Internal Changes ------------------------ - Replaced the old test runner with a new version that adds a dependency check before the test suite is run. (`#4596 `__) - The testing suite now raises a warning if the `~matplotlib.pyplot` figure stack is not empty prior to running a test, and it closes all open figures after finishing each test. (`#4969 `__) - Improved performance when moving the slider in ``sunpy.visualisation.animator.ArrayAnimatorWCS``. (`#4971 `__) - Added some basic logging to HEK searches, at the 'debug' logging level. (`#5020 `__) - Refactored `~sunpy.coordinates.metaframes.RotatedSunFrame` transformations for improved performance. (`#5084 `__) - Re-ordered keyword-only arguments of ``sunpy.map.GenericMap.draw_rectangle`` to match :meth:`sunpy.map.GenericMap.submap`. (`#5091 `__) - Significantly sped up calls to :func:`~sunpy.time.parse_time` for string arguments. This will have knock on effects, including improved performance of querying the VSO. (`#5108 `__) - Added tests for ``sunpy.visualization.animator.mapsequenceanimator`` and :meth:`sunpy.map.MapSequence.plot`. (`#5125 `__) - The ``CROTA`` keywords are no longer set on `sunpy.map.GenericMap.wcs`, as the ``PC_ij`` keywords are always set and the FITS standard says that these keywords must not co-exist. (`#5166 `__) - Temporarily disabled the unit test to check for coordinates consistency with JPL HORIZONS due to the inability to choose a matching ephemeris. (`#5203 `__) - :func:`~sunpy.visualization.wcsaxes_compat.wcsaxes_heliographic_overlay` now accepts ``obstime`` and ``rsun`` optional arguments. This function is not typically called directly by users. (`#5211 `__) - `~sunpy.map.GenericMap` plotting methods now have consistent argument checking for the ``axes`` argument, and will raise the same warnings or errors for similar ``axes`` input. (`#5223 `__) - Calling :meth:`sunpy.map.GenericMap.plot` on a `~astropy.visualization.wcsaxes.WCSAxes` with a different World Coordinate System (WCS) to the map now raises a warning, as the map data axes may not correctly align with the coordinate axes. This happens if an `~matplotlib.axes.Axes` is created with a projection that is a different map to the one being plotted. (`#5244 `__) - Re-enabled the unit test to check for coordinates consistency with JPL HORIZONS when the matching ephemeris can be specified. (`#5314 `__) 2.1.0 (2020-02-21) ================== Backwards Incompatible Changes ------------------------------ - Support for Python 3.6 and Numpy 1.15 has been dropped in line with `NEP 29 `_. The minimum supported version of Astropy is now 4.0, and the minimum version of scipy is now 1.2. (`#4284 `__) - Changed :func:`sunpy.coordinates.sun.B0` return type from `~astropy.coordinates.Angle` to `~astropy.coordinates.Latitude`. (`#4323 `__) - An error is now raised if ``vmin`` or ``vmax`` are passed to to `sunpy.map.GenericMap.plot` and they are already set on the map ``norm``. This is consistent with upcoming Matplotlib changes. (`#4328 `__) - Previously slicing the result of ``Fido.search()`` (a `~sunpy.net.fido_factory.UnifiedResponse` object) so that it had a length of one returned another `~sunpy.net.fido_factory.UnifiedResponse` object. Now it will return a `~sunpy.net.base_client.QueryResponseTable` object, which is a subclass of `astropy.table.Table`. (`#4358 `__) - The ``.size`` property of a coordinate frame with no associated data will now raise an error instead of returning 0. (`#4577 `__) - The following `~sunpy.map.Map` methods have had support for specific positional arguments removed. They must now be passed as keyword arguments (i.e. ``m.method(keyword_arg=value)``). - :meth:`~sunpy.map.GenericMap.submap`: ``width``, ``height``. - ``sunpy.map.GenericMap.draw_rectangle``: ``width``, ``height``, ``axes``, ``top_right``. (`#4616 `__) - The sunpy specific attributes ``.heliographic_observer`` and ``.rsun`` are no longer set on the `~astropy.wcs.WCS` returned by `sunpy.map.GenericMap.wcs`. (`#4620 `__) - Due to upstream changes, the parsing logic for the `~sunpy.net.helio.HECClient` now returns strings and not bytes for :meth:`~sunpy.net.helio.HECClient.get_table_names`. (`#4643 `__) - Reduced the selection of dependent packages installed by default via ``pip``, which means that some of our sub-packages will not fully import when sunpy is installed with ``pip install "sunpy"``. You can install all dependencies by specifying ``pip install "sunpy[all]"``, or you can install sub-package-specific dependencies by specifying, e.g., ``[map]`` or ``[timeseries]``. (`#4662 `__) - The class inheritance for `~sunpy.coordinates.metaframes.RotatedSunFrame` and the frames it creates has been changed in order to stop depending on unsupported behavior in the underlying machinery. The return values for some :func:`isinstance`/:func:`issubclass` calls will be different, but the API for `~sunpy.coordinates.metaframes.RotatedSunFrame` is otherwise unchanged. (`#4691 `__) - Fix a bug in `~sunpy.map.GenericMap.submap` where only the top right and bottom left coordinates of the input rectangle in world coordinates were considered when calculating the pixel bounding box. All four corners are once again taken into account now, meaning that `~sunpy.map.GenericMap.submap` correctly returns the smallest pixel box which contains all four corners of the input rectangle. To revert to the previous 2.0.0 behaviour, first convert the top right and bottom left coordinates to pixel space before calling submap with:: top_right = smap.wcs.world_to_pixel(top_right) * u.pix bottom_left = smap.wcs.world_to_pixel(bottom_left) * u.pix smap.submap(bottom_left=bottom_left, top_right=top_right) This will define the rectangle in pixel space. (`#4727 `__) - VSO results where the size was ``-1`` (missing data) now return ``None`` rather than ``-1`` to be consistent with other missing data in the VSO results. (`#4798 `__) - All result objects contained within the results of a ``Fido.search()`` (a `~sunpy.net.fido_factory.UnifiedResponse` object) are now `~sunpy.net.base_client.QueryResponseTable` objects (or subclasses thereof). These objects are subclasses of `astropy.table.Table` and can therefore be filtered and inspected as tabular objects, and the modified tables can be passed to ``Fido.fetch``. This, while a breaking change for anyone accessing these response objects directly, will hopefully make working with ``Fido`` search results much easier. (`#4798 `__) - Results from the `~sunpy.net.dataretriever.NOAAIndicesClient` and the `~sunpy.net.dataretriever.NOAAPredictClient` no longer has ``Start Time`` or ``End Time`` in their results table as the results returned from the client are not dependant upon the time parameter of a search. (`#4798 `__) - The ``sunpy.net.vso.QueryResponse.search`` method has been removed as it has not worked since the 1.0 release of sunpy. (`#4798 `__) - The ``sunpy.net.hek.hek.HEKColumn`` class has been removed, the ``HEKTable`` class now uses the standard `astropy.table.Column` class. (`#4798 `__) - The keys used to format file paths in ``Fido.fetch`` have changed. They are now more standardised across all the clients, as they are all extracted from the names of the columns in the results table. For results from the VSO the keys are no longer separated with ``.``, and are based on the displayed column names. For results from the ``dataretriever`` clients the only main change is that the keys are now lower case, where they were capitilized before. You can use the ``.sunpy.net.fido_factory.UnifiedResponse.path_format_keys`` method to see all the possible keys for a particular search. (`#4798 `__) - The time returned from :func:`~sunpy.coordinates.sun.carrington_rotation_number` has been changed from the TT scale to the more common UTC scale. To undo this change, use ``time_out = time_out.tt`` on the outputted time. (`#4819 `__) - `~.BaseQueryResponse.response_block_properties` has been renamed to ``.BaseQueryResponse.path_format_keys``, on the return objects from all ``search()`` methods on all clients and from ``Fido.search()``. (`#4798 `__) Removals -------- - Removed deprecated functions: - ``sunpy.coordinates.frames.Helioprojective.calculate_distance``, alternative is `sunpy.coordinates.frames.Helioprojective.make_3d`. - ``sunpy.image.coalignment.repair_image_nonfinite`` - if you wish to repair the image, this has to be done manually before calling the various `sunpy.image.coalignment` functions. - The ``repair_nonfinite`` keyword argument to ``calculate_shift`` and ``calculate_match_template_shift`` has been removed. - ``sunpy.instr.lyra.download_lytaf_database`` - this just downloaded the file at ``http://proba2.oma.be/lyra/data/lytaf/annotation_ppt.db``, which can be done manually. - ``sunpy.util.net.check_download_file``, no alternative. - ``sunpy.visualization.animator.ImageAnimatorWCS``, alternative is ``sunpy.visualization.animator.ArrayAnimatorWCS``. (`#4350 `__) - Removed deprecated function ``sunpy.instr.aia.aiaprep``. Alternative is `~aiapy.calibrate.register` for converting AIA images from level 1 to level 1.5. (`#4485 `__) - ``sunpy.cm`` has been removed. All of the functionality in this module can now be found in `sunpy.visualization.colormaps`. (`#4488 `__) - ``sunpy.test.hash`` has been removed, the functionality has been moved into the `pytest-mpl `__ package. (`#4605 `__) - ``sunpy.util.multimethod`` has been removed. (`#4614 `__) - The ``lytaf_path`` argument (which previously did nothing) has been removed from - ``sunpy.instr.lyra.remove_lytaf_events_from_timeseries`` - ``sunpy.instr.lyra.get_lytaf_events`` - ``sunpy.instr.lyra.get_lytaf_event_types`` (`#4615 `__) Deprecations ------------ - Deprecated ``sunpy.net.vso.attrs.Source`` and ``sunpy.net.vso.attrs.Provider``. They are now `sunpy.net.attrs.Source` and `sunpy.net.attrs.Provider` respectively. (`#4321 `__) - Deprecated the use of the ``sunpy.map.GenericMap.size`` property, use ``sunpy.map.Map.data.size`` instead. (`#4338 `__) - ``sunpy.net.helio.HECClient.time_query`` is deprecated, `~sunpy.net.helio.HECClient.search` is the replacement. (`#4358 `__) - ``sunpy.net.jsoc.attrs.Keys`` is deprecated; all fields are returned by default and can be filtered post search. (`#4358 `__) - ``sunpy.net.hek.attrs.Time`` is deprecated; `~sunpy.net.attrs.Time` should be used instead. (`#4358 `__) - Support for :func:`sunpy.coordinates.wcs_utils.solar_wcs_frame_mapping` to use the ``.heliographic_observer`` and ``.rsun`` attributes on a `~astropy.wcs.WCS` is depreacted. (`#4620 `__) - The ``origin`` argument to `sunpy.map.GenericMap.pixel_to_world` and `sunpy.map.GenericMap.world_to_pixel` is deprecated. - If passing ``0``, not using the ``origin`` argument will have the same effect. - If passing ``1``, manually subtract 1 pixel from the input to ``pixel_to_world``, or manually add 1 pixel to the output of ``world_to_pixel``, and do not use the ``origin`` argument. (`#4700 `__) - The ``.VSOClient.link`` method is deprecated as it is no longer used. (`#4789 `__) - The ``.UnifiedResponse.get_response``, ``.UnifiedResponse.tables`` and ``.UnifiedResponse.responses`` attributes of ``.UnifiedResponse`` have been deprecated as they are no longer needed now the object returns the table objects it contains when sliced. (`#4798 `__) - :meth:`sunpy.net.vso.VSOClient.search` has a new keyword argument ``response_type=`` which controls the return type from the ``search()`` method. In sunpy 2.1 and 3.0 it will default to the ``"legacy"`` response format, in 3.1 it will default to the new ``"table"`` response format, and the ``"legacy"`` format may be deprecated and removed at a later date. Searches made with ``Fido`` will use the new ``"table"`` response format, so this only affects users interacting with the ``VSOClient`` object directly. (`#4798 `__) Features -------- - For :meth:`sunpy.map.GenericMap.quicklook` and :meth:`sunpy.map.MapSequence.quicklook` (also used for the HTML reprsentation shown in Jupyter notebooks), the histogram is now shaded corresponding to the colormap of the plotted image. Clicking on the histogram will toggle an alternate version of the histogram. (`#4931 `__) - Add an ``SRS_TABLE`` file to the sample data, and use it in the magnetogram plotting example. (`#4993 `__) - Added a `sunpy.map.GenericMap.contour()` method to find the contours on a map. (`#3909 `__) - Added a context manager (:meth:`~sunpy.coordinates.frames.Helioprojective.assume_spherical_screen`) to interpret `~sunpy.coordinates.frames.Helioprojective` coordinates as being on the inside of a spherical screen instead of on the surface of the Sun. (`#4003 `__) - Added `sunpy.map.sources.HMISynopticMap` for handling the Synoptic maps from HMI. (`#4053 `__) - Added a `~sunpy.map.sources.MDISynopticMap` map source class. (`#4054 `__) - Created `~sunpy.net.dataretriever.GONGClient` for accessing magnetogram synoptic map archives of NSO-GONG. (`#4055 `__) - All coordinate frames will now show the velocity if it exists in the underlying data. (`#4102 `__) - The ephemeris functions :func:`~sunpy.coordinates.ephemeris.get_body_heliographic_stonyhurst()`, :func:`~sunpy.coordinates.ephemeris.get_earth()`, and :func:`~sunpy.coordinates.ephemeris.get_horizons_coord()` can now optionally return the body's velocity as part of the output coordinate. (`#4102 `__) - `~sunpy.util.metadata.MetaDict` now maintains coherence between its keys and their corresponding keycomments. Calling ``del`` on a ``MetaDict`` object key is now case-insensitive. (`#4129 `__) - Allow ``sunpy.visualization.animator.ArrayAnimatorWCS`` to disable ticks for a coordinate, by setting ``ticks: False`` in the ``coord_params`` dictionary. (`#4270 `__) - Added a ``show()`` method for `~sunpy.net.base_client.BaseQueryResponse` which returns `~astropy.table.Table` with specified columns for the Query Response. (`#4309 `__) - Added ``_extract_files_meta`` method in ``sunpy.util.scraper.Scraper`` which allows scraper to extract metadata from the file URLs retrieved for a given time range. (`#4313 `__) - Refactoring of `~sunpy.net.dataretriever` which adds these capabilities to `~sunpy.net.dataretriever.QueryResponse`: - Any ``attr`` shall not be defaulted to a hard-coded value in all subclasses of `~sunpy.net.dataretriever.GenericClient`; thus records for all possible ``attrs`` shall be returned if it is not specified in the query. - `~sunpy.net.dataretriever.QueryResponse` can now show more columns; thus all metadata extractable from matching file URLs shall be shown and for a client, non-spported ``attrs`` shall not be shown in the response tables. (`#4321 `__) - New class attributes added to `~sunpy.net.dataretriever.GenericClient`: - ``baseurl`` and ``pattern`` which are required to define a new simple client. - ``optional`` and ``required`` which are a ``set`` of optional and required `~sunpy.net.attrs` respectively; which generalizes :meth:`~sunpy.net.dataretriever.GenericClient._can_handle_query`. (`#4321 `__) - Additions in ``sunpy.util.scraper`` to support the refactoring of `~sunpy.net.dataretriever.GenericClient`: - ``sunpy.util.scraper.Scraper.findDatewith_extractor`` that parses the url using extractor to return its start time. - A ``matcher`` in ``sunpy.util.scraper.Scraper._extract_files_meta`` which validates the extracted metadata by using the dictionary returned from :meth:`~sunpy.net.dataretriever.GenericClient._get_match_dict`. (`#4321 `__) - Added methods :meth:`~sunpy.net.dataretriever.GenericClient.pre_search_hook` and :meth:`~sunpy.net.dataretriever.GenericClient.post_search_hook` which helps to translate the attrs for scraper before and after the search respectively. (`#4321 `__) - :meth:`sunpy.timeseries.sources.RHESSISummaryTimeSeries.peek` has had the following minor changes: - Colors from the default matplotlib color cycle are now used (but the colors remain qualitatively the same) - The default matplotlib linewidth is now used - It is now possible to pass in a user specified linewidth - Seconds have been added to the x-axis labels (previously it was just hours and minutes) (`#4326 `__) - `~sunpy.net.helio.hec.HECClient` and `~sunpy.net.hek.hek.HEKClient` now inherit `~sunpy.net.base_client.BaseClient` which makes them compatible with the `~sunpy.net.fido_factory.UnifiedDownloaderFactory` (``Fido``). (`#4358 `__) - `~sunpy.net.helio.attrs.MaxRecords` and `~sunpy.net.helio.attrs.TableName` added as "attrs" for HELIO searches. (`#4358 `__) - Add the ability to download new GOES 16 & 17 data alongside the reprocessed GOES 13, 14 and 15 data via the GOES-XRS Fido client. (`#4394 `__) - `sunpy.net.jsoc.JSOCClient.request_data` now support additional parameter "method" which allows user to download staged data as single .tar file. (`#4405 `__) - Added ``sunpy.util.get_timerange_from_exdict`` which finds time range for a URL using its metadata. Added ``sunpy.util.scraper.Scraper.isvalid_time`` that checks whether the file corresponds to a desired time range. (`#4419 `__) - Colormap data has been moved to individual .csv files in the :file:`sunpy/visualization/colormaps/data` directory. (`#4433 `__) - Added `~sunpy.coordinates.utils.solar_angle_equivalency` to convert between a physical distance on the Sun (e.g., km) to an angular separation as seen by an observer (e.g., arcsec). (`#4443 `__) - `sunpy.map.Map` instances now have their ``.unit`` attribute set from the ``'BUNIT'`` FITS keyword. If the keyword cannot be parsed, or is not present the unit is set to `None`. (`#4451 `__) - The `sunpy.map.GenericMap.wcs` property is now cached, and will be recomputed only if changes are made to the map metadata. This improves performance of a number of places in the code base, and only one warning will now be raised about WCS fixes for a given set of metadata (as opposed to a warning each time ``.wcs`` is accessed) (`#4467 `__) - Extended :meth:`~sunpy.timeseries.GenericTimeSeries.concatenate` and :meth:`~sunpy.timeseries.TimeSeriesMetaData.concatenate` to allow iterables. (`#4499 `__) - Enable `~sunpy.coordinates.metaframes.RotatedSunFrame` to work with non-SunPy frames (e.g., `~astropy.coordinates.HeliocentricMeanEcliptic`). (`#4577 `__) - Add support for `pathlib.Path` objects to be passed to `sunpy.timeseries.TimeSeries`. (`#4589 `__) - Add support for GOES XRS netcdf files to be read as a `sunpy.timeseries.sources.XRSTimeSeries`. (`#4592 `__) - Add `~sunpy.net.jsoc.attrs.Cutout` attr for requesting cutouts from JSOC via `~sunpy.net.jsoc.JSOCClient` and ``Fido``. (`#4595 `__) - sunpy now sets auxillary parameters on `sunpy.map.GenericMap.wcs` using the `astropy.wcs.Wcsprm.aux` attribute. This stores observer information, along with the reference solar radius if present. (`#4620 `__) - The `~sunpy.coordinates.frames.HeliographicCarrington` frame now accepts the specification of ``observer='self'`` to indicate that the coordinate itself is also the observer for the coordinate frame. This functionality greatly simplifies working with locations of observatories that are provided in Carrington coordinates. (`#4659 `__) - Add two new colormaps (``rhessi`` and ``std_gamma_2``) that are used for plotting RHESSI maps. (`#4665 `__) - If either 'CTYPE1' or 'CTYPE2' are not present in map metadata, sunpy now assumes they are 'HPLN-TAN' and 'HPLT-TAN' (previously it assumed 'HPLN- ' and 'HPLT- '). In addition, a warning is also now raised when this assumption is made. (`#4702 `__) - Added a new `~sunpy.map.all_corner_coords_from_map` function to get the coordinates of all the pixel corners in a `~sunpy.map.GenericMap`. (`#4776 `__) - Added support for "%Y/%m/%dT%H:%M" to :func:`sunpy.time.parse_time`. (`#4791 `__) - Added the STEREO EUVI instrument specific colormaps called" 'euvi171', 'euvi195', 'euvi284', 'euvi304'. (`#4822 `__) Bug Fixes --------- - `sunpy.map.GenericMap.date` now has its time scale set from the 'TIMESYS' FITS keyword, if it is present. If it isn't present the time scale defaults to 'UTC', which is unchanged default behaviour, so this change will only affect maps with a 'TIMESYS' keyword that is not set to 'UTC'. (`#4881 `__) - Fixed the `sunpy.net.dataretriever.sources.noaa.SRSClient` which silently failed to download the SRS files when the tarball for the previous years did not exist. Client now actually searches for the tarballs and srs files on the ftp archive before returning them as results. (`#4904 `__) - No longer is the WAVEUNIT keyword injected into a data source if it is missing from the file's metadata. (`#4926 `__) - Map sources no longer overwrite FITS metadata keywords if they are present in the original metadata. The particular map sources that have been fixed are `~sunpy.map.sources.SJIMap`, `~sunpy.map.sources.KCorMap`, `~sunpy.map.sources.RHESSIMap`, `~sunpy.map.sources.EITMap`, `~sunpy.map.sources.EUVIMap`, `~sunpy.map.sources.SXTMap`. (`#4926 `__) - Fixed a handling bug in ``sunpy.map.GenericMap.draw_rectangle`` when the rectangle is specified in a different coordinate frame than that of the map. A couple of other minor bugs in ``sunpy.map.GenericMap.draw_rectangle`` were also fixed. (`#4929 `__) - Improved error message from ``sunpy.net.Fido.fetch()`` when no email has been supplied for JSOC data. (`#4950 `__) - Fixed a bug when transforming from `~sunpy.coordinates.metaframes.RotatedSunFrame` to another frame at a different observation time that resulted in small inaccuracies. The translational motion of the Sun was not being handled correctly. (`#4979 `__) - Fixed two bugs with :func:`~sunpy.physics.differential_rotation.differential_rotate` and :func:`~sunpy.physics.differential_rotation.solar_rotate_coordinate` that resulted in significant inaccuracies. Both functions now ignore the translational motion of the Sun. (`#4979 `__) - The ability to to filter search results from the `~sunpy.net.vso.VSOClient` was broken. This has now been restored. (`#4011 `__) - Fixed a bug where transformation errors were not getting raised in some situations when a coordinate frame had ``obstime`` set to the default value of ``None`` and `~astropy.coordinates.SkyCoord` was not being used. Users are recommended to use `~astropy.coordinates.SkyCoord` to manage coordinate transformations unless they have a specific reason not to. (`#4267 `__) - Fixed a bug in `~sunpy.net.dataretriever.sources.goes.XRSClient._get_url_for_timerange` which returned incorrect URLs because of not using ``**kwargs`` in the client's ``_get_overlap_urls()`` method. (`#4288 `__) - Data products from `~sunpy.net.dataretriever.NOAAIndicesClient` and `~sunpy.net.dataretriever.NOAAPredictClient` have been updated to download new JSON files. The old text files which the data used to come in no longer exist. The new JSON files for `~sunpy.net.dataretriever.NOAAIndicesClient` now do not have the following columns: - Geomagnetic Observed and Smoothed - Sunspot Numbers Ratio (RI/SW) Both `sunpy.timeseries.sources.noaa.NOAAIndicesTimeSeries` and `sunpy.timeseries.sources.noaa.NOAAPredictIndicesTimeSeries` have been updated to support the new JSON files. Loading the old text files is still supported, but support for this will be removed in a future version of sunpy. (`#4340 `__) - Fixed a bug due to which ``sunpy.net.helio.parser.wsdl_retriever`` ignored previously discovered Taverna links. (`#4358 `__) - The flare class labels in GOES ``peek()`` plots are now drawn at the center of the flare classes. Previously they were (ambiguously) drawn on the boundaries. (`#4364 `__) - `sunpy.map.GenericMap.rsun_obs` no longer assumes the observer is at Earth if ``rsun_obs`` was not present in the map metadata. The sun-observer distance is now taken directly from the observer coordinate. If the observer coordinate is not present, this defaults to the Earth, retaining previous behaviour. (`#4375 `__) - Nanosecond precision is now retained when using `~sunpy.time.parse_time` with a `~pandas.Timestamp`. (`#4409 `__) - Fixed a bug where SunPy could not be successfully imported if the default text encoding of the running environment was unable to handle non-ASCII characters. (`#4422 `__) - `sunpy.net.dataretriever.sources.noaa.SRSClient` now correctly returns zero results for queries in the future or before 1996, which is when data is first available. (`#4432 `__) - Fixes issue where NAXISn is not updated after invoking :meth:`.GenericMap.resample` (`#4445 `__) - The floating point precision of input to `sunpy.image.transform.affine_transform` is now preserved. Previously all input was cast to `numpy.float64`, which could cause large increases in memory use for 32 bit data. (`#4452 `__) - Fixed :func:`~sunpy.image.transform.affine_transform` to scale images to [0, 1] before passing them to :func:`skimage.transform.warp` and later rescale them back. (`#4477 `__) - Several ``warnings.simplefilter('always', Warning)`` warning filters in `sunpy.timeseries` have been removed. (`#4511 `__) - All calculations of the angular radius of the Sun now use the same underlying code with the accurate calculation. The previous inaccuracy was a relative error of ~0.001% (0.01 arcseconds) for an observer at 1 AU, but could be as large as ~0.5% for Parker Solar Probe perihelia. (`#4524 `__) - Fixed an issue in :meth:`sunpy.time.TimeRange.get_dates` where the function would return the wrong number of days if less than 24 hours had passed (`#4529 `__) - Several functions in `sunpy.map` now properly check if the provided coordinate is in the expected `~sunpy.coordinates.frames.Helioprojective` frame. (`#4552 `__) - Fixes a bug which occurs in setting the ``ylims`` by ``sunpy.visualization.animator.line.LineAnimator`` when there are non-finite values in the data array to be animated. (`#4554 `__) - Clear rotation metadata for SOHO/LASCO Helioviewer JPEG2000 images, as they are already rotated correctly. (`#4561 `__) - The ``max_conn`` argument to ``Fido.fetch()`` is now correctly respected by the JSOC client. Previously the JSOC client would default to 4 connections no matter what the value passed to ``Fido.fetch()`` was. (`#4567 `__) - :func:`sunpy.time.parse_time` now correctly parses lists of time strings that have one of the built in sunpy time formats. (`#4590 `__) - Fixes the SRSClient to search for files of correct queried time and now allows a path keyword to be downloaded in fetch. (`#4600 `__) - Fixed ``sunpy.net.helio.parser.wsdl_retriever``, which previously ignored discovered Taverna links. (`#4601 `__) - The transformations between `~astropy.coordinates.HCRS` and `~sunpy.coordinates.frames.HeliographicStonyhurst` have been re-implemented to enable the proper transformations of velocities. All ephemeris functions (e.g., :func:`~sunpy.coordinates.ephemeris.get_body_heliographic_stonyhurst`) now return properly calculated velocities when ``include_velocity=True`` is specified. (`#4613 `__) - The maximum number of connections opened by the JSOC downloader has been reduced from 4 to 2. This should prevent downloads of large numbers of files crashing. (`#4624 `__) - Fixed a significant performance bug that affected all coordinate transformations. Transformations have been sped up by a factor a few. (`#4663 `__) - Fixed a bug with the mapping of a WCS header to a coordinate frame if the observer location is provided in Carrington coordinates. (`#4669 `__) - `sunpy.io.fits.header_to_fits` now excludes any keys that have associated NaN values, as these are not valid in a FITS header, and throws a warning if this happens. (`#4676 `__) - Fixed an assumption in `sunpy.map.GenericMap.pixel_to_world` that the first data axis is longitude, and the second is latitude. This will affect you if you are using data where the x/y axes are latitude/longitude, and now returns correct values in methods and properties that call ``pixel_to_world``, such as ``bottom_left_coord``, ``top_right_coord``, ``center``. (`#4700 `__) - Added a warning when a 2D `~sunpy.coordinates.frames.Helioprojective` coordinate is upgraded to a 3D coordinate and the number type is lower precision than the native Python float. This 2D->3D upgrade is performed internally when transforming a 2D `~sunpy.coordinates.frames.Helioprojective` coordinate to any other coordinate frame. (`#4724 `__) - All columns from a :meth:`sunpy.net.vso.vso.VSOClient.search` will now be shown. (`#4788 `__) - The search results object returned from ``Fido.search`` (`~sunpy.net.fido_factory.UnifiedResponse`) now correcly counts all results in it's `~sunpy.net.fido_factory.UnifiedResponse.file_num` property. Note that because some ``Fido`` clients now return metadata only results, this is really the number of records and does not always correspond to the number of files that would be downloaded. (`#4798 `__) - Improved the file processing logic for EVE L0CS files, which may have fixed a bug where the first line of data was parsed incorrectly. (`#4805 `__) - Fixing the ``CROTA`` meta keyword in EUVI FITS to ``CROTAn`` standard. (`#4846 `__) Added/Improved Documentation ---------------------------- - Added a developer guide for writing a new ``Fido`` client. (`#4387 `__) - Added an example of how to use Matplotlib's axes range functionality when plotting a Map with WCSAxes. (`#4792 `__) - Add links to Thompson 2006 paper on solar coordinates to synoptic map example. (`#3549 `__) - Clarified the meaning of ``.bottom_left_coord`` and ``.top_right_coord`` in `sunpy.map.GenericMap`. (`#3706 `__) - Added a list of possible signatures to `sunpy.timeseries.metadata.TimeSeriesMetaData`. (`#3709 `__) - Added `sunpy.data.manager`, `sunpy.data.cache`, `sunpy.net.Fido`, `sunpy.map.Map`, and `sunpy.timeseries.TimeSeries` to the docs. (`#4098 `__) - Clarified spline option for `sunpy.map.GenericMap.resample`. (`#4136 `__) - Updated the gallery example :ref:`sphx_glr_generated_gallery_plotting_solar_cycle_example.py` to retrieve data using `~sunpy.net.Fido`. (`#4169 `__) - Fixed example usage of :func:`~sunpy.io.fits.read` to account for the fact that it returns a list of data-header pairs rather than the data-header pairs directly. (`#4183 `__) - Added example of how to create a `sunpy.map.GenericMap` from observations in RA-DEC coordinates. (`#4236 `__) - Added `sunpy.coordinates.SunPyBaseCoordinateFrame` and `sunpy.coordinates.BaseHeliographic` to the documentation. (`#4274 `__) - `sunpy.time.TimeRange` had a ``.__contains__`` method and this is now documented. (`#4372 `__) - Revamped sunpy pull request review developer documentation. (`#4378 `__) - Revamped sunpy installation documentation. (`#4378 `__) - Fixed broken documentation links in the guide. (`#4414 `__) - Fixed miscellaneous links in the API documentation. (`#4415 `__) - Added `sunpy.data.data_manager.downloader`, `sunpy.data.data_manager.storage`, and `sunpy.net.hek.HEKTable` to the docs. (`#4418 `__) - Added documentation for copying Map objects using the copy module's deepcopy method. (`#4470 `__) - Added information about the :meth:`~sunpy.map.MapSequence.plot` return type. (`#4472 `__) - Added a gallery example for saving and loading sunpy Maps using asdf. (`#4494 `__) - Added description for a counter-intuitive section in the :ref:`sphx_glr_generated_gallery_differential_rotation_reprojected_map.py` example. (`#4548 `__) - Added :ref:`sunpy-coordinates-velocities` to explain how to use velocity information in the coordinates framework. (`#4610 `__) - New gallery example of searching and downloading GOES XRS data (with GOES 15, 16 and 17). (`#4686 `__) - Created the new gallery example :ref:`sphx_glr_generated_gallery_units_and_coordinates_north_offset_frame.py` for `~sunpy.coordinates.NorthOffsetFrame`. (`#4709 `__) - Added more information on which FITS keywords are used for various `sunpy.map.GenericMap` properties. (`#4717 `__) - Improved documentation for :func:`sunpy.physics.differential_rotation.diff_rot`. (`#4876 `__) Documentation Fixes ------------------- - The keyword ``clip_interval`` is now used more extensively in gallery examples when plotting the sample AIA image (e.g., :ref:`sphx_glr_generated_gallery_plotting_aia_example.py`). (`#4573 `__) - Modified :ref:`sphx_glr_generated_gallery_plotting_magnetogram_active_regions.py` to use HMI file from sample data instead of downloading it with Fido. (`#4598 `__) - Removed unnecessary transformations of coordinates prior to plotting them using `~astropy.visualization.wcsaxes.WCSAxes.plot_coord`. (`#4609 `__) - Ensure that all attrs are documented and clean the `sunpy.net.hek.attrs` namespace of non-attr objects. (`#4834 `__) - Fixed miscellaneous issues with the gallery example :ref:`sphx_glr_generated_gallery_map_transformations_reprojection_align_aia_hmi.py`. (`#4843 `__) - Fixed the display of arguments in the documentation for `~sunpy.net.Fido` attributes (`sunpy.net.attrs`). (`#4916 `__) Trivial/Internal Changes ------------------------ - ``Fido.fetch`` now always specifies a ``path=`` argument of type `pathlib.Path` to the ``fetch`` method of the client. This path will default to the configured sunpy download dir, will have the user directory expanded, will have the ``{file}`` placeholder and will be tested to ensure that it is writeable. (`#4949 `__) - Added information on what went wrong when `sunpy.map.GenericMap.wcs` fails to parse a FITS header into a WCS. (`#4335 `__) - Fixed the `~sunpy.coordinates.frames.Helioprojective` docstring to be clear about the names of the coordinate components. (`#4351 `__) - Raise a better error message if trying to load a FITS file that contains only one dimensional data. (`#4426 `__) - The following functions in `sunpy.map` have had their performance greatly increased, with runtimes typically improving by a factor of 20x. This has been achieved by improving many of the checks so that they only require checking the edge pixels of a map as opposed to all of the pixels. - :func:`~sunpy.map.contains_full_disk` - :func:`~sunpy.map.is_all_off_disk` - :func:`~sunpy.map.is_all_on_disk` - :func:`~sunpy.map.contains_limb` (`#4463 `__) - Improved the output when you print a sunpy Map. (`#4464 `__) - Creating a `~sunpy.util.MetaDict` with dictionary keys that are not strings now raises as user-friendly `ValueError` which prints all the non-compliant keys. (`#4476 `__) - Maps created directly via. `sunpy.map.GenericMap` now have their metadata automatically converted to a `~sunpy.util.MetaDict`, which is the same current behaviour of the `sunpy.map.Map` factory. (`#4476 `__) - If the ``top_right`` corner given to :meth:`sunpy.map.GenericMap.submap` is below or to the right of the ``bottom_left`` corner, a warning is no longer raised (as the rectangle is still well defined), but a message is still logged at the debug level to the sunpy logger. (`#4491 `__) - Added test support for Python 3.9 (no wheels yet). (`#4569 `__) - ``sunpy.sun`` functions now make use of the `~astropy.coordinates.GeocentricTrueEcliptic` frame to simplify internal calculations, but the returned values are unchanged. (`#4584 `__) - Change the format of the time returned from :func:`~sunpy.coordinates.sun.carrington_rotation_number` from ``'jd'`` to ``'iso'``, so printing the `~astropy.time.Time` returned will now print an ISO timestamp instead of the Julian days. (`#4819 `__) - The listings for the sample data (`sunpy.data.sample`) are now sorted. (`#4838 `__) - Changed the implementation of a ``hypothesis``-based test so that it does not raise an error with ``hypothesis`` 6.0.0. (`#4852 `__) 2.0.0 (2020-06-12) ================== Backwards Incompatible Changes ------------------------------ - The frames `~sunpy.coordinates.frames.HeliographicStonyhurst` and `~sunpy.coordinates.frames.HeliographicCarrington` now inherit from the new base class `~sunpy.coordinates.frames.BaseHeliographic`. This changes means that ``isinstance(frame, HeliographicStonyhurst)`` is no longer ``True`` when ``frame`` is `~sunpy.coordinates.frames.HeliographicCarrington`. (`#3595 `__) - `~sunpy.visualization.colormaps.color_tables.aia_color_table`, `~sunpy.visualization.colormaps.color_tables.eit_color_table` and `~sunpy.visualization.colormaps.color_tables.suvi_color_table` now only take `astropy.units` quantities instead of strings. (`#3640 `__) - `sunpy.map.Map` is now more strict when the metadata of a map cannot be validated, and an error is now thrown instead of a warning if metadata cannot be validated. In order to load maps that previously loaded without error you may need to pass ``silence_errors=True`` to `sunpy.map.Map`. (`#3646 `__) - ``Fido.search`` will now return results from all clients which match a query, you no longer have to make the query specific to a single client. This means that searches involving the 'eve' and 'rhessi' instruments will now potentially also return results from the VSO. For `~sunpy.net.dataretriever.RHESSIClient` you can now specify ``a.Physobs("summary_lightcurve")`` to only include the summary lightcurve data products not provided by the VSO. (`#3770 `__) - The objects returned by the ``search`` methods on ``VSOClient``, ``JSOCClient`` and ``GenericClient`` have been changed to be based on `sunpy.net.base_client.BaseQueryResponse`. This introduces a few subtle breaking changes for people using the client search methods directly (not ``Fido.search``), or people using ``sunpy.net.fido_factory.UnifiedResponse.get_response``. When slicing an instance of ``QueryResponse`` it will now return an instance of itself, ``QueryResponse.blocks`` can be used to access the underlying records. Also, the ``.client`` attribute of the response no longer has to be the instance of the class the search was made with, however, it often is. (`#3770 `__) - `~sunpy.coordinates.frames.HeliographicCarrington` is now an observer-based frame, where the observer location (specifically, the distance from the Sun) is used to account for light travel time when determining apparent Carrington longitudes. Coordinate transformations using this frame now require an observer to be specified. (`#3782 `__) - To enable the precise co-alignment of solar images from different observatories, the calculation of Carrington coordinates now ignores the stellar-aberration correction due to observer motion. For an Earth observer, this change results in an increase in Carrington longitude of ~20 arcseconds. See :ref:`sunpy-coordinates-carrington` for more information. (`#3782 `__) - Fixed a bug where some of the coordinate transformations could raise `ValueError` instead of `~astropy.coordinates.ConvertError` when the transformation could not be performed. (`#3894 `__) - Astropy 3.2 is now the minimum required version of that dependency. (`#3936 `__) Deprecations and Removals ------------------------- - Fido search attrs available as `sunpy.net.attrs` i.e, ``a.Time``, ``a.Instrument`` etc are now deprecated as VSO attrs (`sunpy.net.vso.attrs`). (`#3714 `__) - ``sunpy.util.multimethod.MultiMethod`` is deprecated, `functools.singledispatch` provides equivalent functionality in the standard library. (`#3714 `__) - ``sunpy.net.vso.attrs.Physobs`` has been moved to `sunpy.net.attrs.Physobs` and the original deprecated. (`#3877 `__) - Deprecate ``sunpy.instr.aia.aiaprep`` in favor of the `aiapy.calibrate.register` function in the [aiapy](https://gitlab.com/LMSAL_HUB/aia_hub/aiapy) package. ``sunpy.instr.aia.aiaprep`` will be removed in version 2.1 (`#3960 `__) - Removed the module ``sunpy.sun.sun``, which was deprecated in version 1.0. Use the module `sunpy.coordinates.sun` instead. (`#4014 `__) - Removed Sun-associated functions in `sunpy.coordinates.ephemeris`, which were deprecated in 1.0. Use the corresponding functions in `sunpy.coordinates.sun`. (`#4014 `__) - Remove the deprecated ``sunpy.net.vso.vso.VSOClient`` ``.query_legacy`` and ``.latest`` methods. (`#4109 `__) - Removed the sample datasets NOAAINDICES_TIMESERIES and NOAAPREDICT_TIMESERIES because they will invariably be out of date. Up-to-date versions of these NOAA indices can be downloaded using `~sunpy.net.Fido` (see :ref:`sphx_glr_generated_gallery_plotting_solar_cycle_example.py`). (`#4169 `__) Features -------- - Added `~sunpy.coordinates.metaframes.RotatedSunFrame` for defining coordinate frames that account for solar rotation. (`#3537 `__) - Added a context manager (`~sunpy.coordinates.transform_with_sun_center`) to ignore the motion of the center of the Sun for coordinate transformations. (`#3540 `__) - Updated the gallery example titled 'Downloading and plotting an HMI magnetogram' to rotate the HMI magnetogram such that solar North is pointed up. (`#3573 `__) - Creates a function named ``sunpy.map.sample_at_coords`` that samples the data from the map at the given set of coordinates. (`#3592 `__) - Enabled the discovery of search attributes for each of our clients. (`#3637 `__) - Printing `sunpy.net.attrs.Instrument` or other "attrs" will show all attributes that exist under the corresponding "attr". (`#3637 `__) - Printing `sunpy.net.Fido` will print out all the clients that Fido can use. (`#3637 `__) - Updates `~sunpy.map.GenericMap.draw_grid` to allow disabling the axes labels and the ticks on the top and right axes. (`#3673 `__) - Creates a ``tables`` property for `~sunpy.net.fido_factory.UnifiedResponse`, which allows to access the `~sunpy.net.base_client.BaseQueryResponse` as an `~astropy.table.Table`, which then can be used for indexing of results. (`#3675 `__) - Change the APIs for ``sunpy.map.GenericMap.draw_rectangle`` and :meth:`sunpy.map.GenericMap.submap` to be consistent with each other and to use keyword-only arguments for specifying the bounding box. (`#3677 `__) - Updates the `~sunpy.map.GenericMap.observer_coordinate` property to warn the user of specific missing metadata for each frame. Omits warning about frames where all metadata is missing or all meta is present. (`#3692 `__) - Added `sunpy.util.config.copy_default_config` that copies the default config file to the user's config directory. (`#3722 `__) - ``sunpy.database`` now supports adding database entries and downloading data from ``HEK`` query (`#3731 `__) - Added a helper function (`~sunpy.coordinates.utils.get_rectangle_coordinates`) for defining a rectangle in longitude and latitude coordinates. (`#3737 `__) - Add a ``.data`` property in `~sunpy.timeseries.GenericTimeSeries`, so that users are encouraged to use :meth:`~sunpy.timeseries.GenericTimeSeries.to_dataframe` to get the data of the timeseries. (`#3746 `__) - It is now possible to turn on or off various corrections in :func:`~sunpy.coordinates.sun.L0` (the apparent Carrington longitude of Sun-disk center as seen from Earth). (`#3782 `__) - Made skimage.transform import lazy to reduce import time of `sunpy.image.transform` by ~50% (`#3818 `__) - Add support for parfive 1.1. This sets a limit on the number of open connections to JSOC when downloading files to 10. (`#3822 `__) - Fido clients (subclasses of `sunpy.net.base_client.BaseClient`) can now register their own attrs modules with `sunpy.net.attrs`. This allows clients which require attr classes specific to that client to register modules that can be used by the user i.e. ``a.vso``. It also allows clients implemented externally to sunpy to register attrs. (`#3869 `__) - Added the methods :meth:`sunpy.map.GenericMap.quicklook` and :meth:`sunpy.map.MapSequence.quicklook` to display an HTML summary of the instance, including interactive controls. When using Jupyter notebooks, this HTML summary is automatically shown instead of a text-only representation. (`#3951 `__) - Added `_localfilelist` method in ``sunpy.util.scraper.Scraper`` to scrap local data archives. (`#3994 `__) - Added extra constants to `sunpy.sun.constants`: - Longitude of the prime meridian (epoch J2000.0) : ``sunpy.sun.constants.get('W_0')`` - Sidereal rotation rate : `sunpy.sun.constants.sidereal_rotation_rate` - First Carrington rotation (JD TT) : `sunpy.sun.constants.first_carrington_rotation` - Mean synodic period : `sunpy.sun.constants.mean_synodic_period` - Right ascension (RA) of the north pole (epoch J2000.0) : ``sunpy.sun.constants.get('alpha_0')`` - Declination of the north pole (epoch J2000.0) : ``sunpy.sun.constants.get('delta_0')`` (`#4013 `__) - Adds to ``sunpy.util.scraper.Scraper`` the ability to include regular expressions in the URL passed. (`#4107 `__) Bug Fixes --------- - Added support for passing ``TimeSeriesMetaData`` object to ``timeseries_factory`` and associated validation tests. (`#3639 `__) - Now when `~sunpy.map.GenericMap` fails to load a file, the filename that failed to load will now be part of the error message. (`#3727 `__) - Work around incorrect Content-Disposition headers in some VSO downloads, which were leading to mangled filenames. (`#3740 `__) - ``Fido.search`` can now service queries without ``a.Time`` being specified. This is currently only used by the `sunpy.net.jsoc.JSOCClient`. (`#3770 `__) - Fixed a bug with the calculation of Carrington longitude as seen from Earth where it was using an old approach instead of the current approach (for example, the varying Sun-Earth distance is now taken into account). The old approach resulted in errors no greater than 7 arcseconds in Carrington longitude when using `~sunpy.coordinates.sun.L0` and `~sunpy.coordinates.frames.HeliographicCarrington`. (`#3772 `__) - Updated `sunpy.map.CompositeMap.plot` to support a linewidths argument. (`#3792 `__) - Fix a bug in `sunpy.net.jsoc.JSOCClient` where requesting data for export would not work if a non-time primekey was used. (`#3825 `__) - Add support for passing paths of type `pathlib.Path` in `sunpy.net.jsoc.JSOCClient.fetch`. (`#3838 `__) - Add explicit support for dealing with download urls for files, under 'as-is' protocol in `sunpy.net.jsoc.JSOCClient.get_request`. (`#3838 `__) - Updated the method used to filter time in the VSO post-search filtering function. (`#3840 `__) - Fix failing of fetching of the indexed JSOCResponses using `sunpy.net.fido_factory.UnifiedDownloaderFactory.fetch`. (`#3852 `__) - Prevented `sunpy.map.GenericMap.plot` modifying in-place any items passed as ``imshow_kwargs``. (`#3867 `__) - Changed the format of DATE-OBS in `sunpy.map.GenericMap.wcs` from iso to isot (ie. with a "T" between the date and time) to conform with the FITS standard. (`#3872 `__) - Fixed a minor error (up to ~10 arcseconds) in the calculation of the Sun's position angle (:func:`sunpy.coordinates.sun.P`). (`#3886 `__) - `~sunpy.net.hek.HEKClient` was returning HTML and not JSON. (`#3899 `__) - Updated to HTTPS for HEK. (`#3917 `__) - The accuracy of the output of :func:`sunpy.coordinates.ephemeris.get_horizons_coord` is significantly improved. (`#3919 `__) - Fixed a bug where the longitude value for the reference coordinate in the Map repr would be displayed with the unintended longitude wrapping. (`#3959 `__) - It is now possible to specify a local file path to `sunpy.data.data_manager.DataManager.override_file` without having to prefix it with ``file://``. (`#3970 `__) - Closed the session in the destructor of VSOClient thus solving the problem of socket being left open (`#3973 `__) - Fixed a bug of where results of VSO searches would have inconsistent ordering in ``sunpy.net.vso.vso.QueryResponse`` by always sorting the results by start time. (`#3974 `__) - Fixes two bugs in `sunpy.util.deprecated`: correctly calculates the removal version and does not override the default and/or alternative functionality message. Providing a custom deprecation message now suppresses any mention of the removal version. Additionally, a ``pending`` keyword argument is provided to denote functions/classes that are pending deprecation. (`#3982 `__) - Correctly generate labels for sliders in ``~sunpy.visualization.animator.ArrayAnimatorWCS`` when the number of pixel dimensions and the number of world dimensions are not the same in the WCS. (`#3990 `__) - Updated VSOClient.response_block_properties to check if "None" is in the return. (`#3993 `__) - Fix a bug with ``sunpy.visualization.animator.ArrayAnimatorWCS`` where animating a line with a masked array with the whole of the initial line masked out the axes limits for the x axis were not correctly set. (`#4001 `__) - Fixed passing in a list of URLs into `sunpy.map.GenericMap`, before it caused an error due to the wrong type being returned. (`#4007 `__) - Fixed a bug with :func:`~sunpy.coordinates.transformations.transform_with_sun_center` where the global variable was sometimes restored incorrectly. This bug was most likely encountered if there was a nested use of this context manager. (`#4015 `__) - Fixes a bug in fido_factory to allow path="./" in fido.fetch(). (`#4058 `__) - Prevented `sunpy.io.fits.header_to_fits` modifying the passed header in-place. (`#4067 `__) - Strip out any unknown unicode from the HEK response to prevent it failing to load some results. (`#4088 `__) - Fixed a bug in :func:`~sunpy.coordinates.ephemeris.get_body_heliographic_stonyhurst` that resulted in a error when requesting an array of locations in conjuction with enabling the light-travel-time correction. (`#4112 `__) - `sunpy.map.GenericMap.top_right_coord` and `~sunpy.map.GenericMap.center` have had their definitions clarified, and both have had off-by-one indexing errors fixed. (`#4121 `__) - Fixed `sunpy.map.GenericMap.submap()` when scaled pixel units (e.g. ``u.mpix``) are used. (`#4127 `__) - Fixed bugs in ``sunpy.util.scraper.Scraper.filelist`` that resulted in error when the HTML page of URL opened by the scraper contains some "a" tags without "href" attribute and resulted in incorrect file urls when any href stores filepath relative to the URL's domain instead of just a filename. (`#4132 `__) - Fixed inconsistencies in how `~sunpy.map.GenericMap.submap` behaves when passed corners in pixel and world coordinates. The behavior for submaps specified in pixel coordinates is now well-defined for pixels on the boundary of the rectangle and is consistent for all boundaries. Previously pixels on the lower left boundary were included, but excluded on the upper and right boundary. This means the shape of a submap may now be 1 pixel larger in each dimension. Added several more tests for `~sunpy.map.GenericMap.submap` for a range of cutout sizes in both pixel and world coordinates. (`#4134 `__) - `sunpy.map.on_disk_bounding_coordinates` now fully propagates the coordinate frame of the input map to the output coordinates. Previously only the observer coordinate, and no other frame attributes, were propagated. (`#4141 `__) - Fix an off-by-one error in the reference pixel returned by `sunpy.map.make_fitswcs_header`. (`#4152 `__) - `sunpy.map.GenericMap.reference_pixel` now uses zero-based indexing, in order to be consistent with the rest of the `sunpy.map` API. (`#4154 `__) - Previously `sunpy.map.GenericMap.resample` with ``method='linear'`` was using an incorrect and constant value to fill edges when upsampling a map. Values near the edges are now correctly extrapolated using the ``fill_value=extrapolate`` option to `scipy.interpolate.interp1d`. (`#4164 `__) - Fixed a bug where passing an `int` or `list` via the ``hdus`` keyword argument to `~sunpy.io.fits.read` threw an exception because the list of HDU objects was no longer of type `~astropy.io.fits.HDUList`. (`#4183 `__) - Fix attr printing when the attr registry is empty for that attr (`#4199 `__) - Improved the accuracy of :func:`~sunpy.coordinates.sun.angular_radius` by removing the use of the small-angle approximation. The inaccuracy had been less than 5 milliarcseconds. (`#4239 `__) - Fixed a bug with the ``observer`` frame attribute for coordinate frames where an input that was not supplied as a `~astropy.coordinates.SkyCoord` would sometimes result in a transformation error. (`#4266 `__) Improved Documentation ---------------------- - Fixed an issue with the scaling of class-inheritance diagrams in the online documentation by blocking the versions of graphviz containing a bug. (`#3548 `__) - A new example gallery example "Plotting a difference image" has been added, which can be used for base difference or running difference images. (`#3627 `__) - Removed obsolete Astropy Helpers submodule section in :file:`CONTRIBUTING.rst`; Also removed mentions of astropy_helpers in all files of the project. (`#3676 `__) - Corrected misleading `~sunpy.timeseries.metadata.TimeSeriesMetaData` documentation about optional parameters. (`#3680 `__) - Added an example for `~sunpy.map.GenericMap.world_to_pixel` function in the Units & Coordinates guide. (`#3776 `__) - Added a :ref:`page ` describing how SunPy calculates Carrington longitudes. (`#3782 `__) - Changed padding value of an example in the example gallery to fix the overlap of titles and x-label axes. (`#3835 `__) - More information and links about how to create changelogs. (`#3856 `__) - Clarified some inputs to `sunpy.map.GenericMap.plot`. (`#3866 `__) - Changed quoted sentence (that we suggest authors add to their research papers) in CITATION.rst (`#3896 `__) - Add example of how to use SunPy's HEK client to search for the GOES flare event list. (`#3953 `__) - Improved the doc layout of `sunpy.data.sample`. (`#4034 `__) - Made improvements to STEREO starfield gallery example. (`#4039 `__) - Improved the documentation of `sunpy.map.GenericMap.resample`. (`#4043 `__) - Updated the STEREO starfield example to use all of the information in the star catalog. (`#4116 `__) - Mini-galleries are now easier to create in the documentation thanks to a custom Sphinx directive (``minigallery``). The page :ref:`sunpy-coordinates-rotatedsunframe` has an example of a mini-gallery at the bottom. (`#4124 `__) - Added `sunpy.visualization.colormaps.color_tables` to the docs. (`#4182 `__) - Made minor improvments to the map histogramming example. (`#4205 `__) - Add a warning to `sunpy.io` docs to recommend not using it for FITS (`#4208 `__) Trivial/Internal Changes ------------------------ - Removed un-used and un-tested code paths in the private ``_remove_lytaf_events`` function in ``sunpy.instr.lyra``. (`#3570 `__) - Removed ``astropy_helpers`` and this means that ``python setup.py `` no longer works. So if you want to: * Run the tests: Use ``tox -e `` or call ``pytest`` directly * Build the docs: Use ``tox -e docs`` or cd into the docs folder and run ``make html`` or ``sphinx-build docs docs/_build/html -W -b html -d docs/_build/.doctrees`` (`#3598 `__) - Cleaned up test warnings in sunpy.coordinates. (`#3652 `__) - Fix Python version for requiring importlib_resources (`#3683 `__) - `sunpy.net.attr.AttrWalker` no longer uses ``sunpy.util.multimethod.MultiMethod`` it uses a derivative of `functools.singledispatch` `sunpy.util.functools.seconddispatch` which dispatches on the second argument. (`#3714 `__) - Errors from a VSO search will now be raised to the user. (`#3719 `__) - Fixed the transformation test for `~sunpy.coordinates.metaframes.NorthOffsetFrame`, which would intermittently fail. (`#3775 `__) - :func:`~sunpy.coordinates.sun.earth_distance` is now computed without using coordinate transformations for better performance. (`#3782 `__) - Created a helper function for testing the equality/closeness of longitude angles (i.e., angles with wrapping). (`#3804 `__) - Bump the astropy version figure tests are run with from 3.1.2 to 3.2.3 (`#3925 `__) - Used `urllib.parse.urlsplit` in ``sunpy.util.scraper`` for file scraping functionalities. (`#3956 `__) - Added `sunpy.net.base_client.BaseClient.check_attr_types_in_query` as a helper method to check if a query contains a set of required attributes, and is a subset of optional attributes. (`#3979 `__) - Removes appending login details for ftp urls from scraper. (`#4020 `__) - Re-factored the `sunpy.map.Map` factory to dispatch argument parsing based on type. (`#4037 `__) - Improved the error message raised by the Map factory when a map matches multiple source map types. (`#4052 `__) - Added log messages when the sample data fails to download. (`#4137 `__) - Remove an Astropy 3.1 comptibility wrapper for ``Quantity.to_string``. (`#4172 `__) - Refactor the sphinx config to no longer depend on astropy-sphinx and more closely match the new sunpy package template (`#4188 `__) 1.1.0 (2020-01-10) ================== Backwards Incompatible Changes ------------------------------ - The ``sunpy.net.vso.vso.get_online_vso_url`` function has been broken into two components, the new ``sunpy.net.vso.vso.get_online_vso_url`` function takes no arguments (it used to take three) and now only returns an online VSO mirror or None. The construction of a ``zeep.Client`` object is now handled by ``sunpy.net.vso.vso.build_client`` which has a more flexible API for customising the ``zeep.Client`` interface. (`#3330 `__) - Importing ``sunpy.timeseries.timeseriesbase`` no longer automatically imports Matplotlib. (`#3376 `__) - :meth:`sunpy.timeseries.sources.NOAAIndicesTimeSeries.peek()` now checks that the `type` argument is a valid string, and raises a `ValueError` if it isn't. (`#3378 `__) - Observer-based coordinate frames (`~sunpy.coordinates.frames.Heliocentric` and `~sunpy.coordinates.frames.Helioprojective`) no longer assume a default observer (Earth) if no observer is specified. These frames can now be used with no observer specified, but most transformations cannot be performed for such frames. This removal of a default observer only affects `sunpy.coordinates`, and has no impact on the default observer in `sunpy.map`. (`#3388 `__) - The callback functions provided to ``BaseFuncAnimator`` ``button_func`` keyword argument now take two positional arguments rather than one. The function signature is now ``(animator, event)`` where the first arg is the animator object, and the second is the matplotlib mouse event. (`#3407 `__) - The colormap stored in SunPy's Map subclasses (ie. ``map.plot_settings['cmap']``) can now be colormap string instead of the full `matplotlib.colors.Colormap` object. To get the full `~matplotlib.colors.Colormap` object use the new attribute ``map.cmap``. (`#3412 `__) - Fix a warning in `sunpy.map.GenericMap.rotate` where the truth value of an array was being calculated. This changes the behaviour of `~sunpy.map.GenericMap.rotate` when the ``angle=`` parameter is not an `~astropy.units.Quantity` object to raise `TypeError` rather than `ValueError`. (`#3456 `__) Deprecations and Removals ------------------------- - Removed the step of reparing images (replacing non-finite entries with local mean) before coaligning them. The user is expected to do this themselves before coaligning images. If NaNs/non-finite entries are present, a warning is thrown. The function ``sunpy.image.coalignment.repair_image_nonfinite`` is deprecated. (`#3287 `__) - The method to convert a `~sunpy.coordinates.frames.Helioprojective` frame from 2D to 3D has been renamed from ``calculate_distance`` to `~sunpy.coordinates.frames.Helioprojective.make_3d`. This method is not typically directly called by users. (`#3389 `__) - ``sunpy.visualization.animator.ImageAnimatorWCS`` is now deprecated in favour of ``ArrayAnimatorWCS``. (`#3407 `__) - ``sunpy.cm`` has been moved to `sunpy.visualization.colormaps` and will be removed in a future version. (`#3410 `__) Features -------- - Add a new `sunpy.data.manager` and `sunpy.data.cache` for dealing with versioned remote data within functions. Please see the `Remote Data Manager `__ guide. (`#3124 `__) - Added the coordinate frames `~sunpy.coordinates.frames.HeliocentricEarthEcliptic` (HEE), `~sunpy.coordinates.frames.GeocentricSolarEcliptic` (GSE), `~sunpy.coordinates.frames.HeliocentricInertial` (HCI), and `~sunpy.coordinates.frames.GeocentricEarthEquatorial` (GEI). (`#3212 `__) - Added SunPy Map support for GOES SUVI images. (`#3269 `__) - - Support APE14 for ``ImageAnimatorWCS`` in SunPy's visualization module (`#3275 `__) - Add ability to disable progressbars when dowloading files using `sunpy.net.helioviewer` and edited docstrings to mention this feature. (`#3280 `__) - Adds support for searching and downloading SUVI data. (`#3301 `__) - Log all VSO XML requests and responses to the SunPy logger at the ``DEBUG`` level. (`#3330 `__) - Transformations between frames in `sunpy.coordinates` can now provide detailed debugging output. Set the `logging` level to ``DEBUG`` to enable this output. (`#3339 `__) - Added the `sunpy.coordinates.sun.carrington_rotation_time` function to compute the time of a given Carrington rotation number. (`#3360 `__) - A new method has been added to remove columns from a `sunpy.timeseries.GenericTimeSeries`. (`#3361 `__) - Add ``shape`` property to TimeSeries. (`#3380 `__) - Added ASDF schemas for the new coordinate frames (`~sunpy.coordinates.frames.GeocentricEarthEquatorial`, `~sunpy.coordinates.frames.GeocentricSolarEcliptic`, `~sunpy.coordinates.frames.HeliocentricEarthEcliptic`, `~sunpy.coordinates.frames.HeliocentricInertial`). See the gallery for an example of using ``asdf`` to save and load a coordinate frame. (`#3398 `__) - ``sunpy.visualization.animator.ArrayAnimatorWCS`` was added which uses the WCS object to get the coordinates of all axes, including the slider labels. It also provides the ability to customise the plot by specifying arguments to `~astropy.visualization.wcsaxes.WCSAxes` methods and supports animation of WCS aware line plots with Astroy 4.0. (`#3407 `__) - The returned list of `~sunpy.map.Map` objects is now sorted by filename when passing a directory or glob pattern to `~sunpy.map.map_factory.MapFactory`. (`#3408 `__) - Single character wildcards and character ranges can now be passed as glob patterns to `~sunpy.map.Map`. (`#3408 `__) - `~sunpy.map.Map` now accepts filenames and directories as `pathlib.Path` objects. (`#3408 `__) - `~sunpy.map.GenericMap` objects now have a ``.cmap`` attribute, which returns the full `~matplotlib.colors.Colormap`. object. (`#3412 `__) - `sunpy.io.write_file()` now accepts `~pathlib.Path` objects as filename inputs. (`#3469 `__) - `sunpy.map.make_fitswcs_header` now accepts a `tuple` representing the shape of an array as well as the actual array as the ``data`` argument. (`#3483 `__) - Made a couple of module imports lazy to reduce the import time of sunpy.map by ~40%. (`#3495 `__) - `sunpy.map.GenericMap.wcs` now uses the full FITS header to construct the WCS. This adds support for instruments with more complex projections, such as WISPR, however does mean that Map will be more sensitive to incorrect or invalid FITS headers. If you are using custom headers with SunPy Map you might encounter issues relating to this change. (`#3501 `__) - ``sunpy.visualization.animator.BaseFuncAnimator`` now takes an optional ``slider_labels`` keyword argument which draws text labels in the center of the sliders. (`#3504 `__) - Added a more helpful error message when trying to load a file or directory that doesn't exist with `sunpy.map.Map`. (`#3568 `__) - Add ``__repr__`` for `~sunpy.map.MapSequence` objects so that users can view the critical information of all the ``Map`` objects, in a concise manner. (`#3636 `__) Bug Fixes --------- - Fixed accuracy issues with the calculations of Carrington longitude (`~sunpy.coordinates.sun.L0`) and Carrington rotation number (`~sunpy.coordinates.sun.carrington_rotation_number`). (`#3178 `__) - Updated `sunpy.map.make_fitswcs_header` to be more strict on the inputs it accepts. (`#3183 `__) - Fix the calculation of ``rsun_ref`` in `~sunpy.map.make_fitswcs_header` and and ensure that the default reference pixel is indexed from 1. (`#3184 `__) - Fixed the missing transformation between two `~sunpy.coordinates.HeliographicCarrington` frames with different observation times. (`#3186 `__) - `sunpy.map.sources.AIAMap` and `sunpy.map.sources.HMIMap` will no longer assume the existance of certain header keys. (`#3217 `__) - `sunpy.map.make_fitswcs_header` now supports specifying the map projection rather than defaulting to ``TAN``. (`#3218 `__) - Fix the behaviour of ``sunpy.coordinates.frames.Helioprojective.calculate_distance`` if the representation isn't Spherical. (`#3219 `__) - Fixed a bug where the longitude of a coordinate would not wrap at the expected angle following a frame transformation. (`#3223 `__) - Fixed a bug where passing a time or time interval to the differential rotation function threw an error because the new observer was not in HGS. (`#3225 `__) - Fixed bug where `~sunpy.coordinates.ephemeris.get_horizons_coord` was unable to accept `~astropy.time.Time` arrays as input. (`#3227 `__) - Fix the ticks on the default heliographic grid overlay so they are not white (and normally invisible) by default. (`#3235 `__) - Fixed a bug with `sunpy.net.hek.HEKClient` when the results returned were a mixed dataset. (`#3240 `__) - Fix `sunpy.physics.differential_rotation.differential_rotate` to rotate in the correct direction and to account for the rotation of the heliographic coordinate frame with time. (`#3245 `__) - Fixed a bug with the handling of changing observation times for transformations between `~astropy.coordinates.HCRS` and `~sunpy.coordinates.frames.HeliographicStonyhurst`, which also indirectly affected other transformations when changing observation times. (`#3246 `__) - Fixed all coordinate transformations to properly handle a change in observation time. (`#3247 `__) - Fixed the handling of coordinates with velocity information when transforming between Astropy frames and SunPy frames. (`#3247 `__) - Fixed `~sunpy.physics.solar_rotation.calculate_solar_rotate_shift` so that it does not calculate a shift between the reference layer and itself, which would sometimes incorrectly result in a shift of a pixel due to numerical precision. (`#3255 `__) - Stop crash when ``LineAnimator`` ``axes_ranges`` entry given as ``1D`` array when data is ``>1D``, i.e. as an independent axis. (`#3283 `__) - Fixed a `sunpy.coordinates` bug where a frame using the default observer of Earth could have its observer overwritten during a transformation. (`#3291 `__) - Fixed a bug where the transformation from `~sunpy.coordinates.frames.Helioprojective` to `~sunpy.coordinates.frames.Heliocentric` used the Sun-observer distance from the wrong frame when shifting the origin, and thus might not give the correct answer if the observer was not the same for the two frames. (`#3291 `__) - Fixed a bug with the transformations between `~sunpy.coordinates.frames.Heliocentric` and `~sunpy.coordinates.frames.HeliographicStonyhurst` when the frame observation time was not the same as the observer observation time. The most common way to encounter this bug was when transforming from `~sunpy.coordinates.frames.Helioprojective` to any non-observer-based frame while also changing the observation time. (`#3291 `__) - VSO client ``fetch`` should not download when ``wait`` keyword argument is specified. (`#3298 `__) - Fixed a bug with `~sunpy.coordinates.wcs_utils.solar_frame_to_wcs_mapping` that assumed that the supplied frame was a SunPy frame. (`#3305 `__) - Fixed bugs with `~sunpy.coordinates.wcs_utils.solar_frame_to_wcs_mapping` if the input frame does not include an observation time or an observer. (`#3305 `__) - `~sunpy.coordinates.utils.GreatArc` now accounts for the start and end points of the arc having different observers. (`#3334 `__) - Fixed situations where 2D coordinates provided to `~sunpy.coordinates.frames.HeliographicStonyhurst` and `~sunpy.coordinates.frames.HeliographicCarrington` were not converted to 3D as intended. Furthermore, the stored data will always be the post-conversion, 3D version. (`#3351 `__) - Fix off by one error in `sunpy.map.make_fitswcs_header` where when using the default ``reference_pixel=None`` keyword argument the pixel coordinate of the reference pixel was off by +1. (`#3356 `__) - Updated both GOES XRS and LYRA dataretriever clients to use ``sunpy.util.scraper.Scraper``, to make sure that files are actually on the servers being queried. (`#3367 `__) - Fixing the ordering of lon and lat inputs into make_fitswcs_header (`#3371 `__) - Updated the URL for Fermi spacecraft-pointing files to use an HTTPS connection to HEASARC. (`#3381 `__) - Fixed a bug where permission denied errors when downloading files are very verbose by adding an error message in `~sunpy.net.fido_factory.UnifiedDownloaderFactory.fetch`. (`#3417 `__) - Fixed a malformed call to `astropy.time.Time` in a test, which resulted in an incorrect time scale (UTC instead of TT). (`#3418 `__) - Fix incorrect files being included in the tarball, and docs missing from the tarball (`#3423 `__) - Fixed a bug where clipping behavior had been enabled by default in the plotting normalizers for ``Map`` objects. Clipping needs to be disabled to make use of the over/under/masked colors in the colormap. (`#3427 `__) - Fix a bug with observer based frames that prevented a coordinate with an array of obstimes being transformed to other frames. (`#3455 `__) - `sunpy.map.GenericMap` will no longer raise a warning if the posisition of the observer is not known for frames that don't need an observer, i.e. heliographic frames. (`#3462 `__) - Apply `os.path.expanduser` to `sunpy.map.map_factory.MapFactory` input before passing to `glob.glob` (`#3477 `__) - Fix multiple instances of `sunpy.map` sources assuming the type of FITS Header values. (`#3497 `__) - Fixed a bug with `~sunpy.coordinates.NorthOffsetFrame` where non-spherical representations for the north pole produced an error. (`#3517 `__) - Fixed ``map.__repr__`` when the coordinate system information contained in the ``CUNIT1/2`` metadata is not set to a known value. (`#3569 `__) - Fixed bugs with some coordinate transformations when ``obstime`` is ``None`` on the destination frame but can be assumed to be the same as the ``obstime`` of the source frame. (`#3576 `__) - Updated `sunpy.map.mapsequence.MapSequence` so that calling ``_derotate()`` raises ``NotImplementedError``. Added associated tests. (`#3613 `__) - Fixed pandas plotting registration in `sunpy.timeseries`. (`#3633 `__) - Correctly catch and emit a warning when converting a map metadata to a FITS header and it contains a keyword with non-ascii characters. (`#3645 `__) Improved Documentation ---------------------- - Clean up the docstring for `sunpy.physics.differential_rotation.solar_rotate_coordinate` to make the example clearer. (`#2708 `__) - Added new gallery examples and cleaned up various gallery examples. (`#3181 `__) - Cleaned and expanded upon the docstrings for each Fido Client. (`#3220 `__) - Added clarifying hyperlinks to the gallery example ``getting_lasco_observer_location`` to link to ``astroquery`` docs page. (`#3228 `__) - Added more details to docstrings in `sunpy.coordinates.frames`. (`#3262 `__) - Added a link to package maintainer list in the API Stability page. (`#3281 `__) - Improved the contributing guide by updating commands and highlighting text. (`#3394 `__) - Removing `.fits` from the end of path kwargs in `sunpy.net.fido_factory.UnifiedDownloaderFactory.fetch` docs to change output file extension from ``{file}.fits.fits`` to ``{file}.fits``. (`#3399 `__) - A new example gallery section "Using SunPy with Other Packages" has been added, which contains a set of new examples using the `reproject `__ with solar data. (`#3405 `__) - Added a table of supported coordinate systems and other miscellaneous improvements to the :ref:`coordinates documentation `. (`#3414 `__) - Clarified the meaning of :attr:`sunpy.map.GenericMap.dsun`. (`#3430 `__) - Fixed the plots with multiple subplots in the ``Map`` user guide to properly use `~astropy.visualization.wcsaxes` and to be appropriately sized. (`#3454 `__) - Fixed various issues with the gallery example of saving/loading coordinates using ``asdf``. (`#3473 `__) - Added ``sunpy.__citation__`` with a BibTex entry for citing sunpy. (`#3478 `__) - Added an example showing how to display two maps and fade between them. (`#3488 `__) - Clarified the meaning of some `~sunpy.map.GenericMap` observer properties. (`#3585 `__) - Added inherited members of `sunpy.map` classes to the docs. (`#3587 `__) - Fixed documentation of `sunpy.database.Database.search` by adding ``Returns`` docstring. (`#3593 `__) - Updated the docstring for the parameter ``sortby`` in `~sunpy.map.MapSequence` with the default value, valid value and how to disable sorting. (`#3601 `__) - Updated the tour guide to reflect that the time series is not random data. (`#3603 `__) - Fixes bold type and extra line breaks of remote data manager example. (`#3615 `__) Trivial/Internal Changes ------------------------ - Allow running our sphinx-gallery examples as Jupyter notebooks via Binder (`#3256 `__) - Improve error messages and type checking in ``sunpy.visualization.animator.image.ImageAnimatorWCS``. (`#3346 `__) - Copy the library ``distro`` into :file:`sunpy/extern`: replaces the deprecated ``platform/linux_distribution`` (`#3396 `__) - The version of Matplotlib used to generate figure tests has been bumped from 3.0.3 to 3.1.1. (`#3406 `__) - Corrected spelling of 'plotting' in timeseries method (changed 'ploting' to 'plotting'). (`#3429 `__) - Switched to "importlib_metadata" to get package version to speed up import of SunPy. (`#3449 `__) - Fix tests for `sunpy.data.data_manager` and ensure they are correctly executed with pytest. (`#3550 `__) 1.0.0 (2019-06-01) ================== Backwards Incompatible Changes ------------------------------ - Move the matplotlib animators from ``sunpy.visualisation.imageanimator`` and ``sunpy.visualization.mapcubeanimator`` to `sunpy.visualization.animator`. (`#2515 `__) - Make `sunpy.time.parse_time` return `astropy.time.Time` instead of `datetime.datetime`. (`#2611 `__) - The properties and methods of `sunpy.time.TimeRange` returns `astropy.time.Time` and `astropy.time.TimeDelta` instead of `datetime.datetime` and `datetime.timedelta` respectively. (`#2638 `__) - The ``sunpy.instr.goes`` module now accepts and returns `sunpy.timeseries.sources.XRSTimeSeries` objects only. (`#2666 `__) - ``obstime`` keyword param of ``sunpy.instr.goes._goes_lx`` takes a non-scalar `astropy.time.Time` object instead of `numpy.ndarray`. The precision of times contained in `sunpy.timeseries` has been increased to 9 from 6. (`#2676 `__) - Removed ``sunpy.net.jsoc.attrs.Time`` because it served the same purpose as `sunpy.net.attrs.Time` after the switch to `astropy.time.Time`. (`#2694 `__) - Remove unused ``**kwargs`` within TimeSeries functions. (`#2717 `__) - Rotation matrices inside map objects were previously stored as numpy matrices, but are now stored as numpy arrays, as numpy will eventually remove their matrix datatype. See https://docs.scipy.org/doc/numpy/user/numpy-for-matlab-users.html for more information. (`#2719 `__) - The ``sunpy.cm.show_colormaps`` function now accepts the keyword 'search' instead of 'filter'. (`#2731 `__) - The keyword arguments to all client ``.fetch`` methods have been changed to support the new parfive downloader and to ensure consisteny across all Fido clients. (`#2797 `__) - The Helioviewer client has been switched to using the newer Helioviewer API. This has meant that we have changed some of the keywords that were passed into client's methods. We have enforced that several keywords (observatory,instrument,detector,measurement) need to be defined otherwise the functions cannot return any data. (`#2801 `__) - Maps no longer assume that the pixel units are arcseconds if the units aren't explicitly set. In addition to this if critical metadata is missing from when creating a map, the map will fail to initialize and will raise an error. (`#2847 `__) - axis_ranges kwarg of ``sunpy.visualization.animator.base.ArrayAnimator``, ``sunpy.visualization.animator.image.ImageAnimator`` and ``sunpy.visualization.animator.line.LineAnimator`` now must be entered as None, [min, max] or pixel edges of each array element. Previously, pixel centers were expected. This change removes ambiguity in interpretation and ensures the extent of the plot can always be accurately derived. (`#2867 `__) - All keywords have been added (with defaults) to each `~sunpy.net.helioviewer.HelioviewerClient` function. This means that there will be some changes to the style of the PNG screenshot that is returned. Returns for the JPEG 2000 and the other functions should be the same but not guaranteed. (`#2883 `__) - Changed `sunpy.sun.models.interior` and `sunpy.sun.models.evolution` from `pandas.DataFrame` to `astropy.table.QTable` (`#2936 `__) - Minimum numpy version is now >=1.14.5 (`#2954 `__) - Removed ``sunpy.time.julian_day``, ``sunpy.time.julian_centuries``, ``sunpy.time.day_of_year``, ``sunpy.time.break_time``, ``sunpy.time.get_day``. (`#2999 `__) - Updated the solar values in `sunpy.sun.constants` to IAU 2015 values. (`#3001 `__) - Renamed ``eccentricity_sunearth_orbit`` to ``eccentricity_sun_earth_orbit``. (`#3001 `__) - Renamed ``sunpy.image.rescale`` to `sunpy.image.resample`. (`#3044 `__) - Remove the ``basic_plot`` keyword argument from `~sunpy.map.GenericMap.peek`. An example has been added to the gallery showing how to make a plot like this. (`#3109 `__) - `sunpy.map.GenericMap` will no longer use the key ``solar_b0`` as a value for heliographic latitude. (`#3115 `__) - `sunpy.map.GenericMap` now checks for a complete observer location rather than individually defaulting coordinates (lat, lon, distance) to Earth position. If any one of the three coordinates is missing from the header the observer will be defaulted to Earth and a warning raised. (`#3115 `__) - ``sunpy.sun.sun`` functions have been re-implemented using Astropy for significantly improved accuracy. Some functions have been removed. (`#3137 `__) - All of the functions in ``sunpy.sun.sun`` and all of the Sun-specific functions in `sunpy.coordinates.ephemeris` have been moved to the new module `sunpy.coordinates.sun`. (`#3163 `__) Deprecations and Removals ------------------------- - The deprecated ``sunpy.lightcurve``, ``sunpy.wcs`` and ``sunpy.spectra`` modules have now been removed. (`#2666 `__) - ``sunpy.instr.rhessi.get_obssumm_dbase_file`` ``sunpy.instr.rhessi.get_obssum_filename``, ``sunpy.instr.rhessi.get_obssumm_file`` have been removed. `~sunpy.net.Fido` should be used to download these files. (`#2808 `__) - Removed ``heliographic_solar_center`` in favour of ``sunpy.coordinates.get_sun_L0`` and ``sunpy.coordinates.get_sun_B0`` (`#2830 `__) - Removed ``GenericClient.query`` in favour of `sunpy.net.dataretriever.GenericClient.search` (`#2830 `__) - Removed ``sunearth_distance`` in favour of ``get_sunearth_distance`` (`#2830 `__) - Removed ``remove_lytaf_events_from_lightcurve`` in favour of ``sunpy.instr.lyra.remove_lytaf_events_from_timeseries`` (`#2830 `__) - Removed ``sunpy.cm.get_cmap`` in favour of ``plt.get_cmap`` (`#2830 `__) - Removed ``database.query`` in favour of `sunpy.database.Database.search` (`#2830 `__) - Removed ``sunpy.net.vso.InteractiveVSOClient`` (`#2830 `__) - Removed ``MapCube`` in favour of `~sunpy.map.MapSequence` (`#2830 `__) - Removed ``solar_north`` in favour of ``get_sun_P`` (`#2830 `__) - Removed ``database.download`` in favour of `sunpy.database.Database.fetch` (`#2830 `__) - Removed ``sunpy.map.GenericMap.pixel_to_data`` in favour of `sunpy.map.GenericMap.pixel_to_world` (`#2830 `__) - Removed ``GenericClient.get`` in favour of `sunpy.net.dataretriever.GenericClient.fetch`. This changes applies to the other clients as well. (`#2830 `__) - Removed ``Map.xrange`` and ``Map.yrange`` (`#2830 `__) - Removed ``sunpy.net.attrs.Wave`` in favour of ``sunpy.net.vso.attrs.Wavelength`` (`#2830 `__) - Removed ``JSOCClient.check_request`` in favour of `drms.client.ExportRequest.status` (`#2830 `__) - ``sunpy.net.vso.VSOClient.query_legacy`` and ``sunpy.net.vso.VSOClient.latest`` have been deprecated as we strongly recommend people use `sunpy.net.Fido` for all queries. (`#2866 `__) - The deprecated ``sunpy.physics.transforms`` module has been removed, it is replaced by `sunpy.physics.solar_rotation` and `sunpy.physics.differential_rotation`. (`#2994 `__) - Removed ``sunpy.sun.sun.solar_cycle_number`` because it was fundamentally flawed (`#3150 `__) Features -------- - Change arguments to ``sunpy.test`` from ``offline=`` and ``online=`` to ``online`` and ``online_only``. This matches the behavior of the figure keyword arguments and comes as a part of a move to using a modified version of the Astropy test runner. (`#1983 `__) - asdf schemas and tags were added for the SunPy coordinate frames and `~sunpy.map.GenericMap` allowing these objects to be saved to and restored from `asdf `__ files. (`#2366 `__) - The images from image tests are now saved in a local folder for easy access. (`#2507 `__) - ``sunpy.map.MapCube`` has been renamed to `sunpy.map.MapSequence` to better reflect its use as a collection of map objects. (`#2603 `__) - Net search attributes now support tab completion of values and display a table of possible values when printed, to allow easier discoverability of possible search values. (`#2663 `__) - Running the figure tests now creates a page showing the differences between the expected figures and the figures produced from running the tests. (`#2681 `__) - Add support for Dask arrays in `sunpy.map.Map`. The map factory now checks a whitelist of array types rather than strictly checking if the array is of type `numpy.ndarray`. (`#2689 `__) - Persist the name of a coordinate, i.e. "earth" even though a concrete coordinate object has been calculated and use this string representation to change the way the sunpy frames are printed. This is primarily to facilitate displaying the name of the body rather than the concrete coordinate when printing a `~astropy.coordinates.SkyCoord`. (`#2723 `__) - `~sunpy.net.hek.HEKClient.search` now returns an `astropy.table.Table` instead of list of a `dict`. (`#2759 `__) - Add a downscaled HMI image to the sample data. (`#2782 `__) - Now able to create a `sunpy.map.Map` using an array and a `astropy.wcs.WCS` object. (`#2793 `__) - The download manager for `~sunpy.net.Fido` has been replaced with `parfive `__. This provides advanced progress bars, proper handling of overwriting and the ability to retry failed downloads. (`#2797 `__) - `sunpy.map.GenericMap` can now save out rice compressed FITS files. (`#2826 `__) - Now any SunPyDeprecationWarnings will cause an error when using pytest. (`#2830 `__) - Added full Tox support for SunPy tests, documentation build and figure tests. (`#2839 `__) - Transition the `sunpy.net.vso.VSOClient` from using suds to `zeep `__ as the SOAP library. This is a more actively maintained library, and should provide better support for the VSOs https endpoints. This change should have no effect on the public API of the `sunpy.net.vso.VSOClient`. (`#2866 `__) - Provided access to the Helioviewer header information using `~sunpy.net.helioviewer.HelioviewerClient.get_jp2_header` function. (`#2904 `__) - Add a new WSDL URL and port to support SunPy use of VSO instance at SDAC. (`#2912 `__) - Add support for COSMO K-Coronograph (KCOR) FITS data. (`#2916 `__) - Add logger messaging system based on `~astropy.logger.AstropyLogger`, cleaned up all warnings, removed all print statements. (`#2980 `__) - The function `sunpy.image.coalignment.get_correlation_shifts` now issues an error when the number of dimensions are not correct instead of a warning and returning None. (`#2980 `__) - The default location of the sunpy sample data has changed to be in the platform specific data directory as provided by `appdirs `__. (`#2993 `__) - Add timeseries support for EVE/ESP level 1 data in `sunpy.timeseries.sources` (`#3032 `__) - The default style for Map plots have changed to reflect the changes in Astropy 3.2. (`#3054 `__) - `sunpy.coordinates.ephemeris.get_body_heliographic_stonyhurst` can now account for light travel time when computing the (apparent) body position, as long as the observer location is provided. (`#3055 `__) - Added a helper function (`sunpy.map.make_fitswcs_header`) that allows users to create a meta header for custom created `sunpy.map.GenericMap`. (`#3083 `__) - Map plotting now accepts the optional keyword ``clip_interval`` for specifying a percentile interval for clipping. For example, if the interval (5%, 99%) is specified, the bounds of the z axis are chosen such that the lowest 5% of pixels and the highest 1% of pixels are excluded. (`#3100 `__) - The new function `~sunpy.coordinates.get_horizons_coord` enables querying JPL HORIZONS for the locations of a wide range of solar-system bodies, including spacecraft. (`#3113 `__) Bug Fixes --------- - Fix the bug that prevented VSO queries for HMI data from downloading file without specifying ``a.Physobs``. (`#2621 `__) - Fix ``sunpy.map.mapcube.MapCube.plot``. The code had not been updated to support the changes to the wcsaxes helper functions. (`#2627 `__) - Replace all use of the deprecated ``sunpy.cm.get_cmap`` with `matplotlib.cm.get_cmap` to prevent deprecation warnings being raised. (`#2635 `__) - Fix generation of the coordinate transformation graph with Astropy 3.1.dev (`#2636 `__) - Prevent helioviewer from erroring when downloading file to a directory that does not exist. It will now create the directory when required. (`#2642 `__) - Fix transformations into/out of Heliographic Stonyhurst frame when the coordinate representation is Cartesian. (`#2646 `__) - Running the figure tests with ``setup.py test`` now saves the figures and the hashes to the same directory as setup.py. (`#2658 `__) - ``sunpy.instr.fermi.met_to_utc`` now returns the correct utc time which takes into account the leap seconds that have passed. (`#2679 `__) - Support passing Python file objects to `sunpy.io.fits.write`. (`#2688 `__) - Added DRMS to setup.py so sunpy[all] installs it as a dependency. (`#2693 `__) - Fix eve 0cs timeseries seperator regex to support Python 3.7 (`#2697 `__) - Fix the bug which crashes `~sunpy.map.sources.LASCOMap` for when 'date-obs' is reformatted agian from a self applied function. (`#2700 `__) - Change all instances of quantity_allclose to `astropy.units.allclose` this prevents pytest being needed to import `sunpy.coordinates` on Astropy 3 (`#2701 `__) - Fix RHESSI obssum file downloading to include the final day in the time range. (`#2714 `__) - Raise an error when transforming between HPC and HCC frames if the observer is not the same. (`#2725 `__) - Replaces the existing LASCO C2 and C3 color maps with new ones that perform better with JP2 and Level 0.5, 1 data. (`#2731 `__) - Do not attempt to save a FITS header comment for a keyword which is not in the header. This prevents an error on saving some maps after the metadata had been modified but not the comments. (`#2748 `__) - Add support for `~sunpy.map.sources.HMIMap` objects as input to ``sunpy.instr.aia.aiaprep``. (`#2749 `__) - User can convert between HPC and HCC coordinates with different observers. This is implemented by automatically transforming the coordinate into HGS and then changing observer, and then transforming back to HCC. (`#2754 `__) - Changed default file type for Helioviewer to prevent decode errors. (`#2771 `__) - Increase figure size to avoid cutting off longer colormap names in ``sunpy.cm.show_colormaps``. (`#2824 `__) - The sample data directory will no longer be created until files are downloaded to it. (`#2836 `__) - Timeseries and lightcurve will now respect updated config values for download directory. (`#2844 `__) - Always use _default_wrap_angle rather than hard coding a wrap angle in the init of a sunpy coordinate frame (`#2853 `__) - Ensure imageanimators only slice arrays with integers (`#2856 `__) - Fixed `sunpy.io.fits.write` to handle the keyword ``COMMENT`` correctly. (`#2880 `__) - If Carrington longitude ("crln_obs") is found in the FITS header, `~sunpy.map.Map` converts this to the correct Heliographic longitude. (`#2946 `__) - ``sunpy.net.helio.hec.HECClient.time_query`` now resolves the correct input time format. (`#2969 `__) - Fixes the calculation of the solar rotation of coordinates and the differential rotation of `sunpy.map.GenericMap`. (`#2972 `__) - Added back the FERMI GBM client to `sunpy.net.dataretriever`. (`#2983 `__) - Fix bug in `sunpy.net.hek` which raised and error if a search returned zero results, now returns an empty `sunpy.net.hek.HEKTable`. (`#3046 `__) - `~sunpy.map.sources.AIAMap` now uses the provided HAE coordinates instead of the provided HGS coordinates to determine the observer location. (`#3056 `__) - Correctly zero pad milliseconds in the ``sunpy.util.scraper.Scraper`` formatting to prevent errors when the millisecond value was less than 100. (`#3063 `__) - Fix ``sunpy.util.scraper.Scraper`` failing if a directory is not found on a remote server. (`#3063 `__) - Correctly extract observer location from MDI and EIT data (`#3067 `__) - Fix HGS <> HCRS test due to Ecliptic frame changes in astropy 3.2 (`#3075 `__) - Fixes bug when creating a timeseries from a URL and bug when creating a TimeSeries from older GOES/XRS fits files. (`#3081 `__) - Added `~sunpy.map.sources.EUVIMap.rsun_obs`. It returns a quantity in arcsec consistent with other `sunpy.map.GenericMap` and overwrites mapbase's assumption of a photospheric limb as seen from Earth. (`#3099 `__) - Fixed bugs related to using `~sunpy.map.GenericMap.plot` and `~sunpy.map.GenericMap.peek` with the ``inline`` Matplotlib backend in Jupyter notebook. (`#3103 `__) - Make a correction to `sunpy.coordinates.wcs_utils.solar_wcs_frame_mapping` so that `astropy.wcs.WCS` objects are correctly converted to `sunpy.coordinates.frames` objects irrespective of the ordering of the axes. (`#3116 `__) - The `~sunpy.physics.differential_rotation.solar_rotate_coordinate` function returns a coordinate that accounts for the location of the new observer. (`#3123 `__) - Add support for rotation parameters to `sunpy.map.make_fitswcs_header`. (`#3139 `__) - Improve the implementation of `~sunpy.physics.differential_rotation.differential_rotate` the image warping when transforming Maps for differential rotation and change in observer position. (`#3149 `__) - Fix a bug where new helioviewer sources potentially cause `~sunpy.net.helioviewer.HelioviewerClient.data_sources` to error. (`#3162 `__) Improved Documentation ---------------------- - Organise the gallery into sections based on example type and tidy up a little. (`#2624 `__) - Added gallery example showing the conversion of Helioprojective Coordinates to Altitude/Azimuth Coordinates to and back. (`#2656 `__) - Add contribution guidelines for the sunpy example gallery. (`#2682 `__) - Added a gallery example for "Downloading and plotting a HMI image" and "Creating a Composite map". (`#2746 `__) - Added an example for ``sunpy.visualization.animator.ImageAnimatorWCS``. (`#2752 `__) - Minor changes to the developer guide regarding sprint labels. (`#2765 `__) - Copyedited and corrected the solar cycles example. (`#2770 `__) - Changed "online" mark to "remote_data" and made formatting of marks consistent. (`#2799 `__) - Add a missing plot to the end of the units and coordinates guide. (`#2813 `__) - Added gallery example showing how to access the SunPy colormaps (`#2865 `__) - Added gallery example showing how to access the SunPy solar physics constants. (`#2882 `__) - Major clean up of the developer documentation. (`#2951 `__) - Overhaul of the install intructions for the guide section of our documentation. (`#3147 `__) Trivial/Internal Changes ------------------------ - `~sunpy.time.parse_time` now uses `~functools.singledispatch` underneath. (`#2408 `__) - Revert the handling of ``quantity_allclose`` now that `astropy/astropy#7252 `__ is merged. This also bumps the minimum astropy version to 3.0.2. (`#2598 `__) - Replace the subclasses of matplotlib Slider and Button in `sunpy.visualization` with partial functions. (`#2613 `__) - Sort the ana C source files before building to enable reproducible builds. (`#2637 `__) - We are now using `towncrier `__ to generate our changelogs. (`#2644 `__) - Moved figure tests to Python 3.6. (`#2655 `__) - Removed old metaclass used for Map and TimeSeries as we have now moved to Python 3.6. (`#2655 `__) - Updated astropy_helpers to v3.0.2. (`#2655 `__) - When running image tests, a comparison HTML page is now generated to show the generated images and expected images. (`#2660 `__) - Change to using pytest-cov for coverage report generation to enable support for parallel builds (`#2667 `__) - Use of `textwrap` to keep source code indented when multiline texts is used (`#2671 `__) - Fix mispelling of private attribute ``_default_heliographic_latitude`` in map. (`#2730 `__) - Miscellaneous fixes to developer docs about building sunpy's documentation. (`#2825 `__) - Changed ``sunpy.instr.aia.aiaprep`` to update BITPIX keyword to reflect the float64 dtype. (`#2831 `__) - Remove warning from ``GenericMap.submap`` when using pixel ``Quantities`` as input. (`#2833 `__) - Remove the usage of six and all ``__future__`` imports (`#2837 `__) - Fix SunPy Coordinate tests with Astropy 3.1 (`#2838 `__) - Stores entries from directories into database sorted by name. It adds mocks to the database user guide examples. (`#2873 `__) - Fix all DeprecationWarning: invalid escape sequence. (`#2885 `__) - Used `unittest.mock` for creating offline tests for simulating online tests for :file:`test_noaa.py` (`#2900 `__) - Fix support for pip 19 and isolated builds (`#2915 `__) - Moved to using `AppDirs `__ as the place to host our configuration file. (`#2922 `__) - Users can now use fewer keywords in our `~sunpy.net.helioviewer.HelioviewerClient` to access the available sources. Either by ``observatory`` and ``measurement`` or ``instrument`` and ``measurement`` as this much information is enough to get the source ID for most of the cases. (`#2926 `__) - Remove the pytest dependency on the ``GenericMap`` asdf tag. (`#2943 `__) - Fix initialization of `~sunpy.net.vso.VSOClient` when no WSDL link is found. (`#2981 `__) 0.9.0 ===== New Features ------------ - Added TimeUTime class to support utime. [#2409] - Example for fine-grained use of ticks and grids [#2435] - Maintiners Workflow Guide [#2411] - Decorator to append and/or prepend doc strings [#2386] - Adding ``python setup.py test --figure-only`` [#2557] - Fido.fetch now accepts pathlib.Path objects for path attribute.[#2559] - The `~sunpy.coordinates.HeliographicStonyhurst` coordinate system can now be specified using a cartesian system, which is sometimes known as the "Heliocentric Earth equatorial" (HEEQ) coordinate system. [#2437] API Changes ----------- - ``sunpy.coordinates.representation`` has been removed. Longitude wrapping is now done in the constructor of the frames. [#2431] - Propagation of ``obstime`` in the coordinate frame transformation has changed, this means in general when transforming directly between frames (not `~astropy.coordinates.SkyCoord`) you will have to specify ``obstime`` in more places. [#2461] - Transforming between Heliographic Stonyhurst and Carrington now requires that ``obstime`` be defined and the same on both the input and output frames. [#2461] - Removed the figure return from .peek() [#2487] Bug Fixes --------- - Improve TimeSeriesBase docstring [#2399] - Validate that pytest-doctestplus is installed [#2388] - Fix use of self.wcs in plot in mapbase [#2398] - Updated docstring with pointer to access EVE data for other levels [#2402] - Fix broken links and redirections in documentation [#2403] - Fixes Documentation changes due to NumPy 1.14 [#2404] - Added docstrings to functions in dowload.py [#2415] - Clean up database doc [#2414] - rhessi.py now uses sunpy.io instead of astropy.io [#2416] - Remove Gamma usage in Map [#2424] - Changed requirements to python-dateutil [#2426] - Clarify coordinate system definitions [#2429] - Improve Map Peek when using draw_grid [#2442] - Add HCC --> HGS test [#2443] - Testing the transformation linking SunPy and Astropy against published values [#2454] - Fixed title bug in sunpy.timeseries.rhessi [#2477] - Allow LineAnimator to accept a varying x-axis [#2491] - Indexing Bug Fix to LineAnimator [#2560] - Output sphinx warnings to stdout [#2553] - Docstring improvement for LineAnimator [#2514] - move the egg_info builds to circleci [#2512] - Added tests for TraceMap [#2504] - Fix HGS frame constructor and HPC ``calculate_distance`` with SkyCoord constructor. [#2463] - removed ``wavelnth`` keyword in meta desc of Maps to avoid using non standard FITS keyword like ``nan`` [#2456] - The documentation build now uses the Sphinx configuration from sphinx-astropy rather than from astropy-helpers.[#2494] - Migrate to hypothesis.strategies.datetimes [#2368] - Prevent a deprecation warning due to truth values of Quantity [#2358] - Print a warning when heliographic longitude is set to it's default value of 0 [#2480] - parse_time now parses numpy.datetime64 correctly. [#2572] 0.8.5 ===== Bug Fixes --------- - Removed AstropyDeprecationWarning from sunpy.coordinates.representation [#2476] - Fix for NorthOffsetFrame under Astropy 3.0 [#2486] - Fix lightcurve tests under numpy dev [#2505] - Updated depecration link of radiospectra [#2481] - Fixed Padding values in some of the documentation pages [#2497] - Move documentation build to circleci [#2509] - Fix Issue #2470 hgs_to_hcc(heliogcoord, heliocframe) [#2502] - Fixing CompositeMap object so that it respects masked maps [#2492] 0.8.4 ===== Bug Fixes --------- - Improve detection of ``SkyCoord`` frame instantiation when distance is ``1*u.one``. This fixes a plotting bug with ``WCSAxes`` in Astropy 3.0 [#2465] - removed ``wavelnth`` keyword in meta desc of Maps to avoid using non standard FITS keyword like ``nan`` [#2427] - Change the default units for HPC distance from ``u.km`` to `None`. [#2465] 0.8.3 ===== Bug Fixes --------- - `~sunpy.net.dataretriever.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 dependencies 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 https://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 dependency - 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. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/CITATION.rst0000644000175100001710000001267700000000000013705 0ustar00vstsdockerAcknowledging or Citing SunPy ============================= If you use SunPy in your scientific work, we would appreciate citing it in your publications. The continued growth and development of SunPy is dependent on the community being aware of SunPy. Citing SunPy in Publications ---------------------------- Please add the following line within your methods, conclusion or acknowledgements sections: *This research used version X.Y.Z (software citation) of the SunPy open source software package (project citation).* The project citation should be to the `SunPy paper`_, and the software citation should be the specific `Zenodo DOI`_ for the version used in your work. .. code:: bibtex @ARTICLE{sunpy_community2020, doi = {10.3847/1538-4357/ab4f7a}, url = {https://iopscience.iop.org/article/10.3847/1538-4357/ab4f7a}, author = {{The SunPy Community} and Barnes, Will T. and Bobra, Monica G. and Christe, Steven D. and Freij, Nabil and Hayes, Laura A. and Ireland, Jack and Mumford, Stuart and Perez-Suarez, David and Ryan, Daniel F. and Shih, Albert Y. and Chanda, Prateek and Glogowski, Kolja and Hewett, Russell and Hughitt, V. Keith and Hill, Andrew and Hiware, Kaustubh and Inglis, Andrew and Kirk, Michael S. F. and Konge, Sudarshan and Mason, James Paul and Maloney, Shane Anthony and Murray, Sophie A. and Panda, Asish and Park, Jongyeob and Pereira, Tiago M. D. and Reardon, Kevin and Savage, Sabrina and Sipőcz, Brigitta M. and Stansby, David and Jain, Yash and Taylor, Garrison and Yadav, Tannmay and Rajul and Dang, Trung Kien}, title = {The SunPy Project: Open Source Development and Status of the Version 1.0 Core Package}, journal = {The Astrophysical Journal}, volume = {890}, issue = {1}, pages = {68-}, publisher = {American Astronomical Society}, year = {2020} } You can also get this information with ``sunpy.__citation__``. Other SunPy publications ######################## The SunPy v1.0.8 code was reviewed by `The Journal of Open Source Software (JOSS) `__. .. code:: bibtex @ARTICLE{Mumford2020, doi = {10.21105/joss.01832}, url = {https://doi.org/10.21105/joss.01832}, year = {2020}, publisher = {The Open Journal}, volume = {5}, number = {46}, pages = {1832}, author = {Stuart Mumford and Nabil Freij and Steven Christe and Jack Ireland and Florian Mayer and V. Hughitt and Albert Shih and Daniel Ryan and Simon Liedtke and David Pérez-Suárez and Pritish Chakraborty and Vishnunarayan K and Andrew Inglis and Punyaslok Pattnaik and Brigitta Sipőcz and Rishabh Sharma and Andrew Leonard and David Stansby and Russell Hewett and Alex Hamilton and Laura Hayes and Asish Panda and Matt Earnshaw and Nitin Choudhary and Ankit Kumar and Prateek Chanda and Md Haque and Michael Kirk and Michael Mueller and Sudarshan Konge and Rajul Srivastava and Yash Jain and Samuel Bennett and Ankit Baruah and Will Barnes and Michael Charlton and Shane Maloney and Nicky Chorley and Himanshu and Sanskar Modi and James Mason and Naman9639 and Jose Rozo and Larry Manley and Agneet Chatterjee and John Evans and Michael Malocha and Monica Bobra and Sourav Ghosh and Airmansmith97 and Dominik Stańczak and Ruben De Visscher and Shresth Verma and Ankit Agrawal and Dumindu Buddhika and Swapnil Sharma and Jongyeob Park and Matt Bates and Dhruv Goel and Garrison Taylor and Goran Cetusic and Jacob and Mateo Inchaurrandieta and Sally Dacie and Sanjeev Dubey and Deepankar Sharma and Erik Bray and Jai Rideout and Serge Zahniy and Tomas Meszaros and Abhigyan Bose and André Chicrala and Ankit and Chloé Guennou and Daniel D'Avella and Daniel Williams and Jordan Ballew and Nick Murphy and Priyank Lodha and Thomas Robitaille and Yash Krishan and Andrew Hill and Arthur Eigenbrot and Benjamin Mampaey and Bernhard Wiedemann and Carlos Molina and Duygu Keşkek and Ishtyaq Habib and Joseph Letts and Juanjo Bazán and Quinn Arbolante and Reid Gomillion and Yash Kothari and Yash Sharma and Abigail Stevens and Adrian Price-Whelan and Ambar Mehrotra and Arseniy Kustov and Brandon Stone and Trung Dang and Emmanuel Arias and Fionnlagh Dover and Freek Verstringe and Gulshan Kumar and Harsh Mathur and Igor Babuschkin and Jaylen Wimbish and Juan Buitrago-Casas and Kalpesh Krishna and Kaustubh Hiware and Manas Mangaonkar and Matthew Mendero and Mickaël Schoentgen and Norbert Gyenge and Ole Streicher and Rajasekhar Mekala and Rishabh Mishra and Shashank Srikanth and Sarthak Jain and Tannmay Yadav and Tessa Wilkinson and Tiago Pereira and Yudhik Agrawal and Jamescalixto and Yasintoda and Sophie Murray}, title = {SunPy: A Python package for Solar Physics}, journal = {Journal of Open Source Software} } A paper about version v0.5 of SunPy was published in `Computational Science & Discovery `__. Acknowledging SunPy in Posters and Talks ---------------------------------------- Please include the `Sunpy logo`_ on the title, conclusion slide, or about page. For websites please link the image to `sunpy.org`_. Other versions of the logo are available in the `sunpy-logo repository`_. .. _SunPy paper: https://doi.org/10.3847/1538-4357/ab4f7a .. _Sunpy logo: https://github.com/sunpy/sunpy-logo/blob/master/sunpy_logo.svg .. _sunpy.org: https://sunpy.org/ .. _sunpy-logo repository: https://github.com/sunpy/sunpy-logo/ .. _Zenodo DOI: https://doi.org/10.5281/zenodo.591887 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/LICENSE.rst0000644000175100001710000000243400000000000013543 0ustar00vstsdockerCopyright (c) 2013-2019 The SunPy 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. 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. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/MANIFEST.in0000644000175100001710000000117700000000000013470 0ustar00vstsdocker# Exclude specific files # All files which are tracked by git and not explicitly excluded here are included by setuptools_scm exclude .codecov.yaml exclude .mailmap exclude .editorconfig exclude .gitattributes exclude .gitignore exclude .pep8speaks.yml exclude .pre-commit-config.yaml exclude .test_package_pins.txt exclude .zenodo.json exclude azure-pipelines.yml exclude readthedocs.yml exclude rtd-environment.yml # Prune folders prune .circleci prune .github prune .jupyter prune binder prune changelog prune tools # This subpackage is only used in development checkouts and should not be # included in built tarballs prune sunpy/_dev ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1647479066.693276 sunpy-3.1.5/PKG-INFO0000644000175100001710000001242700000000000013027 0ustar00vstsdockerMetadata-Version: 2.1 Name: sunpy Version: 3.1.5 Summary: "SunPy: Python for Solar Physics" Home-page: https://sunpy.org Author: The SunPy Community Author-email: sunpy@googlegroups.com License: BSD 2-Clause Keywords: solar physics,solar,science,sun,wcs,coordinates Platform: any Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Science/Research Classifier: License :: OSI Approved :: BSD License Classifier: Natural Language :: English Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Topic :: Scientific/Engineering :: Physics Provides: sunpy Requires-Python: >=3.7 Description-Content-Type: text/x-rst Provides-Extra: asdf Provides-Extra: dask Provides-Extra: database Provides-Extra: image Provides-Extra: jpeg2000 Provides-Extra: map Provides-Extra: net Provides-Extra: timeseries Provides-Extra: visualization Provides-Extra: tests Provides-Extra: docs Provides-Extra: dev Provides-Extra: all License-File: LICENSE.rst ******** `SunPy`_ ******** |Latest Version| |codecov| |matrix| |Research software impact| |DOI| |Powered by NumFOCUS| .. |Latest Version| image:: https://img.shields.io/pypi/v/sunpy.svg :target: https://pypi.python.org/pypi/sunpy/ .. |matrix| image:: https://img.shields.io/matrix/sunpy:openastronomy.org.svg?colorB=%23FE7900&label=Chat&logo=matrix&server_fqdn=openastronomy.modular.im :target: https://openastronomy.element.io/#/room/#sunpy:openastronomy.org .. |codecov| image:: https://codecov.io/gh/sunpy/sunpy/branch/main/graph/badge.svg :target: https://codecov.io/gh/sunpy/sunpy .. |Research software impact| image:: http://depsy.org/api/package/pypi/sunpy/badge.svg :target: http://depsy.org/package/python/sunpy .. |DOI| image:: https://zenodo.org/badge/2165383.svg :target: https://zenodo.org/badge/latestdoi/2165383 .. |Powered by NumFOCUS| image:: https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A :target: https://numfocus.org .. |Binder| image:: https://mybinder.org/badge_logo.svg :target: https://mybinder.org/v2/gh/sunpy/sunpy/main?filepath=examples SunPy is an open-source Python library for Solar Physics data analysis and visualization. Our homepage `SunPy`_ has more information about the project. For some examples of using SunPy see our `gallery`_, to see the latest changes in SunPy see our `Changelog`_. .. _SunPy: https://sunpy.org .. _gallery: https://docs.sunpy.org/en/stable/generated/gallery/index.html .. _Changelog: https://docs.sunpy.org/en/stable/whatsnew/changelog.html Installation ============ The recommended way to install SunPy is with `miniconda`_. To install SunPy once conda is installed run the following two commands: .. code:: bash $ conda config --append channels conda-forge $ conda install sunpy For detailed installation instructions, see the `installation guide`_ in the SunPy docs. .. _miniconda: https://docs.conda.io/en/latest/miniconda.html .. _installation guide: https://docs.sunpy.org/en/stable/guide/installation.html Developing ========== If you want to develop SunPy you will need to install from GitHub. For detailed installation instructions, see `Development installation`_ in the SunPy docs. Usage ===== Here is a quick example of plotting an AIA image: .. code:: 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`_ - `SunPy Element Channel`_ - `SunPy Mailing List`_ .. _SunPy Documentation: https://docs.sunpy.org/en/stable/ .. _SunPy Element Channel: https://app.element.io/#/room/#sunpy:openastronomy.org .. _SunPy Mailing List: https://groups.google.com/forum/#!forum/sunpy Contributing ============ |Open Source Helpers| If you would like to get involved, start by joining the `SunPy mailing list`_ and check out the `Developers Guide`_ section of the SunPy docs. Stop by our chat room `#sunpy:openastronomy.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`_ for the list of known outstanding items. For more information on contributing to SunPy, please read our `Newcomers' guide`_. .. |Open Source Helpers| image:: https://www.codetriage.com/sunpy/sunpy/badges/users.svg :target: https://www.codetriage.com/sunpy/sunpy .. _SunPy mailing list: https://groups.google.com/forum/#!forum/sunpy .. _Developers Guide: https://docs.sunpy.org/en/latest/dev_guide/index.html .. _`#sunpy:openastronomy.org`: https://app.element.io/#/room/#sunpy:openastronomy.org .. _issues page: https://github.com/sunpy/sunpy/issues .. _Newcomers' guide: https://docs.sunpy.org/en/latest/dev_guide/contents/newcomers.html .. _Development installation: https://docs.sunpy.org/en/latest/dev_guide/contents/newcomers.html#setting-up-a-development-environment Code of Conduct =============== When you are interacting with the SunPy community you are asked to follow our `Code of Conduct`_. .. _Code of Conduct: https://sunpy.org/coc ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/README.rst0000644000175100001710000001012400000000000013411 0ustar00vstsdocker******** `SunPy`_ ******** |Latest Version| |codecov| |matrix| |Research software impact| |DOI| |Powered by NumFOCUS| .. |Latest Version| image:: https://img.shields.io/pypi/v/sunpy.svg :target: https://pypi.python.org/pypi/sunpy/ .. |matrix| image:: https://img.shields.io/matrix/sunpy:openastronomy.org.svg?colorB=%23FE7900&label=Chat&logo=matrix&server_fqdn=openastronomy.modular.im :target: https://openastronomy.element.io/#/room/#sunpy:openastronomy.org .. |codecov| image:: https://codecov.io/gh/sunpy/sunpy/branch/main/graph/badge.svg :target: https://codecov.io/gh/sunpy/sunpy .. |Research software impact| image:: http://depsy.org/api/package/pypi/sunpy/badge.svg :target: http://depsy.org/package/python/sunpy .. |DOI| image:: https://zenodo.org/badge/2165383.svg :target: https://zenodo.org/badge/latestdoi/2165383 .. |Powered by NumFOCUS| image:: https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A :target: https://numfocus.org .. |Binder| image:: https://mybinder.org/badge_logo.svg :target: https://mybinder.org/v2/gh/sunpy/sunpy/main?filepath=examples SunPy is an open-source Python library for Solar Physics data analysis and visualization. Our homepage `SunPy`_ has more information about the project. For some examples of using SunPy see our `gallery`_, to see the latest changes in SunPy see our `Changelog`_. .. _SunPy: https://sunpy.org .. _gallery: https://docs.sunpy.org/en/stable/generated/gallery/index.html .. _Changelog: https://docs.sunpy.org/en/stable/whatsnew/changelog.html Installation ============ The recommended way to install SunPy is with `miniconda`_. To install SunPy once conda is installed run the following two commands: .. code:: bash $ conda config --append channels conda-forge $ conda install sunpy For detailed installation instructions, see the `installation guide`_ in the SunPy docs. .. _miniconda: https://docs.conda.io/en/latest/miniconda.html .. _installation guide: https://docs.sunpy.org/en/stable/guide/installation.html Developing ========== If you want to develop SunPy you will need to install from GitHub. For detailed installation instructions, see `Development installation`_ in the SunPy docs. Usage ===== Here is a quick example of plotting an AIA image: .. code:: 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`_ - `SunPy Element Channel`_ - `SunPy Mailing List`_ .. _SunPy Documentation: https://docs.sunpy.org/en/stable/ .. _SunPy Element Channel: https://app.element.io/#/room/#sunpy:openastronomy.org .. _SunPy Mailing List: https://groups.google.com/forum/#!forum/sunpy Contributing ============ |Open Source Helpers| If you would like to get involved, start by joining the `SunPy mailing list`_ and check out the `Developers Guide`_ section of the SunPy docs. Stop by our chat room `#sunpy:openastronomy.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`_ for the list of known outstanding items. For more information on contributing to SunPy, please read our `Newcomers' guide`_. .. |Open Source Helpers| image:: https://www.codetriage.com/sunpy/sunpy/badges/users.svg :target: https://www.codetriage.com/sunpy/sunpy .. _SunPy mailing list: https://groups.google.com/forum/#!forum/sunpy .. _Developers Guide: https://docs.sunpy.org/en/latest/dev_guide/index.html .. _`#sunpy:openastronomy.org`: https://app.element.io/#/room/#sunpy:openastronomy.org .. _issues page: https://github.com/sunpy/sunpy/issues .. _Newcomers' guide: https://docs.sunpy.org/en/latest/dev_guide/contents/newcomers.html .. _Development installation: https://docs.sunpy.org/en/latest/dev_guide/contents/newcomers.html#setting-up-a-development-environment Code of Conduct =============== When you are interacting with the SunPy community you are asked to follow our `Code of Conduct`_. .. _Code of Conduct: https://sunpy.org/coc ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/asv.conf.json0000644000175100001710000000130500000000000014333 0ustar00vstsdocker{ "version": 1, "project": "sunpy-benchmarks", "project_url": "https://sunpy.org/", "repo": "./", "branches": [ "main" ], "dvcs": "git", "environment_type": "virtualenv", "show_commit_url": "https://github.com/sunpy/sunpy/commit/", "benchmark_dir": "benchmarks", "results_dir": "asv_results/results", "env_dir": "asv_env", "install_command": [ "in-dir={env_dir} python -mpip install {wheel_file}[map]" ], "build_command": [ "python -mpip install extension_helpers numpy", "python setup.py build", "PIP_NO_BUILD_ISOLATION=false python -mpip wheel --no-deps --no-index -w {build_cache_dir} {build_dir}" ] } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.5452743 sunpy-3.1.5/benchmarks/0000755000175100001710000000000000000000000014041 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/benchmarks/__init__.py0000644000175100001710000000000000000000000016140 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/benchmarks/benchmarks_for_is_time.py0000644000175100001710000000050700000000000021111 0ustar00vstsdocker from sunpy.time import is_time class TimeSuite: """ An example benchmark that times the performance of sunpy.is_time() function """ def time_is_time(self): t = is_time('1995-12-31 23:59:60') class MemSuite: def mem_is_time(self): t = is_time('1995-11-31 23:59:60') return t ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/benchmarks/benchmarks_for_map.py0000644000175100001710000000116200000000000020233 0ustar00vstsdocker import sunpy.data.sample import sunpy.map class TimeSuite: """ An example benchmark that times the performance of sunpy map creation """ def setup(self): self._map = sunpy.data.sample.AIA_171_IMAGE def time_create_sunpy_map(self): sunpy.map.Map(self._map) class MemSuite: def setup(self): self._map = sunpy.data.sample.AIA_171_IMAGE def mem_sunpy_map(self): return sunpy.map.Map(self._map) class PeakMemorySuite: def setup(self): self._map = sunpy.data.sample.AIA_171_IMAGE def peakmem_sunpy_map(self): sunpy.map.Map(self._map) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/benchmarks/benchmarks_for_parse_time.py0000644000175100001710000000070200000000000021605 0ustar00vstsdocker from sunpy.time import parse_time class TimeSuite: """ An example benchmark that times the performance of sunpy.parse_time() function """ def time_parse_time(self): t = parse_time('1995-12-31 23:59:60') class MemSuite: def mem_parse_time(self): t = parse_time('1995-12-31 23:59:60') return t class PeakMemorySuite: def peakmem_parse_time(self): t = parse_time('1995-12-31 23:59:60') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/benchmarks/benchmarks_for_resample.py0000644000175100001710000000067600000000000021277 0ustar00vstsdockerimport astropy.units as u import sunpy.data.sample import sunpy.map class TimeSuite: def setup(self): self._map = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) def time_resample(self): self._map.resample([100, 100] * u.pix) class PeakMemorySuite: def setup(self): self._map = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) def peakmem_resample(self): self._map.resample([100, 100] * u.pix) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.5452743 sunpy-3.1.5/docs/0000755000175100001710000000000000000000000012654 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/Makefile0000644000175100001710000000110500000000000014311 0ustar00vstsdocker# Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/about.rst0000644000175100001710000000003500000000000014516 0ustar00vstsdocker.. include:: ../CITATION.rst ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.5492742 sunpy-3.1.5/docs/code_ref/0000755000175100001710000000000000000000000014422 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.5492742 sunpy-3.1.5/docs/code_ref/coordinates/0000755000175100001710000000000000000000000016734 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/coordinates/carrington.rst0000644000175100001710000002325500000000000021643 0ustar00vstsdocker.. _sunpy-coordinates-carrington: Calculating Carrington longitude ******************************** Carrington coordinates are a heliographic coordinate system, where the longitude is determined assuming that the Sun has rotated at a sidereal period of ~25.38 days starting at zero longitude at a specific time on 1853 November 9. For a given observer at a given observation time, the center of the disk of the Sun as seen by that observer (also known as the apparent [#apparent]_ sub-observer point) has a Carrington latitude and longitude. When the observer is at Earth, the apparent sub-Earth [#subEarth]_ Carrington latitude and longitude are also known as |B0| and |L0|, respectively. Quick summary ============= SunPy calculates the sub-observer Carrington longitude in a manner that enables co-alignment of images of the Sun's surface from different observatories at different locations/velocities in the solar system, but that results in a ~20-arcsecond discrepancy with |AA|. Observer effects ================ An observer will perceive the locations and orientations of solar-system objects different from how they truly are. There are two primary effects for why the apparent sub-observer point is not the same as the "true" sub-observer point. Light travel time ----------------- It takes time for light to travel from the Sun to any observer (e.g., ~500 seconds for an observer at Earth). Thus, the farther the observer is from the Sun, the farther back in time the Sun will appear to be. This effect is sometimes called "planetary aberration". As an additional detail, the observer is closer to the sub-observer point on the Sun's surface than to the center of the Sun (i.e., by the radius of the Sun), which corresponds to ~2.3 lightseconds. Observer motion --------------- The motion of an observer will shift the apparent location of objects, and this effect is called "stellar aberration". A more subtle question is whether observer motion also shifts the apparent sub-observer Carrington longitude. Stellar aberration causes the apparent ecliptic longitude of an observer to be different from its true ecliptic longitude. This shift in ecliptic longitude also means a shift in the heliographic longitude of the observer. For example, for an Earth observer, the apparent heliographic longitude of Earth is ~0.006 degrees (~20 arcseconds) less than its true heliographic longitude. For some purposes, this shift in the heliographic longitude of the observer should also shift the apparent sub-observer Carrington longitude. However, shifting the sub-observer Carrington longitude due to observer motion is not always appropriate. For certain types of observations (e.g., imagery of features on the surface of the Sun), stellar aberration does not shift the positions of solar features **relative** to the center of the disk of the Sun; everything shifts in tandem. Thus, for the purposes of co-aligning images from different observatories, it is critical to **exclude** any correction for observer motion. Background information ====================== The IAU definition ------------------ Since the original definition of Carrington coordinates [#Carrington]_, there have been a number of refinements of the definition, but there have been inconsistencies with how those definitions are interpreted. Possible points of contention include the reference epoch, the rotation period, and the handling of observer effects. The most recent definition was essentially laid down in 2007 by the IAU [#IAU]_: * The reference epoch is J2000.0 TDB (2000 January 1 12:00 TDB). The difference between Barycentric Dynamical Time (TDB) and Terrestrial Time (TT) is very small, but both are appreciably different from Coordinated Universal Time (UTC). * The longitude of the prime meridian (|W0|) at the reference epoch is 84.176 degrees. This longitude is the "true" longitude, without accounting for any effects that would modify the apparent prime meridian for an observer (e.g., light travel time). * The sidereal rotation rate is exactly 14.1844 degrees per day. This is close to, but not exactly the same as, a sidereal rotation period of 25.38 days or a mean synodic period of 27.2753 days. * The ICRS coordinates of the Sun's north pole of rotation is given as a right ascension of 286.13 degrees and a declination of 63.87 degrees. The tuning of |W0| ------------------ Importantly, the IAU parameters (specifically, |W0|) were tuned following an investigation by |AA| [#AA]_. The prescription of |AA| included both the correction for light travel time and the correction for stellar aberration due to Earth's motion. When using this prescription, |AA| found that a |W0| value of 84.176 degrees minimized the differences between the modern approach and earlier approaches. However, for those purposes where one should use sub-observer Carrington longitudes without the stellar-aberration correction, there will be a discrepancy compared to |AA| and to calculations made using earlier approaches. The approach in SunPy ===================== SunPy determines apparent sub-observer Carrington longitude by including the correction for the difference in light travel time, but **excluding** any correction for stellar aberration due to observer motion. The exclusion of a stellar-aberration correction is appropriate for purposes such as image co-alignment, where Carrington longitudes must be consistently associated with features on the Sun's surface. Comparisons to other sources ============================ Compared to |AA| and older methods of calculation ------------------------------------------------- |AA| publishes the apparent sub-Earth Carrington longitude (|L0|), and these values include the stellar-aberration correction. Consequently, SunPy values will be consistently ~0.006 degrees (~20 arcseconds) greater than |AA| values, although these discrepancies are not always apparent at the printed precision (0.01 degrees). Since |AA| specifically tuned the IAU parameters to minimize the discrepancies with older methods of calulation under their prescription that includes the stellar-aberration correction, SunPy values will also be ~20 arcseconds greater than values calculated using older methods. Be aware that older methods of calculation may not have accounted for the variable light travel time between the Sun and the Earth, which can cause additional discrepancies of up to ~5 arcseconds. |AA| does not appear to account for the difference in light travel time between the sub-Earth point on the Sun's surface and the center of the Sun (~2.3 lightseconds), which results in a fixed discrepancy of ~1.4 arcseconds in |L0|. However, this additional discrepancy is much smaller than the difference in treatment of stellar aberration. Compared to SPICE ----------------- In `SPICE `_, the apparent sub-observer Carrington longitude can be calculated using the function `subpnt `_. `subpnt`_ allows for two types of aberration correction through the input argument ``abcorr``: * "LT", which is just the correction for light travel time * "LT+S", which is the correction for light travel time ("LT") plus the correction for observer motion ("S") SunPy calculates the apparent sub-observer Carrington longitude in a manner equivalent to specifying "LT" (as opposed to "LT+S"). The discrepancy between SunPy values and SPICE values is no greater than 0.01 arcseconds. Compared to JPL Horizons ------------------------ In `JPL Horizons `_, one can request the "Obs sub-long & sub-lat". JPL Horizons appears to start from the IAU parameters and to include the correction for light travel time but not the correction for observer motion (i.e., equivalent to specifying "LT" to `subpnt`_ in `SPICE`_). The discrepancy between SunPy values and JPL Horizons values is no greater than 0.01 arcseconds. Compared to SunSPICE -------------------- In `SunSPICE `_, one can convert to and from the "Carrington" coordinate system using the function `convert_sunspice_coord `_. However, these Carrington longitudes are "true" rather than "apparent" because the observer is not specified, so there are no corrections for light travel time or for observer motion. For example, for an Earth observer, SunPy values will be consistently greater than SunSPICE's coordinate transformation by ~0.82 degrees. Footnotes ========= .. [#apparent] The term "apparent" (as opposed to "true") is used to indicate that the observer perceives the locations and orientations of objects different from how they truly are due to effects that include light travel time. .. [#subEarth] "Sub-Earth" is a special case of "sub-observer", where the observer is at Earth (specifically, Earth center). That is, the sub-Earth point is the point on the Sun's surface "below" the center of the Earth along the Sun-Earth line. .. [#Carrington] Carrington (1863), *Observations of the Spots on the Sun*, p. 16 (``__) and p.27 (``__) .. [#IAU] Seidelmann et al. (2007), "Report of the IAU/IAG Working Group on cartographic coordinates and rotational elements: 2006", ``__ .. [#AA] Urban & Kaplan (2007), "Investigation of Change in the Computational Technique of the Sun’s Physical Ephemeris in The Astronomical Almanac", ``__ .. |AA| replace:: *The Astronomical Almanac* .. |B0| replace:: B\ :sub:`0` .. |L0| replace:: L\ :sub:`0` .. |W0| replace:: W\ :sub:`0` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/coordinates/index.rst0000644000175100001710000003346400000000000020607 0ustar00vstsdocker.. _sunpy-coordinates: Coordinates (`sunpy.coordinates`) ********************************* This sub-package contains: * A robust framework for working with solar-physics coordinate systems * Functions to obtain the locations of solar-system bodies (`sunpy.coordinates.ephemeris`) * Functions to calculate Sun-specific coordinate information (`sunpy.coordinates.sun`) The SunPy coordinate framework extends the :ref:`Astropy coordinates framework `. Supported Coordinate Systems ============================ .. list-table:: :widths: auto :header-rows: 1 * - Coordinate system - Abbreviation - SunPy/Astropy equivalent - Notes * - Heliocentric Aries Ecliptic (Mean) - HAE (also HEC) - Astropy's `~astropy.coordinates.HeliocentricMeanEcliptic` - * - Heliocentric Cartesian - HCC - `~sunpy.coordinates.frames.Heliocentric` - * - Heliocentric Earth Ecliptic - HEE - `~sunpy.coordinates.frames.HeliocentricEarthEcliptic` - * - Heliocentric Earth Equatorial - HEEQ (also HEQ) - `~sunpy.coordinates.frames.HeliographicStonyhurst` - Use a Cartesian representation * - Heliocentric Inertial - HCI - `~sunpy.coordinates.frames.HeliocentricInertial` - * - Heliocentric Radial - HCR - similar to `~sunpy.coordinates.frames.Heliocentric` - Use a cylindrical representation, *but* with a 90-degree offset in ``psi`` * - Heliocentric/Heliographic Radial-Tangential-Normal - HGRTN - similar to `~sunpy.coordinates.frames.Heliocentric` - The axes are permuted, with HCC X, Y, Z equivalent respectively to HGRTN Y, Z, X * - Heliographic Carrington - HGC - `~sunpy.coordinates.frames.HeliographicCarrington` - * - Heliographic Stonyhurst - HGS - `~sunpy.coordinates.frames.HeliographicStonyhurst` - * - Helioprojective Cartesian - HPC - `~sunpy.coordinates.frames.Helioprojective` - * - Geocentric Earth Equatorial (Mean) - GEI - `~sunpy.coordinates.frames.GeocentricEarthEquatorial` - * - Geographic - GEO - Astropy's `~astropy.coordinates.ITRS` - The precise geographic definitions may differ * - Geocentric Solar Ecliptic - GSE - `~sunpy.coordinates.frames.GeocentricSolarEcliptic` - For a description of these coordinate systems, see `Thompson (2006) `_ and `Franz & Harper (2002) `_ (and `corrected version `_). Getting Started =============== The easiest interface to work with coordinates is through the `~astropy.coordinates.SkyCoord` class:: >>> import astropy.units as u >>> from astropy.coordinates import SkyCoord >>> from sunpy.coordinates import frames >>> c = SkyCoord(-100*u.arcsec, 500*u.arcsec, frame=frames.Helioprojective) >>> c = SkyCoord(x=-72241.0*u.km, y=361206.1*u.km, z=589951.4*u.km, frame=frames.Heliocentric) >>> c = SkyCoord(70*u.deg, -30*u.deg, frame=frames.HeliographicStonyhurst) >>> c It is also possible to use strings to specify the frame but in that case make sure to explicitly import `sunpy.coordinates` as it registers SunPy's coordinate frames with the Astropy coordinates framework:: >>> import astropy.units as u >>> from astropy.coordinates import SkyCoord >>> import sunpy.coordinates >>> c = SkyCoord(-100*u.arcsec, 500*u.arcsec, frame='helioprojective', observer='earth') >>> c `~astropy.coordinates.SkyCoord` and all coordinate frames support array coordinates. These work the same as single-value coordinates, but they store multiple coordinates in a single object. When you're going to apply the same operation to many different coordinates, this is a better choice than a list of `~astropy.coordinates.SkyCoord` objects, because it will be *much* faster than applying the operation to each `~astropy.coordinates.SkyCoord` in a ``for`` loop:: >>> c = SkyCoord([-500, 400]*u.arcsec, [100, 200]*u.arcsec, frame=frames.Helioprojective) >>> c >>> c[0] Accessing Coordinates --------------------- Individual coordinates can be accessed via attributes on the SkyCoord object, but the names of the components of the coordinates can depend on the the frame and the chosen representation (e.g., Cartesian versus spherical). `~sunpy.coordinates.Helioprojective` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ For the helioprojective frame, the theta_x and theta_y components are accessed as ``Tx`` and ``Ty``, respectively:: >>> c = SkyCoord(-500*u.arcsec, 100*u.arcsec, frame=frames.Helioprojective) >>> c.Tx >>> c.Ty `~sunpy.coordinates.Heliocentric` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Heliocentric is typically used with Cartesian components:: >>> c = SkyCoord(-72241.0*u.km, 361206.1*u.km, 589951.4*u.km, frame=frames.Heliocentric) >>> c.x >>> c.y >>> c.z `~sunpy.coordinates.HeliographicStonyhurst` and `~sunpy.coordinates.HeliographicCarrington` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Both of the heliographic frames have the components of latitude, longitude and radius:: >>> c = SkyCoord(70*u.deg, -30*u.deg, 1*u.AU, frame=frames.HeliographicStonyhurst) >>> c.lat >>> c.lon >>> c.radius Heliographic Stonyhurst, when used with Cartesian components, is known as Heliocentric Earth Equatorial (HEEQ). Here's an example of how to use `~sunpy.coordinates.frames.HeliographicStonyhurst` for HEEQ coordinates:: >>> c = SkyCoord(-72241.0*u.km, 361206.1*u.km, 589951.4*u.km, ... representation_type='cartesian', frame=frames.HeliographicStonyhurst) >>> c.x >>> c.y >>> c.z Transforming Between Coordinate Frames ====================================== Both `~astropy.coordinates.SkyCoord` and `~astropy.coordinates.BaseCoordinateFrame` instances have a `~astropy.coordinates.SkyCoord.transform_to` method. This can be used to transform the frame to any other frame, either implemented in SunPy or in Astropy (see also :ref:`astropy-coordinates-transforming`). An example of transforming the center of the solar disk to Carrington coordinates is:: >>> c = SkyCoord(0*u.arcsec, 0*u.arcsec, frame=frames.Helioprojective, obstime="2017-07-26", ... observer="earth") >>> c ): (Tx, Ty) in arcsec (0., 0.)> >>> c.transform_to(frames.HeliographicCarrington) ): (lon, lat, radius) in (deg, deg, AU) (283.95956776, 5.31701821, 0.00465047)> It is also possible to transform to any coordinate system implemented in Astropy. This can be used to find the position of the solar limb in AltAz equatorial coordinates:: >>> from astropy.coordinates import EarthLocation, AltAz >>> time = '2017-07-11 15:00' >>> greenbelt = EarthLocation(lat=39.0044*u.deg, lon=-76.8758*u.deg) >>> greenbelt_frame = AltAz(obstime=time, location=greenbelt) >>> west_limb = SkyCoord(900*u.arcsec, 0*u.arcsec, frame=frames.Helioprojective, ... observer=greenbelt.get_itrs(greenbelt_frame.obstime), obstime=time) # doctest: +REMOTE_DATA >>> west_limb.transform_to(greenbelt_frame) # doctest: +REMOTE_DATA Observer Location Information ============================= The `~sunpy.coordinates.frames.Helioprojective`, `~sunpy.coordinates.frames.Heliocentric` and `~sunpy.coordinates.frames.HeliographicCarrington` frames are defined by the location of the observer. For example in `~sunpy.coordinates.frames.Helioprojective` the observer is at the origin of the coordinate system. This information is encoded in such observer-based frames as the ``observer`` attribute, which is itself an instance of the `~sunpy.coordinates.frames.HeliographicStonyhurst` frame. The ``observer`` can be a string for a solar-system body (e.g., "earth" or "mars"), and `~sunpy.coordinates.ephemeris.get_body_heliographic_stonyhurst` will be used with the specified ``obstime`` to fully specify the observer location. If the observer location is not fully specified, or not present at all, most transformations cannot be performed. The location of the observer is automatically populated from meta data when coordinate frames are created using map. In the case of `~sunpy.coordinates.frames.HeliographicCarrington`, one can specify ``observer='self'`` to indicate that the coordinate itself should be used as the observer for defining the coordinate frame. It is possible to convert from a `~sunpy.coordinates.frames.Helioprojective` frame with one observer location to another `~sunpy.coordinates.frames.Helioprojective` frame with a different observer location, by converting through `~sunpy.coordinates.frames.HeliographicStonyhurst`, this does involve making an assumption of the radius of the Sun to calculate the position on the solar sphere. The conversion can be performed as follows:: # Input coordinate >>> hpc1 = SkyCoord(0*u.arcsec, 0*u.arcsec, observer="earth", obstime="2017-07-26", frame=frames.Helioprojective) Define a new Helioprojective frame with a different observer. >>> import sunpy.coordinates >>> hpc_out = sunpy.coordinates.Helioprojective(observer="venus", obstime="2017-07-26") Perform the transformation from one to the other. >>> hpc2 = hpc1.transform_to(hpc_out) An example with two maps, named ``aia`` and ``stereo``:: >>> hpc1 = SkyCoord(0*u.arcsec, 0*u.arcsec, frame=aia.coordinate_frame) # doctest: +SKIP >>> hpc2 = hpc1.transform_to(stereo.coordinate_frame) # doctest: +SKIP Design of the Coordinates Sub-Package ===================================== This sub-package works by defining a collection of ``Frames`` (`sunpy.coordinates.frames`), which exists on a transformation graph, where the transformations between the coordinate frames are then defined and registered with the transformation graph (`sunpy.coordinates.transformations`). It is also possible to transform SunPy frames to Astropy frames. Positions within these ``Frames`` are stored as a ``Representation`` of a coordinate, a representation being a description of a point in a Cartesian, spherical or cylindrical system (see :ref:`astropy-coordinates-representations`). A frame that contains a representation of one or many points is said to have been 'realized'. For a more in depth look at the design and concepts of the Astropy coordinates system see :ref:`astropy-coordinates-overview` Frames and SkyCoord ------------------- The `~astropy.coordinates.SkyCoord` class is a high level wrapper around the `astropy.coordinates` sub-package. It provides an easier way to create and transform coordinates, by using string representations for frames rather than the classes themselves and some other usability improvements, for more information see the `~astropy.coordinates.SkyCoord` documentation. The main advantage provided by `~astropy.coordinates.SkyCoord` is the support it provides for caching Frame attributes. Frame attributes are extra data specified with a frame, some examples in `sunpy.coordinates` are ``obstime`` or ``observer`` for observer location. Only the frames where this data is meaningful have these attributes, i.e. only the Helioprojective frames have ``observer``. However, when you transform into another frame and then back to a projective frame using `~astropy.coordinates.SkyCoord` it will remember the attributes previously provided, and repopulate the final frame with them. If you were to do transformations using the Frames alone this would not happen. The most important implication for this in `sunpy.coordinates` is the ``rsun`` parameter in the projective frames. If you create a projective frame with a ``rsun`` attribute, if you convert back to a projective frame it will be set correctly. It should also be noted that, if you create a Heliographic frame and then transform to a projective frame with an ``rsun`` attribute, it will not match the ``radius`` coordinate in the Heliographic frame. This is because you may mean to be describing a point above the defined 'surface' of the Sun. More Detailed Information ========================= .. toctree:: :maxdepth: 1 carrington rotatedsunframe velocities wcs other_api Reference/API ============= .. automodapi:: sunpy.coordinates .. automodapi:: sunpy.coordinates.ephemeris .. automodapi:: sunpy.coordinates.sun .. automodapi:: sunpy.coordinates.utils :no-inheritance-diagram: Attribution =========== Some of this documentation was adapted from Astropy under the terms of the `BSD License `_. This sub-package was initially developed by Pritish Chakraborty as part of GSOC 2014 and Stuart Mumford. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/coordinates/other_api.rst0000644000175100001710000000067700000000000021452 0ustar00vstsdocker.. _sunpy-coordinates-other-api: Reference/API for supporting coordinates modules ************************************************ The parts of the following modules that are useful to a typical user are already imported into the `sunpy.coordinates` namespace. .. automodapi:: sunpy.coordinates.frames .. automodapi:: sunpy.coordinates.metaframes .. automodapi:: sunpy.coordinates.transformations .. automodapi:: sunpy.coordinates.wcs_utils ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/coordinates/rotatedsunframe.rst0000644000175100001710000004640600000000000022703 0ustar00vstsdocker.. _sunpy-coordinates-rotatedsunframe: Differential rotation using coordinate frames ********************************************* .. >>> # Due to small differences depending on different processors in numpy 1.22, >>> # reduce precision at which results are printed. See https://github.com/matplotlib/matplotlib/pull/21634#issuecomment-1004200517 >>> # for the likely reason this is needed. >>> import numpy as np >>> np.set_printoptions(precision=6) Normally, coordinates refer to a point in inertial space (relative to the barycenter of the solar system). Transforming to a different observation time does not move the point itself, but if the coordinate frame origin and/or axis change with time, the coordinate representation is updated to account for this change. In solar physics an example of a frame that changes with time is the `~sunpy.coordinates.frames.HeliographicStonyhurst` (HGS) frame. Its origin moves with the center of the Sun, and its orientation rotates such that the longitude component of Earth is zero at any given time. A coordinate in a HGS frame of reference transformed to a HGS frame defined a day later will have a different longitude:: >>> from astropy.coordinates import SkyCoord >>> import astropy.units as u >>> from sunpy.coordinates import HeliographicStonyhurst >>> hgs_coord = SkyCoord(0*u.deg, 0*u.deg, radius=1*u.au, frame='heliographic_stonyhurst', obstime="2001-01-01") >>> new_frame = HeliographicStonyhurst(obstime="2001-01-02") >>> new_hgs_coord = hgs_coord.transform_to(new_frame) >>> hgs_coord.lon, new_hgs_coord.lon (, ) but when transformed to an inertial frame of reference we can see that these two coordinates refer to the same point in space:: >>> hgs_coord.transform_to('icrs') >>> new_hgs_coord.transform_to('icrs') To evolve a coordinate in time such that it accounts for the rotational motion of the Sun, one can use the `~sunpy.coordinates.metaframes.RotatedSunFrame` "metaframe" class as described below. This machinery will take into account the latitude-dependent rotation rate of the solar surface, also known as differential rotation. Multiple models for differential rotation are supported (see :func:`~sunpy.physics.differential_rotation.diff_rot` for details). .. note:: `~sunpy.coordinates.metaframes.RotatedSunFrame` is a powerful metaframe, but can be tricky to use correctly. We recommend users to first check if the simpler :func:`~sunpy.coordinates.propagate_with_solar_surface` context manager is sufficient for their needs. In addition, one may want to account for the translational motion of the Sun as well, and that can be achieved by also using the context manager :func:`~sunpy.coordinates.transform_with_sun_center` for desired coordinate transformations. Basics of the RotatedSunFrame class =================================== The `~sunpy.coordinates.metaframes.RotatedSunFrame` class allows one to specify coordinates in a coordinate frame prior to an amount of solar (differential) rotation being applied. That is, the coordinate will point to a location in inertial space at some time, but will use a coordinate system at a *different* time to refer to that point, while accounting for the differential rotation between those two times. `~sunpy.coordinates.metaframes.RotatedSunFrame` is not itself a coordinate frame, but is instead a "metaframe". A new frame class is created on the fly corresponding to each base coordinate frame class. This tutorial will refer to these new classes as ``RotatedSun*`` frames. Creating coordinates -------------------- `~sunpy.coordinates.metaframes.RotatedSunFrame` requires two inputs: the base coordinate frame and the duration of solar rotation. The base coordinate frame needs to be fully specified, which means a defined ``obstime`` and, if relevant, a defined ``observer``. Note that the ``RotatedSun*`` frame that is created in this example is appropriately named ``RotatedSunHeliographicStonyhurst``:: >>> from astropy.coordinates import SkyCoord >>> import astropy.units as u >>> from sunpy.coordinates import RotatedSunFrame >>> import sunpy.coordinates.frames as f >>> base_frame = f.HeliographicStonyhurst(obstime="2001-01-01") >>> rs_hgs = RotatedSunFrame(base=base_frame, duration=1*u.day) >>> rs_hgs , duration=1.0 d, rotation_model=howard)> Once a ``RotatedSun*`` frame is created, it can be used in the same manner as other frames. Here, we create a `~astropy.coordinates.SkyCoord` using the ``RotatedSun*`` frame:: >>> rotated_coord = SkyCoord(0*u.deg, 0*u.deg, frame=rs_hgs) >>> rotated_coord , duration=1.0 d, rotation_model=howard): (lon, lat) in deg (0., 0.)> Transforming this into the original heliographic Stonyhurst frame, we can see that the longitude is equal to the original zero degrees, plus an extra offset to account for one day of differential rotation:: >>> rotated_coord.transform_to(base_frame).lon Instead of explicitly specifying the duration of solar rotation, one can use the keyword argument ``rotated_time``. The duration will be automatically calculated from the difference between ``rotated_time`` and the ``obstime`` value of the base coordinate frame. Here, we also include coordinate data in the supplied base coordinate frame:: >>> rs_hgc = RotatedSunFrame(base=f.HeliographicCarrington(10*u.deg, 20*u.deg, observer="earth", ... obstime="2020-03-04 00:00"), ... rotated_time="2020-03-06 12:00") >>> rs_hgc )>, duration=2.5 d, rotation_model=howard): (lon, lat) in deg (10., 20.)> A ``RotatedSun*`` frame containing coordinate data can be supplied to ``SkyCoord`` as normal:: >>> SkyCoord(rs_hgc) )>, duration=2.5 d, rotation_model=howard): (lon, lat) in deg (10., 20.)> The above examples used the default differential-rotation model, but any of the models available through :func:`sunpy.physics.differential_rotation.diff_rot` are selectable. For example, instead of the default ("howard"), one can specify "allen" using the keyword argument ``rotation_model``. Note the slight difference in the "real" longitude compared to the output above:: >>> allen = RotatedSunFrame(base=f.HeliographicCarrington(10*u.deg, 20*u.deg, observer="earth", ... obstime="2020-03-04 00:00"), ... rotated_time="2020-03-06 12:00", rotation_model="allen") >>> allen.transform_to(allen.base) ): (lon, lat, radius) in (deg, deg, km) (45.22266666, 20., 695700.)> Transforming coordinate arrays ------------------------------ For another transformation example, we define a meridan with a Carrington longitude of 100 degrees, plus 1 day of differential rotation. Again, the coordinates are already differentially rotated in inertial space; the ``RotatedSun*`` frame allows one to represent the coordinates in a frame *prior* to the differential rotation:: >>> meridian = RotatedSunFrame([100]*11*u.deg, range(-75, 90, 15)*u.deg, ... base=f.HeliographicCarrington(observer="earth", obstime="2001-01-01"), ... duration=1*u.day) >>> meridian )>, duration=1.0 d, rotation_model=howard): (lon, lat) in deg [(100., -75.), (100., -60.), (100., -45.), (100., -30.), (100., -15.), (100., 0.), (100., 15.), (100., 30.), (100., 45.), (100., 60.), (100., 75.)]> An easy way to "see" the differential rotation is to transform the coordinates to the base coordinate frame. Note that the points closer to the equator (latitude of 0 degrees) have evolved farther in longitude than the points at high latitudes:: >>> meridian.transform_to(meridian.base) ): (lon, lat, radius) in (deg, deg, km) [(110.755047, -75., 695700.), (111.706972, -60., 695700.), (112.809044, -45., 695700.), (113.682163, -30., 695700.), (114.17618 , -15., 695700.), (114.326328, 0., 695700.), (114.17618 , 15., 695700.), (113.682163, 30., 695700.), (112.809044, 45., 695700.), (111.706972, 60., 695700.), (110.755047, 75., 695700.)]> .. testsetup:: # The next test is run with fixed-precision printing to ensure no whitespace appears when tested >>> import numpy as np >>> old_floatmode = np.get_printoptions()['floatmode'] >>> np.set_printoptions(floatmode='fixed') In the specific case of `~sunpy.coordinates.frames.HeliographicCarrington`, this frame rotates with the Sun, but in a non-differential manner. The Carrington longitude approximately follows the rotation of the Sun. One can transform to the coordinate frame of 1 day in the future to see the difference between Carrington rotation and differential rotation. Note that equator rotates slightly faster than the Carrington rotation rate (its longitude is now greater than 100 degrees), but most latitudes rotate slower than the Carrington rotation rate:: >>> meridian.transform_to(f.HeliographicCarrington(observer="earth", obstime="2001-01-02")) ): (lon, lat, radius) in (deg, deg, km) [( 96.71777552, -75.1035280, 695509.61226612), ( 97.60193088, -60.0954217, 695194.47689542), ( 98.68350999, -45.0808511, 694918.44538999), ( 99.54760854, -30.0611014, 694697.75301952), (100.03737064, -15.0375281, 694544.31380180), (100.18622957, -0.01157236, 694467.21969767), (100.03737064, 15.0151761, 694471.58239044), ( 99.54760854, 30.0410725, 694557.27090716), ( 98.68350999, 45.0645144, 694719.82847332), ( 97.60193088, 60.0838908, 694951.31065278), ( 96.71777552, 75.0975847, 695238.51302901)]> .. testcleanup:: >>> np.set_printoptions(floatmode=old_floatmode) Be aware that transformations with a change in ``obstime`` will also contend with a translation of the center of the Sun. Note that the ``radius`` component above is no longer precisely on the surface of the Sun. For precise transformations of solar features, one should also use the context manager :func:`~sunpy.coordinates.transformations.transform_with_sun_center` to account for the translational motion of the Sun. Using the context manager, the ``radius`` component stays as the solar radius as desired:: >>> from sunpy.coordinates import transform_with_sun_center >>> with transform_with_sun_center(): ... print(meridian.transform_to(f.HeliographicCarrington(observer="earth", obstime="2001-01-02"))) ): (lon, lat, radius) in (deg, deg, km) [( 96.570646, -75., 695700.), ( 97.52257 , -60., 695700.), ( 98.624643, -45., 695700.), ( 99.497762, -30., 695700.), ( 99.991779, -15., 695700.), (100.141927, 0., 695700.), ( 99.991779, 15., 695700.), ( 99.497762, 30., 695700.), ( 98.624643, 45., 695700.), ( 97.52257 , 60., 695700.), ( 96.570646, 75., 695700.)]> Transforming multiple durations of rotation ------------------------------------------- Another common use case for differential rotation is to track a solar feature over a sequence of time steps. Let's track an active region that starts at `~sunpy.coordinates.frames.Helioprojective` coordinates (-123 arcsec, 456 arcsec), as seen from Earth, and we will look both backwards and forwards in time. When ``duration`` is an array, the base coordinate will be automatically upgraded to an array if it is a scalar. We specify a range of durations from -5 days to +5 days, stepping at 1-day increments:: >>> durations = range(-5, 6, 1)*u.day >>> ar_start = f.Helioprojective(-123*u.arcsec, 456*u.arcsec, ... obstime="2001-01-01", observer="earth") >>> ar = RotatedSunFrame(base=ar_start, duration=durations) >>> ar )>, duration=[-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.] d, rotation_model=howard): (Tx, Ty) in arcsec [(-123., 456.), (-123., 456.), (-123., 456.), (-123., 456.), (-123., 456.), (-123., 456.), (-123., 456.), (-123., 456.), (-123., 456.), (-123., 456.), (-123., 456.)]> Let's convert to the base coordinate frame to reveal the motion of the active region over time:: >>> ar.transform_to(ar.base) ): (Tx, Ty, distance) in (arcsec, arcsec, AU) [(-865.549563, 418.102848, 0.982512), (-794.67361 , 429.259359, 0.981549), (-676.999492, 439.158483, 0.980695), (-519.354795, 447.212391, 0.980001), (-330.98304 , 452.940564, 0.979507), (-123. , 456. , 0.979244), ( 92.27676 , 456.207078, 0.979226), ( 302.081349, 453.54936 , 0.979455), ( 493.984308, 448.186389, 0.979917), ( 656.653862, 440.439434, 0.980585), ( 780.541211, 430.770974, 0.981419)]> Be aware that these coordinates are represented in the `~sunpy.coordinates.frames.Helioprojective` coordinates as seen from Earth at the base time. Since the Earth moves in its orbit around the Sun, one may be more interested in representing these coordinates as they would been seen by an Earth observer at each time step. Since the destination frame of the transformation will now have arrays for ``obstime`` and ``observer``, one actually has to construct the initial coordinate with an array for ``obstime`` (and ``observer``) due to a limitation in Astropy. Note that the active region moves slightly slower across the disk of the Sun because the Earth orbits in the same direction as the Sun rotates, thus reducing the apparent rotation of the Sun:: >>> ar_start_array = f.Helioprojective([-123]*len(durations)*u.arcsec, ... [456]*len(durations)*u.arcsec, ... obstime=["2001-01-01"]*len(durations), observer="earth") >>> ar_array = RotatedSunFrame(base=ar_start_array, duration=durations) >>> earth_hpc = f.Helioprojective(obstime=ar_array.rotated_time, observer="earth") >>> ar_array.transform_to(earth_hpc) ): (Tx, Ty, distance) in (arcsec, arcsec, AU) [(-853.35712 , 420.401517, 0.982294), (-771.20926 , 429.298481, 0.981392), (-650.31062 , 437.85932 , 0.980601), (-496.634378, 445.519914, 0.97996 ), (-317.863549, 451.731964, 0.9795 ), (-123. , 456. , 0.979244), ( 78.103714, 457.916782, 0.979203), ( 275.263157, 457.194475, 0.97938 ), ( 458.500759, 453.689226, 0.979764), ( 618.572111, 447.417202, 0.980336), ( 747.448484, 438.560811, 0.981067)]> Transforming into RotatedSun frames ----------------------------------- So far, all of the examples show transformations with the ``RotatedSun*`` frame as the starting frame. The ``RotatedSun*`` frame can also be the destination frame, which can be more intuitive in some situations and even necessary in some others (due to API limitations). Let's use a coordinate from earlier, which represents the coordinate in a "real" coordinate frame:: >>> coord = rs_hgc.transform_to(rs_hgc.base) >>> coord ): (lon, lat, radius) in (deg, deg, km) (45.13354448, 20., 695700.)> If we create a ``RotatedSun*`` frame for a different base time, we can represent that same point using coordinates prior to differential rotation:: >>> rs_frame = RotatedSunFrame(base=f.HeliographicCarrington(observer="earth", ... obstime=coord.obstime), ... rotated_time="2020-03-06 12:00") >>> rs_frame )>, duration=2.5 d, rotation_model=howard)> >>> new_coord = coord.transform_to(rs_frame) >>> new_coord )>, duration=2.5 d, rotation_model=howard): (lon, lat, radius) in (deg, deg, km) (10., 20., 695700.)> There coordinates are stored in the ``RotatedSun*`` frame, but it can be useful to "pop off" this extra layer and retain only the coordinate representation in the base coordinate frame. There is a convenience method called :meth:`~sunpy.coordinates.metaframes.RotatedSunFrame.as_base()` to do exactly that. Be aware the resulting coordinate does *not* point to the same location in inertial space, despite the superficial similarity. Essentially, the component values have been copied from one coordinate frame to a different coordinate frame, and thus this is not merely a transformation between coordinate frames:: >>> new_coord.as_base() ): (lon, lat, radius) in (deg, deg, km) (10., 20., 695700.)> Example uses of RotatedSunFrame =============================== Here are the examples in our gallery that use `~sunpy.coordinates.metaframes.RotatedSunFrame`: .. minigallery:: sunpy.coordinates.RotatedSunFrame .. >>> # Reset change to default print options >>> np.set_printoptions(precision=8) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/coordinates/velocities.rst0000644000175100001710000001512300000000000021636 0ustar00vstsdocker.. _sunpy-coordinates-velocities: Coordinates with velocity information ************************************* Velocity information can be added to any coordinate [#differentials]_. When the coordinate is transformed to a different coordinate frame, the velocity vector will be transformed as appropriate. Be aware that the transformation framework does not take any velocity information into account when transforming the position vector. Creating a SkyCoord with velocity ================================= Velocity information can be added as keyword arguments to `~astropy.coordinates.SkyCoord`. For SunPy's frames, the names of the velocities components are the names of the position components prepended by "d\_", e.g.,:: >>> from astropy.coordinates import SkyCoord >>> import astropy.units as u >>> import sunpy.coordinates >>> sc = SkyCoord(lon=10*u.deg, lat=20*u.deg, distance=1*u.AU, ... d_lon=3*u.arcmin/u.week, d_lat=4*u.arcmin/u.d, d_distance=5*u.km/u.min, ... frame='heliocentricinertial', obstime='2021-01-01') >>> sc See :ref:`astropy-coordinates-velocities` for ways to add velocity information to existing coordinates. Querying velocity information ============================= SunPy has functions to query the positions of planets or other objects (e.g., :func:`~sunpy.coordinates.ephemeris.get_body_heliographic_stonyhurst`). For any of these functions, if ``include_velocity=True`` is specified, the returned coordinate will include velocity information, e.g.,:: >>> from sunpy.coordinates import get_body_heliographic_stonyhurst >>> get_body_heliographic_stonyhurst('mercury', '2021-01-01', include_velocity=True) Transforming velocities ======================= The transformation of the velocity vector between two coordinate frames takes into account two effects: * The change in the direction of the velocity vector due to a change in the orientation of the axes between the two frames. * The "induced" velocity due to the time dependence of the frames themselves. Orientation change ------------------ To illustrate the orientation change, let's start with the `~astropy.coordinates.SkyCoord` created at the beginning, which was defined in the `~sunpy.coordinates.frames.HeliocentricInertial` frame. We transform to Astropy's `~astropy.coordinates.HCRS` frame, which is a different inertial [#inertial]_ frame that is also centered at the Sun:: >>> sc_hcrs = sc.transform_to('hcrs') >>> sc_hcrs Even though the velocity vectors are oriented very differently in their respective spherical coordinates, their amplitudes are essentially the same:: >>> sc.velocity.norm() >>> sc_hcrs.velocity.norm() Induced velocity ---------------- To illustrate "induced" velocity, consider the `~sunpy.coordinates.frames.HeliographicStonyhurst` frame, which is defined such that the Earth is always at zero degrees longitude. That is, this frame rotates around the Sun over time to "follow" the Earth. Accordingly, the longitude component of Earth's velocity vector will be negligible in this frame:: >>> from sunpy.coordinates import get_earth >>> earth = get_earth('2021-01-01', include_velocity=True) >>> earth Transforming this coordinate to the `~sunpy.coordinates.frames.HeliocentricInertial` frame, which does not rotate over time, confirms that the Earth is moving in inertial space at the expected ~1 degree/day in heliographic longitude:: >>> earth.heliocentricinertial >>> earth.heliocentricinertial.d_lon.to('deg/d') Transforming over time ====================== As the transformation framework is currently implemented, transforming between frames with different values of ``obstime`` takes into account any time dependency for the definitions of the frames, but does *not* incorporate any notion of the coordinate itself moving in inertial space. This behavior does not change even if there is velocity information attached to the coordinate. For example, if we take the same coordinate created earlier for Earth, and transform it to one day later:: >>> from sunpy.coordinates import HeliographicStonyhurst >>> earth.transform_to(HeliographicStonyhurst(obstime=earth.obstime + 1*u.day)) Note that the location of the Earth in the new frame is ~-1 degree in longitude, as opposed to zero degrees. That is, this coordinate represents the location of Earth on 2021 January 1 using axes that are defined using the location of Earth on 2021 January 2. Footnotes ========= .. [#differentials] Differentials of position with respect to units other than time are also possible, but are not currently well supported. .. [#inertial] While `~sunpy.coordinates.frames.HeliocentricInertial` and `~astropy.coordinates.HCRS` have fixed axes directions, strictly speaking the small motion of the origin (the Sun) will induce a translational velocity relative to `~astropy.coordinates.ICRS`, but that aspect will cancel out in the transformation. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/coordinates/wcs.rst0000644000175100001710000000324000000000000020261 0ustar00vstsdocker.. _sunpy-coordinates-wcs: Coordinates and WCS ******************* The `sunpy.coordinates` sub-package provides a mapping between FITS-WCS CTYPE convention and the coordinate frames as defined in `sunpy.coordinates`. This is used via the `astropy.wcs.utils.wcs_to_celestial_frame` function, with which the SunPy frames are registered upon being imported. This list is used by packages such as ``wcsaxes`` to convert from `astropy.wcs.WCS` objects to coordinate frames. The `sunpy.map.GenericMap` class creates `astropy.wcs.WCS` objects as ``amap.wcs``, however, it adds some extra attributes to the `~astropy.wcs.WCS` object to be able to fully specify the coordinate frame. It adds ``heliographic_observer`` and ``rsun``. If you want to obtain a un-realized coordinate frame corresponding to a `~sunpy.map.GenericMap` object you can do the following:: >>> import sunpy.map >>> from sunpy.data.sample import AIA_171_IMAGE # doctest: +REMOTE_DATA >>> amap = sunpy.map.Map(AIA_171_IMAGE) # doctest: +REMOTE_DATA >>> amap.observer_coordinate # doctest: +REMOTE_DATA which is equivalent to:: >>> from astropy.wcs.utils import wcs_to_celestial_frame # doctest: +REMOTE_DATA >>> wcs_to_celestial_frame(amap.wcs) # doctest: +REMOTE_DATA )> ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/data.rst0000644000175100001710000000063200000000000016066 0ustar00vstsdockerData (`sunpy.data`) ******************* ``sunpy.data`` contains ways to access sample data and small test files for running the sunpy test suite. .. automodapi:: sunpy.data :include-all-objects: .. automodapi:: sunpy.data.sample .. automodapi:: sunpy.data.test .. automodapi:: sunpy.data.data_manager .. automodapi:: sunpy.data.data_manager.downloader .. automodapi:: sunpy.data.data_manager.storage ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/database.rst0000644000175100001710000000113000000000000016713 0ustar00vstsdockerDatabase (`sunpy.database`) *************************** ``sunpy.database`` can be used to provide a local cache of the files and records retrieved from various remote services. For an introduction to the database see :ref:`database_guide`. .. automodapi:: sunpy.database :no-inheritance-diagram: Submodules ========== .. automodapi:: sunpy.database.tables :no-inheritance-diagram: .. automodapi:: sunpy.database.caching :no-inheritance-diagram: .. automodapi:: sunpy.database.commands :no-inheritance-diagram: .. automodapi:: sunpy.database.attrs :no-inheritance-diagram: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/image.rst0000644000175100001710000000060600000000000016240 0ustar00vstsdockerImage processing (`sunpy.image`) ******************************** ``sunpy.image`` contains routines to process images (i.e. `numpy` arrays). The routines in this submodule are generally exposed through map-specific functions in other places. .. automodapi:: sunpy.image .. automodapi:: sunpy.image.resample .. automodapi:: sunpy.image.transform .. automodapi:: sunpy.image.coalignment ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/index.rst0000644000175100001710000000035100000000000016262 0ustar00vstsdocker.. _reference: ************* API Reference ************* .. toctree:: :maxdepth: 2 coordinates/index data database image io map net physics sun sunpy time timeseries util visualization ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/io.rst0000644000175100001710000000773000000000000015572 0ustar00vstsdockerInput/output (`sunpy.io`) ************************* ``sunpy.io`` contains two types of routines, the first reads (data, header) pairs from files in a way similar to FITS files. The other is special readers for files that are commonly used in solar physics. .. warning:: When reading FITS files, it is strongly recommended that `astropy.io.fits` be used over the tools in `sunpy.io`. The sunpy FITS reader is designed to meet the needs of map, and does not represent the structure of the FITS file well. Unified File Readers ==================== .. automodapi:: sunpy.io .. automodapi:: sunpy.io.header .. _iofits: .. automodapi:: sunpy.io.fits .. _iojp2: .. automodapi:: sunpy.io.jp2 .. _ioana: .. automodapi:: sunpy.io.ana Special File Readers ==================== .. _iospecialgenx: .. automodapi:: sunpy.io.special.genx asdf (Advanced Scientific Data Format) -------------------------------------- `asdf `__ is a modern file format designed to meet the needs of the astronomy community. It has deep integration with Python, SunPy, and Astropy, as well as implementations in other languages. It can be used to store known Python objects in a portable, well defined file format. It is primarily useful for storing complex Astropy and SunPy objects in a way that can be loaded back into the same form as they were saved. sunpy currently implements support for saving `Map ` and `coordinate frame ` objects into asdf files. As asdf tightly integrates into Python, saving a map to an asdf file will save the metadata, data, mask and the shift. The mask and shift are not currently saved to FITS. The following code shows to to save and load a sunpy Map to an asdf file .. doctest-requires:: asdf >>> import asdf >>> import sunpy.map >>> from sunpy.data.sample import AIA_171_IMAGE # doctest: +REMOTE_DATA >>> aiamap = sunpy.map.Map(AIA_171_IMAGE) # doctest: +REMOTE_DATA >>> tree = {'amap': aiamap} # doctest: +REMOTE_DATA >>> with asdf.AsdfFile(tree) as asdf_file: # doctest: +REMOTE_DATA ... asdf_file.write_to("sunpy_map.asdf") # doctest: +REMOTE_DATA >>> input_asdf = asdf.open("sunpy_map.asdf") # doctest: +REMOTE_DATA >>> input_asdf['amap'] # doctest: +REMOTE_DATA 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: [511.5 511.5] pix Reference Coord: [3.22309951 1.38578135] arcsec array([[ -95.92475 , 7.076416 , -1.9656711, ..., -127.96519 , -127.96519 , -127.96519 ], [ -96.97533 , -5.1167884, 0. , ..., -98.924576 , -104.04137 , -127.919716 ], [ -93.99607 , 1.0189276, -4.0757103, ..., -5.094638 , -37.95505 , -127.87541 ], ..., [-128.01454 , -128.01454 , -128.01454 , ..., -128.01454 , -128.01454 , -128.01454 ], [-127.899666 , -127.899666 , -127.899666 , ..., -127.899666 , -127.899666 , -127.899666 ], [-128.03072 , -128.03072 , -128.03072 , ..., -128.03072 , -128.03072 , -128.03072 ]], dtype=float32) >>> input_asdf.close() # doctest: +REMOTE_DATA CDF (common data format) ------------------------ CDF files are commonly used to store timeseries data observed by instruments taking in-situ measurements of plasmas throughout the heliosphere. sunpy provides support for reading in CDF files that conform to the `Space Physics Guidelines for CDF `_. .. automodapi:: sunpy.io.cdf ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/known_issues.rst0000644000175100001710000000414700000000000017711 0ustar00vstsdocker************ Known Issues ************ This page documents commonly known issues, issues here is defined broadly and refers to oddities or specifics of how sunpy or the Python ecosystem works that could anyone catch out. Disagreement between `astropy.time.Time` and SSW for pre-1972 dates =================================================================== Conversions between time scales for pre-1972 dates may not agree between `astropy.time.Time` and SSW. Prior to 1972, the length of a Universal Time (UT) second was different from the length of an SI second, and `astropy.time.Time` correctly handles this difference. However, SSW does not (at least in the commonly used routines), and thus SSW conversions for pre-1972 dates between UT and International Atomic Time (TAI, based on SI seconds) can be incorrect by multiple seconds. The SSW routine ``utc2tai`` notes that its output is invalid for pre-1972 dates, but other SSW routines are missing such a disclaimer. `Reference issue `__. `~sunpy.net.jsoc.JSOCClient` time filtering =========================================== The JSOC API filters on ``T_OBS`` for some series, instead of ``T_REC`` which is what is used most of the time. There is not anything we can do to fix this on our side. `The specific section of the SDO users guide explaining this `__. `Reference issue `__. ``scikit-image`` versions used to rotate/transform maps ======================================================= sunpy requires a version of ``scikit-image < 0.19`` to be installed for rotating or transforming maps using ``scikit-image``. This is due to `changes in version 0.19 `__. that are backwards incompatible with earlier ``scikit-image`` versions. It is anticipated that the default package used to transform or rotate maps will be changed from ``scikit-image`` to ``scipy`` in sunpy 4.0. `Reference issue `__. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/map.rst0000644000175100001710000001060200000000000015730 0ustar00vstsdocker.. _map: Maps (`sunpy.map`) ****************** .. module:: sunpy.map .. testsetup:: import sunpy .. currentmodule:: sunpy.map Overview ======== One of core classes in sunpy is a Map. A sunpy Map object is simply a spatially-aware data array, often an image. In order to make it easy to work with image data in sunpy, the Map object provides a number of methods for commonly performed operations. 2D map objects are subclasses of `~sunpy.map.GenericMap` and these objects are created using the Map factory `~sunpy.map.Map`. A number of instrument are supported by subclassing this base object. See :ref:`map-sources` to see a list of all of them. More complex subclasses are also available. See :ref:`map-classes`. .. todo : 1. Map factory and registration 2. MapBase and Generic Map 3. MapMeta and the separation from the file io Creating Map Objects ==================== sunpy Map objects are constructed using the special factory class `~sunpy.map.Map`: :: >>> x = sunpy.map.Map('file.fits') # doctest: +SKIP The result of a call to `~sunpy.map.Map` will be either a `~sunpy.map.mapbase.GenericMap` object, or a subclass of `~sunpy.map.mapbase.GenericMap` which either deals with a specific type of data, e.g. `~sunpy.map.sources.sdo.AIAMap` or `~sunpy.map.sources.soho.LASCOMap` (see :ref:`map-classes` to see a list of all of them), or if no instrument matches, a 2D map `~sunpy.map.mapbase.GenericMap`. Fixing map metadata ------------------- If you need to fix the metadata of a fits file before it is handed to `Map`, this can be done as follows: >>> data, header = sunpy.io.fits.read(filepath)[0] # doctest: +SKIP >>> header['cunit1'] = 'arcsec' # doctest: +SKIP >>> header['cunit2'] = 'arcsec' # doctest: +SKIP >>> map = sunpy.map.Map(data, header) # doctest: +SKIP .. autoclass:: sunpy.map.map_factory.MapFactory .. _map-classes: sunpy.map Package ================= All sunpy Maps are derived from `sunpy.map.GenericMap`, all the methods and attributes are documented in that class. .. automodapi:: sunpy.map :no-main-docstr: :inherited-members: :include-all-objects: .. _map-sources: Instrument Map Classes ====================== Defined in ``sunpy.map.sources`` are a set of `~sunpy.map.GenericMap` subclasses which convert the specific metadata and other differences in each instruments data to the standard `~sunpy.map.GenericMap` interface. These 'sources' also define things like the colormap and default normalisation for each instrument. These subclasses also provide a method, which describes to the `~sunpy.map.Map` factory which data and metadata pairs match its instrument. .. automodapi:: sunpy.map.sources :no-main-docstr: :inherited-members: Writing a new Instrument Map Class ================================== Any subclass of `~sunpy.map.GenericMap` which defines a method named ``is_datasource_for`` will automatically be registered with the `~sunpy.map.Map` factory. The ``is_datasource_for`` method describes the form of the data and metadata for which the `~sunpy.map.GenericMap` subclass is valid. For example it might check the value of the ``INSTRUMENT`` key in the metadata dictionary. This makes it straightforward to define your own `~sunpy.map.GenericMap` subclass for a new instrument or a custom data source like simulated data. These classes only have to be imported for this to work, as demonstrated by the following example. .. code-block:: python import sunpy.map class FutureMap(sunpy.map.GenericMap): def __init__(self, data, header, **kwargs): super(FutureMap, self).__init__(data, header, **kwargs) # Any Future Instrument specific keyword manipulation # Specify a classmethod that determines if the data-header pair matches # the new instrument @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an AIA image""" return str(header.get('instrume', '')).startswith('FUTURESCOPE') This class will now be available through the `~sunpy.map.Map` factory as long as this class has been defined, i.e. imported into the current session. If you do not want to create a method named ``is_datasource_for`` you can manually register your class and matching method using the following method .. code-block:: python import sunpy.map sunpy.map.Map.register(FutureMap, FutureMap.some_matching_method) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/net.rst0000644000175100001710000000364100000000000015746 0ustar00vstsdockerRemote data (`sunpy.net`) ************************* ``sunpy.net`` contains a lot of different code for accessing various solar physics related web services. This submodule contains many layers. Most users should use `~sunpy.net.Fido`, which is an interface to multiple sources including all the sources implemented in `~sunpy.net.dataretriever` as well as `~sunpy.net.vso` and `~sunpy.net.jsoc`. `~sunpy.net.Fido` can be used like so:: >>> from sunpy.net import Fido, attrs as a >>> results = Fido.search(a.Time("2012/1/1", "2012/1/2"), a.Instrument.lyra) # doctest: +REMOTE_DATA >>> files = Fido.fetch(results) # doctest: +SKIP .. automodapi:: sunpy.net :include-all-objects: :headings: =- .. automodapi:: sunpy.net.attrs :headings: ^" .. automodapi:: sunpy.net.fido_factory :headings: ^" VSO --- .. automodapi:: sunpy.net.vso :headings: ^" .. automodapi:: sunpy.net.vso.attrs :headings: ^" Dataretriever ------------- .. automodapi:: sunpy.net.dataretriever :headings: ^" .. automodapi:: sunpy.net.dataretriever.attrs.goes :headings: ^" JSOC ---- .. automodapi:: sunpy.net.jsoc :headings: ^" .. automodapi:: sunpy.net.jsoc.attrs :headings: ^" HEK --- .. automodapi:: sunpy.net.hek :headings: ^" .. automodapi:: sunpy.net.hek.attrs :headings: ^" .. automodapi:: sunpy.net.hek2vso :headings: ^" CDAWeb ------ .. automodapi:: sunpy.net.cdaweb :headings: ^" HELIO ----- .. automodapi:: sunpy.net.helio :headings: ^" .. automodapi:: sunpy.net.helio.attrs :headings: ^" Helioviewer ----------- .. automodapi:: sunpy.net.helioviewer :headings: ^" Internal Classes and Functions ============================== These classes and functions are designed to be used to help develop new clients for `sunpy.net.Fido`. .. automodapi:: sunpy.net.base_client .. automodapi:: sunpy.net.dataretriever.client .. automodapi:: sunpy.net.attr .. automodapi:: sunpy.net.scraper ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/physics.rst0000644000175100001710000000043400000000000016637 0ustar00vstsdockerPhysics (`sunpy.physics`) ************************* ``sunpy.physics`` contains routines to calculate various physical parameters and models for the Sun. .. automodapi:: sunpy.physics .. automodapi:: sunpy.physics.differential_rotation .. automodapi:: sunpy.physics.solar_rotation ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/stability.rst0000644000175100001710000000627300000000000017170 0ustar00vstsdockerCurrent status of sub-packages ****************************** sunpy has variations of stability across different sub-packages. This document summarizes the current status of the sunpy sub-packages, so that users understand where they might expect changes in future, and which sub-packages they can safely use for production code. For help or to discuss specific sub-packages, refer to the `maintainer list `__ to find who to contact. The classification is as follows: {% raw %} .. raw:: html {% endraw %}
Planned
Actively developed, be prepared for possible significant changes.
Reasonably stable, any significant changes/additions will generally include backwards-compatiblity.
Mature. Additions/improvements possible, but no major changes planned.
Pending deprecation. Might be deprecated in a future version.
Deprecated. Might be removed in a future version.
The current planned and existing sub-packages are: {% raw %} .. raw:: html {% endraw %} {% for module, prop in sunpy_modules.items() %} {% endfor %}
Sub-Package   Comments
sunpy.{{ module }} {{ prop['comments'] }}
Taken with love from the `Astropy project. `_ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/sun.rst0000644000175100001710000000042300000000000015760 0ustar00vstsdocker.. _sun_code_ref: Solar properties (``sunpy.sun``) ******************************** ``sunpy.sun`` contains constants, parameters and models of the Sun. .. automodapi:: sunpy.sun.constants :include-all-objects: .. automodapi:: sunpy.sun.models :include-all-objects: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/sunpy.rst0000644000175100001710000000004300000000000016327 0ustar00vstsdockersunpy ***** .. automodapi:: sunpy ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/sunpy_stability.yaml0000644000175100001710000000252500000000000020554 0ustar00vstsdockercoordinates: status: stable comments: Any future changes should largely maintain backwards compatibility. data: status: mature comments: Should see no major changes. database: status: dev comments: While it has not changed recently, it could be subject to major revisions in future. image: status: dev comments: While it has not changed recently, it could be subject to major revisions in future. io: status: mature comments: Should see no major changes. map: status: stable comments: Any future changes should largely maintain backwards compatibility. net: status: stable comments: Any future changes should largely maintain backwards compatibility. physics: status: dev comments: While it has not changed recently, it could be subject to major revisions in future. sun: status: dev comments: Sub-module `constants` is stable. Sub-module `models` will likely have major changes. time: status: stable comments: Any future changes should largely maintain backwards compatibility. timeseries: status: stable comments: Any future changes should largely maintain backwards compatibility. util: status: dev comments: This sub-module is not user facing, but any changes will still undergo a deprecation period. visualization: status: stable comments: Any future changes should largely maintain backwards compatibility. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/time.rst0000644000175100001710000000052400000000000016113 0ustar00vstsdockerTime (`sunpy.time`) ******************* ``sunpy.time`` contains helpers for converting strings to `astropy.time.Time` objects and handling common operations on these objects. As well as this a `~sunpy.time.TimeRange` object is provided for representing a period of time and performing operations on that range. .. automodapi:: sunpy.time ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/timeseries.rst0000644000175100001710000000374600000000000017337 0ustar00vstsdocker.. _timeseries_code_ref: Timeseries (`sunpy.timeseries`) ******************************* One of the core classes in sunpy is a timeseries. A number of instruments are supported through subclasses of the base `~sunpy.timeseries.GenericTimeSeries` class. See :ref:`ts-sources` for a list of them. A timeseries can be created by calling `~sunpy.timeseries.TimeSeries`. .. _ts-sources: Instrument TimeSeries Classes ============================= The generic method to create an instrument-specific TimeSeries is to call `~sunpy.timeseries.TimeSeries` with a file path and the instrument-specific source keyword argument. In some cases the source can be determined automatically if a FITS file is being loaded. The following example shows the factory loading a sample file:: >>> import sunpy.timeseries as ts >>> import sunpy.data.sample # doctest: +REMOTE_DATA >>> goes = ts.TimeSeries(sunpy.data.sample.GOES_XRS_TIMESERIES, source='XRS') # doctest: +REMOTE_DATA The `~sunpy.timeseries.TimeSeries` factory will load the file and create the timeseries instance. The following instrument classes are supported: .. automodapi:: sunpy.timeseries :no-inheritance-diagram: :include-all-objects: .. automodapi:: sunpy.timeseries.sources CDF files ========= `~sunpy.timeseries.GenericTimeSeries` can load a single CDF file, or a list of CDF files if ``concatenate=True`` is passed. Units ----- The physical units of different columns in CDF files do not conform to a standard that `astropy.units` understands. sunpy internally stores a set of common mappings from unit strings to `~astropy.units.Unit`, but you may see a warning about unrecognised unit strings when reading a CDF file. To register the correct unit definition :func:`astropy.units.add_enabled_units` can be used. For example, to register 'deg K' as representing Kelvin and '#/cc' as 1/cm^3:: >>> import astropy.units as u >>> _ = u.add_enabled_units([u.def_unit('deg K', represents=u.K), u.def_unit('#/cc', represents=u.cm**-3)]) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/util.rst0000644000175100001710000000061300000000000016131 0ustar00vstsdockerUtilities (`sunpy.util`) ************************ .. automodapi:: sunpy.util .. automodapi:: sunpy.util.config .. automodapi:: sunpy.util.datatype_factory_base .. automodapi:: sunpy.util.net .. automodapi:: sunpy.util.xml .. automodapi:: sunpy.util.sphinx .. automodapi:: sunpy.util.sphinx.generate :headings: ^" .. automodapi:: sunpy.util.functools .. automodapi:: sunpy.util.types ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/code_ref/visualization.rst0000644000175100001710000000057600000000000020065 0ustar00vstsdockerVisualization (`sunpy.visualization`) ************************************* `sunpy.visualization` contains plotting helpers and functions. .. automodapi:: sunpy.visualization .. automodapi:: sunpy.visualization.colormaps .. automodapi:: sunpy.visualization.colormaps.color_tables .. automodapi:: sunpy.visualization.animator .. automodapi:: sunpy.visualization.wcsaxes_compat ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/conf.py0000644000175100001710000002431400000000000014157 0ustar00vstsdocker""" Configuration file for the Sphinx documentation builder. """ # -- stdlib imports ------------------------------------------------------------ import os import sys import datetime import warnings from pkg_resources import get_distribution from packaging.version import Version # -- Check for dependencies ---------------------------------------------------- doc_requires = get_distribution("sunpy").requires(extras=("docs",)) missing_requirements = [] for requirement in doc_requires: try: get_distribution(requirement) except Exception as e: missing_requirements.append(requirement.name) if missing_requirements: print( f"The {' '.join(missing_requirements)} package(s) could not be found and " "is needed to build the documentation, please install the 'docs' requirements." ) sys.exit(1) # -- Read the Docs Specific Configuration -------------------------------------- # This needs to be done before sunpy is imported on_rtd = os.environ.get('READTHEDOCS', None) == 'True' if on_rtd: os.environ['SUNPY_CONFIGDIR'] = '/home/docs/' os.environ['HOME'] = '/home/docs/' os.environ['LANG'] = 'C' os.environ['LC_ALL'] = 'C' os.environ['HIDE_PARFIVE_PROGESS'] = 'True' # -- Non stdlib imports -------------------------------------------------------- import ruamel.yaml as yaml # NOQA from sphinx_gallery.sorting import ExplicitOrder # NOQA from sphinx_gallery.sorting import ExampleTitleSortKey # NOQA import sunpy # NOQA from sunpy import __version__ # NOQA from sunpy.util.exceptions import SunpyDeprecationWarning, SunpyPendingDeprecationWarning # NOQA from matplotlib import MatplotlibDeprecationWarning # NOQA from astropy.utils.exceptions import AstropyDeprecationWarning # NOQA # -- Project information ------------------------------------------------------- project = 'SunPy' author = 'The SunPy Community' copyright = '{}, {}'.format(datetime.datetime.now().year, author) # Register remote data option with doctest import doctest # NOQA REMOTE_DATA = doctest.register_optionflag('REMOTE_DATA') # The full version, including alpha/beta/rc tags release = __version__ sunpy_version = Version(__version__) is_release = not(sunpy_version.is_prerelease or sunpy_version.is_devrelease) # We want to ignore all warnings in a release version. if is_release: warnings.simplefilter("ignore") warnings.filterwarnings("error", category=SunpyDeprecationWarning) warnings.filterwarnings("error", category=SunpyPendingDeprecationWarning) warnings.filterwarnings("error", category=MatplotlibDeprecationWarning) warnings.filterwarnings("error", category=AstropyDeprecationWarning) # -- SunPy Sample Data and Config ---------------------------------------------- # We set the logger to debug so that we can see any sample data download errors # in the CI, especially RTD. ori_level = sunpy.log.level sunpy.log.setLevel("DEBUG") import sunpy.data.sample # NOQA sunpy.log.setLevel(ori_level) # For the linkcheck linkcheck_ignore = [r"https://doi.org/\d+", r"https://element.io/\d+", r"https://github.com/\d+", r"https://docs.sunpy.org/\d+"] linkcheck_anchors = False # -- General configuration ----------------------------------------------------- # sphinxext-opengraph ogp_image = "https://raw.githubusercontent.com/sunpy/sunpy-logo/master/generated/sunpy_logo_word.png" ogp_use_first_image = True ogp_description_length = 160 ogp_custom_meta_tags = [ '', ] # Suppress warnings about overriding directives as we overload some of the # doctest extensions. suppress_warnings = ['app.add_directive', ] # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'matplotlib.sphinxext.plot_directive', 'sphinx_automodapi.automodapi', 'sphinx_automodapi.smart_resolver', 'sphinx_changelog', 'sphinx_gallery.gen_gallery', 'sphinx.ext.autodoc', 'sphinx.ext.coverage', 'sphinx.ext.doctest', 'sphinx.ext.inheritance_diagram', 'sphinx.ext.intersphinx', 'sphinx.ext.mathjax', 'sphinx.ext.napoleon', 'sphinx.ext.todo', 'sphinx.ext.viewcode', 'sunpy.util.sphinx.doctest', 'sunpy.util.sphinx.generate', "sphinxext.opengraph", 'sphinx_panels', ] # Add any paths that contain templates here, relative to this directory. # templates_path = ['_templates'] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. html_extra_path = ['robots.txt'] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] if is_release: exclude_patterns.append('dev_guide/contents/*') # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: source_suffix = '.rst' # 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' # Disable having a separate return type row napoleon_use_rtype = False # Disable google style docstrings napoleon_google_docstring = False # Enable nitpicky mode, which forces links to be non-broken nitpicky = True # This is not used. See docs/nitpick-exceptions file for the actual listing. nitpick_ignore = [] for line in open('nitpick-exceptions'): if line.strip() == "" or line.startswith("#"): continue dtype, target = line.split(None, 1) target = target.strip() nitpick_ignore.append((dtype, target)) # -- Options for intersphinx extension ----------------------------------------- # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { "python": ( "https://docs.python.org/3/", (None, "http://www.astropy.org/astropy-data/intersphinx/python3.inv"), ), "numpy": ( "https://numpy.org/doc/stable/", (None, "http://www.astropy.org/astropy-data/intersphinx/numpy.inv"), ), "scipy": ( "https://docs.scipy.org/doc/scipy/reference/", (None, "http://www.astropy.org/astropy-data/intersphinx/scipy.inv"), ), "matplotlib": ("https://matplotlib.org/stable", None), "aiapy": ("https://aiapy.readthedocs.io/en/stable/", None), "astropy": ("https://docs.astropy.org/en/stable/", None), "astroquery": ("https://astroquery.readthedocs.io/en/latest/", None), "drms": ("https://docs.sunpy.org/projects/drms/en/stable/", None), "mpl_animators": ("https://docs.sunpy.org/projects/mpl-animators/en/stable/", None), "pandas": ("https://pandas.pydata.org/pandas-docs/stable/", None), "parfive": ("https://parfive.readthedocs.io/en/stable/", None), "reproject": ("https://reproject.readthedocs.io/en/stable/", None), "skimage": ("https://scikit-image.org/docs/stable/", None), "sqlalchemy": ("https://docs.sqlalchemy.org/en/latest/", None), "sunkit_instruments": ("https://docs.sunpy.org/projects/sunkit-instruments/en/stable/", None), "zeep": ("https://docs.python-zeep.org/en/stable/", None), } # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. from sunpy_sphinx_theme.conf import * # NOQA # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] # 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' ] # -- Sphinx Gallery ------------------------------------------------------------ # JSOC email os env os.environ["JSOC_EMAIL"] = "jsoc@cadair.com" sphinx_gallery_conf = { 'backreferences_dir': os.path.join('generated', 'modules'), 'filename_pattern': '^((?!skip_).)*$', 'examples_dirs': os.path.join('..', 'examples'), 'subsection_order': ExplicitOrder([ '../examples/acquiring_data', '../examples/map', '../examples/map_transformations', '../examples/time_series', '../examples/units_and_coordinates', '../examples/plotting', '../examples/differential_rotation', '../examples/saving_and_loading_data', '../examples/computer_vision_techniques', '../examples/developer_tools' ]), 'within_subsection_order': ExampleTitleSortKey, 'gallery_dirs': os.path.join('generated', 'gallery'), # Comes from the theme. "default_thumb_file": os.path.join(html_static_path[0], "img", "sunpy_icon_128x128.png"), 'abort_on_example_error': False, 'plot_gallery': 'True', 'remove_config_comments': True, 'doc_module': ('sunpy'), 'only_warn_on_example_error': True, } # -- Stability Page ------------------------------------------------------------ with open('./code_ref/sunpy_stability.yaml', 'r') as estability: sunpy_modules = yaml.load(estability.read(), Loader=yaml.Loader) html_context = { 'sunpy_modules': sunpy_modules, 'is_development': not is_release, } def rstjinja(app, docname, source): """ Render our pages as a jinja template for fancy templating goodness. """ # Make sure we're outputting HTML if app.builder.format != 'html': return files_to_render = ["code_ref/stability", "dev_guide/index"] if docname in files_to_render: print(f"Jinja rendering {docname}") rendered = app.builder.templates.render_string( source[0], app.config.html_context ) source[0] = rendered # -- Sphinx setup -------------------------------------------------------------- def setup(app): # Generate the stability page app.connect("source-read", rstjinja) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.5492742 sunpy-3.1.5/docs/dev_guide/0000755000175100001710000000000000000000000014607 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.5492742 sunpy-3.1.5/docs/dev_guide/contents/0000755000175100001710000000000000000000000016444 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/api.rst0000644000175100001710000000610600000000000017752 0ustar00vstsdocker.. _public_api: ****************** sunpy's Public API ****************** Convention in the Python ecosystem is to add an underscore to the start of a function to denote if a function or method is "private" e.g., `~sunpy.coordinates.sun._angular_radius`. If it is considered to be private, there is no guarantee that the API or behavior will change with a warning, so external use of these functions or methods are strongly discouraged. sunpy follows this convention but with one extra caveat. Within each python file, we have a ``__all__`` that defines what is imported into the namespace if you do e.g., ``from sunpy.coordinates.sun import *``. This is the "public" API of that module. These functions are the ones listed within our API documentation: :ref:`reference`. If you do ``import sunpy.coordinates.sun``, you can still access the "private" functions. This means that all of the public API will follow the deprecation policy detailed below with the exception of `sunpy.util` which is considered to be for internal sunpy use only. Deprecation Policy and Breaking Changes ======================================= All public API within the SunPy project (the sunpy core package and stable affiliated packages) will enforce strict standards when it comes to either changing, updating or breaking the API. .. _deprecation: Deprecations ------------ If you want to deprecate anything within in sunpy, you should do the following: .. code-block:: python from sunpy.util.decorators import deprecated @deprecated(since="3.1", message="We will be moving this", alternative="sunpy.net.Scraper") class Scraper: The deprecation warning has to be in one LTS release before the deprecated code can be removed. So in the above example, the warning will be in sunpy 3.1 but it can not be removed until sunpy 4.1 after the 4.0 LTS release. There should be a "deprecation" changelog entry to accompany the deprecation warning. When the code is actually removed, a "removal" changelog should be added. The same applies if you want to change the default value of a keyword argument for a function or method, e.g.: .. code-block:: python from sunpy.util.exceptions import warn_deprecated if response_format is None: response_format = "legacy" warn_deprecated("The default response format from the VSO client will " "be changing to 'table' in version 3.1. " "To remove this warning set response_format='legacy' " "to maintain the old behaviour or response_format='table'" " to use the new behaviour.") .. note:: This is a summary of `SEP-0009`_ which is the formal SunPy project deprecation policy. .. _SEP-0009: https://github.com/sunpy/sunpy-SEP/blob/master/SEP-0009.md#deprecations-and-documentation .. _breaking: Breaking Changes ---------------- Every attempt is made to avoid breaking any public API in sunpy but in the case it does happen. There should be a "breaking" changelog entry to accompany the change with as much detail on how to update a user's code due to this breaking change. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/code_standards.rst0000644000175100001710000002441500000000000022161 0ustar00vstsdocker.. _coding-standards: **************** Coding Standards **************** The purpose of the page is to describe the standards that are expected of all the code in the SunPy project. All potential developers should read and abide by the following standards. Code which does not follow these standards closely will not be accepted. We try to closely follow the coding style and conventions proposed by `Astropy `_. Language Standard ================= * All code must be compatible with Python 3.7 and later. Usage of ``six``, ``__future__``, and ``2to3`` is no longer acceptable. * The new Python 3 formatting style should be used (i.e. ``"{0:s}".format("spam")`` instead of ``"%s" % "spam"``). * The core package and affiliated packages should be importable with no dependencies other than components already in the sunpy core package, the `Python Standard Library `_, and packages already required by the sunpy core package. Adding dependencies to sunpy core will be considered but are highly discouraged. Such optional dependencies should be recorded in the ``setup.cfg`` file in the ``extras_require`` entry. Coding Style/Conventions ======================== * The code will follow the standard `PEP8 Style Guide for Python Code `_. In particular, this includes using only 4 spaces for indentation, and never tabs. * **Follow the existing coding style** within a file and avoid making changes that are purely stylistic. Please try to maintain the style when adding or modifying code. * Following PEP8's recommendation, absolute imports are to be used in general. We allow relative imports within a module to avoid circular import chains. * The ``import numpy as np``, ``import matplotlib as mpl``, and ``import matplotlib.pyplot as plt`` naming conventions should be used wherever relevant. ``from packagename import *`` should never be used (except in ``__init__.py``) * Classes should either use direct variable access, or Python’s property mechanism for setting object instance variables. * Classes should use the builtin `super` function when making calls to methods in their super-class(es) unless there are specific reasons not to. `super` should be used consistently in all subclasses since it does not work otherwise. * Multiple inheritance should be avoided in general without good reason. * ``__init__.py`` files for modules should not contain any significant implementation code. ``__init__.py`` can contain docstrings and code for organizing the module layout. * General utilities necessary for but not specific to the package should be placed in the ``sunpy.utils`` module. Formatting ========== We enforce a minimum level of code style with our continuous intergration (the name is ``sunpy.sunpy (python_codestyle [linux]``). This runs a tool called `pre-commit `__. The settings and tools we use for the pre-commit can be found in the file :file:`.pre-commit-config.yaml` at the root of the sunpy git repository. Some of the checks are: * Checks (but doesn't fix) various PEP8 issues with flake8. * Sort all imports in any Python files with isort. * Remove any unused variables or imports with autoflake. We suggest you use "tox" (which is used to run the sunpy test suite) to run these tools without having to setup anything within your own Python virtual environment:: $ tox -e codestyle What you will see is this output (heavily condensed): .. code-block:: bash codestyle create: /home//GitHub/sunpy/.tox/codestyle codestyle run-test: commands[0] | pre-commit install-hooks codestyle run-test: commands[1] | pre-commit run --verbose --all-files --show-diff-on-failure flake8...................................................................Passed - hook id: flake8 - duration: 1.35s 0 Check for case conflicts.................................................Passed - hook id: check-case-conflict - duration: 0.08s Trim Trailing Whitespace.................................................Failed - hook id: trailing-whitespace - duration: 0.08s - exit code: 1 - files were modified by this hook Fixing docs/dev_guide/code_standards.rst pre-commit hook(s) made changes. If you are seeing this message in CI, reproduce locally with: `pre-commit run --all-files`. To run `pre-commit` as part of git workflow, use `pre-commit install`. All changes made by hooks: diff --git a/docs/dev_guide/code_standards.rst b/docs/dev_guide/code_standards.rst index bed700d90..c6b5df977 100644 --- a/docs/dev_guide/code_standards.rst +++ b/docs/dev_guide/code_standards.rst @@ -59,6 +59,8 @@ Instead of installing this, you can use "tox" (which is used to run the sunpy te $ tox -e codestyle +What you will see + If you want to setup the pre-commit locally, you can do the following:: $ pip install pre-commit diff --git a/docs/dev_guide/documentation.rst b/docs/dev_guide/documentation.rst index 5cd914047..b1017f77a 100644 --- a/docs/dev_guide/documentation.rst +++ b/docs/dev_guide/documentation.rst @@ -39,9 +39,9 @@ If there are multiple code elements with the same name (e.g. ``peek()`` is a met .. code-block:: rst - `GenericMap.peek` or `CompositeMap.peek` + `.GenericMap.peek` or `.CompositeMap.peek` -These will show up as `GenericMap.peek` or `CompositeMap.peek`. +These will show up as `.GenericMap.peek` or `.CompositeMap.peek`. To still show only the last segment you can add a tilde as prefix: ERROR: InvocationError for command /home/nabil/GitHub/sunpy/.tox/codestyle/bin/pre-commit run --verbose --all-files --show-diff-on-failure (exited with code 1) ___________________________________________________________________________________________ summary ___________________________________________________________________________________________ ERROR: codestyle: commands failed This will inform you of what checks failed and why, and what changes (if any) the command has made to your code. If you want to setup the pre-commit locally, you can do the following:: $ pip install pre-commit Now you can do:: $ pre-commit run --all-files which will run the tools on all files in the sunpy git repository. The pre-commit tools can change some of the files, but in other cases it will report problems that require manual correction. If the pre-commit tool changes any files, they will show up as new changes that will need to be committed. Automate -------- Instead of running the pre-commit command each time you can install the git hook:: $ pre-commit install which installs a command to :file:`.git/hooks/pre-commit` which will run these tools at the time you do ``git commit`` and means you don't have to run the first command each time. We only suggest doing the install step if you are comfortable with git and the pre-commit tool. Documentation and Testing ========================= * American English is the default language for all documentation strings and inline commands. Variables names should also be based on English words. * Documentation strings must be present for all public classes/methods/functions, and must follow the form outlined in the :ref:`docs_guidelines` page. Additionally, examples or tutorials in the package documentation are strongly recommended. * Write usage examples in the docstrings of all classes and functions whenever possible. These examples should be short and simple to reproduce–users should be able to copy them verbatim and run them. These examples should, whenever possible, be in the :ref:`doctests` format and will be executed as part of the test suite. * Unit tests should be provided for as many public methods and functions as possible, and should adhere to the standards set in the :ref:`testing` document. Data and Configuration ====================== * We store test data in ``sunpy/data/test`` as long as it is less than about 100 kB. These data should always be accessed via the :func:`sunpy.data.test.get_test_filepath` and :func:`sunpy.data.test.test_data_filenames` functions. * We store data used for examples in the `sample-data repository `_. This data should not be used for unit tests but can be within our documentation. * All persistent configuration should use the :ref:`config` mechanism. Such configuration items should be placed at the top of the module or package that makes use of them, and supply a description sufficient for users to understand what the setting changes. Standard output, warnings, and errors ===================================== The built-in ``print(...)`` function should only be used for output that is explicitly requested by the user, for example ``print_header(...)`` or ``list_catalogs(...)``. Any other standard output, warnings, and errors should follow these rules: * For errors/exceptions, one should always use ``raise`` with one of the built-in exception classes, or a custom exception class. The nondescript ``Exception`` class should be avoided as much as possible, in favor of more specific exceptions (`IOError`, `ValueError`, etc.). * For warnings, one should always use the functions in ``sunpy.util.exceptions`` and *not* `warnings.warn`. This ensures we are always raising a sunpy specific warning type. Including C Code ================ * C extensions are only allowed when they provide a significant performance enhancement over pure Python, or a robust C library already exists to provided the needed functionality. * The use of `Cython`_ is strongly recommended for C extensions. * If a C extension has a dependency on an external C library, the source code for the library should be bundled with sunpy, provided the license for the C library is compatible with the sunpy license. Additionally, the package must be compatible with using a system-installed library in place of the library included in sunpy. * In cases where C extensions are needed but `Cython`_ cannot be used, the `PEP 7 Style Guide for C Code `_ is recommended. * C extensions (`Cython`_ or otherwise) should provide the necessary information for building the extension. .. _Cython: https://cython.org/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/config.rst0000644000175100001710000000070500000000000020445 0ustar00vstsdocker.. _config: *************** Global Settings *************** sunpy makes use of a settings file (:file:`sunpyrc`). This file contains a number of global settings such as where files should be downloaded by default or the default format for displaying times. When developing new functionality check this file and make use of the default values if appropriate or, if needed, define a new value. More information can be found in :ref:`customizing-sunpy`. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/dependencies.rst0000644000175100001710000000160200000000000021623 0ustar00vstsdocker.. _dependency_versions: ************************* Dependency Support Policy ************************* .. note:: This policy is based on `NEP-0029`_. sunpy has a short list of core dependencies (Python, numpy, astropy, parfive) and a long list of optional dependencies. The minimum version of these packages that we enforce follows this policy. * Python: Released in the prior 42 months from the anticipated release date. * astropy: Released in the prior 12 months from the anticipated release date. * Everything else: Released in the prior 24 months from the anticipated release date. Sponsored affiliated packages will support *at least* the sunpy LTS version at the time of their release. For dependencies only needed to run our tests we will support versions released in the prior 12 months to the current date. .. _NEP-0029: https://numpy.org/neps/nep-0029-deprecation_policy.html ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/documentation.rst0000644000175100001710000002253400000000000022055 0ustar00vstsdocker.. _docs_guidelines: ************************* SunPy Documentation Rules ************************* Overview ======== All code must be documented and we follow these style conventions described here: * `numpydoc `_ We recommend familiarizing yourself with this style. Referring to other code ----------------------- To link to other methods, classes, or modules in sunpy you have to use backticks, for example: .. code-block:: rst `sunpy.io.read_file` generates a link like this: `sunpy.io.read_file`. We use the sphinx setting ``default_role = 'obj'`` so that you do not nor **SHOULD NOT** use the ``:class:`` qualifier, but ``:func:``, ``:meth:`` are different (more on this below). Often, you don't want to show the full package and module name. As long as the target is unambiguous you can simply leave them out: .. code-block:: rst `.read_file` and the link still works: `.read_file`. If there are multiple code elements with the same name (e.g. ``peek()`` is a method in multiple classes), you'll have to extend the definition: .. code-block:: rst `.GenericMap.peek` or `.CompositeMap.peek` These will show up as `.GenericMap.peek` or `.CompositeMap.peek`. To still show only the last segment you can add a tilde as prefix: .. code-block:: rst `~.GenericMap.peek` or `~.CompositeMap.peek` will render as `~.GenericMap.peek` or `~.CompositeMap.peek`. Other packages can also be linked via `intersphinx `_: .. code-block:: rst `numpy.mean` will return this link: `numpy.mean`. This works for Python, Numpy and Astropy (full list is in :file:`docs/conf.py`). With Sphinx, if you use ``:func:`` or ``:meth:``, it will add closing brackets to the link. If you get the wrong pre-qualifier, it will break the link, so we suggest that you double check if what you are linking is a method or a function. .. code-block:: rst :class:`numpy.mean()` :meth:`numpy.mean()` :func:`numpy.mean()` will return two broken links ("class" and "meth") but "func" will work. sunpy-Specific Rules -------------------- * For **all** RST files, we enforce a one sentence per line rule and ignore the line length. * Standards on docstring length and style are enforced using `docformatter `__: .. code-block:: bash $ docformatter -r -i --pre-summary-newline --make-summary-multi-line .. _Docs Guidelines for Data Sources: Documenting Data Sources ---------------------------- Subclasses of `~sunpy.map.GenericMap` or `~sunpy.timeseries.TimeSeries` must provide a detailed docstring providing an overview of the data source that the object represents. In order to maintain consistency and completeness, the following information must be provided by a data source docstring, if available, and preferably in the following order: * the name of the mission and instrument and the institution that built it * short description of the instrument (e.g. Cassegrain reflector, Wolter-1 grazing incidence x-ray, coronagraph) including the type of detector * description of the platform (e.g. satellite in 28 deg inclined orbit, a telescope on the summit of Mauna Kea in Hawaii) * description of the primary purpose or science goals of the instrument. * list of all wavelength(s) or passbands in appropriate units * description of the emission processes which dominate in those passbands * appropriate measurement properties such as field of view, angular resolution, time resolution * description of the operational concept (e.g. operates 24/7, observes from 7 am to 5 pm UT) including mention of unusual operations scenarios (e.g. calibration seasons, eclipse seasons) * the start and end of the data set In addition, a reference section must be provided with links to the following resources, if available, * the mission web page * the instrument web page * relevant wikipedia page(s) * relevant user guide(s) * the mission paper and instrument paper * information to interpret metadata keywords such as FITS header reference * the data archive An example docstring can be found in the :ref:`Writing a new Instrument Map Class guide `. Sphinx ====== All of the sunpy documentation (like this page) is built by `Sphinx `_, which is a tool especially well-suited for documenting Python projects. Sphinx works by parsing files written using a `a Mediawiki-like syntax `_ called `reStructuredText `_. In addition to parsing static files of reStructuredText, Sphinx can also be told to parse code comments. In fact, in addition to what you are reading right now, the `Python documentation `_ was also created using Sphinx. Usage ----- All of the sunpy documentation is contained in the "docs" folder and code documentation strings. The examples from the example gallery can be found in the "examples" folder. In the root directory run:: $ tox -e build_docs This will generate HTML documentation for sunpy in the "docs/_build/html" directory. You can open the "index.html" file to browse the final product. The gallery examples are located under "docs/_build/html/generated/gallery". Sphinx builds documentation iteratively, only adding things that have changed. If you want to build the documentation without building the gallery, i.e. to reduce build times while working on other sections of the documentation you can run:: $ tox -e build_docs -- -D plot_gallery=False If you'd like to start from scratch (i.e., remove the tox cache) then run:: $ tox -e build_docs -- -aE To build the documentation in your current python environment you must have all the dependencies specified in ``setup.cfg`` installed (``pip install -e .[docs]``). Then change to the :file:`docs/` directory and run:: $ make html For more information on how to use Sphinx, consult the `Sphinx documentation `_. Special Sphinx directives ------------------------- ``minigallery`` directive ^^^^^^^^^^^^^^^^^^^^^^^^^ Sphinx will automatically record which functions, classes, etc. are used in each gallery example. In the documentation, you can insert a mini-gallery of the subset of the gallery examples that uses a particular function, class, etc. For example, the following RST block:: .. minigallery:: sunpy.coordinates.RotatedSunFrame produces this mini-gallery: .. minigallery:: sunpy.coordinates.RotatedSunFrame If you want to specify more than one object, separate them by spaces. This is particularly useful if you need to cover multiple namespaces in which an object may be accessed, e.g.:: .. minigallery:: sunpy.coordinates.RotatedSunFrame sunpy.coordinates.metaframes.RotatedSunFrame ``generate`` directive ^^^^^^^^^^^^^^^^^^^^^^ In rare circumstances, one may want to insert "raw" HTML directly into the pages written by Sphinx. For HTML that is statically available (i.e., already written in some form), one can use the `"raw" directive `__. For HTML that is generated by Python code, sunpy provides the custom directive ``generate``. Here's an example RST block:: .. generate:: html :html_border: import os from sunpy.data.sample import file_dict print("") for key, value in file_dict.items(): print(f"") print("
{key}{os.path.basename(value)}
") to insert the following HTML table: .. generate:: html :html_border: import os from sunpy.data.sample import file_dict print("") for key, value in file_dict.items(): print(f"") print("
{key}{os.path.basename(value)}
") Troubleshooting ---------------- Sphinx can be very particular about formatting, and the warnings and errors aren't always obvious. Below are some commonly-encountered warning/error messages along with a human-readable translation: **WARNING: Duplicate explicit target name: "xxx".** If you reference the same URL, etc more than once in the same document sphinx will complain. To avoid, use double-underscores instead of single ones after the URL. **ERROR: Malformed table. Column span alignment problem at line offset n** Make sure there is a space before and after each colon in your class and function docs (e.g. attribute : type, instead of attribute: type). Also, for some sections (e.g. Attributes) numpydoc seems to complain when a description spans more than one line, particularly if it is the first attribute listed. **WARNING: Block quote ends without a blank line; unexpected unindent.** Lists should be indented one level from their parents. **ERROR: Unknown target name: "xxx"** In addition to legitimate errors of this type, this error will also occur when variables have a trailing underscore, e.g., ``xxx_``. **WARNING: Explicit markup ends without a blank line; unexpected unindent.** This usually occurs when the text following a directive is wrapped to the next line without properly indenting a multi-line text block. **WARNING: toctree references unknown document '...'** / **WARNING: toctree contains reference to nonexisting document** This pair of errors is due to the way numpydoc scrapes class members. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/example_gallery.rst0000644000175100001710000000355500000000000022360 0ustar00vstsdocker.. _example_gallery: *************** Example Gallery *************** The purpose of the page is to describe the contribution guidelines for the `sunpy Example Gallery `_. All potential contributors to the sunpy Example Gallery should read and abide by the following guidelines. .. note:: We have an example template located at ``examples/example_template/example_template.py``. Contribution Guidelines ======================= * The title of the example should be short yet descriptive and emphasize the goal of the example. Try to make the title appeal to a broad audience and avoid referencing a specific instrument, catalog, or anything wavelength dependent. * Each example should begin with a paragraph that gives a brief overview of the entire example, including relevant astronomy concepts, and motivates the described functionality. * The examples must be compatible with the versions supported by the last major release of the sunpy core package (i.e., Python >= 3.7). * All the examples must be fully PEP8 compliant, we recommend using one of the many PEP8 linters that are available (autopep8, flake8 as some examples). * Wherever possible, the examples should include linked references with links pointing to the appropriate `DOI `_ or `ADS `_ entry. * The example should include links to relevant documentation pages. * Each example should, where possible, include at least one image, map, or plot to use as the icon in the example gallery. * The examples should avoid using acronyms without defining them first (e.g. Virtual Solar Observatory, or VSO). Similarly complex jargon should be avoided unless clearly explained. * There should be a good variety of examples for each section (simple and more complex to cater for different levels). ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/extending_fido.rst0000644000175100001710000006632000000000000022173 0ustar00vstsdocker.. _extending_fido: *************************************** Extending Fido with New Sources of Data *************************************** Sunpy's data search and retrieval tool (``Fido``) is designed to be extensible, so that new sources of data or metadata can be supported, either inside or outside the sunpy core package. There are two ways of defining a new client, depending on the complexity of the web service. A "scraper" client inherits from `~sunpy.net.dataretriever.client.GenericClient` which provides helper methods for downloading from a list of URLs. If the service you want to add has easily accesible HTTP or FTP URLs that have a well defined folder and filename structure, this is probably the best approach. If the service you want to add requires making requests to an API with parameters for the search and getting a list of results in return, then you probably want to write a "full" client. Before writing a new client, ensure you are familiar with how searches are specified by the `sunpy.net.attr` system, including combining them with logical operations. When choosing a name for your new client it should have the form ``Client`` as sunpy will split the name the name of the class to extract the name of your client. The main place this is done is when constructing a `~.UnifiedResponse` object, where the name part can be used to index the response object. .. _new_scraper_client: Writing a new "scraper" client ============================== A "scraper" Fido client (also sometimes referred to as a "data retriever" client) is a Fido client which uses the URL `~sunpy.net.scraper.Scraper` to find files on remote servers. If the data provider you want to integrate does not provide a tree of files with predictable URLs then a "full" client is more likely to provide the functionality you need. A new "scraper" client inherits from `~sunpy.net.dataretriever.client.GenericClient` and requires a minimum of these three components: * A class method :meth:`~sunpy.net.base_client.BaseClient.register_values`; this registers the "attrs" that are supported by the client. It returns a dictionary where keys are the supported attrs and values are lists of tuples. Each ``tuple`` contains the attr value and its description. * A class attribute ``baseurl``; this is a regular expression which is used to match the URLs supported by the client. * A class attribute ``pattern``; this is a template used to extract the metadata from URLs matched by ``baseurl``. The extraction uses the `~sunpy.extern.parse.parse` format. For a simple example of a scraper client, we can look at the implementation of `sunpy.net.dataretriever.sources.eve.EVEClient` in sunpy. A version without documentation strings is reproduced below: .. code-block:: python class EVEClient(GenericClient): baseurl = (r'http://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/' r'L0CS/SpWx/%Y/%Y%m%d_EVE_L0CS_DIODES_1m.txt') pattern = '{}/SpWx/{:4d}/{year:4d}{month:2d}{day:2d}_EVE_L{Level:1d}{}' @classmethod def register_values(cls): from sunpy.net import attrs adict = {attrs.Instrument: [('EVE', 'Extreme ultraviolet Variability Experiment, which is part of the NASA Solar Dynamics Observatory mission.')], attrs.Physobs: [('irradiance', 'the flux of radiant energy per unit area.')], attrs.Source: [('SDO', 'The Solar Dynamics Observatory.')], attrs.Provider: [('LASP', 'The Laboratory for Atmospheric and Space Physics.')], attrs.Level: [('0', 'EVE: The specific EVE client can only return Level 0C data. Any other number will use the VSO Client.')]} return adict This client scrapes all the URLs available under the base url ``http://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/L0CS/SpWx/``. `~sunpy.net.scraper.Scraper` is primarily focused on URL parsing based on time ranges, so the rest of the ``baseurl`` pattern specifies where in the pattern the time information is located, using `strptime `__ notation. The ``pattern`` attribute is used to populate the results table from the URLs matched with the ``baseurl``. It includes some of the time definitions, as well as names of attrs (in this case "Level"). The supported time keys are: 'year', 'month', 'day', 'hour', 'minute', 'second', 'millisecond'. The attrs returned in the ``register_values()`` method are used to match your client to a search, as well as adding their values to the attr. This means that after this client has been imported, running ``print(a.Provider)`` will show that the ``EVEClient`` has registered a provider value of ``LASP``. In addition to this, a sanitized, lower cased version of the value will be available for tab completing, e.g. ``a.Provider.lasp`` or ``a.Level.zero``. More Complex Clients -------------------- Sometimes the attr values may not exist identically in the required URLs, and therefore can not be simply extracted with ``pattern``. Say, for example, the Wavelength of a file is expressed in the URL as a passband by name; in this case conversion of the `~astropy.units.Quantity` object to the pass band name would be needed. This is done addressed with the two following methods: * :meth:`~sunpy.net.dataretriever.client.GenericClient.pre_search_hook` which will convert the passed attrs to their representation in the URL. * :meth:`~sunpy.net.dataretriever.client.GenericClient.post_search_hook` which converts the retrieved metadata from a URL to the form in which they are desired to be represented in the response table. A good example of the use of these two methods is the `sunpy.net.dataretriever.sources.norh.NoRHClient` in sunpy. It may also be possible that the ``baseurl`` property needs to be customised based on attrs other than Time. Since `~sunpy.net.scraper.Scraper` doesn't currently support generating directories that have non-time variables, the :meth:`~sunpy.net.dataretriever.client.GenericClient.search` needs to be customised. The search method should in this case, generate a ``baseurl`` dependant on the values of these attrs, and then call ``super().search`` or `~sunpy.net.scraper.Scraper` for each ``baseurl`` generated. For an example of a complex modification of the ``search()`` method see the implementation of `.SUVIClient.search`. Examples -------- Suppose any file of a data archive can be described by this URL ``https://some-domain.com/%Y/%m/%d/satname_{SatelliteNumber}_{Level}_%y%m%d%H%M%S_{any-2-digit-number}.fits``: ``baseurl`` becomes ``r'https://some-domain.com/%Y/%m/%d/satname_(\d){2}_(\d){1}_(\d){12}_(\d){2}\.fits'``. Note all variables in the filename are converted to regex that will match any possible value for it. A character enclosed within ``()`` followed by a number enclosed within ``{}`` is used to match the specified number of occurences of that special sequence. For example, ``%y%m%d%H%M%S`` is a twelve digit variable (with 2 digits for each item) and thus represented by ``r'(\d){12}'``. Note that ``\`` is used to escape the special character ``.``. ``pattern`` becomes ``'{}/{year:4d}/{month:2d}{day:2d}/satname_{SatelliteNumber:2d}_{Level:1d}_{:6d}{hour:2d}{minute:2d}{second:2d}_{:2d}.fits'``. Note the sole purpose of ``pattern`` is to extract the information from matched URL, using `~sunpy.extern.parse.parse`. So the desired key names for returned dictionary should be written in the ``pattern`` within ``{}``, and they should match with the ``attr.__name__``. ``register_values()`` can be written as: .. code-block:: python @classmethod def register_values(cls): from sunpy.net import attrs adict = { attrs.Instrument: [("SatName", "The description of Instrument")], attrs.Physobs: [('some_physobs', 'Phsyobs description')], attrs.Source: [('some_source', 'Source description')], attrs.Provider: [('some_provider', 'Provider description')], attrs.Level: [("1", "Level 1 data"), ("2", "Level 2 data")], attrs.SatelliteNumber: [("16", "Describe it"), ("17", "Describe it")] } return adict .. _new_full_client: Writing a "full" client ======================= In this section we will describe how to build a "full" Fido client. You should write a new "full" client if the data you are accessing can not be accessed via a URL template, for instance if you hit a web API with a query to return results for a search. A new Fido client contains three major components: * A subclass of `~sunpy.net.base_client.BaseClient` which implements ``search``, ``fetch``, and ``_can_handle_query``. * Zero or more new `~sunpy.net.attr.Attr` classes to specify search parameters unique to your data source. * An instance of `~sunpy.net.attr.AttrWalker` which can be used to walk the tree of `~sunpy.net.attr.Attr` instances and convert them into a form useful to your client's search method. Search Attrs ------------ As described in `~sunpy.net.attr` the attr system allows the construction of complex queries by the user. To make these complex queries easily processable by the clients the ``AttrWalker`` converts these into a set of queries which can be processed separately. It does this by converting the input query to a set of queries which are ORed, but are complete queries. This means the list of queries is an **OR** of **ANDs** (technically called `disjuntive normal form `__). Each query in the list of ORs contains all the information about that query so for example if the user provided a query like:: a.Time("2020/02/02", "2020/02/03") & (a.Instrument("AIA") | a.Instrument("HMI")) it would be passed to the client as:: (a.Time("2020/02/02", "2020/02/03") & a.Instrument("HMI")) | (a.Time("2020/02/02", "2020/02/03") & a.Instrument("AIA")) So you can process each element of the OR in turn without having to consult any other part of the query. If the query the user provided contains an OR statement you get passed an instance of `~sunpy.net.attr.AttrOr` and each sub-element of that `~sunpy.net.attr.AttrOr` will be `~sunpy.net.attr.AttrAnd` (or a single other attr class). If the user query dosen't contain an OR you get a single `~.Attr` instance or an `~.AttrAnd`. For example you could get any of the following queries (using ``&`` for AND and ``|`` for OR): * ``(a.Instrument("AIA") & a.Time("2020/02/02", "2020/02/03")) | (a.Instrument("HMI") & a.Time("2020/02/02", "2020/02/03"))`` * ``a.Time("2020/02/02", "2020/02/03")`` * ``a.Instrument("AIA") & a.Time("2020/02/02", "2020/02/03")`` * ``(a.Time(..) & a.Instrument("AIA") & a.Wavelength(30*u.nm, 31*u.nm)) | (a.Time(..) & a.Instrument("AIA") & a.Wavelength(30*u.nm, 31*u.nm))`` but you **would not** be passed queries which look like the following examples, even if that's how the user specified them: * ``a.Time("2020/02/02", "2020/02/03") & (a.Instrument("AIA") | a.Instrument("HMI"))`` * ``a.Time(..) & (a.Instrument("AIA") | a.Instrument("AIA")) & a.Wavelength(30*u.nm, 31*u.nm))`` The Attr Walker ############### Given the potential complexity of these combined attrs, converting them into other forms, such as query parameters or JSON etc involves walking the tree and converting each attr to the expected format in a given way. This parsing and conversion of the query tree is deliberately not done using methods or attributes of the attrs themselves. The attrs should be independent of any client in their implementation, so they can be shared between the different ``Fido`` clients. A class is provided to facilitate this conversion, `~sunpy.net.attr.AttrWalker`. The `~sunpy.net.attr.AttrWalker` class consists of three main components: * **Creators**: The `~sunpy.net.attr.AttrWalker.create` method is one of two generic functions for which a different function is called for each Attr type. The intended use for creators is to return a new object dependant on different attrs. It is commonly used to dispatch on `~sunpy.net.attr.AttrAnd` and `~sunpy.net.attr.AttrOr`. * **Appliers**: The `~sunpy.net.attr.AttrWalker.apply` method is the same as `~sunpy.net.attr.AttrWalker.create` in that it is a generic function. The only difference between it and `~sunpy.net.attr.AttrWalker.create` is its intended use. Appliers are generally used to modify an object returned by a creator with the values or information contained in other Attrs. * **Converters**: Adding a converter to the walker adds the function to both the creator and the applier. For the VSO client this is used to convert each supported attr into a `~sunpy.net.attr.ValueAttr` which is then later processed by the appliers and creators. This pattern can be useful if you would otherwise have to repeat a lot of logic in each of the applier functions for each type of Attr you support. An Example of ``AttrWalker`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In this example we will write a parser for some simple queries which uses `~sunpy.net.attr.AttrWalker` to convert the query to a `dict` of URL query parameters for a HTTP GET request. Let's imagine we have a web service which you can do a HTTP GET request to ``https://sfsi.sunpy.org/search`` for some imaginary data from an instrument called SFSI (Sunpy Fake Solar Instrument). This GET request takes three query parameters ``startTime``, ``endTime`` and ``level``, so a request might look something like: ``https://sfsi.sunpy.org/search?startTime=2020-01-02T00:00:00&endTime=2020-01-02T00:00:00&level=1``. Which would search for level one data between 2020-01-01 and 2020-01-02. As `~sunpy.net.attrs` has `~sunpy.net.attrs.Time` and `~sunpy.net.attrs.Level` we don't need to define any of our own attrs for this client. We do however want to write our own walker to convert them to the form out client's ``search()`` method wants to send them to the server. The first step is to setup the walker and define a creator method which will return a list of dicts, one for each independent search. .. code-block:: python import sunpy.net.attrs as a from sunpy.net.attr import AttrWalker, AttrAnd, AttrOr, DataAttr walker = AttrWalker() @walker.add_creator(AttrOr) def create_or(wlk, tree): results = [] for sub in tree.attrs: results.append(wlk.create(sub)) return results @walker.add_creator(AttrAnd, DataAttr) def create_and(wlk, tree): result = dict() wlk.apply(tree, result) return [result] The call ``wlk.apply(...)`` inside the creator will walk any nested attrs and add their values to the dictionary as defined by the applier registered to each attr type. If we want our client to support searching by ``a.Time`` and ``a.Level`` as in the URL example above, we would need to register an applier for each of these attrs. .. code-block:: python @walker.add_applier(a.Time) def _(wlk, attr, params): return params.update({'startTime': attr.start.isot, 'endTime': attr.end.isot}) @walker.add_applier(a.Level) def _(wlk, attr, params): return params.update({'level': attr.value}) This combination of creators and appliers would allow support of any combination of queries consisting of ``a.Time`` and ``a.Level``. Obviously, most clients would want to support more attrs than these two, and this could be done by adding more applier functions. Adding "Attrs" to Registry ########################## Registering of "attrs" ensures discoverability of search attributes supported by the corresponding sunpy Client. For adding them to the Registry, we need to define a ``classmethod`` :meth:`~sunpy.net.base_client.BaseClient.register_values` that returns a dictionary of registered values. This dictionary should have `~sunpy.net.attr.Attr` classes as keys and a list of tuples corresponding to that key representing the possible values the key "attr" can take. Each tuple comprises of two elements. The first one is a value and the second element contains a brief description of that value. An example of writing ``register_values()`` for `~sunpy.net.dataretriever.client.GenericClient` is provided above. Please note that it can be defined in a similar way for full clients too. An Example of ``register_values()`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: python @classmethod def register_values(cls): from sunpy.net import attrs adict = { attrs.Instrument: [("LASCO", "Large Angle and Spectrometric Coronagraph")], attrs.Source: [('SOHO', 'Solar and Heliospheric Observatory')], attrs.Provider: [('SDAC', 'Solar Data Analysis Center')], attrs.Detector: [('C1', 'Coronograph 1'), ('C2', 'Coronograph 2'), ('C3', 'Coronograph 3')] } return adict Writing a Search Method ----------------------- The ``search()`` method has the job of taking a set of user queries and returning an instance of `.QueryResponseTable` containing the results. The general flow of a ``search()`` method is: * Call your instance of an `.AttrWalker` to convert the input into a form expected by your API. * Make as many requests to your API as needed to fulfill the query. (Generally one per element of the outer `.AttrOr`). * Process the response from your API into an instance of `.QueryResponseTable`. To process the query with the `.AttrWalker`, call the :meth:`.AttrWalker.create` method:: def search(self, query): queries = walker.create(query) Assuming the walker is the one we defined above, queries would be a list of dicts with the attrs processed into query parameters for the API URL. .. note:: If you want your search method to be able to be called independently of Fido, then you should accept a variable number of positional arguments (``*args``) and they should have the AND operator applied to them. This looks like:: def search(self, *args): query = attr.and_(args) queries = walker.create(query) Once the walker has processed the query into a form designed to be passed to your API, your ``search()`` method then needs to iterate over these parameters, make the requests, and process the results into a table. In the following example we pretend our client has a method ``_make_search(query_parameters)`` which takes the query parameters and makes a request to our API. We also pretend that the response is a json object in the form of a Python dictionary, which we want to put into the table. .. code-block:: python def search(self, query): queries = walker.create(query) results = [] for query_parameters in queries: results.append(self._make_search(query_parameters)) return QueryResponseTable(results, client=self) In reality, you probably want to post-process the results from your API before you put them in the table, they should be human readable first, with spaces and capitalisation as appropriate. The ``_can_handle_query`` method --------------------------------- The next required method is ``_can_handle_query``, this method tells ``Fido`` if your client might be able to return results for a given query. If this method returns `True`, your clients ``search()`` method will be called for that query. This method gets passed each query (in its independent form), and must either return ``True`` or ``False``. A simple example, which just checks the type of ``attrs`` and not their values would be:: @classmethod def _can_handle_query(cls, *query): query_attrs = set(type(x) for x in query) supported_attrs = {a.Time, a.Level} return supported_attrs.issuperset(query_attrs) Note, that this method is a class method, it gets called without instantiating your client to speed up the dispatching. Writing a Fetch Method ---------------------- The ``fetch()`` method of a Fido client is responsible for converting a set of search results (possibly sliced by the user) into a set of URLs to be downloaded. Due to the history of clients and how they were implemented in sunpy, some existing clients support use outside of the``Fido`` wrapper, this makes them appear more complex. In this example we are going to write a ``fetch()`` method which is designed only to be called from ``Fido``. The parameters for such a method should be:: def fetch(self, query_results, *, path, downloader, **kwargs): The parameters here are: * ``query_results`` which is an instance of `~.QueryResponseTable` or `~sunpy.net.base_client.QueryResponseRow`, these are the results the user wants to download. * ``path=`` This is the path that the user wants the file to be downloaded to, this can be a template string (i.e. expects to have ``.format()`` called on it). * ``downloader=`` This is a `parfive.Downloader` object which should be mutated by the ``fetch()`` method. * ``**kwargs`` It is very important that ``fetch()`` methods accept extra keyword arguments that they don't use, as the user might be passing them to other clients via ``Fido``. Processing the ``query_results`` Argument ######################################### The ``query_results`` argument can be of two types `~.QueryResponseTable` or `~sunpy.net.base_client.QueryResponseRow`, as the user can slice the results table down to a single row and then pass that to ``Fido.fetch()``. If you do not wish to handle a single row any differently to a table, you can place the `~sunpy.net.base_client.convert_row_to_table` decorator on your ``fetch()`` method which will convert the argument to a length one table when it is a single row object. The primary function of the ``fetch()`` method is for you to convert this results object into a set of URLs for Fido to download. This logic will be specific to your client. Formatting the ``path=`` Argument ################################# The path argument may contain format sections which are processed column names from the response table. In addition to these it may contain the ``{file}`` format segment which is a placeholder for the filename. Each row of the results table has a `~sunpy.net.base_client.QueryResponseRow.response_block_map` property which is a dictionary of valid format keys to values for that row. In addition to the `~sunpy.net.base_client.QueryResponseRow.response_block_map` your fetch method also needs to be able to generate a filename for the file. The simplest (but unlikely) scenario is that you know the filename for each file you are going to download before you do so, in this situation you would be able to generate the full filepath for each row of the response as follows:: for row in query_results: filename = self._calculate_filename(row) filepath = path.format(file=filename, **row.response_block_map) In the situation where you wish to be told the filename by the webserver you are downloading the file from, it is a little more complex, you need to pass a callback function to :meth:`parfive.Downloader.enqueue_file` which will calculate the full filename in the context of the download, where the headers can be inspected for the filename the webserver provides. The filename callback passed to :meth:`parfive.Downloader.enqueue_file` accepts two arguments ``resp`` and ``url``. ``resp`` is an `aiohttp.ClientResponse` object which is returned when `parfive` requests the URL. This response object allows us to inspect the headers of the response before the data is downloaded. ``url`` is the URL that was requested to generate the ``resp`` response. To combine the formatting of the row with the extraction of the filename from the headers it is common to use `functools.partial` to generate many functions with different fixed parameters. In the following example we will define a function which takes 4 arguments which we will use to generate the filename for the row. This function will be called by `parfive` with the ``resp`` and ``url`` arguments.:: def make_filename(path, row, resp, url): # Define a fallback filename based on the information in the search results name = f"row['ID'].fits" if resp: cdheader = resp.headers.get("Content-Disposition", None) if cdheader: _, params = cgi.parse_header(cdheader) name = params.get('filename', "") return path.format(file=name, **row.response_block_map) To reduce this function down to the two arguments expected we pre-specify the first two of these with `~functools.partial` before passing the function to `~parfive.Downloader.enqueue_file` inside the ``fetch()`` method. Our simple example above now becomes:: for row in query_results: filepath = partial(make_filename, path, row) Where the ``path`` variable is a `pathlib.Path` object provided as the ``path`` argument to ``fetch()``. Adding URLs to be Downloaded ############################ For each file you wish for ``Fido`` to download (normally one per row of the ``query_results``) you need to call the :meth:`parfive.Downloader.enqueue_file` of the ``downloader`` argument. Combining this with the simple example above it may look something like:: for row in query_results: filename = self._calculate_filename(row) filepath = path.format(file=filename, **row.response_block_map) url = self._calculate_url(row) downloader.enqueue_file(url, filename=filepath) If your filepath is a callback function, pass this to the ``filename=`` argument. Your fetch method does not need to return anything, as long as ``enqueue_file`` is called for every file you want ``Fido`` to download. Putting it all Together ----------------------- An example client class may look something like:: import cgi import sunpy.net.atrrs as a from sunpy.net.attr import AttrWalker, AttrAnd, AttrOr, DataAttr from sunpy.base_client import QueryResponseTable walker = AttrWalker() @walker.add_creator(AttrOr) def create_or(wlk, tree): results = [] for sub in tree.attrs: results.append(wlk.create(sub)) return results @walker.add_creator(AttrAnd, DataAttr) def create_and(wlk, tree): result = dict() wlk.apply(tree, result) return [result] @walker.add_applier(a.Time) def _(wlk, attr, params): return params.update({'startTime': attr.start.isot, 'endTime': attr.end.isot}) @walker.add_applier(a.Level) def _(wlk, attr, params): return params.update({'level': attr.value}) class ExampleClient(BaseClient): def search(self, query): queries = walker.create(query) results = [] for query_parameters in queries: results.append(self._make_search(query_parameters)) return QueryResponseTable(results, client=self) def _make_filename(path, row, resp, url): # Define a fallback filename based on the information in the search results name = f"row['ID'].fits" if resp: cdheader = resp.headers.get("Content-Disposition", None) if cdheader: _, params = cgi.parse_header(cdheader) name = params.get('filename', "") return path.format(file=name, **row.response_block_map) @convert_row_to_table def fetch(self, query_results, *, path, downloader, **kwargs): for row in query_results: filepath = partial(self._make_filename, path, row) url = f"https://sfsi.sunpy.org/download/{row['ID']}" downloader.enqueue_file(url, filename=filepath) @classmethod def _can_handle_query(cls, *query): query_attrs = set(type(x) for x in query) supported_attrs = {a.Time, a.Level} return supported_attrs.issuperset(query_attrs) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/funding.rst0000644000175100001710000000132300000000000020627 0ustar00vstsdocker.. _funding: .. warning:: HEAVY WIP ********************* Submodule and funding ********************* Here we list whatever parts of the SunPy project have been funded by external sources such as grants or Google Summer of Code (GSoC) and the like. Database ======== Google Summer of Code (2013) ---------------------------- database/attrs.py database/test_tables.py database/test_database.py database/test_commands.py database/test_caching.py database/test_attrs.py Net --- Google Summer of Code (2014) ---------------------------- fido_factory.py, vso.py, most of the dataretriever submodule ESA Summer of Code in Space (2011) ---------------------------------- attr.py tools/hektemplate.py tools/hek_mkcls.py ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.5532744 sunpy-3.1.5/docs/dev_guide/contents/images/0000755000175100001710000000000000000000000017711 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/images/azure_check_pr.png0000644000175100001710000003715200000000000023413 0ustar00vstsdocker‰PNG  IHDRGW@æ©Ò pHYsÄÄ•+ IDATx^íÝw@SWÛðç&!!aCHØSDeª8÷ÂmqãÞµ®ª­{¶îªuÖºq‹{Ô…¨¸Áned,f÷Þï‹b Öâû¾ò_ý#œysB“'g\0’$^´UûÅ‚ ‚ ò­yýô!Ʋ¤'#‚ ‚ ß †á‘L®¬”Ž ‚ ‚|K>FuŽ\ûJé‚ ‚ È·A.@+°‚ ‚ uŠêAAêÕ!‚ ‚Ô(ªCA© PT‡ ‚ R ¨AA¤.@Q‚ ‚ H]€¢:AAºEu‚ ‚ uÁÇ¿-ñ-¢Óift†aÔ4¿šq:ÅBOÐHǼøŒÈ月@fÕª‚ ‚ uÊ7Õ™3†xHh4x™.Mbã`FN¾ißåè.?b.jeÉFs“‚ ‚ÔMßj”óIHG$h´Ú­ç pÌ’Ä˵:’Í¢…ø°‚½YæLÚ±fùá¢J ‚ ‚Ô)ßä\£Òª+Ã0:û®d稜H]‰Ç8æXÇPŽ£-¼õñOÊÞçèn§iÚ³*WDA©¾Í¹:’(+'Tå8õ¯¤L¯*Ç“_ÊÎ=2Ãõå j-áåÄt°¡—ª‰R5Áµf¸924Zòb¢Ê¸)äï—”=3ÉÊÉÓç,ùeÍ¥+×õz½q¡¯Çñ ?Ì*.)5Îø'ânÞž¿d¥áÇ«q7ÇNžQ¦VS?¦gdû~¦B¡40Ðëõ§Î.,*®œxþÒ•˜#'*§|nÜLرk¿QâÛwé –®2JüL&ü|Æž»xÅ8AäÒé'¥VÓÓ©Î?eöÜš“,(7.ôOì»_4tOL>œ¿1®À8ûK}“suC§HKY@â@Vü˜±¹t&›Ô•c4A’8N$$IIb8A¦Kp㶉sr7nÞÐhâØ¶6Öï3²ŽÅžV( FE6.úuäJòml¬­­,3þ &“…ã‘(Žãq7 ¬¬ŒÃfÀÍ„»M›„88ØW®BÑëñ‰c†ÛÚXçJòö:¶èç °QCÇܸèg»—˜$ÎÎ:°¿qÆ×±|Õú)Ç8r¹‘ØÍÕÅ(×ÞÞvTô £ÄÏd²ÁÏ'‰{Ev1NEù_åio–0Ç d¥ø©'¥=¶æ\›áÖÄ£ÚÀ޳wàÕs4}X3ÂíË3õo|ŨW _,Ð¥€™M°mà*:ÛÓ¸ÐɱH\€Fฅµ“ÁÆõ8†‘†½ÏÑú¸0y¶ È/ÄÓs5t:†ãdÕ–š¨ËË7oßÙµS×Ψ”æa™LÆÖ?öŠêË6ÿòÈæó‰³s¼<ÜSÿ!“©Ç+ú‡;ØÛ¡R©¹PT\œüøÙÜYÓªÖ¨`nÎ kÚÞgdYZXP‰¾>^•˘DInb.üÕë·înÆ©5ÒétfffÆ©Ÿ!_*“Jå\EaMB 8r¹Ž\®Qâg2ÙàgÂq\œëéþo_YAÿ: ,éà`I_ÔÃ^^Н¹ªŒèl\î‘R§­~eËÇôã'þ{_+ªÃÕBiB¡«8 €«ERÅ]^»»µØºrCtF“iÎ2·Äqœ$F£ázð5yõ‘ÊÛÉ 0,3O§R“ :5®8Ÿ=aÿþ˜\‰„Ïã 5zÔnÖÀ¿~ìñ£°aÓæ˜ƒ‡þؾ%¼uëð¶¬,­† tððQ½N=lè„ñc©òþõýÚµk{êÔû1£FuíÚ¹Cçnæîíx6›}ïþƒ)S§úóœÙµØuJÊã±&EõïWPT”œœâ_ßoö3ýüêým×5¸wÓÁÞÎÒQ5$I2/_Æã:ÌøiáöMkX,üöûŽÖ-›·n¦ÑjOž¹öü•FSÞ*ª_/ ÃŽÆža2Íôë ïÓ3÷8²ö×ÅðâÕ›ËWã„¢l''ÞÈè!žî®ðüå«‹—¯‹Å9þþ~\{{/ÏûÙÏb™áz=$y5.>ª_¯Sg/R+° w==Üêùz+•Gcϼ{Ÿ¡ÓëCƒÆŒÆdš;yÖŒÁ°´´8{á2‹Éæð±2µfÒØÔ/‚ È7ah3«^Ûr¨Ç—_¨~¹¤È)ÔGøq–õ¶÷ã1{oË‘–ཷåìÅoân>÷´,îu™JK´ðbïŒæ9Û2b‹¯¾,;6ÞÉÐàë<ͱò'¢r{ úÏÝìǶ¶6d}¾š¢œ£ðÅ|CHG!tE…/æWNùb8Aâàà8$fnaGAAaci†`$Y¢&ž¤kž¼/W©  H`âÚŠ­TŸzõúÍÒe+è ú¸±£míl7þ¾ùúõ8ãBUIò$±§Î4nR¦Voݾ#=#ƒJŸž³cǹ¹’‹—¼yó¶K§ŽZ­6éQ2þÖäÇÏ S ôõ®賄"oowHyòloÌ‘^=º®Z±ÐÕÙy×Þx–ú<æHlTß^kW.µ³µ¹uçž—§‡¡÷/Ãd2õzÒ^¾"I2$(Ãᔕ•á8qûîý®:ÀŽÝûœx«V,\4ïÇ7oß¿zý²B/O÷î]:òyÜIãGEŽÅÎN<‹•%ed œœ~]:¿Wd׋—¯€@ ÚöçÞ®Úÿ¶jYP@Ó}¼ª|1lN[³bqËæM÷<’#™=ãûe Ê•ä]‹¯\Ç ‘8çé³çÆ ï×»‡É4y ~õ|Z¶ëÒ©ý’ùs„¢’$³s%óæLŸ3㇓er¹N§ËÉ•xyxHe²»öõ‰ìº~å2Wç+q7+·S\RúËš .NNKü4vÔ°CGcKU*“ š|õMVE^îEÅ%ë7m³¶¶™6y éù¶xØ1Êud~1þ"W;ú@Þ/ý¸©K¼šz°þ™WRN\œêʳ¢_œêÚ¡>gÓ‚wRÝõ™®æy$l¹UhÜÌéaRÍ]×@¥*S(”Æk…‘ØÜœÅstLyüÌûCÈ"•ÉH‚tâñdð ë×ã/]AAK-4.T•½½µµ8r€ *ïÄç;ñ 44drY³°¦\.÷νû9¹9YÁØÑ£>¶R«]‡„Q‡†ÆÝˆ—ÉíÛ·«¡ë”——ç“Íswî%6kÒØŒÁÈÌ6 kL%f Ä^žî†%?~*—+güôñúƒ‰ÄÙ66Ö¶6“ÉYQûˆp¡([&—:{èX,•îâÌ—É2¹<  !•¢Õè¸öVŽJ:v2)ù1õ¸=ºuîÑ­så&‹¥Óé3³„R™¼eó¦`iÁ.++{˜”Ü©}NS* ®\ŠÄ,s–›C£ÑœøÙ9sËÁÁþõÛ÷N|Gêh…@( hèYBÑ” c¨ö³²D>^ž*UÙë·ï¦LªH,**vws¡‚6ƒÌ,¡·'$?~ذ!7W’çį²Ã"K jèïG=w“¦®áCm^/çøx{€P$nצ5µ9O ;r¹V–IDÞ^îØ(¬Iè¶?÷étºVÍÃôïC§Ó í¤>5tÐdzmZµ€j4ùêÿuõ†Éê…EÅmÃ[>x˜L’¤ÑŠAþ÷‰•z6ãYÑ ݃ µÿ[!K­­í©‰ùgäï¤:7;†ž ýMï“Þ;’¿újAÛõÙV,ÚæV "í¿àñkEuLnDyÞ_F‰fÖÁF)_f÷¼€ñk_¦K-Ùæ¶£×–b€9sÙÖ–,EQyž\ 4ŒF`@7£iG¶ÑŒéåA§Ó‰ê£Ê윜®;Mò½X,¾|åê¡#G÷í?°võJ ÃÊêƒG&“W3%?/??_ÊçóÒÒÒÀÝÍF£EvëzèÈÑ={@·n]+—¯Å®Ÿ§½¤¤>O7wך»®­­­¹9ëÕÛw­[€8'÷üÅ+õý|32¿,™G’d¦@8h@_ªð{¨è!W’?iü¨Ðà@Ðh4R™ÂÝÍåÆÍj¢ Þ¼{/•É==ÜRž¤z¸»-]0‡JÏ—J9lŽ(;ÛÎÎÖp#íÅKÏJG%F 8bè@ßÅdÀ¥«qÝ:µ§â6›ó.=3K úaÒ8'6lù£S‡ˆ1#‡bvçþC‚$1 Ëú0%–™%ðõö¢šÊŠzuïRRRZXXäæVq4S l”“›gmeiÁáP‰ÉŸæ2 2³-›‡€L®0Œ‰N¯õæÝ+â3Š@(¢â?ÈÌ~:€&¯zL‰²ííì¨ãá¸uËæJ |¼=€ZÉõôÐhµ(zpTôਉdã–þõëQó—¹Baó! L}ñR§Õ…5 5Ù ÉW?æÈ £ê¡ÁâìÜ_—Îw°·»•pïÕ›· PA¾'RJ:Ôçߊ>­ƒíÜî7RH”û;Uù>?.&¯g°eì$3:lŒ+x—¯­œK!HÈ-Äw å™Ñ±'"Íðý’æÞæ]V| |¾¯µ¯Î6p5Qe£am¸ºrÊssvØ=7gQä¬hÈ/:ۅDZ¶2Wi$²r‚’œ £º²MãÍÇ÷õ¢ÑèAÒª{>L;aÒôg=LJʗ怫«+x{yÉd²)?LŸ6cÖõª;ŸªƒaØ”©ÓV­Y·yëvƒñ]¿>Ð#²;œ9{ÎÓóaˆ8¸K÷Z­¶»‰ES¦N_¸xéõë7<=<[4k¦ºþt:­Sû¶'N{ð0¥ °H]Vþ>=ãøÉ³“Ʋµµ)+S«TeEEÅA\»ùæ]:u¦ÁËÓ=áÎ…B™#‘lÚ¶óþÃG •ÉU¥*Çerù‘c§\œù,ËÃÝMœó45­¤T•p/qÕºßu:Ï‘[PPøøiªJUv÷Áø› ÿþ¨°˜,xŸžÑ¶Mk*Å‚Ãy–ú<¼U NIi©$/ß¿~=­N÷,íù¹‹—ÝÝ]€ÚTçåYB±³³—¸¹¹d En®.fŒŠ/EÐÇÛÓÎκ¸¤ôYêsNwóöƒ‡)T¤[Y–PD5åâÌOyòL©,+»÷ò÷ó5*,м>Dr&Ðä5|¬_ÑÔååyùRÃHf „T_Y±·—gqqñÚ[_¾~«ÓëóóeZÖÕåãî]ðöò¸ÿ IUVö,õùŸ{b,,8Õ5hòÕÿ´zv®ÄÊÊ’Ïsd0-[4K¸› …òñÓTªÁ´¯$yy ÑjSž<+)E·™Dä¿' HM©‰ ™víU塤b*’fõçÝ¢„÷ê‚2bËÍ‚¨?%ôцJC@š´bÑh<ÏÑ}TR¦31ÃDÃ`ìÁüw Ë´$ƒåZRÿEwíøZsut¶'¯ý½ÂóuÅi`fl¸ºVÀRÜí- t´·PªçÆàt–UaqIŽ´ HÀ0ŒÀ  ¼8Äß— †AÍ«<ƒ+ýuõ»¬m¬ˆš4a,Z8ÿ—_W¥¦¥5oѼ_ß>§NŸ1®ù‰ú~õÂ[·>söŸÇ›={¦»»;4òðð‰D‘Ý+fËärEAa!Ôj×ýûöQ( nÝNhÞ,lé’E Luý™¾ëÛÓÌÌìâåk1GŽq8œÆ¡!7n&6j`aÁiÑzóö]<.7¢M+koOˆµ/æØÂå«l¬mÚ¶iI­„¶jÑl瞘Yó–xyx”””€»›Ë¨áƒ?­V«ý|}úqš½½ Ðïà‘VV–-š5uärk%ªc2™Ð±]„¹yÅ–|‡ ]:µ[ëŽí"~]³ÉÖÆ& ¡‡¶á—¯ÅGvé$Šúõéî®Îç/^áqhtš»»+ƒÁE†ID¹B¡Ñh]h4Z‡vm¶ü±Ç‘ËoÁá°ùûQe <ÜÜ~û}ÛÊe #»uΓÊ­Xí`gÖ4”Úvf Óë³sr½<*¢:“hò -ŸïxúÜ¥Ø3Bñ¹†IÄ,¨{çŽju¹T&óôp77gõíÕ}×Þ­Vçââ4qÜ'>¿r;cF Ù¹û@ÂÝÎ.NßOÓпþÛwéŸ6Õ¼úŸV¿}÷᩵iÝbŪõEÅ% ÷Ÿ>KkÚ8D«ÕmÙ±{ò¸‘ÎNNéY;víÿ}ýÇ;H#‚ü·•:·¹™`É¢5vg]žêJݬ.½²/wV¬L\  re™ìÂabÐ/Ô²ïŽÜÃãœ6äþtJþ[\AKoó%½ì§Ÿ|Xåæö”Ý#øóÏÈV\R:XÒ'µµ©¼3ïóa;£_´Uû}ÖlÐÿÃŒ$¦ NÆ‹_+ÝŸ¿‘¤ç3@_†Ñh˜VS¦*VètzK6öhOKk‹ÁkuûêjKåÛ‘Y¼dÙù‹—Ξ:áë[å¶µ‚º³Iuw-©­®uz}N®äßß@®Nzùú«‹ µûíõÛ÷‡Z¹¬v}#‚ HÍ^?}ˆ±,¿Ö ìW÷®'æR:¢©¿U_²v4+Ø¥„Æ´" ¢¤H¡å–——$I«ô÷ýÇ”––=v<áÎ݆ ü˸꟪ݮÍ ÒUçêõ›gÎ]*U©ÄÙ¹GŽŸì×»Êô‚ ‚|m_kö«rw Þ) Iðq³õq³U«Õe%ïJK ¼Tª.+£a4ÀhA$­âð1èðŠ³¢_ϸ1£¹\£Ä‚›6»{¸Ï55‘V+œœÆj|å?Ð5B‰êßûè‰Ó‹W¬á:ØGvíܬiÅaAùÏø&W`àAª´SsWê1I‚DZ5ÿqºÜšF”@# 0ŒfÅÆžÇ„[pè@’dy ¼AAäÛô ¯À@X€ãµÄì“ñ¢³·D:=î·=·6,ÈM­Ç,H‚ p‚ÔêšC!‚ ‚ uÛ·Õ1XÛ&üÀnå0ðm/ ªÏ/׋$I’‚døðs3L«ÇQH‡ ‚ HÝö­®À"‚ ‚ ”o{AA© Eu‚ ‚ uŠêAAêÕ!‚ ‚Ô(ªCA© PT‡ ‚ R ¨AA¤.@Q‚ ‚ H]€¢:AAº€ax$“++¥#‚ ‚ ß’Q#×¾R:‚ ‚ òm‹Ð ,‚ ‚ HÝ€¢:AAºEu‚ ‚ uŠêAAêÕ!‚ ‚Ô(ªCA© PT‡ ‚ R ¨AA¤.@Q‚ ‚ H]ðñoK|‹ètš†aõ#AǯfœN±Ð4’À1/>#²9'"Yµ*‚ ‚ Hò GuæL†!ž’ ^¦Ëc“Ø8˜‘„ÇA‡“/EÚw9ºË˜ ‡ZY²ÑÜ$‚ ‚ uÓ·å|Ò‘ ­vë¹³$ñr­Žd³h!>¬`o–9“öF¬Y~¸¨R‚ ‚ uÊ79WǨ´êJÁ0ŒŽÁ¾+Ù9*'RW¢Ç1Ž9Ö1”ãhKog}ü“²÷9ºÛišöÁ¬ÊAAê†os®Ž$ÊÊ U9Ný+)Ó«Êñä—²sÌp}9A‚ZKx91lè¥j¢TMp­nŽ –¼˜¨2n xóö]hÓæ¯^¿¡~|ö,õû)ÓÚuèÜ­gï9s牳³«ÿWV­YÜ8ìÓ8Ž­†^¯—Ë%%%ƵaÏÞ}Q· o;nÂäwïÓ©Äû ݺM»I“ȪT¨J­VËåŠòòr㌿S\\"—+>„Ž]ºQã“’òøÌ¹sÁÃ9 -nöæí;£ò_fó–mT/‹—,+U©Ú´ëpþÂ%ãB'õÅËi³ç§þÿpðhìØÉ3ŒþÍ]ô‹8;wÆœF…õzýÄ©³ ‹ŠÒ?Ç› ;ví7NýlRž®Ù°Å8õ“WûMX·qkòã§Æ©R«N?)µšžNýsþ)³çÖœdÁ?~«¯lßý¢¡{ò`òáüqÆÙ_ꛜ«º8EZʲâ?ÀÀŒÍ¥3Ù¤®£Ñ’Äq‚$$HHà 2]bü©‰Àºõ¿…·nÕ¨aˆ¿ysÎÏó ‚ (-Q]¿~ãáäÝþѰAãj_$0  WÏHx”üX*•¶jÑÂkF“¯5…ß Ü«gäª_1ÎûwNÄžÚ²mG³°°€FÎ_¼4}Ƭ+ÏÌÊš6c–­­m×.]®ß¸1nÂäÓ'ÛÙÚW€ó.®Z³nÙÒEßõëgœW£å¿üw#þ¯ gÝÝݲÜ\]œ9ÝÇ×G”-6$†‡€•ÕÇrÿB‘ÞÞÞ‹–,K ‹è¡C7mÞÒ¹sG Ǹhõ„B±—‡‡qêÿ¿ëÓ¿OOØwð¨­õw}{N{ü4ÍÍÕÕ¨°^O3ÜÖÆÚ(ýsDb7WãÔÏ&‰==ŒÁ "ñ§W[[r%yû[ôóÆÕX¾jý”‰c¹\ã SÄÙ¹^žÕ>/©-žöf sÜ@VŠŸzRÚckεnM<ª]ì¸1{×^=GÓ‡5#üؾ<ÓYÿÆWŒêpµ°ðÅ]Q˜ÙÛ®¢³= }‘ ‹Äu`Ž[XÛ1l\`‰ÑiØû­ “gË€üB<=WC§c8NVm ´´)Ÿlݲ ´:Ýúß~Çqü÷ ë;vìîÞ³}ÇÎ]»÷mڰθæéÓ»gŸÞ=`êô¥Ré„ñcÚªž^¯OOÏ€ÂÂ"qv¶»››q‰áæÍ[ffŒ?¶oa2™YBajjšL.¿zõº^¯_¾tqD›ðàÀe˽víúÁƒŒ+çJ$›+Q*•öööÆ%ª!É•Àû÷é<ŪòamcÝ¥s§Ê)0xЀÁƒ%~1¿z¾N|žáÇïú÷Û¹k÷ùó† R©Ôß³kå“U§Ó™™™§V¢ÓëÍ&Þ¸þ¶â×Ã67§äææ5kjeiAý(Š<Üã$ssVXÓÆF‰ŸI …5 5Nýl¡(¼UKãÔL^mmyŸ‘eiQ1,5 ‚$I¹B)•ʹÆÙ¦(•ð™ñ‚üt8XÒÀÁ’¾¨‡½¼_sU;ÑÙ¸Ü"¥N«7N4ðã1ý>¾ïÖo޵W ¥ •âåIDAT„®â€®IwyíîÖJ`GèÊ ÑAL¦9ËÜÇq’†ëI ÃJÔäÕG*o'3À°Ì7p@ÔèQ# ¸qXÿú±ÇÀ†M›cúcû–ðÖ­ÃÛv°²´6tÐÁÃGõ:]ô°¡Æ¥Êû×÷k×®í©Sgìnjյkç»i4š»·ãÙlö½û¦L>ÞÞ`êµÞðУäd˜9û§ógOy{yUmØ„‹_úë õ»1hȰÈîÝXLæÍÛ·mllçþ<»m›6Ô7¼ÖC¢G¼zõ:%éÁé3gW¯]ß6"bÛ–Më7l:tøˆÑïðù¼  €ó/ý³¨N$ oÕ ÖlØÜ8$85í¥(;ÛÅÙiÚ÷ Qà8>eæÜ1#†Þ¸}G’›0fä03cåºMmZ·¸{ÿa`£=ºu¹pùê£ä'ejuHPÀ¨è!L¦ÜKLŠ¿™ ÊÎ ,((=ÄÅ™?sÎÂ1#‡>widô z¾Þ'Ï\H{þJ£)oÕ¯†a/_¿=}þR^^¾‡»Ûw}zÖ÷ó-/ל<{áiês چ؟F«éá3©ÊÊdr¹§çÇoB‘¸Qƒú6ïÈŠœœøÓ¿Ÿ`meyìäY3c@ÿÞùRÙ±“gÓ32ílm:uhÛ>"¼Rc ×ëÏ^¸ü,íEaQQxËæCö×ét’=ÃÜœý]ßž-š5©Lvìä¹ôôL;;›ðV-jåë‚üSC›YõÚ–C=¾üBõË%EN¡>³¬·½Ù{[Ž´ï½-gÏ(~wó¹§eq¯ËTZ¢…{g4ÏÙ–“X|õeÙ±ñN†_çi~Œ•?•Û[Ðîf?¶õ—Ìè×Â{™I…/æB: ¡+*|Q;Ûnp‚Ä À Àq HÌÜÂŽ 1‚ ‚$ÂÆÒ ÀH²DMxõúÍÒe+è ú¸±£míl7þ¾ùúõ8ãBUIò$±§Î4nR¦Voݾ#=#ƒJŸž³cǹ¹’‹—¼yó¶K§ŽZ­6éQ2}&Íšý“­í™S' WÏÈukV}æÐ ‹o=w7·§OS©²‰‰–––áá­Ý\]}¼½/^ú«}§.EEÅëW¯_o8vâdž$ïxl,š>LÝ¥s§ó~€eK uæÜùµë7¸8;Gú>=}úÌÙÅÅ%&/xÁ¼Ÿ©Ù¸¿.œýœîSW¯]eg‡‹Åâ%K–gW2dð ¦Mß¹{÷Ò_WNœˆusuöÃãB^žžoÞ¼---5ΨFaQqaa‘—‡;I’Baö³´ÆŽX½|‘² ðYÚóÊ%EÙ¹z½þõ›·?L;oÎŒ7ïÒï݈ã„HœóôÙó c†÷ëÝcßÁ#Ù9’Ù3¾_¶ð§\IÞÕ¸xˆ¿u'þ֑Çþ¶jYqII®$ÏÃÍE$ÊÖãxf–`ѼY ýýÖü¶×ëüÓõÑ<’„-· Û€™'ä!n¬—K½Ö~ÇyB*/ý’=c_k®N+¿kœ +ªòþþÅp`b„† 1’$,­íéfæA$<;s;ksœP–hi4`2€Ä0 h– ²øûÕnÞR*•À4cº8»,Z0_*“z|²ÃÉ‹Å:z(ÆÚÚjåê5'bOeffÕóõ‚ vn߯wâ×÷«·jͺ+×®GFv?sî|BÂöíÚÞ¿Ÿèâìhh§Vº¶·³WW×];w€^¯»Ÿô0©æ® ?_Ú¬y3ê1µ ‘N§W.@ÉÉ͹s÷®¯¯ÏÖÍÀÆÚú?w]¼ô×ØÑ£@UVv8fppP©JuéÒe__Ÿïú÷€ç/^\‹ÏÉÍqu©ie'ñáCqvvï^=;uìЦu«ä””ý <ˆš'³àp"Ú„·oQ¦VQ¹âgݧÃÒ#²ûŸ»÷Ü»ÿ yó°7oßõí݋ɬØßàãí=p@Ô©Óg-YväÐ~ýú?q*ö䩨“§ll¬ òÌS bOž¢ÓéãÆæp, NŸ9{óömjQéo/øŸ :°w7ô˜‘™¥,¨vã-†aË—,Ž4táâ%$I.[ºˆÍ61“êáîA’¤T&³´´4Î3E YYZ88Øçäæéôú‘уìlmÀÖÖ†Sµý,ÀÁÞ~dô`:ngk É—æH$$IŽmee™™%x—ž¹zÅ"“ ÍÚdd Ôêò‹—¯-š7‹ÀfMB1:.‰ÜÝ\è‡aØýÄGz½nøÐt:ÝÖÆ:4$0W’Ç`ЙL¦µµ‡ÃŽE’$d E ø[Xp,-,¶n\Ã0õ ÿB±‡‡›a‡hv®D§ÓGhkk\{›M„Hœííé¡*+“ÊdŽ\.‡ÃiÙ¼iXÓ*목Ï_æIekV,¦Ói0zø;[Û—¯ßØÙÙŽêkffæáî†a˜¹9;1)åÓgm²º@(vp°û}ëŸ eÁÊe ¨,“W Ú†s,8lss…B©Õiùò©èsEbj¾$K( lÔÀ™ÏÇÅâl¯*›.2³„ü ߔʂàÀFYQC?++KH~ü,°a*¤€\IžŸ÷úÍ[;[ÃF«¢¢bo/Ȉš„RTòã§r¹rÆOÇ3( Qp`£°&¡ÛþܧÓéZ5пN2ð»ó—®Ìš»ÄËÓ½o¯È€†þTù‡>~ÒP½:õ|}fþ0Ñ8µÒ ~lè_ßÝÕp‰³}¼ÍÍŠœøŽ6»º³žÝ*6êôz‘8ÇÇÛ‹$Éä'©4Vù|+×ÁîÅë7£‡Ü Õh½Ñ\òß VêÙLŒgE(t2Ôþo†,µ¶Ê›g‘š˜FþNªs³cè ÒÏÑôà½#ù«¯´]ŸmÅ¢ inµ Òþ º¯Õ1¹åyŸÐfÖÁF)_f÷¼€ñk_¦K-Ùæ¶£×–b€9sÙÖ–,EQyž\ 4ŒF`@7£iG¶ÑŒéåA§Ó‰ê?¤²srºvî4uÊ÷b±øò•«‡ŽÝ·ÿÀÚÕ+1 S( H’Ä0L&“W3%?/??_ÊçóÒÒÒÀÝÍF£EvëzèÈÑ={À‡ »~žö’zú< ÜÜ]kî¸\G±XD=nذŸÏKLJzòäi“&àxllÌÁC={t§vÚ={öŒ*ùôÙ3pþ°ØD§Uü"q¹Ð¥s§ ë×€L./--uuù›S{\.Ìû™:… ÎÎ&0 -˜Ïã9&&&ý±s×î=ûz÷êIU¡Žê†îcÓ`jX|}|6ð¿wÿ^¯·µ±iÙ¢9Lúþ‡—/_ݸv…ËuÐh5P^®}”œ|;áNÏ=5ï§™,&S*“¥½xíæâœ#‘T7€`273KàëíGŽŸú´Á¢⒒Rê+%ˆDÙövvÖV– …R£Ñìø}¹9 ‹Šu:­­maa‘³SÅ&ó·ïÒÍĮ̀(AþÃN¤”t¨Ï¾}ZÛ¹Ý+~SåþNU·Ž‹Éël;ÉÅŒã Þåk+çRr ñCyftì‰H3|¿¤¹·y׆ÿàF”¯µ¯Î6p5Qe£am¸ºrÊssvØ=7gQä¬hÈ/:ۅDZ¶2Wi$²r‚’œ £º²MãÍÇ÷õ¢ÑèAÒª{>L;aÒôg=LJʗ怫«+x{yÉd²)?LŸ6cÖõ¸xãj¦`6eê´UkÖmÞºÁ`|ׯôˆìgΞóôð¤D Ü¥{­V[‹]‹Ä¢)S§/\¼ôúõžž-š5S]WÖ¤qˆHœMÍö±X¬9?þˆaØÄï˜2uúÄÉS¶ïØinn>~ìw7·6á­ß§gü8ûçõ6í?pЂÃéó!Æ2°·³kqëv¦Í[þع«wßþÓfÌ¢"Œ´nÝŠËåþ¹{Ͼ1+~]Õ³w¿={ö3èô9sç9ú@ÌA‘X¤*S±Ùl{;{êèÆó¯’%W7tFLKd÷î%%%7âovî܉ÚVر};‚ ÆŽŸ8kÎܱ'­¬¬Z´hfÎb>rlæì9‹—,Ûºm‡³‹s‹æŸ¬Ÿ²¶¶€›7oefeõëÓ[©Tþ4oþ˜CC£G *..^»qëË×ouz}~¾L«Ñºº8]¹vãÐÑS*U™JU–+ÉóªþNÿuTÂÛëãR @$öö2Š,ÐËËvî¹q3A£Õ)•J£ËðöòH~ü´¸¤T ý±û€V«U——çåK Ç2BªÁOŸµÉê$I EÙ ê×€ˆðæw$áU'tM^íûŒ¬z>Þ :#3K°ïà1WWgVóšÌÍŠªkP º»»Rÿ@–PäìÌ[[[ë+×ãKJJ_¿}¿bõo99ƒáà`ëÎUYÙë·ïcŽÄRc"ˆÞ½ÏV›òäYI©  åã§©. Aþ-œ€"5Q¤&2dÚµW•‡’Š©HnP˜ÕŸw‹Þ« ʈ-7 ¢þ”Ð?D* jÒŠE£aðÆÕL©ïW/¢M›«W¯ñy¼­[6Qw häááA’dd÷ŠÙ2¹\‘Ÿ/…Zíºß>t:ãÖí„æÍÂþر…z£ü´ëÊzôˆT«Õ’S¨»uë²g×CCž¿x‘ž‘Ѿ]ÛC1û}}}`íê•D½xõòì¹óÁAA{÷좚¬üeyÏÈîç/\:züxDD›½»vš™ýÍ”°¥…Å®ÛëùúîÞ½÷î½{cF\¼x!FÛ¾å÷Æ¡!§ÏœÝ·?†Çsü}ÓoÖÖV<oð ×ãnT7tFLKd·®@’d÷n]¨b£FŽ?n¬ZSþ ñAPPÐÛ¶8r¹ÁÁ¿,_Æ4cÆßºÝ´I“}»kz:m#›……¥<~òêåëáÑæNùþÕË×ü¹‹ëh¿{çoïê.ø»~}ëûÕ;sælQ±é£ÿÏÑqÞÏs¬¬­&%·jÙ²Á‡h>æÐáçÏ_tíÚ¹C‡ö£F ÏÏ—®ÿmcÕª T*ÓÒž÷ìÑÝ(½:……EEEÅ^î8Ž‹³s+Eu"Ÿ±%S(ôps Z±jÆÍ;ýëû2@§×gçä‘#»uvtä.Z±zó¶]®.NÆŒ€¦CxŽÜKWmؼ݉Ïã:Ø;r¹‘ØÙ‰g¸«Hô(‚$._µeûž €Fƒ£ú:r¹}{ußµ7fú¬ù]›8n„Ÿß½Kgu¹úǹ‹]·ÉÚÚjh¥²C$Îf±XNüŠÿ#pÏÎÎ¥¦å ÒPâ×aû'&=ž6kþ®½1á- [Ê(Ý»t´²²š»pùî‡[·lÞ§gw‘(›çÈ5ÜA0K ¢–¶?}Ö&«çK¥€Ï‘ Á@’ÔaJuWÛ+²Ë™óý¼hù_×â;´m#社xYóšÌuwu>ñÊ“§©&³+/¡òùŽoߥǞ¹@§Ó¦M÷,õùœËbOŸ1t@hHŒ9ìÉÓ´EËW'=Jñ÷󡢺£'Ï/Úªýâ3ÿW1f$A0Íhp2^üZéþü$=Ÿú2ŒFÀ´š2U±B§Ó[²±G{ZZ[|ü®n_]m©|;#‹—,;ñÒÙS'¨ ©vÝÉÂHÍ]‰áâì²ñ·µÆß¾š‡¥{>ZæÆµ+µrc‹¯¡c—n<ïø‘CƵ­¤¤$¼m‡¾½{ý²bÙ¾1{÷øëâ9[ãrÿÎùKW‹Š‹G3q·¿èõúgi/š„S/Ó¹‹WŠKJþi#‚ uÛë§1–åÿè‡YÍâžÃõÄ\êOG4õ· áKÖŽf»”ИV$A”)²Üòòr‚‚ +^×â¾¥¤´´ôè±ã wî6lØÀd\õõ|N×óþéæ­[™™Æu—P$ܶã\InÈÈÿÙŽòêÕkê/†gÔžÍ[¶…·í@=Öh4‡:er­‡t%zW=<ñ9H€½1GïÜKT——?K{qëνžÝ:BA¾Þi‰¯ÊÝx§$€$ÁÇÍÖÇÍV­V—•¼+-òR©º¬Œ†Ñ£I´ŠÃÇ «ñl`­7f4ub ²‚›6»{¸Ï55cT+œœÆj|åsº N¸yƒÚ’\ÇT7,OŸ¥:|´YXب‘òþ–Z­îÙÇÄ ©­¿Àa°dñBV>¾>Æyµ§GÈF€‹³3N?}ò„u•M±µ%( a`Õó’ŸÃŒÁ=øâåk¯\wsq™6y<Ú bÒ7¹ R¥šWì‹'IH £æ?N—[Óˆh$A€Ñ¬ØØó˜p H’,¯áw ‚ ‚|›¾áX p¼–˜}2^tö–H§Ç]ø¶çÖ†¹©õ˜IANZ=P³s(¤CA¤nûV£:&kÛ„ØÀ­ãF¾£Íá¥Aõùåz`‘$I’@ an†iõ8 éA©Û¾ÕXAA„òm¯À"‚ ‚ •¡¨AA¤.@Q‚ ‚ H]€¢:AAºEu‚ ‚ uŠêAAêÕ!‚ ‚Ô(ªCA© PT‡ ‚ R0 dre¥tAAä[ò1ªsäÚWJGAA¾ r1ZEA©þCZïFáZ‘IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/images/azure_goto.png0000644000175100001710000000644300000000000022604 0ustar00vstsdocker‰PNG  IHDR0£¿sBIT|dˆtEXtSoftwaregnome-screenshotï¿>*tEXtCreation TimeMon 13 Jul 2020 09:43:43 BSTPÄá IDATxœíÝoLgžÀñïÒQ:q†ÈŽpŠ#Hp7¦8‰“%r-Iˆâ´ltÝ+Q³Ú¬¶ÕÚ«tH‡N§ª:õú¢:õЬ·E§lÔœšj‰Jw—Ü’[ZÊ6$Ð`ÀmLã´F5}‡\pÔÌùî…ùÏN'Ûêù¼²g†gž?óüžßŒ üÀl6ÿwÐ9[΂÷6v'‹á.‘2}‚¼¼¼LŸB„ øÁÎAø~Ⱥ×áÏ“‚ èÁA]"8‚ KAt‰à ‚.AÐ%‚ƒ ºDpA—‚ èÊøïV,§¨¨ˆ#GŽ,ØöÒK/Ý£Ú‚°XÆ‚Cii){÷îÅh4În‹Çãx<†††8{ö,‡ÎTAø2öíÛG<g```v[<_pLAAA¦N/·tߺuëþ%:tˆÞ{ï=†‡‡&Îîâ‰'())a``€K—.QTTDggç*¥*TüÍó’.ãûbjáž]Ïò|µÌ5Ãùûãt ÝÈ@«î=eOÿø£ÕÛ§ØÊØ¢E¸ñõJGÙp¿ðÆËÄw¦Wîg(ãØ?<þQ.Ý£1³¬§ág²¯rûöîãá¿(¥ð$ÑÏ®“ø_‰²Ÿý3ûïû4ùÊ/ûé‹ì—>Àýál¬8.îÉ3‡ùáí·ß@UÕ4~2¯?„«Ô‰ÒÓEbv»‚£$Pÿë|áóáÉJ§¬ï3‰Â]ûÉíê#8¾ÒqAÚ­¿÷3¶xq’Ì”?YKež„:f0:oß2í3W>ËÁØøÒ5ãý4Ÿª'«qæÈ€Jä’—– a4lT×WùU3þyÅ*6G\ ¤dûoiÿdñ­`;èÆµÍ„¨×{ðží&2•Z)‹®·¡æc^oDŠ¿OËë½óús† g‰Ä•3ÝD×ï¡|»D` 5 óÔQ[¬L÷ŒbñÎ˧ íyŽ¿5µóÊÙÔD6Uν/û鋟ÈÞQNäw¯à é÷ÏjÓ\K„é¸ä‘J&"XŸj è£—9í³â~¡ µk”œšÉV$Æ.·Òr!‚†œÆxÎëïuÔ=p…ÉJáJV˜Ž7ZñÇ—W ‰ü‡k©ÙiFÊ’ ¤ãM/þ %\wý£Ì‚‚‚%á¶Lð]5Rì4Ïn2;‹É¹ê#°ðNëÁ£ìá}NxDcX6[P òa8´èBÖÐ’yX×tsúd3ÍLPîv!užâDs3=Zv ŒÔ>náÊ<§üF{²pKÓP¶æ1úÆ+4#m¯¡vGœ¶÷àùÕkøÖWãÞmZÒ\¥¬×úA~sÜCÓøÈ.È]µ}‘÷[齑Àÿf^¿Fþ^7ÎD;žã4žìcíjÊ×/×Áfv¹DÚ_;ʼnæ&Ú®[©*O]ƒËÖÛàÄõˆFǯ=xŽ7rªì…–4tûîzpxõÕW†¢¢"êëëo£@¿e‡“T·˜qîPð÷­ì…è¤n?né’°m7£~"‘gÅ äo6ùp6ç!Ö-9„> éœ7Np(2Ô±8Z<ĵ*±¸Föºl$›Ü½Ó‘|¬ï#¹…l¹â£|Óû¬E6âÝ„T€}}AríEKÒ{«5ØÇ¥V 5„ïêÌCÝåÛ·Xø<ïSý&"¢Ý^ÿ,&­·RµÛFìÚ5–þÔÁ#Ó/ÿ'—üüôÇs‘!ú‘Ñ8ÊzãÊõžJ0G© ³Æ.{i¹I£W¾™{ö=‡¹¹¹ >îLKЇ_ªÅ™×N'Ž5~Z‚‹R ö# ØgR;I‚+ Ü&$¹(MdçM0r~mwùD±nŠ0ü¦ÞI5nÍd&Iдɹ‹5©A˜Öf£Ýœ·]› ¡ÉȆé÷7Óû$² 9Ïаsz_–7ãdsOL$d&¿ž˜Ý¢~¥‚a•ö-šÊR®“êeX ©2÷-×¹ zÏœFÚ_Aõ/C™ ÑûŸ^:‚óË”P ““sõ⫪AžÍ0&oMÎîº5Ó¾ÓÛŠs›‘Ü5õ¼p`®þ±R½šž’îê|­B‹²ÂåLLΜw¥þYzƒ#åũך':䥥3ÂÒ)¢2ysîõ×*Ȳ²âx.kj®H‚”µJ½µÞ×ÖRµ·ŠcjÑ¢>:ζeì¶âž‡o&ŒoPãh‰Ò6xšð’c$qzÏxh¿¾´„ÐçFìmEÉÁ7æV¬«£€üñi^ˆ‹MN f§”"M0¼ä”ÆDB#ÖÕLó…•žNi¨*¬½_ffÂ+Ù3Óo¥öÍ_-T=åB¹ðo4÷Ž\õÇVøDˆîwBt#az¨šcí"ü¯­ÌÅ_ÄMµë²afm]§ ß%¤ꥇœØcm4¾Ö; 7¹¨ÿ‰ÓŸ:CÆq¸ó•Z>T’ óùþåZ²òø/6ÿäÊdÖ€xêõ:T5±âxæ§QjºõV¯÷ÑöFmY2Ö?çèce^ïK+«º]ßÙ¯OG|}¨…U¸ Uú.ë¥V×À^nK¥vY Ž×R±)µ78Á²« ÓHˆ1 V±îÞÃ×–¤ÐéÒ> 2’WLù†Ô{ÓœäuW½ÐÕ Æ’=XÖH˜wÕàÞ¹4å Gɱ;1eå…3Áa¥öi”‘×ÈÈr‚Ø©IlrV`7HÈk–i„d£¦ÎMÙúT9c£cè}öº"g{9 @ÁQf#®›†ëž{©X °°ìë‚k”ç‚Râ¦z£ïB .ü‰¯&7æ¤2É‚£p¹P´òøs v§5UæÛ6Ž ¥?ž«[¡Þ›«¨{º³$UFoLdtg4sزe {÷î]õ˜/¿üòö ùèKTá¢ß.“V…Ï·ÐóW5ÔÕW#eAüZ­ÓOûµOCh»ëIå‰ÏÃ(;¾Å=Üx7­¿3á~ºž]hãA¼ou3Kèi{iÙèÆýËz¤, 톟ö·–¦»czéØâ晆]hã!z†F°+Ò*í#x5Æ1÷?qìÝßp¾s”Ú§°« F}m´}h¡öñ£”ýwïÒ6hAº?tàþEû³€©8ïü¬!E˜®ÿsõ©O+>ï µ3;“‹qnqå÷‹Ãp˜ÀU ·³‰M6dƒŠ»Þ>½/Î…“'èöwÑUêæÙ_36&pmɰø¬Ò?ßF”à—N~þ\ Ьþc+¾Dú㙎eëôqÁáæhý¤$h‰çÎf&k€ þiúÒÒR:„,¯ü ºªªtvvrñâÅLTCî î竈45Ó½â÷G¾2–9ô÷÷Óßߟ©âAȰïì3A2KüÇ+At‰ÌA]"8‚ KAt‰à ‚.AÐ%‚ƒ ºDpA—‚ èÁA]"8‚ KAt‰à ‚.AÐ%‚ƒ ºDpA—‚ èÁA]"8‚ KAtý?>çG4ñ5þIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/images/azure_steps_in_job.png0000644000175100001710000010560700000000000024314 0ustar00vstsdocker‰PNG  IHDR‚¿UÐúsBIT|dˆtEXtSoftwaregnome-screenshotï¿>*tEXtCreation TimeMon 13 Jul 2020 09:44:11 BSTp Ê+ IDATxœìÝ{\Tuþøñ×&:àeüb«Á”(&Š‚ŽÁŠAá%G¡ÀÄKš´bX$m²l…¶JšaT˜&^/ -ê˜*‰+»Cá2^I]/ßÁÕeøÊ:Šp”~ûûc@媠Ù|žÇ<Î9ŸÏç¼Ï™áó>ŸÏ9sü^¯ÿïõë×yòÉ'A¬Kii)<è A„K$A+' ‚•‰@ÁÊÙÔüÃd2=È8A„DŒA¬œH‚ VN$A+' ‚•‰@ÁʉD ‚`åD"A°r"‚ X9‘A¬œH‚ VN$A+gÓt‘_‡JÃy®-àú?O Ÿ@æôŸìOç^Ø*ŸxÀ ‚ <¿©ùÊzôèñ ci3eû²(ùfcƒë騑îc‚±t£Axðnܸñ럺°ò“F“Àÿ»~’o6raå'÷)*á®™¶2{€šU§ŠY5q3ÓJ[;ù øÂ¿á„~yöÇ2À?¡î¿Ûˆôm,Ãý†3dðfoOÚÖ¯:”íËâÚ‘‚f—¿v¤€²}YmQËÙó1³_ÅðaCÊ[ɹÔv{¥ä~ù“Çø3dØpF½4›wi~ãg³ù:¯5:Q?¦er¢ªšjÁï­&æÙîmÓ¼ý–ø;é¿ï_w¹ÇklLšJÿúkµ Ù ‹ùû4渵áF¡Ú#r¹üAÇÐ&* çï têÕçŽr·/+ÍÜJ¥á|›ÆÖlG>æõ¸|œ¦.&mG⸚þ±ÕgÀÅ›cyk›Œ—“5üãïûHy£7ùzÏ ›×ü‰ÌÏIÍ»pïqJùlYšÉ™÷ÞTËÈèî6Œþm”dß'~9‚5j£ĉÔVå7=¤5å¯"!õR+GpûH S¯> þø -ý‚v:Ó®Sg-ý‚ÁQ'ü¿ë×[4ŠhRÙVf˜Ìç»ÖóÖd5£üQ¿–@öÀ”Éìaþ$äYV0ñõkPz“M&~°€˜&{W3'š?ßÐèõ©iwO,‚ªoµìyµôHGøxÜfn®ñÌêÉ þüŒ®kÖF‰@†£k²çÍäóF’)ÿsfÎ˦ƒ«#²VŽàú?OÔy_~®ˆkçÎÐÙ¹æÄ€ùÑÙ¹×Ρü\Q£uïI;èÀI¶ì”˜³FÃwÙß0§{.oÅ­§X@ðˆdîÊ­-_–Í÷{3ftänc˜6ºõ±‘(=²ž­ùÝñ}Æ<)á1"YÞV¶ž6A•Dqn&ùW‡0´é£Ùÿ÷é, N“ÖðÌ·ñ ˜õï¼EîãsØpàüýëÅ<ûïÏ™ýa.Pš‘@¬Î•¾ÙÇ?þþË_”±-.™ `ñúiôÆ—9ÿà‹›>O–¾gæò øÆo`ß_³H‰“ýÖ«|~²ö˜åoÚF÷7×¾ã;6Lµe딦çä­×øþÝ5àßÛøªðY–mÑðÝŽ$þ˜Ï·7cÊMæÁœwƒ¹°2‘Ì2àß[IXw•‰ñ¯ÑßjîçkcUFŽíÞÄòe‹Y¸øc–oØ…îRm–­º¤c׆å|¼x!‹?þ”5Û´îæä )&ëæ³<çâ­E§5 ™?~ÝWÒ m°ù¦´Ù5¹êmV/Q‘Û@20'\|—¬æmUë²knµt,þ·’AM8ÿ‡;ë^hý©!ßñÓè-èNÀ‹ÏÒ]—K¾IFÀØØ—Ivuodúk6?öÃè¾µuMÛg3dðügoEþæ?k>^ògãXö‚‘Äàá <„QoçÒ?~>ÁŽw`á6¶ðÚ[¾8Éûþ¼£ãp²¨-ùén¸P¸—/?}•·:|Ã'£»S¼=–¹{œˆÛúcœe\Eì¼×ùü·æx´0Äóg(–²ykpæm+<¸ðo?‡i»ç˜É o_|Șç<èÞâoÐ.\Çgœ-–u§÷ã2Š/œ8þöÑÚÕ6è@%7®]o½ÁzMìw“&êrÉÍÍåûÏ^eUÆ6|9Þ-ÛRý~®Ž¡­4¹÷¦C ÊJ·@ÊŠ¹p]ŽóèeXÇ֌̚Ù3`THÝE¦k\³ùºt:ô¥ïc8Qp–¿s¦ó #º“±ïçc>y0åèõiL›5Šv±|C©—G2uÆëØß8AÆgäöd\¿B¸q–=»/1ðE5=Z&‚ *Ë¡²XKÚ±Ó\ºûã8’¾ÿ”jÙº·ŒÁ3¢xµ‡-•ÿÒ’¶q+Ú'^ÇÏ¡õÔ}¹}Ôœ |ÉQ£ŽÉÅ7±íGŸ¬{s_§^}n%cñ¨3MtûC·×½wFΜ·˜‰¾p#Ýq¬¾Û¥ÿ¸1ôþ[6[¿Ë&ßk4cª—ùr2êÙuæ°mÛí,Û®;ˆ•ª¤ÛÖ7ÓãŽ8•qæß–•R\3s½“$ÃÉ3€—ß\Àêô8þŽ@®šÃêÄ×xÍbЍ-uöðâ»ÚS«òsE‹ÿ‡ßŽäçòkü\~ÃoGrèíÙu.?bב®Þ¾­ŒÃŸóã¿%¸~†¯7ìåêˆ|kÂsfŒk.ÉËóñpë¶D×OqcûçÄo?Bñ¿K9“ÿ5‹6¡÷3¾ôÆ _ÿþœüK Ùg%@¢4ÿs¾þ[wüžÔ¼¨d2LŠ)5IH®˜èq„Ô¶rÂ\/&sᫌÿÓVJ‘È^ &ìý­Õóôź“\hçˆãoŽ2d”ræ¬ S“ÚdŒ Æôíç¬?bBª2qæÛÙRØŸ1£ÛðÎüF÷¯ =áHïÒè¾^š»ŠÌ³µ#ŸÒí‹H,žÀŸ^éǬ8Î$²è[‘ Zé4»Ö¦qö‰Â×Ó¼¬ÊÀžÍ™T˜Æ›ïÎçÝw~ÏÈŽ‡Ø´í·ºvÛ.t®îÙØ`CºÜšž´Áƪª*êßæ¥ì*ìÁhËÄr‹¿oòúË#ð¸Åc}ñ Iÿk:NCév=Ÿ}Ì—›v°ïÇ[÷ÂE÷õerÏ—yù>$[åt\gٕ£w”»ýŽ¡îcƒiÿ¨¢•£éΘñŽl‹ bˆÿ«l‘ÆðÉ»Á÷¡wgÌ ƒ0I*Æ<[»TæÃòE¾˜6Å6.ˆ)ïoƒQŸ°üus‡ÙÿÕe|òœ‰UQA 6’)‹ðÔ¿ ηyS,ªQÁ8ŒGœ@~•Ó–|Á³7¶0;pC‚"øúú–/ ¦;2b—1­¼®Âa#‰Xi$àã¶`‚ïUÖÏÅÜ¿4ýƒ6Ùˆ¾˜Ù½óF1|¸š·Ò`—_ðZß&«ÞƒÆö¯ 9O$æ÷ÝÉŽògTp(±S1qT*«*¡,“EËð‡9xÈ€ŽÃˆ™ëKþÒE滈„VQU’ϦµÊ„ñ꨾ܚ‘/:Dþµ§ðówÆÞl:öÄÓ0ö'tüT“ 4r`§ŽîÏ¡¯m3«tèŽB^EÙµJÀžê×y{v>½m);–É—Éik£™ÿ¦¤¤ä¿—.]úÕ>kèÂÊOšý»€Î^8Îz«u0meöðõ Úªi´£;²l³ËâøûŸ[{4"Ü•üüß–XÜFך§˜õ“Gñã‹ç‹ñâçkwå?ÇH[»›À©„ °¯»îÔnƒðØqܺu¡äË¿8ËÐw¦¡º¸ƒ…þNÍúdÌßC—™oòœ@%ºM‹9øøëüÞ÷¶“ÇÒ,O>ÀÕζ·FU•ר|Ä–ÎÝ}˜öŠ3g÷ž Ëðçèÿ?Õn#í£Lì^Žeœs•7ÀÖ¶¦vV}ÊY·™6¬¾‹ËwïÆ¿þ§:Îz‹²}Y”îÜÊÿ«¨Þ⻎tû€:'™(Î_Å¢´.LÛ"’€ ´žJt»318áÕ'ÚsÍT;—oÓ±3¶Ê¾ô}DÃÜÁ(¼•t®2¢Ë=DÙãCé{¯ì»ùðê\O,ï øçî$òäaL®¤s‡«œ¾˜Of¦-¶Ï{¢x¤ŒŸ¾ßljn*~ï × 6‘tPAÈÄ‘ôïfKei1Æk¶ØÿOs‡-ó«Oö#ƒ°ëÛŸkGê uWoß6˜jŽR¾žDâ™ÞŒyw¯97]£y~$!`.™ ÞÁèÈ´5ém2S¼y&a+ùAÞ3 ø{B@ëo¸-”eòº_6½ÃWßù¼¡6&}ËÈ¥¹HWAõâ}Ýô¯GÕiNœ¨ä|z¤îªaó éßõä«ìù~+óʨz¤ çÁ„¿èƒ}ý-6ß#6ØÞv[h ƒ-;›oeõ §j÷>v¬=ÀÕGºÐó‰Á„Oö£ç#ÀÐÂL™ìKM"ãZ¶òž8 ã¹~mÓeÿ꧆A„†YÅc¨A„ƉD ‚`åD"A°r"‚ X9‘A¬œH‚ VN$A+' ‚•‰@ÁʉD ‚`åD"A°r·­mÛ<ÕNAøejß¾=`ñôÑ:СCKþçUAáaW^^.¦†A¬H‚ VN$A+' ‚•‰@ÁʉD ‚`åD"A°r"‚ X9‘A¬œH‚ VΦé"@EEW®\áÚµkTTT`ggGçÎéÚµ+vvv8BA„»#A3F.\¸pÇòk×®qíÚ5ŒF#=zô@¡P<€èAî˜jÂÙ³gëM–~þùg.\¸ÀÙ³gïSTÈŽÆY¶¥ën£[è‡ó›Y-®×u¶Ñ(ÉjgÂ7[9A@$‚FF®\¹ÒìòW®\ÁhlíÎJB3ËÕ{Íì†=£Èør&î˜ÐnÔPXUߺ¸ÛzMp›œÄ¦7|Z¹UAZJ$‚TTT49¨Ï¥K—n]Cx º¹à9X‰@Ò²a¡½TϺ»m³ÉzyâÓ§µ[¡¥D"h@sG½{÷ÆËË‹víÚæi¢–Œ"ZLÒ0Ã9„äì4¢CÇè¯ÂOMÚ©êõ5Ó8UYD{E“%å0o˜+3¶˜î˜âÑo‹'Úø¶•¯fpöôYóëxýd¸¼ Æ ಆèYl_]Kþá#ä~96NbÞ¶†RA-i÷<&}b`ćää²ivW²"'‘øSm™ã_§#M[Ks…”È÷Ñ4Ý´ ü2Ý,áðÎu,ûpï.XIJ5þëæ E$‚Ü>½#“ÉÉd·Þ×$ªª*Nœ8ÁÏ?ÿÜ`ÝÖ'á31 ·NrüŸqG*ÒchI½¦²9'qJd62CC êc ð§fô¬6€„ö“y¤¶‹ i®'2À°-•)ÄsAf²>jb^v#kÛöG5û³ý ]'Ä1XÌF†òùBëÑh k‹yO!ÆW‰¼“Ï×"ð¯Ê!'¯%;-¿7Ñg~Å_ÎÈ>‡yoLÆ·söpþD#nm&wwó¥Ò'NܺU´& \¿~ý>G〲§Å[™ $©þi™8¾-‘å™LæšW.‚»Ô¼V¤Üb7ʈÚƒ[u~4œÓCn<Îñu ÷òÂæQC½ ƒr„‹Å2.½dŠõ€'..ëeJ” ‰ÂKF@ܶ+†»¯šqO;Ò¾ ¢‰ vvvu¦xJKKéÑ£ h4 < ?.3~3«!nuSÊ1ߢéG³N°M9ÄÇ¥¡xc'QOY,o'ƒÑIœ]®n «›ÚQín[oCQš <<º1hÜĺ‹®\åšM7ä’\Òv]fȬ¹Ì~ÌŽŠâl\—Fn¯¹ŒìÑúш©¡tîܹÎûóçÏߺ5´©‘Àíu‰Žë à™)ÕI(/¤ð\sjšÈš?í=cX2ۥΥR §ôZ.¼lÄØä C‰“Sõˆâ#ús.NÊ[K ç,&¿$†‹2zˆ»Ž„_é<™;þ­¿?ƒd@eU@ûNæ“J;'?"Þk›$"4¨k×®·îªqæÌΟ?ÏñãÇLíÚµ£k×®÷#Ħu”!£}‘ SyÝUÊÇ”H?å¡+L…¤¼“NIO())i´ISæû¼¿§/qFàR…ù¬½úw Ê Sñ¿”JÂ*& ¤â¦û2}¾±&ã'†qe[")‡LHU&ôÛ±á˜êqµJÒþÕ$4"U™Ð­Ù@N§ ž÷néA„_˜+'Ñ|¹‘¢^aLÖѼìqožx•Ì¥‹øl]»µÇ)iÃK"4ÀÎÎŽ=îL¿—.]Bjd½G¿œ©¡^A„Ž0‘2É—È-u;c—iqDõÌaºªÐDL/-!éÕ ®¬ŸDx#wÎ. Ær-ñÎ8÷­yÍ@StS³$%yf4¾®¨BÑ?“ĺ×\l¯†, Žu³d½á‹Ç "7@hê:¢úU¨ŸW¦ }1 Õ _fí•üþbfHxˆÝ¼”Ǻ•\ö˜Lä8WºÜZÓA/ÎåOÑaø¹ØRvXÃgË6r¸îLÿMIIÉ/]ºÄ“O>Ù6[xÈ={¶Ù¿ èÚµ+ÎÎÎmѯ‡n¡!Æ8Î~ô C„û¯ì0WîÁfÔL&êVwÝÏ7©¸vv5—†/³/ù#Š<ÿD„O—;šº¥¥¥bDÐgggï˜&²Ô®];Eh‰rÇ‹JPÈÅ¿`*8¸SÃùÞÏñœs{®^¹zëUq®üŠE+wq¼Ô<TQò¿”\µ£›½m›D#îj…BAçÎ| u·nÝèСÃŽòa¢'yÒX’^ļ%ž5$X¡›§8^XÁU¶ðÑ¡º«M^Ìħ'2ù?ö¬ùˆ-Wob×õ1úø„3º[Ü<*¦†A¬š˜AD"A°v"‚ X9‘A¬œH‚ VN$A+' ‚•‰@ÁʉD ‚`åD"A°r"‚ X¹[»qã•••2Aá>jßÞü»[‰ C‡â š‚ V¦¼¼\L ‚ X;‘A¬œH‚ VN$A+' ‚•‰@ÁʉD ‚`åD"A°r"‚ X9‘A¬œMÓE€â²bŽ^8Æé=ÅeÅ8Ù;Ñ×Á…Žp²wzÀ ‚ Üß”””ü÷Ò¥K<ùä“:–_¬œSûÉ8´µÁõvííí> ÿ~#î_P‚ ­ ´´TL 5eUnJ£I âf‡¶²*wõ}Šª’†Hg?¶AÛÙÑ8«âѶAÓ/ÉjâótÍ!aÌK#áÍpÆú«P©T¨|ÇþN"šŸL÷Þ¼1‹Xµ W÷RÎ5£¼)p÷H²¤{ß´Ð:D"hDΩý½p¬Ùå^8JΩým‹T”EâÜpU¸ºz ò!ra…­ðwü@e‘šk|ÐQ´œIK^‘Þž:&TÉz/„IŸÿ„Ó„lÎÊ'??Ÿü¬uÄxCúë!D︷ãoܵ´òñ¬=°™©½šQ!/‚ÞøÈîi³B+‰ ÅeÅMŽê³ëøw·®!´é§d&G“uÝ›¨O7³3s3+cÕt=˜@Hhº‡øÌªP“Èê¿t-&ååQàùKïÌ$´ '‘L ›7/`êä5ñvRà9!†MfbZ:´{ÈWþ¯zõÁ«›Œæmžoäw¿I¡•‰DЀ掦…O_þ„Ž:æi¢–Œ"šf õÝD =âØ¼2 µ·.}Üð|~*‹7'1Õ©„ãE5ee`Ð쇫»~ÁѤY4u1‡Ä™cQ¹»âáHø{i–×®6îOdFÊ<âPG’œWÿpÔO GÉGÍÈt0…èÐ@T¨Bˆ^¥¥¦¦ö=®ss,jk‰W9 …Ÿ%d…ÃúI¸ú' »cK…c ñWáêꊇ± ‘Œ©„;­3aÜ޳:ÀþX\ÈÚO¸:?cg¥ «Þ_í|濫y/œ±~¨|ǽJgn{,î‘hÊ-CÉ"Ú݃Øýæ·yZ\†š;3S^2‘Á~x¸»â¡ $|¾}€žÄ gf|cqO%è<ƒ4 i˜áBrvÑ¡c ôWá§Ž&íTuÙÝÑ8û'¶%š ?T*?BÞIC/& 3ÜUÄçÖùdHêLàÒBóÛƒ‰Ä bI¼?ŠòBÒþŽŸÊ<šŒÏÌ!1ÀDSq ¤o«NÆÙæã–¶*?÷@²üÍ®Ú\ÚŸEVÇñŒ{@OÞÕ:ßLÐMä>I¾fžGç¿¥y§Ø2ô¤n2±n'{s²‰ë¥%þ³êϬp1•ô³SY—u€üì$¼ŽÆùY!ȃ}Vbû·IöòwìÎsA=Î Èúz;.¯Fáfc$íÍé¬f ›r¿óÛæ‘zÉÏ'ÁÅÛCauò°ʲØaeíÞ ¢ži<Ó¿¸Bèò\NÎeÓr¢f‘rÜæî$ã5øÝŽÏ ¢WÇã²–¼óÕSj6 £Ôm1_ïå€6“˜î9DÎMáá#6àçËßõ b )ªgÝÎu,[ô.﾿ˆeëwsòʉR$‚†—]¨óþÑÎòhçGo½¯I×oTðñîD®ß¸Þ`Ý{r®}éãÒœÂ>aqõ‘#ëäBØh/¤"½ùêh:ŽëRtscêã±Ý¦!§ ÛÒÑ>9…˜q.È;ÉqQV? IDAT›GÒ|5.?[4oÒ?3ÙkY`NK†méhû…÷’r?FÔ‹J´š,îyæßdBdöæIùÀ6ì%ª_3ë—»úFõD'OF •qú¬E’v bJõ~ÈúM%ÔÛÈw-< §$çÛíµ#›Ý98ŒSãcµèŠ«;³ª+\¹.CÖ¥+2õô!fëI6M¾#m7@Âgbnäø?ã^û™H^¨ïiÞ¹'¡ãÜÐïÏÁ€Œ  £`·æÖEWÓ÷»Ñ>¥FÝ €ýõ"èyJaùÑ‘,˜dþì;¹6¢/&OO¼l€®rºš®Ô&ŸË FÌVãÒSŽÌFbûÆ4^Ž!ì)9ØÈPÄ1åišoõwîNÇCÊÓQàéYgJÍÿÅ\d ‚^Bqp?Ú‡ýÚ@…žÌ«Ùwã·(êéi/ìßÈ–vø†ÏeÞ“ñ~älüú·Ÿ{ÝâwÍôþ ïÿåãÝËèÿl$`¸Ü†ç/62 ¹ÿ—´Jeí_˜L&I2ÿŸÓc²ˆì«¹­Ž'†K 7èA©´u(ñ™ ¬-ö³ž QÛÉ’Gq`rmV2ôÐ+‹’¸(•p¾˜{ žBÌèÌóW‘î=ÿ#POÂ¥¹“Ë”8X”•µ“aºnqA¥— µ{"ÇA!ÃxÑxâ¬Æm•†í§2U‘Ãî¿vE½Î°BàOT¬3bTø­ñÁç™<¯ÿOs/8 ìiñÖò3+qéV»ZÙS —ŒåˆPÆwš„f·DÐ8‰ïvkñ·ÀüY˜ :* •á`%ÏDÔé| ç ¸ ð2'˜#Wžµóû2%.·b2P\ …ß⼬nä²nà¶3›ÆGÁZ\žŽ²¸>à€ÒÙ"°ž ””`¼ýE„Utó›É˜%lÉ?~ÛÊóÎ/Á}L$C{µºáüÇårø’#{ÜäÂ;Ðäžä_W*hßõ1Ü}ÕŒ{Ú‘ömª4ÀÉÞ±Î{­^KÇyÿ…w›L·×½'½œè‹žŸ X_ÕÀòÛµ“A·06=ËÙ:¯ "šó[¸ËèíGáS”Bbfãçú·Î,òs#ëêP¢þh/ùYID<#Ç yŸ±‘h.6·>_¼¬ªäöëì2Yu>a¨èÐì2ÀßvóBz yUÁA-.O×^ìt™¼‚Ú,xÙÙ?Ó‰Hlv+ÒþLÝ«$ɰÀ“Ð Jrve!™rØýƒêqÕ)Ùd¢²“ 9 I&d,zÕòRwpégîÄu+À}¨WízÛ;Ž›ÏüüÛ¾7g9ù‘½!7|<ôäåÏÐÛ’Çmßa YÜC¢«+Þ»Õ¿îê¿8ÅÇ”Ýz§ÇxüÑÎß„’\Òv]Æ=|. .ä—ݹ¼7ÜKmªH èëзÎû´ƒéhõæ›Æ› Ü^÷ž(Fñ¼·Äö/ê™7-×?Ö¯y޳ååÓè-;QɈ¡zªTº€^Oí`ß@ΚrÎU¿íÆ‚O“ô®;9₩:({¹˜GÍΪØÊl‘~¶èÊÊk·Ù¤* “IBÞËõ«q$mÍ ªgé{ŒÐQ† É"©”Z82;Wl· C±„CÏš±‚ñÁ>èvg‘¶û;”ãÔÕç¾…äåÉêtf¦Ë&èæ‚ÿKQ,X¹“u“!í/9€¬æ¿ÖÅbJZcùi y×pÉ=·F`nÁj\ög‘¶# íÐqŒ¯Ò)p0)”ýÝ o·yºÅ¨#ùtŒ=eÈÚéh2‹þæÃÌq ~+qé§OÖ=£5]4Þ‘D›<µh/ùà9زt ús-Š)ÁesgÖVåTÒ»Ž– åØu‚Šò«PYAо“vN~D¼7—‘=Ú&‘0Ðqvííê,[÷÷¯HËOçƒoÿÜ`°koÇ@Ç­‰‚©ñ1x%>5´ÜBôE…èv§:íC™âÛŒ1ôS¡L¬cuÍoÊ hÞ›D`LF@9!Ÿ¢T7ê0šŒnI`Þgy˜jš®>ÃW¼´„†jyÿÕõÆ…â_”Nâ7zLU¦£©$~cÀ?x< @éâºýhËLè¾H§ SmX2™Œ+ÅŒ&鎎ŸeªÐ²Î™©H‡Þ(Gé(‡N}Qö4Wsëi±†”ï[x¥Í˜Eò–BLUÆÜdÒ* p«=òãBñÿ)™„].¨ÇUwüÕ™wMgV”Ì$¿é$檀˅]Aé¤pé#ãx^ŽùZƒ¤'e˾–ÅØIæ³, å g‘¼UgPPí^Ÿ0ÔOåø‰ÿq£jgSd>xöѲÿ ÈþDÒñj?_OE>s ‹'¡_ȤL]×Èm°2‚&†Á·É$æš;ãÁd"džx°žâé‡< ‡z›¯³X´_°%íE Êõ¤®ùÓ³Ïã_ó)×’ò^b;‰ ¿‰'þ‹!rq‰ï¥TÇ7^õð¸7Ï ¼JæÒE|¶.ƒÝÚã”T´]4"4ÀÉÞ‰Ñî£îXž}â{þïÚÿ5Xo´û¨ÖîP¿6e¬%´G!«çMbì˜IÌZšÏ.!ãë(Üš5ŒVñÙZ‚¤ L÷qÅÕ/œÔr5kÃÌŠ"Œ¤ä0¤³ðU0ýk˜º2 õ#[ê?/ÁçhÑ  cÉ 5ÒW“P RðÎn^Ï i¢¹«RLˆ!nàqbý3ô^S˜êÄ­é!Ÿqa(˜G@P<ÚÛ¦““Xñl ÉS|quu%`f*¼²‚¸àIT||‚_@ cçë }ŪhðLõ#B Ò'0v˜qZ\bWcy¶Z}gŽÉMÍøêTúAGáPoóEV€>Q$ýÙÂE!¨¹âÍþ1¬xËôúü/&àÈØ—áÅÜ‘š?¥×q¡žû‰òÀC€áéÅ,™ayEFÁø`/L’êçäu–‡Mó$ka"…’ÿwײ7ç{Ó“˜:XŽò¥$væîesRê&®gÈF,`åú¢}?WƼ—‡Ë»k‰ZOáFއ6_‹ËP¯Û¦þÿ’é3}q6‰ 7ƳâÏaµe®ëÙ¿1 ÅHÖ—JjžÅ‰˜Q‡fã~ô×yxt’Ó…«T\µ\h¢¢äºÝôâ\þ†Ÿ‹-e‡5|¶l#‡Ûè®"ñ¬¡&¬ÊMiöï:à5߈6ŽHh º…~„ã8ûiP#¥ $«)|%ŸÀ•Ëìhœãº²)>Ó}èÇô²¹cÎÞ„öÃéÄþMÉ”·"ï톢HF=yYìØ˜NÁà$öþñý<Ú”Æ ÕxfµàN°‡ÒI¶Ä¥a÷j<ê>5ËΓ¹$…²Àx&{V_'¸šGÊ¢ƒô™û#½IÅ °³«¹†p™}ÉQäù'"|º´jt¥¥¥â®¡¦¼æAΩýì:þ7뛉‡ÎýúH&#ëcI1MeÝ ¿ÐÛW$†¼dÞß$'BSß…[9>Ì`Sn*6½Ï¤EJL ³Wâ>Їs6±ÀWYO=¡UH\­¬®RT•_åê CºØ=ÁP•ŸíÍ ¯Ûs¸w¼Ì¡Ì}ü«ßsLt€«?|Å’<&Ny÷îvT”ü/%WíèfoÛ&¡ŠDÐ þýFÐ×Á¥ú1Ô§oýNÀÉÞ‘¾}æ¬âÑN6ÑŠðÐ4D«æ¡íåOÌò<‘%FR§û’ waüŸWÕ§á’Jß©ÄùN%îþ'W 6²h‡Å¯È6/â `§šI|° þÓ™XñölZF¦d‡C?o^?”.OOdò4ìYó[®ÞÄ®ëcôñ gtÿ¶¸yTL ‚ X5ñjAA$Ak' ‚•‰@ÁʉD ‚`åD"A°r"‚ X9‘A¬œH‚ VN$A+' ‚•»õ8­7nPYÙÜÿWAxصoo~ˆÝ­DСC:tèðÀAî¿òòr15$‚`íD"A°r"‚ X9‘A¬œH‚ VN$A+' ‚•‰@ÁʉD ‚`åD"A°r6MŠËŠ9zá§Kô—àdïD_:ÀÉÞéG(‚pw~SRRòßK—.ñä“O>èX~±rNí'ãÐÖ×Ûµ·c´û(üû¸A ‚ ´‚ÒÒR15Ô”U¹)&€Š›dÚʪÜÕ÷)ªûÁ@²Ú™ðFt ýp~3뎷Ý6ú÷/Í/9¶†5ö. Äy–é>Ç$<8"4"çÔ~Ž^8ÖìòG/%çÔþVŽBB3ËÕ{ÚVhË„v£†Âª{kÅmr›Þði…xã@ØŸ7÷¼¢·s¯Z§¤G³p>¸z¨œOÚO w¹…Kqvv¾ó5&ý=D]ç3” ÑlÑaº‡öî^ë|'…{#AŠËŠ› Ôg×ñïn]CøÅ‘´lX¨A§z²^žøô‘·NL oÅ@Ü~éy EqJhÎ`^žQËw’›¹’™ÝµÄþ>]5Üfo&_›oñÚËâÑ \¼}p¹—¨-?C]:ï§påÚ»k­ôîH hîH`úðWøôåOèØ¡#`ž&jÉ(¢Å$ 3œCHÎN#:t,þ*üÔѤª^_¥G3?œ@•®îøG’œg‚ª,¢½¢É’r˜7Ì•[L€‘œ¥‘Œõ­.«®.Û„:Ó ûcq H kG<áê@ü|TŒ•‚®¼&Cu<®xø†¿#‡Ä1ÎDnkê/¿ž)SÉ3ñpwE4ƒÄ\‹u’ÍÂŒõõÀÃ˱ÓãÑUoãráÎ!$îH!2ØcàÔx²,òµ)/™hµî¨Bˆ^S{†\ø¡L#çÃŒ DåHøRmõúºqjç«ðx'Í{ጠðCå;–èUºêi–Œí<‰zwêÁJNž„Í Å³XKACç(zÖ¾äÅé,?4’¸·<ï(š3׿…µ)Ű*gçpÒ.×,Ñï¥">Ïâ3Ì‹G5=Ó±DÝCH.ª.Úî ŸÏ ÐËW¯@fÜÚß;IGS‰ˆÊÝWU áïiÐלá7vìëýN ‚H 8]rºÉ2Ó‡¿‚‹7ð›×½2ô¤n2±n'{s²‰ë¥%þ3óœ®qK<ÑÝX’™ÏÉù¬}YFzL"Z‚HJÀ–üx’µ嘾™Gä70å«\Nä²bœDJTÚ– ÓÛ—ÒH9ú<+4{9°w%^§Hü‹¹c4¬&ú{937䓟¹„§¾O$­dd-Þïã_§#M[Ks…”È÷ÑT÷ºÙ§s!.=Ÿ#Ú âž<μ)ñh%Àd’ºM"æë½ÐfÓ=‡È¹).kˆž¥ÁöÕµä>Bî—Saã$æm«nÜF†i×ö\Âά½ä¯SseU<)?Ý£­-¦]Ðý.‰ÙÈ]„aÙ,r%@‰z~QÞû~шQ¦ÄÁ¾9GÀ@ʇi¸¼ƒ§;×zy{aÐ`>òÚ|#nO&ï`u"ZÉï¡•¼ùGÃÞãDõ©^~p飨¬=Bn¢†/âI9E=t$¾ÏéÁ È,8É‘­q(ó¢™·ÞP}ì9ö6w~'­Íå㙬ûdï¾»€EÉÙWTñ@≠Åeê¼´ó£<ÚùÑ[ïk’Àõ|¼;‘ë7®7X·õIøLŒÂ­€ÿgÜ‘Šô€Êë• “#—ËÀFŽËKIÐ.À§ž…åã’ÈÍJ"¬drÜ^z÷ËÇÑoa8åრ“'#†Ê8}ö4`$g¿—qQ„õ“#“»«Fy·'~ÞSˆñU"ï¤Àóµü«rÈÉÈ!ý/%ý>Ÿž2)ðyc*þ—·³#¯¶ºÿ‹¸È½„âà~´&0lK%Çc qã\Ù€¬š˜—ÝÈÚ¶½ö,Ø)ˆ™cªçúùãÓCálq:1%À\VÖo*¡ÞF¾ûka=ÇMGÂü4ä¯G¡®§c¿´;‘ÓTb^ªJþŒ7žÇtæä‡–CGݘêŽî y”`:¨C?Ô»Þïºõª' ™ Å5þNz õ^”ð$Fs„uoù ÌÉŸÐ ëîoCÇÞªïæ«mE8<û sÿIØ8œ¹ó?ßÿPÄïšéýÞþËÇ»—ÐÿÙ:IÀpÙpŸ£q@ÙÓâ­L’„¸¼CDf$c}4x=ãψgƒ?ÚE}Ÿ´dà»ÏÑü Ç(TRBW<[:_ÛI‰ƒÅÉœ¬ Óu (¡ø"('(kWöôÂ]Á]ÍG»¸XÌŠË”(…—Œ`4`(Wâíbq¦ÝÉż¾Øž(-Ö÷T ¤ãE0œÓCn<Îñu7ØË ƒEy‹U2H78P½\,æïå8(d/¨Äìbñ3çQ04‰usܶEâúNÍ<þ$_‹úVÈFÒÖgá>%·†PO|œRÐé@ÝU‡¶—'1OK¬Ö`Ä“‚|-žÞ hÖy·“µŸšÌbïÉ•èRI\›EáEPyÙˆôŒå±iøØ[³ãÿ†ÍdÌ@Gºýn2sW³ö&~Ø&÷$ÿºRAû®áî«fÜÓŽ´oƒXD"h€“½#§KjO´z-O=Ëû/¼ Ðhp²w¼oqÞ¡›qš|¦Ì!gÿ~v/Dò–2R#n»¸(‘³p:‰çÂX±a->  <îww lƒ=õM3Ýí·®ÝíÈd m¹žNºêö2sàíd0:‰³ËÕõ¶T`cÛü8«*¹½Ë´ŒS:•JäÌd˜²’Œ×ÀÆuiäöšËÈ­˜j@_‡¾uÞ§LG«7Ï345¸½î}UnÄ$ÉP bê³)s^ÓÑüóö‚zt:#^/E˜“ÀÑŸ8ÞªÁ8 P€áRIí"ãqŽßå™ áœÅñ– .Êpè!…e'zË[OÊ èr”OÔì\ úsë Å”à€RJ¥Né©3™qÙX=Jº çŠkG˜0K8ô¬î€‹5DO_ü¬µHȸôs©~)ꜹ›þš‡î)o|º5¾i/oô:-ßéôø u¼ìV€n—–‚ë>x?u—ûÔéŽBES«“9~âö¿‹†½õ*ãjÙM*¢Ï¸9ÄýqãœJÈܰÃ|UeU@ûNvØ9ùñ^Û$‰ A`×ޮβuÿŠ´üt>øöÏ &»öv tp"¬DV\cßICÙüÞÿ†vJœzeÈ(A_dÂTî€â1Ð,ÀHE¢×ÇAV‚±¤ñ­4Ÿoô[W“U,A¹ž´5îòš ´5ÉHU&tk6Ó)ˆç½ü è@Ö—Éh/JPn gi Úžã õ®©-£`Kbõz=©k¾Ãôìóøwå„©ø_J%a•“Rq Ó}™¾æ.ïÔ7f‘¼¥S•„17™ôƒJ‚Üi ß§àéb†Úb¼h¼õ25‘tŽ ëçFSçó2oo¼~ÚÀ†ƒî V™÷ÛËÓíWôÏŒÀ«¾:2‹1\6!µ0ùÉz8 0PP$A•í²÷Ù}M ÆjïéjøØ×ýN¶lÛµŸ¡Š*žP©ô˜ííºá:ê9ÜoâÈ9àqožx•Ì¥‹øl]»µÇ)iÃëÈ"4ÀÉÞ‰Ñî£îXž}â{þïÚÿ5Xo´û¨øÜ!Añ+%®¸º«ÿ¼„ ä%„uz:ÂDÊ$_"·\!ìí¸ÎÃ×CÅØ:‚æ¯$j‚ßÅ’x¨u"r›Ä‚ÁÇIã‡:ž¢ÑŒo⬶^Uàóʤ/&¡äˬ2¢’?À¿ú”ÚókYÐOGìX\ýÂI¼äÏŠ ð¼5 åÀø—œHŸé‹ë°Il¸1ž3ŸuwS³$%yf4¾®¨BÑ?“ĺ×îòNý¡é;̃€8-.±+ˆ H9ìÞm¸-?*‹×ûûoÒh4á`ßµém+|ð¶×£ïæWuÂuäEÉO…¸{ûÔ;…'ÿµl;3CH>ÚÂ}õŽâƒ‰¶lUáá?ôάX8Ïs‰Œy]S}±½‘c_ç;y/?‘{È´³ÅÎìl-æIÛuÁ¾s¦«7n zq.ŠÃÏÅ–²Ã>[¶‘Ãmôcñ¬¡&¬ÊMiöï:à5߈6Žèá#Iæ‹«Tå=hò‰|Ÿ0¥1Ãc5žY{‰ê×ÚHVû‘÷Ò6M–£[èGˆ1޳Ÿµö†Nmzìf\³€œßFòÎØ'Ì‹ngãŸ3è2-u¯›TÜ;»šK×ٗüEž"§K«F"ž5Ô ¯ùF28øŽi"Kvíí,’@=Œ[Âq ˆFSdB*7¢]±š,ûQŒhå¹êE2¢/…½õÝ/Ü ;܇ âf¾†Ìã%\½RÂáÌ=œì:„!½àêÁ¯X´rÇKÍóA%ÿKÉU;ºÙ·à¦…w 5ƒ¿ôup©~ õé[¿p²w¤¯C_ñêF(^\ÌŠ³ñ$¾ì˼ë2”G·<Ÿ–ÿžì—çr3|ã9ýTI#t0ÂÃÆÎ=„W®í@“¹‚%•6t{|§=‡c;àé‰Lþ†=k>bËÕ›Øu}Œ>>áŒîß7Š©!A«&¦†A‘A¬H‚ VN$A+' ‚•‰@ÁʉD ‚`åD"A°r"‚ X9‘A¬œH‚ VîÖCçnܸAee僌EA¸Ú·7?ÄîV"èС:tx` ‚ ÷_yy¹˜A°v"‚ X9‘A¬œH‚ VN$A+' ‚•‰@ÁʉD ‚`åD"A°r"‚ X9›¦‹ÅeŽpŒÓ%zŠËŠp²w¢¯ƒ àdïô€#A¸;¿)))ùï¥K—xòÉ't,¿X9§ö“qhkƒëíÚÛ1Ú}þýFÜ¿ AZAii©˜jʪܔF“@ÅÍ 2meUîêûÕ/œ¤!ÒÙÄ£:Ö¡[è‡ó›Y: Ah3"4"çÔ~Ž^8ÖìòG/%çÔþVŽBK¼Ê™ߘî\•‡s$é^·¡'1Ègg‹—»ŠÀàh’÷š×DQ©¹Æ{ ¤iP9‡R\ßJ#)¡ÎøÍ×¶ê&Ý&'±é ŸVmS~ID"h@qYq“#úì:þÝ­k·9äkóÉ׿s@³’˜gŒ¤FD’üSÓu 5‰¬þ[3“ƽJX?šmú;×¥¡9è‚:´u;mY/O|úÈ[µMAø%‰ Í Lþ Ÿ¾ü ;tÌÓD-E´‰Â±„ø«puuÅÃ?„Ø…Ü,\Ì!qæXTî®xøþ^…åu[uU èi~)ûx4w1SŸ*$ë{=…Kqž”Jsþƒ ¨\g¼t,!+ôÖOÂÕ?¹50hˆ öÃÕÝ¿àhÒŠ,ê^Ì!qÖXüTæxþ˜ZÏþX\ÈÚO¸:?cg¥ +p!ô%O ·¦SxÛ(ܪ¡pp(¡O5±¿ÙæöÓV…ãçHâOå½\qõP1vf"9ÍÅëN ™sx*üÔ‘$fוÂýðøc9Î`lP *Ÿ@—j©g<'¿"4àtÉé&ËLþ >.ÞÀoZ\·Õ¥½Ø@ÐòlNž‰&倔7#ÉéCFÁIŽh’xþb"ÓäÐø¬’-²v nÁjÜòÒÙn1ØÑíÎÂô¬šˆ?ìdÉs œ¶™“9qxPBZšŽKwräÇ ¦tÍ!~™¦z{z’gÎ Ë>ŠM9GÈ×,ÁûB"“Þј;ÌvÀ¥4RŽ>Ï Í^ì]‰×©ÿbîp•Bñ¿¸ô<ËXu¤oÓㆲ©ýµʲØaeíÞ ¢ž„¬Å‘hºE‘©=ÉImQ=³ˆ^œuÇñ‘vÏcÒ'F|˜A~A.›fw%+r’9™ØÈ0íÚÀþKØ™µ—üuj®¬Š'¥£*Á ]Õ³oÝGÄÆnäøÏ. ‘P\v¡ÎûG;?Ê£½õ¾& \¿QÁÇ»¹~ãzƒuï “ Ù›§0ä#ØT°—¨~ÀÑt6 "*Ö¥ èæÆÔ7Æc»MCNUíU™ÐïHdÃ1üŸq>a¨‡¢ÙQ3%£#k÷‚Æ!«· Ÿ°8‚þ?{÷Uÿ}ü¹+xDn辩LÁ:&(ŠI1¬¨è¨ä˜ø{Ód7Z*¾ò-ÍR²Ò4—2—²Ëµv©ÆõÇøsXÙZM4“Vo†]ÝÁô\ü:„x”®½ÿ„AÁ­÷㺸.ίÏyŸœ×9ŸsæÐ/Å_GÚ¸¡¨U6ì¸ê)ú¢¦Ü) IDATBÏœç hýA Ž!3}"ì4a¹rÖ^EêSzüc>L¡òM<‘Ô1*ÿÞ-ÈJŠøØi õÁ€ö··P«aøFt½P|TÎ׫(=P-†—wñÙ›Wo›ÊÇ¿7øP6éC4(> Ú1Ù¤±a2¹]Ÿ„˜3^ãú~@"ú;lØÿÑîOPxºæ@e—«÷‘ÿöfünq]ò9‚ZôàBàßüjÇëŒúñÈV!`¯½ }ãí2ƒìq³™—KQÜ‡Çø]p†]5“ÑßtÕB1ØÏM(_‘DÄM“T5(†´¥«É aâ$=Kß7a{"Ý3æ cY6²í€´Ú–iŠ¢¸Ú8aÇ®ÑÑß½Û=<m£û•+-!nÓ•n Î Wû †‡'²(£s}"FóGÛQ\‰Á¿Û  hÑõnn‰¿Ìfó/fû§Hô?Mdø#ã´WêjÐ×¹Ó  S°WÛ€HרÞBÜæPP/©à!2źN)ãkGχpÿ¤46ø1øgO2ìâN–ì?wÕ2—9õÉfL¥Çøò|¾}ˆŠ72áþ¾øvA…„õ¥ÒÑrCÒj³2êž‘,zð€ë†@hPßN¬¤‡ë@r¡Nçyœ> Š ÅøÚ.Ÿ°bÙS‚Å´ˆä·L,7­ÆØMà46\Æõn£F>ö«i:“õA«i}àÒŒK%ñÅ\LG²1ì0sqÜ2ôõÔÆ•Éu›ñ©LÔ$cú£ã8 E;™ø»D×´ö¶÷€OVí+C2ÙXšFEé^,{v°6=õ?û€âgb:V»[k>=Ú_FüçSk9¶¿”ÒOãð@ÜòìÀ¾øusMöë?Œa'ÚXÖQJá¶Zî}|.Oôñ£¡zÖR6—wt~©Ò5äAÿþ­† aµ¹:¥Û»¸zÙoGG?Ýo½ª¿ZÅúçré:mTq:UÂô[ÀÊ]ýÜE;k \‹¶¶Ûi÷Åk°×¶^“¬A¦u}iÚ8 HsóŽBÌ;`â„oøtN˜mJ÷;¨'ª°ûèÐvøÚ‘¤>‰eÛÇØ¶™°ôK%uHÓ¤n¯;µÖ‰ªhˆ•Fæ«ï±eåDìŠ8Øj.-¡¡`?áþÄR ¶*ºPmG ÞàŸ{yýµ_³íï> žô$ÏfNfÄà–h×Å_W§‘_hé »&@‚À£A}âçÛºçnÝ_Þ§p/ýñe!àçëÇ ¾;±’&þ|&;—0{… ë6lG¬˜Vdµ ÒžHC ÔlšMlêRÌ'\GWgU9¶š´}àžTf )gí+…T8z;¦…SIÊ.äÆžüW0<4Ǧ¥|mÀ8ÌmŠ¢p¾ÚNSmç40(•ÔAY»ÂŒ½ÔÓVrßÞŽò ‘DÿŽW£{$ý~óЬèSÓhî°¹Ñím,gir<kÊ©Qµ†ŠC•¨a¡´>¼+LœœÆùrÉ?äDmtbûh ë?Ä8!²ã…‹ÿ| ç¨%ˆ>wÞEŸ;‚o¼;çÎ8FªcëŠ%¬ZWÌëQ ]Q¨‹¡A¡Œ‹{ÍøÝÛÿ¾ú—ÇåÆEíô÷)q‹)~/í¡<²¦$“<#‹¼CÌÌ/fÙ(WGºfúJVt7#žˆˆFÍ)€GW³`”hI_õu=³ôD$L£ ÞÈ{¹ihn´˜á˜¨8 y0÷CŸ~BÚOæ1ʃÕÓ èfZ2ß\Ibu.)÷E›º”Š{ðÁËnèi}ÍDR‡WPþ…žÔ‡Ü·ä·×'†ïdR2ñ±Dèdzè‹(–¿žÉÕçùʨ¬{Bƒù©x¢"c=¤¬sÝ”âŠ)ÌûYAgöòþ¯^#sÇÎ^¾‚üð\žÏJ#A׃s‡M¬z}‡ÏwM¹ò®¡v¬)ÍïðçõÈÏãÓ»¸¢[¬¶Ù EÄ™‹I—÷ì Ñ®ËçmþË'”¬ÂçG÷“0rƒïp»F8±•%ïœÃ¸d:QWºŽ¾¾LÃ%ðó»2_-{ó^£*æyÒõ½:µ>y×Pü<>”!“®é&rççëGÊIÿÙ!Ш¢ÖVP° —££Ó™)! D‡øê6n:sŸ}’Ñá9UÝôøhCuçë¨ûê"p™º¯\à —¡îÀû,ygGϺúƒÿÄQçGpP×<ˆ WÔòêÊæÏ „õ¥Hî åvÿÛÛiá{®4‡èôBãÒYùf61òÆ!¾•Ã糩Ά¨É/3}ðEŽ™Mìü¬ GÝeüûÐ/v4ÆŸê:ý3gÏž• Bo&]CB!$„ÂÛI!„—“ B/'A „^N‚@!¼œBx9 !„ðrBáå$„ÂËI!„—kþGƒ—.]ââÅ‹·²!„7‘¯¯ë5×ÍAн{wºwï~Ë BqóÕ××K×Bx; !„ðrBáå$„ÂËI!„—“ B/'A „^N‚@!¼œBx9 !„ðr>íÏ"ªÏUsäÔçT:lTŸ« 4(”þ!:õHhPè-®P!¾™8ŽŸ9s†»ï¾ûV×òe9^Bñ¡=N÷óõc\ÔX ¿yE !D'8{ö¬t µgMiþuC árŇ>dMéÚ›TÕÍ`'Ïδ 5”¿’@øÓæ[\“¢+H\‡åx GN}Þáùœ:‚åxI'W¡bz<œØ…ÖNhˉuƒ‰ŠÆNhÊZiS9ÎNnVqsHxP}®ºÝ+¶l;º½ùÂwŽjeý+&lj'·[^Ä¢¢ƒœïäf…7‡½˜õ“GysÊôìÞpuÝÈUÄ SMÌO!ow!Y©É$%Æ’`Ì¢ðxÓôF¦§‘MDT4 “2È+sB£™¬¡Y˜U óî‹`ö&'PƒeEÉñM󛿽e9ÄÎ*Àùy.IQ)äUªÓ+³IŽ&zhɳr0U5¥OU)QIä~q¥ gE“ðœ…ÎÎ'!DÇÈSCT:*ÛgÖOE¯‹ãÂ¥†6–ÛE•‚‚5¬[·…H'æ§G‘µÊÄÄ·Œ87åu ’â­ï¤bûh³³s‰Ù·˜•EéTŒ¯ ó¯ïaôçïg“ñ{…Å¿+%-*6d15s)1]†¾£¿q‹ÙúœXÓpv}˜Ž(qóŽx¯h5ú`'Ö×göŒ4–eèûeòÒ/ÌL}1ŸÔ¢tw,!÷øX–¿™ˆÒe{Lˆïžcx÷?½ªŸ6(žŒyã¹ë&×"AàAõ¹S­†o¿ívþõÕ¿€Ö!ð«¹\¸tÁã²OE?9“H€ˆB}׆P.\%€€|t¬dß#m·0a%¥#4Á®Cpä#cˆze=å'Aßï›Öf¡è ¹Ùè{+€ýS3Iüí<6—-C?"3–3Ó<•¥›´„üÆŠ>g7‰ßt}B|?]lh$$aé?ù¯–‘?ìA¯[P‹A-zp!ðo~µãuFýxd«°×Úor5!h{» * ¨** {8›ô­$ëM } ‘á# Lƒ¦­Ÿ´jgûª\LŸØ¨Q.â ˜oÓGScÇ^¯%Nçv~ï¯C«Q©¨®4àIæ«3INÉÀ:z%¥c$„·i áôú?ÿE¯À¶ý—9õÉfL¥Çøò|¾}ˆŠ72áþ¾øvA5„õ¥Òak¶Ú¬Œºg$‹|àº!Ô÷¦Õy`= Lû™qÀ‚¥¤„+¦’·)›â‚tt­fT±¼2‹Üi¬^ÿz P_È쨮xöÚdQívÎ÷ €j;ŽFßDáUh¨‡†“ûØpø8_ÖÁm¡‘Œ7†ˆ ÀQJá¶Zî}|.Oôñ£¡zÖR6—wt~5r³Øƒþ!ý[ (Âj+®m-{SÕ×àT´Ã Ì|f·.fè"Lÿïêm”—×0ô‘tWù‚£ßvý-Z;6÷G“êíØjÐÞÕ´"§…E‹ËûÎd*ùÌ[ck»-!þc5B÷`/ù5n:NGTãg¼¿ÖÄÉËÀÅ_?üBH_Ø5! ê;?_¿VãÖýå} ÷ñÒ_ö~¾~ ê;ð&TØó‚Q$?[ˆ­Ö5lßÿönZBïz*(8°U9qÖ‡ é¶qj•‰¬w¢8¨qÜØZEšjìµNT5‘ÔÉ!˜“‡õ´ õv,+ò±öžHjœ«&Ë+9XX@v\$é/ÎÄùö<òOtò®â;-„?ËÜŸapX!¡$LMTÝ>µwÆ1zP[W,aÕºbvXâhh·ÑoL‚ÀƒÐ PÆE]ûäÏî¿íi¾aÜ–qQcoá{‡ 9«I¥ˆÙIDDÅ2í× yËI  ¤w’?5žŒMçIûŸÅDVÌ#>:–äÅå^|‡Ì‡BØžD¯5à§FŒÊÇÌNJ!ïÄ<ó‹”3?9šˆ„iäžIdõúÅÄø€Zº”œ=:žÎ@À=™,~¸†ÜÜì;-B|§(4ÔÖ5Á ~x.Ïg¥‘ ëÁ¹Ã&V½¾Ã]ôay×P;Ö”æwøsƒúäçñé]\‘â{O=IÙö£ôúéx¢‚®Œ;̆—Møý,‡”]¦áøù]¹5\Ë޼רŠyžt}ç>W$ïꀟǧ“2dÒ5ÝDîü|ýH2IB@Ñ1J/.Y†éã½ØuÔ=IÙvrôöû¹ÿGPwà}–¼³£g]ýA Žâ¨ó#8¨G—”#WÔòêÊæÏ „õ¥Hy µâÆ·±wËN>ýû—8@Ÿ°{‘<‚ˆ@€:Ž™Mìü¬ GÝeüûÐ/v4ÆŸêð|JúÍœ={V‚@!¼™t !„ Bo'A „^N‚@!¼œBx9 !„ðrBáå$„ÂËI!„—“ B/'A „^®ù^ºt‰‹/ÞÊZ„BÜD¾¾®×\7A÷îÝéÞ½û-+H!ÄÍW__/]CBáí$„ÂËI!„—“ B/'A „^N‚@!¼œBx9 !„ðrBáå$„ÂËù´?‹¸pòïœ;øWê¾8Ê…“ ç]?¢×=Q ½žwýèW(„ßÌǿϜ9ÃÝwß}«kùÎ:³}3ö k=NïÖÓŸ¾)Sø/Ä›X•B|{gÏž•®¡öT¾¾äº!ðõ…zþ¹~-•o,½IUÝ|å¯$þ´ùV—!„è×qfûfþ÷à_;<ÿÿ~ú g¶oîä*lä wÿŠ :>™Ù/RQßÉ«ó rúJ6>¥ï’¶í%XNtIÓBˆ ðàÂÉ¿_s%àÖïšù®÷凿k¾‡Ð™"Ÿ,f¿uÓ×.>XšJÀŸç3kg§¯íZJX ú~]Ðr –5KÙq¢ šBtˆç>m}%àÖ!¿z›Á+Þ¦›ÿmtó¿Á+ÞfȯÞn__¨¿fÙΠjÐô¾ò¥%2~&+ÿÛˆs‡k#PSÀ´ðdòO´,S³aáÆ<쪉Ùá)äí.$+5™¤ÄXŒYoš¹d>£–bÞœÃ4c úX’ϧ¼éŠÃ½k¨âÕ¢Ÿ+Äòêl’ IÄꓘ¶ÂÚH5Vrg%A¬1‹‚Ò|¦…§Ppúê­ª¡`f<9e*…™D<ÛÔõtÚBîãÉ$ÄFŸÄ´ç š®|œ˜çÆýKSóºÔKIˆJ¡àÄÕm !:Jžò îoŸ·®?QÅW'þÎmáýøâkÜÞ¯NüúUm,;¥ë‹ô¾V;<»‚‚5¬[·…H'æ§G‘µÊÄÄ·Œ(Ý€3…äYÍ:ÓbêËÉIN!÷Ùø3ÍUëUpn[OÉÒulyNÇóHNÎ!ü.²ïqRøÜl ¾ÎæËLtN 9Ï.â(ýsÍo›†™ïñÅÐÙ{ŒeÃläÍ™yÐj6Z „¨åägÍbê³”¾eÄðÂK˜ ‹È-5°8ÞNþ+hžÚÂ̰o±Å¶ËïØÊÞÏÿIí%‚C£ˆ;Ža}\ÿëò—ض½”£Õµ4ú ÑÝÏøäîòï¤õ]ËÑ›(ÞWÃàôŒîu6öþáCvïÃô%Ó‰êÖIë¼ArEàÁ…“ÿ¸fÜç9Ï4‡Á•ø<ç™-ÛÙÔj+KcFi@ßá8WÑOÎ$Ò €Ä¢P«l®+€ú(RŸÒàÃða •ÿ¨l»©PsÆ7Ä€DôwذÿP-”üIabz:‘Á J˜ÅS†Òá¸:RDÑzæø{#¦=ɼ§¦[ÅëwràkÛÖ™phSxjÁ+ädMcÈE ïx˜†ÎX}ƒ­«×²÷Ò¡¹êh{¹zùooƨÁ¯3Öõ-ÈÁú÷¿Ûþ¾‹•¯H"â–aUUˆÉê—t¼ç>mo·AEUm9Hûk qkLé¦à¼àáÞ[CÈÕM]R¡Æ£QKŒÖmÚ H´”u¬ÄvìýÝ7*<m£{50&¼DöæQd¼B¦é=tò[,<ªã«ÞɈñ|§/̰Ñ÷r`ùaNžƒ»ø’Su!D »‹^¾€o_î¼ÓžSÔ2˜¾—³n¡•»¦FñåŸ?åË5àOÚØÿq'Çu4öŠ`Ü´¢ÛXý¥F‚æ0~ƒMû¶šÔØàÇàŸ=ɰ‹;Y²ÿÜU ^æÔ'›1•ãËó øö!*ÞÈ„ûûâÛ{I®<èyWø5ã.^Ñ|%pu7Q{Ë~[‘}À®-»Øµe[^6 éÅŒç2Ñwîz”ŽÎèÓÃ㤶¢£Ãí¶¥ñêaÕ§! çyìÿ¸·ÊÅ÷W0ƒ'LfD?·Ãçù:¾ò & 'ADè9ŽþÕFÝe ÞÁ§_üãÍ':¾|ɧ~ŒûÅ\žýŸñ„ü}'k?¨à®‡Ÿbî¼§ˆW±­ôdÛ«Œ nPÛ¤~ý‡1ì‡uG)…Ûj‰š6—W^y…g§DQ»«Ò3ßt?\Ÿ½~<°Õ°X?n ûQsw{7ÑÕO]½lgP‚5hôhôèz‰—†W’³  ¥[§§‚‚ŠúuË2»½­¦ºVP!¸ÔW¨Ø:º|˜mJ÷ãû‰*ì>:´¡®AÛšEÜžMñ›#°.^„E²@t”z’­›?¥Gb"ƒ€FL6ðùZ–,œÏü—_gï¥8ÒÆèÜμ}é3Œàn€_?îü¯F|~t/Q½zq§6˜Úsç¸Ü™u^l ðõwuù…&¾p.#îèÌ•´ ð èÞûèÖ³ånQý‰*>Ïy†Ãÿ“Á×õ_ñuýWþŸ ýÏ­nwëéOн÷uqurž'±b)óßm:Øû÷GÛÛNÙŸ›†«Mäï9ßÅu´Á_Oܰ¶ÿ¶[=¨Õf–nª¸N÷UûI;N§ ƒRItµ+ÌØëA=m%÷íí(Iôªò™÷•ôœ™è†/àùar^±tü„ð^çaúͪÂÒ˜5²¯kÜå“lý­‰†è9<ûò2^^ø$£{~ÊûE‡©k^°·õºò½¾¾Ô«y¾¾>Ðxùš ×oåÎ8FªcëŠ%¬ZWÌëQrÓ¢mô¼ëGô™ÔúÉŸóG®™ïê'†úLšrsÞ;lä¥9úFùU1dæ¤Áû)$ŒJ"ùE©&BcÛ]5]GCúk+Q»–”û¢Iš[BLF*Z€6ŸˆˆÁ0%†ÊIŒzîcœhÉ|s%‰Õ¹¤ÜAlêR*îYÀ/ÀNþÂ\œÓ—“Ù ã ÐnËai©Dðìò™2Ö½SLmôt2&DÐ|·}JÙWQ$ŽÖì ¾þ}–t/A8Zw½»Z0ƒžËóYi$èzpî°‰U¯oàpÛÉ»†ÚQùú’ºøÿ ½þsŸï⊾TTUA¹rcàÐRb§8X~l%‰·´.á•ÎfÃ;;ñ;‡Éƒ¯ê¯ÿ[1/Á£9)4?{vf/¯¯¬"na:qݳaá^4OÍeL€ÊÞ]Ì!ݳ<ñSW[Ë*^?Gάa×yúç›â÷ØUœØÊ’wÎat|ôëË4\?¿+TµìÍ{ª˜çI×÷¢3É»†: ÿÜçÑNŸÓª›èjÝzú£>GBóÓ±Ä>žOE­ŠZ[AÁ[£ŽLdè­.Mx¡l1qòG£îKÝùºæ¯†ËÀˆøáQ,–“®›Å X>¥6l:ãsjCóúÆú¦õ7À冦\¦î«–ºê¼Ï’w¶qô¬«?¨ÁñOu~y~HãÛï:àŽ±¸'ŠsŸþ•º¿}Þü9žw…ÓëÇ ºW^CÝBÁ³Û‚¥d$æâPBˆŒ›Éênä1W!:Éåã­h ŽM¼v¨õ¤ÁÓ—19*Š”YulÛQ̪?×ÒøÃ4?º—G§$ÐäÕÜÀ’ÍnÝÇ,áà;cÃZ6¹}nÕôêL@Ôä—™~ÿd¦ÿ¯‰ï¾Æ¦ºËøö¡Ÿ~ã~ÜJ×Bx5éB!A „ÞN‚@!¼œBx9 !„ðrBáå$„ÂËI!„—“ B/'A „^N‚@!¼\óKç.]ºÄÅ‹oe-B!n"__×K욃 {÷îtïÞý–$„âæ«¯¯—®!!„ðvBáå$„ÂËI!„—“ B/'A „^N‚@!¼œBx9 !„ðrBáå|ÚŸETŸ«æÈ©Ï©tب>W @hP(ýCt ê;РÐ[\¡B|3?p8ÿ>sæ wß}÷­®å;Ër¼„âCzœîçëǸ¨±$~óŠBˆNpöìYéjÏšÒüë†@ÃåŠ}ÈšÒµ7©ª›¯ü•Ÿ6ßê2Úe™AìBë­.CˆïéºËñŽœú¼Ãó9uËñ’N¾2°‘kH"ï¸û8…€PCGÎ û™4"ý;quDN_ÉÆ¯u]¿"!ÄM'AàAõ¹êv¯Ú²íèvú‡è:ýžAä“Ŭ›¢mºˆÃf!ñ|f d÷›:um×RÂbÐwñ:„·†t yÐÑ+Y?y”7§¼AÏî=W7Ñ\Et”¨AÓûÊ—–Èø™¬üo#Îf¬@MÓ“É?ѲL͆i„ó°¨&f‡§·»¬Ôd’cI0fQxåJ£d>£–bÞœÃ4c úX’ϧ¼Þ5Ù½k¨âÕ¢Ÿ+Äòêl’ IÄꓘ¶ÂгyÅVrg%A¬1‹‚Ò|¦…§PpÚÃÆ0“33‰èˆ¢S˜¿¡õÊ´ÓrO&!6šèø$¦=W@Eý•‰*¶MóIIŒ&":i/š]ÛJËôŠ MÓ£bI0f[Rã6ÝIùš,’ã#ˆˆŠ%iÎR,§[/;Í@ttÓ²»]ËV¬H"|jî-QšCtD¦z„øÞ‘ ð ÒQÙî<³~ò(z]ðƒ^¶Sø_«íÎv…‚‚5¤¯ÛÂ.Ën„YÉYert»g É?2†Õ¦]ìÛõC/%÷5×6ä£àܶž’AËÙbÞÅþuFίÉ!ÿ '…ÏͦàëTÖY>£ôM_ü:Ÿ£ôðpýi#ïé,Þ½€-û?c÷k‰Ø—Í"§DuM›3sP&-Ÿ±ß´œ¸S¹L}Öä ãùd,;¸…Å‘%¬ßÓ²?Ô’f½}žÔ·J9v¸”O†`É|¼9,Õ‹˜µÖIê[¥ì·“l&ãé|쀺cSß°3üÕbö,eã˜3¦’ûDŽ1 =°ƒ½µ-[aݹu¤ÃMè¦ÿ!êO²¯0Ÿ×–¼À ‹—ðú»Å¨¾|KJ‘ ð úÜ©V÷ßv;·ßv{óð•¸p©_íÈåÂ¥ —í jµ•¥¿1£Œ4 ïpŸŠ~rfÓ=…ˆB­²µœE×G‘ú”ÞÕÍäÃða •ÿðj¡æŒ×¸¾ˆþöª…’?)LLO'2XA 3°xÊP<ÆÕE_èIÿïD´ ša™,^ý=®e°¡–£Ÿå\hýG)…Ûj¹÷ñ¹<Ñdžê}lXWHiØ\FÜÑùÕH×ýCú·.ñ#êß"¯Ì޳ֆyÅ<––8P|&NNãüG¹är¢6:±}´„õŸGbœÙÔ~$†qZ¬s1ŸË„ºx¿ŠÿP}1k.O>>øl\·ƒ“—;ã=¨Ž­+–°j]1;¬Gq4t]„…2.jì5ãwÿmÿúê_—5öæ¼w(ØÈK/$rô,ò«bÈÌIƒ÷SH•Dò‹6RM„ƶ»jºŽ†ô×V2¢v-)÷E“4·„˜ŒT´àz2é:2W­D&”øXFÍ5£ýïu,®Z2ß\Ibu.)÷E›º”Š{ðÁËMŸ›–ͺ"9¸8™h} ¹6sÆ 6º¶X¾˜wžéuÑ(¢#¢¿° Ý ï‘=̵feÌK¬~Lƒ9;‰Ø„©äÖ$²úõt´€2jëžÐ`~*žèÁ£ÈX©ëÈÐRyäx¥VΞp7ì…pç‹ßÿ ¡oX “Çõ/ efðÃsy>+]Î6±êõ î¢s;y×P;Ö”æwøsƒúäçñé]\Ñ÷Šª*(WNÎ-%vŠƒåÇV’xKëâ;¢þ0›Þ9@Ÿié$4w÷Ø(^¼–Ë-cräe.Ÿß•[õìÍ{ª˜çI×÷êÔRä]CðóøtR†Lº¦›ÈŸ¯)C&I b~:–ØÇó©¨UQk+(xëcÔ‘‰ ½Õ¥ ñ]á'wœÄòÇû²–ºs§8ºe'‡~ED8ÔxŸ%ïlãèYWPƒãŸ8êüòüÆ·!WÔòêÊæÏ „õ¥Hî åvÿÛÛiÁ‹ÔZÉ[°”¢2%„ȸT²_ÈDßÖÃ;Bx«:û¶íäS[ µ>÷‰ nÌ8âîôê8f6±ó³*u—ñ ìC¿ØÑªÃó)é7söìY !„ðfÒ5$„B‚@!¼Bx9 !„ðrBáå$„ÂËI!„—“ B/'A „^N‚@!¼œBx¹æ·¨_ºt‰‹/ÞÊZ„BÜD¾¾®×\7A÷îÝéÞ½û-+H!ÄÍW__/]CBáí$„ÂËI!„—“ B/'A „^N‚@!¼œBx9 !„ðrBáå$„ÂËù´?‹¨>WÍ‘SŸSé°Q}®€Ð Pú‡èÔw ¡A¡·¸B!„øf~àp8þ}æÌî¾ûî[]Ëw–åx Ň>ô8ÝÏ×qQcI0üæ%„àìÙ³Ò5Ôž5¥ù× €†Ë ú5¥koRU7ÈYÈìð$òŽw`z{ó6«!?5œ”wí[ë÷ŽËµ|óí¸aåE,* e‹ø‘®!:z%0ë'òæ”7èÙ½'àê&º‘«ˆŽR5hz»¾´ýb0Ì]ÆÌ{*0ï±áºjgöï- Ï#)|6…Í£Ô/ ÈKDT,ISs0W·±¢«º†œeydLJ :*‚èØ$¦½hÂÖØ2{ÕFÁÓÉÄFE˜BÎWW‘¢Ñ¢ kúÒ@·@4a-ãj-äÎiZ.>‰i ©¨oj´Ñ†éÅi$ÅFM¤ òÊœÐh&khfÕ¼û"˜½éÊÆõhÞ7Íûç™Å¤÷»²Z¶%˘@tT4±£RÈz·œæÝsº©ž¡DDÇ’<'Ëi×$ëÂX"æZÜv’•œØp²v_µïÊrˆU€óó\’¢RÈ«jÿ ñ] AàA¥£²ÝyfýäQôº8à7¼ì·×¥¨žßNáïª0¬ÚÍgûÖ1£çv2ææsýžírrŸÎ‡Ôì?|Œý¦ÅÄ™GΦ–¥*_DÍë)=¸ŸuBႵX;PKþÓX²)>xŒÏL+s:—Y‹-¨@ͦ²D²|ë~Ž.å½) EÙ¹X1°²(‰,ÿë1Þ›|½snÅu½ûuÓ`­‰¬ÇMôxì=öþŒÒßÌ„ S™÷‘+ ÌË20g²ÕzŒcÖb2{›ÉZf¾ý Ä-fësz˜Í®£Ådökÿ ÐptKæ/ÆTukÖ/AàAõ¹S­†o¿ívn¿íöæá+!páR¿Ú‘Ë…K<.ÛéØ6ç²þs‰è:¸“¡S²1ô @ ŽdæccÑ(a¯ó:‹4žçü¥W Š(½õdxŒÓݺŽ˜Av¼E f’]­ [m;¥)bý™óÑ*@p$3ŸšHLXáâ…‹  €OºGV²Ïº}G;2TlZJщ?uíûGX¢g°`‚ε-ýŒdO‰ÄüÑÇ8Q9_¯¢ô @üµ^ÞÅgoP:¸Ê¶ëèÀþBµ±mûqoá?ˆ”{´èÁ…À¿ùÕŽ×õã‘­BÀ^ÛõOΔ¯H"â¦UE Š!méj²‡t´-Ú0·3hm(!X©9 xê¯÷I$sþPfgÇ’ð®ýÃcL#±_ËáQ«u»Y­((\D½_§”6쪙ŒþWÝä%û0<œMúÖ ’õ&†>Èð‘&Ž‹Aãé·µ¾ÙQ· «*Ü¡'íõÕdr²Ÿ°AiÑá9­— Š…‰¿Ìfó/fû§Hô?Mdø#ã´ß.:°ÿ„·»ÌÉ]›©Ïà¿•¶ê“͘Jñåù|ûodÂý}ñí‚*$< êK¥£¥Ùj³2êž‘,zð€ë†@hPßN¯'ò±XýHÓ™¤ZÍL”nW £ÐÞ‘N7}5ûÆÙ°ì1S²§ˆ¬ñk›·…e£šfèvÝÅÛÖMà46\Ö|ƒ·5= Lû™qÀ‚¥¤„+¦’·)›â‚tÚ¼þñ7°xË‚¦¶j(š;ó _²à!·¹»)0n%ÿxËØvMC2ÙXšFEé^,{v°6=õ?û€âgbÚžÿë¶G_Íóþ“[Éør/ÅŸ÷aBV?ªþVJóí#G)…Ûj¹÷ñ¹<Ñdžê}lXWHiØ\FÜÑùeH×ýCú·.fvR y_uÕþß{u0ý FLF¯6gfðÃsy>+]Î6±êõ >ß5åÈ»†Ú±¦4¿ÃŸ Ôw ?Oï⊄ßw Ÿä³xËIüüüšnÔ6ÒPßJ/†¦ñìØ»h¸~~Wn ײ7ï5ªbž']ßvt|SgÏž•›Åíùy|:–ã%l;º†Ëm_›ÉKç„7Âoètžÿ±û' O±óíBÿ£û÷ îÀû,/ aòŒÑDý_?ÿÄQçGpP.©G‚  §ˆ®é5Ô•ÍŸ êKÿþÜËíþ··ÓŠB4ñõ£W û?züý{Ñ˸2Óÿ×ÄÎw_cSÝeüûÐO?q?G¥kH!¼š¼†Z!„Bx; !„ðrBáå$„ÂËI!„—“ B/'A „^N‚@!¼œBx9 !„ðrÍ/»té/^¼•µ!„¸‰|}]/±k‚îݻӽ{÷[VBˆ›¯¾¾^º†„ÂÛI!„—“ B/'A „^N‚@!¼œBx9 !„ðrBáå$„ÂËI!„—óiP}®š#§>§Òa£ú\5¡A¡ôÑ1¨ï@BƒBoq…BñÍüÀápüûÌ™3Ü}÷Ý·º–ï,ËñŠ}èqºŸ¯ã¢Æ’8`øÍ+J!:ÁÙ³g¥k¨=kJó¯ —(>ô!kJ×Þ¤ªn²ÝY„Çæ`íÀ¬å¯$þ´¹‹ ª!?5œ”wíßô l«÷°“gŒ&§ìV×!ºŠÁuXŽ—päÔçžÿÈ©#XŽ—tr6r ᄇ»}EÅ’4)‹¼’Î9ÚK °œ¸Î 1™ÿfQ²¶pVPøj)‰±DDD­O"åé\ÌÇÕ›UA×P+0m*Çy«ë¸QN+eUzâbnu!¢«HxP}®ºÝ+¶l;º½ùBgŠ|²˜ýÖýì·îgŸé²¨¡ =ƒ¼/¾mË5XÖ,eljë̬#fˆ–€o»ªŽ¨·²45…œ?+þ犷náƒÜLÍd¥N%ÿøÍ(¢‹”±¨è çou7H-+ã`LzåVW"ºŠ½˜õ“GysÊôìÞpuÝÈUDG)4½]_Ú~1æ.cæ=˜÷Ø\3¨vL¯Ì&9>šè¡ $ÏÊÁTuå Z¥bÃü–3ìÄæo¨@¥†‚™ñ䔩fFñ¬‡.«ºKœòÉJM"6:šØQ)d­±^u–ëÀòÊ4¢#ˆŽO&cM9W*±¯I!|T.¶³âíòk ¬üÝJÒÇÇÙOGdœ‘Ì·>`ù„@ª·\õPmÀ–¿:yå:íç3k1 î>ʼ9XU *Ÿ¬ev oíæØ±c”¾iÀþFùÇ5Ì,x´`…´¼c{ÍÐþjk ɘ±õ‘•ì>ø»W¥¢¾?›Œßº„KÖRÔ;›bëglyYmÅã,-uM ’JöŒ8BÚl¼ó6ºÉ™®¹üÐ`|ù=OÐ6©ü}5¯¦ôà~Ö=… Ö6…•ü§3°„eS|ðŸ™V2æt.³[\û«¦¬L!O|Àþƒ¥¬{ Ÿ‡©öªUž( ãi Csß!sÒ±m÷$n1[ŸÓÃÀlv-&³ßÕ3”“ût>¤ndÿácì7-&æÈpO™k±šÌ4²‚ d>ƒÆ_A;<“q5lÿS¹kÝÃÒÈü™MÛ­c¯†ÈºŽóÀ ²ãµ(J1“ èjmØj#E¬?b s~"ZŽdæSéñ‘ KcÓ6Ü=ƒì :üˆœ¾€•/ѹÿ!:­äÌÉCyê=–Òt|Û¿©Æóœ¿  ô Dñ¥·žì±qzÛ{êZ*úÉ™Dúø@j•­å ªÅø‹×Y}@ ©"±•X°Cê-–?~Üre³ÃBÈ#z ÆJyõ•û*çëU”ž(€¿ÃË»øìMí5RFÎ$-Ì5·vøptµv×ϬIâÃéè †)4J°~ïnªxV÷Ïè¬àrõ>òßÞŒ#Pƒß-®K>GÐA‹\ü›_íxQ?Ù*ìµ]ÎR¾"‰ˆ7šT5(†´¥«ÉÔØ±×k‰Ó¹ý9úëÐjT*ªk`ø ²ÇÍf^b,Eq#H>ãCtmtú«e¸u%²òè{ݦÛí6KGë6N§ÕÂÉj*ýúÑr(@{‡BÍi;ÐÞÝFºúµêú¾Z­[Š‚ÂEÔ À vÕLFÓUKÄ`?vhµna¤Eÿ[[_ÛXŸù1æ€LöMoÙ’ö¶ý[ñI$sþPfgÇ’ð®ýÃcL#±_G±!h{» *Šë÷äÊp€]pËdmo-œ©Áè'‰\câãÓ3™©±°ãO×¹~VWî¬V&þ2›Í¿˜MìŸ"Ñÿ4‘ácŒLŒÓv8´½Ý‚­›ÛÏ, iÂÝZê­A‹ƒšÓW¦_5pêHŸXË8z>„û'¹ÎÀüü³'vq'KöŸ»j™Ëœúd3¦Òc|y¾ßÀ>DÅ™p_|» B BƒúRé°5[mVFÝ3’E¾pÝ êÛéõD>ö«iú#òA«iïOÏýb]‹ñµ]$>aŲ§‹iÉo™XnZ±w륔‘/±kKvÓP !ø oî~¸EéÈ¡B‹6 Ì6˜yíäFZÿÆzZg7‚ÓØxpú6&·ûhhíAlAÑ–OîÖ‰¬ïù¬¼Ým¿Ë}ÝôÕìgòÇLÉž"²Æ¯elÞ–êx׫£U÷M£ ŠÒÜiæbÚfgf¿l×)äšíà+ºû³›ÃÊL6–¦QQºËž¬MÏcýÏ> ø!£Ý­U”Žœ|7©µÛ_Jé'‡qø îGyv`_üš~_üúcÀ‰6–u”R¸­–{ŸË}üh¨Þdžu…”†ÍeÄ_ªt yÐ?¤«áÂEXm®©Û»¸zÙΠkІi]_W‡€F‹ÖßŽÍæö§^oÇV€ö. 4ª8*azŒ-`凮¾Ý¢mthhÐ Ð5}i®9Ó†é\gÜnãì'ìJóVWW»Mwb?£ÒÛý<Ú†Ñ:l›r1]Sšó³ $½ZÞ~3áZ´µ•ØN»Sk°7uAhµ:°Ùh‰y;–wó[¡ Ncñ›ËXùB–E‹škioÛ{(=š®fšÔ·¬³#œµNÖ‘øH&‹ßÙºéPø  \9ÁoqºGÇ›†úJìnûÔ~Æwhš®n4Lœ¤§|‡™ÂÛÑN06]ÑUPV¦ ÖrU¤Ö:Q ‘£ÒÈ|õ=¶¬œˆ}C;aûÁí„Ûòöj„ íhïØwÉ?÷òúk¿fÛß}<éIžÍœÌˆÁ-!Ю‹ 4¾þ®N#¿ÐÒvM€GƒúÄÏ·uÏݺ¿¼Oáþ"^úãËCÀÏ×A}Þ„ Ý%’:9óoò°žV¡ÞŽeE>ÖÞIƒšM³‰M]Šù„«³ÕYUî ‰¾@ûI;Ngû·ü´RI¬*"÷÷6œ*Î#äþÞN⤉-]-§ÍämªÀÙ¨RSšGQ™Ã(×¾ó@!y¿µzìSüår2C­Ì›’AÞf+U6*ÊLäý2…¬?ë˜3¥³ß“ÊŒ!å¬}¥ 'PoÇ´p*IÙ…ÔÚ‡RÑW»¡œg ›–2oUÎ+©×ôǪyd9/ ³²è¹¦åÚÙv­Nå%X뜔¿]ÄAÿ–²EšjìµÎÖu€ª<¦&Ì"·ÔŽÚÔVp°ê<ÚP-‚®ŸÂÑ2‹«_µ‘¿ioûûÁ¿ Ó*3özP«Íä}h#Æ`hþ™i&¤’øEK·é0Nh:ðŸ¶b=£'nHÓLå,MŽ'cM95* ÖPq¨5,m¶¿} 7å6ýÛ(xw;ΑcH¼ÒÆ‘Br^,làæ9hÙ™ÎÒ|r~mùö÷l¾­†sÔDŸ;ï¢ÏÁ7Þsg£Õ±uÅV­+f‡õ(ކ®(ÔE‚ÀƒÐ PÆE½füî¿íá__ýËãrã¢ÆÞ’÷Å<ó‹”3?9šˆ„iäžIdõúÅÄø€fúJVt7#žˆˆFÍ)€GW³`”Ä`˜Cåÿoçþƒ¢¾ï<Ž?oøñu#ÙiwgcÜÔUŒ´®ÂA!ºsÐ!’Èe&bü•jC«Éqr‰„4µŽÁÓu(CŠZ5‚m 5ÍšK$iO™‚£!DrBÐ,^˜]_.˹ûƒ‚€@‚Ý÷cfgÜ/ßïçû^d¾¯ý|>ßïç¢_zô‡´ñ¤eYpYOxp8Ñ/~ŒîÙ㤯뻤´£^ñ ±Uûˆ{ ˆè”b’{ç2€¦O󱿔ŒümV !)ÿ?H[¡p:#‘õ+ãXÿb&%j Yï"~îX~2ëÎa‹9ÀÈ m³pÈßsáÓÆ“ž;wáÑlù#l>˜ŽÅÿæv´Xö¦a¾°Ä\û¨Ÿ]ûx)K*Hމ$fåòçnbóú‡GÔ?²`QÞgkÌ2/Ütªù;Hßk¢2u áÁÅ&R¨O"ë_C…ØgÓˆúÚJtD qOYá‰L¸‡ ¥Œè®GXRHblA–}Ø—¾NÚÖ½4u,k—»i^daUûl•aËíŽó!å`ºÂ]¬ $м’_~n"íÀ cøü£Ó±êÉ9ä?AàëÉéXEÖÞø½R{ G• è‘9)ùóQ knAÓÅŽ~X6õÏj,\î§#™UŠ#¿ÞOö‰à§‹` ³IDATª:ÇÑ€?ÁOìäåÄx"fp­ÜFÆ\Ê'éƒÉZC£x«({ÌÏ,¹w1?H˜äЦÀlj_ÑpüÜžQ§{Å4ô×DŒ)ŽÛ3ìœI;™–*|Ž¬Ç§`f¶9­A¿#¤à›ÝÍ6u6USþ·³•Öà=o)‘Ë"X? pùCR^Ã’ºSßÐQw'®P©úökäTæ~jB^&Á|÷„Ö×ÐÐ “Å£ùiD§¿(䣊“¸:‡ï›ý]/:×ÕLåÛÁÿ6=Y,n;w³“Ò·“ÉnÞÌá–ÿ剿£ ìÑ–7RUZDM] Áz:]-´w­í@'-­-´ÞwÝMWéÒJt¬Ûô0¦ïªp9¾ÂÑ¢ÂÖŒI©Q‚` ¢>È]@ï2Ô—úŸ˜3ë^èð€1œïÌüÎ(­Ü™Š_cë»ûÒZÆxw¿¸“¸m$†ï¢xnIo&"W„É£øh¶Øû¶ò½TÞ0Ø`{-`Z·—K×±ñm|òûý¼ÓÒ‰J3›ùæ <úýɸyT††„£É2ÔB!$„ÂÓI!„‡“ B'A „N‚@!<œBx8 !„ðpBáá$„ÂÃI!„‡ë_bª££ƒööö©¬E!ÄmäãÓ³ˆ]øúúâëë;e !„¸ýÚÚÚdhH!<Bx8 !„ðpBáá$„ÂÃI!„‡“ B'A „N‚@!<œBx8ïÑw.—‹¦¦&Z[[q¹\¨T*üüüÐh4¨Tª)®P!¾ ‚1p:\½zuÈöÖÖVZ[[q:èõz´ZíT'„ߎ ¢¶¶vب»»›«W¯R[[{›ª¬ìÕHŒÿR0-ÙÉ´Ùë¼éßÓDs[1d~1Õ…ñ÷Ez·àt:ijjóþMMM8Î îTcáâçmáÐ¥tÌÓ9Ö0çп÷Q÷LV/§˜äÐ ä5Hxï )ÿ8I§BÜ’Á\.ר=áÔ××ãçç7ás‹~~œ¬'oº({kÐÊÜÌz6í3“7ØJŠí Ï:m$®ÎŸ´³!F'CC#kO`Þ¼y„††âååô §1VŠ¿Ã\Ãà×5 7 &½‚»Ù`‰!ÒNܶlÊÚúZrrúíÄEh "Ҳ̒æaÎ8phÈm›£ñ¦×ξá(7•¹É¬‰ "ÐN¤e;ÖÂц”Ôsz>ÃŒ›Ývl¯n%."ˆ ÐHâ¶ìÆVãtœûó£$® 'ÐNÌúÝÔ÷·)„H‚`­­­£î3oÞ¼a‡Ærì¤ñêóȾ°‚,Û_8󗃄~±ëŸz.ÌÍïîbû»°éHU¥Ed=æ&{Ç>Š»nÕ¨‚å`-µ—z^U)„(Zâí釸 w³å·M¬}³ˆªò"Ž=§ãôŽmd_ùe¯m`WY)ùçø¬ø8)÷W°kÓnŠû³ÀNÞkˆÍø+Ÿ9̦»N²}g6Óh&Cˆ±k©æÔáý$'çRÑ=ueHŒ ïÑ>Š¢ (Jÿû¾èêêââÅ‹twwxìm×fbíófÔ3Cx0LáRí%Ô¥STNü|5(j=¹SceWÆÐ®7@5Ù/Yq>žÆžh5àæýÜéç/{=ãë7müAgl;†î<Ó€N}ã­â¥Ð|½÷+µÛÎÉ +¶³Õ8Ýí8ÐâÚÌp*3ɼÏ¡_DÑ‹vêê ò?c0¼¯âoÆ1‰í´co3°,àFà23ƒÖMeB æøp†9è(Æù5 FˆiÈÅÕ %œ-.¡¢IÇÒÕ èr©~ú9ÂÚ?!õܵ›ŽéäêÙØŠªøŸ&>šÙ˜",<¶ô^|&¡B ‚¨TªAC< èõz/^ p˘Œ‡Ëm=FújÝàŠ ;,¢ ³ Üœ~u ÖËñdå¬ÚòØjúݘjpj%ñ-7›sR0Ïü3ó¯Îqìéo1µì5âY‡lQnÚWAé 1uÜT+¢èl9ÕB–ýÓyqñ½¨zÿ~U ¸<̱Ž"ò>jä‡ÛvòóÙ*\ugÈ=œGÑÜ<¤ŸøR%Fàçç7(®\¹‚——טz~~~^¢3°Ðð-[©¦¬ÌIèÏzBàÂçT‹F;Ô]†õ…løÉH xÕ50òª*€¨þ­Í_;Qîѹ>7ZIü³–”ßlîé+47ã@˃þ€Ö€a¦êj7Ìï=²ÍNµSá{};¨¾ì†%½?·×aG‡AžåÓÉW§8ðvÜ÷C"V?Gð|ÿñ}“owÑøÌìùR©šIÂ+‘“Q) s#Òh4ýwõùòË/¹rå #†€——æv”ø èÐΆêó¥4¯@§8p:nuœ›â×9ª$þ|JÐ?¹¬».>ÈÄZäÄ 8Ïg²=n ÖóC[RÔ8>Êdß[ÅTQÆÑŒ|ªš‰šÅÚu: þ=“â¯ÝÐfçôÙ߳еËn´Qú޵÷çÕ}û$ÍËW5s蹄˜2®k42‹Ù÷}Ùúq†À}ËxxI ¾‘JÆáã|\\c§%F R©Ðë‡öÁêëëq»GP×ëõÓxÝ!-ñÿ¶‡E•»ˆ 'nO±¿:ÈŽÇuœLŠÁúéHÇ•râ;îÏ3‰ 4b\ÐûZPÜÃÁPüËh‚ƒXùJ ¿8DRØ0MÍO +ýÜù‰Ä­ÙFε(ÒßÜÑ?“òÂ!ö,,#9.ˆÀÈ Xë£ÈÊÙCHoßÕÍ"6oÐ’óL¬'çú*²öÆËô€˜^®a×ӑ̪?Å‘_ï'ûD U ãhÀŸà'vòrb<‘3¸Vn#ã@.åg:ÿàp8þ¯¾¾žûï¿rÎp‡«­­ós£Ñ8É !î$MÕ”ÿí,E¥5xÏ[Jäò‡Öè#\þԃװ¤nÄÔ7Ñ݉«Tª¾ý9•¹Ÿš—I0ß=¡õ544ÈÁhŒF#N§“úúúA·ˆäåå%‹Î !†å£ ìÑ–7RUZDM] Áz:]-´w­í@'-­-´ÞwÝMWéÒJt¬Ûô0¦ïªp9¾ÂÑ¢ÂÖŒQÎöÍH`Œnµ µ¿¿?¾¾¾S\¡âNR~,™wþkèvÓº½l n§ªÀÆ'ŸÕàhéD¥™Íüð‡±ü(`Ÿ9hhh BOÖÐÐ “ÅBáé$„ÂÃI!„‡“ B'A „N‚@!<œBx8 !„ðpBáá$„ÂÃI!„‡ë_}´££ƒööö©¬E!ÄmäãÓ³ÌuøúúÊ šBáaÚÚÚø\†¥áIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/images/azure_summary_check.png0000644000175100001710000014660000000000000024466 0ustar00vstsdocker‰PNG  IHDR:R"Z¥´sBIT|dˆtEXtSoftwaregnome-screenshotï¿>*tEXtCreation TimeWed 15 Jul 2020 13:38:25 BSTîtE‹ IDATxœìÝw\UõÿÀñ×î¹p ¨àKp'˜b®\¹Ò,G©}¥¶lØ0Ë‘3­¥Yi™{!šXî‘[(PAʽ—q~ÜËRÜJ¿èý|<|<¸÷~ÎùŒ{îõ~Þç3!„B!„Bˆ2ÀêŸ.€B!„B!ÄÃ"!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”踹Öm˜½9œÍ+Þ¢®õÃ8£#æ†þÏÕ°*áñ?AC©a±ŽB!„B!Dé±)­ŒÊ·z¥ãž@Y0€·V'–VÖwE×ê=V{¢Øsª)•K1GÙðíVIÆ*ï [Ö¬ádö .ç=ŠR9±–5Ç®râšú(2¸#ÕÊ?/…Ü„Îæþ#EB!„B!î[):4´ Bƒ “IKý6m¨°fWÿ™¾üm©†xF]´èݼð«ÂÐ=QG`͹XÂÌ„¹gspí>ÂîDÕ{SU¯–Œ°B!„B!Äý(•@‡êL›@;rϬgCÊÓôlIë*?±æ‚yX„â9€ïç÷¥’Rô¨$¾y ˲žaÑ¢—p_ÅÀ¡ ¹¬‚CÛ ¬x­1©ÒwÚž‚щ›g±¾Ò³ ºÈ¤.o³×¹)/LëOìIåüÑ>Ÿ²ˆé·Ž°äÆnàÃ÷Ö‘€†öï/ets/Ú†Ö`å·^ÌÝøµ ¿ñÚ³S8aßž/WR83×êéÓ«ÕôÙœ;ð#“&¯âœ @‡· ïÝ/g=é‰Qü±t&³9WBîŽ ˜»Œ¾5¯ðýËùá\†Ïÿšn'™óz ïOc®ÅüÎçS¦³ï’¹ý*5ÀØ¡OáïS‘.9øIê{TFC*îà›¹óÙw)§Ž“øñ•ÇI {—Ÿ›Ã5Áã~æVåÙ5µ+ýVéŽõ)×ü]ּߒÔÈ/Xš×ŽçZÔÄєğa³˜¸èUÍanŸZÅò°©3œftÁ¡È5RZåUn $øÜ\¶<«&|¼æ#šjO0íÙ×ùõÿcÄO!„B!þ¥Je!×àP|8w0œµ»€âEH{÷‚×Õ”C,_¾œåË—óó¦#dŠšJ’áî:€y&Ù€c“èR9Û÷“”W¡@ç ;v/žÁ”E¢ ìÅÇïw¡‚rÇSZd— €““óÍùfd“X¹µæ…fÉü4Ûã4Ôh>„1ý½ÍÇ5ÍG/·Æ9q+³'Ï&2¹ÆNæåÇ5wÌ]Qd˜TT¥}G·Ã°c¿ÅdQ©NÞÖÚ¥ªØž'ôå1§s¬˜1‰E»¯R¿Û{|4Øœ¿ÿà‰Œ|ª‡~ä«Ï±+¥¡Ã&ðúö%æYÕÛ{R‰‹M¿ùE‡–¼ñ~_é/°~Ñç,\s]`W>øøEªÞE›ÞM} ÞËfhu=œysWsZu¡aï7x¾ž §×ÿÊy\[RÝrõú4m€£m /ä(•òÞáÈŽÚÌîDk÷†Ö,:]‘¦ Æ±5¾ÔË•Ÿä×@µÅ Ùyš}jÑ´© kV'âÜ{LìÚ)Óƒ„B!„â!{ôŽŠmx¢Žy‰{ùã|JÞïì9õ ¾u[òdõoXz¶0àPù©±¼Ô¨<×O}ÇgËcï9«ÜØãü™iþ»‚»ö¯°zÃ+ERUÃËÝ.˜J<‡ÿÿØþ¿bÏ]YÉ’_So™¯jŒ'6ÅlÉŒ#ptuÃÕÚ /7p¥Ïœuô)ZVww*(wèH"&:Ù|\R"É@{ªx¸0p!¡è=ð²†};00¨1O_Dˆ!‰˜¨£ì û™SQ7$PW|½mÉM:ClÖͥȉÙÁ¾¸§éXçæ­|–+1Ñ=ÉÚÇKœs?õÉ—Ë9Ë¥TÇÙÉ8À¯aûЄFÁÕYœRŸÆ>VäDoå·ËÅëTšå½Õ5àbGÖÿÊùÞµ¨Ü’rkvÓ¿2dí#b·ñžJ!„B!„âÎy Ã«M(> àÖ™ùa‹¼âÊ“j³ô+ó=qŹ oi„½)š9ŸýdéqƒüÉ6š’§}¨&ãMXãÁ%|´üD‘gL\‰É¾eyóRΰ'êRÁùÎ$,â—MÀm¶[Í/‘•Æü·š]¤jk'~ή"kƒ¨†xkʾý‡c?¿Ã÷ŠÖ>•s9põ—÷z>”®šQÇÏß Pê5£ÞÌÿ1aKR±s¨V¾øx(ä* 2¥¨Ñ|>b8‡:u¢ePuüêÓº»?­šWçÕA_p%?¡¶0 Ñjï«>Å¿¯îãXV4mC­8|8±õ¦Ñ¥]Þ[^ÉæQ(Cý›Ñ²¦‰ú i{¶²¯äA5B!„B!À# t¨Š+ÁÁ5çî&ÖÒÑW´®4hV—ªMÛS}~gUWz¼5ŠºÙ\ð›ŠL+É3Ȭœ\q±‚ ¹P¿ŽÇó¾ŸH`ç¨pîØQ®ªP5 )U0¯»p+y [øtº{ºã¯è¼©ïaÅ‘³yØzùRI¼Ô$.äÄ›¨\ÑûìS=jBÑyÑÐÏt£‰õÁ›?>.¨Ž“mGFŽÔmêƒuR6FUƒ³»7ÕµÑ,™A`Wg8_ÏèB£àØQì\šÞTâΔ¼©¢sÅǧ2ñ‘ ™´Vé1å[†4hBcϯX›aÝ8;¹bd+^Ô÷¶½¯zÙxùRË*Œ¿ó ¶¯yúPJ¢yKb%k/ữRŸBª ¨'ˆØ‘8RÝß“òÙIÄD]âz)–÷–×@€‘­¿``@cÚ ÈÅS1òËæ=÷8ªD!„B!ÄÝx¤+´ò±"/åf¿?•“¹æçUÅ•áó—ÐÕ³ íëØ°ÂeØ)–4Ƕ dNwåÐzÖæ¯DŸÊMøß{/²ýR BÞy Õ¬£+øõ|;ºúôàã×òØ™\—ν㜴W}AÚC¬§šíB‡7Æc³ã"][cœÚÎeÕÈ–õ»èU÷ BG|HrµÃ¸÷¢u[vÍ|‰ [Jž>s/ޝ_Ãén£©ÙáuÞÌÚDŠkº¶ªIjäG žœI»±3P÷ {~^ÃÞ¸,œëRA¸3q7ËÁÛ‡J ?s¶Ä¼lë<ÇÔ‰íÈŽÚÊÊ_cÔzÑÜòbùëRYQœWŸÀ3ðYÆ¿ì@¼kKµF@ïÓ·àõ ™l‹©D»ŽU€$¶o>\ðò®uÛI éB£@0ÜÊ×Tòìš2vêhjg\ŸOˆ.ÅòÞú0¿žºcÇF6¦aPªáwÂ>ø{/„B!„âftוÚmšSEË{ ‚ŠšDxÄ߀Í;çøê‹ýdZMÉÓ Ìy$0ÿýOÙr4™jÁؽƃëøð­¯øûÎëÞÓ^–†]'¸×ÓÔÕùkû|¶ÜHHÙ>“æm㜦}‡õ§‘óe"æ¿Í§7L¹oÉá|4áGþ¼TŽ–½‡Ñ9¨<'~Ÿé»ÉQÓøiâ6¸†oÇA¼úÚËt°ãК©|°(ú¦Syy{€š@\lÉS{2ÌåíÏ·pÉéqžù5^üΉ;˜;nû3A½¸Žóÿ ÁàÈã»á›ºœ¯~5¯m¡ÕÞy—™¢rŽ­bUJ]ºuoA•ìxv/˜Â÷^Dù»™€‰}‘%ŽŽ(ÍòÞî€ÂQ(I{¶û<!„B!„xxÙßò>åZ·aîÆ7¨mø×ž"ׇÀ6è VNl§Ñù݈['thÉÔÞÅ?ûwÆõÿ„#™¥WÆ¢îöPWÎù–¾5¯°|Ô ÿ-‹B!„B< ¥°½¬ªøÒmÄS6%ÀNý¸ì rÜ » ¢MPÁ5­È8¶ŠÕ§%È!„B!„Š:Ä¿Šªu¥EÛNø+©üµ}ŸÞÇ6Ä¥Kƒop(mêZqåÔffO^ÏUC%„B!„ŒL]B!„B!D™ñH#B!„B!„(MèB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™a­Óé>|t§·Å¿ë0†ôló•½D_É+¹îm;ÐÓûþƶÉ^mfdçÉä»ÎŪr[^ìÇ™}“q‹4ÚûÊShNîçÜ­ÝAÑrÞß)¬ñ ¨‹UÒe2ﯥƥÅF5¹·÷›ª´èÙ—ÞO·§õ p·»Â_±©ä®õ:Ó·_gZ6mL“úU¸Í•û|ÌtÔï4ˆÁ}’¾ï‰9…Ïûµë˳ݞ¦mëÆøè’ùët2Ù’•B!„BˆG:¢CUÜðóÕðÇ¢ÏXw*ç–érã·1wþ.«¨ 6Uéб6jÖƒæAË©*ÕiÑ.€ŠÊƒ•£4\ÞósÖDßÓ1µ;õ¡‘r€…Ó>aÊüh{ÑÖËô éÞÕ?¿›ÁìÙ³ùñ¸ݺ6Ãþ¾K§£q¿ ÊJ õ†Wtá¿t6Íÿ”O¦­ Õ»'ýï?'!„B!„ÿ.6îÔåiÙ¯'¾åÊáÕû”Û2Ÿmé éÓ­®v6“ÌÁuËÙ~ö:Öî­ùŒ†ïæ„Q4¢©X—§»…â©W '™½ëV²'>°¦z‹>tkZ2Óø;:n3FÂ3¤•ÿú…¨ÚÁ%¾nU¹-£zèÙwº¾5\¨h—È/ëŽâÓ¢•+U‚³›ùnÝI²Š–³ñxœâO+j:9¢·I`ËÒUD¥YÑlÀ»xú”åÇrkËã9œè†}9ªü¯?Û–.åpº -zt#¨J9 “s;׳áÀErq¦iïž4õ(@Vü>V®ÚÍåcE¶ž´ëó4õ]ÌÇ'ì\ÏŠ=qäkŸdŽîM¢^°5«fnࢪï]Úø9a\¿´5%œÛ¥é ®²ƒ)+£iôÜxj&n&§ZœõŽX§ýÎËö‘Z,àcMzT$«.ýɵ\ í('ºR»¢6j5*\=Ï™4óÉçÎ’↳Ø6*lÇZ.•°7ìfÝ^=O4ñÀ©’·.cÕáÃ9œÛºˆ½IUy¡YÕb¯Ô¨YƒÄƒ ˆ5¨Ày¶í½È« ja}ì:Ÿ§èÝÞ Øp•#›–q:ý–×B!„BˆŸG8¢ã¿/[KLv2[}Ix”=Ot Å´s1Ó§Og~DÍ»>‰Ë-G78ÚçiìüÀìÙ³ùr]"A½;ãnJ¥`º†X³uÁ fñ+Ö Â-ÎcU©9}/±~{¹·,kV«Sþä ¾?—m—¼èÖ©:{—/á«/6“Y/˜:Å3PÈ¡¼É›¿ã›ùsù%Þƒ6M«ÞâüéìZõ—Õ3¬ÿê§©Ôjÿ”,œ=›ÙóÅ.¸7­ªXa[¯ O:æËé³™5ýk~O÷ÂÇÝú¦3z‡ö NÆVfMŸÎŒoöSá©N<æ  T ¦K‹üöYMNÝú8çæ’èëuᙚ—ùù‹ÙÌž=ý4£w¨çmÊ ¹@êZ¿û†y_~O\ÅPš×¼±<¹\Œ>DÜUKôÃÆ›Ún)œ>—Av|4tÞTÖָ׫‰z.†‹yùíèAÂú%,üòG.T ¥{ýx~Zò óVÇ'¤Y ×H‰‰†[–µØãœL” nØ+δhçO\ØçÌž=Ï:JÅ5`T‰B!„BˆÿJq1Òkl›?…•‡¯`8wš«*Ü2@¡8úâåÇÞC)dÇïå¤Á‹Õ­ÑW¯Aùó'8ž®FŽŒ¥ä‰1åy¢Kq›Ã¹xë™3f™ç8‘ ä’œf #á/ó1¹WH6èpÔß\м„ü2ä’x) ½¾Â]µ€ª¸Rß׊S»N™×ûÈ<þh+jÖs!×h ϱ.¾•±·6r~8Üa:MÒÉ(ÒUPÔ$.%[㨿Í` kgZöëF¹£8pYEÉù‹Í[®Òx蛼õÖ8>vˆ-Ç ‚y '9 Šz•$\Œþ‹\ çÊ% :º{˜ês>ê,nÁxé°õ¤eŠ vdq5Ó¯õñ¨`Kvâ>–¯úó>×ZB!„BñÿÕ#œºr3W¿v´{ÂÃ|ÝFn™ÖJ¯G§ñ¦Ç˜× ‚66NëíÈÎ,œª’—i KÕÜtǸÁW±w^ŠRÍÉ!W-ü;'ç†Èˆ  ÞxLñE?llîeñ =vvzêôC}Ë3Š Ù'täœý…Åá!´~¢7!=5$Gí`åºý¤ÞP$[žnßW;sà˜M~û Ò™®¦‘‰X£³Ói, ‘—i ËÖ=p»I™Ù…uͰ¶JXôĶ*í<‹ûùµ|qž\Àªò“ômfO!*MŹÞ3 z¡ÉsÂȲ3óߟÔȼSPê6 'Ö³Ú½+†ÅÊÀ¾Ó§É®iÀ¨Ù½ü}‚®/uÄ>çû6­c»L]B!„Bˆ2¥ôúFôêáɯ¾fïåÐ7bÄØš·Lž›–†1û/Âf®àì ›µ8Øf¢©bWðØZ§ÇV¹±ÓmM­ú^”w÷äõ·:`cg‡:øMô릳)êzÓwP|ì…Û’R0ÒØ»b[/Þ¼MÒ‰mütbŠ­+!Ï䙦gøæÂPTÅ•ö}Ú£Ý5ùRPWºŒ@¦¡xûØTpÄŽ«@.ÆÌlìtzòƒVvzl³’)y"È=²v¥õ€^T<ú#‹÷\,hçê5©pa/Qiæ6O>y„¤gZSÕQ!öaä[Œ‘¨-ˈÚb~äÒb-›GnϳkÝ2vaSÍŽ ìÝž³“o¾¾„B!„Bü{•ÚÔ+½Mf2‰i9€Žú!〶· µbˆMó¤I½òæÇvÞtèÝw0&Äcô¬G}(Oƒ Z%DlrÙ¿ôS>2…)S¦0eÊB]¾ÂÎESir1®S©šŠc=ü*éa®³¢&q"&:Mj¢@Çc{TÙŠÊMž§O¬5+™$CIåµÃÎÎÈ•„4*´ ¦ƒ v6p5!žÌªuñ+àLó&G9~·q±1çé߸)11¤?„otÌåM%‘BÄòÍ<Ým ¯¶V°!“˜ë¹˜y—v°ñ`: “v™ÉœÜ{œ7ëÒ‡sQÛ·ølOF 3~å(gÏåádm’yŽ“gÛÒmÌH*-ý’ÈðåüÙ­ÿ{µ66rz+óHOärŸ§ýZ9 ‡ôK»Ù°'¹XŠzž]‘Iôì7†ú™†±ù@ežéÒ—˜oÖ°éD: 6†Dþ<ÅÕÆæãÌS;zÐ{Ä«Øñ¿±*"áë¬*U jàB‡¾¼× ðù´ƒß3{c+öô ý°×°ÈIäŸWq6œï'/»ÇòfªYâGÞo~@7õëf~ÍáèHvÕ–Á¯cÇU¢·.#".8Ãï{ðÌà±´³53“«WËh!„B!„(c—‡[]ü¿bS£3cÛ]å«;ÊÈ !„B!„âÿ«RÜuE”»^|çeB\À–:µÈJˆ— ‡B!„Bˆ2OFt”IÖT |†gZyb d\:ÂÆUÄeÞñ@!„B!„â_MB!„B!„(3dêŠB!„B!Ê t!„B!„¢Ì@‡B!„B!Ê t!„B!„¢Ì@‡B!„B!Ê t!„B!„¢Ì@‡B!„B!Ê t!„B!„¢Ì@‡B!„B!Ê t!„B!„¢Ì@‡B!„B!Ê t!„B!„¢Ì@‡B!„B!Ê t!„B!„¢Ì@‡B!„B!Ê t!„B!„¢Ì@‡B!„B!Ê ›GyòêÕ«?ÊÓ !„B!„â?æÜ¹s·}]qqqQK©,B!„B!„”L]B!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™!!„B!„B”èB!„B!D™QfªâËK7Nز7©km~Þñ©I„‡‡ÎħîxëšCøa³9ý¯7}Ä¥Bü´·Öü=´ùž«Qz_»]&†Ζͳé䢔Z¾’¢ó¥×¸¹|·r=ááëY±dtÁ÷ýÝ*éýPªôdå»Ã¡ äB!„¢´Ø<ê :L ãÕ ’Ø«&©©ñœ>°ƒåK×p"E}ÔÅydÚ¼¿–×ý"y¥ÿLþÎ3ÿhž¿è%Rà­Õ‰ÿtñÄÿ[¼Bžc@·VøûTF§5‘•’Äé¨Ý,_üûⲊ¥.ïÊóƒ»ÑÄÏW=¤'Æsd×Jæ/ÞÆe7¥<¸ ý›ñÕm wpóæ‰îoRßÓŽQï…qÙ“()­­Þ™ê! ¢ÞÔ—™°í2ªÖŸ×fN¤­g‘ÄzWêµȧ>|0ìSö§ç;t´yk&odÔ´= ïN“˜Vì}ÒSÑߣ&ãåö.¯/:FΖéŸçH‡AÃè^Ó §Kù#îö¢"OUqå1ߊæ¦ãÌxþ ~½zïòߦ?ÇÞ9濳Œ¥ÐB!„¥§F"çŽgÍéü•Zôn¾t4˜Æ•}C†>×ߦ¸ïLF#¥ñÓü&z_¼Ýbv/èìÔò÷CQÏrì¯÷G<y¶-9ÔÒy6ųyñ켤â×q´ý½ IDATýU­/ƒ=Á¦v:ºío \$±cþ<6ÆäÐ{$ýƒ*áø"Ï7ßÎŒ€#½F ¶¤5rlíbVíOÆ1 +{?†£¢£ÙKý©µÝ<úÈ»ÛKÃDlÄBþrçfÞ½öÎ-6ÈŸýŸ@S§ƒZ™ƒWO­cî·;¹îÖ†á#ÚQÕ¶=†?Æ‘˸œËй“Ù©½¹Þö~]Þ½ŒœŽºd~²b{¦}1®Å#Å©>5ô%ÙPtN‡3kßàÝåñ7¥É2Üþ› `ÐØ‚ Çåƒ+X²ñ0ךòüà§©¡W¨ÖfíVìc͹<”Ê]kyŸòRñÓ‚ÕœT½è9x0¹iñë6€'V¾ÁökÿÞiJ•PZø”îlÆ{ÏÓ ½Îü—jHàlúýµ¹šmĘ}_‡Þ7Ej)ç)„Bñ_UŠ© Uä—^ÔQŽÝY6±ö€ƒ[5l8@`ô+'¶AœY1œáßœ)8¬Z·i|ór}vMíÊ„mY¨Š/oþ0‹6òR¶ñúóS‹ w¿™ߎ#Ú§9µÝÈK‰çpä·|±õîk¤uª†«NAS7ÅÄþ$+ÜÝÝ|ɉ?ÀµÊî8^Š'-Àÿ޽éÛ©9^nÎ8é!=%•óQ;X³ôþˆ1OSȵnÃÜæ¡ù9Q_Ó{ôÊ‚;ËÖ5‡°dN*)ñ!}§íÌsñ‡Y¡¨ûø¨Ë²ºàÅNðps 3å {W|Á—kNœ§° Müòñóüê2˜;áãQ‘¿ŸÍ޲Ð?ÚVÂÚ» OUý‰¥ FþÞÉß7ÔYU|yõ¹ºh€ŒcßñÕö4À<º«œ)‰ËfòÅŠ$.úšú’ÛMã¤/øâJOJ 55õ®ÛÜ\Wž¬l~õ'_Mü†]×rÍ#ˆÏºW¥þ>֜ˢv‡NÔ´HeÝ'ïó݉à§ õ¶"1þQ×ï¾Ãa²Á·ã†÷iŽ÷-®Q+'_:÷ïO» Üœœ±1¥Í–¥ Xwàb±$VÎ yqä`ÚyR—bòÓ‚¹wY"GúÎXÆ€º…‡Vï­§°}b&ÿa•÷¥ÿn4 °L…J‰çÔÑÍ|¿`õMÓ«t¥wï¶4ô®Œ“³ž¼üiSk—²n×yrî2Ï¢Š~ï(Îí˜Ö²ö2¾ÇìÏòÞÁôy®-ëxâä¬%3%•Kgö°|þ"þ(2 ¬õ¸µ¼ÙÊÔ¾ÿß–ž½õ¨ŽÂϸ‘Mo?Ëœ? ÿ+üî‰æóF³é²Z¤œF6½=”CßadÛº8ÄSäûѦ½Ó³m ^n±ÇWvñ[½×¥!‹lÀÎ×oˇÓÇ §I(éÇø+Qŧ²B9oª[íà\úV^ï’±Ë&ÛÒR•¢Ã+r0e«¨¶þøx˜Oœ{œ¿-ý=EMàÄ™tºz–GqªMíŠ _®€Ÿ¯³ù\Æ3üYd=…SGÏ@ÛJ Tç¾=$J¬sÀбtôT@åû¹ ;i×vóñÐõÄ&šP•j·m7k¥-ŒiF+>>•)gJ%&*îŽëe(j_èÂ×ù-T¤éµMdÂ¥Ž4ô÷0×9eÛN™[^Ñh0Fí`]ÑåEªí'0¸÷cïqI×(zÆL™J[O0‘ž˜HŽ“žuš1dbõfþ [’ÌåÒú3vÆ'E¦áh©T'„1S*s,înÊ”M–1£©:Ký³ )M`4™ß ûC˜5¡UmÍŸßKq©”÷pç±VC¨ãÃ;#?ã°et…k«˜;®‰eÔ‰”””bÓ¦Ÿûïm¼|Ça² Z/º÷jqß‘'ÕrTU|y:4‹¹#»Ò¥KgFÌ;léøéx¢k(,uS‹D”<}ìX>ö9ÂóýÞaç%ó¯fÇf/ðL-k °ÍG ÎÒÒ±àX¥r([:Ê©{ÂÙ_Âò ÿåºß^6ÙÙæ…EÒÐlHÿ‚…6ÏúË*Ø»:tŒSSÓ Ë ¦’d¹›níꆫUñóíÄ»6BË4ìèÝì»ÖNNXV<ÀšT¬t©©–À∇» ªâ†«“¹`y©©¤é3f¦¦*»»–X[+žŒêV€øÍ_ëtªÆbïnâ™N_ÐÕ:|Ì+¿cîÔ©|6k!«V~ÍkíªßñZ*lŸÂ²ªÜžþ–딬ì9dBµrÇ;?”ˆ¾ý>_¶ŽÍ6°yýJæO|‘Çœïa7¥Ou¬Jäœq þ󶟳¼Püõè8Ää€Sß¾J¯è1h§²Ìi›öëEuË·wŽ ‚×£V2ªg:w~–©‘vøßÕ´#«Ç÷ç•EÇ žÙ=k ýúõcξlTÅ—ácž19 ‡˜:¬7‡ àÙ!_s: ¬ÜZ3r?`îÄwèÙ{ 7n=út¡_¿~ôèñ"ß¹èhØ«µ¬nŸgI®üò>}Ÿ{—É–@cÊo¼Ó¿ýNåH®†vƒºLíZóÚs<7 /LøÝ|]j½èݯÉ]´Åƒ+ü~ÑÒ($ˆ¸°Y¼1z4oþ@ÕŽcd rýɀ~/ñR¿|öÛE@Gƒ#iUÞü~>Ö­;5mÍkPÍÜ“^ýúÑ£Kg^_n+å؃ÖUÊÌæiB!„M)ŽèÐ2fÎ #Ì®ÅìàûsÙp²tÆsØù7§ŽeþαU|õÛr€ô˜õ,kˬ>µîê<Žî Añ¥ñPÈÝÆÊí‘8¶mƒ½šÀ¾õÛ‰´ ‰¶ªX¸€¢Vï‚£N!袦üÎÇC{’g4>´Ñ,Q+g³ñ´y˜öéõ?pä¹4sP°®æC5+¸zÃÀ ãÁUütÒÒK7⇰¿i1¸6àJ``U~ø;ޤˆµú8 má±`ì7®#ðjH •Èð’×W)ºxä­î÷FG£Ax¯“¹³—ÎÌÌÓYôù C4Ì5À”Sx¼N%5¦KЦ¼ÕÒÄScùfæj®ª`­s*˜n¸“n2åtØÛ+¨Š=ö#²)ÚÍË6aRÁ^­®¤9'ŽtÙó…ãüðí±Û¶ÄíØë —­îPì5EïNÛ13Ð3ù«w}N«Ê-ùpò«–©D&,œË®ë Z;¡· ±öz†ñþú‚õA­žêA½øt¦¯ÅßY·:{QZ.oýŒi›Ìõ™¹ˆÆÍ>¢¡-ŮьßònŒds1ê¬ùÐä=ŽË£NM+¬]Ý©f çòt5¯k9w*[–,áoƒ ¤±uî"Z7ý ‡ÛVÖ6 Í-”¤=« Œ6Å­dõîþ¼ÙÊŽªMÛSkîQþRu8Z¾[­#nÎZÎ]2AvËßÄzŒd<’u*´þùcÞ]Æ)Ë‚¸WöîáŒÚ’ú ”w÷¢‚²»TG?XÇ­æý9áEòÔѪM4˜ƒ«—³ÓØöÝ&ú·z‰*Úú„;²}c*å´æÏ½Š7¸ ds|ñXzü ÆÒ^hD!„â_âÿÅÔ•ò>Á‘lj£*»WâP²ö²yǶ­„¦~0-*¬ç׫hÚ´&y‰{Ù|¤äÝÿåºß-Uq¥ý[SÙª Ì‹^~6þó‚Îó]PojH ¾ÆóÑHóv­˜’›2þÞ‡ð[ªg¥½‹NsöÍ=ImƒçèeYc$~ó’Z¸ÓÖ”AJJ Í•£+YðíoD§»ðäËãÕ¶:t´ìÛ‰ov.+Ø…ævÊ×éÉ'^¤–ƒyšHôÚùtcBÁëK•½žÄˆÏøxÞÒòöÛ<åc‹•[{<¹„÷Âïf­#Gö™ïbŠ%.Q¥¡gñk4ùÌ!RtÕjDËÞÍpÕk-µ FhÑÚ€šãŽw5K`A½Pl $%ë8'âT‚ê>X ÃÉ˽àû°‚¦Ní]ðš­›%äTÚ _eÏÁKtèT+·`&|Lzâ¢NEqä`$‘‘GÑV¼FÎ=H¢›?!Íy6¨£eJŒ+•‹¤*amÜGêÜ¡ƒÅ+ª•WÁ!Uq¥ë»Sh[ðªcÁˆ?_ظ‡Ã»Ñ¶%öJ5ºMZJ‡”xbÎÄpêàn"wíâ¯{›-'„BñŸQŠŽTÖ¾ýóŠ,ä¦Õ9áÐ…ácŸ¥®GS†~ìDÖËcØtáÑΣ¶×j þ6d¿ë›k4’a¹3}{:*»;Q®nUG Ö–…Hµ4òu&7é׫¸ãnJ#>Ñ€¢&°`üGؾ6Š6Ñ £²?•}üy¢So^NÜÁgã&³ó>·×- f`(²]¢¢š0ÝaF€ÑP|=…\£‘lÌëDhu…]ƒ]ë"¹ÚƒJJ=BZ:òKd“‚E/ÏîØÌ­úÎÿåºß­/|<…瘇³_ÙʧïO3Oë±0 {4ÚbÁú‚¨œc±Ž½ŽÆÃ&3¾{-4€jˆféÄñüpøZAŠ<“©`d†¶ÈçÂü8¿þF2²U5ƒ,ƒ ¶ ŠVKÑÔV-ùÅ2™nì}éhß«mÁh’MëNÜ©Enë|Øûô »ñY[fÎ!¨ágWT°ñö§– \¾Cüɵù¦k‡‹ •Ý >à“ÕÆ‹ò¯![ k/‹fmåB`ØÃ—‹·ó„e!eŸÇý |÷ ¯¦‘’ZmSTi(þ…ãÚ|“Æ>Mµ[ì~+?Èqœ¹cÇÜäóh¤?£ÒÍ;Ô£¡·uÁkÞÎÔr}Vn~ÔÌ_CèÌVKÃ<í!¿~…å‹'>1 ªøûÖ1϶!ßÕb¤%(Ò¡O%-ÿºò¨]ìs­Õ9a_|  ¡¢»;LIŽÜÌ¢9SxcÄsŒœwØrPmü½o:¨Xž÷ª¼¯_Á{qvÇOüg °®æ]lêÊý0¤¦[þÒâìZÐRmëßåb¯…”¼X¢b-©u§¶{Ñã5ètš›î>8¸¹SÍ)ƒóGw°zñ\>zs(Ïý‘‹*€Žºž÷X#!„Bˆ²¯tw]©V ??¿‚ušòTï÷xÓ²ø"9uì ¦ø8òÇuè{п–- Á멱ôò°bgÛÅËVˆ6~=xÕ²Kƒc@O†u¼»ª1ý¿_$Ï®GmcýöH"##9š¤Z"ý…ÈÈHvŒ#pnõ6üÄ·_ÏâOV-ü1«Ñáh™"‘g4šgî\]´lÝiåÜ„~j`ƒy-‘wY¾{aãÿlATh0€A¡•,•L`Çî⸄­ë8šØ6¡SˆyªÅáˆóÐÛ½½Ž 6°aÃw¼PÏ\ËÿJÝï•.h(CCÌù©†ãl=`ËcÁ!„„ý×-(é{ØrÀ¼À¢}à ¼Ù½9ÁŒz·yÏ¢ ¢:´dԈƖN*û·ž¦j`ð ç ¡¶³‚¢&±=â$ŠC FéLÀ@ºŽ[°“GÑ©9‡Ã¶c¾ïJ—WGÑ&(€ÝÞd¨¥=®GmeÛ wêýýëXþºa •b4èœprrÂÉ©p‡tŽùÏë°ÁÈ•lWêÔñÁÃ3˜W'½N— š…teÜä— 0ÇfHÚ»•“¹æÑo|»Þ|M®|‹ÖæµúéoÙ¡Îî‰ÄàÕô¦öiâcá²{ݯuîùÞxº4o@PH/ÞÒÂRÎTü~ê®ß÷;É3ÈŸ\dåê—-€Ž&C†Ñ¬¢e}©ælÙ³ç´%µ­_@=4®t3¸ =È45‹Ó²ŽFpÀLÑ5íËKÌ׬âÜ”·¾XÆê ᬙÙ”Ê]øbó–~ý5“þפ`Í Ðàà”$H#Õ2}çVyÞ«Ì4CÁàgooóµ¯õâùÑO@¬œÜîzG­¢.ÅÇœûñ®…í:úeüï¡}͌숟Rö/=MU-€†:½'óÓª l ÿ‘QË¡*^¼²`3+–|Í܉/R«È4&;§Â‡’ïfm!„Bˆÿ–ÒÝueäŒw]É—ù%ßí7ÿ¤TÒ·².r0o¶*Z/úÏYGohµI¬Y»ŸîÝ™º»€VyòÃÒ½\ N„Œ™OÈókàJà óã;ÛÉϼitá‰þþ>¨Æ#+~÷a4›. ÿb¡s^¥®ƒ+ÁÃÞ'¸Hº¤È¯øÎ²þ.0¤H׉à¡ãŠ¥Í·kê&lËâìº/X:‹n5mñ Á§¡…irãÂùâ‡3…c–1'¬uªB…:xcb‡ÂĦX¾ûbMñÅWj»k-uIâLü «ÁZhŒà»)ío±£è[òñÒ–m1íÙÑü²x¿N¤­§-å}Ú0üí6ÅŽÉŒ gêüƒ%怾!MêØ<ô ÁÛ¡7'Kø¾Óö}ê[>_ÄøîÕ±skÊð÷›K—P¤í%};ŽfâÛÀ+çÖ|º´>i¦ ¸é/ðÍümôÖ{¥ýgKÍ¥ïóáÚÅìêú)Í+*”óéÉô=sðì`”~V¨w± gê™8ÒÔÇqTÀ½ã'l5qôÛ!¼µ:š37Òàãθh«Ñíãè`0`¥·|~M±¬Z¸Ú¤í˜Æ¸é[ˆNL'ÈJ‰g¼>}O ‹Üe³3bAû†óÇvÐø/×ý!Ê»Î;c&±áÀiR &ÀDzb[gÔä÷½›…¢Æ2oìh¾Üt„ø”¬‚v8üëF™Í‰bÛ¦f³wÎHÞ™·…¨8K›Røû@SFŽfÍé/|'œòƒR3¼½Ó1fŒÍgËw—l™êd"9.ŠßžÂð³8‘þ0ß—löÍÉëÓWs(æF¨&ÉqÇŸ?ŽQ“î¿íK–ÆšÉãù~§ù}ÖjíÉKÜÃÌ·Þäçµß²xçù‚é]¦ìlÓŸL|íS¶=o)›sG#øì­wÙ—¿Ø®GÝ탃9§–0ãç}$X®-ƒ!‰„Dó(¢kG¾`Äèi„8M’Á„­Þüù=±kGŒæ‡ü-š1òûô‘¼ñìÝwtUUÞ‡ñç¦I0 ¥H@ (EAF°wÇŽ(‚¢¨è«`/èØÎ¨(‚3VP ,)J-@ $ÒîûG"Á;Ïg­,É=ûüÎ>'ÁåùºË€1Lùe59…QT®R…ˆÂu,[4•·ÞF×¾lý÷üWò¾ãÉ{0ù—²ŸOTL$k~Iï^Ï1îÕ—˜¸p-E@…ekdì…@pï}ŠÏgþú³ÏgåïòÀmýøzÝÖ¥|‰ß“‰( üÞü¿[¸ÄçÌ]¾–ÂÂ(b¢ò·ý>=ôéÖç“þÅ#ÜÞwhÙs_WHÅ*Uˆ&ÕËçòùëOÐíæ~ÌøS×%I’BC 11ÑÿJúz?^»­)?ºœ¾ïïùðç¦]_¢ß‡ù||ßÕ<óýÁµÞÿò½K’$IR¨; »®èàˆŒ!&6–û‚ÛÏ/[S¥dùG¼öCè¿èÿ/ß»$I’$l :´Gê_õ Ïýãðí>Éäíþ66Ï& IDAT£¶îòÊöìÞ#9µû3\Ò`Ïfƒ•fL ïÃïýá…L%I’$Iå3èÐÙ”M~ááD“GÆòY¼÷¯AŒ™óæÒ„öìÞ‹øb`w¾8”$I’$må’$I’$)dð]W$I’$I’þ,’$I’$)dtH’$I’¤aÐ!I’$I’B†A‡$I’$I ’$I’$)dtH’$I’¤±/‹~øáû²¼$I’$Iú³téÒÝ$&&÷S_$I’$I’ö)§®H’$I’¤aÐ!I’$I’B†A‡$I’$I ’$I’$)dtH’$I’¤aÐ!I’$I’B†A‡$I’$I ’$I’$)dtH’$I’¤aÐ!I’$I’B†A‡$I’$I ’$I’$)dtH’$I’¤aÐ!I’$I’B†A‡$I’$I ’$I’$)dtH’$I’¤aÐ!I’$I’B†A‡$I’$I @XêÿѺã%DèŽüA¥ÑíiyçóÔJòÇ/I’$I -ûþ]=îdRÛ_NR­d‹ È[:Ž_>|‹üÍûüÊûLÕ#³qÙ›ïâxD i|nGâ FóÕÈ]·;P ¦0ç?K(\[z »"I’$IÒŸjŸþ/ý` > ¯¸“*¥óÓK73åµ±9ñjŽ=£5}yá}(¨Aµê°naZ¹Çcš=BËóŽcÓÚìýܳ½‘ˆåóØ\r û!I’$IÒŸkŸŽèÄ$RšõsǽÇúÍ™üòÝ,Z·jF4“È/眨ïæè¿·%>.†’ütÖL{‘ùßÏ¢¨ÚáeDŽ!½Ò…¤Tÿ™ï‡ÿÄ1=Î$ýÃ_8ìogPðUWfN]MÔáWsÔi§_5ÒüÌ-5¦•[ãÇÿdcí«iü÷¶TŽK ¬8“ÜùcøåÃÙTÞMÅ6¥J•ü¼ªüÑQ¥ó˜þâ("NDrí]?› Íᤦ øúÅ‘ÔìJë+Ï$ã0oÞ& ’ÿx“äU·3mÒ2bßDƒ“[P9®%y+Èœ2ŒySç,çž~ø‡^û‘³ú±¹îU$V©LTx6«>{šs—SÝž“n¹˜ô—»²$çï´êy&ËÞù„j'KLL M X8î122 H*7»£OlNtÅÖÍFf…[¨Ä×ã¾%w©gu&ñÐdÂɧ }2 ?ƺõÁ½øM‘$I’$éϱoiÈûš_ÞJövÓTbªÆSšŸNy3W‚•ÛÓôâv|õ _>} ß¼ù.¿Ô†U()†¨Úí©¸èi¾}q0‚$‘*0Ô Ì™±š`å³i~ÙÍxš¯ú_Á·c?$úÄûiؼVù5 itþ¹lþá^&?}_¾8„MÕ¯£~óêåÞRD­f„§Ogý.æ£dϵGÓr6¦Í¥¨j*•·DM1µS”›IBÝTJÃ’X½€œ´4‚‰ÿàØ3š“óÙ]|ñÔå|ûþ/Tm{7‡Vî=å¥@Ò Èûô6¦ ëÈÔ6SëÌË©ü›¡4 ) Ô N³êÌÕ…owcé†#©ßz˨›š×Ѭ]=Ö~Ü‹/úßÊŠ¢³H©KiqYR£}oâ7ŒfJÿóøâ¹Þ¬ØØ”†§·=hGìH’$I’nûu5Ê@õ«iج2Ë>ÿ°Üu+bu âê1,š›F(Y;‘ùÓ2Hlr á¿ÖÎaéÔYlÊÏ ) Ä;sëÖeRR²¥Æš ,œ1’’"Š3ÞgÑœ ª4úQåÔ(%†ðˆ"J6ç‚yÓùå¥K˜9uu¹÷P¥n*yËgóßÎúä|ONþ‘$Ô "©–’@Öw“Ö„( Pµ±á³Y·¢”@Öë|7¸‹¬ XRDá²÷Y›Olbü¶z;<—2ÓÆ‘±®€ fQQƒJÑåE‘¬™>š%¹d,L#¢j €øÍ d|Ì’+–䲿ËWÈ-üõ¼(Â"¢(-Χ¸(Ngå»]˜üÖ§8žC’$I’t ì·C"¿žãÏoͺ }Y¼<¯Ü6±U“¯ymîºnÇjl )JrÓ)ÜþX0ŸMë·½ÜÇVMØ©ÍÆu™„L…ÀÎ5ÂJ§3òbšž÷/ªµšÇÚESXýÓçä¬ÛybM0P‡¤š3¾üõ9öF 8Ÿ¬ô 5jÕ¡tiUªU[ÊâÙ³8ä”KËFyÔjLøÊ/ÙˆæÆ7Q¯Q=¢*”=‰¨XXµµÞNÏؼ6}Û7%‰$,~›2‚9lÞ°íì`1Â# •bã)ÍÍØzJ 8ŸœuA Ÿ“Þ¢úE÷ѺnëÒf“1ë=²–gtH’$I’ˆýtDó4=µéïõdIÚ®é,Š dÒ[Ÿ–{¼@IÛ¯Ž ˆÒ½^±C"6|ß—I3ëP­Á)$Õ?‡¦7\Lú˜žÌ_°c_ƒ•›½€ô]¬Ï±·Ö.žOƒÆˆH®NTî<ò‹æ°vÍá$Ô §BJ]r?K P±YoŽ9¡óÞêŪ•y5Hí<„Š»¼§?Qx¿¾Rº]PRºbßzÊuO!ùèÖyé`jM{˜igvH’$I’ö»}>u%2õvšZ•ůõÚmÈP°6“ðªõ©´Ýg˜D"ÃwyÊNòÖf·m@lRMJrÓØXî›w$11°i kfŒâç7º0ó§ Õ=q§–Quš‘1 Ò~±…K¦QœÜ¤: (]9BŠX“–M|ÊéT­^ÀÚ%™ÄÕ®Oñ²q¬ZY6&YŸ¸Cþœ>ünósÄ$m: Ô¡JÒ¶é/a1ñJrÙ°à}¾{'SÞŸJ\Ó;­"I’$IÒþ°o·—<ÆZ’óõPÖæÇ“¸å+¾ÜÅ*ófD~ìiqBc"Ã!wG_1„Æ'×ÛãkæÍþˆ‚ø¿Q÷غ„ID ©›Ú“Ë]¤4ñjZtý'uR’ËúT±> ‰1lÎ]±SÛªuë³aùôݬÏIį÷X! ˆßíý6L#» •”&5ÉY6€ü•ó¨X÷B ŸCNVÙ¹9D&7#&¼¬Gœw¨P%aŸËµnÁ,5ÚsxJ2bHhq q[R¤`XCŽéü<¶ü¼#¡VM‚¹lr8‡$I’$騧SWÂëþ¸ŠQÚ=KR»mŸ‡çóÓ€ÞdýfÿÖÀ† ü46‰£ÿv;­NK ¸)“ìŸ0{Ò¢=¾f`Ãf¼S“£O{˜Ö*Pœ»‚¬¯bÁOå/.–5ŠŸ>‰¥AûgH‰‹%¸)“õ‹G1óó™;´ ê“X£ˆœ©; ¿* kHã$aëS=›–·œMXp ³÷duþŽoÿà²VDpØÑ+Y´¢l«–ÒU³)¬Úލy£¶¬Ï뿪š=9®ç›”æ-`ùÇý˜p;ÍO»—csû²tŸÎÞ .ÆìïïæÈsQ›ÖLÆÒ¥¨ Jç0ë­‘4ü{wN<%™0ò)HÿŽ™cÿ³Óz!’$I’$íÄÄDÿß»v/<Jж|CÊÕÿ&aiw¦MZv@»%I’$IÒoí×íeuð &^E«Û‡pÄ‘5 „ÇP)õ:jšIÖÜ]l‘$I’$é@qD‡~G$•›ÞJƒ͈«@QîbVMÆâ9‹ÝUE’$I’ô—cÐ!I’$I’B†SW$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!#b_†M§¾—px ìûââ<²W,âÛÏ>búŠMDÖ;‡;¯j¶sG‚óyí±©œpÏåÔ ì\»tÍ·ôò1‚‡pZ—[81r:Ïù¬à–Ó‡qa¯«)ûÒJ¨Ý¾;—Wþ˜'Þš·S­Èäc8»C+êU¯L8P”“δÏÞå‹…þ´g!I’$I’ö½}tÈàýg†3uCˆ˜ªÔmÒžs¯¹‘*ÿÌgKŠæüÀl )¶7ï¡ËêÄŸH÷[ëðÁ#ÿaaévõ«5ç¨Í“™”ß”f5'0ayéÎEv#H¢Ã?Î ê›<;2‹©Òð\®»ôbÖ<û³7þá[—$I’$IûÙ~ºRœ¿–ù_ÿ›×¿ÛÌIí'úO¨™Ò¢¹3§1uFG5?bï ªQ->—…óÖP@ ëæ¼Ç°áoð‹!‡$I’$I•²FÇŠŸæ’Ÿ\Záÿ]` 6ÍS³™:;Ÿ‚ySɪ{,u"÷®F t)³ÂéW\ÄIÇARL8PBÞÚü-Á‡$I’$I:Xìó©+å)ÍË!Ÿ#¨Uö} þxºÝwüm6Íy“'Þúy·u*ÖkNô™Œ)‚ó™¹ôlš§V`ÉìÍ{Ñ›|~xu0k[´á„ãΤõù ”®YÄ´/'0qv–a‡$I’$I‘t„ÅÆCù[òˆÝ­Ñ±ká4lqquŽæÿúœ³å³J*5$|ö4Š÷ªGù,þî„ÇP«Q[Î?÷ÂsŸÝë5?$I’$IÒs@‚ŽZͽôk–ý7Bņ4­‘Æ«ý¶-N ÔåŠÞ£Q¥iÌØ´geÂâjÓ¨Z3­)û $Ÿå?çÇ&}¨_½,Ïÿ/:)I’$I’ö§ý»FGø!Ômq)—62ùãþ¥â6'qÙÒ¶ß%¸˜Ù‹hrlÜžЬI›\F‡Õ([2$œÊ‡·¡qr.KV¸©$I’$I“}>¢#H2gßvgo"{õ<>{妯ږP”·Fä3å•g™VÞ*‡Ð´ù¡¤};o§54ÌYÂ9måïîtVņ—qÃmß—®žÈÓÃ'1òõŠœÕîJî8/–pŠÙ”“ÎÌ÷^áËUN[‘$I’$é`HLLÜ«•1$I’$I’þªÈö²’$I’$Iû‚A‡$I’$I ’$I’$)dtH’$I’¤aÐ!I’$I’B†A‡$I’$I ’$I’$)dtH’$I’¤aÐ!I’$I’B†A‡$I’$I ’$I’$)dtH’$I’¤±¿.”@µjÕ¨T©‘‘‘ûë²’$I’$é TTTDAAkÖ¬!''gÏÛ/AGíÚµÈÊÊbãÆïËJ’$I’¤ƒTDD•*U"..ŽÊ•+³|ùò=:/˜˜Ü—«]»6ÅÅÅdddìËËH’$I’¤•œœLxxø…ûtŽ„„CI’$I’ô‡eddF||üï¶Ý§AGµjÕX¿~ý¾¼„$I’$Iú››KµjÕ~·Ý> :*UªÄÆ÷å%$I’$IÒÿ€7ý»íöiÐ飒$I’$é¿V\\¼G»¸îÓ C’$I’$i2è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$…ŒˆÝÝ êpÔ Ï|È®Ûd}Ü™Ÿg®ûÃ×?ª/­Î¬ÀOÏÜKNð—‘$I’$Ié #@>¹‹§Sö}L­¦DW„+§“—_öYNnáq…H’RÆ‚ÿº¯’$I’$éÀûK³Xõéì šÃ¯MÊ¡E¬ùæ1/)ÙÒ(šÊMzqäñM‰‹¥8w>«& "mÞ qÇSïïW“X=‰¨ˆ"6­›Ïò‰ƒH_Q‰Q½ ”Òco³etÈ&*7麵^pS&9¿¼Áü/>gsÉ.ú)I’$I’þú5:Âëß±íN!*÷ æŽFæ†Ã8üœ‡¨}h©söÝÔ¨`í÷£™ûÅ6Ç4¥þ…·Q­B.é“Ç‘_ `:+>ÆÊyïıíN!"÷|2Œ¥‹òHhz Nm| oU’$I’$ýŽ¿öˆŽßMÍã[ÌdÉÄÑd­ ’™{‰WË¡ÍN`é‡9$(ÊbíÜY»¾¬ÅßS¡€‚¢|Š}ÇÆÍçP9:‡µ3?&'ë¦lÎüšÌŸfQòÓw¬™‘DiîÊ}³’$I’$éwÔAG0¬±‡@0D½Ž¯Qo»c¥UjYúéó²‰oØ„F]^£(7õËg°jêX6”Pîx– '’ߪ.ñÇ=H«&9䯚ǚ¹³bUþþº-I’$I’ôÔAǯÁt–¼;œµùÛm›RœN1E¬ù°;?.U¥P-µ)sGÝΪœrjåŒgêˆ%T?ö4ªÖJ%îÐ^«‰ÕÿɦàÆ,’$I’$ýuÔAG t yë!1&ž°Í?³aU)T¬C|õŠò‹€h*$Ö'lí',|ÿ ’è–ý8¾U]ªÔLØ1èŠ!,º•«‘5y«€`Åã9¶ÓÝT9â¢'LÁq’$I’$ýuÔA°â‡)Ô:·%5Û÷¥pÚ,bº€ê‡V`帙»ñ(޾ò*ošÃÒo'SPEB½$䟕ÁŠo†`L}jz‘s&²¹þm4=>™Ü_^gå’<ˆmJL .Kcó¾]I’$I’´[á111ì«â‡v«W¯þ“ªEÌ…$T.%÷ç·ÉÎ)›D\;õ›“ˆ­Ý„CSUºšU“ždáÏéJ—³fÙf¢=†¤F§’\¯>QÅKXùÅ–¦­6PP|8‰u%ºJMJVO&}ê7ÆÔ!!åDª}U“£È[ü1ó>z‹MEÒ­H’$I’¤½V½zuV­ZµÛ6ÄÄÄ}¶ìDóæÍ™1cƾ*/I’$I’þ‡4iÒ„©S§î¶M9ûŽH’$I’$œ :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :þdÁ@ nú>ý.H e¯Wxçá¨VXíkxáýÁœY5ðgvñ€‰>æ&^uÇU>˜ï'’V½^àå{O!ú@wE’$I’´“ˆÝ¿š` ·¾0ˆÕw~gððù}ø¶x×ç‚™¼Óÿ^*gçì»NîBDÍS¸ùæ+8¡Au*æ³|Ö8†÷ƒŸó‚埙H».}ézfm¾~àRúÿP´õP0PƒÓ{ôâŠë‘UÈê¹_1¼ÿ`~È(Ý©L•6÷3üÎ&;ÕØ^0ª ·÷>•_†uáÇ Áß½>@Ö7ÑãÚ6ÔO®Àúåó˜ð“¼üãÚrë’z7w9Ÿ¦u«Q˜ÍòYŸ3bðKü”"IiÛ™›®lÑ (ÌÏäç/_að _³&qÇ\Ã=7K°0Š¢Ù#è÷Òt ~-{ ½†©}nåÝe¥@“÷çä¡}¹í´_xdâšÝüD$I’$Iû›#:v!íÃéÚµë_]n|Švr”)bõ¼é,È,ÜÝÜ*¨ÏMÞE³¢OxòÖ®t»o85¯¦O¯¿•ŸfÅ6åÎ9?6‹µåä M;?È­ÇmâíGoåºî31x÷ö½”C›ÿÄž@ÎÇñ;·[çÜk9>ÿF}“»G×hp=ölÂâ?H§N½xnJ ínº’c*”sïZqǃב”6š>7v¢Û}ÃI¯q6}okO4ÑàèuË^¸“K.¸€ëï~ ­ïæîKR ÈeÛ°pè]ÜuÇ@rN¾ž¿úë_‹HNëv ŸØr” Îfä[‹hqõ%Ôöo$I’$ý¥øš¶ ›3W²bÅŠß|eS H¤]·Çø×ëc?~,£†=ÎUÇUvžº²£hwƒGaìØ×5ìq:X}ëÑ@B z<õ"oŒËk#çŠÔ˜ÎN½vïîÁåüÔÂ⓬øˆáýÇ2cy&«çMæùw".µ)G†—Ó>&†…oÝE§¾ ÷7AC0¬!g´­Îw#ûñþÌåd®˜Í«Oý›¥uÚsz½í‹EÒò†[¨={Sw5j„²Q2çžqs&ŒaUð÷¯‘´½øL6MÈÀO!3s S^îÃU×`ææë‡WÊaÚ›ýyvÈDd”ÝûèR)%•àrJ]ªæÌá£)Ë(ò–OäËy›©—Z—Ò@ µj¬a^Z1`i™‡R7¥,ªtÌM\ò OŽœ¿Ó5W}þ!?ÇŸÊ9Í"wyß’$I’¤ýÏ ã¨Þ¡'=Û”òæÝ×pþù×òô”p.ºãŽ«¸ûóbOìÆ½—ÇñÁ#¹ä‚«è3r§öyˆój‡ÑœÕóNN |Â=W_JÇÿ{ªÚPm»ó3¦~ÄØw¾&³œL!˜ýîÄ7붬’œ@iö ²vžmBiÆWŒùl)åN4‰OåðØ•,ž¿q»úóX’“HÝÔC¶~V±Á5ÜØbƒ‡þÀnº$4£aòJfMÛ6gw׆էij€´uµ¹gà(ÆŽË+ïåü£*—[¾4g6ï¼ý%¿ºˆMjÊ¥m kÚ–”Bδ),ŽnÈ9­k ÄÖ:“S‹ùqÊL " j»‘*Á¢ DÕ§[&L5ƒ³ÀÐOóç±utL`ó4¦/Žæ˜fuwwç’$I’¤ý,$ƒŽ–-[2`ÀFŒAË–-ÿôúŸ>ÆU]â“Å(*ÊeúÛ“XS‡úÉ»{œ‘œ~nr>Áø¹ë(¦ˆeß>Ï»³åÌGRÞŒSš…ñõÛcX˜WÄæÌé¼ôÞÌ*äÌzßú‘õ»<±U…º×ÐóÜ8&¼òkö ýö"ˆ&ŸÌœm'È&3;H•¤ l”Ƶ=þ·ðÃnFsTLI¡:+™Ÿ^NâRŽ` „„ Æqü8¸—^u #JçnÛm˜T¶xëx^é>ŽLNïg¿£fŒã‰çæÐ䎡¼9~<¯»•*Ó2àÓ,ÂJÓ˜—vÍNˆ‡Øœ²”Ù‹‹iÔ±'©s†3¿E7ŽLëÏ·¿DàžœµuZKKÒ³I®•²G÷$I’$IÚ?Br1Ò®]»’”T6uäŠ+®`Ê”){]£AÇáŒï¸ãg%ËÇÑõ¦a¬ŽªA»®åïGÕ&& ’„°b¦Æì:èjP#)@Ícžaüy;Ë/H"<1‘¸@?¥o‘¿"ƒõÔØë¾Wk~=õ>ô¡÷0ø‡õ{}þîmƒqäE=i]ð&·~šò¦él_™ˆ¼|ò÷8p‰$˜?nÏ]ÀÄ¡/Ó¶õÝü­y?~]þ‚ ÁUoÓ§ûwT¯Õˆ :vå©; èöÄd6×½†zÉOÝĈ¯WQ³%ÝûÞÆý—dpû xgðhzÝÒa—mdþ¨ç˜}϶^οnNã¸'Šùéé¥ Kønþ¡œÔ¨ï®Ê ;;°ºñ`Â'I’$IÒ¾’AÇö?¶•iÚ‡ýxz|úŽåŒäô^rYò—<|ûü”]H°r{ýçš=ª;wdWncÅNŸ‡Õ¾† ¹­¿HØÛ RÚÝÃ#çË=ø×7åïPò{г³) †¤ø¿. $¤„2³ KnO÷‹#xõαe£EöäïEÌ&§Âó ¶}V˜CN~$‡ÄÇ»:ŠòÉH›GFÚ<æd&1ê©Ë8õ…¯Xw^;’æ¿É°/ÊÖè m2/½wÃÏkGí·°,mýnŸPV$ÈeO^À’»óÆ$N)bÕ–„fs~! ±@þžß‹$I’$i¿ É cøðá\yå•ÄÆÆòꫯþ¡›3—–¶s  Ô§Qjeæ¼ö:?e—½pÇÔoDõZî(L'=3H‹”`[Ý„¤$6dfR˜±œõÄ“” KÊêÖ¬Å!»¨WžÄïà‘Ή¼ÑçVÞ]TΪ{*gK²¯#µQ,Í.ëB*G&d1ivÕ[¶åˆÊ5¨þä(‹w¢ˆ"xÏhŽ‚\¢‰/ÿå¹L¿÷%Q-®¢ËIÕ‰ ’ªÇ\ÃcÞ¥k“Â6Oãû¹œ|ÑÕ™Cåš§ÐåÜ;,Ößø\®¿ø8)/0ˆ=î=NfÑëCøvCIII[¾â‰ lMózÞÉÙÇlYä"²¬Mrb ‘¨ŸHRRq1‘Jç0î³e4»üvÎ>¦I5›Òåž+©6ï}Þ_VÊÊ¥S§®tïÞîÝ»sË­3eC!“‡ô¢çðïvêÚ¦´4Vsõkl÷ë¶›ëC.û–˜V]¸åÔz$%Õá¬×Ò¨à ÞŸZDÒìâ;èÞ®yóf².¹=]ïhOýšI$§´ Kç6ĤMfúº 3'ýDA£s¸ñ¤ÚD•kžÂµgÁÊi߱ݮ±N£Û•ýÜǬ–…SsÒ"hи*Á@}NHÉbÚ¼_G™DS7%Œ;‡a’$I’¤'$Gtì[¹¼ûüK4»ëFŽéºßóÊ“÷Pñê縱÷`r¸o—gæ};„ÇÿÝ“ë» áÝ>6d¤ñý ÷3|F1ËO>A­;;ñ舳)ÍžÇë/|@½»[‚$7ïÀíæñå˜$­Ø¸-Í+GAçþ¼ÔyÛçà|u¼÷³“8®uJ áý™pøy2¤Ó‘[Û¥ö|žÖ@þ¤Ç¹ô‰ÉÌy?ÏE÷âÊ>C¹1*Ÿe³&ðð³cÊ®[”Kfæ¶kÃ)* ²9'‹ÜüröQɞƜŒGˆüÞõ×}ÙŸ‡â{rSç'SÄêÅßóäÝÃX¸%˜¨Ó¼ §ä|ÇÀOÌžÈCwÇrs—Kydà­Df³zÞD~ò²íl§à¾g»qÃõñfï ó3Yðí|~ÚvŒæôn`Ì}|²z[úñõÈqJŸ~¼tN铇3~K2¬ÐŒF)Ì|mÞ.Þ’$I’¤ý/˜˜¸ÏÞ7oÞœ3fì«òÚK5/~’+ÖôåŸ_üÓZþ Ã/îÏÀ6S¸îÖ×öz˜¿¢êg<ÊKVгóÐF…H’$I’ö&Mš0uêÔݶ É©+*O­š3mzù yîkKÞ{™âÏæªãÈõÿLÁ¨Ft¼¸Óþó–!‡$I’$ýÅtüÏÈåµ{îæÓÜ3œ"P8ƒ§ŸüšcoêÁq•ÿØN8 ‘œrsOŽZò<Ï|’u ;#I’$Iú §®H’$I’¤ƒ‚SW$I’$IÒÿƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :r‰g<ʸ7Q;D~’ ¯}Ž?}Õº'\ ùž{mç× ?Ð]‘$I’¤ÿ9º5Á@n}aªo{Óæ‘1ŸÏGæ¥oW¸Îý×âhym/®nw5¢X¿x¯~’ñs7•Ûúo}ßæö+îðY0{"½;>Å/%ÛÉɽ^¤OÛÕ<~ÁL*Ú±N0P‡îCqzñh®ºõ5ÖËï]DƒëéÝa#nC~Ë;x§ïiDþ¦M 8ŸAoヵۊìQý@"­;ß•m“œ`SF_ÿ{0C?]Dñ¯MšrSŸÛ8»Áªî#¨Á9÷ôâô*E(à­'åËÕ¥[K7¼ö9z'¿Eç'&S 3ÆñÔÈ–ôï}Óº cYéN½‘$I’$í#»°øÝ¾<üN:Q1I¤¶ëÈ}ú¼ó^þ¹øwÎþk:ââ¹ëŒ o÷¿‡•pÌ%½¸ù^d\ÛËÉ:âc¢XñáƒÜûÆ’­Ÿ óÉ.Ù±]Åéܲ2…”yQOZW/‚»ë]4.?“àWòéÚ ‡Ò©Ó+;‡Ù›{[ÎcvöŽIÆžÔoØñAz·YÇðg{ðýò uZw¦wϾ¬_Ò™‘ K¨Ôàžês*Y³3(l𛞵¼œ+b¿¤óíãˆ9ãQžíx2_>1€°ZrsÛµ êöÛÿV,›ðo~¸âa®iû|’³»—$I’$ý‰ :v¡0'‹ÌÌÌ-ße²ü…þÙl8'¶ªÇË?Ï#Дë{uá´ÆÕ‰£Õs¿cÄsýùfu)I£ózsÓ%ÇR#!ŠÍÙéLkO½ó3Å»=aÉ­¸¥g'Z5¨BDa‹¦¾Çð!ï°0¯ìå>î˜k¸§Û™ÔO®ÀÚÅŸóïYÛú\v½{?%þÁýŸäýæŽâ8®e=2?»ƒÑß.à“!ƒ9¶å3t8%†?Éß©}L äe.Ýî9ì,¨CçmHûèJ/¬³Óñ@ò9t¿8‚>ü™ ïæWiËÙÍ×òÉÍ3Êê哹]Ÿb[q[‡jLxü¾FHìYýH ÆÀNäã™ëÈó&Ó.~‚º)•`aÑñ9|ð@>ŽéÄ¿O©¹ÃÙI5j²!}@aÚ ‚gÖ ZÖÈ¥=.`å+·ñã†×@éÆ}¶šÇÎhË!Ÿ¾½ËQ,’$I’¤?Wˆ¬ì°ï(Üî»HN¿¹/b~äëþÁWÝÆøÂãéÕó,¢ðz×pç 5øæÑΜÖ¥ÜôÈ÷vMo®<"|·Ç‚ÜÐç6êg½D·\Àe]û1#þRìÕŠ 4¬ ·Þs)QÓžáÚK/å®—Ó9£íQÛúLgâ[ï0qÑÆrï!2 ‹Š¶kŸAfvz©uwj Ä R£+ybØFÁsÝÂIÕ£vhwäE=9©àM†~öÛ` Ž z\AØ„Œ_¾ûç׬95sæ3}Eyó<"iyCjÍ͈ÛßÛžÖ/bÁ¤··†DÆÑ¨ýy4ŽZÀw³ X;å=Æ/Ú°Ë ¿ÞuØ–?Ém{pFÑ;|Ñ‘gc@¿îWeÛ”§ùÓæRX¿M*îTN’$I’´„dÐѲeK Àˆ#hÙ²åŸP1š#ÛÞ@ëZ¹LýnPÄÄg¯§ó}#X]HQ~:>ŸK¥: 8<Âc¢ˆ¤ìœ| ˆus_áÖ ;1raÉnE¦žË©uáÕ!_±¦ sæóæk“kÑã# RÓ6û3cG}OnQkgáíiÛ†@0ÏF>Ï‹Kʹ‡\fÍÊ NÛ«¶„‘¤´½¶µÂˆ‰‰/§}$EEÙDEñÑG¸÷ááÌŽlÁ=OÝÊÑÊZ„%·§ûżþÜXÖ–S¡J››¹´ú·<7rþï>áZ)5)Y1åu½J®8eoŒœ¸Ãô½©ÿ«ö}ßfü;ÿæñ+ãÿàý|°ê÷ÐX91 [phê·hLñ¼ù¬iEώѼ1ª«¯ˆæß÷ÜÄSSjqË ­¶žW˜6ÕÁÃH©á¢¤’$I’´¿„äÔ•®]»’””ÀW\Á”)SöºFƒŽ{yÙŸ£¢¢æ­àó!÷3â§²Wíð¤ftîr> kU!DƈüH pÖ[Œþ¶]^xsæÎbæ·“øà£I,Í îöXLÍd 4¡ïÛãwìL0¤Ä0*&$P)/‹¬í—,_¾v7%d;3F>¨š÷rç‹c‰(,dլט6·”v­R&\Âð[¯føÖOó¯Ç¢IygŸ8Ÿ¿¨È™Ý®%lÂý¼»¬”°Ú¿érTnî|4“Ÿ¾…¥ø;}‹Oˆ!˜_@y«Ÿ4¹è<óŸl7geoëÿê«A·²àÍ$Žn}Wßóù÷ôàEå¥+ÛÍÉiwrÿÐafOçÙÇæÑ¶ÇP¢ÆÝÏgq—qí’ï˦®|7›Íç6¥vØd–•B° ŸâIHv I’$IÒŸ#$ƒŽílŸÒ´ûñø;+Øœ—MVζõ"‚a éñÐmÔý ½ïÿœ5…ÓæÞèñkƒ,Æ?Ú™I5›Ò¦]Nlwƒ/9“çzÜÍ'«w}ìÛ °ùkî¾ä1f–ó^œØä·{ìå°p oÜ=oFÆP‰| ŠéúÜUdÏÏÚ³óóÒY•¤ZBñ'^Ï?’¿äÁËMɉÝn¡Þìô›Qþ4š= Ô§më*ü4b2Býüœt礳xÞ<¢ê¾ÎÅÇ;O|÷;gåòíó}øöù²ïbš÷ gÍI<Ð/Jíc –ýnó³Ù]ƒø,–ÜH’$I’ö :†ΕW^Ill,¯¾úꪱ9s%+V”¿GXR*uVòÅk_°fË`ˆ”úuÅ[ZDSDîŠé¼ÿòtƬÁMC†Ó¡õa|òƺ]›83ƒõQHI cæ¯S*"ãHŒÙHVN!y9ÙÇ&‘¿ly¿¯U7˜·G÷tHJ š',eâ´Õe¡A•–4­»‘Y#–íÔ6ÛˆËn:••£†lÛJ5¶5ŠXž‘C«3N"!¹˜GÿsZYû¨(b¢è9úuN|á¢ZV§Z…Ûxõõ-õ¢b :šçÿÓ‚‘½nßiÊH^v>zÑDÀá@x­–›°”W¦m‹9JÃò÷½¨ Ôàê''å«Ûyø_V-Úá{*Õˆ»ˤ§»±¬b ò DÅI¥â ¶,<ˆIàr˜Ÿíþ²’$I’´¿„dÐ1eÊ”?4]eO•fg’L$µQuXšEÖݸê˜b ¢âIŠ pØ©0ü¼u<~ÿ ¾^žGåš8<¡ˆŒÌl;o×ÇŠæ½Ç—ËÏâ›ÎgÎ?DZ(˜Ä™=¤S•¹îŽ·Y?k s ïæ‚ëOà——æÑà2Îk\aëËz0PƒvלIÉäå®ÓYï n½!ޏGŸà‹ÕÕ8«çTKØ-Óqâ›]CçæËyù…‰dågW·çôÞHnÿ1¬ Ö¡]—N™9‘!S YöÓõ|³­v úE<ùX ¯õ|Š/ÖdöÃuDo·ni♽é×r}ï´Œ_üÓÒVÞ&•:aãX¸ÝáÊõëR%'%ÛíjV:‡goÜ}ý` ç÷¸”âžaüÜtfÏÛÌe—ßΡóõòB;îÎk¼‘› ”m!‘ eEc«%‘TyÙ™l†4íØÔ9ƒéösÙ~¼ù³f‘Õ¹)GWøˆuM›3ÿ#–lé…”ºT d‘–î´I’$IÚ_B2èØ×›¿âÅ!­¹ãÚÁŒí\À²©oóÌý“¸èÉ{¹yøÿñèµOò\^\Óïz'ØœÎÏcØ—ù¬g×ÇÁ|þõÀãDõìÄc£®'’VÍúŒ‡S¶=iÞW<õèî¼ù6ž?£kæ~Έ·grÏÅQDQtœvñù”¬ü_,Þy”µŸ>Ësõï¢cŸ¡tŽ*dÙ¬Ïyø¾×Yµ%Cˆ«ÛŒSÛ$ð΋YSšÎ¿î˜À-×Ò{ÀÙT*Ìgõ¼Éƒýzë±”f‰žÿ36•sÃ’$I’¤}"˜˜üýfLóæÍ™1cƾ*¯?YiXúþ³9/õ~qkø±ÿDsác£h¿òºšµ¿/þ§ êsÇ+Sé•ëx䓜ÝI’$I Mš4aêÔ©»m’ÛËê©Ü´ ‰K¦€ €÷^ù€ ­®¢]Õ?¶€ì_Ií9>ÿc^ùÌC’$I’ö'ƒm•?õ9z švÀ®_<÷Ežü¨"×Ýq!Õâ¬#|wtŒcÜSϳÌuH%I’$i¿rêŠ$I’$I:(8uE’$I’$ýO1è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0è$I’$I!àC’$I’$… ƒI’$I’2 :$I’$IRÈ0èøU:ñÞs?ÇEèžüuDs/ºã*tWv#’V½^àå{O!ú@wE’$I’ô_ñ•|*§üNΧij-’b!/;“…3?ã‘oñSFéÖv5Z^Dô±|½¼t7Õö¥HêŸÑƒÞ7œFé„»è:|öï4O¤]—¾t=³6_?p)ý(Úz(SŸ‹n¾…³š×"1ªe³&0èŸ/ñs^` >w¼ò «²c`Q4åÎø³r/ŒjÂí½Oå—a]øqCˆ£åµ½¸ºÝQÔHˆbýâi¼>øIÆÏÝTîù‡¤žÃÍ]ΧiÝêDf³|ÖçŒü?eˆo|!½o¾€†µªPšÆ÷o á©w~¦$´àŽ>W‘\$ªè žzd Ë ½ÑDþñè39ñ6ù$ (bòàþœ<´/·ö L\³Ï]’$I’ôW䈎rDsÏ<};Í£ðúàGèuËm<:h<™Éòè€~ü½ú¯-Ž¿]q-'×>@yQ ‘ö}†Ò÷Ì22ƒ¿ß>¶)wÈù±Y¬Ý©ygÝù —ÕZÀ wßÈuÝgFôé<Ø÷l @0Mlt>_>Ù™N:mýºá™I»¼\s¯åøüOõM.G\ü wÇ·ƒï¡K§^¼2·èÅqw>7X¡wŸkÚÄo­ÜöfΪðÃ>ÍÚö( g3ò­E´¸újû·B’$I’Z¾ÒýF0P‡ë{œEüüat¿{ MšÊü´4fNyþwü­kH—§ˆãª§FsY½0ÚÜó:oÜÛvK…"ª¶êÁàÑcxìë¼Ðï:ލðkõhwƒGaìØ×5ìq:X}ËukpãÐ÷¹÷Òvôyq ï<܈äÂ~ãxã®SÊï+1çŽà¶[2;ï÷ƒŽ°˜¾u=žú‚Üß4/ oLëfáL9Œ¯g¹b:Ï?õ¹:ЪJ±ÄD±"“ÌÌm_YùEå^+¨Ã¹gÁœ cXˆã¸–õÈül£¿]Dfæ>2˜¯ŠN¦Ã)1;^)‡ioöçÙ!Y‘Éêy“ýÑB*¥¤rXÖö\æ|̳C&²$3“…_>Ç‹“7sê­‰ ’”1¬X‘ ±pÞ:ê¥Ö*+ÛŠž«ñÚScYó›g°êóù9þTÎiù»ÏR’$I’ô×dÐñuÛr\r.¿ò!ëó".aÔÛ?ÓøoWy=¯Üy/ßm†/û—n™¾ ˹­Ñ¿ûe\Ô}Y)rÓy5ˆ=±÷^Çtæ’ ®¢ÏÈUœÚç!ΫF€B‚EAv8•ô¡=èøxY½¹Ÿ¾Ë¸)KËík ¸„ßþ†5Á=Í”f|ŘϖRn4IDŠŠ¶Õ*ÉÊfmð0RS# D'P)Eý‹îcЈь=œG{Mí¨]\,¡ “W2kZÎÖ"£ °h»©2Á 2³ƒÔK­»s_sfóÎÛ_²lËŒ Ø¤¦\Úö²¦MaI)¤¦ÖccÚü­Ç~™µŒˆ”Têüæ·ºbl…EA ’Óºu¡Âç#)¼à È?{Nµ-³q›§1}q4Ç4Û¹?’$I’¤ƒCH-[¶dÀ€Œ1‚–-[îÕ¹k&“H:iKŠË=ž—¶œ,II*ÿÑ"×0~èxd²yÅD¾˜$9¥Ééç¶!ç󌟻ŽbŠXöíó¼;ëPÎìp$@XÚ^þq9¹ùE@?ö£¾\¶W÷ðG„ÎfúâJœzÙyeáEd"§Ýx>©aQÄÄD ›²ƒÄÍàÅ'îåÑAã¡ñôëÛ¶Ü<+¦¤P•ÌOÿ5‰ÈeÖ¬ ê´½Š“ªG‘¤´½¶ÿÏÞGEU>~ ‹ ¨,)n â¾—Z†¹å’kf‹™–™KVZ™íß–o{}Ór)S³2+5Ó4×\R+w\p_@@”aæþþ dÓ_.5~^çprî}¶{:g>ó<Ï­ä†Åâ_H ¹ãªÜŸ)¿,dæ´ÿPãØ$ž³`ñõÄjMÉWÖnMÁáã¿[»ö'P»E}Ì&?×+Ë¡1”j0Œ‡ªýÉW1Xi/ {žUþýx²ÃùþÓ9|,™àJÕþþ ‘ëÂ%7#2dAAAôíÛ—õë×_rÝl»ð0—6S"{"‰yÖ…Øív<½<1L©d"´ÁÇ,ì‘¿Š5=8@Bü±ËïóJ0’øîƒ©ôò>›;ÞÂÖÅ¿±ç\8‘°€çZ§B,ogÕàë7ºr«ßJ–_´ÆÃ¿4æ4+Ö<‡·}ýÓC_eôÔ¹˜ívNDÿ@Ô^'·`§(Ɖ9¼üäB*Õ£×€!|4:Çß_[âåìŸ=–Õ£Ÿ`ügžœŠžÄØÍ¡<>±ëþ÷8Þm¾àÄÖ©œ5ÒÙ¼þ(4®ËrÚLNNÃ-ÌŸ2& Ìè‘>— :ò2™.ﱦöcÇH¥1ÕÜY¾­à¬ßj•$‰ØcÙÿ¯ñìýzÏΊ/d 9ý[‹þеeǯâa«ð´X0Û­¤¹wdl÷tâ“ ŸÝ’q,–ÓÔ#8Ð R ¹Ž‹’ûaf½ö(³=,”ÂJº#!Ÿô#yRÁº¹Œ,+ ±ûHˆÝÇ®Ä ¦t?wLù”´4.š âí€9=‘'ÖýÌxí)fäžkôØD"vMàñÝ6nïj!í°kºOß‚{„ˆˆˆˆˆˆÈ¿“K.]™4i111$&&2cÆŒ’+ä‘}tëŽúpÇý)sQFb˜*ò@ïfX·®dsÆåÉdãX¢ApµüË"‚‚þ!i“UštâæJnØ­VÒ³  UKÂìˆÚëÀ3¢O¼+ßI,ÕÂ(GG }²RÎáð÷Å’ç–©Öœ6MB0²rÚ' Ã2Ø»µàÒœÒ-FðågOÑÀ½ðÑÁQêyÆS·~±;9|Ñ“~Ý*÷çñÈ£ŒŸ°‘eÅÓ3gÁ—'ö4ë…²~_œ))šÍ!"""""ò/å’AÇúõëyòÉ'yä‘G.kÙ ä_2‹”šCùßiÓ$ŒÐÐPj5éÄÈÞ£kÙmŒŸ°ŒtÀDYvƒ²+b±”ô¤Ž,–Í_gó~ ¾53”kПw>ÃFEEÔi7ˆ‡ZW.â¼AAáç ž‚‚‚ôÏ™¡àÜŠ¡Ï=BÃÒ¹iƒ‡AAAZð0—`N]‹EXû&niR‰=;w^¸ŸaÕHˆ/dƈˆˆˆˆˆü+ü3&üÃdìý†§žeÀƒ}èÿ|7‚|!-9‘ƒ[0ú­ÙìNÎùºßäÜÏò‡xî™ÜøKFÌ/¾Ý´uyﻑ<úøD~~ÙĹ„X6NyIÛPÄ ›Zí{Ð-e_¡’šk=À„îÆï|Ýð™ÖŒäeŒìÿ ‡êÓºucN|û5ÛÏTéñ©q¡~ÄÈÉDÖ5ïqïûkùmâÛ„ÎKŸ~‹=‘mkþÇË£r ŸYÊ;¯Yxbð@>˜ä‹ÙšÈž-ŸòÒ„µº°%9Š] ‰¨çqÉœ^>†Oj>Ï€—?c§#Ñ+ùïfæ>~jµàŽÖÌ›ºŠSÉ«xóE_†¾—·Æ=…ÙžÌÉ}«øï‡³rʧýλ¯ñ̈Œí\gr,k?ù“¶åO]*uI»”<¹ú¯KO­˜ÌÜæ¯0~ê½ØâçñÞ¯9ã3¼šP¯Z:;~ØWü)""""""ÿX¦ÀÀÀ«6I¿iÓ¦lÛ¶íj5/— Ûï’ýñK,J½ök1ªÜ3–q­×3ð©8õ/X Òùm&ö‰gä Ïò=¶VDDDDDDþ5jÄ–-[Š-ã’KW$—o+š[²ñ:m8qxþWlòïJ¿–~×¥ÿËaxÖcÀ=áD}ÿ£B‘1®,íw^5õºÍ¦0Ù·ñ¿ÿ á°4+}yO¿¹¶<¸}øHjžÌÇ¿ýùçÓÒùWÐÒ¹¡(è—¡ CDDDDDDD\†‚q :DDDDDDDÄe(è—¡ CDDDDDDD\†‚q :DDDDDDDÄe(è—¡ ã:jñô7Ìûo§ë= —a¾Þø§éöΆ6,*ÿ±²èå¾LØæ {>Ù IDAT(â¼Í»ßÌé¥Ë9˜yåÇf h̰—Ÿ¡k­¼×k4k²òœô¬J÷áOЫE8þžvNÇD1kò',Ûk+¤%ªµİ[S#À »5‘Ý«¿a”?8e\Ôgp7>ùl(^KŸgȤ¹‰ô¶®Op€ [B,|7Ï–¢¨;#""""""r-(è¸ÈÒ†²Õ×€_û|Ð=FNåÀι„¢?Ê;½špßcw²hùr^áq•ªÕŸ^¾ƒ¤ Øk]|ÖƒÛG¾ÉcµvóñÛŸ°ëŒ·=6š§^y‚£>bOvþÒæZýyýé[ØôÎh^úóÞ•ÚðÒ;/òbê“<;+6OI?z¸—J&HÌs´î€7x®õ&ÁÆ£U#ñÜÈW8{x_¼¨3‘kHKW.bO9F||<ñññO°cdÙI>Ÿ{,‘sÍñîg̘9—ŸfNcìè^T÷5áôjÃß"­.#gÌåÍ^A€5;`Ì—?0oá\f~;žúÔÁ§~= ãû_&Ðã¦Âßÿ½>‚·!ë¢s†)ˆrF,3'|ªGIŒßÉÜÏ–sÒ¿&C ¶WºZåRv±dý@ÚÑU¬Þ—IxDX¾re[çÞà?YíÌsÔ{Ì Æ}ð1¿l9Jbb<~šMTZ aÕJ]έ¹ât\ÃT•Çßx•º)³yîÑ{¹ÈÿØÜw_îˆoæ*^yé'λû`/þ37·Ê0zø-ùf4}{Þˈ1»¨>àe¬Sp"ãdóæ-âÀ9£`ÇÀéõóYxè\¡çLÆ1æ}øßnɸpÌ#È )Ä'l/%j=1>uéYÀ·Rn‹p°yýŽ¿ ù6fø :¬÷±ö¼µ³8°fËvœÉíÈz{Pßóv¦—pEDDDDDD®.—\ºÒ¢E úö틯¯/_|ñëׯ¿"ízÕïÌm•0ý…UO3€Lÿq^nË­~Kùí¢òÎ#ß3²ßl)V€5j>Ûî",¢,ìNÌ_6q3§\‘abò­Ç3#îàÔüÿ°ælÁ ÃHXÀûŸDðÎsŸ1û9;±+þÇKË“rKxÐbÐpÂwNâÝm´ëZx?_™ÃS-½q&ïä‡7^cÑ gáEDDDDDD®— :† BPP}ûö½bAG© `J[‰Oû+<È<–H*u©XØäê÷x‚>-à òõÀ7ÀÄ!Ï+2žÂ¸·âÅwž Êþ1Œš¼³Ð2îaýy}D 6}4Œ/ÿ89´O¾ò ¯õIàÙY0×êÏÐGùbðïÅn.úûø§80;ˆ:‘}yè¥w°¾4‚y‡´G‡ˆˆˆˆˆˆ\?.täe2™®x›ï‘Q”ΣÝŇ¯_Á¼=ç0L6q5®øˆrx‡uã­wú‘½ô=FNÛJQ InîÑž ý³ùü·œ=:ˆ]Ë´ùݘԣ=•L§Ëˆœú$2$/kÊ1bR޳oža3¹çžfÌ{Õ¾,‘Kæ’AǤI“xðÁñõõeÆŒW¬]k|ç,5©ækbOjNàS1ˆò${,ªä/_»~-L;'2oOîÞ¾5©|僷à޼õÎ}¤LÍ[¿Æ]v}Sî,SµN´¬TšÒƒÆ3sPÎ9/_7ÌöÿòC㥌~|‘¼GµßŸå¿óÎ/¿ÉÊ÷‘ëÅ%ƒŽõë×_±å*yeí›Ï꣓è9´ ÛÆ¬å´=‹ÙšÀ¡_òâØ¤ÆÑ5üº·½ßžBƒù¯òÌ÷Xñ oOÿ‰Ìä},ü.=û¿Âÿ_avž¶Í!MèÙ³¶…‹ ::¾<•¡ ÿÚdø”il{¯®mA«Þø›žâ‹ùë­ûènÞZå¤Z‹ÖÜž¾q‹’¾åSþ3æq{ôf?gÁnMäÀºOycrɉù½¤ÛÁnM!)Å À¶)/2†'¸÷éwà‰-!–?&¾ÆÔ?SÿþMùLÅoÄð74mÚ”mÛ¶]­æå2¸‡?ʻݷ2zLÔõŠˆˆˆˆˆˆÈÿK£FزeK±e {Tˆ¸ Úmjq|ƒ––ˆˆˆˆˆˆˆkÓÒ•ÄÎ)ÏQøÃfEDDDDDD\‡ftˆˆˆˆˆˆˆˆËPÐ!""""""".CA‡ˆˆˆˆˆˆˆ¸ """""""â2tˆˆˆˆˆˆˆˆËPÐ!""""""".CA‡ˆˆˆˆˆˆˆ¸ """""""â2tˆˆˆˆˆˆˆˆËPÐ!""""""".CA‡ˆˆˆˆˆˆˆ¸ """""""â2tˆˆˆˆˆˆˆˆËPÐ!""""""".CA‡ˆˆˆˆˆˆˆ¸ """""""â2tˆˆˆˆˆˆˆˆËPÐ!""""""".CA‡ˆˆˆˆˆˆˆ¸ """""""â2tˆˆˆˆˆˆˆˆËPÐ!""""""".CA‡ˆˆˆˆˆˆˆ¸ """""""â2tˆˆˆˆˆˆˆˆËPÐ!""""""".CA‡ˆˆˆˆˆˆˆ¸ """""""â2tˆˆˆˆˆˆˆˆËPÐ!""""""".ãªYYY˜Íæ«Ù…ˆˆˆˆˆˆˆÜÌf3YYY%–»ªAGzz:¥J•ºš]ˆˆˆˆˆˆˆÈ  T©R¤§§—XN¢L™2W³ ¹øûû“””Tb¹«t¤¤¤`!!!W³qa!!!8RSSK,k 4®ö€*Uª„››©©©dddàp8®v—"""""""ò/f6›)Uªþþþ8âãã/©Þ5 : gŠIùòåñññÁÃÃãZt)"""""""ÿRYYY¤§§sêÔ)RRR.¹Þ5 :DDDDDDDD®¶«ºG‡ˆˆˆˆˆˆˆÈµ¤ CDDDDDDD\†‚q :DDDDDDDÄe(è—¡ CDDDDDDD\†‚q :DDDDDDDÄe(è—¡ CDDDDDDD\†‚q :DDDDDDDÄe(è—¡ CDDDDDDD\†‚q :DDDDDDDÄe(è—¡ CDDDDDDD\†‚q :DDDDDDDÄe(è—¡ CDDDDDDD\†‚q :DDDDDDDÄe(è—¡ CDDDDDDD\†‚qækÓMÚ ~‚–[™S¥ïÍæ°<‚еS+ÂCJãd¥#jÅÏüvðÜß+DDDDDDD\Ø5 :Lå›R;s-k¬iº”¥Gt¤áQ· ­6L`õùä"Î4U;wä¦s9á(xÞ¯n÷ fçÂYLÜs‚Ls9ª·èD·ƒð™<‰ Iû™þæ9cñoÉ“OUeÑ[ßs0Ï0 ãñŸñÆŠœó î{•–Ç&2é÷Óê”išwîÔîñ(½ª&òëÏSÙu47ÿ*4êÔ•‡†”gÚ„¹c·‘îݘ.M×3cóÙ×b˜‚èt_g<ÿü’1_'‘;eëvgà½÷pjÌ4vf\Ú=¹]“¥+Õš×#uG[¶%Q»iõ|çLîÇY¹ÂÊ-]nƧˆúÎSY}¬Ýï.pÎ0Ù®6'–}Ã/Ûâ9›™M¦5‘]+fðó®R´iW÷¿9ÆKaòoJÛ†Nþøn&›Ÿ"=;›´Ó1¬ýî¢ÆÜÙ¸LnI»Vo¢lÛ»¨î]XCå)ïŸÊÁ}§rg¸dsf×|>Ÿ4‹= 9DDDDDDDŠuÕƒÃT™¦ÉlÙi%}ß’ÂRÕ#™³[f§å:×.<ê0™3‰^º£Ig•οþÄd©BeÿlÛyñìˆll?ˆQ9œ›J¸ÊKcIJU §ìéýì8•VŠÉHdÛ®d*ETË=bÆ8½–¥ûBèÔ>¬àµ:ãØy¨ wöíÍ­ «dq²I;m½°´GDDDDDDD wÕƒïð¦T<¶ƒY`rìgG\%šFxå/dœaÅ¢=T½³7²€‘Åâ-¥¸£K|34LÞ¾x‘†5³`ì´42¼½)lâÄe±¤6¼½1l)X Y}“’’^^x^8âdÿÒ¥œ«Ó…æ_°•M3&0s[:•›uaà¨W=¼íë^ÒÌ‘ÙUޣúÍkãWµ/¼ÜíB—Ù¥êâ¾3мÛmØ/cUҺܶoNÞÚÑÕ ‰ªí+í!&÷˜3-+øYLp.ÊàîëK)› Ûßã¥Î¢°¦¥áæ[‹ ì…þþ¾V[¹l»Y´º9w¹™èYY·F̆EÄlÜ-Tª×ŽžÝûãž:&ÿþ&"""""""’ÏÕ :¼ëÒ¸b,3ÞýkãOÃFßçÚR¯TÛòÍÂÈdë¢ßh>¸ uVܤÇ–,Mäñ.­HŠÏ9d²ÅqäT7Õ `˺3y »Ö°:¦#Ë8Q\6P·_â¾™q‡Hð‹¤IÈVäéÐ0Ñ0"€Ã¨“¸q!{›?B‡ê«.„>n~•©W>‡rÓžl+G·/ds£—©R ŽZ/m@"""""""7 «ºtÅ¿nSì"6ïÓMŒv  QC¿å”,Ü^šö·U¢‡«¶k!›Ü^ýüB3¬YM@›¾ôlJ/wÌ–rÔ¼í>º×:ǯKw;+ãrÇX¤´í,ÛMó¾}¹¹jy¼ÜÝñö«L«{ï§i=˶ (LF"Ëí§zÛ–”=Ð#”Ö÷ÝO§Zås—ª¸SºJkê§r8^»‘Šˆˆˆˆˆˆç*Îè(Cã¦7»n_ áÀ®Ãtk×2 ®Q9²b!ñuûQ£ÈvϲzÑV¼õÂë¾¹LÙ–Ní{3ì.̤qæð>–LÅÎäÂY{©c,½aÍÅ+bŠMìÒ/ø!å.Úöx”;ý½Ávš#{×1mê&Šxr.™±æÔ³t±ä¼vžú“¯gzsWûÕÃwØRޱcþ7¬.vjŠˆˆˆˆˆˆˆ˜/éc¼ˆˆˆˆˆˆˆÈ?ÝUꊈˆˆˆˆˆˆÈµ¢ CDDDDDDD\†‚q :DDDDDDDÄe(è—¡ CDDDDDDD\†‚q :DDDDDDDÄe(è—¡ CDDDDDDD\†‚q :DDDDDDDÄe˜¯fã‹k”Ï÷z¨Ýr5»áp8°Ûí¤§§cµZ/¹ÞU :.-»‘)777ÜÝÝñóóÃb±púôi²³³K®w Æ&"""""""rYœN'YYYœ:u »ÝNùòåK®„‚ù‡;wî>>>%–UÐ!"""""""ÿxçÎÃ××·Är :DDDDDDDä/++ OOÏË)è‘<§Ó‰»»{‰å®éSWDDDDDDDäÆÑ°aCÚ·oO©R¥ =¿fÍÖ¬YsEûTÐ!"""""""WE‡HHH ...ßñÈÈHl6‘‘‘øùù±`Á‚+Ö§‚¹*¼½½‰‹‹+0k#22’7âïïOÆ ®XØ¡ CDDDDDDD®‹ùóç9K\RSS¯È2mF*"""""""WEjj*©©©ŽÛl6ªT©Bdd$)))dddyEúü×Ìèrw£y)3 Òì…žïîëI´ÍA¬ÃyG&"""""""…7n\¡Ç׬YCóæÍ©R¥Êïó_tÔ÷23$ÈB¸—™±§ÓóY·ö~^Œ9i%ÖQxR”€°;¸³mCª…”[IÇvóûâ_Ù—bàÒšá÷ù2ûÓ…œ4þÞø S5îÝž§u®˜ÆÌ•é<  ’Xðùtv¥^6ðÖ ùçf]Z»×Q³^¢ÚîÿñÓéV<ÙÃÌŒ‰KIºCõªLd¯Î4(ï8Hܺ”yÄbÜüjÐ¥Wê…”"+å¿Í›Å–“À‡ˆwÓ&Â3‘°žùs7“ä€jçÁæeótÊê©X{ÂIÙ:èѶÁ¾p6n=sçþÎ [þḇ¶»ìëó»‹gû6ÎýCtà°¥qâÐz-ÈSÑܹù¡¨ºã#fí¨Päï@À-y4ôw>úiÿ%¹n¹å¶oßNff&ÁÁÁT®\™M›6]8¿qãF6nÜxáuddä7£cEºú©fÚûy\;·ËS3Y‘~y!‡¥fîUCËfâΣ¤›ËQûÖnôt/³ÇÏ$öŠ_EÉÜÊW£ºÿA¾ýøgâ‹™œ’´aɪ]³±ý]Ùñ¿ñÙȼByLÍ;ï¡nú¾»Weîz/íŽaq¬…[{vÇÿÀ÷|øUå›ô¢Çíµ‰ž{Îô OâËÏ¿%ÉáC³û‡Ñ#ò8SVÇËۛÿŽãÛ ù§U™üo¦O·Jì™1žiñž4êó÷Üyœqóc®Èõ)›™4a I˜-•éðÀCôh~„)$S+›¨YcÙáȼ¼ÎDDDDDD®²îݻӠA 'ШR¥ wÞy'!!!Wôé*Eù×ðW¸q>ì8ÿïå©™fy”¬,·µ©GòïŸ3ËéœC™‰Dÿú=§k‘înÊ-g¦ÊýèÕ0 ©l_ð-¿ʼ¨Þ¦íë–ÇŒƒ³q¿3÷—œ3À£\cº÷ºJ¾f²RbX>o{ó}vv§Z‡G鲕ißnâ—ðÞµéÝûfüJAÏÁ÷²êÛÙ$…õ GdU¼Ì`¤Ä°tÞ¦6ðÂŒŽ ­†väÉ\˜Q÷5-rÈa6&$v6“—%9þü.ž±™ùsדäÈ™©ž°GÅúXüqOýƒY?l"¹ˆúî¡w0,wƃãæô ÝÇv·0Âüýð5ç׿²/Å÷ níÕ&!¥GÖ-dá–dçkÍ‹ r¥8¹)g™GˆMô¤nYoLÉu¨ï¹'Hˆú‘/¢rjU.Gæñ­¹³%Ò9“Dûªå€ãx{{“i»hšà]¹&eoæx`cûªmÜ: >¡n1ù¨K¾¾b8¬GØ—LD9? ‘À[ó`ùUŒ ÏëšÜ;2wFGÞ›\–æ½úÐ2Ô[Úqv&˜ í'ÿ­¬@d÷Î4.8HÚµ”¹«rîk™°öôîR?Ò8¶i¦M8üÍ$6õ&‹ˆˆˆˆÈ í|ȱcÇŽ 366nÜHHHȺJQþu›‘Ž=ÎòÔLÚûyýð®LhùDvï>sщtFEqšóAÎäF…3 ùlìGLY“Nã6ð¼"ºÒ£î9NÏøñß°ÛÒ‘·”ÊÒöžÖ8ÿš±cÇ2gyºwk†Wžüêô¤{x³¿ß”?X°íaΜ­¤$G3sÒ,v9êѵ[ Ûg|Âø±ãXqº*]#«_þµ‡ƒ2a¡™ù1“—)füùYêt£gxs>Ïøñ“ÙBsz·­ @6P¥²'˾ýŠ)“¾#¾l[Z„»_êˆ(V•ÓK¾å«)Ÿ±üX(mn©@;ï§©éO¾?žñSVàÕª7‘7]ü«šI\\¡ujã˜,5¨t†GÒ1WÄÿla=ðÄÈ‘ ¸;uËçdz‰1qP¹>•¼ÊQ3€¸Cq€;ÞÞ&Ê6¸›a#G1jäPîkS OÀÄEkH™8½ËQÖ‹b}}Å1[ªÑ4Ì“CûâJ,[ÿ†]ií¿›©ŸŒçóé›)[9¤„îÔºóêf®á‹ñãÿù"ìuzÓ±º'†©2í»ÕãÔ’IŒ?õ>õ÷ÍÆQì’¹‘Õ¬Y€ 6ä;~þuDDÄUÿ.è¸RLÞÞxb'­ˆ=0.p!*:€³ÇO’a)K„Õ çôÖõµ¤³=ê jGàå_“ªþG‰Ú€“~ͧßmâüÏ ­¹·K¾]Ɖ’>0Ú¢ùú½/s¿=Ï&æP¥üü¹Ô(áb΄=ìÌQPÔø=/ªV· Ñç÷‹ÈdgÔaüÂjR:w¢@âž}9a‘HÂwü}/}’óøîÜ=H²IHHÁ×· ˜‚¨SÓ½ë÷‘`‹eË~7Âk¨tí•íÂ3/Œâ…§{ã»g›“ Ì^Þ¸W¬‚eÛÆǜݥézϘÀ÷Ë…2`Ô Œzá)n5oaùö³œ‰ßÅá}ëøzÜG|2ý<ô殺>d‰áL…fÜê îj¶lHî˜ÍÅÏ–(ôú aòoƣϿÀ /¼À O?H¥³ëYèò–aW5<”Äè]9ïIæ¶íO.¶¼a &"̽[åÌŒqaËþtªÔ Å­\5nò>ÊÖ˜ ›£›vP|k"""""r£›>}:6›~ýú @pp0ýúõÃf³1}úô«>†ÕÒÈ¿'P`ÏŽKåLKÃŽ¾¾&Š\k6[ž=Î'îøúzþ#o>ÎŒÉfÅ×× T¾:Ùdf&€r´îVlÑœµ]ÊÔÿ2D´½“æUr “·?¤Åü¿ƒ#3-wùGÑã·˜À~ahîX¼=È´¦åk#ÓËKîëÌ<{Dd¸›KÛ7Âpä_&b6ƒoo_jõ~Šº¹ÇMf3Y»-Õö¢ñ=½Žýž&!Ë+ˆýâ™g³á<•ÀúÃ9ã>±i#ñío§’7¸×¿¶¾QLxoÉ":?ÄýÝ™øÓ~ö¯šÇ…­9OG³rGKúF„bìÚÄìåèÑs(MH#fý!¨ˆ­„÷°°ë+´\Êf¾ÌÝ£w aÍ{Óÿa¾œº¶Ä{˜_ά”ÌLë…#V”.®Ž_ßLNä ü2¬6|C½póöÆÛšváwÙ°¦²´IDDDDDä/ LŸ>‡z???¨R¥ &“‰éÓ§“pÕÇð¯ :ò†yƒÿOØar!ædY4¾‰+ç9ãE60E/dO‘µ³IKËâäþi|U`ãÊdx—ÇË9íù—3sö €s¾"¾ézÞÆ‹b.Úw"?ï:éžÆ´¯~ä„ |ÜLj&Å]•ƒ¼o©›§/Sa==þ‹ËYmYxY|9^˜¼|ñÊ<ƒµ˜Z‡ +ii)lüi"«N½«aª@Í*v®8š»GG";cÎÑ7<„ì?S8—Æœ»¨^ÕðP’vÏ!9wŽƒÑ‡éÖ;Œ²¦8•Ê“}ìgso™;f¹ë4Îì^´ÝKrއ¶ãÉ”“%<åÿ)ÛJLÔRÛ4¡’÷ZN\´l¦”¥¸?Ùll6//oο_¥ý|KèÐJZš~y?_‹/iié8m6ì^þ~—M¿ 3yDDDDDDŠ’ÀG}táõÅOX¹Úþ5KWÚùxräݳ£ÏÅ /Šs–u«¶Qú–{¹»y8e-î˜-AÔïÐ. ÝI+aÓȘ݇(׸fw‚›t¥{Ã@Œ”ýN å–úßru©“?XI8•Jô/‹H©Ñ;«yÛG)_/ ëqm€WenkŠÉì]d:•’J†oyÊzx^7¼È²E¿@¹]q×o–[·ú7WçLLÌÕûfßHdOŒ“Z7‡ç.£ñ¡A§{h’ÿWÕdœ&áTªÔ Ì™áâ^†°Êœ:v çÉ­ì·Õâö&eqÇ›[zæ±6H<•BHÍšøsÝkWÁ”˜@*^ÔëÐÞí*ã ˜ýjÓª‡vÇcò­Ï€á}©ëo÷²´¸£)Û¶^™Gä^ÌÝB•&u)gM ÑÖ4+>AåsÆëD½°€b«ÇÇ$¨výœ@»M‹ÎÉ8žs¿çÞo¯Ê4ªéÆ¡=Ç1RŽh®Fý*€;ÕZ6¤øÞEDDDDDòóòòºðèØâ~ªT©Bjjq_Ä_ºÍŒŽõév¾H„ùi÷.{:˜L1öËûŠ=3f!Sgµ¤sÛÎ lãÙ‘FRÜ~œ²Š8Gñ)Pæ¾ù.‘ IDAT_ø¹B/z}³ÙLÖéÝ,{ 0X9o%Ý»õgTì§ö3Þf2©úWeÛæ/9ʰ]ˆÿ3ñE ;yÇZvÖïΓOÜFFÚV._FÈ}éç1æ¤R!-šÕ;ÒáÑA´Lµrtÿ~ÎT.üÓxÑãÏϺ{ó*ÞSH?¶šy+sgþ¾˜e?²­{7?ѳÎú¹ Ïî8ËšyóéÖínž¼ÙŒÃgã–òóÆœÍeWÎ[Éݽúó\3§bøåÇuœ3àÜÊù£{7y†²R÷3wÁ6ì†Áï?Χl¯nŒx¡4†í41ëf²ô ƒÝ¬ÚT—®ƒž¥›ÙA⮥Ìþ³¸G¿^“3†¼Ü ‡Ãƹ“1,ùa)' `÷Z65îÅÀ¡uIM=Ξ˜xê3­âÔ–_ø#¬ƒžm†=å[öÅSµtñ‹ö/û‘îüDGÀÆñ­sX›Äòë‚Xîé1œ¶4ŽlÞAœ£á»nq}µjÕ"22²Är6›5kÖ\‘>MWmÕýâåó½î£­ Eþ­ Sm~ñ6}ø5»³J./"""""r¥…††WüS*ÿ5KWDäZ+K›!Ïó@ÓœÇÔo@ù3ÇJ~ZˆˆˆˆˆÈuô¯Yº""×ÚÖÿ²†»»õgäí`¤gù¼ßŠ{H‘ˆˆˆˆˆÈu§ CDŠ”ql3>_w½‡!"""""rÉ´tEDDDDDDD\†‚q :DDDDDDDÄe(è—¡ CDDDDDDD\†‚q :DDDDDDDÄe(è—¡ CDDDDDDD\†ùzàŸÏ›êßK•æãæî˜ÈÊ €V£¿çÅÖeX÷ÑÝü÷·ò ›8‰î•vóÅ;û¸sD/²—<Å“Ób(× ?O?Özaeq¦%²{ÅÆNþƒS… ÙÈЉÓèV)Žï?ÚH‡:S'Ä‹³1øüíøó¤¯¦Ï2óͶõ1=_]wË™óJ+’×|ÆwÎ;yðÖpüì‰l]ò)ïNÛJ:€GEº NŸ–µ ò…Ó1QÌœð! ÷Ú ÁéÞ†±?¢fZεiõ³FßFâ’wùÂÖ™ÁíëàO"[ü„wfïÆq í»5gÈÓ*"?O;gâ÷³ìë±|»ùt¡ï“)  uƒñõάç SEzŽzšžÍ ô„ä„,’Ó–o»×ùá‘4žð{²sÊw}s½S^ç‘·pËðox¶ô,>;{+4«Œ¿âÖ|Î['•Š<5eA¿Äéº÷Ñ0¤,¥ì±,ü!ÓÖ»1ä“/i²ëE†LÚya,õ›È; ¶0ð©©yÞOêõxŽa}R1À“Ìäclýq"ÍÛ£l7>ÿ¦k†廸œ?€ =>àóÎû2l É-^äÇáY|üÜ}O,dÄ,åã·§±;Íà¶§¿g„ï<¾²ÝFŸ†ÁøÂîŸóá´­Ô>…×k-gàS?\‹Gƒ§øîP&=ø<ËS55FDDDDD®¾z§aäû1 oŸ281‘mdþeI«ˆl~ÿz ßm9KÖƒxù±&¤ì]ÂìÙ³™={6 ¶œÌcJ2)—°|Äk–aªHïAm°F¯!*æ,”íÈk¯ßGÀ8æŒyŸ¯ÖŸ¥^—xíá°"™Ó¦ ôê_ƒÍßLäÛÕ'(v;O¼ ŸB«ØÉü[<ÄK™4a.‡Œ@šÜ3Šëädi· ~ƒáj“ºa*ï™G¼s†½ñ<ÍJ—¼†3·}¿æ¹¿Ò-ÞLªg(ÍŒäÞ*n%·o äÁW^¡k}7v.ùš _-"! 1¼<šöå ï߯ISn:Ů̂ç*vÁ£á'øpè}tíõ ÿý9›î£ÓàöÉ|›÷¦ñîq Øþ/­¢lçaÜ];ç>eÙ¡q§öìút$ô»—ΦÇs£‰,}Š+öPñöNTÏý«5LiÕ¤2Ö.ÍZ¹‡÷gôcùóíAô¼ë^†½µ‘ ýŸãÁê%ÐDŽ€Ûè^-/ H߇ÞåpèÝ<Ú¥"ÙdaiщˆMoòH¿ûèÿŸ?¨ÔûEßêÃöÅkH®Ö–;+ÿõ¿•¦íšÁÖ•ü¦CDDDDD®‘zFGÞý7À„OiÌ¥0r»™À¿Œ7~¾ž˜L&’’ Î>pÚÓH9ôs‰ý¹y¤³æë lLÞÇŠõ1d•-CûÈG©P¯ åMQœÚ·’¯öáY§Þ$òÓ§ßr€€’7Î-þ$.Âs³â¨ûp½ ú‡ÏùauÆÚ³Ômþ·ÞÞ•Ê_Ê‘"CO¶~ÿ?­NÁXo£a‹×hZ¯-·úýBQ‹VŒäß?q!GœÚ„ûTáÖN ™´¯½;ß„‘ö;_N\Êžl8h©ËäÁ·Ð©…WiN»‘;¢ÝŒ{}p*h£ZW$¢žÎøFÅ·¿¢"ÕBÝ0ìIl^±˜_d²rÝ:jXÒ9ZÄõ›Dprï÷…îÏQ:Àˆ!Íjìì_ü:÷.Î9ç[ü¥ä\OòF~X}[ÌZ&÷"´¢öäœO‰ZÀ¯Gr–¿,flêÉê•+ØÿØ£tl`æà6î•ÚÑ,ô?­8–¯}w‹'ØIN±NÎìý†§îþ&çdÙK q˜e_nä¬&û66íËä¡jœß)gÂFæ¬9@fÌ,ßÛ‡®-ê“=f1Æô¡eÇ|÷Å> ·ºÜÑÄ—MS×æÌº¹nè #ëÜ1Ü}s¾©öôô¢”oÙFÎ^&”õó¦´Å“³V;IÉ6òæ"çÿi?{„¤Í“‘Ub†5Ìà¾ôé3€¡Ï—ÆÓ3ç¸ÓÓÓùF}ˆ9šÛËšˆùù|µ»ðp¥h)ìÝyò«ÐÐ`ê˜Ä¼•2ù†RÕ\Îï ¡žWnͨ/yuÚù=)9{.÷"q,Á Ie*= (ûXì…à$>6¨B@@ æŠA”L¾­xwN«|u*…Uƒ‚Žó±;9˜Û~Rr2p¾ÌÊmßí×]¬X{šæí3ò³Ÿx4!–}{·°ìÇÙ²2ÃT•["Lìw¨Ðqìÿùk~oþ<ŸÍlΞèh¶¯YÎÏ+v\ò¦¥ÎÄx’ò”ÍJyþõ§˜ûWpar&’d5¨èéÜJ–mL¿Ž-™°m-5Ú¶ p×b~;¿c{ô|»î]Oùn{£Ù±n ‹–¬!.íhO!ÑúWY»<½<óÿø…€,Ä;¾`$±`źöèHå)û8Y/’–í|¼ÞziýŠˆˆˆˆˆ\7tÐaÝñ!¥êÆÝR/_²&“‰òe¼°øx`ÍppÆF¶3ÿ‡D#ÛŽ5~5‰›Þ‡ìôKê¯\û§y¡ÏÍ8b–ðî¿p³-¯½s7ÁyÊ´|œa‘åÈ>º€§ì,؈ç_K-<== žÇŽÕZpšÆÎ_áÛÍy¿WOápöMt #,7è°Æ5Áº*†GcÎä |üÁÜ|Ë,l ûÀKlõ¯T"+«àR¡¢ÛÏâ1C¹¥3"›R«V-šµ®F³–ÍøbÄ“ü|Ñ´·à&Ôð?Ä7{ Ÿ‡`$oàƒa÷1½þíDF¶$òáwèÑc.ÏŒ˜Ê™K¼’âxZòÜl“€=+ Èâ÷%ëú\[šš÷rsó6ý´–¿}F ßÄšÐÆ´nßš–í‡1¡O>ñ"¿²ÂÊt¹oîE<ð{Î{slå  êOÇZf6ßÞç† l¾Ü¬NDDDDDäo¸±÷è°%±{<Žô$R¯"3õ(&”÷÷¢´Å“Ô4;ÇO¥“•mà4Èý1ÈÌ8ËÉu¯“°áÍK9Â#ÂðâÖÎeãÞX’-A”Ï»E„ï-Œ|üü8ÆÌ&ç[VbOÏùV< 39³êVó*±Ïøøü=Ò‰ŽŽ&:úŒ4;Ùyõ뮜Ÿ{ßÏ»(%ˆ°ˆ2¹ãªFµ`&#‰cÅ<ïÕ\-âÂþ5kV 9!DZNn>^dˆ&::šÉ>€ÕZÈ”ŠËTrû>TŠˆÀ3f)ãÞz‰áýîã™ÙÁ³*-š–/Ð^ùÆM©Åö¢> {øáç‘ʼnè•Ìœð6ljjmi[ˌᰃGžÇHh`ÉûäTñ¿ ü³HLHà܆Ål±7¢u·.4 Þʵ)…´àƒŸÅƒsñ[ù嫱¼4ìY~9S—N‘0²ìdxxü5¦ŠÁ—²žå/nAÕ¨páÿ~Arr"¦s+YåM³vÝh׋uK·\VÛ""""""× =£Àiźå%0œdìv£Ñý³±”*ùô,ÎØò~™ü=É[ƒÑáž;HKË -ÜC›Ó«OóÜZV,;ç±ióÆL®Å³}o¦QçžX–Ƥå}yµ/æ‚ËD.8³”7ß æéÁhÕç1œi‰ìZþ &l(~ƒH#‰e߯¢rï>4ªäÅé½+7~é@QóH;bî™[y¸Guüìñ¬Ÿþ 3æ„Aë'ü‡I¿óÞkS1ø.:xÒHNˆeɘÉ|¹=ÿ]0L5iZßÁÞÿ)¢§,Ž}‹§óΤ‡ðó„ä„}¬|û}–Ÿ6àô|þs}¿ö5í¬ÉœˆžÅ/ë[Ðç2þÔ¬YN™û?dF­²8“÷1ïñù–ìX²š³;²uÉú ïaÕ¦­¹=eã–âøüù¤âÓô÷ž 0‘™|ŒÝKßáóÕVLÆ.¾™ø+/ ~o»[9{t+3~ÞA“.Åü]|v.aKÕLžŽ=‘­_¿Í·yîã٠ˉʼƒÐµK.ì©""""""r­˜¯Ús×È¿, kLòÕêêÿåá9x˜e³?ÀËRŽÆm‡²í·i”i9³¥"†až~kZ2çÇbdñu¦lWÜdч>ý–ûÃO1ãñGù.®äOª^MŸeæ›m!êcz¾ºâŒÑ5¦Š ›8‰*ËòâÜÄ"Ë•iý_ ²2zÀ'×F<‘Üð9—YÃ3³®¤µy9k^’ÖÖ ëÖ­¤¹i Åb™b)¤X Û&Ýfñ´yAX=¾¢C’$I’$í¬è$I’$I=ŠA‡$I’$Iê6 :$I’$IR·aÐ!I’$I’º ƒI’$I’ÔmtH’$I’¤nàC’$I’$u’$I’$©Û0è$I’$I݆A‡$I’$Iê6 :$I’$IR·aÐ!I’$I’º ƒŽJ,Å}Cêxp÷ÃR½xphÿÝoK·8¸~µ<8´š±•›Ûçª]jypHŠý£ÛªÓ’$I’$u/±íÝí*HpÝ.)†%‚6†dJe´æ˜¹&ǼRÛ*¸m™DØÕvû§{1©*Ã+J¤UübPžãåÙ?Ý‹«DYвžo¬Üü÷ê¯à¬Þ OFH!+rþgM–ßåÞ<"Â1½R|¥.F]4¤¡-ÏŒ•­¼PØ¿2É©½ãìY@Xf~[Ž[Wæ˜W†úÊjnüΟèìÆF._Bã”ÚJލŽÑ?+ryf¬Ìò\a[Ý)I’$IÒŽ®g”™›)²®õqFT¥¸ª2äK‹ótiÜ\.ð“¦q„04°$_`X"JC[Ú Á…ý“ «(3{} åG÷ª`Êà†E­Ì+V]ÍY}#dŠæf#ŒHUrÉà2'/ÎA<ÉwU§ÀÃë $â]âŠÁe¾ÔP 6Ú@5´¶1»5ÜpÙ­!á”ÞiN¨io{v&ÂÈt—îRæìÅm,,Ð÷I’$I’´30è‹Ü¿&ÃsÅŽÏÑJ~ZŸ¤.ch$Ï<*¸¥>E}¤•Óµ±2„ žæ×»&Èä[øRC¡}êÊ®ÄËŽ[”ßÌE"V•b|Ÿ8U‘sÖçXlæ°w‘ˆÄ™Ø»’Cªb¤#!+ò~³6˽َ ˆ1±OŠOUG ,ñðšõÕ)FVä8{QëÿQ†W”ihny†ÆÙzt*ch"€R—¯ÎQÒ±GWŇyù'ÔF ÜƹKZy#Œ0:#M‰x1â¼ÚœeZc"0<™¢>e— @U$ÊÌiiãÖæpÓkGâ’Ž@˜ã¢†, Ëcëj_WÁ1éÓÞ~¼$I’$©G0èx‡€!ñ(UÈ—Š4”ù@V2©«Hraÿ8„íÕ U‰ ŽH¿—¤#ÆÒŒN†ÌmiåÕ\”#jœ:0BËÍ<’ƒÃªÒÛ+B¦˜ãá¦ÕIvM°…1ÿaÕ5œÛ7 ’µ|ˆPÃawV R*ðj.ÁˆŠ8c*‹,('^@¹À¼$b1†Æ¡!S ˆ%8%°"_àÉÖ2 ›+’)GÙµ2ΰXx<΀(¬Ëy#„ᑚNóÓÞ1ª‚2sZZ¹~MÆ B]K¬,„,È—(C+0è$I’¤É  Hpén‰M6­+´rͲ<™æ–Š!Ï4f˜ÖBr]"ŰD§'п2ÉèdÀº\ ¯l/=y"á¦Á1Nèã‘eGW@‘ÛWdy$‰lÀ/ê+ „üfÆý϶4sn!ÅM‹œÛ'TpÝ S—·2¯RŸê¤Saï®l㪕LÜþEò¥<×,mŸ:Ò¿cí“t"ÅMõQâ¹ÎI¹N£@¾˜å²®âºÝÚ÷­Ëg¹lYHG" O†ÌÍ©¯Œ3²WšK‚õœ¿ºDC1dX"Á1©<´F9¶ýêbï±TF’$I’ÔmøÖJÌmÉñxS7å˜)QKréàJ†} w(®q€2óÞ\k",±`s3\¶`h¼½#¯Ÿ±°Øþï‰ÄK,ì¨ÄÈK,)¾£© a™ºX”†Ö ‹e ‘(é°Àsù2])ˆâ\Я’¡ñ¬iáú9ÃS%íC]´ÈÕ ëøÒëæ¶…ÔUTrL%¤cI.é'昱¢…kŠTÅS\1(NšZ2\³¬™ó¯çâ-œ±4G! žŽSKžÛו€§¬å¾!ÕŒ¨lïtÁõ9$I’$©Ç²¢ ,qÿÚì[ktcjj˜Ò'ÉWjs\ÞøÖöø›ÈEo^ws•¼çþĹdPŠ‘•âA5÷ io$ĸo8W7d:­f©¯¨dd2 !“åÖ¦P KpVŸ ŽïÕÆÍk‡¬+ä;Þ„’çñLŠ•Q†&"¬ .ZæñÕ­ÌÊ„@È©*F'+/ð»B†¦Ïd:‚›¡±uü-ÓÌÙ FVäË”Ó\=(º’I‡$I’$õTVtt" É”C¢ è¸cûǣ2K †%;‰ ÊÐ.N[XØQ¦04ùÖu‡tôaE¾å2+Ší}Ò‘Š$bQvÝb”U`êÊ6ŠÌ\¶ž ‹3<“-ñøšf&,Év¼þµkâ‘7S–€øF¿¨L±ÈÊ"ÔÅ£ô"ÔÇÊo¸i?'±áœ`C QNéSÍmõië¸OéX¬ýû”Ë4”#üK²‚Ó!O´ä˜•‘©(PâÕV×ç$I’¤žÊŠ€ Æçû¤9¢cðŽÆ8 Šü©¹ a‘Ws0,g|ÿJÏD9¼ú½”P„<™-2¾.Î!µiÆ• ÔUTPÿÖ’hȵòlk£“i®ê—cv.ʱµ1 Ì\SJ<‘ Yã´i4•‘Ž¿k›Dè)2;Wfec@¼ÌÃkK¬|ÛÛeT&ù¯›†ùBŽ+›ò¬,ÆLñûäi(Å8¶&€0ÏŸZB(縿¹‚ñu)®«ñj.Ê!U”ó<ž )‹œVçðº4- ZÁÈd@¾X`v±D&pBM‚sG8º5dheœxP扦öWþ­LrBݫȂB„‘©€L¡²]¾­’$I’¤nÆ €#Òo•WÂ2+r9î_ÛÊ#9€2w­meh¬’á••iãúÕe.TÙå),ërYn^æÔÞqŽ­‹ðüúVnNsBM@— ;Â"×®È0±O%‡¤“Œ¨Y‘Ï3ue†';ÖúøÝú #)ލŠslM‘‡×µ‘ˆ¦Ý|…C:¥.È·¿v6¥>RäÕÍTr¤cqF¾í—’/äamŽ‹–ÁY½+8 º’QAÈŠ\ŽÛ7L ™ÕØB"Lq|M‚Qé2 mmÌXÙÆ!Ëpéò$ã{ÇùT] Â2¯f³Ì\£1„g›[¸9Hòjâ‚–bÖµ2s}û÷¹·)Cÿh%GTÅ/³ ›åæ•ù®­/"I’$Iê–‚~ýúm³aáoöî»Éçã¬ÛV—"ÔÇ2Å+C šä§õ•Ô‘á ‹Ú« $I’$IÚYÕ×׳hÑ¢w=ÆŠŽndtU5ö‹°.߯ÿ4–žJP ™ÝX4ä$I’$õÝÈ“-- ˆ&9¶WãûúB‰Ç×¶rk£o!‘$I’$õ ÝIXâÞÆîmìüPI’$I’º#_/+I’$I’º ƒI’$I’Ôm8uE’$I’$}hæÍ›÷¾Ï3fL§ÇXÑ!I’$I’º ƒI’$I’ÔmtH’$I’¤nàC’$I’$u’LQ/& ”IDAT$I’$©Û0è$I’$I;„Y³fmu’$I’$i»{3äØÚ°Ã C’$I’$mWo7¶&ì0è$I’$IÛÍ–B÷vͦ3’$I’$I[cìØ±h{=º¢£\q$WÜywÝuwΜɌ¯àëG Ùêv~ær~rÞè ‡ï]ŨsøÙã¨Û“ ú}–kÏ=l«Ú#ûsþ¯â3>˜ŸÍ–ú{ræµg²Ï;¶ç¼é×ñÅ·Ÿð!Šîq?¼á}~¿Fœ>•;.ýôfÇ01‚ófÜÉ„ƒãïØW9j"?¹ó›ý`ú!I’$IÝE¯èÂùÜrÆe<Ñ£÷'qÙ3÷b~·6ÜÞ]{_ò/ÿŒoÿ `yyÓí‰Ý÷¦w0{ûtj ¶ÔWÒ»Q_l—>}زÙ,Z)n²5Nï½FrÂi'3"ðÌfÎ+6e)d uçü™J’$IÒ6Óノ·X3çYfep¿¬-ÔŒàÔI_ãà]ÒPhâ¥{n`úÓ+:ŽOqðÉS8qTb@~ÕsÜzýÏùG¦}äYˆåø ¾È˜=j‰6¾À­×Þ‹J+Æ×Ïø"Ãj(,ãÉÛ§rïß[ èÃç/¿ŠaO_Æ5-ßðy¿§/ãÊÇ–CÕ'¸ä§°{'™}š‹¦ÜJCG€Ðûðs¸öô‘JÄ­·~ Xͯ¾w ¿YX`àÈ“ÿåÑ'¹Us¹kúm¼¸ª½¯Õ9‰ &Jo²,yö%ÞY[°™ï0ê¦}î5&]þ ­m?àôëùrëÍ\üë[ìkÐïßøî•_aH|súGxåž‹ùÁc«7´SuÀ)|ç›30UäÕ_ÝÀu¿YÐ…^¥øÈçÆsòÑûP‡–EOñÿ¦¾ù¼zqЉgpò!»š=Êô©±$gßÏÃ™Ç !Ì®æÅÙ+€|çÏ«‹2r™Ì&Ûj?‹ïŒ­ä¹_ß̃G~‹>›9¯”É’ÍB¶ËW’$I’¤ž¡GO]ÙTœ#bÏÂߘýz{ðÑ'ñÑ5?ç'rîÔyŒøÏ¯m˜*Ýã œ<ò ®Ÿ2™É“ÏgÆóµŒþHÕ†ÖRÃ÷%vï%|câd~Ùx_»g§=ƒ|ùÜÓ©~îj&OžÌ…Ó—pèä¯ó‘ \Ã7ÿœêÏã_ë5£‹¿äG/o?¹å)¾;~g\ùo/FYûÄ \t÷< ³ocܸqŒwñ†ƒÚ#9sÒþü}ÚLž<™½´ gLø7’@ìÆ‰ã`å=qÖäó¹cå®ìUÑy¥E~éRšúb`‚xŠ^©öxd`¿~¬Z¼ø]û®z”K¿ý0kZþÂ÷'Œcܸq›„9`Ï׸öœ‰Lºò)v=éD®ì´K¤GÊ9Gç¹ý[g1qâù<ùW¦œþ1jFÎÄCZ˜þ­s˜<ùR~Ëä÷m¿\¿#9íß{ñËoObòùÿÍë÷¥wÐ…çÕEÍÙl{UÇFšž¸³Î¿š;þôúÛ*=6ºO­d Md­è$I’¤Môø # öäô›ngæÌŸpý¹#xí¾_ò\û¾¦Oâ¼Û^ dç¿ÄÒxúvL©(gi«ÆQ£÷¦w¢À?™Æÿ¿yC»ÅùOñÀ‚åå9K©í×·Ó¾µ°ß —yä·íáEÛ?ÍŸWÄaû¶áª?0íW%¾2åB&þ{”»n~ôAÁ{Õë€Q Yò4/hÿÒ ýˆä µÃÙ§ïë<ûÜzÞxê wáz¥å‹hªéÇÀ|bÒõL»â$úG²û 5,]VÚºÓÄ‹þ™æÚÍaI¦}j:ÿï?zkž}¨£‚#ËŸ§_À¹·<×±ï€ö­ç©ß¾Dïþ…Þ¤ö=Kžã/+ËÀzžþýË:ÚììyuEæ‰8ÿŽWÞÛ-X÷(—}ëÁ­~þ’$I’ÔÝôø©+A8ŸŸ}O4‡TôÁW§\Æ…Aût꽎â´g×T@‚6^ˆ@H¸ê!®»>͉_ϵãkYûÊ6š a¶iÃÿÆ¡KS>¢5ýHûqÖMÓ6œÌ©M@Çðú?Ìbá—.f¯¹?àÏë¶~”[SSCt·ã¹nÚ±¶% kH÷ŽÄj©Ìfhê˜V2dó_3±tõõÁîƒ^äO«ö`DÿÁôíµœ¿-ÝÊ #l%›y«E ÝéÍÓ·6Aã¼Æ·š)d;¦ÕÄ©}Û¾r¶‰\²†šZS)Èf7LÁ)g³´†íìÊóê\BW}û™ï÷DI’$IêÆz|б±Üê¹<ôä\;z?b'øê¤I>z1ß|x9aÅǹü¶/lrüŠ9÷pãœ{ Þ‡ON¸„sN~•‰·¼ð¾¯_jZE6÷wn=ûû¼´…<à€“¾Æà¹¿eáž_æÄ}^äîl]p°¶©‰Òü'ùÆw~ûÎiu´¥ö¢&”!HÕÒ+ÑùÔ• \΢eÕìõ‰ƒ¸ø/\ÿÚqœzä~Ô¶®îX÷âÃV ±1OmßZ ©}S¼»ÕY¼ºéû"©*Z›h !—ÍB*Eh¢5µ$ƒö55ºò¼$I’$I®?uec‰š=ùÔ!{°rÑR A/Ò½ZY:CŽ<œÝƒÔ†êª‘§rù„“(¬aþ¢Æ-¶Ûe³y~ÙÞ|æ¨í‹¡NùûUµ‡ •{ŸÄ©#¸mÆÜrûŸx:C]k:ŸÍ´' ^CMª½ÍÌ Ï°p×OrüÐö…%ª÷ú,“Æ‚êÂÆù,lÂaŸèÄÙ÷¸ÃÜÅ—¡,]ÚİÑaÉs/³bÎ+¤G¢fÙâw¾ae3ÂÖFÚRƒØµ6RÔÔ¤ºvÑwñâ³ÏÓgôgÙ'ÝÞæè ÿÅÅ_Þ«cßúŒþlǽìÅ'?} +f?ÇÚ²¯¼Ìš]?Ρý#ôa̘}ߪÎéäym7µGrÉŒiœ|9¦$I’¤ž§Ç„Â`OΘ~'g'ŸYÏ‚çïâÆ»_!(Ãý÷4pöÄkØ7“añïïáîÙgrÂ7¿Î+ÜÊËsÏ_ŸÀÕ7~€Üª¸yê_·²3k¸÷†sƤ‹øá$iâ…_Ïd^K‰=9í¬CùÇOÎãåðÒLîxíZ&<‚ o›ËÇ'MåÔ+€8é4\>ýc.àg]ÍŸÖ†¬ŸýO~ú ®¹ý“PXÏ33¿Íô§×BËSüðæÝ9kⵌI¥³óùÃíSi!`>¿˜ñG¦Œ¿šÿ‘eþogNË'»ôU–®¢ßwÏm¥œ›ÍÒØñôZ¶˜"ph'}eݳ<ôÌÑ|õ·s2­,òV.ºíýWÊdžŸÉÔAã™ð½›IÆ¡ùµ‡øÞÔÙûf0m¯ILúþÄ€µÿ¼›~ùZû#Yõ(3~u g^9ÿÈ.ã<ËÊÝbíaÇ»=¯­P9j"7MhãL"!¶Ç4F`ÎçpÓ3œ qz¥S¤è¯è•$I’¤ýúõÛfËþfïMàw̘1,Z´è]qêŠ$I’$Iê6 :$I’$IR·aÐ!I’$I’º¿©$I’$IÚ~fÍšµÅ}cÇŽ}ÏíYÑ!I’$I’¶›-…ï'äƒI’$I’´½=Ôx¿!tH’$I’¤À›áÆÖ„`Ð!I’$I’v[r€A‡$I’$IêF :$I’$IR·aÐ!I’$I’º ƒI’$I’ÔmtH’$I’¤n#¶½;ðnæÍ›·½» I’$I’>@«V­Ú¦í[Ñ!I’$I’º ƒI’$I’ÔmtH’$I’¤nc§:fÍšµ½» I’$I’:ìãô6èØnž$I’$IÚÔö¯ï”AÇö¾i’$I’$i˶ç¸}§ : 9$I’$IÚñm¯ñûNtŒ;v{wA’$I’$ub{ßwº  ;$I’$IÚ‘mÏqûNt€a‡$I’$I;¢m9^/•J³Ó`Ø!I’$IÒŽd[Óóù|§ÇìÔA‡$I’$Iê9š››;=Æ C’$I’$íZ[[;=Æ C’$I’$u±óbõõõïéø1cÆl£žH’$I’¤Y±X$ŸÏ“ÍfÉd2]>/èׯ_¸ û%I’$I’ô¡qêŠ$I’$Iê6 :$I’$IR·aÐ!I’$I’º ƒI’$I’ÔmtH’$I’¤nàC’$I’$uÿ ù¶¼¾DQe½IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/images/checks.png0000644000175100001710000000476200000000000021670 0ustar00vstsdocker‰PNG  IHDR¦G*tEXtCreation TimeMon 13 Jul 2020 09:43:18 BSTwÙ¡C NIDATxœíÝLÓwÇñg«ß/ÒkZ ‚Mç [ÔíÆFFôvj&Î=Æ~°DY6uKÄ?æ.cæŽ-ƒËÎív^6fNM6Γ‹? wÞe2'q\À»•í £U¡Vk¡-åþàÇ‘â·åúQ?ÄDK?ïÏûú~¾ŸïǪKHHèC’£ô$i,2˜’d0%!É`JB’Á”„$ƒ) IS’ ¦$$LIH2˜’d0%!É`JB’Á”„45Ô111 ¢¢¢ÐëeÎoe@€žž®\¹ÂåË—Cª¥9˜S§N%>>NÇ•+Wðx<#ÝØôz=z½žØØXbbbp:twwk«¥u ôööâr¹ðûý2”@¿ßËåB¯×c6›5×ÒÌØØØ¡™R’Æâr¹ÐétÄÆÆjj¯)˜F£Ç£©CéÖÐ×ׇÇãÁh4jj¯)˜Š¢à÷û5u(Ý:ü~?Š¢hj«)˜z½^®)¥ €æ¹¿# IS’ ¦$$LIH!ÿ‘¤$ŽèèhTU%** UUÑét×|o__^¯—žž¼^¯pÛ fJJ wß}wн.ŸÏGSS---ÿ§‘ÝXTUeúôé×µ5£Ó鈊Š"** èÿ=îììÄëõNÖ0¯KDƒ9wî\Ün7­­­ã¾Ïb±šš*ƒ9†Ûn»¸¸¸ë(Š‚ÕjÅårqñâÅ0Œ,4 ¦Á`Àf³ÑÔÔô½sçΤQXÉ}{Ôñê§öð–Î,¦êy¥O•ÓÞÊ@øB9\\\@€K—.…µîõºéטjJ&ykV°è®YX§Ûéໆö쮦ÙéÑi§ªjØC9Èd2 ­=#E˜`æää`2™F¼æv»9pà€æšjÚZÊÞÈÅøm5{~÷G¾»1IóX’›Ç[¿IdÛæœÖv*+â¦OŸ~í/Æ¥òx~>™N²½t?ƒ÷è9Yä?™Ej|4~g+'ìå³S®Y¿££#üŸ a‚yöìY È×B;½deÕ†\,­•lúuõЇƒ­™Ó_µSøZ6)I*§—­j¹[JX1ß‚ân§~Wåhu{&…ëóx8ÍŒÒÝ…í›ÃT~XM³{ § Ù°öaÒ- ¾ŽF¼ƒÝ ]WÈxe›Ó©³˜Ê K_(bÙý)Xèêh¤vרíF3 ×~ЉžOþ‹9ø¾mÃ3â:OeÅÓ9p¨œ’/ìD/ÈçÕu¹Øš>ä¤ïê2Š¢`0"v‚L˜}ÌÁµæð6›M{AËC,JrS_5,”ƒÜÇÙùz)Õ-?ݪ,dSû yëŸ ™Ïå‘@"k_)âž?¡ø™< ^®à¤i[×/F˜±œ›ãÞÿ:EÏQZ£°¤x#Ù£"&-gëKØ>ØFå·^Ì¿(¢ðÎ6Þß\@î¯ )ý–¼X@Æ”àßÚ¸OßNŽí¬`oÓ¨uŠââÌ‘]T}aǸN}M+3˜i³Jð~&™03æð[ù‰'B %@¢3j&Z¦±šÊúþŸþ¼ž¶e$΀ËMj¤²ä8v/ÐÝLÕ§ÿ`éÙ,*?Ží±lÒÛk)úÜFеÿ}Ê»çá~ÉÇe°iË*øëë”ëŸÑFèusù’z½Ø–òÔ 7øP·xÆÔÓF«8Ÿoþ5p‰*Ñ$ÿl1Ég¨íÔØÏ$&˜Ãoå‡#ô‚°2 kxŸ¾|((*¨‰VÌS2Ø´§ŠM#Z´a±€ÛbLJÍÊvŽ ›£§XXº¥˜Œî¿±ñ/?]%mGöPóàFÞþhÍ4~uŒCµ§ ~#ïðÑlA>eO߇â:ËÒ:Î…R?!&˜ãÍ>ŸŸoŒ…ÐxÚÚpÉœ;UpŒñt9…³“¯wìúÞ^ û¥ëÆÞòé¿ÝóNKg–ë8¶¤%Ú¬Y³p»Ý8N€¡P¶¶¶òå—_N¬È¿«(yÍAÞš¥,[ŸM¡ÜÚi®ßIÉÞlšÚØýÛr ëóØú‡”@Ž3µ”½[Ý¿tTSQnaÃÚbv¬Qpw4rø ]µXìâÐï+Éx·+(ù  ëú¶VäaV ë\3ÇÊÇjwµq—5ÏR¾n~ÿϧÀ–w²à|ooßÏÞ]VÖ<¾…í릂ÇΙqðýL2–ÿNeöìÙœ?>äÎW¯^͹sçF<ì´··ãt:‡n×uuu¤¥¥‘œœ<´$ÁÌ™3'u;Ççó…eƒ=>>žï¿ÿþºÛEtÆ*tEXtCreation TimeMon 13 Jul 2020 14:44:42 BST7P IDATxœìÝ}|Sõýÿÿ”†‹D @/€(Úm¥´£È•t8fq"^À¾C> :aü~ow¸ßÀ Ô° n€ÙGpr1ù @¡Xé Å´°P±tšm¹Ö„‹SŠ¿?’–lÝóþmrrÎ+ç¼Îó¼ßçFß """"""uÖäâ޶ô¼­--hÑâ’§EDDDDDþ#œŽ8q=Ë I“ž=ÚQPÐp_ÆÛ¤iío¤Ãí„5 «u™ª@Õ2ÆBûÛ#¨Ñt¸=‚Ï?ú’c…ê¡‘›GㆠQ±wÇpë=BQ5…5 #î¾XbÇÊDDDDDD¾¹GªÛÎD8ÚÔÛúÚ‡~þáõ¶N‘kUï³öÅÞS¯!ªJ¤£z¦DDDDDä¦P¯A*ò¶¶´¿=¢>Wyö·GÐÖÞºÁÖ/"""""Rõ¤š4 #¶_ÇúZÝeÝzO'š|‹û®DDDDDD¾­z RíoüVKÔUXp:õЙ°ß?Åï­gýúõ¼öPt½×ö]à|á=Ö¯_ÏÛ?OºÑ¥Ô£X¸~=ë×ÏaX«ë¹aÞ´¥éý¯çvëÃw¹özVÇöcºoëׯgýÂ1Ø®_u7] ""rcˆ8ÞO.ãΟ/ãΟ/&õ'ã‰jk <ßc:ýúÍol•´ö}úÇqØŸ|‡¸ØÜX«é=åe¢êý†¢¯Þ&›èЫá†ô]²­Û#ðd®û Z9õËéŒI±6\QßÞB®–&üß.¥~œ*Åçâ8…7nt1ß>ÿ›oò=9ó ÝWkp-ø€sçnt!õ¯^‚T[{kÂL×o¸]XÓ0ÚÚ[×ùû¥¬Ç1&%œÂõ‹)ì9Ž´Î \àMÌý·LûÛ ." ¨¯ïYöf0ï…ŒzZÙM¬>÷Öýnëêkuõ­^ßëUÔÖ~z àÎv€ç:ÕPGFöb¦e×|Ä€»’€ÿô4,"rs0·‰Â8øI Dœ-åÈæ—øç-§ª:k¦uÿ—éy[Wš5ñqbÇ\òs 0uy„nw÷ÃÒøÆO¹k ûsò±{‡.Þ)ä|\ DÑy̺øç“¹ê#ÎÖ´et¯ø Ù[ .,Èz7Ý†Ž¦]K468Y¸‚Ï6n;_ËU4N|™~qE|~¶]ZeãúË_ðÝÒ›Ø{ÆÙ.¾©àdár ¶îÀˆýwþþõúªÿW2¥¼Âñ»ød-$ŒO ø÷/Qz΄åö§é–ÜSc8wºˆCý7Kbèöä‹°þqö¦{Izf<3'°;§èJì³0my˜‚/bˆè?ž.]#iü œ=–Éþ Ë)?U[Í`N›L§ØÖ4>g‚Šúh.žbÿµèê%Hµìh©Õð̰_ÒÖÀ„ÿçªÛ¬kª8–ÃÊg²t7Œš;®Îµ˜lxüÿ¤3ÐaÃÚÌÀ{ØÍ–·²8«$°@×1,~}Ñä°à¹<’žN'¥³Ê ÉZ9yk 1ëÈ9¼ý3ì]Ê´ÍÑ<þ{;Æ!«çÏae^àEÚËë™”…K¦±ºË&Üe%ë¥QÌÛ D¥2æg£èŸh'ÚlÂ(÷àÎ^Dz?¯ÃíÇøÅÌùq4XʸŸ¯$XaðŠu”odÚèy˜_xéw™ðn˜Æc¯» ë8¿žNô© f>ý1I“Ç1 ¾ ”{ÈZ1›ƒ LØc܃w’cÅtª÷?׳ø«Chq¾=‡aVÈúÝ}ÌÜ|݆1ágÃHífÃæ£d_+ÿ¸€ÿ†´—ßcR ¸æ?À´õ`gÜ›¯‘ÞØ¿”Ç&¯Ä X~<‡•ã[gòÀï²àJÇøjí£]£~ö8i‰6Ú´4a”—R˜½ŽÅ‹ÖQxÉÿ¦k«ñmÛíÇóèÛ̺/ØsÝkë×O"ë·÷1»j3çÀŸÎôgÓIioÆ_¼“Õÿ=Õûj¹ÎXõÞŽ®cÊØ¸Ó ¼÷\*à#ã×£˜l+f‘Ö2Ð&½kÿXÐaïMLÏJžúÅq&¼;À]+鯮'ý‹•Œ›¸”’«´‘ˉî3†q£û“ÓS¥ŸÒóΓñïómßÔeãþÏÃÜÙ#ØF¾ÈcãÛ‹Y¹³äüzœc7:Ä+&ËgïÞùó2²Ç=ÐÅÅÅÐ9fe8×)Æ9¥œ3'ÐÚ’OñÐâŽç‰oŸËî%/á3ÌXÓæVÌ'ïo»´æØ_Ы³×â(? MìãqÄ÷æpñ6Î~Ëã õt”9¢~F{>3ì— L¸‡îßQ¯Ûôe®déî¯Ú6OeÒ+SIïcãÌgY·½”ðΩ¤ÿ¿Œé\¦*pðø i°{#ë>ñ€Õ΀§¦1.>¸˜l°Ó™úP…[דuÀÀbKeÌô 8ƒCg«3÷Ç„Xð{ðž¬N¦¿:ƒQw9hsª¬Orð`#ièf½2{¸3²'Í]SqV`4áüoV®ÚÞgEEà=4·óð‹qœ:€»ØÀÒÎNÚϧó@ÕÍ]Æ0ý¹4Q|Å.Ü%Q¤¿ðI–êÕÔîôùõ§?ýv£ÏQ„Ù÷Ê,Æôw`9šÅêµY·¦’þÿf2!Ѿ 2v€‰”¤ž__7')íÜdl©í˜šHýùL¦?äÄæ!cí:\>ÎÑ3xy´ páÚ`çÖàñ1õJÄP Ñ=R°©Ãn qï¾òNׇ¦ñp—ã|¾Ïƒ¯¹Ç©L{È•9¬Û8ÁLºcÕ—â¤Z#‡ŒÍµÙ’›DZ;/¥Å¥øë iÌyn©1gpoXͺýà4ŽÿoV¾E;èάW&–…o÷:VoõÐ41I¿™„Ób³7.í]ëÁšDR‡À>£«ƒ¤`NìnÀ·óêÇ.ß>°1êÅŒéoÏN26dwÔJÒÐ Ì™šÆ¥—n®±Æ‹”îÝBÖà19êbã†u䬱@x"^E×J~LX»:÷Âã8jëߟÇ>ÐÎŽ#xÿURb°6,Ä÷ÔAT<ö–ÀQ7y¥Wø¨©²\Á lP˜µ‘™n|\½Ô*~3§ÂÙ­)…[7’ql‰Ã˜úò„êýF»4füS–bƒÃ9dí.ÅÒÍɘ_ÍdB¯ÀBçTæL…³k8Þ¼,vƒ½O:Ó_™Ê€àƯ^_]Ž}¨íCD¤á{g’ý·wñ5O¦Ó_æÎg—‘úÐD:v0Ÿ_èT.÷–p¶(_ã(šÝtéC›“;8X<·ùú#…ÓÆǹ¢=øÚÇÑ  s-­¡äDwZGæZ›ó9þåÅÕø9¸úqvmÍçÀ©/3ѬMˆó œÉ§t°¦æ}‰ìXLIö®@1àÙS@kG_š°‹Ãíâz–m5˜Èvù”ýëÂsµVñwÐxÿôþ³3Üïs”;ˆêÞ¢}´°%ÐhÙ9ß§kðµK иKO,‡rñž!ª[ '>]ŽÏ¼OoN&F·~´­J55kö—rºE<í{ö¦…ÙÄÙÂ7Éÿ¨~B@“A:°9ãзZIÓ–¦«/tU!jKþGüù£?^uùJØÙ†©0‡ÃÍÊ™+qcå¸ímÆt³átÚXºß•g‚ [ð¼÷3ÿîÖâ}õmÆÅG3`¸“û²0ªÆ„Z¼l|aKûóò©¤Z6hY|çÁ!:Æ`ñÓ±:xXãÇNŠK72ã©y¸ *9oŽÃÑõïÿ36gUšNz”ƒ§…Õë}`râL4^>Þ\ëés÷`ôóYžZRaILZ2‹4«ÔXYéñ’tZà÷Cë˜öóVBôè×XüØUî;«±~ógÓ7×…0 šÎ°ÎÀ© èÐo‰#"ù§ÜúЋœ[ü‡Îøk½n2[àT5/ÝVœòc²XÁ¿‹ã_ §u¨°ÅáóÌåDˉïEã“=±gã­åþ£æGÐåÉ´üÞÄ g‹C|C§NP}­ÜlÅD YLõ7»66qîLÍ€òíàÜÈ»±nØÅéø¾´øb¥§¦5ß§™&žæŽ'ÇW?Ö¸I8'Ì&ÎæRž–€•|ZvòRþÉ.ÎÝ6:mñøŠq–LfhÝwÜY½VWcª:'¬YsÙr\k :ß>š„þSiìÍ¥8ãM<_Öϰø&Eÿö2h@þ±á’³€:kzË· R5CÔë~_§×ÔW/Øeí[ÍÌ—V~3a óSzÄ€n&¬Öh.¼ÂCÎ?«ˆ×ÞˆÆÒÁ†¨…yÔENÕn>µ“¼6› pŸ_]ÞFÖUgÛh3 zwn „(€Òdí‡#Þ„£‡6»Èø¤„ôGãè‚i}FJjàjòÑÉØ{µ7ì!ksàŠ>•n ÿ XÁÚ&¨Àn &ïî, ƒŸ%~Lácvìµ­î%d­wUŸÜ8â˜ÀÓ2šè–€çR±÷H"‘dmÍ"çÉTRÛ¥ÚÜÿŽf`J ‹Ìµ=£ö¥žŽ`LøOi4ÑQ÷æ9 ލ$RºAÎn7ÞÇìDws`ÁœÜ*ä½<Óùn“ý‚“Û+qgn Ž6pýÓ…1t¦(vþ{-÷b\|î²°qƒ•; øÈú(ƒ«u®f¬†(À’„ÝØŽÇSAtTàØ~ᛕ¤^Ѱ¯ðÚA4IÝ×ðK<šFE xþý%`Åž˜‚éonܧÀÙùVaPÑË’·v¶>I$&Úa¯{ªÃ§cdŽqu ¶Nyð–-S™´pwîÎÕçbçÛ‹)¹Ü°­}¡×H‡«€‹ù²X·9x´wçà6ÒpšÚÐ&¸ä#Ô`çÞBèeÇoƒÏ=d¾דÑ2‰Ô”D’L«)í~+î½y¾ü‚Ï:ªS)¹äež ó˜±!ø‹É„ o`ÿ[-Dµˆ&Éø (ÉËÁü (|ë)î{+øºæÃˆïضk—+ضKXùܬ¬®oXê«Ã±¿–ö!"ÒGa½-ŽŠÏ¶{JàÜ×”n}—6·O¥e;¸Ò4i†ßÍ­˜ úÜ ¼¹ÃïŠ9öÄÙúr®“—㟜j»f© Xýñ”Íç’Õü^ºŒ±~ » ¼€™Ž-ã[ÍYíórš"Ž.}ƒµ}ÖÚDÙ©—‰ìÃ鸎fo»¤®S_û9ëžË'wÕ²‚\Ž{¤µ½7-ï¡ÀÄuî 1>Žç”á~8þÉ8ö^í-È(z—ýEïBc3–äçIºÿ§øþûõr‡q“={2ô‡]øÇ†«/üm¼ú³7(*-äõ¸àñk Q×…ÉFÚ“åt}Õ7þòó¿ùO£SK m¨¤üþ͇l„––Dñy½5N°Í´ &l_yÍèàÃ÷UÕë'8…Y”ü8èÄ;I Ë âŽL@ÉöŒ«†ðq¼ú=Õí­XZ—ò?ÿ’roW}½xËÎÿf¶ßT×Q¼öÖ¨ 5EÝ ø*ƒ¬¼ ¤¦D“rG4K}NRº•.2¶Ö¾e“¹êrDãÞ\Ì…wÄYilwá>5 gg;+Á“Û<\yP‚G¢;ñ˜×Å'·µðŸ¨QËWÇñ&,}vÔËÆsx<>•¤;œ˜v[I±Þ,6f_f…5?ZãÏÜlY2á|n1΋–j”\C;°RµÛ¢‡Î`ñЋžn׆(6âÚÎÄ®8ºÚ!އܸv»°ûF1 GÖ¶@øÜŸÎºãj¶p±à•¥˜þ0©8‡:pF Y‹f0s}m3Aì ¹Æy½œÿ ðã; ˜¸¤g«JIž/vl]XRCHsò\¸¬…ÐÇAR+žnVÀƒk÷…múÂÏ:ªc¹D'ãžÃÀ6¬µ^£²b~ø}—ù¯§eÕ¶ýÕŸM×V_]Žýµ´‘tÎLË”ÉDÛ­¸7@ù×4±Òòö¡´¦€%@×+¼¾(“ãicéh—‚B/´º—±~޾¸÷ÉW´Ó]Ò¦ñÜ~àÔÊïN§3^Ž~RËçr3+¦Æ^Žž3u{„ÈhRzñPžœÞÆÑƒ£‰î›@é–|Îb¦åOÓñëå¸÷8ìö’”4£U6ö_ú¿XùgŸpîþ¡´ÏÎçðWXï¡Û€Ž®ÿ ^£ïq}ûa*^ÁIÏ>šõ{6a¹(¦´ ˜Þ·?H‹Âw9i€ÉþSºÅ  –!{ÍoŸÎmÑ™äo܆qÎÏÉ£¥œkÜôâ²®Y½L6qæk㪽R{¾ÌgXê€ê0õmBÔÉ£ {ÙÑ1v“†FÃÑÿv=…_$=6‹Q=j[ÚB+ÕcI¬U'å¾']@K+çOc¬˜ƒùÉW~ÁRTTÖlx~üÁ$vaà²` žˆz˃@û3È:”Nz‡DR“ —(!+ãšNkð⫪Á\£«5¤{.xW¾@ÜÀ³‘y͹(ù9p*ðŠŒí.&¤¤bïåÄæK œïÎ ã2 ΨÚY²ú·ï\r²ìu•yÁn;Ž¡æê“[À>_:âSH© ô:^|r[sË×Zµ Ž6‘Š3ÑIÚ&ì€wûÆÚïUºHEÍþÿrp?¸VÌfÝ-\ r;ðÚX;ðn_ÌüíhŸòàÅÀµ×‰6ì)wb †ÏBܸö€^‰¤õhƒpåÂgŽqÏó‹?n}y+™1~%–.I¤ôˆÇñƒ¤¥ØpNœÊ¨Á‰B.z nŸ ·1 §ÝÎ}Þ`Ùn¯Õí½Ò°t¼.ò.ê}ºðs ŽêÚF.ͨ秓Þ-°ÏgÿÝ…÷”¦#µúü|1[¬T‡1“kËp¨¬Àï¯Ú¶¹ú³ €æV¬f Â·ŽõÕ娇Þ>DDÒ¾øŸ™œëÿ q=H3S8çÎú9]¶‹ÿÏJ¯vÚzzî÷bˆ0‹>ƒ€oüœÈü…_ÿ/øråíúÑz_0`œËçDùdnm¾†‚Ú.^y?àÀ§Ét³˜güœ,\Âþ­‘$ ~žG§ÕvI­¼\7Ó=ãéýdà?ð³e›8w~¼àÉíàì¸1å½TëpC¾\DþÇOÓí' èÔSÆñ¾ÉWÁ·é+ÊÇ”zåŸæ8´‡ò¨{hý¯Õç'³Ǿfãé1ö^7üoþŸZï{:õ¯w)³§×“ci|Î)¦dÝÜz›ï¶~‚TùÕƒÔŸ?ú#æff& <Шѷê‰:{¦!çG¶àèV5œî=Vgº y*iUÀ.¹úlÃ9ÈÆÒ%³ãìx­Ïs/ ÖXSq&špåÐn ©] <ÿ¾ÒÕÓrö–0ªk4Ö”8LnÜÐá>t ¼ÞýiÕ rpX×ÈhüXCYdÔ6›^H|x<>ˆ·`íåÄ榰lƒî¬ã°¾K¹÷¹1îsbje›EŽ´K"-ÅŠá-­î3¶gàš˜Jj| ã*“×Ö+ ‰ÛãÆf8’EÖ> ÌFêfi0úªO¸û±…äåTMD1 Gi•Ôzr[ÇiX֯lj¤$Ž÷!OõHŒ,Öm÷ââàáM@ [6^C¸=å¢ÐI6–Êde–&ìýÒ°‡ÇS¨Cn%¸>ó1ª³³Ù /3 `‰À/ñá|y.¼£m؇ôöÖ¹ƒœ}…ÐçVÒúzVöÃg]q­lNF J¢Íñ ¬u‘ñoë³0Þ\Hz‡6žÅZN”=!ÖxE&Ë·¿×¦2×>p&¦–hCqyo^ ´ß•†ÅÆ?¯±‡ €p,U½Hun#5Åã^%ÍÛ°”Œl [ ªBT@ .·—Q­DßîÄæÆS ¶‡æ°p´-8Kdû‚ÛNúA*¦¬ ¬ ûÕÛLH„’µS·°õÕ娛êÒ>¢q>”Æ­ÍáËÌ¥d\ûèu‘ºñïÂó]—ÿöŒ½3ÙZsˆý¹ÈŸóQõ¯g¿\ÎÞ¥Ëkí¹mì»­Æ^þ5ƒµ/ x9öÑ>ù¨æc»ødOU-s,øcá®[½_ï¢è½]]v³ËÉ™sÑ{øê]vÍy7ø‹ïÓ?°ûÓ˼þËù|2gþùßÏncïï·]¸ÌÙbŽlz‰#›êP³Q€gí”ûF“z Rþ#§ê4zU`ª Sßf8ŸÿHÝ{¤¢‡LâÙAQ€‰¨àÝq¶!S˜ÕË€S.–ýzåE'1><‡|ÐÂÕ9ŽI§ ±öJ%º´ÃjÇÒë&Üçcñîªå½X½ÂkÝH$ÕPÂú÷r.,¤î|á5¢ò½áÞ°þ‚ýîZ¿%°ÿ¬À[YM'uV¯Ê!mr*öÑs˜Ó%‡Òp)}lXN¹˜÷TVu½¡¶ת•ö‡½×8æ½â Ïkb™Ìá IDAT%ñID7÷’1ó)²ö{ÝÞ•¨hªzV¼»]”ŒMÜæu“ Ÿu>Ƶ9Õ†¤û‡‘Ô|ŽÄ,ÜÇ ,‘I8;^;/÷å³!ÖXïÑ〠z¤3cºœÿÇ{W(õÊ|¸öB{tø6çC0´§Dc\{®¥‡¬”R/`µ0àÉY˜öfðÎëëÜFÎóà)…Ô2j:z8œñøöû ›Ç}SI?ºˆÕ«ÞÁÕI¶t^y5×+I}l€—Œ¿­§«WdqßóN¬C¦ðšu'S<)‰€ÏÅ{ï¶|Õúêrì[Ö¥}D‘úÀ(ÒZBÎ!)©õ2ýyùÁº_³}cÝïY—ó>ërÞÿV÷D…²Íð’“HJt¼rkªz¬×­µœ%sX¹Ûƒ¯™ƒ°s>/¼¸˜u|ÐÒÁ‰Qç{š(aõ«ïà‰pÔÙ‚qÔÍÆ¹3³óÕäݼ7ÝXº¥à°xd±øå¸®Ö¹æÍ`æs3Y™UˆÏêÀyWV£œµ³yöÅÕ¦ìɪ>Iôµ¹ž2øþeÌšŸA¡×À“Ä­­ Yö»ÕâT„þª•n¿0¥ÛÝ·&1`P ¶ÊB2ÞžÁ”…®=Ná}U¿;3Ⱥbî4È™;…™«r(4¢p@J»3¸>\Ì´WžßW{]ž=À·/¯:dxw»ª»»Ý{.û<„øÈùãLÖ~eÃшÅW‚ëï3™¹ê¢NóýYì vfl¼Æ.uð~8‹)s×á*ûi8{Xðî^Ǽçg°ñhCmžÕL{a÷Ç?€´;ì4=œÃêßNavVðo­r'îª^­RW0|r~šoÀp×èY©ó1®ÅÑuÌzqw{i“8€a?J#¥{8…ÛW2óùyÞ­Ú„Zc-|›W²r¯£ÒŠ=1¾ú3ãZyòÜÕ½Zy{«Z‡}Ÿ^K¿—›÷–dà)7Ÿg¶ÀMÊun#Õ Yöêbr¾ðBL R¢p¿5ƒiÿ½·×ÀÒ5…”ÎMáÐ:fDDDêQ£ˆˆˆo¦ü2…?ÌÛ}õ¥¯ ÏS‰ ?%yP¥QIöÂëtÕtué—ÁÖÂt_/Ò|jiƒu/6¨V6]£±šŽ“—]81LœÀÛ¯ ÃZ™Ãìg¦ –ZYR&±ðå4¬†‹y?ÆÆËÝŒ/""""7µ_LêÅœßײַ¡}‡vÁÖç[MªÒ¶ä:kŸÆ”ߤgwîRv§+Pòá{Wé%úÏeé7i?rÐ)ÞŽð¬]¦%"""ò=PoAêð§etèÑà½R•F%‡?-»ú‚R¿ö-fúÌ Æ=ÔŸÄø¤õðá-u“ñî2ýý*ôþƒ…·¶áˆ·ƒQ‚ûÃeÌYòmgP‘›A½ 툼­-·ÞÓ©ʺ¼‚õE+<Ñ Û©MÕоz™l¢JÙ¿ŽqøÓ†vwøÓ# Q"""""rÃÕk(ÚVÌ÷ñ«/¢#îãm+¾ú‚"""""" ¬Þiÿ‡_pöL%ío¨—õy²Kðd®—u‰ˆˆˆˆˆ|[ ¤ Ð3U~ÐÇ­C:]ó•F%Ÿø¥†ó‰ˆˆˆˆÈM¥Á‚À±Â|Uü5ío iF¿J£’C»pøÓ2Ξ õ›^EDDDDDVƒ)€³g*ñdÆ“}˜¶öÖ´ìhÁÑœ&MÃhÑ®9'žâì™JüGNQ~Ч(¹©5xªéXá …$ùΫ÷YûDDDDDD¾ï¤DDDDDDB¤ %"""""")‘)H‰ˆˆˆˆˆ„HAJDDDDD$D R""""""!R ‘‚”ˆˆˆˆˆHˆ¤DDDDDDBԤꇘ˜˜Y‡ˆˆˆˆˆÈwFu:zôè¬CDDDDDä; ÐÐ>‘)H‰ˆˆˆˆˆ„HAJDDDDD$D R""""""!R ‘‚”ˆˆˆˆˆHˆ¤DDDDDDB¤ %"""""")‘)H‰ˆˆˆˆˆ„HAJDDDDD$D R""""""!R ÑM¤îü¯Î¤¿Ú£ÁÖ•ò3þ´ŠU«V1µ_ƒmææÑv8sV­bÕ¯ßèJDDDDD¾7šÜèjºó¿:c¿« îÿ=Ò ëýÉf=‰·Ì˜d"""""òýwÓ©ªU¸ý89-nmXŒ},}á%ò“g1ï'WR¦ØÁL7’d{á¥e¯bþÂMWBß_¬`ê]elZšOÌ}ƒ‰»¥‚â¼÷™ÿÚ* üu}þ k ùÑÁ”ýe43?4“>–±CzÒ±µÿ‰ƒ|¸„E«óñö™ÌÒçûÁÖ™Œy-óé,}*™âÕS˜ô×$?:‘±{iÉ6ÿe.Ë]þÙ"""""7‹W_}•¢¢"ÞxãZŸæ™gèÑ£&L¨×íÞCûj†¨ÿôEƒm'ÿýE|ðY]ÂE,£ŸŸH?û 6¼:ƒyYÄ šÈÄY0*+€úõ­àÝßLcö/1)0é'q!<ß‘ÁC#ÉýÛ6D˜Ê´GûÑ¢èæÏÏ_¶¦ï£Ó˜zìÜF®̉}IÀDß”ž@1Û6a4‘©éÉ„ï]Ĭ߮ ¸m2#' .+""""òýµwï^È3ÏË$ÿp›™¡©¹•G_†èIx%˜Úw%®mnp!É#&r¯±ƒðþC‰ŠwB)бNÏ×T̆ :&™‘OÇ¿ÕK×'ƒü7™]ʽ?̈¶& W&ÛÊÛiŽ5ª+ ·æîNÐ[ÏÌ®zß"""""7¥7Þxƒ“'O4Èp¾š®û¬}ÿé `¼YCÍÎw9=Ó'31éüï±?šÌd ÿOÙä6Î?‘ý.KwÆ0:q$Óž-`Ó_f3ÿÄT&Þu?ïÛÅJÉÌòÒï§“ˆmé§8k sÿ§¨ÆÖ®öü…Jߟͬ°';äA&¥„ã?VDæ_–ðæÿz«—)ØšMé†e6ر=p;üu =ÿk(ý&N%6ï}æÿÎÃøç¡ß¸±ìšª»¤DDDDä?GC¨*"""¾™òËüÑ}]6ø}üìR¦÷÷±æÿNdÉç¡?/"""""ßMžt0ç÷;oŽéÏ¿›LW™<þjÏ‹ˆˆˆˆÈw•NõEDDDDDBtÝï‘ú>È}m #_»öçEDDDDä»M=R""""""!R ‘‚”ˆˆˆˆˆHˆ¤DDDDDDB¤ %"""""")‘)H‰ˆˆˆˆˆ„HAJDDDDD$D R""""""!R ‘‚”ˆˆˆˆˆHˆšTýЮ]»Y‡ˆˆˆˆˆÈwFu:zôè¬CDDDDDä; ÐÐ>‘)H‰ˆˆˆˆˆ„HAJDDDDD$D R""""""!R ‘‚”ˆˆˆˆˆHˆ¤DDDDDDB¤ %"""""")‘)H‰ˆˆˆˆˆ„¨ÉØh«V­8p 6› ÇÆ 8}úô(GDDDDD$$×½GªU«VŒ3†ÈÈHöîÝË®]»ˆŒŒdüøñ´jÕêz—#"""""²ëÞ#5pà@Μ9ßþô§êÇrss3f äïÿûõ.IDDDDD$$×½GÊf³ñùçŸ_ðØéÓ§ùüóÏ«‡ú5¸°8žxc«V­bÞÃ1×g›W’<‘¥«V±h\\à×g—²jÕ"Æv¿Áu]MÛáÌYµŠU¿|£+¹®nÈ=R7ú^¨Ø‡'roûZÂýc>sw¼Ñ•\Å×Ù,™ë¥µ÷³]‰ˆˆˆˆÈuu݃”Çã¡GdeeU?Ö¬Y3ìvû%=U ¢ÓHžIAV.‘ÎäË,ǚŽ3Y¾¥5ƒ‡/-böÒ\üÖ?–A=;b óSµ‚ù 7Q\ }±‚©wdÕ«ŸûÈz¶ïž÷™÷ê* Næ8F>;‘‰‘p¢€ [ýl=öG™Üß`Í OPôõHæ½ñÖ­‹xÓÌØþ1û’¹d6ó3Kˆê?‘Iö%ö8øÏ%䶘ÈÈ䙯®ºº¶5‹üè`Êþ2š™›­ô}|£ïŠ#²e^÷6–¾¶ˆ§3ãÏI([Ôg–PÐv$sþô±Ÿ-á‰90vòXb]óÉÜS ˜ˆòG$i¦¢dÏe¹wóÿ0’Š÷§0ii8'³â¹~˜¼0í‰EÇ‹fqïñå<ñü*ŒîÃÿÄP’mQ„û‹É}>óÖ`T—ÊM,ù¤+ƒ÷Ÿ™Â†È‘Ls/ 6+áç¼”íÙÌ’…ËÉõÖkË‘›Ð«¯¾JQQo¼ñF­Ï?óÌ3ôèу &Ôëv¯ûо-[¶Ð¬Y3ÆÏÀq:<þøã4kÖŒ-[¶4ðÖ£9áA:¾Ë¼¼˜.»œAE%`íÇÝ·l`ö‹³X{ÐJˆɌO1Q n#SÂÙ±pÓþ´‡Öƒ&29=*ðêÊ  #Cl#wÙ|ÞÝc•üãx>áñ©<’ƒwûRæÿ%›Hg2æË–RA`îs?wý>‹Þ̤ÌËàñ£IÚÞˤ§×ìkçÏçýcýšxTÔ²º`mƒ‡F’û·%l*0ˆ}xSïÃÿÑl¦ýz;Þˤ§ïÅìÏ$Óe@ûdîèx½õ®ÞÄù›¸8§˜’ž`ÆSƒ‰<¸†YÓf³¡¼'#ŸOß’|ö”CŒ=г'¦r?~k½;m{o…Ò=¹x[öcò‹céwËg¼ùÒæ}RAߟNbL÷Ç¥u?†vßÇ»ËÞ'·<±“¡o³\Þüí4f-ÜAEÏûyâ'— É""""ò}²wï^È3ÏšŒwë|]vh]÷?5ïÖ úþ8ð’»³Ž`Ûg£‰µßÍиÏÈ>ÀðŸôÁZ°‚—î¸J!d»¼Ü;(™áOÝ‹g8ýî‹»æ·eìÎ¥¨2Øþcy¤h¥·åîÖ¡¬¡ˆmŸ3|DýÄRì†>#$!,—E¿^‚ƒÛ³ñ;û1âÇø³Ù”]{äÛ³}ÞþƒI؇ÜuEXïz¡·úÙôÚLÖåSàÉà”dø÷rrOƒ7/ŸÒG‡Ó·%¯Nâ±s¹þd’S“°gÞŽƒypp Åkg3÷ÃZ6Úö^füá bö,aþß ð+Ã[œ®¨í1ù{ã78yò$@ƒ ç«éº©ÈÈHÊÊÊ®º\YYõ_@y1ù¹Åç¯ìKPQV@nÑe†€ÞÁöÏótO¬•¥äþÏ–¸JY3g6ÖÿK¿ŸNãÞð ŠÝ›X±zÇÕ‡èùËæ±ªí†Þ1†‰Ý÷ðþ?2‰7Â/?ýÅe•m`îâ®LþIF>CÑöUl*L`xßAUôÎlæ6{‚NdÆð~™ËËÞ%¿*/íÜF®¿ýÌ&¼›7‘[YûzŒÜEÌüŒÿñ&M§âØArÿ±„ Eùäf0¸)0©Àçù|æN”ÙK¾+xlÊ3™û»H&ŽÌèçú^QJQÖ*ÞÝZ Ä^ºÑc›X´,–‰#dêo̘*¼¾‰ù‹ß¥øÒ¥EDDDä{®¡T•FßLùe þènÐ ;–¬¬,öïßÅåª& xýõ×´ž+‹eì‚9 o™ÉÌGçrÓO[`2u ”ó1<òÚËç® (z8ƒ:‚?{7º6‘ï©ëþ…¼RÏNg2¶‰âÁ©³àt)·/çÍÅ™uf("""""¡SªUK&Œ¤n}h7ž7w93s—ßè2DDDDDþc\÷/äù®S ‘‚”ˆˆˆˆˆHˆ¤DDDDDDB¤ %"""""")‘)H‰ˆˆˆˆˆ„HAJDDDDD$D R""""""!R ‘‚”ˆˆˆˆˆHˆšTýЮ]»Y‡ˆˆˆˆˆÈwFu*..¾‘uˆˆˆˆˆˆ|DÚ'"""""2)‘)H‰ˆˆˆˆˆ„HAJDDDDD$D R""""""!R ‘‚”ˆˆˆˆˆHˆ¤DDDDDDB¤ %"""""")‘5¹ž3G7ÇÒ±9¦[ ·4Ádiœ–“ú,ÎTrÀ¨dÓ×g®gY""""""!ið Õ¸IcZÛ-X»·¤iëðZ—IhÖä‚Ç·mΦ¯ Ö”Ÿ¡´¢²¡K Iƒ)sTs:ö‹ Ió°^gi܈­š2¢USæ9ÉGê¡‘›HƒÜ#Õ¨Q#"ZÓyHtÈ!êb“#Z09Ò\O•‰ˆˆˆˆˆ|{ ¤"“­DÜn…Fõ³¾{,&^épKý¬LDDDDDä[ª÷ Õ²³™¶·µªïՒЬ X›×ûzEDDDDDBU¯÷H5oÛ”˜»#¯¸Ìi¯Á±=_qÚkPqò,Ã*ΑÐ<œ¨&Ѫ)±¦Ë|ÄÚŒüÓgÉ?UQŸe‹ˆˆˆˆˆ„¤Þ‚Tã&± Œºìó•Æ9}|„¯‹O^ò\þ© ò¾>CBóp~Ñ‚È&µw–M2ó„ç+|•ßÔWé""""""!©·¡}­ºZ.;±Ä™­?TkˆºXþ© ž=XN‘Qû´ç–ÆÞ²Yè6gX›¶¼ÓžwlÑ,Œ¶ò@Ó«¼ý&ÍøyT$KmíYÓ†ÖiÞŒp~Ö±=ïtjÏ/[1YÚðN§ö¼ÓÞBÇË,ó]×Ýxí®rl5áÎ6,íÔžw:Eò˜éâÓÝÒŠ_·b±­=‹;Fðë¶z~»9K¾ß®©M,¼Ú©=ïtjË¿Å'Á¥í»aý màoga›KˆˆÈ÷Hoâ&½CœýâÇè6a5=ßÚ{‡>ýãj]ƒeàbúý¨o½VÕ8ñeú?ö ¦«lûr¬C—qÇà„z­éZê¨õ¤ÚÄ·¬õñÊÓçøò£ _݇ãù*¿á…Ã_ã?W{¯Óà[B=jÂíxÌb"²Ñ7œ8׈֦fŒŠlÍÀ+œtþ ••;›†a:gsÒ ¬N`ßpðôöœ>CÑe¿«.Ë|ÿ˜L-øyt?·üÿìÝy|SUúøñO¶Û¤iCÒÒDhÕi±PŠE-Š ÖQTÁѺ€;£ü†aD¿n¨èˆ3#¨¨à€Œèà‚, Œ¥ «P¤Z ¥mBÒ4mÖßI¡@W)¨Ãó~½|I“›çž{rÓÞ'çœçjiì´ÆX˜MšN Á¨µ¤c™’CJ/ù_óÓÎS!„Bü/¨øân6~½ëçnÆY©M¦öm¢Ú5|³Ýâ¯Jñyü­ŽY1½ÔÍÿuˆ9é9›VÍ•±Q-¾¿”ËÈ( Pˇìlhiç*šEÅ*OCWžj¬‘$«Äu„W-=?ŸUTòÙ)oó¿çS;úký¬«¬!!.†´“¶Ðqm;(rf²ÓºžéK²Í@]…Þ3ßî_¶Ÿzž !„âAü•¯ÓÙ5•õ_îBÝñÒ¯ÎÆ¤óâ­\O™»Þ†Ú$.Ÿ@r'+êø+ÖPðé»8= Õv"ñê\’-¨Õà/_Þeó°»ضÚón¡Ë Á˜Œ ¸¿§øó—Ù  ¨éĹ#'б£­·˧SXäbzÞCjfŠ‚5…øâ5J¹›y”¡7]n„>*ßå»± Äy)fÔA|{9ðÅËì/nÅ4uŒm$¦cÃÕô<嵸Kk~rÜ­…Þ@ƒ(º´-N¤zô(@I•‹ ?KÊJYÒè+ô‘ŸÍ ,0ûYxà0Küj2bMÜE²F A?E7óÕìBxÚ^{†j`CùA^lp6ãÉÛ˜cãù›Eƒ»œþg¤›VEµ¯–+|ì­Kö4ô1·ctLVUˆ’š*æºTÜiÁôðl±ƒM•UÃèvÑtS4èBA{=|`w±ÎŽ=°}þNbÞÅò{“žŽê ‡kÜÌ­¬b[Ýè™Zad\;®2h‰ùÙ]åâó¼Gj«xÑábCÀÀ”¸6P…ØætRFÝîHBàóQ„dµ³h0‘R‘bŒåÆX=i: F‚”y½¬;âdaM¸Ñ)æþϤƒQ‡#¿1T¦œk&?KfadÐÔjˆô“Nƒ.à@‡ޏØptPUM†ÉÄ1z’µ*|?…ÕU¼sÄCa°n }Ú™¸>&ŠŽülvá §ÇÑMFšc¨×aÖDâxܼc¯¦0òv•hF›ôR´˜U!Û].Þpyq7zžºHëh¡>>TÆüHŸ¥Y¬ü%VÕvF•·âs©Öq•9–k QXÕàxëµáxŠbäÁ¸zê:w!1:6Ü·Z›-šB IDAT5J(Àîj7óîÈg§¥ý•ŽÑ¶ö\«@‰³‚?:¼x[зB!Äÿ–Nœ?ì”ïîçëoŠ¡]6Ýo·Àág£/}” ;ä³éÍ©TyX†¾@÷¡Å|ýáWOˆ}É$:›óØ0û]<ØH¼a&^º‘¯¿ØÚ²¦è/£ËÈø—>Ì×…v”OpÉÈ;©zý%” 2¾ÿ0ë+ fàLzgeSR´ÿyãé~¹™}oM¤ÄîEI”Þ#Çàúû,œJÓ1ÐvâüœIÄìœÎ¦ü½òiçïç»þ§´L ýÂÞ,þжøê¹M)]lÃa*w9O9ö‡Gj™”pòB¢ }K›®%%2XVâ‡>&YŠ·ßˆ*7›ìE?›\ÌÑÒ4à®õ°Áç§(‰±qÌ#}ÌñX‰Œ´¡edB<7)PVãa]uc”ž>1혦qw¹·ÆÀÖvd¨ƒìvW³!¤"Ù` ¿%žó'WãçéÉ£}?UxZìMQà xÙP$Ñ §¿%žDu9“ÔS¢— ÃPó‰çn´…¿´×c$À6W´†Æ˜xLâ¡ÃÕ8ZØÿÇSÓ?.ŽkpT;xÒáÅÛ’¾m³þB!N'ëµoÓþ„ëUµ*OÜ46“8ó^í(ÿ|äÁ @¶Ô$¦Ê àÆþͼw ^ý‡OȤª×?̺^üA€R*÷—Ñ9) 5-L¤RÐÞ½žo íx·<Ïúþ X~\AIEø­ªh7Á -(€ñÂKQ¼F‰=üœw燔_1Ûy³p ¶Ñaø¬‡^fÓº]áäÐ]JMt?:dôÆ_°•êf³õ‡–BK´I"¥Ä6<­¯úF£ê”úOÌ‘ÃlTõ;™ cd@+ÍÜž>šº«x=c¢˜{¨’ÏNJ¦ü¬²;1*á ÔÞ*þîôjúhl÷8ìvòFu<*þiÆh0Ð6´þŽ%@Z5…¥‡ù{mt1¼Ò!«&Š>:ØíÕrUd}˜Ãíàኼ¨¹*ÁƸfn±•¨S‡/L½Õ¼t¤¯Ê‡9ÉB/ž>ʶÕkƒYàÕvÖÁì ” zºQÃ&«¢Ã}¸©¢œg«ƒ Šâ¾Žqôÿ‰ÇÞEgäxFÀávñq#‰Tš^Á”UÙyÑ~3Íž®U ÐÒ!-×¶3`U•ü±Ò‹ #mVnŠÒ3ܨe]•ÂoMZ ĆŠr^¬ÚÀcÍôÒÇ0T©f~ÀÀÈ dUy¯\þ’h"ÍC/—ƒM*…n @ ;XTÕ\ÕN9ĸ=j ¶Šg+Üá‹] £ZÂv§z†þ¤?™bˆL‹ÅËû‡*ø8о¯X£IŽ1ÒÇé`sÝÆ:Žò2þTD‰jÇ+¶hÌõÎÝkÛé1%G*™~ÄxðvHàZC ×*ÕÌ÷¶ ÿ›º¨"ÅÇŒj¼Þ*^¬ð„GûÔ-èÛ6ê!„âôòRùÅýÕ¬ )c=ù"Þƒ7þzSõj=n Óm(F0_þ:—½`SPûŠQŒ€ë„X–~œY6æÈ5¾Ú`{Ë[­c ¦ªÞ¨¿çØ7ÛþÚÿëPŠÑˆö¼{¸ôŽ>£ÖêpCÓ1•è¬ÒQõµýØ6eïòÝR/ç÷¼™î—?‚ÚžOñêÙìß׊ƒiBÛŒHÅ4Æç>õA³S¿g”Šº4Ïòðâ'Û‰â÷V ýµQÜhRø¬²¥CA68ìÇ’%• %“®Š¬U9ÕâZÖÕF.ü}~ B`Ui±¨´$GfwuMd–[UÕ5Œ34]-¯Ä}„gëÎY• … Ž  Q“pÂÌIo‡u‘üÕQëÅ‚Y­Æ¬´ºHe¶Z6{"…jYë Ñ?¦íªA(J S¬±¤©Áë­â¯öÆGûŠý@ƒÕÏ ]-›jjÙ^[ÍûG‚ ÏlŒJGj¤ Æv7òÚKJ›j¨[ÛåeSÝÚº ‡g‹ëýÖ2DE¶ñQÐ`Õø)ñCšV¡—6yý =èO_O-Ûk½lrº(«ûî ࣠=Ö(3ÎQØäñ²­¦–%ŽŸ>òÙZÉz]ø÷¯·–µ‘sÛ[s„»ö9ºÍÑÂ!AŸW‡ï­­ew(š>uç®Z‰œ»!J|!¬Z ¢Ð† ½|-èÿztQ&‹Ñ¢àgI…‹Ýuùr°}+„BüJøkìxûÃï&ØÐß3O~Œh ýÆ0ÊhŒ|S^Š× •_ßÁöÍí1‰ó‡O"nÿT6-ÙŠ0\ú }Îmy›½î*0„G™ÂÏ(V Áòâ&_çq¹ñï|™¯?ßxò“éMÇ î{“oÖYé~ó$Rö?LáȨVá" ÚHLæ£\4|,U¯½Ôš¼°QmRµ¯±ËgÒfEOAw䫨ªŠ þn #U:]dȳeÌQ1á܉üЧ}]ŸX¹Ï>Ž­¦Eý_ŸQ§|vµô©_²}+„Bü¯qmÅq¤ÖŒ$Ôñ7Ðñ¼º¿Å”î*&®ç DGR.K·+/k`TňbðRsh/~@%çu±€blùLÑz*£ûqnKx_é÷Ðû¦ßÛÌËœ»¿&˜z5ÚEi¹’Ô‘c±(ÍÇôWîÇ[ö.;Ö¸éxÍ=X0ô|‚ÞW_†¢‚nªËK ¶azÒ&WÞ*?úî颋ѨlYAˆÆt74†Í\6Ù1*êç[G“¢V'Õêpe‘¸F¡ã“î¦íÛÛ>?q 9à‡ ¶åýOx¤rºîµÅ`mÇȪÃ,‰Äm¾o[ÝB!Ä/Ü.~üléCÿþ™^¼k8°³˜ºÛ¯V¯Žïõè6&µpï¢xå¿(º°‹â5ùd\ö }/õâ¯XAÁ=òz -fã¡4Åó»>´Ò劸ôÊH…½_Ã^·Fª1ûæ°uÝ=¤þîuÎS:TFå†Ùñ43¾þ®óŸcÏù¯páU—ñÍg‹(;w½þ0u‚µÅúøå6‚6J¤|$RF›žšSL¤[ UÖÈÚ©“…ØTãƒB¢1š —“m!-£Ã šÛç?VE­9:%r/#/«ŽxØ«{f’( nzX/-t3D¡xjñ¢f`ts7(Ö’V7eªªŠu5€Ÿº®mÍà†ßO F= j>«‚ZO–¾-FH4\g¯ òºx²¼š’f_£&ÍMŸ(Ø}¤Š 5v×xøØ«bA{=F­( DÎE!MUͦ$FëI®*è¥Àºãû÷ªö6Æé¡ÌUÎýÎZv£'(úT¬ªJϽ-ôQ‡Xwø¯zë¶QC † ^@¥¥W´Žè`wÐé­` xx£ÊË:Ÿ—uU5x;&p­VƒEVM4 :¼'Kjk(óÖ°Ê ¯µÒhI€F© Ž Q“¥Ú@ä=jý;²»Ö‹7V¢DÑGSÅÇ *–6#fjù{q%ëZ(è¥È:1øÙàñ*R ’UAJ‚Á–õ¿ýXVí­ew­ùîh4ji‰fUY5Žôm›”êB!N«ìš9ªÇ·RðúõGªøx‘û÷½ËÖ9ïÖÛvÞ±k)1‡WLåðŠæ÷ìÙößl;þ±M¯.Šü+/·œ¼ïy‹Þeë¼wOzÜþém|]ÿ—XóúÑWQµù%6m>éeMÆ<¾vJ—ÜFiä§ý=ÌþFÚxªÚhDªáuLæÔX*við¹–Ñ.ªÁÇ·Ö´üJÈQåâóØx†jL騧,¤‰Ü{ÇÇÇ-,¡€ßÏaÀˆÂ5q&ƒ:úTù!Y«c 9†²#§–86Ó>wù¸Ö¢Ãcám-%*…m/š&F¥Ž%`=M~"-Z‡»6QjÒbÌ\ëwFFšð°Êc"ͽâã™bðC”B!šÎÈTô1[ªhH!üÿ>–8’C@­›éÕ:†Ö]ìëŒü¿DãqÊ\üé¤û$Q”h®ÑàÕ+|ãñãV©IެÛYkã­©¥…dµ{m*6û5tÓ©( AâÑfûùøH CÛë1ÇXø?M %*…žz XË\>øyßedJ¬–^ñí™bð…«öEÖr}àð°¤*†Çb4\›€ÕãEOE×ëâ/Ut3ÉPHÓ×°;¨‰â-¨e“z…¡&Æ…´êZ‡T˜£ô¤îš¶7Ú×>6ÕhT“Ü.ž):/D)XдnTÊëqñ¯ž‘ŠÂçÄ“VÄjЇG§\UG×Ò5ÏÏÇÎÆëI6Çó] ‡U =£µƒµüý` »[Òÿ' ±Áábwt;Òô&~oðð¢·ù¾B!„8Um2Ë} ¡;yAT;F[3åäš— 'Ýp®·µ57ù yy£´’%Õ~h°jB8¼5,)³ Ô"7¯Vx( „0¢é£ °äp/©¡,‰)§yYX™ËÁ«./Ž  k”‚5àæ¯usÅççýr'›¼AÐééoаÛngº½ŠÝ0*zz¶x=[U••|ìñãFKš^‹Ïíà¯U‘E-*u# kTú(2ôZêR¤£EiP"Óîêâ˜5'ü×H‰õmöð{p—ÄjÔc Ôòye9ÏÖ•S÷WñjE5»ý!tº(R5>Þ>ìŒ(P¡‹„vWÛùSy›¼! úD©8ìqó÷R{¤ºcˆmöJžuÔPÐf4¦°­ÊÉô²ªÈ·>!6U†ÛT„†>1ÑôÔß&àá¥Ò#¬ò1ë£k¤g¹]¼Xê`S¼ªp³É¯"-ÚÈÐÝÔ69Lo²„wˆ ûÑó=M¯ÃWåàź…GªVŒ†ü,,+g~•‡J¡QOBÐÇ:G%²{[UÌÃá¶ó§ 7Û|lŒæ½G¤oWZÚÿ T3ßáêc‰%-Ø|ß !„Bœ*UBBBèá/æ¥™ÝÆµe:ÿö\”î'¨ °÷?ðU·n.Ψ¥Ó°DÔ:çì­æŽÃ>Ì‘  2ßï;µ‘®_+£VGŠVCtÐÇoøê3±]3Úi¡ÖÉ]¥î–OUB!„B´Ê{ñ‹߶ÍÔ>€ÊG8§OüIkôÎlcßÊÒ—C×Åh9oÐ9hôáQ’ÒT#Ó“\ôC5· ð…ëì›cŽndzBvW×R‚–^ÆÈ}\I¢„B!„8Úl"šã‡*üž†kG™:]›HLbt³qb“¢¹àÚD¢Ú_­Omа5#–ÇÎb©óÔoôûkUâ¬dºÃÃn¿Šäèhú´xkkXRv˜¿VËMr„B!„8ÚlD*èR¼¦Œä¡|^£¨9ošŠZ*v8©±{N÷ÓµèÍ ñ]Û¡oºwávÕ³y‘CmNÛœ?w;„B!„8{µéÝ)«Kk(Ë·cÍl¼B¼>>ŠÄ ?)~éÆJªËÎÞÑ(!„B!Ä/C›×˜+ßî ª‘*~§¢ªÄCÅŽ³³À„B!„â—å´ë.^]Š}·«ÍâU~ïdÿ—¥Ío(„B!„g@›Ní« „8¸¾Wq5‰ýÐDý´|-P xíaÜÛ~„K!„B!~ªÓ’HÕ©*©fÏ’ý´ëƒ%ÍD”Y×ü‹€Z‡ûn'GöVðI%:!„B!Ä/ËiM¤¾ •»œTîrb´ˆI2 ÄêеGoàëuùñ¹ýx]>ªŠ«q—JA !„B!Ä/×iO¤ês—zp—Ê4=!„B!įÛi)6!„B!„ÿË$‘B!„BˆV’DJ!„B!ZI)!„B!„h%I¤„B!„¢•$‘B!„BˆV’DJ!„B!ZI)!„B!„h%I¤„B!„¢•$‘B!„BˆVÒÖý#))éçl‡B!„BüjM¤ÊËËÎv!„B!į@ Sû„B!„¢Õ$‘B!„BˆV’DJ!„B!ZI)!„B!„h%I¤„B!„¢•$‘B!„BˆV’DJ!„B!ZI)!„B!„h%I¤„B!„¢•´?w~.Ãc›H%–X®Ém]»¼.>r•ð‘«ä µP!„BñKuÖ%R±j-3ÎÉäbC\Ë_£Ñq±!Ž‹ q Mä¡Cù¸‚þÓØJ!„B!Ä/ÙY7µ¯µIÔ‰.6Ä1ãœÌ6l‘B!„â׿¬‘º.6±É$J}ÁùhR:(®éy!Ñ÷Þ*þï‹Ðº TPýêB›¿o0Ö™M¤ðÄâId¾KîË)=ƒ{>^wrçü™;Ÿçæy§IIÏææÎÅ,úh+îf¶Í¼ÿ-ž¸ÜËÒ?ŽçÍݧ´Û2H½t™çžéï‚’èEª±¡çL =šä¢ù<ûät¦?3—‚×3n¨-üÊ«Çry ¯?=éO>Ë‚òtÆÝœ…©•qHÆ„’ØñΓ<úÄTæîŒ%kP @×!W¢Í›ÍÛs–R–9ŒÞ†º½¹iŸe‹ÂI€gË>(éËØáÉmÛEB!ÄQÛùá·°~Ö-l|ë ~ØR‚±ï2ölÑhŽ©ûïH°5].¬€â…)Úªím3zÒMÑ0Τ#Y§æ5ûñ™å½…+ ^sø(ôžôñÄê|ªŽVŒwçà|`¡â“ÇxßnÃõè˘^zç÷…„–5«A ýnÍ忬.XcÁ½?Ÿ¥sf³twxüÅvñ-Œ•E—D :·ÂM1{Þ'º,dÞ>‘ñWvÁBùÿÊç¸=jlô»íîpl“ûίxë•9äU($]~;ãsúÑ%ÁˆÏQHÞ¿f1ge1^@IÀíwÜ@¿ÎVŒ¸)Û“Ç¢yo±fŸ…œfqKJ!oÞù0K+Rÿú d›óyyÜS¬IïB"nÖì¶£\õgÞ»³;»>z“²®×Ñ7Ùˆ{_>‹_™É'û¼ác¸5—13°Á}h+ç½Ì»ßYóú \gÈaÖâÌðþ|ÝÉ™0†Á‰X7eÛV2çoï²Õ^wÐ^tIÙòÞ™ÉÌwòðuÉfÒ”ñtWJYûßB …~¿±Dvt™Vð~»‚õ5Ò9…½ìÚ^_ø¼ËåÝÙûÖŸyüoëñ¦ôcü½Ã±ÆA¹)ËÑ£¶pÙðLÊ–/bÍ~°eÞ„a¶V¿/-áÜU@i‡dE¾‰ÏìNRe;ÊGyùEáoö5l=Ò#¦€­;OÝñm$¯ 2Q-*ž®WõÅV²%<«©8>u$uÖAÃnîÁžwzK.ïËå¶Ë“h(¥Oºz×Ûv0û™ÈèGI*£oB|íFÞž¹œRŠXöÜô’(ÀœÅ¨ëÙóæt¦>ù sw'‘~ÒŒØ Výc6ë°uñtžyãŸLÿ¨J×òÊ“ $QÖtRŠòÌÔÇ™úÎ$]3$<ºWÇ·‘·lÅW•ÏÜ'ON¢ÀFïžqäoÄ>—U‡ è³L_´t=ȹ­/®eÏ0uÚTžy¿„ó¯Ï!ËàÇï7Ñ#µšùÓeîzÌ/ß IDAT]¯M_ßjfLÎ3¯¯ÅÖ·;† ø]j†Ç²ñïÏ2ýÉé¼²ZËñ#HÕ8Y;w)”²öoÓOH¢ Ù±Ò/îŠÀÌE ì* `g¦ôÞ$…Ÿ¤k÷óñïÚÁÉ„›Šc")É@©ßÆm“&3mÚ4&ß•Cïöáãô!<¨¯µ‚`è9Šl¾`ypî›ÈÄ;sèaŽìʑǖCÉô¾ÈpR+„BˆÓâÐj*ŽX1k¬Ø®z‹û¶½5‰Í ^£ºã=\aÅýÍK”T@Õú'ØòÕÐö!yèøò!^.›Wsù8lMý ;ÿw¤œ[BáüIl~+—mye˜ÒZ6Ög|Ô_í^@a A(¨àhõW{sóÛ–î’nÔ|ø%úÑÃvà[÷T…3T•Ù„.ë"Ôq&‚Þ ÚKº¶:þà¬ä³hö'äyaWY  TÌ!ƒ±áfÍ;/³ô[à¿Å$]<“ë.Ìeú5Ø{ebÄÍš÷ç°æ[`O"—^| )¤pYVxóXº ŸB`Ñ×ÃÉ6€Á–O(r6ܬX0‡ß{ÊØÛÕŠÛ©@ßlX ô£ÙÌùl‡»óeüyÐ÷šÅË_~Å®[Sèrq?Œ}‚u@f¸_æáEá lppýq£@ö¯±t[1°ˆµÃsAw2õ‹ùdý,r¿¯ËŽÛ I{ÆÐý¢N¤Ä{Ùº§$¼.ªÆÁîm…Ø-×18CÝŸ2ëÃ<ÜäS\¶‘CÙq}ºë£çys¥ ­ô›–Mâù)p:VŒ•,gÁW¹Ü9ù)†xÀ ®dõ›ó) ÛD×wÏê žbÖ¾?¼&¦´u½ùi&ô1à+ÝÂo.?®Å Æ©-¡8!™T]ÎÎÉxö­Å6t4=ö,`îù9Œs,ä™waÄ#7‘õÝ V·o½{ÄSðÅjJÃC}µ‘ÒË»’nXÎÚ¦Ž»Kg’+w² 2²æÜ¼†-#3ùéu.#Ü;Yõm8¡ô|_@©ú âÚµâõ†T’Û—°eo#Ïû¶0ZxÂÉg×Jéá™ÈHKñ浑þH"µ³‚ÿ¬ ?å)`u~)Y—†·KîÕÃÖù¬Œ":óW±qÄôî¼€‚=M5ÒÃÆÓõ¾ <ýŒ΀o×bf­ 7 bÍ–uËå¡éYx|´®|¾¶¥uuMűa2@ršyÿx†·]&ºæä2ö÷Ã(~nE%л³ Ê“I5—°ÑÕƒQ·iùâNÞ×üçf²£Ç&gweË{;?TÝ)ÖliÅ"„BüT‡ñVƒ&Ê †n´ïPÂáÏ6‡×LùŠ8¸s7½»\‚v˺ã_æßÀžyÛ¡6|­,ÞLU¨'Q퀿۬S}˜ZÃ%$¤÷ÄÿÃ<…óØUØvGò³›8>™âgI¢ „º};´=Òþð#ºÌt¢ïÁ‘±ÓÐ^Üã¤Qx¿ÞF¨¬mF šö­¹ê ³Æn;ŽÈ¡Ù÷ä±f€Â…ñF ˜²£yBev тŠ^³Ø)«[u_Q†"‰” «Pú1ñ½÷˜ Që9 >s8¶£nh³bkÖ„×4Ùú†ÇwǦ†Ù+ì@V«Ö¯ o纤gÒO¿ÛÅIà\ÁŠoºrx·í¢þÄ2‡½î*ÞÉC-D[@1öcÌÃÉ<φQGxdÐiè¬+f»=RxÂKñ·kŽî'|ÜnŠ‹ë:³;¤;q<Æ@¿ßO&ûÜöÑ(ùo?Çõ.ÒM}Çrç%¥ÌŸ6“0¥Ž`¸\¾8ãèh‰oýløVGüù}¹~ÌCŒãIænnø“¼ã½Çy`‘‰¤ÌŒ½o"Úf²¶²©8y,ý"™œ»&‚3Ÿ_ö`ôE,x©Û-ñ”l*†Œç¢ó€ã)&£šªz—è. ˜ÌÐTe“1<Õõ~¹ð´Åè·ÇsÜï8œ6Ì„jœN?3‘ÜCzXÃÅA0¯ƒõ›àöÝÖdðw\•Ç*>˜LtG3mê±þÓé´˜›™Î«IfÄ=9Ä®›Áã+‹ñèâéwÛýäÞZÉôw H½5—!ÞO˜>9 Ÿ¤AãȽgO}HQ‹ããtCé¶Õìp8Ù±l-%Oö¦« V}¶‚›G3±‡â>£1|9‹ š( ”55¿îðû|ÿ©—Ž7Òå7‰¨læàÚ¹,nÅ‚î&ü"ªö…~¦ýºû+Í;=`n‡:ÁŒñþ›p=ü2Á½ÇÒ…Ú‹.luü2oÁ¬^0¦fpš‘â K)­p¬V`@b8ñÂNé!p»¼@Lø±BÀj­7Å­4Û”Ï[¾ÉÖzûtö’âÇ6·ÄŽïNvV ü°†OÊÂé˜9Þ Öx ६,|e¹â¿[“žAæ°ËHJûgkÂû°¦ÑÉ…{Ž/4ŽU X±DŽ¡ÚnaøãpA1Kÿx;oî†ë¦¿Å˜ôF:«¢ `±X0nR\M÷¸2ò?nMu@yoLåÔê Bò…]ñ휹XgÁZv:¯ ½‹ŽµºtúÚ*Y¿¹_ÀGÅÞµ¬û~c»¥ÀæÇʼnOÏ"µv#y{=àsR¼þs¶^9™ôTë÷5§týf­ˆgȤ -™A‘zk€º‘±—:qºuXMõ.cc1áÁé€çFx<Õ`ˆÆ@Ý@N¦“«!üòôÌa K_|%2’ÔƒqÏå·‰ÿh_9©®5`ª7 >îØJ%§Óƒ'.Sß/8y?M%í»’Þ¾˜ÕkŠÃI£¯‚¼ü"n‘N"ÕôH3°gq>Å_o¡tx©í?¤¨¼¥qvPQáÃ`Š…jú|€§€eo„Û­K¿‡Lk™õµl:úÂgCP·dá®BÑöÔ¯ ¾] ÝàsPKN¥ô¤ï¢ÍÇdº`i½£ùñ_OPæð}H»{l³ûóþøoŠ~ü7¨{L"ýê[©žóGÚâXÚ F«Õ_ÕК©3Cu|à8‚2ü2j¯<.‰|wr ôæ|µ¶4™Ü0!›Ì¾Ùäޟ˘3±¸!ù J1ÒwT.ƒûöcðØ îöµŸ’ç…­ùùx1Ò÷Æñ è;€œ;GFe ùêëbÐwaÀ)Xl)\}ç#°˜¥ᤨø k‡x ž¤N8©õlÜRJjß+/ñ2|Eoâön9¡ØÀÉ|E·ïNV§ÈÚ°¾Y¤Ÿ©å3Aþ(¦†’§Ñõ’:þ  ÑŒtîŠÊ}€Ôk²HÆ@ôÉ_g¥ùHÍì}t RVÏckíŠ6mÁ×ã úµÿ¬kßQ㇑Âñ õIe1¥µIt¿8>ò€‰Ý“ñ,¡”RŠBçî=ŽþQˆÏLÇæ)¡ÄÄ¥’uijø¹&ãÀ–uëÑ]<Œ‰ºð±^Eâþì¬ÿÞF¥’3"޵ïE¦/VS{IЗ„á`ñÑ4ÌdŠÅWå”Ñ(!„§—ÖŒá‚érõ@ßÌ¥´ ¨]GåÁd¬½»EFwŒÄ^òÓÁh•p©\mt4êš"\/`¤]ß!Ä`DÛÄwƒQÝ¥ûàþ(j èÆSq˜ ª ©íBµLý$êØt¾ck¦N¬æw¦imÔ¬k›µ… žæyÝÝÜœu3O\®Ã¾/w_›Å 'à|“iÏù?jc& W{?›Åœ·òÂ3¯¾œÃÌ.Æg &÷®î¬_°‚¼Œ[è§D¡ <ÏËúñÜ00—?û¾|>y{[½Àwsxêo0aD?rÍÆW±‹5ÿœÍ¬o½@>³þò2Uco`Àp5nʶ,åùyﱫ®ëÝkXóÝxºg¡d+"ëBºtNöRxÂ}œ ׿a¼f<¹çqÿ°‚Ù¯-Å|òÎR2¹²åCf=·Ÿ Þ€;ưñ¿Ï³â³B2³S¸zLU{ÿÌÒ—ž&æÎ1 úÝDúé|o[ÊS ß3«á;€>¥+æ3ߔ臧¡Å‡.èbç’y,Û°”ÙæsãdžŽÕBm%…›æ2ÿËð¥©íâlrL°vg¥ŸÏf¾á&†MœÆè(ð»JÙòþl–•4€¸,F_ZÊâ— Ž^è–®YJј±LLßÎÅÌ=©0:—FŽbÂäpé~éVæ½³Šf ³•¯fá¿“=fO«)ݹšüý=ÎLÿma‹k,£ŸœÌº¹Ïðaý!OEå×‘Ü Ø àaǦ†\óO'}À“ï,gyæML˜Ú_­‹=Ÿ/fñwc}ëD¾¶ø„ùØòÑBºÞ~ÿoZ6ÎòY¿_ÿp¡_Ábf’CΦp¥Z‡.XÉΕ (ª(`ëf¸þ®§Iúb&3¿¨—ôú¶°àŸ6F ¿›iW‚O ž’õÌ{?°vÁ<âo¸Žû§^A¸‹X>g;ÀyYä ÷SúuÎfâ°w)s?MÎO‘­óã,ÙÈü·–ןґ:"Û׳YPy¬mËVöfÔ}¹ ÁÃ'ïÕýŽ3zA<%‹Úæ=B!ŽÓ î|— Bn|Ž"Ê×O¥x{Qäy¥Ÿ½„rùX2Ɔ¦ÀáÕìÛ.Åä,ØNbÿçÉ´½Ã–åÿæ@ÚÒÇ^‚ßwç7s)Úý( ž†ûÃù î½öû%”'Ž£ëØ[Q!X[ÂáÏÛf4 @•zøÁ‹yýï;›ßú ŒÖrY×àš¨úåÏOWå¾ü ®nvããðo+À·¬É%ùdþði[4ë×kÐ,¾'“ÂwryøƒŸïÁâìtÍdrmË™úÆÆ6=ÑõÀsŠ˜þÂòFoü?É<‰“{°ñ™™­ºÿ—Bq6»ûé¼ðâ·gvj߆šóœ¾ KüÕîežÓGÑiº‡€+Ðüå—wåô¿ÑMÏgjI,!DÛ)^¹Œ‚NCÒ¡ùm›cËžÌs“†„§>jâɺ8çÞ‚³+‰BG×ì+ˆýv™$QB!ÄOpF)w0ÄÇU6}\å?m7ãØíu5»MàÛíx×o#ö¯¡»ª?ªxsƒÛµ$–¢ y¶°à"2Çä|еJW.àgr§LcÚŸî&³êæ~RÔ&Íüµ0ôÅõçæ3ïÊj!„¢Y¿ˆª}gÊG®zš¿#Níßþ…ãN”}ð»£Ám>r|ͳÎʧÈYùs7BœM<;0½-f!×±ê¬jƒP¿Vž-o3]n%„BüdgU"µÔUÂðØÄ%So¶áùf[ƒÏmôT²T)!„B!ÎZ?KùóŸÓƒ‡òÙè©l~ÃFlôTòà¡ü6l‘B!„â׿¬‘pýL8°ëb›HšK¬¦é®€Ý^¹Jd$J!„Bqö%Ru–JR$„B!„ø‰Îº©}B!„Bqª$‘B!„BˆV’DJ!„B!ZI)!„B!„h%I¤„B!„¢•$‘B!„BˆV’DJ!„B!ZI)!„B!„h%I¤„B!„¢•´uÿhß¾ýÏÙ!„B!„øÕ8šH•——ÿœíB!„Bˆ_@¦ö !„B!D«I"%„B!„­$‰”B!„B´’$RB!„BÑJ’H !„B!D+I"%„B!„­$‰”B!„B´’$RB!„BÑJ’H !„B!D+iîü\ECT”FZ­jrÛ`0D ¤¶Ö×8C-B!„BüRu‰”J11Qôïߟ¡C³9÷ÜóQ.—‹}û~dÇŽm|ÿý<@MM Z­Ž˜˜¬ÄÅűfͪªj …~î#B!„Bü\κD*&& NÃĉÓ¾};wn§¼ÜÍ€—³jÕ ºuëÎСÙX,¢¢ôƒAÜî**++HJ:—¼¼ÿ…ËUûsŠB!„âgrV%RŠ¢A§ÓàpØùË_¦‘уvíÌôëw)ë×ÿ—„+yyÿ¥¤d?.— ­VKl¬‰¢¢½¼ñÆ;ètE#Óü„B!„8KU‰TTÔ±Ã5›-Ì™ó6……{ñxª‰Ž6b·W²wo]Ô‹aî%&&–@ À‘#fÍz…P½ù|QQÚÖ'R™¹¼õÄ`¼Ëgü?wµÕa5È8ìϼu‡…Å÷Nä݃§sO®û¿9ŒIÛʬ›ÿÌ /(éÙÜܹ˜EmÅM c^ëLkxêÖ—É?ÕÝÁ>§O¿;_â¦t X÷ˆOU%…›–ñÁ¿·PѦ{‹gÈÃSH^÷(³¿öô\Ëm”|¹ƒ  ë­OsSí?˜º¨èÔöxåCL¹&éèñùjTîÛÉúËXUà<¥Ø-¥ëŸËs} ˜úârZ·Çdr¦æýþ£¼}x“ŸHfõóÉ;é×]Sýjcà]¹d'ëØúþTÞÎ?ñù†Û™|Ûs\çz…éÿ.nU‹Ñõ#÷¹þ<9ƒå•ñ {t ©ßNeæÊ3Ó×B!`½•ž7^CTäoa0àÆg/ rûl/Àß‚ês†\My™·™-S9o촫ư×þ[ºßÞƒ³ž¢<ØÌËNÑM¤¬Z—è5ü§ªá®»6FËöÚ …¾ÓsÔͱ"…‡É“¢sçΘÍÒÒ.$&&³9ŽU«¾ ¸x?UU.4 &“‰ÊÊJ Ô`¬_¢.;;ŸïOkÕ#ƒw;×Y>âÓ¶â>Ó»¿kf2ýƒ¢£?û1jü8ÆVMgÆm›J5Ê܃!ƒl,Ž$RmªdÓ_XN: q6RûfsÝ„‡H~s¿ý%_à±ô¥éhÝ€å'†ˆéJ.N–?9ƒå•MoêÛ0—©ßù[™ì5_ð5ž¼ !„8S¶óÃ?ž¢ÜjƒãùCHúÍ2¬/±mÕæf“)S÷ß‘ph] ©ŠN„Z ¦šÞg4‘ê¦hgÒ‘¬Sóšýø¹×¢p…AÃkßiK¤êWç3›-¼ÿþ¿©¬¬ ºº½^ÇSƒZ­æ†n¢cÇÄãF¤žyæÉã L4WécrîÏeD+8vñé—'¦º_?†1C2H4q;JصüMæ|°;€ÆB¿[s¹9« ÖXpïÏgéœÙ,Ýí†øLÆÜ5†]¬Xt>ìû·²tî,–ît6.L1¾½ìú=ðd•°ôŸ{ɼu0eónæ©•úÝvw8¶É‡}çW¼õÊò*Âíʼ5—13°Á}h+ç½Ì»ß…ÛoËÄ[ú‘böRòõR¾×ÔOdôÉ Ã¬Å™¼yçká§`»<—n@¢ÁMáòY<5/?œhYºsË„1 ÊHÄ¢q³ë¿ï1ëo+(´ )dÀð^)XŒ>ì%»Xû¯9¼»¾4ü¼©;9Æ08#‹â¦lÛJæüí]¶Úi¦O|/›ÚOÆÿãi²+xóëNÜp-|xïÃ|dÌfâ=9d&q­`ñ®NŒÞ…¼—sx~ ¤Ü>‹FØÈ%‡§¾4I ¸c<7_ڛ܅äý{6s>+Ärýÿoïîã¢,óÅx˜ÁatâA™-¦9¨Pg°Ä„|@Z U÷ˆ©©‰nêž“vRÇ܃É—›zÒv¥VÝõ9t“NÒI-ò!ÅÚd TR\sX†FÇ‘™aüý1  <&Yýú¾_¯^ÁÜs]÷u_÷sç{]×½’¬I¡­MåÕñ¼’3}ùÛ¤ÏÍÁüóÅdÏŒ¢hË«õÓIêããë"²__ÁÞ¯@Y¿ýôû›©ì;Š!j¬_‘óÆö~­gÞ†yÄÚ÷³xz%A©¬|s"¡¥›™²(÷žĶŠ ÏŒbFp0PŠ@bF'12oÀv±ˆÜ{(»  "üÉɤÒ¡ò¬Fòwm"ïœP <É#ÂиlTŸ.ÄÔÜ1<ûR2º®0í7z3 àP„’8sq ¨­ ÿÏëØsÚ(Ð ž@êОtó¬ç9úÎ.^°µqdlÕFŠ÷®ÇT÷2 ~™Bøg;(4)Œ­Gë¸lTËaÇ6€€hFKA¯Ó pTQúÑN¶3‚¦/£ŸET€7x*pšŠÈ}{7§šD4ÄŒ›Íà~Z|±PúÑ6v5â¸?…EóƒÙûÒzŽ %eÁ´¿ÄÆÏBõRCFªI‡µ¯_}bxö¥D‚ñF;kü–%Zâ&Œgh/ ÏúsYßfÅcÓXRŸ‘jz~Z;ÿÄŒ›Lr¿°Y8ìl“¢N'8\íù®S!Ľâ²UråËí”Ö(xdìTî/žÃ…* ë#<8d ¸áÀVþåùEÌÂÂÔxô|•hÿ·)>ü)ÊÐIô~|0*àªÁr|gO€ptã2R÷D÷a³x ç}xº”à0`úd-ÿÑ9w6÷4­rðš“C¶:†©¼˜å¯¼ùzCuÈVÇÁk÷æÃ¯¦ÆÌĉ©,\8—7ÞXÅ7ß|ƒ———/Wò‡?¬åùçŤIc™2e<³g¿À?þQAãŒT{D=;‰t˜ó·µ© Çõ¨m׎žÇÂIñø–ï%ku{¿ò#vÒBæÔ {úæî_d³æw»)ˆ'mQ:±] þ¹yŒêïàÈ[ËX¸|3'ºèyæ¹Ñ„(û ¦òÓX{&!)ˆ¢?ofÿi;¡2odÖW°ð¿³©Nfö¬dÔ€zx:óÆèQœÜÀ²åÙõ¤ÎI# À?™Ùÿ–@D—s¼ŸµÝ5zžèÝpDì[õ6%u@å~Vg¬åHMý&…ž‘ÃíÞ½Ó6"F¦3¶€–Q//$u€‚‚·³pÝ ü†§3gŒ¶}¨&aΦ×Qy0‹5¿ÛÅ™.zRç/db€?É//dâã¾”¿·†5ÛO ÊÂ9ÉøÓF6ÑÖ~ì8ê¿x’ú|É®­»)²èûÒtbCáÄ;kØp@IBb„û½õß!8.—S^^ŽñJý^~>9?ïEåž,ÌXÁ®¯‚ˆŸ”FB`Ûך½þÛ÷þ#G¡ød Y{ËQ<Ë”© ¨mŹ-‹YøV!öÐX¦ÿëH´ööšÁ_ÏÀHw}þcJŽì¿gYEUpƒÿÉ›²stOÎ`üC¶½–IæÒUäZôL›ƒ  W “‡+8´&ƒŒŒLÖŸÔ2.-€_Æsvs&K—³ñŒŽÈàfvè8ÎÖ%8®±qi/»_ì†óýUd,z…u'U$>‹P„§2cd7Žÿá·d.ÍäCÞ$NM¸W3u·ÀTP„QFß` k ã§ äúo¹4“Ì7â=b&c#@ æL&¬b™‹’±®˜€™JJ0„ ÃÀ«{øíÒL2—d’s>ˆ˜~-\$ÁÑèÎm#3c!Kß6ÐsL*q~íooíí×Úãl]“‡ {^ËdG‘íˆÉ¤ö(f}fÿý…^ƒ™œÞêîZ;ÿªcYÍ»Ë3È\žEA`$·jsਇS2RBñƒôõ!ª¾ Bó „öç/áoÝΉ-sø|ÇZ®=0‹Þýƒ°þõu*ªàjá+þ¼#äÉ¡8 æQ´)Ïè:dZU+ûêù4¡VP¾mŸoIçDA%š>tZ&éžÏ‘ú½Ù(¦ò”xÀÍ ê÷æ¶ÒvÇÏÏ?ýi;*Õ­Þ÷ð€ˆˆHFN%(H‹‡‡8,ø÷/y>ða¨+"wý^ ìP¤Ñÿ¼¾~«Ž¤Ä”u%休Ñë@©?1Óˆ’€öýc$Ä…B]»êËŸ®¬ ÿý`R*é¥P‚ÒÐ>¡œû[ ›ç>Ãê†îëA¨”Ÿ-oÔ%§ß[Ææv ”´8Ø ÈÝQD9°ëØHô)ñ$øï%·0‹ô/À~Ōպ³iD=Ü‹Ð@8­×á¦O6óö‘r8b"bÐJ’ƒì˜ÎV¸o¼¯×pæD9憰DYɾÕÈ5»ûaÍ¡=•PÇ‘J8±-9JöŒgâ$tïn½ýHЫáïo³fûÌ@‘"‚/Æ2|HoWEÐ_ gö‘µ»+E+ªª”([ëÃÆÚÚÏÙúBÊ ö½¾Ü* 0•YÁÀß÷’õnf  ,óâ7«5îYÁÜ=ÎP—®€š °¢WE EkÓɵ¸ëÖ¶óš³~–Æ%Ä&Ï#VŠh˜Mf>¶‹ÜF`ù#ãIí…¾K{ó 0OFÿx”‰ýç°±ÿŽ,jç œÎkûÍÎð IDATÕÿ¢P ¸j¤èÈz¶±Z¢£´”ÌÃX `£ì@!–Wôôõ:Îñs9,_¢Àfp`,5`¢E ˜"©.e‡Á}#mùüÅÿ¢' írœ.äàEwYÃé (þ9UÉ6ò/××[tã£g¶ƒ²öN׳TQíòEå ܯ§¯µˆU'ëSIÕ–Ž!5*.èˆîi¢èOóÈúï|°Æ|ï¨â¢-Ÿ6P¶w=e-íïj1G>sZ´Î§´æeÂÂà`E;ÛÛØ]ô«é£U,<àÀVPEq™‰QáZ-¶¼õóo‹Çyf§lõÛÇ]_Ö 8J!~¨.a¿^>~ êG÷û+¸ôaý0?‡‹¥gˆ‰xïâ£M‹9?å즓Pë¾7q?çêGð¹hipȵKÔª¥Gä#8ÿ~ [ù&N—·ðÞoá{Yl¢i0Å=¢Ü<šQv»ƒ¿ü%Ÿ?ýiµµM—7÷ð𠣩®ນ†aöJs£o÷uøÖJ*¯×¿d©ÄlýBKP `5SS_Þ|¶€#õ#XÊׯ ôÅ)$ŒL#j$pÝDÑûo²zG Ê>½ðÇÈÞ3ûÔŒÉØð»– ?@Ëììlfx)%A?¥#–´çF¢H‹ZÔã®ðÿnîI5æ†TS%•5@Pq݈±>Õj6›(è@ÿélΞ€R ؃Ðáßzörïör% Y܆íþAÐ#È]·¹¡ŒãgGh˜Æ¾¿•>l>´µŸ†í&*&Úv­ß÷­2¦*s«eþ¿ÕdéæðÌ T¦H¬ w±zu.×ZíÜ[j*+ë²bµžJ”·ß)«ÿ·PƒFá#±$©¡„E­ Í}€5„˜‘‰ |HãÞä­AãU_—Úl×ý›z[âA›­Ñ9—{¿ EØd–dܺCW(¼)óSí¼k×ài¡Ø š}Áz­ÉÜ ‹Õ†ÆO÷i膥I»WÝGTõÉ:²\) >™ÄɾXÎ’»k7§š›‹tÅ•[G†Å:uk_ݵÒô»èWEP4)OÅâçþÈQ¨µp¹Õ½µzþj×*õœÕÖ¨]œ.-d"„⇥J_p\»¾~(&xl÷7löTàª5àsG9?ºõ›Äa!x{:_|¼ ²µñu—þÌ—ûì<ÐãùÍç\ÌßÈEcM+…Úï±jßåÙ¶*•Š_üb4/¿¼œN'^^^ܸqƒyófw8#uÕ øù¤ì þY{˜FÌU@?A]€ë€Z%PaˆÉ úã×P>2„>jŒŸæRt±€ ‹ ØÐEKh=ɦðt ys©ì ÖBÊo[hâÖ­^}Ýš"¶ÌßìžSÏzÉŸ‘™Ó‰ïm$÷?§°ù ŒÊÜBZý/ó•«øùûî€(¨CÏZTUI à_ú6óÞ,lÜ* ¢k}x©’JÀ¿{þõ­QiñLU•Påï®Ûß5`EIh|Q•ý_ÆÊ–û0·ñÊmí§ËÁÍеæjý¾o•Ѷ1sßndÿsÙ¿V¶wŸz†´¸4&Æí#«Î]³Zí>îj3vmŽ_``‚ÜH @£é„6ZlØŠ6’ñçó?mÒÖ£»\ÊÎË`±X@­As³ Q«Ü¯_±p…0ºÝÔHªî:|­Fªl6 GrØxPi‰—ÎÔ1F^ÙpüÎpN¥áVؤÂWåÖpqÛ_ª;?±šøöýHⳓ ?—Åš î@Y›¼€½Z+Óúùïkuà«j´s¿ÆÇ åGs°Üó…v„B´‡çC ¼ÏÀÅr+8j¨ÅÀŘîÈ*ùÑäc¦÷4úÄørþW¨¬±Ñç…©mîÏ~þ= çßO5êè9D&MâÚ†µ|ÓÇÒ utXã9QÍÍ™ú¾˜ÍÕ¼úêb¦LÏøñ¿dÊ”ñ<óÌžyf F:ò~a/=£žO&öñQ¤?Ñh«‘}y§±{éI5ŠØñLLE(vJò`¦œÃùFðÒ3vF2úɤ¿˜NÚ8=þÖP&®Ì&û9$Dø¡´š0YPw‡CGD¨òæBÍ+çð1#t‰ ~h(þÚP’fÎcÞ èPâ£Pà¯íETÊ žxÈøñ`Š¢"N×vHãc‰Ÿú O4™saw/–ÔŸ„ø(têæößHU!‡ÏØ¡÷$Eøãßó ÒæÎcÎÈœn½ÍûÙ_d…Þɤ?þñQÌ~ZuåìÏ;í®»Ô}’H‹>q:sÒÓHŒ£®µ>eâ+doÏfÙmÛûiNe%q—OìÏÓ; igèRæ±råJÒêG*FÍÌ"{ûJÒï…V*ÍìØ±_³ÁˆˆžFü€XR§&T4ó}Mkü†´!±ÄOH#!(-¢ >ëd:¸ŸÓu:’~©Gm)äðg÷2Kl"ïóQ M%Qëþ½¸ÄDäàD÷B €&z43ÆF£ÁpØ.ÜA”ŽaC#ñöôÆWŽ2ÆîQÄõrg’ÆÙRÆåÀé£BÓŽyN†¿ãˆJlw÷ïŠî±L˜žBx{NJKß3H¦¢ðÝÜ9̓ŜRG3¬_}ãb‰‹´Qú…,Åœº #fx8*@Ñ}ÓæN%®»Š˜I ˜èΓ٪1VÛP´´_¿Hâê^Ñk Q~ÊÎ5ÕX\ZtõsœT1D¶u¨_›è†Jí ê‚ ÐÆòäÃðQÑrñÖÏù¹2¼ÿ)†è®*úÕ7þª{u»³¸B!îo?T½Ç‘4Œº¿nÄt¨=JõÅ‚búÕgwÔt{ô%Â"ƒ®:ðVºïŸ¼}}ñ¼nàJPsßÀDº¢Æ»ÅAð‰šOTÂ`”ž€ËŠ­ê®v¬×îC꼪ڧquk8ß­9S·¯æw/ݸ-åTWW×êö¶”l]CNà $ šBzŸìÞs„ˆç@áM»W°Ìk:i‰c™=@µªœ#›6³þC÷`°òËX¡xgâžá•! Ì_ðöÚ,ö[¬¨ÿ˜Mд$ÒģƊùëÓä®ÞÀÞëýY ¦¢Ó­.P¾c«»Lgì°tóWEìݺ‹»ãö\úÏL">}¡Å»Ézí3æO$þ¹4Ž?÷*Yë{1gü@RÓu”’;Q¤>¬D©ì'Øÿa9úäP’ÒR¹zns½d"wå üg¦?u!É ÆÒýd¿[€µÍ>´²uÊ©3ùót橘/ðö«Èùª¾î×—ÑufßžM¬ÂñD.¯¾•ƒ ØÝRZ@é©@ÙE‰Z©hÇ~šíav½ñ6ºMÿ éŸÙǾ#FBoå‘ÝC ÕbîV½¼³÷'2|ÆBFukMEï¬ ë/v ›¬¼^LO ýù^îÌáHŸt”´|Ý\«ò P?5ôÕXÿ¾Ÿõkso=Ä|˜ý_L!]¯Æœ·Ÿ¢{ü¼iGÙrOþ†ñcã(\›ñ£õì=žióãðö¬Žîú P|`/§ŒgÉoجçÉç]ŽMeÔË)|½<ï阜¶„e®k˜JQt!šæÖEÀPLñ•©L^º€£—·<×p”å°~o*©¿^ÄO W5¥v`¨m¡@p ‹V¥¸Ë:,T_(åÐ[Û8x®þ+7ÛqvnÔ2~ôË,¸®p~ïzrÊ@y[6¢?ž™¾îUû>ØÄž 68”Oß§_`ѸÀv¹˜;ïÌFyJ0>2“cPyZ8»kù€ãìùPÏä_- ¤ÆÂµŠbJ.´1B÷ò¡ö÷kí)aFÊp`3’óç<¦'óâ8ÿÓÂ|­ÖÎ?Ÿ¾Ë»½¦’º`©µUœ=PÄ©ÇæH;n!ù YóI[+* !„ønõ£÷Ì·é pÊ£ÆÀå Œ' õÛk0}ø:Ê!Sé?Õ0Õ]:ÄW'Ý–²“^^»â¼÷øGŸDN}§ã,݈áÌ|z',Áº{[³{¯ýò¹<¾S'áéWm—>êœl€G=nÌý÷¼ù‡ÒNª²eÃ|½™å§hvNTãåÏ¿«•û|oþ¼}û.z÷k²}Рn1XòððàÜÆ¯~5éækÕÕò§h…—ÿ 5Ö‹fì@ÔóXœ¹ÿ9Ígîq[†¿BÎ,=åÛÓ™ûn³‹V Ÿµ…W†Û¿Ÿ6 !„Bü¼ðëHVþÏg÷6#õéõ:Ôø¿fÈû{³ƒÃÃwô )—ëF«Ïj;ãtk»ËõC™Ù%~˜ü•¹´>f þ¸†}U}HèUû)2|ßm»“ŸxôÇ’:DýD6¹D !„B´êžRV×fƒ¨­më uu.<=;ðЗÛ4޳êêdI(Ñ3¹o¬&èù±<1i1±˜1•ï'kÓJ¾¿Ñ«-Ò M#}„³a?kÖîÅÜv!„BˆŸ´Ī}÷Jm­…âÛR3Rµµ÷æÁÁâGìâ6daÃ÷Ý€¯’z åÍ%릓ºîÞ5G!„âÇî'HÙíu8u(î%ÍÏŸ7`2} ÜÀß?€]»Þ§¨è3JJ¾àܹ¿sùò%œNju7ÂÃûÜÌH9uØí÷x&¾B!„âã'H\½ZK×®>üÛ¿ý³¹é,}|º ×Çó(C‡&àç燧§'µµµ\ºt‰]»²q8ê¸zµ¥eº„B!„??¹@êÆ ¸r¥–ÚÚ‹øøxãååysŠÚÚë;v”cÇŽ6)ãrÝ ®ÎEm­S2QB!„BˆŸ^ ÕÀn—áyB!„BˆoÇóûn€B!„BüØH %„B!„$”B!„BtRB!„BÑAH !„B!DI %„B!„$”B!„BtRB!„BÑAH !„B!Dy7üн{÷ï³B!„Bñ£q3º|ùò÷Ù!„B!„øèÈÐ>!„B!„è0 ¤„B!„¢ƒ$B!„Bˆ’@J!„B!:H)!„B!„è ¤„B!„¢ƒ$B!„Bˆ’@J!„B!:H)!„B!„è ïï»?N§“ºº:\..— <==ñôôÄËË //¯ï»‰B!„BˆŸt åt:q87ƒ'àæÿ‚*‡Ã—— …B*!„B!ðÚg·Û©­­åÆ7ƒ§æxxxàr¹¸~ý:N§ó¶P!„BñCõ“ÌHÕÖÖât:[  nçááAmm-ÞÞ?ÉnB!„BÔóR«Õ‹ôŸ¿ü}·åžp88Žƒ¨Ö2TÔÕÕáååÕ¾ ¬KiK—±à×iŒWQTû þ¸r9?á£RëÝF§QF&3yгg*qÜe]¡C&’ð³JJ+:ûØúòìò…L{*‰¤¤¦ÿýÓõcž¯m¹h÷D¼š€óã"Œ·~6=žÎª§ý8vì­”îT!ɳ™?}4ƒ4_q¸Ôƒè!¡8Ï_ÂÖ uêS™9ýYRS~NÜ#?ÃY^ÊWW]P󷤊%ý·3xèì!JÍ /jýJ&Ï…\$¯Øtó­šá³Y>>ÏóËhÿ•BjÆBTæQ|Ç?]Z†=?Ÿô±Oò³êÃ0b93z•røKËÝU›TýR™ûÒ4R†¿{&‘q¯±æèÄ¡µ|EµýÛסèÇc÷]ÄXó=^SB!~\‚&ñÈ´ÿ¤ç€Tt¦ò€>‰ Þ‘(©Äz©šö|¢xþìI}/pÍZׯ;ÃyhêëšßÃ|ã—DÍHÅõÙ®Ý茹ӣzð—cÿ¸·© oíâÅW›"÷‹®Þœ¬uQîøî>¬[ ¢¼¼¼ðöö¾9ÊápÜ\€âvv».]º´½³þ $õñÇñÙfV¼SH…ÅÕ«SsÎÜvÙ{BMÂÓSåÿ>ûÞ/éÀMl3¼ôŒ~.•þù%äšÚ~‡9(Ú0Ÿ­';Xìò!Ödxã¼íïÏñéF2¾pòÝßZ7Ðò°>„òÝóYÌ~ÃH®%ç“STÝmÕÁ)Ì«ãø†¥¬9!IÓ˜0<šãÛwJö­ØNQza<#upÎè~- š0• gX_B(Æ€‚¾}B¨úr7vÕtíKt„…¼¥«È«†è~UqÛtÑ1hNnbáöS È¿Ç×X³-"&9Ç…|Ê®~ûZÂ¥ ÿê8†»ýºE!ÄOËIþ¾îU.;ÁS„ºg"ºÇÑ?èuNüœ¶&Íh¢ž¦Ç×G¹\ÙÖ·ewΆZ k'5½îi ÕOéÅ4‚…'kÍM;ä_ý• Uy±¶ÆñRÇ77nÜÀÇÇçŽáz ……BÁõë×ï¦,OÏÖ§˜eÿgÈbyÃqšÁk*É1óPê+þy6}"Ñ÷àc"oÓzò+:ûœX(>edTÿH4±ª~áhËò)|HÏÃÁ`¨¼"‰ìeãì~ "dÈXRãzºû¯ÖDÑû;ÙSjqgçë(þHÃÀphùî&{S„¤ðâôHJ·!p\"Áx£µˆÀ~K“Þ ˆ&u\ ‘=ÜïWÎbÇ»ùX¤³L_ÌÂßåcBÆ,aö€³¬_¸•S€bÀ ^j se1, üÓ Öh"…$ÏfòÃ*T®ñ,ú·|¶…3»þ³H̸É$÷ [5gž¢Û„ K—“ç“¢ùÁì}i=ÇÐ’²`Ú_b£áöã^ÃAk 1£Ç“€7`»XDîŽ=ÍJ⦧38@…óùE~°Š­_ø¶\VÓ—ÑÏŽ"*À<8MEä¾½K¬û¸¼#_f‘ö]2w™ÜÇÙ \ ¨5R¸kÛÍëO!„hŽËVÉ•/·SZ£à‘±S¹¿xª€®ðàI*à†[ù;”ÿåS1K SãÑóU¢ýߦøð§(C'ÑûñÁ¨€«Ëñuœ=iÂÑ_„÷Á4šæ+‚è>lô¼O—LŸ¬åâ?:gôÔ=]lâà5'‡lu Sy1Ë_yóõ† ê­Žƒ×¾»šË.y{{ß ¢nܸÝnopuéÒåŽ –‡‡G»žX¼½;`ÎÏbñÊ÷)¿m{Ô³óH Ã|l k6œÀÑž18vu€_*‚Ç2ç¹x‚ʳY–±˜5›é5"gâîlÉ]ë•Âäá ­É ##“õ'5¤ŒKt÷e;8\@¯(‚¿ØÆšÕ«ÈÜ^Šö©Db@@“Çôİ9“ŒW—³óRCh~d‹í¨âàºõÖ@IN&ËßÝÃÖ%8®±qi/köìT¢jrXµ4“Ì•Û0„Mfr\ à^]R¥£lÝÂ;‚(Рө09µ<;gK–,aÁó©Ätotl!ahŽ®gÍÊL6žìFâ´¼?ÎbÍÊL¶Ó1jhßoÑém«:YJÕƒ}‰V(x8"ÃÙƒ”žó%,Ò}lôéK¸«”â2PDŽffb޾™IæÒLV}piã‰í 88‘Dúì&sÁÖ4ÚQ÷8fLÓS±=‹=§?e뚀z>M胔o›Ãç[Ò9QP‰¦Ï#–Iºç«&üÞl” SyJ<àfõ{ó] âo‡æ–0oø½ae¾N§•Ê}f¼½½›Ífµåt…ûnÏ^uŽ’3&Ð5ÞÊÀ‡ý¡®„Üu{)¸%=±ÏGul'Ê ö½¾Á±"”´8Ø ÈÝQD9°ëØHô)ñ$ø‰uL¡õ‡_ž·ýg+ÜÃù®×pæD9æÀTžˆT‰}lùËiìT²d<‡$¡{'¥B J?Bû„rîo%lžû «NÙWfì5FJΚ LPßA™V0eûÝDÿ ôÓ_Gßä5Eëæ³µ4‡åKØlî׌¥,C´h¡ýÃÅjJ(,«¿9>_Aµg8÷½ÃÐ]*b[ý¦ª#G)}ª/Íì<÷-ÛÑ5šè^&Žn-sÅ«5rð˜ÄG£Q}r°¾îãT7WX…F!}´lZ·œ­W4ôMMgê¯R0¾¶Ç½ß곯p·ßt±.(ªoéÕ("PÐBpx7*NQZ“Hd?ùŸ…f¢ì]eµeL‰êã|´‘‘xŸÉ¥ $J·Ým lïzÊÜ×´šš*,êhbcûâü¢ cñn²Š;ÖB!~Ê.a¿^>~ êG÷û+¸ôaý0?‡‹¥gˆ‰xïâ£M‹9?å즓P뾟t?çêGð¹ZœËpíµªGéùοŸÂV¾‰Ó·g6îÂ÷²ü\Ó`Š{D7²ÛœÛ3L7nܸ¹°„——×T]ÝÝŽO󧫸^Ie}üf­¬ìø<%»‰Ê›Ãö´ùÊXfgg3ÀK ( ú™mJòÍ@¤ tûo¿ýñè?ÍÙSP*{:ìì_¿‚Ч02¨‘ÀuEï¿ÉêÍ̯:›Íš-A¤ÿ2ž‰ÏÇ»¯üëW­æÈÅŽ$´:GÊ'„˜‘‰ |¨þ†Ï[ƒÆËбêkMþ€Â 4j_¸nk4Ï¥Šªn®ŽoÛŽû4tCKâì% mxÍSÃVA}Þ›µ¥™66,V08Ä© §öäS±4†¾šú®öÚÍ1ÈN»kŽ“;Í„ŒT"Ûny#¥ä,ÙAÓûi¥glLއêH®œå`58leTŒ‹¤¯¢ m eŸœÂhÔ*®]n|œW°XA×­á«& ¶+ëW5zx^ãhu;f"uÓÐí¶:Ö+8ºjÐ`âÔi~á )>ëMꈾ(>S¢>KÞ¹uHµ‚k]a—«¨¦Ðô¸5h4>rK’^S ¨5¡¹bžZFjý‰«:´†Uû›´¢Õ²UŸ¬#˕°á“Iœì‹ål!¹»vsêö¾bonvŸÌŒ§¦ÂåRòwï ¯L†ö !„h(}Áqíøú¡ ˜à±YÜß°ÙS«Ö€ÏåüèÖo„…àíé|ññ‚ÊÖÆ×]ú3_î³ó@ÿqD<Œç7Ÿs1#5­j¿Ä:ÞßÑ‚¦#ˤ·Ÿ•«VÀÏŸ %`õÏ‚P»Àî𥫨u¦Ûp9ýn¢²Ð±eþfJïí’sê‘Ö›TUI¥Á ]IDAT à_ú6óÞ,lÒÖJ€Ê6,*`C-¡ýõ$O˜BÂÓi$äÍ%÷ŽÊìœÞ½‚Ù»•¨Š@?piâ™ñôa޼QÔžj·‘ÓH} å¿[©è•ʲYš6˵‡Ív º¨ÐÐðeG ~ÜŽj W¨àЪ5ä7³ @ëï,TU9PiºÁmËV|‹$j½bv,éœé“¥xŽ$¦:EYF[)§*S¸/Z­ã%îž­²ÚШ÷W74j°\iù½âÃUlsŽçåg'PöÚVNµv/ÿ…+„Ñí> >8P¨»¡°¨ªJÏN´_ƳÛà¼7†à‡‰Œì‚öl·ªìˆk6 U£±Ý høÙÅm“mU¨îüô¨gÁbÒ2ØØÌŸ‘b×rÊpÏ\lWY°a8’ÃÆ#€JKì¸t¦Ž1òʆ²;ÞYUšÇŽÒ<ðR¡2ô´ÑíàÎw !„My>0”Àû \,·‚£†Z \Ü™éŽÏp¿¦c"zO£OŒ/çßy…Ê;ð}^˜ÚæþìçßÃpþ=ðT£ŽžCdÒ$®mXË7q,PG‡5žÕÜœ©ïŠËåÂét6ùïÆ wwûbžžž7‡ý57ª­…&Úvš¢fðÒ3êùdbEúȈ&ï0V-qO'£˜LzR/ZÏÛ•sø˜ºD?4m(I3ç1ï…„¦£ o²»o¶ƒú“…îz!‡ÏØ¡÷$Eøãßó ÒæÎcÎÈ„2qe6ÙoÌ!!Â¥Õ„É›«î:®»:ÿ>ñÄ¥Gü6doañ=º.vj*ÍXûõÎ_õK£Va»dp/>:† ÄÛÓ_ÅÝ×í8gÀÔ#š˜`weƒÖ©ïP;\œ>*4^€­˜âsÁÄ=R?ÏDExò4žÔ¾Y^ÅG Q HaX°Â]6)Žà §hk¤Û=Qzвná$FPúeÃmv¥g¯6| Á§(­ Ÿcë7˜ØúCO´O1ÇO·T¹ƒêÊ*ªŽn#çB$“'ÅÜ>­©«ÅŸ×óD …–¡C0,v‡ gNQ®Ȱp gKPW†árO† Òa,m£h#£ ïÞ±‹Ëp΀&"†p у¢nÍ)ª©ÆâÒ¢«Osª"bˆlñ@L—˜ˆœˆ¶>ØÒDfÆØh4€ÃfÁbqÿg«ê€ w ×ZY1“0->ÐÝ7¶jŒÕ6÷Ï8pº@¥ò 0~/OŠq_»u6L«qüdí.„¢Ý¼ýPõGDÒ0êþºÓU ö(ÕCŠéWŸÝQÓíÑ—‹ ¸êÀ[éž_ïíë‹çuWj쀚û&Ò5Þ­|$ûDÍ'*a0JOÀeÅVu W'æGîyFªquk8ß­9S·¯æ×™–4oÌËË <==Q©T7ƒ&…âÖYi.êŒ,UѦ5ä¾@ )¤÷9ÁîO ‰š3X*o¹½_ iÀæô<Á®œýè^…ZQŸÂjFùެî2±ÃÒY<Ì_±wë.Jš}û öXŽ>9”¤´T®ž[LîÊøÏL#~êB’Œ¥ûÉ~×½Äî?f4-‰´ñ¨±bþú4¹«7°×X³ÿD~Œ1›Åc”`5Qž¿™¬-%Í5䮨ËÀ)ãYò6ëyòßy—£ASõr _o¸ËÀÍtˆ{C˜0s z[¦’£UFÔÌÂ’­¶cùmC1ÅW¦2yéŽn\ÎЌ›ÀËî?IgE¹GÛ9ç\.?œLêÌWIV8±TgÛ–¼»_V½38NQzn2©áejKÏâ;d Õßl§£t7?Kê ‹á Ø*ÈߘC± h5n±p<{}çOer¼¬/Zz_·lC3nÿñoÀIuéN6~d¼ÕVÓdR5‡È±Ø(;çdÔ¹jˆJˆ=­~Õ¾ö_[–OsÈ ›Æäß,ÁQc¢ôP!†Ç¢qº€ÚãìùPÏä_- ¤ÆÂµŠbJ.@P u?ZÏÎÑã™6?oOÀjàè®ZXf½Œ’ÏaÌóËÐ}¼†5-–µQ|(Ÿ¾O¿À¢ pír1wÇœú[‰OýËtï²4;âðT^ü¯Q(\à°)ܺS²QB!šÑÞ3ߦ7À +Ž— 30ž4Ôo¯Áôáë(‡L¥ÿTwÀTwé_t/Ùd);IðàèµÛ)Î{ô™AäÔGq:¾Áò×Î̧w¬»·5»÷Ú/ÿ—ËÁÓè;už.pÕVpé£ÎÉFxôèÑãÆÜÀ›(í¤*[6Ì×›Y~ŠfçD5^þü»Z¹¯áa¼µ´üyƒÚÚÚ;‚¯7n R©:!+ê@-\1aµñóÈ™KùŽtæ¾ó]<‹IÜ=£ó"šÝóÙ*ìÅ·å7Œ—3"9:?‹y4“Bñ£ò¯#Yù?ŸÝÛ¡}Ÿ^¯c“ÅÑì¿7ÛÙdq`øÆÛ8ËÔÀÃÃÚÚÚ;&§Ó‰ÍfkvQ //¯N ¢B§¬a˺,–͈'ª,i#õ€‘¢Ï$ˆúÁPD3mÙžíW?è.2ލnÊ ßo³ÄLx*K2gÔ[T ‹×£½XF¹QB!ÄÖ=ÍHý8Njkk›š×0_ Zº×™Ù(”:’g¤3r`(Z…ó¥s¼³ GŒw_·è4¤2ù©h”€ÝDñ;Éùü1pNüh¨èûÔdF=¦C8Ìgùxç .J$%„BüØ4d¤~r¸‡ë9ÎÏsjk B!„âÿo ÔO2"ðñq/YÕÑgAI%„B!„€ïiùó”Je»²RžžžD !„B!núIGÞÞÞx{{ãt:q¹\ÔÕÕÝœ'åééyóYR Ï“B!„Bø‰R $Ó$„B!„舟ìÐ>!„B!„ø¶$B!„Bˆ’@J!„B!:H)!„B!„è ¤„B!„¢ƒ$B!„Bˆ’@J!„B!:H)!„B!„è ¤„B!„¢ƒ¼~èÞ½û÷Ù!„B!„øÑø5£®Å¤IŒ”IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/images/list_of_azure_checks.png0000644000175100001710000011461200000000000024611 0ustar00vstsdocker‰PNG  IHDRU¶ÏÜsBIT|dˆtEXtSoftwaregnome-screenshotï¿>*tEXtCreation TimeMon 13 Jul 2020 09:43:22 BST»ýËL IDATxœìÝ{\“÷Ýÿñ—1‰@`@ÊA@*B=•‚¶8[Ú®v›³­=hÏS;kOÞ¿­»oçîv‡v[©«z·Îήë:×Öžt§B©§â‰ƒå$  H &1ýý„¨¨P"Úîó|<|,¹ßësåºòÎ÷ú^ë°ààà¯B1(z½žêêjWº!„ø6‘PB7’PB7’PB7Rêõú+]ƒB|k(kkk¯t Bñw¦ƒ*—ÿBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªW“á7°"+‹¬×%Î- úqÇóYdee2?¬¯÷BwS^éÜE}Ý“¬| * ìí%¬üÔt¥K:Ûô'ÉZ6åìi†š"þõî_ø¤È§+Ùÿé'Ô™Ëhº,EtR”û Ÿ3Qt•}SFVñþ×ð—ýÄܲœß  |Þ³Dž^E[­ôSŦ! Õ?üáTTTðòË/÷9ÿ©§ž">>ž|p` ûÍ"%h8D^ @ûK7ñ:f…½Ë»5.‹Î\Ê¢$ ¶²¿°fs_—Ç—PQFqwVhô£Ð$=ÂÆ¸,Jxp¡PMXÄÆ¬EgM²U|À_rÌÞ®¹Šª3íÕž  ðóE!„è¸õùÜêºNh8~Tõo¿0Põe÷ö›šœ—õ^4€6ØôÑ 2Ù¸Àe•‘¡D ‡ƒ»÷cNœÂ¬'×’rÒ@UY1w}§Ù!¾Í†,T ˜;w.ÀyÁúÔSO‘žžÎæÍ›Ü®ßõS‰¾•—²\cEÇu©á¼›Uå|pKïMDc)cãºOœ=Ø PWõ=Ãbî'<íüÛ¡¿ðüæÒ³k«½Hã¦*ö—8+­V#MeûÙ¹£Ãi`ø…Vr©G¥:kûÎzêØöòëäµ»¬rª‰Î‹”q.ÛéžWÎ!‡s”m~·¹ö>;i: ¦Ü—y¶áf¥&MLÒ,¢“¦óÚ³¼¸ëª¼U(Äe5d¡úúë¯ãííÍìÙ³Þ`=¨Û·oçõ×_`«:f¥D6êì£êLïh¸Ž¸ë¢ÑMK!<«Š*ü˜óè"â46ŠÞ\ö—&Nv:ÃÇ!€˜zÉ-›ë›0 4•”at±‰Œ¢©{œòjv²æ•m»‰£ ':Š€ÈpBZ›8Á B??Ô¶2ÊJœË&Æj0·Ù°r‡¨k0¡ø7SVRøžŽÆÔD'jüÂÆ®(âÓ7vð Ž]Ä‹+瘻ò½}!¾i†tLõ÷¿ÿ=@O°6¬'PÏÌàëH ˜òØøÛ×)ꙡ㎰L懥0+ú/ü=øîIP¥Š&¿Y̿ӹ”©xÛ J)m‚èQS¹çñ:Â[c˜:ñL; ¥¢OøWÍ,ƒ'V±¯-‚ïÜ>]Ó'üô©¿¸÷q.›Ž9O,E½ÏDø¬4@UîN ˜ÙùÏýÜ;…Y¬Àô¯R¼¦ÜÊœh5‡Ö-áņK¶|IuÙÿ¢ì–EDß´”¥];© Ná{©á˜w½ÈòתHyx÷DØÿá§jߨ´@]mÕà7.Ä7Ðߨ:7X¿v ¡©)„¦½;\ÀÀç¹eÌ_ÍÔÔ8>måŒGpfÍ ï]jø>¶TñÁÚw }ìVâ¦Üʬ¢±þ¯&–/›…ú¢ÏFÔñîË™x=ðCRRçsÏiuŸù§¿ô{$³ß,ûø`;|ç‡sõ0S•›Åš-Î óž×yÑßÊ·LåŽ;ã0·V‘÷æÛ¬Ï5ÞC¸ –m¼ü²Þ=‹©ß¿ÇùHUöz6¾y+ðÉêÑ<0ŸYsîaŠ˜Ûê(ú8“ÿcÖB| þêJløÑGø—üÿA†ßpös«Wº!Äéõzª««¯Ü#U¦Bˆo£oÅÃÿBqµ¸b—ÿBñmræò_zªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFªBáFJ½^¥kBˆo eÔ]«¯t BñWþÎ2@.ÿ…­$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…†,TGùŒ #)ø‚óoIM¸Îk¨ÊBˆËbxüœ‡~>š2Ο‡¿Å(Ÿ|Qn¡üêñHË)2;—ÖM¿† ßñà‹Cm˜ÆÇðÎ÷}i±ðØ­cùáŒ0æ„«8^ÙF“¦fLáW‡aÁ7ŒaÞ” &xX8tÜBLz2¸^Éî#íœ8[)íø ÆóÎ÷ý°(t<–1–;g„0s4TUtÐÃÆû‚0n¢ÜÞ]ŠJÇý8ž¼½u_ëø !.ÎX¸…¶¶¶¡ë©î*jbW‘™ñ:ßÕ3}ñÍQ̌ӱ«ÈÀ®¢¦5:ZÏc)m9ÄC¯ìç™ñ›Å÷F÷ou«fs‚[ùÍùц2JB¸w²'6¨£tÄT—ðôëûYöQ+º)Ñ<£ ¨°ƒÎŸë{ÛšoÅpÊÄÁ&k=.çü“&¶žÂØêNðYC·EùÀyÍ!¤Ä{ó·€S#”}Ö„k¦º>”ÔPÔ`c_uMö$(í®ÿ³½&gýf—vòëqZÂÕì(±òß1:tùuPpý8_:¿,éÏF…#¸ó¾$¾çÒ1ÁnÇÐläãW°­ÑqÅ*¬! U8?X¿v ÔÔó·òñÜ»0™Ú(ª6±£À@éÉK¯ €Ý‚ÑuY¨†»tÞÛº¨ìycÃ`v Ñx&v=É÷®EÌÎJÇ2Yeä­c§Ý[V '{O.«ÃÊaôô?íêÚ{—n2Û@£Bì+lÆpo)þu¼ßîÏä0;{?0õwÃB ‰Â{yþ`÷9®òdꬿ%ŒÒ?USõuUàì¸\!Cªçùjë:ºØöáAöù35ÚÉÑcùÅä@Þøk1Ûì—^ý’†C ô ‘¢»óhŠš)M %%¬UŒUE%yçnÓõ]âäPõN§Îz½éëÇ{òq«?‰]­<_ÓÏm q%غØw¸•¦k4DU@èø»Î?Ø:Lümk%ûúè„^w ¿ð?ɾQÄU—ð{kÿí[ÃCŸ´~ý¤î÷ðÔC0îé$tœ7Ú‘Ã1«ä79¦³¯2aÈ©:{ õü1ÖQG7R©±•mŸUð›7‹ù¸Ó—Æ{‚Í ªá½‹©ºp[}ñö ´çÍt#Ád¶8ßš›ØQ­dZÌh®P°¯¸uèëSz óë}ꫳ ]ì8z’Ш@n§¥©Ôà2âj5“”ÉþŒj8é–èeuŒ$~d3¿ùëž~×€*9„”îÛ! U×@]·µœu[ˬº¤ ¬¾s7©P)ø$ÔÓA“étuaèò .ÂyTÁÜ1À޹ÆïMõÁO¥@Ê ÁV–ž9`§ù¬Øˆ×Ä1¤(Zø¬{œÀ/f,ߨ#t(êsxr}ŠŽpOŽïÅxPWÞÊ™ûû†¢fJC˜aa_±»~‡…pŸø´)üùÇÓøó§ñÎã×p§ÆÄk[ê¨4QZbššx¿Þ8¨Ê7P7Ö©J­#ÛšûsÝo¥°¬ÝyEgê¢Î®B;Ò]{4„—ÿ3ãFõySÊuŒµ¸¶}@O¾(絑Üöƒ$¶. ¥GÊx£Ø˜x?§‰Ç¯ŸÈ†x;¦v;ÒÆä‰(º¦™}Úp~ý#O¼N[(Ú]ÆÛÕ½³m¥Íì»1€˜REÝÓüt~\?NÁ¶Céå®Ïjä³?~¼0‚Q*;M•Uüa¯Kx𛸬z,1žÍìh@»B ‘œýÝcªî\O\MyÝ}~ž*Òó»…t/­@eíBã=œ9³“¸s4€Ï><È'–Óý¼„·ÓyÊå­·v/‡,T¿ø²•?ï¨âÓõçÍ[·µœjC'ÕMìM9ºØ±½˜Ûûž]Wø%?)<{Ú]{º_+åþcgÏËûx/ygM±±ãŸGØñÏ lß{:U'yG:z&U}v˜»>sC}¶žÿ]ÃÙÕ,殃®SÔåÉÓù¨t¾PxÄÐ=$ ÄÕÊÌ{y-Ì™3–”#¥äC— êùñ¦—ûNªáÐpæNЄž=߯Ù÷4ê¡»(²-™Oî3PÏøô@=U†<ø)h||øÞMzB«ëùøªë*Pi<™:+Š9#šøäȹ§¤WÛ—5¼ßªåÎçó†¶r#¥AܦsÆ”flOݤCØÌ§0´ŸÂÐnÃÜÇM_ÓIj :•SÇz Ù~\ù»ÿßD‘‘¬»5€Î¯~jpÛ]C·¡ã¿ ædïRÍAÉTñpŠó Ìù~8ß;t„÷[ëym»Ý6‰›” °u±cgC¿®ºÌÇjùxb¿x@‹¡£ƒƒÇO¢ò¼ì;À°;ûù`jB”¿³Œêêjù©Bw’PB7’PB7’PB7’PB7’PB7’PB7’PB7’PB7’PB7,¦*„ƒ¤×ëåÏT…ÂÝ$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$TE· Bç¿EòŒÈ+]È%)W1óáEx¹½å¢¿G\œÛ¾¸ð%¤<ó©O¼Ã”ÔXˆ]ÁÌ?‰Î~-¾”Wºquð¼v9‘[øbwÅ [Rã÷0ÑÓfàã§ÂÑe ½8‹’]{°DÀ̇ Ÿ8¯*ìí%4ï{“²ÂÁn÷ΖKá+/cˆu™~|G6[9y…Ê7d=Õ Õpn÷õ¸àü¹¾DŽŒ¿"”ÉŒ™¦§y÷&ºÛÖ˜‡™tS–}/òÅú'8¸mÊÄÄ]€ç”g‰Ÿµÿ¹«ïçPn#~sž#*dÐ{ñíÔUñx-ö+]‡è·!K±%x9b8™óYóžÔiH÷V“ÙÔIÅ©œ>j¼¯]Nlr^s-­ùë)ù¢‡f.“§ÓºaÕÆî¥¯ý3®)`ßYtE¯ õÆJóF25Ooì†-”lÎ¢Ý Ú9o?b3¥¶éŒ„ZaÄth=%» ð¸aÉ¡ÛÙýö¦îÞ0f )ó‚¨X»’z‹êSg0iY:¦rñžr3Þ#½Qtãø§/Qg°Â„瘙f¤t¿7!I±xŒKõ‡ݺ™Î±O’2×/_]I㙕iÄ=¾ÇG÷s´¼§j±7ìØÍÁ²îéžs™¼4ÓÖ=x_›Š·Æ‡i7UŸ®¥±+ƒIK`yÿ>J*Ï´ %ôî è~B~I)µÛ¶SWX‚àd'ªæ£‹ñ Òã¨ýÆfç9ÐU¶S×l¼u8qöyq†R¿€ s2ðóQamÜNÕñs΂ðDÏJÇßOƒÃ\‹éÈ›”ì-Àõ$©s½(}õ…ÞÏA=›„ÇbÝ|%•AÍy–ðh=j»æ½[œ5÷ÐàsíR¢““ðò´a5U`È]Key# 'âÁÕxͤ3lZ¶ Û3)¯4^üØ_ôœ>Gì fαqä/c¼Ô9!® CÖSÍ>yŠíVf{«Y®ÓôL?¨Û;¬dŸ<5°F—¦£yóÈýýýìÿèê”åŒÕõc]‡ 4ièƒs(xc1»×gÒî?¨IÎÕi‡Et:~•/°ÿµûØý=xÌXAT”šŽ‚\:ƒÓí2Ð哌¢2—F‹Ë6YŸ=úIZªß]ÌÞu˨hOdjšó u×¢ÝÂá?>DÞ†LÚƒ’ åÙ4w%<±÷sVDMÇß¶—†Êó¿|Ú±ãqÔÒ~fÂWVè I€Ê¬Åì^³ŒŠŽdÆß:OËvÊUƧõ6à™F`h#†¢ì'²©9¨¨Qëç<ÆLkemå8Ƥ2Z§…ϨtüÔ4W÷¨(’‰š;uy&»_½Ÿü]Ft׸\k2˜07ÇþÈ[}{ßß IÏ1á-Tî¦ùtQêÞæ¢§ág;€¡ÔIÏ2>ÂHUÖýänx‘f]:O—MG=JÂ4 ›“»ú!Žä58÷9º»ðKL¥ó_ϰwÝ}:!s—ä9Èc!—:'ÄUaHÅËóYÁê¨/.𥺠lػ̀ë‰,¿²˜JC?×WTÒ—ï¼´²æÓzŠW€¾w~û^jJœÝH‡a3 õ£ y;ƒ]ü™›: Ekh-Î9»2ØúPc*Ȣà `¤©²…VOÏ Š¢–†=Îú-Ô­Å#b^Pẅ߄ÙÝ—"jb’°—dc<¯›¤ÅË_Cgóùcš¦#›z·}0{p2þžV ÷BT*£º¯s”±IøµæÒà²_ÊÄUÌ|æfÌKÇž»’¢£Îãk?šIqqãî‹™O½ÃÔ¹ td¿DñÁ˜iŽ( vw>v»û‰MÔ–÷ž+žñéø5HYQØ›³©8dÀ?! ¥c†rþã¦÷|ž£bp”å`th‰åØ&[¬`­¥i×v:z¾j‚’R±y“º#8¬t•½Im­žàøÞ›yŽÊ­Ô?T]‡¶ÓJá¸áØ_È%Ήo _2þß:Ö½êò/ówüïÓ÷’¢ºÒÅ Êbž ÏÙÞÎÞÃ×T€Ú©(û91½EHm­•{h,Ì¡£¿ƒv#—e§A¡t9 mtö¼1c9iE©ÑùÔ–žœŽwn!Ó T ´ìœ^à`ëȥͥM;0\ÕûKh7`qùè,'0RËÀX°ÎäTFÜL9‰ÀH3†¿ô± -J°w›jF,-.Ûn3`!õHœ=aÛ*‚Çkh*„Q1 t­=k<Ö~l-ûOèð I%Tî¦Õ±”À±Ð¢žŽÿ©Ý> BÑÇÙ¯pÙgÇWоk1÷7ž¿ ÝW4 ×c¦F¡Çi+`¼ð±oë»Ôÿx¶f wÒ’L0P&þ€{ç& {ó!þñæ?(ìãª&ðæŸòlH a×U´†×OÝÇ3ÿàé…ŒþîÊî÷ð`fm›ë Kƒ¯Ö“ν"ó£ lnÚ!ÿs½äïkŒu@Ôžjì-ùÔï]KÑÆŸPeN 8&N[q B1¼wqß>íç§wyR‹‡X:º¿`–í4TjŒË¨qj ÅùC_ŸR‡×H×õupÒ„sX·‘úâ¼£Ó „åh¶K¯Û•»”žçn[‹—¿K ù¡ÆˆµûÙžöùt†M'(~:>õ¹4vO÷™¹ši·3Æç¸ÄM”3 ;Ìt*èìþgµ‚㤠Lj <]JÔóÚblÿˆîÞm7Mê3éØƒ¡ü£’ ˆJÀ^šÛ=vlÂbîþÌzÖ‹À£'#k±´×¨ˆ³JUúµoZ—á"ežV¬mæ‹{Ñ7U “Ó'P[A €ï,XKÅ¿à¿ö ^?É÷¤ôù|²í´ Ÿ¸0Ö=ͪM{<ϧ#‰øœ5¿û%«~· ÕMLuãˆÃ†ê¹c¨çޱ”:ég̸g)£œë*ðÖX±´ÁRKgW~Ý'½6ƒÐÈnÃ+‰°¤X”J5ꈻ m¤¹¤¤{¦•Æ#{Q^s7!äPß}GZµ€Ø™i¨‡¢>‡]êl¼ÔjÚ4ÆŽ¢£,§ç‰ka&ÝíDFi(®½@#F:[ÍxžûпŸIà«u$¡S’PßCәƛ·`hN 2%SQvÏ#?Ç+QÄ,$61/ß ¼Âç1.)Ky>ÔÒRÙˆ÷5 ÔjÔá‹ÐG˜i-;Öwy5ù´žN@Ÿ’ŒZ­é^¾÷ÐU¸“&¨ ¨• ðNô_aÒ´Þýi9zEø<ÆDX1=3ÒHKe-ãç1Z§AáÉèÒð°Òx b„5ê1 HXôK¢Æô–§›ÁØ1ZJ >3nÆïô Õ—8ö—SÈ\bçd¸üÈè ºáIÂÆôþ*)£›ê›f@•HdÕçl©±6êw|NÍøD.ø·5‡ØÕ¯1ëv ÷w÷L 4Øñqã_W Ùåÿì‘#ú¼)å:ÆZØeÐÖ/2)¹„ðùï‰óqš/QVb ¨ÎÎ&nÖ¯˜‘ØÝt€Šƒè®Q»^=^Üñí4û/"yij«ÖÜ©tͦòší©øÛNG÷$•n:Á1ÔíÊ¡ãr×gÛKCmz/µ™ÎòõÝïR e; • ñÓäÐx‘ï²±úŠ´x|Èé}# ‚°‰>`mÚMñÇ[\ž—tö„ïïÀp¬÷x:*×pxÛÃDO]Nò, ŽSÚK39’ë ³ŽÜ(f!á?ø?bG°e e.C »_¤Ôw9áI G± IDATwo`œÝ@sÞ&N/Çk˜°â(‚¼¥DÏ~…”¹à8YIóŽ(wy¤«£0Åô_2#D %Ôn^O‹¸è±¿Œ´ñ_­Û¶tŸ“Z|&¦âÕ¶‘šãÎm«tÓ Ž=@Mnïð•RøîÓÝcª£Éxî'ÄËæ`‹sž¯D~—ç™Ñ³¼ÒÞŒÆWEÊ‚_óýqí|þê*²ºÌý¼„ïÄÖ368 *7v/‡ì?Qí=|éÞ#ØÜfésþ\_ ,ö>§zùøÌÞÀä‘e×û«Ðd0é‘ Zß\FÍeÇõùÅ .¤gì¢ßâs`1G.R 2™ -DZõ!JÊ­à‘Á¤Ço§ýÏ¿[í3{ ëÉûxÏ vä›JÏØWãä!~1ȃ¾„”¹#(~åbÇòÛÆ—Œÿ÷k"?ë½Q¥Š»—ç©yëgoPx T×/euâ!–½šw^Xª¼|ñê¾`éìhÃëÆgùux6‹× ð–Ÿò݇=cªaóþ—åÞãé6üÝ]4¿´ŠbÏyÿõ ù¢ºãôW T€Ím–«&P/I¡F¡‰%ì–xWn¢þªû&¨Qx¡M]Θ9T_¢@{>U{kÑ͘‡çÅ—ìn^ƒgôbãÍÔîùO Tq9ØŠ>bK]"w~7Ìù¾ ˆŠˆë˜ìLO¯ˆ ½g ¾€­³¶6ç?ÛéóÛj3µá†/€*’©qC¶Wüîÿ7RÄRRæNÃ^¿•âs®¾?!T§·d ~' ¨ÚüGÚûQ`×™TDþ–‰3öðbK6‘ÚZ ÿ~‘êfwýN•JüÓ°XÉþÜ’K/ÿ­ÔÆÎÍ»Hò.fïx‰ì–üé­î}옩Rƒí8Ÿ¿³‹þ<LøÄñxPao/¡yß›”ös»i„,¡¦²qujÑ^›Œí@6ŽA65  [_ å¤ùò4oË¥ð•—1^žÖE? YO5H5œÛ}=.8®¯‘#$ã¯e2c¦éiÞ½‰®Á¶5æa&Ý”€eß‹|±þ nÛƒ2qq×à9åYâ'BíßDîêû9”Ûˆßœçˆ é_óÞqw£Ô ¶JP&£OKeäŸrVºNäÓqÒ:ÔCdÈN©%x9b8™†³¥ŸÔiH÷V“ÙÔIÅ)ûZUã}írb“ðÒ¨p˜kiÍ_OÉ%84s™¼8Ö Ë¨îþÙV_û+f\SÀ¾7²èŠ^Aê”æ dj žÞØ [(ÙœE»´sÞ"~ÄfJmÓ36µÂˆéÐzJvàqÃ:’C·³ûíMô|5Æ,!e^kWRoqC}ê &-KÇôQ.ÞSnÆ{¤7Š®cÿô%ê V˜ð3ÓŒ”î÷&$)`©þ£[7Ó9öIRæúñå«+i¸ÿ#qð õ¥×»Øþ‰«ÒõT³Ožb{‡•ÙÞj–ë4=ÓÏêö+Ù'O ¬ÑÀÄ¥éhÞü#r?û?:€:e9cûÓ‘qØ@“†>8‡‚7³{}&íþóˆšäìQvXQD§ãWùû_»Ýÿ؃njDE©é(È¥38Ñ.Ãb>1É(*si´¸lcõ9УŸ¤¥úÝÅì]·ŒŠ¶ñD¦¦9Zwý!Ú-þãCämȤ=x! ©±PžMsWÁ{?gEÔtüm{i¨<ÿÛ¨;Gm!íg&|eÅž¨ÌZÌî5˨èHfü­óð´l§¡\E`|Zoži†6b(*Á~"›š3е~ÁcÌ´VÐV^€cL*£uP¨ñŒJÇO]Asõ¥/‡;r—q¬¬‡_ ÷µµ´£gìÜ%øßäÀÚ»ÈݘI³÷<&Í™ŽP'-%&¤†£ï'wõC>!·.BëȦè±P@éÚ»ú¨ œ°œÉ):Z·-#oõ(Øk"pîωî>\€_R:öϰýCØoC7û‡\jäôâë]|ÿÄÕiH/~^îî¡ÎöV0 zõeÃ×còP¡À†½Ë¹®õD‡_ÉrÎÓ\d½3•4äåc°æÓzÂJ`€è¯kßKM‰ó ç0l¦¡~áQ ”lÛŽÁ0]|$Õ¹@AÑZÿÃYÃsƒ­5¦‚¬î^‰‘¦Ê Æ_«ÇèPÔÒ°§ÀY¿¥€º£µ„ÄÎÀkÇFêŽIž0å¡ÍØQ“„½äŒçjñò×ÐY~þ˜¦éȦÞmÌÇ>?ÏMÔîeÜwS¥Ì¡ÉÊØ$üZs)5ô®«L\EÊì°7Ò¼s%EGŸýh&ÅÁ¿"þþ·ˆp4bøçÏ©û:ƒ€!„ðåÛ{èr”PóYú»Ò Pì¡C¥G'öSVpXé<ô»}í aTB2ö¢•TwÚyt#'’7 K ²Á¹ãöÊ­Ôµ8´ºÊ °ÌJÂKÆÓoý‚ëù^|ÿš†t,ØÝ|Éø¿æv½Ë${'Í5Ùú׿‘wÂvÅ*¬!Q:7X¿v Ô~HEÙωyè-Bj h­ÜCcaý´±¸,ë8 ¥ªwB[£3¼0c9iE©ÑùÔ–žœŽwn!Ó T ´ìœ^à`ëȥͥM;0\ÕÛK±°¸|t–“F©e`,ØNgr*£Gn¦ÆœD`¤Ãß ú؆¥Ø»ÎM5#–—m·°€z$Ξ°mÁã54¨˜:ŠÖž5k?¶–ý'tx†¤žºŠû36♸‚‰1|ùç•Ô7[ñŒXÀÄÛ~NTÛ”×ðšV«C­HfâSï3£‘Ðt$‹±Ë™²tíU´–çR_\€uÀa„—/X*\/åÇFí8CÕÚæ2ßnÅ…¸D¨^p½KìmÝ«Oá;ËXóYw€ª‰ÿþ£<úH«>¤þÊ–öµ]ñ;C_ jíF?ZLK@2£ÆMÃ?î’§¦SúöJêûšUõ5ñ¢ÐÓûT SƒÃùÅ·ç`š5 õ(&LGQ²––󾬗¿¾³jUöSÎïpswozb5Í34ç’b  º¾V£À†ã4@õÇŒLž†òKÐé+hØrÎÝxK#–F: tzŽgêô ¼ ³•˜€åÐbê Îï*_OmÕ{Œ‹O ¼6à;mËåÈïvï¡lãýÔŽI#0*‰ÀÔUŒIÜD~V–Ëå`¨ÝÒÊE]tÿ¾elÍî*¤%5˜` Lü÷ÎM$@öæCüãÍPØÇ‡xóOy6¤„‚°ëˆ*ZÃë§î㙀ðôÆBFwe÷{x03ƒ¶Íõ„%ÁWëIçÞ?‘ùQîêùÐŒëj_c¬¢Ð öTcoɧ~ïZŠ6þ„*sÁ1ApÚŠŠá½‹{øðÙ@?=^=o´xø€¥£;<,Ûi¨Ô;—QãÔŠû„Ë]ŸR‡×H×õupÒ„sX·‘úâ¼£Ó „åhö‚ĈÝJÏs·­ÅËß%4|ƒPcÄzÒù¶ýp.aÓ ŠŸŽO}.ÝÓ}f®fÚmigŸXŽKô@¿îYØbÀª ÅÛ×ešZ‹§§ºçµRm¥ëx65;^äàÆõ´§3zÀ4Òi?×kÕ ¼´`1Õ|ÍâûáRû÷m£ drúdj+¨ðÅ‹b©xãü÷Ï~ÁëÇ"yàž—ïd/Ûi>qa4¬{šU›.öxž NGð9k~÷KVýnª›2˜:¸þÌY†4T]õeƒ™— æA«:ég̸g)£œë*ðÖX±´ÁRKgW~Ý_m¡‘܆WaI±(•jÔw<ÚHsII÷L+Gö¢¼ænBÈ¡þ¸sª2j±3ÓPE}=ºÔÙx©Õ(´iŒDGYNÏ ÖÂLºÛ‰Œ2ÒP|î]è3Œt¶šñ <÷¡+>“&ÀW êHB§$¡<¾‡¦37oÁМ@dJ,¦¢lÎt¼;ŽW¢ˆYHlb^¾Ax…Ïc\R$–ò|:©¥¥²ïk¨Ô¨Ã¡0ÓZv¬»l¥µ§EÃN"Ñß8oO5xè šóK®½#5j‚n]Ç”[»ç¡ÆS?‡Î6ÀfÅ@ Jõ¥BÊLã‘=(â¦×¢Phðºf!!4•\bÝA¸èþõSÈ\bçdàÝ3AOÐ O6¦·eÔbSÓ†¢ß}žøù¿cuæjVg®fÝêÿávŸBþ´>›f@•HdÕçl©±6êw|NÍøDâ.ÔXÍ!v.4ÓU;…û»{¦Æìø¸ño1†ìòöÈ}Þ”rc-ì²è ë™\Bøü Œ÷‡¹Ó—(+±Tgg7ëWÌHìÀn:@ÅÁtרÖß ßN³ÿ"’—F ¶hÍ}‘J×l*ϡٞŠß±íttORé¦S@Ý®:.w}¶½4Ô&0ᡇñR›é,_ÏÑý.Z¶ÓP¹?M¹~4VC‘9½O`¤¡À@ð60ѬM»)þx ½£ΞpøõŽõOGåo{˜è©ËIž¥ÁqÊ@{i&Grã¹¹/PÌBÂðÄxª°wTÒúïç)+ï߸º±0Ëm ™öàxŽ­{™ê2Qξ›I-Dñ•‘ÎãÛ)üp3V qëKxܼ„‡ïF=¬¦ eRßtí¡áx:áóÿ¿Ý+9¸÷â|à(YCßr¢¿»Žð6¬­Ç8ñþO©î×—øëª½èþõ‹6žàk uÛ–îsT‹ÏÄT¼Ú6RsÜÙŠJ7àØÔäæô¿]7)|÷éî1ÕÑd<÷bes°Å9Ï×Ç "¿Ëó¿ÌèY^ioFã«"eÁ¯ùþ8€v>uÙ]æ~^Âwb뉜•»—ƒƒ7¬ÙOÞÇ‘î=‚Ím–>çÏõõ Àbàsª—Ïì LùWv½Ÿ}á…4Lz$ƒÖ7—Q3Ôƒ^±+˜9ÇÆ‘?\l¼MÏØE¿ÅçÀb Ž\¤@e2[ŽcëC””[Vùøí´ÿy1• ŸÙHðXOÞÇ{±#Âm—2wÅ߈1XçÝÿÈÏzoT©âîåùEjÞúÙžÕõKYxˆe¯æ–*/_¼º/Ù;;ÚðºñY~žÍâõ¼å§üD÷aϘjؼÿe¹÷ßxz£wÍ/­âÀØsÞ}z½žêêê¡»üï8ýÕ`s›åª ÔKR¨Qhb »eÞ•›¨¿êÎ`5 ´©Ë3"‡êâKhϧjo-ºóðìWó<£—o¦vªp[ÑGl©KäÎï†9ßQq3ƒéé‘Á£÷LÁ°u¶ÑÖæügëãéŠ6S^Áaø¨"™8dûqÅïþ#E,%eî4ìõ[)þ8‡«î§@FÜ’%ø, jóiïG]_dRù[&ÎØCþÁ‹-DØüuDjk1üûEª›ÝUôtb—.GwÁ3ÒÀñ¿.»,—ÛžS~ŵ×E\xŠ?’ûÑE®X®&ªT⟘†åÀJöç^ÆñÞË¢›w‘þä]ÌÞñÙ-;ùÓ[ÜûØÿ0S¥Ûq>gW¿ž$³íß–ðÌÊÉ´·ç`Q*ïK¯çCvù/„ßfC~ù/„ÿ $T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$T…Â$TE· Bç¿EòŒÈ+]ÈUÁ+u3Ÿz‡Ô'6Ñÿõ|fo`æ÷fÍ­&½ø=ââ¾æê⪠¼Òˆ«ƒçµË‰ôØÂ»+Ù’¯¸‡‰ž6?Ž.íÅY”ìÚƒ• Âî_G¤îüµìG^ o[þ¥›L#ld 5•ƒ¬S‹öÚdl²ép\`‘ê?’ûìµÚ™ŸÉ‘ᵃ¬M|“I¨ P&3fšžæm+él[cfÒM ´n{‘ÒjÃtéÄÞ¶‚8ób~ÑHÝßÓèzÖ)c‰ºë¨>Ö¯æ½ãîF¯\;øPU&£OK¥ùH6ÖÁ5åÊn,Àè¾æÄ7ÐUª³–Žcôþúø~®¡ÆûÚåÄ&'à¥Qá0×Òš¿ž’/Jphæ2yq:­–QÝ}–«¯ý3®)`ßYtE¯ õÆJóF25Ooì†-”lÎ¢Ý Ú9o?b3¥¶éŒ„ZaÄth=%» ð¸aÉ¡ÛÙýö&z¾c–2/ˆŠµ+©·¸¡>u“–¥cú(ï)7ã=ÒE×1Žúu+LxŽ™iFJ÷{’‹Ç°TÈÑ­›éû$)sýøòÕ•4ž)P™FÜãKp|t?GËÏNEìÍ;vs°¬{ºç\&/MÇ´uÞצâ­ñÆaÚMÕ§kiìÊ`Ò’XÞ¿’Ê3-h ½{ú†Ÿ_RJí¶íÔ–à8™Å‰ªyÄè"€F]¸nÝ+å9ü›³Ø_b¾äÑöN]Mò” p“vÿyDM à´ÃŠ":¿ÊØÿÚ}ìþÇDÞ†LÚƒ’ åÙ4w%­·Ï4C1•`?‘MÍ™@EZ?à1fZ+ ÎßÇ‘D_ µÿÞBb¢#wÇ*Ázør_[K;zÆÎ]‚¿ñM¬½‹Ü™4{ÏcÒœé(uÒRbBj8ºñ~rW?ÄáCrë"´ŽlŠÞù ”®½ë¢ `¯.¡Ó??u÷î†%à05âÛ½D~!fLÕç \âS'=Ëø#UY÷“»áEšuè<Ϭ¬F{ã*bB*¨ÈºŸÜu?¥Â0žñw-%àªê ‰s]¡z&PKw5ñùƪþ¯è¡B {—°b=‘ÅáWSièçúŠJòò±Xói=aÅ+@ß;¿}/5%Î/œÃ°™†z Q мƒA.þÌM‚¢5´çœÝÓl}¨1du_žiª¬@¡ÕãÑS- { œõ[ ¨;Z‹GÄ ¼( î˜¿ ³»/EÔÄ$a/ÉÆxÞø¡/ Í祚ŽlêÝöÁ|ìÁÉø{Zi,Ü Q©Œêþr+c“ðkÍ¥Áe¿”‰«˜ùÌ;̘—Ž=w%EGÏï‰jgÌû<‹š–þ~çÉ $°€ªï¡Ë t•PóYŽ˜t0\¥G'öSVp˜é<ô»×¼ÜÇgp Æ|ZOÆâ  ÆO¯Åt {Hž±ø /ÀÔ×PêÏ1-£b#±ÛäìyZkiÚµŽžodÁ5´î~“–6+XiÉýÖÓÐ àÆ™zWa`‹ £:“>é©PôñíS\ñnެ!9„õEmÄÌŬ%ãz¦ >P…µ§{K>õ{×R´ñ'T™Ž ‚ÓV¨P ï]|À¿ð~z¼zÞhñðKGwxX¶ÓP©!0v.£Æ©1÷ñ8Ðå®O©Ãk¤ëú:8iÂ9¬ÛH}q ÞÑé„NHÂr4ûAbÄn¥ç¹ÛÖâå¯î}ë„#֓ηí‡sé ›NPüt|êsiìžî3s5ÓnK;ûÄrœ;bª& "ëñü‡ÛYZ XU¡xûº6­ÅÓSÝóZ©¶Òu<›š/rpãzÚƒÓÝŸ1ís8* èŠ%hl,ŠtaÅTkÄOŸOˆ™Öê>`Âbî>fgh"ð8ó»j®Åb×âàr <ôxyZé4ÊóW³! ÕÏ7VQº«©'Xݨ€:ég̸g)£œ7d” xk¬XÚ`©¥³+¿ˆî1Rm¡‘š‹´Ö¯$Â’bQ*Õ¨#î&x´‘æ’’î™VìEyÍÝ„CýqçTeÔbg¦¡Šúzt©³ñR«QhÓ;>ˆŽ²œž›>ÖÂLºÛ‰Œ2ÒP|¡g't¶šñ <÷¡+>“&ÀW êHB§$¡<¾‡¦37oÁМ@dJ,¦¢ìž^ZÇñJ1 ‰MLÀË7¯ðyŒKŠÄRî z|tê>Çq/¹ËvPúèQ{jP4lá„!òÿ³sïQQÜyþÿŸi›èiEºÅFDET$Þ$Ñeutâ$áht£æ³ ˜Qf&æ|÷|5¿3šß‰îÆ84?CV£Ç茉ëmtHFÀñhÑpºEI7tжóûƒ[«È%´èd?s<ª«êó®êªW}êS…èŸ]ˆÚCw=ÚØMLùõ<$$´ó·9¿å3$<ôcpw˜h¸4É8ðÅÝG…R’ºj¬©µ„ ÓS³ùh¬ºŠ2è9I—©«îé–¹]Rû˜8†úªPx2ô™hÔmÝÝn^¶2hê 4$ô ‰yïÆ ªZߺ"ðŸûZ§ë¡zb"!CÚ'h¢ š‡¦›(¸FŸ=Gl Ïà˜!½TùüVò$°(…1à°VPwq3× eÀ@YZãbÞgúD öº‹_2à;Aâ©î6p#šA¯±j$’l¢6óJœ³©(ƒ{ÞWÓ±´Lró†.ØÀÍÓXu}Mg©®#4~%ž’•†¢œs*ЖNuÉ ¼U;éܘˮ¢ˆío`¦Ú`B÷b c½@¾•Mþ±N·¸Í=á€_X0]mØu”|LnêJF?DDŒ Ç&ê¯m%/Óy<×IrcׯQ=Pëå4l V0õÕ1\Ýþ!eG·¢œ³„ð×W øÑLÃt.9Œ OnÆ}î ÂV.Aêr]!¦£[©js¨¾1›€E;ðÎ^Ï¥³]|1u7$†O¨ âFË•¥âõÞsð.úâ'½›Úý×&°$…Qv5gR©KÂó) ©ÏØHñœDƼº¥ÃŒ­:‡üý»©ofrÓã3>Kþζï×cÄt\¦ðÛ–‹¿*ßñ!Ø2a"É IDATbobõ‰§t:Ý}ÙàŒWzö”ÿ1ðš“Òþ¾áèæþÚð7Ÿ£þóÎßTðš“B˜ûNÎËéņ<™<£¶éû%§{øUÂÿ^z½ž²²²¾úŸµ«ô‰Ô.)$ªü¹uÉAªž¸!. …»MTÃûgP–ßEö ”ž­ÀwzÝz9ARá1:‘ñV*r~~*½!^#þ)F®bæÂ©Ø«N’,£‡O}û€͸ÄD¼¿7PzøSê»Q`ãù­naìô.\êlN-þ‹¶¨©Àôõ”Õ¸ªèi„¬JÂ÷¡G¤‰_¬¦¬·o ôĈ•D­YBõ‘x®—t=» Àc¸ýAø9zl·ÿ‚ ?g"TA\H„ª ‚ ‰PAp!ª‚ .$BUÁ…D¨ ‚ ¸UA¡*‚àB"TA\H„ª ‚ ‰PAp!ª‚ .$BUÁ…D¨ ‚ ¸UA¡*‚àB"TA\H„ª ‚ ‰PAp!ª‚ .$BUÁ…D¨ -´ [´‡ˆé»@zF¼ú“¦hòy£¾bܸG_É_}Å̹¾!á¡”»áÉà1%‰@÷œÏ.îåš$<Ç­dôÔéxy»áh4QŸ¿ÂÓ9Èhñ_¾@ß—²çmäLê…®Wïÿ€BÊKŒ½¬SƒfJMÓ°8z¹ª>ä‡ºî ·n?îJ„‡¡*€2‚áSõÔ¤®§±·ë¾’ð£6õ®•™xÊw6! Þfœ5KçÜüsFç£NBÐK¯AÙÕn­^=n zerïCU>:Šš¼4,rïVÕw4øL_Šú¬Õ'Ùª1«F14Ô‹/Þ¼ØÍ%$ÔS’‰ÃSå†ÃZAí…ž/Ä¡ZȤ„ÙÔ¦¬¦ÌÜ2÷”÷™>ÁÀß?ÛGãè·‰zÖµ3ýñ{:w5vÓ ï£^MìÆ÷?̵¦i ¡ER˜©ûv'…ÙÜŸÙNİt²÷¤í|žÈÌ8-ÅÉ멲¹ >iá«gSw4uä\ÔÔ(¯rã/›¹i’!t³¢Í\;§ÆorîýÁVv„‚“‡iñ[f.ôæ»ÿ\±µ@e4ãÞLÄqt9E÷¦ˆ"d.:G6—®·L÷XȤU³©;™ƒzJj•G]6¥IÆØ8ðÄ¥Ø-£°¤u †-IA_ý ¯Q‘šÎÍË…8¾ßGeiÁ¾##ŽF#έ{Î\Ç š}œ+´vùm«£¶©Ç:¢FeûI2õ£ Š]‚n˜Åf,e'¹žv¸9(z†Æ®bxÐH$7°×¨<•LYEãÞLd%îÇ7#Ü‹æ.ZW¡žò¯Œž8µäºbjÎ$St½ƒpWhÑÆ®%`´Én¢æì îé +:ç5†‰¤°b«ºÀôO1Þ–yø1cbØ’uÀ¯öãs=™Ì£9¨''2u2ž’KáÔˆ½Çî‰ù bV"xÖÊÎ×v!Ÿ¥Œ‹ö¥æðdþÇrνˆ43‰Ü^>ÀѪhôº Ÿ%½s+õƒâ ×p×!£=ï’œûdÙ_æà>ým‚‚$,†LtÑ uBó Ž@Q’‰ÑæÔF/ës G®¡ìO œÝ¾šâ;cŒŠnþÒZê÷Óœ ÷ÓxΤl¥^·‚°¨(J£¦1 ÝXUÛêAÓÔt–ê’»ešcpT\¦¾uÂ2ôø…Aɾ²?^M±%‚1óãð°¥S]ä†ÏøèöxDã3̈éJ!öÊ4Ê[ I‡n¸•ÚÃÛ8`£§@Å×'èNgÑ’¹š«% çn$ó“dêÑ3ba"ƒÌ»¹˜ü™»¶R£Ž# 70R÷à¼Ò䵌i¦tßr2S> Æw¾íŸ{ÍZ˨Á…Íu}üß ~aj3fÊ¿ØHu˜Ž¾DæÑ ð]ʸgGbI[ÙWSX9¿‘ÝØ‘Â#õD„jk ^;}‹¬]¥Ý_ÐÝ MØ­€Œ\¹Ü(1usyE Õg.`/P[)ã9XßþyýYÊ ›O8‡é0ÕU*|‚ &“IïøÖ‡:ahG«¨Íϸ·GÒÛú¨3ìk¹=5s«¤…F{[ýTçšë·¸YPûÈéxbàæU3Þ¡sZnE$OÆ^˜†ùñC žƒT4Ô<8–Z—w°½íK°ë"ä!c¼|‚¢ÒrŸ£ ™Œwm&ÕNÛ¥œø³ÞÚÏô¸ÙØ3×s¥àÁž¨fzê¢}”ÿÔ[Y¿yøù(ý:‡Fh,¤üo8‚g3XýÜTàhÀþƒ + ßn$ûã;Ø]Q1$,û•}”Ý0ãpXi(ØEeµݸ°û·Š!!Ø®lîyÊÜ:Ž¥íL›Æ°05ÕgvQÿ½ v3æÓ©QE3t8=:fLõÎ'ô­Ç~û﨧>þ®g W¡øú‚ã÷àWa ¶$ãå ,Ý´›±9Íë¸ ¥[û„;FÚ~±bû^F©Ò¨º\H@ÄlÔ™ÅXü¦á#]äÚõûú[½­3¶;Në´ýÜÚ¯„v6§¬²}o†úfC: Q p˜rëd|­˜þÜAo Jw°7Þß[3c»íÔö6ÂÐÜnzÝ·.Ãà0,W’ïµ_Mæ\¥/~QD½G˜ý- —n•Ýç +S¹/‡ŸüœH㋤ˆ`ìï¾ºïƒ ÜÀ­¼}T†$¹j*õ¥j‹2©Ê7 ÷¸A-žÁV\á4­ù»‘¼´€ó¾Óàî ¶;N)ØXAÃ-'›J»R…WÜWøÝ×J­—yÝ?f<hàŽÉ©—_AC×náë“P}qs8·K¬œJ¾74{¨1Màöà†ŒšÊ q¯ñôl®í]O•½£ùÝ:šØ)´ôЧ$p4Âr~u1qhýv¢†¢0™Ûœ¬¾¾{jUö¸ -½é8|Çj)¯™Ž5“ •=]¡óÏ špÜ0PuÕ̤Ðh”߯¾˜ê÷-ÚŒ4ØŒ4˜ 4xŒáéió𼼫í"¥ŽbPýYŠºÝkˆ¦Lò>ú޳$‡ë»–S1<Ÿ ÉøD½Çð‰¹°oŸÓŲ7¤¦¹¡èà¬R´íË&À̽ñ”Tw´ÎNŽ™;÷­³_gíKŸ|UWî3„˜ÄQmÓz¨€B…ä!a¿}ª³É\Ùõ¥Ö0tÁZ¸+ãÀížÏ}àÃÞ#|o=žm¿hp÷›¥% •ƒÃP«dlõf°UÐШÅ{dˉ ™Ç°@U'kë€çdü'‡ TJH#— j¦¦°°åCcÞY”–àGU7š§*ƒ–2+©/êsèñšƒ§$¡ÐD3bŒËõŒ¶ÛAùru¾Ïd¦:¿â!+1ÓPkÅÓçþ—þe¼ÂW2x R Ã"'£¼‘í֕לÀTFàÌꮤÑÚñ¶Ü(A¼‚‰axÔâÇ¨ÉØŠœT—¯Ôá8n—›l¥—ÉC…¢ú•¦@ôÏ.Dí!»mì&¦üzÚùÛ‰œßòú1¸;L4Üšdøâî£B)uÔãtfŘ—ƒbÜRüõ žVàçc¤úJá}ó¹]Rû˜8†úªPx2ô™hÔmw&9ܼldÐôm>.*ÔS’ˆ|%‰!RÇ 2{s¸+Ý%,%}g32DRÒà5e >÷B~ ‰‡ÚißkŸù-þÃÛ·Y´”¨èûÝBÏõÙ˜jkxÇ èu Èç·’? ‘€E)Œñ‡µ‚º‹›¹^(ÊÒÒó>Ó'Z°×]¤ø’ß Ou·éÔ z…ˆU#‘dµ™PâœMEÔØ£ð¾šŽ¥e’›ï4tÁnžÎÀò¨ëk:KuE¡ñ+ñ”¬4í¤àœS¶tªKVà­ÊÀØÉX›¹ì*Šèñx‘Ñþfª &t/¦0Ö ä[Ùä;Aû¨EsO8àLWÛv%“›º’ÑO'£Âñƒ‰úk[ÉËtÏõERÜØõkTÔz9 Û‚L}u W·HÙÑ­(ç,!üõ(~4Óp#ËG#Æ“›qŸ»‚°•Kú\WˆéèVªÆªoÌ&`Ѽ³×sélçï(üƒw£µ€þMȵW©<ô.e _4dÀµI,Ia”ÝDÍ™ƒTê’ð|JdêOoæšÛk.Mal?°Õ\äÆŸ?n¾`uzÌbÌ+Æwæ¦ß͹/wc8Dè³[˜.Y±|ÁÂ1ŒR8 #iÆ£›µ©'ZŽQ ^c£ð¼³‹òÍWH7ßièB.Rž™Ñ­·0„Î=¥Óé~ìËg¼г§üל& ø‚Ó‡Ò>“já¯Í£v÷jÊûúAÈÛÌŠm"ïOÐ3â•-x]LÀ×IÊB_OÂq2žÂ"ÜçþæsÔÞù› ^sRsßÉ™c9½ØAøyÐëõ”••õý+UY»JŸø@í’BB¡ Áÿ—KQ—¤ê‰{â*¡p×¢‰Jbxÿ Êò»(Ð~Ò³øNãó9[V¯Âct"!ã­Täˆ@gý•ªH#W1sáTìU'É?–A‡ò')šq‰‰xo ôð§Ôw£ÀÆó[)ÜÂØé9\¸ÔÙœZüm'PSéë(«qUÑÓY•„ïCH7¾XÝáívoyD¾Ï”¼5_ü)™G;¹c'}~û/‚ðsôØnÿA~ÎD¨ ‚ ¸UA¡*‚àB"TA\H„ª ‚ ‰PAp!ª‚ .$BUÁ…D¨ ‚ ¸UA¡*‚àB"TA\H„ª ‚ ‰PAp!ª‚ .$BUÁ…D¨ ‚ ¸UA¡*‚àB"TA\H„ª ‚ ‰PZh¶hÓw!÷RÎ!ì­‚üw!Zü—EÄT­ëWò6³~ó[4=]. ‘™o}EÔšýDF…üôõ.¥|ÜO)IºŸà|vq/×$á9n%£§NÇËÛ G£‰úü}žÎA@ËàY+ ;ÏþnØë ©ùûn®_îm»€2„¡$n]4`”íÜ8HÞa™ïʲM™\þèCÌ!®-KøiDOUeçê©É>Hco×5|%áÿ†íïp~ç.¥æ œø6ã¦4÷ð<"×2~,Tüù 2·-çÛL#ޱ란žhüIà„0Üu;ŘoT<ÚàúÌÕSY5Š¡¡^|ñæÅn.!¡ž’DHDž*7Ö j/ì¤ð|!ÕB&%̦6e5eæ–¹§¼Ïô þþÙ>G¿MÔ³®éßÓÁ¸{¨±›NPxxõ2hb÷0¾ÿa®5Mcø-’ÂLÝ·;)Ì6àþÌv"†¥“½÷`Kï žÈÌ8-ÅÉ멲¹ >iá«gSw4uä\ÔÔ(¯rã/›¹i’!t³¢Í\;§ÆorîýÁVv„‚“‡iñ[f.ôæ»ÿ\±µ@e4ãÞLÄqt9EmU ™‹Î‘Í¥ë-Ó=2iÕlêNæ ž…Z¥ÆQ—Mé_’16Î#\CÙŸ8»}5ÅwÆÝü¥µÔï§9Aî§ñœIÙJ½naQ!P”FMcº±ª¶Õ)‚¦1¨é,Õ%òMiFŒÁQq™úÖ ?Ê8Ðã%ûÈþx5Å–ÆÌÃÖNu‘>ã£ÛWàÏ0#¦+…Ø+Ó(o T$$}ºáVjK Ü)2àÅP_($<‚fã-SSö°@Ðà;q$5ÇWs&ù]*~cÔ¬9(º¨¥Ó}(C“˜4Ó—ÚÔÕœÙö†³uø,ÜÀHP’̹Ìb¨9Èù­«)«i^½çøÙ(¿ÝHöÆ“›/¡›³´e Sψ…‰ 2ïæbòKdîÚJ:ŽðØi(iò*‚ýÊ)صœÌmñä~ ~ó_AsÿØ›cFx"<¡Ú¨×Nß"kWi÷twCAöF+ #Wî#÷£JLÝ\^QBõ™ Í·]òj+e<ëÛ?¯?Kyas7Òa:Lu• Ÿ 0¨IÇdÒã;¾õ¡NÚÑ*jó3îíMô¶>$ê ûš{:˜¹URŒB£Ç½­þ ªsZÆûlnTà>r:ž¸yÕŒw蜖[‰ÁÁ“±¦a~ »£ÁsІšÇ4ëò¶·}év]ƒJ¿Î¡Q )ÿ[ŽàÙ V@?78°ÿ ƒÃJ÷ÉþøÃ¿^3ÂãöØoÿõÔÇßõláŠ#_ß@püü* Ô–ä`¼œ¥»ƒv36§ywA¡tA»c¤¡í+¶ïe”* pªË…DÌFYŒÅo>ÒE®]¿¯ØÛú0c»ã´N;ÐÏ­ýJh7asêàÙ¾7à ý³!†ˆ(†8L¹u2>VL6tІ¥;ØïO53¶ÛNmß1a# iÍ=á¦÷ÐQqë2 Ãr%ùžñXûÕdÎUúâáE@Ô{„ÙßÂpÙˆÇÄ·lä»Ï×SU#ã1r)cl èÎоŽˆ×–¢@Ætè% ÊZj1·×âpÞ]ÕòÐ}¤Ås ØŠ+Øß’—èh_íŽÑi#eH(”€ÆIÁØß}u߸€[yû¨ I"rÕTêK ÔeR•o@¾?T{}Ì[Ÿ„ꋛù]båTò½¡Ù«@Àˆñh·G0dÔT{ˆ§gsmïzª:õïù#´õ>OIàh>¹åü êbâÐúíD: Ea2·è>úúî©UØà.´ô¦ãð«¥¼f:>ÖL.Töt…Î?K(hÂqÀ@ÕU3“B£Q~¾úbªOï]Öf¤Áf¤Ád Ác OO›‡çå4†L ÃömU¦æo,ÚIEéWŒFQê ò?¿ÈS-«°×u§ÈnÔâ¼Îû¨CRçÍ9šþYS&y­OâÃõ]Ë©OÐd|¢ÞcøÄƒ\Ø·Ïé 3w:/Mx2ôÉíÕ•;Ç !&qTÛ´Þ* P!yHØo_ êl2Wv½C©5 ]°îÊ8pCѯ}v÷=|ƒÏ[gÛ/ܽÀfi9améT—¨ð YÈQ¦ü }_ŸÒÏÎËûÂ÷u4ë©Ê/D=z6ÃB'c+H»ïämeÆn¥Çýmkðä0µH˜‘[Þû©ÏͤÁÚñÓðªÊÄØ2ÝkÖ6¦.ˆ¾÷Àr<8Ž{Ö™VMÅ4´ü“»X¬ÕÃj:ÙGFêÀÝÛi¸-ž°Õ•w¯ag·MÈnÃPtš&iððÚ~VJ27Ò(ÿæ.íÚI½n6Cï+íì˜þ!ôI¨fí*åÚé[mÁê’@¤ÉÿÆôYÅÁÍd”ƒÃP«dlõf°UÐШÅ{dËI£™Ç°@U'kë€çdü'‡ TJH#— j¦¦°°åCcÞY”–àGU7š§*ƒ–2+©/êsèñšƒ§$¡ÐD3bŒËõŒ¶7äËÔù>G`™êüЇ¬ÄLC­OŸû_ú—ñ _ÉàH ‹œŒòF·ZW^sSM3C¨»’Öö:åF Šà„L Ãs Ï€8FMÄVt*¸]bD=aZ !¼‚~¤•ÚëW{¶íÎRKçûÈŠ1/Ÿ¥øë5(*<'¬ÀÏÇHõ•æïØq· <´xz¨šoñ;S}‚JS úg¢öÀ]6vS~= íüíDÎoù ýÜ&îë}vzÌô”ßBBbçµ §èÑ>ó[ü‡·_,•AK ‰Šîª.ô@Ÿ©¶†gpÌ€^*€|~+ù X”ÂpX+¨»¸™ë…2` ,-q1ï3}¢{ÝEŠ/ð µÝ^véF:5ƒ^!bÕH$ÙDmæ”8gSQ5ö(¼¯¦ci™äæ; ]°›§3°<êúšÎR]FhüJ<%+ E;)8çT -ê’x«20vrNšË®¢ˆío`¦Ú`B÷b c½@¾•Mþ±NÕÜø…ÓÕöAKGÉÇ䦮dôÓIDĨpü`¢þÚVò2›Ç(-™Ég/î ØÃ »¥„Ú¯ÿÀõ¢Îžþw¥ãZºÚGŽÂ1x'1úWÛ èß„\{•ÊCïRÖòPÈ^”NMäJÆþk0•‡6Ðyǹ‚²£[QÎYBøë+Püh¦áF:—FŒ'7ã>wa+— õ¹®ÓÑ­TÝ7VÚù1ÝCšñè&@mꉖãSƒ×Ø(<ïì¢üFóúÜ|§¡ ¹HyfFÛ't×S:îǾlpÆ+={ÊÿxÍIaÒ€/8}(íá3©æþÚIµOÈ{ªÿpF®bæëï¡W¦“Ÿšñäýy¡͸ÄíŒc¥ôð§Ôw£ÀÆó[)–ç1¶ËÿPE‹ÿ¢=<=w –¯?h{)þñx’jyLÜ¢ßúªO„>¿ýAø9zl·ÿ‚ ?g"TA\H„ª ‚ ‰PAp!ª‚ .$BUÁ…D¨ ‚ ¸UA¡*‚àB"TA\H„ª ‚ ‰PAp!ª‚ .$BUÁ…D¨ ‚ ¸UA¡*‚àB"TA\H„ª ‚ ‰PAp!ª‚ .$BUÁ…D¨ -t¼ðþ¶­zÜ…<1bÖçÀï#Â’^ø÷ã?rˆC7ë³€-ÇSˆ àÏòÇÙò¢ÆÅÕ:ñ[̶ƒ‡8tä8Ç×Å@¿ â“°i¾îѵ)´Q>î„'ƒîÅ·X¦>ÎêÝE½\“DÐ?%¿h¡Z ¹ÞHÁéÏÙ±3‹êæ–˜ñÚ,ŸŠV%!×õe ÛO!÷~3ž(E{Xý§j¸€Ø¶©FRÿ¸s5ÖG×påVÇ 8ÎŽ-oñÂ¥·øªòÑ5-ˆžª E²,ΟóÚOyo×5)÷~3óobõk ¼›œ…úŸ×ñî¢æ^’nÑ»¬›_ýßxž[Ì[Ÿ™ð›÷ˆ×ë­ø!S}åÆ>¾„”îgÿ%/‰DêÛ–ÿ×y¢B5fÕ(–üçä,!úâ:¶í>À¡#‡8°{ë^ m>h|^`Ûñ,÷oŸ[óâŽïXŽ?@Ô:Žï^CìܵlÛ‘ÂÞ/ò‡å„«›çL:À¡wûûm¤ì>À½;Øðr8j ôŽo]Ì=7S“ÖpàÈ& tQ} Øt|Ëg½Àº?¦²÷{“7ðÂè–SâÙ ß½†/®cÛν8°—mï¼@ÒŒµ8²‰Xµs)1l8tˆµ3<¥¤Y󉹛ű̖]ó[Žï ~îr6%·ì›­kˆñ.`Ó‘¬ê¼†æÛݽo„¢– 8š¼…ŽçRn¬‘x•C IDAT¦(ësŽå@ Aþpå©Å¸+Sž™JžYƒ úþ²:æÊ ïlcïÁã:°—-¿_@Pë&IþÄ&m!eï!ÜKÊkˆ hù°«ý‰DЋëØÑ²ì¶ßÇ¢½§a1olbLJ8~ä{wlbùÔŸr ï|û¯cyòq6-šÁò÷v²{/öncí?µ#jbÖàÐ{±´V!MZÃÞCÛXÐQ»2§þ’³æÓÁ! ¸Ðª1«FØCš2!¹ —ÜÖ Žæ¶cŸ…”ßÇóò’7Øs+’µï,Fw'•Ôó3žiïñhžaƘj¾I/Àr%•' Znå%t;ÎÂùóyäÍÅ2!†£ÕÐOB7#– îEœ¿`éÆNð××±L›ËG«³ì·É”NàÝWC‰ÈÄ÷I."åíÅ<¿ì-RJCYóþ"¥nìÏÑËx÷Õ@ >I`ñÒ7øèZ$±SÚÛÕüj5kŸ‘9¶nÏÇ½ÊÆ¿I<ÿ»Ä^Ôw!ô¹X,ÿµšø/³æÌŒ×_¢ë‘\ §’·“;&ž•3Ô@Ë^¡öË8PúEòr)¸Jä¤ÞÕ,tî‰ÕÖ@½vúY»J»¿ Z¢?2–úæ^ùÊç¼µ8ž”ëÝ\¾_§>?‡ ñç®Êhý’²&‹¯N›¯EêU5Sž‡âTNû3ãŸZê„3UÅù¯OÝ;.ØÛú(8¹‡ €™¬KEàçO[…ýÊIýS.€;¹|uº]Ä üïæ’zÚLxLk/FbÆ/¦`ý[*çîÞ߆5ƲÇR þºŸ¢Ææ¶Oýå–ÀHf ”ÉJËB~:†-køÅBËO“ê´]ê_mâøñC¤¼‹õ‹wÙüushZ¾Þ–Ó:â·àø‘C¤üŸ ²©›ã|3X0KÅù/S8WiÁR™EÊÖÍʳ 1…ØY*ÎH!«R†Æj²þë+rU3ˆmëU?|EÍ@WœÊÌjdÙBÑÑÏÉ2¶·lþŸM¼üÆ&Ž[e3G³(R2ʯ;uwN>œ¯J›œê¿çaôðÇß§ šOñÑ0eå2b%°ÀqŒ¾èdLünÅUjüG<‡dÂãUç@=õñw=[øÊ!>?«aÙŽìø` Kbêæ]$²™j§ž¥|$É­}B¥ÑiŒÑBµYF­ÑÕ=U€ÿ/b ˜0ƒH÷ó|“}_/°·õaÆè4ö&7’ÔÞC”T×´Ïm¬©Í t@Aj*ÕcbˆÕÒfN²ræë\4µ ,óƒm—;m±34¾4÷„m‘ÄÌRjfΧètê=ã±–Œm¬Nz—»óÐ.ÙÄ»s[ÆTý.ïN¯&%éåæÞûÿ{ÿ×7’0¡]>´R-å7Ú¹zŠcYåÈ-ŸU;×ÜhÄX/¡Ú"ߟZŸApËØò0  œr§PÅßg^ÝÀŽÏö²wï^ö~¼˜PúãæÞuÙ]1Ö8í9ùd$ܺÙ6Ÿüˆ=ÆXÖ®ÐplÛŠ¸hÞ37 ¨êM¹Bú$T_ÜNL⨦÷*PîV“º1že«·p,Ï‚6*mÿß&<¬÷Я‡÷jýîýURH 7Ÿ”æ´SäúÌ$v„þb&nÙ©dÝgý¨ë»¤šäæÞrq*§Ë‚˜ù¬iêL¦ÔCꕇµÛ|AéhzûÏý&šš€»¹¤fš‰œƒz` 3Æqê¯Õ÷.{§š¢ë¹dý÷Gl>j&òÅùáOìÜpÊOîàØu3²l¡Ó9׬öGë%c¬º¿þ £Ù C´NƒÐúµÿ:FMAêÎÕ´Œ u:6‘n#A/¯am?oýG¡+×3N¨Q«Áz§Ï-„ë“PÍÚUʵӷڂÕ% h~½½®!& ùžZN FÆXY –rÊëu„Om>ô%¿,˜ÚÃ+¹f /ý:µ$¡›±œØÑfÎü­µ"sê›,ÍYF,§H½Ô²ÈŒå¬}-]_ÔwןgVÄ⯖ücxi–Žò¬oÚnaÍi§Èñ<Ëž6óÍ_ö²”™òr Zÿû_ú— ›À ? IÄ ¿ž‚:/‹3-çtE8Ë…Rp:•ÖØ*¸R„Û¬•¬ýu8þZAS³z~ÕÎSD9ç.T47žØÀ–USâY0ÉÂù¿w§ß—Eêi+‘‹ˆ РöŸÁ²Uñ̲8öµ•)‹ã‰ÔJHjb^žðúS¤žïzÍçÏa ŒeÙ,Ôj á‹–1ëõÓjŒ50|ü4€:pk„ù®ŠACá£ô®Ž‘€å¬ý5Úv€¢ÌdR®‡“8ƒ‡Ž0õ ĨLyY×á§ë³—ÿ[Ã38f@¯Àüß[ØŸ3}êÃgÒ,`Ëg 8·ú ôú­ùšµŽã‰2o¦ƒ‡þ,OÞÆ˜ã¯òîñNz'R$kw¿\Ææ,.`˾ç)HêüM…ðßìå]u2ËÞÏúÙý5Tïhxáß÷s6¾ù/ª“濨ú”ùO3ÞÙÃy Ëþýœø¾½^OYYYß?ýÏÚUúÄj—úI¨}BYüûeøŸßÏñ¾Ô.IHuD¾º–çU§8ð×.n÷äsì?TÎŒ%/ukœPòP㵆„g-? õBÀK,0rà ¨šøÛÿŸbêöüŸX¯cËæStïÆµyÄðîž5„×ä²ÿýíÍ·¿](ÿÓöLúˆµ+ΰú¿;›SÇóï§°|h9YŸnäóbW=ƒµ_¬eÆCG?Œzç >ïö;¾_ÐËÛ9´(—íK7Ú—Iæ·˜mÛ^Â_’à,Íÿ¡ÊÛó©Ý½FüÝèóÛA„Ÿ£Çvû/‚ðs&BUÁ…D¨ ‚ ¸UA¡*‚àB"TA\H„ª ‚ ‰PAp!ª‚ .$BUÁ…D¨ ‚ ¸UA¡*‚àB"TA\H„ª ‚ ‰PAp!ª‚ .$BUÁ…D¨ ‚ ¸UA¡*‚àB"TA\Hù¸ žZ†-Ú‚®|=²‹w1gÔv"#58îZ©>Ïõ’Ç]Q4qLZ‡ºŸ„âúVNgh9ŠÚoQ^ó¸‹ûßE„ª€Ç”$ÝOp¾×*á9n%£§NÇËÛ G£‰úü}žÎA@ËàY+ ;ÏþnØë ©ùûn®_îf»>Ñø(¤¼ÄØË:5h¦DÐt1 ‹ã!³”}Jæ—i½l§˜r飃xÍNa’'pç0g&ùÜ+˜?Û…åq×÷¿ˆ¸ý@Áð©zj²ÒØÛu _Iø?‡aûûœß¹†K©9('¾Í¸)Z<"×2~,Tüù 2·-çÛL#Þ±ëòëÞêÕã– ôím• Œ@Å€Ÿq·BÎ;ˆÉm.#Æ©w)ÿ«Cµ(‹©9×r\ œFМ¥øúù¢´›±”·l“­“m*í ~‡›—MDNœƒòÊaìn¡à*OLO5fÕ(‚g ¡ì|m÷òYʸh_j¿Aæ,çÜÑ‹H3“ÑŽŒ£ TÑèu>K {çVêÅÞÜ£ºëQŒžwÉFÎ}²Œì/spŸþ6AAC& ºh†jÚWç¢$£Í©^Öç@>\CÙŸ8»}5ÅwÆÝü¥µÔï§9Aî§ñœIÙJ½naQ!P”FMcº±í=EÐ45¥ºD~ )͈18*.Sß:áGzü d_Ù¯¦ØÁ˜ùqxØÒ©.rÃg|tû <¢ñfÄt¥{eå­Š„¤C7ÜJm‰€;Eãê«…„GÐl¼¥bjÊ:TKæj®–€œ»‘ÌO’©Gψ…‰ 2ïæbòKdîÚJ:ŽðØi(iò*‚ýÊ)صœÌmñä~ ~ó_AãHãÊþ#Ø0p-ù¥.ÀáEÐlÔùàÜ'ñ\ÊÝÜ÷ ò8Ì¥OãÉ>nÀsúR´ÍÛ=dÎZ†»ç`øt9g>y‡Š¦éŒ‰×Ò‹Ñ3ra"^·¿àâöeœ=~÷_ü£ƒ$ ‘/¾OãAr?YΙϓ©¸„Ióç ìl›r&7”_EÖŽgðÕ}úy{"Bµ5P¯¾EÖ®Òî/è&ìV@F®ÜGîG ”˜º¹¼¢„ê3š¯àòj+e<ëÛ?¯?Kyaó ç0¦ºJ…OPÔ¤c2éñØ2cÚÑ*jó3¸gx®·õ!QgØ×ÜëÂÌ­’b=îmõWPch®ßfàfAî#§ã‰›WÍx‡Îi9‰%OÆ^˜†ùñC žƒT4Ô<8¦Y—w°½íK°ë"ä!c¼|‚¢Òr¢*C&ã]›IµÓv)'¾Ç¬·ö3=n6öÌõ\)hM{ÁVòóµŒZ¾‡Y¿ÛÏÓ Ã°¤mæf×¹ö ¿yøù(ý:‡Fh,¤üo8‚g3XýÜTàhÀþƒ + ßn$ûã;ØÝdΡòFówi©(ÁáVAMKïÒqã…/ždnýOÙ_îÃb•qØ*¨ºz…ïH<[êÖ 2Pq*ƒÆF+òƒÝGí÷nà7Ý B*¾É A–qX ”eÅ12Š!ÒOئêz<ýÄmzì±_¿œõÔÇßõláŠ#_ß@püü* Ô–ä`¼œ¥»ƒv36§ywA¡tkŸpÇHCÛ/VlßË(UàU— ˆ˜:³‹ß4|¤‹\»~_/°·õaÆvÇiv Ÿ[û•ÐnÂæÔÁ³}o†úfC: Q p˜rëd|­˜þlè  Jw°7ÞŸjfl·Ú¾cÂFÒš{ÂMï¡£âÖe†åJò=ã±ö«Éœ«ôÅÃ/Š€¨÷³¿…Ᲊo36ØÈwŸ¯§ªFÆcäRÆ.Ø@Ð5U<Ø‹î”ÆIÁØß}u߸€[yû¨ I"rÕTêK ÔeR•o@þ©¡j5·oãÝp8ÌÈ­2$Ró¯ ïFFÍÅÛGƒR(T 7“ÿihÇOë*cËt¯YÛ˜º úÞËÑʼnýSÂÛ&d·a¨:M“4xxHm?+%™Æi”ó—ví¤^7›¡.xy SCðRU`:Û¨€Z7²ýs³ ¹¿/ží“Sm Ïà˜!½TùüVò$°(…1à°VPwq3× eÀ@YZãbÞgúD öº‹_2à;Aâ©î6p#šA¯±j$’l¢6óJœ³©(ƒ{ÞWÓÛ^®vó†.ØÀÍÓXu}Mg©®#4~%ž’•†¢œs*ЖNuÉ ¼U;yd.»Š"z<^d´¿€™jƒ Ý‹)ŒõùV6ùÇN8½–ÓÜø…ÓÕö]GÉÇ䦮dôÓIDĨpü`¢þÚVò2›Çs-™Ég/î ØÃ »¥„Ú¯ÿÀõ¢®Ÿþ˜/§a[°‚©¯Žáêö);ºåœ%„¿¾Åfn¤sùÈadÀxr3îsW¶r R?ë 1ÝJU#ИCõÙ,Úwöz.uá_‘Ù3(I›Æ¸¨ˆše¥¡è…_žeè’µŒzí·ÈÛ?¤äp2ÒÜ%„¿þŠÆ jÎüÂ"¨ ìðV¤¹K˜œ˜„â#õ%»¹ôuö®¶©ž#ÂŒéÜïSõ™§t:Ý}ÙàŒWzö”ÿ1𚓤_púP'Q£šGøkó¨Ý½šòŸòôº7BÞfVly|Øx"€ž¯lÁëb†¼N TFúzŽ“ñÍ'¶û<Âß|ŽúÏ;SÁkN aî;9s,§òdòŒÚN¤ï—œþGù‹ªÍQµ›ÓG3€F¿þî‹Çp¥{-á§Óëõ”••õý+UY»JŸø@í’BB¡ Áÿ—KQ—¤ª¯µK w-š¨$†÷Ï ,¿‹í(=[ïô8<:Ÿ³eõ*õØ_©ú‡4r3NÅ^u’ücOÞ_ªHÑŒKLÄû{¥‡?¥¾6žßJqàÆNÏáÂ¥ÎæÔâ¿h;š L_@™Ëþ³Ži„¬JÂ÷¡G¤‰_¬¦¬ÛïøºÀˆ•D­Yò÷ªp¸Ð™**ˆ¿ûïk}~û/‚ðsôØnÿA~ÎD¨ ‚ ¸Ðÿß¾Ý7uÝùG‘/zÂX~ŒÆØ2`°!Øe-hͰ°IÃnãf ;f¶˜,uw(3ýeghfšÍ ÉnHv1Í:$édZÒ.¦c·ÁZb;`ó c,[¶¶%„eÙVd¡üþdÀ`‚b(¿óšÉ]Ý{î÷^]}î9G×"TA"H„ª B‰PAˆ ª‚ $BU!‚D¨ ‚ DUA„¡*‚A"TA"H„ª B‰PAˆ ª‚ $BU!‚D¨ ‚ DUA„¡*‚A"TA"H„ª B‰PAˆ ª‚ $BU¢gÆ ï“›Ÿö° yü(V3Ç>Ruã¼oÜɲþ Ú‰´•RÌÒ¿£àDz¸À8vÛûiGøÚÈv£A¹¨„4ÅqÎT6?`Kªy›ÉX’OtLÁ½õ‡°¬Â€ž¸e›I™›…jJ^îÏÞ¥±n‚û73sª+vçÖ©E»(—ÁÚ2¼Á‰¬?\· •ÝvÜŸí­[žÆôom!9#I>ˆß]K[ù^::ý÷nºí0Žø¹1ôR™^„¦û0×®³þ …º7ßÀ`¿áá=Uä¹$/1à®<ÌÀƒ¶•¼™ùkÂ÷ÙnÎìÿ1gÿT…|ÁNæ-Ò \üS²ç‚ã·?ÂòÖzÎYœÄ¬|‰ô¤‰5¯™·CÚx]¾û ÏÅ`.`껪¥/‘=:ï úÀ.x‰_õÓ¡Þ§DÜŠ—ÈLvÑrdÕïí¦Í›Mæ?l&z"4ãis@K|þ:âc¿Â1iGxX©žêòm³™>'š^¬àšE%sM¨ÔQûtÕìÇvÆFP½†…[ é:°VÏÐÚ‹^%ÿ)+Ÿýê;)ø–—˧¦ôt& ¥†€ë8¶#‡èõƒvåûdO9ÂåÁ<’gé‘dºÏíÇViEñÍ}äÎ(§òׇé‡$³´HOsé.:|¨OZÍüí…t³ Y¼ ÍT ²ÚþøW]~˜óËÌ.ŸÖ”cD1|­G¹tâý³~ÂÒ51|þ_»p(73ïÅb‚ÇÖs©ilïIf\Eb°’³CË•kX¸­îUh QkvWÒòÇRœ«™_¼ßï¿Í>Ü‚–k`èü5¶Ë8þTÎÕ:A€‡ho)"S— 8Qé Gqºûh,§{`Úûîúik Þ"w±‚/Q0»‚óo—Ò;ÍLúʵ$ÎÐ"ûƒ·õeGðú™é+·‘œžŠn+ퟔÒêÈeÞ‹ÅÄÊ ¶øCt[9_ë¹ëu†»‚Ë(§£-´žÿÌQº–¼ŒF'K‡D3-e{q:ü€ƒŽŠr’6å¡ÕBïÐJ¦+bÞ³kˆÿµZZþøN¡aûÊA.üçA4k–|ûCâK±«¸ë9c¤¡^¬ðP<2=ÕåÛf“¹,Ö3]ß(~óÌ:ÜG~„å?ÖsúX-ÒÒfM¤#µCbÖ_m¥rÿzc‹HŸêQÝ ú‘ec…ÓoŸÊªPäï$=]ÂkµÐŸhfzØäUtf.2»§/lX_†ùZZ³•ê}ÛiîÉ"­ÀúІêOÒçü;›8u`½‰0¡© ÷€‰Ä¹ê‘ædéyÄVÓi¿}8ª•EÐQGïð‚ˆœD#¶IDAT/ý1dû¡­TîÝN³7—¬gŠPúÊélŠ">Û<Ú€ÒLü '®‹6íe\T$$C‰É}tÙ­ô4Y &0]§™„2½©wëÝÀkÙNƒüç_Áòv)½˜µ¦˜XϻԖ~ËÁ=¸5EÌ_™‡ r¶‘™t…K×cykçÏAÒ3Ñ˸øáQ|X¹\ú½{*€Ÿ~Ûá‘@E®EóÔjbå6º® …è‰Whm ;·Sc‚|#‡¥%1g&®£?âÔÛ¿ }0't>ÇìÇÕ^¡s\Ǿw*<2‰PÔË'¯ñéÁ–‰o¨ˆBÆ >À¿ýçßÜŠÝ5Áíev:OÕ„†KþºÚý¨â £ï÷VsÅú"]GèìPŸnw9.—]öð:&ôjºê+3=÷ õ!Ñm=êuááš½™Ö€b¤~UÖPý>+W/9P¤æ£ÂÊÕ1sV E$â2sØÊðÜ6¨E«¦ß}ûœf÷…ãû>[C 1—X¥g]5¤04Αsˆé²Ðv\ò/³lLJä°ìââ¥Pº.í¡¾^Ïìõï³ì_>äé5&¼e¯qõ«t­’V“o¥åÏU øWþ·‚`f!q2x2J Á~_ø!ØGÿ¹W¨ÜûÆÎÁÄ%|ûC–•`a¾šö~ÁÕž;¬¤0‘±ÂLàô¡Ñ‘½çþ›kî>‚6®|V9t>¿z-£é¡ÿÃõ“½Ÿß߯ޣ47þœÌMï“ä°Òe¯ÂYWw¢ƒ¾°uƒ7A&]Ðã¤äE¾~äj-PCG”ÜB4–f¼IyÄKµ\n¼¥ø õáÁ×Öfx2jôNp…õ„ÀwÃSµL<Örús ˜>õWúrˆOëÃõ[ëö¡E®€ÀÀ­©æÁw=lß=.|˜¦ê ¾Lb–škuiÂ{±tÌ|l ¡”Óí:”I¤¼Œ)°kå‚ÌÍtòù{»èpûQ¦®cî³?'½çÇ49&ð£Î˜ÒuH²\æþËïnyÃb*\»pˆvc ‹·-¡·ÅJW“…Žz+þÕëŸì ¦FÏÔŒ"Rþáe‚ìàŠ;l…ifŒÏo!º}ç-¶°7<ôw…}X=Ýø‡Ï§ðX™”P}þµù\·÷ñIéØÐ| @À‰óØV®Çå’0{ ±ó¶ût!—½‹Ž;ÎÖGÝiá]É`¤÷){B‚`è‹ï¯¯ {yú¤ýÈæä!³•rý¶/ë×_ߘZe@à nÂPoºÝ\=WÜùÄ÷Y¨i¿ßÃÿ-!càM+ Î1#ÿt†f:ßòk¼ÏI¿ÏI¿ËJ¿2‹§óV£ª+#a ß¹­t¸B!>дGËï˜m¢ÉQsÿ=há›ãÍ!VÑxp=Žd3ñé9ļLò‚ÃÔ:v³¼?Á¼7xÛ@÷>i‹r¹r"T·L·ÓóEpn7g+­·ÿ`¼õåðù'“2üï¸ØCæò–ÏYöà ÈÔHJ‰Àõ:ªK¹xðg´ô™HÌÔÃM?A¢=9ººbÚ}>Ác@5òB‹"|Þ¡ðð•ÓiWo\CÂl Wýáë®O®CÖÓQLÓÁnBÓºN:êmh2 ™1'ߥ²q‚ÄCÀrå­û֢ЕF_NÓ#áÁ?ô¼Nïy ý3óÐgçÝaÁ9´&%T?=ØÂå“×F‚5" H9ÿJþ?n#!.ôƒŒ<΄FíÇ×럃þ=1©Cs¤ÚÕÌHSߥµ;På03Lj\.!¥®%qº·mxHçÇy¡ùSkI¢‚޶ÐRyú:ŒËÌH“Q_Ѐ®`*IB¦53+K·±bä‰]ݺçHK÷ÐYï§‘аTëCÿ~¢ço&nšR3ç o«âÚpãîã¸Ü&Ò–é¾X6"Þ6;²Ì ˜PMÓ£J)bvN¾¦úqpÝîDóÔôñj@BJÙˆ!µ®Æ†‰räÑ$¥YçqÚ]i¾µR…ýÊcÑ߯FBBÿÌ>?3ôJCŠ ‹þ`ÐOŠx5rIºÇ^xœ~bóK˜™š†4Í@ôS%$ÏìÃÝÔh™¾rš¶hnDšªùO>2ô½ ü|æ=Ÿaç=EŒ¹â^u݃”ËÌU[Ð‡Ý 4 Š1.{¸Uk&}UÚÜ•0jÒæT‡Ã3syÀ*€ÿÌê§“ò²”ìsÐ]û6?`¥µ¬ŒyË_%—@w-Íg­èž’xb¢;h+Ç»‘Üm©H~]–ÝØÃ³©©w €˜†r¼C‹¢ty$fZ¹z²ï×]ß`5s6mF%õÑß´ŸK§Ã ô•Óiß@Œº"ôèÎ8<­ ÈÌÙDS1ú:­.Ÿ?ÀÜhð_«¤þããa=°PO8åo¼¸Fç ƒö½œÿÓf2ž.!w¹šà.z/ïá‚%4Ÿëµ¼B=Hyþ—d*£xítýù46Ýû×O]¾g7°äŸ²hØ÷­Çö _±–ù?Ü€ìKýmåÔ=‚pžx Ū ˜6¯EzüÝ6\ÇöÐ1 TÑÙVHÊ ¿$¦rg«ïþÇ^ËÏ©g3É«^&EE 7¬nÉŒn–„D1OÇnçþÃw¸Ø"!ÃE{‹¤qÏç0Î Í薾Βäw9ýÑqîs¦yT”øl3Þúý#Ÿ¿rÖ ©Ãvn¨s 6¢Ë6â³Æó•w$„{"11ñËÉÜá76¦Ü߯üAôŠ,œú'_6þJêÕÌß²š®w·se² œÐ3‰fm|èÚ­X/Ü¥@y.s~XBðÄ&lMþПU¾ø½ïÝýI…è0)ösêãª8ᾤ³tÍêÇGƒÁ@kkëä?RõéÁ–G>PïI&!S™ùwëÐØÓñÈ]Ý2…mA ÉS*h­¿GZªèòo}nr¼æÕ(3Š1f÷á¨*áú#U•R·±tÍ'¨ÿ¸âÑû³@É̼âbbnXi9ò½(pàÌšÓ^gn~5gﶦž™/ì#MëÀõçÝ´ºï¶îýÈø­ݸW¤‹¶¶Ó:ág|'N¹øU}#uüšßÁrì.#–ÉU@ö—à«ÝÅé1m ‚Iþ ‚ <ŽÚð_áq&BU!‚D¨ ‚ DUA„¡*‚A"TA"H„ª B‰PAˆ ª‚ $BU!‚D¨ ‚ DUA„¡*‚A"TA"H„ª B‰PAˆ ª‚ $BU!‚D¨ ‚ DUA„¡*‚A"TA"H„ª0DÏŒÞ'7?-²Í¦ÿ„‚’ÄE¶Õ‡ÀDÆÖß1oÞ$îR±šù;ö‘ª›Ä} L„ª€rQ iŠãÔW6?`KZ´‹V WÖøâÍÌLÕ?ì*„¯‰¸ô璼Ā»ò0hË`.`ª<…=ž4óÖbHÝÏÇÕ#ué/ß6›és¢ùàÅÚ n!¡YT‚1ׄJE°ÏAWÍ~lglÕkX¸µ®Ûiõ ­½èUòŸ²òÙ¯1±“‚oy¹|j IOg¢Pj¸Žc;rˆ^?hW¾Oö”#\Ì#y–Iæ¡ûÜ~l•VßÜGîŒr*}ÿp)ÉÅ,-ÒÓ\º‹_ê“V3{!ÝÇ,h¯B3Uƒl ¶?¾ÆU—æ¼Ä2³‡Ë§5$åQL_ëQ.8Bÿ¬Ÿ°tM Ÿÿ×.œÃÊÍÌ{±˜à±õ\j©™q‰ÁJÎ6-W®aá¶BºOT¡YT€F­!Ø]IËKq¬f~ñ:|¿ÿ>6ûp Zf¬=€Áõ^ÓóÄÊ ¶øCt[9ß|9ˆd,fár3å ¾+DZ gP£Yô2ä Ñ€¿»÷©Rš€žYë÷}i7½ÉëÐŪ‘äÜ{°]tLì ÉØÂœef¢££tYiÿ¤”Ö–Ð —RÖ‘a. F«…~Ýuïb«¬! Ó£_ùSR2 HîêãÇ´¬&zÑ62rsP)ñw7ã²”bor†NwÊ:æ,/$:F‹ì¦oãQl:Žlé[ä.ÖCð% fŸÆ9°mëϨ>iiYUð‹S«¨ügìÁÈÓ˜¾b É©H²>|5´•¿ƒóúØÏSx¸™žêòm³É\–@ë™®‰o¿Žyfî#?Âòë9}¬ii ³&Ò ‚ÚŒ!±믶R¹½±E¤Ï ËnýÈ2 ‰±¿Âé·¿OåGU(òw’ž.áµZèO43];Ú\tf.2»§/lX_†ùZZ³•ê}ÛiîÉ"­ÀúІêOÒçü;›8u`½‰0¡© ÷€‰Ä¹ê‘ædéyÄVÓi¿ý ¨•EÐQGïð‚/ý1dû¡­TîÝN³7—¬gŠPúÊélŠ">Û<Ú€ÒLü '.ëÿåâ‡Gñaåré÷8_; Oä”a§ñ½õœz÷]úGϳ|N —êèúÓvN½õ#¬ÕÝįù9©‰C§ˆÉ)$ðÉNïßDíéAt+¾KØ©ßÔ5Ìûvþª]T–nÅZ'aøûôÊ¡÷¾³Ù…=Tï]Oõ±rd9/aZl@Êù)Y©Z­Çr`7nÝjtÊѦeé?À´DMç‘­XÞÚÄ…SNâ×¼ÄL-€‰ôgžƒ »¨|ë;œ:ø½º sôx-Ûi°ƒÿü+XÞþwZêl(² ‰iÙ€>Ã@o}9·~RÑË~Êì8—®Ç²wŸ;ÓÈüÎ1Õòˆy$>Žá@½|òŸl™ø†Š(d èüøÛqþÍ­Ø]Ü^f§óÔPÏÄ_CW»UœaôýÞj®ØBÁt¡³CM|º Üå¸\tÙÃ?ê˜Ðg¨éª¯Û›yÐúè¶ÂëðpÍÞŒLk@1R¿ƒÎ*k¨~Ÿ•«—(RóQaåjƒ‡˜9+††"q™9lex‚·îC‹*VM¿ûö¹Ôî ‡G÷}¶†@b.±J?κjH/ ahœ#7æÓe¡s¼ã’;éüËq¼~‚ž2\m g5 ¦\ÑÚæ!ì£ÿÒAÚ;õ$Î3l°ŸàêPol ÉŠ/j*õ8û £Ì.$Ú]NK]3Ÿï™RêË,ôɆÞë>Îççl~G°×;‰žcF‰–c¾†Ã¡^ ßÁµ“åxG¾-úœüÞåj§‚~ßÅá0˜25²¨A‚_ô BðF Mï}³gœ·Õ误 [>yøã0cÃuñÖuó˜aÒÐyê ½7üðà9y·ÚÌôd„GÈCþ‡ê'{?¿¿Ginü9™›Þ'Éa¥Ë^…³®ïD'|aëo‚L5º ÇIÿÈ‹>|7üÈÕZ †Ž:)¹…h,Íx“òˆ—j¹ÜxKßâAëï'¬ÍðdÔè0àÂ×7ú¶ï†¦j™x¬åôç0}ê®ôåŸÖ‡ë·Ö;ìC‹\[†šxð…+{\ø0!M%Ô|™Ä,5×ê !Ó„÷béøó±·Ô¼é:ÏzTÓÀ×>”³­B)íï {?à'ˆ„lW®jšzau9ñÔ…Â*nš<®15û<.ÈÖ£@‹B¾ž°»Ä€ƒþ/†¿0T1 šõ:Ë–ŒÝg°_ÁZZÿ·™ù»üÅ6ºìµ¸ëʸ~½ÛøÊélÚÀìì<ÛªPf塺rçŒÞ=µ…\MtÑïHº¥‰®h në× ˤ„êó¯Í纽OJdžæ*NœÇ¶r=.—„ÙKˆ·…ܧ ¹üë]tî´~ÔÞ• FzŸ²'$†.^}ÝË‹Ð'íG6'™­”ë·õ¿þúÆÔ*_p†zÓEèæê¹âÎ'¾ÏBMûý6þo ƒoXéhð°pŽùç 34Óyüö^ØW'E®)ÙWi+ꎡ- ;Á/¡÷äVΞ¾óq÷ŸÙEåÅ4âŒyħ¯bî†çpÿa—l·Þ¼B=ÿÙÏš‰“ÙÑdèp×Tpûå1xhûõ&ì_á„I3)ÃÿŽ‹=d.O`yñì‘e¨€L¤”\¯¡£º”‹FKŸ‰ÄL=Üô$ Ù“£«+¦Mh&nTŒÕÈ -Šhðy‡¾D¾r:íjâkH˜-᪯™üúä:TS÷×ÁnBÓºN:êmh2 ™1'ߥ²°^w8È•·î[‹*6,¦é‘ðà¿zÙ{ÞBÿÌ<ôÙyDwXpÞ¸¿Òª±¿1aS.èQiÁ×}å«48F´áŸ¡ž¸%ëHˆƒ~´:¦ICS=Wè£_ßÐù¦NE1rÏsàëUBê˜ýɧ釾Prµš¹~î¶¶rþè²óî\hSî@ñ ‰×ZqÙîУísâÔ¢‰Ÿ÷P#M›À<ˆ0©&%T?=ØÂå“×F‚5" H9ÿJþ?n#!.taÉãLhÔ~|½ð9èГ:ô…Õ®fFÚ}^€ªfæ‘Ë%¤Ôµ$N÷à¶ ÿJëÇy¡ùSkI¢‚޶ÐRyú:ŒËÌH“Q_Ѐ®`*IB¦53+K·±bd 诫 [÷ié:ëÇûµÜCWªø[ú÷=3qÓ$Ò˜±8y[׆wÇå6‘¶ÔH÷ŲўՠŸ :ñjäÒ½z‰}8/T!›·Ž™-2™ÕSHŠwÒyÑvmïm ®œÞ˜BÒ™”Z49›ÉÊ7"÷…ÞëŽ.$mAr™„<©ˆÔ¹jºë,øqrÝî@‘UÄt™2éß4£9H?ÎZ d®#=] )y¦ÿFz2¿Ž…[^%=UêÝ*hÔ#ÓÁÈ£ HJõÐÐJGCº‚çP4•s펣˜*®Ö9‰ÍÿAèz’©Ñ,*añÆÆ;ÍR.3WmAv¿Ô,(ƸÀ8º@k&}UÚþ7isªÃᙹ<àÀfõS‹IyáYJö9è®}F›°ÒZVƼ寒¿ÀK »–æ³VtOI<1Ñ´•ãŽÝHî¶T$¿‹.ËnìáÙÔT;P@LC9Þ¡EQº<3­\=Y÷ë®o°šN‡‰9›6£’úèoÚÏ¥ÓaúÊé´o F]óÖQgOk2s6ÑTŒ>€‡N«‹Äç07ü×*©ÿøxذ4ÔNù/®†°žÕõ*:Û Iyá—ÄTîâ¬ûíÅSBÆ·÷‘2eWí¿ÿ?´NøÇ¼»¸q„‹ÇtÌY¶“%æ(ÝVÿ³‡Ž>€ã\:¦Ç¸ìeò¿Eð†ƒ®ªWh¬ Dú+wsyZ )k0;àÂ}ê0í‰%¨žÍ_›þë©md¬x“¥k xÃŽû/¯ÐÔpˆ‹e*2 _gi´xí`­Íi{êÊð=»%ÿ”Eþ7¸„^«ÿÂBº/V{8½'_ãrÔÒÖ`î“às×ÒöÛ½£7º[EˆÏ6ã­ß?òù+g­ ‘:lç†nZj#ºl#>Ëa*õ1ðЩú«”º¥k–è8AýÇwú¥ö!“ÌÌ+.&憕–#ïÐ;Îì¡9íuææWQsönkê™ùÂ>Ò´\ÞMë=†÷_›¤,þîª1Oᯠn_é]zñÍÒ7É]¨Á[_е6’OPˤÿAGmø/‚ð8¡*‚A"TA"H„ª B‰PAˆ ª‚ $BU!‚D¨ ‚ DUA„¡*‚ArƒÁpïµA„ ‘·¶¶>ìAþêÍš5 ÃA„ˆ¡*‚A"TA"H„ª B‰PAˆ ª‚ ôÿ%ˆKSS(­IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/logger.rst0000644000175100001710000000732500000000000020464 0ustar00vstsdocker.. _dev_logger: ********************************* Logging, Warnings, and Exceptions ********************************* Overview ======== sunpy makes use of a logging system to deal with messages (see :ref:`logger`). This provides the users and developers the ability to decide which messages to show, to capture them, and to optionally also send them to a file. The logger will log all messages issued directly to it but also warnings issued through `warnings.warn` as well as exceptions. The logger is configured as soon as sunpy is imported. You can access it by importing it explicitly:: from sunpy import log Messages can be issued directly to it with the following levels and in the following way:: log.debug("Detailed information, typically of interest only when diagnosing problems.") log.info("A message conveying information about the current task, and confirming that things are working as expected.") log.warning("An indication that something unexpected happened, or indicative of some problem in the near future (e.g. disk space low). The software is still working as expected.") log.error("Due to a more serious problem, the software has not been able to perform some function but the task is still continuing.") log.critical("A serious error, indicating that the program itself may be unable to continue running. A real error may soon by issued and the task will fail.") The difference between logging a warning/error/critical compared to issuing a Python warning or raising an exception are subtle but important. Use Python `warnings.warn` in library code if the issue is avoidable and the user code should be modified to eliminate the warning. Use ``log.warning()`` if there is likely nothing the user can do about the situation, but the event should still be noted. An example of this might be if the input data are all zeros. This may be unavoidable or even by design but you may want to let the user know. True exceptions (not ``log.error()``) should be raised only when there is no way for the function to proceed. Regardless of the type (log message or warning or exception) messages should be one or two complete sentences that fully describe the issue and end with a period. Issuing Warnings ================ sunpy warnings are provided by the `sunpy.util` module. The primary warning which should be used is `sunpy.util.exceptions.SunpyUserWarning`. For deprecation use `sunpy.util.exceptions.SunpyDeprecationWarning` or `sunpy.util.exceptions.SunpyPendingDeprecationWarning`. These three warning types have corresponding functions to raise them:: >>> from sunpy.util.exceptions import warn_user >>> from sunpy.util.exceptions import warn_deprecated >>> from sunpy.util.exceptions import warn_metadata These warning functions must be used to interact correctly with the logging system. A warning can be issued in the following way:: >>> from sunpy.util.exceptions import warn_user >>> warn_user("You have been warned about something you did not do correctly.") # doctest: +IGNORE_WARNINGS See the section above for a discussion about the distinction between ``log.warn()`` and raising a warning. Raising Exceptions ================== Raising errors causes the program to halt. Likely the primary error that a sunpy developer will want to use is * ValueError: should be raised if the input is not what was expected and could not be used. Functions should not return anything (like None) in that case or issue a warning. Exceptions are raised simply with:: >>> raise ValueError("The following error occurred.") #doctest: +SKIP For more information on exceptions see the :ref:`python:bltin-exceptions` documentation. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/maintainer_workflow.rst0000644000175100001710000002327400000000000023267 0ustar00vstsdocker.. _maintainer-workflow: ************************ Workflow for Maintainers ************************ This page is for maintainers who can merge our own or other peoples' changes into the upstream repository. Seeing as how you're a maintainer, you should be completely on top of the basic git workflow in :ref:`newcomers` and Astropy's `git workflow`_. .. _git workflow: https://docs.astropy.org/en/stable/development/workflow/development_workflow.html#development-workflow Integrating changes via the web interface (recommended) ======================================================= Whenever possible, merge pull requests automatically via the pull request manager on GitHub. Merging should only be done manually if there is a really good reason to do this! Make sure that pull requests do not contain a messy history with merges, etc. If this is the case, then follow the manual instructions, and make sure the fork is rebased to tidy the history before committing. Integrating changes manually ============================ First, check out the "sunpy" repository. Being a maintainer, you've got read-write access. It's good to have your upstream remote have a scary name, to remind you that it's a read-write remote:: $ git remote add upstream-rw git@github.com:sunpy/sunpy.git $ git fetch upstream-rw Let's say you have some changes that need to go into trunk (``upstream-rw/main``). The changes are in some branch that you are currently on. For example, you are looking at someone's changes like this:: $ git remote add someone git://github.com/someone/sunpy.git $ git fetch someone $ git branch cool-feature --track someone/cool-feature $ git checkout cool-feature So now you are on the branch with the changes to be incorporated upstream. The rest of this section assumes you are on this branch. If you prefer not to add remotes, you can make git fetch all pull requests opened to Sunpy. Locate the section for your git remote in the ``.git/config`` file. It looks like this:: [remote "upstream"] url = git@github.com:sunpy/sunpy.git fetch = +refs/heads/*:refs/remotes/upstream/* Now add the line ``fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*`` to this section. It ends up looking like this:: [remote "upstream"] url = git@github.com:sunpy/sunpy.git fetch = +refs/heads/*:refs/remotes/upstream/* fetch = +refs/pull/*/head:refs/remotes/upstream/pr/* Now fetch all the pull requests:: $ git fetch upstream From github.com:sunpy/sunpy * [new ref] refs/pull/1000/head -> upstream/pr/1000 * [new ref] refs/pull/1002/head -> upstream/pr/1002 * [new ref] refs/pull/1004/head -> upstream/pr/1004 * [new ref] refs/pull/1009/head -> upstream/pr/1009 To check out a particular pull request:: $ git checkout pr/999 Branch pr/999 set up to track remote branch pr/999 from upstream. Switched to a new branch 'pr/999' When to remove or combine/squash commits ---------------------------------------- In all cases, be mindful of maintaining a welcoming environment and be helpful with advice, especially for new contributors. It is expected that a maintainer would offer to help a contributor who is a novice git user do any squashing that that maintainer asks for, or do the squash themselves by directly pushing to the PR branch. Pull requests **must** be rebased and at least partially squashed (but not necessarily squashed to a single commit) if large (approximately >10KB) non-source code files (e.g. images, data files, etc.) are added and then removed or modified in the PR commit history (The squashing should remove all but the last addition of the file to not use extra space in the repository). Combining/squashing commits is **encouraged** when the number of commits is excessive for the changes made. The definition of "excessive" is subjective, but in general one should attempt to have individual commits be units of change, and not include reversions. As a concrete example, for a change affecting < 50 lines of source code and including a changelog entry, more than a two commits would be excessive. For a larger pull request adding significant functionality, however, more commits may well be appropriate. As another guideline, squashing should remove extraneous information but should not be used to remove useful information for how a PR was developed. For example, 4 commits that are testing changes and have a commit message of just "debug" should be squashed. But a series of commit messages that are "Implemented feature X", "added test for feature X", "fixed bugs revealed by tests for feature X" are useful information and should not be squashed away without reason. When squashing, extra care should be taken to keep authorship credit to all individuals who provided substantial contribution to the given PR, e.g. only squash commits made by the same author. When to rebase -------------- Pull requests **must** be rebased (but not necessarily squashed to a single commit) if: * There are commit messages include offensive language or violate the code of conduct (in this case the rebase must also edit the commit messages) Pull requests **may** be rebased (either manually or with the rebase and merge button) if: * There are conflicts with main * There are merge commits from upstream/main in the PR commit history (merge commits from PRs to the user's fork are fine) Asking contributors who are new to the project or inexperienced with using git is **discouraged**, as is maintainers rebasing these PRs before merge time, as this requires resetting of local git checkouts. A few commits ------------- If there are only a few commits, consider rebasing to upstream:: # Fetch upstream changes $ git fetch upstream-rw # Rebase $ git rebase upstream-rw/main A long series of commits ------------------------ If there are a longer series of related commits, consider a merge instead:: $ git fetch upstream-rw $ git merge --no-ff upstream-rw/main Note the ``--no-ff`` above. This forces git to make a merge commit, rather than doing a fast-forward, so that these set of commits branch off trunk then rejoin the main history with a merge, rather than appearing to have been made directly on top of trunk. Check the history ----------------- Now, in either case, you should check that the history is sensible and you have the right commits:: $ git log --oneline --graph $ git log -p upstream-rw/main.. The first line above just shows the history in a compact way, with a text representation of the history graph. The second line shows the log of commits excluding those that can be reached from trunk (``upstream-rw/main``), and including those that can be reached from current HEAD (implied with the ``..`` at the end). So, it shows the commits unique to this branch compared to trunk. The ``-p`` option shows the diff for these commits in patch form. Push to open pull request ------------------------- Now you need to push the changes you have made to the code to the open pull request:: $ git push git@github.com:/sunpy.git HEAD: You might have to add ``--force`` if you rebased instead of adding new commits. Using Milestones and Labels =========================== Current milestone guidelines: * Only confirmed issues or pull requests that are release critical or for some other reason should be addressed before a release, should have a milestone. When in doubt about which milestone to use for an issue, do not use a milestone and ask other the maintainers. Current labelling guidelines: * Issues that require fixing in main, but that also are confirmed to apply to supported stable version lines should be marked with a "Affects Release" label. * All open issues should have a "Priority ", "Effort " and "Package ", if you are unsure at what level, pick higher ones just to be safe. If an issue is more of a question or discussion, you can omit these labels. * If an issue looks to be straightforward, you should add the "Good first issue" and "Hacktoberfest" label. * For other labels, you should add them if they fit, like if an issue affects the net submodule, add the "net" label or if it is a feature request etc. Using Projects ============== Projects allow us to layout current pull requests and issues in a manner that enables a more "meta" view regarding major releases. We categorize pull requests and issues into several levels of priorities and whether these can be classed as blockers before a release can be attempted. Further we can add general notes that someone deems important for a release. Updating and Maintaining the Changelog ====================================== The changelog will be read by users, so this description should be aimed at sunpy users instead of describing internal changes which are only relevant to the developers. The current changelog is kept in the file "CHANGELOG.rst" at the root of the repository. You do not need to update this file as we use `towncrier`_ to update our changelog. This is built and embedded into our documentation. Towncrier will automatically reflow your text, so it will work best if you stick to a single paragraph, but multiple sentences and links are OK and encouraged. You can install towncrier and then run ``towncrier --draft`` if you want to get a preview of how your change will look in the final release notes. `Instructions on how to write a changelog. `__. .. _towncrier: https://pypi.org/project/towncrier/ Releasing sunpy =============== We have a `step by step checklist`_ on the SunPy Wiki on how to release the sunpy core package. .. _step by step checklist: https://github.com/sunpy/sunpy/wiki/Home%3A-Release-Checklist ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/new_objects.rst0000644000175100001710000000677400000000000021516 0ustar00vstsdocker.. _new_maps_ts_etc: ************************************************ Creating new sunpy Subclasses (Maps, TimeSeries) ************************************************ Writing a new Instrument Map Class ================================== All instrument Map classes are subclasses of the generic `~sunpy.map.GenericMap` subclass. `~sunpy.map.GenericMap` expects to be provided the data array and a header dictionary and will parse the header metadata to the best of its ability based on common standards. The instrument subclass implements the instrument-specific code to parse the metadata, apply any necessary procedures on the data array, as well as defining other things such what color tables to use. In practice, the instrument subclass is not directly accessed by users. The `~sunpy.map.Map` factory is the primary interface for creating Map objects. Any subclass of `~sunpy.map.GenericMap` which defines a method named ``is_datasource_for()`` will automatically be registered with the `~sunpy.map.Map` factory. The ``is_datasource_for`` method is used by the `~sunpy.map.Map` factory to check if a file should use a particular instrument Map class. This function can run any test it needs to determine this. For example, it might check the value of the ``INSTRUMENT`` key in the metadata dictionary. The following example shows how this works and includes a sample doc string that is compatible with the :ref:`Docs Guidelines for Data Sources`. .. code-block:: python import sunpy.map class NextGenerationTelescopeMap(sunpy.map.GenericMap): "NextGenerationTelescope Map. The Next Generation Telescope is a type A telescope on board the XYZ mission. It operates in low Earth orbit with an altitude of 600 kmn and an inclination of 28.5 degrees. It is designed to observe the aliens on the Sun that are responsible for triggering the impulsive release of magnetic energy in the solar corona. It observes in the following 3 different passband in visible light, wavelength A, wavelength B, wavelength C. The primary emission processes in these passbands are process A and process B. The focal plane consists of a MAGIC detector with 2 x 2 pixels. The plate scale is 500 arcsec per pixel. The field of view is the whole Sun (1000 x 1000 arsec). It makes images in each passband every 10 minutes except for when it is in eclipse which occurs every approximately 30 minutes. It began operating on 2100 November 1. Notes ----- Due to rise of our new insect overlords, the telescope was not operational from 2200 Jan to 2300 Jan. References ---------- * List of all required references " def __init__(self, data, header, **kwargs): # will process the header according to common standards super(FutureMap, self).__init__(data, header, **kwargs) # Any NextGenerationTelescope Instrument-specific manipulation. # This typically involves editing the `self.meta` attribute. # used by the Map factory to determine if this subclass should be used @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if data, header corresponds to a NextGenerationTelescope image""" # returns True only if this is data and header from NextGenerationTelescope return header.get('instrume', '').startswith('NextGenerationTelescope') Writing a new Instrument TimeSeries Class ========================================= To be written. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/newcomers.rst0000644000175100001710000003602700000000000021210 0ustar00vstsdocker.. _newcomers: **************** Newcomers' Guide **************** Welcome to the SunPy newcomers' guide. If you have come across this page, you just might be new to the SunPy project. We aim to be a comprehensive Python package that allows solar physicists to deep dive in the vast amount of solar data available. Firstly, we want to thank you for your interest in contributing to SunPy! SunPy is an open project that encourages everyone to contribute in any way possible. The people who help develop or contribute to SunPy are varied in ability and experience with the vast majority being volunteers who dedicate time each week. We pride ourselves on being a welcoming community and we would love to have you become a part of our community. Although this document mainly focuses on how to make contributions to the core sunpy libraries code and documentation, there are other ways to get involved with the SunPy community. If you have any questions, comments or just want to say hello, we have online chat on `Matrix`_ which requires no registration or a `Google Group`_ which you message. .. _Matrix: https://openastronomy.element.io/#/room/#sunpy:openastronomy.org .. _Google Group: https://groups.google.com/forum/#!forum/sunpy How to Contribute to sunpy ========================== Not Code -------- A common misconception (which applies to any package) is that all we really want is some Python code, in fact, we do not require only code contributions! If you do not have the time or the desire to code, we have severals of areas where we can use help. Reporting Issues ^^^^^^^^^^^^^^^^ If you use sunpy and stumble upon a problem, the best way to report it is by opening an `issue`_ on our GitHub issue tracker. This way we can help you work around the problem and hopefully fix the problem! You will need to sign into `GitHub`_ to report an issue and if you are not already a member of Github, you will have to join. Joining GitHub will make it easier to report and track issues in the future. If you do not want to join Github, then another way to report your issue is email the SunPy developers list `sunpy-dev@googlegroups.com`_. When reporting an issue, please try to provide a short description of the issue with a small code sample, this way we can attempt to reproduce the error. Also provide any error output generated when you encountered the issue, we can use this information to debug the issue. For a good example of how to do this see issue `#2879`_. If there is functionality that is not currently available in sunpy you can make a feature request. Please write as much information as possible regarding the feature you would like to see in sunpy. When you go to open either an issue or a feature request, there is a GitHub template that will guide you on the type of information we are seeking. Please be sure to read over the comments in the GitHub text box. .. _issue: https://github.com/sunpy/sunpy/issues .. _sunpy-dev@googlegroups.com: https://groups.google.com/forum/#!forum/sunpy-dev .. _#2879: https://github.com/sunpy/sunpy/issues/2879 Documentation ^^^^^^^^^^^^^ sunpy has `online documentation`_ and we try to make sure its as comprehensive as possible. This documentation contains the API of sunpy but also a user guide, an example gallery and developer documents. However, documentation for any project is a living document. It is never complete and there are always areas that could be expanded upon or could do with proof reading to check if the text is easy to follow and understandable. If parts are confusing or difficult to follow, we would love suggestions or improvements! .. _online documentation: https://docs.sunpy.org/en/latest/index.html Reviewing a Pull Request ^^^^^^^^^^^^^^^^^^^^^^^^ We at any one time have a variety of `pull requests`_ open and getting reviews is important. Generally the more people that can look over a pull request the better it will turn out and we encourage everyone to do so. .. _pull requests: https://github.com/sunpy/sunpy/pulls Code ---- If you would prefer to code instead, the best way to start is to work on an exisiting and known `issues`_. We have several repositories you can investigate. The main one is the sunpy repository with where all the known `issues`_ with sunpy are detailed. Each issue should have a series of labels that provide information about the nature of the issue. If you find an issue you'd like to work on, please make sure to add a comment to let people know that you are working on it! This will make it less likely that effort is duplicated. .. note:: sunpy is Free and open-source software (FOSS), under the BSD-2 license. By contributing you are stating that you have the right to and agree to have your work distributed under the terms of this license. This applies to everyone who wants to contribute during work time no matter who their employer is. You should start by checking if there is a Open Source Software Policy (e.g., `Standford's policy `__) for your work place. If not, `OSS-Watch `__ summaries what you will need to check and who to ask, however this resource is aimed at a UK readers. As an example, `Standford's guidance `__ allows someone to contribute and open source their code. If you are unsure if your university or institution allows you to contribute under the BSD-2 license, you should contact the relevant department or administrator that deals with copyright at your institution. If you are unsure where to start we suggest the `Good First Issue label`_. These are issues that have been deemed a good way to be eased into sunpy and are achievable with little understanding of the sunpy codebase. Please be aware that this does not mean the issue is "easy", just that you do not need to be aware of the underlying structure of sunpy. We also tag issues for specific events such as `Hacktoberfest`_ under the `Hacktoberfest label`_. The scope of the issues should be appropriate for that specific event. We do particpate in several other events but right now we do not have dedicated labels. So please use the above labels for starting issues! In addition, we have several other repositories that have open issues and you might find these more interesting than the main repository. Python: * `ndcube `_ * `drms `_ * `radiospectra `_ * `ablog `_ * `irispy `_ * `sunkit-image `_ CSS/HTML: * `sunpy-sphinx-theme `_ * `sunpy.org `_ .. _issues: https://github.com/sunpy/sunpy/issues .. _Good First Issue label: https://github.com/sunpy/sunpy/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+label%3A%22Good+First+Issue%22 .. _Hacktoberfest: https://hacktoberfest.digitalocean.com/ .. _Hacktoberfest label: https://github.com/sunpy/sunpy/issues?q=is%3Aissue+is%3Aopen+label%3AHacktoberfest If you already have code that you've developed or already have your own idea of code you'd like to work on please first have a look at the issue list to see if any existing issues are related to your idea. If you find nothing then create your own issue to stimulate the addition of your code and make sure to let people know about it chat room or by email. Creating an issue creates a permanent record. It may be possible your idea may be outside of the scope of the repository you are trying to contribute to and the issue comments are a great place to have that discussion where potential future contributors can also see. Setting up a development environment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The instructions in this following section are based upon three resources: * `Astropy Dev Workflow `_ * `Astropy Dev environment `_ * `Astropy Pull Request Example `_ **We strongly recommend that you read these links.** These links are more in-depth than this guide but you will need to replace ``astropy`` with ``sunpy``. In order to start coding you will need a local Python environment and we would recommend using `Anaconda`_ or `miniconda`_ (shortened to conda from here on). This method will bypass your operating system Python packages and makes the entire process easier. The first step is to install the version of conda that corresponds to your operating system and `instructions are here`_. Next we will want to setup the conda environment and we will need to add the `conda-forge`_ channel as a prerequisite: .. code:: bash $ conda config --add channels conda-forge $ conda create -n sunpy-dev pip $ conda activate sunpy-dev This will create a new conda environment called "sunpy-dev" and install the latest version of pip from the conda-forge channel. The next step is get a developement version of sunpy. This will require that `git`_ be installed. If you have a `GitHub`_ account, we suggest that you `fork`_ the `sunpy repository`_ (the fork button is to the top right) and **use that url for the clone step**. This will make submitting changes easier in the long term for you: .. warning:: Do not clone the sunpy repository into ``$HOME/sunpy``. Depending on the operating system this location is used to store downloaded data files. This will cause conflicts later on, so the last argument (``sunpy-git``) on the ``git clone`` line will become the local folder name of the cloned repository. Otherwise you are free to clone to any other location. .. code:: bash $ git clone https://github.com//sunpy.git sunpy-git $ cd sunpy-git $ pip install -e .[dev] .. note:: If this does not work, it could be due to a missing C compiler (e.g., ``gcc`` or ``clang``) that is required to build sunpy at install. Getting the compiler either from your system package manager, XCode or Anaconda should address this. Now you have the latest version of sunpy installed and are ready to work on it using your favorite editor! Ideally, when you start making changes you want to create a git branch: .. code:: bash $ git checkout -b my_fix You can change ``my_fix`` to anything you prefer. If you get stuck or want help, just `ask here`_! .. _Anaconda: https://www.anaconda.com/distribution/ .. _miniconda: https://conda.io/en/latest/miniconda.html .. _instructions are here: https://conda.io/projects/conda/en/latest/user-guide/install/index.html#installation .. _conda-forge: https://conda-forge.org/ .. _git: https://git-scm.com/book/en/v2/Getting-Started-Installing-Git .. _GitHub: https://github.com/ .. _fork: https://guides.github.com/activities/forking/ .. _sunpy repository: https://github.com/sunpy/sunpy .. _ask here: https://openastronomy.element.io/#/room/#sunpy:openastronomy.org Checking the code you have written ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Now that you have written some code to address an issue. You will need to check two things: 1. The changes you have made are correct, i.e., it fixes a bug or the feature works. This requires you to run the code either manually or by writting/running a test function. `pytest`_ is the framework we use for this. 2. The changes you have made follow the correct coding style. We follow the `PEP8`_ style for all Python code and depending on your setup, you can use a `linter program `_ to check your code. For documentation, we follow the `numpydoc style `_. We provide more more detail about our :ref:`test suite and how to write tests `, and how to :ref:`create and style documentation `. .. _pytest: https://docs.pytest.org/en/latest/ Send it back to us ^^^^^^^^^^^^^^^^^^ Once you have some changes you would like to submit, you will need to commit the changes. This is a three stage process: 1. Use ``git status`` to see that the only changes locally are the right ones. 2. Use ``git add `` to add the changes to ``git``. 3. Use ``git commit -m `` to label those changes. 4. Use ``git push`` to update your fork (copy) of sunpy on GitHub. Here you replace ```` with some text of the work you have done. We strongly recommend having a good commit message and this `commit guide`_ is worth reading. Next step is to open a pull request on GitHub. If you are new to pull requests, here is the `GitHub guide`_ that is a detailed walkthrough. Go to the "pull requests" tab on **your fork** and pressing the large green "New pull request" button. Now on the right side from the box marked "compare" you can select your branch. Do one final check to make sure the code changes look correct and then press the green "Create pull request" button. When you open your pull request, we have a GitHub template that will guide you on what to write in the message box. Please fill this in and title the pull request. Now the final step is to press the green "Create pull request" button. As soon as you do this, you will be greeted by a message from the "sunpy bot" as well as several continuous integration checks. These are explained on our :ref:`Pull Request Review ` page. But what is important to know is that these run a series of tests to make sure that the changes do not cause any new errors. We strongly recommend that any code changes you have had, follow the `PEP8`_ style and that you have ran the code locally to make sure any changes do not break any existing code. We provide an overview on how to run the test suite :ref:`here `. Now we (the sunpy community) can review the code and offer suggestions and once we are happy, we can merge in the pull request. If you do not have time to finish what you started on or ran out of time during a sprint and do not want to submit a pull request, you can create a git patch instead: .. code:: bash $ git format-patch main --stdout > my_fix.patch You can rename ``my_fix`` to something more relevant. This way, you still get acknowledged for the work you have achieved. Now you can email this patch to the `Google Group`_ . Just remember, if you have any problems get in touch! .. _commit guide: https://chris.beams.io/posts/git-commit/ .. _GitHub guide: https://guides.github.com/activities/hello-world/ .. _PEP8: https://realpython.com/python-pep8/ .. _Google Group: https://groups.google.com/forum/#!forum/sunpy Summer of Code(s) ^^^^^^^^^^^^^^^^^ If you are interested in a "Summer of Code" project with sunpy, we have information on our `wiki`_ which has guidelines, advice, application templates and more! Our projects are located on our umbrella's organization website, `OpenAstronomy`_. .. _wiki: https://github.com/sunpy/sunpy/wiki#summer-of-codes .. _OpenAstronomy: https://openastronomy.org/gsoc/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/pr_review_procedure.rst0000644000175100001710000002346500000000000023262 0ustar00vstsdocker.. _pr_review: ****************************** Pull Requests and GitHub Teams ****************************** This document describes the standards required for a pull request to sunpy and an explanation of our automated tests. Each pull request **must** meet the following criteria before it is considered for merge: * The code must be PEP 8 compliant and meet the ill-defined sunpy quality standards. We have these in the :ref:`coding-standards` page. * The PR must contain a changelog entry if it changes the behavior of any code. * The test coverage should not decrease, and for new features should be at or very close to 100%. * All code must be properly documented. Each function and each class must have an associated documentation string in the correct format. Review Process ============== Before the "merge" button is clicked the following criteria must be met: * All the continuous integration must pass unless there is a known issue. * At least two members (not the author of the PR) of the "sunpy-developers" group must have approved the PR, one should, ideally, be a relevant subpackage maintainer. * All comments posted on the thread must be resolved. It is important that approval for merging the PR is done on the comment thread, as this becomes part of the "permanent record", this includes in during community meetings or in chat. Continuous Integration ====================== Currently we have a variety of services that respond or activate on an opened pull request. Comments from bots: * `pep8speaks `_: Performs a PEP8 check on any submitted code. This is updated as the code changes. Checks that appear at the bottom of a pull request: .. image:: images/checks_pr.png :width: 600 :alt: PR checks or at the top under the "Checks" tab: .. image:: images/checks.png :width: 600 :alt: PR checks tab * `figure-tests (CircleCi) `_: Runs two figure tests environments ("py39-figure", "py38-figure-devdeps"). * figure_report/figure_tests (Giles): Show the final results of the figure tests. * figure_report_devdeps (Giles): Show the final results of the figure tests using development packages. * changelog: absent | found (Giles): If a changelog is needed, this will check and will pass if a changelog with the correct number is found. * `docs/readthedocs.org:sunpy (Read the Docs) `_: This builds our documentation. This primary check is to ensure the documentation has rendered correctly. Warnings are not checked on this build but under Azure Pipelines (see below). * `sunpy.sunpy (Azure Pipelines) `_: Runs our test suite on all three operating systems. There are 11 separate checks for this. * `codecov/patch (CodeCov) `_: Checks how many lines of the code lack test coverage for the submitted code in the pull request. * `codecov/project (CodeCov) `_: Checks how many lines of the code lack test coverage in sunpy overall. * `pre-commit - pr `__: Checks the code style checks have passed. This CI will automatically fix style issues by commenting ``pre-commit.ci autofix`` on its own line in a comment on the PR. It is common to see some of these checks fail. This can be happen due to a change that has broken a test (should be fixed) or a remote server has failed (might have to wait for it to come back). Therefore it is important to check why a task failed and if has a pre-existing issue, it can be safe to ignore a failing check on that pull request. However, you should try to ensure that as many checks pass before merging. Understanding Azure Pipelines ----------------------------- The vast majority of our tests are run on Azure Pipelines and this means you might have to navigate to the results if you want to check why the tests failed. The tests for Azure Pipelines are split into two phases to reduce the number of builds running at one time. If your PR fails the the linux offline tests or the "style_check" check the second stage tests will not run. The Azure checks on GitHub manifest: .. image:: images/azure_check_pr.png :width: 600 :alt: PR checks tab This is the main form. There will be one check per Azure job ran, and a summary one called "sunpy.sunpy". The details text will redirect you to the "Checks" tab. Doing so will show: .. image:: images/azure_summary_check.png :width: 600 :alt: Summary of Azure outputs on Checks tab You get some statistics that you don't need to worry about and then a series of boxes under the "ANNOTATIONS" heading. Unfortunately, when a Azure step fails you sometimes will get "Bash exited with code '1'." which means you have to go to the page to see what happened. If the failure is due to a test, you will get a selection of test outputs under this heading. On the left you should see the entire list of Azure checks. You can go to a failing check and you will see: .. image:: images/azure_goto.png :width: 600 :alt: Go to Azure Pipelines which will take you to the Azure Pipelines website. This will load up the following: .. image:: images/azure_steps_in_job.png :width: 600 :alt: Build steps in Azure Here you can see each step that is undertaken during a job on Azure. Normally the "Running tox" should be red if the tests have failed. You will need to click on this so it will load the output from the test suite. Our test suite is very verbose, so there will be a lot of text outputted. The important bits of information should be at the bottom as "pytest" prints out a test summary at the end. For example: .. code:: bash ============================================================================= short test summary info ============================================================================= SKIPPED [1] d:\a\1\s\.tox\py37\lib\site-packages\pytest_doctestplus\plugin.py:178: unable to import module local('d:\\a\\1\\s\\.tox\\py37\\lib\\site-packages\\sunpy\\io\\setup_package.py') SKIPPED [213] d:\a\1\s\.tox\py37\lib\site-packages\pytest_remotedata\plugin.py:87: need --remote-data option to run SKIPPED [18] d:\a\1\s\.tox\py37\lib\site-packages\_pytest\doctest.py:387: all tests skipped by +SKIP option SKIPPED [1] .tox\py37\lib\site-packages\sunpy\map\sources\tests\test_source_type.py:21: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\map\sources\tests\test_source_type.py:30: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_ana.py:22: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_ana.py:31: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_ana.py:40: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_ana.py:49: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_ana.py:58: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_ana.py:67: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_filetools.py:54: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_filetools.py:73: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_filetools.py:106: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_filetools.py:115: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_filetools.py:122: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_jp2.py:11: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_jp2.py:21: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_jp2.py:31: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\net\tests\test_fido.py:298: Windows. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\net\tests\test_helioviewer.py:90: Glymur can not be imported. FAILED ..\..\.tox\py37\lib\site-packages\sunpy\timeseries\sources\noaa.py::sunpy.timeseries.sources.noaa.NOAAGoesSXRTimeSeries If you want to find the full test output, you can search the tab for the name of the test out of the ~3 results, one will be that output. SunPy GitHub Groups =================== This document has already referred to two SunPy groups, namely "developers" and "maintainers" there is also a third primary SunPy group "owners". SunPy owners ------------ The SunPy owners group is the group of people who have total control over the SunPy GitHub organization. The SunPy board have control over who is in this group, it has been decided that generally it will be the Lead Developer and the SunPy board chair and vice-chair. sunpy Maintainers ----------------- This is the group of people who have push access to the main sunpy repository. The membership of this group is at the discretion of the Lead Developer, but shall generally be made up of people who have demonstrated themselves to be trust worthy and active contributors to the project. This group has `subgroups `__ for each section of the repository that has `maintainers `__. The members of these groups will automatically be requested to review all PRs which change files in that subpackage. sunpy Developers ---------------- The members of this group have "read" access to the sunpy repository. As all these repository are open anyway, what this effectively means is that these people can be assigned to issues. The members of this group are people who are involved in the development of sunpy at a good frequency, they are people who’s opinions have been demonstrated to be constructive and informative. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/remote_data.rst0000644000175100001710000000622600000000000021470 0ustar00vstsdocker.. _remote_data: ******************* Remote Data Manager ******************* There are functions which require files to be downloaded from the internet before they are executed. If the files change on the remote server or if they are tampered with after the file is downloaded, the function may return erroneous results. This Remote Data Manager provides developers with a way to download the files easily and ensure that the files are intact when they are used. If the file is changed on the remote server, the data manager will raise an error so that the user is made aware that the intended file is not available. If the file has changed on disk, data manager will redownload the file after warning the user. Also in `sunpy.util`, there is a `~sunpy.util.hash_file` function. Usage ===== The manager has to be imported before it is used:: from sunpy.data import manager `~sunpy.data.data_manager.manager.DataManager.require` is a decorator which is used to inform the data manager that the function requires a file for its execution. `~sunpy.data.data_manager.manager.DataManager.get` function is used to access the file inside the function. Suppose a function requires a file with url 'http://data.sunpy.org/sample-data/predicted-sunspot-radio-flux.txt' which has a SHA256 hash of '4c85b04a5528aa97eb84a087450eda0421c71833820576330bba148564089b11'. The following example will show how this function can be implemented:: @manager.require('test_file', ['http://data.sunpy.org/sample-data/predicted-sunspot-radio-flux.txt'], '4c85b04a5528aa97eb84a087450eda0421c71833820576330bba148564089b11') def test_function(): file_path = manager.get('test_file') # do something with file return file_path Cache ----- Remote files sometimes have to be cached. This is to ensure that the files are not redownloaded frequently, thus saving users' disk space and well as internet bandwidth. The cache has an expiry time which is set by the ``sunpyrc`` config file. To change this please see :ref:`customizing-sunpy`. Usage ===== The following example shows how cache can be used:: from sunpy.data import cache def test_function(): file_path = cache.download('http://data.sunpy.org/sample-data/predicted-sunspot-radio-flux.txt') return file_path test_function() # The file will be downloaded with this call test_function() # subsequent calls won't redownload the file Testing ======= A pytest fixture is provided for ease of mocking network requests when using cache. The following example demonstrates the usage of the fixture.:: @pytest.fixture() def local_cache(sunpy_cache): sunpy_cache = sunpy_cache('sunpy.test_module.cache') sunpy_cache.add('http://example.com/test_file', 'test_data_path') The above snippet creates a pytest fixture called ``local_cache``. This fixture can be used in wherever the files have to be mocked. An example is given below.:: def test_test_function(local_cache): # inside this function the mocked cache is used # test_function uses 'http://example.com/test_file' assert test_function() == True ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/tests.rst0000644000175100001710000002641400000000000020347 0ustar00vstsdocker.. _testing: ****************** Testing Guidelines ****************** This section describes the testing framework and format standards for tests in sunpy. Here we have heavily adapted the `Astropy version `_, and **it is worth reading that link.** The testing framework used by sunpy is the `pytest`_ framework, accessed through the ``pytest`` command. .. _pytest: https://pytest.org/en/latest/ .. note:: The ``pytest`` project was formerly called ``py.test``, and you may see the two spellings used interchangeably. Dependencies for testing ------------------------ Since the testing dependencies are not actually required to install or use sunpy, they are not included in "install_requires" in "setup.cfg". Developers who want to run the test suite will need to install the testing packages using pip:: $ pip install -e .[tests] If you want to see the current test dependencies, you check "extras_require" in "setup.cfg". Running Tests ============= There are currently two different ways to invoke the sunpy tests. However, we strongly suggest using ``tox`` as the default one. Each method uses the widely-used ``pytest`` framework and are detailed below. ``tox`` ------- The primary method is to use `tox`_, which is a generic virtualenv management and test command line tool. We have several environments within our "tox.ini" file and you can list them:: $ tox -v -l Then you can run any of them doing:: $ tox -e This will create a test environment in ".tox" and build, install sunpy and runs the entire test suite. This is the method that our continuous integration uses. .. _tox: https://tox.readthedocs.io/en/latest/ ``pytest`` ---------- The test suite can be run directly from the native ``pytest`` command. In this case, it is important for developers to be aware that they must manually rebuild any extensions by running ``python setup.py build_ext`` before testing. To run the entire suite with ``pytest``:: $ pytest will use the settings in ``setup.cfg``. If you want to run one specific test file:: $ pytest sunpy/map/tests/test_mapbase.py or one specific test in a test file:: $ pytest sunpy/map/tests/test_mapbase.py:: (This does not work with ``tox`` and is a known issue.) If a test errors, you can use ``pdb`` to create a debugging session at the moment the test fails:: $ pytest --pdb Remote data ----------- By default, no online tests are selected and so to run the online tests you have to:: $ tox -e py38-online or:: $ pytest --remote-data=any Figure tests ------------ In order to avoid changes in figures due to different package versions, we recommend using tox to run the figure tests:: $ tox -e py38-figure This will ensure that any figures created are checked using the package versions that were used to create the original figure hashes. Running this will create a folder, "figure_test_images", within your work folder ("/figure_test_images"), which is ignored by git. Inside this folder will be all the images created, as well as a json file with the hashes of the figures created by the test run. The current hashes are located within "sunpy/tests/figure_hashes_mpl__ft__astropy_.json" and this will be where you will need to update old hashes or create new figure entries if anything changes. The filenames are the versions of Matplotlib, freetype and astropy used. If these versions differ to your local setup, the figure tests will not run. In theory, the Python version does not change the results as we have pinned the packages that cause the hash to vary. Running tests in parallel ------------------------- It is possible to speed up sunpy's tests using the `pytest-xdist`_ plugin. This plugin can be installed using `pip`_:: pip install pytest-xdist Once installed, tests can be run in parallel using the ``--parallel`` commandline option. For example, to use 4 processes:: $ tox -e -- -n=4 or:: $ pytest -n 4 ./sunpy .. _pytest-xdist: https://pypi.python.org/pypi/pytest-xdist .. _pip: https://pypi.org/project/pip/ Coverage reports ---------------- sunpy can use `pytest-cov`_ generate test coverage reports and settings are stored in ``setup.cfg``. This plugin can be installed using `pip`_:: $ pip install pytest-cov To generate a test coverage report, use:: $ pytest --cov ./sunpy This will print to the terminal a report of line coverage of our test suite. If you want to create a report in html, you can run:: $ pytest --cov-report xml:cov.xml --cov ./sunpy $ coverage html .. _pytest-cov: https://pypi.org/project/pytest-cov/ Writing tests ============= ``pytest`` has the following `test discovery rules `_:: * ``test_*.py`` or ``*_test.py`` files * ``Test`` prefixed classes (without an ``__init__`` method) * ``test_`` prefixed functions and methods We use the first one for our test files, ``test_*.py`` and we suggest that developers follow this. A rule of thumb for unit testing is to have at least one unit test per public function. Simple example -------------- The following example shows a simple function and a test to test this function:: def func(x): """Add one to the argument.""" return x + 1 def test_answer(): """Check the return value of func() for an example argument.""" assert func(3) == 5 If we place this in a ``test.py`` file and then run:: $ pytest test.py The result is:: ============================= test session starts ============================== python: platform darwin -- Python 3.8.3 -- pytest-3.2.0 test object 1: /Users/username/tmp/test.py test.py F =================================== FAILURES =================================== _________________________________ test_answer __________________________________ def test_answer(): > assert func(3) == 5 E assert 4 == 5 E + where 4 = func(3) test.py:5: AssertionError =========================== 1 failed in 0.07 seconds =========================== Sometimes the output from the test suite will have ``xfail`` meaning a test has passed although it has been marked as ``@pytest.mark.xfail``), or ``skipped`` meaing a test that has been skipped due to not meeting some condition (online and figure tests are the most common). You need to use the option ``-rs`` for skipped tests and ``-rx`` for xfailed tests, respectively. Or use ``-rxs`` for detailed information on both skipped and xfailed tests. Where to put tests ------------------ Each package should include a suite of unit tests, covering as many of the public methods/functions as possible. These tests should be included inside each package, e.g:: sunpy/map/tests/ "tests" directories should contain an ``__init__.py`` file so that the tests can be imported. Online Tests ------------ There are some tests for functions and methods in sunpy that require a working connection to the internet. ``pytest`` is configured in a way that it iterates over all tests that have been marked as ``pytest.mark.remote_data`` and checks if there is an established connection to the internet. If there is none, the test is skipped, otherwise it is run. Marking tests is pretty straightforward, use the decorator ``@pytest.mark.remote_data`` to mark a test function as needing an internet connection:: @pytest.mark.remote_data def func(x): """Add one to the argument.""" return x + 1 Tests that create files ----------------------- Tests may often be run from directories where users do not have write permissions so tests which create files should always do so in temporary directories. This can be done with the `pytest tmpdir function argument `_ or with Python's built-in `tempfile module `_. Tests that use test data ------------------------ We store test data in "sunpy/data/test" as long as it is less than about 100 kB. These data should always be accessed via the :func:`sunpy.data.test.get_test_filepath` and :func:`sunpy.data.test.test_data_filenames` functions. This way you can use them when you create a test. You can also use our sample data but this will have to be marked as an online test (see above):: import sunpy.data.sample @pytest.mark.remote_data def func(): """Returns the file path for the sample data.""" return sunpy.data.sample.AIA_131_IMAGE Generally we do not run the tests on our sample data, so only do this if you have a valid reason. Figure unit tests ----------------- .. note:: The figure tests and the hashes they use are only checked on Linux and might be different on other platforms. We should suggest if you do not use a Linux, to add a fake hash to the json files and then CircleCi (ran on a PR) will tell you the real hash to use. You can write sunpy unit tests that test the generation of Matplotlib figures by adding the decorator ``sunpy.tests.helpers.figure_test``. Here is a simple example:: import matplotlib.pyplot as plt from sunpy.tests.helpers import figure_test @figure_test def test_simple_plot(): plt.plot([0,1]) The current figure at the end of the unit test, or an explicitly returned figure, has its hash (currently ``SHA256``) compared against an established hash collection (more on this below). If the hashes do not match, the figure has changed, and thus the test is considered to have failed. If you are adding a new figure test you will need to generate a new hash library:: $ tox -e py38-figure -- --mpl-generate-hash-library=sunpy/tests/figure_hashes_mpl_332_ft_261_astropy_42.json The filename changes if the version of astropy or Matplotlib or freetype gets updated. So you might need to adjust this command. For the development figure tests:: $ tox -e py38-figure-devdeps -- --mpl-generate-hash-library=sunpy/tests/figure_hashes_mpl_dev_ft_261_astropy_dev.json This will run the figure test suite and update the hashes stored. If you want to check what the images look like, you can do:: $ tox -e py38-figure -- --mpl-generate-path=baseline The images output from the tests will be stored in a folder called ``.tmp/py38-figure/baseline`` or ``baseline`` in the sunpy folder, so you can double check the test works as you expected. .. _doctests: doctests -------- Code examples in the documentation will also be run as tests and this helps to validate that the documentation is accurate and up to date. sunpy uses the same system as Astropy, so for information on writing doctests see the astropy `documentation `_. You do not have to do anything extra in order to run any documentation tests. Within our ``setup.cfg`` file we have set default options for ``pytest``, such that you only need to run:: $ pytest to run any documentation test. Bugs discovered --------------- In addition to writing unit tests new functionality, it is also a good practice to write a unit test each time a bug is found, and submit the unit test along with the fix for the problem. This way we can ensure that the bug does not re-emerge at a later time. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/contents/units_quantities.rst0000644000175100001710000000767600000000000022626 0ustar00vstsdocker.. doctest-skip-all .. _units_in_code: *************************** Use of quantities and units *************************** Much code perform calculations using physical quantities. SunPy uses astropy's `quantities and units `_ implementation to store, express and convert physical quantities. New classes and functions should adhere to the SunPy project's `quantity and unit usage guidelines `_. This document sets out SunPy's reasons and requirements for the usage of quantities and units. Briefly, SunPy's `policy `_ is that *all user-facing function/object arguments which accept physical quantities as input **MUST** accept astropy quantities, and **ONLY** astropy quantities*. Developers should consult the `Astropy Quantities and Units page `_ for the latest updates on using quantities and units. The `astropy tutorial on quantities and units `_ also provides useful examples on their capabilities. Astropy provides the decorator `~astropy.units.quantity_input` that checks the units of the input arguments to a function against the expected units of the argument. We recommend using this decorator to perform function argument unit checks. The decorator ensures that the units of the input to the function are convertible to that specified by the decorator, for example :: >>> import astropy.units as u >>> @u.quantity_input ... def myfunction(myangle: u.arcsec): ... return myangle**2 This function only accepts arguments that are convertible to arcseconds. Therefore:: >>> myfunction(20 * u.degree) returns the expected answer but:: >>> myfunction(20 * u.km) Traceback (most recent call last): ... astropy.units.core.UnitsError: Argument 'myangle' to function 'myfunction' must be in units convertible to 'arcsec'. raises an error. The following is an example of a use-facing function that returns the area of a square, in units that are the square of the input length unit:: >>> @u.quantity_input ... def get_area_of_square(side_length: u.m): ... """ ... Compute the area of a square. ... ... Parameters ... ---------- ... side_length : `~astropy.units.quantity.Quantity` ... Side length of the square ... ... Returns ... ------- ... area : `~astropy.units.quantity.Quantity` ... Area of the square. ... """ ... ... return (side_length ** 2) This more advanced example shows how a private function that does not accept quantities can be wrapped by a function that does:: >>> @u.quantity_input ... def some_function(length: u.m): ... """ ... Does something useful. ... ... Parameters ... ---------- ... length : `~astropy.units.quantity.Quantity` ... A length. ... ... Returns ... ------- ... length : `~astropy.units.quantity.Quantity` ... Another length ... """ ... ... # the following function either ... # a] does not accept Quantities ... # b] is slow if using Quantities ... result = _private_wrapper_function(length.convert('meters').value) ... ... # now convert back to a quantity ... result = Quantity(result_meters, units_of_the_private_wrapper_function) ... ... return result In this example, the non-user facing function ``_private_wrapper_function`` requires a numerical input in units of meters, and returns a numerical output. The developer knows that the result of ``_private_wrapper_function`` is in the units ``units_of_the_private_wrapper_function``, and sets the result of ``some_function`` to return the answer in those units. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/dev_guide/index.rst0000644000175100001710000000200300000000000016443 0ustar00vstsdocker.. _dev_guide: {% if not is_development %} .. _newcomers: .. _remote_data: {% endif %} ***************** Developer's Guide ***************** {% if is_development %} This article describes the guidelines to be followed by developers working on sunpy. If you are thinking of contributing to sunpy please read the following carefully. We currently recommend the :ref:`newcomers` as the place to start. This goes over the basics and has links to useful tutorials on git. .. toctree:: :maxdepth: 2 contents/newcomers contents/code_standards contents/documentation contents/example_gallery contents/tests contents/pr_review_procedure contents/api contents/dependencies contents/units_quantities contents/new_objects contents/extending_fido contents/maintainer_workflow contents/logger contents/remote_data contents/config contents/funding {%else%} Please go `here `__ for our up to date developer’s guide. {%endif%} ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.5532744 sunpy-3.1.5/docs/diagrams/0000755000175100001710000000000000000000000014443 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/diagrams/core_datatypes.dia0000644000175100001710000001221700000000000020133 0ustar00vstsdocker‹í][sÛF²~ׯ@)/Ù*z4=3=—`íT6'ÙMU6ÙŠsv÷͉ijÉ"AÛzÙß~º*¢$¦ (ÓÃTlƒ‚Ð`º¿¾÷Ÿ¿}3ÎÞ–óÅh:yy Bžfåäb:M®^žþïï?¾ð§ß¾:ùópT|Cÿ_Í‹›Œ~c²à£—§×U5ûæììÝ»wb|»(ªé\ŒGK±(Ïþ[ŒÇÅtvúê$ËÖ/0,ª‚¿[}[TÕ|t¾¬ÊlRÜ”/OÏ‹‹ÿ\ͧËÉð´9kuÞÅtŽËbÒP­æËrw:‹‹bL[ìC˂ݯ~9ªªéGîÿ²/¶Y@óõ÷©Ü{5 ?̼Îh¹Ê»Ñ°º~ó>Òãj®~éêoG‹Ñù¸Üt÷£Iµ·ËßîçòßN-Áï½ãnh®Ö C_b‰ŸWËѰ\|d›=<§åJ׫ÓÎ>öÔŸ·íƒi¾zØ5‰qq[ÎW—ÿË=Tg«¼’8YqQÞÞ­=“éùÿ•Õj±?ާï.®‹y•½Èþ2}z¯ˆ2¾<ýU>|Z×GW#Aøäqͦì)í¢¼rÖ?~OIóóÇdæ´’br5.ïIɆT`R¹1ˆ6C’7Â帼ys1Ož*{_dM«2Oz'`(„õOZ×åèêºj'"˧e°ÆìFì|:–ó-M ÍLDÔnäFz[oÊ Räü’ÿÛÄâzúîÍEùãÀ§P™ÃáCôòÈp·+Wåûêô#"ýÑ9mO¢Öœ÷Hež ‹ù¼¸mÑ™?4mZËtRm¢Çßg—ÅÍh|K–ÓùrR-O³EuË2Ñ“*çë’ûÓoá ãl|7~Å<`%Hãv#úPÎnC„Öj …ÕÁiÕÜcþi5Ö¤ìFˆ4Ü«ÉM¹ù¥–“åÍåäCêÉ&„mÓÎî!qwŒ„®©‚Â@YdœD„H¢$ÝŠ€Ïµ%Ê†ŽƒÐ>&Fîe‘Û@¤%Ôz€‘&"D*áäƒO\Ì*‡$ÌŠY¯gÄ7óiínûZ ÿ”À+:xi%¬Tf <É HØÕv©®Ø…„ F#‹uc½‰ˆ]DI†%ð&·dž¡À›˜Øµ—EngÞ9õÀRŸv=Oó.Àùe9LPÙT’¤ûNö€“H*¼dYä…TÎ& ÜP¾& ó!áäÏ£I¹(uW 4^¯8¡,ºˆ@I”¼ö–)AÀpL ^Áï轘N&oÊɰ^ÐNËܰ“°ÖÀ Ðw´jhë\ÌßϦˆÆ'Áçdø¦˜Ï§ï_ø~§*ÕñÒoÆåäêÀ‰]I|’·¤ÀoŸö1Äâ ªÜý$»&b1LSM‰cPŸf÷?¦waŸl† ¿ «ßVí¿|Çüîi?|n:ó9épÁšš¤…˜ñ#”v¡æs>'ÊÞZ_{X¼ñ±½mL;#´2®ñ:=1ú=£Ã;3z!xÇ %ÆôÚ2% Äè–þÛ ¤¥Sö<Ë¿ÃÑt-›œËñƒ°,’4‰")$®ólr.ÇŒÂú=آʢ­UEØUÖnk‹*h(!IÝQx>æÜ3¢fÙîe‘Ûeáñ UŠƒöƒVl~ÞÅBRŃ*µ d‡”/ÔR…®He•ÁjâNÙ˜HÅ”LCÉ:ØkŠ|LHeœŠT{YdBª„TQêß¿· ©zC*k…ªåPÎÛ„T=%ì@÷ÒE-” ~Uaczµ«]í{7ˆ¹æÌ¯k7úØžÿÖunôÓèÆuiSÊΑyþ¡‹çß(ë¯ãéA×ì']ÌH>QrAÖ9ë I%E+Õ9ƒ±#|mËÜ€Y(¤sØèÎ!eì¤ß=Ÿ‡Eø s­ŠrÂ;…c…³Q)©%‚Ô\£ð(¹ìÒF-³ÜÇ·‹ð«Öë,1Eø’%úi–è÷Åx¥0&×Û'–†ýí‡×¯JIŒ½&1B€qÂ!>þ½˜%pŒŽ^ #¹ÎŸ;˜AŠ¢ô…+GAxéµv‚‹™ÕÈé„w”Œ³9ÇÛêc²!î³¶4÷±È„ ²»m²ï—ó·e‚Éøùw‚D`#óÀËÔ1©§dÕ¹@U{ÒºocöP§­á±¦$Ñ+›3eÚ¡Ã9!öì£Öunð‡Ô¾_M7f­Ü5xŸ’ žk²ì4ãL¨ÌGuŸrf ñp£23Ù€«gz¦¤­¯Ç"ø@ "®MjP×W†Gèžá¡­ÆF?U!ji€Ð°¢„.`Nà)ù˜±RY7Ãc‹LX™°ò±ò‡þ ²×$+=‹=n¶” èzÊñÐ è89ǺnùˆÛ~…j\°DɕȖlÀ+@ôÀoË27od½Âs“HÉ´æ@:Ô´ݹ&蹪Æ1j"çkxlfJ&²§FȈ^Õ¤T.¡dOIO«Ê½Œu·~Ó€tŽ»+Õ”4ZÅí ÈPv¨c·‰i[æWˆãT'ßx‚1õ};¶”'è”ò„j£;×Ãz#H0¯Xc¶r%,èmÃé.'û ”®UT»8¶gô¶en4ì$ç@Ô>-§'N_ãt{ N7 ú|Ý V`çãr:8¬Ý‚t-| Ægèô*vK¨ÖenÖN ÔWzâôÄéëœîÅé+ú1Z ým£jïì_2 %-!^¸`l׌2vÅBë:7€º6(¬›¹¢IÅ»©™ë«u ŠÓ¹8)0ªfÖ41‹“ƒdC‰8Èæ ÖU£QKˆZ¼»—E¦`oòfç@¿ï—ç©‘M¼R ’<Ô½K¼=E|Mçª>ï9Që~è¢Ú½<.hEHù<¢«k;‰:~KÜ ƒÁõ~o!dÈÏ£Š0E|{I‹ÜDÀ geš ßSÀ×t. tŽ;Ú²+eç†ÛÆ{ ¡TM´â0‚zú»Ù[Ë"7Æ€@É;$Oî¢ä.ZwéØžáïæ›˜¼sáœVÜ·ß°t&…*¦*L”¹• 2EÈ1‰ÍDô`c³yë274½¡û’¬£;áwo±Ã­dß G zeû¦~¡HÖ)ˆŒ5 w|\{ü¦V+Ú¥@’/‡“/OsFw®:â8 X;Ð\›ã£v’t‚Õ”cy°s̺ ` +J&(/®¡EÉÑǸsAö±Æí°‹´ü¾Ú¿%ì:â:„^=£—WàƳ^mzõä¾õ{êìœÁ•³u)Q2Fׄ¤Ï4†˜á¹êчu´®róN&ûi²Éƒ{dc;ypÝ<¸áóñà ‰±{Ð>g–Ç<³jÜóñàòŸº£±aç$þm=¸†£TÚHmµ5;ûd’÷˜¸‡k„4%Uàþ®bÚÀÄ­èe=A€§åLØéÆ«ªw-ºÛ^¼´,sƒA‚ƒiÍ»¦'5â(ùÜD¯liÝg~yÂÕýitÔêþb 6WtıV)î:æ ßÔ±ñ¸˜-èßYu]f夜_ÝfÙšüBN–õ¦“2#söf:/³›²ºž'ó²ZÎ'‹¬àžÒÏdÜè—‘¤½yc§FÑϺQôãñh¶Ø¨Òt®r¤iô0lJÄÌlSd)5„¼nm ÔÂÏZµÛ×>–¸Ý´ooÈ(ô. è ­ ‘‡º8OO΀ $:vu¹§ìïgg¢nŸÐ¨5m2 š ž¿¶ðõß‹YV˜(<â iN"XoPÏÐJõX{´•;×d-¬³ÈÅ%ü1ý˜DI­(ra¤3ŒËÜx,&.ïe‘Û…Û­—Aãß=´e¸]joÀš %ƒ<&`~þÑýÌŸ Ì«ùqã„Îý¡³qÁFg A'tî'“»O’á”5Ëú¨Íƒ,Gñi‹%ÀÜ1L2cQ€¶±c­ëÜ8‹IÕ* i¦ À‘B—(,Ú×¹ =YP¨™Ø›S 0 SRRÛºL£eÍØø]9jûÉæmëÜ[´ÍS‰Õ«¯±º>TÀ¯si–5dÃÒAFmþ%Å&)ˆu’ŽYÜ™rŸæÂ¿JzÉËñ0+Æ‹ivA[³*OŠìt±œÌn3ÚÄÅí)üø‹æèdt™-–——£‹©ŽÙ”ÞÇ ³òýhQ-²ó²zW–“Ž!²Þvö‡Irј$BˆŒ>E¶ RxðÙ…·ŠK~¸ÂÒ’ Â{§b:!ï(Iá¼qÞç¤_(vgÒ½:Qþñów¿üòÓ/íÙy²(&‹§RêoåømY.Šør HC…ZN¡–àµ1ÑmÛ2š˜º¼ìÍuò剩ε/,å„@Â"ø`b¦e®‘ÒÁ•KnÝ.A ´»– ö)¨HŸª²ålHZÛ7™¢[?“î ô&µ¸úåá'ºØjߦÇàòýòäV؃ÜrÚÇ@¦,B\¹Õ"K &·Â"&KîL»O¹õz9ùÇmö=g‘þOQ¿ÓÅIÕŠ/³Z¶h’Y•YÍñ¸¸-ç¯NšúŸ«À_ü?Ó«ªLK././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/diagrams/map_class_hierarchy.dia0000644000175100001710000000417000000000000021124 0ustar00vstsdocker‹í][oã¶~ß_ax_š÷Kݤè] ça·OÅA ÛZG§²dHJ²~éo/EÉë›”8¢©M H`ËÔ ‡âÌ7ÍPßÿðeÂ,ÒäzˆÂd–Σdq=üóÓoWrøÃÍ»ïçQðþ[dÁr ¯HòòÛõð®(VßÇ ^çA‘f ŽîAŽÿ â8ëFãáÍ»Á`—À<(‚ò\}6(Š,šÞá –áõpÌþ^dé}2V­êv³4N³ÁC_ß6Çp\“ïÑy‚ö*X„Ó, þn' õ¡TÒ«0;$»\¥y¤›ëÕQ“:åÿ6u«\7J7ïÿ‹"ÌÞWݪOné5u¶•Q± ²E”óÒãWƒ#ª<8’Œ@,Èf\^ÎnÚ/»¸_vY¿ì¢üv•fEDÅ1ËišÆaT\‹ì>ìÎ'Ÿ±žbO‰…ºSÿEúLÿ?q~ŠÕé¯÷Rí]dÑüiåÝkÑBå1šw·_ WE}íˆúC”GÓ8lê}”g#¿>ùûc,øörËÙPQk…ˆ¹ YÈ^‹ûhæÏL³ý6-”îêfãçFý°Ý©S:lÃ"ÖaV“ÿi Õƒú×gÌŠèaómgLÒéÿÃYQ û[œ>Î\ ~J¿ ·ŽˆvC¢ùõð¿p´åÓÔ´!<®UúuN]¡‘<ÿØx´ÑžNIgº÷A²ˆÃ yÙHÅ&(ÁFÔ_‡ËÛYš%Ç>ÂYä1ô 9–ic?P˜ªÃ†×]-îŠvfXÜ=D7fù]úxÛà5>‡/á² æó}(<Ör~9¥C³pЦm$ŒC¸×îÀLî—«5HæA–ë7ò ÛÛäiR4q-Ï>Ë(^ëÎI>äź4Z¿«KㇰˆfÁ®-{yŽæZã ’pÿ vL÷-O“¶" 8f#0¶cµHO,] ´c¤ý½E² ›ïg¨§OT?ÖMxÓ†™ã-@tG d|„˜KÈà%d Zb††©?sýÙ)htéÔ ª½ƒ;D ­RûJŒˆ5|€ €ÈXw޹KѬD ‚© ú¿Ò3†HHGc8K“ä6LæF¤n‚6-š!„˜ž*®ºõLÏžÙê°CM‘æM2¿ ²,}<$¼¬» ýN¤oã0Y<…š-ÿ–Å3¸|2‡òöëY¦u"?B”Í/ƒ;­Eµ).R³@lÕ·âx.4\Œê‹aûÅõ?èÒyEj«éÔ­X­Œ‹(b¢‘:Ž)h{±Šö¾á¥Å~¾Ÿ†Þ7tí–áF"|d¡_×ÙT@Jzð 1`˜sjü-ù„F¤B•gˆ\{†­r7ÕULpï^¦cHߢcÈmõœ”Oƒ0réŽ0¬C%F;v ­ä9-j(Å9œ5ï¾RÏðç ]:ìÁ=d@IVšïööØIØ‚Ân!¡2žPÁ†^7ðj†¸ ™N (pÒ[j›‡þaãS´ ?†Yæ4œçµQ@ð°ÑoLAÚÇ”â”W†b‡Â„¡2è$‰œp@”€š1*C ÒyH¡EÌÆàÅX™h9í >¤ðZC Ü&¤@„žWseïêÉ Yj.¡›´)”š ½úG=ÇÐuè°UÎã¦Pòz~™z.Þ¢ž£37™l@“ġܦ jF¢bÄ‘B“+ÍÈJó±„ÊuúH‹ M©î¦ªˆÚ É7Ós¯æO«9¶Qsôž ëŠdR;„K7©#†ËD£)Ååóâ2ÿ×iÀÇJ¬W—`ŒÝ/gÄ>æÓS‚ñJñAçA¸”Â$’ó驜Û£(Ë8:óÓðƒiëg¸”ø¡jüŽñÃN0 A<‚ôŠ  A¸G¾„œA%¢´µÂ1ˆHUó™`¨$r¤çŒëeˆµt§! •{EòÄ#É%"ÉÇ8šù¬ö> ¤ZŒ¿éí4².ƒ*ãLTc«¸r™Â$¤¦ŠŽ©œ”œ•’UÀšsצÚä¢[—žÃÿô.áé.á~ô9ì}l¡­€ÖL ¨ßf¯¯¨?ÃÖIŽB¯ v„z€ ©NKc—ÄÃÄeÁį>y˜èk—$‰=Rô‹Â) k¤€;H¡M,ï( Ûµ€ÒÅ…í™òË}…&vèq¢Ï಴9!€¯ 9UÂiô B6•\½¾`Ú b¢mzYú@]'D·ŠÚ„4Êuñƒ¯}¸°3³‰0ãoUü ì½BíÍ …ûÐöòq®µ<)O`H¸áݹ”üåm¢¶mK¤×öËÔvþµÛ—:IÀXY©Û‡¶ Jl5ØNµ¶K@%²ÆvìZÛ[EmÒvÝ×Òym¿Hm¯ZÛ?•ëÚ·Çn´Ý¾âɼV uÁœºÉMý"ÈÊÊe³£E™.ÂðˆäežYþ×ÿ|4ÀyªYÃd¼„Pt h{¥éR;<;<“]ÂgØYÁX —¯”ÜðÀ¥Uª?«7a’¼)rnŠŽçŸ·DoÑÙ×dˆ¯ùÏ.7xÙ©ùä¥=Úr%Þ$y“Ô:½UêÕ*5C™¼x™X}7o¿y·÷êð›wÿ2ê¦b„././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/diagrams/package_layout.dia0000644000175100001710000000322000000000000020107 0ustar00vstsdocker‹í\ßoÚ:~篰Ø+5‰;I»vÚ¤MwÒ¦û°Ýgd¹ I䘶¼Ü¿ý'´…@ %­k"µˆ`ŸÏ¿Î÷ùÞ¸ŸÇèVª’I†Q2½îÿóóË…×ÿpÓ{Fâþ¦JÌÔHróîº?Ó:»ïîîp¼Ì…NŽ£Îåð?Çb…†ý›BëB¡…¹·º+´VÑx¡%JÄ\^÷Ç"ø5Ué" ûe©U¹ S…nE|Ý7)®þpef¸açÛ™˜Ê±’âW½i .ß?Æt&UÕìÙÛÕØZ =j%ÛX0>q93ꛋÛ£qéø¼n|^¸ø¼pê¼pQ>ÊR¥•ˆô6ä8Mc)’U«…<'D Kì¹nÙÇ[ŸDZ§{Ú?q~HÊÛ÷Rïª(|Þy7JÔX¹‹B=Ý·4\¥õeKÖo£<ÇrWë£DŸÌüò4櫳S0øSõ†«¡´V+¡'™d/—ˆé" e¾g™m–©±4[îõj¹C¦¼Uì"K©Væ?=I5ZMðŠqttûðnmLÒñ¿2ЫÎþÐ" … Ñú%Pëq#Û(¼îÿmmŽVµ` ˆpk¸²ôiM¹˜û8˜øÔv«#±Í#u0ãqEAGD2e‰äabûÌ5Hå^²Ë<:€Dzœãƒ4IF2 ‹ÕÏí¢¦„A³øqMJó «¶d—¿Ä(tq$”J惘%À­ô“44=Še2Õ³íi|`O ³¦GŸÁÌ;,/ð…|‹ù>A3ðãqà,:g±ûèéS˜ ¾µ vT¶W•Éfe²Í••·K®sð/qzÌ„ÒàáŸã8Êò]NnŸÀÉm‡Ò ®Æ¹Ó¢“’åHܤ+B1gƒc—M,ç£ UÉvTpêÎP{'Çã.q=›[¥.% °f2šÎt=Å08õ-ϲlîñ#©yœªPªý~g[åe;¾eÛÜ>²o8mîjâS~äªÈgÀ#;‚àý»û— d" 7wö[CFeŒÂ 1ŸB´âúÇ!iy¯û{¶o•2u#SÄ»å*áq¾H²eMtüÌ–².>I½ ÍÜG1â%4J$yåz¹bâ²ê_2¾•: Ä:¿¼[^´s¢½z„ä®û è£ã³ñÆÆüˆÃj8ê2ÛE“ê³…´Å<©Ï³5È•íg?§)û9fwîC`ß"õæ6„6v‰dô50ßÏ4»ˆå­ŒQ‹<—ùå›ãBßsÍE}—Gùžß6îX‘ž•O—ÆgÓø s“\w1õ[Nã’S"9EßÁH2Äwí¦òOÑÁÃÒÔÚHå»­¦òíTþŸ•¶aèIÞ¥òÏ­ÆÑ\LeŒ´-À¶I:rlw©ü6RùõzÉ›ê%aØ6—xmîçÄ2)}—²+J‹#b#”>õœ6¥²iß:•ìTò-xgà­Jt:Ùú‘· £N‘Ìïítò|:é6>öf [朸U¡4(tÒ¡°@KôZÖÉÆ}넲Ê7 ”:šË\ªHæV¶­•ÔÇÜ*´Òé´ò¼Zé5ÎÁútËÁN«Z (œ0 –ăÓ¨¥ÏvÕ²qï:µìÔò ¨e0ïT²õˆÒ<+ *isL*ߨêT²½‡¨ýÆYWŽ-‹ÓÁ…ƒ‰EZN½úŒ“‰vE9 ñæÑmõ ò$}`_) This makes it possible to fetch required data from the local database instead of downloading it again from a remote server. The package :mod:`sunpy.database` was developed as part of Google Summer of Code (GSOC) 2013. 1. Connecting and initializing the database ******************************************* To start a connection to an existing or a new database, create a :class:`Database` object: >>> from sunpy.database import Database >>> database = Database('sqlite:///sunpydata.sqlite') The database object in our example above connects to a new SQLite database with the file name "sunpydata.sqlite" in the current directory. The first parameter of :class:`Database` receives one mandatory argument: a URL which describes how to connect to the database. The supported format of this URL is described by the documentation of :func:`sqlalchemy.create_engine`. Note that a connection is only established when it's really needed, i.e. if some query is sent to the database to read from it. Transactions can also be committed explicitly using the :meth:`Database.commit` method. .. warning:: If you are using :class:`Database` objects in an interactive Python session you must not forget to call the :meth:`Database.commit` method on them explicitly before quitting the Python session! Otherwise, all changes on the altered databases are lost! .. note:: You can set the default database url in the sunpy config file under the 'database' section. See :ref:`customizing-sunpy` for information on the config file. A database section might look like this:: [database] url = sqlite:////home/user/sunpy/my_database.sqlite 2. Adding new entries ********************* Each entry in a database is an instance of the class :class:`tables.DatabaseEntry` with the following attributes: ====================== =================================================== Attribute Description ====================== =================================================== id A unique ID number. By default it is None, but automatically set to the maximum number plus one when an entry is added to the database. source The source is the name of an observatory or the name of a network of observatories. provider The name of the server which provides the retrieved data. physobs A physical observable identifier used by VSO. fileid 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 The date and time when the observation of the data started. observation_time_end The date and time when the observation of the data ended. instrument The instrument which was used to observe the data. size The size of the data in kilobytes (-1 if unknown). wavemin The value of the measured wave length. wavemax This is the same value as ``wavemin``. The value is stored twice, because each `sunpy.net.dataretriever.client.QueryResponse` which is used by the vso package contains both these values. path A local file path where the according FITS file is saved. download_time 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 Entries can be starred to mark them. By default, this value is False. fits_header_entries A list of :class:`tables.FitsHeaderEntry` instances. fits_key_comments A list of :class:`tables.FitsKeyComment` instances. tags A list of :class:`tables.Tag` instances. ====================== =================================================== * The ``id`` attribute is automatically set if an entry is added to a database. * The attributes ``source``, ``provider``, ``physobs``, ``fileid``, ``observation_time_start``, ``observation_time_end``, ``instrument``, ``size``, ``wavemin``, and ``wavemax`` are set by methods which use the VSO interface. In particular, these are :meth:`Database.add_from_vso_query_result`, and possibly :meth:`Database.fetch`. * The attributes ``path`` and ``download_time`` are set by the method ``Database.download`` and also possibly by :meth:`Database.fetch`. * ``starred`` is set or changed via :meth:`Database.star` or :meth:`Database.unstar`. * ``tags`` is set via :meth:`Database.tag` or :meth:`Database.remove_tag`. * The attribute ``fits_header_entries`` is set by the methods ``Database.download``, :meth:`Database.add_from_dir`, and :meth:`Database.add_from_file`. 2.1 Adding entries from one FITS file ===================================== The method :meth:`Database.add_from_file` receives one positional argument (either a string or a file-like object) which is used to add at least one new entry from the given FITS file to the database. Why "at least one" and not "exactly one"? The reason is that each database entry does not represent one file, but one FITS header from a file. That means if you pass a file which has 5 FITS headers in it, 5 entries will be added to the database. The file in the following example (``sunpy.data.sample.AIA_171_IMAGE``) has only one FITS header, so just one entry is added to the database. .. note:: If you are working with Hinode/SOT files you may notice that for each file you get two entries, one which refers to the observation and another that contains some (useless) telemetry data. :meth:`Database.add_from_file` saves the value of ``path`` by either simply passing on the value of the received argument (if it was a string) or by reading the value of ``file.name`` where ``file`` is the passed argument. If the path cannot be determined, it stays as ``None`` (the default value). ``wavemin`` and ``wavemax`` are only set if the wavelength unit of the FITS file can be found out or if the ``default_waveunit`` attribute of the database object is set. These values are then used to convert from the used units to nanometers. The rationale behind this behaviour is that it makes querying for wavelengths more flexible. ``instrument`` is set by looking up the FITS header key *INSTRUME*. ``observation_time_start`` is set by searching for the FITS header key *DATE-OBS* or *DATE_OBS*. Analogously, ``observation_time_end`` is set by searching for *DATE-END* or *DATE_END*. Finally, the whole FITS header is stored in the attribute ``fits_header_entries`` as a list of :class:`tables.FitsHeaderEntry` instances, and FITS comments are stored in the attribute ``fits_key_comments`` which is a list of :class:`tables.FitsKeyComment` instances. Using the function `len` on a :class:`Database` object returns the number of saved database entries. To get the first entry of the database, ``database[0]`` is used (the ID number of the entries does not matter, ``database[0]`` always returns the oldest saved entry of the database). If the database is empty, this expression raises an :exc:`IndexError`. In section 3, more advanced formats of the slicing syntax are introduced. >>> import sunpy.data.sample # doctest: +REMOTE_DATA >>> database.add_from_file(sunpy.data.sample.AIA_171_IMAGE) # doctest: +REMOTE_DATA >>> len(database) # doctest: +REMOTE_DATA 1 >>> entry = database[0] # doctest: +REMOTE_DATA >>> entry.path == sunpy.data.sample.AIA_171_IMAGE # doctest: +REMOTE_DATA True >>> entry.wavemin, entry.wavemax # doctest: +REMOTE_DATA (17.1, 17.1) >>> entry.instrument # doctest: +REMOTE_DATA 'AIA_3' >>> entry.observation_time_start, entry.observation_time_end # doctest: +REMOTE_DATA (datetime.datetime(2011, 6, 7, 6, 33, 2, 770000), None) >>> len(entry.fits_header_entries) # doctest: +REMOTE_DATA 194 >>> for fits_header_entry in entry.fits_header_entries[:10]: ... print('{entry.key}\n {entry.value}'.format(entry=fits_header_entry)) # doctest: +REMOTE_DATA SIMPLE True BITPIX -32 NAXIS 2 NAXIS1 1024 NAXIS2 1024 PCOUNT 0 GCOUNT 1 XTENSION BINTABLE BLD_VERS V5R12X LVL_NUM 1.5 >>> for fits_key_comment in entry.fits_key_comments: ... print('{comment.key}\n {comment.value}'.format(comment=fits_key_comment)) # doctest: +REMOTE_DATA SIMPLE conforms to FITS standard BITPIX array data type NAXIS number of array dimensions NAXIS1 width of table in bytes NAXIS2 number of rows in table PCOUNT number of group parameters GCOUNT number of groups XTENSION binary table extension 2.2 Adding entries from a directory of FITS files ================================================= Adding all FITS files from a directory works by calling the method :meth:`Database.add_from_dir` and passing the desired directory to it. By setting the keyword argument ``ignore_already_added`` to ``True``, no exception is raised if it is attempted to add an already existing entry In the following example case, setting this parameter is required because the file ``sunpy.data.sample.AIA_171_IMAGE`` was already added, which is located in the directory ``sampledata_dir`` >>> from sunpy import config # doctest: +REMOTE_DATA >>> sampledata_dir = config.get("downloads", "sample_dir") # doctest: +REMOTE_DATA >>> database.default_waveunit = 'angstrom' # doctest: +REMOTE_DATA >>> database.add_from_dir(sampledata_dir, ignore_already_added=True, ... time_string_parse_format="%d/%m/%Y") # doctest: +REMOTE_DATA >>> len(database) # doctest: +REMOTE_DATA 59 2.3 Adding entries using the VSO interface ========================================== 2.3.1 Adding entries from a VSO query result -------------------------------------------- The number of database entries that will be added from a VSO query result is equal to the value of ``len(qr)`` in the following code snippet. Note that :meth:`Database.add_from_vso_query_result` does not download any files, though. If you want to add new entries using the VSO and also want to download files at the same time, take a look at the following two sections. >>> from sunpy.net import vso, attrs as a >>> client = vso.VSOClient() # doctest: +REMOTE_DATA .. testsetup:: * >>> from unittest.mock import Mock, patch >>> from sunpy.tests.mocks import MockObject >>> class MockQR: ... def __init__(self, start_time, instrument, wavelength): ... end_time = '{}{}'.format(start_time[:-1], int(start_time[-1]) + 1) ... self.time = MockObject(start=start_time, end=end_time) ... self.instrument = instrument ... self.wave = MockObject(wavemin=wavelength, wavemax=wavelength, waveunit='nm') >>> with patch.object(vso.VSOClient, '__init__', lambda x: None): ... vso.VSOClient().search = Mock(return_value=[MockQR(f"2011050800000{t}", 'AIA', w) for ... t, w in zip([0,0,2,3], [17.1, 21.1, 9.4, 33.5])]) After initialising the VSO client: >>> qr = client.search( ... a.Time('2011-05-08', '2011-05-08 00:00:05'), ... a.Instrument.aia) # doctest: +REMOTE_DATA >>> len(qr) # doctest: +REMOTE_DATA 4 >>> database.add_from_vso_query_result(qr) # doctest: +REMOTE_DATA >>> len(database) # doctest: +REMOTE_DATA 63 2.3.2 "Clever" Fetching ----------------------- The method :meth:`Database.fetch` checks if the given query has already been used once to add entries to the database. Otherwise, the query is used to download and add new data. The :meth:`Database.fetch` method also accepts an optional keyword argument ``path`` which is passed as-is to :meth:`sunpy.net.vso.VSOClient.fetch` and determines the value of the ``path`` attribute of each entry. Note that the number of entries that will be added depends on the total number of FITS headers, **not** the number of records in the query. .. testsetup:: * >>> qr1 = [MockQR(f"2012080500000{t}", 'AIA', w) for t,w in zip([1, 1, 2, 2], [9.4, 9.4, 33.5, 33.5])] >>> qr2 = [MockQR(f"2013080500000{t}", 'AIA', w) for t,w in zip([1, 1, 2, 2], [9.4, 9.4, 33.5, 33.5])] >>> produce_results = [qr1, None, qr2, None] >>> add_data = lambda x: database.add_from_vso_query_result(x) if x else None >>> database.fetch = Mock(side_effect=map(add_data, produce_results)) In the next code snippet new data is downloaded as this query has not been downloaded before. >>> entries = database.fetch( ... a.Time('2012-08-05', '2012-08-05 00:00:05'), ... a.Instrument.aia) # doctest: +REMOTE_DATA >>> len(database) # doctest: +REMOTE_DATA 67 Any more identical fetch calls don't add any new entries to the database because they have already been downloaded. >>> entries = database.fetch( ... a.Time('2012-08-05', '2012-08-05 00:00:05'), ... a.Instrument.aia) # doctest: +REMOTE_DATA >>> len(database) # doctest: +REMOTE_DATA 67 However, this different fetch call downloads new files because there is a new date range whose files have not been downloaded yet. >>> entries = database.fetch( ... a.Time('2013-08-05', '2013-08-05 00:00:05'), ... a.Instrument.aia) # doctest: +REMOTE_DATA >>> len(database) # doctest: +REMOTE_DATA 71 The caching also ensures that when queries have some results in common, files for the common results will not be downloaded again. In the following example, the query is new, but all of it's files have already been downloaded. This means no new files are downloaded. >>> entries = database.fetch( ... a.Time('2012-08-05 00:00:00', '2012-08-05 00:00:01'), ... a.Instrument.aia) # doctest: +REMOTE_DATA >>> len(database) # doctest: +REMOTE_DATA 71 2.4 Adding entries manually =========================== Although usually not required, it is also possible to add database entries by specifying the parameters manually. To do so pass the values as keyword arguments to :class:`tables.DatabaseEntry` as follows: >>> from sunpy.database.tables import DatabaseEntry >>> entry = DatabaseEntry(instrument='EIT', wavemin=25.0) >>> database.add(entry) >>> entry in database False >>> database.commit() >>> entry in database True >>> len(database) # doctest: +REMOTE_DATA 72 Note that the ``in`` operator only works as expected after the :meth:`Database.commit` method has been called! 3. Displaying entries in a table ******************************** In the previous code snippets 71 entries have been added, all of them saving a lot of data. To display the database in a table format there is a helper function. :func:`tables.display_entries` takes two arguments: the first one is an iterator of :class:`tables.DatabaseEntry` instances. Remember that an instance of :class:`Database` yields instances of :class:`tables.DatabaseEntry` instances, so you can simply pass a database object. The second argument is an iterable of the resulting columns in the table to be displayed. Each string in this iterable is used to access the entry's attribute values. In the following example, the values of ``entry.id``, ``entry.observation_time_start``, ``entry.observation_time_end``, ``entry.instrument``, ``entry.wavemin``, and ``entry.wavemax`` are displayed (where ``entry`` stands for the respective database entry). Note that *N/A* is displayed if the value cannot be found or is not set. >>> from sunpy.database.tables import display_entries >>> print(display_entries(database, ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax'])) # doctest: +REMOTE_DATA id observation_time_start ... wavemin wavemax --- ---------------------- ... ------------------ ------------------ 1 2011-06-07 06:33:02 ... 17.1 17.1 2 2011-06-07 06:33:01 ... 13.100000000000001 13.100000000000001 3 2011-06-07 06:33:02 ... 17.1 17.1 4 2011-06-07 06:33:02 ... 21.1 21.1 5 2011-06-07 06:33:03 ... 33.5 33.5 6 2011-06-07 06:33:05 ... 9.4 9.4 7 2011-06-07 06:33:05 ... 160.0 160.0 8 2011-06-07 06:33:07 ... 19.3 19.3 9 2011-06-07 06:33:07 ... 19.3 19.3 10 2011-06-07 06:39:31 ... 19.3 19.3 ... ... ... ... ... 62 2011-05-08 00:00:02 ... 9.4 9.4 63 2011-05-08 00:00:03 ... 33.5 33.5 64 2012-08-05 00:00:01 ... 9.4 9.4 65 2012-08-05 00:00:01 ... 9.4 9.4 66 2012-08-05 00:00:02 ... 33.5 33.5 67 2012-08-05 00:00:02 ... 33.5 33.5 68 2013-08-05 00:00:01 ... 9.4 9.4 69 2013-08-05 00:00:01 ... 9.4 9.4 70 2013-08-05 00:00:02 ... 33.5 33.5 71 2013-08-05 00:00:02 ... 33.5 33.5 72 N/A ... 25.0 N/A Length = 72 rows The index operator can be used to access certain single database entries like ``database[5]`` to get the 5th entry or ``database[-2]`` to get the second-latest entry. It is also possible to use more advanced slicing syntax; see https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html for more information. >>> print(display_entries(database[9::10], ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax'])) # doctest: +REMOTE_DATA id observation_time_start observation_time_end instrument wavemin wavemax --- ---------------------- -------------------- ---------- ------- ------- 10 2011-06-07 06:39:31 N/A AIA_2 19.3 19.3 20 2011-06-06 23:59:55 2011-06-08 00:00:05 GBM N/A N/A 30 N/A N/A N/A N/A N/A 40 N/A N/A N/A N/A N/A 50 N/A N/A N/A N/A N/A 60 2011-05-08 00:00:00 2011-05-08 00:00:01 AIA 17.1 17.1 70 2013-08-05 00:00:02 2013-08-05 00:00:03 AIA 33.5 33.5 4. Removing entries ******************* `Database.remove()` can be used to remove database entries from the sunpy database. It takes a ``tables.DatabaseEntry`` object as argument. For example, imagine we want to only have database entries which have an observation time saved. To remove all the entries where the value of both ``observation_time_start`` and ``observation_time_end`` is ``None``, simply iterate over the database and the :meth:`Database.remove` method to remove those where there is no time set: >>> for database_entry in database: ... if database_entry.observation_time_start is None and database_entry.observation_time_end is None: ... database.remove(database_entry) ... >>> len(database) # doctest: +REMOTE_DATA 39 >>> print(display_entries(database, ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax'])) # doctest: +REMOTE_DATA id observation_time_start ... wavemin wavemax --- ---------------------- ... ------------------ ------------------ 1 2011-06-07 06:33:02 ... 17.1 17.1 2 2011-06-07 06:33:01 ... 13.100000000000001 13.100000000000001 3 2011-06-07 06:33:02 ... 17.1 17.1 4 2011-06-07 06:33:02 ... 21.1 21.1 5 2011-06-07 06:33:03 ... 33.5 33.5 6 2011-06-07 06:33:05 ... 9.4 9.4 7 2011-06-07 06:33:05 ... 160.0 160.0 8 2011-06-07 06:33:07 ... 19.3 19.3 9 2011-06-07 06:33:07 ... 19.3 19.3 10 2011-06-07 06:39:31 ... 19.3 19.3 ... ... ... ... ... 61 2011-05-08 00:00:00 ... 21.1 21.1 62 2011-05-08 00:00:02 ... 9.4 9.4 63 2011-05-08 00:00:03 ... 33.5 33.5 64 2012-08-05 00:00:01 ... 9.4 9.4 65 2012-08-05 00:00:01 ... 9.4 9.4 66 2012-08-05 00:00:02 ... 33.5 33.5 67 2012-08-05 00:00:02 ... 33.5 33.5 68 2013-08-05 00:00:01 ... 9.4 9.4 69 2013-08-05 00:00:01 ... 9.4 9.4 70 2013-08-05 00:00:02 ... 33.5 33.5 71 2013-08-05 00:00:02 ... 33.5 33.5 Length = 39 rows 5. Editing entries ****************** 5.1 Starring and unstarring entries =================================== The database package supports marking certain entries as "starred" using the :meth:`Database.star` method. For example, to star all values that have a wavelength of 20nm or higher: >>> for database_entry in database: ... if database_entry.wavemin and database_entry.wavemin > 20: ... database.star(database_entry) >>> print(display_entries( ... filter(lambda entry: entry.starred, database), ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax'])) # doctest: +REMOTE_DATA id observation_time_start ... wavemin wavemax --- ---------------------- ... ----------------- ----------------- 4 2011-06-07 06:33:02 ... 21.1 21.1 5 2011-06-07 06:33:03 ... 33.5 33.5 7 2011-06-07 06:33:05 ... 160.0 160.0 16 2011-06-07 06:32:11 ... 617.3000000000001 617.3000000000001 61 2011-05-08 00:00:00 ... 21.1 21.1 63 2011-05-08 00:00:03 ... 33.5 33.5 66 2012-08-05 00:00:02 ... 33.5 33.5 67 2012-08-05 00:00:02 ... 33.5 33.5 70 2013-08-05 00:00:02 ... 33.5 33.5 71 2013-08-05 00:00:02 ... 33.5 33.5 To remove the star from these entries, the :meth:`Database.unstar` method works the same way. 5.2 Setting and removing tags ============================= To add some more information by assigning tags to entries, the database package also supports *tags*. The ``tags`` property of a database object holds all tags that are saved in the database. For example, to assign the tag *spring* to all entries that have been observed in March, April, or May on any day in any year: >>> for database_entry in database: ... if database_entry.observation_time_start.month in [3,4,5]: ... database.tag(database_entry, 'spring') >>> database.tags # doctest: +REMOTE_DATA [] >>> spring = database.tags[0] # doctest: +REMOTE_DATA >>> print(display_entries( ... filter(lambda entry: spring in entry.tags, database), ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax'])) # doctest: +REMOTE_DATA id observation_time_start observation_time_end instrument wavemin wavemax --- ---------------------- -------------------- ---------- ------- ------- 17 2014-04-09 06:00:12 N/A AIA_3 17.1 17.1 60 2011-05-08 00:00:00 2011-05-08 00:00:01 AIA 17.1 17.1 61 2011-05-08 00:00:00 2011-05-08 00:00:01 AIA 21.1 21.1 62 2011-05-08 00:00:02 2011-05-08 00:00:03 AIA 9.4 9.4 63 2011-05-08 00:00:03 2011-05-08 00:00:04 AIA 33.5 33.5 5.3 Manually changing attributes ================================ Attributes for entries in the database can be manually edited. The :meth:`Database.edit` method receives the database entry to be edited and any number of keyword arguments to describe which values to change and how. For example, to change the time entires that are ``None`` to the start of the observation time (because it's possible, not because it is accurate!): >>> for database_entry in database: ... if database_entry.observation_time_end is None: ... database.edit(database_entry, observation_time_end=database_entry.observation_time_start) ... >>> print(display_entries( ... database, ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax'])) # doctest: +REMOTE_DATA id observation_time_start ... wavemin wavemax --- ---------------------- ... ------------------ ------------------ 1 2011-06-07 06:33:02 ... 17.1 17.1 2 2011-06-07 06:33:01 ... 13.100000000000001 13.100000000000001 3 2011-06-07 06:33:02 ... 17.1 17.1 4 2011-06-07 06:33:02 ... 21.1 21.1 5 2011-06-07 06:33:03 ... 33.5 33.5 6 2011-06-07 06:33:05 ... 9.4 9.4 7 2011-06-07 06:33:05 ... 160.0 160.0 8 2011-06-07 06:33:07 ... 19.3 19.3 9 2011-06-07 06:33:07 ... 19.3 19.3 10 2011-06-07 06:39:31 ... 19.3 19.3 ... ... ... ... ... 61 2011-05-08 00:00:00 ... 21.1 21.1 62 2011-05-08 00:00:02 ... 9.4 9.4 63 2011-05-08 00:00:03 ... 33.5 33.5 64 2012-08-05 00:00:01 ... 9.4 9.4 65 2012-08-05 00:00:01 ... 9.4 9.4 66 2012-08-05 00:00:02 ... 33.5 33.5 67 2012-08-05 00:00:02 ... 33.5 33.5 68 2013-08-05 00:00:01 ... 9.4 9.4 69 2013-08-05 00:00:01 ... 9.4 9.4 70 2013-08-05 00:00:02 ... 33.5 33.5 71 2013-08-05 00:00:02 ... 33.5 33.5 Length = 39 rows It is possible to use ``database_entry.observation_time_end = database_entry.observation_time_start``", but it has one major disadvantage: this operation cannot be undone. See section 6 to see how undoing and redoing works. 6. Undoing and redoing operations ********************************* A very handy feature of the database package is that every operation that changes the database in some way can be reverted. The Database class has the methods :meth:`Database.undo` and :meth:`Database.redo` to undo and redo the last n commands, respectively. .. warning:: The undo and redo history are only saved in-memory! That means in particular, that if you work on a Database object in an interactive Python session and quit this session, the undo and redo history are lost. In the following snippet, the operations from the sections 5.3, 5.2, and 5.1 are undone. Note the following changes: there are no longer any tags anymore saved in the database, there is no entry which is starred and the entries with no end of observation time are back. >>> database.undo(4) # undo the edits from 5.3 (4 records have been affected) # doctest: +REMOTE_DATA >>> print(display_entries( ... database, ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax', 'tags', 'starred'])) # doctest: +REMOTE_DATA id observation_time_start observation_time_end ... tags starred --- ---------------------- -------------------- ... ------ ------- 1 2011-06-07 06:33:02 2011-06-07 06:33:02 ... N/A No 2 2011-06-07 06:33:01 2011-06-07 06:33:01 ... N/A No 3 2011-06-07 06:33:02 2011-06-07 06:33:02 ... N/A No 4 2011-06-07 06:33:02 2011-06-07 06:33:02 ... N/A Yes 5 2011-06-07 06:33:03 2011-06-07 06:33:03 ... N/A Yes 6 2011-06-07 06:33:05 2011-06-07 06:33:05 ... N/A No 7 2011-06-07 06:33:05 2011-06-07 06:33:05 ... N/A Yes 8 2011-06-07 06:33:07 2011-06-07 06:33:07 ... N/A No 9 2011-06-07 06:33:07 2011-06-07 06:33:07 ... N/A No 10 2011-06-07 06:39:31 2011-06-07 06:39:31 ... N/A No ... ... ... ... ... ... 61 2011-05-08 00:00:00 2011-05-08 00:00:01 ... spring Yes 62 2011-05-08 00:00:02 2011-05-08 00:00:03 ... spring No 63 2011-05-08 00:00:03 2011-05-08 00:00:04 ... spring Yes 64 2012-08-05 00:00:01 2012-08-05 00:00:02 ... N/A No 65 2012-08-05 00:00:01 2012-08-05 00:00:02 ... N/A No 66 2012-08-05 00:00:02 2012-08-05 00:00:03 ... N/A Yes 67 2012-08-05 00:00:02 2012-08-05 00:00:03 ... N/A Yes 68 2013-08-05 00:00:01 2013-08-05 00:00:02 ... N/A No 69 2013-08-05 00:00:01 2013-08-05 00:00:02 ... N/A No 70 2013-08-05 00:00:02 2013-08-05 00:00:03 ... N/A Yes 71 2013-08-05 00:00:02 2013-08-05 00:00:03 ... N/A Yes Length = 39 rows The :meth:`~Database.redo` method reverts the last n operations that have been undone. If not that many operations can be redone (i.e. any number greater than 14 in this example), an exception is raised. The redo call reverts the original state: the tags have appeared again and all entries with a wavelength >20nm are starred again, and there are no entries with no stored end of observation time. >>> database.redo(1) # redo all undone operations # doctest: +REMOTE_DATA >>> print(display_entries( ... database, ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax', 'tags', 'starred'])) # doctest: +REMOTE_DATA id observation_time_start observation_time_end ... tags starred --- ---------------------- -------------------- ... ------ ------- 1 2011-06-07 06:33:02 2011-06-07 06:33:02 ... N/A No 2 2011-06-07 06:33:01 2011-06-07 06:33:01 ... N/A No 3 2011-06-07 06:33:02 2011-06-07 06:33:02 ... N/A No 4 2011-06-07 06:33:02 2011-06-07 06:33:02 ... N/A Yes 5 2011-06-07 06:33:03 2011-06-07 06:33:03 ... N/A Yes 6 2011-06-07 06:33:05 2011-06-07 06:33:05 ... N/A No 7 2011-06-07 06:33:05 2011-06-07 06:33:05 ... N/A Yes 8 2011-06-07 06:33:07 2011-06-07 06:33:07 ... N/A No 9 2011-06-07 06:33:07 2011-06-07 06:33:07 ... N/A No 10 2011-06-07 06:39:31 2011-06-07 06:39:31 ... N/A No ... ... ... ... ... ... 61 2011-05-08 00:00:00 2011-05-08 00:00:01 ... spring Yes 62 2011-05-08 00:00:02 2011-05-08 00:00:03 ... spring No 63 2011-05-08 00:00:03 2011-05-08 00:00:04 ... spring Yes 64 2012-08-05 00:00:01 2012-08-05 00:00:02 ... N/A No 65 2012-08-05 00:00:01 2012-08-05 00:00:02 ... N/A No 66 2012-08-05 00:00:02 2012-08-05 00:00:03 ... N/A Yes 67 2012-08-05 00:00:02 2012-08-05 00:00:03 ... N/A Yes 68 2013-08-05 00:00:01 2013-08-05 00:00:02 ... N/A No 69 2013-08-05 00:00:01 2013-08-05 00:00:02 ... N/A No 70 2013-08-05 00:00:02 2013-08-05 00:00:03 ... N/A Yes 71 2013-08-05 00:00:02 2013-08-05 00:00:03 ... N/A Yes Length = 39 rows 7. Querying the database ************************ The API for querying databases is similar to querying the VSO using the method :meth:`sunpy.net.vso.VSOClient.search`. The :meth:`Database.search` method accepts any number of ORed query attributes (using \|) and combines them using AND. It returns a list of matched database entries. The special thing about querying databases is that all attributes support the unary operator ``~`` to negate specific attributes. Example: the query ``Instrument.eit`` returns all entries that have *not* been observed with the EIT. 7.1 Using VSO attributes ======================== Using the attributes from :mod:`sunpy.net.attrs` is quite intuitive: the simple attributes and the Time attribute work exactly as you expect. .. note:: The ``near`` parameter of :class:`sunpy.net.attrs.Time` is ignored, because it's behaviour is not documented and it is different depending on the server which is requested. The following query returns the data that was added in section 2.3.2: >>> print(display_entries( ... database.search(a.Time('2012-08-05', '2012-08-05 00:00:05'), a.Instrument.aia), ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax'], sort=True)) # doctest: +REMOTE_DATA id observation_time_start observation_time_end instrument wavemin wavemax --- ---------------------- -------------------- ---------- ------- ------- 64 2012-08-05 00:00:01 2012-08-05 00:00:02 AIA 9.4 9.4 65 2012-08-05 00:00:01 2012-08-05 00:00:02 AIA 9.4 9.4 66 2012-08-05 00:00:02 2012-08-05 00:00:03 AIA 33.5 33.5 67 2012-08-05 00:00:02 2012-08-05 00:00:03 AIA 33.5 33.5 .. NOTE the following code does not actually work. There seems to be a bug in sunpy.util.unit_conversion.to_angstrom (this is called by the __init__ of the Wave attribute) When using the :class:`sunpy.net.attrs.Wavelength` attribute, you have to specify a unit using `astropy.units.Quantity`. If not an error is raised. This also means that there is no default unit that is used by the class. To know how you can specify a detail using astropy check `astropy.units`. >>> import astropy.units as u >>> print(display_entries( ... database.search(a.Wavelength(1.0*u.nm, 2.0*u.nm)), ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax'], sort=True)) # doctest: +REMOTE_DATA id observation_time_start ... wavemin wavemax --- ---------------------- ... ------------------ ------------------ 1 2011-06-07 06:33:02 ... 17.1 17.1 10 2011-06-07 06:39:31 ... 19.3 19.3 11 2011-06-07 06:45:55 ... 19.3 19.3 12 2011-06-07 06:52:19 ... 19.3 19.3 13 2011-06-07 06:58:43 ... 19.3 19.3 17 2014-04-09 06:00:12 ... 17.1 17.1 18 2011-06-07 20:37:52 ... 19.5 19.5 2 2011-06-07 06:33:01 ... 13.100000000000001 13.100000000000001 3 2011-06-07 06:33:02 ... 17.1 17.1 58 2011-06-07 06:33:29 ... 17.400000000000002 17.400000000000002 60 2011-05-08 00:00:00 ... 17.1 17.1 8 2011-06-07 06:33:07 ... 19.3 19.3 9 2011-06-07 06:33:07 ... 19.3 19.3 7.2 Database-specific attributes ================================ There are 5 additional query attributes supported by the database package. They can be imported from the submodule :mod:`sunpy.database.attrs` and are in particular: - Starred - Tag - Path - DownloadTime - FitsHeaderEntry The following query searches for all entries that have the tag 'spring' or (inclusive or!) are starred and have not the FITS header key 'WAVEUNIT' with the value 'Angstrom': >>> import sunpy.database.attrs as dbattrs >>> print(display_entries( ... database.search(dbattrs.Tag('spring') | dbattrs.Starred(), ~dbattrs.FitsHeaderEntry('WAVEUNIT', 'Angstrom')), ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax', 'tags', 'starred'], sort=True)) # doctest: +REMOTE_DATA id observation_time_start observation_time_end ... tags starred --- ---------------------- -------------------- ... ------ ------- 16 2011-06-07 06:32:11 2011-06-07 06:32:11 ... N/A Yes 17 2014-04-09 06:00:12 2014-04-09 06:00:12 ... spring No 4 2011-06-07 06:33:02 2011-06-07 06:33:02 ... N/A Yes 5 2011-06-07 06:33:03 2011-06-07 06:33:03 ... N/A Yes 60 2011-05-08 00:00:00 2011-05-08 00:00:01 ... spring No 61 2011-05-08 00:00:00 2011-05-08 00:00:01 ... spring Yes 62 2011-05-08 00:00:02 2011-05-08 00:00:03 ... spring No 63 2011-05-08 00:00:03 2011-05-08 00:00:04 ... spring Yes 66 2012-08-05 00:00:02 2012-08-05 00:00:03 ... N/A Yes 67 2012-08-05 00:00:02 2012-08-05 00:00:03 ... N/A Yes 7 2011-06-07 06:33:05 2011-06-07 06:33:05 ... N/A Yes 70 2013-08-05 00:00:02 2013-08-05 00:00:03 ... N/A Yes 71 2013-08-05 00:00:02 2013-08-05 00:00:03 ... N/A Yes 8. Caching ********** All entries that are saved in the database are also saved in a cache in-memory. The type of the cache is determined at the initialization of the database object and cannot be changed after that. The default type is :class:`caching.LRUCache` (least-recently used) and the other one which is supported is :class:`caching.LFUCache` (least-frequently used). By default the cache size is ``float('inf')``, i.e. infinite. To set the cache size after the database object has been initialized, use the method :meth:`Database.set_cache_size`. If the new size is smaller than the current number of database entries, entries are removed according to the cache type until the number of entries is equal to the given cache size. The following call to :meth:`Database.set_cache_size` sets the cache size to 10 and therefore removes the 5 entries that been used least recently. >>> database.set_cache_size(10) >>> print(display_entries( ... database, ... ['id', 'observation_time_start', 'observation_time_end', ... 'instrument', 'wavemin', 'wavemax'])) # doctest: +REMOTE_DATA id observation_time_start ... wavemin wavemax --- ---------------------- ... ------------------ ------------------ 9 2011-06-07 06:33:07 ... 19.3 19.3 10 2011-06-07 06:39:31 ... 19.3 19.3 11 2011-06-07 06:45:55 ... 19.3 19.3 12 2011-06-07 06:52:19 ... 19.3 19.3 13 2011-06-07 06:58:43 ... 19.3 19.3 16 2011-06-07 06:32:11 ... 617.3000000000001 617.3000000000001 17 2014-04-09 06:00:12 ... 17.1 17.1 18 2011-06-07 20:37:52 ... 19.5 19.5 58 2011-06-07 06:33:29 ... 17.400000000000002 17.400000000000002 59 2011-06-06 00:00:00 ... N/A N/A ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/acquiring_data/fido.rst0000644000175100001710000007625600000000000020417 0ustar00vstsdocker.. _fido_guide: *************************************** Finding and Downloading Data using Fido *************************************** This guide outlines how to search for and download data using `~sunpy.net.Fido` sunpy's interface for search and download. `~sunpy.net.Fido` is a unified interface for searching and fetching solar physics data irrespective of the underlying client or webservice through which the data is obtained, e.g. VSO_,JSOC_, etc. It therefore supplies a single, easy and consistent way to obtain most forms of solar physics data. Import ****** The `~sunpy.net.Fido` object is in `sunpy.net`. It can be imported as follows:: >>> from sunpy.net import Fido, attrs as a Search Attributes ***************** To search for data with `~sunpy.net.Fido`, you need to specify attributes to search against. The range of attributes are found in the `attrs ` submodule. Examples of these attributes are: - `a.Time ` - `a.Instrument ` - `a.Wavelength ` whereas some of these attributes are client specific, and are found under client specific submodules, e.g. `attrs.vso ` and `attrs.jsoc `. In to each attribute you have to provide a value to use:: >>> a.Time('2012/3/4', '2012/3/6'), a.Instrument.lyra (, ) For attributes that have no fixed selection of values (``Time`` for example) you will have to provide the range you require. However, for attributes that have a fixed range of **known** values, it is possible to list all these values. **Please note that each list is not exhaustive.** Using ``Instrument`` as the first example, if you print the object:: >>> print(a.Instrument) sunpy.net.attrs.Instrument Specifies the Instrument name for the search. Attribute Name Client Full Name Description --------------------------- ----------- ------------------------ -------------------------------------------------------------------------------- aia VSO AIA Atmospheric Imaging Assembly bcs VSO BCS Bragg Crystal Spectrometer be_continuum VSO BE-Continuum INAF-OACT Barra Equatoriale Continuum Instrument be_halpha VSO BE-Halpha INAF-OACT Barra Equatoriale Hα Instrument bigbear VSO Big Bear Big Bear Solar Observatory, California TON and GONG+ sites caii VSO CAII Kanzelhöhe Ca II k Instrument cds VSO CDS Coronal Diagnostic Spectrometer celias VSO CELIAS Charge, Element, and Isotope Analysis System ... You get a full list of known values, a description and what "Clients" support those values (if you want to use a specific data source). This is supported for most attributes including the client specific ones. For example you can print a list of Series provided by JSOC:: >>> print(a.jsoc.Series) sunpy.net.jsoc.attrs.Series The JSOC Series to Download. Attribute Name Client Full Name Description ---------------------------------- ------ ---------------------------------- -------------------------------------------------------------------------------- aia_flatfield JSOC aia.flatfield AIA flatfield aia_lev1 JSOC aia.lev1 AIA Level 1 aia_lev1_euv_12s JSOC aia.lev1_euv_12s AIA Level 1, 12 second cadence aia_lev1_uv_24s JSOC aia.lev1_uv_24s AIA Level 1, 24 second cadence aia_lev1_vis_1h JSOC aia.lev1_vis_1h AIA Level 1, 3600 second cadence aia_master_pointing3h JSOC aia.master_pointing3h Master Pointing Parameters aia_response JSOC aia.response AIA instrument response table aia_temperature_summary_300s JSOC aia.temperature_summary_300s Temperature Statistics from AIA Housekeeping - Thermal Packet hmi_b_135s JSOC hmi.b_135s Full-disk Milne-Eddington inversion with the azimuth disambiguation informati... ... Furthermore, you can use tab completion to auto-fill the attribute name, for example by typing ``a.jsoc.aia_f``. Searching for Data Using Fido ***************************** For example:: >>> result = Fido.search(a.Time('2012/3/4', '2012/3/6'), a.Instrument.lyra, a.Level.two) # doctest: +REMOTE_DATA this returns an `~sunpy.net.fido_factory.UnifiedResponse` object containing information on the results which fit the criteria specified by the attrs objects in the above call. It does not download the files. For instructions on how to download data using Fido, see :ref:`downloading_data`. To see a summary of the results of our query, simply type the name of the variable set to the Fido search, in this case, result:: >>> result # doctest: +REMOTE_DATA Results from 1 Provider: 3 Results from the LYRAClient: Source: http://proba2.oma.be/lyra/data/bsd Start Time End Time Instrument ... Provider Level ----------------------- ----------------------- ---------- ... -------- ----- 2012-03-04 00:00:00.000 2012-03-04 23:59:59.999 LYRA ... ESA 2 2012-03-05 00:00:00.000 2012-03-05 23:59:59.999 LYRA ... ESA 2 2012-03-06 00:00:00.000 2012-03-06 23:59:59.999 LYRA ... ESA 2 Queries can be made more flexible or specific by adding more attrs objects to the `~sunpy.net.Fido` search. Specific passbands can be searched for by supplying an `~astropy.units.Quantity` to the `a.Wavelength ` attribute:: >>> import astropy.units as u >>> Fido.search(a.Time('2012/3/4', '2012/3/6'), a.Instrument.norh, ... a.Wavelength(17*u.GHz)) # doctest: +REMOTE_DATA Results from 1 Provider: 3 Results from the NoRHClient: Source: https://solar.nro.nao.ac.jp/norh/doc/manuale/node1.html Start Time End Time ... Provider Wavelength ... GHz ----------------------- ----------------------- ... -------- ---------- 2012-03-04 00:00:00.000 2012-03-04 23:59:59.999 ... NRO 17.0 2012-03-05 00:00:00.000 2012-03-05 23:59:59.999 ... NRO 17.0 2012-03-06 00:00:00.000 2012-03-06 23:59:59.999 ... NRO 17.0 Data of a given cadence can also be specified using the Sample attribute. To search for data at a given cadence use the `a.Sample ` attribute. >>> Fido.search(a.Time('2012/3/4', '2012/3/6'), a.Instrument.aia, ... a.Wavelength(171*u.angstrom), a.Sample(10*u.minute)) # doctest: +REMOTE_DATA Results from 1 Provider: 289 Results from the VSOClient: Source: http://vso.stanford.edu/cgi-bin/search Start Time ... ... ----------------------- ... 2012-03-04 00:00:00.000 ... 2012-03-04 00:10:00.000 ... 2012-03-04 00:20:00.000 ... 2012-03-04 00:30:00.000 ... 2012-03-04 00:40:00.000 ... 2012-03-04 00:50:00.000 ... 2012-03-04 01:00:00.000 ... 2012-03-04 01:10:00.000 ... 2012-03-04 01:20:00.000 ... 2012-03-04 01:30:00.000 ... ... ... 2012-03-05 22:30:00.000 ... 2012-03-05 22:40:00.000 ... 2012-03-05 22:50:00.000 ... 2012-03-05 23:00:00.000 ... 2012-03-05 23:10:00.000 ... 2012-03-05 23:20:00.000 ... 2012-03-05 23:30:00.000 ... 2012-03-05 23:40:00.000 ... 2012-03-05 23:50:00.000 ... 2012-03-06 00:00:00.000 ... Length = 289 rows To search for data from multiple instruments, wavelengths, times etc., use the pipe ``|`` operator. This joins queries together just as the logical ``OR`` operator would:: >>> Fido.search(a.Time('2012/3/4', '2012/3/4 02:00'), ... a.Instrument.lyra | a.Instrument.rhessi) # doctest: +REMOTE_DATA Results from 3 Providers: 2 Results from the LYRAClient: Source: http://proba2.oma.be/lyra/data/bsd Start Time End Time Instrument ... Provider Level ----------------------- ----------------------- ---------- ... -------- ----- 2012-03-04 00:00:00.000 2012-03-04 23:59:59.999 LYRA ... ESA 2 2012-03-04 00:00:00.000 2012-03-04 23:59:59.999 LYRA ... ESA 3 1 Results from the RHESSIClient: Source: https://hesperia.gsfc.nasa.gov/hessidata Start Time End Time Instrument ... Source Provider ----------------------- ----------------------- ---------- ... ------ -------- 2012-03-04 00:00:00.000 2012-03-04 23:59:59.999 RHESSI ... RHESSI NASA 3 Results from the VSOClient: Source: http://vso.stanford.edu/cgi-bin/search Start Time End Time ... Size Info ... Mibyte ----------------------- ----------------------- ... -------- -------------- 2012-03-03 22:57:40.000 2012-03-04 00:33:20.000 ... -0.00098 RHESSI level-0 2012-03-04 00:33:20.000 2012-03-04 01:45:40.000 ... -0.00098 RHESSI level-0 2012-03-04 01:45:40.000 2012-03-04 02:09:00.000 ... -0.00098 RHESSI level-0 Working with Search Results *************************** :meth:`Fido.search ` can make multiple queries to multiple clients in one search. This means that the results of a call to search can contain many sets of records, called responses, from many clients. The results of a search are represented in a `~sunpy.net.fido_factory.UnifiedResponse` object, which provides access to all the response tables and allows some operations to be performed on all the results at once. `~sunpy.net.fido_factory.UnifiedResponse` acts both like a two dimensional array, where the first dimension is the response index and the second index is the row index, and a dictionary where you can index the responses by the name of the client. For example, the following code returns a response containing LYRA data from the `~sunpy.net.dataretriever.LYRAClient`, and EVE data from the `~sunpy.net.vso.VSOClient`:: >>> from sunpy.net import Fido, attrs as a >>> results = Fido.search(a.Time("2012/1/1", "2012/1/2"), a.Level.two, ... a.Instrument.lyra | a.Instrument.eve) # doctest: +REMOTE_DATA >>> results # doctest: +REMOTE_DATA Results from 2 Providers: 2 Results from the LYRAClient: Source: http://proba2.oma.be/lyra/data/bsd Start Time End Time Instrument ... Provider Level ----------------------- ----------------------- ---------- ... -------- ----- 2012-01-01 00:00:00.000 2012-01-01 23:59:59.999 LYRA ... ESA 2 2012-01-02 00:00:00.000 2012-01-02 23:59:59.999 LYRA ... ESA 2 50 Results from the VSOClient: Source: http://vso.stanford.edu/cgi-bin/search Start Time End Time ... Size Info ... Mibyte ----------------------- ----------------------- ... -------- ---------------- 2012-01-01 00:00:00.000 2012-01-01 01:00:00.000 ... -0.00098 L2Lines (merged) 2012-01-01 00:00:00.000 2012-01-01 01:00:00.000 ... -0.00098 L2Spectra (MEGS) 2012-01-01 01:00:00.000 2012-01-01 02:00:00.000 ... -0.00098 L2Lines (merged) ... ... ... ... ... 2012-01-01 23:00:00.000 2012-01-02 00:00:00.000 ... -0.00098 L2Spectra (MEGS) 2012-01-02 00:00:00.000 2012-01-02 01:00:00.000 ... -0.00098 L2Lines (merged) 2012-01-02 00:00:00.000 2012-01-02 01:00:00.000 ... -0.00098 L2Spectra (MEGS) Length = 50 rows If you then wanted to inspect just the LYRA data for the whole time range specified in the search, you would index this response to see just the results returned by the `~sunpy.net.dataretriever.LYRAClient`:: >>> results[0, :] # doctest: +REMOTE_DATA Start Time End Time Instrument ... Provider Level ----------------------- ----------------------- ---------- ... -------- ----- 2012-01-01 00:00:00.000 2012-01-01 23:59:59.999 LYRA ... ESA 2 2012-01-02 00:00:00.000 2012-01-02 23:59:59.999 LYRA ... ESA 2 Or, equivalently:: >>> results["lyra"] # doctest: +REMOTE_DATA Start Time End Time Instrument ... Provider Level ----------------------- ----------------------- ---------- ... -------- ----- 2012-01-01 00:00:00.000 2012-01-01 23:59:59.999 LYRA ... ESA 2 2012-01-02 00:00:00.000 2012-01-02 23:59:59.999 LYRA ... ESA 2 Normal slicing operations work as with any other Python sequence, e.g. ``results[1,::10]`` to access every tenth file in the result returned by the second client. Note that the first (response) index is still necessary even if results are only found for a single client. So in this case the first result would be ``results[0, 0]`` rather than ``results[0]`` (the latter would return all results from the first - and only - client and is therefore the same as ``results``). Working with Response Tables ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As we have seen above the `~sunpy.net.fido_factory.UnifiedResponse` object contains many response tables which make up the search results. Each of the responses are `~sunpy.net.base_client.QueryResponseTable` objects, which are `astropy.table` objects meaning that you can interact with them and filter them like any other tabular data. This can be used to interact with results which are metadata only, i.e. searches from the HEK, or it can be used to reduce the number of files downloaded by `Fido.fetch `. For example if we did a query for some AIA and HMI data:: >>> results = Fido.search(a.Time("2020/01/01", "2020/01/01 00:05"), a.Instrument.aia | a.Instrument.hmi) # doctest: +REMOTE_DATA >>> results # doctest: +REMOTE_DATA Results from 2 Providers: 201 Results from the VSOClient: Source: http://vso.stanford.edu/cgi-bin/search Start Time ... ... ----------------------- ... 2020-01-01 00:00:00.000 ... 2020-01-01 00:00:04.000 ... 2020-01-01 00:00:05.000 ... 2020-01-01 00:00:05.000 ... 2020-01-01 00:00:06.000 ... 2020-01-01 00:00:09.000 ... 2020-01-01 00:00:09.000 ... 2020-01-01 00:00:11.000 ... 2020-01-01 00:00:12.000 ... 2020-01-01 00:00:14.000 ... ... ... 2020-01-01 00:04:47.000 ... 2020-01-01 00:04:48.000 ... 2020-01-01 00:04:52.000 ... 2020-01-01 00:04:52.000 ... 2020-01-01 00:04:53.000 ... 2020-01-01 00:04:54.000 ... 2020-01-01 00:04:57.000 ... 2020-01-01 00:04:57.000 ... 2020-01-01 00:04:59.000 ... 2020-01-01 00:05:00.000 ... Length = 201 rows 21 Results from the VSOClient: Source: http://vso.stanford.edu/cgi-bin/search Start Time End Time ... Info ... ----------------------- ----------------------- ... -------------------------- 2020-01-01 00:00:22.000 2020-01-01 00:00:23.000 ... 45sec. Continuum intensity 2020-01-01 00:00:22.000 2020-01-01 00:00:23.000 ... 45sec. Magnetogram 2020-01-01 00:00:22.000 2020-01-01 00:00:23.000 ... 45sec. Dopplergram 2020-01-01 00:01:07.000 2020-01-01 00:01:08.000 ... 45sec. Continuum intensity 2020-01-01 00:01:07.000 2020-01-01 00:01:08.000 ... 45sec. Magnetogram 2020-01-01 00:01:07.000 2020-01-01 00:01:08.000 ... 45sec. Dopplergram 2020-01-01 00:01:52.000 2020-01-01 00:01:53.000 ... 45sec. Continuum intensity 2020-01-01 00:01:52.000 2020-01-01 00:01:53.000 ... 45sec. Magnetogram 2020-01-01 00:01:52.000 2020-01-01 00:01:53.000 ... 45sec. Dopplergram 2020-01-01 00:02:37.000 2020-01-01 00:02:38.000 ... 45sec. Continuum intensity 2020-01-01 00:02:37.000 2020-01-01 00:02:38.000 ... 45sec. Magnetogram 2020-01-01 00:02:37.000 2020-01-01 00:02:38.000 ... 45sec. Dopplergram 2020-01-01 00:03:22.000 2020-01-01 00:03:23.000 ... 45sec. Continuum intensity 2020-01-01 00:03:22.000 2020-01-01 00:03:23.000 ... 45sec. Magnetogram 2020-01-01 00:03:22.000 2020-01-01 00:03:23.000 ... 45sec. Dopplergram 2020-01-01 00:04:07.000 2020-01-01 00:04:08.000 ... 45sec. Continuum intensity 2020-01-01 00:04:07.000 2020-01-01 00:04:08.000 ... 45sec. Magnetogram 2020-01-01 00:04:07.000 2020-01-01 00:04:08.000 ... 45sec. Dopplergram 2020-01-01 00:04:52.000 2020-01-01 00:04:53.000 ... 45sec. Continuum intensity 2020-01-01 00:04:52.000 2020-01-01 00:04:53.000 ... 45sec. Magnetogram 2020-01-01 00:04:52.000 2020-01-01 00:04:53.000 ... 45sec. Dopplergram The VSO client returns a lot of information about the records, so the first thing we can do is show only the columns we are interested in. We can inspect all the available column names in all the responses with the `~.UnifiedResponse.all_colnames` property:: >>> results.all_colnames # doctest: +REMOTE_DATA ['End Time', 'Extent Length', 'Extent Type', 'Extent Width', 'Info', 'Instrument', 'Physobs', 'Provider', 'Size', 'Source', 'Start Time', 'Wavelength', 'Wavetype', 'fileid'] And then we can pick which ones to see with the :meth:`~.UnifiedResponse.show` method:: >>> results.show("Start Time", "Instrument", "Physobs", "Wavelength") # doctest: +REMOTE_DATA Results from 2 Providers: 201 Results from the VSOClient: Source: http://vso.stanford.edu/cgi-bin/search Start Time Instrument Physobs Wavelength [2] Angstrom ----------------------- ---------- --------- ---------------- 2020-01-01 00:00:00.000 AIA intensity 335.0 .. 335.0 2020-01-01 00:00:04.000 AIA intensity 193.0 .. 193.0 2020-01-01 00:00:05.000 AIA intensity 304.0 .. 304.0 2020-01-01 00:00:05.000 AIA intensity 4500.0 .. 4500.0 2020-01-01 00:00:06.000 AIA intensity 131.0 .. 131.0 2020-01-01 00:00:09.000 AIA intensity 171.0 .. 171.0 2020-01-01 00:00:09.000 AIA intensity 211.0 .. 211.0 2020-01-01 00:00:11.000 AIA intensity 94.0 .. 94.0 2020-01-01 00:00:12.000 AIA intensity 335.0 .. 335.0 2020-01-01 00:00:14.000 AIA intensity 1600.0 .. 1600.0 ... ... ... ... 2020-01-01 00:04:47.000 AIA intensity 94.0 .. 94.0 2020-01-01 00:04:48.000 AIA intensity 335.0 .. 335.0 2020-01-01 00:04:52.000 AIA intensity 1700.0 .. 1700.0 2020-01-01 00:04:52.000 AIA intensity 193.0 .. 193.0 2020-01-01 00:04:53.000 AIA intensity 304.0 .. 304.0 2020-01-01 00:04:54.000 AIA intensity 131.0 .. 131.0 2020-01-01 00:04:57.000 AIA intensity 171.0 .. 171.0 2020-01-01 00:04:57.000 AIA intensity 211.0 .. 211.0 2020-01-01 00:04:59.000 AIA intensity 94.0 .. 94.0 2020-01-01 00:05:00.000 AIA intensity 335.0 .. 335.0 Length = 201 rows 21 Results from the VSOClient: Source: http://vso.stanford.edu/cgi-bin/search Start Time Instrument Physobs Wavelength [2] Angstrom ----------------------- ---------- ------------------ ---------------- 2020-01-01 00:00:22.000 HMI intensity 6173.0 .. 6174.0 2020-01-01 00:00:22.000 HMI LOS_magnetic_field 6173.0 .. 6174.0 2020-01-01 00:00:22.000 HMI LOS_velocity 6173.0 .. 6174.0 2020-01-01 00:01:07.000 HMI intensity 6173.0 .. 6174.0 2020-01-01 00:01:07.000 HMI LOS_magnetic_field 6173.0 .. 6174.0 2020-01-01 00:01:07.000 HMI LOS_velocity 6173.0 .. 6174.0 2020-01-01 00:01:52.000 HMI intensity 6173.0 .. 6174.0 2020-01-01 00:01:52.000 HMI LOS_magnetic_field 6173.0 .. 6174.0 2020-01-01 00:01:52.000 HMI LOS_velocity 6173.0 .. 6174.0 2020-01-01 00:02:37.000 HMI intensity 6173.0 .. 6174.0 2020-01-01 00:02:37.000 HMI LOS_magnetic_field 6173.0 .. 6174.0 2020-01-01 00:02:37.000 HMI LOS_velocity 6173.0 .. 6174.0 2020-01-01 00:03:22.000 HMI intensity 6173.0 .. 6174.0 2020-01-01 00:03:22.000 HMI LOS_magnetic_field 6173.0 .. 6174.0 2020-01-01 00:03:22.000 HMI LOS_velocity 6173.0 .. 6174.0 2020-01-01 00:04:07.000 HMI intensity 6173.0 .. 6174.0 2020-01-01 00:04:07.000 HMI LOS_magnetic_field 6173.0 .. 6174.0 2020-01-01 00:04:07.000 HMI LOS_velocity 6173.0 .. 6174.0 2020-01-01 00:04:52.000 HMI intensity 6173.0 .. 6174.0 2020-01-01 00:04:52.000 HMI LOS_magnetic_field 6173.0 .. 6174.0 2020-01-01 00:04:52.000 HMI LOS_velocity 6173.0 .. 6174.0 To give an example of filtering post-search, let's only return the rows in the table which are line-of-sight magnetograms from HMI or the 94â„« passband from AIA. You can also always do this filtering with the `a.vso.Physobs ` and `a.Wavelength ` attrs in the search command. First we split the results in to a table for AIA and a table for HMI:: >>> aia, hmi = results # doctest: +REMOTE_DATA We can use boolean indexing to match the value of the ``"Physobs"`` column:: >>> hmi_los = hmi[hmi["Physobs"] == "LOS_magnetic_field"] # doctest: +REMOTE_DATA >>> hmi_los.show("Start Time", "Instrument", "Wavelength", "Physobs") # doctest: +REMOTE_DATA Start Time Instrument Wavelength [2] Physobs Angstrom ----------------------- ---------- ---------------- ------------------ 2020-01-01 00:00:22.000 HMI 6173.0 .. 6174.0 LOS_magnetic_field 2020-01-01 00:01:07.000 HMI 6173.0 .. 6174.0 LOS_magnetic_field 2020-01-01 00:01:52.000 HMI 6173.0 .. 6174.0 LOS_magnetic_field 2020-01-01 00:02:37.000 HMI 6173.0 .. 6174.0 LOS_magnetic_field 2020-01-01 00:03:22.000 HMI 6173.0 .. 6174.0 LOS_magnetic_field 2020-01-01 00:04:07.000 HMI 6173.0 .. 6174.0 LOS_magnetic_field 2020-01-01 00:04:52.000 HMI 6173.0 .. 6174.0 LOS_magnetic_field To match the ``"Wavelength"`` column we need to account for the fact that VSO results return a wavelength range of ``[min, max]`` so we match the min:: >>> aia_94 = aia[aia["Wavelength"][:, 0] == 94 * u.AA] # doctest: +REMOTE_DATA >>> aia_94.show("Start Time", "Instrument", "Wavelength", "Physobs") # doctest: +REMOTE_DATA Start Time Instrument Wavelength [2] Physobs Angstrom ----------------------- ---------- -------------- --------- 2020-01-01 00:00:11.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:00:23.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:00:35.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:00:47.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:00:59.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:01:11.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:01:23.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:01:35.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:01:47.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:01:59.000 AIA 94.0 .. 94.0 intensity ... ... ... ... 2020-01-01 00:03:11.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:03:23.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:03:35.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:03:47.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:03:59.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:04:11.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:04:23.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:04:35.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:04:47.000 AIA 94.0 .. 94.0 intensity 2020-01-01 00:04:59.000 AIA 94.0 .. 94.0 intensity Length = 25 rows These can then be passed to `Fido.fetch `:: >>> Fido.fetch(hmi_los, aia_94) # doctest: +SKIP .. warning:: While you can reduce the number of columns and rows in the results, the ``fetch()`` method may need certain columns to be present to successfully download the files. It is therefore highly recommended that if you are planning on downloading data you do not slice out columns, but instead use ``.show()`` to only display the ones you are interested in. .. _downloading_data: Downloading data **************** Once you have located your files via a `Fido.search `, you can download them via `Fido.fetch `:: >>> downloaded_files = Fido.fetch(results) # doctest: +SKIP This downloads the files to the location set in you sunpy config file. It also returns a `parfive.Results` object ``downloaded_files``, of absolute file paths of where the files have been downloaded to. You can also specify the path to which you want the data downloaded:: >>> downloaded_files = Fido.fetch(results, path='/ThisIs/MyPath/to/Data/{file}') # doctest: +SKIP This downloads the query results into the directory ``/ThisIs/MyPath/to/Data``, naming each downloaded file with the filename ``{file}`` obtained from the client. You can also use other properties of the returned query to define the path where the data is saved. For example, to save the data to a subdirectory named after the instrument, use:: >>> downloaded_files = Fido.fetch(results, path='./{instrument}/{file}') # doctest: +SKIP You can see the list of options that can be specified in path for all the files to be downloaded with ``results.path_format_keys``. Retrying Downloads ^^^^^^^^^^^^^^^^^^ If any files failed to download, the progress bar will show an incomplete number of files (i.e. 100/150) and the `parfive.Results` object will contain a list of the URLs that failed to transfer and the error associated with them. This can be accessed with the ``.errors`` attribute or by printing the `~parfive.Results` object:: >>> print(downloaded_files.errors) # doctest: +SKIP The transfer can be retried by passing the `parfive.Results` object back to `Fido.fetch `:: >>> downloaded_files = Fido.fetch(downloaded_files) # doctest: +SKIP doing this will append any newly downloaded file names to the list and replace the ``.errors`` list with any errors that occurred during the second attempt. .. _VSO: https://sdac.virtualsolar.org/cgi/search .. _JSOC: http://jsoc.stanford.edu/ Fido Clients ************ `~sunpy.net.Fido` provides access to many sources of data via "clients", these clients can be defined inside sunpy or in other packages. If you want to see the current list of clients you can do:: >>> print(Fido) sunpy.net.Fido Fido is a unified data search and retrieval tool. It provides simultaneous access to a variety of online data sources, some cover multiple instruments and data products like the Virtual Solar Observatory and some are specific to a single source. For details of using `~sunpy.net.Fido` see :ref:`fido_guide`. Client Description ----------------- ------------------------------------------------------------------------------------------------------- CDAWEBClient Provides access to query and download from the Coordinated Data Analysis Web (CDAWeb). EVEClient Provides access to Level 0C Extreme ultraviolet Variability Experiment (EVE) data. GBMClient Provides access to data from the Gamma-Ray Burst Monitor (GBM) instrument on board the Fermi satellite. XRSClient Provides access to the GOES XRS fits files archive. SUVIClient Provides access to data from the GOES Solar Ultraviolet Imager (SUVI). GONGClient Provides access to the Magnetogram products of NSO-GONG synoptic Maps. LYRAClient Provides access to the LYRA/Proba2 data archive. NOAAIndicesClient Provides access to the NOAA solar cycle indices. NOAAPredictClient Provides access to the NOAA SWPC predicted sunspot Number and 10.7 cm radio flux values. SRSClient Provides access to the NOAA SWPC solar region summary data. NoRHClient Provides access to the Nobeyama RadioHeliograph (NoRH) averaged correlation time series data. RHESSIClient Provides access to the RHESSI observing summary time series data. HEKClient Provides access to the Heliophysics Event Knowledgebase (HEK). HECClient Provides access to the HELIO webservices. JSOCClient Provides access to the JSOC Data Export service. VSOClient Provides access to query and download from Virtual Solar Observatory (VSO). ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/acquiring_data/hek.rst0000644000175100001710000003156100000000000020233 0ustar00vstsdocker************************ Using sunpy's HEK module ************************ The Heliophysics Event Knowledgebase (HEK) is a repository of feature and event information about the Sun. Entries are generated both by automated algorithms and human observers. sunpy accesses this information through the `~sunpy.net.hek` module, which was developed through support from the European Space Agency Summer of Code in Space (ESA-SOCIS) 2011. A simple query ************** To search the HEK, you need a start time, an end time, and an event type. Times are specified as strings or Python datetime objects. Event types are specified as upper case, two letter strings, and are identical to the two letter abbreviations found at the HEK website, http://www.lmsal.com/hek/VOEvent_Spec.html. >>> from sunpy.net import attrs as a >>> from sunpy.net import Fido >>> tstart = '2011/08/09 07:23:56' >>> tend = '2011/08/09 12:40:29' >>> event_type = 'FL' >>> result = Fido.search(a.Time(tstart,tend), a.hek.EventType(event_type)) # doctest: +REMOTE_DATA ``tstart`` and ``tend`` defines the start and end times of the query, and ``event_type`` specifies the event type which in this example we are searching for flares defined as ``FL``. Line 6 goes out to the web, contacts the HEK, and queries it for the information you have requested. Event data for ALL flares available in the HEK within the time range 2011/08/09 07:23:56 UT - 2011/08/09 12:40:20 UT will be returned, regardless of which feature recognition method used to detect the flare. Let's break down the arguments of ``Fido.search``. The first argument:: a.Time(tstart,tend) sets the start and end times for the query. The second argument:: a.hek.EventType(event_type) sets the type of event to look for. Since we have defined ``event_type = 'FL'``, this sets the query to look for flares. We could have also set the flare event type using the syntax:: a.hek.FL There is more on the attributes of hek in section 3 of this guide. The result ********** So, how many flare detections did the query turn up? The result object returned by ``Fido.search`` is a `~.UnifiedResponse` object which contains all the results from any clients used in the search. The first thing we need to do is access the results from the HEK client, the only ones for the query we gave. >>> len(result['hek']) # doctest: +REMOTE_DATA 19 This object is an `astropy.table.Table` object with the columns which correspond to the parameters listed at http://www.lmsal.com/hek/VOEvent_Spec.html. You can inspect all results very simply: >>> result['hek'] # doctest: +SKIP Remember, the HEK query we made returns all the flares in the time-range stored in the HEK, regardless of the feature recognition method. The HEK parameter which stores the the feature recognition method is called "frm_name". We can select just this column: >>> result["hek"]["frm_name"] # doctest: +REMOTE_DATA asainz asainz asainz asainz asainz asainz asainz SSW Latest Events SWPC Flare Detective - Trigger Module Flare Detective - Trigger Module SWPC SSW Latest Events Flare Detective - Trigger Module Flare Detective - Trigger Module Flare Detective - Trigger Module Flare Detective - Trigger Module Flare Detective - Trigger Module Flare Detective - Trigger Module It is likely each flare on the Sun was actually detected multiple times by many different methods. More complex queries ******************** The Fido allows you to make more complex queries. There are two key features you need to know in order to make use of the full power of Fido. Firstly, the attribute module - ``attrs.hek`` - describes ALL the parameters stored by the HEK as listed in http://www.lmsal.com/hek/VOEvent_Spec.html, and the HEK client makes these parameters searchable. To explain this, let's have a closer look at ``attrs.hek``. The help command is your friend here; scroll down to section DATA you will see: >>> help(a.hek) # doctest:+REMOTE_DATA Help on module sunpy.net.hek.attrs in sunpy.net.hek: NAME sunpy.net.hek.attrs DESCRIPTION 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. CLASSES ... You'll see that one of the attributes is a flare object:: FL = We can replace a.hek.EventType('FL') with a.hek.FL - they do the same thing, setting the query to look for flare events. Both methods of setting the event type are provided as a convenience Let's look further at the FRM attribute:: >>> help(a.hek.FRM) # doctest:+REMOTE_DATA Help on FRM in module sunpy.net.hek.attrs object: class FRM(builtins.object) | Data descriptors defined here: | | __dict__ | dictionary for instance variables (if defined) | | __weakref__ | list of weak references to the object (if defined) | | ---------------------------------------------------------------------- | Data and other attributes defined here: | | Contact = | | HumanFlag = | | Identifier = | | Institute = | | Name = | | ParamSet = | | SpecificID = | | URL = | | VersionNumber = Let's say I am only interested in those flares identified by the SSW Latest Events tool. I can retrieve those entries only from the HEK with the following command: >>> result = Fido.search(a.Time(tstart,tend), a.hek.EventType(event_type), a.hek.FRM.Name == 'SSW Latest Events') # doctest: +REMOTE_DATA >>> len(result[0]) # doctest: +REMOTE_DATA 2 We can also retrieve all the entries in the time range which were not made by SSW Latest Events with the following command: >>> result = Fido.search(a.Time(tstart,tend), a.hek.EventType(event_type), a.hek.FRM.Name != 'SSW Latest Events') # doctest: +REMOTE_DATA >>> len(result[0]) # doctest: +REMOTE_DATA 19 We are using Python's comparison operators to filter the returns from Fido. Other comparisons are possible. For example, let's say I want all the flares that have a peak flux of over 4000.0: >>> result = Fido.search(a.Time(tstart,tend), a.hek.EventType(event_type), a.hek.FL.PeakFlux > 4000.0) # doctest: +REMOTE_DATA >>> len(result[0]) # doctest: +REMOTE_DATA 1 Multiple comparisons can be included. For example, let's say I want all the flares with a peak flux above 1000 AND west of 800 arcseconds from disk center of the Sun: >>> result = Fido.search(a.Time(tstart,tend), a.hek.EventType(event_type), a.hek.Event.Coord1 > 800, a.hek.FL.PeakFlux > 1000.0) # doctest: +REMOTE_DATA Multiple comparison operators can be used to filter the results back from the HEK. The second important feature about the HEK client is that the comparisons we've made above can be combined using Python's logical operators. This makes complex queries easy to create. However, some caution is advisable. Let's say I want all the flares west of 50 arcseconds OR have a peak flux over 1000.0: >>> result = Fido.search(a.Time(tstart,tend), a.hek.EventType(event_type), (a.hek.Event.Coord1 > 50) or (a.hek.FL.PeakFlux > 1000.0)) # doctest: +REMOTE_DATA and as a check: >>> result["hek"]["fl_peakflux"] # doctest: +REMOTE_DATA None None None None None None None 2326.86 1698.83 None None 2360.49 3242.64 1375.93 6275.98 923.984 1019.83 >>> result["hek"]["event_coord1"] # doctest: +REMOTE_DATA 51.0 51.0 51.0 924.0 924.0 924.0 69.0 883.2 883.2 69.0 69.0 883.2 883.2 883.2 883.2 883.2 883.2 Note that some of the fluxes are returned as "None". This is because some feature recognition methods for flares do not report the peak flux. However, because the location of ``event_coord1`` is greater than 50, the entry from the HEK for that flare detection is returned. Let's say we want all the flares west of 50 arcseconds AND have a peak flux over 1000.0: >>> result = Fido.search(a.Time(tstart,tend), a.hek.EventType(event_type), (a.hek.Event.Coord1 > 50) and (a.hek.FL.PeakFlux > 1000.0)) # doctest: +REMOTE_DATA >>> result["hek"]["fl_peakflux"] # doctest: +REMOTE_DATA 2326.86 1698.83 2360.49 3242.64 1375.93 6275.98 1019.83 >>> result["hek"]["event_coord1"] # doctest: +REMOTE_DATA 883.2 883.2 883.2 883.2 883.2 883.2 883.2 In this case none of the peak fluxes are returned with the value `None`. Since we are using an ```and`` logical operator we need a result from the ``(a.hek.FL.PeakFlux > 1000.0)`` filter. Flares that have `None` for a peak flux cannot provide this, and so are excluded. The `None` type in this context effectively means "Don't know"; in such cases the client returns only those results from the HEK that definitely satisfy the criteria passed to it. Getting data for your event *************************** The 'hek2vso' module allows you to take an HEK event and acquire VSO records specific to that event and was developed with support from the 2013 Google Summer of Code. >>> from sunpy.net import hek2vso >>> h2v = hek2vso.H2VClient() # doctest: +REMOTE_DATA There are several ways to use this capability. For example, you can pass in a list of HEK results and get out the corresponding VSO records. Here are the VSO records returned via the tenth result from the HEK query in Section 2 above: >>> result = Fido.search(a.Time(tstart,tend), a.hek.EventType(event_type)) # doctest: +REMOTE_DATA >>> vso_records = h2v.translate_and_query(result[0][10]) # doctest: +REMOTE_DATA >>> len(vso_records[0]) # doctest: +REMOTE_DATA 31 ``result[0][10]`` is the HEK entry generated by the "Flare Detective" automated flare detection algorithm running on the AIA 193 angstrom waveband. The VSO records are for full disk AIA 193 angstrom images between the start and end times of this event. The 'translate_and_query' function uses exactly that information supplied by the HEK in order to find the relevant data for that event. Note that the VSO does not generate records for all solar data, so it is possible that an HEK entry corresponds to data that is not accessible via the VSO. You can also go one step further back, passing in a list of HEK attribute objects to define your search, the results of which are then used to generate their corresponding VSO records: >>> q = h2v.full_query((a.Time('2011/08/09 07:23:56', '2011/08/09 12:40:29'), a.hek.EventType('FL'))) # doctest: +SKIP The full capabilities of the HEK query module can be used in this function (see above). Finally, for greater flexibility, it is possible to pass in a list of HEK results and create the corresponding VSO query attributes. >>> vso_query = hek2vso.translate_results_to_query(result[0][10]) # doctest: +REMOTE_DATA >>> vso_query[0] # doctest: +REMOTE_DATA [, , , ] This function allows users finer-grained control of VSO queries generated from HEK results. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/acquiring_data/helioviewer-1.png0000644000175100001710000102753700000000000022131 0ustar00vstsdocker‰PNG  IHDRK¶ZsBIT|dˆ pHYsaa¨?§i9tEXtSoftwarematplotlib version 3.0.2, http://matplotlib.org/8€;­ IDATxœì½wt]Õ™ÿý9·W]õfI¶l ¹Û¸Û›Ž)I`2o&ÌðB’)$Cê$“²f’!0 Y)¬d1i0!@^RfÒ ä7”ª)lc‡fÜ›,«w÷½Ÿ»÷½ºj–dÉp¾kÝuï=g—gŸ¶¿çiÛq]×Ńõ©OQYYI$aÉ’%Ü{ï½#öñ£ýÇqH$c’íxÇôÐCñÁ~yóæÇ™1cï~÷»yî¹ç•í˜Z[[ùüç?Ï\@II Žãpã7w¹á0–6Æ2Ö\ËùïØF+ëXd <òŽãäü<õÔSeŸyæ.¼ðB’É$‰D‚³Ï>›Ç|Ô}Ù˵~¼÷…'+<²äaÜøÉO~ÀÖ­[yúé§OXýcÇŽQ]]ÍM7ÝÄÿøGþë¿þ‹Y³fqÕUWñµ¯}-£ìW\ÁwÞÉ 7ÜÀÆY±bïÿû¹ûlïÞ½|îsŸ£²²ò„é?ø;wî䓟ü$üãùÎw¾Ã¡C‡X½z5=ôÐq©±±‘ÿüÏÿ¤»»›÷¼ç=Cö=ÚrÃa,mŒe¬¹0–ó?Þ±VÖ±È4nºé&ž|òÉŒM¾7mÚÄYgEgg'?ûÙÏøÙÏ~FWWçž{.O>ùä˜ú˵>žûƒ‡“®ãÀ¦M›\À½ä’K\À½öÚk•ùéOêî¦M›Ž«þX±jÕ*·ºº:ýÿøƒ ¸wß}wF¹óÏ?ß­¬¬tûúúr¶s饗º—]v™{õÕW»ñx|ÔýgL´­µµÕ-++sÏ=÷Üô¶±Œi``Àp]×u>ìî 7Ü0¨ŸÑ–cic´c+²ÏÿXåš YsÉ4~øapï»ï¾aË]xá…nYY™ÛÞÞžÞÖÒÒâ»k×®U_‚±\ëÇ{_xðp2ÃÓ,y~üãpóÍ7³víZî½÷^:::NXý\(..&¤ÿÿæ7¿!‘Hð·û·å>ð°oß¾œšŸ»îº‹G}”ïÿûcîô!Þ÷¾÷‘H$Òš•É®/¸îºëƒ”––òéOšï~÷»|ä#Iïoll¤°°pP=ÙÖØØ8¨½úúz>ö±I˜¸1ÙøøÇ?N{{;_þò—ÓÛÆ:¦“¹Æ:F:ÿ“…ád­L~¿¿ßŸ±-•JñÉO~’Ûo¿‡~˜ï|ç;ìÞ½›õë×óÀ¤Ë-X°€§žzŠô¶¾¾¾´V1ûÈÕ×X®õñÜ&]]]´´´Lø§««kª‡6}0Õv@'/Ö­[çF£Q÷رcémøÀ\Àýë_ÿšÞ6”ÏÒhë„·ÞzËÝ´i“û‡?üÁýèG?êú|>÷ßøFz]]{ÑE ª·oß>p¿þõ¯§·ýò—¿tC¡»uëÖô¶±øfLÔ˜_ùÊW\ÀýÞ÷¾—±},c²1Z‘Êõööf|Äèxú 5Ö‘úéüW®±Èz¼2„¦¦&·ªªÊ]´hQzÛücp?ö±¹{öìqwíÚå~èCrý~¿ ¸÷Þ{ï°mŽåZï}áaòÐÙÙé–——»À„ÊËËÝÎÎΩâ´€G–<^}õU×q÷½ï}¯ÛÔÔ”þˆãñ?ÿó?§Ëæ"Kc©?V|ô£u€{èÐ!×u]wõêÕîŠ+•Û²e‹ ¸·ß~»ëºÆa÷³Ÿýl†LïÿûÝx<î655¹mmmrLFƒo¼ÑÜÿ÷´o´cÊÆD¥7ß|sÐCõá‡>î¾\w豎¶/Ùç»wïv·¹¹yª‡8-à‘%Ç…/~ñ‹Ã¾‘TTT¤#²r‘¥±Ô+~ò“Ÿ¸€ûÔSO¹®ëº×^{­›H$ÜÞÞÞŒr÷Üs ¸?þ¸ëº¹'æìÏ»ßýî 9&#A&äo¼1çþÑŽ)A–º»»ÝM›6e|ZZZŽ»¯áÆ:Ú¾ldŸÿã•k¬²ŽG¦Ñà#ùˆ zÓïêêr_~ùewçήëºî‡?üa7gªlŒåZï}áar!d©¹©Ñuû{'ìÓÜÔè‘% žááþþ~î¼óNæÌ™Ã~ô£Aûÿûßsë­·²qãF.½ôÒ ¯?~øa|>³gÏàòË/ç‡?ü!¿úÕ¯xßûÞ—.wçwRYYɪU«(//çá‡ÔÞÍ7ßÌ£>ÊÆ)..ÎÙçDŽé«_ý*7Þx#_ùÊW¸á†r–í˜&¡PˆåË—OH[#õxúÊ>ÿ…Ñœ—É’©©©‰ßÿþ÷,Y²„H$’±/§ó/íÚµ‹_üâ\{íµD£Ñ!Û˵>žûƒ‡· <²äaÌØ¸q#ûöíã–[nÉÉÓÐÐÀm·ÝÆüãœÄ`¼õþð‡ÉËËcåÊ•”••qäÈî»ï>~ñ‹_ðOÿôO”””°aÃÎ?ÿ|>ö±ÑÒÒÂܹs¹çž{¸ÿþû¹ë®»ÒN¯‘H$§ÙÞ(ñõ¯_ÿú×lß¾h4ÊÚµk¹å–[¨¯¯O—Y¿~=>úhF½÷½ï}«455qýõ×óÛßþ€w½ë]|ï{ß#??œƒ™LµjËÃɇ÷¼ç=n(ÖÿâïþîïÜ@ à8p`n¬õ‡ÂO~ò÷Ì3Ït‹‹‹Ý@ àæçç»ëÖ­sö³Ÿ *ÛÚÚê^ýõnyy¹ …ÜE‹¹÷ÜsϨÆ;GÖ‰Óºuë†5wï˜fΜ9d›o¾ùæ˜Ë ‡Ñ¶1–±æÂXÎÿxÇ6ZYÇ*à®[·.cÛ׿þuwÉ’%n*•rý~¿[RRâ^~ùåî3Ï<“QnÇŽîYg庡PÈ;w®û•¯|eHÿ¡\}ec,NÛžƒ÷ô@Ú wx¯ëv·NاùðÞQ›á.¼ðB÷§?ý©»eËwóæÍî%—\âÖÔÔd\‹ëÖ­s¯½öZwÿþýé㺮{ÑE¹ îO<á>ñÄnCCƒ{饗Nø1;8®ëºMÀ|˜ÒÒR}ôQÎ:ë,@i––,Y·¿ýíœu^yå•t: q#xê©§X³f Û·oÏÐRM¼—6‰<ù䓤R© ËÕ«W“J¥xâ‰'&⠞ϒn¿ýv@å-›9s&¿ûÝï&l\Ç ,yðàÁƒ')¦Yʧè§?ý)×\s »wïæþáزe mmmTWWsÉ%—pà 7dDÌ=ztPRÊÛn»mZ$¥ôÈÒ0à‘G!O 3ã8x§müðù| Lµ'=Žçz è]1n8¨ì’¹àÃdŸœT¼ûzܘnÇÐï÷SVVFee%>ßäx½¤ÉÒ[/M~èmy– ¶16ÛìæÓûí~åw\·1€9~ÙÇÇî{(Qss3mmmcºE¦©Æô1z)Ÿ—¾¾é3É‹éí„Ì%îçYrû'®­·<ÍÒIˆeË–åÌt:UX4ÉíÏÃx¤·n† G=ÑÀ™d)×d°¶Ë[ŽÔ± AE~‚Â’í“c·å³Ú9\ J&aö+­6üŽCý¼y9‰„Ý®Ž^ŒF)û¹V=©kk–¤ Á€UghÕã¹éþȪ'¬ÍÚfËÑý¹Ö·Êl’ÚfÕ—ã—ë¡:’ÏS,#•J Sbúb:6A$™¶/¹Nnxš¥“Û·oÕú<' /MrûÇóèéÈE-Ü8‘}æjÃâ.òbË,5R`ïïÇLâÙ“³Là½Gê€UÏJ€ýa›€þ߃9Ö÷>«½>×å¨N$g“¢°îߟUßO¦6'¡r¬ß2Î>2É• Ä€.K~y§î“€u ìc†UOúmœ£ÈV™×BèÖõDž~†¿^l-ØPåúúú24"ÕJ å˜?’æìD! Mš#õ´Ç$%¥ô ð½ªNnTUUM™?ÕT<À'«ÏòòòIjYAÌ9‚ìßö*®mVëÇLLC™u sòÊ6'ÙÛûQüŠ(‰¿M¸Ý^.oÛŒ—A>ÂáAò‰ PÆ•MR²5=vû‰¬¾‡ÒBué2¢ub$HeÉ/„H4@ÙrôêÿÀ25J(¢Ô‹9¯öùÉ–Mú³ÿ‡þþ~z{zÒÿ§#Q‚‘#§Zî#GŽÐÛÛ;rAÆ,„hjjšVš¥ÉÆd½­öôôLª“ìH>%Ù>>¹ögkAìß>ÔîËÚf—͈hBúôï(Fc% ›´ùÈÔhÙûDîD,–Ö&e“£­Â&ðcœø69@ †õ‘›dùPÄ'nÉ!íÛ~O`ˆ_åüîCù+eõÚYd<¶æÊF.?+rüéŽÅbä2—LxíM%¦’0ÕÖÖF§P‚)„h–&òã! Ï w" N‰ªùD?'ÛÑÞÞ>ÈÌ2Zˆl2áW&—é-{NéÃ6÷ÄP¤¢5Á·fõ)DH´ 2é )éп¥¼[Ó%·†Id ˆÐÞ½{åPíöIÖȪo×`0ÑYDƒå ˆB7Š(uc^hÇÂc>pLok¶Æ˜í”-¤³3«oé?‰:ÞR^̦ҟ­A³ÏíP>LÙhjj¢¥¥e%Õ¸'ú¾˜è{m¸—€ÉÄ‹/¾8­¼O(úÓ‹ßNX{Òð4K£„Cæ[õT"§Óß(L‡qÙc˜1cƘƕ!£óÊÕ÷Pr¹Yß¶6¦ÂÚÞ†Ñ, I¶l2#Û„Td›ìÂd>J1|'†(E0¤¥@—íGEù,hh”Ï^ A"!ÎéÑVÙæ¹«Œ|ÏÀ8¬Ëv1¥ÙÇ©C¸dŒbRk·ŽA¶fNˆ£øgub´Hå(*„²Û*™$PÎO¶¦PîP9OÃ’òòrfÏž=ÄÞ±áxîÕ·Ãý °bÅ /¢‡I§Y:Lµ3ccc#]]]#œ LÕƒt2ÞžmlݺuLõmÍJ!Иµ8y‡Ó(¹C|g·yãsdOò6lGj›Èù0š!'âwcGÎB‘ñ²ÐemoÕmD€×å/ù ©’ï%ïJ#&ŽßBp„uêß=GrñÝ’c–@ù¥Pš"!b¶¶E´>~½]êJ?²m@ÿ—ãÓgý>D&Ù§n!d=zl] rÁ>ÙæÄlìÚµk˜½cÃpÏ%[Û8Z¯–h*´KO<ñÄ îqa`‚Sxš¥ xš¥q`ªHÄÌ™3OØÛÓXÇ8})²1Ö•¬mÍ’M”Æ£q´5U1û9Ù¿m3™íŸäæØ>T¤™hi*u=!.¢í‘|‰¤Vé§èwÎ;眴sõPfõ'$#ª÷w¡3I' l2‘‹É ŒvAÊC™Äò€j qPF¦ qó•vP$GO‹­yêÃhŒò²Ž©h­Ä×KÈ– Û‡ÉN= Èu½Ì¬©aáÂ…9ZŒñ蔇Àd—+Ñ:‘X»víI›‚ÁÃô†·6Ü05w`è›~*^  ¿¿ÒÖ@šj•¼„gO¥£ñáŠÈØmd—³M4vtZ®:£‘¡eúئ%;šÌŽâ_+Ñ,Iì^«ŽDÙÓ2NùÍ­QJ§ÐmHý0™>W ŒP7Š(¶[uüÀ`Ê䨋q "7Õv* e'êC˜Ä$(dÉÅ8yw¡|›£´eBÎRº=Ûü–Ë霬ý áêÜùP&>ñPJ›I‡¬{z4fÜñ`¤kl¢´C'ê9‰Dèîîž6ëÃsäÈ‘I]_-½6ÜÖÈKÆ'®ÝÖvR /ôÖ†Óð4K'!-Z4Î0ŸìÇšßG`›¥Ž×5»Ÿ 6 Y6Wû¹´ÙXR&{²‘ßqÌ$i'0¨@ù št³ÛÍv´Þ" AÌDžË¯*€Ò*ekˆÄ§(›õ`O±UÏŽ¾ ®ã°á¢‹i²ÄÜ&mŠ3v¯þ4ë¶DÑé^ÖåÄÁZÌg"¿äQêAŸc(§n97R^"ÿ–\âøÝ¤ÿïÓß’£Êq‚Ob´CBÅLLƒ¶é­Ã:޶O–ìïÓã²ëUUU1þ| óÚ’ßCMU¶¶óx0Ò}4Q”ãD=WæÏŸO"‘¹àÛ^4ܤÂ#KãÀT½»<ÿüóÔ‰G‹©&DÃa¨pkÙ'“•½ÿx}(lŸ¡|0m–ªM[–!ÊÙ$CLAÙÈ&­Ö¾}V™Ã_;P£ûß1û  H@EDs¹Í4}ºÏ\DJHGÐú–qöG¹Yã–$‘®ëòÄc#“¬õ Î[ 5ÑK{ŒLü¥äˆöGÈÖ*ÂÎE‘‰ “1Ö`|¯ZôñŠaÌk¢åMS¿þF¥BL$ N;3zuŒ…PÊya΃½dŠí4™Nõr¼ õoYšEÊ9|˜»ve˜îr솺>³_$¢ìTãD<{öìÙsBý9=¼sà‘¥ãÀxßæÆ‹ÓN;²²²Q—?Ñäh¤c3Zµ¿”kcø:R~´i:…p{Î9ØÁÚÙ$-›‰3röMcÿ¢`C&ZYÍ&3"sC4drõ¡ÌPv˜º±“ÃHöÕê}âw#&6!(¢Ùˆa&eiÏEi¹ºõ¾z-—x“J „"=Ýú{ùÒ¥té6ëP$£E^š1y“ÄìW«ÇmGñE0$M4P`LbÅ–œA`J+äÇhæ‚ú˜té/ýŠÓ:úû(†ˆJD]/†˜¶aÌi~`‰–³ó š‹)„!^¶Cõ1«®í3•ÊË£´¸8MÞÄ|*hÅø^‰Ì6$C“9]1™²¥R)whÜ’§YšTxdi”p™z’$ضmGŽUÙñÐÌ>&£!C£Ñ¹Œî¸ ±±s eÃoíù^xá…!#s™Ó²}’@™Ó²e b :Å’§•Ìh®l¿È$DrÃ1Ú ™Ü£Àný;‚‰â’1÷鲎ÞÞ«Ë"!Ì"¼ý(mO·n·WoOaÌLŽþý×7ߤ\¥ E¨Jtÿµúõ¡´*!-c5&AÔ¿9!Kúx³ÆÞ ¼"a.*JP5Š_“ñO’ÿçaLŽvâɈuœ„T‰¦IÈÞf2#øä\‹ö¨Ch$¢ÏÎe£“Líbgw7méör™{{¬m=²fÁ`Ót&K0y2 äºK=x?<²tböìÙä"Ûït}`Êä5”_Pöö¡ÈØPã˵=×#tö¬Y}æj×öEÉEÂÚ­ýr3E1NÒXÛ‹u¯`4E2¡ƒš$%ºËÁhZ„<ˆ¶LÞÛ±¸C—©"3÷S; eî¯ ãÓ‹‰„ bˆœhöZ­qÊbµa '«.dNâ2éÓÿm§p[“t3ù&t2!‹É§ 5aKFë*]^41BDK·öÛDÃ6E½‰";st·ôØë1ˆ¼A`ñœ9„u™n½O4X] ñ³šƒ"hùê6ÛuÝ¿¢´OË1fÎÈ4c‰oQ¶Óz E¼:u_oê±GP„M̉½MÖ|ëAùAÉ1ózDäx¢Û²3¥‹iTH¨íÏ&,Ûy߾Ћ‹©ž93]>;e„”ÏŽ¼$«Üt1¯&âEoÉ’%ïÜœ@î;w{f¸ xdé$D[[ÝÝÝÛ¦ÛC2Û4&°ß€GãŸd·7šm¹ú“IMÈ‚”×^{-ýV.ß¶Ýš‡} IDAT|ÙÄÉAE^Ù–í'"˜k•±µU2ÙËò"¢ABg'©”Œ×²PîÿƒšØ¥œD^  r-Iê€Jý?¢ë ù‰ZýIØ|•Ó©åˆ-Ä©ãø}Lo/@iw ´RBdlr#dG¢Å<çf£Ìws0æ5Ñl%1Q†!ŒyR´Rr<…| Q `¢ðút‰ö+$“$1ëJ‚½{÷²mÛ¶Aé!°~Ë5jÁpfë錑^vÆŠ'Ÿ|’cÇŽ\Ѓ‡1Â#K'!ÊËËI&M üt{0g¢³ß”a09ª®Œv¬K=Øæ Ѥt¢&ä+V¤÷Ùßj"•ßBrü(ßñ)²ëØᎬq”“¹¦[QV_v²C1›‰–ůÿezMÍŠàÌÀ˜¼JP¶í\.Qf(_ 9ÇPÄJòmFMþ©œP"ézì­(!븭.Y·Ž6Ýç«Z¶.T„V“[©Erö£HŽ›ÕV«–_Ì{¶Õ+(¢$­ƒ a·>¦Íº]Ûç4L_“r°Ejʵ¼g£»%­BÂê_4J²|KBO´x¶),‰‰ÊëÓ2²ÚB˘¯e¨©ª¢¡¡!M…„ç2+Ëölíe®{i¸gÃt{nØ8^ÙÖ¬Y3ªà—·%¼Ô“ o¹“a`/w2‡éë룿¿ÿmñÀ³µ/ÙÛåM:{Yìò²/Iö7¤ŒßqèwÝA–%·ÐLÔäoG‰ù 2—ú°ÉIö ²H­EšÉ\wÍvÞ•ÉÌÄêjY„ `H›øñØ‘m’;JÌF"s£í°Íš.Šˆ4cˆ›ƒÑ-Aù÷ˆæEHP·.#$PHF§Þ7K÷ýº./œ-ÿ<`›G1†$…PD¨ã`½ x E_Ó²§PdñÆ‘ûˆ5N‘U4aù(³œøUÅ=(ÍO‹5nqP œÖ õq"Ûeõ!Çú Þ.ŽÞB‚m§yñÃçz¹¶ídý·.+Îð-Z!³âä-)*uyÉ'Õ¯Ûo%3ɧ½Ôµ$¹¡ÄÿM4PµUU¬<õÔôùIa²} y*ƒM”ÆbÆžîD ÆnR|Gû,y˜Txdé$Ä /¼ÀÁ&¥íј¹²«eÂß ñ­±Y³‰ ~XÛ¡ÖùߊÉR-¯LEù(BóàC¥ó+íÁdí¢ÂvY’üMËtsQ„æ JsÕõ$/xBËò€îsŸ>6â ÒôìA˜=ÍQTqŠ0…Qù u;AÝ_1F[$¦EFÁ8¶§´¬a”†ª“{Ê&H¢!t,9ûuU˜{L¢]`ÏÁƒ¼øÚkiíR+J«%2;ºS Û‹ô¹Ÿ²ópɽ&ÿå;m¢Ÿ ÓC_34^ýõœÑpÓN<3ܤÂ#K'!N;í4ÊËËG.ha´¹\™5²C•í3y Ë㩟Ì5¯À<¤‡òOÊ6ÃÙÿÅ êM_ˆ‰˜JlÙ²om™”섎2Ñû€‹6l  £¹±‰]Àª#_>f08õJþ!©/„Évø XÿÑeÅdµcæ±1Æ„ÇïÂ8McÖóaÌY‹P`³kƒ®Sš¨å|ÍÖc)ƬoGM¢k1˦œ…r®Þ‡"£œhFêSN?º®„èûô¾7PÚ!º³õøj0þQûP(9.»ô襤B(Ðý—€ç1©i™ªô9z\»ºÝ(RÚ‚"V>`¥.#¥Bý]§I&)¨˜<%ç“øPÕëþè¾âV{oéc,fÚBŒß“D3ú‚‚ª*+Óç7›¸£Û°×ô¡®0çW/íŠæSŒ56’ú²=¦ŠtŒ¶ßÒÒÒœy–¦;Éó0ýñ]DçäÆË/¿Œ;Æ´þÃ=l†RÇgk„¼ˆŽ<ôeb°ÉÑlÔDiû ri™ìmB*„¨Øí>Ôj?ÜåÁo/m’í"þB}À“O<‘¥&“Ÿhnì|H>Ô$+Ú³l'»Ÿ~”v¤Ñ*'ÑT2&‰Î{•ÌÈ-O%‡Dh9Ÿ£6ÌÚl>QkDi¦¤ŽLÚ¯cü˜âºüë˜è®µ(ê|àiÔ’ â¤ý˜%“$À”1 èþ¢Û¶¥5!‹QÚ›]º½”I®Q×)@‘˜J”‰¯¥azåDÞü3™WbLŸ PþJ¯éíÏ¢ÈÜ‹úÿ)¨´¨LÝŠpõ£Î{ã‹$ŽèÏèºBãºþŒC¶hÙì ß’ã)ˆñÉzÃjCÊõc–Ø¢Éa-Ÿ˜[»::ðõ÷§ýœ¤®\Ï’§É^0Ù¾!óCË"åÄçI±­—¶µIÙ馓Ff¨[ïÜ%O$)åD¶ç! O³t¢¾¾žâââ‘ ŽC=m¢”ý²Úvî!Ù¶3‘ÛÈÖ¬È26¡±u}Ç[q– YÛÁ*y{·×<“¶lŸ§~]gÞ‚i¢ä 4W¢539‰fJ´\¶FLBÃAiÄWhjRÇn™ìÄy¼ã-íäaÌw’~@KбÂ9˜ÅU;PDE´{sQŽ=($ÉkµL3QÄÇ2“½ˆ‰üºE˜d2-Q-&¯Ñ‹úX”¢|€â*.­e^+@i´ÊQD$¥ë<¥¿¢_J«¶P£6}<+u;û0‹øîƘ—.F9ˆïDÓÝ÷(¢T¦ËˆIkþÞ¦e[¥å˜ìÅøA‰¶k7&ÿ’Üb‚“œUr%ɼn$)g/ÆÌ)}ùPDI®Õ~} \¿(D'™×?„ÑRú0d×~1ñYm $eYÛÚõñ–ã˜~ šõ I”ã3ÑÛÛû&Kžn2á‘¥“{÷¥eä‚90ÒÛ™“õL_;: 2˜mmK7fqV»]ÛZ&V>”VBÌaB@äA-¦3YÖÔd"ä,Læ[u³¬†Ô+8v aríˆÖÄŽRãŸÔqd§m‰ðÿžbá\¥ùÿŠDÈB²KP“³,[² åÛ#òØK ¢4:1”Æd j]‡!c’ ºC÷;[÷b ñÜKý(’±K Q¤^ï[¡W嬽@·Õˆ2ƒµwu±L“³Qš™&AjG™¢@i˜ uGô¹Ù„ÑRîCùaµ[²®Bi«Pd¶L—ßò…jÖcÈCº÷£H[>Šd-Òu…¬]€"‘²4ËA}ÚQ$sŸ>~5¨ë¨ £)•E«'Ù̳}Ù1ZAÙÖòôarB¹(ÂÙ ûýYù%}À1לC&)³}çÄ·I¶ÉÒ-²_^Ðß= öŸs0÷‰ ;£ÛTOŸ#iº …B#”òàaìðÈÒIˆT*E$¹`ŒdrË…RŒ–ÅŽì’zâkc/À"å²ÊbV9ìe ì(±cd†UËv1IrH!4=dúMÉä¶êK~£rÔ$ë‡3–ß ÑÞÈ[¼<ñÅM?›´IÄZ£yêEiyz1ÎÔ˜¨³-ºŸX <‡Éz}³¾X ¥rtoéÿ/èþv ˆÆrAy\o«Òß›QħL÷?uŽët[~¿åÓ³¥})C™Èºí>Ý~yg'GPnŠt$ô>I¹PËzEDu{§c4pÇPÚ—úÜE1‰5+0}«ôÊtÙ~áiCå£Ú!ŒÑòÔë2bòYU£ˆËb}^¢Î{JûÓŠ2ó5ë¶óstŸËõÄ—-O·5³lK&£8djLE‹Ø„ºîwvÒÖÜŒ£÷‰2jÕb ó%ÂÖð²Ê‹Ö3;èAÊÈõš`hL7óœ·ÞzkÄu3ß¶èŸø‡4<²t¢¯¯ï¸U͹‘—\Ñ6`mm­@4B2)Ê6»-!9éìm;CËÃ]BÚ¥¯n«®-{Æ!DÅ~ƒv¬ú¢;ªû<ˆ"V±h4-K+&/Žh‚d!Uñ!≦Ñ‘ ꫬLv!Ý/ZYôV2D÷`´N¢*BMÖeÖ~eZóc&ع(sU#J[µW×gîçô1‡ÒŒ<‹1A‰©k?ŠÔÌAEx5£È@‡ÞŸÔýJZEjŽé~ê€Pe%A”v¬EVÊ1) féO1p…®»P—kÅ8ŠWëí².ÛA-ÏS(­]¾Þ÷4ÆwJ4`/ ´R£ÏÙ+ú¸¬Óuò´ ’À²¥E«BÏ3´,sõ¹Jiùÿ¬ÏÃ^-÷±}“l3Œ‰ª¤}ž:QךwIІ1‡Q/@õ••éºò-Zñ;êÅ$Xµ¯}[Ë„µM"êd_¶ï ÀÖ‹¹.ÛÉ.;•Óõ††/u€‡IG–NBôôôÐ×w| qÛ¼&ÿû³¶Ù¤ «œlÂã³¾m"#Ú#™šû-VFª/ÄD|“ìC}Ö‘CHP;&ÚJêɤ$Ú«jÒ„€Ãûöá`ü›Ä7J4d˜n帉¯-‡LR.Š!ö±•ɱÖêKúý+Jã’‡š´Ec$áð.jò—ŒÞ¢}éB‘…§Q„hŸ®ûŠÉñ(D™È^F‘«¿ ÈÂQ”‰è2”–%ŠÒ&Õ£||žG9Qdf'f½µß¾­Ê­<Eú:Qœ'QdlÆ¿çM‰èÁJ}Œ¢ÒÒÛêò (‡ó¹˜ ãhÙ.Àh€ÞI—P‡ñ+jD‘½ÍºÜ" ʮֿët¿§é~Ai¥Úõqj–¢®ë6¬Åhnº£z¼’Á»¥±‹c^DÛX¢÷ 1:tèÏ¿ú*q̵!÷—ø+IPƒhÑuó0DL4DÙÁöË ˜{5×rÜ6ijë©ÆPò<õÔS455PY¦ ܾ‰ÿxHcTdéÏþ3—]v•••8ŽÃÿ÷gìw]—o¼‘ÊÊJ¢Ñ(ëׯgëÖ­eššš¸êª«H¥R¤R)®ºêªAkø¼üòˬ[·Žh4ÊŒ3ø·û·3±îÚµ‹Ë.»Œx—Å(mØ^ ŠPdmð0Šˆî×må£4Lr P×ÀLa\©ÏA+êvjå)ÖÛ$ú­£ÅìÆ ”¡ˆÕ1LòÉó**˜¿`¿;Io „E^*0ѧAÝŽh E[›(!zÛŒž`pfðì {[S;ÝÌo¹dYµj9öxð0>ŒŠ,µ··³xñbn»í¶œûÿã?þƒo}ë[ÜvÛmlÚ´‰òòrÎ?ÿ|Z[[Óe®¼òJ6oÞÌý÷ßÏý÷ßÏæÍ›¹êª«Òû[ZZ8ÿü󩬬dÓ¦M|ï{ßã›ßü&ßúÖ·†”«¿¿ŸK.¹„öövþò—¿pï½÷ò«_ýŠÏ~ö³£ÿI‰=»wÓÜܚ̗cò a«E‘¤Ôzo!}<ÄT&¤3ÒèthyRÀ 7rÊ”ç ÈÕ }Ü QZ°.]6 û˜‹r*‡ó2=Î=º1 ËuÐ}îÐã_¢û’h;{Üf”/ÔÌõ¶XËÓ¬å\«¿%qe‘>NQ¸2”vi‰>%˜{£]Ÿ$êZ“‡hŠ ɑ赹bè¢Èš$‘¶öîåÙ—^J/‰# >Ôˇ£>ݧD£J€„KÀ`­¯|’¨kPîÕì|h.æq²öɶ캩F6azæ™gÞ¹š%I0aÏgÉÆ¨ÈÒ† øÚ×¾ÆW\1hŸëº|ûÛßæË_þ2W\q Üyçtttp÷ÝwðÊ+¯pÿý÷ó£ýˆ5kÖ°fÍ~øÃòûßÿž;vðóŸÿœ®®.î¸ã¸âŠ+øÒ—¾Ä·¾õ­!µK>ø Û¶mã®»îâ´ÓNã¼óÎãÖ[oå‡?üáqG‹ ¨¯¯§¤¤dÌõì7Dì›”«¼m:³5@ÙoªbΓmd^\b¢²ÃœíœHUŸž~Ôä-‘_â4]‚ysh9„д‘™’À‡š”ÄÇC’8ʲ"½ÀUçž›ÖD‰æG4;.ŠH¾›Rý½Õ:&I”FCHb5A 4B…z['jbnFM€sQ$dŠÕ X§>&‡Q„3ªå'u!Šbr\¨SL5¨Ûy eV{eÚz\·Sq>"–@™ËüZ®S0¦­-ãàŒŸÐQ”6§QŸ‡6°T·Û Ï¥íŸsP—Ÿ‰Ñ2Ué²-(â Ú½˜–«NÿîC™}¨”é6ŸÃhÕ^ÖÇ\üˆõ¶óõØzô1žÒ=‰òEÿªûu½WPDIÌ”‹PD¦ E‚¶£´bIÝf‹–aŠhUèò⸟§»äÈBË!þL¶¹Ì™1ƒE‹Ñ‹"vòš)‰-å·wyù¬ãòb"f5Ñn‚!œ-˜…•íü_ùâ“–@’mŽžN°åY±bÅ;W³äNpÚÏ —qû,½ùæ›8p€ .¸ ½-³nÝ:žxâ ž|òIR©«V­J—Y½z5©T*£Ìºuë2²¯^xá…ìÛ·;wæìûÉ'Ÿ¤¡¡ÊÊÊŒ:ÝÝÝ<÷ÜsãÚ´ƒ<¨6oÞÌþýûÑ¿å å“4Rl§mÉ!#¦%y¸ÚÁº2i$“m ã‡$o²ûôÿ|ÔÄõºîKLbâ¯!¥NL.‘OÖX«Æh|˜h²ýºMq¼þÿ6nŒ–HÒˆéGÚíBMør¬…Lµc?¶ë1‹VÁN<؃ò!: ãƒÔ‹Òä\ŠqBׇš0«PZ jBnCi‘$Zp&ëw)J+t:Šä,Ñ}_¤©hCºl—>î`œ¥AMÖ²ðí1Á |Ýÿ” ®èyàæë1”YÇÁ"sAëD‘š#_›ý=Cïê~£HÓ"”-x/Êç©OW£´Bçé:u¨ëf¤åYŒJÁ ü²~àr=ÖsQ×ÄL´`ž.'Q…KQ$Y´`=N16cR´`R2ˆ†ò¨þ_¨ÛRÁü¦8´};I™sMKD›}¯‹9O"@ecÜ›v–{¹Ÿm³º0û™`k¥Dk%ýô̘*­“<ß¶oßžaÑðàa¢0n²t@¯QVVV–±½¬¬,½ïÀ”––ª[ZZšQ&Wv¹úήSPP@(J×¹æškxä‘Gxä‘G¸æškÆ0º©…“õ,Y²„ p4oy¹ÊŒ¤Ur­oû"éÀ8[Ë{‡cý–h¶>LÒIÉ)$íÈb£òÀcü’cü„$›¶ø)Éd.&0‹Û‚!N»0Í&s’ôPpΆ i­=ш)P¹¢5ŠëÏ1Ô$¿5Q6a|‚daWP„a&ŠÐ,DiÞÐûN×õ%â+„šÀ;PZŸ…(‚Ñ"@5(ÍF=ð;}ÜõxDMÂ’˜rJÃt5Á—k™ 4#IÊC‘ª ]ç0ÆL3S³EBŽ¢&~I¡°EœÚSÎ;/M¤"ú#º—õö~ÝvŠd<¯C¯>ÎM˜ZfŸ>>v’ÑÓ´œ ˆÉ!-c»–{‘.wP÷Y¡Û“»%À{PP2w/B¢ýúøÄô%9e¸¥…ë@]‡úøDß ÙîÓç©Uïsõ±[Œ¹ng¡®ëý¿ ¨ˆTmmštPä­ÅikbÑc R‡þ–§¬2¹†åÞ³ë l-°­U²£îäÿH†™©Ô:9@ÕŒãòç<©á%¥œTLX4œãdÞ&®ëflËÞ?š2b~ËUw,íŽìÙ³'ýÙ»wïÈ•&ÙÄh8é7¿øbZ³4šv…0Ø‘/òö(™|í}⃔A“6`–€@—•œ=â—$ùºP¤EL]'ÞA½O"†À˜Ê@=ìýŽC£9êÂøkô:Ž’ßq”ß“ãbŽCXå8à88ŽÃb]vÀç£xòñÇ•vËï§8æóáwš‡rŸÇqˆùýªŽ.H¥~?[‡:¿¿ßßqð4›¥Ù yx= ÙqHè²AŸ7 î8¼ q*P Ñ T‡BÔ8;¢~?•~?¯ƒ´9—…÷y8=Çae(Ä©~?Ñ@€`0H»ÏDzp˜p$áPÒã8̇éöû© ‰ƒòûÙSæ8E£tó£Q"ÀÚh”¿ŸžPˆ9Á ‘@€ªH„³‡êXŒÀÚXŒ½Ï=GY,Æl¿Ÿx$B2¤?$‰Pã÷“ˆÇ©Ö%„€ÎD‚e>n,Æ‚`¹á0¥‘…Õñ8s‡òd’O&‰9ñ8Ñ@€–H„…‘±`h"A±ÏyyJ³–—GÔqhJ&É ¨Åh‡™ QÓë÷Ó“JÑ œ™J± §R´ûý¤ ·éŒD˜Ó°4•âbàÙü|ö•ùù¼æ÷³?™¤4ff4J0§%¢=•b·ãPXXH3*9b¡ã°'• …8Ó‹‡)J¥pý~ UÄcQmííøz{‰‡BD“IB±G¢Q R)ò*‹Š”V¶¸˜P\\Lk @e*E,¥$#–—GK(DIQŽãPQRB())!ä÷SPXH0%žHŸ—G4¦¬¨|>ŠKKÊKK ø| ‡ÉO¥H&“Ä£QŠŠŠ”—•áååø‡ÒÒRB¡$ âñx:9¤¬a)/wƒAŠŠŠˆÇã$“I ‡Ã”——+¹uÙÊÊJ%%%Äb1R©ùùùD£QÊÊÊðûý̘1€3fà÷û‰D" ÉÏÏ'‘HPZZJ0¤ªª €ªª*ÇaÆŒ„ÃaŠ‹‹ÉËË#//’’ÂápºlMMMú; QVVF2™$??Ÿââât0’ÏçcæÌ™Ìœ9“@ @EE±˜Ä-z8Ù1n²$7C¶öçСCi­Oyy9T÷ðáÃerµƒµVvßÙušššèíí²ÎpøÌg>Cuuuú³`ÁÎ<óL"‘6l”W4eݺuTVV²hÑ".\HMM gœqÉd2£l0ä¼óΣ´´”eË–Q__ÏìÙ³Ó‘vYù.((`ÕªUÌž=›úúz–-[FII çw§-Y•W^™.›L&9ãŒ3¨©©aáÂ…,^´ˆÊÊJÎ^¿žh4Ê%6àÎÛ°”ŽV¬¨¨`ñâÅÌ]°€êšVŸ~:Éd’‹7l c ¸ðüó)()aùòåÌ;åjçÌaŪUärÑEáw.Ù°ƒÀ¹6ÏÏgõš5T×Ö2»¾ž³—-cFi)gžw‘`³6l ¸lÊ ÖqµÕÕ,\¸E‹Q=cg¯[G"ã|-÷%^HY8LÉúõä——sêâŬ™?ŸššÖ®^M4™äm¾ô‚ pý~–ŸssŠŠXº”SæÌaVm-ÉeËÈ+,äÒsÎÁq®þ?ÿ‡`ùç2'•býòåÔÖÔ°¨®ŽÂSO¥¤¤„EgœA2â]çœCø›³Ï¦7#oåJ*++™__ÏÙõõÔ•—³xåJú¢Q®^¿ž|`íºuÔ…B¬X³†Â’| °fölògÌ`Þi§q(‘à¢3Ï$ œ{æ™´ú|œ³f | ¡%554ÔÔ°báB–äç3õjª}>–ž~:çÇN?y‰çžz*³+*¨š5‹’SN¡´¨ˆêe˨ …Xºz5I ~Õ*fG"Ì\¼W‚Ú IDAT˜ú’̞͢ٳ©))áÜÅ‹éDX¿r%sgåJœ`…K–°2?ŸÓæÎ¥¼ºšêòræÌŸOA"ÁË—S ¬\¾œsçrîÒ¥ÌN&)©«cVEñÊJ–ÌKI2ɬŋ‰ûý$O; ?pöi§±*£þ”Sè+)¡oÆ b³fQ”ŸÏü… é )_¼˜P±x1ñp˜yóæ)R]MeU‰ÂBªêê( ‡™wê©Ê¼ÚÐ@Ôï§fþ|òóòpjj˜S^N¸¸˜’Ù³Y‹±páBE:.dŽã°tþ|ñ8å3g²©¸˜º’ÕÕœžHpê)§ð‚ßÏ…óæ)Ÿ yó¸ æ½³fÑ“ŸÏ™ee,­¨`O2ÉìÙ³IƒœSW§rmÕÕá i¨­%žL²¬¬ŒªÒRêR)jjjØ ±lî\ΪæÌ!‰0·¾ž@,Fyy9¥……”æçSUQAg$Bum-I`Em-]@í¬Y$"ò**(M¥HPYVF(eVu5ýzòîCMôñPˆ²òrò Š )**"SVQA `fµÒÛ.¨®¦8 ª¼œH,FqAy©‘xœÒ’Á •••¸(âãóù(//'‰PXP@2™$™H¤ÉREy¹ÊT®ŸÇeeeƒA ‰Çã$ òóó‰,*Âçó¥­%%%ø5©ŒD"$ ’É$áp˜üü|ü~?EEÊU¾HÄT*E8&™HF ‡Ãäååá÷ûÓ¾LòJ¥ƒÄãq"‘áp˜D"A  //ÇqH&•¾0™Lâ÷û‰Åb„B!Âá0Ñh”@ @"‘Àqâq¥“ŽÇãø|>b±À \ ÆÓ,M*w¤Øüì ŽÃo~óÞóž÷J‹SYYɧ?ýi>ÿùÏ*Pii)·Ür ùÈGxå•WX°`O?ý4+W®àé§ŸfõêÕlß¾úúz~ðƒð¥/}‰ƒ¦ÓÕßrË-|÷»ßeÏž=95E7näÒK/eÏž=é·‘_üâ\}õÕ:thÌÉÉÚÚÚ2Ò´¶¶¦ Ódc,z°d2IOOÝÝÝÛíhaÁqŒ¯O6ÄAÊÊ’ÙÑ4ƒ×“(œ>ŒyEÖÁšƒr¼'TIÄfñQi×^îD"¥êPÎɳQ&5‘Kœ[ PfPf¦~L’?tûZ–6ý_2A‹Û¯ªâÀž=iÙ$º©¥ñ ¢Ì)Û­1Š“u+Æé\ÂÄÅúnÿ-ŒLDËÞ‚IùŠ®ÓŽò_ZŽ2ïcLXKQNã”)çM]ÿ¨Þ–À˜Œ¢˜<@ÝökzlGõ19M÷ÑY­“7IÆyu>彸OCÉÄDÉÍX4—¦—_#¿2šGeÊ‹ L~ú¼‰YPÌ\X¬Ï¡D±ÉG"[õäz‰bLM;Q¦5qÈ]·-ù»뱊ÏS>ö»Q>K£SJS*~aŽÕO/ÆW­DËzsÃøÄuc®©?eúm®\³•ùùø öì‘x@uì»0þf¢qm×ÛlŸ=0Á™)þIv®$ñÿ³MÙsPy¾²!ûssØÏ™éW__ÏÞ½{ik3÷©”¯¸¸˜#GŽÐÜÜ*„d>øg@¤TÛn(,…™õ¿»Rp|‚;å>EXÜ((ƒÆp´I½ìh6$·DŸ‹£(²%9·öc|ßNÕçe·ÞV Ë'Q×tBÛz”“¹Dßù19šŠ0doŸn7ŒrÊ-—D¥ˆa'®Ñ×_—mÑuå<¼Ž"Èúœ¼ ÇÔªËíëé!ÚÑ‘~¿9wP_ˆ ± “Ö¢“¨TÂd$øÀgÕ“ ‰”.»ƒLŸ&!Y¶Ó·ø- r¹ Ø‘¶S…ÐÕÕ•±MäœjÙ<œÜYzöÙg9ûì³Óÿ?ó™ÏpõÕWsÇwðùÏžÎÎN®»î:šššXµj>ø`Z… *5Àõ×_ŸŽš{×»Þ•‘·)•Jñ§?ý‰üã,_¾œ‚‚>ó™Ï¤ûhnnN§ðûýüáàºë®ãôÓO'rå•WòÍo~ó8ÇØÇD¤œ(tttÐÛ«Þ)í€hzì7ÁììÜâ»”$ÓATKû¬m%¨ #€zûÜy“í%o´öÃIòÕH6í°Õ—ÈÒƒÒ€ÌD y“~EÿÇê.L4^JsÇD“èÿM(Ò°C÷]€Y×®•L±Jo_ µ_Š".>QyTÿÞ¡e– DP'jIq ©¶¡È•ÔiÓßÛôñ¬×cM¡w­Óe…,V¡È¨ ¼5ù/A߆DÅP„rJcQJf–òâˆDaÿ>£]È/T„(Y•Qp¡£"1EbµU;ž¯ˆQ<¥Ê÷õ@G+ @Q±úí¨Oé¼Böí…ýû¡«’QÕ~8¦‰SúzÕ¶~K³ì0+—BH¤ ´JÕñÔÿþ>èlWuî„å4ºêÎÐÇ¿³0n‹>.ŠTa´<1ëøÔb2©÷c´dâL~ ¥…{AŸë Œæ°EŽVê~^B9ÝW¡·ƒúÜèþ^BEn×çr&¢S¢Dç'„ xêèQ˜~ùZ¶j èÀ)Q(,ƒºùªŸÊR˜3_»Žxéuh<¤ˆN{3Ù§HË[;`÷Š4íß [Þ€ý{T™d”¨@ ¶¾;(ÍP²@™ÊŸú,9 ®„™ó |Ý2ú”¦(…`D‘°¾hm†FÍX·Âî&Ø÷4TÄÇÕfw'Ì)U}ôõ@W§’-ƒí°¹^~|>5ž®v¨œ­Tñ E *gC"®4?¥œ>K‘J¹žÃú¼ÈbºA} &ô±­A •˜$¢gésØŒ1ç6 ^–r”fï%]ç(мìÔ×á(Ò¼DŸï6}>+õu˜ºOJJK™9oe˜’¯aÈ^R·Q«eéG/ID)¾Sݨg˜Å %>@æ:ˆÕ¨k·›L°JC´GvjYÂ([S“ë¥ÏåÄ%PI) G.¨1RäñIÏÁ{Rq]õ=äÂHvþ\ok‡¢§§'ç@ülÿ‚V2ß]ÔÃRÂøÅùZÞ®wbü#DK$&Fqj.Æøéȃ×6çÙÉ)›0ˇˆOGa1ÃÉ›o3Æ!º£1ÚŒ"GÍ("rõpêOŠÄDM\Oév$ÓLîY,<úì³T`r(ƒÒøÄ€õ¨ PÈå©ZŽ”f§EžÄÜò0Šô¼ Û?5îŬᖇšœ’Z¦e¨·zI()ë¦IÖòÆŒ”‡¶veëj‡¼"¥éïS¤#šP¿wmWe@±£Êµ4*²°s›ò% DZélƒ?´öCÃBEVº;•Y åÀáÝP>Ki™ ËAiܯäh:ûÿüÉ/T$kÓ+P­gç@HùB@ÙLE jàÍ-J®Ö&%Ww§C8¦4WÅ3ÔØ¢ ¥-ºpƒÒ0…£jÛ›[Ôï–F¥a*©Tš³;¡¬Fµ—_¢äìTǤ¥6»æ¡'þ?Å~èèWç>„"sôy”\]úœh™NÚ *¸$íÜ"HÛôõ°K_+óP ŸÊ‹U…1G—ûöñè¾}DPdí9}MV`‚^Á¬O˜@½pôèëW–G±ƒäÅB|™l_$ŸnWž-uŸAÑæŠNˆ”<[¤›\e?Ãìý“a’ O?ýôqÕ{[˜èú` W&­q´ç! ,M ÷ ɵ¯¶¶–#GŽp`ÿþA~Iv$›ý¿E†zP'=5a;¨É¹EF˜¥H@MæŒYâ(&;¶D+Õ£´(²Y'Ë‚¡&œbÔƒ«VËðªÞv ¥•‘(¦2QêÕãØ©ûkF‘;±D“|±XºnolÜH*kr­®[<¤ë‹éæ Šì”ê>*€P$ꈖëÆÜø”.#þ3’é{¯{¾>Få(MRCÚdÒ¯4)¡ˆò㉡·[šŽ¥•¢pT‘—Xž1·uwªí%3àèA¥Í)(3¦9€]GTßEqEP:^ƒ;Ôù/Òf·C™é솽G ¹ Z]C¸®¼7²÷5¨+V&4é§­Yž]¯ªsòÈ5NYtvNj*¢uxÒ| ‰E¸¶<ûš 0¨ÈVg»Ú>ÐÁ ê£¯ê—As£[s£"†±$Ì®WD¬j.Ä^¦fC€Bau}ýêújD‘‘ݨ{&„ñ {¥ík˜¹:]¸Pïû£¾QÚP1‹Súlà¿u[ú:ª××bOe%§–”ðâ‹/ò,f}Á×1>z¯£4R î ¹6%«ýjY·É‹˜î˜¤šö‰ù˜5÷f£“¼„ÙѪÖGÚ”6’¨{9ÛD—ë÷dcåÊ•¼öÚk=zô¸ê¿-H“‡IG–¦c}ˆÈÚ–-[@vZûdÿ€µ-€Y_J²û1 ÌŠGÞGú¬íFŽn'š@Mð¢^ 3qÊÒù˜¥+Ä%_2Dw`Ö;„2O¼ªÛ—pm)/+Ë£HI%&*hfåöRÝhpü˜ Ö{PFÖ'Eˆ6nÜH j"*ÔãÐc[ƒÒ,UXûû1NÅo¢&ÉûP„ÿŸ½7‹<»Ò;Œ #¸ƒÁÁ%™Ì}¯ª¬MUjµ,«%Ë-u·=ð؆Ü300´í1ìæeû̓y °{­Á¸Ýh÷¸KR««»¤êÚT©¬Üw&“û #‚±ÏÃwNÞȬT©–T•dóɈÿ¾ÜûÝï|ç;¶þË„àq;W×Oõ ÁñÁû9T½¬Ä À1’ÒÌo݃.èiÔÅ 9XÚ€FQ`  ¦û bâï-5ÝÐü8uDÀjþŽ~ß½gÎi½‰£.‘ˆÀO,·/j-ßfþø5º“bxÖ¦[Óï­e½C§àÎ58> +s9Å Ìç!z 6³0< ]Ó@ZÛ~÷Šž»SÜÖ1,ÍèØw³°²=qÈ•àà´¾«TÎ67 …­-ØÜ°èkÓ1¥Ó[Å]ÛnzPÏ€ßA»§¯=)ˆíˆ‰Ë 0þ–=WGm½~àÇv?Ÿµwâ]{öMÜ@ ÿÄbf——_[cÓžWÏÜÛµgÏ…ØÛ¶Ï„=Otn*s÷ïšÇA$îj@þN9“<ãbpgUã„"ÂÞø>°ç÷—EÏqõêÕYª|šö+ šUhHž 'ˆ‘½³oî=í¿D(IR'xº4¯ãá»NÔ!ºÐ³N(":…D°-hÖ}…à7S%”sðæàËO •¾(!æ'‚€TŽ*€VQç¾NðŠñLŸB¶™fup2±{0l£Áç2ð?~ë[üŸ¯½F'ªö.G~-5ÿ0•o @”´ëü»æÝ„ºg~-†Ð`W°ïÝ»èe;”ÇûÄÕëP*AzD,P© i3§p¹wÅÏ(¬>°XZ ‚‡5#-°U›?å’Âu³¦ÿiÔź;/ð•«3<©}ÔªúÙÍ àœxA@¨VS8/U¾¯}‹µï½ÆÒ ,ƒ°»V……¢îc1£ãb|îg»æÒe}וfjæªÎ+³ ‡NëNj›wg`0ÛÒBy¸? Ó§´¿»—’;tBà©»]ç”Y…\Þ„Ñ9 ØÛb:7è¬Uóm…Ö¼®e¹!kg•¢´¼„±;¨&—¯IÛû°‰§7hˆYú]à¶¡!Fˆ]»ÆKön ˈ¯ØstŸVFí™PÞgÍö¿€€Ü†]Ÿ_,ücMß{Ÿð8PªÊ 5'Žø2þ™3MÍ &_T;xð d³ÙŸ¿ðÇh_ôùì·_ž¶–>çöiRóz—/_~$û B6Ûê›E™ð¨Édµé»jÓúÍ™nÎ85g¾yú~P«Ì-ôz)Œ[yôÜëȋ̺Çk™:Ñ òSÛ_…/jÀ¯Û¾½¦˜3@×ðB1HÓhÀ8Jðä9hǵ¢w_P8mÒÖ;L0EôpQ?˜&»à™N}öý2Ò¢¸س‘¼2ý³hP}ßÎÃÅê##%s·$ŠŽ´hwÑsG7´wið¾qMŸ9РTÿ1é”j„°R$³E(lÁDŸÇò¬lrÙÀ,ŒNÂÂ=“ko $-,)Ä7uR ãÀqxpÖ— “ØmØmXhu…ê­·ˆ’?fú¡F‹Žå°Ù Mˆ­Š¶ÂWÇÚ; }@ç»4#{¶l, À@d$"ÝÔpJÛ™ØùÉ`§SÃ:¿íu±^=ªàÁù¯¶éà)ýËèø<ó¯ZÖ±µÅƒ½A!§f›]ËRAÇÝAÈ,ŒµÃv^Ï@Þž›û{Çž‡;ö<—0ù{ÀwˆêCàçßÛ²kÙ,ìí±kÛpFõ¤•Û$Ø€Þ¡NÛN¥yèq=¢³?Î29¸q–¹¹ÿ¨Û98ÚœSÖ\ ²™EjáÑÉ™·/J³´¾¾þ!Ÿ¥ÏÚ~eÓ¾uÀ/´íƒ¥Ï©}Ö΢¹Ã9{ö,›››l..²Ç‡uJWon.´ötz/zëÝK;êL½ð¨ÚžIãÎÑ7Ñìt… yòtì›|¬ÂvžÝbÛmA ªdË{xâGh&ýcÛî6>oØ:g z%=¦Ñ |šë”¥‘Pö,!Ën1;ËÀô«¯²þúëœDƒ»sOØÿóà8eß ´[»vÝÎØïªc§]£ tîÈý7[`ä Rðw6bVf¦ŠD˜6sÐU“²WXŠD`¨–¶ £ÅœÅÏ p¼sEÇ7™Ô ><©¬·©é€ 9ˆÞA1Gàø¸eªeXÞ~S×´³#)§ZUÛi‹é÷jú:àÙ¯ê~n¯Ë>àÁMèÿò)Öߢ;©ãí²”ÉRQËmnÀÖ äs ‘íÕô¬Škùh«|gÌÇiDŸ-ÏêÜ+æ,×öºÂh-ˆ×`}îÍ™yEŒU¤E×hþ¶ÎucI@(Ù/vmÃÊ>öê’ýÚnWR u{f`|HËÔª¦Á*B¬E׺3 ;µPÀö¨=Í)þ× @¤ø-ªË¨8ïÛsÖÖÑÁñd’׳YÆí9ƒŒ0NHðPûA¤“ú cG Å•÷ïzÄÞ#/XEï«×oì%dŠ:cÜaÏo’&öœ Ó]üî,SóßͲ€>¿Œ¸ŽŽŽGÜ»ŸVû•Lõ*ÔŸb@t_àýHÛKŸC{³ªæYÚ;w¨V«ÃQÞIA`zŒk„êWà6B¶‹3Q.ú%”÷˜F: !Kè?FO—}îÂè=Û–gÚœG€ÅÝ´½óŒÙq-¡Žù.ÙÊÙ¾[´†ür¶ü: sÅíxþÍΗ€¿²ï\T}1:í(\’FlÔ$P¼~£ˆ+#Ò÷KÐlcpËöãÌ]eàÍ# ÔO|P(̽™F‘hkU¬Gß°˜‰´±+Ýb).ÍAµh†5HÅÅê¸QäöºÎ·w–ÖàêûAkvxHeFzÁ ;‘Ó•”(|{]÷÷Ùcô 910™U˜ò/NöŠ+Ûëúé肉Ž¥OG—ئd¤bKŒþ\ù+ºp$% Sg"“0ž„¹-˜h÷ ~ÆÆ܆ÇÅFmo(,vèŒÂ‰”¾ïìÑùÍßVH-Ö‡t¬K°ƒž.™Fþð߄̭É]‡x‡~ÆÞ[ž¨ë²¿‹ùÖ†SÁ4³Q×2ÛëÚWwRš§½-Ýs ãߣ!c®Ãžãf­Ý}Ä:.‡ªU®•Ë<‹BÆ/´@U‚»øeàÛÈXµ…‡ÿŠ`Âê¶!SèIÐFey´iöU«6­çÇR'°IÞï4ìù÷0͆•+|~ÌRkk+‘ÈS ûm¿YÛK³=N1šõ>îòå[2 t±“Ͳ¾¾þÐŒnSkZßmº¥O|nLç™qý´DPy•Љº{ð:!#Î5L]MË{],~¢ŽÂd3¶Êœ;‹2ÃZÑ 6ü Ô{ v;+_&ÔÜÚDÒ-ÛϰÞEõ @ÒH<›°ïGhŠBt ££ÔVVxÑŽÝgç[ÕÎë”ËMØù{ˆ°Å¶µkØNž HyOzœÍÇ"2«?ÛÛÚçùI£X»ôž~xpCëº.«k0‘†;KV¾dDLPv²9XÎ…”øÁ! 쥂ýþ±Aƒãk™5•.Éeàn>d~¹þä Y‰G"b˜\H><)ÝÒÐØ‚èb;ñX«hðŒK¨]¯ ¥§u Ñ9VÐÈÖÄ‚¬,èz/åáØ¸€X[»ÀK¥¤ó/uÝÚ»`m yiˆVç`³½-ЇL^Ç><é~¥ K+4(w__„lV?¥‚Ž7Ö.ƒË^³Ø^0Š›Âøa]ÏÈëlƒT'¬e-T…þNøóœ@H§=§ó/±(D—¾‡÷R½ÎñJåah±ŸƒöPI#AùÁŸëpNÊߌ „ý½‚ÞÕª=ë {¯z›ºcï£k™ gGï­³dÍ%®c¬ñhö©·f@õ¤öiX›ŸÚËd2”Ëå'|ó_@kÔžn謱†knû`é´OúRšÙÔã%š³N"¨ÜÞ¦´·÷ùŒÕÏÃqÎyI‘æcr3ʤý ê$=åž+½¨óÍ£NµJCn1ÐEèhO£°L訣ŒŸJ°¼OpÉÎ!ðô>¡žV uäìw1B}|ž1= }€Àμmë<ví<3v,â;T,²ƒœÛç!ÂìÙ×=ŽD²Ãhû6¡xªg+=3DÍÑV èž½å‚i]­/ÉD1Ö—,U° ‘J9”‰¶*ÔT);bà%» ÓCa™Ì*LŸ¸Z} Œ´BIƒ96¨/™¸¬5&rã’þÏU8Ülzúõw£.ÝN©¨^gBÇ\- L´D`;‘x·gƒéc±GÓpë‚ÀJjH Ù%]×MÄ|Ä ;çr ÆK¤jêU[© IDATÐ6~ø'ÐÛNBfÃ,-*zÖ6ÐQÒàÞ‹2år(Õt_cÀVÚŠÒZm4BÉŸ‰”ÀO$¢s]^0›†ŠîEk º{ð®¿+àÙȉ%Òº±Õ ÉZÌO°„=;n>™FLT;¡4ΰÛÞΉÞ^fÖ׆|eõïó¶Þ2ÍüªÝÃ6{ÞÿÂÞ¥V[÷¨½?›¶¯ û”EÌÖ ;F¸ó Z" Ôšwö¨YÛäá·fnÇû¦öCƒ®OÒ×CùïÉÉIK(1’°ç×ÃëÐäb1¶÷ ¡xÏÐt˜múÛõOÍ@éqÞÁÃõÍLÍ ©òØ²Í ç£ÚG-ÓÒô»\¿~ýaÝ̧Ù~%€Ð¾féÚöÁÒÇlŸ×ËòxA^¶éóX,F©Tzø†@GQí^(Ch&êX³“6¶Ü&!,ç ÊwQ§ÝÜÜi;‚½>p2([­é%~ Ít_@ ã];¦góãq7J±îB3X÷_::ß ½½oÇú $Es'2ãóAhË~V‘— Ë;Q¸îj½é4‹³³]‘Ý5ÛC“höž°cðkRfš \¿&Ð3ܦv¸WÀ¨³G exRiíc‡–ºoÙmlfo(Ë+Ñ [*Š•q§êž~¹jo.ÃxÚ¼Œ”Ñ6?‡Ï™ ºE¬ÓÀ˜ÀLÌÐp¬ÖrpdZlÉà¸]1/K€õJÓ\,ÁHU€¥V#59.áù@Z ®« ¢'O’Ï®°V„g϶¶Áµ+0lžcPW Ió+ºG'†Bi›J^:¤ ôA##¦'ZÑñÇÚõÿ¨€d$b¬EC×£ZÖOW6V`òˆ˜«%ÉΤÇ6ßýžŽc  vòPÙƒëµÜnVÛž'ÍVGŒ• DGU«nŠP w†àŠ=†LPàÐð0W?ø€~Âäá&ù÷Ð{é¥KÜLòA3u‰¨qÖ–}½Ÿ-(µÙvSÈQü ý±í¹.Éû±¹³?öws¨¿ õ>1sÖ{ÔÌ@}Zéã´gžy†{÷î±¹¹ùó~Ší—L탥_hÛ/¤ûí³Òý´Z%ÏîòسxÛgX©d’½r™F±øÐÎ]¹}æé´·wžÓÝDs§ç-f¥î³gDZaÿçà¡¶'†€›öùa[Ï #}`è&”5Ù@ÀÍEçh¸iûïD𥠋Ù6<ÓÎpz©é±¿“D¹nùߡЙÆ~;¦Z2I[6ûðºmÚµs]ÒA×åç{,;­Õœ£“ý!„³W¨ð‚³]pÿžt-劊ÎίˆáøÉŠt$ý¶½ä Ü™Ñq¤DR¡§ÌÌe5 %; _„3Ut¥¢•ˆßF¡¬¾eUJ°|_,ֽЮwʨ«5tN¦Í”qP l+§Ì»RQaÄùY±.‰”4>ÃZ ¨°§R(Ñ•Ðy·µë\zÍÚ ¼++º'kM÷±Çž¥ñ˜<.¶jiCÏÀØ@ðyZÜ€þŽ 5òã- q]X¼Sa±Ñ)™gŽN»€®d°$píV4ªóìLˆAK 8^xGÏ[¡`í@llA*)à:4®\gBÙs˜Àz]ÏE¥¢ÿWfÅæ(qþvÏFì}ˆ àò'ˆu¯²1Ä.½‰¬' v×í=X³ß›u!æ4ÞËbŸê„÷Í“#n4½/iÄj5[~Äm=÷dkž]7W€GÙ¢æÏ"<ʹֱö„uŸÔ_ÖÁØÇa¦ž–mÁ§$?×Bºð÷èéŒýü>îv e’ÿ»û…t­í3KŸ¡}Tœú“¾ÄÍÍ NÃmRŽ¥Óä¶·¹_,ÒBðUɘ÷Yò^æ`€P†ÁC|í¶Þ¬Kr"„L·eû~~|œFÙhqž– á€6û.f¿wQç}ÍŽý¬ÿ"bŸ@Äê¼Ý¤ò”}^#Ô{Ë£ÁÔñ¿„+7ýþ¾ïóŸ¦uà민ÂÕ×^£ÃÎã 8êh@¯¡™û6 ëôô‡PX¬Ú+ú,Ö®A<9(f§TT¸j5Ÿ¤4PH+œ5†Ì'«e ü—né\\€»›…{Y˜N(ƒÍ³´Þ{_a©½"l5 ·¨û»h÷àÔË?}]amEà*½¤p¡;xŸ|1˜[¶D,Ô×¢„ìº=K9¨þ$\œÑµZ_€Sã:·Þ—¾ÆÂk¯-hŸ+÷u w+P™0è°çjÈžƒã)…, €E[u)çÖÖæõ|¶™e¬:ë {å26€›WR4*&(‡/ý-˜½¨ór¿¤ÞAX_ƒ{0}D©½K 2—ƒT-Ãicé¢Q]›|V@©7¡Ð[·Ù4ôšyhQ÷¦°UcºÆk»n¯¬DEµöê Ýc/RÒ££ô ó½>àËèyñ²+ޢ=·­(”üí9?j¿=̹d×ú>]·áÀ>BI/p½iÏΜ-#dây&œ»ú7s ^ƨ™Ëh¶ ø¨d•ÇCxÍÙsÞ´=)Ü×~ka/¾øâ#ÌÒç•…÷xûB4Lû>K¿Ð¶Ï,}Dû<™%†qžöïš$§¯"omm¥^¯S¯×†—¼Ójö[òß.ÌuzY4Xw󨻯wŽUûΈ¬ÁÃЀW^oCÌNÍ–½>GÐD¹Iã_Ÿ'°Y;¨c® Ö‹²×6ÑŒ7Mçõ£Yøo#_šßþ“m¯Ë–w#É<š%OÙ~ʶ­!3°ÍŽ;Ngx­²»æj<Ú¡A;Þ!† =-à2` §;©Á=9¨0Ú­ òêNÂÂ,´µhðŒµìÍŠÕE³Gk5B¨Ó“òzpÞ¿¡cqýP¾¤óñc­BªCÀè NÀcyƒõݬT­¦Á¶ 8’–ëw*)V&‘ÜÍj?³v-:ÈŠFó¶ÃÑ)骪¸nbqgМýó̺²ÝÃîÍ<¤Æ+!p$*Áty¶· =Wfa¼C:%¯=ÖAðüÙE¡®Ë5xÑÌ(‹»Ún²O ¤Û¢»Ÿ¯Ì…Á¶ÝcZèç2:ÏzÖ3ПHtß–]÷Ã]A£æÞOöœñ;ÜÀW6 ѦbÄ{y1h[ ¼}b³ ZZ Ñ F¨ƒèÖÂ;‰X£²=ÃÇ€?^Eïk i°wâb„? Ô'ôäÛÇz=ÜîÆ”®ÛK4=oδz;dûˆŠø63S³â5¹tK“OÛ@{æ¨ÿ,zðŸûÖ·¸gÌR Ó¦€Ô@Ïô ëö ÒùY.I?N«&´Îed,¹”±ZCÙaeKµ¯Àp—Õ¾—~ ]Y†Ñ! øë‹b,†MóÒcŒÆÁCÔË%ŸdŸÀÇÖ ìæ`v 6×`oWa¸ ¯Ãj^,ß!zªY8dqÆá!­ŸèY˜ÕqŒÁD»€Ñ\ú£f䘇ž¨cwREmßý ë[”ßzí¡µ@뮯F¸G›ôø`›Ùг::¥5È× {O€î•.@ ÚÀ$K°“Ó½vÓÔ(:ŽïŒj¿Õ²@Üú†îßzQ5å²à˜j_GŽèœ‹»Æ-êžÔªºïIØ6·ó*íòÂYxã‡p9M°_Ræí´¼ý}ºGwï„ Á}¿g™‰©aˆçä¦>kïHÏÈ}CC\¿|™e;¿Û·³©¿Þôž Ðo"pŸ³ÿÙõî…‡¾MÇ zÂçÑD'‰@ìêCl›^4;GHÂð¾Åû'Ïl›áQï%~7÷‰‹¹Ÿ¶8vìóóód2™ÏÕ9ü—¢Õ«PŠg¼¯Yz¤í3KÑ~³äHóñGê“<®ÍËÖ ¬Ls­&/MàŒÓ8,žõ#˜<–Pçš!d¹¸Ù#ØDPçš@ç‚mßá^ãl uö.ôî&8ýz;…ÂiÇQ'ûuÆÛ¨#=€O¡>Z2†Cz=ÍÚ2^€ÖëœíØß΢ùç>8øŒB†šûÊTmÛÎÈtÛ¹´c‘Õz…;˜çÌ´¶U-‹èiý¹ŒÂ7õºäLVÛWz~< +5]ÃèР=Þ'Œg¹ut tÜýÖ¦R˜¨¶mÕ~W6^Ÿ1" í5ø¯nèzǀх}öòb‹*e¾.À·4#@±¶ ï·×µ­ì¦2Ù2ÀÁ>+’»,ú}+³åÏ?ï½vïb, DìÙ;ú¬4C}C¶Ýš€ÚrVëæì>™vê>p.¥kXÈÁíYMŠåù ‡£ÒÕªp Fâº>C •ŠVª¤ÛµÀv¸æe‡ÎNØgÓÆÂmç¥ …‡'ÍóŽ€N{·DæÝ ËRQà(f/pW¯€Ûܬþ¯#¯§JIº®ÞAe+z Ý®.hÙ÷c1J±Û»»Eî"@3„\êÝ­@H:(27Í{”«(·†fmîE“b¨z_Ó<S [Ö'_ž÷¤T}Ñy(¬YGÔVkNZùY¦y»Ía¼º=SË<:ýYƒV?»»»*¦û¸îé“¶_ féß~çé3KÿðOö™%kûÌÒgh>h<Þ‘|Üö8#f™Ôa=C« ôœ9ÃH&ÃÂÂR\·ä³î6[o+Ï€YD`Ä3Æ:ìó,HxÇÔmûõ’*®òb¸Ï#Pš}#-ÅE4pŸ@ƒo¶éÚ| ¸·m¯jhyV[Ížkv¼qÚ¼Pl²/¡Áá:Aß5ü7„Îzˆ`Òè×p¶uôë_'óƒ¨&Vúã cqˆeÓùÌÏ…ÌWOÈq7 7"¶âäKªÏ–±X'T¹ï釄…·Üºldaþ¢/·?X]ÓÀ–A~p•DKº–ÃÀÜBð*aÏ|}\°½¬Î}þêûè‚…»fpÞ„™U˜:)À±<+ SgÎþš£X»B„E‚ƒ»‡ÀZ€x Txþyzô#rèÜv³LÕ²X”¹›bß)½™mcÙ´;/¥u…œŽåè”Fÿˆ»ñ¢¹M× 7¢íÄÅvE[áÚE8b…sûGÅì%[`»¡{žGnž‰>±Jñ˜1¢¥¢ÕZ« Oêže²«ŠqlÔuG§zv6u[yNuÙqEZŒ)Îü¶i°V¤¡Ú\X>xBÛŒ¬w3Û×G÷Ý»í+îÛû™EìgµõÛ3㬲—ãq‡ùmôÎ'À{Øž÷2ßhz—ÿØ–±wdœ0òÉG•G˧xÿä ægù%98}œmâ±eŸô‡æ–šöÓàg—(ÐÓÓC©TúXú¬ê›/Dƒ´ß~©Ú>Xz 퓼D¾lsìßÅ–e‚'’—%h!h\bqÿÖ-ÎÔë,*ÌûLÔ5DqÛWŠPìÖ)ôE[v–õζaÛÊÒ¼"`Aø¸gÊŽÑÃÎp½mûðYi—­×‰¨ÿ¢ú,6³cM·0pK×?lÚöZ ìÕ0ð ¡YôÛÈ`ƶûªí«×¶ÛoÇ”¶íqá)”’î™WåŠα84pGT–`´žû*ܹ3W4X8.`‘+ézh“+vøÿP ËÒŒãÖ˜ÑLtkÎè Ãmc޶I½ˆé¹¢7îì±B[ÑVÈ58z¢ t;7¾oå>ò:†ÃÏ@ϼ@Wç¢ñåY”¥ ­Ó?ïü)ä*:Ÿ8¬E[dþX³û_nèºÖffèF@6Ö&±·+àâNä·få´Ʀ!±*Çí–à`\ìËìuY$´pHC_C¥S.½ ×Wt)Y´ÆÄ ݼ!@Q_2ƒOcë@Ú™UàÄ)Ý·BN@,Ú g¿ oþ±jãmuó5¸0§gîËç’œŸ±¤‰DZÅØ%RŽ"f§°.†ìÞ= ©Îk_¥¢–-³ðÌ óÅ€¤Uzš¡¸'Mn©Z£ §†kì‡ášÛ>Xú ígÍ”œ¡i^îñeÃïn†ƒf¡ä8¢ÏãÀè”vvhY]%Jpûõúd¼<£ÔiºÎh  Bêÿ ¡8g•0ût³Ëq[¶žËðÔÐlvuÒ‚®h™ÄjÔܵåvPè«ÝÖi·åNŠëž"X¸jÂÖÛ³s³ß7šöÓcËÔíÚôØ2þw_‹úC_:Dñê&­m [ÕªæÖ«põôå%8.V´ÝB¾ÿIÌ”FéÏÿú[réØ{ ^‡3b2úG5°·¶ià<ò,Ü¿*ãÄ® º=fÙ¨HôÜ3dË®ƒ –‹y¥ºÝ“Ã}2Á¬C¦qJuj¹ÞŸû%=û¼|†Òª1W,éùèJèxÚÏÁëß×@ýÌËò‡:x n¼Cm2lt¶  $FS$ê ÆK3²;XXÓ÷G'(ŽN†Ì°þQ…ÎÈë~Ï• `¨~#=9èëSˆ­^·p!p: kK''Ÿ‡ëï‡g0M(^\úÛ´¯ª¥î6¸zMËîR‰—Cðÿ}×X‰8´—t_Ò0·îÀ›—ô~˜RvÞ\ö.áøÐ„€‡6§NJ$ž]·°`QÂþZU×y8¥õöjz¾V· PÁ)øí^m§V…¡¼žëBè¸Dк¸ÿ«4¥íž¸þ¨Ÿ²½ãëö>õ#wõAEûîeÛN™XÒ®[D'Im çà¥9ÅÛãÀ(BèGQáûi®7×6kþÛû³æ,¸æ˜b¡@­Z}$”×ÜÌåá‘þù“¶}–é¿Ì¶–>Ck~a>?k¹æeŸEy*¿k‘<ÔAžBlÌÎÆó¥ÒC#ÊaC”ELJÍ _Gô}7!¬êäâöseÙ¬Ø2²z é\ìyÆþ/ ÙjœàÛ”F–g75×—jª§ŸE3Õ÷ àfÂŽ{×¶[´ëáa³(a¬¢Ž;Ž€³N 9+ˆ©³eöú¬~yþeØ,lÑae>Vf5ø]¿ôR-'Tï¡b­»9ù µÀßø¦ÀÄ^^Ëæ2ÒÕÄâôòhàŠ¶Š]Š÷ ܹ(!wµ©(j²'(–`»çÎY­²¸ ÚÕ0ëNêóõŒiÌú`mK¡©ž¸„Ýî¶}÷†ÄÜ-ÈÇdšXj@þ‚–+äT?Î…Ù'_‚¡“°ó~ã7e?mPê…#çÄ„µçÅúlXßꞘ·8bÎ&ŽB"§úuóÀÖœÀöÁ#ºO;› eMÍ Ðß±{Ô ô¤Ä¤%Rbçâ2‹ô¬µ´¼™>xŽõÁKåò÷é…óðþ…ã@vw.é™êA÷"¹ƒ£úËSº P¹¹ ç%œ ňG;ämÕcf˜¦í³û|ý]iœZÛ‚V®"Ö²3ØlSö ÀÔ$”¢m ê$sMÆ—s·T°¶¤ã›³÷j˜Pè(ênØó…Ø“„2BÏ @âV öiMp ´œ#h–:ÑùÄíÝ´Š<@(/´M`~7 |RÈ ÍDݵcwUâÃàÇAR­éo[³uÁÐЕJ…½½½'ö»žUùYù—_J–i_àý mûïh×:à³f¿5¿ìþ·‡·JÓG_÷àØB…Læaê}†GíšKš¸ÆÄÿvýä^$Ö]¹3È%û2Aq9Ç iý· :ª* MÙòÛh Œ¡Adø êØwP‡ÿSÔiBº#Ÿ-{vͨOŠP"eÐŽãÁq»fçæNÝmvž‹dO>¯™ÿ­ ÐÎKö8eÛü’º=MŸ9àñÙV+ÁßÄõþ¹›LN£0š¦!‚Ž¥ …o|Ÿ:å½À{-u5}Þ¡NNû¨c½R—©Ê¼Y<ÖGBçí8[‘cwð§Àß$¸Wï a œ;®>Û¿×Éê´ýljm¹÷0!”yÂ.ú¡³b&~üÇ Mõ§èÚxÙ\†»+á¼½FgO¤“Æg£ö3ÿ£»7Æ”¡6¼«ôøBM¬Ê‹V+ÚîêV¢E`xPª-&ñðæ2ܾ¢kÖ\{[aÀ‰´Õ ‹*Óª-®ýÝ­PQîf¡¿ CÇåH}pDÇÚ“6èöE…€bíjë ¸ûŠY:ñ¬BNÃ, Èy¼`@ Ú }u æCgòà?-°MwŽ«†Îw&‹Yè¸iÅ|ÍkjbÏjlCÌãb.xl¹Fjv †ã/¹…ð¬M¦Äju—xXÐøÌ×êÞz:Í`òÅI¸=§gd;ɼBPçG´Nß°®}£#ÌwgÅpUË*ŠiéÞzGïÀ°è¶vi•â°}CìæØ¤•U™†w.„ìÌî$üèu8~Æžéeko„í‹—ÙZ1#ÓœyUÚ¦ž|È|+Û»ô¼=;›HkÔ 0©Ý(¤6ŒX£5{O.#€tõoÚ;z1×Ë„úr^X{ÝîÛ’x⇗ÿq€Ö 8~Óô™‡âÜT·¸<düÙinž¹›çÉ©YöpêÔ)fggÙØØxÄÔ×Ûãÿ”~ê£Z ²Xúí“<ŽOÊyÒ2þb{çÑÜî@S(çóËeÚPg¹LHv¥A`cž%xí:½>B¸ 4 yLÿ'hï´}¾ˆŒ!}¹~ÛÆ· %N@è¦m;‚@ÚÛ(sí(¶£áMÔ1ž"è¡j˜>¥?Ÿ´ÿ]¼êBs¯EU'Ô¦Ú±ý²cqÛ/q±6¯PÌ`Z Èâ{3ìÌÉwÇéùi`ꈊ¿vE(:º5À/Ï ¤“ A%º`7¯cêëcS*Ht3§ë7:ÙTþ¢,–§; _>ø‘™@b¾Bcb¾î±÷`Tš˜F=x"E[Å^ÔëÒÚ’(<[Ñ@9oç±<«uÀX&ËκòW ­È 2|µ_l{c­m 1­ÜW¸lhB  B8ªÔ.jþ/Jï6 …Õšî×Ë)í¯; ç;t}2«°]Q9“¡.˜Íë>¦oTvK é`b5=îÏuÒB|ÅòßÍqïd¼cqÑJð J ²“Ë-¨¢™—‹@«hFiR úÐlrP7­ s0謢—¿ÓŽgÀþÎØ1Oqå wÈB‘Õ„yyùfNç5:drÜ߸{hBëîf)Í)üSܘYZÐ=ÜAßú’¥¦¯ÂT¿•=PÝj9ÀF®ÏÐ:´)6©Z†R‹XŒ‰£pé1?±xuJl.£ïû”½×ØÊÀI¸2S ËÚ‚Æ[¤ã¿zIÇÛeaÁåY ²»zC½·Ì†Œ'þæWh½ó}y¯ÿ·cYÕ²@R®/Eú°;s >3¥ë¶˜®J(ÑÓ? Ã1¸?£k‘E!Ëí+Òx=÷×ä‡tå¯Tw®Û@H¼Sç¹:'°Ôo±Ü« 2ÉìÚ°Zª„‚ѯZˆl7«u—fàÈspó‚Àw/rÜŽØ»oÑr=5˜0öihH×¶½Kläæ2äjzfV6‚8» œ³ð¦ƒÎž~h¦žåöëé¶ûÚ+ïȲÀs4 íн"¹c×ëÌï …Øþº=ÿö-Øï>;†B^hõ2b_Þ ˜áúdÍÙ$/þþ;3ä`É÷45,ƒ¤a¤_ŠØ94k àѾÓÃ|ÎÂû$ÓµR/<ÿ<<`}}ý‘}4o£Ùÿéii—öÛþm_³ôíqÍÒÇy1>ÊC¤¹5Ï’|†ãȵվó*àîÈíÛêˆÅ¨ÔëTªù·!àA€ÈM <ìÔ#ð’þ–-ÿ& -#@u 1K‡°q@5ƒ2fÜ%ÛðËÀßFá‰!Ä:Ý@?G.Àv\«(dpuº×[°å2¨Ãm±óvŸ©ÔÉ%8Bw¢Î¿Õ¶ÝJ ì“ÀÑs) ^ý£pù¢*ÐïÕàð‰ýÃuæokà] ÚnÄ4êæž}Zƒ[wRa‘Ö˜Rþ'M´‰m­j‹ä>«ÿ;ºäc´¹ +%¾1`jJÇ8˜Ö18¯ýÛ nŽÅáú½>Mýp}#tö¾|æ„€\,.†&—éû¿¯Ða«]ÓeB9‹“}bÙúGt~±v Òk V#0ªÏÖòb‚"…˜Ê%±ké!¾DJ€êÒ Ðïµ}ŒXˆkvCµò¼u'áÆ’Y:´È³ *’ÆÝ-iÀïëPöŸ3ŠãIxö«ºK síl꾸½ÂBŽ˜^ÉD[c¡¦Ü6»ÑV±Lc“b;ºa!§ó?×qŒ Dut)»Íö-¨ö^!'!|¥¢e–f,c1£Áz {I{¶‡q+ˆìð‘ˆ, v6`#ªœŽíØy1^KèèÒ³±„žm{¯Ëèš5—ñqýb·½ƒ>)»aïÍ!²ÎÚgÎ? d¬ºH¼Ì“uKqB±êBÖFÑ?®ô‰¢o»¹Ö\ó÷Í„I+aòèýœ÷oíÑ(¥zÖ"Më?.yø<²Ú>WÍÒÿñ =OÿØ)VIþwoík–¬í3K³}ÜD3“ôQ/¢k;Ü•Û×ñ4hP'!^Ÿ´e=Êúö6 ;Ác© u–³PŒ!ೊ:=Ÿ~ß¶{ÚŽåíÏM$—Q':ŽBfiÎ;†B%¿aûûmd4ùbÍnß_E³Õ^‚3ð `÷íü{ÈŠŠz6u劶Í4a¶ê©ËiÛϺ;žPZ.#f!‘Ò€ZÈÃê LŽquyú¬ßþ‰”ÀB>h`’ÀlV.ÓñN+nV cÅî“¥¥…xbèeštàîLˆ X_‚ùY]1$âª#¶ÛP]¹rIúÑgu|=¼§† È4 UÙѤÌkɽи4\#–r_Ò6*¨úŠjÖ M(¬—Y ©ï ð0uBŒP­&ðÁœÎ§ZˆéNêóh+”¦¿ÅÜk¯±fì[ °>p·®ðÐh±QW´•Y˳ÓpèŒÂeÉ~¸wM,ÇjE¡Åƒæˆ^.j›QØ©©Èpù{ºVs7uO»’–¹¸"7îdQ@ÄóS'µŸíŒžÁ4bʆûZÆôìL$Åžµ™¾*³ªkuì¼Xº;™PÇqË2ï½Sº–}£î’=ÄݭটËäìäU›ï•¯ëg«#DFGéX¼HO¿Â„íÝÆêåÄĵDÄ\m,)4º±“г¡É'k¸>1FÈkCLÔ5[n¸`ïÐ sv¢‰Ï h{“±¶¿g}¨¿Fý „É VºDÐ)¹'Zœ0éó> [Þkä¹m@…P‰ÀÝÊËÝ’—VYiÚÀñ3gXœŸg}s“(¡nÖ&¹ÜaŸ%ØoŸ¤í3KÑš™¥OC·~Ô:Í548;=í³¶6‚ØÑgmN­/>öù $Ý@°L¨ñTG¢³ îÃ’!dÖtjAùì½醞CÚ‡ 9N*Ø:§¦éK>Ûô,¶£¶¿«(´æs¹äP¸îžm»—àô"¡ó%„"À]Jq>zJÞü‚€H¹¤i.cqÍÔ+e1LżBòƒãpýH++ ÄxYŽC–ZŸY“èx<©š^%;ÿ‰ÜÎɯ§oT"ã˜UžßXÔàèéåcã°¸ sñšzu ?©ptJ¿·–ƒÆ¥5Š´¾sQÓù/ë¬á™SgoÝ€m…éi1i±v± –ªZÖµÜÍ!sÿˆ®q.ãÈ©2·/Âf6h^¦lßq{ÖÀóÏë|î] Ûž µéêäÿíWtÝúº¹r/ ¬ž9³·`ê\ºgŽ(‹oxRžK«¶ïR kÎÞÀœ>­‚¿§ž…[µQÄ2æjv¯“í]ðÓzW 4ml¨F]¬]z²1ËÖs†Âþ]»þ'Ò2»ÌeàÝ?Ó{¶„˜›DR!Í\C âPb­´´µ±—)Ò™B 2P \ÏS1àhT ,hÊç¤AÚ x¬ù»T·kÒfïä{×N¢ýÏØï¿Ì,[8ºoÛsË’2a"f•€@˜GÏ@ƒGÃjóì_Ïôu}R'fï>nŸâšHŸÝ73E1B•T2I±X¤TV ‹÷Á[xûÏŠYúß_|úÌÒÿÞ>³dm,}Dû,`éç%âd×,ÂižBï`ª›1tðôi²Ù,móóìØ²®( Õk¨em;»(Õu c„ÁteÇäPy˜—D€&eÛY@é¢ýý A;ÔiÛê#¤ûöÂZ9jîÛvûÐÙ%ÔërWïgÅî‚oæ”`!»ÎG“aà.ìȰ×êr­Ík€H+ü1l ÎÖ2LþWßâÞ¼Fw6¶ì†lgK% 4Ã#ÒÄLNÉÿææO¦Ù\Ö¶nÜÓzƒÀ™5peVaú,Ì\–èºÛ€Š;@'âÚ¾‡Å:Z´Í½‚Xg©ª@oÖsÌv ÍL¹¡ï_þ \þ±BN}ˆMrì|V`hpL¡›F]×gö3×Zí9x6)°æÂâÛKzŽÈ6ÁY›F‡&žÑV»¿ó×ÉüøÏ©Way.^žn‘R[L ÜÕœîñ‹§`úŒ¼¦îêøZÛà¶…” V³hÏĉ>ÛÅ’ÎÑËù”íï‰6é¶@¦“ƒ ya +<–5°‘4ÒÑ-MP‡9y?˜Ó=}>³¡çÄÀåzïÚ;ĦµÆÄ†-ÜÓöòY]7gÞZc² ÈÏ¥¾ú†áêÛz;z·€³‡àƒ{0=ÑDZ_dûÊ-Ú»à'o©_ØNtÁ‰”œ‹ Ô&RbÔâ Õíæu-<$·aï£÷ uÛV¡OXC€qÞ®£º.<Ì4•ãAÌÕb}6y;@Ð} ÈÖsÐæûnµe[mí¶ÿ ;§![ÿ˜C ¨ž¦k4b×0oë–óÆü€˜DJ,ÌÚ‚JjEýî×–ÚÙÔ X¾þ;5Èm…û²iéîÃQ±,{y8yNz”¬…Ö¶,þ°±¤ dÇté=˜˜”ùॠП€xEé÷Wg´NbzÑì>L5`6@W{T6‰”ãïK³µó™oèº@Àæð30UåSÚ»PÚÍó©¼2ç–·“9o×ô ëôƒ›ð`IÑ™W´ý{7t,õªæ­ŠYÊoËÎ`ñ{W‰¯Â‘#µw&àlZ 5Õ5<þįŠIÚ\øcuæBxe1n/1Ë2Òdž´^6Š r¿^š±¢ºÆüE[Ä0¦G ’Õ³”ÉÂùcV&&ëY‰Ð‹À‰“ Åöè:õÂÝ5(6BÊûbºŠpÔÄó½º&‘H`o_ª^€±n¸µ¤gvªIl^«J£vwI éKç`'Wdo}‹òžä؈X®\FÅ•s™0!pGöÔ°|·ÆtN]eˆõ<:ÃåŒÌ¤)Ì@‹ë"‹öÜÍ¡‰J/š0­ IËUÛÆ{o³PE ä{v±‰’î IØeSu _Z%¸ìÝnÎ’kví.ú?g¦ÖyÔC® ¨îíQs³/qû}lö_jîŸáà j¿í7o[Vì·§ÔšÅÛÕ<ÃduD€ÇŸ!ˆ5AƒØ±Ã‡©ŒP'”‰Ê”|Ùö;…™X¢ Ù„jÞKÄxöÙæºLÕ"еƒ:É4Ò1ÅpªJ-´RŠëh0ŽÌæòC̸óaÛ¿ŸC7ê;mÙ¤Grñh—ýœèРV­hwÊ qiFƒGÕ²«bÆfû×ÿú_ó /H$âw~çw¸uëÖ#Ë”J%þÉ?ù' ÐÕÕÅoýÖo±°°ðÈ2sss|ç;ß¡««‹þé?ý§”Ëe~Ú>XúŒ­€|Ø& 9ÃÍ)à*ÁŒ²Ùd­éï+GЬ¬ˆ€EÒÖÏ,-QÌdHu‚ßÑOQg¹€ÒUÄøx˜oÊ~.£÷šõ]µcpßSß#è•ú r//r "£ÈU¸ÛÎauÒC¨óÜ"€©[§ÝþßµelÝ!“§ƒ ¹èFèx <÷5 ]I1Å]‰p³›š‰§§•"ß?ª­%bÎÊóðÞ5(./ÑLÆ5@d¨žP]·\FÔÿ@ëÍuþcvLS¶ïÓðÜ[ÒñŸš–ðö›êî"Qv‹q½Q³€ÑÿwåBÓ²íh`uÁòŒ­sœÀà´ÏNL°X(°±¹IÉö[Ac æ³%P6ZÅöçd+ê˜÷ïþ]–––˜˜˜àOÿôOùæ7¿Ék¯½Æ·¿ýmæççI§Ó|÷»ßåw÷wY[[ûÂuSûÌÒ'h¦ÿ¿Dí>öŽ4zQòÁj0ãi#¸H—Uí$èMB:{P®TH×j”Ñ ,G˜m¹&á¼­w›úë¥6›´ üäüë§üuLîŸâú†êàKy–Úk(„÷ ^´ótã?Ïôó4ÿ Ûæ8–RN(Ÿp uÈi‚Ö© 84 ¯þ¦´ |þ¶R»Çkð>föz`kÓÐg:‰#Òù¬¬µ?ì¨'Ú$¼ž: Wß Ž3·,í=¡íO³pò%Ô€ÖyùE™Ò Ù4FuäƒQ3ÞìPjùЄUÐ@Ô—q¥ƒÑ0š€#ÏZ¦XR]h³qöY±B¯|þáÿ€d ë‰SÚG¼Cú-Ú¬éZ·£pk. W²ú;,a5 ïIp ÷tt븙i Ì“Ç`àèEZO‹…ÛZ(½q ®Ï ¼ ô (¹vf~E ¨RÖ:'“pòˆžŸëïêþܲJ±9ÌU…øÞû ż@_qWàâÎ’y½Ùœî[OBŒÚô…‹Špd@Ïáðæ-±³×L*öνö¿($VÈÁØ´€RaG÷d`LǾ°$³±¥ûm•+üPKÈ@Í¥áJ¤4†ÓI½Û@×p‚Ã_šàKI]ÛÀZfVíZ×1]Ïè·Ž(‘ûtuNûžµÈFyOµîž±û5Š€‹3Ò>ù5æþ{М@÷h±ÉE{c¶Þa{Öž'Ô“Œ¢¾pN"p>bçAmK¨ÉÚ6úÄtm6}A–0É,Û±z¶œ÷ÃEB/ œ?vŒd*õ0A‚¦ßþw¤é‚e‹ÿí­‡G-~Pú¥aÕ§ÿó)[Ö²*úúú¸pá•J…o|ã—I§Óœ>}š·Þz €·ß~›Ó§O?Jßüæ7)•J\¸p/ºí ¼?f{’ÛëãÆ“Íh —ø±µ÷ç«Ñž•âÛ‹ÙoÏ„*™J…j­Æ±¦}Eí'޾~9ŽÊ&5 ˆþ^°ã»fÇpÎŽiÙüut{½PuŠn²weÙÍjµU«ElG•fq3Ë][ÆóÊc»ÔÙB¨R~tR3óBÎÇ”äœ!’% tË{”ªe•¶X¼«,b=£—’˜¿ ÛÃ+}¶*0mÛ;TØ à`¤ª(=-Öèâ_*S*ÚªÎÆ¿­Ñ;¨Œe؃øºt:Öj¿—‡+—’xÖîõÐ8¼O×&=-MÌz~ò‰›ÀŽíŒK4Ý™Öå͆ҽh`žThꤶ׃c»b5â %ºd4Y&dM¹ÇT 8Ü'Sg18^o¦ .K°vû9¤s/­6Â@Gebu nÞ® ´®×•évÜýãçáú˜ß‚‰> øµ$,\ùò¸îÿöº@ÖÛk!9u àÿéžû óej- `m›—Àšv¬S]2=uÂ4GË Õòð“‘spàXçîlZvaNçWÐ*TnÀhŸ˜¤ë¡s 8ñ<ܽ$önÝžÕ³Q¸XƒÅù-:[³¼ú=?oü!\[؈רKõõiØg¾"íT!§ðl5§,ÀÑ>XœQß0u†kPÊè}o ~fÍú€eä©tù®=£iB´j)Ðdë ³M!c[7“­"0žG¨ÔÇd “ÆA{ŽfìùpO¹m»–nYrÝ>÷‰fŒùë1×J–€]¸@ڎÙ}g– izß›#LÔH9 õ¤â½Ob—~e5N³í<–YljÇã?cih4üóþÏùò—¿ÌéÓ§XYY!‹‘J¥Yvxx˜•••‡Ë ?ò}*•"‹=\æ‹lû`éc¶z!ü;!}ðÁ§DHuS…À¶ø X Ì‚üev#·Ô¥¾d’J>¹ï#ð2‡^üsÈGe@ó_B@kЖù¯ eFz 9Ûl?„tÿ.ÔQNÙùÝE‚Î5Ä^uÒÚOÊ·¸9ž³J=h¶8oëìÙ>Ü_ªA(ÅÒeÇ?h×ob@¬ÁnVz˜ùÛpëŠÒúOj®ìiÍer"-*k—>epH¾<^u xéøqb-«ì-7MÂÌ’Ž·—­™ô^AÙpñN±Nïåt>I §*s{§X”801­ÁË…ºõzEWÊòöI×T -=-Æc`Lhö†€ÞhŸÁ¯}U6«sZ¿T„Ëï‡gfÃî]ÉîSç*üð5ù­/J°|ý]u6êpùޥܛç±,eBáaýf·àp*øFeÍJ JôkK¦+ùÖ—¼ô Kz†‘¨TPHnm†¬ÐlmY ÎËŠÄ;á⎊AÉÚH(*tǦáä‹Zoþld´?/žC÷,Ö/µŠÍ©ÖàÌ)øàÔfõÞŠËѼÇÞ7OßjŒÅanVzª†Þ¿ü%8¹§ï=`¯™R`:âhpoÛ‚Î6=;÷r†éi¸öŽîÑÄ2…¼úMÈúGØMŽkÿ) fòl]פZÖ \p}çLõé8ÚÍþ T€ƒGô|rU•=™v&¶1FÀ{±½…(·äp[n{×Ý=þ?Úû?E¨çÃªÝ Ð$*Ž&c®/£ Ü3H/éÉ£î IDAT“(7žíG拏bþ„‡ÎиnÏõP.?wþ<Ëóó4ÖÖÉxközŠêÛµ>¶}ï§!¼cÍÊ¿4,Ò“Z½ªå©mO|ÛÄÄÄ#ÿËù/ùWÿê_ýÌÕþñ?þÇ\¾|™7ß|óçî¢ÑhÐÒF׿¿Ö2_TÛKO©9íš$g¢vxT\ØŠ:…B,Þ3ÝZ àÈmÿÝtÒK¬]ËËDjµ‡cçÌϬmu·Ñàuƒ úw uFèHv+wào´‚f·xqk‚C„ŽlÙö{ˆàÇ´‰:Ð]‚1ÞªíÔ {è1ÚôyÔö9„¸míbn?£AìÎ% úÝ Er(ù –ž¸Ø°4ù©Ie©u»E…bNtÂͷߦ¯Ú`ÚCoTº“/ÁOÿB¡½h«Dºw/)Ü—GÖtJLA.#@´µŒFsiJ:Ò•Œ–zm^ǘž†çBr@^Ców´ìÝʼniéŸÆ+¼QÖÓ/Ðxìܹ&vh;ºÓ69¢cØ\ëwÌo+ý}úÛ–gψyKÙõ÷lÄàì¸Ø“‘)¸{#<—‡Ò:ù¬Ž/5Ûk¯Á(¬,Á´isr¡ÕH¥d yû§Ò]¿¦c82­Á¿ßÒœ Ý£¶é[Phn7 sYhÍŠus}X8|nÝ Îômh ok‡“‡µÝRA:ìÞ¬–¬œN—X½Y¹­1xëuÕÿkµã92?Z(¹É[ðêyxÕjA\¼îÝ9;¿_é]ígÖ(’‰£ºÿó·áæüÿì½kläéuæ÷+V‹UÅb±Š÷k“lv³›œžîžž™žûH³£‘%[ö(Žålü)‰ ûC#A€A Abb ›],ÆfáK`ËkË’,i<¤¹÷tÏô½›d³y¿‹ÅªbÝóá9/_öXÖŽwG’£å X,Vý/ïå¼Ï{ÎsžóÍoJಳu½åu¾þœ{Þ«œ·´Š?òÍÝU-šhåfNó«#*ž][‡æB(,.Ø®©ØLÊÛ‘¯WM9†€Š Ñ7l'xmЮÚ<~®wQ(þžf0nó¾lŸ-ØüÞAöéi_ßAöÉÉ„Ð&jÙªgPÿÓÈ#µWØ5ÜÒ³ë¹9påÒ¥ƒÿ}tqsaGç¡rB–.;÷£œ”vvt>—Ó?ôcaaá¾Ðò*ýÖoýù—É믿ÎàààÁû½½½”Ëe2™ÌÞ¥õõužzꩃϼýöÛœ/“ÉP©Tþ–Çé§qq–þ=Ã^%”šÁt.x—¹á>·… UïJÇM6耼èvmed(OŽ1ÜÛˇ(\Õ<‡ˆÛ#x‰—aRBjÌ^?íþ‘qA»'MvéÄ.…;m?;oíW_© eÓ„;Þ=C?¶Ùµ;iï·á«§;ÉW7‚BFº8@Õ² º[ É©Çä1¹sY»ðñ³Z¼ïç`ú.Ì•t=i-î£q…ò~ÖÖáµ9èûô§Y®ØÍXáך›7þJ‹K.#TÈ)VFU>Ý-0rõ=eßíÔd¬;’^gú6œÿ´Âb˳poFI+sº÷[ïêý+¦=TBü¥Â®Ò×ugg×y'Ö€­¼Ús…’[«:ïf^ç\·ö­Õ$hÙ…³O(NÁg^×h` RI˜ê(Ù.Â+7Õ× ÀcäMŠDª‡xDýó·rö‹òJíl‹'vrJ`aqîmûBËq]£wD‹U΀G‡Ë;Óâh½s]<§* ÛÜ"¯]G  HG®¡PêøYm²kU…º 9XËègßæDŸͽ¬ˆáŸýy'°þ¶ù™ìÐÜIÙÜ©£0fy_ÏÕß çŸ€ñ€ÆnÀJfæTN%Ðddí6™\F™|OMYbGhë&4~–˜@u0$¢ùfF^Ñv Q {ïl3žã¶ZTèvÄâd¥¢ÕðÛ‡éØ©x[r& ^`Ÿ}ºoÏø>ÁÀiœÅ¦Ò6ŸÁ‡ÎŸAýׄ¼ÎA–Ûðÿ .‡ùö·¿}ðÞÊÊ ×®];KO>ù$×®]ceÅ+ ~ë[ß"‰páÂ…G‹ý½Ž£l¸q|4îp=$wž<.}õ0 ü$=,|Ö|èÿŽÏ~‚÷£Ej¨ ”–ï®SG@çdÔÚ')‹/pXèñ2ðYän¯ ÏÒ¤&GºLؽ~ ¹Ä×ñ¢Þ°lºF -÷‘«Ý¹Ý»áÀp9Ï™SîBƸlï÷Úÿ:L»¦9" ±±¨…Ï)F‡š%ò85b÷Tײ€“CÍ{YتAWXïÛ£¾i¨Y^‘ù»ptÙ=6´Ø%“Ê [›×¿½S÷R)+¼“Hš×`Y;hWßj…DbmyÁ@]}Î)?ÿxç[0_Ò‚Ó@`gÈÚäÜyŸÕ²FoMÊÓÖÑ'µQ‘QoާåM+Ûù'¯ \è·ÌÁ¼ÆÏcŸR›ó:»ÏTÞ¿}Ur q?ÒBÜÔ$púÝ?×ÿ*@9 Ðh4âI­ª°b4.oÜõYøò?›ïj?ý˜x@Ž€¿—…Wg=Ÿ­ÝÈÚ¥šÌ1|¨eô„@s1Ÿÿ5ø¿þ™ú­Ž(£q¨í5Ú}ÿUyíV¶U¸Vó›ˆj÷Þ~…J—¤)5ccb¢[÷¸S’÷c2 rõ~#‘N›\€©Ë–m,ÄMvb[2 ó%˜ìÖxrjß«÷ %¤Nˆz©Äñ3U®dN¦©KzÎ}kgì6³ hn¬Õ`¢Wï»r([+kå}~ðjÿkÈS´ˆWæï±ù|…Ú]²E=?¨m^Džëüælm¼Š6ž;lÌm\»"Üwmžl¡ñ¸‚ìÔ&u/níßÚºŠÓíAö±Óˆ=SOk+ë¥•Š´Åî·j?NËËɸ8`äÄSšó—þ]ÉŸh6Üÿ>D[ô“óìë$ÿ›…uï¿ñ¿ÁþáòñLLL¼ŸL&‰F7øõ_ÿuþê¯þŠ?øƒ? NóÛ¿ýÛlmmqéÒ%‚Á µZsçÎÑÓÓÃïüÎï°½½Í¯ýÚ¯ñòË/óû¿ÿûŸØsý»Gž¥¿Çñ£€øð[Mèf\¸Ž›˜Çñâ‚LŒÛgW‘!ßD“Û©è&ÏNM11<̬½7ŽW·/#à ÔUdÄþíò.¢…ûÓøð^ |Õò'ñäKç¡Ê Å¹h¯±çê´{=‹OõO¡E¼•ãÅ$ð™{­øÝ{—)@7G´æÍë2ú¼>ÇψàÜo»æâžÀK0g:å]ÊeäÝ(ÔàÂ-"m¶š5A¾ˆ]ü9öƒ22E ™€† öŽ5h¨ÙsMF lÕëò’`ÏàÐ7îjsKÈ“ÔТ‘<ÔvòU˜)y mÖÐÂþЪ7×=(`q/×çÂZâR ßE? žr ®oZì¼u&ãêï¿yMÞžÝ-…©ÖÕž#§u­dNáb7ôÄuÿ˳z–¿ùs''T8øÒK´GàÂ@Íò¸-ÌBODž´Áq¯¶ît±–gáÖ¬×ôÐÝ1PsŸíÙUÜÙ–ÒúÿòϼJu2ª¢º±6•v9v î]WÚýŠ‘äÛ»"ÎLeÉr*iÓ3 Ÿù²j6Yn7×á^I}ûÅG•qÙ–¨hÙæÌím¸³®v)â½-™<ÌQ}¹¤1¾½î -o. XZÛé|œhn¾§¶ªX2B*" 68ñ¤ÃæÝ]ˆëï–«5©±4·ªï­/Âܼž»¼¯ßE»¿ Ú`  Dƒ ¼7(†6aShÌvá c§ìs§]iEö*bŸ;‰/š}¿ñ²±¿$ ºQÛYb+5ˆ†­íþϹ\;4oBvîe»—1çD6;ûû¹ÓdçqaRÇ]ÚÅÛ$gŸCx*D“7tèo}ÿèøáÇ?ý§ÿ”l6˧>õ)úúú~þäOþäà3¿÷{¿ÇË/¿Ì—¾ô%ž~úib±_ýêW ET ƒ|ík_£¥¥…§Ÿ~š/}éK¼üòËüîïþîOë±8Žq©ÚÎë2;§Â¶ãk«&¬KgD†ÄeŠ ¬4œD;µrsß‹Éí"cò"íàSsgí>£Ècô2jAd”zìzŽtÙÃ<«"žôè„Ý\½¨e¼"÷2ÚÉ9²x2týv­Vk÷^kX5ÕI»ZÑ‚:~N`%k€KÓÊ;Þ«z/«Ýù^C÷19¬tõá¤@Tï¨@À+¤E4Õw¦—b´V C°RT8‘µ{Jhñ­ì+u{í>ÌmKx²²/ Wnø]n89ÓsÐ(‹¶*sm§¤~p;Tž¯¿©¸QظsÙ‹—¶Ç zÞƒí0‘¨ ¼:ðúÔ -˜WÞó¶sSâÇL^„ãgaîºÎ7ßR8±˜W!Þ´õ§ &-œØ3¬…7Ð$¯Úú‚iµ"ÏÈì2$ÓiÚCÛºWýâôÜš7í¦°ÀÚçþsxÿ5OZ^4…õ¬µG+0>¢ðÕšCɨ÷vå³°ƒ8¬åMj",/ÍÈiy [“H×.i¼GQXq?¯öªT&ËeäeYÃkýlØ|¨ ‚öÀ¸øZnN÷vJƒkm^dë÷/©ÍBh>ÇlÎUlL§˜tFO")ˆXBωÂj>B2çÙ·ÙË Àm,Êë·Xô2ÏWÿ½{SóÞÉ}ä‰äE­}I•xÉ£°c0d²ëòÀ9=¨|MÏqÛæí3NëhÃÆ¶«=çÈÕ]<˜½Û¯9w潆×KàmOÐþŽY]E¡4—ôQ·óÏ¢P߬c Ôëx»´ët÷ö²·»ËJAð'„liÞ¾Ó‚/6}XÏ…äG>ª³»<Ê¿íø‰z–þ·>ÚZ>AÏÒ~ä»rTÎŽ#‚÷ßã8Á`ƒöy}Ç©wÚ³måÔ¯?¡E¦sÀ‹$&RJkhq„‡žT–Tϰ¼•9)rÏ[{tmqy@ áøÃÊxKvè;-QeL5`%/`Ð8@ż´‘ÊûZø¢a K «­Æ¡µ]!¯jn^Wê½ó ín‰üÜŠÆ¡=½)hÉx"K®eáù¨j5’õ·ìûEŒÎÉq"kï(N7êÒ´:^öa r®þÀ“ñ3kЄrMc×Ôõ_Ÿ¬´V8÷²:oWA²à¼ú±5)žT­ªk/-*Ö<”€·rðÖªy.sО¸*— X†¤eµ­Ö4vz{u¾Ý-Ÿ…º\ß„…?VÛ¥z4.Ò6ßrøÍÛ¤lÌ»ð¼«á˜AµÇÈù"DÍ´ $¸þÖ¶ *oÁË¿ÛÁ»ÿ÷ù»]A/—Ð…@̶ÍÕvàFEÞ”Ï=£¶ÞÊzïI© ïÓΆ…çPo–8k*õ¼Æð";-xf_7†/è]³ëf‘í¹Ž×Ű:€J/€yJܵ÷\È7nm:Œ·¡·ðêâîp“Œ×$âL=ÖÔÄ›À™›9<íÁ)–ðµ1[ðÒ%Î3ëÀ“Kξ‚·ÿG^†ÿ°Ž#ÏÒ8>êYrž¡Ã¯ÝNÄ¥&×+#ÃàH‰]xÉç•qYH%ä–^Åè8~ç›Cë…xœ·«U2¥ÒAÚroоk÷òž›±ŠU:Çïèíu˜"\ƒÈ 9ª×kÆsúíœöݼ]?`÷ã–«ñÖ‚w™7[úvÔÚ¥#)‹k5  PVP{—ù¥i•¦€BmËÝÓºµ]ʼI®>YKLü§µT©À_€Å°Q ^[¢w¾ùÇ^¼·#‚Bbùœ2 ž’-ØÑV->+sp/«ún»[R¯”Eà.æZöÍ;Жн O(ÃÎ)@Ÿ{Þ{Eß 7ëüßý¾÷Ìd›ôøqyÚ:fêì×sµÄ–jU˜½ ùœçñt¼±Ði\«@“Ï”j5žÐâŒ;ã÷$Ó c•¬?;JÏŸ³ñž˜§xošDJæÎm•™ÙË*+«ƒÝ’®ÛÖ¡6ÊfEfÏ•¤6>_“ÎR4×ÕüÇO陲9΄=WðÜguïs7 w· Vï)›­=*¯aGÀ+šŸ…eŸ4ÐÞ¥öÚÎXø­S}°—UÍ)ïÇñ^¼v4wmn8T y]]Ý ðJ׎Ø|_ʨšHN¥l̳Z4Åxã‰ílÈS·8¯ ÈRA }iÑ‹5Æ÷ü ²îv6T76EìÏ5´A‰%Äm=.0‰‹ZUzZûvÿ%´‘ "2õ6–&ì9ªhåBi}Èvä¬oœp¢º ´±¾…ìä: Ýu d‘n{ÏùGÜF3€ËÆ\Ù¨MdS’ÀÞø8››äwv(+5lŸs-NóÎõ‹û»ÂƒQ„ò@?Šsçÿ»ŽŸ¨géíúä=KÿÝÆ‘gÉŽ#ÏÒÇ<ÇÆ.çt“祎¼3.¶îC 혖ñ®à&{ßq˜Zð1t—â²é2x`ëìäÑb‘¥õu޵ϜAFÄ zyvÖí^žAÆ+gï!ƒßƒÞ2üq¬@©ÝklN0ißKÙßˈ$žÃ§¡7ðÅsÝ®.fÏ\-AGX‹g©¨]p-N­Iyš[¬öVL ÚÜ yVçµ`K@ŽŒBa-òÑÏ17•ãª4~¾þϵ`Œ~¦Ýë˼þç î!cï xõòõŒ|Ô`H o²S@,Õ­PJ"¥ì²RQovYç¨'->›S^GÙg Ê[¸£PÕ]ÛB¯.«Ýºµ ô°ˆ¶ Pm, p.Mëó±„Úè¾ étõ D’^‰'ô½L æ²"ÿÜiOtoÔaêIõÇ­wE®~ösZLk–%¸±àû+–X.ÅJ€HÔJ|ÌkœÞ™‡ö€çxeõ,”²>,•.i1 Ö`2m<³]Í#—}Ù¼ÿ<ö¼þº>ïÂ0MÀümµƒ•’€R®!ÂKQ}jV;ïl¼EãP ëýüŽøec'DøwR ºNÌÆq;Z8rYSEðYŸÑCßï¥h¶9°‚ϘT* â6·vRwþMñ°b 8÷|ó-s\„ç'T¢¥'.ݬVätÞ'7N›RtoßWyžT †Zõì4#Q}>Q‡åuÝÆž£×+w­zðúK9´ñŠ ÛL9€^²¶q‰ ÙëÀoÛç‡ðjÞØ8ù,*ÁÒŽÏŒáC›ãÈ«•âëëö÷¤\(í¾¯…ùð pr;M¼~î£À¨þ‘¿ƒ?ä3?±£^…ú'HC®ôéþÃ>ŽÀÒÇ<ö½v0†Ûñž&—1VÁªÞ#cá”f§É‡"S^Ãt”Av;Ø(Z4–ûf¡Àp¹Ì»Ÿ*rñ‡ìÿd¼>´ÿ_LjSv­$ÚåõàyTý(Cîiûß9»mûÝa¯óvOAÄ!hE^÷¾x|!\·3tiÉ5´&;DDMD´HíWT>¢†J~Db>›¬£W¤äµ¼ÒÈ7ÉN-~a[ôï̘'+¡ôöÙ«Pu[o¼­š`/œ‡ü®¼By[´w¬?²v®ÏëH÷§°+°Ë¸9Eq—âê´8íe €Æ½ªZ÷#iÄжŠOÓšTÊO@!«Vë­_íq¹Ÿêo ,%|Sý^@^ÈYí²”ÀV2.TvK"ˆ.sñ^Ú€tBž©¹›’#XžóuÖ†NÊCå}µÕPD£ô@’ٻЕ`«,A¶k h«©ýÊx[@·mÌ‹i4¨Å½TP[ö «ÏM©hl KJê‹—¾¬qÑ9 q²Ðð¥yÐX›‡{×”å˜H©Í–Q$&²t6§yºl.Æ©Nèm’'êû߇~“°85®¶¾:§ön±¾Ú²±î@‘{N'¥áÒ”{f|h«‹10ÐMöÃ̓Q˜i@k"Y¸²¨÷œJ͵ۖLѵ%µG0]‚âŒÎ1|&ΈÕ5ä³ðâIÍ«Mqñr½ßØŒ4þÜæá¤½vs=nÏ7‰lŽ«Döü&©Ï^ÞAscÀæ[²IíhÜ]AË ÊÔ]þÆÎ{xžëlR…ëŽ!{p~t”kËˬmlÈ8/½Ûð­ó •ÂñÁBøBßÎ[8ŒŠ]³~èï†eœ÷é¼ÌÀÑñ÷>ŽÂp?âpîÍV|Éð^¥ÃéþŽІ&º ºè; ûÜ}|í¤x(Þaç©âÓ_Ýnn³«‹r¹L%›åQ$)°÷Ü”áÐ Œý‚ÓùEÏ©éÈc4| ^ÿŠ”Ÿ[ÀLè;ƒãâ¦÷´¸UË"÷w ¤-í °»´tàöáËcð¤PwÿÎhöØgÓÝکב¡vZRNW« ¯A»/ç9Œš'dwKïöŒó4P…ååpÁ2ò¦»õ,;¼Ü÷ÀgF#Ò™jµûúÕåUºüºîíԇņú±`ãljƒÖ4Jõ(¬y÷®Æg—=óœÝS 5,ln²…´ãÃ0;¯û²”÷ ÂÝšÚ)ac ÝËËjÏM#1#µ×ªZćNª=ZÛ‹STÿôwŠà>~Zƒ™uøàñ_ð\¨/L˜WÏ€fSìUü¢Ækyå‹êw7§{£V>æ¶ œöÃ̲Ï8lµ1’±1ï‹4D‚Ará0‘ýýƒpz“# Y‰Çj.NÁé°@`"¥ç\Û„h@™£½ O_Q"Aª[†c Ñ|Ö2F;”W.É3¹<«Å]¼X¬ ©çðž4*ÛB jÝ“1E›Ck]ÂLvž8§ÜAµ)?çÞ´öèE`j麽†¯ °ÀW[0õ:•FC¼0° ƒº1ï2|Ù¥öðDëÇ A†ô{ídö'Ñ‚BÆ¥_¤ <DxÆÞAÆó1|šl >­÷&Þ]ÞŠŒ_| ø ”Þ£Õe¿g®õáu”†0 ãCŽmèaŸ)¢¡Û®éRªûFDîuY9mâdTJ:o"¥°Œ#öîlø}y0)-ú¥†îkŸÅ,×ÄY»¯ÐÖõ’<=)Õ+æ!22Â| @;2ª'“ å9_ ŸÅ“´çêÇSƒ!-ìŽ3RE%2œv¤ÑœµßðˆÄË%Xœƒrð­…-Vìsû5yT>¸«çq^8P[ílÀý¢î!TÿÆ^禀Îß÷Pn­¨.Ú§¾¨{½~U 1hã"o÷ïÆ\بA.7fá›ÚöP ‰ƒ`¢:yDB“Ì®/øg©ä½$]ðÔ°¾¿ÂKw xÌY;ב<ÄÒ¼þ‰Úâ?w¯¨ßÛ‚æÁ©«VÞ½›ð­oÃ̇ÏçÂ9C(<ýÚm˜[WC^³jemåÑuÚ»L/ ¿qY-*Ô•µ±üƲÚ:ƒlBïU‰á7M1óŽ{¾N^£l-þ(‹­žNÓ95u äw›ÁlÑ<…A8µ’@ËReO×*p]Éûyq¹zG Ƶ¡8ù\z²›zÖ™«zî•yyMw·äK¦}¤["«v¿m¨íÓ¥¨‰£12‹¯J0×۲ϼgcnBßî(JDøõÃ-”°R@ÚOßÃ×ÊÇ«ˆŸ9{–&Jé$X ÖÇä$ñ6¸Æƒµ ݦÉ=óaÑá °;\ñtg㎟Ýãȳô#ŽÃï¢JJ*‡ÞsÖé9M2”;ö¹f|“2¸ng2€N'ÇïŽ.<9¼'g¾Vcmÿ@Å6ŽOçËÎõ">Ô±‰ ›+ˆéÒùKȨe‘á8†/O0ƒ”Áw‘1pY.Íö§%åvj!ûŸ ×9Ž“S #M¼];×¹<®œQ4®ÐÖÝË ´&e´3kZ0›š´ËϬ‹Ûb¥5îÏH=ºÞPZøbÅ×£ŠÅužÅe èX{&€RÔäÒÐÁ»wÕezu Àå<ŒŽ¼KHñü>^‰Ýes¹ÍÌ.^^^ †F°ÌʹVÜ·a%GL'Ï{‘Öc§$„úÌ/ª^ù#ÓBÍìO¯æd¸Ys̉b®Y;9£¤‘Úµ~v6%€€èi¼AogjöݲkoÛ˜ì±g¼…@Q•G9…¸ 'íÜïÚ½–{¿¬[?Í㹓u¼pl}×µw ï}rÕ‡Þs¦¿ëøa2lþ¤.ìãÁÌÑŠw/ ;9‘Õß¶gÀÆõÌ2lÛª×a÷°´ª¬­æLž ^µûªËY_;±ŠËûõêu”ÃN³VÓ¸rž‡àúeXX•ØhâǹñÞçv¢ÎCÇa<­ÍŨµ¿›+à=A|QZ—øP†RJ‰”ÀãÀ™.z.\8µŒ!%ûhDº]CŸ=ªäÊÒ4äŠâü]¾* Tkøgîƒ{³ðö_+Œ}ÿ&|ý_Á󿪱4wC¡Ö|Í<Å2óYÉw„íþzS*çÒ¯#é8›®ÿbÈãì<1d?\2‹ã$ ÛëoÍ 9Ý7Çesåßà“cjh#èè œ®#ïì4ðÅóçiëéáqx:AÔúÒ‘ò£ö}ç1*᩼wzNÿ¶Åò‡Á”Ÿ(o©Qý䎎ƒã,}ÌÃí\v“Óäp»$7!÷ñ‚€Nˆ1vWØgwÐäMÒ|}¸*ÚÑÏÚ97ðDÆ%,Kíöm \D‹ÿMd°ßD‹Ì×ñü¢Gñ™:O#ñ:žË4b× "£µŒY¾¸¦ÓIéÄsœ }˾[·çu®ìV¼;PM«ö.-â{yÛQÈXWöõ~µ¬ŸZU)Ó¡°8-º x> ÇGàd7*01"P“YSø!T=3&–±±²$žÑb¸ù-&­“ꑇjgS÷´±)Yƒ-àv®_Rh)»¥EÇyBÖýQ‰êÞKh¡¸~–Mº³:SÞ{ä ·Ø#§¡?® µ°!êö.7—Wæ¾.žËÉ0t[_RIf[â 3îe• s|Xädî·jð¶™c±N´88Oˆ[´½n?t]x0;6Ìg‚]ÑÛË×6¹yåÊAí³dÒ4µJºçX›Îj“@â“ Àû}gáŽJð”‘ÜÅÂŒn–îÖzNsòî»Ð1¨3v½Ó–ºs[§Ö¤æfç€jðÕ>´ë²+x²¹Û,¹Vž3æ2迱m^xÙ‘Q<×Ëe½‚6–Sh.fñrÎãæ¤J¨æå_ߺE}k‹ûöŒÝ§KzYÇÛ«<^„5ŒæQ˜5è£nMù}DèþÙ?޲á>æáv‡±¶ó4æ NiM ÉÚŽwS»½ãµ ƒ±‰ßå6P±ÊK(6~èZ·ÿèôiÒù<_¿Ÿgðº&.såsÈ9}GÈü"}÷Ø=82z ,·c[A ^ Ã;ôlw‘as;fGXw%|¹€´@¦{ Ù¥Ôó®ÕhJpnKÈ#”Ëh±ªU}ݬÅiyXb ½?tRmMè3ÝCªöý¯Ê«³†Œß#ÃZ„6už~ÛFf‹Rˆ„ø/ñöŸ¾ÂÎVcÇm÷}C÷¾g}2jÏ^­hñ,äàL‡~ïeM@2¯z/ëÅ÷º£Z”§?Ð}/e˜KøÒ/ÍÖ>·/iát¡„M‘ÛóY+[±¬b¯Ù,d®BW'7Uwlt ¾û޾Wfoç*Ë -êmF–nÉêýR&ÃR°žËkl¹ÒçÒðÞ¶'ÝÞ³ñ·¹­vyþEØÛñ%e*ûÐó¹Ï1ÿoP¾ gÓ*˜ëԬ߫À‹ý^_)ƒ7¿n¢¥IÌ ^ŽàKd,¢zgCí“ßÑ9Ûã°”·°”eÅM/ ¸uôêž~áqÉ3¬Ý5y=5G³O¨ïòYÝßœ@CÅÄ4ƒ!Öã}òtö)Õ~kEc¥½KÞža=׿¢/ósׯP85¨öZ¶¶NY{ظmiN 1å Q`- ?ÿËâaMßõá å¢_”÷ð^„µÃVÆ;aÖ$(Šë<ê›oXLš¸iX}³SQ¨¸Q×ÿc ‰ž6·À© pë’®éÈÏ.»Ïñ—jÈ–u"àä$v‘W÷êÃaÙ}û‰á© Svîeûmj\Džê6‡Öíï²_kÀ/;Æ66Hmm1‚lÚA£ aGòv›Ö{ÏÙX—aêt×Âvo‡3¢ëùí¢ ?UïC½ õO²9~ÄÑy–>Öá|Ž èÞÏUˆàw;ŽÔÝŠ@ÓCȈ\@ž#'èA»¯i´“Gé²Mx.Ê4¾¤ÆîܺŸe¼ŽKÅó+xnÁ>*†Û… K¿{ ¢<£„¼LÎ#´‡ï”ñÆbҞlj¬t¾ÞT¾—BžšDJ )‘ߨ§S¯nQÌÂá]ƒ¶›ïR¨dsY¡…ìܾ®Å«R–÷¨Štb ¥ŒÞkÎöKûþŒÂRÏ}QeEÎJž âb¬ýÍkP¯‹Œßd¢|EíÞûíÙjÖvõ:,Ü…³Ïj!]™I}yY lqjý)ñžÎ<¥û›ßÔbâ²¥œüB•riïÒ"ŸKñøÝ·×`c]‹ê[Æuš˜¸èF€á•wÔ/9;'¨ŒJ¡¡ëÝU:}$ >¡¶Ž`€_Lu¨~ù˺Ÿ§ú}ŸYßG‹Ý›¯ˆl=2©{~øxìØ<4ÝjÇÑ´ÆÙ¶˜yÇ6–á;¯KÃ)ˆ„9Ÿ8¯ì¬–Vy¬NÂçÿSý¸ø”8n?ÈÀfFFtbˆ—µZò‰ ù¼þ†ÆÈ»ïhŒ§­]«ogá­yñÀrÄ4#–¸³¡÷Ó=¾ä‹»ë >{láŽÚÑ•x™ƒ‘^Ló ˜ £©y{Â(Nc-îÆB.Gynî€S3Щ1záx꩹¯Zÿ: ÑlmÔ…jשä=|ÒÅ&²Yw‘½,Û÷]©('MàdU0uúq=PjàÃ{GÇÏÖqäYú˜‡›n‡çøJN—'‚-«!þQï-èC{˜'Ф¼‹v†kHy{y“.¢]PÒþ÷ Õ±ÉIÞÈçIÝ¿Ïe´»šBª¸Ž “CÆgÅùãÈÍ"CäÒÙçðµå6íYNÚ5;ñ„Ö"žØÝ‰µµâÃ6®h« t èýHT e.£L›Ì¦8닞À1²vW¿éølè»+sZ¬R%mœ®¿ ƒÝ*üzù;Z´v2R‡ÎdÕ+˶«h¡*”!ÔééЩŽ>Å•¯|—ž©Ñ7¾JMÇž5eϽ–‡H^5Þ"Q8ý¨t‰ò@xSF9‰À`P¿ßúÜÌy2};*Y‘1Ÿþó/*ÔvyG›¸Žf‘\FÏ¿j `xÄ]­ªgÝËZÖæ¾E´n\öYT®xtnUÅkûSò4Ö0x²–u•gªÐà@q¿-íM°^ ìm¡©½“ÝÉXHø«ÿ„HZ„/Ù\u%:œ2yÙúÇ4vn®kÌ9É•÷`ò ,\5I‰Wáüãë RÃoÊÀ‰1 á6T¬¹ÙBíIÉN\½êyb ¼Ì‚ËMãCÍ dwâHÎÄñW=ÜCaÕ²E5ŒVlü:àÁg.žGÞ¦AûœËÆ:[ZÈ”J¼…·EÑÆp e ƒÊ<9nøÌeçÙwÚL!,Rƒ¥ÃzJ‡½E~JG½þ·U2ÿ½Î÷ žëgà8Kóp¡´2~b¹´ð.d6Qúaû®ã½‡ IŽ 2(Nßh''°ö¨}÷;o–ÿgv–§êu®#ÐõòVÄ×e«Øyq;cçï¶{xïÅrÙPËöÞ2hÎ}ï2àÖðñ~gÀêháÛÇ{ÝbȃŽÈC²2'.M2m™;Ó¹’•RÑ‚´±¨Ÿ¥ywbJßuYq…œxDçYø¶ÎjV ‘Î~…©ÜEÚK{s|hX Vÿ«ïAhþ_x¡F!§ÿ%RÐ_Õ½µ­g[Pá=¬ï_yF’ “ñ_E@)œ6áÈd6r¦û„æ\®é³ccŠǽg­¼¯Â½Å¼k—i˜H˜lÑ}¦z¬F>èŸ!³{í¶þ*×´ vôÉKÝ‚­š@V8 û›n@ ¯ó?Wù•¹›âG­Ì)ÄÓÐXqãz8Ý Û·—HÔ`ÿ^%‘€=6 S뻹ŒˆÆnsá„Û:`eŽ7í¨uy×îX6œ ï ÚÀ:÷˜ˆîSO*c²ç˜ÀÁÈiy!ß^Tߪ6Òš,+,³æ½¼.1cÃî… ìe4î¢À±¨¸_KL­IµÝøi¸~Sß_°6NXFÛø9IYƒðÁ%…ÆÑÀ‹>‚ÿWñ髇ÓÝŽÓ•,‰áEèÜy&ñÀæ*w§hMÔ»hGíâûÍмÔ×LJûû\\Yaé’¸Tï~dx¦ñAü8~Q³lÆ_:Ë#CVA†ã.ÞcÖ/ àúÚÀ+”»$Óh«¸>º@ÒØCð½NÆ6–Õ¢qûºeE•EVû†ývåJv·” ÖaD×z &ä}ÚÝòéúN–»ï%+Û‘ÒÎ{é§´¿ÁúbƒžaíäƒA‹Éóz½¹,páÂ1W߀é—È‘óëñ<§°Z!§ûÃ/¬N°² ìÍBÇ,l¯šŽP^ý0`„X4g´°œ—ÇíÊëM÷®il•ñ`ûCëËnë×ìGúæö:\ÈÃLÞÚÃúx¯¡Å©ßÆâĈ»‡ ï|ãŸ+TÓ?¨ðS6'¡É²mɯ®CËvŒû7ÕFƒã S‚6º}aýÏTûïv†ƒÐZS»m­@‹•¼ÙZÕ<Ù«xàÙ‹ÀàVEŠkó =ö’ƉÓàZ¸+ ²ùѶ¨sWk=ÃêÇX†«°\R»¸Œ®9¼€K9ß+JøÓqéF’ f¸YYËÛjë ämë߆µW¡-¢Ï ™  ʴyQcx{MÏ0qAaèÛ—ôÛÚê,Ý®òâÜ4’N4¢ïVËúìx6²êç;YïAÞ(êõÕy—(•P[%à(élf ¹¤ç;÷œÂÙ£½°¾ á¦&Ï+¯«o ñÇ ¥…7Ý&Òàuéø!ÀœWх圭r@éu´ñ«¢ñX@@g…ï:­ŸFw<ŽÀÓŠ/Œ2'ww)—J (.±æ¤}Öɳ8Oðuk§-»çKxNVϽtÔÇ«:\² ¼&ǃ^¦Ÿ(`rø“<ßÑqp¥q8I§Åá²¼Âø £¢ý¯ _!{Ù¾W<ôÐDw©Æwð¼¡çÑþKTPˆk鎸ZJg³4W*Ì #â2KÊxµéIä¡Z¶ïÞ°¿cöÙ´cÏuY'q°xSãx¥bç’v‹YžéH´¦»µ˜9rq{—ˆÙ©ýÝÑbV-B›)6÷äýH¤à¡'µÛmMJ. ³)ÒôÚ}-~ÁÚmü¸<1w/k—¼—U8d!ceEŒ šìRX¤TÐb69­é·_‡ñ‡Í{RÖP$&ïH I€¨³W<¢X›È×k÷}Ý7—F=Ñs Œk÷}ï:td¡·Sß™Œ{2{²C׸wM êLQm¹lÖŒg’1Eí€vúÕ²Òæ·×ä)rYmNðÏq)œ¼D—õýŽý¯e!6Ù˜j¶1Ø€ã!بÀ™ yjÚ»DæÝXˆkêYÿâã"5Gb°fYX+…÷30ºk1K;¿ú†¯±–HÁ@®Ô¼Êu¤#}j«-Ët¼«4sÃI‘–gVµÀwÀ›_Óùz†5¾Vç´§{àÒum:k¦ ^RûwšÇêªÍ‘ œêƒµEÇa#gñ©Û"’“¨V4v7—aÝÚ°' 3YÏA[°¶î(ÁdH vò¢¼Q÷o¿üïá©Ç ®V’†Nê§%-ÉÇFÛIì¯2s[ó`è„W¯”a«¤…¾ ŸJŸB`dÙÆÃ(²?Qd§ŽEa®;5˜ƒÈ¬î³b×f,AeK}¶º*eõ̺/Ðܨ«òYµ;À“/ÂûßQHyÇìC ¯c´×Nñ;ȃ!Ã!ëç" ?fß¿Š¼IŽõ>Àº°Ø2^¢eÀÞë³÷{ûûYY_§mÿèNZqÜÍ"ò(¹Ð¹“B›ñB½MÈÆõØukà…½Žñ ü'z¥ëq–>Æá<)‡E(Ý.ʈÞýêâÝ.„D`…¹>D›1|¨Ëé*m! S@eG¦íÚ¿€Œâ`&¦ y¡œÄ€+‚;Š&÷ð]ûû9<Лû¿ør­xÜ*2,/RöR¶D$*€ã¼!Ì¬Ì -õU¬¦Ü›Sû–шJy°gˆÉ+S*JÀÒ©5?c<,—¡”7ÏHf*ò TlŒ¬Y'Œ¨»° Î4Ôªò޹Éñæ:PÔÒ&LV›·wÁÖœ/UÅgê !q©¨{i©_KE—¦ÂfÁC}¼Š)tß´~½¯qÔ ì­®J+,¤6:¡ç\žµ¢»&ápcN×Kói•0Ô ß[õÉ!§Ù¬ŸcM ¨- ¼Vʚ˳íëÖµ2Ö.]aHV¬­,Ë2†¶eÈç!WƒÄ¾DK#y˜Ïk>8±Å¿ìžVX+Ý#oÚÞ¬¼Äm{:w7p6¡´|Þ™ÏC4'ïÑæ²@ÓÊ+ðýw”—Ï °og-» û™=:‹Ü¿©±U«Š\ÝÑ' K@¢$ãö¬Öð¢q¨­{Pà¸CI|!cW ¿£äH‡Úméy•âùt z‡uáˆR<©{)BˆD–Ça¨ nÝôVwnãèôŒßÑygœäÃ-dïrÖÇ'ñÉÍȳÞ@ýÚcóääÑK¡g{׿ΰ{÷.7«U…ñ­?œ ¾aß¹lŸwYp'PŸnâ &;!YgïëÈæmâ=f‡³ß\6ÜO (?öã(îcU4©œ[֩뺘xMô^4ÉÂW_ü²Ðd*Íq\WÞduNF¹gX!»¥ieèÜ».0U-+äË`ƒ5íñš0áÍ\_Õó8r©#òf·µ°®eaò¸vêßú¡ïá±—ä³Zt©ëîÀí9•GéG¼žÕy˜žÕ³§ãQq®¶‘÷ª%æ ¶.ÜÑxÙ´ûÝZ±ÅÉ´Šv·àýw<ß-‹²—Vt ¬!ÓöŒ +ƒj! ;y’ª¹˘l…'žR»ïæáòœú´„ÙÝ·ñ:uZ$èµ¼ÆXB!³­=çÝY-Nëx¯Õ8Ò1Êçä\kh¬…ÃÐ{ú4ǺOžØø• œ8ÇA5ûæ<ý¸Tº×ó¾Öð²gÃðX¿Åf,ZÂÐmÙo+6/v64†.Ý–àè ^”˵ª/C³‚ÆÑÚ¼ˆÞqç››mí/D8QŸ´ŒT<WoªOÛ;ý&c×äj6®ÇG|BE;zæëo ììàä°……už~àÝ×DrO¤ j'Ã)î~`:EÆsZ_Ð\ 4©}Ã- ·¡{ßX÷ܶ]ô X†Wî¡} ¸²­ûš¸ NRsX‡ÎNõue_}¼o«~¸î­jÞN^Ô˜\œá¿gXY§3çl„ÙzωœöàEn×l.¥ñŠç5jkà‹Øº1xÍÆL'²µ3öù3È6.±©)>ÓÝÍ/"[{Ÿ…7ŒWÏ¿ß@Þƒ}+'ûRÃ;VÂxVA¿tŸý©'Ú;ñ¿Oêç§þ@ÿ°Ž#ÏÒßãpcÇwg \XÎ…nà5”.Ùÿ_G“jÅÉKøR9D`| MÔ_B“6€/Ê; ü¼}6¾»ËkµŸBû®ý^À—b¨ÛßNMÛɤð˜nÑu„àžWÅ×ôrÆ¡_àÓyÛH/gú.œœÇ&»-pP-k7O( -—‘'fpD‹gÑ º}íåúß­‰PîÑ‚èBBKâTó"›®­«ÚѹîÍùûtdôuk«A¬Ú}M¿çfyöç!ºÍ¿ú£:ç²[Ú¹¿~I†{^ІýŠ< ޝ+Ký¸Xñ`c/ëÛÑb–N Ì,ÏêyrÇ-)×Ö½ÞQ;ò,CªÛõÔç¤Â¼er®x§Û½'£ò„ílX¨ÎÚ`(!ŽQ,¢¾8Ùçà{7=Èw5Àu¨XèjÝß1;OW·O ¸½©{CÞ±ý7Þ ;33ðúŒî¯ÿÏ.Q-+ìÚÞ¥lÄpD^ Y´Ø5G«Lý“ ™gÑÆ`S“—tè ÃtEsè?û¼¼•Ó¯Áh§Î3·n¯Í¯Þ†¶áNHÔÔ?÷—áìYyΖ¦õÌK9H4`b®,Bº]&u¬y)¹eyù ÀCcR.#¹ƒRQÀáQ{]2Sy_:a'Ï àô™¸é6paC—ÙDvÞU`¨ã7Žnóè*5€¿ÎtülGž¥q$ðU±]:u ŸBÜÀ¢¹‰“ Lâ'ÑÎp®è]dÌNßFưíž§íó5Th·›u ÝÛË é4³È0–ÑâÖjçwa„3È‹•²ûÁÇÛÔK÷ÁÇí]ê¯Ëöpnt·ã|x¦Œ¢;_ IDAT¼=r̓ÀQ( 'ÎkÝÖÏ|Vž˜ö” üÌm¥üç­`^Á¸:ÉEí€[â"'‡´³NõÈ0¥‘:t IõÆúñ<0‚;‰ÔÃca)"wGTx4•—a¥þ8½ÁàAQÞéàë_Õsö¡ÅîÛª(í}U iKT¡ìz®f]¥$R{R÷pbJçžùP÷>yQÞ†vDR?õY9¨l ñ¬Ú»¼šp¼ÝëÝÄK7„QxDÞ.æíÖ“0r\ÿ«7 „éŒOLH @V.IJ`µm/*¹ÒÕ¸k lì”8¨ùÇ ‘ö¾ðC—nw~ÏÎÙš0™ùþòíþSÀñ$|úqÓ‚!3Í> ›Þ—vR&/ ÚcÏ{ù5Ó:-ÐT)+Lz¯äux°¹Ó7¢óínA{Dc {t NôËsðä„úy'#ðÆ€ŽáSÄó;RDo HÈq'«,Îî!õõø9é{uô Ý¿%~ÏÛ¯ùú…&}Þ ±’â¡ü(Ù-xdL!®{×5?ûQHéì„˹ŒÉþ1ËñÔœ²{^)»ÃÆVxï êF]s6Õ©×-Q8Þ ·îÚÿŽ©M–gÕ/-QyÈŠ{j»æˆ\7–¥—5>¯†½]¥íu¯ðï¸v ¼I/²Ikö÷+öý.´iÌ£ñ׌^'QƒòýWçÏóloïA8-…@”³s—‘ÄŠ XÛ8þe¿ÁÜžÅÏA§ÑTÇϽÃ0ð¡Ç}Þ…ñ~"Ç'éUú¤ùO?ÇXúG?ÑÁ¼;x²&JÉ£‰ã Ôâ' à §öàË 8!É8ðsh•G Ê6ðÇÈPNâ+|G€µ{÷X\Y!€‹"cD†Õ‰eº]fÝÎ?ŒŸÀT¸×.ï¸(àSÞ]X+„È¡aˆGàô„íº‡´“.µóìÓî³VÓë¦&ñJÂaØ6oG-k·Ö¨¾ïB*÷o 0|ÿO”º|ûª‰ñÛÝÒÂÑÝ/PÔÛé=^;×ûK &Jio¨=®}々Ãxã·¹ìKƒ<ÙSq­îAñuzG´øÖmÁ^ÝÔ½à`¯HFã'Ô,€:qÁóãlÜîÙ½ôDä9÷¼ú¦sÀBĦ; ©"1¡J¦NÀ/ÊÔQödЮ¿…Ýì¶ÆP¶¡kí¡BÅ—¿#>ÞåïÀÔ§,‹nJmwñçà©5^·Ö¥5ó¡à{(uö!ûܳö™¿B†ãò õmãã Q@næ6D_Âg¯Íã빌™1d´úñFËybrx>F7žœîvŠŽè úxs‹'ï:.ÒÚ<<þ’Ò¹ »â^dÖ¼¡#ÑšFK4îcÁnq.Ôäinïþ™}7* DüŠt—%hï’öÎøY½N'”å•Hq°øtiAÍeT05Œ}æ3t·åÁ²{ÛÙðõ­rx]¦lÃ+Yg¬=]Úóh¯u#{_SÞ.'pX«ŠÔšÔ‚ÜÞå5§†½NÐð)œ„xüâ—¢Òsöh‘ †4+6.›‘ â^“ðØsê#GÆux{ =Céüì#ÀÑð„òZð‚AyƒªeWðøîe³)ÿèWµ˜œüÜç¨5àsê§“ÐÐóöŽˆ. Ptô¹óòzÕªJ£ÿÎ7Ôî½#0uFY{¥šŸ+aÍ­&|–ß·ÿB|Ÿ\vKâhíàùu9la ”œ8§ñ°pG^¨ì–®YÜàJ¦á‰/ª­w6FÆÏ Ô5™¾”Ë›R$€þ Ú4km«þèÿÐõî\>Dœ ŸyBà¹VƒåMX\‡éé®.^`æ*\½®ï>ú‚¯‹×Õ©v\WX:Úªþ 5«û;áܰÆãÖªyq;uÏ{fBÀHDmk“jz.£~ˆÆõù½œžåö%Èb^¡–VÙ¿§±‰i3P** h’×+x0Þ…ÇÝ?¼ Iâ³xpF€®Ù?w®uÍúÆ;â„CF¬. ðžö\‹`H$Û= # £·A,!/ÅíKÊ(k šÂ·-œ[Ey*÷ÿɰ‘6¿H./ªÀ±´¾?qA@oúÝ««76qAü«z] D ÚF`å}/¿«Å´TçÁØ­ìÃ¥ev)â!”úáeر¶«Uu®{×|Ø&ÜbõùLs ôþNÖÀž‹S¨@gZ`1Ô¬ò±„ÕG[ÕߛۈŨ íl* ›Ïê»3óZcÖ.®ÔÍÎd+–âQl¯ÂVN€È…_œ´†ÏNç&‚²# %õ§Û”¬ÚX}ÔÄ"#1õA²C í½W46ƒ!–]BBqÏ47Õž“'ZÍf5g':ªßŸ‡_ø”<„®ÆÚÂÆ#1ØÍx»à”Ö¿øšÖåÍëLI5»TC!¢QÚã¹¹…Ö¤®_Üó!ÊÉ‹> K(ì[Þ×ë̺æÊfRq%4!ðnÉÛŸðð˜2ÃÍò…w)Õ­b1¯ë7…4æÆÏÚf%$¡Ïf“ʈ¶jü÷h\ÝŸñ!|gošðàÞÙË:piÔw.1ÃÙ«"#ÚOàÃ[M‡þï¼f./J‘)©îïxÓ¾×¶Ëã+¸£y%ßG69‹÷¦;)Ç]«à½Pà³âšñÒú»»³“ÕÍM²Ù,mmNî“=Ü:•ý¯å ýÄÎ[‚äïñc½÷ÿ?Gž¥q¸‰î .µ¹b¿]x,‰§ß‘(|ÿÓ“µ1I¤,+ÏBÛ÷® $Mh…̦´X¿7£¾tY·!ÄÕŒáu¡†ðòÈ>tâõÛm ~è{ ùéøLmmŒE" Ûÿm}ïTþ$ŽÂ|ÛùÞ·ÏYœÃëÕ‘<™raÆ*,¹÷ëxà~ÉúÙ9ŽÀÒÇ8œV xI''0d¯»Ð"æ²×hÂ\C®Þ:ð62L¯Ù¹Ž#"÷’ý^E“{xø<2¶/Úy3 ­ÎÌP[\äXU$æÖfßwü¦ñ±}ðuãœ7É킜ÌËqY!,û- ‚í¾ñ‰¢Q¿Ðl­j1zôEíHß{EF´oÄ—(Y™Sˆ¨5n^ à¡~Ÿ ¶´êSrgçaËj{åŠâÍÝ6žÐ:g0¨…áøÃ? wt/ÏžQaÖžn¿£ÍgµHn¯y½šsÏi¡ Ì]&¿]c/«ÌŸN“'èéõ¡Åž”pÌà³Ch±Ku( Ê•HªÎ<*×ΆyÅ,ÝÝqœ·`wKহEÞ–JY×Nvس†”o[!’HP‹Ã ~Aq"z331&#m×|ùjY¯ƒ!õíjF}óþ xâó"¢¯âkm¥zLs*-€“ˆjM¤à½ÝÛ`Zÿ_ŸžæÂ ª×5èk½ 0uîuõG0¨PåRÞ»­çسçX¶qw{]ÞºT·Be×&‹½há°ï.ã³P{GT7°aóä.p%kÙrYyR2ëê·–(¼ý†Àh¨ÞxCÀp¬_Ï¿ŽRóK˼L Àô 맆¸?å}©„‡‚ºçqµñz^jè½)ÍËö lÄ>ôèÇ Û®•Ëä7²læ}vb0$Ïj[<3%"żŽûõE÷ Àø^Ví¾µb•âÒ³ê k.ez@5êæoiLv¦}Fl‰RFãòváú;:w4¢MÆ÷¿*PT«j׫õõºÆKK+<ü($ÃÚ4¸¬¸fë œôJ†+#€Ô†/‹â<ï)›{݇lÔ#h#DR×jd ¦1 «xjA ÞC_°~µ{¸ŒlêUdG‡ìÞ]öi¶1±Ï;0ç{žÕf~‚GãÇðstG`éc{ø]E·A/ƒçV,#ãçªVƒ&óm|Ê~;ImhBºs9÷ô"ÎÛÿ[W‘ÁŠ}.34Äpo/§ñÙnR»¬·ÚA5Ûýd‘aØÇ§¨Çð%KÊø 9ì·#š 9¨Æýn ¶ZVbu^Æ7Ô,ÏÐé‹4·ès‰”¼IöÑ´¼5Ned„røY2©ÿWQŠü^VÛ‹N |œyZ¿ÇÏêžJE¯µUÔ"Y­ÀÃÏ*láÒÑ[ÇFyî—ƒD¢òöDã2øŽÓRÈ TT¬Ý‚Hk¨9“Ëÿ‰âDJá™8úþ§~YíKx=©Te=¡ó:.Qÿ˜¾Û¨ɸ$ÀjÖâh‚NãÅ´§õ¬EÌݸqJ΂!÷äyc»¡E½RV±Ú"ÊìN>~ ÔÜŠMMÆ:Ç- 5Æ“>|5q¶ã TÚÜ"OaK«¤Eà ¾½JX8…j6аÞP;÷¼x=GW·æA£Ö¤ž«{P!¸æõçΆæyS“Æl·I ŸèM<¯(O¹á Ñ.ƒÏq‘œÔÀªéûȾ¹pÞ‚™.z^°ñßP,ÒZ­òÿ±÷æ1r§ç}ç§î»ª«ª»ºúnöÉ›Ãá É¡ŽK£‘dv¤µâh¡ÙÈ‹6œÄð?AýaHv‘Xï‘͉e;ðÚk;v"ÍH‘ek475‡M²§ÙÝ컺ºººîkÿø¾o¿{“Õ £YDà(4YÇïx¯çû>Ï÷ù>·qe£&§©iÒ½jú 6©g8¶ÞÃŽ¹‡Q\b8Θ,Ts yŽŽßje,=ã9¼¬‡ÿÿý+â²îà«8ÐÝB®Ûk¸:8¥îûh˜G`´D *…UMâA4IƒÈœÅ•&©¡E­Z(ét%lH-ˆÅ šø È Ôpnq»XøëÅ'ëe· Ã&[¬î²^Òƒ®øl³nÊ%„EäÍ Ã+Ïš,ª¸>/´ô@–°\Ü4¼*Œ+בE¡¢ê¾[laíôóã°}L8+“‡õEýûµo›ÐEYç)£Å>•‘‘óz´ˆÍÁÀÜ.ûÛ]6—§\Ôý”ahZ÷–K!ÜiC­§%¶¶C“z•‹j³zÅ…;šuÈýÍÁ‹ß= SÐ*;Oèw%-ÊEÁ`Xï5"åwÍXÍ ª/JŸëÐðé|½žú<7&ÀY.êÚó«ðŸA6«KÁÅŽÆcÈÌ‘FUà²?,ðŽé¾î\‘B¶MÕ>bþþÌ/¨Ï×—ô¬÷n©üÍÞ¶j ^˜—žw›™RA€ú—MͱŒ ͘ç^º?õi”ƒ’ÆD4) •ÍCtDã¾Õ”×§VQ{͉óæõª¯+%¥Ô/R|ÍŒM¹[ÿçwÁ¾ ×#‚ì9蛄 É¤*ÝÓ÷ûD ÷u©á÷’të¦ïÀi`ÅS2Ô¹Q8ÿs2¤ùqÝ_4¡ú`ÇÎ*+ksÙH/bóèŒ)ÛWz½¨Ý®Ûm`:£ °pL€,–ok×hW½+ÏÍÖŠ+ĺ³ßýCÝC½ ùay¬§µ˜=¦qÒiÃ%Ь×^›Ÿ6šC1×3¯,è|í¦~;:-¯c2+ºÍL›ñdAÌž‘«xkW¼©w¯ 5j§o¿ôu{ŸOϾ_ ¸sE%Zlhu|^!èDN\T»x½T¶$ÈùOÀܰB„w[š“\¶jèÔë”·¶¨“)…õv:0ÐX5ÄéNGã{tZÏܨÁ–z“£*V NÛ­؉»zÖV_Dcª Ü\†ý²«çÖíÉS ¬ínj¾gM1é ꫊$o7Rúœ®Ñ6 µWÃÑRºèYjf¼Ú„‰¤y¿%Åt̸. Pª­'7i¾7dÞ»ÖÇÌz5ôß»Gyo„é÷¼™'ÇÌ=¼‹Öæ3¸º›{ÈKuy¡8Qà>Ó.–[7„# [ÁJ›Ul7› ù~ ÇCÏÒõx–~ˆ£†&•=¬ŽR¥úûÑD±ªÆà ¢8âb¹ƒŸ6Oš÷{ˆÇ4…€ÎE4Ù&Ð"ñ’¹þŠ9×^¯G²×;,ŠkIçÖ}lA]мlH0†«{d³º¬ê¯Ý)YeÈÜ[(äH²±>ŠŒáôl.kq,¬+ãf|† gewS‹²U¬†e4w;7¬Ð^WÖê ø<"–¶rç'Ò2¾§? ç¾(PXpóúà`ÝÕ kTµàûƒÎ½¿‡ W*+^Uµ,/C­›$™ñ‰¯“b>S·Ì¨aà¤.Œ:æõ>’IñzźGÙB7.Âm\FÅvw× {•u¨l«³vß„{¯ë³­ Ý0€éÖëŒÑ¤Ñ$ò¸]úƒkY í„ÖäÎ< dSLQ×ëÕ=ÄS›Õ²c(*ØÈŒ^‘¸ž-3(O9£œIè7Ç/¨oâ)ñgv“¼úœî£Q3 ì;§¥‚ÆK~\Þ©Ì À̹³0ž—öô°Ú:–Òõ‡3òð”k7et/~Tà#šâí7ÕŸÑ„ÆàÞŽ¾»pU„ÿDÎ_”W) Üéèãý®ÌÏ2ê{Û.<‹™#ÿîàÕoÉ«d ¿•S¨”´Yh5`ù–U¹?xM¼¢}CÔîvõ¼V¤òD.ö …ó]¯—Hà›ž–(cI¼¦qΊ%Ú¬÷msYsi}ÉÌ¥”ž«×@ð£5ª×Uû{L¸,ŠÎkÃf³Ø–ßðá¶V5W¼F`p\Þ³™3ºzM|Áƒ’ž{ò¸Àáñ ¤³˜:i²=Îcm=‰6ÔfÃp6㬉•hÉ¡ÐpÕ¬o–?4¿¿Bi³@Í=ʇð o~ø"ò.åQF1¸äš{æ”{ÚͦsRxî´e„Û-À”¶8(ɵ[OKž ’Ie éü¢ÓBjTáÆ“J‘W"—YføH—ô Ó ÚïˆD½ÛSv^Ó´e VVµ`žpLfµƒ¾{UÆÚ4…„û¢jÔt¯{Ûj§XÊd ÅedÛM¸ò‚J™ŒÍêž+%Ýë~AÿާL`Nç±ã1‰ãEØ4æò`¬T`ý&°X"3h2éŒgdßp±"1¹#'ä Y[Ôù½~Ç99rœ‹êK[Ÿ¯o@mݨÁ•ç¡ðÚ›4úþÀ¨ÎUX0¾{U}Ùíê¼±”ÆRÄý}> î šLŠ•Û&äYÑo­ÎÓî¦^Ý®¼GéA÷V ^*I£)àqà´™×8Èß{IÚFV£gõ£•(O["¥šͺƋÁLÂJÑíÝ2žVÓ~›ËÒêuµ¸vE%§d?wVÞ™´ñ"ŽÍÁì,TŠE¸råP7…ú¾ÝHöùj—8FX3ù Ý_“óâ\Õ«N/+?©¶í¢bÒ5)àãêóí^UíÞ¸"¯bÜ$,à uæXtÕõÕÕW¹«äŽ…ï ¸”×+ðÀ:ÓÀeêZñ\«ÈÝÄ‘§m¶gy¢üfmœGël©¡uvøÞ[oqm}"k?öÀ5÷‡ÉR3ïšçO™ÿÉ ´‘*†6"£¸ðš=¬:¹Õ`jãxJ¾þý=K?Öã!gé‡8,g©ŽŒ{ M+ëÕ£šBȺ`{È•\Bûr+O"Ps h*($BõU Xø[æœ ŸÉhµ8888ÌÆ‹åb[µÑZj#Ÿ"=ÃqŸ¼ÁÔ±Ÿ‘hÕÕ>ö^º=—ªß3‹ŒÏoD7ƒ5äî„Ož¥Ú86}ý]=õEXú“õ]õãü¼@ÌÊ–ÆÆð($ªðÚ®—V=j¯ÍçuNü°vCü¡eÝÓƒ†ï—W©R2œ«¨y´áÕ¾Gv¿Ç)nï¬ (ŒÎ$t'?B~ïY¾ýº©q¸¾!Crú1C¦O HöºÉi¼¬mhü­gÊF`ˈ‹óVI†êyLvDYusc0ý¹×~¿ÂØœ4€ñè¹lÈf?n­B.!Võç IDAT÷¶4G¬S8“q¢‘É¬ÆøfQÙsä…ªWúƒ!õùÉiØí^@±õàZ-}§¯_c$—’— ®9®S«®¶óùôþÅcêñi*¯½Æ`Lý4: K74vÇ5®CQ£î]Ö¸š>¥sn­À[ðè%]/?©ï´›šoÛ÷Mè¼ëÀbÝ0æm!ÛASfx úÊê+×Èc4uO=Ãc‹¥äAíț¨îB¯øŠå¢ÚåÑÁ‹ßPm¯¦1ÛÄɘعï1÷²ûÀšBÞ?+7p׬oÄ=²ò#eó½ <ÂÂæ&¾õu3kIyé÷¿@`ëesŽó(yæ´Á]ǰ5³vÚÄ+CPF s­/à@‘Õó™6µkír¼ßç!XzÏñ¾x–¾öµ¯áñxÞóÊçó‡Ÿ÷z=¾öµ¯1<}žx FFáØ¸ø)ÖóO ÝÿnE\ª¦B@GW¿ì†ï\™;7ªûˆ8`8‘Ø§ÌøÚ6a&3G²¥›Ëzw˨€ßu%a®.é}ëiñ›LÑcklFÆ-C²·â•ãyÌOB¸SÀ·ô'Œ†Q$&7qT’ ŽÞÛ.êü%ש¬á‹¡¾›ÓÆa`Äx׆Õþ#3ÅsÓ09 ±ˆ<`vÇܨ „Oiþe‡t­½mã-®éY|~§Åó:§Œ©,W¯T€MfÆO_2Ü7Ÿ“Vi °²Wë°öÀÖEí<€ÆS’Ë›q_@ž±$Út6¯^e`cƒªùÿQ›8é PE„“æ³Àÿ…m²¸p¡¥H€b8cf=¹‹Öê®ÒÁ8ŽÎ`³Sfßÿäï[îĉ¬¯¯¾®^½zøÙ?ý§ÿ”öÏþ¿ù›¿ÉåË—Éçó|⟠\.~çË_þ2o½õÏ=÷Ï=÷o½õ_ùÊWþ³×ü•_ùþäOþ„ßÿýßç…^ààà€Ï~ö³t:ÿìïþ¿-4Il¦[M‚ šŒu´PùÌgQ4Ù‡‘·é4NØÒj2Çq‹úÍo­ØòŸvÌowÑ$¼kÏ95Eht”q\(¦‰ƒZ„,èÈ›ófp¡<둰˺¿-3nÂ-ñ”Áõ7“‘š<&£Z/kÑŸ×wscpî³2º­¦ŒÖÖ* qÚp\ )åPìÍãu‹dŸù›Éi¡Ned0.G\ž‘y®¬Øc«¥ÿ9!½¢½mC¦^•ñ˜g.˜¡VØ€ÿø{ðâ· ˜ú)6îx建·‘¼ÎeCþ€ŒädF¾°¡s ŽË@MÕ³ çVñ  ’(9(©Š[zPßùs‡’墀TqK )5 ïînêœÉ¬¾ª…Öéè9Vk®¯-ÀÞÖùiÝÿÞ¶@K­¢sV÷ÍŽ¾ç2½öv ×x(’YÕQK¤Õ‡•¢î¡^Uÿ'³jƒÝMgÌ£ H=ùiFgTd׌ÛP(9õö›¯»t÷þ©¤— 01'Oˆ§Ò‡¼ 7–uÿÖ;0îs•NG}{ï† 6ëz¿o@ã±°.Ï¥»µ÷õL\ÁÙÚ~ßikLŸù¨îq6¯ùa§f5–ƒ!ß¹3&4¿ /[=ÓÔI4'žr^Õ?p¥oö¶–»øÓðÔϸ߹p–Á'ϳrÛ(g{]í·dÖð–ügÅM ¯®­ X– šãcò~ïTlxkEí‘ÌÂÔ(ëêÐÖ•‹œpi$®¾Œ™0`ÝpøŠ›jcPg0¬öèuÕ¯;k§¶,O³®Ði½jJü‰… Ïñ%K=­u˜XÂ4f*š1^Æñ1‡Í÷ÌèCÞãÀwìýƒƒô#€t…ÝRfm›CV b8-¦m\òË-œ.ÝÇÌ9»ˆËdÉÜ6ÛØV}ºÖ± \ß…é”j ¯1ܨ—¾Ã]Õ‘ ÍØœ)ÿaÔ™Ã1vÐsÚ²#‰´vÞVGªYp‹=¢HÜè/Åä±P tïа„"2žá˜!Ÿgäu³Ò ;kj»Ý h®¨äFWÐØòÙ,¯£…v²WïÊÓ?¬,¯þŽýxJjÃѵa³.CK 8YœN[`*–”W 3¨¶ÜY°ÛZSßìnɰ7ÿô;¼xÓì¦úåÚ¹¯0Òݺ¿ùyÍzMž—rÑÔ/KÁñºú4•…KŸ)}¿ ±·}_™aVšc¹d2¶ÕÏ[«N¦Àë@ì´a|JºD˜öjÔ´yh£ÝGaGϱµê@jzPÏ’HËë30*bÀî¶¼2ãG5VÚ ŸÉ¬æLßl¼ªghÑýE â»? ëù;{ ×ÖX¶¼Àl^ÞÒÃqfÊ›ØÐä·à#?+pX*ÌL¸·ºW–àO‰çe3ÚA£Ée$Zu?¯ÏüAµI,¡k[±ÔhÂy¸o$²y…À“FcsYÙ„Vã)7êÊÙp]0 >C˜´œ%›Üa×¾*®SÍ_ÂiÛµÌïqò-C¸úœŸŒã}¾·oßfxx˜#GŽðó?ÿó,..ðî»ï²±±Á3ÏÉK/)!þå—_&•J%€‹/’J¥¿óW×_V«õžósòäÉÿäo~ÔÃ’„7qºDýhÒ–Ð$j¡]LMÀ3æ3#cr8é_4ßi¡Ï“æÓæ¥ï‡cÊò+¬ËëÓjè÷ÙS·§6›>eÈï&ÛéîÛ2LùIy‚ŸùÉöpã{jÏ5=WqÓwëdÅΚªÏïmëùîÜÕ"Ý’ ú‘¡)âBÀ¡ˆžtN¡ªGžT»öºz?‘–Á8ª~šÔù·–äØX6^†£2¾}ê·;W\ʼÏ/CNC½s•¹¨ ñ‰§4ðÚKúM2 ¡€óð”ÆR,åë}éõü… õs8" tâ¢9Â?‡Ôô‰¬o&O¥aðX†n+Eæb’«oçÅüDFF©W :6Êõ×¼cÔê!&>1‹o*DàØ,… ΛŽ2ùľd†Ü± ðé±(Ì,°‡¡ s’ŒHÍÑ „ʤiúˆŒãOÆ!7Í^Áǵó„ÑLÍ34d¯6Ei)ÅoäY+ä©´RäŸbüx¡'޲pücG©øÈ=6ËòZ‚j`”é\ŽL&ƒgr’WW#äΧـÈÜq†ŽxHN+£{ô(¡¨‡ô#'º>A±f¹1E>“¡œÏ35:J+™¤5?OÛï'wþó§ qòéá ñ9îÜëãÍ…QÞ¾6Âúv†µî,wn†¸ºtŠZ&?uŠc|dχp‚Ýæ\žF`€nfšâ^Ïøij°R9MßÏ|ŒÌ§¨wbô²SÄÇr<ò…<¾¡#$‡ œ?Åî¶ßäB1­ÑǦ"„æéïï'2>ÊùOL0|ª“ÿÕqíÞɳ$Ò0ý™³ô  L'6”¦œ€Ì©‰~îtŽrw7Lgè¬¼ŠŸ”ҮʑÓøST#Óx³#LÏòîþþDœã?÷¨CrjŠèÄá\ŽÜ‰„"FÏŸ'Ìž?OØçã̹sŒõõ17?Oÿè(™áaüÇÓI$8rþ<àC.yä&b1.œ8ÁÔÐ'ÇÇ™™Ÿ'šNóÈcqÜïç3O<À‰'žàÑH„Ì™3Œår|hjŠüÌ G8{–ÍPˆK—.± réÀÅK—hû|œâ âÉ$ŸŒãÇ"‹Å8uê·oßægögy‚†††¿³µµuèmÊçólnnþµólooÿ5”=òù<Íf“b±øïÒÖÖ—.]ú‘îûüƒÀ¿ü—ÿò¯½?ÏÓX[#wäïîì0vä…F''YXXàÑ|žÍý}ª^/}Ñ(¥­- ããŒííñÈÄÛÛÛ$&&Ø:8`fhˆøö6‰H„c>û¥§‡‡ù~¹Ìù±1Š[[£¹·‡'Ÿçöú:’Iª‘ZÌÀ…R™ `bx˜µ†òyöëuB™ ÞZT§C'•¢ÛhÌçacƒøÐÍ bù<žr™h:MgŸÏGb8Œ¯ÙÆŸî§´»MÿTŽNqÈPŽÑd‘û»iºÞ.ÑL˜LÜÇæí}:Á4Ç/¡žeoç>d–#G¶XÞè#‘«³±#•éPþAorã^^?½tº>AH úèî{ð†Ñ¡=ñT›¡ 4»:í.GNtY[jóÆwº oQY…F¨Å³ds- k]º¥&+W:[mÖ*îtèÖB]<:ÙÔêuŠ›="wëŒMtˆç×Ût;zõ:•N‡Ý• 6lV¨.õ(Q¥ØìÐÙ¬Ñj69ZN‡¾ƒÖ· ÷z™Ñ ø;e¡.#±*«[M|Ý.÷}>­¥r™v¯ÇkW÷é­ÀéÈ>~_‡¥}6šMŽV«ìu»”÷Z„âû$’:E–oBß\‘•k]O)ï´è= VjwX¹•Ý6ÝfLºåÏþâÛóÃl®´ˆ%J\x²~‰`“J½ÉÁ»Û„<=ªk[ì¬xiGŠt-2ñCG«\}»IÆK4R'íÝ&ïPo­Ó ÀÖ™îKmsëµ{¥.žz—Á‘6çÇ{ÜÚnÓÚZãÏ_ƒ¾™ûÄS] ëëj5š…[ëmâÉ.³'š4J –VIfagqO’wVˆúê„ú6ٻפ×ð¨08VÃWZ!3Ø¥¼rõ%è¼xn½I·±F¶Nk·Æè9?lÖ˜?µBéF›Hý]:~èl,·é+-³[­àõ7é–»ÐéÐh4ˆ6›´ïÜ!ìݹCªÓ¡¶¸H§R¡³¶F¸Ýf§×#Z.Ó«Õhݾ-:à ²¹I¹ÛåÖò2™f“º×KÑëe°Ñ`éömÏÞ¸Á0pûÆ R•ÅEŠ+å²6!í67ëujÍ&ƒï¼Ãpýw¶Zܼu‹R­ÆXµÊ^·Ëý}jµ»×®á^¹z•N§Ã[×®F$[ô£Ý®^ïçùîðôlœê}<ÓÓÓ|õ«_åÿãÌðð0ÿïÿ}~í×~ €f³I.—ãŸü“rHð>~ü8¯¾ú*çÏŸàÕW_åâŋܼyó?Iðàw÷wùÒ—¾Àúú:£££|ó›ßü‘Þï‘+(—Ë?~œcˆ(h³#6q"–,E.Ýëæ7îÙzF“(,PC±ô-”}ñIb±•ÈmÉ‘òˆ–Í¿Ó##4ÛmÊ››‡¥J|È܇«sd3ð|(TÁÉôÛT}ry˜ì3P¡—‰£°øŽ¸5µ¹Ùã)¹ñF~h6`êcÐZ•br~&?{We°iq'l ý½›F º*wüð”2Ü®º´ð q >þ Œ<ù¿èÚçŸÑyê5OªA:RºnÔ`ê”ë«isÿ¼|Enû2pÊÔÏj¢÷>üÉy¶ß¸ÃètPቕq“FgħÚ\Vh­×Sxæ/þPDn¯Gâ‚}ýFIÜ‹ÛM}ÞªÃÒšéïŒÏ“?ìÝR¨ ÔÞKê‡äëÌ+â´$Ò ݽªŒ¿ý‚ÂXóçîYª¨Ï#¦ÖW6¦çØ­IïèìS†P›†•×MˆÉný=ßÌñòÃÞ–øõЏ2à8&Á®iÕš·ï‹vâ³S䣋xÓpûyýæ/)CôѶà3¿/þvµCkã“N1{sâ ½G ™A‘Éã ÝÛ'~þýÿk¦dHÂŒç( É ÆR™Q{Ý_Ô\õ›þÞEÄ[«ÊîÉSZÙ ›ŸkSÔcP¨èû}X¡ÆPDÏm ù­\_„lµ ëQ{Úú‰} ³†ã’´ð„ñ'áê°qY×»w7H gûæ.£â›]{Yým¹G»»ª©Š˜ ÀŽËf}ì1¥zNýw4ß¼ÇëßUXñÞuý×µêÍÅÌ BŒ ù20*Î_aCí2ýôÑÇ—nê$øN>bå¶ÂÑ Æ)¨Oi3¦žþÍgÿ˜`Ha¹pL×÷%-P«ˆÃÒ}²¡rÛ¶öZã¿]´Næp 1¦Oë±}­ËÍ&¤¯t`ÆÀM´.WÍïqeWê8~èâ3}øfœÍ?À‰ÆŠ­€yo …çZ@?;;;”J%’?&/Óþþ>©TŠâ ÉàûxÞ&¤ÿ5?Ö{ÿ/éx_÷9ÆÇÇÙÚÚâ×ý×Ùßßçoÿí¿ÇãáW~åWøßø fgg™å7~ã7ˆF£|ùË_àØ±c|êSŸâïþÝ¿{èÙùêW¿Êg?ûÙC tÿþ}>þñóõ¯óçÏ“J¥ø;çïðÿá?$›Í’ÉdøÕ_ýÕÃPàrÄãqâñøáÿ÷÷5Ìÿ;h9‹D"‡Íûh‚Xå¨óHôìChò]Gj +iIº¤à½&÷]\*m ]žA‹ƒ5›T:Âhòß6ŸùѤ· Œ%Öp†!Œ‹£[©€ O‹–¯!ïDvH‹i·-=¢DZ`ç ¤Õë5@é)üîÛ‰4,|Ó”èhq8!.ÌÝ·]QÝs pU‹~ènG B#PxS|–ý¾³gdØ+w´XÛ%á®êoÂ-Cøõ;PØê€Y𘺞ç? Õ’ S«!ž]¼ÃQ. Agæ¿VÓ ÿ N(«ªÛ¿ÃêDUÊâ3…cPßÐ{ï^xêv¡S2ÜŸ¨¹Ño5ùþ IDAT}z0´ÚG?-Ã;2cˆæ¼®U 1> žºIOo˜¤ƒ¦4°2ƒ02 cçáö_ ßû›ƒpÕyk!pòšÀˆ(¸…ˆ}aDÀ¾ŠÒMO …ú‚ùÎ5àqóû£P3籋÷.š¨7‘Ç †ä¬Lèt:Œw:ÜA)¬6[Ö5±z%vC ‰ßüßL=d$ÛM¥`Ø Ëm,i!¬”d@œ4âŽ÷²óMö`X)õ7. (l.ÉXŒÍÁý‘¸JZ“YS©~@†¸b”’½†=×E`ëÊkú]£#ÑJp<ƒay€ÆæžÂQ„B½zUö,î]—*q*+¢ôÀ(\¿¡6ØZ;[”èRÝ×½%ÒJó›Ó3~ïOŒ!2d÷éSú^&§ûÞÝÔ¹Óƒ»ë2ï¾#ݤ@¼úþÆ’HfT™C ÛÞ¶Ú W8¬×t®N[™Zc.k§¾±äJ¡ì–Õ÷YCHÎÁê’“È ª½b)²xÐdZ5tVɼn8™ó,ázÞÆ·8²y%ë| Wže·gkbÖ2?)Ç% ÷“rX÷fó(½\uìûÜØÔÑ0Ú™ØJÖ^Þ ¦²h—1¯;(³#Œ ëMájÆ ¡l©Î¾'Ôn³·¶v89í¤´%V4£¸]ëQ xäU†µ Gb®U߀ raÝíGft‚û 0rê%-Àí¦Š‰^ü´v“7.˨&ÒN¤®b|Öùq²hRÞ¦FMâzCð±‘+-q¿á2Yâ& »Q“Øá>®Zý©™â5Úú’îëÁð˜-Ôzù5={ xò>ŒoõU|´Ø/JS¦Rvé×µŠÒä!í€ÃQ¸ôE5^³ ]þ;¯¸B¿»»JEŸ:%õätNYE/ý‰þ½zžú¢€ÕÆ’.-…sÎ}^m»qM¡ZÅ©#7;:o·«ð×åçÕ.v«16 ï.ÁÌ´ÍNIã)Ñ÷­7ÐãÕµã)é^• 2ˆ6Å»ÝtuÐFÔ÷7. /-Ãñ+·Mm¹cºþÀ3Ÿ¦öÚ³l܃¥Ûò˜æÌü8÷a}§TpzO±>ÒÛË®(ð¶™KV`°gÆèx¿žiß̱> €»-Í)/ÊdE†uj\÷Ø?"zçŠÆÕ-3Çpl¿6 ¹Qxõ¿i>Oâ¤7L±ØNÛˆ–œ„ÃN²Á†·KÀ¾(À~PR({kE}L Ì—‹Rø¶aÈJ;CúÔ +ßzõ%…ó“pó²@P£* S)™óÖÔ&5àTN‹×ôyµl<’ (–4-N=¦ë¬/©?ýA§›ôî5ý¦Þ‚pà½%K¬©D Í5žÒ½OŸ_¨Ãû6ÔžQ'ÖŒˆ)Oþ4¼þM wÒ"1Él.k.u:òP×jNÜÑJ®TL»Z1K“xG—)ç²§OÓÜÙáÞÚÚ¡°«?YBs£‰ó¸ï™þ®"i—ã„m ÏT' |«:òX­âʯØÚp¶ä (hã Ãíü7ï®ÿëÃpöøÿÃ[ø_Ü1v£6ÌfKƒ,「AK"ïÐ Z˜ó]¾ ü, ëÝ3¿»€ú".%ÜNh«b Ê] 'ik‹V¯G ­2yp w'”iwÞÆù¢TW¯Î^WtlNîú^WFµÕp„¡I¸vK†„»Z4W´p¾ý‚+¿`§N)}ý#?o=¯ðÏò-Ý‹M‡ÕùWÖT€· ô5 ïS¸!›xÙÚ€¾4$B #Ô‘á˜<™§Ö_‡Þ&CsNØïö›z†™3Ú•{p) }ÕËdg[TÊZ¼­D-ü›ÊhÔ+w½.–ºAyX ë°¾¬ö­£ƒ¦Zû1ÿHŒ22s—…7¢ Dä-è´e$üAk+§¾½ê”ÓïmiÑ5@Éç—°çø¤ g0dø˜5¥9|>ˆùdxa}V-«ß~Až0œ‚ãçÕ®%nPÏí1Þö×^׳Öõý€ñdííH‹§öÚ³B*æÚjÀÉœŒ`£êDÛMy Ÿq^³0òÂ1}rÄŒÕ*¶ÎŸ… ›±¾×Òý”L³ÙêñsÀËÚ`ìlÈë22#Pt¡#ã¿» ýfÕ‹˜ˆûÒuy`<5ÍçI#Xiçp³ WT ¶Qu†7мxí4Nê%øã?’øÆ†¼hå"Ì>*%ó`HgM÷ÓëB~r—æ×h6xî^•'jã]W²Äç7eMjâEaÔ¯kFa»o@ro=¯sV·UGoî¬BÁ^ãŽÍ¹_4 ¥]mT"1y(ýõaµ,^“ÕKK¤5^ÊEyÉ:m#09™"Ò*QÜÒ<›~Ú,:-ˆÌˆÇØWßÓ £ëÚR0ÁÆœ Ûs6zŽc@MËYÊ™>·¥F¬¨m÷í·¹b¾¿iÆè²EÓoy´éì3i(qÄMøSD}8‰ÖàFìí:Ÿ1÷W6÷•2ãÒ{ÔÑëº5ìý:ßÃÃï‹tÀOúqMÆ$’¹÷ IcU¶‡ÑÎgš4™-q;€vÍq\ÇYà§Ìù«À´ #°°&Ÿ‘"9ôRíé‰ úFF‘®Å?HZ…÷Vîþ«¨ØƒŒº×/ω?èv¹– Ki‘N¤¥½ãjAÎI¬ýmSû̯ïÔ*"†¯,h,J™¯Ã>ŸBQ‰´>‹&d² L›úwÈàÏšº]eyWö‹ºOKñz˜nüߤöæ&´åâ·b‘óçDr¶b{ûd…Ò‡¹}-ÈΚŒza];o«!“T˜¡Y—×ÉãÕ¿ÛMó“ @_ˆ~6Å]¢âakE÷ú¡Ï©£ÊæþZM§G¾ BB}Q«è™?þ 85©ß¦²°SQ[¯/ÉðŒŒ®ÜÖûõšB[M ¼=K£*ºQÓ¸=®–DÊ¿qEíÕçäé³`¹^Q›y=ðÑOÃéYõýÝT¶Î»Kðýÿk‘Oó½oÀKßѳ-ßÒX)ôäM;(™q9Sd¹ [[ßSfŒy÷ /L£¦gù”8‘W«¨l=ý8þJˆÆÔ_û(uòÁqBŸ_ üÆ,/‰GU¯A*"R,¥1>„æò=s½ë·àjKí·‹Œ'ÈPF“–ËÆ«×–6ŒØbØ)š§2Nñ}xÊ©†/¯f(D.†u÷JpoQåiú‡ì¾ñ¼æA• á<Êi&;(É+Ž9ïîú’ãÝY¦­Uy7«û¦`v@s©´«ïw{šÃ)S'ÓýúƒòÎÐXwôáâñÀa ‘¹Û}~þ¹Û=^ÇYJfÅy©”´øµ¦ÛZ¢!’§}l,é;ÃS2ü#3Ú™Úb±éœ­kÕµëŒ&õš;«Å|m6ïÉ€T÷!ꃙ”ι³&~Íä´ñ®xDø¶¢›þ J>·”½÷Æ7áÊ º¶½w›åæñj±´‹ëÒ·þœ€¯y(޹¹¬û(õÛ~ÃæE!>çÀU¯+ãZ;w¢\”iáMh¾S`åëϳ¶(îÇKßÒ1òãLvL˜mØØ¤tG¨¯_†wtFÜ‘ú|Zàï#?£ûé›ÔïgÎè>¼õoÈ éyw7”²C¦Dˆ›)ô›`½ Û[ò”J‰ÞZ­¢gi5ÔOcí¬#qÿx^zŽ~ãQ-Ã~YÏ7?jÆW}g3 ÇxOóýÊä›JÃ#ÇÌf¡(OcvH÷YÁe5VÍ3Å=SW­~تl7jâßl.»"³'Ÿ€KŸ†3óš?]´™±›þ}÷Ȭ3Ô·Ìõ§)÷ЂÚa{E} ?,o æÜ¶€±UønTõ^0%‰¿U¤ðÚ[Ü}[À¦mž©/¥¹â(Æ#.Œo‰é¶Î[¯Ê›»»©g „ÝFfuIíØ?¢¾™Ñ&¢o@÷åjL'Òš³‘˜¾;4©¾ÞX2›”¬6;¶@¯Up\5œ´¾ W¶JPxèÔ ©' '§ñÆ!6dÊì$´î3¢©¯îц…-´T[¥ŠË@³–˜ÏêwîPÝÙ!ŠÖÚpÙüµÞSך§PÿÇp¥K@\¦šñT.šs…ÐZì1c¡`ÎéÅ…ó¸±]áƒÕu´Òïçëáᎇ`é‡8†Ñ¤ÜG™:&1‡yJ›@;—š/š¿Ëhâ-!Wo?òReÐd›D4Œê­ …ðÛ8µZ»I ¢ ]Bss MM±‹¼QV©Û.že\Yã­?TŸõšsv»N*ÀVo7åÙ2 Ù{> ôþS¢#Ÿ‚{ 6^ìàõ;õãÇŸqž˜hÂÇÍe…Ã<^]§º/Ÿ;¡sOUX+™u®ä¦)ué3na®6`«§¶¨¡E»v ]ðê2¼ñ:ܺ‹‹®Píî–vÊ>¿¼ IÓgA ÷ñãévÅ÷8()¿ú``L`ãÂ,,˜ðX«ñKŸ”’3nG>8®±rá“ ½ÖW¬Ûu5Ç,¯£°sÓzÏë…ÌŠÔïÞZ†»=ÙäNZÃz’òæog´LR$€®,¸yëàštüµ¡IõãGþ¦ Ù%4¼&‘¢[‡Å7Å+5«eŒCö,T®w ‚ò*l@ºû:w­"0Û=0Þ¤€Æ“åú|NÅÿÀßìk™8q3‡†ð&“‡eKÖ‘§ÈV9àø£Vb¥‰8JëhL–p•î¢Ý®èù4ZÓk8°6nÇ2ÎûùðøÉ:‚¥âØÁ¹Sí¤ÛD g*N`G¤®#ÏÓ0šdf-”. I[æ÷4qEÀÌÊî§Ì5ÖÌo{ l-.ÖR²™óð^Næ|v‘± Žueû|ZXÃÆ#â7+Ïý›Ѥ¼©AÖÚÛA±†Óóäù—X]Ðâ˜HCØmš=+ƒkµU&ƒÍf%Ò0päèãºæOýœv­ý#®ˆneO%Rj5-æ§ÏÃpH!¯L¶;PèÈ+°ÿàs¡Åìö,/ÂíÛ2úõ*är0íQ¥qù%¶ÞÄ|äI©ZE@ ´h—‹ZØGf\)—jYÏU«˜Ôg¿vóÛ+Jƒ¯o߈ZX˜ 䪯é\^¯$,©×°I¤®éõ`å*ÜU†–&ÄÒ@Yäò^n¿,Ò¹­ÃU¯ÊN+\Y?a‹õ™0]*5-òÝž ¹Õ‡Y¾©>Zºîôo¦p«-«Ñׯ¶ Ga~R»í©-¼¦ÚeÈ GÍd‰›,< ”ƒaSÞÆd¹ÍŒ*„ jçõeK+i`=£–#ØÃÕÂÛ3/›ÞÅíâCˆ«Žk̶$+Ð2µÖ‚!Éüù³¦"2š±!¿§t?%7‡¬Gv§Íc¹3“8ŸI üß¿ã´ËŠ[NΡ°®ó{½ Þ»©~_½^cñû+t;/ãyöù5~-P™êWhÒ¦Ùç¶Ñô)ðpÔh’ÅàÖmç1Ê ̧²ÚØ 1Rmë‹¥ OpEÀªt_÷µ·­sûi=×Öª>qÖlö% ;Mìo|‰í—žh?bx³_¶ß×uÎvË”¶ºNvͲë©õŽ?‚ ˜W(ïïSª×¸Í\¬áê¾µLߕ̺ñKéò«ŒN»Zb‘˜ ¼®Õ´ ˆ¥Ô¶¶ž˜?ç?ü?›þëÁ©‹"67ëº_ktfŒÛÄѲYž]3wìg>3^¦O NÈïuP¬PäÄ0¬¯A°#i…þÚ‹.4u¢Ë†Ì^þ4ìÎOŸG@f·¬¶›ï‡å¸S„â —K.td%= k[ßp`D÷Óìè?ÚGa­ÀìY‘ñÛMWLú ¤¿}<å"Œ5áæ ‘ÙçΪÝJ®p_¿Ær_Hÿo75‡ï\ȸn죰ýºÆw(ª¹ ®`vaCó¸Ý„ÿ½ú±Û…bß/hþÇSî^³Ç µvæ7þ€³@j–¿§Áë5DZrQc"m¸í–¾æóC +UúÎý\Ã.Ÿ™kLù}>Ò^/7¹{‚Cù2î"Â6f¬l °“B€Êޱãf­=|ø˜o oâ-\b]W­'jW+tE>¨ã¡‚÷÷x–~ˆ#Š@Fí@fÍ{{hâ£Éuǧ¸…K)­â¤‚$=ƒSî ‰•ÄÅÀÃæ»}æóAs/»@gu•šäA\1^ë’Žàv`v‘¶‡»hB –-jÙlh¡­–]‘PâJeÏÏh‘ÜÛ6»Îܾ ïÞ¥Ó‘­ìÉ+Ÿ„ð”ÎÑíB<ë²mÂQùs¦1  Ñë6ˆõAÔ¥ÓÖ},ßtá¤zM˜KŸÕs,]à‹›Ôæ’I˶?gÏÂs¿-Eð;o‰°ŠB}&>&Cz—ÿéÕ÷¿2Ü‘ +Zê…ú¢®÷Æ_Ê`¼[qž*±»…2ØÔ‰)•a4lRÆ7!vî'ÿÆ·é­ªý‚Ú´ÓVŒÍÂÐQ8]’Q-™Uúê‹NºV‘qòù&­”áÿwÝC­·–dÌ› —84i wap"%q•ªFÑ|Ø®Ay FFÕ†Ûkj“PÞ½-þL(|T†¬ÕÔs5<;¤?—eÿrÑÓ°ôº w¥Íø[[”‡*?ýñ$ Ï|¾ÿ§â³î[6/ƒmÃê®Úq—éÙB‘®ðªMÙ!ËpLÆ~ú4ØR‘Ñÿ›½w ’ó:ïü~}¿OwOÏLÏ}3ƒA"HQ´DI–-{#k×.¯½Iå‹«²©Ú$Ÿ¶ü!e'_ìÔÖVW²[eg+ɦ¢ÝµåÝÕÚ+É4-Ñ ‚!Äu0ƒÁÜï==}¿wçÃÿœ9À‡U+ÉYoÕ=Ýý¾ïyÏyžÿyžÿóú5³Ñ»ìœ>¯ˆ_pî¿­ñÛ^ÖX¤|P]¼¥y•ÌÀHC`jß<¿PD÷ÚéÀI—à°IO_WU‡æî-ÐŒLÃôýÔ[=ª]úM ¹ètÍÆÇ’z–Û+pîuhškm5uݵŠÖá™W´&2#äÉŒˆúîdÖ?Ðz(åuÁ°ã>åwb¬UŽ÷xMº ðùÂò…œÓë˨u`x¸!AÊ¿ó-øî߇é/ÀƒoC£pxKó§n¢~™}·mZlÁõ“ »h3ieV:2S»×³Ól2ù„--âxI[H;éU”ZG›×kfN5Íû-8ûEDþ®ãxdhózEûm”ÊnPmô4ÏzÑþ4ÏÒpŸâð#" ­ÌXÃE}¶qé²o!³†Œ{9ÍA´¸üæs¯ã¹U¡0}‚ðçmáHÛƒÀD&C"•b§7ò$áüIr·ç‰k`|~9ÞPDF ?ÀBÃQ9›n†¿þÍ’ çþ&ôOê" ù³Zt•mÁ mùœtnn¼%¢rÜ “ ’„DLlú ”òŠvõºrû›&"𜮩/#­šWQÆüÖ{?÷ôÚñ‹ðÆaâ’®s}QN$5¨j¢R>|K‘“f(ɱ„úù[¯xio߆Û×à“âM,| ÞR iá¦ÚkGÎ÷‹”A¿&"ôH$2ŽŒe•‹/Hæ~öÀk€ãÃ[†ô[“~Ͻ [Õ½WKr¡ˆžW~GäY¯Ö >›K‚¯|Î^Ò³œè×sìuA»Z’ÃÆôZ(¢Tæ~¶1ÄYŸR+ºçÃ=9Är^í¦QfNÈ¿ÿØ]÷B»Nߥ$ïü_ŠÍßÐøƒvå«=W)(Ø]ƒCCº>qQó­ZRÄÅ4ܶ’¢=äÜ,8òc!½6ÞïÒt} WÁ™Ì8Z-in% /.Õ|\_”³_ùÐq³bI89£÷~ô¶S3ß\2úAýŠZy¼âÞ4‘Ë7Uï ù`bT‘·S—™ì>qmàÞmíÚ¼ô‰|Þ‚a­­¾ŒQh7à¸×Óõ\ýSU?Þ~WçO¤uÝŸüÀDãöõ½ýÓCãZ£ú®ù‹> nÿ•žw§íx‚“§t®“—t ÛJ&3:Ÿ?(pûð¦žcV‘ÁJ úGÁ›…Ö²1p‰1¸õÏ`ï.äæ ;=I}U‘¨Ü¶¸‘͆æ…ߤàlÛç—m²Ñú£è8®P£…‹Ês9|• Qsú&Úp6-N ‘áGæyLšy?jžK]¢%Ñ/á¢J5$nºbÎ{ßüm§N¢Åü$«áz½qî™ãSdzÈÒ§8qbvedÀï¡zå«'×hí>î£4‚v)ØÊ£…7c¾ßŠ¤Ù —OkËtÍ÷N›ó{ªUjÝ.Q´Ð(,lç¶-Ÿ~’§ä3×ÈpúƒrzÙIS}Ó2=Õª¦dÞ8:V?$hBó‰4®CêœS¯ž:%'ê*¶¾(pdw­^¸4¡ˆÎáñÛ&?„ÊŸ~›­e·Ɇ IDAT£Œ=ìÄGŽé3}Æhûb0x¾¡{ˆ%˜"¹í§õaæ ÉÙ„hHi²@ǵò°©/:N¼…]x° Ãçn.AjIÏ(nƵ†Ó² ¡jƒÁ‹'å7eøý-=—„þüø]íÄûÞú¯øÞ¿0i’AxþŠvÖ^?„7”R)ååôü–7~AÎlꔈè¯ÒûÀD V®Á/|E‚Ÿ©éZ5j¶J13ì8i¹mE-!EHZM¡vGsÇòaÚM•©Çѳ´€z{YÄ÷v|‰$õû „Oø¤r}ÛŽ·ÕƦ×ИVŒhæ†æÒÞ†€A·+T7 ®Øô>k¹¨@˜0iâѪʌ@{E×sî¤@ÏøœãÜØ=VÑû`GQ‹{I" téMp•“^¯€"­Ü–¾gdZc¸»î"{å‚IÕ!˜/ýCõ‡ïX¾Ç_×Ï_ü>´TIØ6ëü×`4¦Hª§¢ÏâÛÞeý‘R‡;NIsŽÍjnr)“'õ|A=ôö·ÁïS Ï>Ó±çe@Z·ñhÔàú[¦Ö«542­gèÊŒÍq$y±»¦qµÂ¢~µIõšÆc|¸øÜýP|—p÷CUÂíV(Üx¤ÍÒx Ÿ¿~—öëËhœƒa àL½^ÝK³æì›­ëÛèÅmû&&¨çónmµ}ªà¢ï–¨ÝæVó(âô†yϺùþào£AD£°•™ óýM´AžFžäÎý5"ŸÃÇ3°ô)Žªl³•e64„Ö$ZtË(GCjß”ö²ó¨ê¢‰^μ7ŠˆÞŸEé¶8R%žÆéx `ú¸5‡¨×K 1n¶DHp»¯'”Ï§Š¦xÒé±XáÉ¡q'4—´7xnÞ‚¯þ‰åßçcCs©A²Áq¹vS`éôe–GdôlúΦ :míF‡.©—X2#œÌÈ™¶›j,ëõjǰeu9¥ái9YLZ ÐgWͦu]£uQ}”Ç ÚMÏœ5F¹]‚çÏq:w“p>¾¥ç±† ¨maaÇt)z·êrZ‡{’5„uïù]¾—¾¤ëøð-}./ù'n¼#°Ó¨)òæó»èG ¨k}ù‹zSçaé\¼¢gÕ¨º ?¯&¼ûÁÈmà@^þYE JyÝgá@ß1û¼^K¤u~»s¯–ðb È•Ü|±2#I9³bNïÝÛPjê°"rñò{+,ä€ïvØØvŠÇi`­¡q«ç.êœ/¾)îS1§ë>ØÒ¼“bµÇ«1[1ëkÔ¬Ÿýmm2MÍåv:=ÍŰ)è´2Á®lì»ÏvμäZð Ž;^–uÖÕ’«âœ>íÆ¬\P 2ùŸÿtÿí?åÑm]ÿਢ1¹Eȼ–bs)w”býãß0ë´]clÌÜÊ£Þs½ Óç*à[dõÓåºÖª%:ƒ"sÕ’î³\€{jÝNœ0ѧ.”K)êcç—-Lm®é3¦þ«_b¯Í:G½¦qðúµ~Aó*3âtجNT~ÇðŠÂ®‡`òÒ]˜;Ipg^Èðç~nü>LŽ/mp¸©n›Àñõû"¦z¶^1zKA÷à˜¾¯˜3"•8pÀ)|{Íï~cóJóó»]¼hÓi#z~3Ǫ"ͻϣMê'æ»ÖO髿}Ï![œF:]cKlD¿Šk8|wxÍûŠüäŽgœ¥ïñ, ÷)kä"8Òà8r¤Adøn¡\õ"Z$-\D© |åÆ7ÌgŸ¬Ðh¯!Õ@¢Çq²ŠÁLJ-& ‘ÁI زXkDlZÎ’½ÈàY˜4õ·¶˜Õ ñÙ’“ñ+°}Kµó±tO"pükI¶¾ÐÊ}}oj¦ÏË9lëÿÃÓ¶â(š*°×kv”%9†tVù`G`dü„#{L ñî²>›4 ÙÓPy 'Ö¨Áƒ[FcfÛ4d5ÆwpÜô“JK«)–³|êþq¨ç‰­ÇìÓ/N„`:¡a°@ÉãU¤(7º=Ÿ1|¯¢œWæo]!òæë|îW”®tZF×ëUeV§£f°Ý®Ñ®ñk¬Æç4ž‡ë†¯RÓ}¥³FæÁˆ&ZJóngÒ†xÞçóÉe'õ½#ÓŠºÕÊú®…%˜_wÍNCCH-Áè~¬¬õ`« ý©‰ãr¢Ûˆ  ÜØ†Æè…£fösÏÏê;“HÝúذÆèø¯N)íÓQdÊΣxÖVU7pó¾¸J#¸ QË i¢f˽®æØ™—Ç.Óø÷etÿv¼BÈ™w»š“‘¸6é!ñÆ¢+±·Õ𫬗ïëÿ žMr øÁ?ÅûŸý¤•’kŸ…ú휢"yEW6Q®–À‘ôZìE"¢µvõôù#|§­1· ¶…ÈòµŠ"VCºþÙWõýCã"›—ÑOg ç® TpØi\…pR)lJ½öº00l8jQEÿ¬îT§#àyâ wlN}f“Óm;³þvò‹2V~ °¬p×Þ¾€61ëºÑÂMäþ ¾£VqmXÇ †ž.b±‡å Y‰Ì™3 ŒŽâ}ÂnÚ1ïâó&/›÷ô™×fЦø²Áן°©yà/ýö ŽêÚ[{oj+ŽžkˆŸl4âY5Ü÷xYú‡ÝÑø`Š¢hN§¹B©º´xö²%¦6Ì;‡a§ÑÂÌš¿Í{Sæœeälh1×p†¡–Ïãëõhá@Q„§n탵:"}>Ç+Šö™´XÓ”iŸQ„©ÝTƒ[õx¡”*pÿÃ#ž…åC˜øù,¹ww„d˜û‡€°ë|ž”a †\¬bNQ Ûù¼QØèË@ìb†àNN‘S™ž†Î¦Ús2гÏ@— qx¯Áö²áPk4Ç hËN*:ð¹7EŠÍïê½½®áv||‡ás5Vný(¤Jm*ôi¢ê¶NÛíλ]èµî,¯bägÇ™ÛÐĈÁ8 ž¡’{÷¨"Íã…Ë&Ú5a@Ûú¢œuÚì®ûNƒSt?X¡^5ƒ²Hò ÅôÃ==«(’O8;ê"hšéÈ´´™¬ºzÚ´‹Ùßts"ŠQ)7˦]›ë¬vסØØ<}Ùé#í® Ð G$Epÿûß'ÆÔöâúä<7)2ýœæA£kßZ9’Hèšr÷Eµ3ÿ³!=ÿÙsºß»÷µË·|ŒGs¸VVDªÕ¸›ÓsO¤0êŠÎyå‹âùXÍ¢¡qÓ"æ<G!tÕßã; ´5^¯¢ ›Kæä (Þƒ¾äƒsŠø=¾+'?2mRSaE›¶–6‘¦Òð8'"°[Sà%…áê<ékG›J ööÕ1çÑy .ÿ2¼ó‡Ð…Øå1*ooн³‚7e ]¸C­l">¨Öe—|~“žÛj4ž®öõó´V’8øä“£ bÕÌs ˜Jvþ ÐÓ¶¦N•6â3Ù¹ö&²í ìg,÷´…‹0ùQdÉ‹@½õ&Èùìø)8|¿ýÛ¿ýÛÓñÿÕ£Ñhð»¿û»G>°…Ç2DÏ#pt í2lÕÎ}\¿6Zˆ}(½Då«vw”F‹ËF’*8ò¢­Ž‹â¤ÀÀä$‘XŒÚáá‘(š•°[ gAS£<ä4[ð8>@,¡¤ð´P’“ÐÈC’ÞAƒÔI(.ê;‚ç.±ôÝ•§š´ú³à ÀÂ*•Äu£©èëpñù9Ò’ñùáä ICîvzE¼¢H\Ϊ¯Æ„X” ú\pŠw:üð{ª:ª¶\tm|RïÉŒ¨ŠoÈpUN^‚DJ€§Õ4åü¿öYÈmòtXºmZ¢ô”Æhv伇xç?+MÜœ{Ò_z‰Xeƒ¥wJdþÞß…ö®B¥eعE°§šçd6ÃÈ”ÒpÇÎ蚺&:2ô¼HÁKûDýµ:m…!þ|Â0êÌŸ\U)õجÒ4 Œ3ê禷Öú‚Ô¤û‡u͉~Ý·Õ²9vü~õ-ó¢g³¶ÕC§™cŸk&éÜ» {Eõ=k‡%‘©ÛuÈ~ùË ”9~AÏÚß_ ¦Nkxÿ YúJâdBú2:_À!O‹µ{_OY©ŸrUãÕÌÃäñœŒ„é8[{Ü ?©Y×uõõ `žzQàÕ‚ÅrA µV 1Dõum¬ü~'W04a*3‹°3‰i„DVïBOàØS+KÀÂ!ÓLd ]#høbþdÆEz¯•õüUSˆbv­Vd×öçkãÀÉÀ¹s„ƒAªÅ"-co-©>nþµ6vG_ȘK]G©:" V@ÛÛÆ'ÍpÚÊeËó‹™÷gí5E£”«U~ó7“PÈne´‡õSÿõ)ýsEüOø±^ûLdzÈÒ§8Jh÷7†ÈÜEúñ•î#¾Ñ!Š(}-ªãh縀RwqŒpZ¨–W4Ž}Ú¼v€ã@YK/2¬^ ¸¤m®­y2Ôl‰Ü= 󣪰vS)VC×½u9–ºÙ‚uJàM˜/ðú`ï‘|*°¿iªk.!‹óÁ»ÄM)sµáS!(7XûH@¤gˆ¹U…Þã)wwMäâf]`¡˜×{m”ãp_[{(ã›t"– üàÛ6»%¥Î:='ÃðÂçáæ;r&É DFaæçBÐn02.þµ¬HÉá[ß#5®ˆBÿˆÒ'`á–˜V ˜3Štg?csxã¿cïÿƒspâïÍRøßIý4t€ý¸{ 6 páŒÎ9<-@gÅ {Z/Eä€z¸¦©†;—ÎB_æïêœ'œPj»éÒr¯À&j±»Ñ ôϘê±[º‡Umšuͳ̰¢W÷o@ÿ=Í“ZÙ"¼ ëzf/4 ŒiÌ3“JuæB?npý-1¯WÕr…¬6àaö‰/]§ØÊ¼®ó¸¹–Íu‰ß./ éZj§VØÐk ªÑ»7ô{Í<£æ:.ì-êZ3«Š(÷Iê¡Õt"œàøI™a]ÃÀ(´J˜›¥³ú¯WŸ‰&à…Ÿ_?Í’êîHýÛÊgŸš¢~c…zE„ñ9Ó1K06]‡ñ—‡îÒZ¨¨•Š™?KwesúLdÕrr<·9l˜9Bà°ðð!ÕN?.Zdma×§ƒZLm :EÙç â,>D›à†ùŽ1à{¸ŠÌª¨‰XZ½»"NÃimx·yvü4Ï8KŸâ°i™’ù½…´’Î £=…€’ªü6Š­£…xÛÁ•šZ"wÅüßVlDpUS8'»çæŸ=ú¿M-[’#8²·ýi#Ã5i”õ*Ùí´ijäÌrëjñA®#/79 ý1F¦MZHĨ•d¬C¼£³Ôàþw•îš8ñIÝD)¯`ËÖcñDBQ¥V<^×–¨î¬èßxRú>65µ¿)GMÀK_T$eþ|¼nƲ§±â¸%é!íb÷7aû6Ê%U¡¶¤]óôiÓ[íÕÏs°¢YÇö‹%d Ìó¶À?0×~¾ý[ žÃXèe<^öµkºÖ©3r¨¼úy¥A¼|ãu½þÜËŠÞDÌv7y9I_FNrò”ÕÝ÷Û-wo~`vVcX«ÀKoñÉQóŸ5<­¶¢X•‚áŒEåä‡&ô}]³CHkœ|>C6‘°nW@is Ž_ˆ †ÌNÜ£ñ>¬hœ.üí¯ÆiãLÖ5…¢D^¯îc鎚éŽL›~qÓ‡Ì ïÆ¢øs>ŸÀF¸ZÒ'€c3)пøy#]QRä/‘†áaÍÍ%GNµóho]¤ô…[@:„o&D<ý—|PÖF!ÒX$Ò.bb+â‚!Õƒš€ûʼ¢e}"Ûh‚i¥Kke=×ëok ú¦´YHfqŠ%•29ØýdÏÅ‹­ÏC¦ ­âO]rsö¤¾7ììÂ; ÃîCÉ`ßµyظc´Ñ¢ÚD<úÄU¨LÊzxZëµQ…Ãw±¿)õ°Ñ˜òxPžßë'lÖøÎ Ü~x°¢Š¶îýÑ'z k-Þ¬ÀàY¨U„$©Ñjj¾ ësÁ+FˆÄê-'ÈÚKŒ­˜œ$ÞßÔ4^âfYRÙðcSˆÿ7ˆìð$â0y€ºf>ãGQ¦³ô“hÓ\4>qÎ3ïg½á~<dz4Ü_sØðf-²qÄ3W)ZLhN`H·˜>næ½>aJà´“¬“6¯7pª‡ÛÙ”œU›-Ð988Š"5q–Tø¤I&g_TµXjPA££ ,ŸZ­¬z«iŒñ8€Ê6Ôk4srnÁ ß"p,„ïùÏA8‡[ä—”‚ µÈ:XøPQ«¾~EFš5SI7`BãMîQnÔÄ+sªjYé‘Ù'¸Ý6´r2XIœÊy§åRM‡ÆaL«è­°ëT¦ÝnJþ ¹¸í¾€®ÏV›…£0÷¼ŒõéK2Ô½.ôMÕÌ~¦/Cî&LŸ‚vÂbƒÑ¥ñ{ ðÅ_dï½yÚóøû9†Nž6”Hf`ò,øOdðkÊÁ%'ñ¿ð¶¿—Ù ºî/˜ö%ŸƒÅô|²ð™Ÿ—£:ñóЀ‘WÕ,6l¢%š«(ê´£o¨mMÁ,Žïñ(´º¢G9>gˆõ—Fë‡õyE[]ñu›¦ë}9‰À}}Í£>r3WvסQWt¨R„xZ)àq|Á°ïËrÄcsš;¥S pà"§£>C¬„fQ¼t œß¸HhÃ.eZ6b7Õ’~ïÏÅ­ÝÝ.ìÜí±¾h¤†”Þ™–nPr@©¦vS`kdbA6;ºV_¥G~úŸƒXT ð`Eë 6{Å#KD5žû›j RÌÁƦu8ÙéÐß+“[­ ‹Ÿ—¸)˜ö݆ÖÒýU¥:ýAý߃K5n-éù÷Z²#}!Ñ{-­í€‘ŠX_ IÉ‚Zc+ÔúÇ6¿N ¡ÈAÓg/,^­¨{‰Äõ]™žƒØsIîk\Jz¯§ó¥”ÚMsîµ›øêZ³‘!üá!(ïiv»ï^O?þî×t è·•Ê- Y«Qoµ¨é-\ «e7jìvÞÚVcÃmñÍó»Å –ÜÝgÞoE)ýÀóÛÐùpRýI¥áŽCÐËÓyÊÿ€Ÿfþç‡ÏÒpöx–†ûG-.ËñìGÀi•*J¹m¢Å5¼ƒÓðEàªùž-Dî¶šÓˆè9ˆ£Äp­›È)YQµjwB¯Gnqñ©JëX<æ5ûo¹&ƒsò’S¸Ž%å°ò;rª…œ _ùÐì,½HP®¶OñŒäÊ<#Ý¥µx>€¾q(ÈÛŠ¢RÞõª²Up«!•ѯ݄vPÀ¦ÙPi5]s^K°=0¤`ŸOFÕ’}‘Á-î éy10úDË„ I7Vt¿­¦„gæ3ø¯C­¡Æ£1÷pTÎ=‘†pF;åE¨mÊ„¿õ; 9ù¡òƒ»Äæ`è·þWšÿ俤\P*+úÿG•tÖ<Ìú!ÓÏig„X.G§ ^o‡­åy²“óøüPÎé ºþoýŽÔ¦w ŠxÔJ&íVïLŒõ·+ŒÎÀõ·á“%xnÜ5o&ÄmÉ?4¡1¬×”rÊmÁê¼úÄõeäû_ËJnüåÿ†î7ÿGÖᕯÁúx÷Ï¡ÒqÍ\›=莜'S~OúK«zþc3r²VabÈ´‹ )bw¬Íº®íÅ7ºÛ‘´Ãî„ö“H¨Ûø¶~=^þßú7®ï`»©sMœPtbdZ^¯‘`¨)rg¥l¤sá¦>“š†Š‘ÂÈï:åêr ¢M=‡FUs«r¡“Õ«z½\0|»–æ“M·¦&™Y¯?bá–Ú¦X ’ñÔ¼!’SYû‡îK«*3¢†¾µ2\ý3ñé6—d´Z0cÀL¹  Åì¤T³nÖrIãÒëÂò*D×ô¼Ò¦ÐãôeùÅ“°4e­Ï×~ü%œzY†há]­©»ªwÜ©ËÀt’êÕ}­Ÿ6L…^  ŒÏéùï®Cà=˜x3Däqoºe·¦mïÅpT`Üÿqƒ¾ÏÎRøËG„ŒäB§ã¸†½®3†½®øjHÖJšKá0Þn÷ˆ¢°Œ6£–§d£J–㸇6ªVP²…"E)cïO!í¤8Ú[AËmó·+¨j.fþõ›÷ÜF©¼ ®Ö³ã?îãYdé¯9,bï!P³‹vE´K¨ºm‘#EÆÐ¢CÀ%ƒ¢Q œ¦pmS’8õdÌ{lÅhÇi‰‚v‡*• Þbo§sTmaÁRW…a£LA0úÌÎÒ„µ½>mmÆç—‘E àR)ØÚ¢¸­4Z4.ÃÜ—4F2Ö2š ]B­ŽÈkÐnty}Š ¥¿z…Ñ5 [ÚYúý"9÷õ»{ÝßR´¤Û5Õ< Ó¾Á±XŸ |n[×Z/ÊžÀˆB ÞÏ(;S/ÁP‚}ð𺪜z]£+T–aî5«xVôˆ§tÎfßsp>äHmï¬Ôi k7açŽÞê@àá·¡+¿^O;ô`XB‘±>_< ·ØY6)9âÅOäŒ7µ1¯t®®Áî¬ìA«Ëyôéûî_—3ݹû-Þ¿yCdÞ”Ç)tW Ðnkçßl(ãñ@büP5ZC[Uö~æe澉6 ]€ùgrŠ;ÿ®@¿áýÔÁSƒÑi(BĤÀ:å¡°ÀáÀˆ$vV!7}F«É€»@Õ€ŠÃ=»dbÆ»]Øx™ÛJ³ùýzþS§ôº9ûb’IͫžæïK¿$!̾~žXR×óÆ× £×«1Éïh\Â1ÈÔˆÄ%«{:G"­§+kçH½"à5CÏ;Òû¼>·ièK+Ò5qŒA8ÅãïçhÔ ÒpÑŽD2YÕZo£@ϤȊNϨÓT!ÃvO¿„ªº¯™YÜ\2ãQ~÷ê¾â)ó!E&FMÄ]˜>“ƒ_øÇ,}ã-Uè‹ÁÀeT²ÙÍ“‰ë¶–5N«aögRx+ì­›Èàª!›iŒx!Rk›ÃmEåý ÃÈ ø“PÚ¡)X¾«1Ïmk=Fâ0ð•3P\'L‹`¼ ){BMÚn¢:m¹§ç¢ðÁd’n»MµV#RémœÂ·åw®š×ìßvͳ(;Þ@`héé­#qJ›Ø1Ÿŵ½ê{½€8­q þ$xÿƒ9E–lî?ô§Ñß[xY²Ç³ÈÒ§8Ú(´ ZD]´[ãÄ Ã8À”G¢dØÞEýË$í H9úqó6wntò‰kèšïŽ¡l_¯GmmíH©ÛæçýOü?è1‚{A³˜‰2X}0ú%~9«R^©Ž-«ë¶éê=V är[02Œ„w<~é† fÀ Ø5ërìÝîU†OÀ™×aÅè!M7]Ñ£r°³ÏÇ•w]Ù;KÁ­wµs^š‡X‚n)RVZF†!.'Ýj8%è­e]w¥dÒŒaÓÄ3=B¬Uàìk]šœN[ãÑjÈ™~ûF»]#%¥×*Êqå«’8 ‘¡y+Çå¯ÂûÿÆ4Ç=T„âü¯{󶜳Mö»`®+jPÌIרk·`+!K¸ñÈW4ÃGòϘ9ÒìÉYín LF&B™×µ OkR6s. 2<-`Õ¬›È\µAå†\»Â‰‹z_­¢4]5«1%õ`*ÎP¿k¥±³ ÷¶µcO™èÊúHÞÑì­ ÃF5Þ–zMÊ«˜Stí¡û€ÑÁ²œœþEq¶–€Çj÷É9-¾xÊ;nnîWàÑ EšlQÂí»z®é¤¢PÅœáPÅÕ:§ò}Í›H – ¨Ÿ3ÑJH2#w;«º@ÑžcgAœ=…H~ùïÃÕÄ+_¿øWâŠmçev*(÷ Þ9*Àhö`aÎ)PÏÛŠ…ö€‡8ƒû{š‡FŸl}Ñ ½Úf¼µ²ÖQ²_ãiUünAä¿gæÆÉ‡dq\Ó ®ìf¹ÁQ‘!ÇPò ÕDYˆgÇOÇñ,²ô×±‘ÃŒ¡Z œpärNir,˜J EûJÍuÑNŃH„uóÿÅáG ©‚”¸ï!°³$óÍk³ÈxepJ³‡¸$³hfÌë[h‘%Àz§Zè-d½ælk“ Ïw$@i«åæw®:Æ›ÛM=ØYÕßFgd,ÛME+|“º n§c"§$bxÛ|¦œº”×Î2h`˜Ì@Mް`R;›ë04äútÎ8~ŠmCRÝqáø^WN¨^‘#«”äô­nÉdV §.0”ívåÌ÷\SËrøá¨Do~ßT¸Å]%P§­HÙÚÖáü6¥ýΧ†¼ö|ð\~]ÑŠ#f$Þ”³[y 22^¨Ý.Û’ñ·ÊÏç?¯‡ï› AîÁȺpV×PßqBg.ê¹4 ßöËžÕò=ؽ(ztЃ¡ÆýÔ%7W—響{tÆõÙK¡{óæLеçZft»&5¶¡Ï7;Rƒãz&ù]Ó®% …{pæ×³\ÎìðÁwEèÎ\8ÉÃë[$3NuÜçw´‰¦%άÎQ|îKk¾üà[ÛÃ=—êÉŒÀôohÂgºžùÁ¶ÑGÊë˜æØØœ" ¦²U˜¸´A·ª9R3£FU©áhBó!3â"U傞·V üÞ&[3èïêÙ O ôÚ ÄQ=šàCmOsÅFǼ§2﹪qÝ\0yýWã¦Nó¿sQ ~Ž¥EÌÞZ׸?¯çRýäj²Aäè¬BéáìaƒN[×ÖëÁ­À _…Ýš•‚ã­-è^úú!õúWÿÑÊQcáƒ]g?:m#²®hÜ…Ïé[ýªXRß[-A·`"X‡ú|Vãw¸{ËF)>«ÏU‹Ú,ìo ˜6½)‡/‰¸†ÎºÓ}òùú@s×6çö›è`ôäIJù<Õõõ# d9Ÿ=c‹Oü{³116xmºn[røU$óKÀ"øqä^ÐTãE›æýÝÁñ<;~:Žg`éSmóC e-†qàÏp‚huä˜Ö1Áž®T[@€è» Æ-ª4 ûЦ¸€àO N€v¹|Ô`7øÄߟà@Ò1¥Í¶‚,‘–ãš;¯]b¹ @ÒëB,[¼5ÀoöG­2k9nЈFæ¥H*G6”dälƒ%£Õ´%V«˜>S›2¸¶™«½¾½ Ӻäõ@„êZou«"1ðt¯«@½£y½×F0H`nÚ8Î ¯ËQÅ“Š:ø|"jƒ€S< Áâ#•‹2¶µŠ{" /¶,-Àr·5¦ãsjT{â‘£s[rziÓ㥟Ud„†IÑM~n¾Åð‘ñœÏrðÞ닺‡vSs,X°kh\ÕuŤC¦J«"'oy"{JïÙêF›r½ýW’Îòa8=¥Òje=“jIŸùü×tþÅû†± á[z&# ¾¿£þu£J§ OB²tº_)1ÛReÐÜÓþ¦"6¤^Œ Æú™±%ä©A +\š„Úªq¨%‰}Æfž&„¤&mIñ;+Ð̺†· ÍÂP¾ÿGR·ÇÁ¶®9·å6ÅœkõfcƒPYQáíš„T‡ÆáíwàÅ30¿³ÓºÏ̈d}Oãèó»ÆÉ+»på üà*6t¶EJØ[àþ7¯‘нÙFÕcsº¾wáÌ ö4¶]íAM›„"jS[…Q}6ž”ö>:µu¾¨yóð†žAµ¤kŒ<\alNcéõš¹¶ãÒ_£¦¡wÐµŽ±“Õyñ£ ìxÒ¤4ó0þ²Î±tGã;8 ” q?A£½å"d3¼õ xó—áÖâ ÀФ6RÁ ‰<6€²½&›u¨Þ¾ýTå°• õ•@ÕlQóÚ°ùwÙ÷ºyß*ðTÙ¶‰¢N‚lzÊ|E¡bÀ«¨úEs (ª4ÅO®îGÝÏíYo¸§g`éSià"Úm  èQá‹!´pr(ºtíRŽ!’àe´8‡qUçÐÀçÌ÷ØÌ—@¶µƒ­„óàx'~ 80 Š:šž|ˆVµÛëq„l«îì1åÓ3Ÿ‡î–ËõnCê8NP$Ÿ£³«ˆÈöJç¨åÀÈ1“ªYˆRJW!3͉´œßÔ)k`L1•!£kƒæªx@ï›ÓóÚ\R*¨Y0˜}^÷W¯ªh'^)‚u:«š_þÄ.ý #íïÐ7%ÞíÂß…/ýšžAjPþîVhTe„ŒÞS àÒÅÙ©'Hæ(r—ß5À§¡’þbNDq²=Û|~)¹[ÎUÓ’õ\7%ꦎϧ¨˜=O(ªr~/0Ò‚I#ìØëiìvVumãIqo–ï+-öð®œëò2$#÷;oë¹” ²^žO&×®jé„ãJYÆ’dËSô_9 Wß?ÚhŒL뙎Ï)b¶¿ad ñ¹V3<=³¢@©£Ã.%¾¿ Óaý†SŽKÏÍ2´ûˆò¡ÖõÁŽéÕx\•£cznþ€@J ¬gOº”Y§mšÇŒ2:{»†*Ós±á"Ó…œ$HiéwyMx|hR릞ƒð‰3ïÜ¥ÏÖIëûÙ!À¥# #ù˜>K H~}®XÂÒȆ[»TÖôÙbž—Q³ã,Š  MrR›÷`>ó!Š2•ÍÍ&¬ðìøi9žq–>ÅÑC ç4Ú•[0cP¦aœVRíF>Fi·Zl ´ÓhšïÝG‹´„@S-6?<•j‹˜Ï†€ÆÚ¥µ5º8b·mCÑEý¢üA×ÔÖã•«Ì µÁ›‘ƒ·¥ú{wqñj/ø†³G‘ŸNG¯-÷<©våç~ J0£×5%চmlF‘¬©32dݶڬtjF Ú#z¸'ØiC¹âxu3¶ßü˜_‡K¯éÿudtmõQ<)¿tHcgµ”r[p#r.ÙI5õ¢ÈÊò¿ÿ>ëóu…è»r^Ÿ"ùéñ„£JÔò`>¿#i7ërj¶DÜDß:¶drPβRp×¾ùuIIwt,˜õ qÞ\Õ!š›†õ]9¤ 'áÜyEÆûÍu4ô¹ZEÿÿµ+ŒÏÁÉãŠv´›:=Ñ´©·¥%ã|«Šò Œ)úV++Š`ž%¬Ñ=ó:_̤.ë׿C: {äà‡&Ôd5·%ð5}Ú8éX¸/ÎË~Þ¥Si8ØÒµØÈãgÁ¼Q†’G *“C_¾il-Ãs/:>Nÿ°iÓ——ª¼}NÁ0Lºè0¯k½Ïêðôe2J¦:lùžÆ£Ïú?yOs7ƒx^~Q@ilÎh5 ˆ;ª†›<¥kI ©㪾›:)^à³{ȃ?|ŸuÓC£r¨óì°9¡MÃ…Ïé'/©"Ô¦üGŒ­ˆ{ÝÊŒh| 9U¶[º§E¸s¨’š@µZGͺ~q­‘AkhÜ¥ˆSNf$s<º`Xç»]‘¹Ñ½ç`Iý÷¢ Ù¡PÄðä̦£¶#¢v§áa`ñ.}g[ÿgaì$ø¥yf{m>¿‘ð˜ Ëý4¶¶Žl"Æ.–½µ‚¿c[âOØN[…ìC<¥(ªjÛF g×èüe¤¿ô¢y-…¸§÷ÍçPÌOîèö~Äœ¥Þÿû9ÿÿt<KŸâ¨¡(Ò=óo嬢Eq€ŒÖK(•6È}×O)†]©3¸B‰'^¯àrëmžN±Ùæ¸ÇŽ123£æ¸æ5ËYй€PÔõTj7 iµj"C%ŽI¥ #ç³zÓ³*_:õ%X¼ArPF¶˜“.ìƒ>š×çá̯Áú_ÁÐyج°pË¥þ&N(Zå YvKç(äœnJب97ª2Èg_„cI ¸Ýߘ¾þwà›ï9ÎÃ=Zr ‘˜ på[ÊqÏ£ª"ÛµR€‘qsî7Þ «>¥èßÿKW†>4n*·rlÛ›®}i^ç}p]--v×Jwוš+æEîÍ Ë 5jŠN\û—ðç¿ñ¯¹õ]¨l˜H×m6ùj"g°½-ƒµº¬û:÷*œyEQñYÓž¤-"o£ªq'áÁ?¹Êµ?3Jæ5øà=9ßL?ÄHáàœ¿¤ûéunï} ûÝ\’Ól7,F&`Ê¥órL•’Q}~ú¿ðÂ'| ÎÕîªk}²³ ˜ˆã;ßðÚ6Ü«n×ÏNndZ[½„ oê9r°ò‘¬Ã“b’š~N£s¯jžæwáÎûº–ƒmÝcÍD&bñi9ô¹óÏ‘IèO8rÿ#ºrAó¿ÕпÁ^Ë k^Xðüà¶Ñ#Êë¾Ççœøåó¯é\¶×\n[€Lv.IíØ+læá£w˜ùµtG×±·®èÒà¸æžÇ+àå¢épM?gøQ^šÅÛz®wÞwJî¹-¸õäÀpkeX¹/îT­"»1qB?鬪W-x:ØÖ³ÜßÔ­?ÒFªi¸{=äB‹Û%ø¶‘3¨º”;ˆ7VÈ/¾$0wI“cè<Å{@aBI- qóx5OAÛF—¼^ˆÏÎâ²o§‹«"¶65ˆkj^E¼Ñ®Ê0ƒôó¶Ñfök¸t]SÌûËÈþ'qR¶ºò„ÍþI6 ÷£üyv¸ãYîS#(ü:°žàÔ ]ÅÚq¤Ìë!t -&¯ùÌ!ZTM\ý4®bËÓl*àô˜¼hr·ý±×äEÑ ¯W!þxÒ‘mmš¦Ý‚–qí¦@A"-²-U`õ$}°ñ"èÁ–Âð>?$OõŽÂà¿EåVØÌnÈ)ø|0uY@àè(ˆ£â3:©]c½jªÎ’ŠÚ4jFw% Š®’¹_Ÿ¾ñG.’WÃÂK°ð±ÞÿÞwtÿÉä4^w¯)ŒŽ.™Ü¶vÿVœ²|ëÊuݶÏ'#oÉÄ ¥Š"1iæ\ýS‘nnÉaŒë{JySVÝ“ƒl7õ÷DZ[x¸§ïÝ?€çΡÍIˆe]ï´‡7aú¤é™UR%Ùþ†þmÔ ÐË;GjPŽ#™!»ÙPÚ0–’£:Ø’£KE`½¾øJ {kЍ¼ñuý¾µ ‡×$lèÈùEbþ #:ÇŠHÁ0̾”%ŽY¹õéd‡ái„•úüê¼€]yYã40÷Ö†}&_\ÈA­á*”ÇŒz¹éØj*ªS)=«ú\j@UŽK·um6ªÌȹƒæxvJѽÕâÁ%BP¨A yµí[{¨÷·›.R‘3éÇ­e9Kð/æôo(¢çm¹Mg_*4^VÔã5\ýò¯ë3{ë >¿>7ÿq™æÆêhÃej¸’Õ³?ØÕõ}òžÀL)ïšLg ”¬ð¬g¯žÛ½4'z]ÝSqKã_-º ÙvSç;vÆi&å¶õÓnºjVP”ÊnÈ¢}Ž˜?>§]—z«×øJy#Nš0Ù©òÄ?{oh'¹}KÑ¥µ”?„¼×^¯QúohÝy½®Z·º½M³Õ¢‡+x±Q#k#mùÛ²ËV¦ŒOm|Ìç‹Xm#`£IãÆ&Ù" ÓGsgÇOËñ ,}Šc‚;…Ä”Ô€× ç¦9ªÔªU”ò,5´ëÏ&­ØßÐ8¼òs:g½#/m8ñ+Yš·wŽZe\x×Èz+ 6 ÑÍËN[÷3€´Þêe½oiÞµò‘°Ú„Ô1á†æãü¶Öf¦ßh|%ôìi&[Á8>ßû#E¼^I>ôkœ¶õZ2#€p皀ÕÚ´{‚““xîÞ=ÒsëbTØ›°—w-6Jpb\çõz5/#qEªÎ]Qª¼UÓdi^8{%=ƒ…%8sZ×mõ¢}®À¡ZÒk…œ¸z©AEJÛMÓØzCóvpL¨vS×84®û¯`êœ6d>Ÿ®ÉŸ_Ï¡QƒÜ’ÆðpO¯Ç“À½y- A8¼ ©_ÿO!÷Ï©­CdZÅ'Q£ãé¹Z>X׬³H_ª5ÚÕꑽ´JévzøÍØÚ긶±ßV+©c~ï¢J焱׋H;é±ûƒ¨\‘Àhc ÚèYÍ¥ŸÔa•·”ß÷ìpÇ3°ô)?n÷±"Cç˜9 ¼mÞs‘»³hÑ]G:'ÿøE´ÀÒ¸j]ó÷ª¢³*²a\^ÝËÓ©¸ýåe¬$’JÛ[íšÁqE/üU½7»úZEŽìøy‰÷•s¦¯“ÇÁ8¤¦(åoÑ2»íã¯@õ-9ôVCу^W»ädFÆ5™Ñw·›Ðœ¯4"à8T…9òý —îÊNj翳*ã•ë9pj«‹d¦©!)Kòg½¢1..>Ìæ’)«O›t…$÷¯ë\>?´>ü˜Ùã ¦Ÿƒµ[úâòœ<©÷î PŽL+šÑ¨)]‘Û–öSÄça¿¡ëŒÇL?¼>DW×èõÊ -ßá<éÑø‡¢:O~WÑ,WΨ^Ù6pjëš¾»±ã”·7—äàA¸ü&<¸¡è‚uPÇšPlXœ>iʬ7a¹ ×‹›ŽA³bšºšg’ßÑuôgM œ¨«ŠjÔä i3Ž[韄âM¸þ]7¿#Âõþ†œÔöcCθ”ØÃ›NṠ¸Dñ‚St¾ó¾¾ÿ¹—àà6ôÏC‚ih¯éžZ·4n¾qènàÆfàà®®{gUÏý£·õx餾Ûã5Q¢ ‡]šÖÎ9?r°U`t <&ÚhÁåôsz¾k ‰¥½9yINüp~¨×÷Ö<®þ{øÌWL–„¢£•CðøZ¤Ã‡øÒJáú<&‰¢'–Ð?–Öwo¬‹ù¼YÿÍ‚@_ç µÖÿ“_xMøy !€¶¿)°7<%N—­¬U´>÷t½µ²) 9§ÿç¶µšu¥.÷Å ¬Woˆ®QÈŸSÅèÚCñÕ!¸PD`²VÑ8Dbš/s ÐNŒ‘º¸ ;· Ý=Žú’Äz~^¯K¿…"®ÈÁèàítŽëöpù’±©–wTÃlnp½û ª™çŸEàú‘±?qÄîq2Qä,¡ûnc÷ìøé8žq–>Åa9DëhqE›Š(Âôó÷Ï›÷ ô:Z˜mTBºŠÎ‘có °æÀXvRaûì¤"­¦I,)CK굇7dÈlCÝjI»«‹R+ËHïð±gRo–˜¹‰ÀäÇ]Œ<à>wæ£ß3(0òyÈâ±Ç ›yxïCg¥Ig•æ‹ÏãÚõ€"næ»G#:ÿÒ<,ÜU:f{UQ›ùr(ƒ£fŒÑ}ì7œJpÕìÎU'Æ7hHÇÅœ®õø¤þfIªSç}XºãÆ&™‘ƒqjB yz³Ik¼nÊYY$›-[’Ûr©ŸÀ«9 IDATÅ×ÞМIgqZ¾mtÓÖaâœ8uƒ¦òíÄEÍû¾‘®‚³Ù m5 s×heܽsW´Yè A& }ŽKc¹–š~÷z ×jÐn·Š[šB &K‘è[ëÅIymâD†=hc»cìñi´QÛ4¯-›ÏýÐÌ[[”2l^_D@ÛíýDŽg¢”?ÞãYdéS´³È¢GíP†pÂüm¢5\7…v+M¢µ܎ƇKÏÙ\E›æó Üê¶S€¸]±÷‰S£©! ¬_³îtPª%•˜Ó6wˆŒââÓ±aØü€‰Š¢„#2š;+&òÑtåËc&µåsý£rÛº–¡ è;åEWf6Uy#ÓNÇhw]ÿÆÑN/oÆgô‰ñ©à¢Lwî*JbÁÁΪûK†«Šˆ,ly5›“1îuMêtó€áDW÷ჭ¬ÔdDÆ7U3ç3`#h–Iñlïê9_zCNÝ”“Îïʈ?ºiÒ£a8\Ôï©AGR]»kžÎ\‚4´¥Ú¶²¨Ó€æ²ë“Öl%Ò®ÿ_r@à ÙpŽ/š0eàA´dF»üvK¼“Ña4Á‘ʸMgYNY däA·ÕÔýü M¤(0•ÔuçwôŒi}ÎVÇÕÚ:ÇØ ÍE¸þŽÖ‚-n(ý=WüÐ1 ms†Ÿ´µìøEx³ÕoöÚÖ OžÒ$OC¤*ð™HÃhIsåÝk®p`ÔŒijЩTsWËgÀâþa½·ÕÐù†§á“h X¾J´Oãq¸¯¹õÞ;z=჊Ѿ"êc¨?Êú"QÙIÝg½¢Â‚2rÖ…=¥€jÜ_N+ú8¿ ûJï>w^÷Î:R<©qÊT4êeÈÌÉ.Ä“zÆÕ’Àå'5ë†ÿ¶«×¢ xíkJ'Ê”ÚèâéËúÞáiGj/àøÏ­³Û’æÈLëÞ7—€=¥òV¸Tu $ûKC%±ü#ú_ƒ­ ˜‡í#© pé7;W=©4¡V…J¹üTE\€§ ×6 ×F¶ÖÊ´ø ?†Šy¸±ßG¶)„l½%u x e*8²ø³,ÖO×ñ,²ô)Ž N‹£"^´(>@ ì Z”ŠÃüÿíFºh!eP”iÄün+ÞÍ÷=FF;mÎe5‡|¸FÞHO,&ý¥Oט}¦ €ŠrêÙI9H[¹2r §šéâ!ÈžT®´N³îªMšu'3¬×ô5kÊÈeF ~9+.’‰6¥Fu3¥¼Âðû›z=s„çÃ=EJ ¥ ޝd««È âø[å‚ÕÙ™>­ïÍŒèºæNëµÍØÏßcn5x¢€Ïçc½ gþâ›ðµKrp T•fŸ{ hwô¾ý #)ð¨Ut­g.jŒÚ-³Ëõë½në9¤‡Lä­ã¸œä¶Ä[9uYiÊnY}àÇ ~)C$f°O€È:µxR¸Vq‡Òr½6}Úñ¥Jy§ËTÊËIíqÄç_Óüè´áð&FÅ¿ÉNºžj¶ÒiÝ®¬U€F‰Ü¶î×’GgD®N ê½K&-6ýœ‘Jøú{!×ܶœß.І ë9m,é^r[Js ›\@åÎU9óéÓûRÞ&ìx<¾ ßû?pHŠÔ-˜½ç^SÊêÕõ¬‡ð…/ äY ;qN?3¯MÑÌàÅ)‚i»˜_(·¥q¿÷¡ÿa`jT×ß—µ‚ÒkAþöÞ<8òó¼ïü ïиob0÷ ‡Ôˆ7uÓ¤hÙJlÅöƻ޸œJj+)W²‰³ÙÍnUâMm¥6©Ä••+Nec—ãØ._‘%%’-™¦eŠ"ÅcÄç îÐh4º}wïßçÅ;ÜŠw‡¢+Êüªº4ºÇ{<ï÷}žïó}`bȈýHc| N§%Ýe ×ݦ†ÝÖ†¨có`«èKx¤PÈnlVö¢Ž@'øy¾rÓÚ!íËöTJ@—_¨n4ôùë¯ Ø;¯D€@@YwC¦h^…e¶:áÊFMàf/«kí®ë›Ëj›Ü[u‰…u͇v[r™ÏYŠ%`m^žI¬H/å,TvMŠ» I¯Ä¾ì è9ªëÔr¹#Ú‚;ÂÖfxÂô´ÌÖVÇü†¸e@×€?ÂëáC@)ecõM³·/µ÷¹ÍôqÜφûî÷=KïáH!—÷e$`Ò,qºiÿ q›@^‘|Í·=ÔØ½Hé5ƒ&å(ZÐÁ{Mæ¼nR ‡kív›ZL\vW0è‹n:ïRaÒãVkíªH›N»%G–¢ˆDc:M¸ø× Y…ýÚQ}4§ËS¯i§ë¼X­¦rM›`.K`z^“˜/%‘ÎøjèË7T-ž„ë·}†`—ÝJ¾¬öé±Ûk kUïyæÌ¨¯]5<%CÛ´tu´¸lZ›w´Ì=¤vj]ÝÝ$r›úüȌڻ‚'~ØïÝ) W 0•waú”e®ÀëoÁé-ͺ‹ÞAíœk‡;×àøY=2å‰ö½Ê>ª”}jtÏ#ÀRNž™óâ…Â>è°è2s›:ŸÓÒÊmA¶«o¿%PÌkÑë´õù1/¿à„þúü½^Ô@Æ6÷wt½¡ -èÅ<„G¦ÈÔVDVžW¿C°qYžÇTŸUŠ/)¤6q øÒ?dmAר\Óf|øye ]^Pp߃"Š·0™ à›W tÅkÂõ÷ë\å‚Ú®Ú’-š>&飼<ÿ”@MtXٱżø\ uSÿMø‘ZŲmÃ.NèY‡&Ô?º×·ºñ¦6çŸÒý¼ù<ûã>W¾©óÍœ±>xÆÔïAxø¯jðÇ3°­¤·!µ³[ØÃãLj'謮Þ»çŠRy7g Ôv»(à¤]( DvyÈÚûa¼¸åò&W)‰Ú<‡<ˆxoåq¼ß¡³ûa¸w÷=KïáhàÕº÷ñйûhqÝD ú÷¡‰´ÈÝ[øÐY¢w穟ùæ\Å5È öYçYri°î\õZF­vTÛ…NYØ•6‰X†Ua] ìЄŠzVʲAŠé!kæL<%¾R´—ê–ç„„Ââ)8ƒˆøë„ìZZ¡‚¬_`)lÂÎ[ZŒçß┬[V]pÇø)TTtbÊT‚ñ\ƒÚ¦Ñû]há\¾®E¸+ s–l‡;>§óŸ? ÏŸ„“}2äœó¥Uæf!U_§ÑlRïø4î‹#òp¬?²À@Ÿv³EÄiÊ×ô|ü#’7Ô¿»ëzÖ[×ÔFżx9¡ˆ<=çŸ2= ¤çT5Œ³‰ÁÈ9žA dùEq‚úGTâeg] ¨ÄùõAÝîicIž‘Ú¡Æé›WáÕ?PVVÂøýÆC“Æ©jÑX(¤\Ð}õ™îBuŇJŽ=(ÏÃOKYûâ'!¾…DÚ6‘Òs×Õ‡EµŠËb^ž]Qê¿ …º¼èh =cÙú¡ÕRø'šðÞÄ@@JØã‚òD¨ŒLI¶`|N¯HÌ w¾ýM-È‹/*¹!šÐØH*Ì+kÞÔN[£þa8þQXUÀwwÝê­6œeˆ…£º^¥äAg³!€OjœõC¥qO9¤f‘Té33>1 wSpþÃ>ã³'*u÷€•ç~B@qtž;³gá¡)Í™¾¤Êׄ"ïlAo¿ç[UJz¶í5µm«);j“h\ã·oÈgwº1 Ϙ1‘R¶Zf?jž8‹[±á¸”ê›u%$d&zû´—5Øß†FØiIU³¼%w8I$ãE‡1lœ¥Ã[רo¬q…âöÓÕÐt¶¼„@_œØ…âömL>ffí.Ú$ïWí³}h¼dß15 šf¯BHö¿–㥗^â𣫫‹/~ñ‹ïúÿOþäOÒÕÕõ®×ã?þ®ÏÔj5~ú§š’É$ŸýìgY[[û ãO<÷p$ìu¯¸ýa$#@b”-ä†ÚgÆP©“-´ÃÂëqðõŠÖð» Rý¡gèž÷½¨ DÒiâ½Ú¥Âò2tÙî¿;­ï8^…3”ÕC-¨‘˜ø aÇjl±^Hd`ð,¼öÏàÛÿ˜XZ‹QªÆÒâùÀY˜¹(ÞAÚÊÄ“ZЃA¬@[ë(|Ú‰o¯ÊgF}®Ý íâÜ3Κ!N¤¤É {î’ AŒÛíÚ.;ÒnÔÕ#k6ôüµCŸëÖ‚Þ¨Ù‚}è ¾½ž¡’Cÿ Gf†¬ßvðÞÿâ¶\Å´X òu ×=C°¾"z·hb˜{ZÚmõA!ge8,k0¿-Шë!;m ªÆR‹ê¡8lÖ½7©VpŠDµP¬/è¹@ggCýÊ뿦Eq/«q-Zƒ6?jÿ.¤Ø]*Hä°Õ’§çØÓÚDãj›ø ´÷!ý Эq‰ àÍêú£3ú¸î±mb‹ñ¤?îù10ÚÝ«{}ù˰¿¨±3y\c%põ͉‡Õgƒ>#ÒñžZèÞÇfuþÙ‹p;Ÿ¦ïÑÇH¤DÐx™=o傾4JÿÎuò˜ô¿é>Ñ#и—ÕxtÜ¡|V› h·uýbÞ',_WV^ªOcÁ…Ü+e(—62#0´¾ 6‹ÆºòúŽËPu!ã.#°gïZˆ¼ íª²ä¦Né¼å¼ÆGÒ¾c³j·¦3Œ­*Œ=§~zg © E8¬þm64GC˜ùÔYRǦà Þ14w»îùÙD@ƪÚäžÆ—†ú5ªV:Žv3Ž¿CmMâ8â,¹ŒŠ> ;wPÏfvC÷fãôûÀÞ²çä·eÀ¦Ny® ñŒŠ1Å3Ú½M<o^èìâG驾¤´cËdJÏsÂÎ5z"å#ïIªÏÊ L]`ÿÖ•#•ëbÞ/&í6<ùZìâI…Y2a¨6T ÕÕ"ËŒ*°ßÒ"ïÊ€¼<}À^šEµE¥ßµRí ËØ®/xoR4.ŽÊü%Õ®,}éU†Â-ЍÝþð…ý\:±#€.a6Ášîi2¨Åya Fûe¬«H-Û,÷ýž…ú£ÔjZé ã‘óZljÕè«êA]è¢Y×çÚyu®½jž<hcÉ{#‚!˜8!2°3êýæIÈŒú,¼»&ð˜õêÍ™›Å«vë ò̸> N¡(„»!s’ÞîK°ñ{LŸ´ÒY-öû;ºÎgrƲa:Éæo¿N4a×…Ú²úÒI3dmao³âe6`0ã ï–€EµãÌU±§¬2>.`üÙŒBÊ|Šþ›_¦µ&P ðNyzhÒ‡°zyÿ°&kdÚ˺w'Y«ÀéOÁÖ;Ð=,róõ×p_,Ú†ýßîNËhúŒ@×Ê2 ¥ T(ОEŠÚeeÌUJº'§A6sFç½ü|ÿøñóoH_)€Ž'¥åøcñn(a.©>mµ´!I¤$^êÂp{{¾TŠ 9:åòfC@¬Óö³Ã¢•ø‰ù ÛªÕì x žHIuõ¶¾wçš¼“…œÆqòá l娯@÷ƒQ T;"œ×«^úšlÓ‹W?/_£lž`jjŸ`ÈÊýÑ Î=Þáà64;^cÉyŒ×4„6`àõ–Æç?‚/=å²êz=?‰€”«Àà<þÎF¹)ŽÜmr^ÿUÏ?ÿ<Ï?ÿüÿçg¢Ñ(###ÿÑÿ ~ñ‘ûoÿ-Ï<ó ¿ú«¿Êää$/¼ðÏ=÷Üû~Ïÿ)Ç}ÏÒ{8jÈ‹”D‹à^|òð)ä=r¹Ž¸G÷Þ@NœTl1‰Õ€ý/ŽvÓÄ}rœGêv™N³£{r’Ôô4àÝâá° Öä ˜ù$¿ï‡©Waò‚v¥¥‚±´;æB/›R~jû°uÉd”¹Ïù°JƹºÊYq›Ò„"0zÎvá`ñЏæ‰q;òTŸŽ›uü®€ ÍvCëÚNQŠÕÝiñþa=ë….O¤,GºvdÌànC†9Ñ£vØßÑN:Þ­ÅÔq˜¾ù»ú=Ñî|î/|„é q"]°YQ›ï¡’ë§šõy¥¤~˜ Ê£KšNÖÜ,j<Ðsõ‘±uá —ØjZAÔAºÀ‹“pž·­e_¨´Tàm˜êz»£ÿGãFÒ.jaNô¨{ú®‹…5îöö¨k‡òzGE)µ["å³°ýžèQ¶wÕ ÜfŸƒá ‹ìÔ¨>O÷¤žqæ´€d àKÅŒœŽ_äØƒpùWÊ$Ròšt§u­6ðäg,[,©¡Ô‹Õñjës ä!9DÞÉ•[K}ÀˆÐ:Ü»w_‚Ò<€É§”á'x,IüTþól˜¸âÃÇŒz½žFÍÆôð8dEt›5)ëÃK_Ô8Z4‰'P{p‹{"rfĸQãò†õô 0$£—Ç>œæjáIVW¤óµ½*€âdîÍøËŒèïdÚ²óŽ+<hÌ7«sš Ó§Åœ:¥¹åDN#1ãÉ•²FÆLi;ª1ºkäÿý",ÔÎżõS·ÏÈž²{³Ð«ÓžZ[ŽT!çC›ÍºÀÙë_Wß^{V/}A*%xýÿ®±¾ „ 6¥mþŸf²—aØ<­&êZÌ äfF ÿÁÜ^§ÕÑv|g;¸ áµë\¨?{íEà©e6çëÈvƒ‘³ÉYÄ;#›>‹6Ê'Ѽçƒ;:í÷W6Ày–ÞõªÕþôºäßøÆ7âĉü•¿òWØÞÞ>úߥK—h4<ûì³GïqîÜ9^yå•?õ5߯ã>XzG£´ ¦QH­²á~_î-´`Î#nMºK(æý[È3u ¥I´qgǃêF“ÖÅÜ R(..R¾}›Ô.dbÎs è4‰% UÔÂ:6«ÐÀ˜ M<‰V£2P݇‘‹»OüL}T•uG•â Yºx¨—hß©Ab€Ø ”¤«‡*ŽKɧ©;Ônû$‘Q®–½ø¦Ë>ë6@PØ‘w Ö‘')níäv†>Ø,£4ÿÃ-rݦ󵌵ì]n·-”9]ù;Kæ‚ÓSpbHžŒ€“a°óg€lGDþjKÀb{Ë+ÿfðÙ5›Öï×¶ ôZKŽ3sXT&Òòu¯yÔi{ÅõÜ–ÈÖKZ §\(:,ZFÜÌWàÒ-4žŒ  ÏnŸjpHï9Þ’óL Œká›<¡¿ {jC·øG¢ ¥Ô*ÐØ°NûΗ²}>ý?©þ\ü,#Cà™&xñ¬TßMÛ‡8°r‰ãødWàÔEytN< 'L—hö,lo{¹ˆ€=Cï¤Ãzî5åŒÜ–Ϫ,æ5rz¾Ý `þ–D—F/Ê#ñÀ§àì«öŠk^ܾdU½6Qx¨^…^”tC°_÷=y§›ÕËŒJÿ*3ªvŒÆ½Â{2íëÆõ™××銵šºïZMç:~ºHþòe*6¾7¬äL¥dbm0ùÉ Ó§¼¬ÀÂ-X¸-ìÈÔÃSðøE_ ¹Õ‚gþ¢@Ìڂ±ͺç–Õ*V¹¢¶ÛXÒß3gtßãpnÌjëÙü*æ½ÈÝ[ò@fWt_1“°èÐ|^¹åCœ ˺s!ôHLÙ‚´[¬-Âê¢îû°¨s” °óZK5(ÛMXxÚ^ÚÁyâGnïú­ý]Z2Gd‚6n~v!ÛãÊÉ´½v›œ²ñæ¸$Š/b²ë®m–guEúQ†\Ú|}PÇw+ 799I:>zý£ôþT÷÷üóÏók¿ök¼øâ‹üÓúOyã7øä'?y¾¶¶¶ˆD"ôõõ½ë{ÃÃÃlmmýgµÍûqÜý‡c …ѪhÒØÏ"pM¬e41Ž£…ým41gÇâ Ú­<ˆÀ‘ÓO*"ŽLq"ö^ Mº˜]|f\÷±c„ƒA*óó´ZVŠ£¡ôìþ!èÙ†©”dlËûZ˜&Oøòñ$²Ó*P6ûœRt‹kMœýqÈ\¢ð«/Ù TrÎMÃÂ"uÛ=&R Hϊב4ƒê vW@‹Cï )ø&%à¸^qKÁß*ʱÕA)Õ‡-Š+ÄÕU±.d :ö§€Œ ð¹¢´Ná÷êëj¿³§}FUÙtŠF¿ïãK¿F³\¡TpX_'n-Ú´“tDÜ«Àö-/ûPÂ8TEõß(>ƒ«wPaŽ‘( y#n_ÖbKè3£ #¹:cÍ:Ë0ÔÖ竇"B·šÝöüµ<–‡Ít7}¦ÛŽ•<é ¬²h›;zÍœÖßÈeFµÈÅ».)…˜hªtÆQöQø¡ŸÕÎ}?ü»¿@¹óq’¹[ð¿ìhì\ú$RFä„ÂMHŸ“GekÙ‡§ļÀq:£~ÉôÃòžæ”K^ˆ&æåIüóä±óà dY€Á6 ±Ì¿ Étñ­¥ÕîÙÿþÃß%Wxö°¨¶¸ý‚’ìN‹ˆ¿·ñÜ:ñóiJo›åd â³°Mí}°£kg&`oCíÔHHg,ÔwÎD4o]RØ3›×<(ä€Hœ'~ä8[/_fWãcëŽúåÒK»yøæÏ·øÈ_…Ê·à›_ÔØŽ£v˜ýtý·ZÌ_ƒ“çõl p´:ï%ŒD ¶‹prÊ68KÚXR»°Ÿ ¥å¶¼¤Âñ‡ÖZMÍ—Ûßñ¡·Ü–ú9€ëɈT?0.ð}hß †â'¡ð¶Ædµ¤ëŒ TV+‰ _¡¾Ð"òSÿ\ÿ-*KWÈguþþ!XÝטHŽ÷SÎUhQ•¶RË'Ѹ„'@[ÀoÖ"øZ%d‹.Ú\ÞE£ {ïM;‡Û—Æ‘=¸‹“£ofÍdþ—~¬®®ÒÓÓsôw4ýSçÇ~ìÇŽ~?wîþð‡™žžæ+_ù ?üÃ?ü'~¯ÓéÐÕõA–$þ÷=Kïḅ&hWâˆÖämpºm{o ž,^в߾ç&b„ Åعk[pTʤj׋á³Ã‚@éÎÊ‹‹Ú}wß"ªŸÁ}yè£æ¢î–ÁÚ1¢îÔI»èÌ£€©‰D™›_§q-+—w(}Ç ™aò$Voäîr° ‹oË8vÚ¥«µóÊÊŒÈ#qXÔ.ppF!í5¿°•¬âÀ@Ú¹\·v¨¶”^½SQçkú|Ÿ |Ì A¥¢rÁ €‰Ÿý€çp¤úL3æÕ7©TY[€»K>(ª>Ý„5QÃú7–g±/Úö/ ;7þ茕‹»“HɸϞ“‡§'žÖ¼·$ Ö; Ï=p\ÿ?,ª}ëUXÞö* ÐG ãØ„ØìÀê²¾ãÕ]öß^Ög3º¬µq-à¹eÈ­Ax"Ï~?ù;ðñUÈöÆoÁ«ÿ‚1’§û!SrÀü—`þKú€‰qH&¥í´`E_§š†&€-ÒÃSê§È>ÕçÁi,¡pÐç ?®ðF(¬ÐSï Ú³˜—7ÇÕIë´õÓñh_Cî¾ê>Ì\ Ù'/ÈáÂRUó˜8AÍÈ'/S,Ð=¬M@0Ý}Fñ›×5)…ÔzÇT2¨;­ D«¥ó;°×ØÖfáWÕÆ‡žçòû_‚¯±ÎÞí-B•pXmQÈ©”Q1¯MO!¯ü’ÆÆ©G`¬úú è´èg•½X){Oª+É’]QÿÇ“ê÷L\s2Ÿå¨–[íPeÚ6–tÿC“\{P?S}ªX¯z5õ@@¶¦QÕ}îmJF¡˜H,Ìãqý^)ë¾\èpkY}ðÐÇî)Ôeü²å‘ŸüYxù‡âÉAF,潂w£\¥]¯1{ÜÀÉå»Ý…÷ÞGÍ|9}_º$h¶:‚d¾cç1ZÝ ¢BQÚ»fŸ>ȶÝyŸ¼xÕÓÓó®×Ÿ,ý¿ÑÑQ¦§§¹}û6###Ôëuòùü»>·½½ÍðððûrÍÿœã>XzG–ÜÎd_²$&ÛSˆè&â}nƒ ZLO¢EîðŠsÇ~&Mt šx°”œš¢{fFRý1Ž~ÁÖ¿þuö¶dˆbÆUéN+ý·gm}Ò3pí¼ùÁoÿ ¹¹cA³Aýoó’^ƒgeŠÀÊ"å›ß«Udh‹vs¶èä·åŽwÕ×r°³ ¥}¸{]%D²*±ºž IDATe•ºµçJA‚} ãäŒM0ä]à-¼[{ï}X³°wf@ϸ³æ‰‹(lúÏþ‰vÈ•’¥Ú7 =p’ÝÝ(éŒÕØ x0ì ií,« §˜ C´KÅ|p;DçLÇáñãðÔGM§hÆ/Zñ¤)œoʰG¢Zä)¯´½gÓâ24¡6k6Ô¯'gà~#[‡u?™~̈ô‹*ehs›p½ ·ònyÄÅIg”å–]ÑçÀÕöª äÈœÊvdF!óÑa2îIuHjjys·t³›—ä¬)¼p*9}fô"œù(ÔKð© s™£°Ÿ+BÛ²üêàLžg¥Öú>g¡.ëÛ»E‰d:OaÐÚ(búU»^p3Þ-ÐïÖÿœ`k4. ÃÒ×µ) ÒgšGå“«ßò¤ôvâ£E«æG Í•ò°yºÇaðé4Ý&‚JS@*2¨¶;ȉÛÖiûD‡ýõ¿óªœ;©113#Ano%¸uà ÌÂv5•LÙh(D jŸë¯{‰ˆt¿iW•e0êU…_ÁŠXoéYƒ!yÅòYÍÍýõG4k‹^ÛéäEè ªÌO­¢1è’î¼ãk’òÏ:sZÞí…5Ï ìp<È›ÄB—®Y¯Âò®î£˜ÐŒ%}(xG`¸i^)'úI¬W:$+à 麤–P´å‰ÀÛl—‘ææsŸB‘€e<°·ùBÞ¤e´)v©B]`çžÏ™½¿É½üÇ\.Çêê*£££\¼x‘p8ÌüÁ}fss“wÞy‡'Ÿ|òÏê6Žûa¸÷p¸¬‰1þYGæ4YnçíçSh¢%ð¬1|MÒ( Ó=Œ&æ!ÚÕá¨ÔIÝÎÂ×0rpímB]]„ \tîñ Ô«@ÊgRM^„’‘EãÝÆÇ‰c`ùÙš‡à’bƃ3W`î3"|'2_€í²(ÈÍ«DÂÞ–vƇ>†Gi{‰”çÅä³Ú]º]ãä ¸qE¡µ6lÕô\ý@½£çwaÇLTnød âm¸S–‘r—êæÝº<•]j(swá[ÿŠÂ¤?ý¨QaNÿ˜ÑÁ ésH gék0ó)(eÙûvú7þ:#S8‘¡;1@÷Á<øßÕ_‚¬¶h-¿~”pî i 9M1·Éøãßa:Öó¾ø%˜šQ{l,I`gÝ‹±‚B:å}í‡&P J^½g°ÅÆ’'`÷ZöäYK@éaˆ—4>÷w`û Ý…»t/ÝÒ€¨`fšàü]ö6¬ö¢ycÊy¿ð Å[Ëò2˜ãÙ'`äaXzIcõ ÔÅÔP›KòÀ–öEÌ®BvWí4"þÍ+ZÔW—”帹,Ð2ÿ†Ï¢üôsžÏ“—Ê)¥Ýu+O3w¡'å77[wÄÖ ÔÇÔ&í¶<¯ï|[ß»ðÙ›»7Õ¾Çàꢒ5†ÑÿfN+óµ˜÷a¾h’eÙÕ¨ä5œ·ÓÁî ¨-Êæå[MÞî‘‹¼üÚmÍ0@\€P_’h3@ñà€ºÍY†s$o§ßæD*ï D´‰y›7»h#ô„ýïe$!Ð…Ö€AœÈ%Èæ;ÞõA6tÞÇhÕªt@©Tbaaáèï;wîpùòeúûûéïïçüƒÀç>÷9FGGY^^æïý½¿ÇÀÀ?ôC?@:æ/ÿå¿ÌßþÛ›L&C??ó3?Ãùóç²ãþ,û`é=.Ã!…&‡[€ÈsÔ…46N#Â÷y4Ñ>Ü@š=“÷|ö. ¿A?špãpTV%Ï´ˆâã鑞ÂÁ Oé Ù²e;ö"ôOÀæ<ì-øb·]]¨ÈY0±4ÕW®ÕØüÁ‹°|I)áÑ´S¾L9 Ir”wd,÷–dØb¦ý’ê3"kºO¡púìkž'•ê©ykCmS¯¨p[ÓÚ¹ÄÇìY3#‚¨©’Aˆ¶dÜRQØ®ycXÃJEY|hB»ñÓ €@ Õ´(Ξ‡< "±qÛÕº‚¢Í†<=Qh×¼ߥCÚѯÔØòhqhwZº^«©Å'¿-~ÊþŽvÜ€AW¶¤Q‡W¿êÓÃkíÈóY½×¨k—¾pE^†õm©9Oœða× e-n-ë:-®°q³ÔÇA‘ý dRŠûšyKê£ü6ô £ŒÇzI"¥cQ}ë ¤Ÿ½¨ì²¾9…´ò‹úÜÇþ!ìÍk\E{!wn_"5‘Á‹9ÏœÏ/Ò2€ŒÂÆm•! «ßÖ½vðʼn›h÷>’vU2=I-èºÚ¬Óö?'äQ©Ø :MCá.äjT-<¼³gIydÊóÆŽÏ+Y­¨[Ÿ‡Á Hâ<óÓòR¬ÁÎ]°0iÌä"¦euó’ÀM­‹+^‚ãäEÍ›_×3D¢9hÍíó¡ ‰|èY¸ò’ús•lf&`~Mx­³§>~áe8?¥qÝi „o.‹³“†Ó¾ê¡Ó´x¿ëG»ãCgï×ùþSŽ7ß|“O|âGÿ­¿õ·øKé/ñ ¿ð \½z•_ù•_aŸÑÑQ>ñ‰Oð›¿ù›¤R©£ïüÜÏý¡PˆýÑ¥R©ð©O}Š_þå_&èäÚÿ û`é=u´Ë]ÂW®~ÓþWD“j ¹kŸAêݳö7ÈØ¹É;h¿¯Ûg&ðÚ<.¿uŒÓú¯µ¨×i„B>ý»Ñ‘ת‰xÊ®€¥‹‡±i”¡Y=*yÑl@ù—H>ó¤B)Ù8õ9Ar\€Ë¥ün.[fNEÆÑm5¡½ñ ½·µ,p°¾ {*düœ·£Š§#soâÝáN+³^€H¤LŒê÷­;9ù¬ÀÕí·Z·ËðÜsª—v­¨qCrí¶ú©;¦…óî’HôKºhÂø^'±^¸þ[_—fð,|ùçàüy‘æ>¥-xýç´ò‡8ªñ³~Yà%3¢~îù,¥¨¿þuú§ šW˜¦Y?Ê-ØA¼aŠ 0½‚žçxò»â½¸"°‰”WŠÞ^³4ú./‚Øl@ädn¾¢Á—‚€údJÙXé~õәnjpʰõFŽH úŸ¦u#Kðà%­¾ÿš¼eö® 8^YªOU£3S}ð±&òÚ5퉜úß…ÓºÓPïŠqæÓÓ,|i‡§ýgYúßþ>k×ÕÇÉͱý-ô«kVÏ 0Ü¥ûÈyxãßi|ï·´`W€Ì]U½½éS7ùŠÆÞ–ªÃ¢ÞÄ”¡72#Oäà¤Ú³°' 50®q:lIy|å¦î7‘ò»¥‚æâ­KêÇjb7oÁcÏÂàYÒy¶]-ÌN[÷!.(­¼Kµ»†ç'9ÛS1Û½ƒ’DêH/‹×¸ë oÒo Ì·[öÿ!M&Ðæ¯‰’wÞ@v¾†6twø¯çøøÇ?N§ó'#¬¯}íkÿ¿çˆÅb|þóŸçóŸÿüûykïËqŸ³ôŽu¼fG_¬²y@¶ÐDšA“Éé(‘±ÂËÞ—Püû¸ýþ›ˆÃÔD í>2„nwÒF“ةѶ€P»M¤«­"˜¶³nTe`ÂØž‡k/ʈgÆlwßÀÔËNÂøcÄO¥rTšwûÕWäYj”N @ÃH«½ƒ¦8õ$ÚN[Æ-–4‚eÊ+2¾Kïhñ™Ñ}8£ÖÂsÚÈàgí™]¸óŽÝjÖzM¼‡ü®„‰–Y‡ª‰œ˜‚s—o˜vPÔ—×(t_©>óàÂÎ|Žìr‹V.¿)0±½¦ç `2Öݤi¿·íYú´ÈÅ}±Î&pkÑ2{–•iÕ¨ 8QÂõÇÝ›º¿©¨ÆÅFÁ{ JÝg«¥kŒÏyÐ4sÆÂ¡EŸa–ÛÒ=,\8—†Ù8Œ[ zï ÑøœÛñn…:n_–7”EÆvAá׊Á”¾}ñIغKYxë—`û \}šPž!üÚ×J»Ó¦Ñø«/+Õ›~ 9Þ[!gºRaµŸ­äøb9Óæj·½€¤ ùVÊ £¥ûrdöT°UfÈé>÷wÔN•’Úsô¦+eS\ŸÏ1rº+Y6ïÀÒ+’âà7ÿ:TrToÖˆDƼsMÞ']Ь«ßÊ=Oî*pgMãÁ¥ß¯ÎC£X¦2U÷úÛÿˆƒ5sZ`¡oȲ*Íþì£q¤ñ¤@YÄv\µŠ>?×u{íµ†±,Wô¿b^`(S;85üb^`ý‰ïrŠÞióÒ{PãÆe_ìÉ37s†£ƒ£30:+X¥¤ûw\¼á)KŒ©¨¯JEK°8w>'•Ž*DL» ×K5–Õ‹~¡ä/_'gåH™»ŽÁuáCüQdÓ÷цmÂÆ× T²×滋—Ùîuä¹_°×¥#0–Ç+„ÇŸµ‚÷÷úq,½‡Ã ä9÷íðY4ÁœFÇ;üÌŸ@€ 4¡\Y“dø‡‘ÈÙàÀ8pTCÎq›ø4t‡×@8‘ +Þ È(»ìŸ´e¼eWd¸\†I!gÊÐC‹mÄ$Ô—!ºö"ú ðõKæFËBÎ+GR Y,=¸v¨ë$Ó&XñukY›-íNãI# ÈÖì¹úñJÙTºÔ{Ç÷Rc£¬B¶™!y@âI-ø™~¯j=2£Ÿ‡ª;åkBkÙ+=1"ã|ö è;3K0 ±ö †ä5ÑnöüYy½*öÿ{Ebê÷î´>72£Å)ŒÀHŸ‘ºã>¼ç ¿öØ+Ó¢´°¥L¿¶n—bN?!00ÿ¼µ,õã|V‹YvEZ5N`~CçoTµ8¬nAÑÊj„"°_–K=qÖIô¥}ÿ:Rôú‚®_Zn~î!êÜgás¿ãqû÷0…å߯Qˆ?ÎÒËþ~›à7–ôÚß`J^ŠZµ‰“±žÒâÞ;è¹W.#4bómïá]ökχEó¢ìȋѨ 8T­tLµljï( ]ØôõÏ.|D€tôL>—&Ñ} =¬r.”¡l ª^Óµr›PÏAî…EòY kUõþáçÛ¬ÎëéA¼{—¤ñ†àáyi»›Bò¢qI5Còân.kܮކÛ7lŒ¢ýFŠ©Ì¨ÆÅþ†l·áÉGa$®Äˆ°^ÓBP{•÷Mwª Û˜¿¦ûÏ®¨÷w<(u *ÕJÁ¾ù†@ÛôI˜ýÁÇéŠ3€Œv©,ƒèxb»-Xoù~Ñ*úê´jêUxãkÌ]°  cVzµSwZ àÄœ'cÏœQ[…Â>½xÐÚâÒU¸r ¾³ ßÉë<Ó]âh½±"ÜB 皃Ä»Äß/¤MÕl€´mìvÚ^ñúÞŒ»cçÕ–™_¼´Vø¸þš<ßø=k¥¤qâBl;ë°?ôü‘Àãþlìz’|n¾ýUÓý]yõ¶æ¡:ß:Ê~Z¼"Ï#«»gëF)ì.éaî¸~ ÎØÈŒ^·×Z¶¯AìDhBsÁÍ%˜{Hœ$'càJu´Û>ƒ‘ÀSnSŸ@@ãë §k4ëúÜAÎÈôæÂtA¶Ñ ö'ç@Ïã àŽ ÉêR×GÃ&ÚáTŠÌÓOœ|Ö‡ãØ!Ò(Zøã6úSæaCêæó‚:>Ô÷ÌÓ°ÜÑX0ݦJY÷±½ª¿c iYÕ¬ý«%m´Öt?NÀ46°|]ž¡ û20.31ޤ5²+zðÙ^“ÄaQÏ}ö ‰WÖ«¾6aÓ4²b&FÚîh|Üx¾ño€åaø!‚¾@£¦~q52{Ξ!1=}T§ÓÍ['àÀj ?¯÷ÌþÎY›Î (À¨Ù¤0cH”Öf9¼„¯ÆðeÔŸÝh]p›Âêx_5–ìuÿðÇ}°ô—:žÆœ7Ñ.£†&[Ï·¹‚¼9¼FÒ Z]Êû2€[vþ>ûxðàîšx ¸´Äþ­[GÙPNÀÍ•øh5¡wNX ˆ íeåvg¥¯Áò‹Ôߺ« ©]- Ñ8l_’áê´MAºìKJ4j02\çu%öw¤"ŽÈ ï Ó+¯Ã†ñ ê ½çsÙsgÑb8 ѹ´ÚðÔ#01e™wˆàí< Wn‰™vQ:¬² O>cZFTÂaõA&éëw…"оñÇ  j×¾j÷r€ÆpTà#‹)Wpó‘¿ÇçÞœ®LOF|Œ©SÚÍѽ.^PŠ%}¦Þå—DÜþÚ¢Úâ0’2~Ø=ãÎéÅŒ< ±á ïàwºÀÝŠ ¢àò²ô¡6€¡´J¶ì¶ÔŸ»&dj!§Æ¼¿çUšï!½ƒ"‘/ßÐkuÆgE.¿ò{´š°½a"Œè{­¦éô&Ö´àeW¼wmGíöàGàâ'­|H—žs‘”Ϥõ÷ú»‹–ÆZp]…ûpDÞÐÍo¶ 3cµæl!>©ñÚ†Oéþª–í•Î@°Oú°èÍS}®t %–ÔbÞ;¨ñåÊvLž0Ïp öóR•ÞÝõeIuÈ܃á¤<•Ë õáôWJ\ûêë,]óbå¢@I£®±6=%/•Je´‰+áFÑgm;­û."/]v¾ø²ìÉ(º÷ý†çÔ¸pð½!±p»¡{/ðé<·ãNkÇ o:ïñÖøÌ§{¬š°e\ÚjÝiÍ¡zUo+7ÕžN¼Öñ#kyoÝ×øî†ÆÌÔ)¤ ¹§wBy™ý¿´p‡üæ&E|Ø$n¯Í¥€Íå^{þdׯ™=ºeï9ÙCTae8‡Pºkv,‡ì•›«{x¯UœûÇ÷Êq,½‡#‚v»h¡ ãëÃÝëf­ ]É6ðډđqèEÆËñRî%pgìüyœxZŸ!çª_$fgé=y’fK†È¥h»¸}ÇvÊ—^Ôî»TÐÏjY^¢JùÇÛM"1ý¸ƒœ•ß¹·°êaѧ¾·š ï¥3>‹®ÙÑk5¡7(-™á)yßjö|©¸‘ãm×°gݶ6êÆô‹¬:mŸý…nº2Îñn¸znÞÖÿÖ,Å9¤ëFãpå›p{Cm|ê–â<+ e˜ßÓâQ;„ÎÜGI '¨µä²>íN)Uÿ ¥¿öU+žTƒ Wìmë~*e¹Õy W;¯¬ž+/ ”\zQ #·©Å}ÔÆWoZÏH)lÀë:m¯-Éh;©‚¼ª{ ˜I*¤²Ô±ÞªèsoÙØºS0ÏDP‹ïö†¼ Ý+0PŒÚkhBýúÀYïuŒ%M$´O·ÛZhûŸyžvGÚU¶€¤KåÏgåq¹µ§gÛ]Wß½óªÚÉq°.½¨÷,Sìü”J|Ä€bÆûö\†h±!ȱó–VŽß? }AµÅ³Ø;w«iªæ¶šÐÜ’§üÌiéÕ•œÜäÑ^ˆh,Žë>B™azúûÉXûFñÉ1›Sm›3+÷̯(ªÝYB—K¬?€@iErö½wPöÛ ©Ž˜-ëGk€óΙûïïîqŸ³ôG,MØï§o£É1† à"ÒNºŽ&Q-¾ëhq¢ºÇí<;(åê¿¹ÊØ½øêÕnÆ»sȳT±sC2¬¶mWå¾RÒ{×_“AÚXÒg]j|¼½ç¯q÷-´v[™f.]¿Õôbo{Û2‚ KAe ™×B“Ïê³s °¥3zæCT˜6Þ Q+r›B2oÿ? ËÒ´6«W­b}Ÿ]-„ÛxÒ{aO÷“]Ñ´³!R{¾æ3^.½¨l¸RAmŸD×ç+Ãç^£®“é‡DYí誹GV¿ ÝW ¯êÝo…eצ{pBXÙã‰4d #hÁ›(¸| Ž©ýâI½çÆÕäq/Ápõ†ú9ƒ@ZãXPÄí9;½6.¢ˆÄÝ@»ßI|jtÜÆWÑÆNõG¥µ\º"oÅÝ›FÞ·¶{ýëðð'Ô—{[ …8‚o«©û…už™ú· ŸU[»qV)Á~G`0hí¾²æ=Ž[[ÒJr‹äÀ¸¾ŸLKZ¡m!Ãþ>XÏK_ÈÕ^4NïQáà%°ñ9R×Õ²î#Õ'€ZÌë•ÎЯÏëNÙýs:ïùÃÚu}¶ÙИ¨×,×ôó•9ýˆÆXnSý1¾à쬄#+e%)´ÑÆúl¢KáÜ P¯VY¹y— ;çE2Ý ÃcŸöÁ¹ õA$&Gå FƇúºÓÚ˜ž–7(V?MØ< ã³T–,08á½r9SÝ•ˆeÚB‹éŒlÃä ̨͗úñÁ€ÚµQÓ}»pyfT}•ÛTH.fc Õ§ÿÕ*w®ÉÓuì¼€SnK}:6 å$翟ý7ðâÿDò À^EúU{Åö·›£æ±êxeî†=cÅæÏJýÈfü7HºÄÑÚÈ®7€o"PTCó¯6"=ȬM¨ IDAT#î@ÒïØß{xOôýã{ã¸ïYz‡sáЂùðšû(޾†´˜*h—òëÈ(¾ŒB!³h®Û÷PrPBà!Ž&¥K¥¯âÉß ùÀôžç€Ñ õuõË™Ó 0Ù×ü><Ð8?õˆ¸E.1# ÌX¨SÏ>,ª½¯ÊÛ™î·PfÜ×W,46¶×tîDÊxŽe/ÀêÔ¿7–¬~_Ãøk^Š ÝQ¸mgÃK ´8»˜7onè67šOͺÀÞ ±_ P©©"øúŽMüÆ´÷ž¿Ý™VlŒ×ñ21B^¹=¤öís.4¿j¯WÍNÜåa>¸ã>gé»{Ü÷,½‡£La.ud¼ËhÒÅÑdtB’i|ù’'”ÀÇ·hŸöëÒˆÙy¿ëva)w„ìü¦£Gus“vW¡ŽiäßY—a+䚎=è‹X‚‘Uczm-+þ¿}ÍgA•  7¿é¹ ©>ýHT¯%}ßUV/DþÞ]—^KÿˆOç@F4‘—£sèCKx.W?Þ0¥P¸£˜×wkzfµ¬…` Ø+J?(Ï'[€“ÇËœ]Ú1ï![ôúN“ˆ€»½k¿¸Ìéãuê=¾N•®\ÜP¿P¦‹#ŠÆ»UoídŸîgØ_6uñ^e¶Û°¼¦ÁjK»ûƒ¢ž/—PDYs-– r&<½±¤öÉ[_\YQ›ºqr¯ùâÄÇÉyí‚È»óÀŒe™§ëÌcð•_×x.+»zÞC Tx:„ù×”ýT)k!›9m㨮½ª¾jv¨–½G®^“×êÏONᯯþK…¢ºöÔOü9øÂ?èéNCýÛW™‹cxZcy‘Ûû†uÿË·-$Z…3ê3õ–î=[ƒVÍâK mæ³^Œ”aæ„'ãI-ÚèݽáClŽS•Ïjþä6¦&æôùõÂ`Hϼ».ð×?¤,ºdÊÒéÔÃAµè|í¶ç{; Êj›4°_0os ²Û0h o¹¡þ®U´A8„ͲlÉãamÞ4«€‡ž9ö Õ‚ û1žLyÖÛç áfF¼°líPÏä8Œ±n¯Ê±pa¥¬ñ:<­s·šºÎκηµ,’“6)ïË |ᧆ©^ÉÊfíé<ÃÓ0ñlÿ;•rù΋:·“!©Wå%<¸E䑵‘Yd`H*BO§CaßÓÜ3¶ñ™­àíB yžKöû"Ý3çerŽ<¿ÓøzpNæeª·ÌnôóÁ‚¥ûÙpßÝã¾gé=´•ð%ÞÁgì´Ðαí*Ðd¹CL#èÂ=¨ñ‘[·†»¸”z—ÍἎ·ïë#:8øê걄\Þª-–õT;|·Q< Á¸Ux‘Á<îËE…]²+zÏí#1ËTêXá\¤!ÓjÂüwd\cqM°ËzÖ°Z3‚+V¼KÏ™ÁK1 àÙƒŒŽ;r¶ð5ìù7¨J -¤Íe-Hmà΢þîÒË¥ßK(XÛ6ªÊ|ËLõ16bxJž±]+TzkÃóƃä4jŸ8V>eÙLÖ¯ûyŸV>˜ç剓¥Eä!œÒÎ~hBb…6vV‹ZTW€¯`%ËÛ:÷0_ÖµÎ\ÔóìÛ½Ú÷³hw{/PJØxêÂkLõ Ëc¸¶‰°wã}¾L öõ ¯^Ðw׌о¹¬ñ±»‹×Âä6Mj6×<½+  D*xhJDåg~~ùŸ[AäœÄ o_@/Lñïf,täêäÅ£"Þ‡#ˆÀ^^m6y2­mBHà³+ 1¼Ñ˜{ôY#*×ô¹M‚kZˆ¯½ª0ÕAN¯¦et6 nCÑ“È8òîDà/Ëk28f^Ê„ùá¯'µÚðå=¶–uýÌËm•Ê‘ÒÕ H§4æ·÷äYÜÛ„í-Ÿîî ôF¢0…N€¶©ñ²‹<¥}úÿjEáÎJɇÓ7–Œ¿gaO'îé¼eMããíïÈÖä³;móF7êj¤y{o]’”Cß0GÅ£÷wÔ¾kÖÎ&¦K¤›Øc'9ûq'5J>ôצéÉè:!“ˆÈŒê»­¦Vÿç¿®IUä¨NÜ`ß>¥ÒuÂy•6¦lœŒÙøL¡9¸asÏ%WìÙXš4›á²@:zn3ûa|F]J.)ÇqîßÇ}°ôçÑ9Ž÷2 "êý/×Yr‹NyP\Õ÷ÛhrFÑ‚» c ¯î›Â»û1„—hõÃCêå2QËf d€+%öHLßw¢ΘgW¬”C]æÎ5 '÷¨R– c¥$54¡¿X Ìê<œº(ÔA^‹ÊÛ/ß#,8¬pRÛž¥Š•¨È ì–åwÙ<kKžæúdpÊFÌãu¬B(ãðOigZ7Â]D"/d4Ï?%þÉÚ¼@D í[ÀdP‹bwG[t¼x"¾^U O¾v÷:`YZ£CÜ)zß²õávíÝÊÑÿ¢<çé”ÚcIý‘kÀÉ.-ôiD¾îCxÝÀÙãplF†¸†þwí’ÆÓdÂî3iãqy)ÏØóŽ "–ÐýŒüÈ“ÌþÈ4§žUø- ŒÍXõv;o:%ò¯S_5ÅëŽõ“ ËyL‹á^£›b^Ÿ)×|‰˜)ÄÕùÂÏÁÿO“´zßú÷šK'‡ÔgW^Ò9_ÿh/•¥ó´«ÒÆ’œvˆÓäB 6+·ÖàÎmµ]vÅ‹Fî® °Ü¹!ïÏà„‰öÂæŠ´‹²Û> Ý—uŽ`HÀsGsðâY…ªöw Œ›7ebNméÔ±£ mPz2¾ŒI0¦82r4æ#ÀÝ"Oiìïe xö‹hÜ…‘ö3@c³[ÝiÍÅÓ–Aøâ×`á†ÎÖÍãí5ÍÓ›WõýjCó½ÞP{” ÊRÛ˪¯j‡FÖßV€@›ó”9@Óiëóżxgùüá·aiÃ$<¢RÚ®ê×~iªûä–tß1à+ÀÉG!£ÙWÕÕº‹Æå©Ü\Öu{úXz‡ôkøÌ´C´Ðô wk …E¾‰@R -€ &iMÔ{¿ë”dï½NÃ~¶í=§;SÅ4—ºê–™ã N¦údŒªSÑmkQv…v]ÁÉí5Õh*æañmÛYeÃíÐj^#Ú%»0ÆŠrJ‘¨€Iÿ°¸0ÕC-L#)í°RIÈDalÌóVzð|š42H9䞯ÛÛ:ßu|Ù€(3 t¯É´®wXÔ"½¢vrzÇÎËóåø ;Ǫ)[÷ C¨Sfc©M­¢ðáñ(4tÍ ûü»×~ô]{`\Þ£:¾–Y·[·%ùΫ°ô¢<4Žã¨½&Ã3ßgÅ\Ñ+€'ŽÁÜIÝïéGà[Ëæ…3ç¡;®ç¼´wÙø†ûå½jáõxŽèÚ¡,þëW 9Ìú*HD Í•==ï¨qfƆ§%X)ûëöd´pÕÕÁÍ6°¼§Å£ˆD>]a  v; m.ÝÖÂxö ˜ŽÃm §ÓÔlˆ˜ë’ZŽXvÜSjŸ¢Ï„¼ñ*ìäÕ_.RÅßg 86'ÎÂÙ‹Ü쬙Îy%Çf¼]ýA§Ö¾ŠÂ[©>õ}ï m>jš6¿ ÿ— ÒÆš_Ôï¡°æLnK™Û[ú»e6îïêZS§Œ_­›Ÿ? ÷´“#.uºTNVa q:[ÀI¦å­:‘òU@d—Þ ÿê²<–o¯o-SÇõJ¦Hö,[²ÓÖx-|ݸ™ã&Âi®“`HáÇ…]¸“‡å¢ž!jý‘L+¤+ìKJÇjóëY6—eÃRaKÅÿ÷¯Ó¾|K"™)Ü€f¬[í];´÷^t4€íËKTÖ׈Ü÷ŠRm®&ï½/|ݸ-¼>^^Ú¥…ÆõuûlmH®¡ÍðC®¿Xqq¸|ï÷ÁÒ{8\(¨Œ£+cèv)dÄæ2¬F¹2æÍ—áí×akWÀ¬*¥_ì‡Çû|ÈÔiÀÌ]ðò .¹iýäÂ@‡È³°¾ ]}:Ÿù)xî'|¨cxZ€dÌÆK»­¶&`ö$üáo©¨ÚæÚ’v×ß©È[;fìzi`x@ýR*À#ááóÚý.í*”ò•_þßy¾·[k;j÷ñ>ÝóvA!ÝpXž”›—4^FÓ¾¼F£o¼Ý碈vÞNÞ fJУ]ZÈŽ¨ëèÙÿèE¯± ÚcmY ùÆŠU®‘ ¬,ÁÝëê×®LyUíëoz ê6w­/Šv-§V3åwиwúdñ¨útdJ;Ó3lØX4ŽÏ¡Õ,›õäìÅ K¦°±ÝÄRÑk}¥‚Æï€y+êË'ŽéžÚ}&3 ½©‘}ˆ>àD? #ÀŸKÀJCŸ®Î\~–k"@õû´ÁèEF¡ YGÍ:<1&oËÒš }d0%ÒßuÙ}É •A¶¶èˆƒÈÀ Et®=âIcðÇ4m͸±Ny#Ȱ±„•»E—ẃŒuÐ1ƒWö`»¸ÃýW^‘ad<'ä½<|R\[澫5͉¹%yBc<Ü…•‚!—4›!€¥Š ëW4.v`‡Ý†Œ>›A¸‡æ{O2>á KÎlÜ×K¤òîœÃuþa8”p À„ €Û\•\©WÕçÕ}á²RòN‡"’Y¥t&TWp;ïŠ(7ºÖféöŽê§Óßrî2kÓz–,Ãv‡µÞý3æÇ×Rʬ³¾fÍÜ>€’w6d hجéÃòüã8Z-à?­ŸGÆÒ‡GÆÒG8h…Ñâ‰#!³‡àD\B‹©„vZ3h±YÊÎ=;‚˜`ÛÌÿû¸˜:aÈh=ôìè ÜÛKµ&W>Q«JÀ%ÒJý&d8…Ñ䟟‘Àñúáè%)Îî^8z._64[¨‡‡xŸóV-LfРž—HkwèóÖïE)[® Q—êî¢I/Æ1â6PYˆê¾ñB`8£p¤ƒ¶üÆÀ8ý L7$ˆæÜ¼@ ³#!£$wþúÏ¥ÔÓ]p¬[aÀ­…[Z‹ózß(ôŠå}(°üjª›2@W€Þͽލ0ú0œHÈ †v˜íµ†ÎÐã—'nmQëy‡QK >ÝoÈ`jtït}¤,>²á1Ø™u¯LH‡Pû[¸¢ºº<ÒûûÐ2EMˆ¬½¦MÓÆ’ÖÕYhüúhsUýä{¤³±ë°tYó¾>Ÿþn˜6ô鹡¨¼a©&ttK.MœÏ•õUÊÚeP¶k~Mk¯£Hï˜e{ü¥9¢ÍÖ‡xéÒfî×Í:°¡þ&ÎCÛ|¨oCh“Û… es¥H 5ócsÝQsþ_àx—Ú¹ùq­æO×8{Dðáã‘gé#dm=Ö€-¾)ä%Š£_íPºqž¨„¹‡]t–ºhþ¯ 8ÿÎ8²ž–Œùm?¦cb‚²IÁ E%è:úÌn}OÓ4¬µû†©xC¡–Fš{rŸ–÷&îÑ牴vpÃSÎ`*æ ­A^¥Flˆm·¨ï/>©¿+eaÒY)˜»·Õ¦dêE ë Rfm8o„ÅNT1@Öª!4LѺI›_‡[‹pþÓºÿX; ʰÚkIPËz§ Ý/䓲Yné³ÐþÄ ŸŒ~ù´ú}ò¤< “Z½â ¹0ÂÏ”w iå y¶óÐo°<>àÍ¿»+:§Ý£ûúp„KspõªÁ‘L´Mc8'2ìŒ CvtR¸Ÿ^}×åQöRwŽtJ©Ö¿˜—Áz760÷xõÿ*|g‘2(!Σ²™Ÿ•–Œ™|YÆÉ2pmÍ(:$Šˆ¥]y!HIî•àÈ¿œ~`ŽN ün‹Ï›{Uê·H ª%¸ù'³Ü_ÑF#?-ψ ‰Z%³hÖReAÚÝ]yG÷AÆ‚Å>Þ+£fã¾<o|[çÇ“ÂÝxÌ<{½fŒL¯ÒûóòÀL!£.Ý¥5³±$Ã97¯¾´d²¹¢Öï..„{t•þÉšùf³gB0æ1Ÿ)q´ªù3Ÿ‹1õ¹³ôËH¢¹±pÛdì•À†ò y1Âhcf³kÛÓ“â«×4'šCë÷µ.š¸ÍÙ-C+^©8 c¡"£¼˜‡ŸP˜~Õ0u/ç4o²½:·RÖ»TQQßn[¼¥ìàÊeqÍueº¶|hÍ9¯Wý½S„—¿&’Ñ™+Ú°D,> yêÀ@ ®û[4÷Å÷êéÇßÞù Dmåɲé7ë­ßÃA,-ˆ §Y™;lÎÏ¡òU}fnzÌyÇÌ=ÞE¡ð.þa¶ðGÇ?Žã‘gé#v—ô.®‚u —ßÄ-Â$ìCHÜBl·Sö¢g]ÖÜ?ag<¬›¿mfÆöÝ»ŽG'/oȨ ÷l¯MÃò]SO —aÝÞ§þ¹ü_ …7&¿âÀ© e£= y’n­À+WaÒ„RŽÝ8‚` no¨wMφï\wh+DÁ‹}ÂçxÑ8‰ Wïº8+/•ÇkÜè^'?ú+ÝcuFS2ý¦ŽéÝl;ê ¾6ôY—¼w^c¶Ö ¼w&‡áÍ«Ã*@OÂڱ¤Êâ òû á¾…=öJš? îâß™»Æ IW :½òìÅ’ n,Éãb‹â¶o7䥋¶ÉpÞzýUzGåµ EUÓk~FýýÌ ¡¢ª/î^‡×¾¥wð¢g f5OÕœ­5d4å‘Z2ïþvIó4 ¤pº[s/S³‡Õ¿û;šs%¸p\!,›Ì°S”ñ0Ï]@dyWÄ ÛÈëfy’â)3[ë*TÛ4s³ŒØÐ[“½‰Ã"nÜw¼F÷¡Ü’DZ°ª¾)íʉ& ½ ×jÎAÜ·ÏÞwg8qJ×=û«ðWÿRu8vAá¼Æ}á¸,æo¬Ûd¤"K?Rì©ÌÍÀϹBÚºÖoࡎ~Ô”¢BXÆE³f¢ (l(„œH«ý¹òf1X³CZŸ7 Vn»äîiCÈí a mf©×kêbÖ•:;+£i¯£Ã¢ˆZ”;ᆭQI!d8• ’wÍ0—Ç–ü©íæ)¯7¨à !ËsW6ï l71q3ÇÂ|x³zÍÌÑà=Ó¿{fͼgÚ2„Ú4sõ6®$Ó.I“F½¶ ]1³kRro—òï±ؖL;¼hgk³ãöp¼Tis® ÷•»ê—4ò¸$Þ\•r¦ÄJ© £å̳®ìÊþŽqnzM±¬‘n~SÍ®ïÓhéye´;Ì›¾îE»ïÞŒg¥–Ñ3'è½ïÌÀk©þ_ÎÁ›oèÚ£½0³—ç”~\C!†Ý-½C£®[7ZÂ>Øñ?vFí8ò4\Cå,íæe}·“bÉ7`Á®‹5…X:M_ïU Û´ýß¼ûŠùÛƒ1.‘²Û)iüßÍ„Gî 6ò QÕú®AyÐF«¿cùFöÝ9…zm½>{Ô«j_$®w™@^» ¸s[FÁŽy?¯K&j•–Ǭ¨y—Ž­Ý’n5åÝÊßÔš¸óŽ”ýð”æÜ:2¶üægÁ¼CÂyл/çt¯DF’-éÑÐ5G"†åÜ„¥º²†ñß`Ö‚¨~ût'¼÷ŠŒ¼õûàk5ñ7w”@…{32pJ­³‰“2F7Ñxdû §_Y u½T1¡þ-˜{_ÞdËï•é–­½Ë$V$õì¶ \›×|ØÂy!›È ÔxXª…ÉÓ®8ñnQLÚÁ°á‚2×yÐ\ E´ÎŽtºÒ;æ9©µ¯Õ”ñ¶b6mK¦2€÷ 1¢o¼¥ÌÄå]“‡8ÏÀ¬C ZoxÀãyà…~˜¬4`æ•¥š°àm[JjWAà®™%à{æšYs¿äQ âpL3k«…äÉÇéœyDJù³=Káx˜£çŠù¬…ãvI ¥jC53H±”QÆã8ú)\‘Å0 ™ì¡Å™7÷ìÅíP¸X»}®?›%ÕÛ«¢™U2ÉvS0¶MÙTuÃé IHV÷¥ŒŠE y¯ºG”Z]­èy¡¨”J¹ì²º,‹-‡°×2ìÂkR&Û‡£ïÓ.%œ‚ð#¥swÓ•ÏHwÁ±+Å”shÈ;xå?É@J¤•˜êpìÇÑ€éÛ¦o—gÁãýpva³ §ÏÃí2Š–p¥ À˃÷IC<3×eh_½,ÏÖÀ„Æg  {-¸uÝ)ÚdÞ;A¶Osª|P†[óðæ’øˆ6õîñ€²ðz#N9­¢6Ô6N¯yaA|W“f]ì›ñ µ–! ÜÕÜÞÎ˃´]RÞºªä…%—¯é¹~¤Ä 8ÏÕ¸O”OLŠ%ÛçWÈ4ÕaH>¨ŒîÿÉÏÃ…_4ôexóò*=(|kúTægxãšÆW†ÇÒœÞ=šlѬ7µQ©©-‰´ú¹wTk3‘VŸdÚ…3Ìtë§ÕÔ¼Ø^8,ãeiN^¤¹ë°¹)ãëµ× @Ý€£ÇÃ;7MhßÌÓˆ ™uùμ €dF¡ÄÿP”–²L]3&Q$û:“êÃLÖgÜŒÛÄ0LuËØ8 ¶Gbpñ9½÷ú’Œm/ê¯t—æye‚½K¹¦wÞØPfàÝë@RýVÝÞÃSß®'?¦}5œ—(…3Žòh“j1§Ã¸lçO™k,Ç$ÓßBÆ¥•]a½ ¹0ƒó–ÇO•c©ù( ÷wGÆÒG8²hò×Ð"‹âjµe‘p°Ù&yD3çì¢]ÈQœBÜ7ç/¡…—B®|›Õ4ßp¨áB-`¿Tb«PаesCÂfà€Þ÷ï@GÖ”)X•€NuHxßÛ„Û†  …²º‚†°ònQ ¡ñÙœìžÃ½÷´Æúa½aRÃGáÈãHm~,•B »“³|J ”Þ‰c5¿‰î1Þi¿#Œ<`Þk SÐ#®²Ë/+d Cÿ æØÂ-õu«©s->q£¥gUÑ3V–L™ !ùõºŸ¡SiFk~ø|P(#eMÙ³ƒJ¤f.njCÑ–‘AêÞ¿®ðëjÞÜÕf)ÑüMzä™Ï©ÔÉw¿-Ϙ8@çnïGCÙŒÏÒœž“N =¿¢÷SÎÍ“¡1…÷R†5þîûš¯ûf|[Mµéòõ¡×ëú<S(µºï6YK‹¦ÚAÆÕ–ôãÊò4n ã iÈH¦X¹ëi¬—*Ïß©i>[GÏø ®cA*Ž£Â’=£HN­#ïh7Ž©¾‰ ª’ û|¼ž¥GÇÏöxd,}„£€ü–ƒ#†¼D¶TE -Èq»¾„ÎM¤(\@À5´8§Ìý æËlCx ´h-fcÇ| ˆ„ð /­bÞÑç0 k pûº ˆüò‡ Hz½ò‚T÷%hFÃhZ€ã OåêU88ªû–  \øE3  gP‚|¯äj%Yþ#Ð[Ãñ‘ä‘i=rŒ· Ä †¥ôŠy1QÔý&¤äoãH «„e„÷±d¯BB«F‰T÷òK¡]yê•Åôe0¿Ò7ÔàA,“Ô‰¼BàÛ¯jçü¼©e‡!Ù5b¦íýãR¶mèú<òþ‚nÇ™Ši÷¼^6õÙüðíoè»æ¾êïõ™4ê…œê¥Y‚ÒŠ™7WLŸ¿U”B·Ø$›ª¾4«‹<¨®^2sÖâ9PmZû™ó*8ŽiNÙTkKŽEÀ[릯¬¯óÎŒBl6ó+ƒÄÖªRăÇ+ß588œb²ä€1dŒÔZRB¹¢î›í3…\ &ˆÖ×&×fÓ0x`«f€Íæ=Û2†Û`Ó’ÈH¬ /MÍ£d»!ݬh컇d|7l?"ïC¾¥qž]2ETKŸÍ5y7v·dPO’%mžÙÑ ÃGºyóÇÚ°x¼°S¬rïõ{\C¼M[†lõƌˆo-iÞôŽ =ð«Çi55¶ws÷˜™_‹-'‹6*òŸ…µ–ÖWÉ“<«©o6–fïí„¡võÙä$L†T.ÆëwÜg#£êËë78=íÐéÑÚ&Ôõš‘I8|˜×u?¬ÂÞí†ìþÍý£ îÇîÃpÆíj4ЯX‚.Ÿ¼f”ä}*Ì,Pß\ÁTXà»eónàXý-nÉfzpp‹<’)›fžn ¾ž@¸¥¼×3è}}¦_-V \„àã8…á~¶Ç#cé#6Ý4† ‰í"# ¹—[h7½Œ€}E$»Ðâ»|ËÜ/cìZÌkæo‹Í!!®dGhú|Ô¼^GôhP© a•é–«Ü b®Û+‰›ÅºŒó%…^-…­’íüÖkß18‚`H «ÑÐúÆ_ \:0(¡Zi‰¸Ðº¯(ƒ¤Ê‡ É&2ø:q€ïn¤@.ô‹¸3†<¥‚Ë´;ô˜až~ßiÝ*ˆ#èÆœá‚1}ñæ«rË/ç ˜y)ÚL!Þ¥þš›µ`;MŸ»2º»]*ûÀ ½x˜t—øoüŸ>~é3gðÚ«òòŒj «À;oÀßþPÆf4áHA+ÈCŒfÆG͘ïš4wTdx·,ÆâÙ÷”êþÊ_Âây·Ì»Ý4ódˆÙÌÂM31sÈz)ø†<‡Si……­âò˜ùå3ïQÇ1$çnÈàxû-Íõv3v×€~…@×Õ÷§&84hp0¨àp¯_ðÚ†úf&³+¢—ˆšõ1€Œì&RH]òÂÜCcQE}X4ˆy˜~8f°7‰´æ†1Tw«dÈ•ëâ{?*h,½IµsrX^§LÀäk­‹k?R«l¨ìûFÍ;åW¬ŒŒk0¿Ùr…”·Öuþ=bꇾ~˜ˆ)üÔ¨Ã|šá0ûGJ‰%?Ó­ö^ÙTbÅÖ:ÌÌi-ý‡ù.ws2lè¾Ç¹ŠÆ÷¡ Íþ Ätny™,‰d"Š ÷ kü-sù¦IɃDZshijey}öZ&ä_ѲŒþ—•¶rn¯¨¿ëU—ˆ±8k 1—´y8`À‹6krá6<þ”)ê l–áèɬH ŠËzöNp Oûº ¹YÌ’ý{‡5J"9¼cÆÒ¦‡¢y_ÂÕÊÒ»9#°°ê²÷J©[×ýnIŸ}ó5µïê÷]&×¶iÓ=œà3}܇ãÛÇy—v€·jòÊ`æšåZ ã8À0síò[š+÷ï(Sj<¦¶ÅQ?ß]4gG¥P—þó›xý枸$ÃatÔaýÂHqç'i±%ß4ó#Kå~gMÿƒKnX/ k“o¸Ðô@R!ç¾qÆ^¯æÝb´Ž&LI»föV³Ùj££0u¦ÎÉ xNÙ…ö¹ï/9oªeÏ^ÁÐu °åФ+G4qRLãwo*„vãM¸úš²&ëæ—ÁvâIyˆ²}š»CiHzwéØþ;& Õ’î›>ÜjÁëk?¶cÖ”õð>ù ¢)°¼f!Õ5ŒáŠoì*· ̵Émo ’Ç©ÕÞ©qµT$Ë9>í]2r¢ XÞÔ8-ÍÉóUÙƒ“gÔáÜYÔµk °fRþw›-ÉCWë¤^uå™, ½Q—qÂá;[¦­Ñ6A *h¼‚a­õdîUË}ÀíÜe»¡¾«ãJºTq^¦¹‡¥*i3sû2à×qÉ8"ʪiÇž9ça æ[h ÚŒ@›aùq0K?Û㑱ô[‚Ä‹KóŸC ¦-Š;hQÂWÐN¼yZÂÈë”Ç·õ %bKOج¬$äm zWæ#”NÓêì| à¢ Ÿ@ÐðÂlÈ8ë×ÂÞØ€¿ýª¸†j8°xa\ œ =§ŽpX0»ÅâºRyeÇYO•M7÷o=3 ~èÅí®™ßU\X,–a7p@g£ þÜÚÕ½WïÉXh4àÇ.[nÂk6%Ȭ«¸Uyc–á!(ôq¿ ±;sŒP$ò¬ºU†äÆ›R´¹›—у¦úxlRJÌ”o«)õ<¦<ò² LÈȳnþ*RŽ!¤œ·vŸÓ­švÛ6¤º‡®ú¸Â(›5yÿìn¸ çµ9ì×3lN 8Ò®óRfîìšy·… ýó™ù—CÆÈpmFãIAö™k:Í3Vïq3ø‹O±zOÀÜhÂy(»BŽ™¾ˆk_ÆôÉ6®LÉm3¿-=‡Ýœl£ŒR“ÍÏ\ï¸ì¡ƒ 5W‘ÂË#ÏO®¨1¹‹<ÉŒ”ûý;2·7F1‚— ãvW:h½ìÊìѺ^,‰¥Üy?úLqh0¬5 è],¾qè ©hB8›FÝ% ±”zâ‚zù[¯Ùë->oƬ3¤>Y­ '4sEk`dXïY®èñ¤<—¹%ä­W×zû;gذ–‡¢2xß™•Ÿd“½·×/Y·mx¬ºÏ¤12ò Ü”M2iá°“;8Þ¼’)Ö.X5ómÕ}kG2|ܼ»a Ӵgçí´5>-ÈÛz?®ãQîg{<2–>ÂaSGú,„㋉¡ÅTG;æˆùû:ò¤D‘çiWK.Š ‰=T”Ñ2Ïòaâ´dxÙx¸¿¼ÌVNÅ"7ÑnËã•€Þ+9®’t—”ãnáÚ¸}¾$ancë#Gä9Zİ-(³-#RñÅt Jñú¦°&A×SÛ-/‰WjãzÖ2¦ðlSÆ]0¤tøÇ~Nž†¬±†âG*YÙƒÛoKè­ãºhW_ª¸Zq¸Ð¥8pXBurRŠà½«Ž@tý¯ÞÙánQy»Ú¡oÔ‘LÖ«ò˜ÝþË]šUñ¹ ùݹ,.ï>T.Á§~Ù5Ùq‰´ž“JbÊEãýZ€¡A8Ü2Z¶ÑokT¼n²ÒÚ]a×]H~ÀüîŒÉ°êŽè³_<¬q[ÝtáâócÙã æ/.1K£búa¸}[¤œvîFÌ{– ðã¿€w߀õï|‹`޹£ù2qRFå@Z‚”Y½fœ¶17ˆÂÇqå7ÌÜŸDkeȼ_ļC¦]F@².Ï›ׅ±;Ý £p,« À˜é». h]Ê|¦&bá–ÖK,#i? 9×›† OÉ{”Ê*ƒËq[8þ1)S»¡©U]Z~¥"æë#íúî`Ú†dà]ý¾ŒPh®T€·^ÛåÆÈZMï3Ø­ðïTÀe6v!ã¸zHhÞ7!óë9q$¤öÍï΄)˜'Äã”î’‘OÊà¬×`èYÛy­±b –rJi6u¯Gô.®ï¹OéžÅ¼ ù%Ýo8b¼’I‡Aj¢1ùî·ÕÖJ{¹_–Œ † wffaô€JíØbÎÑ7$'öæî°9?OÉ äÞ1sÚnŠfþYo4ÿwmêÞ7s/m~ì<ˆóìh?º·Ëz”LY;xÄúüéø¹3–¾ô¥/122B8æôéÓ¼òÊ+ÿÅó¿öµ¯155E(bjjНýëúþ©§žâOÿôOÉårx<žŸèÒ8í nÁâ—æ—RÇÏ3€v^6ûë.RˆV!| Ù(Z˜cH¡E Ïrw€võ áÕ:ûûIOL€¹4¡L¤t§vÔ‹w$àZMxlT‚ª†EÌ C(;©†„à7†µa»ƒÉj·woVm÷#áºS”²)LæO\‚Ù„ÔsË—Ó‰vÂM ÷ICB±˜— þÛ_Ò®?–PÖ[[n^^)Õ!ÏJ…Ÿ¬k} ½Ó/ PÿÄYÕÁ„vÁñ”ñrÎ\[@üñKø Â(ý{ySœ7ÁÂ$ÞJ±ýÇ/Ãë/+d0 ®§X2¡˜¼@ÃSúæŠÆÂç—QônÉpù¤è Lùef‡5ƇšÚW@¯O†ZºK¼;–ÿÇz\fÍø4êRœÇŸGÓ;×á×ÎC*¢6¶#B[rÇf)“2°T vNXn˜`e^Ô „;i™y”ˆé½÷Jª÷äÿ>M¶W×Ý/ðŽ#h¼Ý(vä1M˜9}¸p@ÆMo§ÃñM˜s»÷9¾þõ¯ó«¿ú«¼úꫜ;wî§ö^³h_3¿mˆÉÒt!c €#«\Ä•T˜B‹ñ«(#.œ6çÚl‹+æºI¤½8Öè²¹¦Ýü½|ïsÿÚ¡µšŽûçêM)—zÕàgp;ž!é ( ¸°!S,¨b " nÀÔ)öTÍ”Z ÄéõË8Û)*ôtó]¶àácYepíàhŽC”`Ã:¾§°ŠÇ+ÏL*­,b^ ÕÕyÇ߇`33À¨ñ$ &œí»£¾ùà]õç}síT–_}U›H©l#¾pK}¹RR?¤pX‡÷—`åß+» ¤Â†SÉ_6ê䑸2¢ «p®ªÝñB꛺.Ò‚®SvæiüHa‰p.+|H¶:à/þXmõãv涺ꮾÜê¼æÛ7Þpu×€ô-µÁ–xaÚ„8ça¸é4\/È k Ã>ã90a^ѹ5´ù»ö|ú>jЕ֠ùŠúâ½+zWÆJ˜ßGe8©±¯îCó*¬šmyWV¡Ÿ»ï›âÈõP§úyþá2¨­)d$³jW …’2ÒVrÓMN[¬iÍÆ“úY¸%rÖ½ŠB‰]ƒ2 ,£t*«uôkÓ¢ ثɈZ[гmöc%ú7Duqõ5•!qãMq3m,é©L ¹ý}²ï¼ÃÁ£zfqEDcc|—+ºW@†×œ¥‘ÆU°—«ó.¹`½ |VG¯ŒÅÍ5)÷ò®äÎÖ†Þ%šq”0kàƒŠ¼zÃSšcᘠ³«ÀxËdôv‹6¤ÙtÌí©èh)»îú5èÎj\«fŽŒEL ––6k›<(sð1½÷v^g[5x'ç¹£°´ÝMɈ꾮óz%OîåÖˆ4›Â%Ù0œ î˜ÿh>¯ ¹ŸAë/мK÷pžì*’¾hÆ» …ë ¬ëA1ïûý_Âñl=:þû?~®¤jEï²xG‡jMeU.—‡¦;¢±ð£MÈÜ5XÙиïnk¾Hà‹Å¨òa#ÖfÂP?…ÌÉâ8¢*hø€o hϬ}뾃ó<…Q$³6­^ÉN>ôã8š­ŸþÏ£Ã?7ÆRµZåÊ•+<ÿüóúüùçŸçµ×^û¯yýõ×ÿÞù/¼ðÂÿçù?éDñyËCãCNJhÇÌÿ~´+9‡:¸Y½È;tBk¸"»Ö[eÉ/}È€Êàj*µ`Ü\\¤xë ¹jÂcưHD$¨ö¶…1ºµf²b0 ­e¼H –ÛBr«{0ñ cí‚Qf[.¤ê¥‚}[Z óömÚÃ}6Tæ5÷µÏBCÆ@¦GŠø­YíÖhÊAØb–m)«L¼_k@CÄhðY%$¸m9‰•œá}JÂü®ŒÞ´îki"@áÚ5¼{{Úq6ÄF¾mÆçÝyW+Ê™ûÈN˜Ï:Q?'32Ò†jW¾²Kxí2ÌÍKÉTÊ mm¨ði$¦L¬¾qõýNQ!¯*R$÷æä¹H›@n Q³h‡;¼‚v¸÷Q¡Ù˜éû.s~)šñv½_Ï Æ/¿¬r!żá°ÓØ ›¶v£G]MÀ3O Ó• é¾Ö%½¼?3C)ËÉÔh(¼Z@!E›Åva²2K•r¹ò]xå²ÖLMăá¸úÄ–… ù”·¹bê“uH!wOþ²ú,4¼[fý]~U×oçåYyâ¤ðfv³R*ð ÃqhÐ`½Ìü¿öšŒ­…[2Þ¼ /ÿ™Òã÷PÒD× ÆëS'á@· '|2îæù }¿·«ù:oÖ3À÷rÃ%³¶gêuÞÛØ sÊ=|°è°V»ESzH˰]ÐÄåZ6¨¢j§eB·û+šg^¯ÊÂJ2xÝ€Üçf”Öÿ껚Kó»pÏ„ðòËÚLt Âáag\ ˜¶än*ôºöcHùdȤÓãDZs(_“¨”e´…¢Æùëjã[߇ÙEÎ!x¯¡ÙhïјøÐ8o®ªöÜÌmç kÖë¤ý ÀÍûYf~v³,I3Š8†î2.kî³vÌX4Ñ&Ø2Î÷¡ŒÎQ4wÊff!sÇ@lÁÓÉŒ„×ÊŠÚÕD¡³V\Ü0&.žå%hŸ‘×áîu)ŸZ:í‚WçeødåY²‚Ë‚½c(ÜQÝ×õSYDÞkòÐ¥Ì3·óìYÂtÚ~ÈÑ5ÝÛ–É/+³mæ¶·bKÆK ¾`hˆýÙY*{{Ò»Ã8ag3\<Èø°c3‚BEçdzÔk@î•t]Ý£'#ãïÙªs¶Öå]¸ú}íÚ[MyoÚ0åZ|puúBP7ž¡ Ï¤[‡wÝNvÕüFåqDÍШKÑ”w¸Î/|[ÉdØ¡ÐS{¶g5'}2L[8 K)ï•`¡¦~Ÿ4óµ3s]]4–—éżS@†ºÏ¿tRسîœ~ÚÔp«(äOj¾üׯ32®”͘¥ÀzÊpô¼ÀãżÚUÌÃáÓzNî†<{ó?römC¼¡k‡âꯑâ6xû»RäÛ3Í ”ë÷¡Ûž†á×1›t—ó`ZÆ™%.\J¦Ïþêªúÿð‰•‚øœFŽÀÌU5Qà|·'ïâ<·cHÉ&¼^Âߟ•±çGƧL]“°aÐäñlׄêJjl·mW÷uN"¦Pn©à¸Æ:ddl­k¬êT]Cô¶ôÐŽY‡K Ø_“ñ:zX}ÝLŒÁ{³òZ[|_Øl¶ÖM·ŒBd¥‚<ÛO–ܹñ&äÊðôYá$#¦ZM­Ù(Údu"Ï”-ÆhmOBÎdkNSË…EÈ$a·Zåæ~ówÜÖ}kà”µlvã6Ž:` yw (ÜèÃUQE–ìr½ïÚ'—qI6„÷èøÇqüÜx–ìñwAØ­Vë¿Ìþ¯=ÿ¿tìíí±¸¸øàçþ}E  N¥8uø01¿ŸS'N>sò$­`ðÔ½ííüÏCC, Îdè8tˆ‹á0çNž$ œ­B§OÓôœ:E*g|b‚Dw7¾Þ^jããT 2½½¼^úΜ¡·ÒgÏJFHž¢}¼“zbZb”L{;íÇŽ‘ê2øØc„αÇ/Ñ×ÞÎúä1GF884DìÄ ®µR¤/~‚9‡ÎO~’1àÂSO‘H$Ø9u ïÀ™CãŒ<„£Óx\ p·þ´2°>ÍêJ”áóçˆôö2vð gå©þN>þ8X„þža`êcÏðþ[AJ™KT|´…‰ â¤Ïž¥=‘ û̳tU«œzöY"^/£Ÿü$ÅD;‡?Чþ×Q|Ý£´Ÿ:Ez´ÄÓ”Š^ª£ÏO‚gê9®¼ÖFòÜ9ŸdòÓ“D#=Ö‰ïÐ'Èö9øüóÂZyž`"ÊÞÉKÌyúØ?Ldü0ÇúðŒ_âîí(Þc/p¹ûϾÀ^0È/ý‹§ d:‰:I|r2Ã=N¬+ÉÄô4ƒÓÓ´¼¤žyž@{;ÝgϧÜ{€úà å,¾cÏ34å£szš:01=M8™$~áýCC˜š¢çÄ ®—º Ÿø${¡ߟæÊU蘞¦2ò Ÿ èë£uìmGŽÐ?0À…'ž 32=MÍãaà…ðL=ó ­ÎN2§N1:9Imt”ڙlj÷¤H=5?#/N“òxèÿì§ÈŒ·:sŽèØ»£ðŸa£ÑAÏôs6ütMOÓhÁ1M¢7AÛÙKÜ 1~tŠÉ'¨õôùä' „Ûž¦88=M#¡ÿ©§ÈŒô;N¥ý0Íô Ç~ù{õýÓiFŽ@ðô4•J€|êYê‘Nê=§I™d'0JôØ9©4zŸ"ç§iËÀ‘éiÖ6Ót}âm“£ NNrì<ͱ‹ô>÷,[~?ÿ‡i†ÂvÏ4¡Dÿ¡Kl5ivfòìî%Š#ú§§I¤aô³ŸÅÛÑAûSOíé!tü8SSŒ2ué­D‚©éiö€Ç¦§ ûý<ûÜsôut0zæ côñä¹s µ·sîSŸbÆãáŸOONOOÓŸJ1ôøã±ý}z²1êÅ"»¡ÿãçS|å›Û¤c1Ò• [>›þZ§Ž†)Þßau¿Z±H(™d{›Þ¾8k+ev¶[-bÍ&Ñ`ØÞÙ¡8»+ÛÜ ´Ñµ½ÍB"gol0ˆ¿Ù¤ÙjáñûiV*¤¤}ÿ=cA~ôS æ>Øe?âZ½NŸÇÀ×Ëøxýj˜Dd—÷fã¬îìÐãÛÝ%Ý&­‰{9õ¿]àß{•þÉóïï³´!¿·Çx_”w–ÊdÃaNLV?á£Thñ¿nÑôùhV«¤Âa(—pûN™ŽT„Ýí ¿_³I0 5/ÛµÑPö÷!Æ·¿O=æh²ÂJ!@®Ñ íñpj ¦Î6¹w'ÀÜÛ „X¬Tˆ†BÄ«U|žzE¯—~ Ôlâ÷ùˆúkLœ WY^rõ½*@€X½Î¯— ÛjÑçõÒoÐ5äçýBKKKÔëuÒ~?™Fƒ~ÍK­Òâåÿ§EGÖ‹×Ûä~ÞG¶Îζ`¨Ay×G$ÖÀëó2yªEî¦Â“þ@‹xÚK¹Ôäö{>ú†6¼,› vzY]k’Œz9 ¥Í˵¥º‡µV‹c*{-’Y‰T‹®AèœRÆå\ F°Praã.̶\ÈÛ–ÁØG!ê yD®|WòÀƒ«è6©àÍ7ä!±^IKÄZDÞä5\ølÑÜcØÜ£ìó±Jq/Ÿ'…<"aàüI…Àn]UæXGŸVBwíÝð®aZOšçí‡ùE½ëQeÝÿ´< ÷>€ïÝÔwYä銛÷ð›gw$àƒ’Þ÷ô%W,zaÚŒÇj`B÷ÛZÛ|<)/ÒrY &–Ô²`<’%=,çÄâ>b0K…¢’MÆÚ¼=ãæ³Ü y53=zÖàAÿ“=¯VUßL†oß QjµU«là¸Äöp\M)à36kˆˆ2‹ã`ZC^¡!sŽeüŽ£ÛBøÓë(3®ˆ¢ ö°ýXŽf³¼½±A±X¤­­íÐ:ÿíÇöö6Éd’¯Å!ö“ù þÁc·ÿd‡Ÿé»ÿ÷tüÜKçÎãôéÓ|éK_zðÙÔÔŸýìgùƒ?øƒ¿wþ‹/¾H©Tâ›ßüæƒÏ¦§§I¥RüÙŸýÙõówvvØÚÚzð©TbjjŠ .mºÇäk ïã(Ô–@‹h ®Êª¨£…ÞC¡·cÀ@peÇK7µä-œPî3Ïlo§ ÂÊ àdL‚cü¸î±4'èó‹Ô0ËbózURce$ín ÛP2ϰµËÊ; #üøšȰG ò GnwÇMçêŽ`ÈM›-v ówèÿƒ)Ìæñ r¿¢ë˜ºV†o)‘†Ï ÄÛhÉ¿ST¨¦^……²úɦ½qDr~\X«=bÞÅ ÿô!ü¥Å¥2õš©×33ŽÛ*|ò¨Âër¹‡ÌEM¿9/eÙÿâi(oÀ{\U8™o}Ã…lýˆ@pmQcs×0*w¡¢­WX5㸫ûŸ8$°x$®ÔnYÂy*¢Šì]8~${íWè©Ù`öœé"b‡_î=s@`åö.)ª‰“jOaUJz¦¢~ YŸ²Ð–€_yR¡ïî^bëÕWiš¾?|HR¯ü…æÖ‰ó¯Ù÷Ä2½`æõɤRÌ›ÉßÙ¯°M¥,å8;¯°R«©(eà̰ ªLBg{%¸µ¨qÞ2?»È8‰›¹ZXSy–7ÿÖÑ_ä©,UÔ/–ãÌ œlD»©%x~Z–‹wཛྷÞõÂqøî»&Ñ#áúýü9@ù=3WöqÒöæY½ÀéÃ&Ô׈p½vÿ•×X©ÀhVƇ —ß¾©Ðlϰð>¥‚¸C`eÔ& _2ae^!sp!í­uX]Ó\öòaüÙ1s}hOHdûÊ­WþÞNô«ÞààÈÝvøÍ-³&"ÀxÈÍ·Š íóª;ø•oÁ” ÃCš/ƒ“ð½¯*\x÷¶’jU½s"-ú‚•yñkMžVV¡­×8Þ­ö.Ö'ÉÕjÌÏÍQG28ˆ+m³ä@ÆS…ÕÖ|°ä­%G¸‚ Æ6ô¶XÀM$ÞEFm' ©Íõ+æóx6ËýÉXúQ…[ZÇ^ ~edŸ«0Üïþîïòoÿí¿åÿø¹yó&_øÂ˜ŸŸç·~ë·øõ_ÿu¾øÅ/>8ÿ·û·ùÎw¾ÃþáòÁð‡ø‡¼üòËüÎïüÎOôüx!Šš¨£¼H¹Y@_-œ÷q¥–Ð";`þ_Àe˜•†i –"³ìEB<‚ "o·»¡¸ùì6ÚýV«U¢•ʃ´þ „IªC}ñŽp'÷+Rª>v§VÑÆcR|›ËRf>„=‰ùŠ ƒŽ“R· 5—°˜b}VFÒÑN±zƒ‹ëÛ´Ü2.Û0ÜJ(}ÛãÕΰ£_ ú̳®¬MßßFäêœjÇ¥» QaQà.—%”záAgí¦Ÿm ßô§åxi—ßX¥^©)óÍP,çà³ÿ<Ü`·Púóv^÷˜DÞË TÞzC×qó k÷ )ÂÊ`X€×m¤x:»µ“özöŽ"ãúú/à÷¡Çd„DM{¶Ö¥ iáÑ2Ž90j®¼L;c=­-hþÌ¢t˜0Fk;w ÂíyÏ{Û½ìÅïAó}Ø7x¦-tη`õÝw1·S•¼ù7š[=½š/ ¥kqd>d(ý¯Ê(è3%`*j{äm7à–ðvÈè[š“ÒÄÔ7†ßËâÙÍì‡ïÏÂvIÙi%3,Ök£¢±ñâ29§"šûGkžæKª[öþëp+'<Ö…ãš/q¤\?( \¿PrxºT‡æë¤›Qd(Zo“-ÙÒ7.ƒ$.S}ë-fÌæfÎP(óš{%´Á®ýZ¿kXAAÑ´ÝâÁö¶•dP«šì½‚2 -~0dæà2Øïšûä€ë%XjÁÌ¢²9K»N–ažõÊma WÉv­™~3¿‚aeNÕ;Å’jÃNQ}ݨC÷ dÀÚxÍiá¶peùeepmÃ͉RAÆÛê¦Æo ­'6ff¸?7÷`ã†Y5Yð.Î g1Š–45`æç˜™ïÏã6«“¦Ÿ.#ùÇGÍç9䕲›[ëÍú8ŽGa¸Ÿíñse,½øâ‹¼ôÒKüÞïý'Nœà‡?ü!ßüæ7`~~žåååç_¸p?ÿó?çOþäO8vìú§ÊW¾ò•Ÿ*Ǹ"° ·‚#-‘è…qép<8ãæ¼´® A‘F™ËHÀX¦î†+§Tl³nó}"‘À“NãAÆSÊ(O›‚¾[Q‘Ýaw8†\RFÃÃRv‘€@¾fÒÞÞn¥ã†#0>¦÷&`}M¾»‡áø¤©WWSvŽ)T›*žz £÷@H}³áò©CqÓ0äIèj×µàdMÂ+Žy(*Ÿ©ÞZ¹ ?2} 9•Yœ!“1?Öè ˜~µ(‰øàF˜%)êW Ê.ü£_{WŒäÝYeÕ•Œ¢Ke¥8ÂÝ»ŒRØWrÐÜQÙ—k?4œQÛ°Õpå9ÖVàƒy…)þoÃIUÆ0L‡z¥l*v< s,¹c£.åp*+EÒ0m²©Ñ>Lx£ ÿùJ3oïrì쪯޸"/ß°_ƒo½ —¯h#t —½i ëˆ^aü8üÒ?S¦áÄIxâ9W‹ï“ú¬ã ŒÒµÕ(Þ‹ñ#9±‹¨<®Ý†µ5è˜ì» Ü߀9ÃnÚ4}4ŒäÓâwõ†  ùð__„“'áâ(Nk}Äp™Ÿ·ÐºmCm’JË߯1™__4›¥´äKy6/|F/aî¶¼€C£2úö¶œzÈ—›‡ñ°Ó¼¯a ZN&€·¯ëüPTIaôÓ‹Œæ½m(LNÒ5:úÐm v­\ò"ƒ¶2Ùšf=ÄÌ÷1$£-K»%~ßôɘ¹~ÂŒyEöppŸ4÷¼ÉÏ™‚}tü7?Wa¸Ÿ·Ãº7ãhaì>ô]ÇÝÓ@‹2…jWGΖB8ŒÊM#¢È´`mÌÜÖ/:‚„q/Î…D»T_ @Ôë%S©Ðrõ¸Šy±ßxVÊz&ª·º(^•HLN*kxIPxí=\Y…(Ú% ŸÍlNmêÔn±Q—1uwEÂ¥»Wü4«¸4û âri6aÁ(Üe‰¤5®ž{RŠ}s Þœs%dNš¾ˆ#*„l¯Jìà ïÚö™{·p¡›7ý8bÆ¡Ž+‘÷ûIÕëŒ$&¸Š+™’?.·¡ 4×E=® è†žS@UîãI)¿¥9yÎò+*° ¨ßãIz}GH¸cÚÚ ¸¿¨gYÈ–Y'äUk?­õ{ûª¼e{æ½ ]­¬¨-=ÿ/{oögz¥yþbß ƒû&ФH-))•ÊT.¶Ói;í.WuM/…FÝ3@7Ðè»ùs=À\ÌÝ\ 0³ôtwõZU.ײӹgÊJ¥”’H‘Å}‰`0 Æ1Ïyõ*ûf²;2øÉX¾ï]Ï9ïsÎyŽ!½¡°øÑ È%vT—aX„‘­ŸÝÖµµ±mkù0žòõùD>mú,/WžéÒ”ž•ÊȵeåžÖe¸zUë¢Y‡ÿôsəׯëP‰Â oÈ¥6:-ºY#­}¸­ýAhêqA´'ØÚ¯Uå†l5d@­W`7W]·KÍÖ¶ ›_®&ˆú„ý}`ëôQq¼ac‘ÅË GI±‰èKbx$.ns1fë©f÷N ÿšÜpÿ&ú»wÃýãÆ™Î]g†ïW¸*h£dùrð¦[—‘1YADŽ›h)ì#£”G›o gWŸëm2·)ÛȈù< 00:ÊÀì¬hV€² î—PX§c¿ÐD§ätFBÛÕêɈÐ.ß×Òu¼‹&am˜¾$xüÕ7$lÒY ÂTFB{²_ñ JОé¬ïpTÏ{ýЏ#~ë³1‹(Neþu_ëªeí¨[;&§|0é@Ê3i»úu!<×UÏs¯¹Ø%Wc,†ŒªqàbV©ì_}•QΠDJy~HJ½ÓÒ|­aŒÝæ¦)×a-/Î ·6œ»É¥QGãú~ñŸknZ©Æ³Ö挵ÿ´am_mm"¤ ‚/eÓgc±ž½³f…”mLg€…1)W*¦¡g[Eó€îw(´e(•Šst ·˜ãœ a" Ó?ü¡\Ë{B-ÂÅ5¥Wg×jÀ_þ/ðï~ ï~¨˜“sSpPÖxí!E±öºàêß<6²G›ó¦è&Ú-sU¦ËR²Ï¸¸“cäzž¿¡ge‡äîʺ^”qÇ×|;»c5ñ9$eÅó\*Ó鈀1ds8Šdßü3Õ7ìÉÈ@Ø^…÷ïi_Mjßܹ ÷va£>»* IDAT-Z‹O7¡™LÒÿío?ã³5[°6~ãe!'·ß¢48¤ñíE%Aú³â´:íjLÇf´þ£È%iA÷ˆ‡`{nßÓ÷jwnLÏ-çúµ†[ =£©µÒ´1j×.È๷®¸ÃZU{×q¨µåžÈ&?ûµÆ«ÅÞxËJåuÀˆÆU|ù`_}iL£!ÍÙvWýîËêó—^V ¾‘ó’M»@ßì,ƒÓÓ”ñ¼Y}¶§Ëx¢Êa|QáB‡Ü!oÂ^>À»íöl¬âöÙ»6þÓø0M[+}ø8ųëã:3–¾ÂB†Q_'.„ Ÿ:‰ȳŸ¥ç¾{_~ÂL"À„Úç'ÐÄd‘°»jŸë`î¼õuö< €„mµ"câŠÊŽMÃÕYCTÌ›LȈ%ÄKS=QY{‹Hº¸Žsc"›KöÉ#2A)Î⾄*#:’€#°ƒ^1cçÅ—uÿ^|}„ÞÞ:T :¿¾à…ûÔ\½;ëjkß 1ã‹ »Ìg ðÁ׎a}¹]rx£çIQAËÑÏÞãõïsí›ðb¿/ññ¶¹!ËEU—wî‰*ÏñÉ]ëdV.®¾ô÷ %Xºãyn™à°]TÙ>iñKsCÞÕÚ¶ùßXŸÌôˆÏ:r‡¥ñ§Ø„H8þª0æ¡üɺó ž¥8€”YÙ^K!ÅÙ?ì ô:])khýQI‹µ²Æ(­ äxHq;ÍlýìgŒ…d·[Z‹µÚ0.¢{ŸŠx4kýü7ÿVÊ|ÔÆí{¯Á+o©Ï/ ÀLBñs|2…ËØ …Í%Y–".epÎ'`0WÒºO$*d°ÝRÛÿÞÿ`$¢ýþ€òÒ-¸:o%¬CÃ…ñŽÕN¿˜•l)Úý»6nͦjÒ%cZ—•’•(y$ÃÛ]½iÍq²Wß›‘[î £1äÝ.ôõ‹Àõ¸ CëÉö6G»»Ï’8Úx¢IGÙ°ù°5°ÿçl>® õôø&¾ÊÁ$ ±¸„P@l½<¶yj!ç’tÜžúº®³˜¥ßïuf,}…+ˆ6‹ƒZÃx¡Æ2o°RH9® !D)¦ŽJ!qüIÍVhóïãëÆ%ñJ2¤§¦ˆ]¹Â°0#Ð7(%[;• Ý\ñ11î4U«Â~IÊg飯y£¦vÏ\Sßúìó'%AðGEØÞ6Örƒ½ÓY½·»·7¥´mõ'ˆ„ms?¸+á™ÎJÈ9WVØéÂûïÂ/þâ—†§ô^Aö'fq†£êS:«ö¥0´_?o ¼i|AË`¨ß´l®ºXŒÊ‹ß`s³—­e çH@hB·£çÇž”3góÕíèÙ™„RÆK#Ó3¢Eš‰jœÛ-¡Y‡@8¤þÏßRËJ±9ÅÙ‹Œ•;Jø×Q»Ç³ZS®ŒL¿ág›^‘GðÊw !Gìû`ÜÜ€ú}hk7d÷Þh«½/O›³1L‡àµ«BÒövEJ Z/¿€cèÎBßw¾Ãm1Bÿt[‰Ó#jÿ é‰ÏNû}6?‹·áÊëVÜÕˆ([Àb^è¨# t§v—²_))°üî¢É@Жª Èݲ˜åÛ-Ošß†æ¦Œòž>]S)Ï0}R…[ ðö,üçÛðý?GÔ׿>„¶t;Ð?/Ý„ë·|¹ŽRW1:õSNž`±­ï…£0{UÏìA.±W¦Tèx*eáòe¶€_Û)§ü`AŸé-¸ÿ)ÜmŠÍ<ßÕX¸¬YlþBî3ç>L"Å +|jA÷yß‚ÞñnÅpÃ’ \ ~¡ª¸¯>d Ec«>ãùý³Œº‚PΕÏeÀþòÏ͵WÑóï½§¶ß]”Û±ïË»>pwãe2„mꢞÛjÂ+¬^™}¶t¨ì¹Z®ÁÍ~eŽNË8X9 x#j.Òbª»Å8ð ЗÖ^Y1ƒ0‘ûi¡F.IáØžX]Ťͽ‹ ‰i\ŸTäÖutîBA÷SY€ëµ÷Üd¸_’åÖ—«4ð¸¨{\ÃW˜IÀðG~šR¾½9ÉŠfd¸¦2J pÙÅ‘¨îÛ7¨½:Ö/ùqî"Üš’Üétdè‚rÉNf¬üÉ.j5jµëÃoC´¡\ñÆ;è$X×½ƒ š*¶§h“ׂu|8a<¤}i|œoÌÏSmJTO¼ ÊoÃä>w.«vu¢¯5a ß*‹o)X73È;¤g—+F3€¥ãy¢®G$¸Ú-ü:]ý]ïÂæ¡çW‰áK„tì>Ã&èÆ^Ð^žVf™SþÕï s®§‡ŸèTúéÇ2“µéÅ+ð½ïJïá ]ÌUs½«yYAŠÀÅ•M£óóì&9åôXü4§(.®…”c2-×J8ªÏ/ÝQ{\}Âmû;Ñg®¾ ?¼©÷f§,=¡±=-«öÝ¢!‘d%{…ft:~~÷7­.r›­ìj>Ën]LHÑŸ4¥@ƒx/Çï´pÓk‡#Z—.1¢Ü0ó7d0;d«üäÇú?‡’*BasÙ%`þ•Õfšà¥7dHŒecµx~þ¯•yèÜ®.ýØæÐâÀ»O“(Aà´®¾NF4?“ø²C®´Ê~V‹ºÏ 2&œÁF†UËÖŒ  Y;|™šÑX»R>å¢Úq> 3C2úz2B·VáGÿ—å’Š$_»$úŠ”Ñœ$1zlnúHL¡ýÃ0°xª¤ÖR"%Ê“N·ûÌ=ßEH @sZCñ‚md [Ÿ·ñ¿C^?³uxh{£‚—ó}ˆ_/fãâüZH¾ôÚ{_×uæ†ûý^gÆÒW¼\\L~Ð\%ÐÆ¬!Ã)ƒ6e m¨—Ñ©&ŒÒÝ_Gëßa™7ˆ”Ò"—‘ÀO¢“‹C¤:h“ˆ7ɤu2Ý\‘Òˆ'¼K£ hÓ_ºa§ä¨>Hðl×}QÛ>DY.Š<1‡Ñ!‘Å%<üD߉'äöòd’A¼ N‡œy{Þÿ+¡_W¿áy¤ÂVëi ¦ºN­¦Å7 c!ÔÛ2BÀƒu¸ð’Å#å¤D¦¬©ruàýŸÉ9F„%ÿ1ac™<Þ%ØhÐA'ÿ|W.„"Bª:ö½´Ýc-/#há&äŸS²»k:QŽ u)Ö…ò‚ú©ÙúpHÇ쟊 )ÉßÕ—Õ¦62?.I°G€½6”š¾6¡£L £ÏDíg ¡ŽM`  ûôØX|òŽÖ‰s+¦ðA¨1ü?7"£,†e彡€ápTtñ”HwQ]¹õ¼Š'/Þ†¿ùÅ1­¦w)Ÿ”àÞøÍ;ðE[ý?’a;Ÿ–Ñ|oWk*¿|¨±‰ µqŒwõædhO_VLÎü4¼¿®yݯj¦. Áûçÿ^|¾ÿ÷<ú9µ D…LNÔþ†w=ô Ú„l¦rᦂ´Çl<3¶&O+Z³§Ç d?=öXÂÖI,¤5ùï?ÒIöš2÷€‡‡žsú²ö­#)ítƒ¤³ž©:RßZM!¤ÌÑ-"#dÐå1Ž'TŒ8; 1 B×}£ã(ÙšI“æ^ !&s—Ž?™Ußë¶Fšøä .pŠHC£Åím¯jDãú]k Uí€ÁI­¥ÂŽæº'-$pg ^ü¦èNËʸD%Ã@ýž‚Ïß…GáII{´ZÕØï¬K©×œ6’LM$ž¹­Ás'9·e­½ ’§î°CÆÏ‹( ¢ƒ—Ÿ¶gÎ#ù]µqxÅ,9nOQrüÜ:;»þö_gÆÒW¸\LÈRH|:©sDÑæpÁØ1<·ÏR¾ƒ(%þ#üI{e¼½‹Ð—â:Œ6ã¡=ËÅ£Tž‘†/ö“ÊHÈöZöÍÆ<¾«Sâð„ ìñxuF.ƒ2ª>~ŒÒùÛö¼«RZid%zàéŠþvÕÁG±ì®ŽÜú;7"ìxMš6Fqdè Ž+@¸Ù”áp°¥â˜ç‘°Ÿ“Ò(–¤Øri %çóo  ҆ݳiÁÓ‹·%8—Ñ)®‹74C67.6)€„ÝR€6_+$9²ÈR—Á—ÉÉÐp§êm$X h³ô JIÁþ¶¸¤¦. ëÍéýr±¼÷Ê­Ù¸l.kL›+póá¨ÚñóOeÀäP|[)×ý}óe¹e܉÷Ź­¯Ñ€N¼QtšÝëj,Ö€ÁŒOhîšMïžu±8èí=Íç¹¼p]Š/žPŒÍÜu)ìrÕ§™ÚÏãu¶Ûì–}f]8¢¬:ÐX¾„` ¹WßYÓ^xRWÚmËMÁÍÀ›ß‡7~¨gåeT|ñ!,®iN hÌœQÔ?,ãÿþB+r£zob^Æÿì5)Þd¯úpkJ1FÍ. X!gçŠít Áó"¥m]w;ZÇGzÞIIû£„ eиõGU )[Ko/¨hôLV1M›Ëð䡯ÿÝ_¶‰´‹œ–™~E{Û‘Íä`¶ßS“œoLi#6§kxüÑšxZ¶ìÐŒ¥„4el­Ôè teµPç3×þ9.v3lÿ7Új]ý>:Ôÿ±¤!È)Ïᎌž`P$G<š´lÚA“a±¤8ÀjU}ÿ`[F®‹_L¢xµº½×A÷éÍ©ÅBB±HÂÖGÉö”KШâQ³M$Ûw­aG´ý6h{sÈ~þ=ÿÐîí®0:L#y mú:®Bûg?_cÛÿ6\gÆÒW¸á_ë¿ø<}€cˆým(Ç1â‚m_çl»,µ]t*éÃó—Ôí;«ö™A$Ñ)' TÔJ5 z\ôu™B†ÅW+D#SzíÉ0›R›z‘BßEnj Í_,©Q v.%>§ïvÃx®‡ER<‰”Œœå,>üræË½w%ìú³r!º B‡à]½ cª+õÖ÷aõ sU$ØÎÛ˜ä ×^¨Ù¼Ø?ÈÈK AÖr¡ ˜NÉà¼~AãÖŸVû«vïikO)­VÓÜ+Àžqè´šª–ÊÀhBDɘ2º‚öÜ- ¦^¼ Ç?ý˜ÓcOàXÏ ÆŒŸž5>'ôãå­¯ú©Æ>†bUœ ´/ã™å[Hé¸Ì±HDëÉe ÅÑ8\û–ŒÖþa}÷½¿„÷>Öê·û¨­ñUd¤õ (û( uØnËðpë¹ Ü«j ‹Àµ”Ú{Š?7í¾Ñ˜î‘ZðÎO<'Q£¦>]D¤€ˆGªQSÜÑÚÍO³¡þ|üSx÷?«_¡ˆEÍïêºæ%¹g(,eÞ“Ñú;1tÏÅXÍY_‡ÏÁG?1^±Š"+U퉒!´ý£š¿TH¨U_J$”{ëj_:«u24¡u·‡X8LzvšrQœCeà‹]¸ó¶ÊÊÀ|xè!d¨†ð\nÓ6žNɪڳMd(w;2Rr⯊ۚkà]KC6g÷Ê>9Ĺ|ÝuŠG8F‡¢xDýžº›Êúl#€5ã[[ÒÜ´ÛZÓëÉ‚%ß¶dÚÊ„dàâˆ/ÕR*y™;8¦ˆ Î!Y1 5>NÏèè³ ÷8ðž°Ôq’m!]f+èÀF¨’# v´/Kè‹Ï–û°½æ²K±¹YÄW-øº®îïáçìò× ÄÅå8„œ»§Š„w m6G(·aŸM"ƒ$ˆÚ¼ßÆûÄHPõÙïm¼0D§·ËöÚm¤$fëzªúsRî¥ºŠÆá|\kåž„óçáÊ M΋~àŸIø\Îñ(ìÀ\‘"kb¤…6þŽl.ŠÚLC.$%žß• tD²Õ¢zù¢Œ†¡ X^”ð›Q&X)úCàÑ] Ü>öÈ´Õé±\*±„úШ›¢B§XÇÀ¾±¤ùÚ8ÔúÉ#YÈÕDr8l뢎ˆ)ç³p鄨<}hñkA=Û­¡àò¬N„§Çû+!!*š”øþ†ÆdÔÖå$ïd¯Œƒïýc ˜ŽëõXBèI¹nƒ8—@ - àøñcâñQÞ‘¢Gá£Cü jí){E}bï;£ÅŸÆóy~W{Ãí»ÒpkF¨L£®v?èB~Qü_Å=eçå-ðþ“Ÿ*îåÜ%-«½¢{ñ†æ>¡faGÆ¡#šì"o(,ÃíQQíuqa§À…1µylFýÿdrmÅgÅZ#C¥:- ¢q=çˆ6|ñóÏIé3S*ñ±c²%‹ýe‘ØúÀˆ¤–‹0Ôšâ\OM·>2Zí6Ä¢ †î‚}ŸÉë\m.öìù0ç¶ëÅó¡u­]uôüú)lìz2\‡Hõ„%K¶”e Š ëCc°º®gV´î€D z’™ŒO)É£\‘5;˜5¼›»¡ýOlž £ó¾íÙ>äí²NoãÁ;XV¥Ýw_Dwä¹18»þ0®3dé¿âr~jBvÛqäŸBr)§&Ú”½h=ÆÇ.¸¬·q´1Gør ÐCûþy{ýQ"A<›fý‘ ¥NG¤\ô¥ €<:°ì´†žÛ›¶T|`î‚”ëìÏŠg:…u”‡¥/d¬8fÞR@'e‘üÕO•æ}ZÖwºø8Л¼ ÷@QŽlóÕ[ðʤ˜Æ…mœ–Îúì¿ì~.ýÞþSµ1Q??]‘Âw{ õËw: ÷Æaþ%•Tˆ%}0yljŠk7ã´ÛzÞIIm˜šŠ5w&§½ûáïî×nhnÎõ m }-¶Â!lV% ]0qÄ~ç`©îy7® ¦ß­ú¸—‘1q]¹ Ä Äk•T N(ì‹OȽŠÎàò«Š9éÔ¼Ï]×oç‚j#¡ÞÕc«é³«÷áÝ¿P†˜+¯Žh=öd„Ìl•=}C€Á[·Hedõdd´×Ÿ›]|ìFÓžKè·#h}vðÈ( ó`SíH¤ôÝm¤Èœ2k·`鮸¾–?ƒ§]­ÝÉ~ÍñæŠÊÅDÑ:>Ê[&Ö°ÞF(Ö…2Xr#B7ÒY{y­Ý.2j[ñ,;´¹ký¹øŠî997&D»0>§±Í*^g 6/ý ŒÜ`“óz^rñÝ-Z,HVJ=…MØÜWm¶¡®ÖU­ŸƒM¹ÿjÀå+2t\£Ù¢œ¢àî°ýœ»(ä¡·.Ãáño•|ЛSZ ­…ñݧDzò¢1­½ü¶žÒg'æ`ü±Ü>ãsšëÚ‰J‡Ü®Ë(O…4F…]u¢G÷‰Æ4FWþüú×ó[€KÆŒ¶ê‰ ÃX=U>úÕ¯¸š!\?•qáhIzÐz;.(ût¼æ¯˜û=¬ÌÄ¿ùs?§°ß•ì õ~,©9ívä¢ɪôInfr2>]æ_v£}$ ç_€/>°ŒØ’ë™ÊªoÃCZ£Á°âÛ-(t5_ Ö G~Kïîûxûd@ÇŒ¿[†ö]øþ?•«{_ýJ¤¼¡èÖfþñcžàet¹¶Âï¸•ÊøøEÇ ç¬Ÿ„¯ØðϲÆ3ï!9Ýã±ýí²Ÿ œxÿ!]gÈÒW¼ÚÿÅ»œïÞ)Ä&B‚Êx›]túh‰6Ó9äÖ¹”ýÚÄY›4€]PïžÝ/ 4††ˆž?O¥¬SÕ ! —Äq[hBoÎ`ÿ®U®GÓ°‚AÁÜ®dJOÒW.ª_›ë°ÝT°j­Ÿ¯xnŸ“¦O+îÉH8»àv;õŠ]%¤@‡m.¾.4%•‚šÒ–ëFÐ+Ãçþº •£)ð—¾ o«ðïQImÜC‚©'kkRFÉ´¡5k*þK6nA߼ɨ•^Žê2( eW~[Á·îÔ{”‡Õ¦\ .-ø¨«× %Íõ޹5kV“¦'cFhJØ èeÔv—f·qÙhêü—ïèûUõ7‘Ñ`³®9])«Î_0¨>lXÎûÞSÛÑ7JAÅGm<Yb³á Ê6°Ø¥šÔQù’TFèUnD =UÆœ#“‘)¾&rã!x“óÊ– #ªƒó(8ýQQ.Î'›Šoy„ÖËEC<šÀaWg  ·¿2á2°š>NðÅxŸGw.‡ÌÞnÁêçrE6êÆ0?&CÆ1³×NÔ÷ã‚8Àœ‘öÛÛš»Á °=µ…¹½ u)ÉŒR×Sqm, „ö Âoÿ£ægÓÐÁa`g[sÑ?,koö|ïOß"Õ^¾ ù’/s6A¢¦—ÔבiËŠ]Z[Âù‘ÑKjücF·0œ‘ÑAÏßYÓý£HkóÒÖî+?ОnÔ4&¡°êv±µE8êY¶s£’ASY`BãW¬Ë¨êv2†[HV[?o¢3×(žR`É÷<ØDröwXªíÿ÷:‹Yúý^gÈÒW¸ž_8m<<éjµÑÉ¡MSFŠÕeZ8þš Ê * ñÇÀ‡øÚEùçîžY7 Þ"vŠÞØà/1õZ*G>M=ƒÃºNnÛ«ê“bˆ%•ž¿÷TϺ”PvÓôˆW(—nÀ ~ ·¾¯ì£‡ë¾Ph§Fyœ×½öÚ:ÝÀã IDATiïÂÜ€Ür=H¨w;jÏž?nÞ€¥à•?†J.\7†ß‚ƒc‡Rhé,ŒíÀÚ"Ì]•³x®e¥ˆ])eî„Z4.6í±®ÃúŸ%¼7–<|\€í÷ßWa㈦BZ¢qæUÄ·Ž”ãøŒâM6ÖÅ st z|.Sq2#§ ܳûMGŒä1‰Šæö˜7Ì¡wí:âψ}f²#Dm` ÝÖ<»ÒmO5P@®£1Åu:>6¤ÕPúzÚ‹ºÚ´õåXÆËE¹ï6–„’üõÕŸ|IJf4e¨ƒ×@/YqßÝÓsÎgdºĆ­ùtnN)kpsY)å׬ݵ6Œe ¾/”f¹í wmÜãHyfÃznTkЕò0Pƒ´Q Œ«-¡ÆolF¨PØaÿC2v)ÅÒt;"fS`yOÆ#{I¤”´F3p.¦uT.jüÒ(ÖmአÙkZ·EëCÚÜsëTöå¸`eƒö´¶÷Ö«”?ý€½¼rK÷H…`²Í³2Gõªˆ4u4¥gú¾’ bIÑsäB"§œŸV'çeœýö—ZÇ)ü¢)a§äcŒm˜˜†‹sJe us˜Ç¾Çã;2Ì"'uhP½ª5˜ÒýnêyÉ^Z‚xC%Ž% èV,‰O*WÖ\ÙÜÑñˆ²ä‚aØ.Á½÷WëXÏG´þÒ)µ³Þ†ÃõõgHdO| ›“Eï ÄóŠý‚çªzQ¼dì3Ÿ[›x#Ýé„4:°ÙçAÞÏuvýa\gÈÒW¼‚ø€aç&sY)Q¤äÖð‘«nÝ‹/â Pž"ø›vïkøÔÕ$hAY |Úìä$ W®DFÁþ¦„Õå[ú|ã& K ŒÏéõÚ©ç­1ÁâA¬ôBîodi$O¾Ð›îWû'‡„6DãHnYKSH‘¤Cð(¯4ö(B$ò‡ðè¡úäRÛoÞ›¬7w)¥».E=æSdz"®ž£:$^©ƒÊ |ãe)…(Pmë#¤ÈƒAt¬‹ðð~·=²ÐéÀÄo0ŸÉðäݪÃSRŠ NΑ¸î=’ÏO,ahÖº2£`±J·P†Ó|B†Òi®½,´«7ëãÛ>¯+h:7ßûÍʰŽZ_¢]reø»0惊÷‘»·ŠÇÑæhwMîÙ¾A)­¢Éã²Ö¡sÇ1:ˆ®âm²ÃZ}B' %)åɬ|'…¾¸¸—µõùá?þ!ù-øWÿQñ8×®j—ÓäµïÑ'bŸŽGä>êb…£«*šÛnûÚ÷ð¬ëOlL’¸þ-ÍÑÜu¸~Ed‡¯¿¦¿›uË6\•témxí‡0ñL¿©CÈ€||GhÈÖ²”p³ —dT4jZŸ¹Q«ã7!´Ä¹?Ë%í¯âžÆ¼°k¼b†Úôæd:jŽH*u^ûæ¶ …yÆ©ô›{0~1ÆÄ÷^âÍïʘœ×ú-›üè¢xÁÉ ¬\LVV¬¬QE‡¢­u¹B¢YpÝÝŽ²Õj§’_.S±ÝÖ("ÚŽ8Š—[¸ WÿÅ9²ÃðÊ¿ÌÀÚ=äyÉ‹tVûºŠ œ’ Ð!£ªGa÷‰^»rÕÓ „ñÜH‡{Bnj<ã)¡3.hNÂQx¼ª¶‚r—F¢ŠgÊo )M¦-XèdtpðYß²ÉÒÿÅ£¸¤?¶=ö6Qt íGeMºèà›´5쌞i[—{ö¿ã,Ãdϧø2+]¾Þï3dé÷{!KÿW_´4gºud•½(c@5ï‘ò ¡Ø‡lÝD|K.±_nÏÞ»Š„Û,æ ߨ …ÆÛmU¨Ÿôq&}èÄVmšP/Á¹8K‚þÃÛbï^{h†ö·eB=ú„gEUkHao¯Â·þ¾ÜB­†”ç…I½Þ?,áKB³¢S^:á¹y¦‘ ¬ŸJØ.ßUìJµùÜE¹¶*pmVˆ€‡Tvw¥Zm¹Ba¹~½(ã×®¨­+k*W’Ö×ã±”6a>"”ãñ§Ÿ’M6ùÕ¿WÜL8 ™y¨~,A~Ò„À© Á¦Ao¯ŠíÜqÇ ©vž£LàÓ ç^„so;ªÅp-#cq¶­ùžÖÿ¡ŒìsWüt©9s¯m·EKÐ&àΦ Å::ÁLÁí_é9õS)•hÎÊ’«øñPr-!µS!/ õRÈû@ìˆIûFÍJ³ Ýë”[ê´ Ý/> ²c‡„<,çÕ·)Ô¦•{âáqQGM¬úÀñ'›¾\H)8÷Ù´ížÏêè@k3‘’ ˈ»p|/]úØ–‘32äÆ mo±½ê›+ú\¸s®_÷.¦J :mOƒÉÈîj[¬CrI5ÈÛÞý‚s‰îU´®’hMÎ2»´áEí‰$p¸Õä[o.S Š£>º§Š>—E®çð÷¨µ ÃÇ_øF7ßTÿ"Q‹ÂÇw!væf´jm£çM¾ì›A<ŽÅ?Û0s;OéD¤£ßͰr¯DÖÔ“’Ú>Ð||ãûþ òÞ_ÈØ95w`«!ö~|i6`mS{+¿¥q=©¨¯Ó¶¿Çd¦l/´2|ú«Ú©Ž‚è[ +– NN0Î]J6fIà CærÉ=ŸÉöcDD¹ŒÜlïßE{ü_3ÓÅêW"cñs<ßÞ,Š]jòeVï¯ãú]eŸxù:C–¾ÂåJ0¸Ó&R¾E¤ÌA ë¾v’ ö~‚â¢l ‡,Øw2hCÛçgÑÆŒ!åžB%Q¢xøÆä$W¯\a’ì\«X,R.À0ŒàvPø6‘¡ùþ¢‘6Å‘ÒAJåý¿R)4"ÄÜ/YŸrè—@>IŠ«QW÷bBDˆN¡½xÃgº¸6¸Ø@PJ~èÆUænõP­« knZ™† Èûe\ž¿"åKJ5ºO© ¶äD†ûe€†­Dǧ¿„».cap®}6Ö¤H;(%Úî]~Õê]!á êS>}<Û›~|‘éö*ä†ÔÇõ]Bû¾V›ËÊK£“ü伯ôÖdx¬=€å‡ž¬d0†B¯A‹ Gá·ïÂâŠú_¹ÈnÝ×å+—Z•2ÏÊ&DcZ×·® }d„…lýð¬.¾mÜöÄ‹/ A(`yE.Éü–)Ð5QI€§ê‰ †ßügïÊm8zwë2Ù? ßÿ'B¼†ÏiÌæf4o;pT+zV¦ßJK2Ï¿ßù¾PhLé÷5|6߃d,_zEìô™œÚÖvðœÇÇûÔ€Òaˆ£ú Û«rÑm­Z–lÅ\RX­´ ­±XRk³f.«ÏšBqþŽæ+m¾Éù1xù–Œ©ºeh–lŽÀØ€jÎNÈ89Äb0«bn¯”€L æÇYûQ‰LÖK*UÔnë']!š/)«Vd(uZB«ÚhŸ»¬µÓlèþÆj¿ñwåöž˜†á/§ -ËÈ5†÷¬ýÃSB˜Ba•t92á0¡Pˆ[? ëÏ!’¹ËøºU$§_G5äbÀ/¼ûо;‹äyEŸ"™^¶y b%…P?—ðz¢ñÜÞ<»þö_gÈÒW¼_Nm4°]Å|¿‡×:±¬au Ð)úçø¬³÷0ß½}n7°Ì¼Ûîž ¼8ÝÛ£·PxÆ%AÂ¥Ôøið§gvõ™²8ƒ—¯Ê0šÈHè÷ *¨¶RÒçû‡à¿ù.üüG ëÀLzе“åØˆêkóHq”åôЂfÇQ*þqA±*.°ò¤dDˆ¦lÂÏõ%žO»e1] (”¤4c )ðÉi¹úŠ£ | h ¡y$ÜÎÛxî×áòÒk,¾WcpHíétd0€ ƒ~ p…ÍÕ˜•-ì(«­nK4"å•?T߆&„°|ãO„¬|ðc[É4¼ú]¿ù•Ò¾–!]†'=Yæ6>M9‰JU¬•w+.÷ÌäJ°Íˆ¼¯R–²:ÜW|Úú¢¸ƒŠ‹R$ÓceY`é¬Úz\4´ÅÇý•ÑdŒ¿+“Ó˜w¤¬@¼ íý}RX€.0e¾É©i¯ôN–å»ëâµÚ²u_»ËžÇxÎEgí‰%õì­e¡ Ùa!¡û‡ðú[ZGG:0øµµ¿)Cjù®¾³ò9|÷Ÿ#9.NXý©ÖÒqAè\«iÌÙ›š§“’ÞëÍ)h{wݯ¡–²vŽÇdDcºÇúJÙ\©…‡ÂâŽ*c»vù.•bƒÍe‘Q¾8ó‘1¶lÝ^ѳ÷6µN)ÅÑÝ_‚}dcw°)£ÄÅô„£-+Ù<9.´zUë'ÕØ¶¡Œæí´ ;O ù£ íVåY–Ûå);(†l£n±P;r…î®iÝ×NõÌdCqdã‚[7C0YÑX5žëë¸ ©ŠP¦„þ¶v5祂ÆÙrY4G¨íÇ&{á°b±ÐÁ“…ŽT¶ß^Øg–L.|_ýÉë8’ÇØØ:2_—É\Æ“×Þ{nýö cÏSõu\¿k×Ù™îË×™±ô®>¥‰'¡m†Ú\ø¬ wjtJÏZÖQá B†ÒxÎ¥C|`ëˆ=ç†*öÙh_‘TŠÎ“'_2>;n"&·G:¤L™v[Â朗ÓV: •¢ÈÑa£.áÓ‹bevתRQ„ÞDìôÖÚ5Á3¤û׫ ÀìÃê¾u5.=Hám¬)€3]öåHJ–éKz´-ÐI?U»’i ËF]Ÿͽ‘×3ÓY 위çtúït¥œ²Àì%8xèycòÀå˜Ð…"ý¼ôv•f¹Éê==okf®Yù¶ä;- û­e)¾ZE™z'%)‘˜^»| >ø«qv î®›oÀ¿ý1\ÎêýL¿ŒŽ¡~ñÛÜ>Ô:9Ù…Ë„àu:ŠÃév4 ç{OáÒÕû Ýë¸â‰ƒMý^ÚÖ>pnµvÑǘ%‰~X<Ô:Oááÿ ¤$Û-¥«×šúÌ…¸P†P^ÿ– –5£¸°ò;¡°ŒÚDjl*u?•€ÿ¼üvàùélrQ(ÐÖªŒµ‡ÞªI¡o­*æ,Oî =Ù^õ18UàÆuT¿ø÷ðiéæ#ï­MÍë¸\F' ³)Ôò…7€d—'KUÅÚ¡µqã-øð¯UpÜÛs#VKíÄÎÃí_¹àéG’iíŸÍ®ÚpR±"Ù¶\V:ø?Ó´‘‚uýmOUuþ£OôÐNÍ/…l ‹êà‹0/æaÔ²ž¶!TM³©‹æÚ¨Àæ#Íí­À÷þ¥ŒÑ¾AøöŸÊeчÜ"GæºY,J ´,Õÿ•MxuD|LÓ#ê§+ŽšìõYŠ3Wµ®æo@z´‡Éy‹308®qê͉ŽûÓç~¶'Ba_û¯ƒ]JW¿¡{œ6¥¼@4Kú=>'ƒàÿ=¼øm¹4;¹ËNʦ «2”úGe¯=„Ú£:ƒßÌLˬW½Û§'£Ÿ¾Ac§Òëãs07¤u[Ci쑈æïÁÇ2núÌÐJÄ´fs£r#MÈðp݇‡4–T !J­Qí9„–‹:Œ´€oý=ÍÃgïÕÃ(<¸-ãl:By¢È¸MõiŒ›¨ß.Œ G”4á( gO ë\ɵ*ÜÛöÉ'%%´ÛÚ ¹Q­ÁZE€CS£2¼úGBŸTƒ¸³f™ñ$¤ýž“Ê¥ò_Óß©,éÊ®DcjÓè´ÖÅIIí/ÙýbCC$‡†XGh[?’ÃÃhÍ·Á݇d´cB¯Úÿ¿ÆŠf#ÊÑ…$ðô-»H<Á“¯N ò)ëø’*çùz³áºün )Ï¥/_gÆÒW¸RxŽ£]¼Pwü.y¬²:RdÆßGmþ>î 6þ9,ÓùÌŸÚ÷æ‘R˜³×\l”ã"©í`F(äK„ X” )U}»ã ‚)ñ[ûÊE¡ZM„”ÄÅÓlè4ç*ã){¯ÿð–Øš;ÈPØQÀê¾ ÷Gô½ž€úû,=·‚¢@UÀ›[Љtú‚„ëú#Ú‚:yƒR½n á›z’UŸ#QýŽ(¨wX÷m·¥l{2jG ¥©ŸQ,Ký¸J:Ó&7*”¢nmí°ÓpYJ¢Ù€ý%¥ÊÏ^• vü6翃™)˜]€ W ™Ò:YÙ…ÇU­‹¾€1£ÛO¡$êh\}pÈÒçtˆK e—a8%¥@B¼ZË´Kõÿ¯„¢„ÂêÛî=ÛÂMz3óÌe12íIƒXŒ]zRpÿ}Ïö=4¡ßky¡_ÜÊ2|NDq_ nô<„+4jçܨßçoè=¹cr6÷c1­ —a4w >³ 3iûbz@'ü©‹B…öv½ûû[×•ÝØhÊX_þLm áñ/åªÉ]…oþ·æ^ )`=‰”xzè²É¡.nlÃÈxj!WJ¿Æ'bhÕ26ûRz½Ó’"ßXRpq­jm©«=k?*‘ΫߔqyŠô®¢Ó}"%bÓjÅÿ4Ìp…Õ¦ÍOQP?Õwvž@£ÿqc‡vÈà§?×Ü„ÂB?H¹×}Ý»¾€Æ0‹qÔŒ)|hRc³tÖJÏ/Ðaä³»z/QßoÇ·õÜÅÛÆè\Ð þéMF§áÜ,üÙÿ”âú7…¦äFÕ‡58ZT6…Z:6ìHLÆÌÜ‹êOµ"CÁSž”dÐ;ôè@÷žœ×^Šá÷AÅ•‹rwÆŒ`}UuÑþü…Í'Q.üý—EDjìû›ËJªˆ"DÉ‹·õþ‘q|É)ìƒ5¸]Ò³û²90®}6=-*ú© ÑÓ²ÚŽjÍ'R¢6X]„'yíïSãyŠ#D+¿ +¿”Ë>Ñ£0W$÷ãÿÇ·-¿¥u™6yv€—îõÈì‚ ¹“2ܶìÈ2ÆëÝkk:7W,)ÃΡºÉ4lW­¶;žìùó´ uq\}(³¼EÈPÎÞ ÿÖ¾ó:2Œ@FS q--¢uœÁ’hð[H¸ëð <ËÌ;»þö_gÆÒW¸\ÚuFøÚm›hÃÅІ‹àÝcx*ü´©æÑÉ$ ¼‚…H`,¡ <ƒ6æU»Ÿ Î<­ThÃûê‡Ð©3–àkÅ¥³ž jkî,*í>„ønÆ„žDâ:euQ`xØÒ:&‘òh5;Ñlš«‘ßíZßž.z(Ý‘¼•í=ÇžB!9=±'w»0ñ/ÿ!#7ÕÖWÞ²B±E)6—¢îZ0.÷Éð”žëŒÈr"ÇËTN9:P NqO'ØRAªñ”w?lÁÒm)ÊßTuoN &•ÖX¥2pó»ÊŒ‹ ¬~Sœ¡°ŒÃD ÎúôtÅ»dú…òô#Ô/lc؃gƒÎ䌸õ–é™–ò85£mï©2ð\—S*墔âÕ+BoÎO(Þkøœ”gÐõôeýɉÛhw]Ší»ÿÈש›¾¬v¬ÿÕ¯ÙXÒ3\¦áä¼P‰@PYy¯S(—‹Y #c·\ôµÈ5Ÿ3"ÝA#Œ¯98Ö¯v]y]®ÖXRÀIIœ\÷?°›&Юqë Õ9ü¸Bµ¢ö8²'£y­WÕÇ™´N’iCÄN„r¶æš ÅŒ'„Z¦Ì½½ö@sðtÑ»‰F|?Geø|WðIIa§HéžG;u;C"%ã#‚2K÷°¤‰çŒíºÜ¸ 7áÜ”ú÷7Ô–¡ˆÏÀˈhvlFÿvd|M]T;[ í§ü¶Öu·ã‘ï^ou~Æ  Lo·DmàöE( ‹›º_q6V´ç²F‰á ‘·/èþ³’/“3úL³©õWžÂć€ÙY¹é¢!‹éé Qpn®%àö ¶®×ÖÈhÚßòÛ^•Â)ˆž œÁί*ì®éýZE¢‹·e,åMédWß Q×s“H1¤³Ðså:ÙÉ4ƒ“jG» ™´påXÄ…ÕŠ·D15gMÙ½9̹?›%;,7ÓÆ¦Œ³w~¦Ø«FZ¶€Õ1)³1;åÏ*È7™VlGvØ£KUŒõñ!è¤^*x·ÁÆ’ ¯DJï— ¾²ýv^ŠÞ•œ‰§d`ÄS¾¼L³nso(F~Kkbù¡Æ½¸¯R3¥¦ œvKs ªŸ¡° ìûŸBgþígåvÙb© x¶D R½2,ŽòB‘(›¯ÝªÐ±â¼}Ýq™[YÛ!µcûPí||î½'%ýäPë=ŠŒëO›¿jGP3×äS+Ó4rÍS½>:­vMh|r#2¨\]ù›`ï)ö.Ô\ƒúL¢Gë6‘²¢Ò!U1ÛΑDtÔarßú|#¥u j.Ã_®'•|MÎÍ1{á]“¹E¬h²í§6¾DÓ¨¬É%{?ˆÐË_¢µ·`r¸„Ð(PvÜ8ÒiÛ§køCryèíô³ëoÿuf,}…ËUj;b¥"Ðf©à3º\ìÒˆ½µ÷ƒÈª  ô)OÊ䌱M¤Îá³-JÀÇvÐÚÙayq‚]~¶î+’»àÈlȸ>_Ë(B .ÝpIeäRrÂæ¤$…ª¶¹.ÄNp³ºß…B¿zÐI-Œ¢6–úo¯¹¸%GVÙjËå´±„ £§àƒ­ì±5)¼xJè„cú-%wÖ$(ûõ÷ØŒ”U*£{:…åN¾Ô€µ÷œ‡Ù+05ãkDZúŵ#ºÝ/“+*sü7p IDAT’‚Ÿ½f¸S©J¦ÍÕ³´– ‹¼qLÕ÷‹×E©°¿¡û¥l Ž,¶¤77¿gÜ;qŽ'(†¼Ë°âW.ʨ1òÊýmÝóá§jãØŒÅM+ 2•Ë£RŠÒnéû 1jªÐjhÞÝ|ô$¬8pËÅ£u±·)¥Ú“‘1yZ7ÎÁÿûãge?Žô{ås ¾6x¨ÛÑ÷d†£ú~ÕÊ âÉ[M¹Å…3SÛ‡#R¼ñ–e”Þ?ôñ]-´žÎ]òóèÿÞbwÕ+î¾Ao Bߴ皘ÏPfPïõ[ SnDÏëÉ(VÏ’ö ª&c³©„‚dÚº7ÕÖ£µÈ沉¥ŸçWØáYŠûÀô$ëÔ?GnL´—Óø¬²£xía2 CCbÄNge4¿ÿ¡Fí¼xn,ÀªAºå¢ÜÈ[Ë⪊X‰‘ú©ú jîû‡%ŸfG`(¦½¶ü™&Ña"–av°mñVú®¹ ÛV˜¸`sÙ0doß#Ýs×=¹çÞº§7éÍÙþLˆ7©ƒÆ»`ë`ê¢~'ÓÊäMg5¯Gy=« l>}ÊÞÚitXuñ€ýÈhšD\JMíäzO ĉ·ŠÂ#:ˆÈreÈEû.ˆŒ£Bª6¿e«ä¸–ß×qÅ,ý~¯3cé+^®®‘cp ¢S¯ XvåpWD™/¿¦ïߔ˲Q×ø®¯ Aêv`<«vŒI ¼"#odJcý–¼ OÖî¯XQÞ>Í…3xb1xZõET¹¨~7êjw*£×AÅV• ž$1Ù«yhÖÄóT´@ëhLõ䆯`: çc¢nˆF<*×nknÂàýOWµ.N*ª ïx}ò[âq G5¯{y¡I¹!5àåðÊuO^¹pÓŠ÷¢x­Ù«J¯Ÿ¾¬9ÈZi†·c%w®òì0œ»¢qh·düŽLÛ>êµRAgè ¤Æ!zs–Nެíñ”îsþ9'åŸÊÈ€5‡ƒcj[4n±KCšƒN«jWXI¶0„§ÎØk7Þ‚—þ,FæÖ7_ÐÞëëWâ†C#•oqn´Ý5õ)!Þíø8¿ KÛ¿ö-Ø,+Ó³Ó…»?R±ßi.ï 4qg[rkØÖâv]ò£ÛñTtÏuO|Ùéª-27KZã=¡^¯ü@e}ú‡,î­‹ê‰Ü¦±4á…× ÝKÈÅÚE™{m I¸¢u<ò'Í0«”„ÎýÆXç㣣ÔÇÆž2øç§&CßÀgÃ]n£ÃÞ2¦ ÃèÛè s`2͹ÕÂözÆäñ’­='ûÊø,¸37ÜÎuƳô®çc”:x«Û¹Ó\àõ:m„è"?ŒX¸Ãx·[ùÎWÐF[À×Pû¦}æÅ+5íÞQdD%77YßÜ$Ž °‹èdSÁ§=¯c115Ä0}x÷áò¬¯}µ¹leRuRíÍé¤ý´-wã … }ÞRÉQJþþ¦àr¬¯Îý–ÆŸLÂX}¬’„]£¦Ó`*ã´VÃÈóBz^aW,Õ}O ¹pS÷´,%°þÈ7m·¬`ªÝ'–°€ôA µe ðü¶Œ¡ú)„Ÿ~L8Öfÿ@ÊÛ´»Q)´ÛB*f¯)¶¥vê3p|¤ûŸ”¤L’iÛîšÚwée!_Á°žÕnA_Z}ß^…‹?ÐdŠD…lŠÒ!ˆÜ²ƒvï¾Ý7„ðžbOú€'«âG::М¥2Ï­e)³©‹z¯¸'£È)¬„e×E-h9„9ªŸB2&ƒâ…×Íý† íù«æzJi¬|™ñßðö-¡½–©”Jk\ÒY)ÚÏÞ‘RM<Áä“/T¸¶'£±ª‚¸¿!¤ãúÛ°óHŸï‘¡ ÃÓÇhÎdt÷ Ü„ñqÍY(ä?“‡#CÅbI¯¬ƒK†8]­ŒÊЭžh M_R;Ÿ>Ò:¯wòRšÑ˜æksYã74)âÑxR{h(ãcÊzs°ú9¤›šŸc4w„0õΡ™Æ}’ií¹XBm‹•´ο€à̼ _üÎ]ÒZÊ«f\½jæã_æœj!„æƒÛÞutí¦ U„äœ>ÿX†š£ ™¬ šÐúi5$ò¢*p1‘É^D©UeW^yMëìéC[³QG~[sÝj‰!ã!&{e|UO„d%R0QÓ{C`k§*ïòâ¬HRð´ìéÚÅ"@€*2ŒB&‡ªŠÉÐ!<•À‹&o_@‡Ó&§¯çx—º|Ù=ç2”«ørG½hŽÍÇÙõ‡qK_árP­ PvW]é‚m|1×2’ÂèôqùÞ À·ì³uà%äîxj÷Eð0‚‘1tˆÛ@ïÄÙl–Í{÷žUñ>@¼z"!3:í™ –Ž*E¼VQf“#Œšð®‰se” ð¤è…R§£ìq}fk>ÜTÿ{­ÿ‡è$]·~»t_w¹¢¿é¬˜¤w6ñÖŸÉ-RzÎ=Ô“ðA³W¥¸QqO®€†ÁûÇ ÕDÊŒ½‡r7­¬FXJ·÷2°íÉ—Õ—…KTJŸŠ¹¤ÊEȼ>Ì…È;k>}¼¢3æ¶KÈèk5PÝ7 ~¤³ú¿ÕÂ}|GŠoc]EuOËp¼,%ÙnIÉNëõfÃsNµ€½&$ïK7ºg4Wn*>«È£%Nqž+x:U?Na×#ƒõªæ4•‘¹ºè‹d¯¬fÍ‚ëë"ÿ«V … é3јƄ¹œÜþ‚ºËÞHê´uïÍe)ñg÷OK‘Ÿ¿"Ã`õ¾¾Ox¾£+¯AaÍbŠzLˆ¡b›NG±¤Ú3sÅh Naa^ý?.xÄ2–„¥d¤tÚ_ö”ÎÝË Ï0öhF/j·KÊv …-ø½+C)Óýû+=7“"“ºž¡}»Dß 8ÀÂQÍ+÷¼¡99¯yZÏËMÛ^â 2InôÝ5xùmøé¿òįí|"÷ÓB[hd*£{u;êçФ2C_¼*#héŽöys'GàaSéï–Gkª¹k`“ïú}[Üó´ ýFÕQÙâØ±¸¥FMó}ÿC åÍ+Zkù-¹TûG4'¥‚öæÆ>ôE$ã†F4~O›w *5í³Õû’IãsŠ9ÛËk= „Vµê×·2ð‹’%¢$¬3dò6Pü9„t_BqF}øŠž-~ø•Éö}T¦ê/ñ@qNîjàu&-¼’$’ç[|=×ïÚuvæ†ûòuæ†ûŠW¿x"Hhvñd‘ad(”‘¡4‡6â2žÓvÁ¾m´9¢l‹ |É“,ð#´)ZC<ìîRZZzF4·Š äË–ÁÖ›³øš^sÇ “åЄc_D(« Þn ÑZfU߀”X½ ä”g (Ä¢'Š«"ã1j}uqL.nËÅ4jdi_4&Ô¦\„Ô”„`4®ÀãvKî²Ùk:q^~Uío·¥Œš5¥oÄž–rýÿØ{÷à¸ÎóÌó×÷  4îAàUE‰”([’e[ñUžòTìµR¶§<‰]qÕd³vM¶²®Ý¸²5žMþHR3ÞI2ëqR±¦âŒÛqlEVd‰’(‘DB$H‚¸wth4Fß»÷ç;ø¤IfVÉÄrÃS…jt÷és¾ó]Þ÷ùÞËóî;¬ß¾Ï”[0Á®¾4è÷àqOÁ™Oé³€1Ú*Es)§ û‘ˆ²ïüJìBè£loêºéUýnäÜ÷ S`4ªç¸zÞçåàà)öÁ£¦t‹Û²-Ï™¸ÏoãUÈÚÃø¸@î⌔ÔvZŒåå’>/æ{ã(®\FŠÉãhH-ŒÏeV~ $Ëßcëv•‹09«>žž™¢/(àšë‹R¤Wž6ç(íZ2ÇîAã:ŒArÞ›š¸£Ãú>Þ­y”Âóùõ\½zÅÕö™«êoŠ5Ö–j5ÍÐùöS©›Ä€®Ž Ìöë}¨ÉpOÍ«ýå’ú!½ ÁV`hÎ<nð…0µ^r‰yÕטñû´aÈg£m5åofuNs¯ƒÝꃙ«&^+bË ô’§XSŸßü'H_«SÚÚ¦V•UseV@Ëå†Í¤€Áík†P6#à±<-p:pXýµµ.×àú’í &Ûp©!Z€ã!Ëøõ%˜Rß*ÊPK½Éœª½æÄô¹]ºvH甘°Õ}‚M×C=¶ÏZ:4u»[]“Œt¹EÞù°Ù(¥W5® v8Öêw‹¢EIÎYžµÖ„ú:“Uf[³‘½~—‹6l¦a¹ÛÂ(¥ˇ׆Üh×QÉ’ª‘Ù]ÈâŠ]zÈÈe‡‚å^ó] ÉyC·wD‘x»€Òã'ÜKoáˆ"ãB‹±†aŸ#h!æ‘€iC¦Ïüf Kà”ÝÆ2]×Ñ"¼ø†ëß<‚€™“¡âG <ÑÖFp`@EhÍ}7°Š1Ÿ•`öúäŽëm·µ—ªh¹»-!—Ii×V.ÊU°<­óÖuíæèí¸Þ*%}WÈÃ}¦„BIJu:"jh×U¢>Y#B[¦Â‰'ÙÍÉòR«ÂÌ9îælûŽá.:v¿žË‰oZ_’Âp¹åŽp¹¥¬·ÓŠ5r\ý÷‚b÷”"hT•ŽäOÀÖmxð3pr”޲~9LèDõ{° héy3ÉqZNé©«ólA èá÷ýËQ:úDkPÈCÏ `ï0´õHy—d 8ñ ”`8ªàùx›ž¿#ªÏW–`_ÚÖ;$PÖÒ.PQ.Z ÓÐòçÔªŠUZ™•òr2èêU)·¶„\¤Ãw×ZE}ç&j²VÆâ:Ç)1ád mlJᯮ4Ӗи8±]餿UÑxÂ0ú{57SŸüº\L^¿¬½Ã²".ÏZËW>£IÕHeI¢­ŸJ˜žTÖՀέ׎u]¿RO'Ö ;úÎPßg—Üì¤àcuÆÿÖ^*±:gw×~±¹{ý°8«µå÷ÀJÒÆÐLýy–ÙK–z`w[àÏåÖØX‘ëx; |ÞûOÕç+] îùLLÅ}»-ØËçÔŽZͰ™oë:Ù´©hã[;­õfr n^Õ¦%ê#mðàiõ}µ?Þ­øÄœäÕÂ,ôx” ÒX¾{,UGg¿ž­Ž¬Ù[ëpØ€7@í „, Éêœ ä^1–©.·Ù7 ïø00¡-¡y²<- ëX˶Ömlõž!˜™KSšÃ°,}“=è/( leäñ´¹gÍÈË(ÚÜ6š7²9gdú%¦‘«­žy³ô(þ©S¤¹ïÂæ3̽®òöw¼²Ç7Ü[8œàn' är cØš±®§%ˆ¶Ðâò"÷Ù,H=(Ó­€ØYÄÉQÀ¦Io¢Ìs0e˜rHÏ6vvè¯V  TÇd| ÕdµuÉ •3×ub^Öï–)‘Ýœv²“c–Ñ7Öÿžø*²hµ—`_LoBqLJveE‚d7A4W´À~™*hVerŽÖ„±p™R+³"ís8zjU è@X%>ýŠs¥½zS+³rQ •àÏe´ëôx ñ>µ‘ Ð} " XŸ€¥•¬¡¨çau ¼™rã⑹&E«)ë«9˜gð`] Å{Ä[ë%"­jk$fbàah†|’C'ÇÙL äBj«Ç Ë·`ßý°=û†`ÕªÜrÍyÃʽ)²Áõ%e…"R²õª>ódAké0¬Ènã–ðZRÉ@H}R«* ¹\²D›-&Õ?›–E&µ`îw ÕriEóe|\ï¸å’s!KÉBÞXÀ" ÆZ­4yŸÚÀ‚žMºF{­¡6xÔ*ùzCßתÍ;Y¨LËRÚñÏžocÕ¯19Ë·Ýô=ÒJöÒm=š·Éë²fÖt½îAS¦'¬þ[[4E”cvmõ Á…§4æÌøÔÔÞ•YQüpüS6®mͤèoC­®ÉÕyâAÍE×döHf‰é´÷›ßø±™Mhqo~?žPh[Æ96hYÂ3µ ë͉íZ:W¹ øM¦V0¬TéRA;ç…Y¹\ ;puîîO"¦ÁáûÀsÙ*➘]RŽ HË-2my¥h@Â?µ !mµDŠÁ„âƒVÐpfMBww[Ö ¶K,Þ’K"SñÀa)ÀcIkŽKiz¼R.7Lk÷ðŒ¡¼>ðu£Û€ü1$NÂÕ?†[? ³¦]íò´vÏ\/Р©R"¿l¬wAp¹ŒÂê5ë ÂÒKpkB®Å˜CéU)Þµ%('K° ‘V¨9©“qz†Ò¬/É’ÐÖ-kRq×ô>¿Æ¡Í¸"Ïæ¸ˆSׯ9.ËÐfʇ ELwÓ“Ëhlåô˜NYž¸™ΜOΩÚn¦E¬^OÓêS» ;ºïúºÀY­*p\ܨôe!š¹* ”š—ÕÓå6YhQMêe=÷õ #¼øj»SžÃ)µ1`æx{âÑ6Ç oVU€:—‘¢ „Õoí=ºFìžZðô¶ãiÒ…”æö¾ÃRØù¬@Fÿ!Y¼âÝðâ÷,Ÿ”/ ð•Ë[aÚ;l7Õ²ú+Ü Õ´Œ? ±ÄÞºœ»QåÕ?½Í»>ˆ4pG/±Ô2ëKvŽ;¥=œ¤ P€Ìã5µîvDg0rJ±JK³²y\–PóÙgl¬NW“€R ˆ›8¹å 88$KÝÚ¢æO¹¨MÃÖº®±›Ó= 7kx} Ô__–<ñeõ•šiÔP–²’ÍC.#à—ªAš¢*2\)ªLð$5w]n%zø|6fÑãÕ5Z:,èð®®2Ð*«R=ÿMüfN·"·›c™¿ŒÍ„[A”!¬ñ®²nÚÞ@”cñ_AÏW4ç:s däàÀñ³sÜKoá¨!…áÆRø°¦\ç³móê˜}ì7¯šó;Ì9/# ¶)¨[„-"÷܆ù}ÈÜã&ÊØØp¹hr¹hÆfâå0œN“± ¨ZÖŽ¿œÑÎwîº\U¾”R†8 ³³p{ ºÔžÛ†šûÐÔ`>”\FŠz ·L .XlH(UÌ35›¬)gW˜ÏÊ•â†6êR„ÙM½:1T^Ÿ9§dÊ?xå<|ŸÚß;l\ eSKʸ*Vf¥$Î¥½Oß„Ä(„ OÂÄ8<ðA´Âs_yoIÑ­/«_‚¦´‡;Ñ…Ç7O1ob¦JrºèÐ(gûÇTJjW£.ÀT)ÉZwõ¼ÀÕ•çå~ê8s¯H7  ¦×§×MüJ´Ué÷þ ú°{¿qV!>é±72zgRúÌÐX@ÒÞ ”mV˜ÃKår+_ó¤ÅÌïÆ­R¬inµukÜݳjC¦ S˜Pt†l ºw׈ÀAça¹±j5(•õ]6­ûuöY Ñú‚P0"«F½. àÄB%¬Eçß‚„‰Ï<*01À1ŸWû¶PpN'X9ÑRû15vö¯`-«$€„À˜ÓŸ­FTÕ¦XÜXd–Lù“’¸£w™S/Ιã§ès›¸·p8 ¹å=ËÓðIÅ®»Yž~ŽÝ$”œzrþ Æ±Q·|Eù’æR1¯ÏÚÒ;ñ.º-+aºYíÊë)îèàA¸>; ènør\ÂήUµÁñ%+Ê%YPÌçn—Æ5¹ g7+8>U3…j]°ÙÐ^âÈÝ£R4‘g4§Ý.ÑC,O L…QA¼ .ÏÀþ˜]Û%`ÿ @jµ¬±õúÁ_†ð¾Ò.7gÖ¦8‡ÀQŠ í3²ÕÙÌu˜ÏÆ<îDÖ¡+Ø kËó”DV(àJ`“zrXN¥6†óíŒs¹àý“=¿ÃáÆN 0^x"háÍ¡ÅXÀZ¢¼Hµ™ß¿Œ‚ÿŠ˜X#l–ÝðcäÊ;h>ŸD.¼Gïebuxdî^Z©Õ¤Ú&«hZÄ„ãvtC¹Ëǘúóó*‹cæWÿ!±ëÔÒ!kS­ªkNŽÙ`î@züš£ÕŠæbÑì¦f'd] „5®¾PHC÷)ºF—éè…J¹LpèyÒ—µ.ŠyK†ËZS*¨][ë,‰|Òå¶ô ›)OÄX f,ëÈòÕƒ¾¬aºŽj.uô½ÍðÚ˜~ãñèþéUKXysJó7ån2צ˜Üzñ.èýøišÏ$ ïA™>ŠçÔ1‚?ÿYn/¿KE‹ýƵÔ\™º¬ÏÒ«(&ïö^µ1RåMfZÝd¯9}QÉ…J}íläüAxïì?`ݺå¢z ¬ç ›ï–¦õŒó×uÏ\FµÜn^2Yˆ[Í`%#ùèÇç6¹d‘š¹ó+rûµÌ|ï’ëpfM2ôÈI¹PÛº ½€‰ëî´4 »Û°8[«Î6 çȼ앢 ¡¸¥£FŽ.!P³ˆ€Ô³FÞ.ùêx˜s ­b]s ö-!×\V¢‰"²0ŒœîB2þítÃÕw{ܱ,½…ËQª`-0`ƒ“ØÉå¸å¦Íû5dö …6ˆÑ6n-.–4m¼}-Πд¾ÎÆææ^åøu´¨¦­^,)íJámåMÀl¯10xlpqï°ªÇÏ]WÜ“#¨_¸:ï IDAT[ õmðævÚÆ¸,ÜÔγ§Ö× -ñ¼„N‡éƒ£g,Ý€C–7=n‚“;V)»Å[V¹Í\U|HѸ…üAØY‡¦ûôçRdÓìå1è=ln€ÚyŸ>ß¼lhü@zÙp´KQ­½åjßý<>`0F÷ awî8F¸ùÜÏL$¦g®¬Aóa –€¹”aÉT6?ÏÚ¢á¸*IyÕë¶–U×~ˆ'LÌL\‹r:Š7HópjÿªQ׫0Š~eÖ¦fGbŠëYž5uºÎ¢ç«#«` Z`á¼èÆ23«X+Ðò09Ù[¡¸ š“[ÀBI„Ž}PÉÁÁwÂØwàæœäð) 6HÏî7y-k¸t² öŸš€{Þ!+O¹(«‡Ã>¾µnÆnΤ-È…Ô3®9µkiFJ¨ô·ËÂÔ—UÃã‘Õ¡{ЛzLáÕx€P«Ò0v®ÔhïÑ|sâÚ:Ô†pÖg¡#Qdcjÿé4Å€°ÆÛ㌤ÙZz3GT.—ž’U,1 ùšM«³WjTËÖ*³—:è¡;R“Es}.ü±´ò™Ç ç ·ðÏ=K¶bæ’‰uÛÍi®,MÃÖ¦ÖêfJ`{æuqùQ)ÇM‰Y°¾e’:*e¹×^¿!~§æ8<û§ê¿Ûs¦¶žC ëµ jeE²®ÅŒ‘Ç ë8uX}‘2nÓÄ€ÆÃá–;zBýrO+,fÌæÒó›pæÔ›W©_QögÕli—%p}E„ÍUɲFÝÄÛí H‡Ì¹ýoÍí• ªÙëX׋S’Qq,õË*vCCîÃdi@r°tg±ÔŽ.Ø6r¯hÖŽÃþvwÜp?ÙãXz ‡CVÖ„ÍL«`'Ó 2Ã:@È¡pÀÓ»ÅèUóù$ êv#.<–AÖù.cÎu›Ïo`j‚‘®.:âqV_}¯¨cK·¿ ø²Ú‡£Ú!º6µ3óæìž!çñ(æ!wÕH?< ϋϧ×ÄÙT*ʨ! ¯œ(M¹¥¦]X3ðâ3âGé×fÝœM nÂ|CUj×kdR¦œE—ÄêÔÝâlj4CÓl O´€¡Sôv,A&E~V1(MMy–¦B8ñ¼ò¤2‹¼Èt×wšºärÛ6yØ®-<ßJ–q‰e¿޶íl ÃÅo ÔÅ»¡åìi˜¾'ÏÂøy§t©Î~.]³µ½6°ÚaAîèƒì†”@ä0r¥Æ©¯C¤ÏL¶ 0+!1Ü/n·-+RËӪ߃þ.í4ï~H±1£R3¯Ãüš)YaÚ·¸¡—rI÷^4¼;~´ërÊ&d³–麵SB8ƒ¹KP¿]býBF]B<•‡"vHm•k £èö@Êy °ý&D"þ&¶ µ®×‡²Òvas84§>«”þâ–âvÀä5Ì€>ŠP0ýB[†aóÞ÷Lú}ê¢+Ÿ‚§yàƒŠç¨U¡¾«l·‰KšwÜFßýqh>ýŸyŒæGG‰½sÜ÷/`áyȤqŠC=Ë@ï\‡jW{Y÷ ÆxgËdJÅ$tÁé/0]þL`±I/÷ÔÏÍqè;`êà™üæ]32sÜeŠÁ†à¾Srs–‹"Gô+²4 é?ËÀa¬œ‚®(Ôï †03—hï?dèürAŽœ’ëåjR¡7‘’Jx`£¹’xtù4tkaÊ$85ÓjtRÙ|.Kù©ïÁ‘áòÀÐñO PÙA½Ã0ö¬»câïþìP…YY±6Sj§ÏáHháoE¼IsmRi€•Í ÃžûK7¡m)À¥— ;'kK¸]ÒðЈ´A“ÿÙSÐï!ôà1‚‡<&»­O>‹ ¸›ÀÓ‘S býP_†â¥Šç.R.èjUÅãl¦Ôßý©GΨï·ÖÍ@b°|â#jÛ ÿÒ5!ÎØ <ð˜âZÖ—aqÂøTLP®ÿ ÅC†)ºè‹ÀñÀÑ¿ >‘8éT¾£M‡°ÂQÅ-Þ’%dyZYŠ'ÔŽTœµ)¢÷M1Kúéd"¦WL[Μeá¦-ØÛlÜ‹!ÃÂÞ5¨9T«ªÝÃ|.£yŦ”;‰…N¬Œµ‰ˆ22—¯éþ±õñò´¬IC¬zíeYQvsÀø7áý¿£ ä>óXHqä>è?!À·¹ª¶îædí£^…ãO@)+“ÂZž–ƒà~ð!è˜É²|”xá»êÃlšz5·ÛÃ# âNЃÅÌ¢ÙI¿ÿCÈóí'?èGQçÜøSX8sÏBTÙt‰e‚FbÌ·&¡3"¶÷ŒFæx=¢›~tò£šÊôê„•¤–AwbÞ!è‰ Dzý¦¤OXýÞõó:§Z–¥ph¢1õãÆ²rÂQŇ­ÎÁͤâ’3y´ù­` êþc8òù<£££|õ«_ý[¿ÿíßþm~çw~‡¯~õ«\ºt‰®®.ÞûÞ÷’ËåöÎyâ‰'¸rå O=õO=õW®\ᓟüäÛõÿÍãŽî-5, hAUßð} :N ‡wÇbšÂÀ!´`Ò²(ðÖic -ðsݲ*åÐî& ìO&Ù\[£îdh4°Lµ ¬e¡%`3²B)í˜ dõú%°úôÿðÝR‹S²Ôª&£h=îŸY &$ ¿½cÙjF i§!?„ÜÂ4[R ~Ôéñ(¦éòs¾Å]˜ýÝ'U;nYßGš•Þ5_ì{Ö¾W/ÂpÏRù<îà XIÉR³:Ïæ$ôÝ…jëŽDzR¨ïAYž9Eá–k¢(פÌ:ï†1¸9ðJj}\V)÷K¸g—)gÕ¾•YY%å¦ÏôÖõÓäœvÇäÌ`UvôwmFÞµÁÐÏAj\–ÿ¤@a) ÇFˆ,½D$—‚¾ÓtçSÊæªe©¨WEˆ9ð°ÍsKN³cèØ1¼4mÐw.ý@}zõ¼@j¥,ë¡c…ŒfäBs ñÆâÐrÒCìå¯>K&Ó«<õ¦›ôš@mÇêÑ;,7ɉuÍäœíí ,'æ¨5Å9è ÀfIkƇ¬OECX¹“…—¿®ß‡"šCÇNkŽ< ¯=k3Â2)ͯ¹ë0Pÿô/Ò4€|É?ø"ùuˆÿ_ß…ç9¹ú»¼ø]­Þa½öÏNÂp¦ ÅY„ì"Äòç„Jâ1š¼Y¶¿ÿ,…¼2ôœT~ÿ<ÄÎÄe ì…#S'å~¶KÊp»q‘—¿%‹ÔÕ—àŸ|Ný@¡˯À§þµ÷‹¬/OIiM‡CŸèeæÏ–ÙÉjmÄc0—µ©ù§LvæzVjÐ킞„å2kï1T 5›9Öß§ÏuW¶&9t×[3²´«ß¥Qbµ'Î ìv4Æå’u¯¦n£©3×Ñ©ñ/— É­²(Õ²æ[“HN‰¯ábÛL[>­µEŲuöéù¢­jÓþ€æ™#‡=H&yªUæÜnŒ<|gùí5K°¹Õ²(F©<DãX € ‘«ÏaIw;Øê@V*Ÿ9·„6ÉoçñÓŽYzÿûßÏûßÿþ¿ýZ¿÷{¿Ç—¾ô%>úÑðGôG$ ž|òI>÷¹ÏqãÆ žzê)^yåΜ9ÀþáòÀ099ÉÈÈÈÏãüww,KoápÀ‘CàCk˜ÿ×Í«x2Ê-ø½…v'ed>‰ÀT2ïy4AçÙ¸[îó ð¶·32<Œeo˜Œmª¦$(+vÂ;Äv “f¶Uº‚gëU ¤ì¦ÒÚ¢v½“cðÚS:w#+ÁÐÀfýEp Ù€Ærј¥‹¢Á®Y)[—Ìåç$œÝïÆŠîïñjWmU ²èš½”…+ßckjy(Í@r ÷>xƒÔ·‘¥&mï?E%‹¶´©yjcÚéŸù_ ¶ZMn¢7( …o¦”G½/‡ì4„bx}ZD!9û4>?ì;*W^¼ Ž=`èÇ¿ Ñ^(+± ³&ŠÊ@>ËúUh~t”ãŸJÐ÷ gIì³ôt“»·õä–•…xÿ¯AÅúÏ)ÖÉã…G>!Ðú𨽶ò‹xNŽÐõùÏräÿüe>djÚ6¨”Ìë ÍaC­Ð;,P5xÔ¸ì[ÙKðùmmÇt NÐyý‡,Qm¨IÉ¡ˆ<ϯ,8·.ë~}Ãé “…Úa !ÃÍú¿³O㺶dx¦X„5§2y˜È è]¿(åñ˜‚»ËÔ‚6Tå"t’ÜXžV»œR:M1=‹?( V0òÙoþrÕ*Áj•#‡ßc^׌ì6rë ÚÔ9ñ¡óX ùe#ƒ¯!™~ÐÈÓcXÞ¼†‘yyó~Ó,cÇó0`¾s‚¿ßŽ£Á?¬ ÎÑÛÛÛoú+•þîö²Û·o“L&yì±Çö> <üðÜ?€—_~™X,¶”î¿ÿ~b±ØÞ9?ÍãŽeé-nìr£†C…&ÛÏT0ÿß…2ÞJHgé,ºëÈÒ”C‹lP˜ï/ïD ©×\ë8ÙÞÆU*±cîׄ„™³Ë ¹îAº86æï¼ÙáÅ ÛrÞº…õ>ƒËWá‘G tØ(²[pÏ£ðã?WKÄ#á¬X~©ÐmÜ4ÅIk†lЩÏ/…R*H‘í·Ò¼É¨s2Än^2NÃРƥµ:'Åë•âÆXrX,ÁÉSÐz€Ü óÄrK’š… |'ÈÂ’*á9} úÏÂä·áÊ÷Øœ„¶G(†©^¥ðÌ9BC(cÎÙi çíKiê†$Ów}²Ÿ†t‰BÊ;”E8j²ºvaé5}¶<#%ï”öpÜTkKpð14}JîD“ÐêÉÏBiK1Y“߆ÿ‘ÚÛ§èd—Zöé¼Ë£ŸÈê:Í}ðg‘ec'¥¸›¹g©Íü Þ3/ªß®_°YD¡ˆ¬8• ø}rï½ö,´µ™L¥§áä#zÞ\Fó8Œ1ˆõÀÖJ™PÎr 5êꇠ0—1VLŸ ÆNÎÉ•–ß’{¹ÜòÚE y£í›:×q;4©)ð›cpÏ#j_S ö÷iî,$eH 5êèâƒïVeç }“PKÀü˜†Âzâ<ÙyðÛ>r·Ý#psR±SûÕ7¿MÛGÒø·à‘¯@SB ö¹/ÉzX•)gj\óekŽ<ù4t ™EÛzâr…ð‰SðÀ¿4Ÿ ClßÄÿJñf ·[Ϲ“…T^±dNõî¶ž=ƒ¬tM12Ð%“e¹å€ÆÄ Ôw¹bvK2Ķð Hµt@mRãÝ{Öæàòœ®Ý‚æø»Œë¬¬÷]0™Ô\Ë-.Ø×°–Á,ø –ävcY÷ÌdDðyë%­ù´Éô›ìÉôª!©vVÖù11BMM¤=d2”Ѧt›á6iÎ=‚¼/¡ ïf/7d~ãF¨Õ³«›sïBV(¿¹¯ËÈç<a=h ÇÒÏBFYÿ›ÞÿÆoü_þò—ÿN×H&•™H$Þôy"‘`~~~ïœÎÎοñÛÎÎνßÿ4;`é-N}·ùß!tXª×"ZTCh·üZLmhá5#TEõäŒÕ™ý朊OÚ>ˆ2å6‘eiÀÜcØ y(%¾µµé1÷ΣîÔ­ë’ ÌeF:z$„FàÆ«¶äÄnNn·ö€Rϼ~YÊÍ©¿’‡D ü5eàÔòÖÁ´x{©¶«b½^Þ@,iø‚v²ª`óxuíõ%íà=^‹ÂŽø˜À”ëHJ8­M›sºÀ?ìšÒ•rKÄH@*ƒûdè8×¾Ã}"׿)Eè…¶_ÿ¿aîÇpþ/¡½LhÀ FYèõÃìUc¨Ê(x·V…¦R‰­uÅ%ùƒj{ÿ!hº+@ñfiщ³ê”ÒiŠé÷+:¿¾ î¡Üú®b—&¾Û%¨–”Z^Ü2)nŸV»‚-ú|å‚þ­ïB(.`µcœ»O}^V“r^®¸Ì4xxŽõÂì2ä­U ÖÎ}7' ˆ`“úÔã…W~ ¹°2 K+08(€·t –ršÇn4!ðEòT²Jè1™yS*Âê$ä29á¨q-pwÈ*#~på¤\BhÎJÙ—Õ±¥CÊ29§GuJ\|ÚέIyö&j'.ë¾Ç`íì;8 ?úŸu_ä³\}ÎÍ4 s= Mil4'ôÇàˆ ´ÅÅü½6® RÌÂÕsðè/ë³t@ñF‰QÕ̧ *óÄ€²J‰è™Ù•µ)wå5úŸ¸Q¹ ºÇæ$•2¼þ‚šírC:/Å\+ÀÎ ì?hãËh½Ç»µžz‡Õ÷‹+pßYÅõ êO‡{­Q×\za;¯1ïïÓf©^—o¥Î?ûŸt~mË@°fk×­Ì*«-—‘ ÚZ‡vHn@‹qÓ]]€‘Nó\F]ب Ô¹Ðïg®Â\ÞÔc«hžæ³fI ÐT÷Bý‘nmlà3r:À\ÉÈ×El–òÎäï$ŠíÆVC¨£ Öæ€ #È]çÄ7Ícédòذ‡Xóí:~Rn¸ÅÅEš››÷>ûÞÂár½¹GÆ›>û/¿ÿÛÎùiwÜpoñpP¥äX™v±@ Ä;´ƒæ|§àbÎ|ö#lf['²0£ôÖ0².]@ñO9s ò½w‡ëušk5ÂØ˜'‡ÿ)`Ú—2mª%£­Æ-±*Î%P —Y;61ÆÒ”Z0™õnC`¸i]‚ј‰u2©ïí=ºrN1;]ƒúÎç·±$ù¬®Cà·µ®6x¼rû9%7× S62¤€ípÔfÈx¼Šc(O× ® fZ‡Ÿøh–Ëì£*UÇ1}¿›†ÑÁõ?…ô hSRHÃæ²ŠÛ9ñj¹zT)ë—ŸÏè¦Æm¬HéßúN‰›—dÉðúËŒ@ßaèøÈiB£qšúað¤žÝú²p×§Áå%; ¬_“•¢û””÷NùWAÞ€õ¡Ç•õ„öãpÏg¥¤o~Û §òây»HùÜyÖŸ]&» ‹7l`v(bë–u Jù¸4ðõ Y¹ÔÞMÌ=Ü¥¹UÇ2‘{z‰¶Ê½33©1<ý¨ùNVŽý'eáÖŽ^8ö¨^ÜٜРJy¯`–Ç ‘Ñ;YÅUÅ»áÆŠ”kb@VÓ즬itÏÑwÀµWÞ`5ن͎Q¹47' “¥˜µ›…I³8 À¶¬‘{ ?ÌNBf^ÿW‹°1!Pêk‚•q%¬Žiœ¦¾§sVÇ`ñ<ÌþÛfRØQöØž)úñAË;zÉ罬Œyaìie2Î?/Ëâò…½âÄõ,.Ùl­& j,gºŠÑvšñs˜½’¸r^–ܺ±Ðøƒ¢6˜‘^¿ÜpŽ’ìì³îû#>hïRljS¼6f±³O™¢‘˜ê¼åJ’EÑVY=(x;•œê?¤q Gµas¹ hs)®®³O×MtÚl¾H ¶Jâjº¼©yXEaN²Mµ·—Øàà^1Ü(uQÓg#ËØàë¬ù[Åf4J0r$9ôu£´l~_7r÷.ìQÇðÓñ³ahnn~Óßß,uu‰¾ù¿´­­­íY›ºººH¥Rã·ëëëÃ"õÓ8~Æòm97œKiÅ ‹´°®šsÖ°ªjÎFòq ›^¿Œb–6Ìï¡…ë#ö kR›ù, 4U*\/éG»|Ç À9»›õèêXñù´û ™8 jY mkCd‰KÓÊ^ñš‚•¾ Ê ,/Aÿ\\ÜÝ–ÙÝ©._*ÀþÚÉæ³Ú1®TòÀázr{¡«Ï–&hïQÚøÜu1õV*†Ç¦[ÊÍqãäg¥Ä#1ýÕŒ¯1Ò!ÞJ[ €Î-É2ûWºÙ}¿"€ ¶Í›Eøâ“l/ $|âÝÊLóƒxVÆh‹ˆÜ·Ñ…~äÎs{iŽOò¿:ëŽs|k5Å(=£¶úz€á‡júÔ§ÿ’®è2ùYä6[„×þjE (>wžà©}póœ&×¥‹¼Ž|‚18ñ)xé_«´Jü0üùçà[ŸÓä,Àæ’©gÕīסãŒÒ5bCPÛTÐujAmwJàøü—Ä>)ÍÌšàn=kиê2)›ÐPß„„X½¶—Ö}ïCÇRAuëšbi¾€‰/Ú'À0{ ZÌ\yÑf“:u ÀÜ”æf¬ |þ,³W¡fæç]C©?³Y ®†6ý‡ôLg~NË@HàtrÌÆRm,Ëêâ6ÉÇï‡Ù—œeßapekWßw=ØðÃry†Û5®õªæÞJ:kbƒ/n)æÌol… ÜnY#K»Ú¤dç!v¶þÿ¥å¤‡ÃÕàþ»Ás¯æÀê TÔ¦XÜÏDMÀtXËC8/ðëq‰Åº¯Ãn<ÊEݬ½±!åjKÐ3¨þ †MöÙt÷Ýâ-Å)}šżF^%<Ðï×¼XS餣§tŸià=ƒš/^±àzk:]²@eÓz®¥i¹cQ£|&'U¨ UÜ GÀ̽^츻±›Xÿì,ë(¤¡ø½†¬IAd1ò™>5×¹‰¬K³È–§Ê +ÿ5óm~׌ ¢'°Yp· s@×Ûqü}Òýÿÿ®÷uìß¿Ÿ®®.~ô£qòäIÊå2Ï?ÿ<¿õ[¿À<@6›åâÅ‹œ>}€ .Íf9{öì?`kþ~ǰôZˆ,¥ tÇE·ÌÔëXu-T/ZPÓoømèúÞÆ IDATíˆ@ Íñ§± ,‹ç X÷!¥r3á@K ;éôßG“ÇÑB`­^ºž…¼‚9×–¤(¢­ÆýbR‡W'¥`²J9nƬvhdqr{eEr¬U°ÀO&×&­U«Vµ¼)™”©mµ!`që²~_ÈË’ã”7¹uÙº‹ºM:vB÷©š,›J|­(»í#ßHª¥¤†Pšý+8ô¹°êU“mvæøÍù¤^‡â&l/ÀÒDã$/¤é:ª{ì$¡­HÍ@îùøžé+Ö2KQ%ö½ƒgèÛ§N µ‹¶`ðݲ:{ò)"ÃsO½Э×:ö~·î~.}ÞùÄÅ2î @ˆEd=;þ)g·üM´ <,ËTfRãÓ“°´Ìö²”Ç+¥Ý‡Õä˜))³$%îõKyN\4©Ï58r\h«èœÀî¹®á ÎþpùÙ ®ŽÄìü;«pó?+8¼¼CǨœ¿HÏ­q7w]׺qIAÓ5ôLù Öe¢Ic»i€h("Ò3œk¨àuº¡,ÙZÕÈJ J ¸½aèMZMV—Wõ ;7'›ìáª=å"<7£.Ú݆ÍMýþöœdXÍÈ´»UÈëÐ\V¸Ì Åm}QÏ@n»ƒ'å6lKHnäÌPT,-çЙ”‡†h÷ùXŸœ¤†ä¿é€›nÄn™k]6²²ldèºyߌ­7‰¥ ˜1Ï4ßÅP\“#ï1ßùùÇåºÙÙÙazzzïýíÛ·¹rå mmm ð«¿ú«|å+_áàÁƒ~é—~‰ßÿýß೟ý,úЇ~ê™pp,½¥Ãq¹9À§Ž­,íÄ  ˜ïœ îul-9ÿ®QE;ÃàzÓ¼fQ ÷a´p¢…Ù‹b 3Ê;;¬!ÿù ÚQw"â°Ç:»P;6‡oicEʾÿ ^£­ú~ê2¼÷=pé¹T<^ËÈìˆg©dRÆÝ.Z¦$ä6MóÖºX…‚Ø¥3) íeÅÆtž—öëéÚ'EU«JàÎ]7 Ñq q¯OEP˳a=%@0ü¹Ôšûú”K*Ú'…öƒÏéÑ>ˆ3_P°t¤ Ü>¹Jòk”ÀKÓuiÝ÷ý+Ú~ð%Š+ DõˆÀBžÞa)Y‡å¼³ÏZ˜u¹íØúµyÜÍHqº½"ôeRhJÀÜ9ñöx‚r«5%ð?ÿ4Û›¼>‰8rZ@È·Ç;‹†C*Šã^ŠOý€àÇYÏÓ{FTKçå:òqؼ Ǽ4ç–i®)þå·)îB÷æŽzgX¸i@Û– E`}æu½/4«fnw7lî…Òy—, .—áê•rvËÔêœÜ´mØREàvÒv5sÖÉ.râ=𵘇}Qô­ ¬å4Ïöù`ÕÄÇõ·Ë­·ÿ˜ üóRäÍqX]‘›¹9]=«Ç«ö9–´­u[ž§î,úeóÚ7ªlÈÜ2¼ü=82 ™iŠ7òbCÈzéÛ›ž ¾¢Zø/ìHágMZüì7&öúà…oU¸7ûŸ‰%€úŒ:y%…ïþSÔ^c'kcÅ뮫í.·ú$b⋆¡½¥ƒ½âÈ+³,Z’†úv¹mnUî©×5…¸Ë°ÍGµ.× Pmh]Ÿè3®ðmý®T SS»\'5æí1KZ@–,Çê¼µ®6:\eN|c$¦ïZvcV]`2{¦½BæUóÇíÛla:rÈ¢Ÿ2¯eT Ááºs6Áy¬|>ƒʘ²‘Ç“XÀuÉé] å„\8çY3mKÜÛqü´©^}õUÞõ®wí½ÿ¾À§?ýi¾þõ¯ók¿ök >ÿùÏ“Éd8sæ O?ý4Ñhtï7ßøÆ7ø•_ù•½¬¹Çü¿ÊÛôvwÀÒ[8œÀnÞðêø«=9B¤` ñ3ó¿ãÇ^F‹º-X'€ûCÀSæ\‡Ü øÞo®Ó…L £ƒÖÎNnÓ‰@Ò¶¹¾“Òí즊˜Zp^)ŠLJ >©UõÙ¡û´‹kŽ›Jô«ÚÉ~à‹ðÊ“ppTB¿Þ0©ÂýRŽé¤Ü{—€SKì+Áô¬Ú°–°+íê^ù-K!àñÚB°KÓâžÙ4)ø™5µe7'åŽÂΪ~S/ƒ»´%ð³>¡ñeYºç³ðÒ¼ø›–€r×+ð7»“¾µóD˜*;ø$Œö(å»5Fi:‹ÏKÏäé;¤v´vŠãôü#ÆõÝT…yÇbWOBGhÂKs^D¾Ì40˜ˆ‹íƒÌ î ´ÜQ˜€á¹ÿ®~¼Ðt2¦r-©IˆG§ ~ð£²^6çRّŪû”²æ@\Ln/„Û ž£é…y®}mžxt°ÙXQ0µË%Ø=Ë ²BTâËé‚ä+ÚÅwc ÿð~<7Èî¶Æ®š•‹+Ÿ•"ßLÙ” ¬²³U0H©º±æy÷‹Ï00bãƒ@rŒ`D}é96ÅdùÝL |•‹*耿‚I¼˜ŸÔ2X,HÖ22¬ ìÉZW¯ËºŽšÌì6B^ŸÖ»?¨ñ)gÛÕ–Þae®víXò;r­S|M…„ÊêªhH …›0•ÑÆb3§Ïš“`Xðë’©y½–‹¦¬RÖZz‚ØxÎ*6àz`ß> >Ù©)ÒæYþ£.qÜ|¾‹äx ²]5²÷’Ý^,7ó³mbÏaK›4Lß8ñ£ŽEÊIz»ŽŸ6Xzä‘Gh4þë¿r¹\|ùË_þofÒµµµñ'ò'Ç;¿=ǰôŽ:6s$è«Ø]„“ Úy€­'ç¼6Ђ‡›¤;¿²è:]ÀÆ2@€h³€WWɯ®î1Æú±`ë7UÍù ³Š ê’[¤k^{Þý1e0m­K ‡ÕY)OGˆc2ÏVf%H·ÓRB^ŸÍj+ìÈ|龜C3Á››€í=¶p«ÇcS ó9K6r7ô ©MN&•¶J)'w žwüºÓê˜\n£ÿ\™Iñ“¢L²Ü²@Õ‹¿)€lܢ܇ÏÂØyîèÊ-A)Kì(‰Ñw$… ‚‹5VçL]63ØkKR¬kKê+0uµz1E«JBÐU,ãèáµÕ°Y8ïûe§`‹b©žù"$Çô»‡>Ï~¼Y8q wlIiî¯u¾?"«UzR±MÞ€‚ÅËyY®ºNéóâ1÷“Ä3ܺkÏZRÊ OɲŽêïÄi)ødRsáò+šÏ!äîrŠÇfž{šhL@9³fh)vlÜÙí Í)0.ºŠ”г“o5ë¡Ã¼†"JßF–£¹ŠZøús:'ޱfDÄ59¦û¯-ÉBárÃõËÐÚ*«§“­´ †îÇ(@Ê™×c1hkÛËÔË¡' »ÇÓ®v#;“$•·]Éu7" Ž`k€Äál™˜{x{ASý'ðwç°Çü& »P 4'}ÕŒ!Ë‘³ ÙBqGKˆ" ŽÀO/Z´N° “å±-ÚÛÀ½oøý^9À•LJ¥ðaMÈ;æ΀º±Å}Áò,ÅâÚi†"RJ‘˜‚«Ç_Ð÷Á°âKŽÜ+aµ¹&ppåyYxî5Ò,…àñBgV³°¯EÏÓUL”? ï ùd6-a¸“NSÌ2¯ÞÖ¹+Râõº[kBn_ IáxB`!;o㔎ÿ‚R½* uèq¹¤ÖÆeaZºm#0õ]¹áUX}ºï·ÑlZÒqè´¬TÉ< $ ç4Ì]Ô9‡Ç½@w—‚G6ÿ\À¨hÂTvsàmƒ`Ÿª-ª‰²¹mî4IfùÒ$þ8ИVFÕ±'Ôn€í“U(S‚ƒ§àòÁŽÁö[³„/Mâïº «R õA(. Õõs²Õ«Šþ&°â¼òÛ¢Pxæ‹°² Ç¢Ë{ŽÊœM/oéë£×þú†¬žå[¨Ùqïî®M)Koæ2þ Y×¢­áÑVˇµ0)åúê30cÜAN³Š‡ñ¢BͽÃÈÓãúl)Üu`$5Ã¥”A¿äæÔ¦×¯ÂáƒL—ÆlÀ­cvêÖUËÈÕ”Úš€TR¼G+³RÔM1§³±F§ôLá¨>[˜Ô{§¸k(¢¾ìVÙ›ùfñùdIZžÖïBMÖZ´0%¹²Q«Ñ¸5O£‡¬µ·´ Ïkw&JHɯ91ãöZN+Ÿnå¡//ÏáV^ÄŸTS.Ú*¹¾aã(Aà)_üØ2²)VÒ{·[.÷`È÷E µÓÄMM+h¼QW¸‚±:î)?²¦E¢ÚhoB¸¦ï0s!Þe7j›.#™ÌYìíälb‹˜ä˜b‘’Ç£¢½fž½m\ËH·™66¿«/`=/b+6ä,Ž#k»a.c³‘kf,êæžE ñ¼sü w,Koáp¨ »¼ØØ çÿ 6pÛ¸à©#@äøôÅÖŠ óhÁžGŠé6ð0Ú½ŒÏbÓ^»K.”HÐuìØ^&Æ$–|[–eÏD\Wn·”e¼[B:’ŠÅµÓnÔ%KY'Úº´³ÞÍ 0y<&z=vn‡p‘ᨣã#âU:ñ)SÕ}^ÿcY]VÇàÄPgÿ7ý”|Uïï2YikãÉSßRÆBcî¹5/7™ê)=KSLm¬TôŒT’À@\V fh;‚ÐGz†úí’Š¼’ÚëX‡.üŽ€ÏN ~î×e1ûâ3{`¨¸ þd=›/i2H\X¦žA1'¥½ãÜü–¬j.eËá R^‡ì÷ÏANÊØq¹=- »b@ÏsÅ̯,Ùi[+qøîA@\L»ÛɆÜN “²Ô¼üX-Hɽ±†¡Ûê}šw«sšO»ÀHt¶I)­®IQ·Ôì¦À¹ÞÕ)˜Þ”Åu ë¯`]:µªÀxÿA•8Y4Ïm•‚ö²ÔZÕ§úe)\[héþÐjUè½Kà+à¬Wµ9£rãÍ]×¼¾=Ù¬±•m–¨ÇeÖ¬ÛM$c˜_Pû†Ži ¬æU×!x­aK+ j`Ë”¬-ÁÒ‚ÍZ¼ž×&nÛȇB¦—v¦°Y·WóZ«mm²: }Qc¡BÇë×8.ÍÁ° ÎöÙzmUD¨ßÞ«X§µ¤ä\Õ´·†]ÿNÍIKÓ¸RÖ†içÿcïÍc#?Ï;ÏOÝ,‹E²x5ïfß—[r«uÚ²|Iîøˆc` ¼À²ˆ XÌ‹dìdx€Á‹ÝIžDüe»Ö‡ñ†á-ûù@.Çl±H?"/ÁVmh»˜zÒî5UfË^^ &õ™&7^Qøl܈™ÇÏC÷-q#zê2ŸÕÄv熯:Žw¯(µæð~¾§ŒOªm˜¹$ãùàç(âMï‰ÊfÌðLé>†&ı8q^d 艋&t8~Z+ìhšÛì²€ÀØcÊó¯íÉb=ó»"pŸúu›ó_“÷)9*‚IaEÙiç¿¥m‘¿c=0µ åÕ*ᨭ$*;f‘öăÊÎ@4F©P%÷B™Ûk $R9cä(ôgZLé¹¹x™D 5X§jÚñæKÁ{õgÊŽ+Ïü xò†—ÿÝç~“á'RæQ[ðrîa W¤i©Ý] ÁÄh—Ê¡€J£€ÀXnŽhLFxágòn‚ÊF,x Z?‹wÁ훫ÈHõãëb¹PD~9/ãe¬ë7åYŒÅ +%„±0Ü)Èp C“F^Á0×/™òr¢eïY­Ûí—­Å:Ú˜Š;eõ¿Ù¤ ð—–ØGÆe ïkbá5#l·äÙ1ÏP €hvšÚªß´§N@h6›>}|ºš§Sc^~`gÓk}­4õçÆ ^SG§BÔ•¢¯• )üVÌ«‚úþö\yIý·g@÷_¯Bªµ3Q;›*“/XVmCÀ³kN|Ià-Ö µ8ÿ¥7~“'àÒkzž¬Í#5 ÙVÖi¼íSÓÝ{8€*]Ø}ŸbïRß]~ö{3òE8ÐórVòæߎé€<Ó‰¤ºß•U81›Êî-íL÷*ÛõÍë0•T(áˈ¤‡µ ëˆ 4Öëòî%’úTJï p¦ãY›ÞCÓ‰'Y;RÂî!¬çóDÖ¬ÿŒ£EfÊÛÖn˨FçU;ßiø ɹmÀÚà]õ{^t:O–³2\Ù•{Û/Æv/ ÷¶ ¾8lÏUr+ljÆWL?°ÊöýiäÚNÙÿœÁ¨Ù>o"·p•MqM‹ha+ûzv©D¿zq)×M¼šsQo–µâ,´b¹Ûã]š”ÆJˆþr)áÎk²4+cÓ•‚} ŠŽ.)yïlÂÙǵ2Œà@jMMÞ põ¢€ØÕëps^ÇνãÓ…w6E~ÝÙ„~¤Uz© {,¬¬FM†i//öÏ]JM ¼ógFç~K )7'Àðæ hŒ=&r÷çåmzò_éM^úT2¤nž£¨eß  †–÷4a·*@oˆ¨eî­ÝסZÒ>š7läàkpç2ì>?#žT¸Cäê¡Qe&HB™põEº(š‘£@~]¤í[߇Â:¬®S[VçØY´º^A3è}Ö©äVD©wsÿ1=sMü™²TMÆá#OHÚÜ­hŸÑlªÿ¬/ µ[Çu½[—Õ¯WçÄRoÑÑ¥ED±é=Æïìš„ËójãxOF¸VWûî“©íç6 çW€ªIL'CzŽõ ã7– ²+0šÛ (ày@'ûÔ†F_¹gRš#¶Ëp}¦†Õøútå=Ë| ÁƪêËÅ¢=¦1Ô¨©”Éà¸~?j$õ˜Ú"ž€ž†t™œ.ÒòŠaÏA€,·¸¸º\Á¸\¨ÿ¼BmƒÖO²ÀgŠÛçaì—˜_±~X^µ÷á®yE œ§ó8a¿»÷roûÅØîy–ÞÃÄ‹Ïvh Á §oäbÖỎÝÁ{œ7‚ÀчÑjð,JQ4)ô AÞ¥<Ð’êîfÄŽÂ:7°Ûø°]±éÓ¶ 9#Ïšu)ä´z›½¤•e0,`OhÕÛ3 ÂæJFZ)ÝãšuMššÀMwZäñó ¥¦ÜíŽ× T M ð„#gWŸƒ…W=¹Ü‰T:­'w¯±¸B^å"`FMsMeoTwäe>'žÎàY•tÿÕ¿T˜kþGò¬ôÒ>§¡^”Ò÷ì³ —åš»ŠIÀà9ºz "i½`^tuêrëú}e˜HШY»aÂÄa +¤°Øõï IF»t?ýòhýeIœú5¸y‘òÒEJM ­4¬Ã$½¼‚SÖÞ[‡JV5íöæU›wKŽªúèì ¼ù×PÍSɘsÞ¥ôC1–ž©’†±]²bwdLÞ2j0­¦ÎŸg!£:bdˆÖ÷kÀ¶ŒÛ-àD@}¦ÙÔÿŠÖß{‡´œç Ç7›ØxðLôªUKV·lMœ·x Æ{a,¥köØ9]–ׯ’<…Ÿù'02,U2à5{®ÌÁÛo@¶Ë=c¡¨þ»8#¢òÆ2ÜxGYeï,ÊS•Ågr¶[*Ýï‚Ǿ ƒ¿³íuŽJ…ùŠ_ĸoH™»YXÝ ÃôcäÖõ|®G … ù˜èéW¸«‚שr‹£<Ÿ´Ï6Z4¹ö\EÑÞñ£ £Ðbí-xû&ûÂðéaøÚ?†/ž…5{–LFã¡£KmÐò"¢¨ Æëû‹ C®/ÊC³Ú„΄)Ä—õÓI‚D;ô\qbáˆæ˜Ý¬€– ×[2+x%y~uò,¦¦8tì«("°€ô•¶¹{[ÓÖG^Á{2cö÷Œý}Âúñ¼|€[' rü¸#¼[‹Ïí÷A‚¥{Òïïvϳô6—uá+„Âi‹øNå@hšD»ÅÓŒ‘Bx I´m?§j| øâ2%í¾‹R`·€Í½=ž©Õøe¼X_š$]¦QïÙŠ¡ rdL÷Q¯zAÅfÃgæìlZæ›ñ:âòèl,A:©ýßüšcxÊkƸ*ñ=Ðß ï¬êqd+EëöM‰Z»‚¦¹°<ãGuîRAž†aóB…#’)¨”t½VM™FÕuyOªÝÕj(ÜN S¯Ž&`òcD×ÿ­ÒÛ߃xPKã‘Q†©ç ’T¨‚ ´ÖdÈ#QæÚmîó|\ö^Ôҥƀj‘x—@Ò¾.ÔãM–a}æv“PhA÷÷Ö¿{õgú;}Œüm«7ÿc=Sú§ +†;`g‘"ÙŒ®Q-û6L9¼ÝG­ÓegXxUÏS«è9ܻΛ.ÖÄq`­J GžžH«h n/Ë(¬ä 3§X!'•ï«?þ1ce@í £=€ŒÕ.òžn#ïT½­û˜½ä½A;Àß.È 9¯­ã l­è9Si©^¯Î«ìÍ­o©o^º®>öà“zÆ«¯È+ÔÓ’Ð6P܆Á2\zN ¯ýXiôÃý¾Ú}*½[Õ}'€°qÒÂ@.Ý yµ‘LWŸ¼ï ¸s]m‰ÁÔ)¤­UÈæá¡Ç¸NZ×,ïI‹©Zvc°Áåþ„Ndȇð^²Oþ —ÅѺþ:¼‘Ó=o"pä9\Û¹,Ý´µ¢1<ÿéÖuÍE›ö¾vQsд‘jUµ yŸ?ö)I€d¨(y‘BÎs§ÂQ=ã\Qï|îØÊ¨ý‚x¹…H‡õǪ½«ŸÉ—J{ÁÐfS}omÁ/TãÈÄñâ’[È‹™Voß&ŠB.óx½¯pC jÂŽ‹ lÁ0š¯{Ð|zŸXà')Ä×uaÀbûy‡Îî…áÞ½Ýó,½‡­ÙZ(9Ï’ 7Ô0ýDú.Û1D™œˆ“ø,#Ð °­nº€çP†Ü7ám»æÁ¾>þÉ¡Cû"Î \ÃË ¸k9WugÌÈÕaÓZUà¥ÝR)Šƒ§VNœ——È©xB“Y­"}µìë9M—ñ¨UõË’‹Å´(˨ÕÒ*zÏÂV˜ÑAÆ{hB £ZÖŠ2Ú¡IÒy«bò¦¤ÒZ‘{u/û,à|^ ©¸Ïþ3Xù™²ã®üq‘n|G<¥Ýe„]þ×"=&zöI\õøÈÙI¨@¤_Ž{yO6''¦iÎ8+·Dv~;›Ð\êLBâ±cp✤ æ/* V×1tô¨¢]0ó±³3ðì?£V…ô<ð{LÄìPä‹4›2:}Cáˆ'ÃVË*6KèA0ÌÔïý6±¸²¬6–Õ–É^=Ã^^\œWÿF†}öYý\÷¡­– Ï~áðÆ3¾øÐg>£ö@Êš}Bøz\ý6*( Þ‘Ä:r ˆÅ`bZá¿òp¥¨¶Zº÷î4¼ùXZÕ3%!ݧý5½‡x\këjÀC«ÿ‚ðò°r4 9Ö€“çäeK¥Mb/—0Ô¯±Õ‡MbM§äåj6äI8 ¤Õn½ŸÑçÌcðègá¤yXÆè]uØóìåÕ—ÂQˆ†ÃŒ|úÓ”€Áxè„W†ÞË«½_ù¡À]ÅÆ· ùñÕVðòÎxwÇbúŸÓÉ !pGïv˜<¤±žÉ@Êê@.ÎèÞ7–àöu¨ÎÖªÆme(rò*¥1ª]õ—^Œ5]Pì ¼S¶Ïÿ< |Áëô?Âk%Òx¶ ñìô~:l¼w‡”LátŒÚy›Î ¹©g@“É"®I›3ò6ÿœŒéž¶VŒYP›¯Ü‚…‚½Ë€WÂ´Åæ®BO$MŽ¡R°Š¢q:u¶^Õµº\®¨ù%»&Oìí›>‘¤Zö"¶NMÝÕìˆû÷ãò âÈ è<9#ÀüÊ ©`*Fà·>ö-܇P 8·ÈÄÚq‘¼G¬mF©<ʦCrX¿Gó1¼[xÒ‘ÍmØâƒÛ~Þ¡³{a¸wo÷yâÀ¸ˆ;áˆîñðYµëÚ‚ž#‚è€J¾„Ýïþ5•E¸ù$z\^ÈÀyÜ‚ù¼B…*ÄRÔoIt«Í¸øÇò(UvôwU„¤fގصã]&øÙµ£À¡‡ÔÞ›Ëò*:™††¥uw¥ô>ÃQyEŸ‘aûèãz¿yõµÁ âw^S›ƒÉ>qÝ"20‡{å•xèÖŠÝ­ÊAœ¥ü¦ŒãÈ´Nµ¬{ˆ'`ü”úØé‡õ<àÁ~© /H¹èÅ.ÝB!³ ~¾25ÃxÙ3k‹â)Õ+w @pë²Î{ñ*Ì—Í@G`Á2Òâ–¹uô~•¿‰X}¶h‡úæ¦y¿¶Š¦¼T[:Up×çc0 qäᇉ¢¾3åÅî4ìüÀó# -6}}f§ÀÊáu[+"„'í¹ÝÿÛXøm n-Èëׯé^Ö 0·Ú“Mó¨néùG`}[™¶óó°W†ÓB<®Ðîì%é3õôz™Š|V’%~Nºk±ÞYeO…¼]Ò„ãRv§Õ†õš{ÕðÅsïZ:Mïðð~ Ãsà=‰Aö#®¨S£_³vÊ¢9õUkß>k«[vûû6^Ï4¯Oðîl¸Ö]ßÛþÛßîy–ÞÃæÒh‡ñ1i§WÒ¹9Õ‘ ÿ/×Ba·,"s/ðnÔU´âK¡Aw ¦·ìïWìú¯e22ž@@¨‰Wð²óíÙ¹w¡ZXi6 > oDß&&—ÑÕš/rø¬QWÊÒ¹ë"µvnjÿ¹·¡Ð¶JP«Çå91Ç3š€ãpó-…:ºËòT­=jUÝo2¯êä±O—¡½3ã@6ã‰ß‹2üQSÞZ…Æós¤€Þ¬ŠÑ¦îH`ò“o}CnÅ ”²Ê®ùééLÃ"…žUz~—YÉÄF_oB\+áhDZUZYµ×OÿF%-!½wP÷³ü¦/ø[*hòïLÂò w`Z©V€èhN‚rÆ…—ÿ‹7v¶ o (Âö.Ó7¢ÎR/@dB½z¹{«V–f]ço·Ô†…¤{¡¾(Q!Ñ<¤Ï‰4¤¦¨¼t‘ÑÃ2Þ»Y$ç½[WsLŸÒwc‡eèF¦%ZXççÎË/K½¹i^„”žáê+/·rðÀ˜Ú©bB•?ú7Úw/ÉQAÞ™jIÏ[×µxáü%õ‘­U¸ïq¸}E^´Š=_1¯š„%5`º_üªk¯Á£æ)*ïÁH‡Ô»4Dg66 P†ž¤@O(,°¾‡Æ"Nèþ’½pú)˜{I@`hBÆ}qÆ{Kz‡`vÁ@rÉ^ŸàBÜÅz‹èÍÊnµêsßR ç)v² 1ûÙÏúKâõÚéÛ•i=m83Ÿ’7¬a ëü4\™×Ž"OMÊ®QŽMé^Ò³¼þ2 ÿ­T€‰1˜]Ö1 ïzMÉ Cš–æU£o¸×·K!§1^*úÒ8à½Jµª•v)k1°WöI,%û$תŒ@M‹dªU†‘'è°}–ð^÷mLe¼ÍãÕ·OÚyV5ôØÃ“´—l …ä.ã³Þfl¿¾xúÝÙqÔvgôþm÷ÀÒ{Ø\H͹m]<ÜÅÑïNuž¤¼¨[¿jéD«˜8’xËö"0õJgñ.óJquBlýÃÃ<2\€¾ÀcŸvÝ–É7Ô Ö“¾'²j0(ïÄðA)¿ø7^;(Ù+º pþŒl­jõ;b«ÂRæ·,[eÁ×R:s¿ s² JÎmK+®”¤dü¡ÂùO ”å̇î8B•Ò» èñ„V÷t"›ÝeyiÞþ3È\†©ÇáÒ P‘ ¿RÔýF,|èÓ°yŠY«wúJµä—`ý2Ùµ•ý`Èìù¬ÈÆË·d´·×=) r2¸ý£^ú –@¡KÙïË/ˆ«´¾¹9ö^œ¡Õ‚â®ñ¿‚’h·ÄŸ*®ŒX )_’Ã;î²´îv Ö®Éx—‹^˜1±Ç÷`æ"»YÝWGB©ÕR›Þº¬ÓßžWÙà8„Rªu·»"À44/ÿDýëàÉ“^y…¬äŬȽ͆ÆFo\×òÐ{]uä®ÌkœìàKY´Qè¶ÙP¦˜K$ØÍªíA<¡b^÷õÎeX½©¾^DýÒ©‹Ÿ9¥çßZ•¼ÀÙx)gœÓÔ/6W}Ȧ»%/WGHmG%@"9ÃWáüZk—}¨8Õ¯²&¥]ØÞ†c°°¨6‰£ýk z?Kº¿ZÂñ‘a käš’FØBÞ·~±æø:9ûþáiI ÄmîÙÃÏGwë­í M©®<ùëðÃ?“çº6ïAXAî #­ø‚¾«óºÄT›ÐÛi%–ÅY:q^ Mè[õÞV6Z yœ²y’’½°ZôeNJ-:Ö|¸¾^•j{4mõ“žSæ4§æìûãá0/…à âÃn×ð:Uåð¯;_-J£¸»$ž1¼Êe^»«œÇ«7¨ >x¯Ò=‚÷û»Ý ÃýlKh"¾;+®Žíº•D ¬-|6Ê0hëøZs/ U·ÐÀrp²}îǯ"ßÀ—¸–Í’™ÝŸ„wÑDáŒM_³(V}Qdh‡&mªÉ ïYúx!§‰Ìe£Ì¾)2sžð¥ 9MX“–>0*ãêûWçáúU¸¼¨{Cß§Sj»‹—dœÆWA«ÜU#¯Ü’G*‘Ò*>ÒäZ«èÚΕ úÒì¡°ÖkÿR`éÜo©f_05l耞y¦(C= Ì¿Ù,Û—¡uåŽÅ%°×„@óê ù¬®qûªtwœbs²W©Ñ R! oŠ3Â¥]—9节^Àrã§UX]! ÖþÏÿ…ëú~;#àBEÅI[-U‘_»mÄû4pTKýá“N4’ù†Ú¦wÈ«1·[¨f]M fçb•µ+ºÏM…5“½pä1»X§ô•Bè<·”ê\N*†àz†–ÝV…rBa= …®šM¬©axëül^ýõ(2ÎM/ ¢ÝXV¨w満Q¤CÇÇâò(½òŒ•Á{VóÈpÆml>kåM’ðà'^ŸNý¯VQßßͪ¿ÎØŠhX,êÙrM™^üâbÏÆùÍË^K¨i.Õy¯tß×'ÀD‹ Ô&×®ÃÜ‚Â~3më÷%>Ðfe¯J4äµ’Âøº“A{ƪÍ5Ä›¹<¯µÂ­»æ=|’ǶnMeHbê»?ø3„›oÂø…Ý9$¯0<¬¹j®®ç¸y2:ÿBSsN0 g¯ºŸ[72¿É‰\›Ó¾=¬>ºpMäñfæ–á3ZX-¬\*X ¿°úq«%UÝ€R¯ä¼¦Ü8° ñ‘H„NëoâÁà´=ó1ìž45P@Ññ"âxõÙ;‹£å2¾]ۮ逄ŽØqàª`÷¶_ŒíÞ»|[¿J( Fs¼ Ð rú&nåxN* )Å. ÷œÇ¥ùãWwý¨€n/ÐËh2¼&¿/$“dÓi7o²|ÈζkµÐ ­Ú}uàSò;âPi˜V‘{ ìå5á;OˆóH8ŽS½­‰`ü¨ÀÍ嵯Åÿai¼ÚpÜ4‡AØËyžI( !»¡´€ZvM«ý܆ŒÚú¢¯ß2COølºfÿˆž67'îÒÑG)?û2¥‚Vðñ.˜:¯ò ¡°ž¥²ÙK ¨é6·!¡Ëž*­–ž7»&CX¯{.J«¥ko®XõøMóÎtÊ0‡#0ÿŽ®ñàW {Y`#Ö*ysEÆ»ÕhZº¨cœWggKÏ[)*$5:mí^µr0Ýh¶Þˈ ÓòºOIy¹Ú-ß6­šŠî¡V…;×ä-ˆ›‡1•ïÌcê0iC:_µ¤Í­Ëz?®óô]³^1¦¨=æÞ Ï­'-$~Ê꼞ӕ5Énø,ªê–O?9!Q©*¼{ú˜Àqÿˆ¼ÛµwW\Jï5¼£ó®–0à‚;òܹ$ð¸|ëG#cF8©Ù8²Ÿ£1½ƒBÎ ‡lì4á¬qo\v^ß ús´CÞËv VëÞÖ½¸°Y7Òkr ûNž ‰ÂÚÕUhŽ—Yhê»é€ÚqaAóD/>“+gsDΞyÍï]¨¡ES yG:QâEyO‰%»6…B£é øW °ù<ðÒL»›ƒSEOWX®\_T¿¸Y7±Ì¼yÑó¦v65¦w š7°w kaQ-kÜÇâj÷DÊkÁµ[Èð|%·ÊE‹Ø¦Í7ŠE>]©P°¹p‹}y2¾@Pq–V홦¬-[ îà=FXÛ—ñ„nþw¨»…*ü[øƒ$Iß#x¿¿Û=ÏÒ{Øšh€ÞÝyîæ-°•ÞÝ›ÄÇ®°\CùÈnÅ“AƒÔ ®Ñ ÛžFƒpyaÆ€õJ…å|þ]iÃN°Ò:unyîÚ§X•û`yf5áGc?{yDú†dp;Lã¦#!°Óe*ËK³2`…œ Eß Ug†“gµ:쉋|èŒ&ÃPHí20êõe†ê~BaOè,¬ôEK÷¶½nõ¼nÉË”²:µ…œö)¯‹öSÏk¡”…pù¬¬¶y!²ZÁ:àSÞmYh±±$˜ÍȨr2Ä×^S{¥‡áß@pÄãÍeƒ¥›2à3 ë5ÓiZ‡ô§í€áiyö>üšËgõv¶ÔÆ®n_ß°‰õXNž°l¯c@zTb–q`$½ß–Ù5[«zÁÐjY%j0šÐïKsVL÷šÞÛÒ,\þ\yVç=ìCXõŠŒÝõËÚ}Q…DJ¢Sw’> w44©Ðm¡ùºÂ5 ×ôì}CêOë2¨](TF†ÅypB»”é :&õܵŌ3L'yƒ˜‡”©—> çÏÜP>ô!øÈ1¯Œ °VöZE5`dÊ{“½2}C*ÛóÐ ½ÛrQÀpu^í2;§÷¸màÚ¥î'•@¼@m•=)Ø8mt B‹¢õ6¬.ÈØñb³1´8ê¶s¹ðv/fÛiû%ìG‘ñ®–Xîë—ÇÄI”«6¶Sšr&Êi× Ã#ROÇB0'­ &t?͆æÉÁ>…1{cº¯<¬~T«\t§õûð”î©T0osJ}·TÐþ•¢æ£zÍSzñr(A$§²hí0 <Õ×Gzx˜Z`vÛ»Å{”N£óÍ£šY4§9º… ó…ð%©àuëP áËθ6oáéQîŽ_¤ížgé=lðÀ»¬b?Ý Æq†í÷NûYE@æn­Nü@:ŒÞDþn¢P\ŸõRC+Â1`-âѯ¢Õámä™jàWEänÚuJÀ`Üg–8Sµò2í–Ÿ¬je‚ժʖ۰<ÙfúL¬.›ÑäÚl(d6:­ o7«Ì¨Cg%ÄÛɶZ´nÜ hóA7ÞkV»kîpêü'ñµ÷Ú6ÿ8R÷®ý’)[Û>÷†Ž¯âÅŒ(ĉ¿õ‚Áœhë¸CcjëVC`Щû×kÐjÂ^ѯºØsE¢G'êß=âo &ç”’¶;­ñÒ7,päêðµ[PoÈmÛו IDAT x&£­í{o’x× ][ãN °¯_7À»ËN•ý®6QèmÆúâ†}¿ŽÞëU<1Ü-~Ý;tï¨amžŠá8L½|pÛ=ÎÒû»ÝKïa‹£†A«ç¢M AãJ_)Ü­‚Üje ²n4±-àyŽ¨Ø…bìnsi«E´*A€©7b)åŒç$€:Ñd2m÷q©&»¡lEL{¡¶¥ï’hÒË,ú´ý°Mœó8¤ú¬²}X®üÿ§ÐóÐñyÎ}Â+€w§e˜AŸUÜQø¯Twp[·l­TŸ v´C“eÝ@H»¥ш…­L'hhB^œn •÷”vÞlZ­®Yísà(Îú0aw¯Îë„ÈD?›×j×**gb®Â@P¸Ó.ŠK‘=O³©¶éq„r ¥>\¯Šw÷ÆU_³lxÊdª ]×'rf–óêÇí–ö?ªë/\Øt™‰;›R ?a>ƒ‘~]ûÜ|é7QJÌÓÕl’ùÉO8€¼!΃ΟӢäÈý¢qtoŽ7YÆ“¹sÈØwÚ\·9Æ…†Øß»hk7s +ºäkEÅAä]‰£ïŸ{nÌÉû‚kÔàÃWÛ\•w*Ù«wØ•„’õ­’”NwàÊ+ ‹îZf©Ë|Dáµ—ªÖó&˜‹×‘rdjWÃn׿µ¼ý?tç|ý:Yԣȋv xÑÚh¯îî¾-ëkÖ¥éÔpf×Ú6kï#éÖá½]{Îèˆàî÷¶_ŒíXz› k¹vOÎ6[´_´ü rÞ$lß ø}hð5ápñ\:ê4 å=…O­.£èð›ÝÝ OL0Šõ­¡Œ9çz>„íÝ€,Ž€Nn]«(žêhâkÔä¥p_N Lh¯ /ñsú.žÐÊ|â8ll@yA!Ÿh‡@E¥$¯ÐÖŠÊE OÁ5“Â-}ñÌâ-,.ë˜Pm{’±+ƒ’ìÙ6xvM™{·¯ÀÕWŽŠD5¯/ÂÞ5˜ÿA®]UÜa«š>ÁÑ“$†z©”Mh²O@ìÌcpÿ>£«Y…;nwM⎠`Y-é÷ÿÌøæe5öHæ.“‚aC*v[¯ÉxG¢Vß®¢ÐÅ CŸ‚áÏ#QÛ‚@c~ ¸þ²ô ¶ŠÔ6 Ý28¥‚cÈdª%¤­U‘uÃQ­âo\é:Ñû¢•v«m¼q Cí¾ÝTûnÉË ?òYéÕkðâ R¨>ü«ŸdgK•ìchÿõ;pgQw<ï¯)»ÐI'ʼ*\¢êƒÀxJ}7Ž ÜµœúÄácêÃ#Óê«;e½ëÍU¦>¨>è<~K9Ÿ¥ZÄäÜœiÂPD-ç<ù õê^ª(™Ò!Ýcg7Cž‹34¡>äŠÃÎ,Êy¨&Y¯«üÏ‘ûaîiãäÄÅ):ñÑ_y’“}p¼_×_:$‡·_Òu?rVãzׯo'2âN·Íe:ryDRÀ‡ÔÛ6îÀniWm²Õ”—›S¤`Ô¯~ôú ð‘§dðœ§ZÒ{XÛ€íoÿ„ém Kž`d¦ºr[ Ø[„DHFÐ%Fô$¤Í30‰³)®ÿež7/«Ï>ø„Àyè6\ÜVŸ°1pm{\çØÙ²óV!SÕB$R¿[ž“Ñrºc%K}ÀH§Uºï‚ÖŒžmdZÏ×uüä ¨\RÈr;#À†&½°äü¯\_)©ýwÌÕ,mAd F‡à:“Ë‹7,±Úeh7›4¯ jüÕsZp ŽÁ´‘ÅïÌ×? ?ù¾êé• põºÞggRãß U‚ðì_Z8Í“m4Ÿ‚Þe7x´ˆ\±ß§€o½++„ƒAâšæ8ƒæÆCm;nÍÍ vîã–ð‹â¸ý}À®ãÆÊ>ё›ÃÃx‘â{Û/Æúýßÿýßÿÿû&þkݪÕ*ø‡H7ܸV—ÕÂ]ßm?¤jösOt+Ž~´ÂÛCΩ|O#`>ý4ާEŸæì¡Cle2, ïÔZi#vOžu|¨nIs'€Í–\ÕÎ[*@g—éÕ´šŒwÉ{±µ¢Ud~Kz?é‡`f_‡‰É:LŸƒö*‰£ƒ,ÿ¬HˈϽCpð$ý8Ü~V²©©çòMq¢q/†YÞ…#Ó°œƒX*5q¤v³–E¶#CSØÖõ]QàJQà¡+eYfKzÎv vVÐVçe$«%È' ­l”("غ->R,ÕŠ)óÆ!–†›?“W«\PHÁy‰(l5!bZ¹ ¼úÝo»$ãQ«È˜L°Ë,xîV,uËÓîI,Ô%W` ­ÙêU(hä *Ý—÷tÞΤ ^µ á€Þs«©úiõª¼DЮ©¯ðF=Œ/]o‰ÇBÓÂ]¸r æ.ª*K³!PÐÝ«v~èw.°síÉ^‡²Ê;Vt¹ÛÞC]ЬéšàèQyªeˆ–«ô@³A÷ÝnÁË7Ô§§ahDÏtÿÃîÜ^ƒåU5W8=b_[PmxDOÞu™¦‘*”sÐ3IãÒtõq? {ª–aì(LŽB½ úˆçîåÖau·­s›ÚyCçs*ÚŽOÞ§»O@ieÊ8rîd 3¢yöã̽y›p¨¶Kz74NçŒ0¶]“7dÁžoÜÆyÙæŒÛöŒ§Xržå@E"ò"vÇa¤OcokMá÷ÅU›ïê¢Ç…ÂZ°tѨ怮 Ñ_“´Y« ¥=¦Ì.ÔwÞ õ•T—ÆGµ,Ry­¤~‰z¢8)z‡Ã’+pÏtw6` -&Ó6§ºª ÛgìÀFÒi¹Y{î#È39Àg¾$U/ˆê4ëúð†ñ¤rG¯Ø=•ïºç…ra8°y¿³“b©ÄïýÞï‹9fÙÏwsvê!¼HòÏãÓ@aÉ÷óÞÿ[Ú~.a¸¯~õ«w}~øáwíS­VùíßþmúûûI$|á _`yyù]û,..òùÏžD"A?_ûÚרÕjü}[.—ã+_ù ©TŠT*ÅW¾òvvvöÿÿÜsÏ155µŸÿlhv”Q÷,xA4sÔ8»~ ì¶’íç€O ì ph DݤwÐ ¬Ø>×ÑŠðÛ™ ß»t‰Õ»Î³¼Œ2=6­Q€è²k;Pæô‚&‘'*f÷Û¨iUY,°_twiVÚDJž”í ±„qFAýœ{ÈÎùi–×¹sýZtÁ Œ=¤‹ìlÚÄÝ–‘¯·5ÏßÔ}ƒ0m@¢eÀ_}:nÃŽÕÛÙÔ§Qó†·SÖ\ÍRÞÙ7·á‹Æn®ÀÞ;o2ÿê&¥‚4˜Ný2Œ~”CÿêÿehBçZ_Ô½P 9wä…Z¹e|­|ìKò¤9’ñ×õéÖª½T€Ä„x9ݽœ ÁÑ!ÒÔÆ ÀnNªÝ”‹DO¥8¥)˺ÿV nšfP¹(†b^íãjëÅ#jׯ]Y‹‰”²Š6 ò.uÇĉ! î²{Zˆì[8®– _€t\¢†×¯Ê›RÈÁÜŒÆ@ñ⠄ºŸVK×iYµQ“'fòBRN—&ܼ* •ÛTÃnÎÿÓCpýu ¢~úAó¢´äEZÊÉ;QÉã'ÈÒ(̳ÞTÊx€Þ”JulØw}hß|¡`€Å-yç6WdÔÆÔWÆèݸÂÑ‘˜úÏÖª¾O0oÔäÊ£´ÿ|¦Ú8pæAõPQÜœÝÃk—´_®Ñ¤té ÅN¥(`SÇä…så=6GôظÍÚ?jã;ûÅfÃdÐ5SfCï:[¶gØÿ(•VØ´ŒÃÚÚÚþç?øÁ»þÿ;¿ó;|ï{ßãÛßþ6/½ô{{{|îsŸ£iò·Íf“Ï~ö³‹E^zé%¾ýíoóï|‡ßýÝßý{¯ûk¿ök¼õÖ[<ýôÓ<ýôÓ¼õÖ[|å+_ùy=àÃkÞÝ`ÞMt¡£»³Þćݜ§§‰fÑÎ}¤uOÿ$J4ˆ·Ñ€~Œ ñèý÷Âá­#õÝûÐäXAEwGЀ/àU}]EïdDpÅîãv®mYˆÁ in”e:“ 7õ j’[¾¥‰upL!ŒBò?Ë’Yàá³^w(›+ߎœãþûÌ@Зˆéë5ͤ=_o­&¹·¬°¶´oŠUôŒêÞÕê°žÑÄžÝÑ }%ó²!G§ÞlBüØYŽö³4‹÷™Ï®Àkÿ’è£ç8ôëLjÅŒÊhY†Xÿ¨Œc~›ýŒµDŽ1ÄÀ¨ÀD³¡ëìfáÍg2kŽ£™·ÔdãÙu6Wô.6–åeº}ÕTÀ×Í,;7%Ä ÄÞ¹nµÄòJSß4…bÁFŽv@wÒ“i_»o¼&¾O¶jU!ÔŒæecÄÍím<7Ì-L¹ÛñW?HžË=ÎÒû»ýÜÞe,cxxø?ù¿|>Ï7¾ñ þüÏÿœO}êSüÅ_üããã<óÌ3<õÔSüøÇ?æÚµk,--122À׿þu¾úÕ¯òðtwwÿGç½~ý:O?ý4¯¾ú*=ôò'Â#<ÂÌÌ ÇŽû¹<›n¸lŒú]»­ŒÕ Î&^ieªu£šBñ 4@sh…´iç8ŠÏXYFž¥!àÜÖßÍçBàÈot­ßÄÚΠbUû݉¤Õª*UÐjÃÑ€Ê.lÚ¹;Yzò¸@FcÞ?›S¨î’Y[ðâ‡.u;×Ê»+%^Q*-Îs(µ—/Ò÷ø(íאּ„·D5•‘s&®‰s¯,@Ò“Ð9«HkgµèKÌÓd»²¨É¼›ð…X 9¨5­PiÕ[`£®öw@çnñGGh/àË¿ŒÚûu©ý7¬]†Úí}ݹû\À6ÒœÚΣ…dήëÔ:ÊxUo'Ðmû-X;:/|ÕöqÞ$ÿø»q’·tO:àýÝ~nž¥çž{ŽÁÁAŽ=ÊoüÆo°±±±ÿ¿‹/R¯×yòÉ'÷¿áôéÓ¼üò˼òÊ+œ>}z(<õÔST«U.^¼Èj{å•WH¥Rû@ àá‡&•JíŸ÷çµ…ñÈÒ'gxœÚ+øLˆ 4p\f\¥áëɵЄèHŒ'ÑàA…S6vº m»æK==«ÐqjÀ<)âáíå5~æÛ¦¼(æå!ÜX†U/O‘ˆÁV^_þg}ß½§~¼èá*^ÇÐÂaÀþßgã¦yc1kk ê2ôÇ‘'»b}i¤:&ÉCzþjÉ—ö á«z?q ›W‰œ%Í®X÷dRïasKaÈDJǃP])çÍ,Ø}´ðt7?¸Ì¿[°_´¹dÇdxz¤Z¥^.óšû(íC€g- G@<‹‘#»r%;6cGñ2uÛß-N]Ö›ËÐsÜ&w¾{Û/ÆösK.\à›ßü&Ï>û,_ÿú×yýõ×ùÄ'>Aµªw&“!ÒÛÛû®ã†††Èd2ûû ½[i¨··—h4º¿ÏßÝ2™ ƒƒƒÿÑ÷ƒƒƒûÇ<ñÄ,,,ð§ú§ÿ Î’Û\VœË°Ù²ï“x—{‘­§Ð *ßõÿ ZýDÐ`-áÕ8¾6Q Mzã(ýuÊ>ÃhPÞ_*qucƒZQFÐs ­¢‡Ð@?Œ×©  Æ…²w4¢‰ÄÅìýÐS4fz2a-ý½›ÕÊ2•‚~¢PH,L¤¡kˆî!Mš ×ä}Ø\•wçå¿‚Ì…‡ŠyµÉ‡ú5Ñ倪&c'¢wÛ¼‘¨Ql!… 3š'“:¦ZŸ(´UbSéë ×d„§NêÞë5yq*ÛEî\­3÷ŽU¦ßÔ³” Ò@"¯{MöJJÀ•u90¥ïî\“©Ùn]¥rñÎ~!Ýî„öo¶M+*-c‰BeAáWè6‡`Z/f/ï o,¯ËÚegÓBBU0—5TÈ©}-mÈy{ðA†¦ûÈÒ<À`?_|òIš¡Ÿ»pðá èN¥˜~ôQNNNròäI¿ï>jÃÜûøÇ™‰Åøâ… \‚.p¾³“ñ}Œ¾ÑQîÿЇ;}š¾©)üøÇ9ÜÕÅé ¸ïÂŽD"ì|ò“¤9qî»ÇŽqpzšŽG¡¿§‡‰ ØÆ.üì½kläçuæù+§ŽÊ” IDATV‹Åb±X¬bñÎfóÒl²ïb«%µZwY=Ž“ìÌ:³™É.æâÝAv‘&,vƒ]`çKÉ 6û!›  8ƒáAŒØ²¥È’"©eI­V«/l6Ùl’Í{±X,’EÖûá9o¿lÇÈÛ™ñô HÖåyoçyÏyÎs&(d^}•J¼•ôÅ'h¤ux˜Öóç©ki£ç+_ ·¢}b‚ý]™ k4ÎFüƒ/a»aŒÖñ³=ÓIÛ‹ÏS 4P \P}‘³tÂÈó´ w‘~ü ‰3'ÈÒG6v‰®±8Cÿ`‚Æ0„Ÿ 1âäË/ÓžÉ'22BëÀÉ'ž ”L¾4A, J'þ«ĒIêŸx‚öÚ/#2>Îf°†—^¦qìK„ôÄÕ¦8ÍO\"u²Øè 6Âg˜]ê"ýÌSlmEi|rBeŽLpPß@¾õy–ó̬œ¥a`Œ-ú¸µ©ûÞ;:AiŽþÚ§Ÿ ‘ù¸q½Bð<…úcÜ]$2ö¥H+Á3¯¬ pê¿Uvÿò³÷Zøté)ê2G©¶>6Î~(ÃvÃKÌO‡Ée&(î@û—&è9ÑDüÂ34ôöÒ|ò$™'O“9ÕMËsÏQŠ6rô«ô BÃËÔ"޾ðÉct?~–¦±1²#´^¼ÈÔF3‰‰ …v'&HƒôþÊ+Ü[Hóƒϳ¦ehˆŽ ˆ·¶râ‹_¤ptb‚àØßŸ µ½…à±§¨ï9J­í8=Ï<Æít½ôò6Çþþ+yœš ‹xæzzàÔ)šO"ÙßMâ©gÙ?h¤éÙ ópö¿Ÿ µ3BÿÄ‹¤F:#<4ÊA—î»%‘ gbB¡´/O@]-¯¼Ân*ű ¸xvˆäÐ…cS—JqîK¯Ð•¬£ïKô¦á…¯LK$_¼Húx?ý/Òóâ9–²Ü½ÈúZ„ÚèàÜÿ0A%ÐHæÙg öô9uŠÌ§(E{hþR™Ë'Ô÷Ý¿<Á/ÿõ”¾ÄÔL;ó¥Ç¸»uœÙøQÏ?E ¥…þ‰ ªÀÐÄ{Ý_ü"í­­\xñG††fèüyñ4»=¯p²¿Ž½Ø¸RÏNPN$¸²s‘ëKG£ýìYb´¿ð‘ML¨>å³T9þÜsŒéf÷ôiΟ8AoOñK—65ÑòܫԠ÷‹_$3öâ‹4õe¸Ÿ:Gm`„³ãGûêâ=-0öEqh¾øvâ/½D¨µ•úñqbG2Ó?HýÙ³Ô¥R<þÜs¤BAš_zI!þ‘—(âÄN_ ÕÛCôØ1z.ž ýd;ñÇ.nŠÐÿ«/Ѓ–§_`¯Ü@µûIbííDާux˜†înúÏŸ'ØÔDÇsϱt?÷M¡=/ÒJñÊØÑþ~6{{9ræ ›ÍÍ|éÒ%Ö€§Žcc~žÄ¥KL77sîôi^êéᘭµ‘ÖVN]¸À™Pˆ'.^ä4ðêÅ‹¬762pö,··Ó90ÀÐÐétš³çÎÑÐÐÀ‹^<õÄÔG"œ={–¶TŠáÁAŽ9B{{;'Ož$‹ñÄ… „‹?N èü¢ŽÿÔÀÁÁÁO …+++þïîî&þ•Ï óOÿé?åw÷wyã7xé¥—ØØØxÈ»tæÌ~åW~…ñ/þ¿÷{¿Ç·¾õ-®^½úàý\.Gkk+o¼ñ/¼ðÂ_¹ÆýÑñÏÿù?(û  ¥¥…¯ýëü£ô~’GãŸý³Æþáþ{ß?ŠveàÅÉœü~òظ+R¹‹vºY´£Ýú ~¼ŒvÉÃÈýþ"ïPÖ>s ‘GÑNz¡¹™§“InÜ»Ç>ðÊŽi·óö¢ìá‚“äråQšñ|ç.®3þÒ ƒrÙWJÚ…G›Tª´³¾ö—*õò|D›ä©iiƒhÜzM„Ôoý¿*¦»Wôž¬#úìâŒváÅ¢OYß³6êBéº1<>hÏ·‡< «hGÝôg`uÕÙ3Ö¦{È QBTËæriJÈ+î=ÆÂÇ«ì­mÒ×û¹œÂ)Ážµ%­0Z!§ºY'Ÿ”·©¥®}ßÂN÷vØ7OªÓ‡úŽ‹S3}¨•´Z›ô‹ÏâêÐ5ÆEžváÂý¢þoŒKX²¸m…{‘š¶{–…;pgA¼›`HŠÉØ8tbze Û¼:.\¹UUÛ”PøµŠY ™€ÂIý­zæHÔ ëšxi©Tþϲô½·hïSîβˆµÖ‡­–9Y.+¶4'…çZM©âŽkÓˆ²ôJûm?¢’!%»·|˜¤ÍæZcŠeñ¢Šûº§ÎŒ8]Ýò$ÝÝ€#I+è¼ëì7×Dt¾qYa¥Í5©¯Ø\é1Õä5Ê›æUiO^µ® Í.ûPL#žWS´¶Ýþ§ÿ¾õ/•ï\7®7ó#u$.¾È?þ>Û"WQXÞ%„äoÇÍëÊ+ ¢ó.pf@ž®É¼^±÷#@:©ñ}ú|ü]Å“j—LÚþî‚/ÐëÖ±–ܶL¸˜Ý{ ½MÍùlÊ0О‘þÖÑ…à]ÍÄý]/t»7ù…E…}]fqÅúxOpÞü2âH¥Ðº°Š¼lÝøº™©#GÈÆb|óÆ Îài mvNp÷ºŽ÷:]%7þs€êðâÄuøPh•‡=ŽSéÖ­t:Íêú:ù|þÇònÇÖÖ‰D‚ßÄ'Ïü4Ž}à_ÃÏôÞÿS:~bÏR<ghhèÁÏJÙl–ùùy:;53ÆÇÇ ‡Ã|ï{ß{𙥥%>ûì3.^¼ÀSO=ÅgŸ}ÆÒÒ҃ϼöÚkD"ÆÇÇì½<õÔSäóy>øàƒ¯]¾|™|>ÿà¼?Éñû¿ÿûÌÏÏ?ø¹qãà9(¹ID1ìšð.•7Ž E-b4NR MÔ]4Úg7ÿWìÜ[H}Öiyl§K%‚…ãÀ9d˜ZPFÝ“Oá x&Ñâ°„„i¼z¯›ø;(Ä2€'¾VÊâÌrVì¶*cØ~ÄsZÛµ–ö6Ú6"ô‡ßW»ÅZЃ(ÕÄ“‰ÆxP¥¼Ëª™·µà9R¼ uºÏºwì  q‘Bëé‚ÝsÂ^?ní“ÄÚ¯9VèÐgÜç"Öî< ràÉ…ÀkÖ_?O¿RígðóèðÇߘ³´½½ÍïüÎïðÞ{ï1;;Ë›o¾É/ýÒ/‘N§ùÕ_ýU‰ÿäŸü~û·›×_+W®ðÿá?äÔ©S²ã^yåÆÆÆøßø ®\¹Â믿ÎïüÎïðµ¯}íªýàƒ8~üøƒðØèè(¯¾ú*_ûÚ×xÿý÷yÿý÷ùÚ׾Ɨ¿üåÿ L¸¦¦&zzzütwKYéðîáµC“9‡C›ø‰Ó@º‡&·#_à3&"ȰÿMÊE”7ÈÞv641§ì»Gb1Ò¼mï§Ð„îÆ ‰]ûC4Y;`ÙE$Ç4tí¾°,¯.–Ò¾µì²<Á  KCL à¾éÒ8ðàv¦Á <«ï…P:©L§:d+e¥ÝG¡%®óåQ2Y,¢2OÆeìÝBꄜSFw­ªÿמ?£öu‹^زÜÞP½Þ‹3Ð~~ˆ» -¬­ËˆööÃHR‹b"¬ëìn).žÔsÞ¿£gœùLÀ1ˆ< ñ¤Èð‰”ÀO{Ÿ88é.S\Þó„ýº€„#veÈ›º¯ì²ú ÿý_¨Àæ5à©Ìò=Ÿ}8{à ÷çoëû§Ÿ©»;-³øB¡Cý<7©ïœyÎŒKÝÁh†»ôÌÙuOz½>¥ûXqÝŠÆAqGž‚ÒÙç¸ú‘€a¤ú‚0Ò% ¨JÕê|Ý1<Õ)д³ ›e?§\†ÑZQzE›kêN)ˆ¼=” Ù~Dýé¶´yÔ¶äKw¨M£MÅÅ"¬˜¤[×€Úp×äv :GC“÷…ëëzÎOßÖýß»¥ Ì'ËpgCFú†y`ZðUŽGx Ÿux4!/Wªã)¹(à2Ú¥¹z{ºŽ­3_`Ú<[»øR š³vÑAÝcáyP\Íi|Åô¾Ó[j@ºM“×Ô.ù"ˆ¸k›;°|WÊù“øÌÉ(iµ6ŠÃpÜ—éíÓµöw••Xo.#ÐïïJéß­m=ò,®-HL4æAÀ}«Î+´yî$&@½5|’Gm$OZ–€ž¾>ZÆÆ”wšÞ±ïlàSü—ÑZœ³sÆðà ÔONÉ;oýèÖv÷û>ׇ«âÇ*xòGÇ/Æñ7&ëƒA®]»ÆŸüÉŸ°¹¹Igg'/¼ðßøÆ7ˆÇã>÷õ¯P(ÄW¿úUŠÅ"/½ôüÇLÐbºÁ`oûÛüæoþ&O?ý4Ñh”_ÿõ_ç÷ÿ÷œcww—ÉÉIÊ.ž‚8T¿õ[¿õ Óî+_ù ðð7}¬ÿ¬x’±SívÄhG:mD ÈH»Zp.³hÞÞs’5¤ô Z(>¶ïÝÄÒáàz¥»Ö€ïon²³½M- ¬Ø%Z0Ž¡ÝY?ZüzÐbTÅï¬nÛç‚vÏ{Ø‚aéÿ•’O÷ÞΡêµ65È oeµà…ë¶‹vAÉ„HâIkw€î Ï(›Ÿ‚§~MçÌ. d—áhRdÖ¥Y}n¦ ª³ 5 ™äÁ–ÝoŸXÈÁg¯)t’»ª>qž‚Mt¯»[ »„`óãOH¨É8Ÿ}V¨bh6Ò3ïíHŒ1ˆÍyÉ"pjD`o++ÁÔæ4îx=ž>„G £º£6nFÏÖ„PUÀø‡ß@,ZÂEyêâÀl­Fá»ß%mc¶ÝÖ窠0}<¬¢Ó±¨²ûmíè³{ïPI“(ò2o#‰€Éë2îÝøÄ‚#¡Ö¸ÚneÁ¯8ÛK ºÚWûÄtZ}ß{LÀ{áŽ÷ZVÊÚh6H›kRT?>®ä‰ƒšÖ•y7]’Kï%sR+X[¬ãkq†Ñ3_CÞËËÀnÜî.,p3Ðæ©IŽÜæ°¬«ÖÆ|ÈÑI¸“[q"î/\èî°T€³ÕC¯ý<½3?mRö# ÷ðñs–þs:\,Ø#Èë>vmëÂ_‰q§ñòü hs‹‡'Óµ¯ßш\Æ ¾böw©Ê~<žÉPëí…>zJ]F“¸ïÎv`Τ}X·ûÿ2òVOýÚgš¢^o(T¯…5÷¢”ÕŠ^/í Ú—‘×Îy+§³®þìßð ä@#ðw^ÿ†ÊorÚy‚×+ji“h_Ô”£×ôü§ÎÙÿ‹ðYAm»b÷žEáŠI2(]}.ï=S.Ã0 MË+±³ }ãlÏÎSÛ\¥¼§ç:zB¤k@ž³HTŽpƒ²ó’ø]o;JÅv*Õ¥=ƒ¥U t·ÚäÊûµnÚ—ž™ñ*Í xå_½;+pÿ:ú¿AªUFíùß21f¾½ÃÛoÁ@—^_»/Zª ÉàuöÁôœq¾V×ÏŒ]w†ÏØÎþ@ýµ|W¡Ý‚@ì=×ɧàêÛâ6¡AµKnUÚYUd´3¯N0÷Í?gøŒMg¿BT[YhLí‰Ê›³¹¦² $ã 1ƃšž­L÷~dD÷õÃ×äÚ¶64iˆŽ~¸ÕÛí*lì<(ÍI]siÖÂE¡¥Y=÷rÒ1XÝ€X]…¾ËúµÕ´$Rì,¡õ`«ew>»îåºÍÉ6›Ãíi˜Yל®Ç{Žœ¾Z)`ä _`õµ×è¨6›œt’G“¹¸·êõ†ò6ºl­¨Ùk3È«ìvÄ÷m®8EÿvÓFŠ8§ržÇÔ¤â°Tð5Ù¶ì<é€úó  s Ç&RòD§:$¬zöYßÅè²ëßÑx8¨i3[Õï‘w¼%'±ƒ€`¨‘'þKhã9ƒça.ÍÝÝt65ñÚä¤À´Íû^ý{ßú0€/‚ëä1ŠøLJð1CN¼(åa¯CåÐû©tšµŸgé¿ã§ÏYúCq–ÜñHâs!4§Â…áúPø 4ibh¢åñqìšÔN^ßoß~šñ;Ä Z„ÃÈðoÚ¹ÒÀûöÝ¥ÕU:WW™G‹ÛãvîMärnC`©Å®{y‘v¶\ Û÷øB-f%ãn4¹g0¥d»é Õ,õßDæòY_v$»¤]f"}P?ç…òÞý¶Â0Ÿü†“œüvkòå³ò.•öMÝ»*îC$jž¨‚÷’†¥ƒ=c+¾ìËv^í~O¼OX­¬K¥¼Hå?¢Z†¥»ª2nÊã±ܘ…Þœ€Ò2)8ïPZµ{Üßî_fæÛ;òÔ%:ãIÈÎ@*±ÃÀ)yOiaîá´"]S\»ö*žÈ~?çCjÁ ¼ý¦BYqo,(,Z‘‘‹û°û&œ:¯öLuÊ ³W?5DE†.áÔÞ$/ÉÓМRÿ®› 3À@M€£ZÑõfWÍãa÷ ÂüœÚ¢ÛÆ\k«ÆQ¬Îq¾WöÆ*Š€"Uè6à±sZ’Gèöǰ·- Ÿî’w¯³_i(%`yîy¸ü]óòVX]¡ãº€×¼zë{º§n<ɼy`ê­ÿîh.÷&¤ÃƯÏ÷(d:³îõÓºl¾.ØÐzp@îòeˆ/w$wV}M´vÄy "tI$Q›ïgûÕ7k9µÏ=|BˆãS>i ÌÕ¯Ìç5"QµYù24½ñ¿WPŸüÚEøá»¾Îd NתUTç-•/Õià4¥µ ŸÕ&jsMã«ZQ™£ « v˜;Ùˆ@݉'l 5¢yâ^ŇèG‘Gþ$0¹±ÁöÖcöÚ3h]uܸ´FWì·©m<8\8Í΂õÓah=^‡5A]%çir€ê'ÏÉþ? 'ÿ´Î÷èðÇOEgéýp;`·ÛhE‹X=Úa‚Íí¢h°9×o˜ÊpqB’ŽSð L´(ßÁ/øÉÞT3Rãã,ã½J;ôtâ³ \ý£E'±Ø=º,¤] (*7ŽçáøeŽpÛÏr·-’•#ãT2Ê ¬¨­—æàæU½æV·â¶JsôÆTç-™†ÓÃâ`¸úsíi8:¨ÐHqºR(˜§¦ˆC&c<d(ú¼\(ßýž€RG¿eÊ™¸ßÂع­]<©P_­&ïGòøìM̯&4Ô#@µ’óa£ÒÊñ¤rñs;램î·hïP¹pK \Ú“pÑÆuxôéÚPŸ¾--¡Më—}`£¬ì«ËXX¬CçO´jì\ÞžØmÄ©;Àž±bü¨.+Í2འ#i89Ï>©>*›W/»¬âÊ‹°¶ªñµ8c¿ “mï~×êþ¡që¾ßШgÞÎËû Z&ìy0Y|öà6ž½š×ØJ Te—meÕ?=@WPß«Ùÿ@W @ztôA¸)ŸÕzQ´±3:¢>º³î cïÛšZöî–OÉà3Û‘'mg_scèÍHp2RßÞ»¥’BØÜ´ëõ ÐeGž´…ªÔ¾Ó]ò^›ò*ô{ƺ}Eà)ÝÍí±@ÚÌ…/o<°(Ù8ÝÂ+Ϻq„'ïØxéEÄVä5?‹1ÔÒBQo£µ³­I4Ï6žÜkA»VÞÚÏÑ-@íÑtè·Ö8ïÞ>¾0/<ìúyt–~¶Ç#ÏÒç8OŠ2Ìn'ä€PˆµV¤êàɳkøB˜—Ñät)Ý+haB^¥¿Ä‡÷îáE#{Ñ"[_g1—c/nyyAq!Á<a7Ñâs->ö¹ÞàÌ.hin€°mç)bißM¶ÊÄ ÇÕ*2èýðỾâwÉ!ਥ4;2le¶Ù³8^Ø&žïŒYåÎMÊ»%.½ Ë÷ )¯L}>{_ %·*°”l—¡oIû‚ÃÙªÆA Fj5cã$ ºŸf’ZÚäÅ)ä¶(Œ%4Ûºõ»´'/NºKbŠÃ'à­o꺧¡­Ë×ãk±Ì¹P½¥‡w)kîÖGVp83w&uoõ‚î!…CgħqG0éˆ<†.Œµ<ë½J®Þ~žàIn0gÛþ/üîëïÃÕ98—T˜«9×öaçê¡, ™>¸ ñ ®½v_»ÅXýWz®»3zž”…Ùœ2‘Ñ=˜›1ÁM ü–TßGÆ•Åk8œ\€ÁŒBo:y ww6vw‚7× :AvÎ ñ-_gÍ•‘Éák™¹õ ˆÂîN¢ãΤÆÿàˆyóVµV$p#Ùƒ’KKdúàæÌV­LðØóCƒðÑ´_‡’6Ö:SjŸW}üæ­=m¼" 'Tuò ­ÌÁâ²¼HãÆ-›œçj³*>¿ñu=OÖν8#þÜ1ãÅz¦?UÿÅ꣬í&jZ0¹Š"Zïšñ527ñ¡s·-âKGµØ³Åtò£¨pøWw+FK¥Þþê¡óÝÅ{éÜk.“¹d» q#~}wTŠ*>Ûm™‡©. ¥Ž‡Ãp2Ê~qŽGž¥Ïq8{·³Mž(^åpÆ\3žœÙ€wý:oø ×®¸‹sïNá% ½wi¯¬Åd’ŽÑQî ÕîÑBóCà¿D`-6,‚hr_G¡¸N¬À«»4fG°t<(—¡RF¼W'ª¾ÕæÇ©%-ÎB2#ƒžÏ*Í;ˆ·ì~‘W²ø3 ³Ze«R¡‚/ûäøL»øMj#~Mtá+”"Öö®ÜŠó÷¶$yøp^G½øÛ8þCåþºŸG‡?¥ÏqBnò¸Ž.+¢‚q0ÐbâÂt®Ö‘s/‡ð‚hŽÃC`¨-¼9´{»Ê/í IDAT‘<šÀ'ÐD<¾½Íúü< ´0b×îB`èi4ÑŸA Ïm;§#{»l—:8 ö ;x×½ÓXqkε\.‰KÓœ2^QH aÅøK÷nÊØííHÇæî”ê>õöh7[«éòY€¥Yw¯(#ç4†Ž?.0°¶(>Äài}.»Qè k‘]Dœ¥Ð6±¼€È=äEÛ~û?œþÛ‡Âý+³û46Ãô²@CwÚóDêàf÷• ·²³ë>U»%î5–Öʾ¶^Þ¸Ôì\±ø‹·´."£tý}=w,!ÏU6QÓjZ¸í5jjâ¼4X •ƒšj¿­.ÈMoèž E}&žÔ{Ÿ¾3×áv®U½w³‚Ú}++£YÈ©ÝÓ]’õU}Ü/ÀÌ¢Œõ§3òöE£zÖ·¯êo¾·Ç;Wá/¿ ßþS=×âŒÀWªÓD‰ÁÅå)Ü/jlŒ«i Ifd\{2ƒ÷ð™ŒÁ€€N0 PÐÜ-8G(¯Õ:S"ºÇ0=«MKÈÀ솮»bdñÝÏljôÚßP¿ŽŒÃ“ã"Œg—u-è ˜»¹Ò…€ÊŽ›2¾0¶ =xJ€{+«grÙ‘+6/Ë |¶(bõ1´¡õqkF¼¾Z ZÃ0Öªµä¨}æø´·ÊƒA`+mç7˜|FV€|^Ÿ´vª¼Êh Ž´Š58¢¶»Ö¡xÄ6`1õcÖÎÕ=¤°ìÝëšãÀH¿úqwKŸqày+«6)àùœûø ͺ^ ¢f¼'øyk£›Ï+hm, À8lk@jlä~s3›ÖŸ" è6£e|¹˜=|8ÔQ-èq™w.¤>ôýžq8$Ç¡ó<¿xÇ#°ô9Ž >{ÌM‚¼J+hÒ,`ELñu«Ü®%lßqäPWØ1„&uÚ Í£ðhR¡ðÚ>Bí@<¡œL>ˆù·¡Å¢ŒHà h!XGàër[o¡­…úÆð*¶.¾î\ÈûxÑ»~q¨TáÆU4A‰6Év ˜RsI†ws úM³È¶mñ¤íÚvÅ5©È¨vöë\{; {ÍÝ/)†Í ÁÏ=©kÍEöëð„àH±† bÏÕÙþ?‚'m%»‡Õì…ÂlÔÕQQç{òªÄ­Â º¿3]^óÅ à%€Ù‚²….O{ïbcX)Ó1 +á«’¯äLs'¢¶ÝAµÂv·d\ðoå=sÙc§P\x/\ã/ÊËpí]µuSBYQ=QhË@wBy±„Bgù¢¿M˜!²äÎ à³i©’¯.øšl­¦¾¼˜ƒÉYèŽCO«Âm=Qy¢°ñÛbýÙ+2”Ô¸Ÿ>œÕ=;ÞÏÉ'eD7wàÃ7`vJž)7G­æ ÓàrjêMx]²H£g"G¡«K¼¤¾ÝÝÒxº?cuõ€·—}šþÚ˜d±Â®xÀ²„ú¯§Ku{#º§Í5Srï€+Wg`3¯¾¸w­0öº?G2pzÐj"PÐa?”]ùÁ; ]9qǨÑcahÛ]¦d㪄Rô·QH:–©>‘R¨{;¿vJ€¨iS­l¨¾bÉæðº½7—SâAK›æe< ¿tÖmNŽ=¡,»ó/ÃÙçtÿÝž/Y­XÙ®î§ #懄jzŽÓàê“W*»$@vP±Û¥}¼ÞTÕúÀq†2x¯û-O5ë·&´†µ[ŸÎãùžO¡¶XÈåX_^æZ7»ñ^"ða´uü†Ê%_8±IGÂ? „XŠÛ¹Bx}=ývF÷ùŸçñˆ³ô³=q–>ÇQE‹ïad¹ø#ÿ»ÄJÇÿqiûN³ÃÉDÁ²-0N§e¹”§íç#\ÛõÝ.ðz­Æ@©Dí\ÏÙ½ÜD‹É=d 2)›ÀKözíÌžE‹Q>߀ßm¹0£Sv)¸!»Öü‚ÊJ´´É¨dÌß—¡ü°ªøº½VŠDˆƒª2oÏ8; éV}· Ý {·Tòムï5œÅË>dÐ÷‡»¼PãÜ-´¶¤ŒUŒ­}-Æ. .»;ï©€ë:ÚMïmÀÊ»*Øzâ)…6ëêáÖeíà7vàh\mGmrêiµOq[^¿ó/Ë«”_ƒTI×ÝEaŻϕ<¬›·ëL_Ó³”±Í»êP_;ì¼t7'¡–êb+7K/2n.~_ý±[HK'Å/ ÔAaÚ,„é$ fæ¤KH—gÏä"öfe„­S»[cí ›S:G²îÍèþ ­X»»ÐˆnÎÕðå^ ê“;û:üûw””Ј‰'ôþí w««0·ê UŸ.žÑs\Ÿ’4AŸ]åd?º€úh€—޳;¿ÌvQ©®¨ô& ‡v Hn£­ Òçåéí÷„û®in~jÏ7†69!LWiTÀ%·"°Ž¤@èõ÷,‹ñ-X_Ö8t›¥:äUk‰ÀÔ²Ú1´ÂÚkž_w쌉w>ѦfÇ6•ªÖÁM¼GÉy]¸Ú”Y´6V‘ÇhÊ>wÍï4ò&à‰àçíµ,pª£ƒáxœ÷®_—X­/€/¥dRpܵ×Søgã% \VàaÐà6¨‡yI‡ßï°óO?¯ã§:{ä{øxäYú Úüí²Œ\VL¾QØš#~7ãIÊnWUžDÆiÒ>³‡»6¼çi-@_µJ¼T¢-;ȳÒ¼h×vÙ"MxO•#EöÚõëíš|œÞe†8²·Ó‰ÚµÝn*ˆËrI;ïjE’T§vû3×ä Ú\†á¿›bÚû"™F-¤´¾kó2~ׯȳú¦HuhW[ ;ÿ²ˆºQ`¡ìkì=•3­ž^ù8€R#’e º±ÁÚÞ¡z+AaçHu*œsô„vÆuuòjD€'ƽ2²;ÈØ†ê•n¾7*DnŽØ¹‚Oõöý$¹f`¯…‡…îFÆ¡µ_ž’é+ yôv@oRÄðö>ymÀ@MŸéλ°QPºx eezà±°Žö¨/ÆfVä¹8Ñ/n ÈÐÝ‘Çfzæ‹’ ¨OŸ‚±Q8²x±´ŒU¼MSG4u>-¿1®g=zRc \)$[€éñŒÖŒT7:h–FÌnÔó7Æ}¾P½w¯1Ö`ãù°º² ¡Öáy+¦Á©xïkc³jòE¥'åÝn£”E†±jÏZo¡¹4Ã(„¼¾èëŽ5à3®šð¢¶PºùáóŠF·‡6L—‹ò mæÔŽÅËBN^ÙÍ5}ÖÍùcÖ÷¯®´§9uãXØ0r|N!³å¢Ú|vYÉq‹9,ÔÑuº¢0Ò#avI}²¿¯qW­¨?@2ÅmÝëNÕ«Œ»p¤ãmVˆr^&×nNúdÏ^ûžm;Ï)| ¾9ëƒUTÂäã¹9²×¯sÂúç<¾LRy=„ÖF€œ$LÅ~ÖUrá{G®oÄCŸ]Äó[yf~±ŽG`é'8\Öƒ“p:n—äó6ò £RÀ>»ƒvT‡ãå `­¡ÁTŠM´8¯W¾^Z…ànºø¬køúQÎ8B)vǹqê¶½AÿÜ‘ xóSò6ìàîgæH¡³$bðÌ·²¤:´¸7Åe˜k‡Pçêªþ_f&!a˜‘€– K¥»DVçå}xú‚¾ï ã¹´¯u» tÿzk— J÷w?€{½½457“݇ހα‹ÈÉñ¤e§÷åÞŒIÜS˜&ŒÀWÀÚ¢1& ò˜5%ô™’õß*°Xç§%â³~¶²æa±{ª#ƒÚ½ %Ç“0ø¬¼pí}òv5%Õο¬z_SW&r+:ïÊ=Ì-»þ­µßÜ-õWªCr Áüà›:GsJωªV_cLFsïåÜ:£êÏÒ>$.\dvÝ' !c’E@8Óë §ºôüæ Û Ú‘ï¢PN&&pO °n®k,íl*üSÜ–a®«S)šÆf_ð8‹glþ$Q8ÉÕê*!“럒½¿»1é€d ægXª…4*ô`TçoCãËÍ­ÕÍ­{(üÓÖ3ÌíÈø÷F¼W¢ÍÓ nŠ;î7¼@.§vØ\S_w…=a{¯¬y½º 9ý©ÚÓqÎ(OâçéxDã·X†©u˜Î |ÎÏÈ´ºoÞ­¤Âˆ]êãfL¦!¢’EÙ}/VûéM‘ᓼKæ-Ü-èg …+øPçaŒCo¢g[E÷~ÙúeïM_·ñt€<åÝÀ7x·ï-"oóàX_é'xy‘®àŸgmÇúíÞ:R¿‘Å>ë¸~íò°ñ¬zÏýðó5°Âp?Ûã‘‚÷_s8eT~HrÊi"­à½0n×â>ïv)ŽäÛÝ—asé×cà /e³­êËúq[nÈXµÇÔ—›9_y‘Šë#2²ëëÈk»ƒ!VWzf¿h=yyr9Ý¿)r/ªˆq0¤î^rÃe¯¶Ø|sbQ›ÎèíÇã/(6;ëSÓ‡b^¨´Põå1Ò(Û$±jóÓÍ›Î0Ì”}X®Ûî'°ûÄÝä~`ãpÛæøÐ:— Èxm¼®S;ZïömLÌá«'8™~tªå.ÃÍ­ûðïQý¨1Mÿ¼ÿöxÿMðÿðHÁÛnþP@éøã ¶÷ésÕŠÀѱ~èO pÔ7°vw¨oløk…ù.G÷óÃ×àÓYµß”‰Ö´wÈ#ä¼Fߟ ož˜àö†<<õè;î½¥=‘ŃxŽJ}nuCc#‡8hM‰½¢€R£ñ²J{Ʊڇùœ2gÞ+ê^¦ÊòþlÙuþNBžZ—N[_´I?ãÀ—/yP0;ëI¿$Κ[QûµFEÜÚœ,hóP°9Ò‹2å2µ2ø4f‚% L/øpl; hzõU¢Mpo^_ÞßA`¬Ká¨3a“¦ Ü!Dt_Ì ¤ÖYÛ®ïèùî 5ª?ÇN©ÿç&†nÔ—Ï ¨0´+SÜVÈ3Õ)G€c茵l§½…õŤõ况Š(+x½)çÆÜ«;oRKç©o@@¨ y9sÈSÔnßF{z}íÛbcÛU)Ø´Ÿm»¶[“×Èeÿrè÷áL9·™äa`ô£ éoC>à§)ðÓæ?ý"ÀÒç80Èó°øGb‹á5N«¹îà9H.å¿€€0¾úµ • Ef ï¡H•µ5þâ£Ø¶ïC¡-0çQ\"x»ìç!ªGÄÉ&´èOØõœÆÉ*>_¶ûiÇ/*{xîU—Í5-ž»-œuupñeÕÓjˆ™.SÄgµ¶ëwK›vÅaLBõZ ï£tþŒiÃìl D8--í |Õ7À å=ÚÌÉCÒ¤"20C=¦9µÓU¡ÀüÎö®0ˆÜúѰðüŠÍÅ<Ðpp@àò[Ä“JO•MÚÞ'ï^©ìÃâÎè/ÙõƒÈû@ Òñl*À1[¬âIÍ—ö>mR‚¨?ƒAåHT¡ôJYóî½7õ½XPóbᎊ=Ïnh^Ý»¥±TÞƒ©ÂõÝrÖÎ[~ÛÖ’5´þ%ð¼ z*G{µï¦§ˆÆÌ„½VÀóÄîàùž àíµ5&ïÝã8SÎ?‹¼õŽ3u€—÷p%wñkøa²· !‚€›³?~;ü÷Ï4= ÃýlG`és<÷ür*wèµyNÅwÄÁ4ñ÷í3ØçïáIÖGÑ.¡É¼…&¯3(wX[çϵóîÂïˆ#¶ ì¸8’ ¢ÅÄ‘!—e-ÖI¸úí\ŸÙyyÑ-nWè‘*Zl÷v|1ÜjEa¢jÅRww¬ê»…àVæ2jJ˜ñ¶kTJR•îDß+#~F!§°ÅÊœ¸µ¾åYýª‡¾ÝW[žknR *3Åè]eO :H„†Î1=ßþ ÖØtY^‚poNḑqHŬÖZ\÷’éõe"v Ø:>·óÊú›üH¯cçôZ&¬pQnÎ z#A|ùU'Ô{s9yx>V½ÞA8ñ¤ ^¨^¡”k©°c}ƒÚ¸µ]`rèŒÊ¶ìäÕ]ƈzP“ǨµU:Añ¤¼.Îh‚Äwsªc6éþØ÷;‘üÁ“iè úpvµ} N†;cªÝçäU¹ò¦@›½:Tç ´®=†¼å×ðcé13gš›iËdXÁ×ì³¶nÆ×HŒð°¤_ü؃‡3Þêý>þ:@ôpüâ¤>ÇÄO(7YÜkέìÞ¯áEÌ+ƺ,§ }Þy¡ hqsñùOpÉÙ÷s»ùÎÚ©õuÒöþ´]³ó–wí>Ï¢p\ íîî/ãwÄhwºjßëDå\͹(Þ¨:²º{V°P˾Á'‹p-¢»…Š:úÄÿÙ\š¹. ¨“Qß)ÀfA×o>{ÏYj;ÝpØ(C‹Y —5;¥k…ëåÍÊ­ZI†%¬ú#›–u­Ž>ˆäu ùœ=[!¿®ì« yD¢:OkFa°¡3ÀU…gLV`K†t+«sí¡-­²:Æ _€oü©W€¿9-£Ñœê·©ya21ñN’èùn_‘>zR÷µ•õŠÚûU+‚[4¥õ\úŠ/1áߨ ŸÍhœ¯UFænYíµñ½B,º¹FmyNcÄ“íÐ÷ªø’E›èž¶MÖb¸“·§¥n†ÛÆs»ô¼æÉÚ‚I—(Ë3h.£o°GÅŸ»ß,@W&¯øé/i<Þ¹*oí}|•€ù²÷bŸî·ˆyšRuúÝ×ÚÎk,:n`µ"‘V·)s™9[ö­/ì9·pÙµ~lÇà*ˆàÃË ´O õ¬]ãhžìÜ&ñòÞV÷öˆÕn¡g»aý´lc<@¼ÛüUáÁÆs/ÛòãŽz|h<€­ãÇ£Ÿ'Xúi{ƒ½‡Gž¥Ïy„x8–{,Ÿ<œ"²ßŽîȨûi|µî˘¥ýîÅï¢Iâ ¨Y´¸8¾AĻ̓?rÏ•’vŸ1àʤÓHÊ–AãÊ”ö䩳°Ý_A<Œ cvG¡‹ãq¥Ô?ßgÄ\K‡o Š`›-zê—ÿkyŸª]«1n®÷²îëÇÞ®Œôý9˜ÏÃâ,”š)”Z¨ÈssªÇ‹gîàƒ÷å%˜¿-ᾦ„ÞÏ. „le ®|¨×«Uyj05¥ïýÅûðš¥j‡(¾&ÖüœãA-íè³kÈÀe×>\‘ÒâŽÍ/ÿ–ÈÀáèê€sçÔ+sò¥2©Bñ:Y±¨Â:õ¥†cã4“'­Z‘bzoBµÂ6w`rJ÷М’(bnÒ ‘`Ç ˆö6vWdPž ÈSN Bg\c ZÕ8h0òw4¦±ÒÐ( s«¯Ñý;P2€ÀЧû:‰‹~rÕ{gvÑóÎOYáÙ¼îÑ…­&«2¾N¨ÐqPŠý‡3?5ÿß¿¦>é;.®W:á½¾ 6ncÈ0ï¢1qý«“hr]èÏh.M« ºÔîEÄ/úä&¼v»•pŽ j¼öª‚úîÆŒ×PëNui¬ð|¶¶´€l*#¯ÖSƒâ¶Í\Óœk ð€ëèæv HèßÕ3êÄƒŠ£ïO]W_¬Ý·±hR÷­€qá]·I ZÛ8䪵{Äþï·{YDkY‡ý}ÖÎqÍÚx•o* 5Ì…ŽA ëZ_r{<,®[Ã{×ì{b¬ïvP[º5Òñ?W°ÎÆÍaO’Û<;ïø ì/Îñ¨/?çáHÏ®ÁÜäqdgw¿9N<ìu*ãÅΜzmŸ]µ'€¯Ø{¶ñf XÌç¹1=Íœ+Žž/#€õ62,I´(n#¯U 2uöZ-žiü¢¿Œ<.è3ûŽÛ}ØyêQ1ÒH#ÔõþÒk9¨ àTJ ½…ëáδ cÒHTÕŠ½†aób튪—ÐÏšÊnMhdX÷49-C}õR s·T°7 ÄÃ"&Wí:ûU tëÃðÉ­>}—åYí¨ 9˜Ì‹Pí”®·Ë| …¥ïÔœRY”|QÞ§…;ðØ3ø{ºÏ¥UÓZ))àu^JûjU¿ô"pU yÝ£ËdlE÷3‡%£1ÈŒ[[7ÀÌGðüß踿,ª¼¼;›úÜô5º|ÖÔÒm¬U+2Ø¡zeZÝQÖ[ºy×€'" âz!'°–ê”7$ v7xJcâ¾ëX8ÐßeÔ?Í)¯ì\«ù̹k×U6§¸-¾MÛ¡ñ¿‡gþŽÓm¨=‚xãV°ó'g¥´¹¦ûر×Ëx^Ï2ªÎs@`5‚@€Û¤¸ÜŸpvTí¿·£qDdôï©sÚ;ã}üŽjF›ôœ“«j‹ÆfŽÎ~èJëûõH²àÙᆳr-sÚLœêÓ½O㳨]]”gqÏútw¯éYÚû\/Gs¡¡Q„tw¯Mxþáò:¼þ¡ÚnÛ·§GÅ£›[ÀÞÊêù@^¬O¼ºõa`âCWÒycµ©£'¼k¯5¢d—vÙ¾³b¯Í ñåêÃõÛ÷]íÍOѺ@}=Ñèƒl7Gp€ë¯ß§Ã!–%þjØÍm†ÿ}‡ã®~äççy<"xÏñ…šéio§¯#SB’ÿ—Ñ¿-®Ç€J ðÛVY´@õßµgüЮ‘B;ÄkHå{íúVð@o-6ÕŠOÿ?ÀëCÝž”‡#Ù.ÞN>+ Ù2Ò=CJ·v²÷ïXÛÕ ÕGTäÈqñ*î­ªC[7¼:®ë|ò!\ý—¯±•ÕN¼ƒö¤ˆ+eÝOe}­#¯BÁî½T†D,F%faQa ¦œî€µœ2ãíÙ×ï«ÞÙÍå-(ä¤F=]ÐwÞý@Ïyú’Jq©{ì …­öÔÎ=­Vå¾I7‡Â6F\øbÚÆÙ~Ñ@•Yðùw”¢Ýÿ8 <Ÿü@jÉæ!š¿íÄ¡°Šæ.Ï uöË0Ì¡ÐËü†@˜Ká ˆ´ëŠÇ~ò–d *Xn[[Ô<ðiŒK 3™cq‹UD¦-ÚsÚ?Í)•òž‘\š5 ÄKZØðÕæSˆŒŸ«Â÷¿­p 0t$g—­æÃõ x«Ëj¯›˨½ È{šÀ{ Ò6öƒºÇ¶..ëz[aú¦ÆÚrf]'¡ÌË´ä$€±q…l30þ, d:[;M]éA9™‹¼ÆE‰­î¬lrÿŽÀd0KE¸='ÏÊéˆ×yrZND¬^¶ªÆI<€³ýš“×Þ°oë¶æ¶ G¬]\ʼõ[ yn·ªF[YmxÂèúÇtÿËspµ sìÛXãéõÖv.¤v€À¿S.wuۜ՛hœd÷pÝÚjãÐwÇÐô¢Íz §%Ö le³Hðeä­:|˜óø¡M­;\R‹Óyr€á'>!¬GïŸíñˆ³ô9‹wš¹¿ëð“ÊyŒ\öÜao”ã,¹ÝW6û}`¿Ák¿„jÇëËe;;l!¯h±º‡Ïä  E%üßhQÞÁ 2P7ТæjÆ!cê²ö\ »u;ß{ö™~»F©ƒHÕ+–’<•’ŒØÚ‚x5M ã=tIÇ%žTIì||Î×ÉX”Kðú7xP‰}æ3yyÚûTh¶­GßÉ­Ko·l€©ÚëÅÏXÀƒÑ¾”ÂëÓ–@€I ¸îI§.<:„@ÛÝëò$5®ÈÕjòˆÔ3«úN!' Ó= áÉJI¤ÙjÅ«íÊGÎÁµ+2ÎŪ>s|XÏ›½é3ƒr@Ý®ú £_çÏgeÃ#üÖ`ã@¡•Z Úz%6˜ØèLEU‘>V{wZ¿­ãùj½¦×s£m†Ô£@g—ÎQBiù3Ö¥}_$Õ ¿ ¹ÆVгq+QdĦl.r :À¹[Ê.Û´qÛ¼™ðe0âF¬¾“óÅjóøòAqäÙ\³0$^ì}f'+ëÚÙ¯,x0º±¡þH v7|Y GÜìk'ÿþÚ6áR‰.|ùWZ&мH 1]cpPF¾cþÝ[j'¸0#ý£££âš,ßQöÜ Fx6ÝÅH%`)¯…¾éüÔ‹j£Z Šû~¡Þ@Àâ¥ÿJíxù; ÿUJ&>ÙäÁgSNžWh&Ó+ƒÎÉ[‰Â©sʌ۶q’Š[ê~'tÍ8ôZ[„êe K{:ïñEõÅfš¢òõ ‰ß}zšº€¼öÓc¤òN$É0¹çöĉʭ$nÍxÞ‡ÆTÒÚßI¬U!–¨ÙBàåòxm”Õ™˜œÔwmN…ìY– ¾¼LOî[Œ/O €¿ûgð̯È#wåM“ÀØ÷›SÎÐ;aªCá¹PØ2 PO¿¥L©¢ž« 83=Wß§Êya[ñ'avòcꀓðÃ7ͺ®¹}eZ÷ïê«Õ—ú¼NѸÙ-¨ˆ±Û°Ê.«²Û´8µÿ±„îÙi mäK¤äýMujlŸÓ˜uÇBA -ˆßFlδ ÍI Ñ8ú¬ã3Uñs1ü;kÃ!àÛh#ÖÖËu´zQ;\¶÷0™4^ v¾yû=·¸È'‹‹±{p¼#ÜX®Øµ£M`O‘V;àáMïÌ¡©Ÿvèì?ægýÛ8…á>çñãbÖ.­ÞíHÉ-$NRßíJûß‘ÀvÒZp‡>ŸGü‰=dؚ켃À^8Lss3Qä²îB‹F«Ýã2BCˆЄdÿàsFí¨}öI´3ûs´À4"A¿U´x½ƒ/\@Yu.ܘÅkºìïË€]LèyÖ‘1Îg}úy¦Ç‡aÖMÛåÖº\ü#ÊœfsÍBIõZÌw·Fº8¬¶º6…",,B4 ’ »øâ®M1y±¢Mj›}|fL¥‚×jðÂÓ4ÆbÔãõp–ì3ëHpsqݲuŒ»tý=ø¥K0~ú{T(õD\ž Ðý®Ý‡Ç¿"oE4'žWˆèö=çà)…¼Zbzáü›¯+dÓ3äÁh¬Å²* R« zíÚ¸}]ÿ—ödÔœÚyÈ„¯ý¥*ÑÏ䔥¶º`ÚCx¹Š|Aý ÂÓ/Â…~ÏÉ©V¤£µ ÷ýp«*£4[”]œð™Ù§Z•nQK@å_ªñR±îAçv•è÷¶}MųèŠÀ¹Vøa´ËÊõdäUÚÁ{ŠÂ6ÞëÃ0p;£çymRcÑIs8n𓽠>ÓžI ¸ÌD·ëÈq›¾&ä¦í7l¾¸ä†=ÊŠmõ×ÑpgC`$\/ þá;pdLßs;Ò'ÿŽ<_u¶êöwÀ`^ýeõqtüY꧆@¸SL¡5Á©ÿ%äaìÓ¹æoÃõYóöÚ}ÆÃV´¶Îô´FôE|çrQõøZ’‹ÕŠ'pGmL7ÆõýÉu²+Ú}m¡ ×6^?.×¾Êâ½Va¼g{ Ÿò”]@³Y{î6;ÿ=ëï—­ÐÚ´ŽÏâ3ÿº»9wò$óøp[ÈÎé¸Sû6¶PÂþw›-£+>TÂÄ™GǾǣr'Íq¸Ü h‘Úá¯î0œ‹Ù—é^ŸÉ¥áo!£œÆ‡ÜÜnÆ}ÎI„PL~¿èïáp˜†…wí½ä rá£E´Ð‡íë(ÄÖ‡Bz‹ ÕÙ}9UÛ~¼›~Ëžc-²x2k?^ )†'ªF>ÃiuÃ/6± B !sñ·f´ÀWÊR[Yd§›TÈËK3[ÆÅŠ7Vàò”ÕÈÃ{‹º‘pîû+WRÈÁë‹p!ª,º] ;"Yáóv7+üÙkU¢h±-YÛ;®MåÐyÝÎb¼O†ªãˆ ãÊœ¼‰”îóÈ(4'åQš¿ ÓòR-áü ¯®ýÁ;òŠÕÕÁLzJOw• «ß>…OÞU¿¶¢ŒÁ]ó’tö«]—f%ÊÄËPÄTP‹u@4êË­€S2ˆ[YõYSXÀ –Bay÷®˜¼BâòT«ñTÅB®…-—fáî²Æw ¯ûu6¡÷šDÎDvw…aÏ=/oágïÃýœ²Ón”eQŸ·'L¨ ¯Îò²¼®NbÃm^š­ {âTU«ðä߇™wàÝ·DÐÞ<ð†½ 8ˆ^ÝW¿·ØœpåJÀp\jé·~7 Þ+¼<>.iÏ­VÓ`êŠÂ—§/i<„ëõÌ.áŽÀl<)µóŒÈÞÎk®"àpòŒ¼—{»*}gF}r¦UýhãRŽj\ìäM®`ŽÃÌ”žkÙ#j×ý]I-¤;4¦êtÏW½Ðd_¶$ŠWþÛZáÖA'QB (…÷DˆÀÒ5ûýòò|fϵ÷PÝÌÛø5µ­¡ü=9®gOÎnEý ^Ê%i¯9?xªK®ÀÆí[ëÒ#N³ús*wòU¼òOã(Ê£r'îxäYúœGMÊu‡áv°aû\/ àÝ2ZdÀR\íµ&d¤“héC }À¾{Ÿ’ëv¨™æfz{À¡Ás—öð@©©y¯à·Ûí>†Ðb4o×pªá7ñ\—‘ÔŠºüÎì.>sÅñ¤Âh÷úÿ³÷f±qgÙ™ç/"HƒÁPpßIq‘D­©T*÷Êr-]Uv–—¶ÝöŒ Ì=ó`ý2 ÇÀÀ¶‚î‡Fc€~i`ЮÀ3@·Ûmww¥«*«œYÎRå"¥¶”(Š"Eq߃¡`0 c¾sxC*eV–'«œíâ HFü×{ïÿÜïžóïìµjM'àH\áž{e_×ho7ˆ;îlËHï–䕉D!“UêóÚ‚) ×([jò&¼?Gk9X9ºÎʬµç0®µB±Ý=híí«Ñ¤–o8ÍV¹ý Kf“Às\²¶ìG€,…Òý—g4‰ÌÞprqÈÎ}7q]ç8 §ž…BAýzå–¾¿ò–­¾ÍƒöüH(TZkã#‡ î Ì4¦^¬µ~ž³’ 1[ØR%ùÞ8:*/dÑÚh¶¬±ÛÙ§s¦#òÊôX{l®I}»ˆÈñ÷×`jM ¥¢øôÂö+šL;àåßûy.|^“ñô˜úÓÃq>¡žŽÃ²y¨¶Š,]Œm¨Ýb5ðƒÿ —^Óý5 Ûšíö,²Íw– \+©‘àÑhN Ê“YÙWø«´¢sîK®åãš?ë¸VÔ¹]‡,oVßµ Päß…­\à²x¶éÜ]ž­¬’¦×,crE}Ø5,ð9pRã2Õ¬q23§gêzõUšbú¼ÅRÉ*ûê÷:®lk¸zë¯àíoHN Óž;'Ok¦Ím–ª?gÅ®WDèÇ´ )X;¹gªYcheżAFä¿o-è]_Dch ½à¤û"!Ä—´}_·1ìr¯#[´„ìÒU‚´ÄQ;÷Ó(t;ncíDˆ6Å:iÍ1eL=sQý¸8­,©{“plDÿï˜æÔRY}ôßÿopå¯îM†Uþ."ú»Âô%yþFÎY‘ÝÉAìÙ¾^…Þ91½Í*yRW¯pãM *<¶4­¶H¦•0wW€.ž€¿™µÙáîtPV_F™Œï¯À¹æ-«ð˜%dÿ5Ú½œiS¢Â+Ð’R¸w|JúY;eøÌ—Õ×¹Œ ݃ð­oç h­«c$¾K$ªö\ž‘—ê~Vc»ÕÞË—¾ ·ß…™lH<ñu”P›­Ñþ.ÛßCq°Â–úLØL!À´”Qb@ÞŒT‘ª#„½fWìö_™à5_±÷Êï%€Tµ÷€c…yÏÒàгäÛ!ÁûcnîÚ­&q;áÛÿö•G¡ n½˜;È3±Bp÷º¿g¹ëس• vÞ"òl¬ Ønk£ohˆž÷Þc… ·Oàa ŽÐ$âäp/µGÄîãöÝ8A`î,òn¼„ÀQ'÷3 ü_ÀoØ1óh輇©‚S… i³ <˜I{×ÒÈ£u"_½c–)VS†ûSâ¬ÔÕk¿néÛcpâ 0­ã¶Kop$¥É½³CÜÊj“¶¤Bfus°¼$Г:wÕ±EúG–è¶p`K'ì¾2÷ÐÄZ×OK<µW&Õ†³K[Òó}þ=Se_l“F¼.ïÁY sl®é^wѽÏNˆ4½lŸ¹Jz=Ðß&QÊdÂ@F^ÏØec"V#)‚š˜Bd¦\ꙇï¾2ûÖ‹’`Ø-éž¡”X£z®½R—_z>ˆ`F¢&é')_†Ó£òh­ÍCó^åÆz þ•OM 𜅠ÿËÿ³ÅnÝ3Ðß§k¼yžŽk1ÐÑg<©£:¶=ŠêÖÆ.¼pRŠÔiñ¸@ïÐT ÷¦Ú’)õuº5„ü>á!CjeVïQWŒ-è>kêàD\dö|v6‚Âs™Pñ¾ê¨¼ÇŽ+ì—j†W^H›0¯+Ï_ý§R³Ï {±ÿìgYþÎwèl y’j³p² – oPªò»;ÐS½¹Á¤Ú°½Gר߅µrðZ;0ˆÕè9=üèz œDJv<P½ùy…­³ôiØ>iOÖ¡åÑí,}Ì-òØo÷UKÀ£*¯®•äÄWN4vª¯b\dÏe÷ݵ<„^r¼·¶Æ½µ5ê‘'e&ûìÎpá¹-T. ²N¾‚Vƒ­(y–ϨíÿpyŸþ3ðìú^Ãë3íØóå<ÁoÂr>°êìyš‘ñlFÆ«}[ae_«Ø®:M4'ÎqÅxƒ¼(›yHïCw ÔjîžÀÆèE÷ïÂé :ßú¢•$)Ëx/¡}þØ“§ qÿ&<ÜgqZWσ±÷NJ…Mµ°{šän½­:týs ¡íî€8K$ƒ g_Vèr}QàecY®úFImôô(¤¼c:Zy,¹àƒHïdÔÝI›}ôÌu¨]f¦ZfÌ6Äw“Üèð$м•1J+ ZG(Ûäž“0Ò%}ªîAµgM^Þ½F'­OìŸC é¦õwøðïm_—CÙΣ:omÀsÈV%$”Œ PÛ¼½«’Þ´±X@‹ÅûqOžgGúX/¹ímråòA‘\¯Uçž1\÷Rî]ªCÕQç`=I“épûÙÙÁÒßas-!_y<¾yÜ~½°žã+wå¶x~¾fàW?#a.H¦­À+­­”‡‡™xï=î8Cy ºŒVk%‚Öˆ%›¬ó•9‚‚x'2„%ä•zÓŽÝD«+ÈsPc×Z·ý.#£Ö‰ š§ 7Vƒ»—SÑÀïinÖd]S§ßí} k%SòfÔ•DN¦U öNFhѨ&õ–nÖ„ÑXY_R?,#CZ(É3O4òpom”âú*µu+´ï•›š ²ñ¬Vs¬¿•…Ún½+oN£¥_¯›E~{ ¦qÔ¥ÖA¥½,ä5é$‡ÄC“'Ѿà»ØöZy Fΰ—/~É$ŒL|k ,´×Z5ÞšYËh쬡v»ž3c—yö,ܵUPÿïaªç]óÅc£mmšŒ]Ý<QFcÝ™3ÌÞ½t”Óv££âÌìíZ =`°Å&ôyúf'¤8^ª@ÿ°§ŸÕ=íl«}Ë{–ˆðP€ª®^^Á|ÞÊ º†R-0½»+¦–ƒžñ…¢õÁÅ3ð·JÚF¹ËÁ¶‡ÊÃP %jll'Szßëâ°“ô@K'\š á Hìôd"¨˜ß›„}òteŠÐÖÛËäò2õh^Ékb?Ü2 W`f-è#GB˜Ë4*û¦-è]¥$ÑPRm5)Œ¦¢Ævh‹¨?f—DzøÆ†®‘µ~œ·v\¶÷>gïù.E*Cí°AHJñzl¿jŸß0ûàÊÝlßFdcŽ!{ãÄì§½™±ÿ{ ÜjÉ,µ554ÔÕp0‹Öö.wA¡>“ŸkF=N›ðÍ£ ¦ä‰¿ïíP:à'»‚¥±Õ¡—Î_ /¤øøêÃÿöø{ †ê\qØÿv/‡é@†àO š.Buó:;f&›%qûö¦Ì2Zƒ¥Ðjí –fmû­"U‹< ]vŸ·ì>€o#ÅïïÙù²(­·ÊäÁ*#c5kçwz+â8¤ìóf{>Y8üÁ ´¬@"„XîŒÁð°< GOÄ•¯«·úWKâ@u ¡> ³,ÀõÅ@’N$UkÙ¬lï1Mþ=Ã"–_{fçæH‹¬îè9kÑJ¼-)ïéSRá¾ù}SÞ“‡`½Í­@KB)î +:~¥ PU!¯É³P YZuXzÙŠ94éϾ*oÃ9øQy©Ž„z]{%Åþš¿ÿŸa#ŒtK wL·ªçÏkή‹³· { JƒµQ]½<|¥’²õ¬o׊pûÚ\F€¶²‹ Ê`‹Du‰}iÛT@âxYc.‰Î[Þƒ “F€… “ÀH¨^™×I›Ô¤_[§‰ßëî]xŽ= µmðéI–D#4ÕØÞ™‡kæŽ@Ö¨eÎ<ž†Þbÿÿíu«]V¸tKíX¶cò@m>pkö‘¨Ë„øó€Èêõ¨N]¥é™µ¸CH¸pP3;­÷¥9£ÿsÀƒmé¤É¼j=ŽœÛ·T“nËÞ³I2ºÅ·ÛFL¬jo7xŒZãJË EF£w·è³HîÜÔ±GXuåsçÑ¢­yezèh´öJX v…Õ:Ðý]A¥g‘DÀÏ!pÕlmîÉŽlŸK•, ›²ƒÚx•`âÔ—”¨•h”šÚZvPÿ6¤\ê¥y–ãG…Ù~”Àä“€Ò‡-¤·ÿv·C°ô1¶j ô$Î’%'V¯4|_çaûªößAF£šžµó»êö14Ñæ¦d’c½½Œß¾}PídD½,@«ÝÃ<H‘qsUʾ¿ ¼jûÍ cö>ó´MX1~ y'zÑÊð8Adι×Ъt…ý¾Ïòf¹Ç-_€Î¨Œüð0¬ÎJ‰úöµEk‡&ëÚˆ¼5Q8R¯ý›Ú5!?ÈÁÖeÕ§[˜2`dYvëYÓdy_^˜ÕyñVÚzb3•ÍMr;;ô µ ™¼@aÍ]M|.ÐW×ñ[µïhAe)œ[VZkà½%M¨õÖÖžbí+ÜSpiEý6MÈ"û¹ â•÷î]—7, ¥bÚz”¤Uí༨ôõÂδã›h²Ê, D4ÞÔñZ…‰²pñ‹ŽSMª>\‡é?Åj¤¨î¡ädJ“kj«#­òxD¢ ú”Õu>·rpnTÀ g^ž ‚7f¨+„)Ë{„ÍmVœ8&Êr æ/‹çóÂ/¨ Gàö¤4„Ž´B~Z÷VØ¡=…Þ}ëÆv]7°Öoýá|B—âÈYÿôØøÌÂU9”õR­¼“ß%{WëŒDÕý=0Têì-d¸tÌèøzÔå=hZ¾b‘:'ËÐÔbõå­Öúa#÷ïÈÃIÙŠ'[]ºZ×IJ4J´õ0“èåð9¸üº½wÇ5îNË«“B ȉܯ ÌµVôNŽÚ˜íA!ûAÔÇo!´ƒjSž¶1_´sökËvLÙ­Z„\ª£ÅÎ?fÏ»‹@¤ƒW÷R—6/<,(—ËÜ¿mª€!›Ù³]ÝàÁ IDATžX–ÛG¥ò(9Çõ§¹r–~²Û¡tÀÇØª_Šê”äQÒ.Ös«ãÑÍbã”!„ìcY€ zžå |ûÏU.¦7.nX{BÞ«‚‰Ú ·AG‹ÂùœŽ;’„¬µÿú44Õ³8'OÁ ]ne¥‡5[0*­’B`u+«s--(·°&š·1è!”Ö˜¸J+oûSåÞ€ûÓVÂ$.@j›Ön8q^àq»$M¨^ô½+¶·@¼Ë>´?ÖW (ƒq茘×ÌŽÍÀÀfAaÖ¦vÝëKÿû.þ¦ˆß݃Jk’Ô(] ]¨¨ïêb$ WËÞM'Äù‚àI^3åír9ˆ2./é}È•ÌnlèüÅm=÷ù8û’B™ßû …9V;ß'”qš·¿;){Ú®½CðŽ‚¸Ëö÷eB¹“Ydo¢È¾G0 ï#àÓAÐJ!Wù2f‹vO]h¥w„ BÞO c‚Œ¤«ß¦ìØed¨ÑÄâY%UmWƒ ówoI#¨­GϾ±¨I¦¥ËB_%e%%¦é Ò•}ÉdVâ RAN6©0h ZýçJÐÛ&OÆÝqhëÞ¥™2Ç{àx—&„½]ý?=]"8ç2`4ù4¤ÂdÛdÞ‹64Fúzbb5pº þ‡ÿUm¾DgLŸO2ÿpDÆ?—ѳÆL@r¹¨v÷l¤`y>˜”¸à=ËŠr]"'©î!ÀÐÜçkM00¡ì«ý}y:â e™¹(cS;ŒžRIš±«T­oL+ÜÖ9 !Ñxƒ‘Ï›EµUaa‘ÀÕ±@Ƚ³¤}Z­]sõã­¥ª?žÕçíÍ&Ø×DÖË·\QHué¾qâ"Ú¿/"Æ»YøÎ­ º8­gÛD £bí^"¡mE`¬Ÿ Íäû8 ¾Ÿ /ÖìVBæi ø• ðÙ+œèÛ30?sÿá4Ĩï“wìö†€ÆtAÀ`¶·Lþâh ZwÆH·ª ›Q¸³¿~î׎·‘÷w…Š»õ\MµcOŸú#F‰M5«Ïv‘'ñö;¤œÍî×µi/<ìb¯9k« /ò´÷è6 E¶¥Ù _€GÏ×Iç‘wê ˜š‘Mس繅ÀÔ?A}›&xÿ’è½ì „â– ¥a{Îû?³ºÊ´e­’4ܻ݉Ù3@C^vÇ|**øß‡ÛÏîv–>ÆAzì ßU7 kšxæ„ÿD+˜êpT¹êG $ÂjOVL2ÀJ,Fc<ÎeÂ*h›0× £\¶cœ\}¦EdtÖ ªâŸC\7JId42©ƒ5d o"CÖoϳŠ&×wÚ@Æõ¨ßgçm·gë&dåõ·¾~E ¤„@Éü=¡B>xQVr +m,)¶G«ëòž¼'uqM«exÊø9mp¢Eü¦…5¸6'ÏËúfåº;³^â9Òªóv˜€ãýêc4¥RîñŠ eìdZž“\N=§†»øyÕ @®eÕ_]&Ð7¢gL4ÒkµG½õS-C·\ÛÁ»#¥>^¶¾®©UfÖzÉ4Šv¤š=ySíº¾$þR{yNÀ¨gXò ½Çœ"Qœã"I?Ì(õ¼Mlo ?ršfL¦:]#6~Ç'ô\WVÔÏ7 £çÚ7Í1¨­UÕÕëYoÙøØ,)ƒ,Ý*ÏÒ,«Ò;6öëy=GcZr m6΋v®N‚‡©„ô¢<$–Cž£_ûyIVXŒúB°š¼íÞ"?§/Z—ì÷VÕ>T0}½.û?ŸÃ-l‡œ¥±U{”"UÿW¿€®­A?É]Ú¾ù¾®­â)¼ýè…¯TWªú»MýX:n±H~}ýÀÈŸ@+¸´ýý€Àoè"h8­¢ %‰ V?r½»‡£œ—*—¨E†ò);_2®õhBLÛ¹;.§ a[CX8Ô)B8p©DáS¯¨žZs§Bs­E+•Âh«×Äê“|ùº8L‘¨ÂGó¦i4»&Åê®!Hõ«âŸ0?Gn·D]¾ñ]¹9´úné[ÛPØ©©]ýáuÍœ<º¾¤ 3“Q'N…”ü«oX]¼µ¥÷ó&0ƒ|"p“&§aá²´s6spºY“ÛÔZȦK  + š˜Ò˜<Ý"q$%Ò÷&ò>¹w`(TÔ6-ºæýŒîótGx¶Åi,E¿¢Ïc5š¬]æÂAvõÛýïŸäɼÄvì³NDˆ_*¨ ɽ¬RÚW³Ò*®Xh¬^ãÄ'u(ë£OÙkÍŠËåCê{yZ˳Ӹ)ÚX¿oí¿‡&ÖNÓœÊØ½õ=ò¼í—¶ç͆Îw Z#Vïèn€÷ß²¶³>jë…¦`±Oç²GžRfãùaeÎç$:tV¤öì†ÆýÖk¯IµS±ß2é†Ik× èíÓ˜š¼©Ì÷V4É4'EL瞇c²UgÏÈ;·„Š\Fcë€F(eÒ€B[ÎG|P¦ÄCq „ü)”rÎöß¶6°ï]X÷‹öÝ ôî×"{rŸ Rz„@Ä"dƒµÉ²1 »ç}dKbv}`j~žÒüü#Û“¬j»?ìEòEðþ¾{|û´dÇnŸìvèYú˜›¿(1% úKWrƒ@f…GAP”¢Ücs½ô¾ÊñNñß—°‚¤ù4™¤ypð@ÓiœÀZ@%BPõžF«¨cÈ =@¦t’øl¹€Oñ—zçå/í<‹„ÑBÕóß°c½ÖÜ¡üÊ"ÁC×&­4A¡¼Œ þš^ÿäiŠF¬üDV /|Ѽyy™RÍ0yCmµo«ž…ëšb¼¸d­Fyê¥vÖòA$¯ˆÄo¿g_Tm­¸‰BîïC{¯éÙXŸÌe•…7ÔlaÈÝkS\ $³K3Êfºx^Àð\\ÚH·ÆàæŒMÉøÅWÅ“êêÒyRÍV°K“mO—e6¡Õ|ÖÆL]½jŠMåB(´; O·pN›Bleªî­hKóT³&úÍ‚HÞo}îÏIƒheVý·k}ÛŠ&µUà™ZèúâfCˆ)$¢Øßƒ}à^DdøäíxvD¨è°pfšÈ‡âš$ظÈo*¼¶^‘¸f …© Ü] ¯îælR°0'¢uÑÆ[‰8ÊЫ‰=ª uwEùúßêš+i õõ§aºóey!6óVÆÞMT¼ø¦½gÍp⛓Ï)”‰ÝGS»€ÒܤúîvEåN2½µ±qÿâÃuÕ¥Û߃ë×CصPQ¨uo”¦nÊKzñŒx~GZºÛ\ƒµ5¢}»ÿB(ÑÁÅbÕ»Ý@!Ú8Ø@ !˜Ñ9ï#[å -Wwi’¶K"0ä2qd»\fßûö®ÕÚxpï\ýìཽ½<óÔS´£qû»°=‰¼ùˆï? D}رþÙO4r–~²Ûa¹“Ø\F¾ =éeq“gÚ8òcÒ„¬·jtºGàù9ª…Ò|•æû”íóÝH„X,ÆÀÞÞŽ‰«çfá³k· ƒâàí]Û//"oA#X®ê½‡ ÞS„Õ{ƾ[E^«%B!݆rˆ›0ƒ&‘94Á®Û¾/J¤‰ ج塿CaÏdI¦R"QM.‹ÓªyÖ9 Ð„ó‡6Wå Z]^–” ٠yIjëäè–Çf¯$à§ù{ðÀt†¼d@S žý’²Ð^×óµßgi)”­Iñ¸•<ÙUh§5!’]×ù£xî+*S±t_iªÙjÌåCvä…A?Vcõ#„5uòhÅjÒI ¥èRQ¼®7ßÕñiTÿ­—ÕHBué:zàÚ‚ÆW†@¢ö £Ó#–ɵ¦‰x)'¯Wœß߇ɥ͸üÒójχëòBòzÖ…ŒÆ\ÅÆü¼‡¼ gCÛ·¯„D‡†Z=ã\ºkU§Îy*ž¤ð"ÊŽŒDÅiòPïЈ<7»;ÝqÛçVY}´NHeÿ• pûjÈZJ§ÂÍšdÁt^ïòÓ]ò¶ z†¢½3­hapš vŸÇ€¦´ÆYvC€pm^çÝÝQfßäM¸;'’÷fAý2‰ÐX©³ózÆå¼½s]°8cÒÍpúyxÿ»±÷{k0˜6î=‰o^}C@¸°%¦Ek‡*'R2;±‚@ž§ë{Öç–õw:ö¤àÿ¬µåâ$½e}³’J~q#³6jPFí_Û{GÞ¨ä™rpq- „sÚÎãÄ÷XFªö9 ,ÄbÔÆbìîî±çÌäÜÓÿ$ïRõV©úåG‡F?Ír'_å“/wò ËøvèYúÛã±ë}dœÿ~‡@ôì qu…fwãzf” "¦›ú*ÞSdëí§t¶´ðÌ3Ïd£yɆ d8œäëŠÊ3öY!ãBVIøðëÈÛ•µýf‘‘œ%d¬,¡U¡Ö$Jv9„{vnw7¡a—•Ee8vwD¼ÞX jº{H [ ÙÊJ3fö.¼ómqƒ æEH5ÃìB³­ié$e7tÌÔ,,È;qçŠHÔ‰$´>wž…ínnÞ»0¬k'ãÐÞ&в8­kÕ[Ôŵo2.žM y7¢Qükh³+ ºŽ‹þ—ÿWØz%h:ˉñ»;â<€Òò¥ûS0»¢gn´þ-—•¡–±Ì:ÏZ˜S¯:ànAí?¶ ÐŸ•#Ñž´…N,Xlf-«{/íª—UÞ£ÀõwÕ–¹ÞW8)ÜFF}8Oàžt׆ï®ÓÂl,‰¸íý}e°Í,l\ õÃ2 ¶„@Y]=\<¿pQ¡Ò±IÞÙŠÆ|]½ô°ºÐ¤>dãñLLÀââ+¦sf3Œ+Êç,ð´e_näÙ)Ô¤7”P›»žZƒÝ_õãý §Ks0V‘ŽU¢Q×ÙÝ–ˆlFcíè¨Àèâ´ÆÙÞ®@ß=¶n ™€]"¿aïë67 ÞÓû¾dHþ÷µl÷è’ oÛû[º“ˆ5X¿nmäžúk(µ Å¨z€{Ž"è™*h\9±~Çþ¯Aý[ì[G[CCáS¥u¯’ç2}Øæ6ªú˜Ú>l!}¸ýÃÙ9Kc«v«º×hŽàIrEà!òؾ¦¢U?í³}‚‹Øÿ†À‰)ÒíÝxdÖ×y¸¾~`L÷ª®QD+@Ïi%¸´ã„B­ ÆUd¬œÏôí¼%d$ãÈÀ5!{¹âg ®òU4‰, bo™àM´cº‘á›$¸Ç‹(cŒBOkü½m×¼» ¢gh4ýŸÙ»ÊÎòB¼mieDu Mš]¶Z_‚c*[WS‰IN¯@oË :+ÜXP;~Þ&Ë L¬Á`JÏý[A#fsÕä Î+åýh\»e%/ ºß-¬dF‹ÛÑÑ –ÙÒ£û&—'M˜èHHA;o1‰ñ)éÍä©»ƺLVTqþ¥˜›>ßv^2Omß.«/œø¿\ìø[[0E^Þ¢†5‘ÜWM¢ [Rÿæì:Q`ôŒ&ã¡–731Ôg’°•‡D\däw€5õ} ¸¶&€èïÑúßX•à˜]Ò$¸…¼+M: ‹yèˆË3×Ö£ÿ]iÅîaª s;8œFÀ#S`Ée4NZS°iã.ƒ™²žñ~FçtÎÝ–Ýã2zWv Au}½k} qê–‹º‘ªqÞ°ç-q‹žú¬ÀïͬÎ{fî½Y‚y;ß¾»É%,oèž:е»bòª..È{™Žì©lOÑdSàï–‚¯ž µdm›@€µ`÷í™diä‘~ÎöM[;÷Y_¤lÌyf¬{µŸµ{ÜäÑbÜW­=Ÿ±{¸jc¹ž}ví:YB6p‰àyŽ¢ç™%xñ7>$_,r„°@ìôãDm_$>i{r¹oŸ&~Ò':û´<×§e;ô,ý[µçBˆªÏk ªÜIµ¹jGŽT=æîÅÃpNªôòNO¶´ðÂóÏðº;;B(w’·ïf "”£„4Z®iUûhõ åýZ‰æì~Pxà”ýÔ!úmäuY#dp}Ïîÿ*2–eûÿ6AíÛ‰¢ ll#ðœîÛç.øW@oªY€¡£_|¯¶•Õ3€$k*«‹›îÑíûìpPu®9K¤©›Þf…üþò ñ*ûÊŠËÁ½kZ™ïOG$Œy{L âè(LÜRêöèEMäQÄmÙGÀ/G N7µ+XÞ“·fMRƒI­ºˆ¼SéV¥¾cê›54ñz¶N¹¢þlA“mx~zʘò¬LÐÄxbDµäéN¹w¨ÝW÷ €ÃfÆB(“POÿ¼ô‹ ¶§,­øã·ô,Ó[ϲ‘S¿_¬…Fáù¯Àoþ/ÒHjë c“ÆéŽuaS7ÐuÒHÁCgC6ÎË/Zª²YxoLïMÑÆÊYkH:3ŽðTZ‰ŸFÆë„2/—Q]/ÀÛ‰Šíö#£¶Ið¬ýšäûì<5À7‘Ѿ °s™vPúðU»Ÿu‚tÁÒªì+Å~++½žrY\ T3t¶ ìl)½ÿHRàdm^€jqf¦¤žÆÇS7þð^Q^£¦vŠiÒ‰7ˆ$=pRg;h‚ZœVøµŠîåüó–õ—•ã Ÿ7£^ŸjbL–ÍU ?Oi‹FMH´"iƒÝ‰c>¸£ì«>à«ÏÉTð6Ï ëØMª;ó’8VŸÑdEr…¼Q¼AÄò6B8.ž©..ÐsÏÃç^Ïf++Sç€Âš4)/­…÷ÖàáÔmÍ ‘Ñm¸ò×â‚ÝxKýÓÝ¢û}&ÇMš¡·Kü”&à™8Ó*# \OÐ÷ZG Áõ“Þ[Ò±ÄmüMÙxk²ñ¹^^Êé5xëJHpèÆòŠiÏ6;W“ÝMž|Á°B(®ëž‹pe\ã"ƒÈó}iÉNl£ömŒèÌ"ñÊÝ’¤ÞzCZPû7TX·Ñž«ÎâéG€ßH˜P'p"©„‹®„Ä\÷÷ê [&—a•ªgò}ú$ÒãŸ=ÉÖo?á³OÓöIÉTÿna;$xÄæÄ9ߪãØÕ.Ýê­‘Žûø>ѪÏÊ’¡Èã„U£_ٺ˹´¦Ó =Ê7nËÈ®êV5¢¼‡JðÔd+­Æ2\„:Oýœìj¼¥ˆÙ&ðO €;ç04#WûBçíï>Dú¶gr²®{»Ð Õ:ã·üB9Îcƒòj´õH‰øäs*u’Ë(IJü@R3SÐW®µ n‡pMëð0››ô•6x:»µÁpÂm…¼ÙuõÊäòì›2šz­J{Â!‘¨ø!—o‰Ä|îe˜»§{ÜX–œAt *„T±Iny>()LGšCÛ%†#ð £ÉgtT`k¿"´6/PSÙk«j›õ :®sÇjà^^ms2x¤\°³LаiOÈ›´0-a˵5h´”ó…‘ò׊a¼¶ž;ÇHü&CgÕþ¹ŒúÂÅ9Iyõn¼d RÍj—-Kÿ¯µTþ“ÅcjN+Ó0ŒYzeC`#jc`MØ£h"n%€õ%û{‘ï׊älÚ;á€Ñy†gÎÁ›‚³1¾Ž¼¶>a{¨{BœÛãÞˆ#Hþa§¸< @ºVü¢uਕjÉ,C¶¢suvAÏKÇÿÆñqí y+Ô¼&ݦåFΨßçàäyµùƲyZ‹ÒÞšæQ﬋2îÙ9fØD ±-´ˆñ0›g¡=‡xD· !Ó/¡ó¯¼=ÝvÜ}G=„ξà«!$žÌYz(kÈ>s{ãmçI3»ÖÖ~ÿîQò[ PßÐ@}}=ñ –‘ÍpyˆÇÃjÅ3Úÿˆï~œí§Iðþ Ÿ<Áû[|<‚÷þáòGôG|ÖÙÙÉÒÒ•J…?ú£?âßþÛK&“á…^àßü›Ù3g>Á;þÉn‡œ¥¹EÐ œãQU×Ç74ó}ªÓA)Ø•dSƒë)ô5°Tý’{ÌþèΕÅÅ=¦"!‹%‚& C$‘G§âÖѳBÈŒY¬:ÿ 2úƒhEê[›Ý×Zj¬ºž‹ažG¼¦œë%ÕËù $n×VÆK€A¤ÒI¢‚l"hæÄPYö6ŒK%Èþ5ŒœÓJ|}QEA7Úr‘Ⱥ8†;SjƒH>Ïn©Ä|.Ó]û¹¾ ptDr« ж+ÞOw‡&*°Úl wLßÖ¾µõš0ßÖ÷®«Ó£Ê¸*TËÌ‹Õn®Ak6ÔsÛ-©æËДÑßõH2“‡æÞ5geiPu (¶÷‹Ì¾±!–nµÌº¼ž18)—Ô¶³Öþˆ£6Q€áyÕÛÉC‡é ¦[UT”­O“1‘Ì—¿!zÝcÆBZG,t:Q€Ë2èȘ·+¡Ì°‡Eq‡î\Q­²åÝOÈe•æßƒ³ey$<üÓj÷Ÿ°ñÝ™A»Ý¾[D}ßœªÊ®³q4œ>cÄú ¡ÑDðpDìÜÛh’÷÷Zh*BB÷ËZP¸7¹1bu à…ã"¶/,OGØ[‚íÙ43Ex¦W|3«÷ÁIÛ 1¿¼&¯æB^òµq)†·wh¼Ý›2ÕvÂâÉeKÚxIØwŸ±v˜GmæÙ‚×P·{ȮԠL·IdÇÞ „û÷‘MB^í6BÉ”;6aí¶„¸Jï[»&¬]X_•í³e;Ï*9xq@E‹¯)B8­#™$ÑÒ­ 133ÖÇwí{?Ï㔊JÕç7îp{t;sæ ¯¿þúÁÿ±Xìàïù/ÿ%ÿê_ý+þôOÿ”'Nðµ¯}/ùËŒ“J¥žtºOÝv–~Œ-÷ß¹Û×ÅË|{ܳä¤Joø,zù÷/i”’ó0œ¯^SÀTM Í4®®œÛIÛNˆtOA­½î<âÔØ9ø´#ã4Ž ×žýy}æìÇÐŠÒ à(2¦ed´@“Ôí>þ+ânܶïþ;Bønœ}“B™4ƒÈ Í¡Tà&41¹Lž0Amç4 µ÷KúÚ÷ _„3äÙ8v^a¤\Š9­Ôc5ðÔ)}Ÿ'Ðã¨Àk4ªIóʆVȃQ]#¿gbF–¿ªsÝ~Gžžœ§ÕyýΕզ‹ FbÏhRïXRˆ®©=h7å2°…ž¸€ (o'̈~`C IDATÈ\*žÆBjʱ²Õ÷[…¿ù¯:w¢æŒ³° Ýš:©ÑsÌ/Yiëƒ!BQÑIä!X.iì4èËe©§w$8(“±fŒÞÕµ 5sæÝ‰(m?_Ö„0—Ïž‚£ëp­¢ ´kPÞ°»Wá^YïÖnÎJ]L’vc­ÉF˜,D[j²>ÁŸ‹©ðl+ÊœìERyàT‹<Œ™eiFõ[b¥O5Ësù œQ{—@«Ø8wí-÷l: Ý?[³±ì^”Ià"°\F\¥……æÖ`;¯ã\¨SÏ^œæd›¼…w‹uI»Ö^ ú¤´E è˜ÕNœž€ç$:y2xvVí½º‰Òý—íþ@ïæiÄÙúE{¯<{qÐ>¿ƒÞïUB(òAÆ$ |y ˆÏ”FàdÜ®³A„ÎõzŸ °M(,^©ú»Úûµgµ-õ…äÁvF€ÙL†èÇ𓜖à‘ÇÃKdSv öñªûiPŸtèìÇ=WMM ]]]?ôy¥Rá_ÿëÍïÿþïóë¿þë|ýë_§³³“?û³?ãw÷w?»ýÉo‡œ¥c«<öûöFÂ@Û·ÿ½¡}¥êû$Z…:á;F[^ ¢Ž6h±Ï#‘ÈÁª±@_EBÏ­eB3oŸEQv‹¯ž7¡¼mŸuÙy/2ÿ>GpÝ÷Úù¦{Þß±Ïg÷¨Mf L¤ñ•–QH®‘ຟE†Ù³þº­M*oÓš]kÁž1_Ôäqÿ‹Äš¹#/S¢N¿ ê¾…|¦Ä£Ù,Bwg’£-u¼x Î mçâ±û»7!ÔÒÄÚÓ Ó“ðïÿjS }=ý98®òÅ‚~šâ Wu÷„ú~i øY®Ì²TœïNÂÉaÉ(ìNŽžÙ{¤E÷ê«ÿ†‹©_}Åßš–' `nCZô¼ûX^V înÕyö¸ˆÁ©_†žay¼ÌJO3¼ôy…ïÎ÷*%úÖnÿ–ùñŒ ñÒP1»G—(9BðL;@Ú¯§îÝÆöëéèàìÉ“öÖ‹€Ã£Y͈üÜê«Þ¯B †ÚÒ§a›˜˜ §§‡¡¡!~ë·~‹©)-Ÿïß¿ÏÒÒ_ùÊWöÇã|îsŸãÒ¥K_·ûco‡œ¥Øª9KǺ«W?j{R†`_aE /¦ÿí^œ.ÂJ ®®ŽT:ÍÃÕÕîS'ÔAàûxê´×ârM›!BqV'¤»çdëmŸ_F §h÷ääaOÓv-¨,2¤¯!•ðN´:]!húDìY2ÈÍÿ ´Âí'¸î;mŸV‚«~Ëž+n÷–F†´`ÏŸBÄoÏ–‹FM¨¯Nå‘VemWäˆD!Sj¤´»K:²ËÑ“zîxB«ÿ–xJ¹ŒLK‡²ïæ§O©áˆÒâsqKöJ°x_`©—hàvNaÀ¶I,?еӭ”® ˆÄc"£G¢¦jÝ(Òøò <Ìi5Þd?'ÍæB‘õ¨¦ÚîŽ2[»‚¨e]½î!‘Ô}–÷àúŠžµ ñ“Ž×u·spófàª{Q fcC’ g_¾©]äó«kê«3’¼}5-–F{`WçÔ¦·W ¿V!Óç¾ï¾.Ðì+÷ šØ<$½Œ ³î8oƒ09£ç… TÞ“÷¦5©¬/Aô,6§<óÒ wžÙU@ïÚ_†÷/©†ÚŒî+Yu/°_'xpö÷§­KÞ»dLí¿–‡æ8Ü)5é{žšZøÖ¤þ?ÖcvµLÞÆvèÖ"à½o©›Ú5&@Yo‰Ü«ì„í¬½#pŽ¡’“à/Ù{w˜ûh‘ÓOð,_µçr.QõË*ò0]µ~h (|O<ÖÛ}£jrt§µÛ¡=öÐBÐÏQSõÙ&Á&:hqOg ;Ê=û¾?ó™Ï0??OOOÏÁ1¿ó;¿Ãƒøæ7¿ù ÞõOn; Ãý¶ê꣓ÇÖÝÓãÆÁ<ÚsÃQFÆÙ3Üæ«}€x"Aow7»««d‘A[&€©êsîØÏI@ÖÑ›µï]°-M–;B(†Ù |­â'mßëv¬ ðÍØ5ŸEFØïÓ%zì÷ 28‹Hü¡FÜ,2|öÓFà¢díÿ‚þR§íŸ@Æ;LMjÅßÞ¡‰š=…&L/)VÉ} ©mBÇ…!:[Ö˜»²ÈÔÒ×I¨ˆlCJ â¯þÌÄðö•e )M^s÷äí8ñX¼- 휮UÚ…wÞV>½«°S²I€®µKܪö¥Ù2ô›ú÷ö¸ÆÔ¹—á™/Ês¶6B™eÝãÚ‚Ú( ´`8¥{¼R’yã ojÇŽï èþ^Æ8òÊW(ÿÅk Œ¡þœ¿'^R$*¹††ZÝw¼³¢gsuñ”õWe¬þ–õÉëtüÏH‚ ÙÛ¦UÄIZDàè¯í½¡×è ô¸¼Ì®ëå%Lʈß䜨èýv0Œí·e×òìW!—ñLZ\¾ˆóª‚\¿Êû`èï£ƒ›×¯.x”;Zj«J<áoç¨ú9lý(QË¿í'†ëïïäó?øƒ?àÿðùìÕW_=øûܹs¼ôÒKŒŒŒðõ¯_|P4¤z«T*?ôÙ§y;KŸÀö$Àä+<'y{†šØNpô¬8wK«ÎÁÅvr9öïÞ%†V^<Âk'ͽÆ"zÁì»=B¦ˆ+õº‡(‰ ø"!KoÂÎ;i¿—@k%ÃGÆå,Áã3†Â»F/Z•ßG ©×´í¿ƒ¼('pÃ|â8rx¡VÕк¯Õwç€À(L«QÙŠz³t[·?`³X!Ù$âv Cîî(³íÞuµß2PŸUH¨9) °•h9ý‚ÂD«÷:Ê{º¶×\;6h*Ы¦¾¹zæLoèÞ/¾"¡ÂÛex¶YdCJûxͶçkt|> «9ñTîX{LZ;LåÔžú^c×ÙÌÃÅå•x¸>ƒÓðÞ„ÊËí™WK':`yE`%oíÛD[»áò%¸ð¼Ú³©ŠW^#—ª ØË LT²òÔ Ê³6u.¤¥0~Ïú¯Õîëè7AÐyS[ pÏ"ì_¹h¡³¿>‡D4 ˆïµYˆ¾v]ÐjPX/c¼±No-]ÒâŠØµ<ërÆÚô<ПP;6¼¯u6–ÛIM(tå‰ 9ÂÄž!”ݨµ6Ý\U/fôìßû‹×”Õ·ÿ,i‰¥RP”`¥s¦ªžµëx‚ˆ‡/ ¢v-Byä!^°6ݬzžÛ·ˆÞÏgìóÓèvNÖZ=‹Þ÷NûÜ)kÈ&ÝåQ1ȸ=S C A“ÎkÂy¸Ó“:Ü«¡|ŽSÜFVoKKK,­¬dÊíó(p›êÀÉì¶®&€ÿ,…åžäYúQ[2™äܹsLLLð«¿ú«€ú¦»»û`Ÿ••:;;?쟺í³ô m«§VgÌyÊìãÄo'rGªŽ©DÛ'”9q¹m ÙÔDòüùƒ°È¹ÈÜ}û¿ âmÛÏ ŒMvŒ«%{áÝ3„Ÿ«ƒ»SòÚxæÛ3~Iݳ(\²d÷|ÍŽY@ƱÕªÍÁã²íïEßA“Æ’}ÿ2λö\ydHíþÝ+WAéù7Š"E¯Î ô m¿’ƒ\b'αßÓËöCHÅuÏ9àÆ„8E…< ‡i)XÇQHïÎu¥Õ'åÁhíÖä÷p]ž¬dZr3wä=òzcCg ¥[žµ}÷æ[ÐÞ gka*£‰ðå_ÿgâªÀ×vNi⛹ÆÞcÏ}Âú¢?.œG¡Â‡ëŒ##R(w/Ûý[âb¶Hû¨´+N èŒibÎY¿’ðÂyÏ–n8: wëE¸7ùÑWÉ”¢h;×Oˆç‰*¬5Ÿƒé9MìÇWzàå—a¹ oLÃÛ3j õ ? tÖÂé˜<,×DËqÑ"pÕfÎ2’fhŽ5éQeæ%›4Nû€³gôîLh|¯/?«vm´>9oãu« é„”e$ â¯7X8‡€Ù’ÅyB8Ù¹>‰„Ž-Ù>'p]‡@~8ýê«”€gàDŸt±&&ÄOÊ#°±1¿XõNEw¬½\¯hŸPŽhßÚè“‹vÜ="R÷0Œžûâ1ÙóÌ ®áò¹H£{=#Í“Mš ¶ÁCeeûÛ9šroc‘°°+W×i {ÖÞN!Ù„Z ­³“3'SwO»g%VogÃUoåëxAüÓ²U~?GŽyäç〥b±ÈØØÝÝÝ ÑÕÕÅ·¿ýíƒïwwwyóÍ7yùå—?'ÿél‡œ¥Øž¤³ôq6¡Ü]ëF¿‹"CºÌK @ÐñÉßÝÍž‰ãéûõ„“»ˆ]ˆ/kçÉ>v_ÞÙÕ®äzd¤@ÆÒõOÜ ?L-.ZéäWOn¶ïN*ŠßFßÛÈH#„íâvÏÛö]»µÉkˆoj×13B9H#+V£bÃ':Ìò£úq{5ü¸=O<… ´™*ûÄ ¤#ʈÛ~#OÁ÷Œè}\€zr& À]¾øWž%öÂõ÷ßÞ ÞÛA1½ÇÆsÆÆÓ¹”€ù. ÏÅ¥´µ´0rü8ï¼ó΋»hû»«ß‰ãÕZ&.‚é÷ãÒîzî$„žE\„ËäbwžI'>ä…¸dç©G!¢>‹ŒæUdD; Ð]ä—8ûG„ò,ÎOj#ÔµKß'x¸†Ë¿ ªém8‰RàÛ¦Õm-º·Í¬ õ©§h)¬³11OÊRâ³–’_# SS'ÏPmŒ‡ÛW¤æ‰ÊkT*Áó_VhîîU¤Í5}ߘhLk’Å4aïWäÉêkŸ¨kQÊÝ‘¨ÂzÅ|þ‹«ôp]iû¯4ÃlFª„•®X@| S èïSƒ9™¾ÿ¸8Hý°ô@@®i] ñtî ì$¦á…_NÖw­æ)¿6§˜@„â2ð0ê¦^ù,›ßùMhâ—íþòJ—ŸÍ¯=”Õ¶:¯ì¸SnY…/þ¦ÚzjMÀ¯¨ÛU_”{v^ö¥€ÀÇ@³>/íÀtAã%“Q83† /LYæÙwáùóðÌ @ÓvN`¥‚þ\½&Ö%O-Àå«zoÜKëÀ´:©b쮇ӵ×@—¸]Çš¥­´†$†ê‰À±#òXÖŒžeöÒ%š0.UÁ8~%µß ô./X»çÑû¾Ž@N”âÎ#žÒ){oê­=í5/ò( so£…Ç7íÏÚ1—ìí¨ßÙ=8çhÃúÁ3û „À°kMXŸ¹Þ“/ ÷°Y»æ ë';¯(NÈšëAcÝÛ¶dCé¦&6>¤ž°¸s@TíªAƒ&çWý·Ã¨ùáèÆ'q¾»ÍÍÍñÛ¿ýÛ¬­­ÑÞÞ΋/¾ÈÛo¿ÍÑ£JÓý½ßû= …ÿìŸý³QÊo}ë[ÿÍ%8ô,}äö¸g ~ôËSÿ8›ë'íaZ%BÕí²BöQ®!£°·w–|+"#èÙt·xÔ4 >Ðû âZ.Þ\I»ßö{…PŸlƒ©³ŠÂ)y‚:2 6ŠËSö\ßFpuh‚™°ÏsÔŒ°W%D¡Ïbñ,—ø Óxy UYÛ×C}qdüz‘>œ‡eH$Äöö(•JÄ€Ïü"\~]¡£xƒÊbtÅ ½W ãæu]g KàieTć¹ð”•9…‹²ëò(ÅbðWz΋–²² ¡ÆLšÍò`F„ÝÎÿÝÝ‘,Áû—BhËÇÄ6pz@Lq +g_†cò’4™Bt¬F@-•Ç«Th(nÃRQmúüyµGk·2Üâ òð$’’Y¨E<­\^ó ×f¬ORÀNg'ûËËaLÏÄH«Ý¦ÃÀÕÓtlTæSÀóÏÂܤÒà×gjÍ{W‘7ÅIÆý¶¿¿ë„,¹”Ýg3ª±·ï¦81ƒ§Ô6S·àþT'›vŽsmj·Ì dsú.cã´+¨Œ<}®õä b¿;Mœ³ˆÞ­:¤߀jîµõÀ›ãÐsô(ÅÈÊõ5òUBÂD#Z\8¯„'gíü“„ŒÒj{0nÇì ÐãšF­vO‹„Daø|Ñä…¶ÝNµ¡ÅŒ‹QzH÷•½g]V{î=D—J¥hlldaqñÀæ=n‹Ý³äÇFxtúøöÿ‡ŸôÓô,ýŸ¼gé{|<ÏÒÏÂv–>b{X‚L»m½a«=:Ç/?„šswüÅ÷ÔXO‹÷å°ÖÔıáa.¿ÿþçɯS"x|U嫸äM¨«ÚÏãùÕHñ¬³}ÜͳsºÁôTÝ}ÀÖÑ„²@0Pô•à2À®£ÒYužkö|uhB^$ö=Mà_4Ô~{ì¹\Z`Mýví"]žÆ|ž½# åöc°•¥¸¼z \ß OÊîŽ4‹öÐb©u6ñ•írhr™±ç>7"²W ©«‡h²¯r¸?# É<%póûâÅb–S1×i;ç çàü+pë]¿býÖ ÃgÌ\!¼../ÉJÞÔ’ ä¥Ûåa¹>Š;GQ9‘T³î¡s@a°õE“*X‡iìÙýúui*-–ô웄ÿÓ/>ÃÖÍ÷™Í‡~wY‡{4;™&HaxÆe;!,Õ„&ë¡x`ä÷*Ü·>üê³ð­ËpÊB¦ž%±þwOO308ªvZÏk\õ èyWæÔG¹ Ü-ÁÙ”BsI †å,¤"°\Xé°ûX°{è²~$p§R„ì»T¦³Zt¬" î@bxõó0öžBŸ­m0±=§N±wŒú¿»–xßÞ„µùY|²vNOޏ‹¼2ìû¯8NïìÂ9´PqŽ™ÂÛì3Ï<ówÛ!ÕϲhýÜŠlG q¡®øóÛ=G ¢¯î‰‚G³‚Ýæ%öÈÇ©ëX9a~ØVBÝ&“IÒÉ$K++H¶|ضÚV(ò$'ÊŸ´UŸ£­­µC°ôb; Ã}‚›¿pîÂu¡¯zªå"Uß·«ÔœäZAF³ M6É|ž™ééEðj`UAÀÀ Úõ¢£»iýåß"ˆ× d?!Ë-CÐÂI ‰¬€x Pq=''jN!cœ"d¸ü­*{ aÂ=»Ï1dü±û¹Ž¸ï"ŽÃKöÝ42ПC«è!s)g÷2AðÄ-Û>®TíÙÌÂH+ ²n|¤»ÏéÛò05µAÚª»úwc–fä {¸nägë£rYâ”Ó3ÊFk50vqPÇ¥š•å•Y'j;'RºU ïÖ´®õÎô˜âw®ÒëÝ3Ò ìå·™ÍCGD!/O((YÜB`wÝúcÇú¤M´¾Èp5õVàê†úq8S» Ú1k §ãYõg=ÏWÍŒEàæxà% L5Ãì´ö™²ûZÍéÚ `= =-µ{p äâ‹v!a9eû,aaÅlP…ööŽ=Ïù¼ qv÷ªäÚ€¾8[Yx}Aû:̉Î=öŒs] Ôe›°gt/ä6 Ÿ}¹êÙ[m¿7í³ÖîköýZÈ\Caõ[„Z{¦ýI´ª=Y¶ý®Úß[Öÿî=ª³ý«3ãªåSðx²‹g;'ÍKÛ¬Tõ­ ·£ÌëëiîÄé)rqTÂ)àX2´uÁÚêh’o±ñuÌÆ@+3WD“ì]3G‘wh¦l¤ÐÕ¥þ¹ocÒǦ÷ Ûìÿzà«_’7ë½ÿ¢ßÉ”<™­0wc™› ê÷¿¶þ¿EP´v/SÆÚÏKägh-.zÑ{:ŒT»]¾Ày/ wu yþ\äZ D캞~ÿ!¼ Üäö­HåŒÈׂä{Ö4¹Ü‰/ «³Ûö ¢šn#}²ràãáN÷*l>|ÈÂÂÂ#ŸUg°U'¸¸Gî“ÚÁÅ?ìí,ý6—à¯&ÖW}ï¡hÕ~îò¦ê÷J¹¹Á¾+—ËÌîî>â–Îô]<¬çᢪó¸[Bí.çÔÚ>ÏÚµœcà"‘î ¿A¨$>jç»gçDÀd€À¹M'õÞÖìçìýíµ¾õ­K0>kRgø¤0°Õ?h )‘  ¨½Å@ÝÊŠµáêujÒº~N\±íçýê-Ù½üÉŸ…O|¶åì¹’f×H¹›cÇlÂ<»•†vD@Ö¤©çB::#„'Eg^Ã&ùî~ì1Ë×ÕÅ Ùs§×1IàÇ,òþ)øAaýú}aÎxY¤è ÌsÈŸ×LoG©jäû=÷ÃîÛàÿúq»¶Û°w¤â×÷2Áeó¯·ØÔi’ s…wãšç |Íô®NnßÎÓ˜µö.¿ž!¿–~ì}ôçûo©OÏñM?‡ÜuüZ&0<%‡F IDATkX{/޾ؘ!îW«÷·"ö0f0Kn3Æ=Lb–cE²¥ é|´ØŠï£\ø’UËmºL°rkÄL,á²KnE–*ª¨ô´·³mÛ¶UÎW `z©oYü~)+ïÀßz e³ôåfœ%•µ¸K!§hT€¥`Qê&„æC}H«%”] ¹•–F¯\Y5E«^  @äê€Ú@PЕ¾ÒÁ…%“ ,å Ö)L•hT¼iÝÜŽ –9ß>DÐ|Êøñû°Az§ÊÜÛ ©6Îø5I¦ ›ÀÚ½. ažJ\`p‹œÛîçöÏÞ–rµJfafg©úöŽ:ׯ·hz¶î3Òv¥Å,;ç^µ4'ÃçÍUS®ÚÄWi±h¶Cß±(´LÎŽÏCDø*WÍ uõ¬éøÜ¶´[Õ6YMmŽVVlrmí6ëÒÅ6ɦҦ»´tV,9m±bò²»órŽ{7—ª¶b“õÂ|H2>k9çæ—ah³ñyNÌ»Ø#ÁRÐÝkÀë´Gݼϯ67S»qcõ™“õi»®‚¿æ÷ô6ßoÒŸM¹qn¯ÂI7_È’•Ä@q'fùÈÔÎHÀd3T÷2×£ßzü#„Ô( B~²!$^Dæ Ë+×5hÑjOÿ­Y §'ͼDÈ…8JˆR»û#ÏÏÌ[Þ¸åe{’IÓ¸ºäyö&s9ZççMœ`–•nΟõ;0@§€QÌx?ŧ¨çG‚IHÀuÂÛûrÃ>°wmšà”â~šàbKzIÝ[ãU¶a¿ØŠÔDЂÒX•ŒþÇR+ªOî¾`Å–¢A*ãb´=æ,5~NÀþ­š×ªçÝä,ÝÏ­ç,=Å:gIeݲô#”7‹œXëe•yz˜r4øÇ$¹ðä+Ÿ „ãf³YzÛÛWK0 fœY—dÉJc«Ëel —$Ê 6 +*N@©í'’gÖÛ=‹’ 6îŒÚs㪱Ar+6g “Õ°ðæ A\ò6èßIpÑ ø6¹&oÂÑ_!PsØ8åÿ»™ä» ‘@åžÊÕ*+~¯?¸nÖ¡ÁíhRi›Üf§-Jëâ $—N™•aqÎ,<-]6‰^= [öÚd8?k€(•‚S>#}Õ87£WÌ T®B6a÷æÅÄ<ÿšIܸfäïãÇÍj$+ÄÀ6øøç,äÿŽ8×*gm<óJµÏ&ŒgU(Õ3ð½3VÏÊŠ»{î~Ä&Ï«ËÖ§Ïž„—æ÷î*˜;ê¬ÞJÂúuè-ÀG>øAv'lÿn¿?" ‹'WŒBÌå.¾ ;ZŒ—5CÈ?vÜÙäÏË5¯{ÁeÓéÏÓXðçò®!ØÕbÏ\,Ùæÿ/cð–Þ еbÑE?~¸fªî£Æ%©ÁáI$n3+©¬»Pšž4ëâÆ­vk+pxþqþpÞ&ø$0ðàƒ«ÑŸ-^×) ð-ÀË¢ç\Ñ…±w¨ ³<=†*Yjú*æW.ÉCØ‚£™0fœo¸wJº+p*š€¬=Šºk!¤QŠ'˜yì¹PR$Z¶a?-ån“Åi…zN„±v»ï½==ìÛ»·NSI|+¨“§x}ùaÓ{ÁâP{þÖK(ë–¥7(ofYŠKle’श7FbÔ¢ÿIê_`™õêuIj©åBSS«+‰.€¹H v‹ ü÷>ÿ}"ÃØ (~ŠÚ®¬ÝÊ¥,æç|ß~lpSè¶4SD„$Ô Ô»‘'ÁɽNq0îÅÖ 6˜õÏ; äïvŒÀ:âç:åçw¤è}’ÆVÚlâÔ`œO§ae…ÚÊÊj¥°I¯Ó#àf°t] `ˆ¼=éšG­=Æ;Êæx=yZ:Cþ™£æj“Ê÷åYkÃû!™0à”ÉÃùS& ¹0gV lÞ,[ׇ­¾‰Q³bU[ ˜-/™¥èØ!µn…mwÂ3Ù=*`o/;ÑxÒïó ‚¥²†-¢¾,t²Îé^mIXø¾4Á&¼ó‹~Ÿ¤ƒ3K ƒ½8¾²Ð§£ºW€Mq—Ü¢Uò{ÜO[o"D¶ø94 ¡ f}i'XŽäÒó[ðý{]Ô«OßW3“!Ê-ççimµ>Ïàò°?ÀmûŒ»ÖÖc¤þdÒîá…]ymºíy(Và{'1ü,f’kºâmøËÆŠkâ”ýز÷ñkð¼HH#«Ñ]HÒ¢ìß`nmåYìÇÞE9i¯_ M`ñ–”XX–i¹ÅB·1¡;¦Ä$¿Äùx¿¸$£ßTâHⵊίÔSÚ¶Öx¬Ï7‹v~£r³IôÝ´,ÝË­·,=úeIeݲt‹JŒÄ”<=Øê` Þ’"ªä>ˆýÃñŠ*~¹—¢Ï-• ;vï^lâUÒ2+ •7¼>å*6Ɉäè¹à6ŠÕ.q–d5Ú÷2!ÿ›ÚãXÌbЋÏâylbþž×ƒ·÷ÛØ$·³FÁÌê_TÆ8Á’,5lEÝK˜¬;0 ½YÔ’@׎4÷ö2MV’3Xž®?êpbÆ.›5èüqNMmæB9úœ_CÉxAù’£™Ií_ IwÓYØÜ }ݸ.rŽRúiËN&j)½&¹÷Àþ>¬Z]ýPÈYž¹WŸ³>Xñë<9n×ùSƒõ%çý4î}r³$(ë(¬Ëm’NÕì·I ÔíÛÜ)d³×/åù"6©ïòsž_  _EmÈ` òú<ôdÌ:fÝ‘°`'õ¡æe‚»wI‚S³zH¾«·Ó=AÐÞêðû/ݱç&ƒ~ /U׫º0 '‡C"]0@|v.œƒËšg&-ßàĤE?þó86 _9iÏçËþlÀF8pð 5¿–±wiʯg{q–íyÀ÷÷¶?éÇßéçz 8H°²ü#´€iGA£V¼mü‰©)S SàXA"ƹº îMY…â‰'&cÇ@©»aÛZq?WéîfïÞ½uuËŪq¶1ð&.?Ì„¸nmø×QÖ-KoPÞŽeI¥qUòf¼¦µJãj(&7Ƽ$+3 $R꙳—¤Õ|r õiTˆ~ëóc—°ÁW„i „JÁ"KÖõ+½ØÂÖD{'ƒMˆç jãÍîÉ ‚nM‰_&¨Ÿ?MSØ]ÅVÅË—^ÚÛ#Px7ÚOH¯1ëçÏøêûàþ*lÞc¤…9sÑÍL˜ ¬½Ï¢ÓæfÍ53i.ºóÇ­šÛËtô÷o¿¨dÎ3Bùò’ñ“®LZû¶v?fnÆöK¥á¼«T‹Û&¾ˆHÎIa¹ìi…—Ǭ_Nc“Ðul’œÀÀñ(Aãj{7œ¾b÷à%ðYöß2Ÿóh¶D‚¥Zm•týS{à±—¬M-Þ6æý983t—º "•`Àïļ¹Ýb¡H¹…¤S$Ð.Õp‘}'ü>*ĽÉïy“ß¿š÷ÍF‚ÀjèpÎV ­ßïuzJ8fý™(b©NÿÜš±ÜmJ}Ò\2Pœ/Øó13i¿Ÿ ð¨”ð9æ[>R,rff†i‚hë}ÞL¥º [p< ü=AM|ÉûªÝïçf}ÊbÖ§W|ŸýþyÚïQ F_ÄQLÔÉ›¼ßcžÆ"Eøj_EdÖüsÌQêǬ_±e=Dâq/æb |K¨OÓÙ,ùl–‰©©›ŸF^éZÞ¨ŽwÓ²t·Þ²ô=Ö-K*ë–¥[\_œÌûÄ¡¬k•8Z.ŽˆÀËÍÍÜýÁ®š²¥c¢ÁR“h%?^‡ˆô_fƒU×ëñÏñ`¯Ä˜` §‹`E+`ƒ/Ødµ`¡ÚŠ0‡ï#ð¤ˆÚØEàŽLa‚Ø‹›Ç&Œ»±ˆq3¦0 ÁU ý£Ÿ³ÉÛØîç˜À&‚e ¼g·õ÷“óó t(õ‚¸QóÞ† p}Üx+²J’†vÚç…9s×M¸®Âäuû¾á6³-ÌÁm{`ûsÕÊ€ò8î:MýÛ¬-¸öQÜõ°Y³Ú{aßf·,”l‚’û°7ȰW ò Sã6AéYÈE}°Rgýž¹bý)~™öoóga|†Ç윗Þ~”Yoo8ôlIYÉâ1ã÷-™4 ƒ~‚¥jÀÉù@ Ÿöã'„çSسxœz =ÛÍø–n™"9!„+[oÎIÊËÖŸ ŠòE‚¤Ô®/@{5a3õS!a„ü|Æ®Âscðô¢¹ÌŽb 飘óçJÏäå»ïæ%‚:õv¬=»üo A|õ5oß?`–ØM·—"Æ–ý\{ éRÄ]|Åω߃6‚B>„HÆ%BØþ„ße¿×K„ñ­í[ò~KQ¿xRÄí%Âsõc¡Æ YÓõ_c¡,\µèXo+@S¹Lgw÷ê[àõü}îäG+뼞]e]”ò,e!2Žlƒ›£Ô‚Øc¼âŠ]rã7nðÜ3ÏÄÀÇYBdÊ‚µ`Œ‹)ƒYtÃç°Aô(c4 ÔrGH0PcްÂ&ÚOdké¸àÇõrk-&¸õ®³"æV;„ è°‰]‰*6¹V¼_äJÛí×x;6!݆ ´—û½î1lò[ö:]0|쬬Àî•"mšf±ÁY¢~«™Ó—LL°kƒqˆ·›Ël~Å@Óü¬i-•«šÚûŒ›”LÂñWŒKT¬˜«­àéÝ+'àUO°»¹ÓÒÊŠ©éq# Ÿ=fª7/NÛ¾·û=ÈÕ‚£ä+æ0AÇ,&%©çàÁ*QÃ&E!–1¾P“÷]st¼&Ì0úì³–OÏŸ‘ øðçæ AÁz|6XGºœÇsvØž“XMb Y®Àß~g .-‡(:EYJ R.Õ% ˆì X)»ý÷EàÜ|HrÚU¾u^©Ý§£óì+Yn¼£‡« M³5ã™ÍÍš5éÙekÇUBbc¹£ ¢¯a"¬y yâ×¼ßai”`ÍzÔ÷SÎÆæ¶~³”IðóN¿oßôýžñã–\ÁYÂD¯` Y’[0pªdºÚW~Vš4ÄV¸˜œ-M%‹ÑorÕ°ûÝB×âóÄã þ½Lˆ¼›ŸŸgjrrµ=³Qû´MV¥x!ùvË{$Ýêpÿué€ú²nYzŠ^$ñˆ´ú‰yG`_åõ¹Vr©h¿xŸ¦j•{î¾ *‰½ürM`ä õy±I'æbIbŠLð9‚ê0ØÀ©|Q3ØÀ´‚M~|q6}Á¨…×°U0ØÄ¼Ý·?ïõ­¦•ÆD¹°¾‡q(dE8‡M%lBù±èÜüØ 7ŒÒ ÈB0 T††˜ko_ÐÅ‘Ð~²x)ijÁë9#n§Ò–VcqÁ8/-U‡«Ì qú‚¦™IèßÍè)Øq/?câ‘×.†ˆ–kæVQ¤–øBrWÎx=š”ò„ô1"'¯øöEïó3’q V/c `ïvL«ÿ¦²-[(”Þ;¼OÒÍœ!ð£ü¯Òb}6žÅë~Ýû›¹Üò„¼fRÿ–Ì…@§x\ËØ³Z[±vµ{ÿæ1 4 ÌÎÚsùI;ïSÞwØû’·e2ü[ìy< L¶µqŸŸs3º¼ßºíŸ$XwOa j’àf\À¸KÌš !éôŒ÷å„tH¢êRËÙ)ìÝœ&¤Ê™'ŒerÙɧ|Œ²òÄî:¹årÔÓ %q™fü~Å*æxê•©è{"‘ ™LÖiØA½ød¼ýý”`=î.ë–¥w©¬õr`€¢‘Ð õà)MI`zzšcÇŽÕmWDŠ&ö8•éßL`+c‰Pv`+ë±hßVÂjòLÔE¼\Â@ÍoßpÓJÐÛtœ`ŒÚr„Å):ìm™Ã& é¦l$ð˜ÄQYök;„EºmÇVérã]ÆÀàÿMž—°‰ã6¨¯ÓÃÃL,,ÐŒEá'X¤M¥{±L Ë•±€Ý¿"pþ›z<Š®X1âvÏ#dƒñš6l†³'mâÕ„sñœñu–`¾Ó³F*Øj–¬ËgŒó”JÀI]‘SZYç9E~#D8.Ü­K~­àÑÀ‡Ý‡Zm5Bû°ç{â»R@{ŽÎÛ=\¦ÆÆV]V§½>%h¾ä÷M9¥wµ}Åîuxâk[Õ“þQH½@p­J¤±ä÷¹@HÝë×&%ýó—Ú¬·A„~)Á+GbÎûVmÝ\ã“P˜µö¶y_Jé2$@G‰¾‚E¤Éòu`iîÕ1ËËœÆ8yØsÜÛQÂÀÒ'y}îÅókÁÞ­cÞ>–E¯ ‚ÕMïýßyý çMψT·SÑñ’@Wi‘°8,Gý(î“‚?bKR˜Àë ÞqÑoüÿZQr«ºL™ …B¡Îâ¥ßSÑ~V¦·ZÖĿ޲–Þ…ÒøBêe?ëÿ£=“^p êµ|žö¾> ãã\$ˆ«Íø¾UlU™E°Á*ÝP·\eí„Ð`¹f”45GXQ+¤_aÌÇüâ™Ì`šÎ/ëÙ6™VîF¹Ää’ëï?WÞ?ï$(D·c“Ñal’¹àíÛèûc ëvŒ×4H˜& ˜…R‰-‰GffV94óÔ§«)y)>CàoÈR6C˜`fj°9ašD›o77\ï&ûÞ´diT.‚ž~¾l.hšœ…áùâŸ/Àä¸Y–fjÐ^ ùÌtßR~füþNGí¼†YÚ|Ÿó„É{ÀZ"N×á®=æ2™¶ë`HM»âò¼ÝSüú—‰ÕtQ?'g3¸D@Na࢓0™Í8XwxßðçE`O*Ý ¨?Ž…³¾MA ±˜ë¿Æ8ÝÍṌݯ1fį'…I Èâ"kê”s l²º=OpÙVüs³?ûðB*‘ `zb‚C„`µç ¶`éÀ9— B‘MXJ“&BNÊyïë,fi÷ý'¼Þ_]þ–øAµ¨¯õèY-BжÑ‚BÈá}Ÿ*£û—d´Ÿh Ú®6Å¥‘ï4==ÍÒ²ÙÒl–þ«~XÜ{µÜjkÐû©onEYwýCå´µ~KÄÙÖº)¬&€åÅE&'&VÁÈlÃ~ d2—:ø$6•Ü NŠ8™R¼EìÖSbuÓØà»BH‹2ëu•°A]“g sË(¯ØIl"øá,6±.ÈÕEl2Ù{Š ªœÇ&Ÿ-^Ç(6!=ŒM†­¨ÒDuÎû@òc'q©^ L7Ö´”žñ¶*7žB“kÞÞc5‹>{òŸ $=÷ms9-/›U¨¹ÝøL¹¢¹èÆg ¸€­ÈdÌš4‹Y©ÀHÚÕŠÍ3~Š9kË8féñk¹@ø½àׯ$¶¾u=IBdÀ3/Á÷^°ÏJ+¾  €„ {*zíáù‘%èß¶k,s~Æ ÏêfÁRô¥/Ë„mK˜µP¼¶"A£ìç½æ}¢ }Áû)Kø`'ì­ÂÏ>jàRTiB EÁí(ÎÖ3سæg¿ÀÞ—Vï‹1ŒO7ãÿÕOzî^õ¾Ìw ÕÝ“Qï‚ôÿR´`ém€¶žû ‚º½€’Ä.!€•¼/Åî,iµ¬«Zl(JT%Ap±¥Êí±~’Æ;}×¢O€v%ú‹÷“uJEV"•nêÁU hnnfãÐÐZŒÖ]Mëå‡)ë–¥w°h`x+¿­P/òoxY ÇM$VM✴:´ô»\F5lPœ"¨ ǃ“ÈÀž»D}Jˆ&ªï"f¡‘С&5EÃHòo{ÖÏ÷"6˜—ü<×]Ø/wbã =G°œ]ÁH±§½-70Òë6‘hMa“H›ÔÁ¬Oƒ~lûÌ óóœú¦‚¹:Îb¹ QCg  š@kÔkÉÃÜéa»†‹OÃ@ÂHÀ —˜™00”ÅD0Wj0:È¿ŠÊKøùÇ&Ãj{KY2ã}Ù’ƒcóÖ†Í03\¶Ùû©›dŽøµ*B«Íû¤H(U„cÎÛ2LpËÈbR.ž9C—÷CXyoŸøRr[*ñrÅïž—òg¡y>Lª³XX»÷ïE  è™Ÿôóè™.`@¼Ç¿ÅÜ`9?ÿÆV86f`¢0iàô…ÖŶ¤gƒ(å0ûvÓøjÇž;©Ùg{{Ï’Hï'h]ö¶ëº {6“‡QöcµhJDsY¥œ?FH#3êmì÷~Ÿ/:ÚžóceeÓ‚@ý™ÆxO?b"¨wki¡õãÍ%+‹SãXÕHöÖ8¤±PàK%CÖñök×®1::ú† Hï+Ü||þ—XÄ»•õ­—PÖ-Kïpy«« Òõz+“J¥hjjª#Sʬ¬ÕP°Ò,"P2„ÔŠôÑ &“ü„oWZ‹ÁRÃ&&PRž°)Bø6OK`±ò^U±É±ŠMŠ`ä¸×¡œb3€{üÕî"–Ýþ»XHõœ“òºŸ'(|Ÿ&ÛÛùǦ&*~¹ ž%Lhg°‰°@„ï%Dw‰¬,«Ê8fÉð>RäÐ0ðý|kÖ&æñqGXÆùæŽàúÜÔUØØRÅÌ"ªjÞß²z]ÆR””í)#‹Ÿ÷{ÑOˆ.ð’›´ì¿ÓÞ9‚eMÛkØÄ,þ–ÄwìÛGè©@G/zД¿ÛR!"q k=Þ¿²jý·^ïËjtš÷ûvY¤+5Ž=ç-„9±fL=üÇü8¹}/Ù9³ÀÔ,Ì-OLçÊäƒï ðŸ$¤Ê9FˆX;æý*ðü5ß³ï;ìÛ®ùuz7_ök|øÀ«QfUàc~Ÿ– i†>н#S·iK$ 1岓eæ ×—ÅTñïòû)>b)V$,Öb@#½$‘¼Ó„EšˆÜ9´€ŠÈÕ¸&¹Ø"õcË®>7¥›•®®.n¿ýö:í.•F×Ûû (Á:Áû.뢔oP~QÊ7*k½œ1±1&$ª¬å«O§Ó´—J ¯nÛˆ­¤5ØiÕ×I†Œ š:o,B'²«V‡‰è°AJ KmZ$h‚­¶G±‰X®·"6 ?GˆÞ¿‚4Á~lBÒÀ­Õ®ÅŸÇÀÏ1Bê’^ÇE‚ûâ^l²ÒD§½ÂÀEKH¼}y™g––hÇ&¾¿óv¬ˆ»Q_^Æø47üÚD*Ö¯pñª_g›_§¸.) ((¤\œ.w½-Ô,ùíÀ6“˜·¶OB¤µª#$dî"$­íÄ,8-Ø$)0[ð6Lzl$¸pOxý}Þÿr1.€¤î™xgã˜|C{9E:³Lï&ã_{ÕR²Œ^†óóFz¿\ )F¤Á$Î×ì:f¼=ÞF‰g¶ù½ÜI ¿†ëЯ|†"rÑ –J¹èÄÓ™ðs"¸{€ÿ4󘻬×õÍ) PmÅžÃaÂ3­H2‰PÖüºóÑóÐá÷p„`A^iP– ñóÞO‡•óùYk¶ú½­y_ˆŸÁ-)«hݤyب™GœiAt3"­*¹55>ÑPo¼c]1q¼æý´@ý[`mpô£Lxo÷ØwS”rõãõZ–±šuQJ+ë–¥w±¬õ¢É2¤Ñ”$ÊF´_¥Tbãöíub•' Eü_2œdΖO<8Š»aeY#(e/Ä! pE‚À\·Ÿk1‘P•ÜV™ÊÅ“PÞ¯ïáâ~ت\êÉ×±—Bô 4u^õö`à¡ã7ubƒða?×86ÙÊâÒìÛº•ùîîÕ+ìm:C°Þ ¬dÏc“øR¡š´_öûp›4—ýÜ£^¯ØI‚ûaÔûèä"ŒÖ¬®‰e‹›‚BÁî‰îK!:)æ×$ü»Èþr½Œx;'½ï^#¤´)áZ}ZÃîë¾nJ] èí„G„‡[ÍÅ8ämš:ðó307e\¬»àµ301oé§~þý¿‡û„µU@wx©fýEo«žñÑtEÌ¢"Ù&‘”[10#…ïV‚›N©ÃK+HA ) \?Mßx…@ŸÆÀÑ´ß{ V6ûqÓþ\¼äíÝCp%·b€RÖ³nÌÒ7GT˜ö¾üåƒòï[F¹ëŽúŸd8F }§}E¤Ñó%Ulqç1À•÷gA•%ê-0²øA:1wC–h¹ !è) Pé³è:.}–Êw<6‚¥ÆÄ·g1'ª»»›½ûö­î/2ßïÖ’•wào½„²nYzƒr«-K*7[}‰ïáÅ`JFûÔ€d2ÉÒJxœc¯ÚT£F4¸ê7Õ›#èµ@HˆÙLpÉHýX­RlȲ³Í;‰M#~Í"žËU¸ˆMhG «Zq[ò,Íž_GúGÒÔ~lBÝ‚­¦b§›üÊØäчcb® É)ì$DÉB&wÏ$6¡¤°‰SQsYß÷E 0mòm= . ,vrèÅ‹£þ›@K'6É °ÉÓj¦@”4 IDAT(21L¬y_(MÆ86I‹‹¦‰PÿN )eV ¿ÑÒÉ©¶Â1hï6!ÌÉY¨ÌEU.™´ÁEØ2'ÎxÞ7¿?²ÞÜÓ £ÃðÑŸµT/Ó7, pô2üàŠí·âíUôÚ„·Y.š ¿.YcjØ3׃Ùï#Õ±DT‰[šB’PPx»,lGzQ HHtœÔç}tη÷b–Îí×ôiß~/f¡ÔµÈåµÓ¿_!ä?‚é1U€åL†®ÅEŽøùuߒس1IX”Ä®«ØÌPÏ!Ò;-~™ú]ツ0æ£ï±E9Ž€[Ëò­…X7!úÂÂkú¢ýÇ9´x¿ÆóÞ¬ÄmJ§Ó¤3fggoºÿ÷^¶,ÝÁ­·,½ÀºeIeݲô)2…ëeŒzÝ$¹ÁªÕ*¸÷Þº}ÄPâÊBªÕ“Âc¿¿Lär)‰Ç›·¯V¬UÿSôŒ2×ç½ý—0°’&¨äÎc€Féû¼âuɨ¤¢½^ŸÁÜdø93˜[a«·‡ G3‡&M0a“ç]÷˽À=»wsu`€N‚®Ô7¼íO&N›f¿ÖI_éþ‚^ÎfÅ™À, ó˜åª†Ç– …•_%äñÃÁ Ø„~ ¸°XÏ éÁ@‚&£ ?÷F¿¼Ê¯ã$qmÙL¬ÚõœÎ޹+lÔrÐ^™uI‚iK¹²ÝµŸš3v¶Ý‹yÿÿ5ÁŠ4‰ @Þ=ë‡ÚdKþ}ÆÛ·÷CZì«ô±T¤,$)öÌcƒx²ZÅ9&' –eYƒÖ-\V¼- _I‹7Yþý*a¡¡1L‹š~Âxs2c‹¾Çà)Þ¶VI4üìݰaÃMލ?ïÛ-ïu«Â:gé-o –þú¯ÿšG}”ööv‰‡~Ý>óóóüÚ¯ýííí”J%>ùÉOráÂ…º}Î;Ç'>ñ J¥íííüú¯ÿ: õ¯éã?ÎþýûÉçólÚ´‰?ù“?yÓ x饗øð‡?L¡P ¯¯ÿôŸþ±±ìóŸÿ<Ÿþô§âŸþéŸÞ´ÎÿE¤ÈØšõ¤h¹½ÆÇÇyúé§W'M!¢«†­ cW^¼Ó`‰o[ >ºD/KLî…°âVd”8&2£+%JŸï¿LàRŒbƒxsàÛe†Wd›¢šDÒœñzŸòc‹~ìyÌå5 |"elrI`_›\•‡K–† ÀK¯¼BââÅÕÈ»fÌeòA?Ç7° ë(6YJ%ùÏüÜ^ÿà[„ô/㘕aã8b¤qY‰dÍ€ u”Ǭ"¾^ñ~¼áÇ×JÓËÞ.qQ .ËoÇ A…Z„ç.‚;©·ÃãvÍããv®!BÈúË‹ÁE•&Lè—®ÀÇáµ 0ºhm¹öÔSàíwl ³F-,š~”¸>— þè?íײàm®PO>W(¿ˆâ·aà{aÒ¾¹%ºz š7ü»¢Úšý7©Üßð{Ù„={5¯É¿_ÂÒÞ¶üþ?î}-í±—ýü÷úw‘ÒÏcÏà ð×%«±ØK/½´ nõn–1N”Âä%>š÷þP˜fa^V¹XðQ÷B@GÆ·ë=1½F ˆK’ᦒ>7Z‰Îb‹—ök´Å‹º˜?õõjL’n˜Ÿ™add„7*ïW°î†{gË›‚¥ééiî¿ÿ~þðÿð¦ûüÆoü_ûÚ×øÊW¾Â“O>ÉÔÔ?ñ?Á²‹ƒ-//óã?þãLOOóä“Oò•¯|…¯~õ«|îsŸ[­ãôéÓ|üãçÀ:tˆßýÝßå×ý×ùêW¿zÓóNLLðÑ~”ÞÞ^~ðƒðßÿûç _øôGôvúà=S´2”%Eæw•ÕÁ¡Zå¾ûîlò‰WfIl€KQ?(Ä7Z.8E¬4:¥·D´O&úMÀNÚ5J©!ÂiÒÛ%¾ƒ@Dc۪ؠ;H°zh¥+•à,Á:Ó‰Y F.• €Éòð,6ÉŒaða L|ÓëÙ†‡ÜoÝÊîn®cÀJI@¯ùç¼=„œt%àßx›.b ë$!œ]‰X½f|Ÿ-ÞN)lKU|Äÿ.@”BÁDZ ü ðÿb`ñ lB¾æûŽ` I:FmpÙém÷ºÛ}Ÿ pv6ä”f‘4­*ÞÏmþY×  -e÷±”wï®s{×¥¢çÊQš<› ²Jq¢D°iB¢æ^¿ßÊ['0ú¤_ÇE Æ,s/ù½—|ĸßÃSÞgWý³\cW¼ßä¢õþ-€Ô B”`ÅÏý”÷óðcÏÉ ×ÓFàµ=æmNùuc¸¨ ¬ö—Ê2ABÖ©Ì/a€QDxY<†¹QÚ€K/rmi‰S¨úðÿ`‚ÝåèSþ}øK¯¯€M êó˜Ÿ,A=„”0—üOzVǰ¼¢åÒØÄ®ÉöQÌj¦ô'0±É"ö|ÌcÀ@Ò'0ÐÖN ç–¯1Âs±LÐPós Ë q èOÀR-¨¸×üØv,QîО‚Å‹f'JÀTÍ®c†þ?S¤b‰K¶xÿµžÉ&ïE¾`ÏÈ~Á[—Šf{Â\â7)7\³ßŸVÌZ•",^ñû8á’kÆUÏcÀk?ðuB¢rÇå½ï7cÏN,úÁý§¨»«„¤ÓrÇMcSS«ü³X<‰=ÛxûG ü ñÅSTT B¶¢Íf %'†zõm¼.%Á]"¸µè‰-BBRc啌EZu}1 jä=É-ˆïÓ‹ʘBШ%¥$£6&“IR©Ôë"ßz¼NûvË¿kÔ­výK¸æw³üÈœ¥çž{ŽÅÅEyä‘Õm½½½ìÞ½›§Ÿ~€ï~÷»ìÞ½{(<úè£ÌÏÏóÜsÏ­îס}ž}öYKY=æÃþ0¹\®î˜K—.ÝÜýŸ*¦iXÛ7¼ÖºÒ°=Q(°iÓ¦×í³ÄÍK ¬4˜ÅÜ ªŠv™ $W&C!$®LQŸÁ~žÀIѵn$ æJPÛî×#q= ºS> PŽ\0šÄŸ#ð…$j)Wà]^÷7)PaIUa”ïaàj¸¥…ñR‰1 ˜|S`žó}Ïa–ƒ}Þ®,f­[¢•mÞÊË@÷ëmÇÀV!²K“·Bâ%-pÞÏÛ‰MÎ"ÌŸÅ€’Ò]|Û÷UŸ>ëmÔÄu›¼‡± ⻥% \ðÿø¾"+Ñr˜¬\UÊEWIAgÆ@S{s‘^‚ÀfÕŸñǪ„ÉZ‘}³„(Ƭ·ó,A)|Üï±®#‡ÈË~¿/ܰŠr{ÍûTInyŸ\€Õ´@ǽ_Åxi_'ûEª&ûS˜ íß6Ë…8àÇ÷}F J÷rGOz½Z@H=}Ò¯_\©L™_.(5LÞ7E7ÆEQ•²ÖÉJœó¶A°ÀÈ=/U¹Ê5¾¬DŸ'Qwø¹õþo‹¶Éµ,í­6ê-Añdô§sküјq9úMíÒ9TTã677Çññ׫1ùüÍÀÒ›qwÞ›KðõòN—YÁûÊ•+d³YZZZê¶wuuqåÊ•Õ}ºººê~oii!›Í¾á>]]],--122BOOåÊ•+ ½îý¶qãF>ÿùϯþö^P7+G¨A¸víEƒP¼"ÓçØ¬ õ¹žÄ7I<ã½í‡C} ‰6l²%ˆÐ)Œ[æ !Zk%:&Cû¿AàØ¬`“îuBôœÈ¢R®a.£kØy›ÌäöYƀĘ_˃~ìß÷-,PZZâ DµDûAÕ‹¹ïîðkèÄ&¶ï÷c‘h»±‰ófe8æ¿bÍvBú˜¯c“h‚àÙ€M`~ÌŽš16€M$-Þ‡3¨j÷ö7y=~nE†x}g0«˜´€vaÀkS 1W8øÁM¤gGºBÅeh^¶{1’Èqrµ)…‰Ÿ\qJ±qÃë!$£UØûïÛI¿Ž­~ïî ˆ J{Äï[ÊÏ{`-Ëûu ø5>ë}ŸôþÚ‰ñÓ¤§…·MV ‰€€?ÇžC‘Ø_ È è>*‡žTŸó:&¼-Nûo;m@{g''O¢ðJÿI ½Ï±.R{¾Vî°y LŠø"¸é ¼Ûª¯Ç¿ÇVéÁ¤ E ”j<ÒþrË_¥~ü‚µÁE‰ð\5Žq1¸›lø½¸4ž«\©ÐÝÝÍõë×oÚ†µ¤oÕŠÒèF|/Y_bïíªo½„RÌ¿üå/S.—Wÿžx≺âZ­Vç[Ë%öfûˆ¨ýFî´昛•™™.\¸°úwñâÅ7?èµ9þŸ’Ñ÷Z"A*•ZõË'“IS_NÙ0˜H¥ÌB”L’H$È%¤“IR‰¹TÊ,B©”‘±ÓiE©µD‚B*EW*ÅJ"A>6¼LÆ¢ª2@k:Ír"Áb*E-•¢9™$›N3žHÏf-ýG6k€(›%“HÐN³”J1“JQM§íº²YKˆêVÁB.ÇD‚r6ËJ*E&&“É0žJє˙5£P°”…KÀr9ÆR)Îf³,f2L¥RìÎåXI$¨ ‘V,šˆe¡@[*Å·s9:2îN§™M&i©Õ¸Z,²8S,2 \+•ØL2Ïs=“¡˜Íҟϳ!•2+`c¹Ì)`¬\¦=‘ _,2’NÓ•ËQÊçM§*•¨$ U*Ü.T*´%t—Ëô¦Ó¤ j¹íÙ,'K%&“Ikj2½žjÕ2ÖW*Œ§Ó4‹LärÜ™ËQ(•hI¥˜­V™î­Vév57s>•b®\&ãí˜*•¸–NóDµÊX"Áùæf#ˆ·´p$™¤§©‰KÙ,—ŠE&‹E^Íf9V­B2Iªµ•àÅÖV† þ¹¹™#Ù,§ËeN‹ÜÈåx¡ZåäµkL¶µñnkã«ÀÙÖV^Íd˜«Tx¾Xä\¡ÀcÕ*Òižok3¥övÎaJêÙtš›ùn¡@©TâXSKÙ,{ÛÚH$;:8´wt°˜Jñjk+‹ù<»* • mù<#­­œO¥èììdhëìd)‘ ÕÞι\Žáj•åJ…CÅ"imåB:MOWvwópWg'Él–î–Jå2'ËeÊ­­ d³<ØÝm2À¾žÆÒijmmTŠEr• ·77SÍçiíêb.™¤³§ÇÀ]o/S©éÎN®‹t47“in&U,’éìäL:ÍÊÄ  Ô×G:™¤¿§‡á|žÎÖVªÕ*¹r™þŽ2Ù,}ýý¤€þ~zúúHær::(T*ô55Qîè€\Žž¾>– z$ŸÍÒÖÕES¹LSs3‹mm”‹EºúúH¥R Ð:8H*¦··—t©DK[m­­”Ëeº{zH§Ó mØÀ 0¸aÉd’­ä :;;iii¡ÚÔDWO¹\Ž¡¡![(mÜhÇ ‘ËçÙÐÓCµ¹™æ–º»ºÈ ´mØ@"‘Xµ¢oÜ´‰l6K_MMM´µµÑÕÙI©\fppd*EKK ¯½ö›7m"N388H¹\¦³³“ŽŽššš ›Í²eË6oÙB2™dãÆ‹Ezzzhkk£¹¹™þþ~òùüê¾[¶n¥æÿó…ýýý´¶¶ÒÖÖFoo/¥R‰-^ß¶m²Á½;åVG½—€à{¡Ô¥O~ò“>|xõï®»îzÓ º»»YXXàúõëuÛ‡‡‡W­<ÝÝÝ«$•ëׯ³¸¸ø†û “N§ikk»é¹×:x•ê­”Ï~ö³ ¬þíÜi†ìÁÁAvìØÁ¾}ûèîîæÁ$—Ëqð %8xð Åb‘}èCô÷÷³gÏöìÙC? T*ñ±ƒ©ù¾Ùl–|ÎÎNöíÛÇm·ÝÆÐÐ÷ÜsÕj•G}”˜[2‘àᇦµµ•ýû÷³yãF¶lÙÂ{÷ÒÖÖÆ<À|*Ń=Dx衇ÈW*Ü}÷Ýô °iÛ6víÚEgg'÷Þw¹\Ž|àÀÐT(ðc÷ÞKow7›¶o§gÛ6z{{Ùw÷ÝdK%þð‡Y>ü¡QH§Ùyß}´··³w×.†6n¤u`€Ý{÷ÒÜÔÄýP8p€R"ÁC÷ßÏj•={èèïghÃ6ìÜIºµ•÷ÜCg*Åý÷ßÏ"ðèý÷S.•¸ûöÛéêîæŽÙ±u+=mmÜyçìÌåøà=÷pøà=÷ЗËqmï^ÚÚØµy3††ØÙÙInÏrÅ"w~àlÜ}7…tšÛöí£«ZeÛ–-tô÷sµ§‡ {÷2ßÙÉG÷ïgØw×],{3g+†¶mcsW;z{©nÞÌåj•OÜ~;‡R)6ìÛGxhß>^.(Ýv×ÚÛÙ×ßÏô† ¤[Zèݱƒ—²YZî¸Ãäl&Ë۷ÓÝÜ̽Œôõ±ØÚÊέ[9–ϳu÷nSßµ‹§R)zwî„r™=6°¥«‹ÇÛÛÙ64D¶TâßîÜIpûÎ,çvì ©Xä̆ \hkc±³“§úûÙT©ð‰­[™L¥8·};—€‡o»ë¹ׇ†hinfcW©žf›šÈlÜÈÅL†ó[·r(nÝÊX&Ãþ©•Ë亻éìèàÉæf ýý\Û³‡ô–-FÌß¼™öd’•™)ëé¡£¥…‰æfnëîæz¡À¶¡!N'\b ›0_Êåèëî¦ÚÔÄ…–*L‹Œô÷s#•bÓ† ¦?8Èp:M©§‡æR Z[¹ÑÚʱR‰®žö¥Ód¨è{z¸P(ÐÓÚJwµÊ†R‰ ìÉf)öö² x²§‡ý‰K==Tr9¦ÚÚè.—i-—ÙÐÒ¹\ŽBg'…D‚¡®.î®uu‘ÏdØÜÚJS©Ä#MM V«lËåèok#™LÒÔÙIÐÑÑÁötšžÖVòù<¥r™¶r™|>OK ©TŠ{>òV€¡¶6j‰Å–’Ù,…J…l±H%Ÿ§©©‰R*E[K ) µ¥…¹D‚rs3™tšR¹L9Ÿ'“Ï“-Éd2´W«–{¯©É"8+H&©–J¤³Y ù<…Bd:M©T¢–HPªTÌ:\.SN&)‹dÓir¹¹\Žt:M±P ‘LR*Y™J©‰äó¤S)²Ù,¹L†t:M%›%™L’Ï[Ü\1Z$% j™ ©TŠt*E*“!‘L’ÍZ,p&“YýŸH$H¥Ó«Ü¤d*E"‘ ™J‘L$hoog÷îÝ¤Óæ4Iéw_<êÖ^œÆ%‘HÐ(C¨ï+++Ôj5jµÚêgý_ZZZý¿^Þ?å-‹Rž9s†7rèÐ!öîÝ»º}||œŽŽ¾ô¥/ñ3?ó3\¾|™þþ~þþïÿžG}”¯ýëüÄOü.\Xu§ýå_þ%¿ð ¿Àðð0MMMüÎïüó7ÃÑ£GWëþå_þe>Ìw¿ûÝ5ÛôÇüÇüîïþ.W¯^]}±þóþÏü·ÿö߸páÂÛ¶.MMMqãÆÕï“““«€é.7kéZÛÓé4Õj•룣oÙT*²¥Ò˜Ä!º*ËÑ6¹½2˜äU‚Y^ µ-G}”øOŠÜ™&¸ „h;é2AˆúSj¹r×Ô ‚ÛAÂ…}˜û`ž@Do%¸•:0÷Ig´m?®ïT(piy™­ FøÆÜX†øÍ˜ëªÛ·!¤ÐØ€¹Æ6aDóÇü¿Ä;ûýX¹aZ¼‡ýä<¹eÚü¸û1×vú~{0áK¹<ÏþÓ÷y‰òâÇ1·Û ÞÎN,™q“·ëðÓ„ôêË¿óv)5JÒ¯QšAUÌõu¸‡ öÙ‘Ëñäü<÷xÿˆ;•õþŸþ Ë–óz¿‹ 2^ÂÜfEL-ý”ï¯ÈD=7Ê©v„*ÜϷ׊àú½Ë»æuìÅžá6?‡îGÌ­êöþlò>éðû#®Ð.¿ö>?ÇÆa:‚¹å”ºxO*’Hz½ ”л¢(Qmïò>ÄA;v«Ç<$½_iI‘­: 玣ÖbW¾¶­EXi¨w-šö­E¿¯%®{³¢ó¼×ÈÛï¦(¥ò`Þª²Œ¹Á×E)­¼)Á{llŒÃ‡¯‚˜cÇŽqøðáU‹NµZå—~é—øÜç>Ç·¾õ-:ÄÏÿüϳgÏžÕè¸Gy„;wò©O}ŠC‡ñ­o}‹ßú­ßâ?ü‡ÿ°z>ó™ÏpöìY>ûÙÏòÊ+¯ðgögüéŸþ)¿õ[¿µÚ–ÿñ?þ=ôÐê÷Ÿû¹Ÿ#—ËñéOš—_~™¯}íküÁüÁ W.—éïï_ýëëë{óƒÞá²Ö‹\(Øèflx½o¹‘·¤z$Bó4ÈjÕ ë+'0•j"Žn‘î‹âYlâÁ÷m¢^gE@ILºS1×IQ] ÉWX{A¢@!çY LbÀ@ƒr»7»°Iî»^g÷¦Môwws›ô_öã_ñsÄÀ’²ÞãÿóÀ÷± mø_Þ¦`œv,Ôÿ Ж0ðrÓïy›tãÉÿòú”!>ëm $Ì•\ÀóØä~7ŽcD÷ïãÍ^÷AóGÏ…øW³ØÄ¿ÉïÁQïß ~ /azS'€Ûx€ ^ñs_ ðqNyýŸò>ºì}¿Å¿?áíÁ’ÊÎz›÷øù¦ýžúöÑ”—0À(büG1óS^÷€÷K“_KÆ#šôÿ-¾M –Oø}/¤"ƼmwÒÈèËû1z2Øs¯EÂŒ÷÷ï׊÷·4Ê®Hú<¸Ôòk?C=?B°ƒ@“Àž{EÚAXôÄšjâ&ŠŸ–#€ ^ƺIú.0¤w?N•G§5¤HÇM@(Eý$-¹p‰CùV‹ŽíììdÿþýoãÈõ²^ÞZySËÒ¿øE~ññuÛÿãü«äé¹¹9~û·›¿ø‹¿`vv–‡zˆÿù?ÿ'î#¥ü•_ù¾ýíoS(ø¹Ÿû9¾ð…/ÔE²=þøãüæoþ&GŽ¡··—ßùßá3ŸùÌêïŸÿüçùâ¿XGÔ~饗øÕ_ýU¾ÿýïÓÒÒÂg>ó~ï÷~ï–ȼSéNÖ*oÖÚ:²b"A:fqqqÅÑnZ•‰<'°ˆR~,•˜<¯$ã°^É4ê¢@ý€·W³J›5J™y#èÎV”s˜…Cáæ’TÐ9D*•Ÿ®o 2™$yT‘Ì0¢ïÿ/•n…i÷c e‹·å6Nc“ëEÿß‹¤.êóÎÝFÈÉWÁÃ4´®fêÏQï¯kØžÆÂàÏ`ÀKÖ­ÞÎàùG À}ϯo+ÁªwÖëWjY;^ÈÒt—Na!ò'|ßVŒ|¾†E? `àl—÷I —{ýû+Þ¦ Lüý½êýR#èSÝííúÿ&ÁIüüåŸõk:ïçUþ2Áªó_Ë!ÉðÌR6í×¶¯„ˆËïaÄ{ÙãÞb€U)uJؽTþ½g Ï¡dÖNÍ©•/"8¡žÒœH0U«q—׿w à Qòd¨×cƒ`É‘¥VïqLeFn’ŽöÕû-‰µ_& lôûZãÚÍ&œF²vl¹Zë÷µJ2™$N¿NðøÊûŲ´•[oY:κeIe=7Ü”w ,½UX§ýšªUvïÚÅÓO?½jjŒz«T§‰~KóúArà”Â#¹ ¤,×Ñþ$ãßå2‘µJ«fY+ƒ°œߊMn³Ô¯0 Ñ1±›O:N%ß'¹nŠé“$¶\&{víâ¹ÉINŸ;Ç"¦¥¤ürû°Ðò~?N!ÛUlRŸÇ&ÎW¼ïîÃÖN ¨5cà*Y?ž!¸ %?0…¥+Hjók<ëýqÜÛqÒÛ!àû2¡ôb€ä)lÒ—€çe?ÇiBþ½'äO»YO®úu+ë}_óúõ{¤È>ÝÓv¯cøøÇ>ÆËßøõ“Øë×w K÷qsAjRÿIBš PJ– çýõ1ì™(`÷úŒ×û}Ì¥€í~-»üŽQï:Ýãýs߯4f)zl7üú+˜«ïUï—û½cõõ;y3ÀzÈ÷$ú' èrE'Xm+ IDAT.kYXò„ˆ¯ƒû_ÿ‡ )êºhÉè8Y[Ù–õc7aϱƲ$öüéÝNaïú%ê-Åq‘¾R¼ÐŠAm1°RûemRý1 »YùaÜjmmmôôôðòË/¿ùÎ^Þ/`I‹»[U–±÷k,Yù‘¥ÖË^ÞÊŠ)Þob|œ'Ÿ~ºNˆR$èb Ôh-Ò6›e˜ÄϘ7¤4â5ɯ?KpµAMZoÀôØŒ¯„Ÿd#O°.Iä.ïuÈ tÌ·M&¢$6yoÁ@Ãi‚È`›hDZ ü"pùèQFk5Š˜%l¢”Šô$6¹JC–)_ ä´`V9l²”Ë¥³¶œ& b—º9J³ÑNPxÞè×µÙÏ3é×r›´z Io{¢œí¾ïu‚@_³ÿO`BžWý¸¿‹îÓÏûç|ÿiL£êAà”›k'fͨ`Àg dÎ>þ8½û IbÇ1‹Õ_ù±»ü#^÷˜·¹Ãû¹»ß£έ¾ßy¿%Ö݉émíÁøeøõI·«s·þ;‚,ÀE ¸žÃ¬rJEr`Y\öû²ÉûùY @ú=y së Ôä%¡÷0OЮRb\iM%¼”·­|ÿûß§æý*!²@Ëö\Ÿ­ªW¢yR4†”$ÚØŽU6V¯Ç éDž•˜åoÏ. kÇ6 0ƒMÇü<{“s;6ÁuaË,R0𲄹±vbÖM¬/@þ?‰‡Œ×Uñ:¶`“ó&?çà|¥åØ„MšeWë² 6iOyýJH{³Íx¿\ÂÀÕlrKz_þ6ùoÆ,2Yào1K‰¸G­¾Ï0”Pbh¹ë.z ®y_,`bž}Þ+~Ož'ŠÎzßãmÚ„ÝóC~-O` í ß÷–Ôµ[¼¯%u›ô>SRß}Xξ'1€} s­½äý´àûø½õ}K û×}Áۦ܄çý|c ¶DÕ\Á@£xCyB‚_å!”Ržðß¶u명VÛ¥Iµâý ßÎúuÈ‚+«M¯çúhq"î’,=Vg¹¨ „ñ(cb.’€L§ÿëJDÿµ¿\ÒñöØuŸh8öf¥qœlüžËåÞ5êÄ{­¬¼ë%”u°ô*o0MNNòìsÏÕ™Ìc"wü?N7 Œß1ïA¤^ äÌ߯Üy`ã4"€CýбB ŽjÅZ$$ÏÕ6EÉå1‹ˆêTÏ26é(?›\R ÎÈ©Š†ÛŠMv"œW0 “%äªaôµ3g˜&ñ¥n¸&£ PRbÝØD¡ô%Oùñ/xû½ý¯aûà„ˆº,ÁBuÔõkP“Ël³N]ÃÀD6ùao‹ï3ïmoñú7úõŸ!àB$]ÁÏ=Eu ŒnÁ€Æ3À?a÷À÷?â};è× ð“'¹Z«­*½kRügÌÒ&.…@âeß¾ e÷{û½Ý"ç±gRn?¥Ú™ð¶žò6]Æ\vwaÏÉ.?þ÷þ…OywzŸÉ2#KÖ„Ÿ{ܯ=ïýzó•#X-5Éßðc”ZŸS>•,¦ÜÌ9`xddD,z[ ¼¿¸|²ê.¸T%‚ ê'»á}QÑ8 «¬Ž‘ˆ¦ÆŠÆ1&4±pKlQjŒr“(fãñq[ô?q“}Ö*û­¬¬¬æ$};åGg¸®—÷{YKï±òVS©TbçÎuƒ’6Eš(§RìË®E¿¯xCŠäIGÇA d‹7¤óÄÜ#™Ú» yÈdu’ pÑë¹\‰êößëÛ%#pÎ?c“„ä¯5 <]À€@›4± ë0!½D!ú«©£ƒRµJ§×ÑGÈ6ßI€² c@b§·qد¥7ºÆ_ð¶É}(€0|Çë–;D­ßÁ8GÃ89€MX]~ Û00HžÀ@Ý$a=âûŠ.pPÄá%àãÞ']~»0‹J;æº:I°²YXÎa@ <Ƭ39à¶6š ~Žs¾ßí^gÊÛ!NXÕÿħjö~ýßà™ósLûñW¼Ýû ÏO þÿŠà2lœ˜¯a€°„AE}{¾g¨ç"I.aVJ\|“‰èž‹ ¨ôGgn\)“ÏcσúTÏ—¬O @ÂEcñz^óÏâúÅVáÈŒûµ4ªúèù•Åh‘`]Š#Û–¢ý‘ª€‰Fà£m7s]5‚$m[Æžëx¿˜ßÔ¨Š·V=o¥,//3;;ûæ;®QÞ€©v ÿÖK}YKÿËÜÜ.\XýƒŸ˜xNñZ+ý¥±]n ÈêC|EFW ’ Ø’»M¿ë¼rA)–€U Àbí˜4a2–¶R«×Wòúº.?­ìKwS6änêóó\óúÛ€ÌÌ ‰ùùU=¦‹„°{­Ð·c.$µñ|îÆ&sEÛMb ã˜'Bø$a²J`µJÖÛ/®–¤.bVåSd×oƒt¤¶€âuÌ¥µ‚ñ^$è"µcdõyÿþר«dºG°É^ƒPBò³_ç/ âSËË«yÛd#^Ä€¤ø6r{ø6οÁ\J:æÅ¨OG¨×ªêÀÀØ^¯ûféyŠ`éç&Aà=U €è!Yí>¯{)ºWÊc'ý"Y*g¼ »ü³4ä~œñþÓûRŒ>o$¸·’Tt¦ÚÝÚÔ´j ÆÛ/w¶Üx1`Š'w]„ÅR…z«‘&ÀVÿ,WªˆçqÝq Fl-ŠI×1àºÙ$ï;…½—1Ø’k8:¶Býµ½•‰[û :::Þpß7*ïÀ´^Þ™²–Þƒåf+6ý¥\”²ñÅŽÝ+ÔG°€MVˆÍëú,‹‘VÁ±ù?v߉³$mµ1Žti\}j[…`é’ð Ú¥÷ 61i,M¦Y?v˜ -¤h¹Ñ¤Á!Ä\Ñ?r(òKÜGI^籈° ¤H?gÙÏus_%00U&hæ<ãûÞ…MìÿŽËm›¨Ïøu>îí÷}*„÷ª÷ãel²_$Š/¸Dƒ~\/·Œ&|YX1^P'Á"£¾L,`—0ëÒi÷ìn¯³‚ ‚<†ÃLL0U«QÆxFóÞ®ÌÒ#é‡óHñþ¾àÿï $}]ÀÈÝÛÏÅ>?æœ÷O“_ë5ÿý?Ç¢k~j~œ\¦Ï{ÛîôßïÆ@y (äbVÉùyôî]'hNÉ-ÜN§ .§q¿_?Ÿ†dT9}öìêDnË LOSõ·YuÅ`e™`}T8– ;ŽÝuNµa¿øslIbßk„EˆÚçøÒ3ë/½YѹÇÇÇ9}úô[8âýWÖ9KïlYKÿÊZƒÅJ£ Ã~±4„?œ–°)ŽP[ŽŽ•{M%ÖjZ!$jUn6#p% ’xH×±‰fÑ— @@~ÃȽâSU –#ü|¯ÀA£ËL ~O¢ø’ØÄ¥Õüp¡@.—[•˜Ã&§& ÈhužÂ&;ÕÁ½õ46)I PIMOúñ‡Mäí÷á‚@Ö¯þ¹‹ÀÂ÷ózÅÙê"ÍÏ`â"ó%±Ãvoï aòQ‚Þ]Þ7ËìñóÜC˜$Þ¦憛Ä\VY?f“·÷`jp¾DbUöAeEß§Š@©°Kp´ŠY³´¢æ DôûüZ^À\x9a~ ³Öt,8M[Æ@lÆïóóˆKõÞçýv‹ºR{ ¨¤Ÿ#£ŸxñEÎ×j´HÚC^·€›ÀÐì¬ç¢B Qwa`)é× "Ç œ¸ç½®Q tl%èV)šëˆß›Qï§»½Î»üó vc+Fð =àý"+”­­¥J’Æž3)…—°çTÄjñ—¶€¬¸íüÖw¾Sg½U <XˆSs~V¢ºD¨Vi,ÉèOÎ!Êìyh$^Çd|•¸ -ÊÞny»Ç\»vçž{î‡8ÓzY/o\ÖÁÒ{¸Ü ød³Yúz{oòëÚÇ­u£åæ×sÄgÒÙheJô‚žapŒÉ¦iÌu¡•f J*…iER•°ÁU‘FY‚+'¶^ÉÍ"2j aÕ¼L2ÆÜC ¹Ö€Mlëì$I°lAÈë%$Âï‚â¸\Á”K(ãçû&!âM¨úÔÄ$NŽ®_®Mñ¡N>AßÌøß.h¸JHñRðkoÆ,3rOŠ$¿ ³‚@ ×ʲv»·å¨ÝÒJcÏÌf î¸ï>–“ÉU>Ñ@tü<„©=70$w§¢Â–1‹ÏY—¥Ã¯åÁ-*Kß ~žŒï3ãÛ÷y[F¼]eÌjwÈû|’àÆ»‡Cþý[„h7¹g•G­ý¦”,)ì-a SÚEÒ7M á×ï“€ÄÃýhðøuSþ?Gp²0I“LÀ[V$É{Hlê­²ºÉÚJô›ÞÏy½kLcƒ,c ¼ñÂNÖê·®§]_Þ®u£££ƒýû÷ÿ«´Ž¬»áÞÙ²®àýåÝLwòf%3‰D‚|>ÿ¦Qk­ÊÕwoV’kì£UlÌ‹j +Ö¶BÒ\Yu4ÙÊå% Ía5¼„MäÒ²‘U+AàI‚)åõhbHan¥Ç òj—Âío$Vw­¶ {«ùIlòSj ‘•Ç0ÐYÂ`\$p€ (ˆ¹arð¨OäîôóJM]}’êÈkŽúKaõ§¤|YœrØ„x†Äú‚…Š$ÌÈæ3wM?$‰ësÈûnŒ žy„ c$.O »·ƒ~Ï1åñØ5£Ð÷ABB ?ÏuèPŸÈU(Þ\>ú¬ça{^º0ð2ã×s1:_à®öã.b$ðµ0P®¹"!ÿÛR´¿M7!´^õÄ–—ؤ÷¦QMÿc¾’¶ ¸(It\ïZ‹ŸÆwºñ»ÀE#!¼±Í†¾7f Ðþñ>ïxI$H&“kʼU+Õ­l뻩à=À­µ~ˆs¸®àmeݲô/XÂß·’,r­—~‘׃ ?cëPcN& ¢q16ÈUÄ‹I&2¨'¸*ÔZ@)‡Mær·¥¢ßÄ ‘¥%¾&es—°å”´òJn–°kÇ6®ª0 8T0À°•æ–0ë„€Äi¯Cœ£˜ ?AÈt¯IN¢‘²b´Ô›{°ÉW“qÎÿÚ.Òì>)#ý˜·e ›(ã>o"DBŽ`à3ƒYÆ^%èMé¹hQÒá"f ›#hýØvß”öcøØ#p<™\(¥n­È¾ ÿŸñ>+zaØB E—üú” °HГU/¶„HàQœ YõF}¿$æ6úu˽{Å÷‘…d@Uo¯\Më² mðýdíYÆÈéx½z&æ¢Ï1GHï ðуÿ¿½3¢Êöø¯;éNwVHY $0Y à‚à.ˆ,3#è{ƒŒŽóÔçSAG>3鮺uëÖ­Ûuuî¹ç¿u¸Œ‡ÄÔß(ûj±3;çVŽãóæß4çÁÂÑcIËŸy¦ž*zÈò™ÛR©’¶¹³ÙAóY4hPƒûÈ–ñYj]IJ䇎`Y ÄTVkeɳ¾yªV#†gÁ’†Ó±e0Ì ‹ `øk¨¶²t‡Ö¡ÌŽÆê⺪hcѤ®?ÇåàãÔ·^Þ– cFwø<ôVÍrÖ¥rñ’ØP³åé’²0fò‚1üÂÃ8NhÖ’Zïù¢¡uvlQâá7®ÇXhˆýJ¸,jGÈCrä-?Ï¢â…z9^ µÓäP ïýàØFeÐ4¡qZg\©”ÉépÀ^S£çÍ˱„z¯•Ej·nùzºÁp"ç¨ä<ƒŒg?ööÖ#ß[ö;S—×`Ô6ÀÖ©PÂó44ë¯ýæ‚fmúÎ{L°÷ÚÊ` cž‡v?.@ò<ÃzÕZ,$¶Ôò"”:æòòô%0Dÿc""p®´Ô$ª8ä„:)C]¸–¯ü[âûÉå°þöyè[­;õwοiÕ_‰Å úÛ‹ƒaͲ¾DYψgXcðùN'Ün7JJJü¦v<$miYJDà-K§ –%F,Kˆˆüä'?1mó÷&@–ÏV‡O>V5\[gÑEA³ðw§’†‡žØÇ‰ý™¸sæ!,~è³?ðùa«%ðâª\6vÀ…7/žZ­ÎÞãòp‡Éi¸á8;p195 Éɨ€gÇ#Ü[J8 /ÃÂNÛ<ýZµñP5Œa2xÓWyótÂè9à"û¶ÄÁ°‚ñ~(ÃUP®… —Ÿ‡Üà­»b>#`ì½&7 !©å†fM ‡&2J`„Pàò¸Œ¼áDé~\]`¬ýÆËa°•¯ÿïµÖ@[£­ †€p)å̇!6C„°Øf+[êXdÁðƒ«ƒ&ˆJ¡…v8 M¨UzÓq7À=Ù‰_"X „f¥ëï=W6 !¶V±ø±ClÜžY(qpMÀ$Ün bÂꄈ:hC™ì, eŸZ/,”¬"ÅíÞ©Crꋎš)uÇB 0Áö±«júÖJÖç^sâ,54œ(¾±Ô )--ÅŽ;šuLCõ Ô׃Í­c)…öFn}8ólšrërñqªs8G»¶æm-›uegë"¤vαꂾ<¼ CÌðOóçï\ŽoGaA~NÕ/#ßr­QÞÿÉÐ:«nÊ5ÖAëàK u¤,bx‰.Ÿ_µðÔ*×Á);•³L<Œ%LÃJ Ù™-<´Çþ4n3yy¾~ö‘â0 ,ô؇‡aÍ/ Ð,,Ùæ­çC‡ál]nIä…]y™–(o}õ‚&tË¡9eõ~φ&°zzóå…s»zë“þùq”iv´®†áGÆõeƒ¶ †“6;áóЦ†•…ŇTˆœ‡¶r¡‰mÍo«‹÷\ÜÝ0ïíÐâHqz®[ö×âûÿýÉ“¦å‰Ô]¼uY Ã÷I…E²u8<^Ià èªV%No޳Zíl0&¨¿×KšD˜ÅSkŠ%Ÿn55ÍŠàýCH2 ׺ˆXê„4ÕgÉŠõáåËYS…‹UÜXE­Ccë %VË¿ý²XàˆÁ€á·Ã‚Œ­NÖ7n^Ñ0:PžJÏ‚@màÜÁñ9{%$ "&F‚bX y`XxнûX,ÂðÃ"q¾…1 ÆA!ÙqœßäÙÁçe«[6x6\4pšˆârs©!¸“ïêÝÎoþ•0qñ 2äµÉ¸,6h†;òhÖ ®^º£ ÆýíÑ£\6›º€›*ŽІ¬Î{#¦ÒEo}°š±3ÿA"˜‡WY('Á£ÐÄD‘÷Úƒ¼ç:möû ±Cx) çqn#žÛn´¶¯Z£=sYraX!»zÓ±@çÀÙÞý,¤Chðõ„†…éåäßß/®äßï Ôxó>UÔZ޳Z•ÕkªQ>«/L!Œ{À¨Ýcv-YþŠÆ:r"jöÚp" „¦ b©ƒãëG\QQ£Gš¶5ÕäÍNªÉ¼!_%ufŽ æ·P(ûøŽG¤ÎR㿨°¥Ìì¿£¦­TÒz,ÿùa sl%—÷ØÃ0¦ÅsÞ€aUâø6EÅÅ/+Ó-)€9r±0¬5Ü¡ñuC³D©ëñP#—-Ï»ß\wvHaÃbŠý8æGVá9}oïÆãÏ,ØØXÃI uþ\¹0ü´X0²â@‹åå娂áÄ"‚믚¥H ãp š¨e‹`X)C`,íQΫ  Ž·µF¤v5ZµÀhËì'Ç–0¶´Á2¢ÄûÇ>H,Øù›Åj ÑÊi9±©0~Sg5r™Õp§S?†QgЩ¿ï,˜ºŸ‡³­"@ý[‡ÙaÙ®ZÎTñTeI¯Š*ë‹X †ášcép:íîgÚ^ˆe©u±Ô q:ˆ‹³.=Ù4l ü·[þFgÕÐUEµ<±`â´êÛ,wç•í0ˆÕÿ(H9Îê·Â Þ®:Ÿ‚¦  F´r~Sìtâ¢ÃH3¸¸3g1¤Â³ŸX$©åàŽÔ³P ‚6ŒÄb“×ÑãåJX,ÚaÌÜS£™«¡¸®Xì)ùq½ñúfhoùê,Bö½âã)Úl7vú€…“jÙà6Ìí…­;j›RÃXFÀÉ"³@y9¾×êÂÒŸÉÚþYtòý;óŒRn/!ú÷ï¯ÿØBiµªZQ­J¤¤Uó\Ϫ˜k¬#ì®äëkFz¼-œ­ŠÖgŽͧ%B«K—.0`@ã ¡™ˆXjGZjªö¡ªÚL\«Hò÷–Çç·>UKu?`X&ÔBrà7fÀÜùs™¬¢ª‹òYõwê cš¿5ŸÚÛ>‹~ÈsùXlñ›5Ç *»x•ååz½pùl0œ”ùŽö\§lçn\V,}`t¬ª7ûÌѱU¿%®¿:h&'4«[e¸#âå5ø|‹8nÕ0„c´ØQÐDˆZÇ=V©sÕ* ->ør=²OÏú;yäìíjØáü4‹VoÃ…¼MÎe}žû{¾  Jé‡@¥lΧ)7Ãn·#,, e ,¦ÛX>M-ú&ÚØ9Tk`môeòçm,l¬Ž§ÛX ¨‹áZÅR€hë•Y9Oî ‚Ø‚ƒ"ÔÔÕéoúÁÐ,ç½ÇªqœXPòºXjݰ0"h~6ga¶LqGÍåçXKåЬLÊõ°ˆàkb«Ö%V'§’†-Jv˜gxq5((žóæÉ!Ø"bSÎÁ"‚à»Âˆ4Îs°’Öm–;§À<-Æ{Þ ˜ƒJrݱoS¥±µÁ` IDATò]ªªÕ†ïW?oYÎÀˆ ÍÂï[³xú?[œØJÈq¡ó¹äûª¶Kõ³j­á˜^P¶Y…Jê/ ÂõǨyª‚Ç×1óñÖá3Új(‚p/;,ü¬¿=Î[µLú*kS± ¼†èèRs®=66gÛ((¥ºx ð@†– ”bYê„„††âꫯnѱ ýÐ}= Ô¼/ç?Õ7Äêx¾…w‚êÃ8 æNˆ²Hò(ßYhpç¥ hþNÓ€ÙÑÖêÄ>¸o_$%%Þó°SñY©zýìp«ÎŽ‚’†­WßÈ@ÍÃ@Vk›:½«R?ªï `Ìòª€¹3äYaµ0ÏlcqÁ~/ì4Í×Ìùž•B‹ÄBEµÆðµ²å¤ÆL<ö… ‡¶¬=(AІ8™ÃSìų ‹¡‰žjÏ> ¶±‰ØêÅebË£Ú¬ºï Ýû÷óŒvÅþqá0†0£½eá6 ` r ^-V )××û½ñ·M¶$q”tÕ¿‰óš0~<ìÞëPY8̇#j{P-¢P>óK_ ŸSõ«F}á§ZHÔßïk‰ i Óª–¥Žl1’a¸ÖE,K~„e©¹?®Æn†Õ´ÞÒ|;0/‹ÀçUÕ5?`yh,†eCM˜;~{·[ö[?«BE}Ëeë w¬lqàåB‚•<‚”Ï5J^<üu ZÎKp$B³Rð1j'Z§ßZ‡c­g~{WëÀ*yáZh3º8vÏÆ ñÂK†pðEõÞ€Á0Ç"¼‹Ãoª¥¤ZŒžý0[ XY§†ópÀäº`¡<À› eD&‹TŒÙh¡ÐÄ ßŽá¤–M½ßl}Ì Ùrè.J~Ü™³ÅPmCÖa`®ƒ*hõ~Ör­,°â ùtq;bغ©¦e¢ZnØ!œ¯ÿ«%kgdâv× ¨h³ü'hC}E0‚¥ªK§p^j]ؽÇð¢¾V+®¯sD ~ûnÌ¢ÔReårò†ËåBYYYã‰[@sŸçmiYŠFà-Kç!–%F,K­Ls~øM5Q‡‡‡cÔ¨Q~Ó5åGÝØ[;9s~ÖÆ¢:ò”wöÁPÓð̵lj§ cÉ)êR(€aPßö¹ÃbñÄ>GÓÊYÈ©"€‡ {€””Áo§”2°¸P…wÐêr.Vk›«¨äbƒ¡uzl`Gbît«aÄkâÙÃiÚmÈ 0ü^j¡ u†U#FØ€ hBI"d‡iuM1ÕZÆþ_l¡s+Û÷1v,AAˆƒ(’뇯—… [ÙÔ™QìøÏõhb…-n\jR56·U´©¶®æcì̓ývøuˆÛí9åXÛlYb ¥j¹ ?-n{ϋێ FX^|YmSN£®»]-õaƒ± £ŠyJli…² ‚!”¬/)ê0ž*àT+”m­Í劭°°0ôìÙ3 eélpÔŸXQ̈Xj.§Ñùz@•••aË–--:¶9X­ ]±¨N´WÀxØžQÊ¢ú’ð~Žv\ cÈ;z~ð_T>³…‚‡ÅTË[IÎzÿsP?v&çà‹{ìòòóMCˆªÐãkRµVýYT'ký«ÓÕË`vš¶{˦rg«±¸`8M[—{a?*%6WC{;ä²³°äkæ5åà=–æ:æmê .Õjâ°ç›oPSW‡|k¿q¾¶ž±uOWÅeȇáÅ–*¶Ä©ñ‘ø^wa­S`VýÅ8jåø[Á0âyø3Ú½PàÙrÃÖIÕ:c‡9Àäq%€”… ¿TEW€CGŽè‚Šë0œÎÞëçëPÓfK—¯‹Q‡üÛ8`¼øX—;²_ýïk_K Dç\]]âââÆ B3±Ô\ŽhIõq|XX~rà —‘kÓ±Z„|mê;¤…Ù?Çú–ÊN¾Q0†Y¬C_50¦ØÛ,ûj¡uÜ¡³ˆ;ulMó~VgÌõLJB||<"¼éãažiÅ‘¢Y(©â;c΋áa ìWÅ{¯Y ÍÀ×ΞäúVkyÆ—]ÙW«¤å:àÏß(éÔò¨÷’}‚<0fŸ+;ŒÎ:æ™,Îz÷部  CKìx£\;± çÁ°%F ÅA:ÕzRŠϢ˜—faq M¸ ?1Ìí€ÏÏŸÁˆŒÎõÀ÷[ê «‹ü^0?T¹íÃX†ÄîMgSöèÞ­›~M¼-¦voÝñDn+5Þ2¨QÝÕs'[êQ×tã5—Á:DÇ‹ñ&+Ç‚@åc³Ùl•ÿÂGÉ—•QбÔÊ\®uçê7ÚÊÊJì?pà2sn>üR;†‡4TÇS~ç}ªéßc¥ù`˜ßÖ Æ0wn,¸8¨!`tÌêp†:<Ç"Š;¶±¥¦¨¨‹‹õŽñ”w{Wï9UG\ÌÁk, ‚•s)iÕÿÕ0–Ô` ÏVžNÏÖ!¶Ð8¡‰‰åXŽÄŠëÊcöwôå<ܩؙ§:ó ;ž™hC9\¶ª(9Å"•ýµÐ¦Ò«C®Qœ-JÜ)G(çàp4S½VÀ°qyùÕ{Áë×q„ñ£ÞüB`^ÎF金mn'܆ø¾ÆoÑãÍ“#Ñs=ŸôÖ›:$ŸÏx‡f=ãëçr×ÖÖê~iªøµ[òÌmJ r¤¤!'`nc\JÕj¦Fn÷5wÆ›Ož÷{cÏ·¦ºŠ   ¸ÝîÆ¶€ŽìÜ vN} "–:!‡½zõj³óYfÕ–mhÖ ß†‚õ¯úU¨¿Üa³s©ºt‚êGÄÃTÜéÁj§ÏeP‡¼lÐÞì]¡¡v¹ôrp§È³Å³eD8€¿I^ cˆDµ±£´Ú «þN<œ¦œ“ßòÕ`žJžðîg_#õžðÐZœÆs´jÕb¡ ]¶ª06Clê²'»hÂÁ:›.†˜à{® >¿Û›ç9ï>^8™ëŒãX©CF,|kaˆ-UÔ°…+ š%¤ FØÕ2¡xˆŽËoí<Ôk9 ÍJ¨î·Á°rqù92ìsTï%¨´Tªd§ýrý«°å•E*Ï^„ò_m‡P>€¾0b\ñý·[Ò´‰ü¹9⦭­UUU8{Öêº/—ˆ¥V¤µÞDêêêPRRÒxÂâÏGAµìðCÖ*è§Î4â”…OwK>œÐ:…$ïgµ~¹cW#|«þ`e[4¿lDõ.ª? .çÕ0ñuÄÚy…˜îÏâŠ-qªO‘jMR‡>ª`™Œú5£ úcX†ÂpœçΜ}”ÔÎX-“Æ:h=•}€Ñ«CѶÛõórÙœ0ÂDÀúaqÌGŽÎVõÞs°ÈJâ˜Å¡Ʋ(||?xÈ‹‡æv)צ¦ãz ô85ª&LIå3çÅ¿B_¡)øZÕöÅÃÁЄ ·èÕ«—‚óá6Ç÷Nµì± ¶žÓ¡l³ŸTŰ ZØ… KZÕ:Ë÷ùŒ— íEPS GïÞ½Û»í‚ Ãµ."–:!6› 6[û…Õá _Ãüv¬Ũ¾3€1\¥Z‚Î(û8oµ¡ž€Ñqð°S8ÌÂŒ-2\vV}:Ê+*PY]­[/T‹ÃÛ>Ëõ©ûU«ðPíXÔ·{UTrþj§Êë½ñ°Žº†™Õ<Îçg_#«u€­ek×·ê×T§ËùWA‹÷sÆ,3uy~!Nž<‰Q0üo8`kбà–kµ8ªõÁßË¡YoxHMµ´°ƒ?×+[˜ØÏ‡-.ê1vh­?\ž*³UÎÎì\?ªàb¸UÇyUDsz4ÄלóÒ@{öi­Ì—£6r[ãëcc2á´Ö$Õß™:G0„˜*Š8úW}™.—@wÈ.\Àþýûœ« ˆXòË冠jMÚæo åÍß=–ÿê_òYõ‰àé÷êðç]«£~†7-OaçµÇì0?ü¹K>œ&²KD†‡›Ápèå²Ö)ùY¯ƒÿ«Ž’Íq‡øÏóõ©Ãy€Yò²|^µ#æc¹ƒ!¶jaö[ácØzÀì`h“;f>†ó­‚\0¯+FІ\yÖ\5€¾W^ Øíº_˜Ý’'¯5¦Ã’ò]½g|TëÝï9Ùá¾+ aÊ÷„ºYhWέž¯æiô\^Ž`Í÷Sõgb±Íim¨ß¸ñL=®gÕ*gƒ&Ô¶èR¾_wÝu¦òªÃÒüݼõËQ óZtÔ/³êÅ~bj{#h!TÁÏ×àë÷ÝÒ¿@Ó¥K—ìmŒ–\ŸÇ»fb[„3 Ô=iÍûÓ™‘ ”~ÈÏÏ×#< ‚ BK8yòd«Åâ ”ë+Pð‹‘¥ÔøçœcÙDqòäIDDDtˆa/æûï¿Gjj*²²²Ð£Gö.N§Eê10H=^>R‡¡£Õ#¡´´‰‰‰':4"–ü`·Û;d4Ø‹µ(+¢ø/©ÇÀ õxùH†ŽXXŒ½)zˆH†œÌˆÏ’ ‚ ‚IJ$‚ väbY2#–¥NHtt4yätéÒ¥½‹Ò©‘z R—Ôa`zZ ™ '‚ ž DZÙ‡¡Ùp2 '‚ †k]dNAÁbYA„NŽ„h]IJ$‚ ‚àK­ÄªU«0nÜ8ÄÆÆÂf³aïÞ½õÒTUUáÑGEll,ÂÂÂp×]w!??ß”&//wÞy'‹ùó磺ºÚ”fÓ¦M6l\.úô郷ß~»Ñò8piiip»ÝèÑ£^|ñEÓúE .ÄìÙ³)))HOOo~%´³gÏÖæ¿ë¯¿Þ”&PõjåÂ… ˜1c¢¢¢…3f ¸¸XߟžžŽ””½œ . È5·o¾ù&z÷î —Ë…aÆaóæÍ~Ó¯\¹©©© Ajj*V¯^mÚ?zôh,[¶ ¹¹¹*~KX¸pa½6¯ï'",\¸‰‰‰p»Ý=z4:dÊ£±¶ä‹ÆÚµZ·êï·£ðõ×_ãÎ;ïDbb"l6>ùäÓþ@Õ[cÏ6_4ö7:"–Z‰òòrÜpà X´hQƒi{ì1¬^½+V¬À–-[PVV†;î¸uuÚ:éuuu¸ýöÛQ^^Ž-[¶`ÅŠX¹r%žxâ =œœL˜0£FBff&žyæÌŸ?+W®lð¼/^Ä-·Ü‚ÄÄDìÞ½¯½ö/^ŒW_}5pЊÜvÛm(((ÐÿÖ®]kÚˆzõÅ<€½{÷bݺuX·nöîÝ‹3f´Úu¶}ô{ì1üÇü2331jÔ(Œ?yyy>Óoß¾S¦LÁŒ3°oß>̘1÷ß?vîÜÙÆ%o;®ºê*Søà<üðÃú÷Ï?ÿ£FjQ^Ddr€õå ÛX~`ús¤mÉ1m¯z2eŠþ}àÀ>|8’““±fÍÜsÏ= æÕ’zµÒ’c:+¾ÚGsÛÓ±^M°3ƒ ˆ#ð£ýË—/×'4VjK?´zD½âyè+ߎŠËåBNNN£TZ‚¯:P­vV~ÈÏKà®»î2™†{ôèÑè1ñññ¨®®Æ… Lo‹gΜÁÈ‘#õ4V'Ù . ¦¦FWð¾Þ(Μ9ƒàà`ÄÄÄ4xn_ÇõßìÚ“¦ÔkBB’““qôèQ«W+ñññ8}út½ígÏžíPuv¹ÄÆÆ"((ÈgûðW7ÍIÿC#,, ƒ ÂÑ£G1iÒ$šµBµêªõÑ’¶Ô”vÝ™áÙ„—[o-y¶µäyÐÑp¹\p¹\ívþ–<7:â³"""зo_ýÏív7z̰aÃàp8°~ýz}[AA<¨?üFŒƒ¢  @Oóå—_"$$Æ ÓÓ¨ypšáÇÃápø<÷ˆ#ðõ×_›ÞD¾üòK$&&Ö3a·'M©×¢¢"œ'Nœ Ûo¿Ün7EGGÓ¼yóLÓb‰ˆÒÓÓéšk®!§ÓI)))ôÖ[o™ö/X°@ŸÒÎìß¿ŸFE!!!O .lpjmGáÒ¥Ktë­·R·nÝÈápP¯^½hÖ¬Yõê,õºqãF@999ú¶¢¢"š>}:EDDPDDMŸ>.\¸Ðª×Ü^¼ñÆ”œœLN§“†J›6mÒ÷¥¥¥Õ›–þ׿þ•ú÷ïO‡ƒ @+W®lã·S¦L¡„„r8”˜˜H÷Üs:tHßïñxhÁ‚O!!!tã7ÒLy4Ö–8 €²£)íº#ÿ)ë·¥@ÔQãÏ6~6«4å9+4Ž¿çFgÇFÔɧ¦‚ ‚ ´"â³$‚ ‚àK‚ ‚ ~±$‚ ‚àK‚ ‚ ~±$‚ ‚àK‚ ‚ ~±$‚ ‚àK‚ ‚ ~±$‚ ‚àKB³HIIÁÿøGý»ÍfÃ'Ÿ|ÒŽ%2X¶lºtéÒêç±ÖÁ™Ö¼¿ªÇ÷Þ{·ÞzkJdÐVmÉ÷Ýw^}õÕFÓÙl6Øl¶v/ïå’››«_ËÕW_ÝÞÅ"–þ ˜={6&MšTo{zz:l6Š‹‹[œwAAÆ9Å S¦LÁ‘#G–_CæîÝ»1wî܀ǣGÆc=Öªçh êýåÎlïÞ½í\*ƒªª*<ÿüóxî¹çômåååxꩧЧO¸\.tëÖ £GÆgŸ}ÖŽ%5X»v-œN'¾ùæÓöÅ‹#66………€çŸ/¿ü2.^¼ØhžK—. hÛo’’’PPP€'žx¢½‹"õ±$\ñññ iÕsTWW7)ÛíF÷îÝ[µ,Э[7„††¶úy:mq/‡•+W"<<£FÒ·=òÈ#øä“Oðúë¯ãÛo¿Åºuëpï½÷¢¨¨¨MËÖP»0afΜ‰™3g¢ªª çž{o¼ñâããƒFJJ >øàƒFÏÕ¥K—ËnûMýµAAAˆGxxx»–C|!bI0±mÛ6Üxãp»ÝHJJÂüùóQ^^Þ`zë0Í0vìX¸ÝnÄÄÄ`îܹ(++Ó÷³•ë…^@÷î݉‡~Øô =z4æÍ›‡_ýêWˆÅ-·ÜÈËËÃĉŽÈÈHÜÿý8}ú´~œ/KÐßÿþw 6 .— }úôÁ /¼€ÚÚZ}qq1æÎ‹¸¸8¸\. 8Ÿ}öÒÓÓñÓŸþ%%%úÐÀÂ… ˜‡¦M›†©S§šÎYSSƒØØX,]º@DøÝï~‡>}úÀívcÈ!øøã›t?¢©õ¼xñb$$$ &&¿øÅ/PSS£§)((Àí·ß·ÛÞ½{ãÏþ³ßaÖÞ½{®¹æØl6Œ=€o+ؤI“0{ölýû™3gpçwêçò%JJJ0wî\½]Œ;ûöíó[+V¬À]wÝeÚö÷¿ÿÏ<ó &L˜€”” 6 >ú(fÍš¥§¹páfΜ‰®]»"44ãÇÇÑ£G<ϱcÇ0qâDÄÅÅ!<<?þñ±aÃSš””¼ôÒK˜={6¢¢¢0gΜóûÃþ€²²2,X°µµµ˜9s&î¼óNL™2Ŕî‡~è·]Þüü|L:ÑÑÑ ÃðáñsçNÀ¾}û0fÌDDD 22Æ Þ={ô<{~TUUáÉ'ŸDRRBBBpÅWà½÷Þköõ B[#bIÐ9pàÆ‡{î¹û÷ïÇG}„-[¶`Þ¼yM:þÒ¥K¸í¶ÛеkWìÞ½ýë_±aÆzÇõÕWÈÎÎÆÆñá‡bõêÕxá…Li–/_Žàà`lݺK–,aÒ¤I8þ<6mÚ„õë×ãØ±cõ:•/¾ø>ø æÏŸ¬¬,,Y²Ë–-ÃË/¿ ðx<?~<¶mÛ†ÿû¿ÿCVV-Z„   Œ9ü㉂‚à׿þu½sLŸ>Ÿ~ú©I¨|ñÅ(//ǽ÷Þ xöÙg±téR¼õÖ[8tèüq<øàƒØ´iS“êµ¥õ¼qãF;v 7nÄòå˱lÙ2,[¶Lß?sæLœ:u éééX¹r%Þyçœ9s¦ÁóîÚµ °aÃ`ÕªUM.óìÙ³‘››‹üãøøãñæ›ošÎED¸ýöÛQXXˆµk×"##C‡ÅM7Ý„óçÏ7˜ïæÍ›1|øpÓ¶øøx¬]»¥¥¥~˳gÏ|úé§Ø¾};ˆ&L0‰I•²²2L˜06l@ff&Ƈ;ï¼yyy¦t¿ÿýï1pà@ddd˜†­DDDàOúþó?ÿÓ§OÇÉ“'ñæ›oÖKwíµ×b×®]ºª©´´¼eeeHKKéS§ðé§Ÿbß¾}xòÉ'áñxhí½gϞؽ{7222ðôÓOÃáphÚócæÌ™X±bþû¿ÿÙÙÙxûí·Å’$tHøÁ3kÖ, ¢°°0ÓŸËå"táÂ""š1cÍ;×tìæÍ›Én·SEE%''Óþð}?Z½z5½óÎ;Ôµk<áÖ‘ 0IDATW*++Ó÷¯Y³†ìv;êe‰ŽŽ¦òòr=Í[o½EáááTWWGDDiiitõÕW›Êñå—_RPPåååéÛ:Dh×®]DD´téRŠŠŠÒ÷5Š^yåS>ÿû¿ÿK DDôÅ_Ýn§Ã‡û¬7k~ŒZÕÕÕKï¿ÿ¾¾Ú´i4yòd""*++#—ËEÛ¶m3åñóŸÿœ¦M›æó¼\¿üå/}îkj='''Smm­žfòäÉ4eÊ""ÊÎÎ&´{÷n}ÿÑ£G @ƒ÷7''‡Pfff£e8q"Íš5‹ˆˆ>LhÇŽú~>?Ÿë«¯¾¢ÈÈHª¬¬4åó£ýˆ–,Yâ³.\¸@è믿6mß´iõìÙ“ >œ{ì1Ú²e‹¾ÿÈ‘#€¶nݪo;wî¹ÝnúË_þBD ß{•ÔÔTzíµ×ôïÉÉÉ4iÒ$¿ÇX™:u* >úÈçþ}ûöÊÍÍm0õ]ny—,YBTTTä3ˆˆZ¶l™Ï}=?¸¬_¿Þo9,X@C† iôz¡-ËÒ? cÆŒÁÞ½{Mï¾û®)MFF–-[†ððpýoܸqðx<ÈÉÉiôÙÙÙ2dÂÂÂôm7Üp<>¬o2dˆÉçgĈ(++ÃÉ“'õmVkAvv6’’’””¤oKMME—.]í³<xñÅM×3gÎàÒ¥KØ»w/zöì‰~ýú5zm áp80yòd}X©¼¼ûÛß0}út@VV*++qË-·˜ÊñþûïãØ±c-:gSëùª«®BPPþ=!!A·æ>|ÁÁÁ:t¨¾¿oß¾èÚµk‹ÊÔXyƒƒƒM÷tÀ€¦!ÓŒŒ ”••!&&ÆTO999 ÖSEEÀår™¶ßxã8~ü8¾úê+Ü{ï½8tèF…ßüæ7¦ò\wÝuú1111èß¿ƒm©¼¼O>ù¤ÞæÂÃÃñí·ßÖ³ÔXÛíøñãõk¹êª«LûN:…uëÖ!44›7oöy^·Û @³&6‡––wïÞ½¸æškí3ß_ýêWx衇póÍ7cÑ¢E¦{ÓØócïÞ½ BZZZ³®E:Áí]¡m Cß¾}MÛòóóMß=~øaÌŸ?¿Þñ½zõjôD›Íæs_CÛJ£ yû;§ÇãÁ /¼€{î¹§Þ>—Ë¥wD—ËôéÓ‘––†3gÎ`ýúõp¹\ú 2¾X³f zôèa:®¥ŽÓM­gQ÷qyˆ¨Á¼›‹Ýn¯wœ:œÅûüµǃ„„¤§§×Û×Дø˜˜Øl6\¸p¡Þ>‡ÃQ£FaÔ¨Qxúé§ñÒK/áÅ_ÄSO=å÷Ú*ã¿ýÛ¿á‹/¾Àâŋѷo_¸ÝnÜwß}õœ¢­íöÝwßÕEõ~<ôÐC2d^xáÜtÓM¸ï¾ûê ‚ìÖ­›Ïr5DKËÛØobáÂ…xà°fÍ|þùçX°`V¬X»ï¾»ÑçÇwß}׬k„Ž„ˆ%AgèС8tèP=QÕTRSS±|ùr”——ëá­[·Ân·›¬7ûöíCEE…þ`Þ±cÂÃÃѳgO¿yçååáäÉ“ºu)++ %%%¸òÊ+¼žÃ‡7x=ƒF~~>Ž9âÓºät:QWW×èu9IIIøè£ðùçŸcòäÉp:z¹CBB——°7ê¦Ö³? €ÚÚZdffbذa€ï¾ûÎo ¾&ktëÖ ú÷ºº:.— ³fÍÂÁƒ±qãF<ú裘1câââôtÕÕÕøùÏެ¬,ýítÞ¼y°ÛnŽ7ß|3ŒéÓ§ã›o¾Á®]»0sæL¤¥¥ÕJ`žþy¼ÿþûX¸p!:„ììl|ôÑGxöÙgiii¸ñÆqï½÷býúõÈÉÉÁ矎uëÖÐf •••᫯¾Â¹sç ±ÙlxàðöÛocýúõxðÁõ}øõ¯ÇË—/DZcÇ™™‰7ÞxË—/÷[ŸgÏž­7tZXXØäzöÇ€póÍ7cîܹصk2331wî\¸Ýî­+Ý»w‡ÛíÆºuëpúôi”””ÆŽ‹5kÖ`Íš5øöÛoñ¯ÿú¯&!Ô¿ÜvÛm˜3gvî܉ŒŒ <ôÐC&+ÆÍ7ߌ#F`Ò¤Iøâ‹/››‹mÛ¶áÙgŸ5Ͷ²2nÜ8lٲŴmôèÑX²d 222››‹µk×â™gžÁ˜1c‰+®¸'NÄœ9s°eËìÛ·>ø zôè‰'úûì3}ÿ#¤t»]\wÝuB*•‚×ëE?öÜsOœuÖY¸ûî»{öì±Ç`ÛvÏO(ÂŒ3pðÁ㢋.‹/¾øŽ×ýÓŸþ„sÏ=»ï¾;"‘Âá0æÎ‹sÏ=üã·ú>†††`Û6~ýë_oqŸÓO?¶m㦛nêÙ¾hÑ"¹—Å‹oñøeË–É~ŸúÔ§z>ã¼l¾ýƒÄ;ß²,X–5#úÛçõ×_Ç’%KðéO;í´|>pôÑGãÑG}Ûc—-[†ý÷ß‘Hñx .Ľ÷Þ;龿ùÍoð¯ÿú¯8ì°Ã088Û¶±ÓN;mñܹ\×_=Ž=öXì²Ë.ƒˆÇãX°`~úÓŸÂó®îwݺu8ãŒ30sæLøý~Ìž=\p …„}ß«-ý|æ3ŸÙê1<ùä“8ì°ÃJ¥ ±çž{béÒ¥èv»öu~g'ûùÉO~²Õ׿çž{044„x<ŽH$‚O~ò“~§8év»¸âŠ+°çž{" "•JáðÃÇSO=µU×]¿~=~øÃâ°ÃÃìÙ³á÷û‘N§qÈ!‡àç?ÿùÁyç‡9sæÀï÷£¯¯Ç{,^xá…­º>ðÖïÙÉ~\.Z­Ö]±bþñÿ™L@;ï¼3Ž>úh<ûì³[=eûÁý~@Q”mO·ÛÅᇎû￉D‡~8vØa´Z-¼üò˸í¶ÛðÚk¯áÈ#œpì¬Y³púé§Z­FGGñÛßþßÿþ÷ñ½ï}'Ÿ|2®½öZ„B¡ Ç^uÕUøêW¿ c >ø`yä‘°, Ï?ÿ<®½öZüä'?Á~ðœwÞyS¾—©Çï´ÇãÁ 7Ü€K.¹dÒý®¿þzx<ŒOy\fΜ‰W^y±XìýÊßßüæ7qÇw`=öÀᇎd2‰×^{ ¿øÅ/ð‹_üW]u¾üå/O8îk_û~ðƒ`ÇwÄÙgŸV«…ÿûÿ/Ž<òH\}õÕ8çœszö¿õÖ[qÕUWÁãñ`=öÀÆßv\?ûÙÏð¥/} 3fÌÀÂ… ±ÓN;aãÆX¹r%Î<óLüêW¿ÂwܱU÷úÆoà€@6›ÅÑGÝvÛ Ï>û,–.]Šûï¿O<ñ‰„ìÌ1Ç`öìÙ“žë¦›nªU«pØa‡mÕîºë.üñ8ñÄ‘L&q÷Ýwã‚ .À“O>‰Ûo¿}ÒãŽ>úhìµ×^¶ÿÝßýÝV]ÿꫯÆW¾ò¤Ói|îsŸƒ×ëÅŠ+púé§ã¥—^Âw¿ûÝ Çœx≸óÎ;1wî\œwÞyÈår¸ýöÛqÐAaåÊ•“þ~Œþð‡X²d æÌ™ƒO}êSÀ›o¾‰•+WâÁÄ…^ˆï}ï{=Ǽùæ›8à€°qãFì·ß~8î¸ã0::Š•+WâÞ{ïÅ=÷ܳU"¿C/^Ú³íÑG5–e™… NzÎßýîwfÏ=÷4–e™Ã;lÂçË–-3–e™L&cüñ Ÿ?þøã&•JÛ¶ÍÍ7ß<å{2¶m›Ç{l‹ûœ~ú鯶m³lÙ²I·{ì±Æ¶msß}÷M8ö•W^1–e™ãŽ;nÒû§yù ðAÿûÁ²eËÌ‹/¾8aû¯ýkãõzßï7ÃÃÃ=Ÿ=ù䓯²,³ë®»šb±(Ûß|óM“J¥L 0o¾ùfÏ1¿ûÝïÌ‹/¾hÚí¶1fÓ³ÚqÇ·8®GyÄÜsÏ=¶oܸÑì´ÓNƶm³råÊ­º×C9ÄØ¶m~ô£õl¿ð eYæK_úÒ”ÎS(L04~¿ßŒMùú¥RÉd2ã÷ûÍoû[ÙÞl6ÍßÿýßÛ¶Íí·ßÞsÌ7Þ8éwþݰzõjã÷ûM:6k֬鹟~ô£Æ¶móôÓO÷së­·˲̂ L³Ù”íÏ=÷œñù|¦¿¿ßT*•)]ÿç?ÿ¹ùõ¯=aû«¯¾jb±˜±m»g^Œ1樣Ž2¶m› .¸ gûŸþô'FÍÌ™3M­V›Òõyë÷ìÖðo|ÃX–e¾õ­oMúùøøøVOÙ¾P¢(BÎ9çcÛ¶Yºt错С=22búúúŒmÛæ®»î’íårÙ$ cÛ¶yà¶xü¯~õ+cY–I§ÓSþÏy[;ï¼ÓƒAsÌ1ÇL8ö‚ .0¶m›_þò—ÛT€¼úê«fÑ¢EfÖ¬YÆçó™¾¾>³`ÁsÍ5×LØ÷Á4‡z¨I&“Æçó™]wÝÕ|ýë_ï1bÉÁllÛ6NÇ|ûÛß6»ì²‹ñù|fÇw4_|±iµZ²ï7Þh,Ë2¶m˲z~.½ôRcÌ&ã˲,³hÑ¢žë|þóŸ7–e™7ß|Óüû¿ÿ»ùøÇ?nü~¿éïï7gŸ}ö¤c{»yržpn9–ÍÙyçÍìÙ³{¶ñž–-[fþó?ÿÓ,X°À„Ãa“ÉdÌ¢E‹L¡P0ÆóÛßþÖqÄ&‘H˜p8lŽ:ê(³zõêI¯³µÐ`ßÜÐÿÜç>·E£ø[ßú–±mÛ,^¼ømÏýNäíøßÿû˲ÌW¾ò•)óç?ÿÙX–eæÌ™3á³r¹lÂá° ‡ÃS2f¯ºê*cY–9å”S¶jÜÿñÿ1é;hŒ1?ü°±,Ë õlß–ä›ßü¦±m{Ò÷ð§?ý©±,Ëœ~úé=Û,X°ÅßK§vš±mÛÜxãïylgŸ}¶±mÛüà?mFÃx½^ãv»'ý=ú/ÿò/ƶm³|ùò)_gkÈðð°ñù|fþüùS>FQœhˆ¢|I¥R0Ƽ«œ‹·#“Éà _øŒ1¸å–[dûŠ+P(°ß~ûáþá¶xü¡‡Š}÷ݹ\+V¬Ø¦c{;âñ8N8áÜ{qí­V Ë—/ÇÐÐvÙe—mv½{ï½ûì³–/_Ž}ìcøêW¿Šã?ÝnÿöoÿÖ³ïµ×^‹C9O=õŽ9æ\xá…H¥RX²d æÏŸR©Ô³?CÈþéŸþ ?úÑpÐAáœsÎA0Äw¿û]|ñ‹_”}÷Þ{o ©˜5k/^,?CCCo{ Éø_ÿëáë_ÿ:öÚk/|ùË_Æ;ì€ë®»Ç{ìVÍÉ»É3ÙÒþ–eá®»îÂG¾¾>|éK_®»îŠo¼Ç{,žyæ,X°Ngžy&<ð@Ü}÷ÝS‰y'<LKyä‘GlzÏ7糟ý,Œ1xøá‡·É¶f\oÇ|È!‡Lø,cþüù¨Õjxúé§ßñ\×]w,ËÂÙgŸ=åës –eM:ot‚Á ž|òI´ÛížÏŒ1xá…°téR,Y²7ß|3Ö­[·U׿õ-?7=Ï­Ùlâ©§žB0Ä8é1“=ëÅ‹öm\vÙeSÛdÏ4—Ë¡Ýn#NO ;gÎcðÐCõlŸJ>ÛwÜ%K–àŠ+®À¯~õ«-æ~üìg?C»ÝƉ'žˆF£+V`É’%øñŒßÿþ÷S¾?eûEs@åCȱÇ‹%K–àšk®A©TÂ1ǃO|âo›Ü:U†††pùå—÷$>þøã°,ëmÅùÌg>ƒßüæ7xâ‰'ðùÏ~Ê×½á†ÄPØœ©$ÇŸuÖY¸é¦›pà 7àâ‹/¬\¹ccc8묳¦<Žwbll 'Ÿ|2:yä‘ ÊúõëåïkÖ¬ÁùçŸH$‚ßüæ7="èÜsÏÅ5×\ƒ‹.ºÿþïÿÞsc Þxã üáÜoûÛ˜7onºé&|ç;ßA__æÍ›‡yóæañâŘ5k¾õ­omÕ½cðÌ3Ïॗ^ÂÌ™3lÊ/Z¸p!yä<÷Üs[k¿-0Æàî»ïÆÃ?Ü3¿‡r|ðA~øá¸þúëqÒI'Éggžy&n¸á†÷,DÞ|óM<ôÐCƒ8è ƒd{­Vúuë‰DÐßß?á8>Ûm½(@:–-[˲ðÿøS>îµ×^ƒeYØu×]'ý|—]vÁ<€?þñX¸páÏóôÓO㥗^Âܹs{æeªc0é\.fÏž?üáxã7°Ûn»õ|~ÕUWÉß1p¹\8óÌ3qå•WÂçó½çë  aíÚµh4ðûýøóŸÿŒN§ƒ9sæÀ¶'®ãnéYS„OUˆ—ËeÜyç°,«G & ¸\.d³YÔj5ƒÁžãÞxãžûšl [âŸþéŸäïÆôõõáG?úŽ;ýž{î9@µZÅܹsñ—¿ü¥ç¸ãŽ;Ë—/‡ßïŸÒ½*ÛêQ”!{íµn¹å à–[nÁqLJY³f!NãØcÅ=÷Üó®ÏMCtttT¶mذ°ãŽ;¾ãñÜÇiˆ¿ÆÜtÓM¸ì²Ë&ý™ÊŠÛüùó1wî\\ýõ²íºë®C2™ÜêÕü·ãÆoD¹\Æ9çœ3éêèŒ3äïË—/G»ÝÆyç7Áóío‘HDöqbY¾ûÝïö$ŽœrÊ)èv»b¼W,ËÂ%—\"ÏØTQkÑ¢E0Ƽ¯UnN>ùä óû¹Ï}ðñ¼G|Ài§cÌ”Äê–hµZ8å”SÐjµp饗ö̱X€-&ósûdU¥¶_|1^~ùe~øá[•|¼­Æ}íµ×²¬w%æßÍfÏž«¯¾¯½öªÕ*Ö¯_Ÿýìg˜={6®½öZüó?ÿó6¿>÷{·svÞyçá•W^Á¹çž;¥qýó?ÿ3FFFpÎ9çô/¿ß… ¢ÛíNXTxýõ×ñÓŸþ–e!ŸÏ÷|¶ÿþûã•W^Á²eË&\ëè£ÆÝwßµk×¢^¯ãÕW_Å7¾ñ ‹EœtÒIøÏÿüÏžýGFF`ŒÁ7¿ùMÌ™3/¼ð*• ž~úiì»ï¾¸óÎ;'\P'êQ”)Ç<Ž9æ<òÈ#xüñÇñ /àñÇÇ]wÝ…ÿ÷ÿþ>ÿùÏã†nØêóšÿ¿BÊt–mµ, >ú(,X0éç‹-zÛr™ä¬³ÎÂ×¾ö5<òÈ#Øi§ðè£âüóχ×ëÝfc}æ™g¦¼ Ír™“­,Çãqì½÷Þø¯ÿú/¼úê«øøÇ?Þóù'>ñ‰ ÇPÜmnx¼¦ë:[Ëd㢸ÛgŸ}&|FµvíÚwu½n·‹SO=O=õN:é$\xá…ïê< ®ºê*üà?À{ì1á{ðæ›oâ†n˜ð}½ä’K¶ÙõK¥~ö³ŸÁëõNêÕ|ì±Ç&”.ž5kÖVy@7ç ƒêñ´øý~wÜqØÿý±çž{â¶ÛnÃÅ_<á{ó~’L&‘L&§´ï…^ˆ+VààƒÆ÷¿ÿý Ÿ_yå•8ðÀqÅWàÉ'ŸÄüùó122‚•+Wb×]wÅ /¼0Á;ã÷û·èé:ÿüó{þ½Ë.»àòË/Çàà Î;ï<üë¿þk†¥‘S©~ñ‹_ öÝw_Üu×]Øu×]±|ùr|ûÛ߯ààà”îYÙ¾P¢(b\.þáþAB£Œ1¸óÎ;Å`?æ˜cpÔQGmÕ9é¹Èd2²m``zÜð[‚û8=SÁ¼ËþNN;í4|ãßÀõ×_/áhgžyæ{>¯®z:½[‚+©[úšÛ'[}ŽF£¶1N¼ÓéLm°S OËu¶˲&]}æ¸Þî³Í½IS¡Ûíâ”SNÁŠ+pÒI'aùòåöÙ|•|s¸}²ù|/\}õÕø—ù|ìcÃ>8áü«W¯Æe—]Ö#@èÙÚVã^¾|9jµN>ùäI ìG}tBÞÃÁ,d[ÎÝ;ì€Ã; ·Þz+~ýë_OI€Äb1Œ¡X,ö”Þüúç_ûY_tÑE¸òÊ+144„{î¹Gò@œì±ÇxþùçqÙe—áÀoû[̘1_ýêWñ™Ï| ,@__ß»º¾“3Ï<\p^|ñET«UÉ9á½}úÓŸñA°ÿþûãá‡ÆsÏ=·Ír¯”‚¥(Û–eáøãÇ\ð®byÌþûï/Û<ð@cðàƒ¾ãñ>ø ,ËÂüùó·úÚï•T*…cŽ9+W®ÄOúSpÀØc=¶é5øóT’aiÈ Oú9CÛ>(=:,ËÚb/•ÉDWh·æ˜éf||'tn¿ývœz꩸å–[&ûƒ˜9s&*•ʤ½<þô§?˜<ÏàÝrå•Wâ+_ù æÍ›‡‡~xRƒóàƒF·ÛE§Ó‘ç|ï¶Ûno[°b*ãfòù¾ð…I?¿ä’Kz®ßétz~÷0¼h²1t:¬Zµ n·sæÌÙâœpq¤Z­Niÿ·»þðð0ªÕ*vØaÉgøÈG>—Ë…7ÞxcÒ&‰ïåY_pÁøÞ÷¾‡OúÓ¸ï¾û&äw8™={6n¸áÉOyã7°xñbÉýØ=8|>"‘€ÞùäœmIdQÈÕëõ÷<åÉ EÙá([ëUÁO~òX–…SO=U¶üñˆÇãxöÙg'T^qòÀàÙgŸE*•ÂñÇÿîÿ9묳Ðl6‘Íf·ºZÏTøä'? c ~ùË_¾ã¾{ï½7Œ1“vÖ.‹xñÅá÷û±û§1Ù¶=-ÞŠD"1©¬ÛíNš{A#e²c^ýõ-®0OívÇ<î¼óNœ~úé¸é¦›Þ6ôÕ…~õ«_Møì¾ûî°iÅx[°dÉ\xá…ØgŸ}ðÈ# N¿«ó0üoó¨T*xâ‰' ñÉO~rÒãŸ}öYüþ÷¿Çn»í¶ÅÉwâSŸúŒ1“ÎÛc=†Z­†ùóçOê ˜Œgžy¦,XÞîú“=7ŸÏ‡¿ÿû¿G­VÃý×MzŒeY[ý¬Ï=÷\,]º‡z(î¹çžwÀ½|ùrX–Õ“Pþnyíµ×Ïç‰DzÞ1zÕ_zé¥I{ùå—`‹ +Eû€(ʇÛn»Í<ðÀ¦ÛíNølÆ Ò\kÅŠ²ýú]¼øâ‹fÞ¼yƶmsä‘GNøœõò3™Œyâ‰'&|þÄO˜t:ý¾4"|衇z¶ß}÷Ýæ®»î2FC¶½þúëÛ¤H6›5±XÌø|¾I›‹­]»Vþ¾zõjãõzM"‘0¯¿þzÏ~_þò—eYæ _øBÏö·«×¿¥Þ}}}úi8Ç0YÎÝæóŒÙrÿŽÏ~ö³“ö‚Y¼x±ô#qž¯Ýn›X,f‰„•íõzÝ|ö³Ÿ5–eMÚdKýÞ®¯È–îsK4›MsØa‡Û¶ÍÙgŸ=¥c؈p—]v1ù|^¶¯ZµÊ$“ÉInÎTú€\vÙeƲ,³ß~ûõ\çÝr衇Û¶ÍøÃží\p±,ËœsÎ9[<öŒ3Î0¶m›+®¸â]_ßÙˆð¹çž“íFÃpÀƶmsÇwôãÜt»]é…Òßß?iÖÉXµj•4"töŠÉåræ#ùȤo»í6cY–9ðÀ{~<ûì³Æçó™ ×Ïf³æÕW_5ÙlvÂÎ<óLcY–9âˆ#zn‰f³9é~—_~¹±,Ëœ|òÉ>«ÕjæÕW_íi¶ÈûÏårö‘ùÿâ¿8áó½÷ÞÛØ¶m~þóŸ÷lÿÉO~b,Ë2»í¶Û¤ÿ)Š1Æhˆ¢|yæ™g°téR àÀ”U¨U«VáÞ{ïE£ÑÀÑG=¡´"°)füÒK/°i8›ÍâùçŸÇóÏ?˲ð¹Ï}×\sÍ„ã-Z„b±ˆ‹.º ,ÀÐÐ>ñ‰OÀ²,<ÿüóxä‘Gàr¹°téRœrÊ)Ý xŽ8∿ڹS©n½õVœp X¸p!>ûÙÏbÞ¼y(•Jøýïµk×âÏþ3`çwÆ•W^‰/ùËØgŸ}ð?ÿçÿD&“Ác=†§žz {ì±þÏÿù?[u}3‰WëÓŸþ4n¿ývuÔQØgŸ}àñxpÐA½ëë-ñµ¯} ÷ß?Ž:ê(œxâ‰H&“xòÉ'±zõj á±ÇëÙßívãüóÏÇå—_޽öÚ Çs ÆÇÇñÀ`æÌ™[Ìšì·5_øÂðË_þ™Lƒƒƒòp244„ƒ>Xþ}Àà /ÄW\yóæáøãG«ÕÂí·ßŽB¡€«¯¾zB)ì×^{ ßùÎw`Y–ÜW>ŸÇ¢E‹dŸïÿû’[±lÙ2\rÉ%p»Ý˜?>–.]:a\[›àýãÿóçÏÇù矇z»ï¾;ž~úi<ú裘;w..¿üòI+—˸ýöÛáóùpÚi§Mùz›‰DpÝu×á„NÀÐÐN:é$$“Iüâ¿ÀÿøGœp 8á„zŽÙwß}ñ±} {î¹'fΜ‰b±ˆ'žx/½ôB¡n¹å– ¹ [bÖ¬Yø·û7œþùø»¿û;œxâ‰ðz½X±bÖ­[‡¯}ík=!§pÒI'aåÊ•¸óÎ;±÷Þ{ãÈ#D6›ÅwÜn·‹ë®»nÂõøÃâ²Ë.ÃâÅ‹{ªW]z饸ÿøƒAÌ›7ßùÎw&Œq¯½öÂÿøÿCþý§?ý ,Àg>óÌš5 ív=ô^zé%tÐA¸öÚk'œãÙgŸÅÂ… 144Ô÷Øcá‹_ü"<ð@Ì™3ÉdkÖ¬Á}÷݇R©„}÷ÝK–,™p¾eË–ahhÇwŽ<òHìºë®xùå—ñË_þ‘HDÊB+ʤ¼ÏHQ”¿k×®5?þñͱÇkæÎ++ò3fÌ0‡~¸¹õÖ['óè£Û¶{~‚Á ™1c†9øàƒÍÅ_l~÷»ß½ãµ_{í5sÎ9瘹sçšP(dB¡Ùm·Ý̹çžk^{íµ­¾—¡¡!ãr¹¶©d2^ýucÛ¶ùÔ§>Õ³ó²ùöwâøƒùüç?ovØaY2×_ý„}xàé„î÷ûÍ.»ì²ÅNèœÉØ’w`ddÄœrÊ)f``À¸ÝϫW¯6¶m›3Î8£ç˜ÓO?ݸ\®-z@lÛ6—]vÙ„Ïî¾ûn³ï¾ûš@ `Òé´9ùä“Íš5kÞö|K–,1ýèGÏç3;ï¼³ùú׿nêõº™5kÖ„ÝïäÙÒ¸¶tŸ[‚ž¦·ûÙR÷eË–™ýöÛÏ„ÃaFÍÂ… Í}÷Ý7龓}ïœ?›ÏÙâÅ‹ßq\SõÖ9Y»v­9ãŒ3ÌŒ3ŒÏç3³fÍ2^x¡t–ŸŒk®¹ÆØ¶½ÕÏ·Ä“O>i?üp“L&M04óæÍ3K—.tý¢‹.2CCCfæÌ™&˜P(dvß}wó•¯|ŬZµê]]ÿž{î1CCC&šp8löÛo¿·í&ÞétÌ•W^iæÍ›g‚Á I&“æˆ#Ž˜à-!|v›¿Ÿü=õv?›{îFGGÍ©§žj>ò‘˜`0hb±˜9à€Ì5×\c:Τ×ßÒï²ÿþïÿ6‹-2óæÍ3étÚx½^“J¥ÌAd~ô£™v»½Å9X½zµY´h‘™9s¦ñz½fÆŒæ´ÓN3üã·xŒ¢cŒeÌ4,%)Š¢(Š¢(Š¢@“ÐEQEQE™FT€(Š¢(Š¢(Š2m¨QEQEQeÚP¢(Š¢(Š¢(Ê´¡DQEQEQ”iCû€(в]Ífqÿý÷cÖ¬Yï÷pEùQ¯×±zõjzè¡ïº+ýÊûþà IDAT{aÍš5Èf³µó§Óé =lå½ DQ”í‚ûï¿§žzêû= EQ>ÄÜ|óÍÓÞhuÍš5Ø}÷ÝQ«Õþj׃xå•WT„(Û  Š¢lÌš5 ¤Ku.—ƒmoŠBu¹\h6›‡Ã…BÈçóG$A£Ñ€ßïG£Ñ€eYp»Ýh·Û0ÆÀãñ Z­¢ÓéÀ¶mx½^øý~@­VC8F»ÝF(B£Ñ@©T‚eYh6›ƒ¨Õjðx<ˆF£h6›(•Jr-—Ë˲àñx`ŒA»Ý†Ûí†mÛ0Æ ™LbllLÆ ‰DP©TÐn·@Æàv»Ñh40>>ŽJ¥"çõûýèt:h·ÛèïïG­VC£Ñ@·ÛE<G³Ù„×ëE·ÛÅøø8Œ1èt:0ÆÈ| ™çP($ûضP(„ññq´Z-X–…V«ò9D£Q´Z-4 ø|> ˱Á`>ŸÍfSžç¿V«Áëõ¢^¯# õŒ“ã©Õjp¹\=÷\«ÕÐjµä9»Ýnt»]ضz½ŽN§ƒP(„jµ*ï»:sL¼v»f³‰J¥‚ÁÁA4 x½^4›MŒÃçóÁï÷#ŸÏ£ÛíÂår!È|p.Êå2jµ\.ÀãñÈüy<´Ûmt:£ËåB§ÓAµZïÿl6›èv»ðz½ò¼^/|>²Ù,"‘Úí6ÆÇÇ1>>.ïŸmÛò¾Åãñžyظq#b±B¡,ËB½^°©³}±XD·Û…eYò,ëõ:ºÝ.|>,Ë’ñr¾kµÜîMæˆmÛr¿ápù|Ñhív™L£££°mårY¾sNGö·m[æÇƒp8,sÇ9p»Ý¨T*0ÆÀårÁëõJ¥"‘ˆÌA¥RA0Äøø8lÛ–c9V¾cÿýßÿK/½T~ÏL'ÙlµZ 7ß|3vß}÷m~þW^y§žz*²Ù¬ e›¡DQ”ídýèG1wî\T«UÔëuض-©ÏçC(1¢ŠÅ""‘,Ë‚eYèv»h4h·Ûb@ÑÀ§!4>>ðù|(—ˈÅb¨×ëbÐg³YƒA!Ífñx\ÎW­Vár¹à÷ûQ­VÇÑétÄà¦ašL&`Û6b±<ŠÅ"\.—ÔK«ÕB»Ý†×ëE¹\î1º»Ý.€M‚¥\.# X,б»ãŽ;¢Ùl¢Óé€Öív~¿­V ñx^¯cccp»ÝbÄ»\.¸\.™ŽÇi€Æb1”J%ø|>4 D"|ä#‘yÏçóðûýÈf³G @£Ñ€1±XL Ãp8Œ‘‘1i„v»]„Ãa D£Q1(;,ËB8†ÛíaC‘Ôn·aY‚Á O˲Ðh4d¬±X 7nD__ÆÆÆ …džêõº¼w^¯WDÏçƒËåB·ÛE4•{眻\.9ù|‰D…BAÎ×ívá÷ûQ©TD(rÜÒ­V ©T Ýnù|@@ÕjUÄk8†ËåÂàà ªÕ*¼^/òù<\.—óÍfSÞ­ááa¸\.d2¹ß[·Û-‡óîñxÐét0>>—Ë…H$‚r¹ ǃ|>p8,ß³t:b±ˆf³ ˲‰DP­V1cÆ ¸Ýnx<t»]¤R)šÅbQDD0D¥R‘¹òù|—÷»Ûí"™L¢\.Ë\u:x½^ù>›ÏE‘GáT©Tàv»åwßån·+íý ïœ;w.öÞ{ïm~^íW­ü5P¢(ÊvE·Û•ÕS·Û-«±étápk×®ã8 Éê) %òÆض-«ø4hšÍ&úúú`ŒA½^ÕžŠÇŸÏ‡Z­†D"f³‰v» Û¶‰D066&ÆW+•Š\Óçó!¢P( ‘H Z­Âçó¡Z­Â²,  Z­ŠØ‡Ã"(êõ:Êå²xH<Ž—«Â.— «W¯F"‘׆á¾¾>Ôëuñ„t»] Ê=U*Ôj51ÞmÛF*•B«ÕB>ŸG»Ý†Ïçƒ1Fæ|||\„Lë@@ÆP*•H$Ĩt»Ý(•JˆÅbâ Àôz½bpRz<T*•a …äs Š•F£!Bj||ù|^<_g«Õ‚1FVÜé91Æ Ñh £Ùl¢ÕjÉ{AOùX,—Ë…D"H$°mcccH&“¨×ër~ŸÏ¯×+¢¸Z­Ê{JÏžÏçÃÆaYâñ8êõºÌ}£Ñg¼åAk4( =â‹^·ÑÑQ!¼v4E.—QÂû ‡Ãr,ï‘bµ\.ËÜуçñxä»:00€õë×#™L¢Ûí¢^¯cÆŒâùG³ÙñÁqrÞ[­J¥êõ:‚Á êõzDzÕj!¢R©ˆåâ•Ïço·¹Ýn¹'EQ¦Ž EQ¶+h4´ÛmƒA 7bèR8°É°m4H&“b´Ó(-•J"Âá°ˆiôbT«U$ YõnµZhµZˆD""\<ž™LFÂŒ|>úûû{¼-4Þûúú022¯×‹D"h4Š 6Èj-°Éxr^kxxét###0Æ  ‹±–Ëå‹Å`Y–x‚òù<Ün7Êå²ÄFCŒèp8,†9æ`ÆŒÈçó"Þ8ß>.a(B¥RA©T°É.•J"F(Èè=¡¸¡‹ÅDH0t‹!A¥R ƒƒƒ¨Õj¨×ë(•J¨T*H&“¨Õj(•J"èõ  ët:ˆD"òŽP4ÑSÆð9ŠÉn· cŒÜc:Ÿß) €N§ƒ`0c Êå2Òé´ˆÐd2Ùãu ^†±±1ô÷÷cxxXB÷h8G"y—èÙáÊ>…ßï‡ÛíÆÈȈx°ºÝ.Z­‚Á ˆôL&ƒZ­&žŽD"‘‘´Z-¹†ñ†B!„B! íÀøø¸$Q;=,.— µZ ¹\À&¯C8F¹\ÆÈȈÌ/ÇÇE ?†,F£QIünÕëuùnƒA”Ëeø|>ƒA[Õjn·[?ç÷´V«É;ò~cŒù«!WÊ_ Š¢lW0~›!ñx¹\ápXŒz3úúúÄ€chC‰h”ÒÐ6Ê4x¹ NC;¢X,"£P(Hì»Ó0bxH¹\î c ƒ(•JüÇœ†”J%Œ¡T*!™LŠÇ…qìÁ`ÉdRÎÉ%Þk­VC¥R‘¹`. Ö\.'a_4ÈšÍ&ü~¿ˆ·Û-¹/ôðzô~ô÷÷cttTÂŽx>z#:Ž„°1Ÿ…Æ1á3i6›’G@áH$d~FGGeµ†3ú"‘r¹œ„Iñ>HNA©TêÉ%h6›bP3¼ Ø$.Ýn7¼^¯ˆ™Z­&á_4²)†‚Á „y<ƒÁž:ІV«%Æ3ß¡V«%×eK,Ÿ# v˲$ìnpp…BAr‘èiã3°, ™LÅb¶mò,ñîñÅbQž;…4ß#†1:E5ß>3z+8/ m¤Àà=Óã ƒj6›òw¯×+9Eô†t:øý~4›MÉ[aÞW«ÕB @"‘Àð𰌑¹> =Ëår2Gàæa\Š¢¼3*@EÙî ¡\(à÷û100€`0ˆ±±1 ωÅb²âNÐh4022"+Ä^¯¥RIþ¤Á[«Õ$Wcppårk×®#4 ‰HhO.—/ _`“Xâ9i\1™šFV>ŸG(adŒA:F6›•sµÛm¸\.¤Ói1$‰Éétù|^惡'4âÊãv»±víZñ,0¤‰yL f˜½áp•J~¿@ƉñwЦF£U«V‰'¨¯¯Oº8¸ô*Y–%±ýô˜Äb1yL,îv»’ÀÌ]Êô@ùý~;ÎLj·,Kž³Ó+âõz‘Éd$¯‚F.=\g=5>ŸO¼¼GމbƒÆ1ó,œ‚„×o6›’L^©T‰Dzõ)Ú8îX,&a`FC<|W,HÀy ¢§¥ÑhH(ÇÂ=Ž1 ¢P(Hˆßk§w„¹,ôR9ÃÝn·äT*ñ€ŒŒH‚?‹Pˆñ;P«Õzr¡œ+úÌ»‰F£€jµŠH$"ÂŒï¿ûΟf³)û1äýD= Ê  Š¢lW8ó)‚Á ºÝ.²Ù,2™ŒÄ“3î›+®Ñh£££ðûýb 3¡Óé ›ÍŠAÏDXR­g||¤rP>Ÿ áaµ &›;ιÚÏdu´>Ÿ©TJBw¸ª\©T¤²–ÇãeY0Æ`íÚµâÁ`8Ôøø¸ˆ*ƘžÊU>ŸO¼'ñx±X Åb±X 6l@<aÀUýh4 ŸÏ'Å€xr¸ºLC¿Ûí¢ÕjI. ç’·, N###ˆD"Èçó’w@+ü b˜sI˜{ãA «¡pbR~,£˜ †çµÛmI¢f>F<—p·Û-•Ñø®1´‰«édœs̰-V=•ci`Ó£P«Õ Eà°¢‹8 yŠmzø|éé ¸£ç…Ï$KxW½^G±XÄàà Ì%™Óz½ǃF£!b™Uâ˜cÔh4äüÌo) âÝbH½+4ôÃá0ŠÅ"J¥’*Ž›MV©óz½âj6›’ûÃ÷„aƒ ×¢ph4’ìNÏ\(ÂØØˆ'†ï=«h1÷„÷¬(ÊÔÐN芢lW0îž«÷µZ ~¿_ b(4ä*•ŠxvACF5W£ ‘Íf%ìˆÉÉ ç0ÆH~žÛív#‰H)ÛR©$v˜¯Áf®<×j5”Ëe ëb!Æ¿ d³YY]_³f›Îyèv»ÛnŒ‘ò­ü3 "‘HˆÁÇò³4€Ãá0æÌ™#9-¥RIÄ™;ÀUp®"[–…B¡ æ s0!†3ËÓ2_„F?ç™ïáô*Ðèe¬>… €žÊ`ôDQ QØU«UIŒÞ¼Œ2ïÍš5öEñBc™ï߆¼y<ô÷÷Ãëõ"™L"“ÉØ$JS©”Ìw·ÛE¡POT¡P€ÛíF,°É@O&“ò.¦R)oå^P$ðY2„Ža{}}}’SÃñ±‚½"½66Î\^ƒï >Уñ3ß&—ËallLî‹â€Ã÷Šê¿Æ¢lkÔ¢(ÊvE$½X,€ÄúÓ ƒ²ÏŠBÍfSbë‹Å"‰„¬ZÓðqãF1™˜Î•Uö£ ÕvbÛ¶äSШw°4Ö[­6lØ€D"N§#á)\Á÷x<Èår"˜‘Íf‡‘ËåL&eµ›Õ³b±FFF@½¸BÍœ‡r¹ `ÓŠv,“„i†ƒqü4X½^¯•ÑÑQƒŸÕ¿¸bJ¥dšÆ= kn£@¢—!Kþó@¢Ñ¨”U¥7†Éâ ëë듼 ¼x<.÷‰Dä\4ò¹êÎ$ …DÔÐÀü Êb±(yAœCÎÅCÌøŒ»Ý®„æÑ¸æ<ó~¸ïðð°<{zÊX²˜ÂХйJO×ØØ˜ä[07£\.‹ÁÎÞ,ñKß… FGGaŒ‘ bΜ( B†òºôÆy½^Éß`µ9†>± E½Ëå’p>~GéqÎ… ŸÃóx¿Ì5ª×ë=ëXâ„ω‚â‰Û(X˜ÇÃß š¢([‡ EQ¶+¸ËŠNn·ÑhTVC1ÒL†Wµ‰„4¾k·Û’äÍJJ\=ÍårbèÐçJ;“bé¡`aì=EWki\†Ãa 1a.=“Çã‘ó­[·ÑhÉdëׯG­VC,ƒ13gΔUi†~E")ÍÊ.†¤1ü(—ËIBzµZ•ÄúH$"÷Nƒ"c||\™Ù¯ƒán4Lâ•J¥Dð±"›4Ξ=ëÖ­“9à­bÄ(äKóR|8Kÿrå¼Óé P(  öTc¨ æT*…U«V! I~ E÷¥·‚ec (fxßÕjUª[Ñãá ƒ£‘NÛív±Ã;ˆ m·Û(•J’3ÁâÌ]aùÝX,†l6ÛS:P,1cÆ ÔëuD"ŒŒŒ ™L¢P(Ès, "@ià›„E+\ÑsGoeY"¼jƼV•£ÇÏçó‰†ÍYiÌÙ¸^0†Zù|>ñÎ…B!yÎÎuz+(^)¬ÒÅpIΑÏçå{Æ}9Æ¿Ô[¡|PøÛøÆ(Š¢L,#Ëøuæix<iPÈ$]F±XLVTi8ær9éÔMã“%mK¥ROsBÛ¶‘H$000 +çÙlõz]zÐÐã*¾Ó ÒívÑn·eeÝÿOU.—%QØ™(l)j˜â,QKñGQJ¥ÄÂ|%ñl\X©T$„bŒy}}}ˆD"ˆF£’HÎ{ãûÅb¬òÆò¶,Œ@áH±;00 b—÷Oq@ÞYÞ… úX¡ÝncÆ ò}¯×ëR¼€¿r¹œˆ0~¿€MÞTÇ¿ßߓߣ(Ê;£EQ¶+œU‡Ø¬ollLB­ŽÔív‰DÉdÐjµ¤ÊR*•’t®œ3¡\.‹qÞjµ¤Ê»u»\.är9¬[·Núy¤Ói1²"Äð!®ò³Ü'ã䈸aHãð¹ÊÏJJ4Yv”^à3gÎÄøø¸4>¤Ç%‘HÀår!•JattTB†b±˜¬x<.eaS©r¹œTTb>«/…B!ƒA i±m;í´“„±´0ÇéóùH$$o€IÜŒ»ç <ËÕ–Ëe1jy µ3ƈI1×jµ022‚p8Œjµ*=`¸šÏ{Û¸q#vØaª\¹gŽ3÷Äٲ٬$­³s·³÷C›’ɤ<§ÑÑQ bx\:–çÊwÌçóIN «DƒAiJ l C£g‹‚š&çXÙ»†ïE½? ;ã|Åãq4 ñ60LŽƶm¬_¿^ÂM%‘%€ùìéõ…Bðûý(‹ò Y!«\.£Óé`õêÕRE‘;22"áh|þÌá»hÛ6FGGE|8+xo5¢ŒF£°,KÞ-æÞ°…… §¼Ÿh,僄 EQ¶+XIŠÞVÃÊårH§Ó=eRi2yÜëõöTobhKªÒÐa•ö#œF®×ëE6›E(£•F!“¶†CCŠUŽè! AÏÜ–Í劲3”‹U|ؼ‰ã4œhÐ3Ñ› ¹.— ápXVÓá^vZç<²ù$“óiø±Q%{s4›M©‚Ö××'††3úµZ-IƦxeØÃ×(D …‚${<„B!d³Y Gb= ¼wg–æ³áse~-ßqz,È»¸óÎ;KI`öæ Ìeá»^©TP©Tzú†PHSl0ä‘^ž‡…"øoŠ;§·†ý>‚Á ˆ ¾Ã@@*Ê1'%ŸÏ‹e¾ÕÈÈÒé´Ì+Å¿³9¤³*Ó™«ó·‚¥(T€(в]zâÄéùàj2+þÐcÇp®Ò3ÿFœ3t(ˆáj)j‰FGGQ.—‰Dzº£S0T«UñLD£Q ¡bxs2™Œy>Ÿ7n°)'•JIw6tc¿ŸÏ'ÇÏïL7Æ ›ÍJX C—œ†1Y¦w‚áF £A ¥36=ÎÞLvîv»H&“èt:ÈçóH¥Rbœ³‚=J É¡ñÏŠcÎ&“4)Ä(b˜‹Òn·100 y¬hÅDýp8Œ‘‘ñ1©Üé`Eµz½.Bpýúõò>±k¶S¨y<ñÖ‚étZDM$A½^G¿„&9KÊÒÐjµÐ×ׇþþ~i8H/ñô±DC€t|§!N±I¯ƒ³I#¿3ÅbQšò{À&›¼E;Å@·Û• p Ÿb("Ëóù9=4Æd2éICQÀ2Ô»Ì aX_·Û•âC¡P}ÎI£Ñ@<—k3o„ÕÇâñ¸!~ïéÙs6|¿QˆòABˆ¢(ÛårYVŒHß g ZæC0A–1ò4ЪÄÜ †¿8›±q?õ¬¤388(}$êõ:vÞyg C¡1FCÞï÷Kœ> )ö¸àJw4•ªQÌàŠ.I¨ï)Ï‹Åäž)˜4ÌP'†³p5ÛÙù;JÅ+^§Ýn‹AK¯ E=B¬ ÆpµLžfX ¯“ÉdÉd¤|0= ÌÑ`ùa–p¥…íi$37bݺu=!kñx\<' ÎjVô(™OVwr6ßã\Q”8óJH¸çk||\<9¬&Åk±¬²³Ê{Ít»] ebˆWúÙ½œámLç; …¤âóq˜äM¯[$‘Þ!ôQL°€ƒ×ëE*•’f˜|6$lÈIçìLÏœzs¹œôÏaÈó©œ!O$tb‹•¶èíqÎ5=œÎ*vÁêlZù~£Dù ¡DQ”í VŸb/«ÎfήÌ\ùwV:0!„ˆ¥VÐ)$²Ù¬ž‹ÆB>ŸG0D0ƒÌårIŽÇǰæ‡p–^•d2)çÎJJ4¾¸’ lJ fÈ)Vð¢AÏ«P($}2ؼÒé4Êå²”/er8cð™£aYB¡È5i´ï¼óÎR Š]»ÝF&“ÁÆe•a6ôÚÐ;ÂP%æp4†é! …B”¦’,ÛJÑåLÄv6€äsŒF£=U˜ZF8>>.^%z´¸"ÏU}®öóù°Á!… Kð2¹œù.üœâˆÍšæÌ­a¯ÞC»ÆÇÇÅcEÏóuÜn7úûû¥ºÏÃÜz˜A¡HÁC Q¯×‹ÅÐétÄ3Ã6{Ä‹¼Õ´“sÌöäÞ),(èá‚3Tù;üÎ2OŲ,$“Iär94›Mär9Y|V “£ ä÷ ¿¿ùË_zªj±Ÿ “ßE™*@EÙ.ax W÷œ «Õ*‚Á ”ãeBx­VƒáM4Bé!( ’{@ÃÇãñˆ„†'KŒ2i·\.÷”ÐeÉR–SeØ Ov–®T*Èd2bLq—B+è@@Œ|æ•d2Äb11Œ)p¸ÒMc,H =°É›‘N§¥:û8°爫ýβ³,'[*•¤s:s ˜Tî4¹úÎ*^¬ å •6³ ÇqVpb®WÆéÙqV£±Jƒ“F5pÞKþre¼ÑhH(™3'ÈçóI•1Š #zMønñ™y<¤Ói¬DÆ¢Ä@ÁP©T$o‰ç¥× KèT"‘À† Ä»Â~|Ù8’]×)jRHÑÚh4Ä gH"Òé¡ãûÀ0´jµŠf³)9LôR1”Ž¡PüRàÐÓAO?gõ3¾'Nßgå9Š-zD*•JO.‰³”/C0•Ôø~±«<ßGz¢è-z¿QˆòAâoÃo¨(Š2M8Ì~‹ÅÄø¢ÌØV·âÊ- IæPˆ›ŒK6dÈKþî°Ãèë듞 ô6P °ì,ÇȸóÑÑQYõæ v ÀØØºÝ.Å`j6›“•}††t»]YÙ¦·…ýNhÜQ€äóyñò°O ûBÐHg9Yæ™0g€=½BÎ0(&;3߃+ƬXDƒ•‚Œs300 ÷ÀUwЧ`áïÆ8ÜV«%al õa‰[gHT§ÓA*•#€¼µZ ~¿_Âψ‘ÎýšE™Æç‡ûS`±ñ¥ÏçC6›•qE"$“I)m;<<,+þÌנ׆¹‘HD>«Õjƒ3\‰e‰mÛ–)ž›b¬Ûí¢¯¯O¾ ¬ÒålÊÇ~),$À÷Ž‚”‰ßÃÃÃÆÆÐDÎ)ß±±1 ·b%ª‘‘ñTñûA`ÒkÉwÙyÌÙbãAþÉs°× «§ÑëÇ÷Ÿ7JÞûÌ™3¥Œ¢(SG= Š¢lWp%“IÓ022"Ý¢iLÖj5d³YÌ™3GV]H ¼Óàp&÷2y–F1®hX"šÅøcŽßÛ÷õ€($T€(в]Á0#&³Êj†iD"ì´ÓNú;8ÆÅÓðg¬,ÃÈÈúûûÅÐe¿Ö¬6ÅÕÓH$"1òz:£sµ<›ÍJ37vg¥*–­×ë§ÏÕær¹,}XJ˜Fãû¹ZMáÐjµÏçe5™á/WÎRåìÏR¼]4ÚšÍ&úúúP¯×eÅŸ^¤þþ~ñ0±?DµZÓsÄs†ËÑhgHÅÎ9«V1Ñ?‹)—Ëɪ8“î™ÌÎm¤’Ÿ¹²Î÷ˆbÅ™xÎuæ„0y›+ü —c%5æ1_‡sãr¹0kÖ, ÃsV’*‹ˆF£òLÊǹdØŸ Å (8CÃèÝ à ž? zœ]ìi¨3§Äéu p¢HaV wªP(ˆóx<²Íf{B$™CÄãù]Þ¸q£ Päþì'â,«Ëâ ¼~w)ÜY-®V«!“Éô ÐSíoA€(Ê  Š¢lw°Äª³[5ãÇ¢CCœ±èŒýf =cøÙÇ# J³7ŠÑÍÄÙf³‰R©„P($ÆùŒ3P,áóùÇåœýýýp¹\X»v­Œq||\±ÑeI_®p d2oõlpÂLÏår’ãÁ²¿NGšÅPvò¦Î^ 4؉„”æ~\Äà•†¹0Ïá/ù‹q4^Ùlù"œæ€0¯„ž%†S±ç„óyQ 2¿¢‘F?¯IÏ löG¡ ,•JÒœ ÿ Ñqæö0?Àé!¡X`çðD"!×£§€¡Z¬ÌÄâ¤1çóÍ÷Š}2(’h7 D£QÙŸ]À=?è} Ç‡ç ¨ §€”‚‹=L(ØÊÆíÀ&±F{zÎçÆœŠ® 6H(Y¡PÀŒ3ä{Dï1Frw(,!Zôh±·ó²†Èw‹^ž=˜_ä 5‹Åb( "âøY¡Pyy¿Qo…òAAs@EÙ®`xÃdˆñÌ„rgÿgB&­ ñ¢Ð8aRt¹\/¤R)Éó`gõd2‰D"P(„d2‰n·+Õ¬"T*•P©TÄ«ÀP,†ÑÐøaø SŽ‘v‚ŽÅb"– …B¡R©TO‚º³y!“x™<ϼb±( ½ìÏp®ª;=04Æ)b¸ΦxÌõ ðx<²åLÒ&n·[ k†Ѹd,?ñXr•]йºí Kâ»@C”%W97ÎF}~¿™LF<lDçLgØCõxgn C˘8ÎÄnæ{z^h 3ç÷@áÀ@ ;æl„Ãa töÈ—¦{­V årY„1aÏ Îz½ŽD"`0(!W+«ž9›5ÒÛÇ" Ùcù_n§`à»Á0+gCO–Ã…Ïç“$}žŸßGz ø\øÃE†N§# 9×Ä«8<<,ï)=D¡PHD+E7Ãýœ¥™E™:êQe»¢T*!›ÍŠ‘ÃŸÙ³g÷tsfH†×ë•R¡À&ƒ0Êê+Ãi˜$Íþ\5 ¹NCIà4ºÇÆÆ$€$º2l‹caNÏïõz±qãFt:é]À¯H$"9-ô†0ŸÅÙ‚¡:¼Oæc”Ëeé¶Î1û|>1¾˜PMœákÕjUÂ¥²Ù¬Tåâ>Î0…4Ð}êõºÄ؉áç,%L£ÙÙõ÷lÛ¶H†Á1g…y7•JE¼GµZM*ž1ĉ^žaq¼gz˜k’ÉdÄO§Ó2Ï c¢àý1œŒ+× ýág¬>E¯½Dù|™LFr€x~æÎ²Ñ “'EàèèhO¯ ¯×‹™3gbíÚµ(‹=ùOÅbQÞ/ž“árl¤è¬0Å RÕ>4â9æÍÅ=ápXæ’×fh$ßY6$dAŠ8ö¡Pg‘€N§ƒR©$ùP|O(êøÎÒ³Ã2Çœ{§Çóö~¢9 Ê  Š¢lW„ÃaYQæªs£ÑÀªU«Ät®Œ ©ÒC¸\.‹x Q @*!U«UD£Q„Ãaär9Ù†‡‡á÷û{ú04›M¤ÓiY¥§Åëoå®P0|Œy­V«§#Ž—¹­VKJ·®_¿ƒƒƒb¸3Iœa4ô ‹`,þ°JP±XD­VC2™!Öív1sæL4 ”J%¸Ýn$ÎÐ÷›¯&Çb1IÒf÷m&ÂÓP,‹ˆÇã2'Î<æìÐÅm®Â³I³¿ ËùŽ¡R©```@V¿K¥’M®†SÐ#Â$lVxbV¤âØØ½€xEXÝkddD–è±c8½i¬ÌFÉ.ì;tšgYèh4*9¬ôEcœsNAGqI±Ë¹§`dØT,ë© —N§±fÍšO ð]aÞs9úúúDx< à/ù B¡PO®…#Å2½ôÂ1?«¯¯OÊTSä1Tx«ª…ŽeY2&z¯Êå2ÒétO¸ï©Ýn#‘HÈódÈb,±¢(ÊÔPŸ¡¢(ÛΪI\ñçJm__Ÿ$m3Fœý òÁ\†NÅb1 )¡‘ÉäevPD"²ÂÎ8~öÆ QS*•d5™ý=Ø œU| …‚xZ­–4~£aÆFxl„˜Ëå¤ +C‹hTV«U”J%”J%3WÿYQÉYÙjçwF$A6›E©T’nîÕj@‘Hét…BÅbQ„C†ŠÆÁLŒ6­bÇãq©Îµ¹‡Éãñ J.G¿xZx?\õæ|q%?"‘HÀçó‰aÏæ}L–&cccRù«\.Kˆ… Cö˜¿‘Ïç%O…cc˜ÃÅøŽ1ÌmxxX’÷W(P*•ðòË/KƒJ˲N§å¹Óø®ÕjèïïÇŒ3DL³Ú«¤ñ¢!î÷û‘J¥$Ÿ‰áEΊUô0Š^g_ §‡€ak©TJ*©Åb1©ˆÅjb ¤ï=ô4Ððd޳³<Ë+3gƒbÚùŒè™â>ôÈуÄóq¾GÔh4$…礫Õj( RÒš•ᆕÏç‘H$D$:EÊæ å³Ùô•álÛ–|¿ß/y/ô>Ñ#Ioœ¢(SGˆ¢(Û,µÉîå,QJã'‹! "K­ÿd2)ec)ZÈ :ãöid29›«­ìZNaÁJ?ápXÄP<ßYö–^za˜3222"¹%P.—188(ÍiÌV«UID§aN£Ú#â…3û.8{OäóyiŒHãUlÛÆàà $+³Ÿ ñé±`«q%ŸäÇÆÆÐ×ׇññqiøæóù$é›aZápXBçHØCj€MBÉûÄï÷£¿¿¿§rs/øÜèE è)»Z«Õ$ƒÏF+çapÀ¦•ÿ±±1©œÄýœ¶¡gô>pež¡bívÕjU’ºiL3ŽcC:šSð8Kú²|-mæ:P(mܸq»Æ÷&™L"™LŠ·Žx¾p8,^޾¾>©ÆêmHü0Ô•Õ(Z)ˆ ä¼ÏF£!¡„NQÁÅÒÀ¹Hô’±`…r¢Eï³Âó;(6Ø`”ÂÄù|¿Ñ僄†`)в]AãŽ1õ¶m#™LJÙ\æ\”J%ŒŽŽx+nž«¯ yâj4&LÓ gßb±ˆJ¥‚µk×J8¯¹ãŽ;ö„wq%—«Ã ãr®âè©fÄžLœ_·n„±b AŽ‹;“݉’ɤ$'“I1¼ãñ8ÊårOr=…ÇéìCQ*• Ñßß/9 >ŸOVù™îìNî\Afwz¿ß/y'4¸iü2±™F* eŠÎ)s<¸ðU«UäóyT*ñ ËñÌï`ž=CÌ;pV¥b¸ûr¸\.ÄãqÄãq E Éÿ¬ÚE(Ø*FeNR©”= —‚!DÎ2ÏÁ`Õjårccc²2Ïw•9@4úi|sìÇAÁʦ~Î1úý~äóyEù|^ÂÜøLXÞwÆ p¹\èïï‡ßïÇàà T¦¢Hw–+fX›³9ÇJÏR©T’d{çüÕëu4 ô÷÷K)]†—ÑsIÖèèhOsÁ@  ¼^/²Ù¬ä0q,|Þô 1Ô‘yZôš*Š2uÔ¢(ÊvÊœý8¸ÊžH$deÜÙ¤,ŸÏËÊ·³ ,i Q|ƒA‰%ãÐív£¿¿_ -_ÎVà­Äsz?X1ÉÙý;“ɈÈ0§g€„ƒ1‹Ft$‘%®šærÿ{gcû]Öÿ÷™³ï߳Ι™»ÉR ˆDùƒ„¡L(Ñ 5˜j!" Á`$ hpÂÄBX$ T#‰l‰•?„X åÞ;3gß÷õ÷ÇäõÜÏi ½Eðöþæû$„vî™s¾Û¹}ÞÏó^ÚF%Á’7›ÍÚÔœãJ$J§Ó&6§a¥™<þ¼Z­–m  ¡µZ-Û p­œÃ¢øøøX•JŶ?óù\GGG¶E™Ïçö9XâB ;>>–$z§R)KóÑìÒP\hrñxÜšlDÿ4à\¨`h¸—@@Ng«é Êçó¦+`ËÍŠ”pèqD®9[(¨i4¼ÐÕje÷ŠódÛ ¶5­VËrFxW×°¸±@,5 §+4P.ˆÇŠF£ö\¸"øÅb¡t:mà=‚y¶?ü”EèYÒI!Á…@@ûûû¶¡8KR½^W4µëêæ¢°iJ&“F1ä| žqÜÐqX#ü°‹°þZ–¿ñëz*â—_~ªbÚ& ™Lª×ëéûßÿ¾¤g(2‘HD…BÁ\y¦Ó©%gã®UG’I–·å( 3 7ïGx&“1‘¸çyÊårÖèƒAåóy›þJ2-ÈÞÞžmL8†\.gáqn’8“[h8LðÓé´)–J%›þÏf3e³YËí€ÚD#M#‰]ïf³Q«Õ²†ºS>Ÿ7 “ïN§cMïL&-œÆ7›œM@:ÞÊ™L&[Bmš\èmÅbQÅbÑo×½‹F:¹&Xĺ à¨7DÄѼ/aƒè \ÀÍf Ä ýÁ ‹Å,„O’m pß’´•Âçñslv9>Œσvµ\.M÷ÃöQ>ú žãÍf£jµj[ˆÁ``y/8x±%ChèÌ, R…ÃaÛ,ÒÌ3ÀŽÀà‘¤R©dÁ“Àu½^×Å‹-œ“óçÙ+ FF&ÔçÙ–NôEÜ€Na;;;ÄZÜ·GBùt¿®—òˆ_~ùµU£ÑHo}ë[õ¼ç=ÏÂØ>ò‘<àu¯|å+·r4øßã÷¸}ß}èCzÜã§x<®n¸Aù—yÕÇ´Ùlôîw¿[zÔ£Çõó?ÿóúë¿þëéüÜ|¦ôPkF£‘êõº¹UaµIŠ4[r¹l±4’ü>‚dè6ÐGhªhÎ)^G†‚øù|®jµjÇ;ŸÏMÌLA©T2ê T„ͤQÓ„»”)2C$™Ö…m¢úN§cüöT*eУi€ž ¨¥Rɶ='@÷€g0—Ë)kooÏèp€oèyÐ*Çã±mÜÐ~aI;燶 Ê}rA?×€¥‘¾_~ùuõåS°üò˯­j6›zÛÛÞ¦óçÏëÆoÔ—¾ô¥øÚX,¦}èC[S2D¸n}ðƒÔm·Ý¦—¼ä%zýë_¯/ùËzík_«Éd¢7¼á yLo~ó›õ®w½K¿ýÛ¿­_ø…_Ч?ýi½üå/×ÎÎŽn¾ùæ‡u~ÙlÖ¨JLѣѨr¹œZ­–:Ž5®èþ=Y.U‡ÆŒí ´!´nº8p&«PV°úÄ©‡€>ìUÙ¢°ÙÀˆ‰2´"h2viži²hŸ+—Ë©ÓéH’m’ÜãÌ ÍUŒÀ ç1Ïóì;CH ›"]ÑIáh‡ÑÁ†€<×P€ï;`l:Zl5£Ñ¨YDcÀp­Ë§`ùu=•@üò˯­ÚßßWµZU¹\Ö7¾ñ =å)Où¯ …BzÙË^öCßo:ê-oy‹nºé&}ò“Ÿ”$Ýzë­Z­VzÛÛÞ¦W¿úÕ Z¨££#ýéŸþ©^óš×èÏþìÏì÷ŸñŒgè oxƒ^ò’—<,úC§ÓÑ™3g,WZM¿ß×l6³é,.=Ð`È@«AÓÁÆa/Á‚Ð^‹…Ž•ÍfÍ úâçJ¥bT#À®SGGG¦Ó©öööT«Õ$]Ñ;ð^¥RIóùÜî Ö0efë!]IO$v Êå²:Žz½žÙ•¢{áÜiÄ4„ðïçó¹*•Š5‡GGGZ, =!@§!„îâyžºÝ®ÑËàìcm‹õ/6«Á`П …‚1(@4»’´»»ka‹étÚœ¾ uµÛm~l³ !M&“-j÷ =n\áiÀ9®1÷Ñ 4dªÎyò}@S‚3³ÙLívÛ@ ÁT_:iòy¦Ùî°¡á¹Ýl6(/^¼¨L&c ’é?€:‚X“‰Âýàq=¡©At]ÞøÎ¸“’Ì|A’Ý_(wè¥øÌH$¢Á``:¾r÷z²áä:¹Üt:mO°Áä>¥R)5›MÓÿ`áÌÐÂ/¿üºúò)X~ùå×V…Ãa•Ëå«~=ô…T_üâÕn·õ;¿ó;[?ÿÝßý] ‡CýÃ?üÃ}ÿO}êSZ.—ºí¶Û¶~~Ûm·éòåËúêW¿zÕÇ*ɸûóù\ÍfSFCõz}+Í|6›ÙÔ¼P(Èó<˜e*´hP¥RI’¬i§P 'Ø 2ÁhlPÐ1 ¥8>>V"‘0kàT*¥Ë—/[ò8oxùˆÇ—Ë¥ ßÙnÜ›ióx<6Ñt½^7zJ·Ûµ)}«Õ²ép.—Óîî®òù¼e§|˜¸æÍ3Äà ¶³³£b±hÍ9Ók²B†Ã¡jµš¹!ôL&jµZ–N ­,“ÉlYýr¾è8Úí¶mrHèŽF£Ö¸b3‹Å”Ëå4ì}[t›ãñx¬r¹l:¾.©×ë™(ŸLœ h¶ƒ‡T*ene4Çý~ߜÈD›†.ȱáü„(žpM¨Hl_hèg³™.^¼¸•sân”F£Ñ–PÍ [?¶PÔØ’¸VÀNÇ®9™N§cŸO¾š¶üÓh4”J¥T©TÌΘAÊýý}Ó£$“Ie³Ys4ïììÈc‹‰¾ƒí&(¶&ËåRõzÝŽ ã‚l6«½½=;ïkY? ý‡¯ñë'U>ñË/¿~äÇÊd2Êf³* ºýöÛjBýÇü‡$éÉO~òÖÏŸüä'kggÇþüÕþç*™Lêg~æg¶~þÔ§>U›Íæ!ÿþ‡ÍÒöàà@ÅbQ[áxhCÊå²R©”Æã±î¹çi½^«V«i0X0à…†m¨#$wÓ0e³Y}O&5›M£‹>›ÍÔjµLË ]±ÖEPœÉd,Ïz–›¯ÐjµLÑï÷Õjµ4™L”ÏçuîÜ9#ÑhÔ÷÷÷íšX†Ã¡.]º¤^¯§Õj¥`0hàJ:Éßèt:ö¶ClpØüt:5 ­×k5 )¸b¹®BëõZ»»»*p–ŠF£ÚÝݵ õf³±F*4$è1vww•Ëå¬Qf2~A;Ô#>v§ý‘HD¹\ÎDÜ„!’hÎkJ¥’¬f³i›€([‘Z­fô*,vÙÄ‘¯°ãZÆb1Û”5›MIÚÊè ‡à|{»4Áù|¾µ­p·3±±dFó1-Uav£ÑÐb±0j×—*Œ$mѽ%è¡ØªáhƱãÇùS|ÉÁá9bËÂ@¡ßïk±X¨×ëÙÏEàç{{{’ô¿ÿ`µZ­T*•Ôn·¶C:9Ž>làÖãòD"öb±0ÝçJp!ÍŽLëõÚ¨0ù|^™LFžçYØ ±6›~¿¯\.g6¥dk@]r³ Ø|„B!yžgM#[’Ñh¤9sÆ\¬pàJ$vŸØîÏ.t­ù|n´(šòX,¦Õj¥F£¡ñxly¥R1ÚŸýý}ËZ€O0xooOñx\ÕjÕšÜp8¬{ï½wKä €`3‚ûÜ}4£ÑHù|Þ¬…i Ñ Ô‡vÃy¡U`KP*•4 ¬QwASu44öPÆ6›Îž=k™2nÂ:[f³iÛ huápX­VKÉdÒmÎñ¿k) ­ˆ¬þ˜ µÛm˸dñÄÝi6›©Óé(•J©P(@‚VvùòeƒAE"ËyáývC_ãC³âýˆ.—Ó`0Ðl6“çyf‹)÷ àx<6€ÇŸ¼Øô …‚Ñãø^ðÌ¢íaSÈp€ÏXòÏl=úý¾mj¸ü°-ðÿU]+ È»Þõ.}å+_ÑK^òýÜÏýœªÕªþâ/þBOzÒ“ôµ¯}M{Üã4õªW½J¿ôK¿¤Ûn»MårY_ýêWõÖ·¾U_øÂôùÏþïûìg?[¿ñ¿±õ³'>ñ‰?ÖsóëÚ•@üò˯©Þþö·oýûÍ7߬Ç>ö±zË[Þ¢¿ýÛ¿5q¸ëtÿ‚šñÃÊå{ßÿwùó‡SétÚ¬XóùüVàt:µIîÑÑ‘R©”ñ½¡[ôz=K2áël6S¿ßW*•²¦Ý¥‡¸<óù\‡‡‡æ0‡­Au74”ä0°}Ü09‡ÎC³ …J’e°UA Í1I'Âh‚îHA—d´&â¸G‘¸ ßÝzDÂ8ŒÍf3 k`Ñ9äóyK+_­VªÕjÊd2œ~ê§~ÊÀŠ8} °] M6…t:­ .˜Æ@°dÊd2&$‡†Ä„Æ—I8À Áä?™L*NëÒ¥Kêv»–í¤pœ–¢4Åèx¾Éç0‘‰DtñâÅ­Í‚{6[L€Ï- ÁýGo²X,ÌÙË5Tโ­ š®rˆç1fà½IŒg+‡¦‰ç‚ t)ÎËu¨hòÜ·Z-‡»T6@~6›5@G–÷ŠÏÒF ö¼¼–¿Ø’ŽÇc£)žf Èë_ÿz}âŸ0ª£tò߃'<á zç;ß©|ä#ŠD"úÊW¾¢§=íiöš[o½UçÏŸ×ýÑé _ø‚žùÌgn½ï 7Ü —¿üåÿgçá×ÿmù,¿üòëÇV¯{ÝëîVÁ IDATô¹Ï}Î~Æ4óÁj:>ä¸q‰z°ßåÏNašL&Õh44Í– Â|>·i-•ƒ¼N§£££#Úä—tdÎ 4¢_BëPR 0Ñ ’žNÓÙl65¶ÂðÈ/AŒL&-A›&ϸÿçã|„c“t2ñE< ¥F:¡Æàè4 ŒÎ´Ùl”N§mó° ‡ÃÊårò<τʑHÄ\—ÜL èShB˜ÜCÇév»*•JÖŒîííÙ”Ú¥¹÷ I:™N×j5Ûĸ] Í ‰à€`7û›^éDäÝï÷ÕívÍÁŒA:ÇÃæ$•J ÐÁ”§µ@ `×w4¶NlZ­–Qž¸/‘HÄ™îóù®¶b±XXö ‡@N6m™LF»»»æœ…‹› |>¯\.g׎í&*“É(•JÙ¶‚sFƒÃߨô²mt’ßÁ¦ - À]0«›À16Úî5GãÃwç“ï äÏpO9ŸÿŸ3@®f«ò´§=m |HÒcó=þñ×·¾õ-I'רÔ‹_übm6{Ýý‹áŽ_ÿÿ•@üò˯[Åb1£zP{{{Z­VÆQ§‹…Z­–ö÷÷è{îíí©Z­>àç$_?Ôïß¿h,Öëõ–È—&ûþöD"a“ðñxläÅb¡T*¥R©dbb€V*•2Á94h3†¹T!tÆ5)N ùfÝï÷ÕëõtéÒ%I2ñ:œöjµjºh!hØ>"‘ˆ‰„r¹œ9eM§SsZb›Ñn·u||l  Êññ±Ñ°FKÐjµÌ¦±0׆¼ 74o½^«T*õ ÊS£Ñ0‹`¨oÐà =e2¹\N•JÅî Y-È›è,°}•dÁ‹dWpß2™Œmf$Rº*’T(ŒäZÓœÏf3Û`IW¬bÝŒ wãÃus©[®¥3›%6^˜2˜Ô' Ó)°À¶Ùµõ 6ég›Â½•d›£P(¤Z­¦jµjÄÕje ¹ʉÈš&67*"T2ì{Ù 5›Ms2 …B~8Öf³i:žq®ß½n·kß+´;PÖqˆßy/ \Ç3¶”ñxü‘„þH«Z­öêíý‹¿ÇìuwÞy§’ɤâñ¸ÿøÇëŸøÄOä8ýº6å¿üòëÇVÃáPÍfÓ\¡$éÆoÔf³Ñ׿þõ­×þû¿ÿ»Öëµn¼ñÆúž7Þx£Æã±¾ýíooýüßþíßò÷ï_årY•JÅ„í7ÜpƒŠÅ¢MaiÀÉzÀ^4—Ë™ãÂs8ìØ±¢›àÏqœ¢Ù‚rpp`ÁxÒI6I¹\¶ «›e‘N§­*‹6EG€Ûš\.gal4€P­ÜÉ|"‘0kÖ^¯·´H³Îd7‘H˜ÙZ¦äü94J¥b ¿t…ºV.—m²H;Ù˜pnÉdÒ\À°?f¿X,4 ¬Á†2DŒ›zòR  ÑŒbŒÞƒ{G2;ኈêÙ`°qàÙ(‹¶ à}‹Å¢Mã¹lnØ<1MÏår’®P quâ:²ƒªT*öl±i(—˶AàZr Àq}“ɤ1×Bšgd8šÆz]¡P°M€æÌ™3ŠÅb*•JFe;þ¼3_’T.—"§,€nc€ÎX,¦D"¡R©dŽV£Ñh‹ €Híïïkß®çM°Û횃8סgr·ŒlùÞ =â™ÜÝÝ5z­ë‘â€õÑ~T‡‡‡úµ_ûµúºw¿ûÝÊf³zÞóž·õó§?ýézÇ;Þ¡OúÓúÀ> P(¤W¼âúà?ø#_¼ò5 ~ùå×Ã.Ü{R©ÔÖÏÿøÿX’¶þcòÌg>Sù|^wÜq‡žûÜçÚÏï¸ã%“I=ÿùÏ·Ÿõû}kooÏ6/zÑ‹ôº×½NïÿûõçþçöÚ|à:88Ð/ÿò/?¬c¿|ù²2 ²Ù¬Q±•“dNB8Ýììì¨Õj™Ë€…@¸|>o@LLÝ´æétªÃÃC£Ø@ÁŠf}8e†*•JØAƒ L¡‘G€ðXºBa#¬Fm BøñÒìs £ÑÈÀ@ êO„̱I‚ŠÓétì}hüb±˜z½žÊå²úýþÖ&c"ÐDS å jâl(fЛ4Ïõz]Á`Ш?P²HMwC'¡~v<ÏÓ`00÷3h@ËåÒtˆ”qÊ:<<ÜRC1ã~‹E*“ɘðŠàG&½Ö뵪ժi-ÐSôz=õz=ÛÖá &Érn`ív[ƒÁÀ÷d8Ú† ë_ì….¸wu:£P(¤f³i®_HRµZÝ¢±…æ„#Ï xœàz½ž å¹o«ÕJ—/_ÞQè·˜llƒ=i̸?ó£ü¼öµ¯U»ÝÖŸøD½ìe/3{ÜÏ~ö³úÇüGýʯüŠ^øÂÚ{Åb1½ímoÓí·ß®›o¾YÏyÎsôÏÿüÏúøÇ?®w¼ã–-IwÝu—^ùÊWêÎ;ï´ÿpè÷~ï÷ôž÷¼Góù\OyÊSt×]wé_ÿõ_õñüaó¯á”Çb1¥Ói kôÚí¶Ùî²Õ`²JÓ¸Ùl¬¹¦ts=âñ¸%QÓŒ¹ŽU4¿ÐÉ 5›M£‡Äãqsn"ÙœüIf{pp F£¡Á``®SÐvظ ›@Pxd’£“;Õç¸ÑCl6^ßpà fE ejK2™´mv¯ØØBAª°t¢ÅÈd2[Û¢V«e6ÇÊ5Ûßß·m 3ôðüÑÍt:»–ÓéTÙlV“ÉDÕjUÑhT¹\άr³Ù¬šÍ¦<ÏÛŒè/3lذÄb1sY ¶5ATΆ§,ÄÒ®ý+ ZM;àÐÃ±á‚æj”¸Vl¶<ϳ J¶2ØËn6£*ÍçsÕëuI2zÍ<ÍÜ#wkÈæ¡=Z € #׉ïÚÄøétÚ„þ€Æ|>¿µ!æÇ¦’ûìNìÙžð÷Ãf³±ï#tI´PÐ%%˜ñ<ÏŽ‹{€DWÅ1±%½Öu­\°ÜªÕjzþóŸ¯\.§¿ù›¿ù?ò“ŸÔþáê·~ë·ôêW¿ú!ß7 éöÛo×m·Ý¦o|ã{ðä×#¯|â—_~= Þóž÷èâÅ‹’ND±wÝu—îºë.IÒ¯ÿú¯Ëó<ÝtÓMúÜç>§|ä#Z­VzÌc£w¾ózýë_ÿ€÷»í¶Û‰Dô'ò'ºûî»uöìY½÷½ïÕk^óš¼öÁþƒõ®w½Kù|^üàõáX}ìcõ±}L/}éKö¹Ñ4#–¥9öŸß²4•d<óáp¨‹/n9R¥R)›¨Îf3Õj5•ËeÕëu!Ò•‰²×h4¬‚¦U,mÃs‘+fZŸH$tï½÷ÚêùšL{W«•ѵp´ÂyŠ´×È3’C .Kd«´Z-kúHצÉEd=ŸÏ·lRѲ Òé´5ò½^Ï„ó4¦$yÓhc[Ìd¡7ÇDZ U«Uhd›°Á¢)g²MˆFLÝÑ] ;ÁE íÚƒÍf£|>o[-€ï… ,T0“ɨ×ë iµZ&àÇãŠÇãj6›¦âóiøÑ$ƒA]ºtÉL Åb1ÛÀ¸(€ y"V«UÛ–¸éöUžE7y=ý ¥Ž ` p-”+2XH/§ñw5:hg˜Îc,0N•ÏçÍaŽçÓú‡B!5 Ëñ@ßÁsçZL³ùšÍfÊår–ç`åÏIIèÿ›zñ‹_¬¿øÅ[?ûæ7¿©g?ûÙ?ô÷f³™^ð‚è;ßùŽ>ÿùÏë§ú§ôu_ûÚ×ô«¿ú«zêSŸªO~ò“ksôÝï~W’¶4†~]¿å¿üòëTÕjµ2ëz½–çy6†j‚³SN&ÑØâr„~€&FÒR»Ù0Õg²Ê´ª€A6úh.®M+4”~¿¯x2™˜¸×'tÜKí^¯gî]w³p¬×ëšÏç–³^¯µ··gÇæºÁA“øâX…%.M86ý‰û^Ü ÷»5™L”N§ ì²ÝذyœL&vq ã=Ü¡@’û EÇÓh4ì¾±™À?êZQ°Öëµn¾ùf}ík_Óg>ó=õ©O}Ð×}ë[ßÒ ^ð=êQÒÝwßýuÍfó®XƒÁ@ï}ï{U,õä'?ùG;¿Qå¿üòëTU(²¤nšËX,¦l6«v»­d2i9bS4Lëhj5K¥R&ŠvM!‡.×A6'è%°¡%“#“ÉXÃeñ·›|N£ænfElF$ÈÉd2fé»Ùll»BóŠ éÔl °îekæb8- ™xŠ´\.gÍ?Ú&Õ%—&C3îæ `‚•Ë‘sŽˆä _t©vP„ølPM§SkœÑ<Јò¬ƒA µZ-IÚ~h¸O¡€Òý 8 Ôn·‰D”Ëå ÐÆ°&÷b½^«R©Øsá ÁqÙ¸ºš ×J¡€<²]HKG'Õk¹\šŽ@Á9±á CGcCânE‰„×ZÙMµÇ„€ãœÏç¶™dá,Æ5ÀÄ*çÌýëv»Öüº×Bº’÷³³³£Z­f÷ÝC 鬻v§µ~ÿ÷_wß}·^øÂªÙlêcûØÖŸ¿â¯Ðp8Ôsžóu»]½ñoÔßÿýßo½æÑ~´å„¼ï}ïÓ§>õ)ÝtÓM:wîœŽŽŽôWõWºté’>úÑ> sįë³ü»è—_~ªÂ©‡&˜¦éájµ2:´šb¦¡ápØ&þˆÏóbG m¨ßï[óÇU*•T¯×µÙl,ðìððКNރϣÛÝݵ©|³ÙÜš2$>sŒóù|«Ùc ²X,¶èLn>V´4çh`H³–d¯¥áÄM+˜àÝó< ‡Ce2£·RhRS©”šÍ¦iGZ­–qôc±˜ö÷÷õ½ï}Ïhxû‘Hd«¡_­VÖ”“iÁ¹¥ÓikÙÌçsÛ®à†+M'Ç€’$k‚Wsßk 6YGôNŠ:׫Óéh8šƒÏ›+êÎd2j4öÞ’¬YžL&*‹6•O$æâ=i6›Ù¶Œk…`= ŒßhÒl·Ûm°„ f2Ìn&` ènØzpý¤+ÎpñxÜ€FhP$m¹oñz®± |$™–'·b±hàbµZ©ßï›=2T°ù|nôAwØæÙæ3z½ž&“‰âñ¸mY u­6 ÿõ_ÿ¥@  »ï¾[wß}÷þü¯x…Z­–™šüÁüÁ^sË-·yúÓŸ®¯~õ«úЇ>d—ýâ/þ¢î¼óN=ãÏø1œ‘_„òˆ_~ùuª +R×E‡­ ÿx<ÖÎÎŽMUy=SkéJ0ͬ+²e:NSOS;™LÔëõ¶šWäœÉd4 ”L&Í1 U·Û5*I"‘P§Ó1ŠÂh¸þñx\ƒÁÀ¶<4Ÿ8%j¸€ÃÎÿ¸.¤h%?¿X,Ú¤ºR©¨ßï[Ê6€LlM†#bkܬ˜ÂùÇãºï¾û,‹¤ßïÛÖ( YS+Éhi\O¦ö4ílN˜b“^NsJ¥T­Ví™@|Œc€‚7U¾ÛíÚö‹k……/[t>8™2Óé´çѬc’@óÏÆÈ50¨×ë Êårª×ëRÛí¶iS\Sh[l‡xo(G‘HÄŽ“-@*›ÍªÑh˜ðîyž§Ñhdneè>"‘ˆ2™Œ>=b±h×Îu¹ÂA+›Íšž‰gÛ^¶W<‹üN&“1ºãz½6*%÷ƒsæ¼ùγ áùç³Ûí¶}¿]Ú! ?šÓZ_üâò5çÏŸ¿j«âg=ëYzÖ³žõ¿=,¿áå¿üòëTT@A8V§Ó1ÛÝN§£l6k¶·4ÜL™±«EŒÊd–Iø|>W­V³¦5«V«m9 ‘™ÃϹsçÔl6Õétl²OÈÓx¶®# B¡ ápht"~—f ª ôÏó¶&ôh8føòl úý¾2™Œ¹*ÑÄ H³F¿‚SÕp84Q?"×þ!ðf³Ùº†©TÊ(l4´Ptlèx?¦ïÒI> ~lúý¾¹*¡7@BïƤ·%éĉŠ€ :€ª\.àÚðŒ°Äif¾ÙlÚ9 ?j4¦‰„X&ø€UšÿË—/EŽÍ€&úÀ Àíyžm òù¼jµš ã¡D¹Z$²6b±˜èwäíÌãñج™IMw…à<l•pærÍ€2ŽÅÕe°Ùa+å âÙñLµÛme26°CÿÂÆ’<,¤Ñî² „¢Æ3ÊgqNu¢oñË/¿®¾|â—_~ªjµZºá†T.—m{À¤Á4BZøìétZý~_ûûû˜H$L‹Asãê6’ɤ‹…Q‹¢3†âÒív­g¢MSHƒÖn·Mh‹ã”à&4Hˆ¿q¶¢ÉcsÁÆG’‰Û¡ÏÀu§!‡¢FRw(²,†J¥bÍl:V 0î>\’»™$ÐÍØ$yž§jµª@ `[I6i¦)G‡ÁV®ÿx<6òÑÑ‘Ý4ªs¹Ü–•±»=a³Ðëõ …,›‚F=‘H¨^¯(K¥RvÇã±%Õ»ÉélÆB¡]RºS©”mW  E"U*›È³•"ó"‹©ÓéØD¾T*éøøØì‰Ý)>¡y€#ÄÕ8ríîîšðÞÞžºÝ®=¯’,ßÄ}6¹¯h1xîyfÈka›• @`œëJ¥Ôn·Íp§8w[GÈ£k§LÀ&B{L0; ží‡$KfO¥Rlȶ ³ °ñd;Õn· q¬Ð  "ôGB¡_~]m^Ò¢_~ùu*+—ËYs‚Ø–íM(4 Ö~¿o<(Y‘HD¥RÉìk±è$yÞ:ÍX>Ÿ7+`>—!š>WÔìyž‰„ ˆÉÀSý‰DfW¸ë6£NÇÂò®U/Ói6Ò ¨)•Jv¯^¯§f³i%®w2™T.—S6›µÏîõz.¹\?×l]CµZ5‘+¼ç;Aj;›3B-www5Mãá°ùc ƒ9$e³Y;÷Åb¡ûî»Ï6*ÐΊ҉ý.”E¾Ыúý¾i‰¸èƒx–“ɤ²Ù¬m= ~I²œ®ñ|>W>Ÿ·­ã™3gì^ ¼K2JÀÞ/¿üººò7 ~ùåש*BÆŠÅ¢5 4½4H8[ƒA•J%ƒA³Âeú g֜Ѓ޶Z­Ìnu:š“BWh/ý~߬Рªv)%„§¹¹³ÙÌR¿Òã0„&„ 7“j*è&4Þ‡‡‡¦Ç@oÈœé?›668]±ÅÐÀÿç8±ø¥i|±ß?ŸÏ5 ”J¥”ÍfÕï÷•N§Í.™Ì‡ããcI'à:×d2Q¡PÐr¹4zÑ`0°`H4<ˆˆƒÁ †R©”ii µZ­­r,—†“ÉDý~ß25 h%Øv±µÊd2¦“ˆÅbj6›&¸†ZÅsF¶@È è#c…çð x…ÂÇöÄÍó@—âf˜¸boÇT.— \Ïçó-…›þI’m< ·m6µÛmÎ âÊÅw-Æ T´F¼7ÿÏ Iž?®;$(‰œw£Ñ0ÚßÿF£aw~> L ÄwP±]ëò7 ~]Oåo@üò˯SW“ÉÄ{ £9X¯×êt:Z.—:::R§ÓQ»Ý6ÚG»ÝÖåË—m  ô-IÖÄÒ˜³¥èv»J¥RÊd2æhÅ–„doÂà\ 4*IÖÔÂM`7Ks85­I„¯^.—MœÞjµ¬Y‡†…….` ª M- /çEÎv††»ZÄä•JE–yÂÞµ‘ ‡Ã[Bhè[8ÙlÖþÚ^*•²ûÏñ²eãóɵÁ©Žm ›ï×;d(^€|Žu_ÇÇÇFUãã.v­Ë߀øu=•¿ñË/¿NUA‡ªÕjæE“‘Ëå4 ,u›&$•JiooOÉdÒ&ÝˆŽ¡Ø ƒAË»@A‡Åh¡P0±2`†F{¹\ªÝn[ƒ‹õ(ÎCˆ‚Ùf¥A“ÊæÆó<…ÃaË@ ÑÚ–6Øl6Í6¶Ñhº,òS IDATØ}6›©ÑhØäg 0ª¡¿„Ãa?^£ÑÈÞ ×h4jnn–Ât:5ZQ8V±X4Ðu||l€áùb±P©T2ûY®ÉÔóùÜDé4Ø’lëE£E§P(X8¹èE°·í÷û6yg£0#¯ƒ"<+N›žðGz×™é;iìNǶ\ëh4ª³gÏ(ƒŠÄsF°5[¥@  R©d‚pœÁø7å; ©X, á¸8lÑç¬ùwèUÒ àäs W*{?@ÞÎÎŽ´Z­ì»â:y1H§ÓZ¯×ª×ëöþoºÜz b¥Ói•Ëe£AÙFªT*šN§* fK ]'ŸÏ+¨ÕjÙdÚ„Çãq‹EKþ–d©ëLÛí¶MšiHÙvL&ü†B!³X½|ù²Ñ¼°‡å=Ο?¯|>oIîB—B\~ñâE-—KU«Õ­É0M'Ž]pö×ëµR©”m{È”@ÿ€u.´§h4jÍ) ܶžç8¡)xј:xÜÿ^¯g '™€ª`0hÇê&À³Õ`ÂÏsÀyBSÛßßW6›5cô"PøhäÙ„ñü3€¨Õj=Í©³‚Á êõºQ—§4ìlë =]¼xÑœ­ +¹¦®-÷ÉÝô°íbC&Éô)<«h¤&“‰m. Äs!c#†ÎzŸûX£ãáyw5)¼aút:573\ÙÐÕ´Z-{f‚¸}E"£õ!ºD"¦åä^Ëbò“øŸ_~ý¸ëÚï ýòË/¿þ `ÝŠæ™Æ‡).Yجf³YU«UÒÒБ @š8Îl63Á2ÿΣÝnõ'+‹i8*‹YΚ€ÑhdzDÛ® M1¶6h˜vãM 1m¯×³@½D"¡|>¯V«e”,Ïó4 ¬,‹Öt2Í Êd2Ö öz½-¡6™*«ÕJ¥RÉ®çl6Óp8T&“±í `ŠcbÓD“FµX,Ìžv8ªP(¨Óéݰ±\.uþüy5›Í­LÜ  èH2M$¹w:£ùb¸¶lsp"¹ÝR*¸&|6M2´-7;N[°$´&è=NÇÀ†»Ä0‰akÌ15›MÛø §‘d ‹ãÃ- ã€y.“ÉÄ,q¡5 $?À“í5PÆ8¶•ÉdŒª’ËåL'€ÓÕf³Ñññ±&“‰*•Š"‘ˆÊå²vvv¬QÃæ6“ɨZ­o¿\.+‘H˜vÁ°ž?Þ&§Ãáp+ÇÂÍ/À1H’MqwwwÕëõLìœJ¥,œÏX­V&P&dÏó<³y ¹gÃ@¡ß‡Ã:::2±0zšS6(4ý’Œ#OÓßétLLžÍf ¤¡Ç* êv»–LÍgÓX!:ç>I211bh¦õ8áøE(!ô±H$bÔ@ ”;¶N4ù„ê‘ÎÖh6›YJº$³¥b ‹-hihFb±˜™ ¬×k›¬…B!Û »¡1Äõ‰ @îþ:,›ˆú{½ž}–k+KÏBo$ÉŒ x.¡«!ôF/…{Æ'V*£’&žH$ì¹&Ë…Ïâ:´Z-I2¸kŽ@0'ß+¶M¥RIÉdÒ^˜ ×e6›éìÙ³öŒò:6]¸ÅqüPÕØLDüò˯«+€øå—_§ªf³™ºÝ®¹3M&Ó@F J&“F[ÙÙÙ±„lô€’š¿òzÏóŒV”w0˜Æ~y±X4Mœz6½^Ϧûè:–Ë¥Ùõ"¼f ,4CgΜ±¦“æé>¡}ÍfÓœµ «@™Áˆð8Î Ñíf³Q:6:NWh4¢Ñ¨‰„Y«B_¬×k ‡Ce³Y€—F£a"ft€²p£\Ç(DűXL»»»ê÷û–]Ñh4ìØi.]V©TLãCX ”@ Î]±XLßûÞ÷ìX¡DÑÈ#˜^˜ÉdÔn·-Oj˜tÅü€óŽF£ŠÅb¦»ðâà •Ífþ†Ý­$K–ÇEÊÕØ@Çs5:Ø>¯V«­|€š“n·+Ïó \¢éá<Ýœù|nnoˆÙù®zØhäÐP¡›bsÇ& ndÉ7›ì}y~Ù°L }A×ÃÎÕ„ñs2xØñܰB/r­Ë߀øu=•/B÷Ë/¿NU¡Ñˆ0Y' 0!I¹\N½^Ïxç4&XÂ2}§I‚;8š«–$›@³9 ¡ÁVçI¶À^•ÏãÏÚí¶}f¯×Ó`0° ùh4Òp8T¿ßßJ¢F´ Eˆ&œ?gzÏ„˜¦·×ëÙÔ € VµZµæ>„Û„º êR§Ó1A5Ául$o@À¡/ ›™ë kµZÊf³f ÀóPá^ò|\ºtIÝn×ÙF¹×šž$wKÚÚ&°ÁY¯×*—Ë–ËÁ}C éõzÊår[©ã4Ö.ÍM’m’ɤÂá°iO&“‰:Žêõºi,\`"Ét;£ÑHFÃÞ;+›ÍèäO§Sû]hMˆÛÙ|ñLe2™­íÇØckÉýæÇæÀàuÍØ8‹EÛq¸FívÛžc^φ‘L¿üòëêË ~ùåש*×:“É/Âîh4ª½½=kβ2Ŭ !€oUíx<ÖáᡎÍ5‡F4N[óùÜœ¤hÐq•¢©>880 G•JÅÀ†¡PH~ô£mBø$e³Yk ¡ÛHW²- Áë‡[|yÄ×±iàòù¼ n6íïï%‡óvEÿÌ‘}BãÍ„¹V«™‹'› Þ‡FX’Y͸¾.¤‘Ä<À†ÁåyÞ–È=“ÉØö M`¸··§T*¥T*e›éJð7ºìgqcÂOÓ,]q½âØjs}yþø,¨B™LÆ6 ÐÝÁ¨Ýéøt:U£Ñ0-a{gΜ±-Ód21Q? »T*À#“æñ9Û9Äá\7ÜàZIWÀ[?6Z+`)•JéÒ¥Kêt:Î0€nÅwc(²M$Ô°áphô­Ñhdà„ïºI¦gâx$éìÙ³¶ÙáY!MÝÝÆ]«ò]°üºžÊ§`ùå—_§ªòù¼Q§ÈðX,¦ý:88ØrÝÁ¶•É1ÓÏn·kúIFi)—Ë–íÁ„~±X¨ÝnkooÏh9õzÝšR%™3¶²Ðy ˆ$Ëå,“m[•X,f`Ï󌎃°ºÓé@ÂN˜tnÄïlKr¹œi[† …‚i ÈvhµZ¶ `j.ÉÅ¡¼ðg˜H'@ˆM,œÆØ~`ÛJÓËV .? áãñزØ”Ê+d€¶‡X}2™X> NP® +Nc“ÉD‹ÅÂ@Û šf›©ÝÝ]›4ÉýžL&öŒüpfŠD"溄# zhétÚ¶74Ñ®³=T)ŒØÌ±%ô@ù#¼[dI¶áaóÒh4Ìm ý 1ÌÜÍ¿«ÇáÞ±áḡŸ‘1R©T 0î¶óEðN¨h&“1ʦl^\+€×­,Û}>€öË/¿®¾|â—_~ªšÍfÊçóÖ(’éÀä™,(?¸e2k†¤1$茄e¶GGG6y%§ƒ H«Õ²i3MÍg6›©V«)›ÍšëÔf³Q«Õ² =üùX,¦v»­ù|®\.·¥oÁÁ7©F£!I–ÀžÏç pÑ„’u@Í„úÌ™3F]s]ƒÐ’ §‡gOúw<·ãØñnÀ)["ùx<¶ zIÆÉÏf³ê÷û¶ÕáþÒ¢?‘®4Ϥ^ÓxO§SkT¹æñxÜ€"¿ƒS·èع.Th0Е`w‹fÄž4µ›ÍÆÀ2Ï TA¦ÿØìÒ”»ÏH¯×S£ÑØÚ ¸Á‡Á`Pý~ßhGPæx¦ ±!n纸¦žçÙ& à‚ãÅ,™LÚuåÞ¸º ž}6€î9 }ŠK5cSèuéyÜkú+¶<€†€‰étjno¼Z'6-ht\“ˆk]þ¶Â¯ë¥|â—_~ª‚ë΄&¤ÑhhµZéܹsF¹ŠF£fJó 8‘d¨4wñx\ëõZµZͨ÷×8МFhN¡ÑXv»]9sFý~_ÑhÔ²V«•vwwMŒ,É(1;;;:88Ðt:5á/421°ËD"j·Û[4¨R©¤^¯gŽ\Lyi™^£›@Î&¤Ûí*›ÍZj;tš"~ŸŽÏ ›Ä ÑhTõzÝtèY†*•ŠmOÈÈ|Åãq;.®;æh%Ð6póù¼EÂsކÕÕp9?¶<Ò‰%²ç¦ÞcÉ‹îƒøÛ^ò)Üôo¶’L§Á„ Y&rž_ÏóLßÐï÷-ØßÇ[>Û4f‡‡‡FCãþH'ô;B)Iè«ÐÇhЗ«û€êÇwÔµ& ÂÆƒg‡ç ÝnÛudÓÁÖË @d{%¯Ûí*jµZ©ÝnۆÿüòëêË ~ùåש*`œ‘T£« dºIÀÍ"ééûûûêv» F÷<¸ÿŽim»ÝV*•2m ŽPÐf˜z»"cè;XÅÒ˜Îçs›ˆG"Ë‹ÀyIº²i€sþüy£ÖÔëuI2¡9ú¶BÍfSù|Þ4L¾¥íJ>ŸW£Ñ0Á|2™4× è?Ðk˜‚“³1ŸÏ­D'ÁñC…!wc³Ù(™LªÕjiµZ©\.[#M‡ûH“Ùh4,hšnP\gs´?N¢óaJãÏ7©~¿¯³gÏj<-Œ E6ív{k‚Oj:ÎRÒÉæ„‰= ŠZ.—f%ͳ|îÜ95›MF#åóyË7‰D"úŸÿùŸ­ï†.ůÓéØ5àxH<»žç¨cãáêvxÎy®Ù¹Ö·€Z²<Ï3W·Á``ß#tZ®+Æèkxvy?¨Pl7›…`ò½aƒ“ËåŒZP†r-ï̃YóbÉ‹KÙµ.ß˯ë©|â—_~ºrS¨G£‘ …‚¤“ôå|>¯ããc£ÔÐ Çb1¼Ò¼ãdµ»»kÍ.üùétjY”`0hMO>ŸW·ÛÕÁÁ._¾,I* ¦`rŒ%o*•²©µ›…€þ€Fj4Ys Ø¡‰¤E >,TJô/š?h/8.1ÙŸN§v<w]ÛTÒ§¡½ æý™È3í‡ÎD“·Ùl, ù`0P³Ù´,²6Ðæœ–…cD8Íg3)xÐp2ïv»f;͹ M5“ö^¯gן±ñ@¯BÞ 1èoñË/¿NUј\¾|Ùr©Ãá°‰„’ɤæó¹ Ÿi¬It–dÉäñxÜ@Ëó<ÕëuíííÙ6l³ÙÈó<Ó‘àæ… ?68ÓéTù|ÞžóÕje™€“­!4EtëõÚ1iâÙLÅb1µZ-Èl²H~GCEÇc{?€'ÖÇ<\3´/¡PH»»»F£ƒ"‰DT­Vmkä>;d•pÍy®.uÍ ÑôË/¿®®|â—_~ª¢1ÁYˆ¤rÜŽŽŽ´\.U(ŒÎäyž:Ž…ìIW—hà ¾k·Û–»ÀtþèèH’,£ƒ&'›Í…f žxo ›k_L-É€À‹ >מoê(ëòåËF·Y¯×v¼.ÿÞ *t¯áp8´­ úî/šÂiàip™üsÏ6›ÍøÄbNN§²ÃÖ ]¾8‰‘²ƒ@q8*—ËÙ¦ì;ßùŽöööÌÑ “´#?ã8T‘£R«Õ,øÍçÌ–ÚÛl63Ç.´/€‚1s¹œmŸ‹…šÍ¦åËD£Q ×$w…ë˜N§·¶’Íf£B¡ |>¯‹/j¹\šiA:V»Ý¶Œ€;Ï [Dò"rÛ¸€;þœ­›§ÙlfFtWÜG®s2™4Æ£ žßk]>ñëz*? Ý/¿ü:Uo¡6ÿ¼^¯mQ©TlâMãf³i[š™\.§|>o f¹\V±X4ª 6½$3Ó€õz=Û@#1,iæØ•¦Óie³YkÞid‹…jµš5áXÆB…B¬žL&-Cc4È‚ZE Ü|>W«Õ²À7ÀF·Ûµf—äqhZ¡Ù8HWšwÄËGGGF£I§Óêv»J§ÓFߢ9`G‰Dt||lšçÅb¡z½nšI6©çg³ÙÌÜ•R©”QºšÍ¦ºåriÀ ›ÍÊóŸ7ÚE6›5ñ9<¶¤@@žç™û…½)Í š(o©TJÕjUívÛ6 lm¸®ÜјãXF¼tâæ…›X<×x<Öîݮf³™iEØP,—K˜C®YL±Çã±ÑÀXD' õíoÛènLÉ9®årinRP±ÔóŒ@3 ƒ,¸OLÿ]°è¸V¼®; )‘HX. ‚wËy.iž]0‹ÅT­V JW6%„÷”Hx$`¹ÙlÚVÊÍ^ÚÅÖp H‚ÎuËhܶÐ[r¥+z2VÖëµ<Ï3Ó ôs­á<Ÿ€6™’ìYã=ÑxI20ƒ}/úéÊPÃ/¿üºúòˆ_~ùuªŠ& K¯×³íA¹\Öp8T»Ý6:ŽtÒ0 U«U ”ãÏ …‚¦Ó©5Nuà 7˜“$ã¡]%›E-™d,ÐÌ#\†—µ ¡:²÷Þ{¯r¹œMw®³QÙÝݵ©0?gÓÀñu:d’Ì–—F‰àPe¸žý~ßÜ•\G¦D"¡\.g@ûZÂåh°»Ý®%ÑÝwß}fë m 2¿ßétÔï÷U©T4 ŒvÕív5™LtîÜ9s®ªV«*‹F/#%Û”cÇÖƒAe³Yår9sÝÂÒ—k‡móAÀ!ÂxIäGƒÏ=Ç[ŠäÒK= CSŒE.Àc<+N›~#ìˆÑJ@C‚b´»»kÛ;žG¶Jäá‚ \¡ã`Û„k ƒÆS¨tl=b±˜ZÀG,3­àì~Wq5œ»‚q@ÅùóçÕét  qß œ‘ŒŽí2a¥RI¡PHÕjÕÀ —ÿgC‡½²»»Öåk@üºžÊ ~ùåש*¹pÌ™‚æóyË=€&Ŷ  Ô'7€ŽÆ~?Ý~¿¯b±h­år©v»m׊•)«çy[Á„NÇBãøŒ .l9l˜4/—Ë­ð» .˜ÓnI4ìär¸ Û’l6kÍ–K­"?MK 0kÓd2i烃]ºtÉRα¬åœ“ɤúý¾/×=—ËHc3 i6›FÉACV ù„<& •J%»—lu°eEcƒú—z½®\.gIá¸D5 …B!»ÃÝÝ] ad‹Dž Óu€^¯×3:S}̘̻Y"î”]мHè t,’÷Üsb±˜2™ŒY×N&I']\´±XÌ’ÚÓé´8žmî"~TŽ- @ ðr)‹<\÷¸y6xÃá°·tEϵ¿¿¯~¿¿•m‚]0@žççïl45š!:( %™Í0”9~Îw…m‘{\~ùå×C—@üò˯SU4'™LFÃáPÅbÑu°ÄŒàxÔjµÌ ×&5DÇù|~+¤ 5 âèJh–¡,M& :dJ -ÊåñÇãqyž§½½=U«UkÞЄÃaÓ°1!XiýxСßÀ= ‘9ŸG @gh4©X,íõzÖs­ØXIW†|× hQ¸–â±>,@]Þ»i¶y£ÑH‹Å¬vhü7›7i¼B[šÑ:nO4ñ4àP;àȯ×kÕëuSÅÐiH²–„É}¸™7Ø8Ir³FÆâkú t||¬Á` B¡ v»­F£¡X,¦f³éŒ€‚sœØÁ¹'Aœé5‚lÎ;t¾Ô›xß {Û~¿ï†òñãÇþ ,‹9÷ù|^õz]Ãáp/èðúúÚ¢ßT*¥jµªÑh¤ËËKU*ÿ>)Mj³Ù´¾'œ® E¨R©h:êêêÊ p™ÍfŸÂ=„îÚ™œÛB¡`š[4 …BA‡‡‡žô³1 :>>V»Ý¶$•JÙrK_èyl5Qè&Æã±Žuqqác }pÅö˜üŒf³é×ã`[qÿþ}ëÐHÆiÚEŸÏMQº¾¾öôž )ÚpÝ&³™XÓÄ~í"8&'BºµÇ¥idÛÁ4g/xúlcR©”톡!˜oµZêv»TŒÅbðÑÐTc9‹}/“pµ‘óÙü{&“ÑãÇ h¨Ñ- êæ½ š„*½+,ÚÇš6›ÍªÝn[ÿÑëõ|¼ÅbÑ  ?‚Ômšz2<Ð ¡á™ÍfÊf³j6›žè¶Û­:Î^–€ N’s.$™žÇ¹C«Áv í„ôÄ–™ãšÏçzôèÑ^. <[;²CÐàôûý=Cl‚ù>œcø•JÅ€l8êñãÇZ,ª×ëšN§6I¸¹¹Ñ`0P"‘P½^×n·s*|8ä“`ÀR©dÑ=çoW8ãlAcc¢ c>Ÿ›’Q«Õtqq!IkÓ@¢©€ó? H Ï^Îtœ öÁ’Ôï÷ÍŸ‡ß0Át—&¶Ñh8±üñãÇÖ½H·¹ šg6š=zdW(ѥИm·[Åb1=|øÐ*â`&〧^¯çmE2™ôç‡Zè7гàïžp¨Â ~xb‹ž¡T*™‚6›Í¬_ÇzÛÛÞæ°Bà„„vL»¯¯¯í^Åy‡Â„®Ð4T¯×½q€ÎH¡¡'m»Ýn{Ïwæ>¸äóy ë_ihUД èÆm z¶××ךN§>w¥RÉ›t×h4rSÙjµ¬xë[ߺ Úí¶i84œ„®‹Eç’ìv;õû} ²éX¯× ‚@õz]¥RÉz6ý~ßš“Éd¢R©¤f³©ƒƒŸŸ[7*•J©T*©Z­šrtttd—©Åb¡Ñh¤ ¼ÅX.—v±*‹’n9ýÒm6Ãññ±†Ã³Ù¬âñ¸ËL¹‡Ã¡Åâ4ÏØŸÆãq5›M7Í„øRÇö¹&l€àÿs]{³-BH$Ôív5tvvfÛ_j&é|·Z­f1NÕh4”Éd4 örQت4›Mo ,“üžJ¥4™L¼%™N§:==Ý’,87ËlȰ9Æ ]€®Ýn«ßïû>ît:êõz>P™Òé´*•ŠJ¥’‚ p#í7Müb±ðVúÛ „ýh†Ù³A8ŸJ¥ àƒïÅpÆ4,\àÐ<±‰˜L&¥,‹vƒÛívêõz.AØz—m Çæûj>Ÿk³ÙxZ©TuF’Þ6¼O«>÷¹ÏéCú¾õ[¿Uù|^Ï=÷œ~üÇ\_üâ¿âµŸÿüçõîw¿[…BAÕjUïÿûýwÇëëþàôö·¿]™LFo}ë[õ{¿÷{_ë¯Õ×±Þ<°=ª¨¢ŠêëPL·qhb3qqqái'Í<“õ°µ)SR6!ËåÒ)ÛÝnWAh³Ù¨×ë¹I@`‡æ"jfò.„¼I¦Œ°¡IfÊž€^{í5o+p÷ÂшÞ<âîn·k= [^'É‹ˆ’ù¬‹‹ }iîpKBØË9G¸~ïÞ=op?B@N ÎÍ#‰Û4Äa+T´Ãfdj„9ûÐçT©T|þÃÍ*Ô¬°A¹$_þò—Pɤ¼X,ªßï+N[3‚°ŸÆšôz ûý¾ilÈhŠYè…Чpž i¡Ià> j4–sg³™›wô!a@À5FÁöÓƒð1„7g¤Íó߸³2(´78µ ‡C.à'ì`ÅuÅú7¬[áš°-aC3N/srrâ{‰ha=(—ü.gÜ#h…nnn´X,LÍâïŽÿiÖÓÒ€üæoþ¦þùŸÿYï{ßûôíßþíº¼¼Ôïþîïê;¿ó;õ™Ï|FoûÛ%Igggú¾ïû>•Ëe}ìcÓd2ÑoýÖoé?þã?ôÙÏ~vo“ôû¿ÿûúà?¨÷½ï}úÈG>¢üÇÔ/üÂ/h±Xè—~é—þÇ¿cT_ÿŠHTQEuçŠà:lrƒr¹œ…¼4ŽpÎi¸háÞc'Š“6³ŽÃÃC»\år9¥ÓiA`ºÕÑÑ‘ƒ³2é §©î†KP·ÛÕv»5ß"ä0“Éx«Cè`±X´•0tI¦G¡ñÀ9ˆÏÇšÍfFÊçó¦O…EÂØ­ÒĆß!yXÄOú9[ܼ8_„ûAwC¼Ý Ñ1 8Me8©]’mtùy˜R„ƒÎE€.clp>b#HEhpp B¡`ÝKø^Àž6•JYÀÜëõö¦÷á@HšzÌz½ž5-(„üØ#‡Mõl6sƒŽù@…ûpÃýÀ¶‡ÏAEöà•{…áb±ðÖŽì^¯çóÂy"ÌïÞp a3‰1ú î.[¿°Õïv»µÅv8ÌçŠÏ®$ ëgЫ„]¿¬étÚ“¸ÎqOpŸv=-ò‘|Dög¶ ^zé%}Û·}›>ö±éþè$I¿þë¿®Åb¡û·Ó½{÷$IßýÝß­ú¡Òþáê§ú§%Ýþýü«¿ú«ú‘ùýùŸÿ¹$éø€nnnôÑ~T?ó3?£R©ô?þ=£úúVDÁŠ*ª¨îT•J%7Ɉ‘i6p¢q*—Ë~- “}¿Ð~pÑ¢ ùºzõz­««+- u:;Ñ8"g›@óX*•T*•<Á§ydJNÞ–ž‹¡“ º¼  ÇvŽ"к € M tªóós§±3AF^.—ݨÑdA ££#[Â. OÌonnT­VݰKrV¯•nu8vá‚DМôÄ! «X쀡ÿ°QÁ‚v:š"4›ÍT(4ˆ†Ï* ¦ï”Ëe•J%µZ-U«U_»^¯§ñxì- ÀµÓé¨ßï[ì<‹Åöì`¯V+Ó︶³ÙL‹ÅBËårÏ= ^­Vó–šÚz½Ö|>÷õ”ä Òf³ññnqÁBG‚³a‰h: VÇco\hêK¥’à>ê€Þï÷mJpïÞ=ƒÊpòûv»5튛I@&Ÿ=o,󆂿9l/Ì}˜†’ÇóËf¨Z­š†Ã÷8±°öè®Ö÷|Ï÷|…æ-oy‹¾å[¾EÿùŸÿéŸýÕ_ý•ÞûÞ÷|HÒþàê­o}«þâ/þÂ?ûô§?­~¿¯ŸýÙŸÝ{ÏŸû¹ŸÓt:ÕßüÍß|¾IT_ÏŠHTQEu§*ŸÏ«R©xÊOãOþw&›4%PupS‚¦µ\.5͇vB³…@]`hVlY° sìÙÒ@ÅaŸJ¥ÔívõðáCS†êõº›€ããck'˜Ó<…Åç4£›ë|M<ÀäsI„r~Âbã|>ï-Âh42‡Ÿf³X,ú¼‡ø‰„5a'+@Àƒé3"÷ÅbáïHÆD:6•Mz’¾ (”d+fÜÈx ú¶K„Ûh[pXLZH0 Å}ÂF%Nl-—K¥Ói•J%e25 ƒb±è÷©V«n õ“õÂkÑLp?bÃÞ¶pÿ°9BßÓívý]1?à@àÍyÇž—f[`¨c€n‚¡Ò‘ø FFþ>][¥L&³—kÂ?­=â\„Ãy®///}í²Ù¬ß#LyËd2:??W§Ó±Ûô.rt$y(ñfÈá|-þ÷ß©««+Õj5IÒùù¹Úí¶¾ë»¾ë+^÷®w½Kÿú¯ÿêÿæßßùÎwî½îï|§ö^Õ³[+ª¨¢ºSÅdž÷ÉɉÎÏÏ%IõzÝÜ÷|>ïé¤ïýÞïÕûßÿ~Iò„g-\œ»Åba­ÎÿISƒ'ªg¿"UTQÝ©¢á‘ä)&TÕjå† ©ã¤N°\E¸Ìô- Mš$S¶hÔ¡`…!h#L`iʃ)=p÷ɇo@F£‘–Ë¥J¥Ò^ŽF§Óqnœþn·k¡6 . ×nw›BÍVƒp¶f³©\.gÖ|>×x<Ö‹/¾¸'ÖÆÍ í Ódj½^«Z­š²„Ó€€†ºT*íe²à˜D2y2™4ŽsмX,fW$®7š¢°Ž$¬GžÐÐúð¹Øïv;u:Ó‰8Ïív[ÕjU“ÉÄà‘­ Ÿuxxh{_6 hoâñ¸œÐNd³Yõz=7Ù…BaO{ÇÕn·T«Õ|l‚²Ù¬7>h-F£‘?#LIâ¾§Ql·ë×àƒ€6Và=X îëñxlG4´;ÉdÒ™a*t®X,¦étjz¦ág½G¡PP§Óñ&™LjµZÙͬX,êôôÔB~,ž9~@=©ño Ö›¡®®®ôž÷¼GårYù—é¿kÌüWœ;^ƒþê¿*¨Q=û¨¢ŠêNéÞLŸqñ‘nÿÏ }Âp8ôD?lÉÊD{8ºùšN§ž„' e2™=q,µX™:ÄÆf4™vý ‹-5ÂûÁ`°·µ‚@…BAÓéÔÚ—N§c·(ôb±˜&“‰s)‹…r¹Ü^ú7à”t4LÛÙ´ JçXkµš®¯¯ÇÁ1±¥ön…rt!\¶B¤©ÓäB¡1çú^]]YG Éív»õ5B¸¶ˆЄCùà¿s…©U€X€‹$m¬€%¹¡Ç®]®aãñØ”>œ§ EIr29 #;TºÉd¢^¯ç÷ç»c €£436O`;ݳ³3ß#2jjµšä0m z 9ú¶(añøÞl6{±°cY¥RQ>ŸW§ÓqL.—³Pýÿ…z÷»ß­w¿ûÝ{?ûüç?¯ŸüÉŸüÿü½Õj¥÷¾÷½úÒ—¾¤O}êSzÛÛÞ¶÷çÇÇǪ×ëúÜç>÷¿ûÙÏ~VïxÇ;üßïxÇ;´Ûíô¹Ï}nïXþå_þEÛívïµQ=»¹`EUTwª3IÆÅ¦P((“ÉØŠæ“&öñãǤ± » ‡C=~üØYБhˆhvq)B#@*;NRLzq"cdµZ©×ë©Ýn«ÛíšfÂñaËd©/NsJÃÇ-\Þl6v<ÂÞ”ÍÌÅÅ…)ÉdÒy¦Õl Љ@­)‹ÊÇãqOäym2™T:ÞËpS×x?Þ3•J™Î ¡Y »”¥R)ÕëuÓå çð{è?°ãÅå‰íŽKA¨R©˜NMˆ-zˆZ­æ€BÒ¼¡Nm6=xðÀ[¯››'À×j5¾ívkû^Àtî™z½®B¡ l6k»àÕje`‰}1t'h_Ñà À–†ãc³-‰÷$ƒc0èââÂ[!´&lžÂ4,š}€1z 6fÐ ¹>aM¿ŸÉdtxx¨J¥â àƒg Ãìy%ü¸ ,ä^ã|’ÃEÞ3Låb#8º¾¾Öd21 Ó ŸV=-¬ív«—^zIŸùÌgôÉO~Rïz×»þË×ýØý˜þú¯ÿZgggþÙ§>õ)}á _ÐK/½äŸýÀü€*•Š>ñ‰Oìýþ'>ñ år9½ç=ïù¿8KQ½Y*Ú€DUTwª ! &Ð ûVš4&éLvs¹œnnnìŽDc”J¥Ì;Ç.19?Ç-t&ìb ;„>Cã4N­G©×ëÎe€_e = Óêr¹¬l6«~¿ïfY’¿ 'IviB+ÂıyµZÕ|>wÖ€ÞþÕÕÕž¶sISŠ#Òh42 H§ÓªÕj{.cÃáP­VK£ÑÈâý››µÛmŸoш•ƒ7¹\΂ô°8<<5G ^,ídU*ì8¶^¯urr¢Á` ÃÃCÓÂhŒS©”úý¾78Ÿ- •Ëå=M „É?=º—°ãY¡PÐl6³cSu®Ëh42Å‹ïÇÖ­UXøŽmbk\«¸n\;(W€RàµZMãñØ Inö†hrx]&“±µ4@Šs€^Š„t²E8oh ÂŸaŠ› îÛ°=,Pæ5±XÌ4°&Šs„‡­e8…¿cÝnWãñØîoÜGA|MÿÞz3ׇ?üa½üòËúÑýQu»]ýÉŸüÉÞŸÿÄOü„$éW~åWôÉO~Rßÿý߯_üÅ_Ôd2ÑÇ?þq}Çw|‡~ê§~ʯO§ÓúèG?ª}èCz饗ôÃ?üÃú_ÿëéOÿôOõ¿ñwú\ÿ¿T‰*ª¨îTÑXà|Õëõl¥J£*ÉÜo&«è9îÝ»§³³3OM¡·0‘¦ùbŠ?ŸÏ­³€Ã$ŸÍÈx<6?ŸÏ»iÃJ7;‘ši÷sÏ=ç<ƒb±¨Éd¢\.§J¥âæŽf•f‹æÍ Bj&Ï”%Ù éÕW_õ¹ÃZw±XèñãÇÊårºwïž)Hh0ønl–h"iZÉ I§ÓFLhpÂbçÉdb`®®®œ‘Œ&j zõz­Z­¦J¥b§'l_‹Å¢:ŽŠÅ¢ÅÛl° FWÁæ®ÿÍÍŽí:Ön·µZ­L?ƒÒÆ&œ¶Íf À ÝŒsÞëõLÄ] }¿;- .iØÝ’)3U*•4™LL­BÈÀÎ>ô(Àà•F&“Ñxî±d2©~¿ïM×ëÄyïõz*—˾Ÿ¡ýqžonn ¸Â™ ’0½wïž™$02¨×ë{{O«ž– Ö¿ÿû¿+‹éå—_ÖË/¿ü¹ÿ¾þáþAþð‡õË¿üËJ¥Rzï{ß«üã_æøÁ~P©TJ¿ýÛ¿­—_~Y<ÐïüÎïèçþçÿç¾XTOµ"UTQÝ©Úívž¨ÒÐ ê].—Fv2‚–‘Éd @àó·Z-žžJ’A*•rÐß|>·Óô&¨-P´Æã±c&¾8iÕëu7³“ÉÄMy6›Õk¯½æ¤ïpFT%&¼Ls[X—â@E‡›¦ùL„&LÌq™BÓ•.›ô4öˆ†ù>›ÍÆù ©TÊ´-é‰å-|>okX¾Ô˜r¹ìsÏyc Ý6²h-†NOO­ÿi·ÛÖH.Ýü±u)•JÞ(‘•Òï÷mB­¬Ñh¨Ýn{ûÅÄœŒ^h{÷ïß×ùù¹V«•NNN4›ÍlÿËu@t•‹­ ºŠ°53yÉdRÝn×"wî[¶+læÂÇÞP„·äÚpÌas€P6›Ý;>6aA=×Q?™-‹ÅÂt0ô;hšUÝn×ï‹;¯Á˜€‚Ž =P¦·A§K$ÇJ€[ž•p %÷|µZõó˽Î}Ž6êêêÊ?ÜÅúô§?ý†_ûÍßüÍúÛ¿ýÛ7ôÚ|àúÀ>ðß=¬¨Þ䨢ŠêNÕõõµf³Ùž0› {¸áN¥Rj4:??·›°¶ÃÃC}á _Ðd2Q³Ùô¶c³Ùh8ªZ­ºI¦ÃöTÒ‹-@½^7¸I$¶5ņ” ºpà´¢áp(IV4öL¬Óé´›>h-ЗpÑâûÇc;X±Õ ‰‡:>>¶E)´5l}%9PQ’Ÿ)4`o·ÛyÊŒ­0´0€O«Õ20cÒŒ^ ÀÑÑ‘9ûÅbQ=R"‘Ðáá¡?ƒïǤ»Z­ú3 Åá´•H$üg7ºI¶{eú?›ÍLQCŒœÏçf •cÅv6œñ2­Gj·ÛQÐòh®‡Ã¡Á+"\±¸ö£ÑÈ“dÒ¹N|¯|>ïÆ0Æv„Ïpp/¡ùÁàÁƒ”žX£ÒðKòs$É¢øb±¸g¼€+×r¹ô–J’^}õU5 e³Y ðŒ†uMè­ÈðàùfK‚¾„s‚ö¦ÙlJz’MBž ”+ÒÖù{] ¼T*éââÂçŠ{éi×›%$ª¨ÞHE"ô¨¢ŠêN"mšO˜ÂCc ÛqJ·ŽTA˜*Çuÿþ}‹‡%™ÊE% Z‰d2éé6“n’ÅٌИ3ye¢Œ-'“zšõd2©V«åF0 ‘ä CÂqÎbÊ>µX,ÔëõöÄÛ’ìÈD³F‡‡#,€‹Å^6âwV¦ì€%´9aÐÁuãû£-@,ÉT lRÃv²¸}‘Ì Ý¦P(XÓÉdL“b:ÎãÕW_U»ÝÖd2Ñd2±•,\t„Í„$¢ aÃF–3¬‹1`*_,÷‚ö ÷•Ëe¬×kŸëð1²•¹‰í;÷2t,Þ!ïx<®z½®L&£F£ap”H$t~~n ß~¿oJ=Î1âüjµªL&£Z­fá?×ð6Ú€›{%¬I¥R¦2bˆÀö„œŒÂÙ*ˆÈòDÂ`m›#@>vט´ÛmI·Z…jµj[稢ŠêW@¢Š*ª;U4¸Ü$ •J%¥R);RÍf37±XLº¸¸pðÞd2Ñn·3¦X,êøøXñx\ÍfS÷ïß·¦!6ÎRP¦àõÓ|slЂ˜W*•½í¨Éd¢|>ïI0MýÁÁ®®®¬ ÐÏ'„0µív«{÷î)‘H¨\.«Z­ŒñzÈ››žžêòòRétz/k„\šíÍf£û÷ï«T*©\.[ÿÂ{3Çz–i{¸‘G×"ɹ!èJ \…EÃüŒsE#‹<‡t:­n·«n·ë¼é–²Åäžf0$IÝnכ»ݮ$94íºÂi€+4ÛAXƒùÓv®Ím˜ÂÇ{Cíb{n–±[æç8Zqžp‹ÅB£ÑÈ¢|Çcë§AøX­V*—Ëêt:ÖM§S- õû}æÕjåó‡½q©TÒƒœµµŒlÙlæóPÆLÎa|Z"6In&qbZŽûU±XtÚz¯×S>ŸW6›Õññ±ÖJ0á(àZE³žòs>Éî@ L#‰v%åóy ‡CŸ6HaªV½4îlv¶Û­éD1h8©TJív[©TÊàŠÏÀ –sE>ƒÁ@ÅbQÍfÓ÷DX°[ô(¨S3(¡á\¥'›ÍúØxÄߨè& Íf³=£èTÜ[ˆÅw»ŽŽŽìLǵ\.Õl6½¡@ ÁæïøøXÝn×T3¨g8\\¡ûA{ê÷ûêõzÖ|p¯ÑÄ•Ëeoì'š!6\Ü#’¬â¼±¡˜L&ºÿ¾7P’|ß÷û}M§S5›M»‘qþ0 /e>Ÿûz.—K•J%2¨ip¿6 ‡a†Ï7.vo H¢zV* QEÕ*ìB™ž®V+ÙˆÉ5ô'D»de:ŒL’ópQÇÎ*ÀVKU(ºwïž.//Ýl!Ò¥A„*²Ýnu||¬õz­J¥¢\.§Gi4©Ùlú³G£‘$¹y\,êv»ÎëX.—b3A‡Æ‚9ÓzºÝ®Öëµ'<ůV«¦‰‘v=U¯×Ýœ!v‡ÒD`!¹"aZNH±XLFéñ4É›ÍFßøßèóDîîO’Ôl6M­£ñÆn—ÍÄjµ²£çs€l6kº h?»ÝÎ_ñx|/ý-K­Vó¹Dóruu¥ÍfãëĆ\þ$ùš£ØívšN§ªT*vg k*Ø(`Œ¾¨×ëYðŸN§½õǪT*¦N1é'\ÄêáÀ? TAÀ(ç Ã6llZ‰„z½ž)N«ßïûõ¸ByÞ óñÜÂ=Åõ@ -4› Îçr¹ÔÅÅ…’ɤisËåÒŸ ¸ã¢wâœA`ƒô>lpø;#ª¨¢úê* QEÕ*šIž#¦ív»RËf³Êf³Ö„ÅÇ¥RÉ“Õ|>ï :˜ù|n«Ûz½®õz­Á``~{"‘0`è÷ûN.gK¦êö¥777züø±·¸X…ƒòØ4ŒF#år9Ó˜‚ ð1ö6tssãF ‡ªÉd¢R©¤J¥â?gã‘H$œ`^­V Ò˜ücñ:NÕëõL§!áœM¼þ^¯gG/2*hœ7›êõºNOOÕn·ÝвyÁΗÆ»át:­b±è¦"É®PÅbQµZÍ PAøÇNIgÛ@ 6ÎS‰DBWWW´ÛíÖ`›åétªZ­æM[šÉd¢““'œo6ÁD"±·@ï@± O½Ã†±XLÓéÔ€ MØN˜ûˆM€– =l9ÿlvز ³ÙLGGGÞ  ¡YA‰ Sà¤'T'ž €÷|>÷³”Éd<\à÷‰„7_«ÕÊ×0¬y _g´MèÀ¸žØ‡ ÂÛ´;O³"zTÏRE$ª¨¢ºS…ôààÀSx-I{!‡‡‡Yƒb”Íf5ÝŒÑÌž'Ýf…d³Y]\\èôôÔSZéI@\¨ÃáÐÓàp¨^,³KV>Ÿ7•çúúZ_þò—MÂE+™LªX,šrÅ”ñw·ÛU¹\vÖy L…qôº¾¾V½^÷q¢ÿh6›ŽC"p:Ah»Ýj>Ÿ{rN^NC9ìU+І8ÇAwµZÍÔ0Â;4Û’œÿ!Ét'¶ÃáPõzÝç™{„í,Rï‹Å¢s!hFkµš·-èZвðïh‚Ò³©À lq 8Ã›$[쟹þ«ÕʨÉdbm 49ÌpÃn8ŸÏëêêÊ:’ƒƒSûr¹œ^xák~Øv‘]“J¥ ¥ÛƵßï+Nk::pòñãÇ{¶· ¹Úl6{à–{ á>z‹ÙlfC†ù|®F£áë pF‡Â&‡&s}‘&CžQ>0ͦ ‚Ž+ª¨¢zc‰Ð£Š*ª;W‹ÅBNÇÓM¬')\È‘“7Â1ÐÐ÷û}]\\HºµS††¶F~™\¯×nÜlÊca 8&½ñ~<·Ÿ NØMŒF>Ÿw";v×8kq¾ùl4A¸_ŒËå²7‘Øgù^777zþùç•Ëå”Ëå¼™Âe‹óšH$T©TöœâžVE"ô¨ž¥Š6 QEÕ+t¤[g³YÓ²ªÕª'¹$¦Çb1 e2år9SHö&[ƒ‰)›Ü~pÍâ5L„¥Û‰k¿ß÷F†FîõM M%`‡MÁƒ lêõºu 2!§i‚Ž­ªÌh4rH ðá„éËË˽m VÂ$›#4—n›XÉs¹œs6$9Ý @£å-óó™ËÕj¥étê­.PØÀJ2] Zö LÝᙟœœ8¡z³ÙxrJÓɶ>9BvÜ3lpÜÁ™‹u:îÛA%¶Ón·•Éd¼É`’+ÉBqè.ä,Ð8"Z_¯×zøð¡ŠÅ¢ªÕª54»Ýn$\;ú‹/¾èæóÇ9h6›+d#Àw$’âMCH6Ú þóÌæƒ¦¦s½^›^Òé´^yå•J%‹EkNÐzpÌè aS ]Ôs ¡±)ÁÅj6›¹¹î÷ûªT*n²Ñ_0½Ç!õû} ÃÙv°…@bžÄCybÒ®÷b±°€ºÖf³Ñv»ÕsÏ=§ËËKåóyµÛmycG`XÐ §Qç Ðív«““-—KµÛmoôÜçr9»Oá|FÀÖÖXb“ÿ‹Åì¸%É`€Aa¯×S¥Rñ5ÉårÞ †i†Ü? $yÓGÂ= 3,©ß,6¼QEõ¬T@¢Š*ª;Uý~_ßôMßdNãñXA(•J¹a!yñk:¶¾ƒMD&“±†„&-ŽEý~ß”“V«åM||hYL„Ñ ´†Ãà`óËtº t.¶5'''Ntïv»nž µÐÀÑÐN§So?&“‰^}õUoHmçØ ­VËÖ¼pÿ·Û­ma°È´Ý–®'''Ö½–ØÐ²Á€³þa~"‘ØûRÒÙ†d}ïÞ=Oÿ™–c¿œJ¥Ôívuttd©åri ¡vœZ“õzm}JX\Í&­Éf³1n±XØìàúúÚ¹a›eRºÙ’ð¹<°È>l=Œ«ZØf˜É>ãñØï»ÙlôÊ+¯˜¶V*•üÙAh±Xtô WrØŒV¸¿Ù’ Ëᜰ1‚&W.—ý9hPØ’á Ç& 9–¼Ðä¸~áMV,àZ…fˆ÷g;7™LÔétœªǽ‰$k$ü=ØÂ<ÍŠ\°¢z–*¢`EUTwª ¨ FÅ͉FŒ¦ ç(Ü£æó¹Æã± …‚ªÕª›} p“ÝëõÔét4™Lœ¥AcÅv·¢ÉdâÉóáá¡uÂÖ±L³Ëå²âñ¸íeiÞ=A—dÑ:bê^¯çæ ‚t 8ÈÏ ì±}2™T©TÒsÏ=ç| ¨TlM’ɤêõº†ÎÎÎì–DÓE,Ó{G,PɲÀak½^+™Lj6›yâ>›ÍÔï÷}¤s,L°Ñ „MÐ#ÜÜܸù%K‚?œû¨^¯›ÊXB/¯Ç‹;t±R©äM ÉåÜSкŠ4ÎÃáPãñØÛ 6|6Í>›ÀÎãÇm€¶pŠÔ@îY€ÿÄn:•J퉹ѳ°i0à3™Œ·lW`$¼£Õ¸¹¹Q±XT2™ô}Þæóy5 ]__{Ó‘Édœ<¾\.uyy)IÖq!GOĽ‚Õ29À˜Ïæµÿè!hŽqÐ`Jr‚=÷È /¼`jz ¨\$ƒ#¶F“€®íb~¶5̳Ù잸~½^[ûÄÍa†ÛíÖîkÓéT“ÉĨGí¥|s‘<].—”“}¥1?Ï׃`?7ÏïC‚ú|>×£G¬©ÂF½ 9=ëõÚïÅv’@D6"á<–ËËKÓ&±mÆ… ]K½^7¨áúÄãqF#ß'áH *é?íŠ4 Q=K¨¢ŠêNÕññ±§üëõZÃáPÓéÔS^¦ä777*•JJ§Óººº²m/-S8D°R©`иÁS§qsÅÃy8UÀ†­/º\ŽØ ^«Õ-f¡ ± EÏÚú—\.§Åbá­En “Cà‹¶àu}}­~¿¿—Ñ@“Œkn\d>@C:88Ð`00`#gsËå4U(l;Ì4úððÐz œ©W¬V«N¬_­Vº¸¸ÐÍÍÓ¾j£Á ¬V+år9_3ÄÇl›Èî ù›k úûãóós\½$L~8n6?dpðÝ ™6‰„7r©TJ'''nêiôÑ qoA[BŒŽ^%ŸÏ+ŸÏëÅ_T ‚`o7›Í|ÿpÏ0ÐaAÌ6Iz²Ù€ŽÈ½ÅìhQ¸²¡Áà8¶Û­¯#×€íçÝ Ö½l ¹Îù|Þ÷&÷P¡P0Èãù„n…Î [àƒƒU«Ua(•XEC‹*ª¨ÞXE$ª¨¢ºSuqqá,ƒ°'›¦Ä»ÝN?6õ š &M%œÿ|>omÈjµrF Õ"í IDATÈv»Õd2qþÎ9€ˆz½î¤jþ,¬`»€ð—ÉìçççÞ  1 á»¾¾ÖÅÅ…§æÐYH°ÆÆ”FœBCvÒj40©TÊ[Îç‘ã‡nS(Ôh4œÏF)—Ë™æÃ13ÁÎf³êv»¦/‘߀£Fè=±¤ZãfV¯×•ËåT¯×%ɉía]¹ á`J(xL¸q5ãxÑ ¸Ö€G(Oü9€¬Óé(™Lj8:ðŽ­bvIÖ”ËeU«UI²“ÚÁÁ:ŽÖX̆7Oè' Ó€ §2ŒV«•†Ã¡Ï+÷ Á†|wL `ñL ÷a[#=Rl¿øèwØtpo¯×kß+8бíáø ±d;E*¬ÂÞèH2°EÌÞv²- þÃú@j\ØÆûiW´ýˆêY©7ÇUTQEõu*ljižÂMGŠÇã  «ÕJårYÅbÑÓàÍfc¡,”ž‹‹ - U«UèêêÊóX,fz ¹ 8a': 4 Ì¿¾¾60¡‰cû!ÝN•iœ‹…ó6£yxþùçOMŒmº”t:íF`Àô›Iõ`0P¥R±]ð|>÷6ˆ÷ ‚@’œgB:{Ø®x6›ùÜCÍyðà ÔÜ©°Û…nƒí, þ AÁõhq,»Ý΢ûJ¥âó-Éy6_8 Q€VÒÐÂqôlH ­Iò´üææÆ@0‹Ã€*N;§%™LÚrx¹\zsÍ,)õÜ|>[$„ÒaÍT;¶X€À%¾×`0ôD¤Í{…Ïëx<–$Õëuëgh\S©”m¡ÑD¡eÐäšÍ¦0í¬Ûí(A+C Ä3‚$|ÞK¸`I²Û † ãñXãñx&ÆÆ@ÄvŽkƶ)ª¨¢úê* QEÕªpžBhš¦ùÍfÓü~è;XÍÒd3=Å*JG88 ªbdÒÃÛí¶§Òëժs=¹¼d(b{2M  b–dE,³Þ¿t«ï`C2 ì\´ÙlLaêõzÎ 7ØÕjÕ´¨Ýn§F£¡Édb r||¬t:m:¼LÙq4Êd2:;;óÏw»'o‰DBAXÛ"ɶÇLµÙ8¡E!›æ›VlViè ÄÕ *¨]LøÙÁ÷_­V¶y…fÇïXɯ¨T*¾—ÂÔ;Ž=ÍqdBU¢ÑÇãÞfA]bëðèÑ#Oås¹ÜТéƒÔ0È0áž¾wZ­–âñ¸úý¾òù¼ …‚®®®4NÇÕjµ¬`3sï5›Í”H$¼ÉK¥R?Ҋץ×ë™ Ö®p=0P«Ë‰DÂA‹hV¸Ç™æÑaÃÂt2 H†gó‡ýÍæ‚mA¢z* QEÕ+°w$H²˜{>ŸÛ¶prvv¦N§£›› ƒ½É9T ÂB¡à­ ^}˜~µ^¯Õét,'¿`»Ýš v” 'L3‘fk‹Å¬IY­VnÜÜívnp¯¯¯ýiÆH ‡ºººÒh4R¹\ÞKŠÆá ýC§ÓQ*•Ò`0ð1ÇcŸŸ[ü m¦Õj©R©ø ¨§4"Ì '£/—KO£/#^'x‡+¶,€@cØõK’Ï€07 ¼õàÏù|&ã4χ‡‡¦¹±A¶E‹-C>ŸwÐ#à‚ÐÊps pdâÎ}„óW¦òž’¼ùÓžÂIè³n¸ŒÅãqSg³™*•Š©[áûŽc‘d°Ë¶¨P(¨Ùl@²åâwÙòœ¡Û ‘ç^ÆÍ `€¥5t.²hØ”à˜Å–‡÷ƒ>‡Ž…kÌýÁ¹‹ÅbjµZÞÜ; IÖ·à¾Æ3H}Ú¨ž¥Šr@¢Š*ª;U™Lƹhà™Çb1Óž0õœL&*—Ën¡AÙl6n ²Ù¬=zdÞ<”«ù|.In†‡Ã¡S¬ÃVª¼ž …×7§µZMÃáPù|^ãñØ 0Sr¶’ü]±ÔF a«a©ð÷­V«æÿós¶/…BAƒÁ@¥RIÉdRý~ßt–B¡ v»mšÎ^álô8áksvv¦d2©Z­¦n·k«U!6UèA˜¤BGƒ~xxè÷ìv»¶µ%Ë1ô0€Ìd2ÑÑÑ‘iSºáph±|ØÍ ·(2eØ8Ð4“2€BW‘ÏçõÊ+¯øZ oº°ö 7·ˆòy/ 2 ¢T*ysÎÀà^èŒF##à Ј‰3€õzmúºœ››_ÇX,æ àM¢t›e#ÉÀ&¬©) êt:ÚívÖÃpƒ 0ˆ“d÷3› @>çw+%ÙZ1 @ò=àxƱp¡r=x~"Þ¨¢úê*Ú€DUTwªˆsácKsƤ¿\.ÛNAÓÁ”ZŽô$̯Ûíj¹\êùçŸ7/¾V«91\’S½‹Å¢m‰„ƒ7%X¾–J%k0$yºË˜Ä\.§jµê- –¯4ôl(Â:´/h0hÄ8hLСp‡ ~¿°`÷ððPµZÍ9 Л õz=OšÇÕjåJ2™T§ÓÑáᡚͦ›ošä·¼å-¦ qŽ ÒàÅ$M\étÚt:ÀÇ /¼`ê[µZÕf³Q£ÑØËV¡±”`ç‹Ø›Ð¾T*eÍ:¶n¸m·[ÇcU*7ÊÝn×4)ܦ•aýתÛíj>Ÿ[ÿ€S´¸V«åk±Ûí¼õAcQ.—•Ïç½­©×ëGh(‹b‹ES’Âú¨Qè1CMck‚‰´Dè|ÈÇD´pÙ [;L¸_¸g©°£ù%áìì§h+„éYPqVc3èHäžfE¨ž¥zúOLTQEÕ×± P°M W€$lšKDÄ4Bü.ʃÜt#¢ Ûw"ÞÅâw±X8Ü ýBµZµÛM%Íg¸¡aººÛíT,=åµÃáPårÙ®?ÍÙX¤R)7ó’Ü<1]¦ c“@Ó–J¥Ôh4Ôëõ´ÛíœAƒŠFáääÄÁsœjÜŽhfiã†è0%Éß}Ûèq4ÉœkšU2!Èa2Þëõ$É…¹\N‰DBív[>4ý‹ë†ÓNa4®|ÿõzí-” VÜ­...| Øt=zdŠù0«ßï;‘ëÍòv{›ÈÍnØÕ ÷-@1ælHx$Ùi*ìH–Éd¼•ã9aƒ…ha}XèppàMç#“ÉøúðÄàl‹¸¿—Ë¥2™ŒŸ'6,ÉdÒ–¸‰DÂ[+èuœw€Žjá4õD"¡N§cÊ¿ÃóÕ±Ýn›^G¡_º¼¼ôóÂ} -/¢GÕWW‰*ª¨îTÑðÜÜܸ1¡‘b²Öa '„c…›Íf­ aÁ”—Fž‰ùn·sÎÍ*¿‡åèèHÃáP“ÉDÅbÑ98I!fg €«Ÿ…n„gœ€p‰ÂΔdõÕjåð=¨'4­|Ïb±¨v»m[6!PË E•Ëe ƒ½, šŽõzíÐ:8é¶A}á…ì”0Ä…h»Ý:hZß…ó…I@ؽI’E͕ѤR)Õj5M§Sår9 Ó¡°Uîv»ÞŒ‘^HŠÅbv5[,ªÕjn™Óì˜à§R)‡_²i888ð´¾^¯+‹ùú'“I_×0­ª×ë¹é01Í´pßC?êt:6: ß"4Y*•|O 8ܨØ(„·5\sI¾/&“‰‚ pb9×­ "òfÂ?cƒÆ¶ PNw'Ðc$£%›ÍÚyŽç¼X,šÖl6÷ ø\¶1?s6›øs-ÂÆ O»¾VÛŠhÕ×¢" VTQEu§Š-M`©Tò:œCA£Çä~::Tw@Ž>„ÚáæCÃÍôªÜvš„ÊPµúý¾Æã±ÿ‰X»X,j0¨ÓéØ&–Ü&Äh4 @‰i4Óø31§IÅæ•sv| kPàï#°?;;3M : Ô#¶2»ÝÎSvI¦\qþ¤[]ÀÙÙ™&“‰‰„¿·Ûõ=Èh4Òå奺ݮ؈„·Û­C渞ÀÃÃCOÞîOl °–%•œ¼¦ôäCðß4ž»ÝÎÛ(þœ Ñáá¡NOOµÙlL±*—ËÖ!ðY•JÅvÐP– +ñLêSW*Çc &ýºwÛ)?ô+ÒÚ¹FPÎÎÎÎtyy©««+'†³1À­‹&—{+“ɤð±C#è–žP¡~±* Ö˜"šhv#€dî÷Åbáûj<{ƒÂsÅ–JÙ2Xúr®8F¶]&î @ æ\ ÎSTQEõÆ+ QEÕªjµêi0B\Ý’L!×ãúúZ¯¾úêž]çn·3¨¸wïž³1.ðრðäêêÊÔ§F£¡R©d>:«4÷PaÒé´‹…ÅâlløœëëkçŠÄb1õz=gzÐ,>ÿüó:88ÐÅÅ……Ø„ê‘t¾\.U,U­Vuÿþ}U*•J%O­%YœLƒÈ¹!¯§!Äý‘X,¦óósƒ¦Ì±XL'''~}­VS³Ùô¦ “É8W"|}ГdÜjµr8ÁsLâà‘:t"¶BL´ƒ2™ŒÆã±®®®Ôn· P–Ë¥Êå²76ÓéÔ×ð…–Eº¥U*Sîñx\ÃáÐvÀ\Kš_}ôáp¨^¯§˜º•J¥T¯×½YzÛÛÞ¦Z­¦Z­fÛZ6½^ÏçäË_þ²iDØ2Ïçs=~üX:::ò–ŒÏÇ­Š¤v~/+«×ëY‡Â9GˆŽ†×*î€×n·ó}Úëõ”ÉdT(´^¯ l]õzÝÉãacŽú•t›ïÂö ½/ŒŠÅ¢ çPÚ£ÑHãñØz’d2©étê×cÌg?íŠôQ=+¨¢ŠêÎM-Slldjïv;7…û ¾¤R)µÛmÇcF#Sg ‰HOR—™NÃat (?<…ëG£Ï–7/@÷5Ù#lî0ØívÎp†míàˆç‡ëžL&ávâŠu}}mãéØÂØ’qí£Š*ª¯®" HTQEu§ª×ë¹ñ‘g<ï9õÐŒ­×k­×k=÷Üsæ#ÆN$j4ê÷û¦h°¹ÀJ4LKÛN¶t¡áphKQ„¬h°ä%ÜïââB‰DbÏ>yX+p’n›7¦þa7 I²‹Çã:::ò”-âçl6k™$ÕjÕ›IÞ\__û3Ñ%@cÚ÷õá°¦# Y€7lqçó¹-z«ÕªV«•°®¯¯­X,¦ÉñýFØ×²Uò:®!š Àçh³Ùh4éøøØ€]Bù££#]^^:σlb±¨étê š$šäF£a- ô2®A¹\vFM·ÛõÖ¡R©¨ÓéØ\›Û°[Z‹ËËKÓÍ ëu»]8t5ù|ÞÎdÒ-ˆzüø±3HÂÂüz½®ñxìë‹V·)® ƒú°®"LkƇU5€ Z"`!}&“qÀ'/¶T|tDé ÅŽ|šðqð ÈgÁ¶ûiW¤‰êYªhUTQÝ©"‹!,"§ ÂAj4™Ç>›Í,€-•JjµZ{ú`¦ïAØr‹P¬|ƒ Ðýû÷ÍÁ—d;T6.étZ“ÉÄâæù|®r¹,I¡ƒ®ÇÝÀ"'ã$ìd%=Ùž0ÑpÅãq7·“ÉÄiîÃáPívÛÖ¨ñÆø¿ž2•a‘~ÝÍÍ-b_¬ˆÐpMl4)›Íîå7ð~l  ¹yäÚ.—K[ÓȆ3)‰„߇ÍFXÔ<™LÔëõtyyia=4¹ÍfãÐÂ|>ï† `Év36RÙlÖ÷ŸÃ5[,Êd2¾Þèx$yÂOæJ.—3Õ Ð‹VØ6ºÛízsrïÞ=m·[U«U/tIèEr¹œh¡P°á¼Ð ûý¾ºÝ®f³Ùž+ÕÍÍ‚ P¹\V6›ux"ŵæ^ [DçóyB‹ãÄ‹s̳@è!ÀýQ,³ý5vÍãñØ6ÉlÀÌw:M&Íçs;£‘s‹­€íÍ B*ªg©¢ HTQEu§j³Ùèµ×^óD—%,yö¢8ì”J%OÞil±{ív»n¤æó¹nlNIŠÆŠÆÕ©ßﻑŒÅbººº2wªB¡ Ç{Rލœr08aÉl¿ß÷”þ?¹™LÆnrƒnnnGþšëëëk‹EÇcçŒàJ”Íf= Çái6›©Õji8j>Ÿ«×ë)ŸÏ+ŸÏ«Ýn$W«•‚ ðT°%É¢ãÃÃC7œ\ÏëëkµZ-‹ÜG£‘V«•àÀ±ÛíìtÆ$œ„p(FPxêõºƒèÆã±Z@R¹\övfµZ©^¯«ßïk³Ù¨Ýn[[F†°>6*á&—­ /ç X±Xô6†-÷4!6›ÍFNÇl§R©”)U©TÊÛ¿Á``ð¶Z­xÉï ;—n›A ~¿ï{‡5I¦’±Yëv»ÞÎçsåóy?<«aðÊï‚;Î^ ¤½$t6’ÜÇ€ ruÒ_^^ª\.{{½eŒáÿÛn·Ö!ñL„éwO«¢ HTÏRE$ª¨¢ºSU,Ý0'“I]^^ºÉ Oã™#F%°ZV8/$Lçš ›Í: ÊG8C[6'L€›Í¦$ù=y¯z½®Édb ÓÑÑ‘*•Š›Ób±¨~¿¯R©äJ’µ4|¸!‘™Á$2™(›Íj4y[À®}8í½R©˜ÒðÂ¥Šf’\Œ‹‹ ö%9Œ ‡^@ºÍ^xôè‘ …‚‚ P¯×ÛËÀèv»’žèwh6PjhVI#Ⱦ¾¾V§ÓñF…}'(n€ÃðufcÅ÷»¼¼ôF*«ÛíêððPFÃz î‹ÍfcÛÛÁ`  4ŸÏtÎÖðGæÂtÌÅxS©”úýþž 0–°Ep830 N&“j·ÛÖñ @Ýãø8èvxß ´^¯ ˆãñ¸Ý¨Ânmä”p}Ð\$“IgÊ ±À‘ ×+Äø’üÐhð°ë½¹¹ñVŽ?ÇJ'76#|¶;Ü‹„t²1aËR«ÕL·‹*ª¨ÞxE$ª¨¢ºS…T¹\öÔy<+—ËÙوƎ>ÔžÙl¦ ܤ°=‡º¾¾V¥R1ÿP6šs 9všðR©¤r¹ìmD¥RQ·ÛU­V³Þ€&ÐÇMÅ(àNE–Bæ°^0"i/$q6›Ù‰êââºIÎö P‹Å¼åÁá‰ÍáˆøÿáϧчÊ`Úív:99Ñ|>·[Ñt:ÝK¯Ô±¡ ¯„mZ‰ ¼ SíЖpžHz§'ðµ×^ó&FºÕA`d°^¯Õï÷­7à0mG€? ¼á3pàÂÝ ëX\Âp-T‘ñ‚‰”7À lT*•ŠÀh’:a Q8ëc:zD“}zº)€¬¤½ðL¶‰€UîU,w»¯ùl6S©T²k[Ñhd«iÜËpÞâøÉ1aû Ü@"›1hYFÛÎ+‚{IÖuá”Ç}Êýõív{Ï^úiV´‰êYª€DUTwª‚ ÐõõµÎÏÏ÷œlØ€°H&“:>>Ö¿øE;cÑü@›‘ä­ttÐ]êõº^|ñEu»]u»Ý½éj.—Óýû÷̓?;;35 õt:U>Ÿ·ø›FŽi8MÓãÑh¤Z­æ‰,t"¨;óù\<Ðp8´Å+î?årÙaƒlbàû3µÎf³lPh°@…oONÊÕÕ•·HˆêW¥Rñ„û\(7kqúŽB£ çÑ£Gž¦Ã·‡Ó?›Íìzí 0?ìÄt{6›ÙËÐétªõz­GyÓP¯×5Nõꫯz5o2™TµZµ`™¬‡Ífc zšÏx<®çž{Ήæ£ÑÈ¡ý~ß”„êL“{½žCúT©Tl =éèèÈ4%¯qËÂaê•W^±µoØÚ–ãcã„ûU»ÝÖt:ÕÑÑ‘_K“›ËåT­VMï¡§‰=::²-0t7Â&Ù §‘eëÍŽ¼ ¶ƒÁÀ›˜p( zòXéÎf3oZ ·Ál„È+™L&Þܱ‘ž„.¦Óio(H»ÝNÝn× <‘Hèüü|ÏY+,ºÆy½^ûœ‡7:< ÓéÔ®f¹\Î6¼˜'[r}}­^¯§b±h[jèaáDxìsÃâq¶étÚf »ÝÎaš’,Ìßív¦cN&]__«Z­úÙoµZ’ä¿$éáÇZ,~þc±˜ÿÎ`Sø4ëk‘eDõµªhUTQÝ©*—Ë{®RØgÒ\CbŠ @³Q.—ÍÇGSP(,R§©c’å±t˜&Ç=1/—Ëþïd2鬉£££½;ì™È¢K¡Icª ŸŒ’J¥bÓphb¸m·[]^^š¦U†°C¸ï•JE‹ÅB§§§v„ Ó½iCÅns}}­Ñhd2“i„Ɉ¨ƒ áuÒ-¸€çÖÞAà$zXt-hh²±'&è-Á¶á†s8jµZ9gÚºn·»X¹´Õj¥F£aêBø°õp:;;sF €ïˆÀ>§1(q8B¡Ùa»R¯×5 L)äZ¢Ý`“ÄV'‘Høü'“IÓÀ )!ì7$Ù œ f•Ëežžj>Ÿ«P(˜N@9::ÒÙÙ™C zdËå-Õññ±ÎÏÏU.—m5 h:88Ðt:Õp84ÂE{”@M®9™"ü÷jµòùO¥RªV«¾¶<_¼žïø´+ Q=+õæxb¢Š*ª¨¾N…ëÜðR©äm"a4hA˜ª ÇcÅãq T±J…ÒBcGPZ,W‚‡C7-óù\£ÑH™LÆüs„²ácÁéììÌ¿Gã8Nuÿþ}m6]\\˜ûO¨'1lO¡mápDãJCØæ—pÄ~¿o½DX3€K¬„âVÄûó]É­`#űrÞÉH€GÉf³Ñx(FÒí¦…Ï–äs^(lÓ Õ0™LZãC0åh4Òp84à‚À: ¶/NGËåÒÆ“ÉD¹\Î÷´Ä°Ím»ÝÖf³ñ6-¬ÓANÞH.—sV `…Ìd2Ñ`0P¹\6M-‹ÙâjDó¼7÷ à$Éuˆ*ª¨ÞxE$ª¨¢ºS5ŸÏ=µDCÑëõÔï÷ÝtÃkhdÐ) Ó€z‘N§MÁé‰é6“ah+X±zÇ&…À;R»g³™Ôn·Õjµö>]Í1“]@ú (TèGØTФòY™LÆîFÛíÖakLÓù]IÎ~Èår:::2Ÿžé43ïÃ$7¢^xÁ *ŸÏ{;Á4TzÎ;º(Oººº²€Î~.—³[Ô.(CPz 6 ,[ž\.§ñx¬J¥"I¦·2q˜bSÁ6f0h6›©P(,àöÚk¯Y°Î6¥^¯+{ëÖ(«R©8§} ô7‚S©”]ÊØ¸$X,m8Ïç­“€öÆý†ƒ¼6|Ò-5íææFGGGÇN*—´çÌMŒk²Ýn}ÿÀ¶\ãÝî6]ž{w¹\ªR©èüüÜ”²ÝngKßõzí ÃL&£óósµZ-ßãÐí¸÷% l·[Ý»wO³Ù̶Âl¹×ÂIëh£ÐÀð]éä¿¥'NuO»"zTÏRE$ª¨¢ºSEsHóÐï÷U,ݼJOþ|::…šÍÍ;ÔªpIã3ŸÏÕétœ™€þ!“ɘž‚l±Xt“Åû¦Gh.N“c±Ù%ýz IDAT˜º°¦¥™†J݉¼ƒÙlf½“nò"˜äcŠ%n±Xt#®@h#HÖ~ô葈 ¨ºFgY¬×k©^¯+‹éððШ~¿¯åri:”0ô3———{ZšG(P‹ÅBGGG…h[˜Œ—J%u:'š ã;;;S&“Ñéé©Eßl ›¹OOO÷˜“A²Ùlôøñc7­‡‡‡:>>V¿ß7}ïõO’íbɨA[2ŸÏ Â;€]¶W€8œÞmïŒõ1  —.6ÕjÕ´$>ÂgL§S‘p¦›„ñ€h{“ÉÄ€˦G3\¦æó¹Ž½Ýãºf³Y5 µÛmIòu ;€ñü„µ]8š¡SA‡Ä³ÍF%œ2Õl6õðáCÿݰX,T­VuyyéÍ ú&þ^‰*ª¨ÞxE$ª¨¢ºSE³ /Ÿ+ÌÉ‡Û ¥ˆmCX'žZo65 Íçs»íA`šÏz½öô;Zœ“L©“Å„F =À‰Æ¸P(èÑ£GÎ^ ÑƒŠÈ"¸î³wæ±–dýÿžíž}ßï™vZ¬\ h%V"1-F" ‚ZM\‚І áƒ Qé&†JÚ–Ä•( Dm+Q¢­¶¹3÷žý}Ͼß{~Ü|ž¾§¥þf´Ó™iß'i:½Ë9ïv¦Ï÷y¾ ÿö)¯øyµZ)“ÉMpF­e T(4-´æ—­ NCÞ,¾@!ƒ‚k_¯×5 !Ú†Ÿ ÷Ôp¿ ÓÌçsk¸%Yc U, …ä8Ž\×µT.—³m ÷O’….bó‹Ù»%“¤ .P›Ífª×ëf¨ES„vÈ»•€ÒÅôÝ{}R©”é_p«â¹pÇîõd21*ׇß#§Å{݉„Æã±$YN î_XÌ"¤‡ŽÇöÅK­Ã¢™m‹×)ÎkÙŒs!œ’T(4N Øg2e2[ëõZp¼Y:èM€Q¦ö<×…BÁ¶SP €m{½ž*•йàñù”dÛ&tE…BAƒÁÀ@$¹_Íò7 ~]Oå¿üòëUõz]óùÜáL8¡‚H2Í“e´Los¹œ†Ã¡‰Îá˜Ó¬ƒA£BѬ2ÝEŒ].—5ŸÏ-0®Ûín¹ÎÐx³}€†DÇCcÜívU,M׋†p2™X"4T.s¶"ÐK$m%»£#˜ÍfJ§ÓÇÆ¹Lx˜h#ö†~ÏË^,Qqȼ°•AìLÐ ds¶8E£Qs&J¥R[Öµ€-t4΀=Ä×Þ EšØT*µ•ßVe:Z !×=`lÀ§7‰q7[@'v¼ˆ«‹Å¢½ 8S6oз f³Y <ÓÝn× ×`Å{y-tÑÆÉÄöËÜî«×êš{Àý“¥Âs… Œ¹bpB97Î…cbûöÚ"Ç‘ÏçÍíŒ0Îb±ht«ÅbaîW^À‡Í19/4>¿üòëÒË·áõË/¿^P庮5ºält:Ó+L&Ó*s©¢yE|Œ 7âhIæ„D£‚•l6›µ­Š7õ®?y1ôÐ]؈\¸pAF“d“h?Ly³ÙÌ&âPŸ’ɤ¶Àù|ÞšÒ~¿oyt%4gÐ_b±˜5äãñØ\ŽÐ0­çÈ‹À.‹UpÄÁ€€‡t¢CH$6‰ƒöo¸°º¥Ñ8°´ ½!~«Õj+_…íh(2ûV´4®ŽãX¨43xÀžÍf¶…dÆãq%“É-0(NívÛtAåÙ° e2³áÏçö>œÀpÉ}åëóùÜîm0T³Ù´ÍV¡P00ÃqóO"‘P©T2pÊ–ª—[*(_Üûõz½%‡îÅ [jï–À a“ÃýC£ˆü±9#›„­—7x›j6‚étÚ¶m€’«]Wˆw2™èƒü ^ýêW«X,* êŸøÄÓ~Ž·ú箻ŸýýßÿýgõšùuõÊ߀øå—_/¨‚VĶ* Ô$¦ ØËz²6›… ‡CsO¢)…³Þl6M,ì´#Ü…û޳éëÞF•),ô&é™LF…BA<òˆMû"LÐŒÐ<ßpà ¦µ )£ù#„F-Ä`…ž@Á´—.¬ˆ¡àÐŒ/—KsfBkàÍÇðæt`@> ÓuheÐxF£‘:ޒɤé1¼)Ø’¬©FçAè$T°år©Z­fSwÒÑiBTdMž0 ðæÁpÜëõZõzÝÜ¡Y£ý˜N§v­vT¶O8x¡æ!įV«¶1èõz[)à4ð|_’5ÓdÏŒF#{Føg4YSM–K:6`¾E/Æ ¸“y-’Ù ±ÕƒšÇg„c(`Ö É¶‹ÐÙæp¼PÄ Oe³YËÞ\‡CûláråM7çߥRÉ6_^«`ì[”´åçý;„g &þbu»]}èCÒ 7Ü [o½U_ùÊW¾åÏÝwß}OûÚ?ÿó?ëÿðŸ@$éU¯z•~îç~nëk/yÉKž•cöëê—@üò˯TysF£‘5A4†‹Å¶$8Ñ$ó#kLØ2ðïÉdbawÞi-š`Äï|‹…Êå² ò02¹\NNgK¼N“v||,×uÒƒŽƒ ²ëº’žlò Ö°µ¡yâ|FØÝâžÄ±3ý‡ÆF*ö`00ÞŸW P³Ù4Ê X,škØt:U±X´„y®=baDÖ€·Ñhd` 0¥‰-Öh4²†”¬@&ô&Þ¯X,ÚDž-nX¼¾$*CËårZ, æèÄû#ìG»@A¯+•JFack ãZ¥ÓiÛ`ðlÎçsµZ-m6U*»ç8 ¡9pqx ¶ÞŸñæ^ð¬ñ\ q@ë÷ûŠãñ¸úý¾Qs¹œi—$Yè%ÇÄ„›íƒ×Ê›jŸL&·(™LƬœ±:v]w‹"‰D”Íf5LkÅÖ z"à’Ï÷•Á€—cÝl6‡Úl6ŠD"ׄýji@vwwÍRúÁÔ÷ÿ÷ËŸ{ó›ßü´¯ýÝßý€~ê§~êiß»å–[¾åïøõü(€øå—_/¨Êf³¶@œ‰DÌ}ž?ˆZ’¢Fúq,“뺖€˜f’ •p½bŒȰr||lüs¯Ðw¹\ZX\«Õ2!1”©Édb´t^‡*š&ú4þèIhrË岎Õëõ¬é$ G Îo6›i4©^¯«ÓéØ6þ>k,k×ëµÙÙâ–ŵó†ÂíììèÆo4ŠÍh42ІæçÓ4²¡"ù­š—Íf£B¡`ÎTØÓ4CWCSãÝTy›Nšùñx¬R©dy;;;*•J¸*ÙØ*pêâuq•"û½‚2Øn· 8Äb1sŠÂ 6ž-švÞŸëMv ›.(bI:sæŒÚí¶7@Ý ×ßq’¶6SÒ“ô+¯ƒT=6QP%8,³Qc‹ÇgAÿh42 ƒù‚×B FM‹Óï÷Mœßï÷ £9XA;cë„=ó 9$‰ཛྷZ.—úìg?«W¾ò•ÚÝÝý–?ÃýåÙñëùS¾Ä/¿üzAU§Ó1ŠiÉLû¡R Õ@¼L¶|t>„´¤§“ÈÝív͉‡Æº©ÏÞܦæP­²Ù¬Êå² c½<}„¸ºãñ¸}O’qès¹œÙàzÝ“°wõ†íµZ-kà7›ƒå8ŽéYhöИ E˜N§Êf³þ‡»¯‹æ‘©6Çå†p;60ÒIú¿¿¯F£a?Ïï²±Bü XdBí¥$% £6Ñ<:è8Ž…2ñ‡¶6Ch& L^ñ8ô=/Àãý8Î@ `ÀAµ$£»ÑäÒTÓP/—KM§SÛ¾šÑI'[”Z­f´.´;lÑ"‘ˆm}8W~×2~¶Ò ÀžpÐï÷•L& ÕëõÔívír}[ØYCáƒv7 Èüøš$®à‹Í Æ^°Å¶gÁkÙ‹ÅìuŸJ£ãyJ§ÓÚ¹ïÜ'´_äŸä$mQ´®f=×úÿK}ñ‹_T¿ß×[Þò–oùý{ï½×ôi/~ñ‹õéOúŠ‹_Ï}ù¿üòëUårYÑhTFC7Þx£åRÔj5M&…B!U* ãÙçóyõz=£RæÍÔdSvÄì;;;æÄDÆþ¡4Í7¼xhP49’Œ×ŸH$4 L“Àë3õ‡JÂT:’$õûý-GŸ\.gÉÎL»™@Ó(JO:ýÐü|!d#xÍqy7Ò ˜#‘|8xCóá+¦ÔårYçÏŸ·ÿæ=\4™ ܦөýÃdžëà¡“^,ÕëõÌž™÷Cùp=ÙN‘;áÕ¾H2ˆ¦eµZ©V«õ‹kèõŠæÙJѸ{CI"‡¦ÄÆ €ÊÌûl±íÂ5  ÆsâMbG#Á³æuã³@h$ [z2ä=O’ÑûðX2 kúçó¹úý¾nºé&I²m^©T2MÀûʶºÔf³±`Pî/Â|ïgÄk{̳W(L÷âÕ²°1Z¯×r]WÙlÖž43~]z}êSŸR,ÓOüÄO<í{·ß~»~ò'R7Þx£õ±}LoyË[4õ®w½ë*­_ÏvùÄ/¿üzAÕ`0P¿ßW"‘ÐÅ‹-to0¨^¯Ëq£A)i·ÛšÍf–¤L£M [Z¯fÂûû¤.Ó¨’¤ÍÄ—F›Æ·Õju »Z¦±ÙlÖšrì’ÌŠ@7,sáΓæ Ý,‘HX3], ¬[8[•J¥¢X,¦‹/š@×qåóyãÝg³YèèèH¥RÉ\¬Êå²Ñ™$Ùôš—s$s‚ŸA\ϳ٨ÕjY£ÇÖËßÅb¡V«eS{Àç;™LL¯À5Ž$ÉÀ†bņ€ßg#$ÉTt:@B6›5Êiæ@À¨>h8R©”ÑäxžhÌûý¾Y×zõJXC#ÌGTÎõ„¾Å¦‡óžÌú€±Ù[,:uê”&“‰Ù s/¸7étZ®ëÚ÷0XˆÅbéMgóÄ3ŒæÃ«­,y5-±XLÍfs+oÍïÍkV*sc“Cž?çå‰îhLÐ|äèM>g“Å&”“Õj¥Édbš¢«Y×SÈh4Ò—¾ô%½öµ¯µÏ ·þñÿqë¿ßö¶·é¥/}©~û·[o}ë[}JÖó | –_~ùõ‚*ңѨ ‡¥'³š©P(¨\.[ÓÃ4fE’ñ“‹Å¢V«•†J¥’¹jM§S£|$ £õt»]›Ê¦R)®Ó˜çr9£•Ëe•J%ãÎcߊÎj !šš'Žž6¿¸,…B!…3Åæ½Öëµ¥p#.æÚâ†],M-ºŒÉd¢N§c›¤l6+I¶9á0•fK­©ßïo5œ4…¡PHív[ívÛl’9šp¯žI÷f³1M÷1;’M›4€ÌÙlf´=6hk°‚¥¹>w°}‹ófã#ÉéNǨ[h#˜ºKR»Ý¶mç†~KÙP(dBô\.gçÃf„í~éÐ@C+Ìårö>¸Ã«ÝnëèèHÅbqKû°Ùl¶€ TEI¶=áÞ”J%£é¡Pr¿Øæž˜N§•L&U.— øà>:¿ž‹ò7 ~ùå× ªÆã±5θ1ÙDP[.—%É&©’lSc2™H’MPÓé´å 0…&/‚B܃È{èt:ÊçófŠ (M—¾BÃZX"‘0¡&ÍØx<6!1Saïk{ÅÛ87U*›Ð³©A0MsŒ“xŽe:j0èÅ/~±†ñåüBUi6›v ±×e#@Þ4.ÄîÃápk3ÀÏ@wÚl6Êçó ƒÚÝÝ5ýà€ÈB¡`ºŸd2i“ìÍf£R©¤n·«•Ëe³£õ¦Þcë uˆç@:¡-F‰„ÇQ<WµZµ×ŠD"t9›ÍìYÁ} ŠÏ#À†„ûp8¬B¡`bw@Ï–ÍXG£QÛðº}Z’®‰m“_ÿ÷òˆ_~ùõ‚*&®ËåÒ¨Td –…ÿïmRÑŒÇc%“I‹E›F££…BF»b2ÏëBhœ†Ã¡NŸ>mS{ÀB.—Û Ec²ïMÏöZ¯JÒ©S§Ôét̺7‘H˜þ€æw#’Ì9çH$¢Åb¡N§#é„bÃy3É÷n hŒi™æ¯×k5 ËUÁ…ˆ[¦×^PAÃËùÏf3=ñÄ&¾‡C˜#À^Q:Ù%4Ì^!8á|дÊå²9qÕj5%“I»æ­VË&ÚXè*8›q­¡·y-€if€ÑÆÅc'ŒÆƒÐH^‡ Û6Ðɼö½4ê76±XÌt=gÏžU¯×³mvÀ‰DBÍfÓ~‡­÷Œ6\S¶‰D´8€^(€LxfS©ÔÖFOž Û¶étªB¡`ïáfcÂûH¡s:ØâÕj5µÛí­°Kô-\?Ì ¯u:U«Uû¼ÆãqXʽW@»šõlW¼âzÅ+^±õµÇ{L¿ñ¿ñz]o5›M}å+_ÑÛÞö¶Ën=ö˜$ـȯë»| –_~ùõœÔr¹ÔoþæojooO‰DB/ùËõ7ó7—ô»ƒÁ@ï|ç;U©T”J¥ô#?ò#zøá‡ÿWÇ–‚I,Sx&·L—ixc±˜²Ù¬²Ù¬òù¼¹Ÿ×p8´©¸$kLa^7)6lx Ó@] ÊçóZ¯×züñÇÚ íO³ÙT½^W¥R±æ?š<‘H£ÉÇŽ–ã˜ÏçªV«¦3‰F£rǨLXÇF£Q3 ÷…-Öd2±&ðÄkg2,‰DbËÙ,™LÀd8Â9 ªÝnÛæo<ëàà@étZårY™LF‡‡‡ …B:uꔦөÊå²m¬ ¨…Ãa£’‰CR¹W؉Dä8ޒɤ"‘ˆêõºÒé´Y×BA‹Åb &.Ïår¶‘DøÍ½äù„ÞÅý- ¶­Ÿ7á;ÛhsÞ,™Õje[Nî-›Løœ±í»Úu5EèûØÇÔï÷upp IúË¿üK]¸pA’ô«¿ú«F?”NèW»»»úáþág|­ÏþózÝë^§3gÎèððPÿøÇuáÂÝwß}>Ø{ž”ýò˯+^ÿôOÿ¤Ï|æ3úƒ?ø½ûÝï–$ýìÏþ¬¾ë»¾Kï{ßûôÕ¯~õ÷ÏÿüÏõµ¯}M<ð€^ÿú×K’ÞøÆ7ê–[nÑ?øAÝwß}—u,ˆ¡—Ë¥Òé´ÑTúý¾jµšV«•e…x§¥X…v»]kŒ™JcKNNKÞ0>4 GGGféËv±XXC5 ,è/h4™ÍèÑÑ‘Q¼ŽJ„¬!lw]WÉdÒ(,ÓéÔ‚¾X¿BÊår:88PµZU¥R1W«jµªf³iÓîr¹lÓù\.g[&üè&î’Ϥ·$&øœ;n`pðG£‘i(Èâ€î +_À’7/E¿ßW¹\Ö|>×p841õl63Q}<W»Ý¶ëÈù±ÉâÚ“¬íº®Îž=k “†Š®]h$ÐWœ?ÞÂ"i\G£‘‰óqkòæ\|õ‹EÐз$Ù±Òds¿ ²cÓä8ŽmMf³™e„pLløo¶xP©ÓØNC=Ûl6¶ù@Ÿ f‹…›B~hydØ$ ‡C³æÅ*š^86‰“ÖÑÑ‘Ñ:€Ö×4ê^B&—¾ @Ç=d[Oì_è®LùÈG´¿¿/édÈó¹Ï}NŸûÜç$ü]yôÑGõðÃë=ïyÏ3¾Öí·ß®¯}íkúÓ?ýS”üÀü€î½÷Þg-~]å¿üòëŠ×ý÷߯p8¬w¼ãöµh4ª·¿ýíúßùhooï[þî< Z­fàC’J¥’Þô¦7éSŸú”M6/µ¼hÅbQ’,°‹Ýz½n[étj"åT*eŽKh?hZwvvT(,°oµZ©R©lñÇ™JCÂM÷$¢§òñÑs)—Ë©ÑhØF#ÓF@wA¼‹®a³ÙØ6 “H$táÂÛ|¬V+Ûìh¸Ïž=«sçÎYà™ Lº96 €6F“ÉDårÙ´L¡5µZ-år9Ëè÷ûJ¥RÖ3i†>ŒëBè"Byαßï›ÛÕz½VµZ•ã8v®Á`P£ÑH½^Ïl‘‰ÃáÐv¦º\S/B1U¯×Õl6¶ÖëõŒfäMñFG2ÂU*• Lx5(±XÌ-ÙD°å8uê”ö÷÷­IFÖ<ÀÈF…¼6h8hÄ{½žÊå²…c’æ‡5™L hCñ‹F£šL&t&“‰Ò鴥ˣi˜¡âX0xðn!ã¦æ •„bÇ{‡Cû¼x-ƒ½º áphúoŽt,•¡’}Èá3ØÇ ™mi*•2!ÿùóç/ùï +YW28ðª'žxâ’~î–[nùÿ†6ÞqǺãŽ;žÃòë._â—_~]ñú×ýWÝrË-O ëºí¶ÛìûÏT?ü°^úÒ—>íë·Ýv›¦Ó©}ôÑË:',U¡á„CcÙjµ¬ùej> ,Û+ŠÏçFºpá‚éJpÕ‚RÄ„‹^lªR©˜í)ï §žIðjµ2W'<iÜœ–Ë¥Y¾”˜Z,°°e­,iÔвØðxó˜´K2ºô.&ÝÓ°ªÕªZ­–iÈY­V* J$j·ÛF9CÛÁ;šNÞ›mËx<–ã8¦‘á¾¢)𺓥Ói s”šöøøØøþ$o3Q/‹*—Ëf$@6ö»ä¬4¡›:uJÙlÖ6ÅbÑîC³Ù4k_ï=ƒž†,M÷d2‘뺚L&¶=Ûßß·z,…iÐiŒûý¾5ùüC“ ’_Bî ×W´3gΘU³×öíP¹\ÞzqIỠŠÎ†)›p|ßB.ù\°Q[.—j4[Ô=6Á`жл Þ‘÷Ap(¡‘œƒã8¨$@F£ÄýåYæÙÎårJ$Fahûå—_—^>ñË/¿®x5 Õëõ§}½^¯k³Ùèðððõ»’þÇßýV5›ÍÔjµ$Иˆ’š<5µ»»kÙt:Ýr–"•A,MP:6ª@¡7 bn¨#pçi´ƒ²Ù¬mRƒ:Žå‚0©'»ãàà@©TJÙlVNg+×"ÇqŒŽ U.—U(´»»k“p¬pù9I61fzÍD˜‰1T™l6köh4ªÑh´•1eZÂcÞ§-èP\7€©Ö€4'rX¼›l[©n¸AÒ uÆÂÈæ Ay4U>Ÿ·í op‚k¦öXsÐæÌf3 kTÙZĸÙlLA6 M:ºƒÅbaîb¸IÕëuÛv±QJ$:uê”YÕ2¹gs4™Llãºiˆq IDAT®Ý DÔh-’ɤO& •J%E£QµÛm£-rÒé´i*Ðü(ЋÐÈsPqÆã±z½ž9añ\î…€ÜJ¥¢åóyÓÄî ž%“IÛRx3c|xµ=é„–ˆÞ‹×öZ[ÎhtǶIœ/7\Íâ³t%þñ˯g»| –_~ùuÅ‹Fè©Åä‘0ÀËý]&­—Sù|Þ¦â4Åù|^¡PÈøçO<ñ„5ªP°5#Rf’}||¬z½n:^qûd21+^hV¹i®¤‡—x<®z½.×unÇmK@ÃM¾€@ `“fš®b±h ëS¦ßLýîBh8 `ÁݧAe¾ÅÊ}†¯[Ôl6Óáá¡QÎ …‚Ѷ ât»]£üxÈ—Ë¥\×5 z’¸ù}èM8“ÁÛoµZªT*ŠD"æv庮öööÔh4¶ìbI'’æ<—Ëd3FÓÉf§ßï«ÕjèhFmSæÝ4á^`€æƒvb0(ŸÏkµZÙ5'ßqu,S£Ñ0` /«ÛíªX,Úk`€>dggGívÛèe\_èg³ÙLétZívÛÂ0½Îc|6$™qB(R±XT»ÝÞ²K:uê”^×u  p/ ÃI2ãµÿÇFfãËgi½^›pàȺÀ’Ìq-™Lš÷‹”s„ì€Mžmt>€T¿üòëÒË ~ùå×/‚ïžZxùCé¹ÜߥI¿œ"]ðuú“7Yñ)NL™LÆ4$‘HD®ëª\.k±XXÅÔ‡)¦ö&€Í ÓãH$b[Îl6S¿ßW¥R1ËUš5ÊÁ`PµZMÍfSÇÇÇJ¥RF¶MÀAúÂb´h4*×u%ɨ.©TJ™LFÝnׄÍ8iÑ|y“»¹>½^Ï&Ô4¨4§£ÑȨ>µZÍþÈAµM šBÈØa3Ë$Ÿ‚fuá³-ÞÙÙ±€Ät:­J¥¢‹/šáT»|>o!ˆ¸”år9Û„¥R)¥Ói=þøã[öËGGGö|ñ,az€«›®¿ëºªV«Z­Vj·Û¦_¡Áõ:šag bëà•dÇ꺮iux8wܼxÆ%¥RÉìw¹|þØFF#%“É-ûaqÙlÖž‰^¯·HH€&z(@$À±ú|>W¡PÐáá¡mØ.\¸`Ðû0 à9b»…^½âw ¹³åÔr=ÿ€wÍxÓéÔžmÀÊÕ®«é‚å—_—[>Ë/¿üºâU¯×­ð_áéÙþÝoULZqhbRL#‹w¹\ªÓé·ŸÃ;ýt]×R’ƒqÿ±#eMSE°Mô*6©TJÅbÑ8þÓéÔ&ø¸ÑDÂÓ…BªÕjfÓ+I®ëZÊ»4´)dÀƒ*‹¦W!l‘ ô÷ f% Fõzݲp½ôÚ¼ à„à±ÙàxTCé"¡|±X˜ëV86S(ZLÞ¡JµÛm³Îd2v_ãñ¸i[ –¤ äaÕË”:šiÁb±P·Û5*Úo%Í®ã8¶="E7.ìg9þJ¥²¥m!”’çZÓd2±kΠ^¯›Fƒdðt:-Çq ¬³©x#GÃ=îl63Ђˆ<*‘H˜€${¶wwwísÅP̦äàà@³ÙLFÃ2x‹…=ëù|^±XÌ€Z86 lŽê›³áá³€å.Ù5Ÿ#IöŒ¹>dàø…KÏ?T:þÌßdÿøå—_—^>ñË/¿®xÝzë­zôÑG͉‰úú׿®@  [o½õü݇zèi_ÿú׿®D"¡[n¹å²Ž%›ÍêÌ™3ÚÝÝÕÙ³gµ»»«b±¨ñx¬|>oÉ×ñx\{{{[Sc¯ Ô%xóù|ÞÞ›RI&°¥ –X‘ž¤”áœDs=f>Ÿ++ŸÏ[É}k³Ù´†ÏëRDv“jšÌÉd¢R©dnJL¨Ù ðžLw+•Ê<6°Ýn×(Y€L&c“u€<}ô81ÑFŒMár¹T¿ß—ëºZ.—ªV«ö>ÓéT©TJ»»»fßËvà=@4;® ?Çd ES> üäHßÎçóf]‹&"™LªT*)—ËÙõfV¯×ÍÎyµZÙTÊ®_Э$Yàr¹4Ú /kww×¶)@#¤êZ¡P°0Æp8l´/h`⣣#íîî*NÛæf8šM0 ;Û|¿ß7“€@  ³gÏÐ&Õ=“ÉèÆo´gŒàÈÓ§OèO$f=Ì3„F³žIDèP¼8®p8¬H$¢Z­f` ’L&U«Õì3ÉöoggGÅbÑΉkR«ÕìgøL{sbÐ~²¥ñj–¯ñëzª«ÿ‰ñË/¿ž÷õ†7¼AëõZò'b_[.—º÷Þ{õò—¿Ü,x›Í¦yä‘-›Æ7¼á jµZúìg?k_ëv»ºÿþûõc?öc—eÁ+p¾;Župp ÇqŒ&„ž¼Á``bt×u­œÏç–J¥Œv”H$lúŠkV*•Ò‹^ô"‹EÓ(  ÛcÊŒÖ+¬ŽF£v-à˜/ µÛmÓÒ¨¹®k.N4 ívÛ¿¼ö¼LÎÉÞ`²/ÉÕG£‘ÑbHj'É­ þf³±`B€ ò8¡sçÎéÌ™3’NÈG?úQýüÏÿ¼¾ùÍoªT*éž{îÑññ±~÷w÷²…C’‰Ä–’„<›ÍŒ´¿¿¯åri“voX¯ÇÏ3mÇý¨X,ÊqKçwÉ_€f…® Óé¨P(= q÷ññ±Ù•J%k€¼º€ããc í”J%µZ-›:K'ÚØÐ‡hPy-òغ`ýlмZ­¬á?<<4G,¯.…FžŸ‡¯Ïû“·UŒFöÔ©SFsëv»Êd2&„‡î$ɸùûûû–TNÓÈd]’Qq864…BÁœÁØÖ°ázr TU*u:%“IÓDàuxxh?€1çïÕ,ðÞ€M4l y„øAåã  …B–V0F?­h±X(N›îf>Ÿëàà@étÚ Bûf³i[5ôP¹†Ã¡5ðÜ/´E^[hšx„ðÞœÇqÌ‚ÙqÛ¢9Žc¸d2ià' ©Z­¸Çb¼Ô@¯N†û EÊY)l[Z­–&p)RÐÙœqÝÆã±*•й“qOƒÁ5µ¹¯ë—_ÏvùÄ/¿üzNꓟü¤>ðè¾ûî“ëºúžïù}ñ‹_Ôí·ßn?×Ý[Á`P_þò—õÞ÷¾WôG¤Ùl¦Ûn»MŸøÄ'ômßöm—}›ÍF/^T&“1q0/Âðåridz··§V«%ÇqŒÆH $®ÛíšþšÎ>Édr+!P´R©d6@ÙlÖl}½Í¦ã8æ´”ÍfmcC#å©Óé(›ƒ¢vI6užN§¦€’㺮i!æó¹0h@ñx\ÝnרfÍfÓ´ˆÝ½|~¨\;;;FƒÁ}‹I3: øü{{{:88°MFÕjÕl(dX'“I% s6 &pn4FÇúŽïø5›M9Ž£ÝÝ];_¨n«ÕÊÄû¤½¯×k9Ž£z½®ñxlÏ%fívÛè@3ת b2™è¦›n²E&“±ëLˆ#±dP`%»ÙlLÃÓétL È)‹F}ãƒA³uf«Á5E'DÎ º×u•Ëå”ËåÌ Ê 2Pä|k€œÙlf›rtÈGÁÖZØ|>7]Ô`0°¼¾æµ\nµZ¶m«V«j4¦ud›8ëïÕ+¥ÓiÓe±µCOĵÀ˜I(v + ¶Ûm{vØš‘}â—_~]z6þ§Æ/¿üzÔC=¤—½ìeú⿨—¼ä%Æÿ ¦Å@H\.—M¾X,”Ïçm‹áÍ–X.—ÖFÈ\2™41º7KÞ9?ôP¼o?ü°ÞñŽwèÁü–Á©W²ø»íÃþ°Îž=û¬¿þO<¡÷¿ÿýWåÜüzþ–¿ñ˯k¤HÿßÖ=÷Ü£ïû¾ï{–Žæù[löööLK1,P/ ©ÑhXÃŽ=.4¶%^ ÎROµåÄ]éøøX“ÉÄäP¤h®¼Bs¯ ›÷g³Âö…tu.¶¡PHÍfÓøù”ËeÛH²D¯×3Z âb§E“â8Žr¹œeŒÐ âDŽJ¿ßW:¶, €Ìx<Öd2ÑÑÑ‘M»Ñ=„Ãa•Ëe5 »n4¦èj|{µ‹ÅBÍfS’¬¡¤©';†Iy2™Ôþþ¾ƒ‰œ¡6,纮Mþ'“‰ÝsÀC*•R«Õ²¦ýÒ½ÙyÐ$™¨™ã÷6ÞЩf³™YþâpåUlØ,—KÓz@ËâþzC¡<¼[ï6Ð x€VÇï QÁÄ€cðMB#óš)@éÃÝŒkDR9”­xž·Á``¶¸l¿\#ôƒJ‡±$ ŸLp} cO\­V …lx€ÁÚ/¿üºôò7 ~ùu ÕïýÞïéÍo~óeýN·ÛU¥R¹BGôü«Åbat47ÐZ Æ¤R)µÛí­Ôo€Àp84±ëd21 ͧ7¯áôéÓj·Û[iî|7*Bòh@£Ñ¨é   ^­VŠÇãf•ºÙlÔjµŒ{Ïë¢Q¡AC§Íf5 ŒÇÀ˜Í"`ÀLÁÑ`{+€¢f³©^¯§Z­¶åôµZ­LÔœH$Œ6EnJ6›U±XÔ`0ÐÞÞžV«•ö÷÷·B'“‰‰ª¡kA7¢éäúår9h:*—Ëm€Ífc››o¾Ùt4L®½ºétªt:­óçÏo¹F1õƒFÉ&—i=&4¾\7^{6›Ù–E:Ù^I30’d[&@*M¶÷¹¥a¤°YÃy ç56lf ˆÇc‹Em6Íçó­Äp4R¸XDZ瑟ÍfD >FÉYÁr—Æë6 ,çe6›©^¯k8gfìpÙ|ðYäž² l¡e¦æÝö°Í|±ýD«3í:¢/‘døj—¿ñëz*€øå×5RwÝu×e‡êI'“Ò»îºK¥Ré Õó¯ ¢mñÈ#h±X¨Z­ Ú ù•JÅlz'“Iår9µZ-k|¼[ÓéTÿñÿaÍŠw:O¾ÓT¨Ð`й®+Çq¶¶£ÑÈš]¬l¡8yƒßh.¡;ÑØÒđ؎½0Óí££#ãêƒÁ-ûUr5 ën*•ŠQdØÄáú„1 ‰†?‰˜>$‹éܹsFbÃ@ãÃûá:ÔjµL+CÓ‹˜Û&W«ÕlKÄ1e³YK£'׃û1 ``À½‹D"–í …ä8Ž!^‹cE£‚h›”u¶j<'‹ÅBÃáÐÄÐ\la_^J–ÀF,†ŽŽ”L&íz Ø&­žmçÜÙÙ1(t3ù¡‘I2‹Ûù|®Z­¦sçÎ)+“É覛nÒá᡽ ° åê© > :#…L&c í ÆèTÐd ‚¢‡~Ä› ¿^¯U(Ì,áÔ©S¶ýàó ðæs†iÓëÖ–J¥ä8޹Æa`à—_~]zùÄ/¿®‘úò—¿ü¿ú½t:ý¿þÝb ˜Ëåä8Žmh~‰„Úí¶"‘ˆªÕª ºG£‘‰„C¡qÜ¡9I2ú¼ôõz­áphÍ÷H$b”+À™¢3=Æ=ªP('(ÀM§·YcÐn·Íî”×dKãµæ¸)Î 0¸ñÒÒpöòæ&H2‚H·$¯ì|>·)6bôétj…PÃh챜…6•N§‡MÈí‡fÃb±P¯×³{v||¼e¡ŒÖã©_ƒÎ³Ùl¶èQ4â¼'À€ëƒnC’‰›qfF ƒ–æÎdš&^ –½ÞçV’%p‡C¥³¡â9ŽÅb–U’ÍfõÄOXsÎ}e3 ÍŽ˜gÇ(6³ÙLÃáÐt;œ/Ût1ÜLø7®]™LÆ@=ÃlֆájµÚÖÆgggÇ(PоØd±íc{õš4`AÌgÏ¡ã8¦Å"¼ijŒ¡D6›5[”f³iïåÝR^íò7 ~]Oåk@üò˯T‘| M¦Z­ªV«Y€ 3¹ˆ›ùŸ;Ú¶¤>Ó¤º´t¼¼~yÒŽâ\6+hÈèt:æØ5›Í¶šðP(¤sçÎ)ŸÏ«ßï@ðòÛUÒ‰˜v_ŽãX.iÔL–Ëå²åjЀÖj5Óa„B!s®B€ÌÄŸkX£Qæu =5¥\’5ÊÒɦϫÇ&zÆ6˜Ÿ÷hJÐÉгàl†¶Â6—Íf y7-4›PÕ¢œk2™´ë7ŸÏ-LM zŠÔîî®òùü–›Ùr¹Ôjµ2ÝÙ/| ÄvÄ ]×5ÝÂp8T2™´”$Ó$¡ýðÒ˜Z­–Ñ™iÑhÔ´C^Ë@’i7øïX,¦b±h[¿Ùlf47I¶Åa«ãu ÃÜÁ›“ö cÎx<60½‹-ÀçøøXçÏŸ×p84]@Ë{l¤Èñ:ä% ^ÄçÔ/¿üº¼òˆ_~]£uÿý÷ëï|ç3~ÿ]ïz—>÷¹Ï=‡Gôü(4Ðf³™z½ži#°Ó\@3!ôn>Ÿ«ÛíJzrâÏt:Zƒ[ôIfkêMz§R©”r¹œ …‚i* Ty›\¥Ø hç FD0 …, Ž 8yн8F6B^*´-¨Z’¬™x©j‡‡‡‡ö:ÉdR;;;J¥R6=O§Ó¶íˆÇãÖ\rl^mD"‘° 6Ô/¶1L°¥“Ãxò‘ÿñ/þ@  |ä#Ïá=? JnTØiʆ^"™LZ#ƒè|±XŠ |±X´‰8Àæ©ö«lJ–ƒ‹?#áÂk²Ø0ÀóßÙÙQ.—³¦,w é¤qîõzÆógÂÍŸÉ;Av^ÛQ¦Ãd+àœ„•m6›U¡P°ŸÝl6*—Ë*‹&8§ñw]W³ÙÌ ŽH|ŸJ¿ß7ÍÄ|>7Ñ·W¿@»^¯U.—íú0Õ÷fM@-bヾ…MM§Ó1Û`×u­YŽF£&l¦1ÆÝ Âp8ÔÅ‹ÍÒ˜­…t$šÍ¦‹… ìÙüD"Û^ ‡CÕëu—4»ËåÒRÕ³¸ÝAÿÔA©#'„çl0¨ßï+›ãú0®:6P<€mÙˆåiø½ŽSМ¢Ñ¨J¥’Qÿòù¼QÙ0®Ùv”Ëeb®ën™ `8À}LC‘Ä}.‘H¨T*ˆàzaWÍç}K<778À`U&“1<ô;l½Êå²ööölSµX,ŒFé¥Êùå—_—V¾Ä/¿®ÑúÏÿüOÝ}÷ÝÏøý[o½UŸùÌgžÃ#z~öŸårÙ’D"!IêõzÌG£h9N[c4ûNÃÎva-Ù›ÍFõz]ívÛh-’ŒÒÂ&%“ÉXp“Yœ‘°ET ˜$›ˆ* Óxr5R©”M»°£ð £9I6ÇãÚÙÙQ»Ý6+Ûp8¬n·«x<®d2i[$IvºÝî–5,á}^¡0Áq8 !&_,–ÅÁÆ¥X,n%P{©OL½¡ê0±ç»Ý®é  ÑØK²{LÆ÷€ÍL¥R1Í€×j–MF86»`o&I>Ÿ·ÆÝ> ð#ðŽFJ[€%ÎP¸PaÏÌÖú¦u:-ÛZž m6z€t/XdËD0`¯×3ú©ô^Q>ï‰}H§Ó1 lÎ÷øÖj59Žcô¨ù|®f³i^ë]† lüø\òg³™jµš¹½AcSÀ–d€”×´zϵDÃò·~]/å¿üºF‹ôëg*lNýº¼ ƒªÕjf§‹n)i­VS³Ù4×£@  Éd¢~¿oÍ5®TXÒìá Å´q9zšŸõû}e³YkÔqq‚êâ ÷ƒD¾^¯·ò:hÕëõL¨MÃÄÖ‡ó—N¦ßd—@+ãý°…*”J¥4™LlÂÌûAKãYõ†ÙñžÐ¡Æ Úö´'жúý¾:ΖUël6S6›U»Ý¶fíÃd21§ªh4j¶É€,2XhˆÙ°U’dàŒpH6&^­Á``”&Iö»l•ŽŽŽ¬Ùç~>U Âwô)lÀ¸ÇùÙ’ñÌ¡âw7›úý¾mFx&s¹œm׸WÓéÔôhˆÊå²YêF"u:ÓÚ’ÉýPCc€V M=ù2ÜãÅba[¶Y|] .Vl•xV¸ÞlôGËåÒž]è8oyÈ$™•3ˆÞ÷BÃg }¯ ¥‹k…æÆkçì—_~]Zù,¿üºFë%/y‰þìÏþì[®÷W«•>ó™Ïè{¿÷{¯Â‘]ßÝ…Ð<×uõïÿþïj·ÛJ&“ºxñ¢¤“<èHl,ЋxÓÉiÙ„@oJ$æ‚Dº:âhé„*D³Jƒ(ðþ™‚£‡`‹‚(M9ï‹KS0T.—³ 5ÔoJ4Tš2ã|>o %|ø~¿oIÛ t1L…IÇæ¸Óé@ÞÇÐív­Q/‹&<'ŒÝ¤Á``4¤õz­|>oú ¨N^šÁp’lš˜ƒ~Ö„f4‘Hh<€ÉçóOKëFŒ].— qݹ¸Q±• ƒ¶QØl66E'{¢T*YþÛ-I*H³ßï÷5´¿¿oS~žAôý~ßÌ²Ù¬ÑØ0°ÉâyàÞ³MÇj6›[AŒllÐÖL&£¯|ËÒI#î¥òñ:O êãRY©TÌÞ݇W¯„b~ï {ažuÀמ{ ÐfóÂýôºáààgÛ ãÚyµ€Ák€ø¿®§òˆ_~]£õÞ÷¾W?ü°î¼óNýõ_ÿµuxx¨¿ú«¿ÒwÞ©o|ãzï{ß{µóº+’ÁqHJ¥RÚÛÛ³üˆB¡`SÚÓ§O›–±/ÎVÅbQ’¬Ùc£Bè bp8õXÏ)N+ª×ë™Í):Çq”Édl;½g¹\ZVA«Õ²F–ßÓŽ)l IDAT‡6Ù¥±„6ãÜ2}Ïf³r]×&ê4äк"‘ˆJ¥’2™Œr¹ÜÖö¥×ëÙäm¦äœ;€ 96¹4Š­VËŽ™FóôéÓfßJ`"[tóù\™LÆÞsµZi>ŸÈB³Ón·­-•J¶9 §„‰½7”Ítd2iÉäÒIÃW*• ð u:F#Íf3:uJ…BÁ(Y±XL•JÅÂù qÙ:x]¨V«•ªÕªûb±P³Ù44”'o¶Çx<–ã8fé .N«T*HCóÇ•Íf Ør 1 €F—ÉdtöìYkÄÇÇÇ[NÇŒªŽã˜sU"‘P½^× 7Ü`ôEšy6<£ÑH™LFŽãØg˜­"=Ç 5Ôétìúƒ-R($=™8ÏÖ‹ Üðvvv”L&MGÍ `Í Ã¿üòëÒʧ`ùå×5Z¯{ÝëtÏ=÷è=ïy~ôGtë{±XLüǬÿñ¿JGwý"ßN§cšx<®\.§ÑhdSèd2©F£¡r¹¬Õjµ•tÌdá,´š‘`0h×t:mô!&ÞP³öööÔn·-0&ˆ\éIM Sûl6kbZè,4g¡PH»»»fU꺮¥c‡ÃaÕëu!³MY¯×Ö`¢“ ™› q6›Õ£>ªd2©Z­¦v»­Çâñ¸iNhÙÐd2á/—Ë …ôøãˆæ“ßÙl6FµB‡°ÙlÌŒít0l^¡QȤa6“ì`0h¹#Ðè®üT6î7À*™LškW³Ù47ªX,¶•@‰ /eÌ .‹…ÐB¡`¿OÆI4U¡P°g ;\4¼?€ñ©ælmpÀ’dnO€4¸¡Ñøïîîªßï ‹¬´|ŽîL, Ó©Œóù¼é¸Nl9´FÞsΪ÷Ígc)Û«§Ú¦X.—5 •Ïçå8Ž*•ŠýìšzÙ®f]©mŵpn~=ÿÊ ~ùu ×/þâ/êMoz“¾ô¥/éñÇ—$Ý|óÍzõ«_m<¿.¯F£‘ƒ‰œqêv»FÍþ­8_Ü‹ØèÝï÷U­Vå8ŽQa â `ƒj4 ‡Ã:}ú´Y¿"”>>>6*Á‚h}ÐP |]¯×FIÉd2z—J¥,ÃÛ¨ñ3¸NÕj5…ÃaµÛmÕj5X.F(R±XÔz½6n<·só:±1qÇÒ¸Ñ(¡aA²Z­äº®æó¹êõº%³Ó ÎçskÖ¡T‘I²X,”Ïç–F $ ¬\.Û}%CzÒΖã yŘfLl]gð¼/= J´,„Ý™LÆœªØŽqÿ ð ­Àpÿ+•ŠQÊÐ3äóy5›M…Ãa•J%u:{6¹~Þí4(ža¯M4 ‹ÍNk®ëZ@σ—R…vÁ÷ÑÑ‘òù¼?Ï"`jtFÀˆ$õû}».h0¤JW£Ñ°- õzÝ@À_(’ëºvÎ{_PË&’×"/»mIæÒÚa,S2™Ôd2Ùµ~ùå×¥•@üòë¯B¡ Ÿù™Ÿ¹Ú‡ñ¼©|>ozÙlfô(¦£ŽãèøøXårÙè*ˆ¯C¡V«•òùüV&:BØÉd"IFB Ì× «@ŸšN§ºé¦›4 4lcBÓD#ɶ‚† 4#o¸Üh4²ü øùÍfÓ¦á'2¥g΂Z{Ù.\¸`º&ÔO,Óáᡪժ]ø÷^í@*•’ëºæ Åæ‚„öétªÑhd_€IæŠE®ËÎÎŽF£‘MÃ/”É;©V«–Ý‚,nFù|ÞòG¼i÷‹ÅB»»» F-*•J6‘Ǿ•­ºž7Ì›{iLÜ/ÀVÌ€À1t5€"¡}!x~(QÐùöóþ^Ä5@3@H&“v­ …‚7 ˆï†Ñ!áÆs†£@n>ŸëððPétZ‹ÅÂ6+lp¦ÂV—L<ß2àyd«æÕ‚`Íqðº8ˆaú@^ 4Dhƒ‹ÅB™LÆ (¼z!®Ï4Ÿï«Yþįë©| ˆ_~]õÙlôùÏ^¿ök¿¦ŸþéŸÖ7¿ùMI'"Î/}éKêt:Wù¯¿Âµª×ëwœÄðd2¹eŠkbt@ 0T´ŽãèððP’ŒÂÄ`ËålšÛh4$4ÉívÛT´¦1aÅb:sæŒ9ÿÐDòzЛФH2š `†ÍD6›U:V¡P°† ñ9íL&cBlSœ‹€ªÕª’ɤŠÅ¢9ш29&E»T6P»p2*‹f§[«ÕlS … L§Su»]³?–dÿ†††Ö$“ɨT*i6›™¾½M,S£ÑØ —ö·P(؆:׃ 9ZÀ&÷Ç(¨bP—$™E2€ƒš 6UVÒÇÙÎqýÙ”‹E³Fægãñ¸òù¼QÐjµš…@’t?ŒÞ8˜ÏçF?‚Άø³6jÞç€ ƒ¦ÃÁÜ€Í À na™LF/zÑ‹L„Õ2Ÿ1>C'ŸÅ½½=¥ÓiKºç~³Ùëv»¬ÇU*• ¸C÷B“„†ëî8ŽƒiO8lªÙ¼\ÉЭÎÕ._„î×õTþÄ/¿®ÑFzík_«¯~õ«6ù|Ç;Þ¡¿øÅJ$ú…_ø½ýíoׇ>ô¡«}¨×UM§Su:kPáÔcëé 1ÃÖ–æ©Õji2™¨V«)ŸÏÈèõz ‡ÃÖø 3•÷’l6k“ÙL&£f³iÇÁ4ô2HÁ–dIâL`ihiŽÏž=kÍ>éÜÓ‘ÀÍf•Íf‹ÅÔn·M<¼Z­T,å8މɬ˜N§[*nBŽã… -Èÿ÷+‰˜c•ëºf]‹nÛë1›ÍlêÖ)s¿ß·éö|>×Å‹­aw]w‹^”J¥Ìmj2™(X€ ”œ©2™ŒÙÖBÊårÀæó¹ …‚T¯^¡×ëi±Xè±ÇS±XÜT£‹`£2B‡ ¦îh„™…BÁÄä輚‘Hd«Q¦) ¦=Z­V[š'¨Fl}]Ä­ 06› …‚å£pþXO³‘C¯„û™wÇF‡ðÏD"¡n·k :×G/~^:18880È–«R©˜¹B"‘Ð|>×d21 À˜®q>Ÿ7 ô/ôŽã˜ [¬h4jÖÄÃáÐç¾~ùå×¥—¿ñ˯k´Þÿþ÷ëÁÔ_üÅ_hk ‡õ†7¼A_øÂ®â^ŸEÉD4™L¬Ñît:&8^.—šÍfj·Ûª×ë–òŒÓ^¦ë8þ@½aÍ$ú‘$sÎi4\˜®{½6¤¸FA—šÏç[‚XGÄÙÐMгt:?^ÙlÖ21høhq( ‡ÃF‡™N§êõz¶™@×€ëùt:5G-,v±¸‡æ:4Œ”Ëåtxxhü~þ=™LÔjµ,uÚy-»»»¶=…BªT*F•!ažé4çµm<› U­VÓ|>W*•R­V3úbjšx¶PårY‘HĨh„¦ÓiÛh‹Å­ÍÕt:5Ć €@ƒ›ÏçU.—íÞ×j5I2“œÈ†Ã¡Y½b…®ßïP”J%Ó%e2 HœÏ禃B;!É\¼ØöáÄ•N§-Ѻ"ÎnØGçr9m6u»]Ül{Êå²}¦„rØ@ce $Éì£Ñ¨êõºÝô¡PHŽã êŸ?î1ô.édcXHcNÁuÁK’Ñôòù¼*•Ê–áC,3'¼k¡üí‡_×KùÄ/¿®Ñzàô+¿ò+zÝë^·åÀD}û·»Î;÷ÜØu^@À\‹hrƒúý¾ƒâñ¸ñÒ¡¿à’`Ú?œTušªf³i” è¸=1ÍÍår¶E *—ËšÏçj4¦ÁðfD£QU«Õ-* ãù|n–¯4ɃÁ`+˜w)&ýÒI#V©T”ÍfÕl6MSàMòÆfj˜w’ Õ‰ã%d>Ÿ5…B^÷ñx¼ÕØÈÀÀÊu0˜ í…×2–œ~žÉ;Elh*Ûí¶f³™.\¸`6-€Žw’Îöi6›Y–Éññ±:ŽŠÅ¢êõº‰„5þù|^±XÌÂÙâ`u\­VM¿Ñh44•ÏçõÈ#¨ÕjÙ9,n¸á{M2M˜ècý …Ì]m<+hooOãñXƒÁÀ(i…BAårÙ@&–½¹\Îl—qv ƒ–4Päs¹œ. U"/ƒÏ +?¿lòâñ¸ªÕª½>›&€®^Þç Àý÷Úk{ÍHv¤@3cà É´-ÑhÔî-¦ "@}ä™âï¶\~ùå×¥×µÙýò˯§•뺺ù曟ñûLáýº¼‚ÇîÕÄãqFXJ¿X,T.—-ß{PèYX¥f³Y% º2If›Q(,1Š)ãPnvvv4 ”H$L°Îôz SóÝÝ]sÿÁv-‰Î‰DB­VK‰DÂ6€‰P(¤Z­f"\(hP€Ç1[Ûr¹làªX,ªÝn‡:}ú´\×5[[65Ýn×6;Lµ%Ùy39‡ÖÃy’ŸÂu⸕N§Õëõì5pÓ’d ¶$+ÞäõjµªÃÃCq€®n·kÀ- ª×ë©V«i0¨\.«Õj©P(@Y­VêõzZ­VºñÆå8ŽéGÐ|ƒAsÍb²^¯åº®KDÞGGG:sæŒ\×Õb±Ðh4²æŸ$w¯ð<Xð©ê›ÍÆ6r€NÙöL >88P*•²æ·+€7ºI¶AdòçF£a÷L:ÙεÛm3vˆÇãê÷ûrGõzÝ€YñxÜt&8j¹®«ããcÕj53‚`;l³Ù¨X,š¸- à3›ÍèFv/¼Ú¥T*¥f³i÷ ê"Ï$Ÿ6ŸkrS®vù"t¿®§òˆ_~]£uÓM7éßøÆ3~ÿoÿöoõßùÏá=?Ê+”ö†» sѵÙl4™L¬‰‡ÃÖ¨ˆ2˜MÏ)6Ž  Õétìyd ô`"´ßÙÙ1mt@B0¹g+ïß|ÙîA{„²‰sÛ2"{¿üòëÒË ~ùuÖÛÞö6}àÐwÞ©ú¡’$›~øÃÖ¾ðÝsÏ=Wù(¯¿bšK³GVq¥R‘ã8F—bR %e2™Xc›ËåŒÂ€œÍÛ’¶¡¡ Àò”fz2™¨^¯Ëq ‡CE£Qåóys`"o ¼uI6bétZÃáÐÜ‹hРI²p@IF³ ö4SÉdÒ6zƒÁ šÍ¦M qº",g°d2©z½n!/m†¦îøøX®ë Bì¿\.µ\.U,Í*.45 âÍ­pgë:!ª'Û;a§Øêð3¤xc<MxŽCÇÆuâÓü“i‘L&m›Á÷½g",iˆqÒâCSDVŒ7¯#«Ñh•°^¯›hœ°Cšõ@ `Û×uF•Éd4N­Q÷n-xž2™Œa€ÂlI¦ñÁž6•J™nˆ ”l6k¦P(¤jµºå¶ÕŠáph¶ ¼bré„6Åû ®G{âµjæÞ Cb{6šÅ³Ž:#ô8wÍf3Jp[ö :&¨W˜ðì1ݧqæ~c¤ˆD#ASžH$ @‘bH‚ª4 8B‰&E$Ù²ë嚇Cåóyõû}£7õz½-Ê€…mÌf³1G+4Iˆê ‹…êõºm2Øô ·ÂZ ìµ æYc«ä5èt:ªV«:::’ëº*•Jbü&Ý/¿.¯|â—_×hƒA}ò“ŸÔÝwß­ûï¿_ÿõ_ÿ¥ããcÝyçzÓ›Þ¤W½êUWû¯ËÂÒ¶P(- ê—·æÌ]¼xÑíÁ``ØÍu»]k² ­ ½ =”@稣£#% …Ãa ʃòÈ›ŸgÓáµWÝÛÛS³Ù4 U8ûLÅ9Wš<Ü‹²Ù¬.^¼hT1oøÜz½V·ÛU­V³Ÿ‡f…+ÎCÒIª5ÂaÀÇP(ì½ ‰cj‹[“txЬ×k£¦M&“-®}¿ßW:6Pý`¼|>/éd“Ã&† $£^‘]„=“Épˆû˜ÉçóZ,f![.— dag̵°©ÛíJ’9’AMâžòŒ$“IÛZm6•J%Û"¬V+U*{œí­V+Ó˜`0Èá9dˆMp«ÕR½^W·ÛÝ2/À^j¢médËÂ}C“Ö‡b{„8:`c0X3ŸN§‹ÅtîÜ9Õj5U«U£lM§Se³YûŒçMÑÀ¼F@zéœ0IG NØÚ„D"!Çqìõp8‚kNs …ÔëõŒòÒét”Ë嬡 féÉëíïïªV»Ý6¢f´ÐøþÑÑ‘z½žÊå²5V¼7Sb(Q‹Å¶P€˜¶K²c›Íf¶!(‹F#£ùv]WårÙ®Í8 k£YfÛÃäž@<éIÚá`0P¥R±ó„ž³Z­4›ÍÌ%h0¤ƒ F­Vˬp†5Ÿ¼T'@$™år©R©¤Á``?Ûï÷­gÚ¾Ùl,“Å«¥‰ÇãfEÌ3 É2IZ­–å… GâµÙˆpÿ€^(Uœ@ `Ûºn·«\.gÛ<èF\sh…³ÙÌ^«R©h$φ-”&„Ø¡PÈ2=b±Ø= Ý Whvm„ZEHær¹T»Ý6úßh42;\é`00 Ægº!×t<kµZ)•Ji<k¹\=ÏK“äsÊó‚!Æ’ J'ú“n·k:¬k€øå×õTþ'Æ/¿®£Z,zà´X,t×]wiww÷jÒuW¤q£§`B Ç ÑsçΩ\.+ŸÏ›Ð™†NzrbJ\>Ÿß²…Å66“Él­1gK -ÄKsaËÔ~ggg‹ÖBèŸt²aF*‹:::R¥RÑp8´Ð>I¦-L þF \*•LE*Í2upp` *bçF£¡h4ªl6kö¥œ9'8Šá0„Ð]†7@J‘tòÌ‹EÕj5³ÄeÛBsІjŽW<ŸH$l«E+4 étª\.§P(¤V«%IVÆã±¼Åba®VlYz“1ŸÏÍAìèèÈèC€LZ,cq ‡Ã6ýgc‚®€†šÍÏÏÇb±0K_6è;¸ÐŒ¼Ô9žŽ ×|>·ûŒí[6›µíÁ’‹ÅÂèXZ Äñ’¶>X·Z-³|fC>J©TÒz½6š ú-ôU€\@[,|±1æÞ¸ù¢SJ$[¡†™LÆ€¡ï‚å—_—W>ñ˯k´~é—~I_ÿú×õðÃK:ùŸöí·ß®‡zHÒÉ”þïÿþïõÝßýÝWó0¯»b"Jãʤ‡;¯SN¡PØrðakB#J#Ž)®Lˆ³iòiN S£yƒß?0¡¤áEc; Ï‹ÅÂt'ÑhTÍfSétÚDèétÚ¦ÛlJR¸&°Ïç*—Ëê÷ûÖÐAÃêv»°HK§ÁD Î6É z #›ó“Nh_ØÃîïïo¥³„P€Ç5Êf³–Hú<|~  †ƒAk¡ŠP¦Ó©EîÛ0èr½^Ï€–Ê@À¨`^:Bq¶=8_¡Åá~³}ƒ~XfS–„ô((Fl¹ÐÒ¬V+={VÍfÓhÉìØö²AÊçó ‡ÃfW»³³c¿ öº_ý?öÞ<Æú»¬ûŸmξ¯3s/-”c-‹Ä` y (¤ÑX%q#… ’Cm£\¢ ÄD 1 ÅÖŒÅI4biïmfξ}Ï:g{þ˜¼®ûsX~Oë¯03í÷Jî´÷,ç|·Ó^ïëz/™LF•JÅŒ Ð ±rsg²»Ô)#€z&“1ºÛîî®éžB¡)är93”@à°à<ɲÁéŠs—Š…55t<@ [èPÙøóù¿üzråbüòëŒÖßÿýßëMoz“ýýÓŸþ´þýßÿ]ÿøÇõÃ?üÃú¹Ÿû9}àÐg?ûÙS<ÊóWÐ5°"eº%‘H˜m)W&‹ðßiLq£Ð@×a,ˆn–K²æÕ2C q)Vh$ܬ’Å™Ì’è µ%‹)N«Ùln5Dý~ßœž¤“¦=™L*™LÊó†lBë$Y0e¡P°PÊL&cמ¼B)Ûí¶QÚ ¶]«T*Z.—¦bR¤aÇ) -ï3ŸÏU«ÕtxxhÏ%ú׉ûÔl6ÍN˜gÁw(²pôK™LÆì©¥CÝ"Ý×—­Ùlf‚nhˆ\?>7Ðýpê÷ûöÜó¹ËçójµZæÐÆ3Ãf °ˆÐñÙcXÀf* p°“7“N§ ¬h¸þœ7àM’m_N»üm…_ç¥|â—_g´êõºn½õVûûç?ÿyÝqÇzó›ß,Iº÷Þ{õû¿ÿû§uxçºpO‚>‘Édl¢‹ˆ–ëS^6#4ÛÐ[ œ0™E'@cé†þQpÏ'“‰†Ã¡5¾4ìLo™Ø§R)•J%IÚšÐÒÔÎçs5 ÛŠ·Ÿ A(&ÐHHiçøÈSˆF£F1£YfÊL‰ð‚ŸF·tSCú6"ýÕj%ÏóLÄ í÷ÙP Ï  FÇÀ1ÂÙ'xo±Xxãœiäûý¾5¦¥RÉîÓûH$bÚ@ˆ$ºãn†+:Ž›D*•2°‡Õl6M¿Àöà†CÏ[4ý®;@y4Ùæ-“ÉèúõëŠD"[vÆP i–¿=Û„kŸH$ŒBPä~ãÄ–Ïç-û†sEáš#@×£™¤óþ.hpÃ'¡ÅqÍÜSè_è{r¹œ}†ÉƒA‹Åìuxަөm6¹Žî&Š!Ú%‚5Ä€€›»5úå—_O¼‚§}~ùå×w/¨Ò‰ÞàÿñuçwÚ÷¡øõäjµZ©ÕjYÓD¶46#LnÉú@+¬™Gàn,p6 ‡Ã–òN§uñâEíïï›-()šYœšpEB'AƒæZýËaóÁûÄF9[èRƒÁÀh@FC£Ñȶ ä“H2Š›·}‰ëˆÛV·)C§Á$ܽ©TÊÄð¼N6›Õþþ¾½&Sk,ÝÍ•K·!Áœ 4ÇA“ÉÄú¯Q­VUˆ 7à2›Íš`ÍŽ¤­,¨;X*£O ˆ= À›\h^€hG8z´È±²aY.—fJ€;âržËù|n¡‹¼6Ç ¸p©P4øÐŒØ¸á…\7DÚ‹ÅB¥RI¹\ÎDðn¸!`–c€¾Å1$ Û”ñŒâú…°Â½f·Z­,‡s`ûÈç‹m [Ÿp8l ƒÍ`Z£$ûyw£$Ï„{ èàv±Ýú~üñ˯§º|â—_g´n¿ýv}ìcÓý×éw~çw4õ“?ù“öýÇ{LÕjõð|V:¶À2þ¸ÉâÒMŽ9y$A»MT§ÓQ¿ß·Ð?(Lè7à—×ëuu:õz=ãÈ/—KíîîÚ´‡¥t:­Z­f€Éê©TÊŽúÌb±P½^“ÚMš IDAT×xË/¿Îh=øàƒzÝë^§¿øÅÚl6zãߨW¼âöýÏþó[÷ë‰j0´àAÄÖL9kÓÄÒpAoñ7P¯púÂ:›L‚Ùvåóù-$ÉÌ$\+h„ü_âvG¨b.—S2™´ì¶-ˆÙùïÊ3µÚí¶|ðA]¾|Y·ß~»¾úÕ¯~ÏŸÅbúøÇ?¾j²ÙìwüÜŸüÉŸèmo{›~æg~Fï~÷»õðÃëï|§¦Ó©Þóž÷|?NïpùÄ/¿Îh½â¯Ðþçêá‡V.—Û ìõzú¥_ú%½æ5¯9Å#<Ÿ…@•)1œuš8&¼·Ür‹Z­–QO f1冫‚Ð3š8܉’ÉäV‚3[éf{…BÁ´Mèn­K²¤v6[žçYÆ `…0I"@À1ž;@ŸÁ@ `>—Ëi0˜ʵZÎf³:<<Ôîî®J2*ŸîÕd21ê™Ê1±=ÄZø,ÔiÙðîíí©^¯«R©èk_ûš^ö²—}ÏŸ ‡Ã[æ*ß­f³™Þ÷¾÷é oxƒ>ó™ÏH’î¹ç­V+=øàƒº÷Þ{¿+hñë|Õéï ýò˯ïY{{{úÙŸýYÝyç–?!4A¿þë¿®—¾ô¥§xtç³Ütc²3¢Ñ¨*•ŠÑŸ.\¸ @  l6«V«ev®4ÖLñ™ â¼D@£Ç=c‹‚؛ƒ©9ÛÀ›ˆÉdbÖ·…BÁô³ÙÌš!馵p§Ó1:Ûšir E ‡Ck^ùŸùjµ2»$5 Ó.l6»V{{{¦—qó"Øê ‡CÕj5•J%³Ýl6:>>¶Éu$Q·Ûµó j·Û¦¿Áþýh4R³Ù´Fq±X(—ËiwwW‰DÂR¾™D ˜¹tªÅba¶ÇëõZ{{{Êçó¶ÀQ«X,š 3sîiã$ÂCZ,ºzõªZ­–=3l 8®T*eÍ¿«ˆ°5á{®Æa<°A›Ã}uŸA¾_(4N-qœPDÜŪժ†Ã¡ŽŽŽÔétì¹—NÀA³Ùܯ€^(}rŽ‘g]ÚÖS`ÝlN¬§ …‚ý¶ÒóK¥’Qä$™á׋ Ç|>oÏb~7?G’hqüÖÐý~ߨV’l‹Hh'à z"Ïô²³â‚u‰DlsõD òïUÿôOÿ¤n·«·¿ýí[_Ç;Þ¡Ñh¤¿ýÛ¿ý_«_g§|â—_g´þùŸÿY÷ßÿ÷üþý÷߯‡zèxDObÒ<mò[(4ÔjµÔl6uýúu³t%é;›pN=\qøæ¸± `zо„íYnÂ2¢ïxŸ7½ ”0À¨6Ò‰å-ö¸îÔžÍ Ÿh4jÍ9 s(²I|6›ÕjµÒþþ¾jµšÙ²¢Ñ‡æVÄöÀ`À6·X,ZH"–ºM;× ­†$£±Q`ó E¨ŽË4.À46î=Ózì±ôEcâ&Ô#òwÝ¿H=ü¸A“.ÚÛWÌ`œf:—Ë©X,nYÎro˜Pù)ãp8T¿ß7›a7ƒ…÷a«€ r 0p8>880 †áÀ‚ÔôP(dÛ8>{ä›pí7›“@ÐT*¥l6«~¿¯V«¥áph¦ €1ÿ¤™³nW«Õ̾ºX,Úf@7ŸÏU¯×}ú,ÙlVÅbQ÷ÝwŸVŠì«—¼ä%[_ÉK^¢`0hß÷ë|—OÁò˯3Z÷ß¿jµÚ÷üþ£>ª‡~X_ùÊW~€Guþ‹€`0¨V«eÿƒÅ•‰¦4Øtçyà‰< >!ªfr‹`MI¡Pз¾õ­-ÚM:¶ ¢qØdàÜÃ6€;VšnIÖ´¹¶¡XòÒ@BéB÷Áë U‘Nè3®{  ñ7*ÐÈàÏK'!™4’\Dé4ÚÍfSù|Þ624’ÝnWÁ`PµZÍŽ:´%tn3)É®ÀÕ. ªÛíªP(Ø6‡m Âghp®°½Ñh˜t,¶6’LC€Ã”æpY«ÕÌâÐCÎ@Lؼp]] ﮦ\.o‰ÐbËåÒlx“ɤ5ó.}+“É(ŸÏ[Ͻàºà´†&`¨|®×k È£·qít½^Ïhf4î$·³e@w•Íf•N§MôŸÍf‰DŒš†Ž‡ó]¯×ö¼BëBhîn2úý¾ …‚QŠl‘R©”9Òa$ÀfÓ½oX,×ëõï︞µ··§÷¾÷½ºãŽ;´^¯õå/YùÈGôÿñúêW¿jᣣ#…B!³§"‘ˆŠÅ¢OãðýzŠË ~ùuFëë_ÿºîºë®ïùýýÑýÿÜøõÝ‹­R£Ñ°I3Ô¦R©dîOLˆ¡41±Å’zâTÏp8¬v»­jµjM‘tBŸËårÖœ!`§IoµZ€F󯙦°ƒÈÑ3€'èh·ÛÖ,s¼ â<žmÏb±0Šœúp8¬ýý}Ë@àõ"‘ˆÆã±Y”"Î…’BÆ À†pAI欄ؚ&1•J©Ó阨œ{€Ã–¶‡S™tÒ(âÀD¾Çx<Öb±°Æêš\h.ëõºö÷÷åyž¥ysMݰR©da†Üwžž'Ž úÆ4ån‚<*hFК$ $§†m–»’ìùûö„qÄëŒ|>o6À™LƶNl{6››Éè£ÑHÉdÒ6ˆÛÑ©2ùçt:µÍÔ7¶,€ hKluЖ°ŠÇãösаøyž§t:m¢úH$bá’€R6.Ð$Ñ'¡±BlﺜêÎä°Ù´q¿x/7+æ´ëû¡yªê7ó7·þ~÷Ýwë9ÏyŽÞ÷¾÷é¯ÿú¯u÷ÝwK:ùœ|¯Ï”_ç¿| –_~Ñ¢¡ù^…¦_O®à}“¼|ùòek²hîÉÊÀRúŠ$sŸbk ‘Dø õìg?Ûšt,kI‘fÛÀFƒ‰æ2—ËY"3"Ýb±¨Ë—/}Œã‚¢E˜àz½V³Ù4ðÐjµ$Ý œÍfj6›ææÇU(L{"¨3•JEëõZ­VK½^Ϩ*L†/\¸`À Q,•Ïç%É´„ó% £µ Ú†ž4ÔívíûhT\ý ÂñÕj¥d2i­{ Ù¬×kíïïÛ(Æbww×L\J€s±Xèòå˺pá‚+z®3ƒh4jô°h4ªR©¤|>¯h4jÄÍÕjÕ4 hJØÀH2IÃ_(LLí2²MÁš:ï5ŸÏÕív5N-í\Úæƒ>È•Nÿh“ŠÅ¢J¥’mKÈéèõz¶‰bë}M#T>Â8Ûí¶é'€¹[e2íîîÚµbóÃÆq¹\ªT*©Óé˜ÆÃݾºÜðI¶š Ðpÿ#‘ˆªÕª‚Á šÍ¦=S©TÊ>_|n h²tuE~=ùz×»Þ¥@ °µÉÇãöß‘o/À©_ç¿ü ˆ_~ÑzÁ ^ /~ñ‹z×»Þõ]¿ÿ…/|AÏ{Þó~ÀGõô)&êh¤“­Èp8´É:ÂjIÖ|d³Y³£•dM#9Ò‰ýê`00m ›’´IjÎår–¡þ[QrE6›Úí¶ÓAÎjµj¯-ÉÀÍ7îDårÙò6Ðv4›M7¼ßl6³-Èáᡠɱˆ…ê…F€ß¥±fbìþ,Í "sR±#‘ˆÑ›‹…*•ÊVv“j&̈ ]·$ì€S©”QÛH¥§ÉFæ F¢x2™4Ðð ½Õj©R©¨R©h±X¨ÙlÚµ»pá‚Ù0c“Œd>ŸpÙj8jww×ÄóПØÀp 4ì€46 žç©V«éèèÈÒßÑM&U«U£§I'Úײ™m5\­˜Þ³U€âÅ‹¿ÕjiµZÙv'›Í*•J©×ëY@g,Ó•+W `qߨôáæðÇhS©”úý¾m"±åuM ™èž èVpö’Nô»»»’dÎclq 9J2‘}*•²ûÏ÷i‚I:g»ƒ@Úœ›GršõTè5yä}ík_ÛúÚ÷sã€ÙC·Ûµ¯íîîšÓœKÃÂhcooïûv<~ýàÊ ~ùuFëïx‡î¹çýüÏÿ¼Þÿþ÷ë9ÏyŽ$é›ßü¦î¿ÿ~=üðÃú“?ù“S>ÊóWnÖ©Ðs"šÂñxltœ‡Ø˜0ÙÅÁІž­ëÌÿÞuß!ÙštlI–;0,ÈOÒ–å'[ Ó÷@  N§câwÄ´l(‹…nܸaÿãGÌÚÊ-·Üb:ÏóL°Ï>~¥R±óÇš7“ÉXø"ÏóL_Ãy8ªZ­ª×ë©\.ø*‹ŠÅbª×ë¦E‘dÜ{Ι×,âð„Îz '1¨KBwÄЈ×Ù2pÙ¸v­’ìz sPK§Óê÷ûF‡f˜ÏçÍ€f;ÛZ­¦F£a× Ý›×íªP(m Ê 6Ïz ŽÀLj8:@(FCÉdR±XÌè^€mÀ4[¡n·k #[@ôSàʶÙlŒ:èê0°nµZF›Íff±Kʽ»á <ϳ÷@³Äyrÿ.X óÜ6øŒ28>>¶ûE '€œfO‡zéK_úîŠ×¯_ׇ>ô¡ïËûF#µÛm•ËeûÚí·ß®Íf£GyD¯}íkíëÿöoÿ¦õz­Ûo¿ýûr,~ý`Ë ~ùuFëÍo~³¾ùÍoêCú>õ©Om5’ôk¿ökzË[Þrš‡x. úÓq—¿Þh4T©Täyž5ß8å0µ—Nþ§ M îX4jÐD …‚éCL݃Á :ŽM™‰„øÿ4:4„îdŸæ²×ëY㎆$›Í* éèèÈô¬[«ÕJù|^ÍfÓÀ™¢2q¾õÖ[õøã[âv«Õ2·$’»i¾8æÉdb e½^7—"W ½\.M‹uˆgœM†$sá⺴ˆS€)4¢{62ÅbÑêB¡ ƒƒkº ûÕl2™h½^«R©ýŠûÎý¢vºH¶‡ÚÃq’-Â1CEs35°ŠEŸspp`דgÇ46'œ#.mŽp8lÓahK¤®â¸þ¼/ ÃhMœ[,6dhKБ¸N*=  ù5›MI²ç‚ÏBµZÕáá¡åÛ ˜g‹åÚ£™A‡4ŸÏ-p`×étLèOø#Û2´<¸ÇÛŒ$Û“à(—˺víšy×:˜aÅiÖiå€<‘â3Áæ˜zà$I¯{Ýëìk¯~õ«U(ôÑ~t €|ô£U2™ÔOüÄOüÿ>¿N¿|â—_g¸~û·[¿ø‹¿¨Ï~ö³zì±Ç$IÏ~ö³õS?õSzÁ ^pÊGw> š uLb+•Šz½ž54ûØyÒĺÍ[´ëõZW¯^U>Ÿ7qïp84úO 0ª“Ôl6«n·kS`ò?h¨ÙTL§Sû=Dì¼'oÐr¹œšÍ¦…'^¼xÑh\pÕ{½žq÷Ùø œ'Y= ªßï+›ÍZç&ƒÇb1•J%YÓʵ©T*FY!Ï$ mm[Úí¶R©”Ñ„h˜g³™M 4W/^Ôz½V§Ó1¡<FèiÆã±r¹œ9%a(pãÆ­„zê<l{ îH²L—ž‡Ë IvÝ:Žvvv¶6‹ÅBµZÍ`¬×ë)N[8@‚pG®'z€l(²{ëZ<ßîçóy›ô¤ØÖ±i“nR ¡11ñ—NÕҸ’c±˜Úí¶N´(lµ8f^‹gª”k4Àæ *6Ôî5àp}Íó9L§Óæ(‡S\³Ù4 5ÌË?“ëÿøÕï÷upp Iú›¿ù]¿~]’ôÎw¾SÝnW?ò#?¢7½éMzþóŸ/Iúò—¿¬/}éKzýë_¯7¾ñöZ±XL>ø î»ï>Ý}÷ݺóÎ;õÐCé/ÿò/õ[¿õ[–>ï×ù.€øå׬Ùl¦O~ò“zñ‹_¬W¾ò•zßûÞwÚ‡ô´©Á` ñx¬½½=u:I'MX»ÝV&“‘çyêv»–5àNÕi¢He¦Y¡‡ ‰D4mÂ}£V«ÈALIr4 :ü|€Œk:m '!(A4C½^Ïš¦d2i¶•¸wl\'.tdYš˜ÒO&k¹Vâ–N§upp`à€I3T6€;À‡$£´¸6ºL§#‘ˆZ­Ö/ŸûJƒë:/!âç½°Êå>øàÿ§Óikî™l_»vM·Ür‹9}Õëu³_P0]ßÙÙQ2™”çy–iÒl6Õëõìg¡e2%“IµZ-kš¡„år9]¹rÅ€†dÅp­ uƒ„fQ9®^lw•ù|^ÃáÐ,…ÙZñ|ú†Ã¡‰ÎÑïð s/Ñ`SÅ.n|nH-GƒÃ9±=à9sïõz½Öt:•çyªT** jµZ¨ÙNñüôÇ»öÅ܃X,¦N§³µ  J&“Fï´•Ëe³iF?“N§íšãfÆÆî4ë47 ¿û»¿«k×®I:¹ŸûÜçô¹Ï}N’ô ¿ð ÊårzÃÞ ¯|å+úä'?©Õj¥Ûn»Müàõîw¿û;^ïmo{›vvvô{¿÷{ú⿨‹/êÿðõ«¿ú«OíÉùujå¿ü:ƒ‹ÅôÎw¾Sþð‡õÊW¾ò´çiU8ßÐÈÁY_­V6å§1<Ìçs›Ök° Ó„B!yž§d2i¼{ÒɈp'Àü^8Ö… txx(ÏóT­V-Àê÷ûÖ B#"ÐF B “lèzñA3!PÍRLÀqc¢¹fSƒ>“ɨP(­‡×!|Ži0vº®C×­Ûíª\.k:ªÙlZSÎ÷™¤g2år9ÿ?‘H¨\.«ßï+Nk4ÙÄš|š_^ËÕ7 a€B5ŸÏ•N§íZ0‡Ã&°'•©7(/v½‘HDÙlVñx\õzÝ@Ád2Ñþþ¾f³™êõºªÕª…í-—KKòFØžL&5 ,TPh€ò,p½i„U.—m‹‡©çN§m[âfzpÏÑÝöœ¡PÈ6gгÐFA]@óÙacFÖÍ,ϳëü ÍÒšçy8š9`ѽX£]ÂunggÇÜÔÜÏ›'Iöœ>ÓDòUѦ†Ã¡F£‘J¥ÒV@ä3¹üñÿçÏ|âŸxR¯yÏ=÷èž{îùß’_g¼|â—_g´^ô¢Ù Û¯§®hx\× šv¦ß¥RIžç) Å ûÒT*eSOBõ$™Ô`00:ÉÌFæí4Ä4tL½pØ`d7-¯„);LJ»Óh4R:¶l\” !wÓ¿9'7Øn6›i±XØö¢Ùl*—ËY×ét¶2¢Ñ¨¥Å#¨–NDÐ4Ä81 Fõaó¦-E³ÙT£Ñ°Dw7xóÁ± šUµZµé6VÆëõZ¥RÉøû¤X£ýÀÕ q4ìl6³0Pî‹»… ‡Ã–HÎ$üJ¥bâóX,¦ÙlfÂgž'6С#u»]£îM§S]ºtÉ'fÇÇÇ–6NÑ·tB ›N§ÖÜ»ôA÷ïlг4 S;;;[€V’MwÀ1š4,ät •Â] +#ù\`&দ»ÎU™LF™LFívÛõ£aƒm.nV£ÑÈ6Fù|^?þ¸éüä%Jϯ›W¡P°ëìþ÷ä4ë,k@üòëÛë™ Ùýòë ×< |ä#ú—ù—Ó>”§]yžgth5ÇÇÇ–|írþ{½žm=p¥¢$_ŠF»Ý¶Æ­X,*“ÉèâÅ‹Få ƒªT*ŠÇã*‹ :::2.ûb±0ëQš§D"a“dš}hG{+•Š¢Ñ¨n¹å›úT‰„žýìg›-+ù®³´ªápht.61¤VÓ¼ºæ|>o“n´€*Ü›h ¥“mM N`5èVèKqLåc±˜ööö4 2 §Çê÷û¨°ß…¾‹Å,H-ïG˜`"‘P¡PÐl6S¥R‘$kn|@@—.]ÒÅ‹í9 ¦1™Ïçºq㆖˥ŠÅ¢Q§í| ñàæ0UçÏr¹4@ôêS °†žÍt¹B¡`!z‹d2i ìÒ =‰Ÿ<ðl£·€ÆýFn2™(ŸÏ+Nk<k<«Ýn›±›[‚©A¿ß·¼×N’ ࡸ$Ùóå Ç7ØPC‘ ‡Ã–øžme»ÝV§Ó±íÙ6#)ñØf÷û}£“ñL…Ãá3á‚ù~üñ˯§ºü ˆ_~ÑúÄ'>¡R©¤W½êUzÁ ^ [o½õ;˜€>ó™ÏœÒžÏ¢µV«©ßïk0XãL2ôÑÑ‘Âá°Âá°¥AÓŒÓ|Áa§†6Ãï!Fv5€r.‰„J¥’®^½*I¶@TŽ0zŽ$£I²†˜8ôû}k´³)´lØÒT*›g2k i‹ÅâÖT* Àó<ÛÀ$“I5 .Pih$ɉèv» ‘!¾vµ&PÄêõºe«D"£Ø (Æv˜;„â£ÑÈ6ù|ÞÀI±XÜš^ÇcÓ‰01§Ñe+†Q[š^ÒÕq;Ëd2J¥Rºzõª™p/Ø~U*Ûär¹-c€\.gf8²íííè`³ ›ZšEœœ<Ï3pÍv‡Êf³Ö8ƒA\ÿR©dF йÜ-›¨\¼IP±?T¢ƒ"#‡óæµGlâHç58þÉ=su]6nhp ºñ\år9û;ËsIæN³ÙT¡PØr$#iÝ/¿üzâå¿ü:£õÐC)¨R©¨ÓéØÿXÝ: S·óVžçI’qßÉ/ÈårÆãžN§&„¦!Á çœétjƒáp¨b±¨H$¢Á` ýý} £ ‘O€·ÛíZÂöh4Ò­·Þ*Iêt:Ö¬µZ- ’ãxhLä+@Q:880ÝT%éÄB•FµZY#Ëå,8À$ÉÄÛ8Jíìì˜v¡ßï›;Û 8ô¸Ó¬×kû÷Åb¡Ç{Ì6(LÀ¡A1†Ø#çÆ’ŸÃ±h±XXFãøøØ¬„S©”âÜ@›Ñï÷U*•l Ïv ]îI„þ¡c€¢Æ{¹†п ±¹é÷û¦Ó`{vñâE-—Ku»]õû}sEÃ% -'ôDÍfÓ6qlkhÚq¡ÂšIÿz½¶ ?@@·Û5Ê–ÍîóttdÙ'Pûp…cCˆ€pƒ@'/ŠàHî!÷ãÛƒ'yî ¦AÔZÝ`00Ú íèèÈî•$ÛnpýÑÐ0 àù¬/—KÓ&ñœý Ê×x<¶mÒY)[á×y)€øå×­z½~Ú‡ð´,‚Ó ”ƒA•J¥­‰èÎÎŽ¹í@½¢‘EðZ.—-ǃ¦Ê|ùñxl±$Ëç é &:¦áäç ‚(Éf³* úÖ·¾e|T4 IDATŽWæƒjµš<ÏS¹\¶É9yLÛY|}8*ŸÏ«X,Pê÷û6ù…&µZ­ttt¤\.gÀ×MÒF?A ÝnWÁ`P…BÁÀ#} *]8ÖÑÑ‘™?¸Ô(hXóùÜ€‚$K['w„`C2LÐèŠ[ŸGÞ Å3A &f€EhzPÙ|ö1T‡Ã[bw¨e~ùåד+€øå—_ϨÊårŠD"–7€»P§Ó1ŠŽçyÖdD£Q%“I]¿~Ý&ÉÇÇÇêt:6™w-]{½žòù¼¥€3¥&³ÂMn&ˆI9ÇÃvÂÏ2q_­VÖ¨c÷ʦ£Õj©\.[v‚Zx¬S …‚¹!ábEãÈ–ÉÞÞžM¡Çcûþl6S·ÛÕÞÞžQÐhî24ÔÐÃàñ#¾ïõz¦O …~„Àžæ‘­=Í'“_îZ„ã|í‚z´(Ц6›å®:HÃК|@Ù,h0¤@R,MÜMÓœH$Lá 7‰j\£Ñ°{‚[° 6‘O²^¯õè£J’5â _£Yg›Gî$;>èK¼.ú~Ž- –Åî6 Ã×1€~···gz¥ Þ†"èˆÜh‰€ir}~ä΢\¡: †tt3¸ÄñÙCø% s2™(“ɘÓ:+Îó´Ë¡ûužÊ ~ùuŠÿIÒ¸¹…PÖ¯'VžçY#Úívµ»»«`0hÍ'4—NÓ%ÝÔg DgŠŠ :ó\*4ªÍfc´+,T¡?a;ÊÖ… <ö£ù|ÞhdpçѦL&³ÅdãBö–¦žç©V«i6›éÊ•+f/ MŠ-S^…ë„+437¥=N›¶q0o¯×3~= MŽ ÜTt’ß‹ívÛÙF¸Í<€=‚éh4jÖ½¼>:™N§cÚŒF"5 su‚ÎÄ–ÀÝõû}k˜q¼bóµjf®3U45½îh–±ÇÇÇ0pEs®ö÷÷MðŽžª”D®/Ïw:Öt:U(2ÐÌóKƒÞûd\ÑЃ`̳”ÍfÕét,—†­×ÑÑ‘²`0hÂoé¤sýq‘t±=Á(\¶.©TÊ€{$±@N>L$ ý±9äŸîw¡iñܲÍôË/¿ž\ù.X~ùu†ëÏÿüÏõC?ôCJ$ªV«ÚÝÝýŽ?~=¹¢I¥¹¥ ¡‰Îf³ösLëiÒht±J…ËÎѬKÙÝÝÕþþ¾MœÉ éÍårªÕjêv»:<<´ »kiJˆ IÜl3 $íîîêààÀ’ÉLØáÎÇãqÛt`1 (@ ìòâƒ$éÒ¥K¶•I¥Rºpá‚5à4ïP­çÒÀCqáºÅ@øß-·Ü¢L&£Ë—/[S·\.ÍɉkwåÊ£GaË“U¹\ÞºÇhØX±9¢¡F8ϱAGB4U(lŽ$NhdKV¯×-“‚­ô¶€C´=®©º"šcÁÜ ûÛv»mÏZ¨xèc&t’ɤ†Ã¡0è:‘¹À ꦌ#lN]¯×F1¤Ù',r³Ù˜&c0ÐbÇ-œw.iì€8h“<³ØA»×Dú€œÛØô$ Ûl¹P´Pçó¹†Ã¡=®½ñi–ï‚å×y*â—_g´þìÏþLoyË[ôã?þãúéŸþi=ðÀºï¾û‰DôñÚßßׯüʯœöaž»B0ÊÆ±«ÛI'ÓÙ~¿o"oW U«Õ,£ƒÆ‘†‘”æL&c“ph;Ð6f³ÙVsz||¬½½=Ó†}Äó¼-ÀÔ•¦ØœÓH¢=`‹CÓÈ÷˜sŒµZÍhEèàås~L¦™„Ó¸ÒÄá$…¥ª$¿K²­‡;IÆ1 jBd6ALÞáôC/T!FÆ:U’]Gî5âáÕj¥ .¨ÛíÚFG&îí|>7:Ï Û Ì xšíb±h6­’ŒZ$!¶Pø°¡•d®N\ ×å «`šèù|n÷‹gã'û„T{{—’„^m pERëÝ׿à€ÙFðœ¡ý‘N¶%Ø.£ÍáxØ´@IÜlNܹFˆØI7ÇLÀ3ÎVù|~+«„\(’еÙäïàÄŽ )Ô¯P(¤T*¥áph”9ÀÇï7é~ùõäÊ ~ùuFëþàôš×¼Fÿðÿ v»­x@wÝu—^ýêWë7~ã7ôÒ—¾Ô?þ/ !-âãÉdbúX,¦r¹¬z½n`!«P(¨Ñhl…’ACJ ¶t@h²%™e'´‘V«¥t:méëLÙijâñ¸MËÉ(¡¹â÷òù¼5i$P“džL& ÑHI²Í ¼|Ú4€ òH˜.O§S£ø Âçú 8›Í¬éÃêÝMº«% Ùäž@EǦCèv»F"¥ô§étjÓw¶74ëÒIöf£Òëõ ,$ sõÂQËó< [$ì¯T*™ý."|`L&5 £ðÌf3ƒ£7™N§¦¥A«€®@ÀVû_L­h(x¦€ŠÅ¢z½žmí$™V„FßµóP“ìíjrd|­Ô;èM’ÌÖ‡®åri9ÅbQý~ߎÙ5EàYà3ë€­Ž«HÄb1Û^b ì!Dè ²S¸ÿ„âÀ¶^¯U¯×Ír­Ž{]~®Þ*ŸÏÛùãöuÚåk@ü:OåS°üòëŒÖ£>ª»îºKÒÍÿÑÓ„‹EÝ{ï½úð‡?|jÇw^ úÄp8Ôõë×­ùEœ~xxhShÄÃáÐ@€{/R©”$YÂ7SìX,f[•N§£Éd¢££#­V+ =Ãæ•×Ëår6݆žäj7²Ù¬M‘ÿ^ ï´Z-³JåÑR K‘dÔ7È­ÛíÚ±ÒØa1›L& ”°iI&“–“@(š†v»mBo—æ†û¡‰è(êõºe°ôz=£¾1e—d›¡^ѰÆãqÓb`K¼\.Õh4äyžiDi’¤£ÿ å¼\.[öçG’]CtA½^O‘HD¹\Î68Rq¯É)‹6gÛ"ÝÔíïïÛ×2™Œ]÷âºAËréèèyúý¾=§Ü#6 ¼›@t=º9^Î0J. z¿ß·m?”&®5ô¨n·k[ÆÃá°åw`™ËDÑ|:¶gÉ ™”dG@ ×,•J©ÛíàâsÐÃÚó€3y?€n¨`g€øå×y*â—_g´°J'Bâx<®7nØ÷s¹œNëðÎm¥Ói›^25- ƧÁK$j6›–ü ­Á†*CŒuèp8Ü¢w ‡C£N1¯×ëFá(àßo6 zDD£Qyžgâc&ÜÐQÜ<‚t:­k×®)™LÍŒ†R’5Ø%¶h ñšÉdR½^O7nÜ00C#OóOÓ—ÍfÕl6Û»Û´\'I¦gA'‘Ïç"%É€‹$íîîê[ßú–öööÌÝ‹×䨠D"åóys@ŠÇ㦳ª5ŸÏí|h˜š¸P±ÙÊçóšL&º~ýº6›5æ’¾#õ¡>öͳz½ž ÃÙFðZ„’ÏÁvDîz½nt"—bEfd¬WC“޵p86°ÈóŽÃîa Ï Kibó€-5Buh\’lÓ€ƒîlhVhú¹¾n’=h„7r×ëµ9¡aï ½‹gS’mýØ%“Iu:;wè„ À8ÂÿV«eŸW69•³PþįóTþÄ/¿Îh½èE/Ò7¾ñ ûûË_þrýéŸþ©Úí¶šÍ¦>ö±é¶Ûn;Å#<ŸåyÞV¢ùl6S¡PP.—3N~­V³À;è'LýiÚq1 ƒÇfÐVŒF#³ô„ºƒÀ5‹éêÕ«Ç&Ú‡’d¯ßjµÌâ”Æ´Z­ZPÍ]«Õ2{S’±,><4hc¡PHÍfS£ÑHÁ`Ð,a¥“¦ŽTóÍf£^¯§L&£ýý}ÛB@çáÜ¡¢±±À)Š ·R©d›¥R©d›IFyÀŒÇc£ƒ1ÁÇ ÷èèȨ'“‰¥·ÓŽF#5 £ÑàòO¦é4lÐ@q ªÕj Fñ©©V«™«M¨k—‹¡Át:U>Ÿ7á>Í,ÉÞ<2ØþÄãqsÃa Ý Û7®7á€lšhÌiö³hA$Y ú÷r~Ìïìì¨X,ÍlggG™LF£ÑÈèOÐ9fWÄOóŽ ÛÏóÌ®@ PàÞºú ΋û³Mâ=º@"t@œß$Y0£ûÙ¥ÉO§SþXEsy~ùï_~ùõÄË߀øå×­7½éMúÈG>bÓß|àú?ÿçÿ¨Z­J:áfÿÕ_ýÕ)åù+¦û4Gl–r¹œÑG LciÚÑ5D£Q³w].—Ö¤0í&Ü M&™ …BAGGGªÕjZ,j6›ê÷û>ܦ¡8éÜÜÄÜÉdÒÎ]›»¤›úÅ™ÎÓÐN&•J%ûÚz½6°³³£f³©p8¬ÝÝ]éøøØ@ Û 2;jµš:Žö÷÷uýúõ-ÍÄh42÷(éd“e‹Ärô3©TÊÀˆtÔ°Á › ¼~èBÉdÒŽq¹\ª\.[ã x( v¥“ÏŽV’Ì9 -Ž${.$mÑsZ –ãµáú’±‚¹K ¦YdN`lÐúðw€1çÌóá êÙ𠲆–ËåìÉåræ6Nm+5›Í”Íf·¶<#кpjH„Ãa |®È|Áàa³ÙX¦F¡PØ„b-Ít0‰DìZC¯B@ŽF Ï÷š ;HBmÃyM’ Èz|°©äZŸ…ò·~—òˆ_~Ñzë[ߪ·¾õ­ö÷W½êUúú׿®/|á …Bzík_«¿øÅ§x„ç³h\i*Ƀ@Å' tšÜPx˜ÔÎf3•Ëe£‘±@“–H$Lô,ɨQ"ºTR°ÝDgŽ= y&ñxÜšw`IÆsFFyBÐív­áÃb”©y½^7a3ÿDÄ>…& :Ǹ€÷Oð›AÀ "÷õz­áph›•jµj 6“èt:­L&c: hn8•Åb1£aÍçs»Wnƒ‰C›ž@#ú7àîÆÖ|2%èH'Û²k×®`eÊÎyµZ-k”ÙR]»vÍî…«U‡ÃjµZ–åcÈ»’,ÔŸk4ÖH³aÁ*«^¯o‰ÐÙ²ñÜ kˆòü£"Qœ{ h`ÃD³Á³C;€z©K[ë÷ûví{½ÞÖv­[^ kÞN§cúÂ"¹nî½ÃD€íú—V«µ`$™0ç­ Lžk¿üò뉗@üòëÕóŸÿ|=ÿùÏ?íÃ8×U,-#€&2¼{(6ÐYpg* [IÐXÍ20°eK]n;Óvøê4¢®þc2™h>Ÿ+“ɘ#á‰ØóÖj5›Š‡Ãakà ½—J¥Lˆ[(ŒzEׂsd”œ^¯§ù|n:$ŽL7ÜïÛ6è]ÒMY.—3A~:6Á5.CårYëõZºpá‚5¶«ÕÊ®-¶¾œS"‘°»Õj¥n·kYnnE¯×S©T’çyF³"§  œ›ƒéH½^ÏîÉp8´óŽF#e³YM§SÛà@:>>6P…¨šE*•²æ'(`¸õû}íìì(ªÕjYnà‡{É$œ¦Z’F£‘mÀp˜‚å>¿®U4?OV ”&¶>è¦ ÅbÑ687iärô“ÉÄKéãyÆŽÀáú¤L&£Õje×IŸU´<€O>sÐÒÐ~‹E{vÝàGÀ,´¹~¿/Ïó”L&•J¥äyž™œfù¿ÎSùÄ/¿üzFU§ÓÑsŸû\k6IQ¦Y¥aÃΔÉ=›¦öÒI¦ÈÎÎÎu…ìrh2¡rAˉF£ªÕjƇ‹ÅÌ—FíÉÜ4lä^@ÙÛÛ3)($èQúý¾é\Ü >"ù|>oY4öXÅÂß§qÃ6>|.—³MO£ÑØâýÓè\R4­$±#š†Nö¼ç=τ̀l| WìììX<ŒoOqçß±wű *Åϱ ØJ›€ ®YÜg¶­VË«›¼ X%Ÿ…ƛܶ]’ìšpÏÈ¡àµx]WŒž‡ëà&“€Ýûƒ —M¢n×:™æ}8Ú†P“H$L[í‰\馃Àúž³ããcåóy¥Ói£Ë¹f芸×PÑ`pŸ»Û:žE>ãÑÈèl™LÆ>ß'¸ÛKî#ôLÒ‰c§Y>ñë<ÕÙ -úå—_zùË_®¿û»¿{Ò¿7õò—¿\<òÈ÷᨞~…õ(!cl &“‰êõºm˜º³±€¯Ï…n¹\ˆY¯×Öpa‰JS]Š ñ|>ו+W¬ÁäØ˜øÓü1F?!ÉÄï“ÉDù|^³ÙLNGÝn׼œ[‰|>¿Õ€CƒAÀö…&×&l€±Äejަ€ì‰Íf£b±hàÅÍt@ð¨·\.Û$Œv»­ù|®z½nNEXø’7"É€œk•J2;ztœ´ ‰år9s•b+$i+C’,Ü y­VKãñXù|~뵸Ɯ« "Ðd³Ys+AãYÉçóÊd2J§Ó¶5à¹Bƒ¸šgq8R4âîæMÇd2ÑxoÇã‚3h¹\NÉdR>ú¨ŠÅ¢<ÏÓ`0P­V3šåi—¿ñë<•@üòë Õ{Þó=øàƒOêwà~ûõÄ ËÎår¹¬Ç$^:(ûûûfŸšL&Õjµ¶xá4ÐÙlÖ&«pä‘JÈ`Ú „ /TÎZ­f›lI÷öö¶ò: Ù@ƒ’´EÙ(¹¹ ÕjUƒÁ`Kç‘H$äyžå{t»] ª+‹l]jy íy-tЫ\«]hdnð¶¯L¼Ùæ@±q¹ÿÓéÔœË\J¹•åri)æL¿ÙfE"Ó‡¬˜`ÓD3­§AEÀô«àƒƒ ‡C…B!U«U›ös-x-@=£wà럗çyªV«‡¶‘!zäi–¿ñë<•@üòëŒÔ§?ýéÓ>„gL¹®SűÀ%©«R‚þp#‚ƒOÃJ‹ÅÔjµÌ•©P(x©T*Æ«ŸÍfÆ!§a—n Ž™øcW:·Ü £ 8>>ÖÑÑ‘Mû݃ƒË(Èår6±w‡ÐMH73RhúqÜjµZ0§ÃŸ'gƒíE¯×³F!< .4(×–u:jß²T°J”*êÂ… F«Bï›é6M8:À6¬P‰ŠÅ¢ÌRÖÝLÅb1$K2 [ÜÎ8îW±XT§Ó±MçË5%ÜŽ”uî±t²h·Û* –ýR(,Ë…gˆâ<«£%Ç*‹Fd³€“ ›   ŠnV¤¥O§SÛ>”Ëe£!ÀGØŽvi<›3×Ý & Éó<£¸ ‡Ã-‡)õÛm»ÞÐͰ …Bf=4:¨e›ÍÆôMØBcòÀÖ0È=ÁE ­o6›)•J©Ùl*“Éh0Øö€î—_~=ñòˆ_~ùõŒ*7#€FúÒ¥KZ¯×j4’dÿh4jÍ!`ƒF º ô&·Q¤YãO¥RªÕjzüñǵÙlT(tõêU£•аçr9µZ-¥R)sq"qIj·Û–€>‚œ2:p‚Bƒ@˜i) ûññ±e6ݺÝn[Šh±o¥RQ P·Û5Q2@€2“ɨZ­š“›šãN§#ÏóLïí¨ÑhØ1r(ÉÒÕ¡Va €È:+™LE·¤p8¬l6k ‰<&ðPˆ˜ÜsÝ=Ï3)ˆÔq;ƒöÕëõ DÐ|Çcs.ã»n`Á`P©TÊšÝÉd¢7n؆W©B¡ jµjúÀ`0 i0¨×ëÙõ„–·Z­l#€”-¶dlçf³™ŽŽŽ,åœ×L°.–d90±XLétÚ^»×ë)‹Ùf Ž\l¢Òé´<Ï3ÐxH¥Rêv»¦Éáóy, Êd2–í²\.MKŵæ9g#€¦h4j@“D´AËåRÕjUFYkµZFµcó†ðúãi—¿­ðë¼”ï‚å—_~=£ŠàºÃÃC 2;88P«Õ²©<Ú& ÉdÒ¶®h P"‘P:¶ü8èl9 …‚MPûý¾ÑE–Ë¥šÍ¦Ñhü˜²3¦¡@ >›Í¬±Íçó–oÇÍéÔ›b±h<úF£anT4Á«ÕÊÖ]Áô¸P(¨T*ÙÃu£IÏf³fKê&}ÓÀŽF#;?Õ]+Ušt\ HÁžÏçÖˆK²æ•)u©T2 [tX¥B£™e!Éœ´šÍ¦Ý¶½^OÓéT•JÅŒüq5›Mûv»­n·«x “ÁõI’òù¼9 u»]³åÇæ„˜8™L*‘HèððÐ&·PµV«•YÝ2QN$J&“ösÞ1Ùîv»¦ÃÀM‡ë¢Å÷Ñ, Õj5Ë*a* ‡ŸseƒB£H9zhUãñXƒÁÀ€J*•R¥R1]ˆt¢Ep݉Æã±®^½jéçèc˜ˆ³…Èf³F…K§Ó˜ÜÆ- nÞ“ 8šéfV„$nc €lµZ¦ã!•-…ë²…n(ëèèH£ÑÈ2b´C‰BðÜn·Œ*Ƨ\.›K¢jž·v»mŽ_lrúý¾Êå² …‚ …‚ܜо`´0N·€6ú \ß0QˆD"fEœN§·B€#ÇQda ¨§†NF 6°P¡d*uM’¹w‘HN>†»íB¿@£Šý.ÀŠ 3-BmWCÁûF£QÓu@ Ëd2vÍyn%™çžË匎…Uôññ±šÍ¦=O®(°í àÆ³/ÉÄè©Tʶ3¸¾­Ž G® ç³X,¶„þl[\Š Ú Ïó¶ò4Ðö`‹ÅÔét쳈fe:*›Í*‰¨ÓéØ&Ú@Þ¥@2`p¿Îö‡ Út:ÝúL.—K•Ëe­×k]½zU›ÍÆ@(n\l«üò˯'^§ÙýòË/¿~€ÕëõÔl65ŒB#4xةҘÎf3}ó›ß4­”¦Óè*È#À®“‰i8Ö£>ªn·kï¹ÙlT©TlâKîC8V½^W³Ù4mz &ÖPhÈEÀI*˜8–I/ËMow“ÊÓé´Ñp(âß™@cMË¿' 5›Ms‚FÕn·íõi&I_‡ÒÂv€ó¥ fÚOöÉ`00MŽ`4Æ€³Ùlf‹P‡ÈâØl6Fy‹Çãæ6Åvƒs£!EÏÆªVÈ‹ÅÂhfPr°]n4êõz …B¦ âšC¹‡v\d¥°‰áÜùy®Y’¬éîõzFcãÅÖ-IªT**—ËJ§ÓvÝ%ˆFg‚.‚,hQ¸I- »¶Ð Ñ«@‚î¸Ïç‡xÏÉdb.Yl­ÈfÆÄ êô8¨ZØO³1i6›J&“¶5#É]¦¸ŒñÞ—.]2Z!Æ ˜SH':¶›ü· ¸|bqÚåo@ü:Oåo@üò˯gT¡W`z/Éؘ^Ó„0=¦Y¯×&\&³8æXâ’!âê! …‚ÙŸâð$ÝtŸ¢‰Â¥‡< ¦þˆ~‹Å¢5vËåRׯ_—$Û:0Ù%(Š\²B¡ŽŽŽìk€œ”ŽU©TT¯×í|C¡M¤¡ ACÊd2‡Ö¢±AX `€ŽÝŠcÄrxoooKìÇ•ÉdÌ!j³Ù˜ý0vÉÌ#ÚÏåršN§êt:ŠD"zÖ³žes:ÚVE:±÷Ýl6æFƒ.l±Z­–vvv”Ïç·\•V«•.]º¤p8¬v»m×b0Ø= b6Àñ Y{>¸\C,iÑb`|@¦M:6kXlqNãxšÍæVR=`…)ÿ`00ç*(`³ÙL¥RIãñضt¥RI¥RIW¯^U.—3à—H$lÓẀ‘ÚN~ ÷J›ë@½ Ø,•Jf PŽÇãÚÝÝU¯×³vI–Ã6‹ Õn·Íh‚ ž76?¼?×Ó’ä¡i²ñòË/¿žxùÄ/¿Îx=öØczì±Ç¶„¸nÝ}÷ݧpTç·˜è‹E]¿~]ÙlV³ÙL{{{j4ŠÇãFÚÝݵI.éÉ.\0*ŠkiŠ[6XÎ’ù±\.Íy ‹ÓJ¥b.YÐxÍ›ØC±™L&¶‘At;›ÍÔét,;šÙÒ ÐB`H$FMc[“všÔv»mSxÏótñâE£áxž'Ïó”Ïç-£Á;›€Ñh¤jµj´hMXÝ–J%sŒR«ÕJ;;;–}AÓHj7u&Óî–&šf‚¼Iºr劊Ţb±˜ik.]ºdNQ4Å4㇇‡¶aÇJ§Ó¦Û9::R(R>ŸW§ÓQ04zºh?€Ü’ØX`%+Øìöz={n ëe³Yûy¬‡Ù²,‹-„«ÿîììØ&ÍÕ¥0¹FÖdÓtF#¥R)ËçH¥RÊd2:::2A?àÃÕ˜ŒÇcs¤â¸S©ÔÖyb®à†4b}Ýív…v)™Lj>Ÿ›Ö²H$b®`èU¦Ó©’É¤ŽŽŽL§Äõrí¾¸k±#;pÌJÜz½6pˆþë,”Ÿâ×y*€øå×­«W¯ê—ù—õÐCIúîÿ>y’Åfb8ªV«Y M{:Öññ±†Ã¡êõºÒé´Ñn˜RCa²;M( 0éõz6áfó1™Ll£ !Û€Æ;š°G+‚™ #Bf³B¶–¼L’ÉYàçþºy’¬©¥Ig’‡Mhã‰äÐÈÁ;úlK]ñ> îUî´@W(ŒnDãJp €Œ$óÕj¥z½®ýý} Á“Nzô£ÑÈ6Üq¨>üžKƒBxîyžQˆ Íf3íîîªÑh˜¾;Wž7´'›ÍÆ‚õÐ0`ŠF£ªÕj[a’hf€ pgrEäèHØ´±IÃEZ­V–#‚Ýñx<Ör¹´$w>3äsHε¬V«­ì”R©dר],êt:¦ Áîš G îZètÐ;x-WÃQ*•”H$,ðRº H—Ë¥Yé^¾|Y‘HÄœèÈÿáµ9®Nj€"ž‘ÍfcŸA¿üò뉗@üòëŒÖ½÷Þ«ý×Õ?øAýØý˜òùüiÒӢȮh·ÛšÏçJ¥Rj4F£€šD4 ƒ`6íÝÝ] !Ä] Pâyž$G¿^¯›« M¹\6šS¡P0°$Óa`KÆÓV4¤Fc»ên.húÜæ9‘H˜æ„äu\Ánܸaç õÝ”™|>¯Édb0Bx€A¹\¶<(dXÿ’‚p˜-ô ®3¼zûX¢öû}µÛmÝzë­H° $Óyp}9nÒÑ=ϳäo4+¸r±}‚f†I@¯×Ó`00»×@  R©¤J¥¢ÿþïÿ6Î… ,+…F”{B¶‰KoL\¹rE»»»¶Iàžçóy ‡C³FèÌy ["ç}€¹Õj™£`‡<r@.ˆä¡z‘ïIv/ü“ 3´··gÔ8¶QñxÜ 0&888°mÏç†[› J¥’{ì1»€[L!\»_ÏóŒîÆÖp`Çã¦ñ<ÏžA®5tJÜÙØ(2ɳƖ Ûí³@ü ˆ_ç©|â—_g´~øa½÷½ïÕ{ÞóžÓ>”§U…B!5›M’Îçó­é+âÒn·«l6«ÿùŸÿ1!+¥ÙlVÃáPÕjÕi¦ qÐtŽÇcã©ó?òl6kW@ÀFh4Á`PµZÍhN®™MÇXÇ+xúnnÁü.¶»lX®]»f“×M á~›ÍIZ6®Gˆ• í#Ë" j8švƒI2ëÁ``©Þ4¦©TÊ@ ‰;(?6 LÕÑŒF#³4æÀÖùu»]kæÉÕ€v‡8Bw3Áõ%ómÏÀ`0P¡P°{'ÉÛn·«r¹lT©jµª]¿~Ý6mÉdҒ豃0J2ú¹_¶oÓéT…BÁò4¤ãáp¨b±h?ƒsN^g¶ P—Øòp½âñ¸ƒQ¢á£¢¹‡z†=‘Hȧá‡òÅ ;b—˥mµÙl‰D4ŸÏM¿U(”L&Í´º œ0c`ÛÇ·hS;;;–¤‡Í„h²wúý¾?ðý~¿o½³P>Xðë¼”@üòëŒV>Ÿ7«X¿žºB` ø A:“ÒL&£\.§n·kîD8Mu»]kÀ°à„:…=(y«ÕÊlBc±˜nܸ¡Åb¡b±h ^¿ß·fÙµÅM§ÓÖ ²jEcG£ÍæƒF þ>Í8An8 q>£ÑÈ·X³K2šzÏÑhTFg‰D"öu¬gÑG`­ºX,L8^.—·ô $e/—KÓ©H2W-lW¡q¡af/Ks[(lÓEÃÈtÚÛ7Ð'-À:îÉ`00Šú›B¡ V«%é$¯ƒ K©TR½^·M Ú D"aM9z ^ àÃ3Dó-Éž]€àˆ½¶Å’¶r-xf¡C¡S’‡ž‚ì^Ú×G¬ù|n9t?6?Üs6}®å-vÉ®ÎÃu^c›Åf@캈ÌÙD@ùb+dzÁˆ ››^øÄŪÛííŽÏ#熾‰Ï:çÊóé—_~=ñòˆ_~Ñzë[ߪO}êSzûÛß~&ÖûO—Âß?k_7nܰƋIº+ ßßß—t37ê<š~~o:Zˤ°Fmó‚&"›ÍZ“^6lhÎù>Ö§ÃáÐDô8!1ÑF˜L“…. äyžÙ”F"³Ê•¤ÉdbvÁ8'¹™l=ºÝ®i\—%œŒ¡K$ºté’9dU«U£faW‹.´I¦qÀaÉ¥›Aÿaʽ7,ÞËÍ¡¡v3IØZxž§D"a!ŠÒIS =Jº¨ÈýGã³ÙltýúuÓæäóyC£q³bØV@T°Ù@äÎõÀ1ÌóÓ8 E"ííí©×ëÙuÁð€ÏZ6›µì WOušåS°ü:Oå¿ü:£uÇwè‹_ü¢^ö²—é-oy‹.^¼ø]Èë_ÿúS8ºó[¹\N¥RÉïh]®÷z½6Zî<étÚ¬Cg³™é'B¾Æä•Í…«—àä4YÁ`ж.lpØ"¤)1M»  §E Î6š•t3ïàݧÝn›Ž‘2M2|@ Q‰DÂ6-ÅbQÉdÒ¬z]Ñ>.HÓéÔ,l¡ß ¾>>>V±X4·+,’];aÀ ;!‹’ŒVCCÏÆ: bh®Ü¡?‘N-h^ðúÃá°‰¯¹¸UM&(×j5]»vͨa\,}¡yAÍb£Ä× ,I2ó¶=¼ß|>W©T²|‘h4j÷†&™-ú!\¾j’ìù¡w“ÉÑ>¹Û(Ž•~±X¨P(À@Câ ÝD£QÑд ¥¡«ÁN:!”³õz­r¹lÛ&t;9ÄælixŸ\.gÉì<c86àqÛm·©Ñh¨^¯›ðC ([$7Ëå,䀸å×y*€øå×­»îºËþý¾ûîÛúSF—zá×+h-L…iÌÐR@!ÀÏå‡ãÀÄÔ)o&“±¦ '¥áphÜ|š>¸4ÐäTxžg[h$¸5‘Á¤×@ÏámÇÇǪ×ëÊårFq§ÛL„]á7AoÇÇÇ–CB3ꊻ%Ù„= ™6ãÆ–×Ñh4ìµ:Ž5ã®÷d2±ìBS©”92Aãäñ¼ãRÄÆŠûwZtÓî¬r¹¬^¯'IöÚP…âñ¸ÒÙ€*•Š?ènÜB i¸dÐó O¡O 9†j ÕétlKÃv÷16`¼¶ äAwBØZÅÝ)ïÍ6 C#zttdÙ)lRW89&HƒFMÄ? ÌI)‹)[> fÜ{W&ñˆÑiæÙH2Ú¯Ëó^ŠÀ£€^¯g÷Mç,i‹’æNú¹¾ˆá%™ë¿ˆÇ¡ò,¹ çü½ßï[¶Ú ¨‚8p5 IR©TR§ÓQ:¶”óD"a€ š_*•2×1>?®¦ÐBZ:Ïo¹\NãñX’Ì—s‰Çãf 8—d×…aÔ*Üåø Ïf33N€ÎÅ{2N(klÇÁ’lànäüò˯'V>ñ˯3ZwÞyçiÂÓ²²Ù¬ K¡¡´5…¯×ëªT*J$Æù§¡¥±£1ç÷I ßl6[´˜o|ã&À–d 8ôIF‹‘dtœ7nX3‹Â¥‚ C9<<Ô…  ÌH²ã Çvc3A—düvòLhÚ‚Á ö÷÷Õï÷·œ¼hz¡‘¡…€Æ†kÐîî®Óp¶BXÔÒXtÕjÕ6F4šårÙœœh¡%I7uÐÜHBgj‰D”ÏçÕn·•Éd¬ùÞÝÝ5Ê´\‰„%ƒ“a[AóÌ}ãYqD<¶(®«K­âk®&…m Ûl‡¹ŸL繞¼z'hz’ 4BID¹Y/PàE¹†<ψÝ9„ÜdÜ[P#&³ÙÌÂ9>OétzKx~tt¤R©dàÏµÅæü3dñ°ù˜-A.—3=S6›U£Ñ° è‹l¹Ž8ä±-ƒ&ˆ¶ç´Ë߀øužÊ ~ùuê±ÇÓÕ«W%I—/_Ö³žõ¬S>¢ó[4­X~;8z¦îÁÒ\禄»Û xá4IårY±X̨L¤sCó€‚Å× *äç–ŽG[(Rùÿ²wæA’×åýwO÷ôô}÷LÏìrâ…Jðˆ„’òŠ•”FÁ(< £‰Ä¨ÄD ~ ˆ–Byc‰Ä¬RÀ$j•¢‚JLE¡’ŠD”¬ËÎL÷ô}Ó×ï©×÷w9ØYý>U[¸»3Óßþ~?½>ïçyÙ¬m¤{sDÈ !¤ÓéX“OØ\<WµZµûB´“Ú5›ÍLT õ¦ÛíÚFƒmIÖl{2™ŒM—Ù¤(ÇõBOƒÖÃvG’J¥’eUÐ`âíi8š3˜3¼Ñh˜ƒ: h9h¸NÀZž)àÝ ªZ­¦|>og mE©T²çHh¯‹ÆÍÖ¸ÉdRKKKªÕj*•Jð×ï÷íÌù|>›Î£_A»аK¦ñœ,c¡ÀÇã9ýÅœКës&…s^ÑàH;nQüog8"÷ª™Ó2PÄç€Ü6v€E(ZËLJ¦ŸÇ*‹Ö„ñúè;ºÝ®2™ŒeÀño·ÛZZZškä–––”H$”H$L¼=N‹Ål4›ÍÔl6­ù\ZZ21‚ ‡Ã¡*•Š5ïXž:EÓËËË65'Ç„k ミâðÌ”xE"=ùÉOÖ?øÁû¼¿Ã]~ùåè=sëè• ÙÝrk—Ö·¾õ-½üå/×ÊÊŠ.¾øb|òÉ’¤;ï¼SW_}µ^ö²—é›ßü¦Î<óÌ£|¥ÇVÑÈ;ßR©”jµšQ;b±˜Mì···Í²&ãÐO‚Á Ñ6˜VÓÇb1k >'“I8×ëõ¹×ˆÅb6)§‰Ç- ž=8"ìr¹lMr,S¹\6~§ÓQ&“Q2™Ôââ¢5”4[š™’;é$h= qaë ýÐ‚Ž€äv'M‰¯%¹š¯¯T*šÍf*—ËvoÙá¾EFŠÏç3zT P¥R±¼ ¶ÎmîL8y1ñ†rCŠpÝA½^W·Û5ÝM.ÀA’5Ú’ ø1‘w:‡q½Î€Ag¡Ï yfšî÷ûíü¡÷ ¯M`­R©ØÏFÚ»w¯ªÕ꜈z:ªT*Y2:‚sÇcŸ^ƒÏvµœ>€uœ£ø¬ð5¼O´-î/Ï Ë–*!Y)NÇΉÓÂ1½3P“sà¨;¦GÍfÓî=ú&®…Í ¯ç4eàs‘J¥ 0²Yr^ÿ¯kU*½ÿýï×þýûuÊ)§è–[n9âkz½žÎ;ïŸO­VËÉh[x¿š.šuIÖd;ÓÁiÈö’¨ M§ÕjàJ§Ó¦q Qc = ½ ŽV< ¦Ð€4™6#n4:î¸ãlAS‹¾dqqѬTùžÉdb9+4ÏhAVVV4NÕjµl{Á”œü¬…AˆˆÐ¹'På2™Œ666´²²bï‰ DÔhzFÃáPs)íl¾Ð¦@#“dÿ•îu(sºFñç¼n$±óƒ¶haaÁBùŒ@§Â º?“ FÍŽ ˆì~lp|>ŸåÄ@ã\“6ÎV) ÎYGsö$™©.kÜO¨l€¬ž¡XòlùŒp.qñbóe KB|<W¥Ryäþ‘ú%êhè5VWWM/÷ÃþPÏzֳ޸šÅÅE}ÿûß×sžóû³óÏ?_û÷ï×¥—^ª›o¾YgœqÆÜ÷œtÒI:çœsõëwëè”KÁrË­]ZwÜq‡Î;ï¼#À‡$Åb1wÞyºýöÛ•Ûß'IF‹r‚ ÆT*e çXäBå€#‹Ål" ¸ <Ïh4R½^·f‹ØáphÛ,~¡¹T«U³KE£X bk²ÿ~ÛX0uÆ}‹I6bd8ùÁ`К1þV«57}¤A‘!/š arL›¡ÖšM29@І›°@§ŽF’i"ÐN`ëËç ‘HˆÁRx8juuÕî¡qLä»Ý®Âá° …‚i]}‘HÄh>ˆ™‰„3Üš‚Á "‘ˆr¹œÒ鴒ɤm Ø,AɃf%É´’lÂe3t´f³iϪ“®Æ3õz½FyB“Ñl6M³u¨ÝnÛ{ÂÍéÄÆÙàþøý~5›MU«UÛdˆ[­–šÍ¦E¶4ú¼>g× …BJ$F=“4wö8lœ¡ž©TÊ\ÀìŸ×d2±Ü§}0úb±¨jµªÍÍÍ9Á2`*—Ë©ÓéXH`,3»Zx÷£ÑH[[[sMw¹\V¹\6zÛ ÜžöìÙcšg !ŽQPܸVì’«Õªƒêõº²Ù¬m26775NU©TLoPàÙ¤Óik’£Ñ¨:ŽQ»Z­–ågt»]õz=Kt'Ó‚&ºÝnëg?û™és ŽñÙŠ@™r:Ž­¯¯[#‰D´gÏ ÕK¥R¦èÜ\Ú’ÉäÜö$™LÊëõÚ¶e0Xz=ô­J¥bÎ\N»d¨t4ã4ݤ…£a›àÌòù|%XvÀ•ÓfZ’i£xfPþêõº}Vxßp¶˜„8ºˆÎšÔ5§žM –Ö¥RÉÓÎg+GIE¯×ëö:NG‰DÂ>GÓéT‰DBËËË’4— s4ëhi@~™* ’vl¯k®¹Æ>{O|âuÝu×=j×áÖc_.qË­]Z/|á uå•WêG?úÑwÇwèÊ+¯ŸO¯}íkõ™Ï|æ(]©[t¹·ÜÚ¥uùå—ë´ÓNÓ©§žªç=ïyzž IúÉO~¢[o½U©TJ—]vÙQ¾Êc¯|>ŸºÝ®Yž2fãĤßiU*ɦélF£‘677†Ä”é9bÝ\.§Á``v²N'èL4„l)öï߯r¹lN<ˆÑÙ–0ÆM š—×ë °ðw4ªP²Ø¦Â “1}fªÜív͉ 5™ LHiúÉŠ ¹L§Óf¯Ê½p:ˆ¡g€n5š×M zt/||igªŠ-Í÷ââ¢Âá°îºë.k4Ér (&Òãñ…*‘HPb3V*•lkÑn·-å[ÚqœB;‚x; šø»ÑhhyyÙ¾ÏI¢Ñ•d®O’¬ñe“4›Íæþ§³r¹¬v»mššwrW$©\.kmmMÃáPNGápØœ°‰C-ÃÁjuuUµZÍ„õl‡ØqþFü @6GÎ8ÂnhV±XÌ@`Š" PΖ‰0I¶%l ªÕª´:Øür›Í¦¹Œ’±MæóÂg/ô_<(n@ÀBCv=ZÛŠGkò¡}H7ß|³>õ©Oqÿn½õֹߟwÞyzúÓŸ®÷¾÷½zÃÞ0§ýqëØ,wâ–[»´N8áÝqÇzÓ›Þ¤èsŸûœ>÷¹ÏéÀzó›ß¬Ûo¿]'œpÂѾÌc®AÛÞÞ6½Z ,jù:ÞN§ct r"˜~£›@ M£Éf¢Õj©×ë©\.«V«©P(¨R©Ø5д3™ :tèÙúÒè„Ãa›.¯­­YÖYi'dqqqQív[•JEñxÜ)I6ÑN¥RFëqBrR\hõær9³S…Ò…Œî ÀÐÖétìž³Ñ ‡Ã–øŽCX<W P³ÙœKfç "A—A“M-“ÉØs乃AB@âzF˜$ jµj©Þ³R©dÍÙlV±XÌ´$›³¥€â8îµE;±´´dà+™LJ’šÍ¦šÍ¦i9°F“Á¾×ëiaaAûöíS P¹\Öææ¦âñ¸5Ö8^9  @Õj5;{l»h´iòÙ®Òxž9¯×«\.g”6Ì ÄÇ{½žmUøÜG¶Fœ5z"‘P ˜Ûrt:;Ë| gaaaŽrýÜšT*eÀM Ú@8 Ò˜%·0 µ¼¼¬X,f¿8›œÇ£]ÇëË_þ²Þ÷¾÷éo|£Þüæ7?è×û|>½ímoS£ÑÐøÃGüzÜzìËÝ€¸åÖ.®µµ5}êSŸ’tïê×]ðøË–Çã1Q3M0Ö·4²4µ$47›Í9~84&ð¸ASŠD"–¯„4i¨_LŸëõºB¡Ñ ‚ –_^^¶æWÚ9ÍfÓ¨=¹\Î\ªÈ ƒ6)w6é‰D¶ PtÚí¶–——u÷ÝwÛÆ#N+ ªP((•J)‹éž{îÑl63ª™ßïW8V¿ßW<·TéP(d©å.IfO\«Õ”N§åóùÌ:¶Óé˜YYYQ«Õ2~=Í#öÇ²Æ˜Í Öà þ¼T*Éãñ˜N„ÆØIÓa#”H$´±±1·U¨H2ºšã?^årÙ60µZMÁ`PÉdR­VËqI¶ýh4J&“–µ,XÈ$Ô¡F£ag“óÓh4,ËZžî`ˆï€$´€ñx¬T*¥ÑhdöͳÙN>käx´-ˆ®%Íé:ØbÀùØBÏÃ¥+—Ëe íÑ`0P>Ÿ·-M½$Ój@K¬nmmU÷‹àŸMŸî#Ô1²aºÝ®69h¦ø|F£QKbç3„ƒ]4µçŠ®Äip4ë‘ØVœ|òÉ–9E‹Å#‚ÑúÁ~ ßÿýßש§žª/ùËÎJÝ}÷Ý’dgÙ­c»\â–[»¤ÞúÖ·Êãñ誫®’×ëÕ[ßúÖýÇ£O|âÁÕýê¨PL˜“ ΔƳV«iÏž=FEb² µ±±aMéäNÍ®V4Ç8º@…qÚÏ¢E …BÆmçÏ[“«HH&“ÊårfIJ£êõz•L&-gž<ÀÁÜGóDãI®I6›µ-^¶Ð\˜’g2ãØܤ&ÜIÁ‚‹ïl ¹góMªÙl*•J™.Šú¸ÿlVWWmc …´µµ¥`0¨l6kŽdPä‘CQB»P«Õ¬YM$jµZ¶…Êf³æðų FsŠ ëõº |>/IæØ…ø뜼cwKÚ8ï…„rôÛn·kÔ®z½n‰ó¡PH­VË(B­VK™LÆšçH$b©êl°œ‰€.Îi,S±XT4U:V³Ù4ÐÎæE’];‘l1¸^gÚ9®p…BÁ´(l}œ®Ù™eÃYÃ6[’¹TæØ"ª‡šU.—mí‘÷Âf”Ï èhljp­ræÝºÿºóÎ;õ²—½Lüãõÿø÷«ã¨T*G¸bµÛm}ìcS&“Ñ3žñŒÇârÝz”Ë n¹µKê†n×ëÕÇ>ö1y½^Ýpà ºõpÈÃ/’«¸‡Cår9kÔ˜Œ“gÐl6ÍujaaAÉdÒœ‹Èn@ôí¦By¢Ù\^^67,h(N  %ìM¡…F#e2s Z^^¶÷õ(\|®!•J&™LZ¯Íö`4ÙÔÛéúÃT¼ßï[ÃXF&Ç Ê Õ¶JP¢$Y ¨Ùl*“ɨV«©×ëYÖÃ`0P,Ód2±$jÄÂ4ÎÐß“Çãqu»]s£ù†ŠE*6Ó×|>¯ÙlfNNívÛî5?3›ÍZã»¶¶f;$sT­ªX,*•Jðƒ‰DÌÁ‹< ô?’LÈ µ º´9èä²H2êÕx<6š‘ÇãQ¡P°í!¬l6kù,LÌ1Và\ˆmÍfÓ~=8t'òXhöŸ ŒØP@Eäµ  ÚÚÚ’$£fñ3ØêñùŠÅbö÷Î0P6˜looèªÕjŠF£sy>l‡ SF"U*ÓqÙ,bÌçˆçur7Ô£i™û@õ‰O|BFC’¤ø‡СC‡$Iò'"Ç£³Î:KFCï~÷»õOÿôOsßüñÇ[NÈ'>ñ ÝtÓMzùË_®}ûöissS_øÂtèÐ!}éK_šܸuì–ûÝrk—T±X|Àß»õÈÕíím #³‚é8MÍ'ö’Ì¢wiiI«««’dBFcŽ…XJ Sg2( ™x½^U«U%“ILµIêöûýÆÿ_XXP¹\¶ íA$1Á8IߨɉÐðq˜ e2»L¿™2{½^£laÑêLg§™l@MÂñˆ{8pÒ Èâ Ù§±\\\”ßï·Dù\.gÔ4DðÜé^ç"6Ж––ì¹8߫ժ5õÜf³©ñx¬••kÌù\ïh424#²F°x–dú—~¿o°X,¦~¿o`‡³S­V­A^ZZR$Q:VµZÕl¶“·Òn·ïSà - MÄÚÚš è¡¡-,,؆aqqQ­VËÄèñxÜuÎ9Ô46FNq?÷@ÁÆh2™X¸&²$Μ!¶/3(P„vÀp}ƒHÂzÛk§ÑgÕçó©R©([~G½^·{Ý @ Èd›ˆŽÄé:ÇyrbéŠ+®Ð=÷Ü#ißxãºñÆ%I¯{Ýë4›Í œ\tÑEG|ÿ¹çžkäôÓO×m·Ý¦Ïþó6´yö³Ÿ­k®¹F/xÁ £wäÖ£]î§Æ-·via{aƒÐY,Ö­ù"# Ýn«^¯›~ƒFšÉ)âád2iÓ_DÃäA8“œz¾‚s,ɦ¯Ò¡‘°Àn•)+´®n·k6¤¸$Á¡çZÉñ Agâ_­VÍF…sD®–©ðë¹.‡ š xÃö5 ™])h9ñxÜšI(\l(’Éäœv…g($!ðîìŽr¹l®[étZ“ÉÄè^аf m —¬õõu{/ñx\ý~_½^O‰DbNd† ÀV‡ûG $v|–ÙxÕëuÓc@£±Å%J’édØ>81ÏÇ6šz´<µZÍœ°$ÙÆÆŸóÅùÇBy8ªÝn+•J©\.½ê×x<6j tC~.ÖPÆxžPº¸v2I†Ã¡é{€…xúý~e³YÛPÈÉ™ƒ.Æ&«^gR:ŸKg z¶S™LÆ6fÐÙòù¼*•ŠéD°íÅâÚ ¼8|¶fMÞ<è×8C-¨Î<óLyæ™ékÝ:v˵áuË­]Zù|^_ùÊWî÷ïo¼ñFã–»õЋ­DµZµ ÍSØ……ÓY‚Gª4š œ‹p½¢9K§Ó6™¦)ŠÇãÖìòzÉdR‰DBápØš2¦·ÒŽ5+€½Ó阕h.—³fµT*issSÍfÓ¶¥Ói £ƒ@Ù@ÔN›&ÆP9h¢iÈFmó@ó ŽâÌ!„H; {¿ßW­V³ÀB6 ‰DBÕjU•JÅr |>ŸVVVLÿ­¦×ë)—Ë™V‚&±y2™´ÔmgÉcT(¦ôh\úý¾éMhüƒm§¢Ñ¨é7hȱÁ%@‡'i§ƒnä ™cc‚@mƒÓÙËX(RhWù¡PȲI(ÎN[˜  IRµZµkaJµ«biÇΖô?r'WÇcÓ–d2»ì¡¡iÕëuÛ. opžÕjµjÔ)ÄÞ\·SOÁ6F’%ÚsŽ8oh›|>ŸmV8Û>ŸO›››f?Ìæ:3Ð)Ho·ÛðǦ @ˆä½²Ítº®ñÞ›˜(´Ûmû:§pœ{;›Í”Íf-ÀFÍxA’i´<£ÑÈÞ[n¹õÐËÝ€¸åÖ.ªøÃÊçóÊçóòx<úã?þcû½ó×É'Ÿ¬¯}íkzãßx´/ù˜+4Ñht®ÉcÊçõzµµµeM´(8óˆ×i„™¨#Ž ‡ÃÊçó ƒ¶=¡yY^^¶Œ8ñ¸<Ñ,B1"›ºP(¤ÅÅEU*Õj5-¤EÓ$”˜ú¢!7Áï÷+ŸÏXX^^6z .\lh BÑz½^% e2£à°MAÐ,É®Ý)df‚àžðEhTЂ°–dš˜íímK%oµZs #‰ÅàÓëõìyF#Û,,,¨Z­Zš=ß‹Ý-®Gý~_¥RÉ€–¿Ð¾ØJÖ½±±¡F£¡Ñh¤ÿú¯ÿ²| šæÉdb¶È¸DA‹jµZF1£¡æõx?„â *•ŠÙ%“ɹí ô+k40ÑhT™LFápØô2If Ìv‚ † Îû¥k4Ùö³N~ÊÊÊŠiQÈ›qºÃ±ICCÃA£‚ö„óJXgµZµû”H$ ü°‰”îÕÑ„yÍååe3`kÈ×—Ëe­¬¬ ŽÅbÚÞÞ6Ï6€ïCã•ïh—»qëX*wâ–[»¨Î8ã k|/¾øb½ò•¯ÔSŸúÔ¹¯þŒgŸ¹Yy<KNg …ûT±XT$±I}¥RѾ}û´²²¢F£aTìiöŒkkkö\° –¦ÍtçšS"Ý›9A#B@#×ï‘Jy q6\N+¬sy†l;p‘Â*˜)?¢ðf³i4*é……U*E£QÓ/‘t.í˜!$¸­¸VœÕ Ò½Z5,§nnØöB$—jS*•š£àqÏpµâÜ8˹˜CþÙ ªV«öú|žË岂Á ¹hM&V‚È3FKÅæƒ×9šu4]°Ürëá– @Ürk—Ö_ÿõ_íKø•,¨NX¸ÂïõzŠD"ÚÚÚR2™”$Ë®€ã‡­ÑÀ-ˆ 4ò ¤f&¬P(ÌQlÓÀ9éA’lóå+¡o’lû1´ººj>zéÞätô ˆž©Ã4Þ4âÜ6*4‡€%&Å4b4nˆtôrLB¡ÙölhÄqí¢a"_m ¼~1 pæ£`‹~Àï÷[ª:”1\Šœ)ÕX³b‘LÓŠÈ,šs2;8#4¤€Ê……Åãq~4PåÔ¡xMh§H’%‘Œ‡s:#é^} ÷!º3ü‘­^86ðÔh4 ¤Ò`Çb1sc[ç ¬×ëf½Ëk,Çã±m×¾CGb;=‹{%MÚѲ±1ôù|ª×ëŠF£F±µ†Å†?C7Ã9B¯ °s6´ººjÙ‰DB’Ìšm ‡Á` H$bDΔF9Ÿs6Ln¹åÖC+€¸åÖ.©Ë/¿\Gþç.Ç£Ë/¿üA¿Çãñè]ïz×cpu¿:EÓucccC>ŸOù|Þ64¾³ÙÌš'\¥h|hòÃá°J¥’9EÁ›ŸL&&œ–vè"оÂá°QCŠÅ¢ÑyÐTlîtBç€ë '”0§^Ñ:SeI6Yf;B“V,笇™þÞsÏ=ŠF£¦­èv»:þøãU«ÕL{@ƒÌôÛçó)—Ë™†}0œËœ@¨.É,e™v eL$êt:F/›ÍfF9Cd-iŽ? & è0G·2NuüñÇ[SÌffiiÉ6O4ÐñxÜIŒÇšZ¹\Öêêªü~¿ŠÅ¢åf sO¢E"¡j ÂÑÃÐäââ$É,Š¡¯!¨F£R*•Ôjµl;¥‹ôrÎs½^W§Ó1!¾$iÎѱÍ`Å-K­V³l'mŒÍ@ÚV,3àÄgh6›Yè'Û#’Ùy^5>Pø°dF …k”*I&¢_\\T8V¡PP$±ÏŽjÜCÀ/šÀ"t®ÝP»å:ÜrëÁÊ n¹µKꢋ.’ÇãÑŸþéŸjqqñ>Ób/€<ü‚.Bj7SÙ­­-kDp¿‚šƒ–‚7¬9G£‘ÑBÐ5ÐÅb1:tȦÝNZÝnW±XÌDÅh"$™@q74#óhYØ øí¤9­^ÑEÐÈ’’ÉdŒ^B3†SU"‘0€´ººjÍp2™T·Û52Óvš3ÀÍ;›¦ëÐÛØFH2Ka´<«Ã9þˆâý~¿Q¾xØ«noo¢qækÇÚˆ†¢ÙlÚ÷:iq¸-шB±C·Bc‡U¯×U«Õl»Âæ…|•f³9G)"0Ç=k6›s÷’ûÈù[ZZR(²§2ϦZ­Ú÷ x;Ci¦9K€:ô1€;çf šï‘× F;ìt:öŒ YäÜJ2p àïõz¦+òz½Ú·oŸZ­–²ÙìÜæ„gá …6Ç5B!¸²Ð–° âs ¥ Ä¦Å@èü^\ãç÷ûX—KÁrëX*×Ë-·vIñÂüŸÁwôËéöóHT±XÔE]¤3Î8Ãh'ÿöoÿvŸ_ûÛ¿ýÛÖÌ8½ä%/9âkg³™.¿ür=þñW0ÔSŸúT]ýõùº¶··õž÷¼Ç¾ÏyÎsôíoû~Ÿ4vØ¥f2%“I£jиà0Ć€@î= 4,¶&¤_;ÓÎ’ŒwNöG<7 Óh4R³ÙÔÁƒÕh4, ;Ødž¦F˜MÓ[D¶ü|¿ßoî?ív[ívÛ,žÑÄ0‡Rm*Nk<«T*ÍQfàÓÃá‡çÃ9€é`0hÍ.T@J86mŽ$ 9×ëuÓ6T2<éÞ¤íõõuó_Ü™bähT«Usãš™®“ýÝŒôm².x/P¤ è°]ë÷û–†h:*e 6ÿÔð{k¨t©TjNLΦÍ´Ag^‹l€hä#Ü#{Lü~¿î³SPNaÛÌ}hL&moo+“ÉÀg3˜Édäóùì¿_rî¹¶L-(_|NÑ)0QBéÞàGIö™f#È¿£Ü ^ç­h4jbz¶I€'çõ¸å–[½Ü ˆ[ní’rrôïë÷Eýä'?ч?üaxâ‰zÊSž¢Ûn»í~¿ÖãñhïÞ½ú›¿ù›¹FO¸' IDATduuõˆ¯}ï{ß«Ë.»LoyË[ôÌg>S_ûÚ×tÎ9çÈëõêþàôºÎ=÷\Ýpà ºð u 'èšk®ÑK^òÝrË-ú­ßú­‡ý>»Ý®ð9ó¼^¯éàÀCq6\>ŸOÉdÒaI¶QÀEЦKZšŸn·kù h@ø~¶8ÑÜG"Õëuu»]u:£‡ð3kµšÒé´ñè¡^¡9èõzf1:Ì—°CÀ úŽf³©­­-I²©55Íh)hBjµÚœˆw:Z´#~&ÿECCSÉ„{qqQFCápضÎÉ;›(gl˜dO§SU*e³Y…ÃaµZ-Û€¡ç…B–¸Ýëõ,éÍJ,3¡½ßïW½^7ZL&c´9€V(šKjÄv»]­¯¯K’Z§<™LÚ=FŸÝ,`ÐÓn·r´¸¸¨N§£ååeÛ¶°Eãl8Ô9lFÒé´÷I2”Ó¢øp)Äél¦p+ãóƒem£Ñ0›\B¯×³ ] 0w2Á:Ž%ªó9áZ|>ŸªÕª\ž7@Ï3ŸG4ZäŒ ØÇ ÍŸ® W16|hY¸ð ¹gG³Ü ˆ[ÇRýOŒ[n¹õk8ê«_ýª†Ã¡Î:ë¬ûlö™zæ3Ÿiî0_ýêW€H;γÏ>û¿fssSýèGõö·¿]ÿøÇ%I矾^ð‚è]ïz—^õªW=`¢ûüÇèË_þ²>ò‘è /”$½îu¯Ó“žô$½ûÝïÖw¿û݇õiPˆGip·åE|.ɨ³ÙL•JÅlsáà;]Š$Yø4„ÇLü“ôL ¢“OuHºw’϶A’mi–––T.—‰DŒvB³@·/r"&“‰Ù¦"òEÌNóL#Á…„ÄqÏVWWM«‚¸Ÿ÷Ͻ¬×ë&G(MÊû=÷Ü3§@Ë Ù·oŸ½’Êãñ¸mª³Á`+ƒ¶d8ª^¯+‰­h0˜&À™Ò õá7€… )-¶d4Ø~¿_étÚèOKKKŠÇãÖÈól8OÎ 68Aèch%}äûÚí¶b±˜Qz @*à] A¿ßo:b«Õ2[7´6étZårÙî'´%¶gl^œÛ-¶>³ÙLétÚ@ 63X(8¡’ƒAÛšpOpårŠÌVÑ€<¶f¸Ú‘ÙÁvÇ96&PÆ W²rR÷:Ž …‚ž›Og€¬[n¹õàåR°Ürk—Ö\ §=íiöûÑh¤ÓO?]¯{Ýëtþùçë)OyŠþû¿ÿû}M͇S“ÉÄšÖûª›nºIãñX\pÁÜŸ_pÁZ__Pó•¯|E>ŸOozÓ›ìÏ€Î?ÿ|ÝvÛmÚØØxX×KcHŠxÕ)RN$ÖŒ3íFÜM³NCU­V5­‘?<ÓA’:dú´%4¾Á`PñxÜ&ù’l¢‡­Áfr‹x˜ ,Í(®Cl6 ±u`êë÷û­ÙFFQ‘d€ éá:ô$®ÿð†ÔÙŒC[BGÁÖ­˜\.§@ `“}6CÃáPÕjUµZͬ|¡ÜúÈßàºiLqã}9´œnRFR·yda@µi6›fåë÷ûÍÒ—|Þët:{n›››fyÌóêv»òzwÒÇÙŠp XCã¸Æ³F4O†g1¶ d2 "dò­ÕjF»ãüÍf3…ÃaÛÔ•ËeÓ×°i€fƶ-:‘`0haPÇã±R©Ô5j¡´³]!+F’m0…ˆÇãšÍf*—ËŠÇã¶Á@ÍÏâÏ€=gÎ0š#(ŠNÛãÕÕÕ9œ3SJš$ läÜíº¯ÁGê—[n=Òå·ÜÚ¥õ¯ÿú¯zéK_j¿¿þúëõ£ýHW_}µþó?ÿS©TJ—^zéÑ»@IwÝu—ÂᰢѨòù¼.¾øb£WPwÜq‡Âá°~ã7~cîÏO=õTÍf3Ý~ûíøwÜq‡N:é¤#l.O=õTûû‡S4¡4vä)01‡rEX _KÓ…•Æ*nš<'u#‘Hh0hccÃhÁ`Ѐ MkÒÍ%ÙÔ âÔH23”‘R©¤Ÿÿüç&jÅbsÛ hSl˜x#.Æõ+›Óï'%Œf W#¹¸•JEÕjUFÃ4r?° &]½ÝnëàÁƒ¶©‘dc<W*•ÒÊÊŠÚí¶Ý'(t½^Ï4Qh8²Ù¬MÓöØë’Îö&( šC_ˆ¦÷1,n¥;YÎS ÀR»Ý6ûe¦å›››ÖK;šˆ@   ÛZ8¯›f×)‡ºå¤Zt)r?Ð/0Á'Ð3ɳI¥RsÛž••-..ªZ­ÚµsÝ€.ç™—d?Š& °M©T*jµZ–[ÃvÉãñ¨ßï«Ùlj2™¨X,°òù|äˆe.›$þ è‘dÎa^¯×Îç…@ÎL&cÄçPø8‹œ§íím3@ã–[n=¼:úÝ-·ÜºÏ*‹zÜãg¿¿é¦›ôô§?]ôG$Izó›ß¬~ô£Gëòt 'èŒ3ÎГŸüdu»]}å+_Ñ>ðýô§?Õu×]g_W(´¼¼|Ä÷çóyI;MØU¡P°¯=üûg³Ùƒ~ÿ}ÕÁƒ•Ëåæ„²4=è>Hß<ÐT6 K²†pÒétŒ¶„–ƒ¦ŠzÇöö¶Ñ_Ðe  —Áé`E£í+ÄV(,dtvè(l$™e*T tLõ%U—0ºX,&Çcÿt:m <9ä«8ÅÜhU XÑX£Ëèõzs!|±XL¥RI‘HÄ4:ðýÙ@1Cå†àÇf³©P(¤t:­N§£b±hÎX™LÆÒÍ¡õÔëuIš ¡l1%‡šÅÜ™P^«Õ´¸¸¨ÕÕU£€µÛm¥R)s¬rfœ°5 *—Ë v–bëÃk<7°À–ƒ×æY¥R)©€K6vlþœ×@þ‰ܰĽÊãñئ†ŸI&40¶ LÌÙúƒAU«UûÌà@†pJ›=÷§)Çc•xP¾Ð¾°©òx<ªÕjv >ѳpê- !¢' `Ç5™L,©ÚZ(Òl63Ú¹+˜ pG>íŒÑd÷û}e³Y{6PÍM¿°° ½{÷ªÙløÂñJ’¶Ü;¨]¸£AËf³’dÀÜívµ±±a[•~¿¯|>oîiËËËöùÁ€Ã……¥ÓiÓ&9©Ž€D"a÷ª\.Û½ÆÝ«R©ØöÅI3ÄÅ ç+RÏù¹µZM‘HDP6›5>ÍñÍ-·ÜzèåR°Ürk—Ö)§œ¢«¯¾ZwÞy§>üá«Õjée/{™ýýÿýßÿÝçfá¡Ôh4ÒÖÖÖÜ/¶¿L½óïÔl6›³Èer{x!¨u¦TßWý²ßx!šõz½Êçóê÷ûJ§Ó¦A°‘ ñôûýJ¥RÖ0...ªT*i{{[µZÍèV4lápØ&øÐ©˜xÇb1sÝaêÍ$x0¨ÑhÌqØX‡B!{­•••J%µÛm{#èÝÞÞV¡P°÷4Nm²»½½mv§èZh¢¡Â­È©épn>˜¦C]ÁЦ.‰(‘H(‘HØ­ gÓé ˜‹F£:xð éo*•ÊœÅ0€J¥"IÊf³¶€6…Õ-ÉëõZö Sn^Óùž¤{-›qLCW‚–àÖjµæhGØä:·ÎTûz½®Ñh¤……µÛmœÐÍ«P}¸Vî³ÙT«Õ2 ÿ›û Ë©_b«þC’Ñ’ 9ážÅÆêœS'… 46rÜ ÒÌq”r~z I*•J.øáÑ!q­lÔZ­–B¡¶Eœï~¿oÉô (š¯ÙlfŸ¥X,fŸ%¶~|^ÉÁ‹³Ÿ¿OšÕCýþËæÓçóu.º“WOcç*3EM$* ÆÿÆÑ ªÍt:µ<‹`0hÔ£X,fÂÚh4júªf³™öíÛ§̉ºqbb{‹Å´¾¾nüig»A^ a£Ñ0Óï÷Í… Á;¡4\ý~ßh` ªÕjšN§¦¿ðz½6©F‰DäñxlËC³Ž®pƒ† µ¾¾nnEЋl#œ_ô LœÁs³ÙLÅbÑôl®ÈÃX__W,S·ÛU>Ÿ×ÆÆ†Í¡ApÍ–w¥jµjŸråp8ÔÚÚš´¹¹i¡N›VIŠÅbvaápXÙlÖœ¸ü~¿ErBpnB÷Ðn·åñx,?c4)™LjaaA°†i>v¼Î&œfóÃT$(V„î±y,±í`ƒ‚{j§K–Ó`€çY¯×Fç@A4µMG*•27±~¿oŸI¶Ytž çæ¢T*õÚz'¨[ÅbÑ(1_@¿†Î„,”étj[D¨‡»º®}sË-·¸\â–[»´N;í4ýøÇ?Ö­·ÞªD"¡½èEöwõz]çž{®~çw~çúÙ§œrÊA~+++¿ÔõJÒÝwß-IF¿àµ>ÿùÏëÿ÷ç„èÿþïÿ.Ç£SN9åA¯õ–[nQ§Ó™¢?Ôï?¼VWWõ¤'=I’ |IšË×hµZZ[[Óxo‰âµZÍ;t1’,ƒ;šfò²Ù¬e§ŒÇcsÃbûäœøïÙ³G½^O±XlnªžH$l‹- ê\½^Ÿ Ä„Dî†$mllØvq:*—˙ހæ9NK’QʧØw»]’§ÓiB/--™Úãÿx»o¤ÁöÇí9ß—næ@  B¡0—:Oª<4-ô1¼g €gPâöö¶ÖÖÖÌe­P((•JÙŸãÞÅV·¹^¯§C‡)ŸÏÏ}–Êå²ý|B#Ù~±íƒJ$Ñ[%“Iõz= ùÛÛÛÊf³¶Á$ðsÿþý …Bæ2† Åþýû5›Í´±±1¹ººjÔCtT±XÌ@üÑ,WâÖ±T.qË­]\«««zõ«_}ÄŸ'“I½ç=ïù…n<×gœñ ¿ÓÖYøÀäñxtÖYgÙŸ½â¯Ð…^¨O~ò“ºòÊ+íÏ?ýéOkmmm.H°Z­ªR©hß¾}Fyå+_©+®¸BŸýìgõgög’v¦ý×\sžóœçhmmía]{¡PP­VS­V³I|*•R*•2Ç&R¨H4`³ÙL­VKÉdRÒ½a‘¸á ÄÄ¿Ñh˜E)”¶€œt 4¤{m|É=`2 T«Õ,w¢Ýn+ ™nc6›Y‰¾$‰ÌÙ†–ËesBBÏx Y^ZZ²àBè)lSÐ^0Íçš™¦ã•ÉdÔívU©TŒæÅÔ¾R©h6›)[° è3ˆñ»Ý®¹b¡,FØ¢ ûdZ 2B$Û!“ɨZ­ÚÆG·ÛÕÒÒ’+¨x(t^¯×(DLÿ¹-h¹µZÍ4/$|CCkµZDˆVq=` Ú^<7A¾t¯[Úx£7¾ñGüÌË.»L©TJŸùÌgôÅ/~Q'žx¢þîïþîˆízŠÃëoÿöoõ¾÷½O_úÒ—T¯×õ”§SP¸+lÄÜ&Ý-·^¹Ä-·vi}àÐu×]§·½ímzç;ß©ýû÷KÚY÷ä#ÑUW]¥“N:I—\rÉ#úºÅ ë¸ãŽÓõ×_ÿ°~î{Þóž¥]rÉ%÷ù~uÙe—é²Ë.{X¯y_ÅzH±X´&{aaÁ(&½^OËËËÖôCÛ$­¬¬˜ÀÚï÷ý‰É2ßH$bZ ¶ м²Ù¬M¦“ɤm hp `A­AL]«ÕLGAóæLj& g§V«¥\.gÍ®SX¼È6 Œ¢‚‹“j6¬T*eT&\ÅœÁŒNºb^hV‘HD•JEápX¡PÈÒìÙN„Ãa-..ÎÑ¡mDƒ-Íîúúº…3â(Fã|÷Ýw+KÚq3€r*•Š ™ÃáðÜóŒÇã‚ sñÚ©TJµZM[[[ …B¶ A7C㻵µ¥••Û˜ ÂÄ emÎÍ`0P<7Òl6•ÉdLœ.ɾޯŸF!?y5N s¸ƒÓ”"¨^¯›0ž3ÂV‡Ð¾Éd¢V«e ÃáPËË˦Wá,âêFÆÔ@`Ð UlqqѶ€8x-..jccÃ>;ÍfÓÎ[R©dç# ™Õ/€: ÏÚ8J g­\.[FÚžñÑ´D§Ü ˆ[ÇR¹6¼n¹µKëÚk¯Õ9眣+¯¼ÒÀ‡$íÛ·OÿøÇuÎ9çè‹_üâQ¼Âc³¢Ñ¨5 ØÙÂñŽD"򯯡É(M/"l¬?«ÕªŠÅ¢QZhR¿Â§¡òz½Æç‡–-Æï÷«ÛíªÑhÕ À1 Ôn·ÞÃôw6›)X˜" ñСC6grŸÏçµ²²bt't‰DÂè2ÕjÕÄëèJƒé8Âá°¢h4jÁ„„ý5›MÓL@L&³4†Žƒ„dîL&£­­-y½^vÿ€ã~Ð08…Ó|bnœ–D8 XÚÚÚÒââ¢Ö××­É•d`ÄÙÈCkª×ëÚÚÚ2pÃ3j4s×$í˜àÂEÖH6›µ†÷%o·ÛU:6]t@ÎM¯×3ÐD† bn\ÛÐaÇë´‘‡¶AˉD •N§­IwZ4³‰h6›v/ØbŒÇc³~f‡U­VU¯×ígA]“vôWèuøït:mŽ[OxÂŒ~ÇYa[ÇçsD"a÷‡ÿb‹ÅlÃÈßaf€õ3À3€GÂÆü—­GÂ׵âuëÑ*€¸åÖ.­¤~úé¿P ø¯{1 EL3ňcaaÁ:BhZÐ~Ø`#K6F:¶Iûl6³FY’M„¡mŒÇc 6Cã!É\¬g2›êz<åóy•J%›VãÄC° "wô&’L[7ž­ 3µP£hªh¶ûý¾5€PÉh¤ L$;¤ÙlÚv(‘HXÈÏÀª::  Q!jÎd2$2™ŒÚí¶ÑÓœÔ=CgH"”;¶Fà S6]¸]9ÝÅ E¡ \*ו‡©>Ót´€2=Ø’HJ= 40„ù!˜FG} pEHf6›5w5ÀϧÑhh4í 0Ã}D߀ÅZ ÷  ?g!k8ÚÖŠóO(c&“±íF¥RÑp8T(R·Û5ý+›Íš>„­]œil¤—––l»6›Íl“‡]¯3ϱ}¿ß·sÂæs*É\Þ ßAßä9b×̦Æ-·Üzèå·ÜÚ¥µ¶¶¦ï}ï{÷û÷ßûÞ÷v†[2>w»ÝV³Ù´œ¦­„ìu»] åƒätbš …¬ñÇѧÛíjkkk.¹Ü9­uºëx<£Áßçï$p™N§s ‘ùxŸ7*“´£ñˆD"ÊårFå"ô —*6Cs Þ4~4Ÿ6%è˜Ceb{L& €:Òé´5…Ðnh¨g³™éƒ¢Ñ¨Òé´9"9^¥R1 D³ÙT*•R>Ÿ·¦‘×O$Êd2f ÌÆÉ7ׇ³ZèGè|؈y½^•J%Ó~.x]Ò’¬¡Å j: (qœ¶MäÕloo«Ùlø”d6ÒlÚ¸Æ\.g€ }µZ5PÝétìÞ#¦g{U.—MãÂ6éûpžã……‹E;Ç$Ü£Gñûý&&ç¬jÈ«áy¦Óiûü ³kæ¼±‚fÈFà‹–…ç (M¥R*•JænÆ3B/”L&² M³Ptf’Ír·n+å·ÜÚ¥õ‡ø‡ºîºëôŽw¼Ã°$éàÁƒºð uÝu×éõ¯ýQ¼Âc³ Ÿ@Ÿ’dl8ãh>  u»]õû}U*Óq`³‹†ƒ<€ÉdbZ '®$ûžL&£|>/I&~§ÁfR •Íf­á„¶Ól6ÍÍ {Zš&h+ÅbQÓéTÍfÓœŒÈú(‹&"–d)ã­VKÝnל–B¡é‰„‰i™Â;))Ά—Îh4Òúúú\Ö‚æñxlFü½×ëµ<@”'À‚i¶MLô3™Œ.Òð÷û}E£QÅãqmoo«T*i6›)—ËÉï÷«T*©V«Y†“s&åÜ‹v»m „÷>fqqQ­VËô8t¥ÓiKÝv(¨(rˆêC¡Òé´e¥Ð`³9Ëd2Z^^ž³Õ´F£QÛò”ËeË6¡Áäç’³ÃùAüNnH§Ó1°l6kz$ÎD86Æòò²mìÚí¶b±Øœ‹€6 jaaÁhY›››¶iÀIŽ …ó‡é@½^W·ÛU$±³]‘°M@ Æ|/æ Øh·Z-¢“ÿBWC0!~ôan¹åÖC¯ÝÙÝ+]ÖH IDATrË­#êâ‹/Ö]wÝ¥+¯¼RW]u•5Ë4/¯~õ«õWõWGù*½‚—Ž» *ú\.g› œŠ 3á8…SÍžS K¦Át:5š4šq^“ÔfܤÆã±‰Å™8O&år9U«U›–ë¿ë®»”Éd¬Yƒ®-‹&™`AR½:¤H$¢étjÓybè94¿L–WWWm2ïõz5N•Íf-Ó„& {Zl{³Ù¬YÜBµ¡±K§Ó¦EàZØ’pÈæ€æÀ`T«Uõû}ÓÊHïv»FM‚>'É„æl˜†oll(N›î[\ìa———µ¾¾nSúv»­p8lÛ¬h4ªF£aÎQƒÁÀ„âœ7¬‰'“‰’ɤŠÅ¢mt&“‰¹6¡ƒ …B$Éóämoo›óú¨v¸ˆ!¤æLÍf3Hü9Àê6¼<  A;bzi'Õž D6,€ïF£ašl6k¹ÜçR©dTE(T€öñxl™/s®‡³Ë9áœI2Kf† lD°oÞÚÚ’ßïW³ÙÔx<¶íßÓjµì|85T(k<ç£]®Ý­c©\â–[»´|>Ÿ®¿þz]xá…úÆ7¾¡{î¹GÒŽîK^òzê©Gù ÍÚÞÞ¶ÆL’å Мà&„P­V³,À‚“ãŸH$æÄÉ4.‘HDõz]‰DÂBþ°€…âe«×ëÙ÷Ð̼^¯*•ŠF£‘Ù¼²qׯÍùÞÈD ye;!ÉRÇc\.g€¡Ýn¨( F¯¡a•d‚T*eD4m€8cL–Y NúN"‘0íH¿ß7PGÎ /6ÀÐb p‘oÂ6(ŸÏ›Å1®Lh0°jè9…×ÃáÐèb4Óý~_ FÓÚÚÚÒòò²=£Éd¢ÕÕUÓ%T«UÅb1kÔÛí¶r¹œ5åPÿ–––”H$ÌP€ûT¯×ÍUŒ-–´ãÈÅV†mt:ÄÒ•JÅ€6ô¼¥¥%£qá¼&ÝtéÔ£p†h«««ÚÚÚ2„e-[8Œz½žšÍ¦Òé´el @ˆpÏ=2™ÌÜç´R©(ŸÏ[š=n\;ÏÊX*•2@H^^^¶÷Å„Pú€QšxÎ2àíz€Úl6›3tpË-·Z¹Ÿ·ÜÚåõìg?ûQ üu,¯×k4‘ÅÅE£Ü0%¥!År“í›g˜ š ¢……›”Ól!ò…bE’w¿ß7+SÀ®R8U1IGsA6H±XT«ÕR,3ÐÄÖ†f A8Ms"‘°ÆªØöö¶:Ž5¿ÑhÔl|NaÜô>ŸO‘HÄœ­¸L¹ÎU4t4wLǹnôl6«z½n÷œMA$1ý†ßï·Í?{{{{.Sƒ A$Q¹\žR#8ÇZ^^¶ ã Ôƒ†“J¥ tz–K;Ú™ÍÍM{6‡Òt:ÕÊÊŠiH¤Ç‘ªÓé(•JÙÙˆF£–‡ùáŽ(A4Þ4¨uÃáPæ@Æ?•J©P(˜SÛ-ÒëÇã±¹€hØ4ѰôˆST&€ ?WºwZŽ.€äõz y<s©b;håœI2ƒÈ|0¨ÛíÚûãyÜõ|žʈÖÑ/ñyòx<¶QfsÄ–ª^¯+ÛŒ2$¨×ëFmã³~´ËÝ€¸u,• @Ürk—×OúS}ó›ßÔÏþsIÒã÷8uÖY:餓Žî…£5­‰ªƒ^;T8þL`i†qó!“€fz ’´“iu†f6‹éÀr† !ƒ4Á4Ul"œN\@@ûöíS¹\6 +Óg6XÓ˜w: Øø2E–8…µNÇ&âü|耈kóõRÛq  ŠÅbv-hbØÀ ‡CµÛme³YÕj5¥R)£ÝH² ÀH,³û@î ô¡F£!¿ß¯T*eZšL¶TÑhÔœ¸¢Ñ¨iw˜Îc1 ejÍ.[v®‘­Åt:ÕÆÆ†eWð,âñ¸¥—sf’Ì ºÉí@À4#÷e³Yk´I ¶ÛmtÐÞ†i"pßBSÂY‡æ.‹l ML’å¨H2pÁ÷°U`“8@SÁf„Ïåââ¢øxi¨Äãqíß¿_©TJý~ߦâ$cC‚†…+š4€ÒL&cBc’å˜Ð}œ$Íw:‹Å9Í Í¯$¥Óis›b2ώܶ÷~ÿþùϾ¾ño<†Wô«QP°ÞL&:î¸ãlºN¦Âúúº­y¯Õj6y¥1¤é!´ j·Ûµé,mâv6 LáÀÎ:©åPW 9¡oÀž4ªT*Ùµâ°ÄTZ .Y4Álhøœ.EP› j9Ý– ¸\aS ý ûZ¶ ³ÙÌ(0X3ÝÄU*•¹ÜI&ŽÇ‘ Ý™ è4b±Øè`k€ š&ŸI<šv(l€,¦òÜÓÉdbš6FÜCiǹ ‘9îJ+++ѶH2±¼SÍæt2§+47èIlZºÝ®Ys]lL°‰u‚]Iæˆæ SÄh€÷‹°›sO:†ìT*eÉõXõâºÅûª×ëfYÌ=Íf* vƒ¹Î±1s&ݳÙã\H²³=NU¯×í,sŸ%ÙÏ€ª5Níý`üà÷ûçÂ;ŽmçpöÂmΩá »å–[½\â–[»´Î<óL}ç;ßÑ\pŸÿío[gžyæc|UÇ~Áߧц6C˜L&ÍòJfg#ÊÖ!¬3}»R©XJv,³LIæ~Aó€…/NT4¸„:-ni¾™øÓø•J%>PQØ&pÝL˜¡?„ذÞø¥ÓikÔÐ+pOœÍh2™4 ™%l$iïÞ½â‡FKa&ëÃáP­VKétZívÛ62Ü#RäÑ5ð<¡{aW %ˆF”€ÆÝÛ!§›–ßïWµZµ°?žSsDÉÒN“{èС9@@síüo¯×S6›U¥RQ 0Øl6m#•©T*I’–—— üI²Ÿ [Ñí„B!U«Uu:e2;ßœ 'ðägñpÞhê%ÙóÃŒ\¨j€`ç&íæ |.¨dj8A–3 ”{ptŠÁyž¸»9ÍsPÇóÝn×6žÎ3 ÅpÊö#ØÏfÓÆ¿Ò½Úž£]îÄ­c©\ ˆ[níÒúð‡ÿ?{g"ù~–ÿ§ºkß÷êîYÎIBE“`L0¢D%Æ+1 "BbŒ‰à]ˆ„lx‚ˆ+Ńû…Š[THÜÀ€Q“sNæLoµïÕÕµý/šÏ3ß:q9þ³ÌŒó{a˜9=ÝU¿­æ¼Ïû>ËGôÿñú‘ù}æ3ŸÑåå¥.//õ™Ï|F?üÃ?¬/}éKúÈG>bŠ¿¢úï+p@í©Õj*—ËjµZބܹsÇ!qóù\ÇÇÇÎ_À­*Ô(@IÁz‚ñl6kñy<wötœN§£N§£ÃÃCÛbãKð[èèƒUi:V¥RQ*•rój>pØŠÅbø2K#Ø& {µZY /ÉnX©TJÙlÖÛ&çétÚ4(4|‚yDíüùêêJ¹\ÎA€ÉdÒNbî!ºæïÈ,!%þ?6É¡–PE“a÷ÅÅ…ÁO§Óq#žH$œï@ 1– Åh4Ú³reâ_,­Eàçiþ›Í¦¿Ÿë= °T­V-„fkm0…%,"~îm»Ý6XJ­T{@´©Ífãçb±X(ŸÏ[ì€hЉ„ŽŽŽ¼e[,}áqsÍ1>‡~/€ ¿Ûíļ0ŒP’/€‹ãä- ZÇĹÄb1ݺuË0X)£é‡ëc’Àæ“Í’¤GÆ‚7ª¨·zø=ª¨¢úOëå/¹b±˜þå_þE¿ñ¿±÷wüÏïå/ùÞ×i2£ú¯ ‘tÓëõZ·oßÖõõµÊå²f³™Æãñ^ÓK”³ÙÌi÷ÕjÕ…««+F#k0B ÜÁ`à{D:7ú Î M[醎†kØl6s`#6º¤ƒó<àò†.ç@ây>Ÿ·¨šX³ÙÜ£r£¡G¨½Ýn½%Â$kJeHÕ„º@Én·S³Ùô³Ç†]Rè,í.4dà˜±Èæûg³™jµšF£‘ï!ŸK@ ®w䵄Iî’lRÁ3œH$L•>슶Q=.¨¢zDëçþçý?¾¨¾v•H$쌭ƒæ&Žp>š6ív[‡‡‡væ¡ÁÄÀû‡úS­VÝÖëµ+lE …‚© 4ÊLÄ¡1‘ÍÀÔœIÿÁÁAÂå0‹0 "Î\áÄG A(2XÝÖëu»L¡C3ÆëA“ ‡Éâhh˜ ñ OÁ• JÕn·óºZ­šB5ìjEv ¶Äív{¸•ËeM&e³Y;^·P(8÷úVÀ4ÿX ÇcF#Ÿ ylh0ØívšÍfÖ^´ÛmŸ %ŸÏ{ÛR©TöÒæ¥cÆÐ‚„ZhmЖÐZy …þe:î¹5ñ^Ð ÑFÑXól°£Ñ¿ººR½^·Î '=hÒ9w\¥BÏ×€ËårÎ*áõ¥V¸‰DÂzþÌߊ~€(€Ôb±hG0>€€/ù#$Ÿ¾Èæ’Òx<þzÿ³õ¢*¢`Eõ8U@¢Šê­}èCûþOV(4>88Ðt:ÕÕÕ•nݺåés¡PP·ÛuSÂö@ÒžX8™Lj¹\j49@É1 bãz½®ív«»wïj<k8êôôÔ "Í3„ÆpÐóù¼“$F%š.(G¸B‘·Az6N\lhö™"ó{(‚fê ¨@ÿ2NíèE8ÖºÐb8éAÉðhXд Éd2ªV«êõzv,“Lü±Ø]¯×¶1F4LfN]£ÑHÍfS§§§{!h5²Ù¬2™Œz½ž·I?IÖ<‡³QÁµŠÔv¨[èU&“‰ÏýøøØ› vÇuèn6u:e2ÛÂòó÷îÝÛ /ÄFxµZ©ÝnÛ= ÐDæÁðL]]]©T*éììLÕjÕÉàl°øàL… {:êääD¹\Nñx\ƒÁÀ† ¸pq-ãñ¸ …‚&“É^@%›IÂ\²Ix¡ú±­à¹êt:~.x¨l?ÂPGΛÏ~»Ý60åóÃó$É @4üI­Ùl¦øÃúìg?«Ï~ö³ úÔ§>¥ýÑýŠïý¾ Ÿù™ŸÑßüÍß(™Lêû¿ÿûõñ\õzý+¾÷WõWõ±}LÏ>û¬îܹ£w¿ûÝz×»Þõ8¥¨¾¨¢zLj½^ëÿñõÍßüÍËê_8K±eíJi6à|³(‹ê’ÑAó6Nݬ¤ÓiœœèúúÚ[ËåR¯~õ«H¦¥‡yLqo3•–äŸaò=›ÍT©T<é%}¼X,zKB– .<ÁvX÷"Èî÷ûžäbE‹kv«P°8/šQ@Âb´a6Ô|>¯Éd¢Z­f¡w©T²îÀ€uq¥RÑåå¥'Ùl~’ɤ…öä®°ÁE‰{ËF;ÛœÏþóvEãuiþ—de BGw«Íþr¹ôF… Iô¡“Ùt:õž× Çe2™x3GM3Ït;™LºÆ8 D§EI’©QPÐxÖ*•Ê]/|F–Ë¥sKØì°e@<Ï&ƒ÷àñüôyuuåTs¶*!¨Ëår~¨ŒhN¸–ÍfS’4 L# -pÙÀH7š–\.g}|èVl}ÂDu¶9T4T~î-ŸÅt:­n·ëç°ó0ëam@ºÝ®>ðè©§žÒk_ûZýÅ_üÅú}§§§úÎïüNU*}èCÒd2ÑG>ò}þóŸ×g?ûÙ=!ÿ/ÿò/ëïx‡~è‡~H?÷s?§¿þë¿Ö»ßýn- ½÷½ïýZž^T©"UTIõz=½ñoÔŸüÉŸèMozÓÃ>œÇº M§SU*[òBeAt ýéââÂNL·nÝò4x0¸QBq}}íäðårizBÛv»­r¹¬ÝnçL ¨Ð}v»êõºuL2C!é÷ûŠÅbzéK_jç)šÎn·+IÞ<@±Á6µÝnï5X¸@I2;88ÐíÛ·÷&×h0B+a J ç¦`Çb1»J!nÏd2ÖuLG•Ëå”L&uzzªJ¥âm “@ Ô¦PM˜ jbz@J±XÔ½{÷T*•ì´†ëIÒåå¥J¥’Á 4°d2i}ùd2qÊ;šèzh}KõzÝÀã£)æüÑÛ¬×kƒ4årÙ``Òét DÙ.@Ó"’f9“ɨÝn[³ƒ#´›%w¥\.+‘H87d±XøÙg Úý"ðç™/‹¦TA)c£ƒ>Á:`Lº1!hµZv¥”Cq ·Uñx\Ýn×›#Dçl…F£‘Z­–Íx¸®lÎØJR©TR§ÓÑr¹ÔÕÕ•jµšJ¥’ T>ôSOjœœèââBÍfSÿðÿ ×¿þõÿé÷}ðƒÔb±Ð?ÿó?ëÖ­[’¤×¿þõú¾ïû>}êSŸÒÿøKº¬¿ð ¿ ø°þñío»6›>ðè'~â'T*•¾1'Õ×­"¬¨¢zŒêI^ó­j»Ý:|,›ÍjµZ©ßï[ÿÇ­—@¼Üh4Ôl6Çm; ʼn¬ ¶$¡=* Êp8Ôh4Òùù¹χá?&&êØÆºù–n¦°uïß¿oÐétL "X°ÙlªV«yë€  Èx>V¿ß·¸ÿüü\‡‡‡_!LO$ªÕj:;;ûª'ª‡_‘$ª¨¡zãߨ_ù•_Ñ·|Ë·|Åß5 ýë¿þ«îÞ½ûŽìÿN…‰É¸6Áû'#¤» &™{<ëääDÃáPƒÁÀM&bY¦äLô™â²Å«Þëëk•J%Óv$›Ñ8¦à4F‹ÅB¥RÉô¬««+7×»ÝΓòN§ãFªÊt:µ¨|:ºžÍfnö2™Ìž•/¦^¯g`ƒ-.ÁŒX¥²ÍaúÐdw)¦àPtîß¿o÷(48ÌC'$lŒ·Û­)KNg/ì‘Æú”®'+`¦½ ‚pìi¡‚­×kSÍhÔÙ 1Q‡ÚDð%÷[,‚/ƒAÍÁÁÅølEpm’ätv6/£ÑhOdÏV =Çl6S.—ó–%ŸÏÛt!«X,„…áµZMÓéT­VKÓéÔŽð|[€M®5ׇÏÏ1@ `Œ)t³ ÝØpäÂÁ  …f\ž©PôŽð<üœ„ù ÕB² IDATP˸v±XLƒÁÀÛG?×ç[’ŸI€Âû¨þëbÁ3ú™pó‚Ê~/¯Õã]Ñ$ª¨¡zî¹çôº×½Nïÿû¿"]÷àà@¯|å+MŠêÿ¯˜î]I’§ÿðÎI¡^,ÊårZ­VšN§¦3a &o£ ¹ººÒ`00@˜Îö€-¤ I7SÍ~¿o=ÆSO=å ŽK¸hÕj57ëlZF£‘§íh;ø¹ÃÃCkJhÎ9–(2õ=??W»Ý–$ƒìVIwßn·¦²!ôG,Þéttyy©J¥â†G1½Óé´ŠÅ¢jµš’É¤ï Ž^õz}/È®P(èàà@FC•JÅ4!6)±XLårÙ: Þp8´ÃÖz½Öx<ÖÕÕ•Æã±ƒ5£ÑHNgÏ®•×ãžU*ív;ÇcÍf3‹Ã¥›,4Pñ ˆ‘…Á&¦ÛízŒ[€RhŸ{qq±ú‹Å ÑF@Ñâ8qóâ],ºÿ¾õM€]€Ë`00 ì÷û{®b€6`ú%Y4Or;›(´\î1ö·P7›ivlü‰„".h¸'¡aZ¯×¶&é0ijÍ÷hX|ÎÙ<²]Ðp0*ÀõíQùwùQÜ~HòõùÏÜÂø߃Žç?+\ê¢zü+Ú€DÕ#Tÿöoÿ¦÷½ï}úð‡?¬ßú­ßÒ'?ùI}ï÷~ïÃ>¬ÿSES_ Õƒƒƒ½ôsaè>‹ÅÂât,?G£‘›klZ¡G1}…S*•<õØs‹ÅÜàJò”z½^ëøøXÞ$Ðü‡Mà|>W¿ßW«Õòq¬V+»Uñ>¹\Îâcœ„‹…é=8,àÊKò@*•Š›±Á` Åb¡[·néüüÜM[£Ñ0µ mÔ~6sZwÀuÃn•ëÁ;—Ë©Ýn{;Bâùxñ ýÝßýŠÅ¢Þüæ7ëmo{›¹àQ}õÅ$v½^«×ëÙ «ßï+›Íš?Nó„}(Íãf³±åm*•2¥d<k>Ÿk:zòŽ®<v(]WWWæ3c¹Š œÍÊ`0Øk‚˜\ÓHÑív7ùý~ßDεR©xb o~½^p…lί×ëI’ƒ ‹Å¢©@4þÙlV±XLÏ<óŒ9õh ÂÄj¿pþW«•C‡Ã¡z½ž¿V.—U(ö¶@üÎÖ ~? p›Æp0H’]ªÂ 6 Pi†·ù|ÞM4¡jµjÍùõz}/Ý}»Ýj4Yg3™LÜì³I¢ æú„éÛè(&îÐ¥ªÕª©cK²Å¨V«n´ùµÝnýonSˆãËå²í+•Š*•ŠR©ÔÞ¤ZZµZ•t“rÞjµT*•¬oB7‚øœkϽçyC˜R Ù†6Õ 0‡`Ó„öª$Ÿ#t<2(g¸la; ägØjHò *%Û³ÉdbÊãjµrƒÌ¿ÐÿB1ýì¯Å¶ã©§žÒw}×wíýú¶oû¶¯úØNNNÔh4ô÷ÿ÷_ñwŸýìgõÚ×¾ÖÿýÚ×¾V»Ýî+¾÷sŸûœ¶ÛíÞ÷FõøV@¢Šê¬×¿þõúÜç>§üãúÝßý]½â¯Ð«_ýê¯øõš×¼æaêcW»Ý{M馹ít:ªÕjžn““@ÓLˆ`èèDs™@¼Íf£;wî¨V«9k1k:V.—sZ³ÙÜKPÇŠF®4ÃËåÒM,Ô éTÐd®€·z½®Z­¦b±¨r¹¬J¥¢z½îM_ü"!w°r¹¬X,¦áphjM=º@ãåå¥5)ˆñit | 2•G+4 ¬ ‚fV, 8x^pw"‡†{•‹ >Çáá¡7YlC.//µÛíL#à‰›Åb¡n·«Á``ka66€Ll«qJ+—˪ÕjZ¯×_d¦pžëõÚ´-ÒÑ™4ølÌpX«Õj’䬾g±XìÙC‡.a 6(liøçJzd~ãñ¸µ@an Z«¨þçúÁüAýÁüNOOýµ?û³?Ó¿ÿû¿ë­o}«¿ö¦7½IÕjUŸüä'÷~þ“Ÿü¤r¹œ¾ÿû¿ÿvÌQ}ý*¢`EÕ#ZëõÚ!XµZÍÿÓê«/6€’ž¡9‘]­V½í˜Ífn˜R¢±`Š,É“a´ád<¤ ‹E7’l šÍ¦n´"¼_ü Éf³ž[¯×nš'“‰­à¹3­n6›Nr'LŽÍà„Œ^¯§b±h:ºI7l-øyDü¤µïv;o7sCäŒ0'ÝPoH™¦q¬×ëšÏçmK2ÿ‡$t7l‰ ý ‹Åìœõå/Ùô"ä¡t»]ð^l ¤3(yúçó¹58#…ô+ôl_˜¼o6ÛF#o38ï³³3U«UÓäØzAB?"É–µ4É*fÞ1|˜¹AHåd2ÑK_úRÇcU*ŸŸ«P(x»Dˆ[N§ãë!ÉîQµZÍ´Àjµê­W©Tò1I2DÄ×¥  äàÊó •ÚÕ ØX„9+’¼eä9.ˆÞ :€l€Wx=Ð$< º„¯¥fã…¯û?Õ'>ñ ‡Cƒ‹ßû½ßÓóÏ?/Iz÷»ß­B¡ ÷¿ÿýúíßþm}÷w·~ú§Z“ÉDýèGõš×¼F?öc?æ×J§ÓúÀ> w½ë]zë[ߪ7¿ùÍú«¿ú+ýÚ¯ýš~ñÑŽeQ=Þ¨¢zëOÿôOõÎw¾SÏ<óŒÞùÎwêƒü ÿçÕWWaGówuue M-¡dÙlÖ!sв൧Ói»ù\__Û!ŠÐ8À¼õD"aà0 Ôl65 ôüóÏ{úÍw·»Éš8??·V¡^¯{«‚¾!N{ú‹+Ôd2ñ„ª çúBJ  $™LêøøØT²t:­~¿ïI:öÃh+ôüóÏûx ¤-—K[™Âû§¡—ä 98ô²­¡A\.—j·Û¶…•n¶ 3[­R©ä š€ ‚i8º¶±a  Ò¿Ù®° µ ívÛ¶±ãñØ×* 6úƒƒM§Sƒœ­ ÷0y^ ÅcòŽ&8¥~¿¯x<î$ÓÍØªÃÜ™p‹@8Be õC!¸DL^*•|sÇb1Û ŽÂó@Oƒ‹9Ž7›ÍšF…vˆçújµòûbò0 Ôh4|]ùùétêgz#@Œ÷aÓXæ< _­V+ݺuËŸ©<=‰õÑ~T÷îÝ“tsÍ>ýéOëÓŸþ´$émo{› …‚nß¾­¿üË¿Ô{Þó½ï}ïS2™Ô[Þò}ô£ý Í;Þñ%“I}ìcÓïÿþïëÎ;ú¥_ú%ýÔOýÔ7üÜ¢úúT@¢ŠêªN§£ŸýÙŸÕ¯ÿú¯ë[¿õ[õ·û·zÃÞð°ëÿTa*IívÛ.T“ÉÄÜþÅb¡Ñh¤x<îÉ'Bm&õP9´CÇ¡eŠËœóD"¡N§£ív»—‚‰áphÛOIR¿Ýðp¬è  AU*Sª‹…ÞÇÇÇþo‚ ¹ÐÊ8·p @ƒ™)³¤==f›„Å/ßǶ‡p]w»ŠÅ¢†Ã¡òù¼¯-Í-[ ÀÚ–ÐÕ ×-\® r…÷.Üæ$“I'†Ÿžžlp>Âq‡û³-€4›Í½gâ…¦Éd¢R©d€ÀÀÙŠ°Çããc‡<Ùétö€ ëHZz¿ßW¹\ÖõõµV«•u:lˆØÈ\€ ºÖ´’üý’l5 ˆÅž™¤p@4/̰¦Ù_¯×Êd2j46X`Ëê›B×,IÖ…°E´ ¸hp ¸¸Îñslü"˜S®çr¹t*:¯Å{>ìz˜gŸ}öE½Ö7}Ó7éÿø_Ô÷¾ýío×Ûßþöõ½Q=~¨¢z„ꕯ|¥®¯¯õ¡}HïyÏ{žø©Ú×£¸¦Ð‡Öëµ^õªWÙù%ëîÝ»º¸¸Ðv»ÕÙÙ™­?¡© kEh®hI¦Á)‹¶˜­T*Êår:;;sƒ‡-Û 6½^Ï€›O8ñ4=hÊå²uvv¦§žzJÏ<óŒîܹ£Á``E³ÙÔz½¶Ç>4š×p’N˜$ë0Ð( ÍçsM&OåkµšF£‘f³™'í‚ÉÉ Q'ƒ:@Š¿Ýn»äØt\]]©T*i>ŸÛ¢Í .cívÛõ»wïzkå‡3I7èw8ÞÝnçtxÄê‰D““ÉÄçttä­¶­l}^ò’—˜*”H$¼¹H&hfZLÕi”Ù´AÉ£A'‡‚Í ™24å<{áw·oßv¦)Ù¥RI“ÉÄiëðúËå²²Ù¬ÎÎδÛíSBEÛŠ¨—ŠHTQEõDÕn·ÛkJЄt»]7'''{6²××תÕj* :==µ(]º™Cƒ¢Y‡JB†…k­VÓjµrS†-ïb±0- ^: Æ®V«YZÐHãôÜsÏéúúÚ"Ý0ìMÚO‹†*V( #ÄÇ–mÓëù|.I{  Mœô ñši>TŠ?£@Žn„†í všEèF¤~Cs‚þµÝnuzzjw0BèÎÏϵÙltëÖ-]\\ì9}¡—›ËÃÃCo/БË1N½Y»}û¶uA­VK———nèÑÿ@»Bw€ö&t¼ ÄDÓ´#ÞÇ& „þ0Ç}›S€J¯×3as‘Ëå”H$¼ý¢Q¿¾¾¶Ýn¡Pð1b.€ ÓÃáÐ9<»œ¿£µ‘dàMl³ÙØö:Ü&†ŽTäpì’lºÇ­=!W„÷”ä- €2N+‘HXS ÜCc¶eü]èìUTQ½¸ŠHTQEõD\yôè°›¥YƒgO3@ Ë‚©4ÖŸ’8a1ÑFC=h6›Ù–U’…¾‰DÂMn:V³Ùô¤ŽK4¶høDÄpû¡Tu»]‹˜Ù0ÐÀÇb1u»]S}¸œ7çˆË Áót:U»Ý¶Öe:úÏÜsèr¼>K³Ù´h9«ÕjySÖjµ$=È“¡™'¹=ÌA€ ] ­ô¨Ð‹Í•$ƒ6\o¶€ 6w8S¡™N§ ~Fw»*•ÊÞs@2y¨©P‹Eß®Ïf³Q«ÕR£Ñ°þˆë3›Í V¸6XEÎq¥K&“þ PðøoΰEžûëëk¸ÖüÝÁÁÏ€$É Žg °*ª¨^|E$ª¨¢z¢ ZÍÿjµR¯×ssm¦Ùlz:Í–Ú ÉË’…vžËqÄÇn”Âi-’ÐÑK`JúºtÓø  Á†OOš4MZ ˆ ©;ÍfÓbÜjµªX,æúŽ>óù\wîÜÙ]3mgóA2w¥RqzÐä2Eçõ'“‰í•Ñ\@›ƒ:Eè%\ÁF£‘AØb±ðT›‘0ažl ô5©TJWWWêt:¾Þ<ŸPØ …‚5¡¨I.—³ñnU8SA“cêÏó@òº¤=*›<Þúº'‚%í͉ŸI ›ÍFõzÝióñxÜ›žC6Al>È,á3 €*ÆÆ­QèÈt°I|ØÅ¿a__QEõµ®€DUTOT±ñn¦Ã¹\NårYõzÝMy8ÝVB _Ú„°Aã™Ïç:>>¶“R±X4 ¤M’­h¾Â°Bô L\iI¿ººÒññ±€h„ÈØØ˜à¸ÅŸæ‹ã E¹ˆ¿ G<>>¶f&$ÓÐÒPâ†ÄdþòòÒM2ºÐZ qÜlrÖëµÆ^ÐnH4ˆdVpì4»l>Ø$ÐîÈ AZMZ2™ŒnݺåÐEd±Xô&ˆæ› À£V«ùgnݺåëËût&•K²„ëG“Ëf#LûfÛ°Ün·*—Ëúã*Æõ^,Þ®p¹‡‡‡‡þY&ûhTŽŽŽtûömƒLÀ<Î@ƒÛ€Š{ Íf3]^^zkR¯×}¯Õ\àõz­jµêL’Íçó¹z½žuVй~›ÍFƒÁÀÏk¡Pðv§5„½b<À½`cʇ ƒ >ëQEÕ‹¯€DUTOTÑÌÁÏO$££ÃëhvÐ34 ë hŒhîhÞg³™S¸i ÃX’‡ŠÅ¢­q9‚ð988°%(Ö¤¡CÕr¹Ôn·Óýû÷÷^¿Õj™’‡Þ¸ ÷ äp0˜×=* Ú|>×ýû÷-ò†b„½-ŽLèhÔÂën¦T*¹q†¾µX, Ô†‡¨õz­—¼ä%¦ËA#£!&™œíy4(adhÙJh!nN8.A»CpL³ÎD‘?¯ÇýŸL&±£Ã™L&KÉÂäé<›^¯çŒ œË*•ŠªÕêÅ% QõjµÚK?O&“zê©§œ‚q.—Óz½V¯×Óxæ€@MC»1™L¬ù!ˆfJš)ž×l6»g(ÀÖ‡ Ÿ3ô;ü<Ô;òTØ ì¥Òg³™µ$€IF{ÛJ€ðBlí÷ŒÏ+¡ŠÜ‡‡]Ñ$ªÇ©"UTQ=QEÓˆ°Uz : [‚Ñ~„)à8Ir³$É¢u&ÑLªÓé´êõúÞqÐD}á _P§Óq¦A«ÕÚ£žð>ù|^©TÊ¢cܱ˜è—J%½êU¯R³Ù´ é½{÷ö´LïCº Í!ÔšT*eÊTºZ­æTu6!±XL———Úívηàx¡PAcCºl.ªÕªÄÈB!H®ßïk8êòòRÅbQFÃT3e€ÀÅÅ…Æã±µˆ‘Ñ|FJ¥’Ï‘ ÇB¡`³€x<®““çq¦Â-[¦Åbá×EK€°Ÿ©=úˆ\.ç&œ<´ Ø#“,NóŒ˜üúúÚô¸ðxÛí¶óe$í¹c‘LÞ(Q€)ܼ*•ŠNþåréä÷~¿o'¬ñx¬l6«N§³çÔ€Æ,LN—d@ÉuC—ó”ûÝngÁ>zt:l¤[Â\.gPŽ(ŸÍb¬ˆŽm › 'øœ° ÿ@ŸRÊpF‹*ª¨^|E.XQEÕULóip#4@óùÜMÈl63‰©1N£ÑÈSz¨44tL»—Ë¥ŠÅ¢–Ë¥Ó¬¡U±m¨V«5Üívº¼¼T<W¥RÑÅÅ…W€ 76§lÆã±úý¾›mŽåøøXgggê÷û:::2 Z­Vž¨òµŒfu8ªZ­z2…É}&“±3 õåå¥NNN¬j&É îx¤a²ÁI§Ó:??÷sðà³Æ±<ìŠ\°¢zœ* QEÕU€†ëëkœœ¨Ûíî `%í‰U™vB  ¡¶0™—žqÔAãÁkÂÃ'K¡P(˜ºµÝn5 ‹Åü;î[¤e“á³ÙXhMƒ8 4÷šÎPÏ@ãÌ9† ì…¡tÑHÒˆÓ0¯×kŸSy@…$g'är9ƒ Ž™é8œûù|®Á`àÉy«ÕÒ`0Øk¾ ¦ã52™Œ¶Û­°fi”Ëeƒ@ô"€é¦ÁZ,ªÕj{‰èˆI6Åb~l‘9®F£ákMSËktÂûÀV * Û€ãr¹T·Ûuú7S}¶,XÞ¾P ŸËå4 ¬$©Z­ª×ë©\.«ÛíúúBcÂD!Él×Èààõ9VôQ§§§ÞþpžóùÜà# #dA|±XôçG7žÑÝngm ël®+×¹ÙlÚØ —ËÙº0 Íd2vjX IòçL’Á!æ4ãœÐGA„UTS=|ÈUTQEõ .€Æb±pã‹à˜\‰T*¥T*åF=‹9ï¡ßï›§¿ÛíT¯×U¯×M×I§Ó¶™E¤ å‡#&û³ÙL½^O½^ϺB¡ài>â]¶×××¶¶-‹{"w¦Ê­VËÍ ÍU&“Q»Ýv³¿ÙlÔét<ýçkù|ÞÇ…€w4™bôÛTg³)’n„×§§§æÔ£aÛÂT; ö‹ÅbÖ(àFE#º\.5 ¼ä{(=ÙCÁ–àøøXÓéÔ”.²(‹…µ GèlF®Ú®=)êˆùw»³^h|Ù`ñwPÕÐ ñ=Fö]«ÕÊúž—årijÒz½ÖíÛ·Õh44Nýs€6fÐÂЦ„4ô©TJwîÜ‘ô@ŸÄ¶ Lòb– IDAT} t=xô6èT*¥J¥bІ±7Ÿ(v»ÝÎ×¹R©Ø ŽÁ™h5pØ(ÍçsÍf3o(ù{€(T;IÊØûBÿêõz%dݰíãZ6›M?k€6ml¾vEú¨—Š6 QEÕY8ø, œœèððÐô'ÄÊ­VKnîP÷û}»U!„Ïç¶™%[ÚäêêJÏ<óŒJ¥’)TÐ_˜ÐKÚ aÃÕgµZ©R©(ëììÌ`‡-IØ”~ùË_6 Šó”nÞ™öçóyU*Ó$™g5…ÉÿÝ»wÕét´ÝnU­V HºÝ®õ l% Ù„T t4ë8aÑB» µÐ«ÈØX.—¾ÎË…Éß$˜ÓŒBËf³M©TÊZ6NЬîÝ»gMt(IX-3gÄ9_]]x®z½ž ÛÛ·oÛ }ù"lÃØ>Ñ´CÍ ]±R©”Eßl©ŽŽŽÔï÷uïÞ=µZ-‡8& ð¡Ë´á(bóƒ¥o¸„žDf‡$u:g˜‹EÓ«¸fï̈åréÌ ^›FòúúÚNGPž°0¦Z­–·]L|i@É d@GÚl6ê÷û¦U«U ë-ØÚ0A—n%ùz½n`ÊÖ‰ëT.—Õï÷•H$œ'CóÍ9†›—jµêA¦ú™LÆ@ }4ªZ­¦N§ã­Q¿ß·‡§Pó‚èŸkËæ íO«Õòû²ÀxgíÛ•Õje} Æ¡E6['\ßø3zÜÜ…¼'ç ð°á‡êt:Þdá4Ƕ#Ì7‡Êår~-®+ ŸÏ(ÏçîÈ+ªÇ©"UTQ=QU,•ÏçÕív•ËåÜœ¢­`ª õ¥Ó阃O3Jã8Õn·ý?hôl8êõº†Ã¡ÎÏÏ5›ÍØl6½õ ™‡Ÿ¿Ýn:=æììÌt\ˆ Øð¢kÁÚ·Ñh8×@’i4Lý¡]!¦!gÛô^Äq^â>²ÕT]^^š¶‹Åtrr¢F£ák $„gˆ-–ɱXLµZÍ›î_6›ÕÑÑ‘f³™¯õ|>wð"‚ÿáp¨Éd¢³³3oM ‘ºX.—­ÕÁT€­Ðh4üŒc” hØ®¡sÑàs¿šÍ¦ ¸þa28š ”X,¶g©Ëýc»'ɾ‡‡‡Þ¢aiÜív½-  'ƒƒëZ$O&•J¥=»ÞPo3ŸÏ­óBs‚ŽäÖ­[J§ÓÖ~Ù#= øM§So”-³"ÕãT+ª¨¢z¢Š)m6›ÕÉɉÚí¶f³™›1è'’ T˜Ž’§Aã ¨\.k>Ÿ«ÑhxÚ`€sqqa+ÝåriËÚR©dkWšr&´årÙ a˜ÿ0Õl6MU¢Ñ…îÓív-ŠGt °ñx¬x‡‡‡ÇæïãÄÄÏ!šfóAã‡0\’óOàáK7 ;ŽÅb¶†ºsvv¦áp¨J¥âcíiW«•³<òù¼2™ŒÆK¥’SȱW*kYï#úF{€.†MÎáá¡Úí¶·è/Ðè‹…¤Êå²é`WWWºÿ¾SÕy–ÈŒ!Ü€ÆV­t-„Ýl8Àg¹\v† `p»Ý:¡:Š{.‘H¨ÛíªZ­J’ÃüÈP™L&¦ô% ݹsÇÔ$Äål¨ ‚‘¹ƒ  M˜GÃñ±u Ôó†vÇ5áó èä3Ðåu­ çÂ5gëÃFÏ*Ÿ}²¿|T4 QEõ¸T´‰*ª¨ž¨‚>uïÞ=7Üñx\ÇÇÇ*—Ëzúé§½@Àäœé-Í{¡PðÔŸ¦­ÝnÛæ•ü†££#7å8ñÐ4ãDfG¿ß×b±° :üžp < 4 ,’?99‘$S¸°(¥Á ù`0tCCªT*:::rªóÕÕ•Æã±ƒ©LL±qñ’4Ù.š9=&ÓhØÄp­2™ŒÆ^6À *гÏ>kàd2Ë ŽŸû†öû}u:=4`p>Ÿ[c’Éd|Ý¡˜…©çl"Ð ð=¦0°ŽðJèfP³$©Ýn{ëê!¯Cë[¯×~½x<®N§cš€pËk‡N`à—·jµê@@ÜœžþyM&k·ÛéÖ­[~-¶WWWÖqhív[“Éd/KdµZY“‚Õ5ߺ«qoÙ° tg„µ3Ât´"\·V«%é‡jÆ– €Š _±XT*•r ”;3Pïx_@,ïÿ0+Ú€Dõ8U´‰*ª¨ž¨Z­Vº¸¸ðŸS©”Úí¶NNNœˆÞëõ,F¿ÁtP0˜ u±X4 d±X  %a2™¨P(XHÍûK²Ø™é*“÷Õj¥/}éKÊçó*•JK¼{÷®©bêI>ÏårC×B‚9 .`¡CÔ+šVh_LÒÙf°Y@ôM= öècÐà§±!âúÔëuo~#N†ÏÆb:`,CÙšÍfvDBË0¢Q ÉŽF¦¾qœØC§ªT*Ö|éK_2¥k::Àkf®14;6*L뉄Æã±“ıø¸aáŒ8œT$(wÉdR“ÉD‰DBÍfÓ;tKl¥Øˆ1Ñg£uqq¡l6kÊÏ. åœçZ«ÕÔï÷­3Úl6vÈBÁà­ àP*•l^Úôr_BíÑááá^R<º Î ×ÀÉ€ Á|>¯çŸ^Åbѹ\ÎàÏt±X´ rhÍ Å/‘H¨R©XÔÎÏú¢Š*ªWÑ$ª¨¢z¢*N«V«™‹ÅT*•´Ûí<5ÅVŠ: \‰˜¦CÙa[ÒëõÜüÓø„ ¥^¯Û²–&‹ 3v~*Q,S¡PÐíÛ·=u‡ºrvvæ 7ô¨B¡ V«å†([ôKC]¯×±^¯-"ÅÌ4…Fô%hB¥RIóùÜxÿ4¨ëõÚŽA³ÙÌ”&&ü€@t,Ò!äå¾V†Ã¡íƒïÞ½»ç>ÅñV«USvOl¥÷îݳ¶\ ܶhžq#+ 5d‹Ôï÷½Ý)—Ë{6ÅPw˜î' k^„Î …FÅ1:Bw+RÈÙD¡ñ´ñ¬²ÉAGAFÈh4ÚÛÄ ÓÊØ¡Â`¡\.«ÕjÙñ ¡¹tã|Ŷ‰mÐl6Û3=nèJ4þ|$ßs4<§l>Ð5±q`R*•T(¼Áà=°*ÆB:  Ä½kµZéììÌŸiÀÖʼèà•H$T¯×ýïæ œš0³‡YÑ$ªÇ©"ÈUTQ=QEsŠž€f—ñÝîAb2“V&ª…BÁS(Ú†ßÕ.”%2/ŠÅ¢Úí¶Êå²2™Œúý¾é?Lyquê÷û¦(!²­ÕjZ­VÚl6¦ŠÐ`Ò«Ûíj2™x‚ Xé÷ûnZËå²z½ž†õ¡àzòv»í&°Õj™/.†I>ô gžyÆÁè*•Ši`Xár¾(ö0kƒÍ y+8>¡!™L&ê÷ûšÍfzöÙg ü$9`é>Í7 úp84  h©TÒh4ò†=ztQšÿZ­¦áp(I¦d`Â4r’¶y¿Éd¢J¥bú×ì IÞø ]àš\+•ŠéWœ{©Tr‚7Âq(„äÂ@õð…Éê×××j6›vK&“* FªÕjºÿþÞc»Ý*™LÚ1Nº¼¡ºΗ˥C+±RžN§Þp±¡ã W.—­7áZsü¹\N£ÑH‡‡‡¦ñ½0$0‘³™‚:í±Õj©Ûíúyâž±Mäs ¢Š*ªÿ¹¢ HTQEõD_6›U­V³È;›oO#…5)SN2 ý@¢ÉÄY§Õjy»ÑétÔëõL·ÛÝ„®Aà EsGóÅ&„BþœN§Õn·­—(•J’Pk°ÁÅvÁ.ö¯¤’³‰™L&žJCýÂÅ w*¬T)ìäøáp¨v»m¡=år©Ùlfús½^W©TòÆÉ5”)è-årY'''jµZ*‹ê÷û>q6W¼'› „îl,ZæÚO&O¯“h~qq¡åri0„ž±7Í7ïd2±Û–ΙLÆ:ô-ÙlÖv´™LÆ“}&öh[Ø"„Ï"ô8Ι쬥¡BA·+•J_sþÓéÔ9%’<ñ—dÚ_¯×³¾i±XxòšžSèk©TÊt8I>/(fM¾†¶¤T*™¦—N§­¿àyA#ÉÏŸE†€ÔÐ6—m”$:ŽÝŪժŸÏ\.§ããc Óý¬äÄãqF£½ ê£PÑö#ªÇ¥¢ HTQEõDÕd2ñv‚)5wáhi2H\F@ŽSÛ¦ÎP¶Ø¬@ÁY¯×j·Ûž^§Ói7½ab3“X¦¶ãñØ ‚f ý‚tŽE·Ûu…îé?Ûš=6;pà—˥ݒȯX,j4n¾w»ªÕª›C€[¥RÑÅÅ…7ù|^/yÉKÔív½y!à¯T*y!ÉIí«ÕJívÛÜû|>¿—VÍæ%N;dŠ`¤^¯;Užë“L&½Õ¡™å1gBP\’Ï;c늆+Ivªb2.ÉÔ§L&£Á``0À×&“‰­H8ç|™Òs<|]ÒWPÕhóõÝngºÛh4Òz½ÖÓO?­ÉdbÀÀ½¦)X± mlq¥bk5½Õ £­Òp8T©TÚá°V«éììÌÚ¢F£¡ÑhäÔóZ­æç>•J)—Ëùùá^ñù`#Ñét4™LÇÕn·÷RÜÑ9A—„6È×qÀËd2¦Áq²Ù¬6ZÎæ*úGUTÿsE$ª¨¢z¢Š¦Z’›.R­™hÓ4ŸŸ{k¦ÕjíÙœ~éK_²c¼ple¡1ífK•‹-E·ÛU¥R1•k6›™>…— >BøpݸÀmgÛÒh4,¶ Ö1`ÝKÃ.É š@‚ÍN*•ò4@“J¥ôôÓO«ßïëúúZ§§§Úívœ§Ói]\\xúLcˆÝ-× ÈK^ò€ÙPÃÖëµ*•Š‰Û¸9±™Œ ²FÏñÂ$û;wîhµZ©ÛíîMq¡’ØÐ@™â—J%7È¥RIÛíÖÛ íÈlY,šÏç¶¼%Ô2Üb‘ŸÍfµX,¬%b"mŽf;´.‹~ÆÙ® ‡CSæ¦Ó©]Í rï´ó|¾$Ùq Ý :¨l6»GUC»Äs¶^¯šNùÅÅ…_ôCËåÒ›=éA¾×ŠöäääDNÇ.U{!ÉÏt.—3Í º#_g[Y¯×µ\.5•Ïçu÷î]çþTؤ<÷Üs_£¡þÿëëµ±ˆ¶ Q}=*‚ìQEÕUÅbQ­VKÍfÓSõb±è‰*Sr¶ :??÷$‘u,SµZuu­V3Ú –«áëñ8J…9ËåÒÔœÙl¦~¿¯x<®jµê¦z4<àÅT@DÑlNpÅ‚¢sxxhg$pš?6¤’³U ‡COiÚÐ{Ðø¢'@3Cxûöm¿6“tìu±AÍd2êt:Ç 4м&r(È"¯¯¯ÝäK2À&ÄÔš@@’µ™LÆÏY"ÒóYæó¹ÏêŸ$ÓñØÚÍçskBh–qÖâž‘?&Œs}¸pA‡ƒÞÇ&Šßh4ò6ƒÔqIÞ*à6Çëg³Y5 ošÐ›\^^˜C¹B`Î{¢'"¸°T*i6›yÀçðÃõ‡ž‡Þ$Ô¦är9'ÏÆ¡F“¨oËåRív[óù<ʉ*ªÿeE$ª¨¢z¢ KV€ ‚‰)âÕÕ•Z­–ŽZ­f‡«d2©Åbaz÷p8TµZu“…M)MkhµÊ¤_’E¬³ÙL©TÊ[‚l6k7¦ápè<š0Âô°ít:ªÕj¦0¥R)‹¶Óé´îß¿ï ð|>7åäììÌ+’½¹GÌïv;_ heО8m -—K „Âaècز•Ùín²CjµšŽŽŽ”N§}¡ÒÐüCÑä-Á`0ð÷¦Ífc‘3úív»G÷999Ñd2qƒ ˜¢A]¯×:”dD"y¨#‚šRŠºÝ®‹…ÖëµM·ÛµÞ†ÍP.—ó9ã …pœÍÀh4Òp8´` Ý9_6Z»Ýδ§^¯§ÉdâߡĠí 6ÎÅbÑ÷‰×œL&ŠÅbþ€46À×€:©¡•,àòE¸#±Á`à{Â& ­NÒù9RÙq<Àpmòù¼Ü-\/€.Ù+ágq:Žm³"¬¨§Š(XQEÕUù|^NÇÿ ÿýââÂiÛ³ÙL•JÅÓÝ0ÁŠ“v4LÁÑSÒívupp` ^\«hFq"³ZO,s£Ã¤w£Ýn§§Ÿ~Ú'¹XÌÒˆfHà`­VÓ`0ðÆ…æ‘ :™ô€²¨ÑhèââÂZ ´ä€ ´Æú–kžËå”Ífuÿþ}•Ëe466¹\Î.`lI¸¸QAACQ¯×­eÙl6÷Ñ©H²):¶Bè-¸wèÐ+@%DÒpâ„€{6›y“aay\šóL&ãg!—Ë™nfp‘‚úES¿Ûí”ÉdüãPU«ÕÇÕív-’GwCƒÎ3<ŸÏ÷¶sò¹Náߣ³ÀŽš¯µÛmŸ÷.™LÚÕ‹k¶Gzà$uuueÇ0ž;4V#Í‚)©ÝnçŸeˇžkņ ZZ<W½^W·Û5¸9>>6U2ŸÏ;oÇùþØ"øO§ÓšÍf¦$r¿¢Š*ªWÑ$ª¨¢z¢ ~9¯ÅbaW(¦´œW½^÷4z>Ÿ{ ­ˆm Z‹ívëã¦ygª … ›@L­Vs¨âéé©©Nd©„IÓÓéTNÇ:éÆJŠâ_¯ ÈA²–ׇªÕŒ‚"ÅDŸ¢|lsCmà@FÄÛÝn׊æ´T*ù¸CL‰Ù’á`…Ög½^k<û,Ù(ö‰ ïË– €Í9‘g‚aÂ0˜gŒÏ@Ž×èè|áçód;ÆV† ߨ½X,ú^/¨Žè—58šAÅâz@GK&“Ö†IòóÚ³z*Ú€Dõ8U´‰*ª¨ž¨*•Jn¾qObj“ÎÁÁŽŽŽÔétÌaGØ‹kHA‚ê1›ÍœIA¦Ân·³3‚gš*ÜžpÑÂ÷1}ÇV·¡ëëkÝ¿_·oß6X9??÷D~<×ùù¹›$@O.—s‚ãÎu€î%…-†$S’ x5 o€$YßÁæk5}^ã†ÁR¥Rñ&F’³Yòù¼ÝpTb“Â{ ih…)ö’ D¸4¹óùÜ L’­ƒ±@¦q•¸cá€F³Íl:ÚNw8:ÑÐ&¨\lšØV€¢¸}år9Ÿz‹D"áMZ"‘°Ð:´h^­V:::òsÊ–€4ªT³U@ñZ4߀¿Bó4QãñØ×Ž"ÇI§$‚ëëku:[5s½¹vèCÂû‡¾a:Ÿk\æ$9»„0A€[34X‰DBÕjÕZ´BlZâñ¸&“‰-‡G£‘Á0[ÑG¡"°ÕãR‰*ª¨ž¨¢ O&“¦ùèääÄV§:;;S*•R¿ß·hš†2œØ†ºƒ0ç@zÑAðÀ#Lš¦y&Ȭ×ëí½6[Z­¦b±¨û÷ïk0xRN(Óh(-4©ÍfS“ÉÄîFPÄpàšÏç¶fÒN3ƒ°+Zh)ÛíÖiò»ÝNÇÇǾ†P[4lÂæN’Z­–3pÑ é9\ß0(‘’û¦j_]]©ßï[ÏÀv…’é9Âj®/Íæ`0pX!×[Y&êãñØô*Äê8Aq¸Ö<|_<W¿ßw0#v¿œg©T²qøì’:>¼ñ"•¾V«Ùˆ€ûW,õÅ/~QÒƒL¶\@’$»±MšÏçv±b[ÄJš"éÐ’)Ãý¬V«{4,IC!ØD·Ä3Á¹cB)‹> ø ¡/â}8\·ìv7Y?Pã$i4ùà9`;õÂmX©T²F$´Ž*ª¨^\E¬¨¢Šê‰ªÓ•Fº™|Ã˧ù`ºN&A­V³m,MÜt:µ%(zap_2™ôdÿððД#šUI¦Y!¦eªÎߥÓig% ÜÍf³vÁbƒCB7M5Ís2™´fƒ ºßP­B=]¡P°.þ=[&ê«ÕJ½^Ï‚ájµªù|n¯$;e ¤iã¼'ùœS½^W³ÙÜK,G¸J¥¼Ma;sxx¨ñx¼—´ÎÔ›Fš©=Î^ççç¶/†&Åû@#£¤^¯û¹@³BÌˮa ¶bl86›_=„ÜЪ¸nhe¸6‹ÅBƒÁÀדëÆvû^î®_èwa^É ›6 \kÀ#ŸžsÜÔØžäóyµƒƒS¼8g9  ÝJ2™ô/éÆ:ç)¶CÐû°”©|è7{\ 4!ÜèŒ $ØTòûn·óàÎç´1lŠfE¬¨§Š6 QEÕWÅbÑMÙù|Þ·.*Ü EUT/®¢ HTQEõDÕjµÒåååžà›m4rh–h¦K¥ÒuúE,spÄ———n2iðÉ¡‰¦IƒîA“5™Lœ\ x Ö p<ív[Êf³N¹FëM&ŸÏ«×ë™ïŽ«Y4¬Ð“Ây µZÍ¢hINqg£ Ý; IDATþ`0P§Ó±})›~ž vª¡àMJH ›@Ñhd°B³Ž®ÓD"ጠGò3¤T³b±hk`ì~9¿‹‹ g«±Zî÷ûj6›ÞVÑäs?h”Ù4ÐôÓÜ£ØívÑó¼ñ^ЫćÞ2­V+ë€Ð q‹…...¼1XØh¡-AgÂÇõGïÀEsÄ3Îñrñaþ ›·$ ÝCsB „侄ÛI>Cü½$ßs6d|¶Æã±ÎÏÏýüq¯BËb6_¸æ¬Øæñ9ÁéîQЀD¨§Š6 QEÕUWWW¦â°1èõzžèÓøÐ ˜–3¡g2Í´—Ÿ“äÆŸ×Y¯×ê÷û{"îñx¬J¥"éÆR•¦u³Ù¨R©Øyˆ&‰lív«jµêü ¬`£C9>>Öt:5ŒÍNP4Ýnכ܋˜^‡‚pè<ü= z¿ß7E(œDïv;k&ØøÐèq…Ùt`wŒ@ Ííéé© ¸Þ5@M+Bu(E¸;±aÀ9‰üä˜ÐXÐ0%@#`€Ö†›¹#Ýx<®r¹¬çŸÞ›ŒB¡àëŒÅ1©ñ4÷£ÑÈÖÌlcVaH  çúúZ¦õq|:è[ãñØ›rVÆdQ,}=C€ÄuàØ‚±‘b«È3R¯×÷6hvØ‚`ï GûÃý Ï èív;SíP„FjG0 `€kÖ|>·v =WxþQEÕ‹«hUTQ=Qµ^¯­£¸¸¸Ðt:õæAÒ‡É8M&BdBØh²°vej  ÜÔj5ÍçsgŒŒÇc»IBÿæó¹‰ ˆ1¡†¾Dó · V¬4gLn¡lU«U[ ³ý©ÕjžôR$³‘X,Úl6Þ²  ˆ% ç,@7Â} ðĵ…ÖÅטŽW«Õ=ºK¹\–$;@- g¸ÂT:N;ÇB’]Šr¹œÁô³jµjð@Ða±XT«Õòu$/åàà@FCÕjÕzŽQ’|šöív«z½®—½ìe*•Jþ>¶'äÌ>Ù–±u*—Ë ÛíVÅbÑïË÷~HÏ5¢Éf»j$hú9ffr=h®3èp€T¨yêõzÞV …½­?“L& â i‘ƒÓívõÅ/~ÑÏ6Ô¯0[…&@ Úˆ­GhMÍç—.@ Ï%´A4=áù½0|ÐÅö­Q»Ýv(áîhÕãTÑ$ª¨¢z¢ Š ôh!4™LÆîPh ¬0í÷ûÚ2ÁÅ%‹)¥RÑd2Q©T²U*†ããcB¢‘b"ËÄ<k±X¨Ñh¸ñ æÝ³ñÀ½j6›©ÑhèââÂTt PÆpbŠŒ“ú¨d4šlD$¨år9oHÐ_ôz=7l9Â|In±\esæ Ì»¬à¸Å¾Ñh¸á ]šŒ¡ÃÓwšP¨Y|/€©Ýn»Ùæï …Âu,N;‹"“ÉxëB³ŠÖ€=66ÐûŽM{ØH“8ÈAÄ5åxÙÈp%ù}8IÖjt»Ý=Š÷ŸÔuÀ!ù›Íܬ×j5u»] ‡Ckh¼ bÑì¢G`S"É`„ïúúZÇÇǺ¸¸°¦7¤¤H2 Y­VÖ„$ ç~ SZ†Ã¡v»GÃQ*• ˜f³™jµš.//­™@ÓB£:N½¡|]\\„Ô'¶êt:ÞÖ@;<ŸW2™T.—Ó`0P>Ÿ÷gD’·|á3ÌkÑÜ×ëu7öa‚<›'@ TI ÷dµZ܇Ù5WWWªÕj6w€ZƽÀpmÙú°Âu+tÕâØƒ7"›ÍF­V˃…‡]_¯mE´‰êëQ‰*ª¨ž¨‚z}äèèÈSåõzí©+Yý~ßú‡F£áŸcÊK¢\hM48¡ ;lú$™Ÿ?tæv˜ºÓàÑÓ¬ív;OÔið …‚²Ù¬‡m¹±XLårYëõZµZÍ 2ÀàììÌZ6¤ŠºˆE+ÔeÄ×4{7ú˜W¼â>v€øÑh´g›‹2™xsHb ~qq¡R©¤J¥¢ñx쌶?ðüS©”7/Ûl2 xán5MÏAs3ŸÏ ®°.fUíõ>G¨$Û òI A[.—{:š0ù]’Ãñ Pe³YIR»Ý6ØÄΗç&nÓ\¼H—´çæÒ‘B—4¬}ù<hÙÔxvÑô„¯ÏïÝn×%ÒÖÉ6Æç—í @“s#ù½ßï{ûÉd2>þЭÊx<ö`6›©Z­:È1 Š )s|þC|TQEõ?×ÇìQEUTßÀšL&‡ªT*n0Ø„IP(œñ'Ÿ)t£ÑP±XtCCÃH£Åï4ŸÒ Ð`ÒO–J¥œ.ÉnF‰DÂ`ƒæŸ&7žjµj=Äp8Ôd2Ñ|>7ˆ AbâËÔšà4ÃF£¡ñx¬ÑhäÆs4©ßï«×ëIҞ΃ør¹¬f³iq8v®4â4édU ‘øì½{Œìw]ÿÿœËîìÜï³3»{®½RÚRZå*%*ˆ€1‘$(¤6Ñ(@ þC‚ƒˆhH4AA…€¢#ÈÑ`´EÀJS ¡×ݳçìeî÷ûÌÎïý=^ç=mÑö+pZÏç•4=3—Ï|>Ÿ×ëõ¼I2*T¥R±çrnÎR\tÃï÷ ´A:(«Õª T­VËÏF£açtmmMëëë†ÞàjÍJÛl6³ÏÉf³F£ÂÄ" )›ÍÚVž¼¨G<û^†4/h{\D‡¼Œ8?‹Åq  ÷º># ªÝnËï÷+‘H˜=,®T’ …K¥Rv£ù1A¿:€±è!—à»Ý®æó¹QæVù-àè†ãÃè\<·ßÊêêª2™Œ!T>ú¨vvvlðÅã\û|>³N$†à\ÇõǪV«&¤wŒPb±˜ý–Èî™L&Êçó†ºq3´?SË¡ÿxË[ÞbÿñdÿH’Þüæ7?éßßpà ßïÓâÕ3°<Ä+¯¼º¢ ;]—|>o‰è4Lldc±˜æó¹‰Å—Ëe¥R) mnnÚB“Ív<‰X¾CA8¶AÇ ë£ù—‹ÅLSBs'æçèèÈ8ôóùÜt ¤qc£Êsdb±˜QLÜð;š1¶î5öz=³&éÀšW’éØú“ÊÄb6›©×ë™ÛÑx<6­[þN§ch´!ÐÙм@©‰ÅbFõÉf³êt:¦g‘dÇÃÀAa·Ë{ºÈŠ$ûŽLb) j‰D4Õh4 …ÌAJ:ÖùÐBëAWÝ®ÕjÙÀË÷™ÍffÙLãŒ^,j6›J$–œŽ(ü‹J¥"é’¶e0¨P(Øà0›Íì½x?7ÿ…fðDL’ɤ5á;;;–¢ æ÷ûMgB3¥Îo/ õz=*6–tM étÚ~‡Üo ‡CÓ†Ìf³%J[­VÓÚÚš‰ïѾÔëõ%"46†J7ý=‰( )N«\.Ûïš.Z èjWbýÒ/ý’^ùÊW.=¶X,ôö·¿]gÏžU©T’$s…ûøÇ?¾ô{„æêÕ•UÞâ•W^]Q— -nNÉdR~ÿqˆ`£Ñ°ç#€N$Ödà‚…e*eš·Éc  Q$´Îµ E€kS·Ûµ9̓[^š?»A 9Ñ`³}žN§†† mpÓœK¥’êõºr¹œm˜¡ò€Ò°•vu ÎY LØÍÒ 2ƒAš†!7Ao4ûÙlVFÃÞÇu!C—ÂÅñA'‹Çãê÷û:<<4ÚRˆ —CÄŒ‡sC#ͽqâÄ C:$™ç*NkwwWNG‹ÅB¹\δ®pÆx±X(N[#Ýn· ±ŠD"ŠD"Opô"†Áúï=Žá/ZSÅó Õ TˆaD’ LÑhÔÞ?™Lj:ªV«êª„56ÂÃáÐ#ɶA¿Á€Œ¾Åï÷›†%‹i}}Ý´‡~XÏyÎs4 ì·Å²€Aä„¡’aá|2™´Á”@EÌ ‹…¹ÓažýŽëĽ ºÅ?šèË¥yá _¨¾ð…KÝ}÷Ý zã߸ôx0ÔÞð†ïù1zõì+oñÊ+¯®¨¢†ZĦ´×ëYãDö†$£ÑìÐdáNDN”#ÐèM4Õñxܶ¾ «««ÆÇ-‰¢Ù¤¡…nu…u6ø¸x!Tg˜ý`¸H&“jµZF¶ÃöšbhމÍo PµZ511ïAÒ4 =çkkkËÒÁ¡ÃH²ÈÝ`W«UÓb@»Âyˆ†ðôéÓª×ëK¹~¿ß†šJIævåêd0 ƒÚØØ°„w¨WÅbQFÃÎ z(uÉdÒ·Ñh¤B¡`öáá¡Ñ²Ð•ðî4Bè>Êåò’…+È(ƒåd21±~04ʆЉ‰„¡d4Ú4¦¸% ­¬¬¨R©˜Õ.Ð(î\à[» ä®Ã¯!ôq×þþ¾9ÿ€plnnš°¹Õj©Ñh˜n ‘HØgÙÖšN*•2H«ÕÒÁÁÙ«’îΕL&Í TD¢ÙlÚæW’5øn¦‰tŒ‚är9­¬¬˜[ÏK$K‰Úëëë êv»æ$ÆóÐ×0è _h·Ûƽg0L§Ó¦y!“… øUW]eˆŠÛHöû}Çcu:Õëu;†z½nçç²b±¸D‘›L&ö~Ps$™f$B:FÅ\;ÝáphYh/N¯V«Öh C¦°³å~uS¼¹æ®€;X6õ L®¹fÕjUÃáÐDú.å ]ƒtÜÔ“gÂÀÁÈ ×‹û†mR­VÓƒ>¨Z­f×¼Ùl ax"‘°ááooOårYFaÜÚÚÒÙ³gmä¾g¸“d÷:÷#ç=š!A¿ß·@Pt„ò±X̨s¡PÈÐQ~NÇhP Ÿ ¬ï‡þãÿU™Ífúë¿þk½ô¥/ÕÉ“'—þÛìd2©l6«_þå_^ÊòêÊ)ñÊ+¯®¨ ƒfõJó0̹Éݺ/ ÓhD"£‹ kÒ¡Í ^]]Õ™3g4´³³c4¢\.g:‹étªÍÍMÛ0ãÞÓjµÔëõ”J¥”L&Ï/ÉhV4“ñx\¡PHFÃ6å[[[æÊªBsÚËéӧͶ–&¶Ýn+›ÍšØšºIFCX ý'‹©Ýn+ŸÏ›bðÝÝ]MollXÃÝ'‰¥‡Üd2iVÈ PˆþÑÃàF‰DL£Þ]y,ÐdŠ@“V”.é7N:eBw®1ŽLè^FF£‘9&‘£R(,¤„ á?H IF⽡!´ŸÏç60²µ¯×ëŠD"Ö8KZ¢ƒ¥R)C@¥Ö××Õétì»ñþ ÅbÑlƒq³âÞ@‹Ôh4ì;T*C x©Ûíjww×¾÷Z®?CA45+dWäŽþÁ}04±=Ô?0+ôüNz½žQ÷òù¼¡bXèN§SÓ›€,aáÜjµ”L&µººªz½n¨ ÷÷íå®ËEÁz|}á _P½^ýjccCï~÷»uë­·êèèH_øÂô±}L÷ß¿¾üå/?#¬Œ½úÁ•7€xå•WWTÁ‹GŒðÜ¥ÈZH$,a{4)™LªZ­jooϲ$wZMµZµæmÃîѨñÑg³™‰„qè*Ó,M§SkâÉ:ÇÖ8ÃÛ§1E 1­‘m6›’d¢öÉd¢ CH í°-GçÒëõŒ‚ÄqH2¤²$³ ¥‘ïv»J¥R ‡ÃÆóG“Âqƒ@!†G;Bh£kÇí3i9Pm‚Á i-@ vA×Â~ê0ƒ÷Áb±PµZµsM%–³P‡hþ€môAKx=ßÙï÷››Z¥R±½h4j91ÐÆ\±=Ö½4€? 8h^4µ&Ü1¨V«KCÌ >î 5Ñ=&¶×õz]±XÌRÚkµš5. t y:¶cDÀ^.— ulµZšÍfºá†ì:¹‚qÌ@¹Ðp€äH’ÂÎïšH´Hd²ðÝž‡C áŒÅbvÿ»ÎaÐö8w\?¯¤OúÓZ]]Õë_ÿú¥Ç?ð,ý÷wÜ¡k®¹Fï{ßûô¹Ï}NwÜqÇò0½ºÌå›^yåÕU¸Z±‘mµZ J¥R*‹Fm![A’qùÇ㱉„mb%™~a8ÛS6¬¸%±]•dV¤­VËFÐl[A,ÐI käA(Z­–Z­–F£‘r¹œšÍ¦ Ùè"̦aF/bS,-IšŒ r)µ··§z½¾t¬…BAÒ1Ól6íýz½žYÛÒðäÇÆ$ Ñu§Ó1»Î@  S§Ni4-mëWWW-#$‹)ŸÏÛ‹Å ªV«FÝ-Á!KºÄA‡ÃK™ ˆú¡×«‚ ƒZ ýÇuêê46²$hŽi˜%ÙP„&ƒ°?ìz‹Å¢ér¸~Øäv:Çc‹ƒ`¸×›M½$lZuä~åÞc0e@gÐå>FBb<¨÷!Öo·Ûêv»zàtþüy=ôÐCF-ÄÕL:t{½žQ Ð¨T«Uˆg2CãÐÜà2ǽ‡É¿g2qz½žšÍ¦ÝëÜ·èÐGÍçsíííi4†Sƒ9çðû<<Ýz&P°úý¾þþïÿ^?ù“?iz´ÿ®ÞñŽwÈçóéܹsÿ›¯îÕ³°<Ä+¯¼º¢ ½îH$¢v»mœïN§£|>oIÔ•Je©Q™N§&’•Ž›%7„mîI4?4• ?h  Pe³YC1ØVãž‹Åtpp`–«ÓéÔ’žTJ’‰Ú&KÇ\2.hê+•Š¥§c_KS)ÉÜ²ØøJ2‡ P 7¾Õj™(±.âxÍñx\ãñØ£xÏV«eÇïƒù|Þ2]ØÎ» w¿ß74ˆk.ÉP®%H‰ó/^ÔÚÚš \ ¦86vAýbè@{Í/ êÔ©S¦aáq‚h#iÉAªÕj™ˆa:ˆO ° ?ay Dh&‰„éE@†Ð‚0¼BsâÞmÀ¨×t‚¬ tOõz]ûûû6èÝvÛm ‡Ã:sæŒÂá°¹“$Bú|>¥ÓiÅb1­¬¬ØýΠjmmͨŒñxÜܾÐAñûtfIfDÀÐ']J]çÏ‘HD¦ ÁL‚{êÙ^•Je‰ú)é á—ÿ]}þóŸ×p8|ýê»ÕÚÚš9Üyue•7€xå•WWTµZ-•ËeÛÞBáA|  ªÇµ×^k”+²<Øê¢‘€B‚3Í ›Q6ê 'ˆÁIÛ&ìFŠ, Ã.í&‘H¨ßï«^¯ÛЄø˜†p±X(‹-¹?Õj5¥R){ KY\…@4ØO§S:uJçÏŸ×êêªÎž=kÁ~ðòãâ4™Ll3Üív-Ù­^¯[` ÃW 0Ô„ìÜ¡ØøO&5 år9CŒ‹…¡#ÃáЮ¥›¿ÁH$‹Å–\Î@›h؇“=AþI¥R1ÝE·Û5}†œGÓMj{ Ðúúºé@Âá°i7@ÞØÐg2£¨q~šÍæÒùÅ©J’Y»÷÷&8ׇPCIF_bsϱqœPÉÁš"·tl©Ûív }CÔkÂuh_ÕjUßúÖ·LG‡õío[?ú£?j¨”[PÅ %2´„B!•J%ûÝ¡[!Ût‡ŠA¤“aŠ hÎ\ Å8‰‘ÛãóùÔn· ]šN§ÏýÂÿ‰ÉçóÊçóKõz=}ãßxJ¯ÿÔ§>¥X,¦×¾öµOéù½^OµZí ŸéÕÿýò¯¼òêŠ*R¼É¸€º‘ÉdT©T,%šŒ ² lÌf3¥R)ƒAÛ¤"^v­8Ùn»)æó™Ïh>Ÿ?)ýêððPÏþóõ†7¼A×_½¤c·¬üÇÔk^ó½îu¯ûž³WÏüò¯¼òêŠ*ôÐqü~¿Nœ8¡ÃÃCk$h0iæ*•ŠŠÅ¢i à¼Ó¼CÉ ÊårfÏIê4<Í1›éÝÝ]ÛZãT«ÕŒ×¾±±a´¶¹P•$Y£Ž Ñt:5n¼»ÍfðRI¶¥f‹ò€“×`00‡á‘9"e7×JX4µsŒë“+ºfxãør3, §8::R­VS<7DÁÍ} & M<ô#xIF’dbÝn×4ˆÐ «äs\CTW‹áR¼&|%“IËÅÀ­ C1Ã/CÇ ZF-ôÒÕ®ƒACf(èy\k?(r l fÝnW÷Þ{¯^ö²—™6‹h†Ul¡Çã±*•ŠiXø}¹F$³O§S»Ü œ?‰f³©d2iT6w›"²! (h”‰„ ­ * GÐö°÷…Ló„C0Ã’ßï·=V2™|J‚ëÿëõéOZëëëúñÿñ'ü]*•Òk_ûZ;wNþç®ù|®«¯¾Z¿ó;¿£_ÿõ_¿ GëÕå.oñÊ+¯®¨Âõ‡&Ïçóiwwר+4$ؘÒÐÔj5£‚ÐÐ㾄- 0âî••Çcõz=E"K6§±—dôP\„ ,ÑXcŠ.$™L*•J™¨kZ„ßè1‹[]]5Á'²t)ñÏF÷@î iÑ8K‘½¿¿/¿ßoÖ© >ˆqÔ‚j—ÛWšnÒÂZ„µŒsÌë È€°¥Åbª×ë–½‹ÅŒjÇq4 šÈzÈårªÕjÖ¶°hnƒ( Vg¨"!yÏWVVT¯×MÃ=›‹VÎ vµ .] mG³ÙÔ… $]¢A¥ÓiËøpQPI†ÂHZ²t&iûe†Z¨ 4ün1tcõ‹Ùsžó;¯ÓéÔìm¡ÌÑÜS Z¼g¯×Ó… ,íˆ×ˆá4 ‚{©X,f×êC#K7·…ó*ª…Ã92 *$Àƒª0ìázÅo~uuÕ쟟 A„^yõl*ñÊ+¯®¨Â¡: –ž4Ÿ4$’¬éÀ G’mKC¡L¼:™LLôLà݉'$‹Ñ›Í¦}n>ŸW£Ñ0Á.´#(5 ®]­$küjµšQÒé´2™ŒÑÖ××5 l°’d6°¸nqÜívÛ¨W®e*ƒß ô" ZK”Bö°"F0ͦ8›+s†7„¾ @XÞºˆºhs\?\ŠŽŽŽFM(ŒØÄË¥Uaìê%Âá°šÍæRðP!N\ÇÈæÀðÀµ²m·ÛFÿ‚ånÞ¡MÑÀ£±qSÙ~¸^8SÑœC'¢‘ç»Ïçs£µ¹éìî=rÄýŸH$¬ùÇuŠðDhg×À½—@hè³Ù¬‚Á  ÓéTõzÝ®%C<¢r†yî5ô3PΠ-òzŽ?“É*È€BvÏÊÊŠâñ¸ öH$¢££#CùügB]nÄ+¯žNyˆW^yuEU«Õ2´H$b ´š$Dî.Ë\¨8îvšá†ÆîððPívÛ‚éêõºÑ?^C¿‚6…E(šÐ\¢ü~¿Ö××U.—í3pw»]k’àÿÓhñÙ¹\Îh@¸ú°íǽ ¡ôx<¶í5Í)M™;<<ÐÜ»: é’þÂý<4ÍfÓRL @VŸ+“ÉØÐÅw…Ö%ɨ>Ò¥üî5(gÃáК°n^]]5‘=º#îC(ƒƒÁ@ëëë –CÃ@·Û5“I&N?<<´á‚kG( Ã:C_³Ù´@Ð|€0nll, ÐÏHš±"ÄsÀï–a ä ÚkY^æñ‰íœ>®3¿iþÞµÝv­”½òÊ«§^Þâ•W^]QEÓ–œÜ¨.ð¾s¹œÚí¶QaÒ¤!<¥QC¼M“åjà¶’W­V I€ÊÅßC“!E‡&¶×‹ÅÂBø‚Á !)ù|^‰DBÝnwÉòÖ ¼ƒ¦ m( ‡Ã¶Ñ®T*†> ÁÍiww×xôdˆpÎÜæ=G»Ý¶¡ˆmšC,SAaÐ|`Ksã v¿ß77#¶ÞPÅ$i}}]’ }ŠD"ŠÇã:<<4d~¿‹’L§SCtH)àXc±˜i2VVVT,—¨=~¿_ÉdR«««:<<4Í .j8£F8ŸÏ•Ë嬑ç{¹T!)ÎË’– ɰ ¦Åá>ƒêçj_$Ù0ínþA.°í-—ˆî€h`ˆÐï÷-Ì‘{ØÍºqvu²t:­ë¯¿^…BAÉdÒôY™LFÃáPFC›››†ˆÐô§R); å|†$;ÇdÍH—´&8gAËcÈÀ:tûŸai<›7ú7hô™PâÕ³©¼Ä+¯¼º¢ á9bkšÀxèJ¸w¸WÐò e‚rÇà6ͮÛënÖl6-¨äsîíÇ“±XÌ2s´ ‹¬×ëzðÁõíoÛ]÷~‚&–J¥têÔ)ùý~% U«UKdgea ÉU7DŠ‹/2SœøžˆëWWWmxãó8ç8g1ØØðÈñ’)â:–yå•WÿsyˆW^yuE‰Ô|qÃ"Sô`4 D1´+¢¦YDኲ±ª¥Q?::R¥R1¡°t쵃Ð76ø™LÆ6ïX®ô'ÉtP¡°“¥qªD >Á‰P”$©Ñh•ÆmÀåóùÇ rÃõД0Es²¶¶fu\¼hôhèÉ,Á‚˜ªV©P”£)A?0NM„Œ{¨×Ñv.—S£ÑXr½â;ÐðB§BŒ ’C㋈w+ŒOrÏ)ÿMÉd2±¦šágkkKóù\ív[’Ìü} º‰••5 ÅãqÓö@ùâ½%bÁ÷¾’ÃÐR¯×Õl6 AàüK—6ò L ñx\ëëëÚÜÜT6›]Z 0p¢+áwÔh4L¨=ŽÁÝZ—ÕÕUµZ-£ñq.Üc§ *ÅèêS¦Ó©-¸¸Nœ'P;†¤Ë]ZáÕ³¥¼Ä+¯¼º¢Š°<ÄÄÙlÖ4h/hÐÂá°Ñžp5Q€º%Éô!4?‹ÅÂþŽfŒ¼‰••mll -ˆf2keeÅô©TJ½^Ϭ‚³Ù¬m|{½žêõºm­“Cµâ³#C¡Y,–GB’u4U¯×3zÔ•L&#Ifmº··g6´—'N¨Õj™ø›ááph”%WÇòxþ}§Ó1ý }èi‰DB‘HÄô.P¤$"ã'r½°Œ…j‰DlX$§"«×ë)N+‹©Ùl.é]€QÊÜðIwt“æXið'“‰!3P“¸Ö F4ޏt1<ºú¾?4*КåV«%ŸÏgߟm>ßi6›™(ZT,Þ“á“áÄÄŽáÁÝ Ï[[[ÓUW]¥Ñhd–Kû¢Y¿æšk,‘g7l Ñ¥ "ÚÜÜ´kÃðÀyb À ŽA•Œ”T*µ$nwïCŒ\á}¯×3jÜd21w0¨ƒ ̳ÙLÃáð€x,¯žMå ^yåÕUXD*‹=þgí.<>ŸÏ 6ív 4ìõz êv»šÍf* ¶I†W²BP`¹\¶FØÝè^uÕUÖ,± fÀà=q¡¢aËf³jµZÖl¹b[i>Ô€æŠZ·ÛU4ÕÑÑ‘¡5ù|ÞB¡¢<Çvœí4›rè>ÑhÔWG¨2ˆùAEHkÇñH’m³¡ê€” DÇ\  YМÛlBYsév+++†ªpM[­–qûÎ3ŒBs£Y‡…Ñ׈Á‹Œô9ÒÀb+ :ÂóZ­–ööö´X,´¾¾nh)õ Eˆ¬·¶¶T¯×µX,T«Õ ]8<<´óéÓ ’ŒN†¦†ïµ0Z¸Ÿ‹zq®ÐÄp^3™ŒžóœçhggG{{{ ƒ:uê”9›¥R) æä>ì÷ûfpæÌÓŠ@ÝùãóÜ¡„ ‹äL&c¦ ‹ÅBÚÜÜ´|šÇ7Õ³ÙLõzÝr~¶¶¶Ì8€{Úï÷ÛïÂuK¥òÊ+¯žzyˆW^yuEU<W:¶@µ“'OÕ§Õj_’iD ьмÀe—dÍ)š¶ô<F-™™$tèN4NétÚ¨X49ý~_ív[¹\n‰þ‚û nM~¿_©TJ.\0‹XJxý4Ql³ùs*•² ¶d2iCVÄd‚À¯×ëv,ˆÈ9Ž‹†:šßÍy8::R6›5TŠFñµ« AwÁyå1жÜ4ØÍfÓ\Ê:ŽÖ××uxxh”+®5T2¶ë k¹\ÎBÑ"à Æ¦TŠ{¤‚P·ì™v»m÷]±X474²s 1qÁDÓrpp`ÈÏqÕ@Ø@IÑWPJ2-S45Í”B¯¼òê©•7€xå•WWTu»]U*¥R)si"L ¶´èZ­Ö’æƒæƒÆg4™¾fç1,ÐÀÑ„âÚÓï÷U,­!†&ÄÄV‹SïV«¥d2iv¥ ®+T*JÜ¯Ø çóys¢bàXYYQ:¶aÀçó©R©"‹Å,ÝÍæ`Kˉè× ID'‘ÏçÕëõtxx¸d±Êq"6æ}[­– …‚5>ŸO›››&4†Â…f†óÄ÷âÚÐXÓÈ·ÛmËêØÝÝU±X”tììRqttdÇç ¸#ÈO£Ñ04¶ÀÜ;™LÆP0阦„V4#‰h:*“ÉèððPfýÊõa8á`8Š{ qy,34 Z: Ð If¦àê&†*•ŠF£‘Μ9cNX WW_}µƒÒé´jµš¡3ÙlÖ®} P6›U­V3ãBý¸F³ÙL¥RIñxÜt3 v 3¿-5l® ø½€¢ ás=8ñxܨh‹ÅÂô8h› Kr.n¸·/wyˆWϦò_îðÊ+¯¼úAÖÊÊŠ …‚‰¢ip¶··Í9ˆæº Y 4?°AõA'¥ˆc±X¨Z­ªÝn›[ ¹   ý~ßÂè h𩝭­)NK’ ³I^Çã6P¹ðn·k[nÃþ•-x2™\Ê2 ¶D"6¬I²×ð9£ÑHõz]•JÅt½^Oív[/^T¯×³F:›–DZÏ™3glÀƒÎ‰DL'ƒ *buèqlõëõºúý¾}§X,fG„:‚zRq/pNÑ©ìïï«Ñh˜3M*…‡túÉdb׫\./9BÕj5F#Cœh²}>ŸVWWí³¸6ˆù]¨hÎNh`Æã±¡y„BJ2›^hƒ i„TÒŒG"5›M=ðÀjµZêt: ªT*úò—¿l.`nx'C 9ƒa>Ÿ·áÁ<Â|!IfÇ …ì܆ÃaCÀ°Kæ7;ÍyŽ¡& Å7ì“l„öÉdÒ¬©¡ã% û­¡Iá÷¢† ¾×¤{åÕÓ+ñÊ+¯®¨BìŠÐD»ÝV«Õ2÷ 7<­V«™†c:ªX,š8šÔ”µµ56êõº½_§ÓY¢y@)¡‘d ¹xñ¢YÀN&ãÝK²m;ŽNëëëÚÞÞÖÑÑ‘jµš …‚ѤcŽ:”2êõº (4Ç4òо¦Ó©²Ù¬‰ç±Þßß·&ž<ôœ„ ¬×ë–7!É O77…ç3 5&÷+d7ÈT‚÷DOB{ÐÄóÒ¥í?Ô12yþœN§µ½½mçŠ÷F򯯡 ýh42íÅÊÊŠ†Ã¡i\ àãµ®e1ƒ)î’Ý]6> ‹c(l܃¨AûpÐ@áÔvï½÷jggG¹\Κpìi¦£Q)—Ëêv»F³#=ÝEnÐ`¸á•Á`P¹\N¥RI‹ÅB­VË6†~7îï}a¡8ùý~åóy3E µ”«`¾G«Õ²xôK PY.0 rÞAp¸.gyˆWϦò¯¼òêŠ*¶à‹ÅÂ8ÝdJÐ8Ñp"v­`¡u:£S±½‘èt:Fc™ÏçÊf³FMŽƒè¼×ëÏ^’mþiê8fÜ©hR'“‰Êå²¹k¡³€þrpp`Í›n’ØAyЉ` bÖã%ùÜÍ3 ƒj4ºæšk$IÕjUóù\ÛÛÛ:qâ„5|XéÂ˧±§ágûŽ^ÝG½^_²ê•Ž›ýJ¥b´5PšÄ%Ë_P :Î(›p¶éPǢѨ¹&u:kàiÚÙØK2a>hô(ÞJÝt:ÕÆÆÆ- ñ3zšy2.h†¹N{{{ºîºë4›Í4 iƒJ5—¨X,¦F£¡P(dù7’L´ÞëõŒj†3âz¿ß¯¯ýëÚÙÙ1´Ä" ™>‚Ášá"ŸÏ+•J顇2´€{+™L*‹i{{ÛuÞ'+Ú5©©T*6xp?`S úP©Tl˜‡*È}ÌuÃ5 Š"CÃ÷ææ¦ÝÜŸÒñàL#”/hsè úýþÒ=á•W^ýÏå ^yåÕUÐÚí¶Âá°êõº‚Á ‰„%ž3L†M³H 9IÙ4NårÙÑP>h¢È0H&“ÚÝÝU<W¥R±†›ÆšJ³ÙÔp8´ @šlò)p5b˜¡Iôûý:þ¼Q¤¸ø.¼' V§8!µÛm‹Es|â½Ùøïíí©P(Xö´(RkkkZ,¦s`KO£ŒëÚÄîl³AO8_’Œ6…w#W„Nº;ƒ!¨ t¨M4ù.¶X,Ôn·-!‹UîŒ\ý ( zŽ“áªÕj)“Éh>Ÿ[R8H t$´ .˜¤R)CçÖÖÖtæÌ™% ¯wÝÊøoŽ:!¨Á`0P»Ý6*hÓ|>7 iön‚ýc=¦T*¥óçÏ+‹™ø|<›cMx¯×³Ü Ð)è†@À4OÜ_ÝnW©TÊ´0 †è<¶ä:QPÉj¡E5 CL¸ß@§p‚C,ŸJ¥´¶¶fh^"‘0íÇÃ÷H&“v’ަç™"B÷Ð ¯ž-å ^yåÕUl˜§Ó© Øy"8‡Ú‚%(Í£Û¸³••ŽÎáph¯A$N8!ˆV‹Å¢"‘ˆ:޽}©×èK vñZ†Ùl¦L&£h4ªJ¥¢x<¾ä¤$i‰VƒU*¶¿PÇ> ÅT«UÓy\¼xQ‘HD'NœÐÑÑ‘ý"r΃$…Ãa³G¥Ñs­V\ ‚ñhRµZMétÚDßÛ]:è4¶þ‰DBµZÍ,s i¬ÕjÚÚÚR¥R±{ Ùp8¬H$¢J¥²4Ò`w»Ý¥ðAÎo¹\^¢²ñ=l³}'L4c8.Ѻ¸þè'\e×îV’mâѵ0„ºZ ÎJ° †z…æ„A Ôf6›éüùóF«â¾aXç·P*•윂|H2³7=ŸÏÛ°Îç ‡C£s´1Àq¿âä…KCôp8T«Õ’$3`À‘d÷ß!÷.òhX"ð»›Ïç–uÃÆïÄ“ìî_î7†Y¯¼òêé•'B÷Ê+¯®¨"Ñš-¾$£A¹‚fGoEk6›)NëäÉ“Êd2æxå:èÉb±ÐÆÆ†¹ ±%§ ’Ž“ÊÄ/ ËÜ rím±0…ÅŸIEç8Ø\g³YkØi×ÖÖŒ?OvÛ\é%¢y¤1€¶ÆydÔ0ׯ{ZÄb±hš\«h [­–хз°ïv»6 0ˆ£ @¬Ø"ãÆÅcœS>“fÞ}Îb±P>Ÿ×ÚÚšâñ¸]ëÁ``h–kÙ‡-@Ñueýd÷ô"(t¤r3AŸzôÑGuÿý÷í&d„l¼ÉpÁ= z\45}F(ÒË^ö2»Ÿb±˜‰¿8»Ý®]ãt:­ë¯¿^¥RI§OŸ¶÷€ÒÄg“{ƒ~ÔÚŸ‹ìI—’éq£Êd2F_týî@ÃuCC„M6v¿ 7‰Dž bÇí˜A˜Ð¸ÈÇ3yàþû~üã•Wßëò¯¼òꊪ|>o4‹Éd¢3gÎh{{[ÃáÐ8áétÚl=Éod<øJ¥b֮䠀ΑËåÌŠTíf³iTªñx¬F£¡Åb¡\.§V«¥f³i‚eùØÂÆãqK?§QäÏ ’lûînòq¤’d\èGîV˜F˜ïšÉdÔëõT*•tpp`ú†%²P(¤½½=mnnZ4$¶ñh ØÚÏçsã΋E“©àòþIÁFøžÉd–ô"¢WVV 5’Žõ4® 4L§Óª×ë¦Y[[3ê6¹®Õ.:ª×ëYrz(274œ—\M‹ü˜J¥Ì¥‰ D‡óãá‚Ü'.E€E®t¢T*e–Å÷ß¿vvv”ÍfU*•4U­VͶ™áðÁÔÖÖ–Ö××MëÍî%/y‰.^¼¨ñxlÎ^[[[özoi9W)~7~¿ß„踛qp@ý ‘awËqJ2ûeî7¬ƒÑ¤€°1ür\è=Æã±‚Á ºÝ® ¶ |ÁȦáß®(C€ÕÕUCíz½òÊ«§^Þâ•W^]QEÂ[Ôöö¶¦Ó©Îœ9cM8š~Ò—á£ÓÌ Ý`hÁyˆ†K:+Cs1Èf³‡–1­'*šy>Ás±XÔùóçÍ”Aǵ]eÛOÓ„µ+Üuô. âÁ©o·Ûf™‹ëvª8iÑ ŽÇc³<¥y‡ÒÄ@¶¶¶f !:Ž••õz=sþ¢ù&ü¯T*©Z­š„Ï#¸€¹N§£v»­h4jBkçT*eß-¿ß¯L&cᇒ AV3NîÄÆþèèH'OžT$Ñþþ¾!FCù|^óù\ù|Þ¨@’ÇMÃÀõƒNDÚ;Céë 48@¡ .ÇàE%è\¿ßW ÐÉ“'•N§Í&y0Øù%8òпøEÝxãúéŸþiÒ úE"mnnš›Ûõ×_oiö ?8r1Ô®®®Ú}ÅÐ1mHĹ G):×qŠß†ë,Çqóë÷û6tc¶‡¡[’!d Ë„b"p‡†xßï÷[Æ Ÿé÷ûb ò1ì:zIè^yõôÊ£`yå•WW\u:€ƒˆX#H£Z­V’}ŠÆH:F&“‰¹±Ýu]¥Ø»BnBâØîf2Åãq Û»[КÍF£¡X,¦T*e[sÜ›HD"&¥AE(OÆpÛÍ{ q$ SI¶ F“Aó‡ö[WhH~¿_;;;¦£…BÖ8Çb1¥Ói…B!¥ÓiE"£´¡‡àXI·¦1ä3p#:}ú´ Œ¤»ã”Ôï÷ÕétÔjµT*•LDZ··§n·«Á``(‹ ¹ °kÃÊ@†l³Ù44k8J’9N…Ãa¥ÓiÅãq»®·‹ªàÎE¹CŸÍ mèèèH…BAÁ`P½^φX,¦'Nè‡~臖Р­¬¬èàà@¥RI7Þx£^ô¢Ùõ, æB2"ÇÀSh} [‰Db)ü’ǫ́€ß¿'P´@Àh‘¼÷)HT@„ãÜß P„3’ù↺#¿k—>Ç ÃqH}Q’90zå•WO­¼Ä+¯¼º¢Š-3i’¬Ù„ÎÄ&YlXÙÂÇb1%“Iõû}ˆ Y©×ëÖ`AáyˆÇãæv%IµZMápXµZÍt{{{†°!¦‰sÅð™LÆè,èýK¥R–ËÑn·MàM‹f£T*©P(ØwE¸ uÇ$h&¤³çr9köÊ£]aPH¥RJ¥RfÙ ?¿×ëYrv¹\¶jl[C¡jµššÍ¦ …Œ"…˜ B&“±q8ZNH“$Cvx/hk«««&þN&“v¾ÑBd2 –œL&j6›ÊÇû,ßn·MœŽÖºT8V&“Q °crógH¦ÇÆí÷#Ù'  X¹\N’ì1÷»øý~]ýõ*‹ú™Ÿù=÷¹Ï5Ú™$|Ã?ˆ%48B ±Þf€ä>‡†ÇÝëõL‹ÊÁ`ÃÐΰå÷ûuúôi¨8¦:¨é— IDATËYžÄ«gSy,¯¼òêŠ*ûhÈÐRÀO¥R Z__×c=¶D}ryé4_»»»†< ”®Õj†N°±uŬívÛ8ï’¬!§™I&“šL&* F½ ƒlHó-+ær9ù|>U*0¢ÑèRn –¸ˆ~A38ÿÇc³&ãÀu»B÷ÀÀ[T£Ñ°­19+|.´ ì`Ù\CÙiµZŠF£6°pØè£¡á%I$¶§ñ–¤\.§v»mCåd2iây—N‡(z±X˜v‡`ó”k2™è=ïy677‰Dô¢½HçÎûúŽPj"‘ˆjµš ‘HD§N²f{{Û¶·î•Æš¼ œ®*•е¿¿o¶›:í/h€{l£ÑHÕjUÓéT{{{ö™£ÑÈÜ{>$™ðºÙlÚ}eeEõzÝôP‰.t…â4ã4‡ˆ†A1€%hÃuGƒ°y6›™+úq|hf­VKÕjÕ¨aÒ1•˵@N$J¥RÊåræÐä"3étZ‹ÅÂ\“8ß­VKù|ÞˆÉd¢~¿o¹?M£Ñ0íˆt<@€h‘Tes§Ó±P?¿ß¯n·kz Ð ÉÑÑ‘šÍ¦i]0 ƒÍH—tÜôóE£ù¦é‡Ãj6›ŠÇ`À÷BK• 7¬Åb¡Z­fÍ÷|>7Ô€Á€…ãáÞ‚ZE^7Žm>ŸÏrD$ÙàÄ{<ðÀ:wîœyä=üðÃÚÙÙQ½^W³ÙÔ}÷ÝgC>¯ç\ðßè™pôâqî~O«««¦ç@ûÓl6í:° Êf³FÕc0‡ZÅ Æ¿¡nñ»v#G¯¼òê©—7€xå•WV=ô€îºë.}ìcÓ»Þõ.•ËeÝ~ûíú§ú§¥çÞwß}zÅ+^¡Ñh¤ßÿýß×[ßúVýÉŸü‰î¸ãŽ'¼ï{ßû^ýÆoü†^õªWéþètêÔ)ýÜÏýœþê¯þê)×/üÂ/è#ùˆÞô¦7é£ý¨‚Á ^óš×|×Áè¿+(JðÚ³Ù¬2™ŒQö÷÷—xÿ.ï·Ü£p "=Û`„· "põ ˆs½4¼®ŽƒAš.šjwã=Õn·—\7óô Žƒtn7•›Á†„nÞ+•J©ßï/QËâúý¾5ÒlØãbEÃ7ŸÏ%Éšøz½nAŽˆ„¡¾<¾¹¦ákµZK|šN,o¡ã â‡çÏ0†V:Q«ÕR¹\¶ëŒÀQ?´©D"¡R©d¨Ã ¨:šzЂyöjµj%6I–ûÁ½‡†‚!q{{Ûl™ù,b†I¨c Ì HœcWcý®$»7¸–œp8¬r¹l-ù% è„.>ïyÏ3ñ9A‡h®½öZÝvÛm:yò¤!/~ñ‹-#a8¨(×›ßú+PPÜÒ@-B¡²ÙìÒït«Z­ªÈ0ÅàÆ9Êǹu‡îGŽñr—GÁòêÙTË+¯¼²ºóÎ;uçw.=v×]wéìÙ³úÈG>¢Ÿø‰Ÿ°ÇßûÞ÷*“Éè_ÿõ_mƒ|êÔ)½ímoÓ¹sçôŠW¼B’´¿¿¯øÃú•_ùýÁü}ÎË_þr½ë]ïÒë_ÿú¥ÿS|}ík_Óg?ûYýÞïýžÞñŽwH’Þô¦7éÆoÔ»ßýnýû¿ÿûÓúŽd6`ÅK“ …4*ÅöŸÆ›]šx,D§Ó©Úí¶5Ý„°‘•€ø•De(#ÑhÔ6ÍÑhTñxÜ-×ÕÇÍ›èõz–bÍVÍ®?nÎB2™´f‘ǤKÁm4”nˆ!4ŸÏ§h4j¢i×M©Z­šUl(ZÒ M³ˆÅ1Ù$ûûû’d: (aãñXù|~©‰Ç‰M=Ûfd2¹ôY k’ "“„cä9 BjÄè `Pt ·p4ˆ,âg(afP׆á¹kñù<\___r±â<2<€2q,\ Dú¸E! æ³¸Oi°+•ŠNŸ>mÌ )4á<¶Èóù7¨yМÉd¢¼à –àÎÐÊïñèè8<’A0(›ÍZëdî4[ P%%­‘ad:êàà@‘HÄ~'\7†uζ¾ä­¸:œv»mnrP4=Ä+¯ž^]þ‘Ý+¯¼zFW8V>Ÿ7ÏéxË|îÜ9½éMo²áC’~þç^Ñht Ùø»¿û;Íf3Ýu×]Kï{×]wéâÅ‹úÊW¾òß~þç>÷9ƒA½õ­oµÇB¡î¼óN}å+_±0Á§Z4%>ú¨&“‰$ii.¡ ‰DbÉžs>Ÿ[¸ ( Íçh4R½^7Ž¿¤'ät ª¥At…¬4´4äFCƒÁ@…BAÑhÔ¬gWVV¬ét¢¤c_ÛétL§€ˆØ¥£ÐlÒ£W€êòè£Z£ÝI:æí“ŸÁë8?¹\Î%Ij4ªV«Fæâ…{±XØpH$L m+ÝívmP’dš ì»Ý®!Hиr¹œ¥Î§Ói£áð…}ñÎÎŽ†Ã¡tï½÷ê[ßú–]j4œk¨u ‰ <ãñØìsÑ@0ð‚ÒиÒÔCr“ГɤÚíö’/Ÿ‰DtÛm·éìÙ³F r‡JŽ¿ãœ‘î¦Çuê’¤l6k÷Ã=~; #dä0Ü1 ‚fˆù|>% ]}õÕºæškìy÷ÿh4R³Ù4_Dø X…BÁrw&“‰e¢szø ÞûÞ÷êÛßþ¶!’ôÍo~S³ÙL·ÝvÛÒëVVVtË-·èßø†=vß}÷)êúë¯_zî ^ð-‹¥ç>YÝwß}ºöÚkm«é¾ž¿:åR”ØÖ×j5U«U¦h\Ü-3¦X,fgš=÷} &sà åCKFÄÚÚÚ’¦Ãý?}²qkBPë4î6+YBéÐut»]¥ÓikiÑŸÐÐ’„ýx [„÷l¿i:t¤K¶³4+8F#E"›K—\‡¢Ñ¨Ö××µ¶¶f[éB¡`ÇÇv;‘H%G’‰Ý]Í6ç ô‰!T¦×ë©Ñh¨V«i{{[’ì¼ú|>}õ«_Õ}÷Ý·t]@\¡:iâápز"ŽŽŽ³B8ÎÛy†Wî›l6«p8lM´Kc°=cìõz¦%áe@q‡†3ŽsÄðœcì|kµšý&xN«Õ2 Ç/žP(¤õõumllذí¢E«««Êf³† 8 9ñvÕ.½ÆŸkÌÀé‚tLAtï;B:IŽw‘@¤n·k¡Áq3>ÐýpmALΟ?oç’!ª ô.¯¼òê©•GÁòÊ+¯žPwÜq‡¾øÅ/J:n.ßþö·ë}ï{ŸýýÁÁ|>ŸJ¥Ò^[*•–hQZ__ÒçI2*Îw+2 žìõ‹Åâ|ýã‹`¾\.g[w(Q4•‘HÄš%øä4(4DÐfpã#N£Þl6m£ŒmµZµ :âà^¯g¢Yë@GÑ2H§@ǾV«-Q³\*¹!l»%YóÖn·Æ03N-ÙŠ èÚjµjy ÐW@x8O ,ðòq¢J$ÖTÓÌÓ@³M÷ûý&¸GÄ>›ÍLïÀqÒ¨s-Œ‰\]]5JÙp8T¹\Ö™3gÔn·Õl6õÍo~SétZgÏžÕÎÎŽŠÅ¢^þò—Ûû¸¡ˆ£ÑHñxÜRÏ݆ÍÅx7] ê`0¨ œr¹œ ßúÖ·T«Õô/ÿò/ÚÝÝU2™´€:èq©TÊP †ÔÑh¤‹/š!€$kÆ4›ÍÔn·—¬¹ÿØäcíŠÝ.´>2g@«Ð#€Œ€¥ÓiÓí eÑ’dÙn^  tIĦ)2ññoÂ¥ãÿ-ÈårvVWW—ÜÅ@p2s]Öp×â½kµš5ü®Û”$³ÔÅê8™L. ‘HD£ÑHý~ÉÊA=×V’¢Ñ¨¡Z '>ŸÏDþžóˆU²k¶À=⺠yå•WÿsyˆW^]5NÕh4–#¹Z’n¾ùf{üo|£n½õV½å-o1m›tU·ÜRÐdžìyî{}·úß¾þñ…—h„s¹œÎŸ?¯p8¬T*eM/çv»mÍy©TÒh4R2™Ôh42.<[ÓV«eÚ¶“4¯îç“!ɶ©8$q>¡Î2Mßét …, ¯Z­šþƒð=þìæHÀ‘o6›–ÔM3H0[£Ñ°y­V3Á7áoGGGÚÝÝU8V6›µFĆ@=6ܱXÌþ=¬‡î†[NFX$»/è;P­ÖÖÖL÷áj4àþ“åÀsÆã±ªÕªÒé´ŠÅ¢ `×_½âñ¸úý¾ÑÅÜ뀃KýJ&“úÚ×¾fö®hö÷÷Fm°ŠF£Êçóêv»Ö(K²ãå½yŒá  ÏçÓáá¡ÖÖÖT,5NU­Vm@Ìd2æªjàæÌà°%Égw¾¹ç°Üm·ÛKt<†b\¤ø³tiqÊÇÀáŠöqʵÁy zH\¿ßW:¶óƒALJµ2׌ï R#£: ã$ÓcDà:ñ:WãõF£±¤‘¹Üå! ^=›ÊC@¼òê ¬{î¹G¥RIöï‹/>ésWVVôº×½Nû·kÍ ô'ÜnhccÃþ»T*éðððIŸ'ié¹OV¥Ré»~ÎSyýã‹;Tò¶··-d¬R©h8ªZ­Z󇵱±¡xŸÛÀÖl6Íî^>”¾ ÿƆ—TrhI¦¡¦e2ùý~% kì›Í¦qö‹ãTôÙlfAzÐæšÍ¦vvvÔl6 …Ç•J¥”Ïç•ÍfuÛm·Ùp©d%:v»mö´§OŸ¶ë/i)ׂ -® NMè  Ñ ƒPaûŠ˜:‰h_•JÅù$Ê»÷Q³ÙÔt:5d‚œ®ô«d2©X,fȺ‹h4ªÑhdC Hš›%Âȱ¢UÈçó–O=Š{t- ÙBÂ;44îoŽ…ÁܵY!ˇ,7ÝÁ9æ¼d’ÿvƒù]nllØ=Àï•óî"Ä^yåÕÿ\Þâ•WW`ÝrË-:wô¥/Ù¿‹Åâw}>.=8òÜxã ƒúÏÿüÏ¥çM§SÝwß}ºå–[–>k0è;ßùÎÒsÿã?þC>Ÿoé¹ßíXzè!ãe?Ý×?¾666tÕUWéĉºöÚkuõÕWëºë®³péxë\,‹ÅŒ;­(NM*Áyñx|)  Êxô¡éï|§¤cãÆoT>Ÿ×Ýwßý”¾Ûý×é¶ÛnÓßüÍßèæ›o¶m0ŸÏgVœóù\…BAFC§OŸV¥RQ«Õ²Æ×Éd¢L&c‰Ùä'H2á²$käªÕªÑO°[Åy d„í.îO“ÉDµZÍP€F£a9l­in%­ÂêêªZ­–zè!åóyåóyÛ„ÓÄó|Wt‹ó‰ê\¯ kÔ Àt:K)©€>EŽE2™Ô©S§Ôh4Ôl6U.—uà 7u4†0«Ýn+N[>y*‹ÅÂP-t1ÛÛÛ ƒ†ä´Ûmíîî*›ÍjccÃ(l’L,Îy€JDã‹à›kÑétlЇºÿþûõ¼ç=O…BAårYÑhÔšÚP(dš î%¶ý &h¸Æ®£“ëåóùtòäI5›Mu»]ËV)•Jêv»–¢â•«×ëÙ9`ðœÍf¦…@tÍ =÷C9Ã1…Ή¡‘ß~#©TJ“ÉD¥RÉ샡ÖU*•¥!É ‡L&“†D1¨@ÉbȉÇã–ÿІ>JÝt:U©TR³ÙT©TZJcO&“†ôðÛ€ÚÆ÷Â-ìÑGÕ›ßüfÝ{コõÖ[ŸÒÿ&}¯Šÿm;sæÌÓ¦¤>•‡ÚÞÞ¾,ßÍ«ÿ»åi@¼òÊ+«W¿úÕÚÚÚÒ _øB ?^ŸøÄ'tppð„Ôò|àzéK_ªÛo¿]o{ÛÛtáÂ}øÃÖ«^õ*>$issS¿ök¿¦}èCšL&úáþa}þóŸ×Ýwß­OúÓKúø‡¨÷¿ÿýúò—¿¬Ûo¿]Ò±Ýîë_ÿzýæoþ¦Êå²®¾új}âŸÐùóçõgögOû;®®®ªßï+•J©^¯+Nƒ9†ˆ@  v»½äÔƒei«ÕR£ÑXÚX‡ÃaÓ×°A‡b …–ïóù\{{{Ö ºpAT¸îlأѨqÙÑy¤ÓiÓNH—6àP±T,­‡â2ƒn —ËY3W.—µ²²¢F£¡Ýzë­òù|î¶¿¿oŽES0T§Ó±ãh4 …Bºêª«Ì¦úT¡P$hÇãq;§4ë¡PHÍfs 1¦W’;ŸÏ§\.g¶Ä¸&ÝtÓMj·Û–¸H$,o¤#DȱXÌ(K tÐͲ٬¡*ƒÁÀP(œ™Ð2¸Ú ’å9vYîOt lßi¢iöhÊå²ÝÕjÕ´ãñØ:t!º¹×\e´0XÀž¹×ë1™LÚ=åæ±@÷‚NHÞ×ÍÍ)9::Z¢Ò¡ã¤ .,9˜I²z#ƒb³Ù´ÅKQƒ"–L&MÃ…C´7¨^èNp¼c8AçEÖÇÚÚÚ’#iö ùÜoÏ„ò4 ^=›Ê@¼òÊ+«;ï¼SŸùÌgô‘|Äô /~ñ‹õ®w½K/yÉK–žûüç?_çÎÓ{Þó½óïT<×[ßúVýöoÿöÞ÷ƒü 2™ŒþøÿXŸüä'uÍ5×èSŸú”~ögvéyl…_ñ¡ßú­ßÒ_þå_ªÙlêæ›oÖ?üÃ?è¥/}éÓþŽív[7Ýt“$ÙÖ—-7´¶©h†Ã¡Ùš¦R) ‡CËRX,ªÕj򯯡8ü}¶ô†Ùþ¢ qéFn¢:ÇÁž4ê~¿¯x666”L& …´¿¿¯L&£Á` õõuêºyˆóiV±ð•¤¯|å+ŠÅbzá _¸ÔØqOH—šQW` Å Ñ7&4¤õzÝžûÈ#èÁÔææ¦®ºêª%N«Õ2[\šUœÎØÆs­% ÊÕ\«"ɬAR$ª€ëbl´f³)I¦k¡nµZ6˜ºˆ ¿›ï6Ó.õ g @™Hýæ>äq-pšÕcÃE˺»®v|‚žµZ- ³Èæ±À®šûX’ÙCû±cˆâZ¹¯áºpLÜC˜¸(ÙlV©TʬÇAØpóB«åi@¼òêé•GÁòÊ+¯®ˆ‚¦ðÙÏ~V/yÉK–œ­¤ãa÷*IFªÕj’d[|6½48Ye³YjssÓÄ·ätH—ûh4ª .˜Õç`0P6›]rÔ!\Žlbš²Éd¢v»mM9Bl¬Ai¼¤c^ÿáá¡5éðÜ÷÷÷µ¹¹iÖ¾  4³Øé‚üT«U=ôÐCÊf³ÚÚÚ2'-²A€î¹ç]{íµŠD"ª×ëFÁ’´äL…ůýëZ[[Óµ×^«p8¬L&£xƒaTƒßz†v‚<ÑIqŸ0ŒÝÿýúÅ_üÅËJÁ:}úô÷E‹2´³³ãQ°¼úž–‡€xå•WWTÑÇcõû}e2+³M=qΩө.^¼¨`0h¶¶Ò¥ CשŠ[céx.É(14aÝnW±XL•JE~¿_›››ö°Ïç[ÒtH²Æ¸R©XójûU¶Ôn¦†t¬çáØ K²4t† š\ëóù\FC×\sqßAXØ KÒM7ÝdÎa'Nœ07,Ñ.]ŒbuuU[[[j·Û&(ÆÑ>ÎaÐbr¹œ*•Š5’÷߿Μ9£b±hÈà çÑÑ‘n¹åC0 ÙZTÎY –4¾Ðµ€¯­­©\.= TCº”¨.]Bß864'Øæºzlaù|h?n^Ë`0°A»^Ž›ëŸH$táÂÖ\yäø`égŸ¿D ƒkïLÓæš8µÑhÔšXœ Ð$ ·\\\X#Ït} ÍûÙÙ™Ì °~=;;3á¯sÝ‹k µ¿¿o×y4©T*©×ë©Z­Ú¤½Õj- 6uù|ÞhK€ hhN‰Å‡N…3Åt?™LêîÝ»¶‘ak‚C[@î¿ÓéŠkŸÍf Hð|áä&É4? hf>ŸÏ$ŽÑh¤~¿oÀ@zM·s~n¶*€,ƒ€Û9¶5l01`³‚ÆãÎ;öûˆé›Í¦½îÊÊŠ½.(ÒÙ9g_t}Ñ¿ûwÿ®îß¿¿ôwׯ_·ÿ}zzªoûÛJ¥Rú'ÿ䟨ßïë÷~ï÷ôðáC}ðÁ_ [¿¼rï¶[n¹u¥Š&ÝãñhmmMÕjU‰DB“ÉÄš6,XIåfÊJJt½^W&“QµZµ)ðxŸÏqû!ó! Zó­DÒ’Ú Írš9Çx<¶÷®ÕjJ&“ÚÛÛ[rÚÂÑÇãñXr9”¨½½½¥$jÒȉ„½7ºP…jµš5†øe2­­­Ùä~<k{{Ûxül"‘ˆâñ¸&“‰Ê岤×ýææ¦9A{B(NƒŠ'¥Z­fnZ’ŒZƒª—Ïç³Mâd4:LöIw/  äè´9®T*Êf³¦‰899Q2™T§Ó1ª×y±Xh8Ú”wµ^¯gše¶BÑhÔ>+v±d¨ð]õá‡êîÝ»¨;Ž…’ÞÓÚùù¹âñørnU˜jzhvqÏrв¡O±a;ÂVÍà;[ž1tXÉdÒï¼ÏP04w*Ô/î ´B¨_’–²nÐñ¡Ï!§'‘H˜f„3fËn¶.ÎMÉU­_ûµ_Ó_ù+åúÿÿ£ô4õñÇ«T*I’ª[_‚r)Xn¹åÖ•*¨.PhÄáøÓ¸Ð”á¶Dàb[\³H÷ûýJ¥RjµZÊårhhZ˜ #@f£` Ñóz½æÒ„“ ›Ç£r¹¬F£a‚wéõ¶-“ëN§c6©Øëü7 ôé§ŸêÓO?µ©øµk×Ôh4tzzjïù“ŸüDÿîßý;ýøÇ?ÖÓ§OõòåK5›M£Dy½^£’ƒAår9³ÓÝÜÜT±XT.—S"‘0÷#´l²Ù¬Òé´âñ¸ÖÖÖŒ£0y<ëððP­VËfg.E«Õ²É;M'à=S“S¯×í:¦˜p³áÇÆóÇÍI’iSÈ&¡‘ j4:99ÑÉÉ‰ŽŽŽT«ÕôßþÛ³ßÿ|Þ sDå@@µZM———ŠÇã:99ÑÁÁMàÉè¡&ÿƒ–ôZËR«ÕôâÅ žžª\.ëåË—êv»úñl!{’T«Õôþûïë“O>ÑøCÓ@a µ¾¾¾¤{ø|@"÷ˆgЋåo£ÑÐb±0š#À†q7@ÁëõˆgEJ’=§üt)† 蘜ºIèyMÞa=Û;ž(Ü'À—$û<€£/º…ÿ/þùE‹3ú?ªóoþ¾ûÝïø¤ßøßÐÍ›7.èÖ­ÿÿËÝ€¸å–[Wªh$™ú3ñ¦’CJ2"qIf#›J¥Ôn·Íâ6‰½š /ŸÏ§|>¯jµªf³i‚o'…ꎳ9],j·ÛÆÛ—dÛŠÉd¢~¿o[šëÙl¦J¥¢z½®‹‹ ­­­™µ(ë½½=]^^ªZ­j4éñãÇZ__W£ÑÐÞÞž$éþýûæU­VuxxhÛ‚Û·o›;V¹\6qt½^—Ïç3:K>ŸW4Õáá¡iaÖ××å÷û­a&H‘{Âïb%ë ^ÌçóÖ|bÀÏ ; ¡ÇãKâäáp¸”«ÒívU­VmºÍÏ:Åä½^OÝnWo¾ù¦é8Ðe°‘@oã÷û­yÇŽZ”7¨GñxÜô\/èBØ÷ÆãqK8gÛUk<›ÃS0Ôd2Q.—S½^7{éP(¤O>ùDÕjÕ¶¿ò+¿¢Éd¢ƒƒË])—Ë:>>Ö'Ÿ|¢D"¡r¹¬H$b4,¶z’ ¸£ýèõzö¤ÓiÛ(a0™Lì^H²3*É\Ã$™ÁÛ¿d2iÀ;_(Od»°¹ðù|f¹‹AôHžc@¤Ïç3Ú¥3ú#y?Òg–ÝÐý8?Xx\e õ·þÖß²Íç·¿ýmýÞïýžÞyçIR¹\V­Vû9Š–$}ýë_×øÿá—ýqÝú‚Ë n¹åÖ•ªP(dö¤’T,NãU(¬¡ ‡Ã‚GóñìÙ3³Nu¦ 4ˆëÐáá¡‚Á 2>à#Ц™òûýæB•H$Ôívmk‚­*Ít¿ß×ÎÎŽæó¹Òé´ xŽŽŒKï´m%ÓƒIò'Ÿ|bVÃív[étZFCóù\ÝnWý~ßܨšÍ¦†Âá°J¥’Òé´®_¿®h4ªW¯^i:jmmM‘HĶ&4fãñXóù\ÅbQ@@ù|^‘HÄ´1ÝnW¡PHêõzÖx²Ù ê÷û* j·Ûºuë–b±˜5ÎùÂWgvtèfPŸÏ§X,¦ù|®r¹l[¬Xý~¿Êå²QµVVV¬ñ/—ËŠÇãÖØ²E;88°Í€$û޹\Îhc4é«««&>GC‹Å”L&M(=Œ>‡ÕjµŒ¦Fó-ÉÀ'4ÖkkkÊçópøòåK½xñB·nÝ’ô𦵻»«|>¯{÷îéùóç ƒºvíš:Žnܸa[B®`‹ëG~†ÇãQ½^·­‘3Ï÷0`û °’d××9€T·ÛU¡P0Šk›3Ä‘³Äó†cn\’ŒÆ{c}Ìâ¾8ݼœÓ|'å‘çŽ Û—¥¾Ç*¿ß¯ïÿûúíßþme³Y=~üX?øÁô§þÔŸÒ~ô#½õÖ[:;;“ôú¿·Ÿ¯b±¨V«µ¤ãrëÿÿrˆ[n¹uå `Á„›‰+‰â^¯WƒÁ@ù|^ÓéTétÚ&öǦ°X¹ÒäcÛŠk)Ø$M‚CÛÊŠÕéé©Mb¡*A év»ŠÇã¦_?4 t~~nö·³ÙÌ $üö`0¨d2©ÓÓSK.o·ÛjµZ6ñÍfªÕjšÏç ‡ÃJ¥Rº{÷®B¡¢Ñ¨¢Ñ¨NNNt||¬wß}Wñx\•JEétZÒkAx¥R‘×ëU>ŸW2™´©6úšK¯©¼þǬx<®¯}íkƽç3’fí÷ûÍ6ðáäýÇãñ%Ê’sktíÚ5£êH²&:—ËIzÝàÿÇÿø‡µµµeÂy®©ôZ[Ä™êt:ŠÅbòù|j¯]»¦F£aŠ­­-ù|> s‚Â¥j±X¨ÕjéöíÛÖìC¹Â¦˜¦šL Îö½ÝnW’´³³c™#/_¾T¥RÑ{ï½§ýý}=yòÄh‚lHf³™"‘ˆ ÷9/˜Ìf3¥R)£"¡Êd2ªÕjKÛ‘ÙlfÏšŽn·k`ŒŒœz½n4D§ €@K¶oÒk] TE€ÔºX,f×°dÆ3#ÉRä¡9¦ÓiËÔ K‰÷lÉØ@¿ ¬/ª¾ùÍoê›ßü¦ýûw¿û]}ï{ßÓ›o¾©ßýÝßÕïÿþï›6 ³g±†êÖÕ(€¸å–[Wª˜º2iÍfŠÅbº¸¸P45Ÿ\.gŽ9FÃ(3Îäs¦Ìõz]‰DÂh$ÎÆç$šF¦­‹Å²Càãa`º À`;âóùT¯×‹Å,— ®UЕ¯sn‹…ªÕª9oM§SýÚ¯ýš¾þõ¯«Ûíêàà@Á`P‰DB‘HD¥RIOž<Ñéé©åŒ¬¯¯Û{Û´y{{ÛZ<·,š¿^¯§étª;wî­l8*›ÍDôMcÎ}øíßþm£cI2`„xëÉvƒ)0T(MÒg~ÞI¹êt:Z[[S£Ñ°¤o6f>ŸO/^¼PµZU±XÔúúºmPØ‚¡…€VÅfˆ¤ôÕj5% 5 ;o€­v»­ÍÍM»g8vÍçsÅb1õû}3 (‹6¥'°Ûb2Enݺ¥b±hƺuë–=†Ãa;?™LÆÎ|:6ý…$oΜ3+¶Šl_°ªÅÒ@‚…ób±0gÂyƉPôœ!”γŽSÔ5>£3ç„M%–ÇÒg.@‰ïéÔfy–ØÞžùˆä]¬åÚÛÛÓ_ü‹Qÿößþ[ÛºJ²Rgðø·®F¹Ä-·ÜºRlê ø´¤aBKcÁ„nkkKårÙ&±ØãÒ˜árä÷ûÕét”L&M«lÊ‹^éw³Ù\r$Bh+ɦÌP …‚æó¹:ŽQ L§Ó*—Ëêv»æ„…0œ¦lggGOŸ>ÕóçÏ …ôÎ;ïý¨P(˜¸ƒÇãѻᆱD"¡³³3Û0pí?{öL7oÞÔúúºªÕª5¥•JÅDï’LË2U©T´µµ%IRÈ^‘dM"s¨Z­VKÝnW¥RɶTÒëF¹Ýn¨d÷c2™¨P(e,‘H˜Þ›Z¦êXÇcÛ:ƒAmnnjccC›››KbgΠ“¼rVÒé´þèþHÚÛÛS>Ÿ7g,ra°f#®ÓéØý GóÁwxq}WWWMg¿'“I}ó›ßT³Ù4ð±½½mŸ=™L*—Ë©Óé¨Ûíš›U2™´¬™xùä]\\h{{Û¶;LÿiÐ}>Ÿž?n¶¦PtØ48S±¡ž}ãßÐ|>W2™4›X' °¶¶¶t>|¨>úHÛÛÛzï½÷´±±¡Z­¦áphµ™LÆBï¦Ó©ªÕªêõº†ŽŽŽ,´0*¨X,*›ÍZXݵZ-ËÜ`Û@˜³à„÷ýðÃmãÔï÷uóæMmmm™#T(Òéé©?~¬f³©ËËK£m­­­iooOápØhm\÷\.g›쇡ñÿ³•FÖ4{<]¿~ÝDôj6›ŠF£vö¡A×CðNîÈxùäùý~mnn*‹©T*Yê;ÎZ΄x§f¥\./Ñ߸'õzÝ´LäÉ=ÁT`8êéÓ§úôÓOÍ^x6›©ÝnÛ¤X,š+€ƒÆñ>9-ÐË ü¡maãƒS“~ÌxMÞ€6ŸÏ |„ÃaI2Z÷àæ´Å%*NXr¢ÑàLqf9ƒlߨ „Ãa…Ãa3J@”Ït}4YÆËç¯ÃçÓë¡$²IŠD"KA‰|~@] Ð`0P³Ù´³F͆×Iû»ŠÕh4”Íf—þî§?ý©þý¿ÿ÷ú á/Øß}ï{ßÓ¿øÿB§§§fÅûŸþÓÒ³gÏô÷ÿþßÿ¥~f·¾ørˆ[n¹u¥Š‰š,NÉ` Ýƒæ ‡+éõt´ÕjÙTÔ)D],*‹ªV«’db]¶ÃáÐB  !úM&“6ͨ°å IbZ‰ÞkTÂúÓŸÊçó)ëùóçöº4ºÎé- gccC½^ÏÂî‚Á Þ{ï=- }ôÑG:;;S±X4ž|4U6›U6›Õh4²G¿ß¯³³³%-ÌG}¤õõumoo/Q–ÎÏÏÕëõ‡Ç­aG#Óï÷ísnll¨ÑhýªÕjj4Ö0lW­VurrbNJ„ ’O^Éû￯ÃÃCy<}ç;ßÑÆÆ†5–NŽßï· A¿ß¯v»m¹¸6I2°}nssÓèeƒÁÀµž?®z½n®XlQÈ$yþü¹Þzë-¸>Íçs ÊãÓX³-ãº- Ë©ñx¯ñx¬»wïèÀ .;” È ³ëE+H$Çupp`T¢^¯§óóó%¥N§ósÓçËËKMFÃìŒÙÐ0åóymmmEˆÏÄZbí••ýèG?Òd2ÑíÛ·uçεÛm}úé§¶ÕážE£Q«R©%äúõë*•J¶Eb_,ÍÅi>ŸëääÄÂ÷È“À•*[X!÷ž¼ŒV«¥`0¨jµªíím ™LF‹ÅB{{{ zþü¹ |°=“d× ý„×ë5M6›U4µ- 4årYø‡¨N§£ÝÝ]ýÙ?ûg—²-°±åšÒPc·‹ã6ÎÜ7ŸÏgÅÐîB¡m+0N |ðÁ3Äùt&£;5EXN;¦œA•£ÑH™Lƶ˜[>ïÇgÎIùâ~AŸ,:Ñ;'“‰ý½Ó¼€çÇyo¾Èú¢È_þËYÿò_þKýÓúOÕëõ”Ëåôýï_ÿðþCíîîÚÏmllèý÷ß×ßû{O¿û»¿+¿ß¯ï~÷»úÁ~𥠰¹õË-€¸å–[Wª"‘ˆMîi¢c‰ð»[@ BXÄ¿48¬pi x]6ä4 ñˆÅbKMúl63M‚$k”h–hŠàÀ÷z=)•J)“Éh6›éÑ£GZ[[[ÕÒ\ájuvv¦étªL&cŸ§ÙlªP(Øt˜fy}}]>Ôù/ÿÅÄÈ:;;3g%þ=‹ôš¢rqq¡l6kÂæZ­¦ÝÝ]‹K¯iUFC™LÆ@ÍÆÆ†5ù4æ€?t"±XLÝnWûûûÚÜÜ´f2‘HHú,D®^¯›}îÖÖ–ŽŽŽ,|1—Ëi:êÕ«WÚÛÛÓúúºÝS²Jœ›¯D"aÓw¬‰³€Á``9,$Ñg2Ó§¤R)KšF¶)ø<•7'hA¸€ ‡Cõû}ÛR9íxy­?þX?Ö·¾õ-=xðÀh‚ЦÈEÁM @a±XT<·m‘³Ù¼/M/Z Ø`4Ø<œŸŸ+“ÉØæ€MJ&“±íÏÍ?A€hr¥h:†Ã¡éõF„¬ç°÷¸óósËKá⤅µ3¢¶–8bá| b³ò?²—½*õ;¿ó;úßù_ègßxã 7tÐ-I.qË-·®X¥R)Íf3õû}•J%µÛmã”Ïf3¥Óiõz=Íf3­­­IúÌž“é4¶¸LH¡QAsòÁF š“"Ýn·«Ñh¤t:mM!MÚd2Q2™´¬ r)˜Ó ‘×ðôéSÝ»wOétZ'''Ö@ó}///Õh44«ŸL&uÿþ}­¯¯«Õj™»PµZÕãÇõàÁår9éÿøuzzjMáå奿󹶷·µººªR©düx¬XqlR©”ºÝ®†Ã¡ŽŽŽL ÁõaJMþ |}Çc×פÃÃC­¬¬èöíÛ¦µ ƒJ¥RÖÐ2Ýwº:u:ýÑý‘ºÝ®¼^¯>|¨õõue2DÐUIªT*–G£Ùh4²,Šƒƒ­®®jß@(t#¾/9!hdØx}Þyà‰i‚w¯×k[€N§³dO¼ººjIö‰DÂBBm>C"‘01™LÔív•N§ˆó›8Î(gˆÄrI¶]`;©\¼>† Щ€i,$Y.K ø9G,Ü¿ØtÌçs;OÐy&[$Þ› x€_*•2MŒ³ÎÏÏM—EŽ×ëµmƒ€®Z_†ºÊZ·¾Zå·ÜrëJU«ÕR&“YÊȘL&öwX͆B!Õëu8ñÀƒ§Ñ%y›‰,Y ‘HÄ(V4ÓÒëäõããc½xñBÙlV[[[–æ,}&ô%¤ßN§6•¾¸¸Ð«W¯Ôl6-[°¥Á)&~þü¹nß¾­õõuݾ}[×®]Ó«W¯¬Ù|ôè‘VWWu||¬½½= ktɺ âüü\OŸ>U¡PP·ÛU.—Ó­[·4mºÝétÔjµ´¶¶ft lXÑl@-‚Úvyy©n·«f³iòZ­¦v»­b±¨k×®éüü\ù|ÞT¿ß7ûY€H»ÝÖücvã^t||liëÜËN§£Z­fÁy’ôæ›oZ€åË—/öFóZ(ÌÍŠm”ÏçS¡PP«ÕÒåå¥jµš%Èã*D!Û2èkX5_¿~]ï½÷ž€V®ù«W¯”Éd”ÏçÕétLT½¹¹i–Îív[ëëëº\KrL‚Á jµš9…•J%ݸqÃîE45ª "‰¨V«Ùg ±qÒ˜ïó­2† IDATܱÁê Ýét‰DŒþÅuäl÷z=ÛDáÇ™Ç5íNYlAÈHÁÉW56€sg®ÇÊÊŠÑ´H|‡:†.+•Jý¿ý–[nýX.qË-·®T1qïv»6Á…^Åæ‘9[‡t:m ÍÍÅÅ…m*hH¤Ï,{ ' *•JæRu~~®z½®?þXOž<ÑÅÅ…ÖÖÖtóæMݾ}[^¯WÕjUápX…BA«««6årFÎÏÏuíÚ5Û`„Ãa­­­)‘H˜ËŸ­X,êÖ­[ ƒ:::Ò7ÔéttrrbÍáÑÑ‘nݺ¥»wïªX,êòòR…BAÙlVóùÜ‚áÁèôôÔ¸û=Òw¾óküiæpÉB@ì Þ[,* zã7lÚ.É(5P(&ô·oß6š\"‘P8V.—³¼étªn·«r¹¬õõuݽ{W?ÖÇlz|>¯ù|®_ýÕ_•ÇãÑOúS•ËI³ÁAŒ Àþþ¾®]»&I6QÇ*7‰(N«Z­êââBù|^7oÞ4w¬ããc½zõÊhcÁ`Ð’íq~ŠÅbºyó¦vwwíîííÈ899‘×ë5›ÙJ¥¢^¯§;wî˜Þ¦×ë)“ÉØTœfžpÃËËK»Î¸«U*•Ëe kØq3 žŸŸËãñXóC\(²&}eeÅ,£´2¶äã 1  aرñˆF£KÏ”3ôâÔ@@‰b˜€Ût0gˆ%gÖ™ŸƒÃÔ.¨YQ(_d}™‚ÝrëU.qË-·®TÇc¥R)­®®ªÕj‰ œn8áLBi„Ÿ"J¦9&Œ&+X\¿ß·ÍG¿ß×x¡¿t»]ã•ãz½‰M+†L •Ùlf@Åéô‚;Òt:ÕÍ›7M;H$´¶¶fSW\¥xŸÅb¡X,fbl¶8ð½zõʦåØÒW©TÔl6­C£P.—Õn·mBN³zçÎËù —kU®×ææ¦âñ¸žŸO?ûÙÏtvv¦o}ë[ŠÇãŠD"Êf³F‰«V«Z__ד'O¬Q‡îÃk®µd_x½^ÓúeÑl6‰Dt~~®íím)“ÉhssÓt!«ƒƒ- ôç;ß1M *`=L<×þþ¾m‰Ä’;×ÊÊŠ’ɤišØÀ%“I‰C©ê÷ûÊår–ÃÏC l’e ±z0Ôp8´×åsz<…Ãa£æñ¼q†ïY[ ø‡ë }ñââÂA1`Ã7´¾¾®jµjÀƒçPì–[nýâå·ÜrëJáÐ5H¦ñ™N§fÕ‹Ð÷ K×Ñh¤Á``Óþ^¯g[ Ç£~¿¯jµj}’ôgþÌŸQ2™”×ëµ <šH(øôLbÑ®œžž*hggG——— ÚßßW,S:¶¤t’µƒb±˜ ì›Í¦9"‘ÕÑét$ÉĶëëëê÷ûŠÇãj6›úÎw¾£`0hîa·oßVµZÕÖÖ–ºÝ®Ö××R… ¯ÓZ¸Z­Ú†#‘HhkkË´ò"$ÙÔÛb(n———j·ÛŠD"ÚÜÜ”ôšRä4€V°i4–urzzªb±¨7n( •.‘HÈçó©Ýnëã?VµZÕt:µÂR©dÓóp8¬f³©‡ê­·ÞR¯×3ç¨W¯^™Ð›‰}0T2™4g+¶8¸Î`A' ãž±Í@¤e°Äö£ÓéØóÊæŠ -‘HXf煳͊Ïuóp84ëe®‹3Ûj›—ù|ng÷Ë@Ár7 n}•Ê n¹åÖ•ª~¿¯V«¥b±¨p8lMÅl6Ó`0P2™´æ{6›)Û ™Lj6›)•JY£žH$4—8íP“˜Èbɺ½½­7ß|S§§§òx<ÚÝÝU0´°A¸ñÓéTÕjÕ¬[™à:§ÌÒk‹]ô¸fݼyÓ¸ù€%c~¾×ëY¾‚ô™`7‘HèÆ*—Ëê÷û6å½yó¦VVV”J¥t||¬¿þ×ÿºæó¹>|¨f³©{÷î©T*éÁƒzÿý÷Õh4”N§åõz‹Å,[\Äç+++Z___ô¦ÓiÕj5³†¢Õï÷Õív.Fêx*•Òh42Ç%IJ§Ó&>fÀ;› X8¶Æ›ûvqq¡jµº”Þ^.—5Nutt$Iºÿ¾?~¬»wïÚy¤ýèGêv»ºsçŽîß¿o–°¼o»ÝÖÇ&GcGó‹ÅŒRÆ=¢éG— õêÕ+íîîêòòRÿê_ý+U*ùý~ƒA={öL[[[ú­ßú-Åb1=~üجmK¥’m^Îsš@­+‹K –¦›³„³›5¿ßo‰êÓéÔΩS‡Å ½[HÀ º™Ñh¤x<®Z­fy6‘HÄò7Ø^$ Û ‰â»`•‹KÝp8\2F Ý\’Ñ(±XÌÀ«3”p›Ífí{ò§ßï·¡€[n¹õ‹• @ÜrË­+UL—¡Y¥J¥¬iI¥Rj·ÛÖ€ œV¢lK<ŠÅ¢jµšZ­ÖR~“w(VçççšL&Êårê÷û6]E€=-[6.ˆn:&âl` Šôz=­¯¯ëääÄöL±Ûí¶F£‘ …‚êõº&šDIJ&“J¥R ƒJ§Óª×ë* ŠÅbÖlŸYx©ëÿõ¿þWÛPH¯mY±7ÅAl4ÙFˆL^¯§b±¨~¿¯étº¤Ïáu°ƒÖK2„{M,¡rä] 1!0šI>™$§§§–Þh4Œº#É\¢>øà•J%›”ƒAýð‡?ÔÉɉ€^¼x¡z½®T*¥ÃÃCmnn*—Ë) i<[Æ׆ÏMÆK£Ñ0+áÁ` F£at#Dò4¼ƒA¹\N~¿_ø‡¨jµªo|ãªT*òz½F÷b!Ér,x&8ëhŒ°In·Ûvy ò0·ôûýZ[[[Ê5aÓ°²²¢h4ªJ¥bôÀx<¾´U!]œ­×ieeÅt6lלô,œâJ­VK¹\΂(Q½^O@@ÉdRÃáÐÒß¡Æ9ƒ±2n4ö^ÍfÓ»ßï_:‹_t¹·¾Jå·ÜrëJ•ßï·M94™LFÍfSõzÝh'±XLççç*•JæZ…u,ŽNµZMÒëÉ;”‘J¥¢õõu5›MÛ– Vek@—† º´”@ `ÂYܬpÁ‚úA¶Æêêªi)›ƒ¢²¶¶¶$ ¥QY,J$–µØÙéºÇ­©¯×ëfûzvv¦­­-|·Ûm=zôHÒk§±7ÞxÃBѬ¬¬(N+N›¨úøøXzòä‰r¹œîÝ»gad­°ñ€æÂw¼¼¼Ôp8´ü†étjô&gc‰‹¶¯l¸\+(tÐ}Ø4‘‚Î4½Ûíêþýû:ŽmköööT*•t||¬—/_ ÏçóimmMÙlÖ¬vçó¹f³™vvv¬i?>>V­VS:V6›µÔsÀi,³óá÷ûuïÞ= @„úôÆoh8êààÀ6L€?ÜÕ°æº}žòâZ".ÇþÖ¹Y qÇí æ l äLK2m ›™ËËK;ÛívÛÀ#Y#³Ù̶bœU¶è€Â<;;³ N´UÜI6ˆà½›K®‡s; ÅB’]‹/K¡[n}UÊ n¹åÖ•ªËËKs¾b‚ Ÿ› ÓrÌñxÜ‚òhxŽ%I¥RI•JeÉÊt>Ÿ/é Ñü‡B!swÂ.Õ™ Aƒ …B¶Å^O®S©”ÑG‰„ÎÎÎäñx¬‰#Ï£ÝnËãñhssS­VËRÌI¥Îçó:::2»R6ù|^ƒÁ@£ÑH~ø¡¾ño˜%íŸüÉŸèùóçšN§úõ_ÿu‹E³°e*_©TŒ†ÄçŽÅbF[[[³†üÕ«WÊårÊd2¦…Ç*—Ëæàu‡l’ÃÃCËiA§Â}â^c œL&5Õëõ¬¡‡Ú$½6¤c#"§q†nFuçέ¯¯ë÷ÿ÷•Íf•Ífuÿþ}±XL/_¾”Çã1Á.—S$±÷D‹‡µ¾¾®óós=zôH ƒZ__—$mllèââÂ(HƒÁÀ¨KwîÜу4™LŒF¶··§L&£—/_j{{Û¬z™æó  ¯`{äÌ߸¸¸°³ˆF p0¼¸¸XÚÄÅr~~®F£¡@ ``»fé3ý ²ßï+•J{_Þ‡ÐDh|XÞv:ÛˆH² Dò>0i๴ð òì‘UÂ÷ìt:J§ÓæˆGf<_ Ä£÷ú²ˆÐÝm…[_•rˆ[n¹u¥ Ê W·ÛÕÎÎŽ¹Û@Ç –x΄›À=gVD¯×ÓÅÅ…¹Váºãñx,8 ÷ÄÌ+++Êd2ö÷Ð; CùˆD"F•Á®t<kww×DàL’I‡"ÃôûââB‹ÅB¡PH;;;¦! :::²†_Òk] v¾|'šš{÷î)›ÍZ¶ÉË—/uyy©X,fMçî^¯šÍ¦ž?nnUPŠHŸÆÅˆÍL,S.—3²v»­åóyË•€ž†FàììL½^ÏÂC¡†Ã¡jµšm6€"‘ˆeb ´vŠ›ƒé"˜ˆ·Ûm KWŸL&fy EÍA8ÖÛo¿­óósÕj5=þ\ÃáP·nÝÒÙÙ™æó¹9b ‡CËIas“H$ôá‡j±XèöíÛJ§Ó¶µÐ¬®®êääľ["‘ÐÑÑ‘’ɤ~ã7~Ãæ—³³3u»]ݺuËÎ>@—¬ŒL&c.eX,s-$Ù†pL¯áóùT«Õì¼aç,½Þ,8C(iÖ{½ž½îùù¹1¢q‚u†zÄæh{øèYÐÓœ'ÉÇØr9è5{ãÜ:ƒ¥dôÙl¦\.g–Î$¹³Eܹå–[¿X¹Ä-·ÜºR5ŸÏ•Édtvv¦d2i´ DÁP¡$àÈf³K4©n·+IÆ—D"Ö8Åãqu:Ë¿`˰²²²”I@Гf&(@óù|IO‘ÉdlÂÛívc¿ººjV¸‹ÅBñxÜ2,'4É’Lá÷ûuýúu- ³ÜÇãŠÅb*‹F¹AŒíóùtûöm›çr9KkFzõꕒɤ …‚Žuyy©|>oSòR©dBtIÆH€òƒÆ} Íb,Ól63º ÉíçççZ[[S8V«ÕRµZ5›]&ç‹ÅB'''ÊçópšÍ¦‰œitqqÂr5™Lêí·ß6'­d2©/^˜mm&“1½ ›™ù|®f³©»wïªT*iggGápØ>‰Ú…BA+++Êç󺼼ÔÝ»wÍIDqôJ‡‡‡zúô©‰„677U*•Ìm¬^¯›æãââBÉdR>Ôt:Õúúº]GÛÑhÔàšÍ¦QÛz½žÚí¶S€4àÕ*ˆpÛIÑâ3ãv5›ÍLD¿ººª^¯g¦ >ŸO½^Ï4¦Ñh(™LÚöŽ³Æ¹8??·m4*¨X’Ì PAÂ<4>hUäùt»]%“É% ÁŒÒgy'€Ì+œâúÅba–×_t¹·¾Jå·ÜrëJ '`ðP¯×‹^úLxLAÓÁ‘)™LšXQw*•²æ z ÚÞªT<·ÏE^Sy§£y„´lÐIÀ[ÇM!®ÓÔãñ•ieeÅè,Äòlwh–¡0u»]Õëu£E£Q% ƒA½ùæ›:>>ÖþÏÿY>Ô­[·ôõ¯]µZÍš\èkä6`u:•L&MœH$LüËï¡Ã™N§–w1™LtïÞ=»gPàØúÐV*éÙ³gÊd2 ‡ÃFƒêÃuL$&p,rÆã±îÞ½k´¸¿ô—þ’…F£¡z½®££#e2e2•J%I¯×®_¿nt @¯¿²²¢ÓÓSe2e³YI¯'ý?ùÉO´¶¶¦ŸýìgÊårúÞ÷¾§t:­N§cÎa»»»FÉÚÜÜÔÁÁ†vwwí»sîеÐ8„“ɤªÕê’3ÏÚôPãÜlƒQ•Ð,‘ÈÎùÄâz4Y [@Î`‰Ï øp:¢I2‹_´0üo²J8s€\IæÅdÀÀùbÃÃïbUÌÆJ Ç©ßâÚ}‘å·¾Jå·ÜrëJô6ÑhÔ\w˜tÓôv»]Íf3%“Ik|2™Œ5n43Ð/÷¶Z-›ˆ( gÑôÁë†Ãa›R·Z-㜓"ÞétLHLS X¨T*6Á…B¶1 _é{<7= ¯áõz-¬=ŒÏçS¥RÑþþ¾ŠÅ¢>|¨@  k×®)›=‘H¨X,êÚµkÖ„~úé§6†Cíàà@NÇR¹¿ÿýïkeeE·nÝÒË—/•ÉdL¤ßl6µººªÑh¤áp¨õõu£ðмC+ ‡Ãv=ØT5 ]\\èÞ½{Z[[Ó£GT*•Œ–…°Ÿ-1ìp%)ÛÏÚœ©ßØßf³Y+Òëm:‹jµjy(l²qèLhúѽlll¨V«éöíÛúóþÏ+•Jˆä3fY­Vmšyy©k×®ieeE‡‡‡få¼¶¶fVÒPÆã±&“‰Ö××Íщ3ŠæÂ|I>‰$€á\.géáü=y45à‚F Û0ž 2S¼““ÍfµX, T±…a‚\45#¨x^¯× D@/ÉL'lÊ8 ’,€çzË-·ÜúÅË n¹åÖ•*„¤Òg6±L2ŠC­òx<ŠF£fÉy~~®““k ÈJ²&–©>tŽ^¯·´H¯ÁP¹\6=á†Nðà`SB£Ç …T­Vz2™L¬1_,&ÆÆrêô0´*¸?ÑP÷û}½zõJ’¤ýý}sºvíš5°…BA¹\ΦǥRI¿þë¿nô&è^4ÙµZMÕjUõz]ÝnWNG÷ïß7 ®JXÀ"&£…ë”Íf-üIŸ7*ÔÍ›7õ³ŸýL‰DBëëë:==]j„I¸H¯é3ÅbÑh1ÑhTétÚ¨XlCh^s¹œòù¼åy@á999‘ßï×þþ¾é˜ºc: ÉMþ$ë![ãʽä|´ÛmM&- sùB1›Í‡µ±±aM à±Óé(‘HhggǦê€àN§£V«eY4¿Ð±0ŽÅbK‰ÞÇ(`œ}ÇcY'XCƒAû]´DÔ‚‡C»>€AÎvgØ 7,|6N ^@ú®‚{gÐàÅÅ…Úí¶9áóAOeª^¯k>Ÿ«×ë) Ù†<†JÎ2Ï%[8î}©T²sƒCÛ!·Ürë¯\â–[n]¹r6 ¸Û¬¬¬Ø6÷!¦ëØ}bˉ;´Iª×ë¶ýˆÇã6i^]]Õd21 Î[ñx\‘HÄ8ô$E3õuþIŠ3Si´L€I9???W¹\¶°9¶dcH²©.ô’xŸ2™Œ%ŒF#]\\¨V«™ž„éûãǵµµe›’p8lÓ{6`’̵+«ßï›NâââBÑhT7nÜP«ÕÒp8´M ¢}„Ùûûûæ0EúûÉɉ¶¶¶Ç-<2“ÉØy©T*&8wŠçïÝ»gàd4)—ËéòòRµZÍÀ'&dÅ`Mìñxì@="03‹¡ŽUårÙèMÌÙ˜8mª»ý~ßÞ“óÌÏ¡j4öÙpœ#é^z½)Ľ̹adóá’´ …ÌÔ!Ú&…Íàš#Ï$T+I¶ÑÉf³K |ž/ËÝ€¸õU*€¸å–[Wª˜~†Ãaõz=ÃáP‘HĦ›ÇÂçh²£Ñ¨¤Ï¨Q4ì¸û0íeºŠ~D’5]4ò§1e% Ñ©¡i0Ðä â•^ot˜LC«Â™É©E Ásº%Ñœ²=À.–m šÀ‚dÂòƒR©”>|¨ë×¯ëøøØ´ÇÇÇjµZ:880ÊöÃ~¿_·nÝ’×ëµI;·|›Í¦…åmmm-}/(38b:ø|4¥’l"?NÕh4ìýh¤sŸ0Ó”þG2=Llf£çA_ƒ†€4q¶ /^¼Ð|>W±XÔÞÞž …‚ŽŽŽ–òGÈtnurr¢³³3E"5 Õj5û}„öÅbÑî9›FÃè]lðÈ‘dÇc×(Zƒ¶à ŠmvµlÔÈÎasÁõ‡¶¥àZq/¡FÅb1µÛm£i‘=ãÜÀH2½µSǃ>‹ç¢P(h8š….@ m[¹Tw»]3ª‡ößrmx¾fn¹åÖÿº\â–[n]©"„‰ª$k²VWWU«ÕlC‹Å,gHp†Øu:³)ÅF—ß’°‘> :l6›¶5 Ù¸ ~ågƒÁ "‘ˆÑk˜HK²< t&ºAG‚þBÓM&Ó^¾ ,¶¸4ö©TJ½^Ï8ûNçªáp¨h4ªµµ5èÓO?Õ7t÷î]•Ëe³>99Ñ›o¾iYl_hä¹\ά{ý~¿ööölSäl‚Ûí¶ ¦±ƒíõzšÍfòûýÚÚÚÒùù¹éPø~Îϸ±±¡ƒƒËl†añá IDATê;Û1šh¦ãFCúæ7¿iF‘HD•JEƒÁ@‘HÄ6`“ÉD™Lf)¯ê÷šsĶ P((›Íj<«Ýn«ÕjissSÃáP£ÑÈÂ;Ž^½z¥Ùl¦l6«T*e!‡NÁ¾3À³Ül6å÷ûmÓãL6çY€¦Öl6–Æyo·Û \ÄØ V«immÍôRîÑJ‘‘"É„ôœ' Û´` "‘ˆÑ%É´Á9Žç€œ–/C¹Û ·¾*õåxbÜrË-·~IEsA Âi-‡­‘eKÀö"‹)ØÆ„©z2™T¹\6ªSÈ EG’MyƒÒé´ÙÜÒ ÑÂ1—d pš®étº”•0N•Ëå,In;SäÉdb Ð4yÎv(fh µZÍ6@‘HDÉdR¿ú«¿jz™ëׯkuuU©TJ¹\N?üáµ²²¢·ÞzËœžr¹œe¤, ×ëuûŽèa’ɤ²Ù¬¹õû}›Ì3¡&É6 ¥$#’,ˆ°Ýnk0Èï÷+‘HØýúƒ?øs>Ëårºqã†êõúÒ5F‡Àçn4¦—‡ÃŠÇãºwïžNNNT*•L÷±¶¶f÷eeEÅbQ»»»â...ôêÕ+£Á‘f> t||l`7•JYã^,µX,¬¡ƒ6™ƒ*•Jf…‹×`ÛEsî8›9¨G<8³y½^ÓDáZ‡uyy©l6«~¿ovÐlõhâONNL?ÄŸl,°–æÙÆ&º•$Û^8Á+Ï.‚v¶©TÊ´*/‚`IÖN&ÅãqkzúØx}ªÛ·o›Ml"‘ÐG}¤V«¥{÷îYè]¡PP8ÖáᡎõÆoX¸¿¿obgè.XÜ£ :ÇÄš M^¥RÑÖÖ–5©à#‘ˆ€•$sJǶá* zõê•ü~¿%ˆß½{WívÛî7d’¡/±ý0N§SµÛmýÁüþÚ_ûkÇFÝá¾"€&MÎÎÎŽ5ÃN¦üØóY‰„‰à§Ó©mÚ  Ò:ŽR©”ј$™–ˆ½ÛíšÖI’’„ &_Òå奚ͦ þÑ|`YM/Ÿ a9çŸïÈfM×p?í,. sEØa<á™æ¹"Dº¥×ë5S î4>h\>ŸÏ¶W@ÀÌ)`6Àæˆkƒï—¡\ ˆ[_¥úr<5n¹å–[¿¤‚ªBÃ…Ø—à=žÕÕUU*­®®ÚdÚçó™ÓÓh4R<W"‘0‘/Í ù¤CÇbêMV‰ß€Mô'NÝzš8\†‰„QPÒé´ÎÎΔN§„;šV¨5óù\ívÛtlOhîi¢···µ¶¶fuµZ]Ú´˜VVVôöÛokmmMÃáЦҙLÆ(d\ñx¬L&cnU¸±‘¢Q”9-evÂèy ¥{½ž5ú^¯×¶Pz°¯ ‡Ãºwïžæó¹‰å.dNW2hYÑ9SÝnW¹\N¡PHææ„ÎàBJÛí¶½‚uÀA–•JÅÖÊÊŠmžf³™z½ž²Ù¬&x½^‹Ey<]^^šF„M›³Ñh¤ÍÍMkÌɸÍçsû|ÎŒ øÌŸäãwx_ÛlwÑ…pÆùl^¯×òzØè97HP…I&f³™ªÕª}nI¶5iµZ¼ †9)`|?Î0Ô¯ÏçÁ8]îÜrË­ÿu¹Ä-·Üº’ži(ÜÿÙl¦V«eÓN¯×«l6kÍ [’b±hÂTÒ›™”Ó(!„e’ïÌû !”dM" 0.ZpÚ½K2š À @G4-L‡q䢩Z]]U>Ÿ7ñ»“„ëMX0ÔÖÖ– ¯ƒÁ ’ÉäÒÿ—J¥´X,ôìÙ3M§SݹsÇ&ɽ^Où|^ÅbQÃáPµZÍšã`0¨l6kM2–©PÆH$÷x<ét_’dâfòHøžB쓛ͦR©”677µººªR©¤Á` »wïjkkKÃáP©TÊJ64î^¯WÕjU‘HÄ—žÅbQ“ÉÄ –¦Vz;Ón·5ŸÏU.—mk1 Ì%‹i3Âo¶tl¥¢Ñ¨åm êL öæ;K²-ׂ\þä¼ø|>£­ñÙÙPàöÖétl›ÅµG›âLu<ê¹4\þûén·k¢ûP(dú%À‹$£›qN¡á±¥ð½ºK²m º,ç–“¼’ËËK{Nœ[4À?ôE§3ÔÅ/ÖÀÝ€¸õU*€¸å–[Wª7O§Sõz=›RK²f“:&©4ƒÅbÑ4 Î]z­a…B2Z#Ñy>Ÿ› ñ1V®4ò4¹4BоhÚhªÓé´5V8aÑËÏ2%¦!dàœôB'Éf³ÖtaËÊdð}(ŸÏ›ÈøwÞÑd2Q³ÙT$Q$Q*•’Ïç3x*•Òá᡹O…B!Û"8ÅÅÐfœ¹ 8SI2=J·Û5Ú ?Ccí÷û ´q?Ø"¡Ÿ¹{÷®éîÞ½«û÷ïÛF†÷ IuòüqÙ À(ÉëÍÍM£”qïh¢kµš¹+¡½‡Êd2º~ýº.//fäl¸ ½£Yç{pÝ8£©TJÝn×c,€¡T‘ØÈÊ72îÀ£ÓéØ ¦Çãj·Û–ÙÁæÄȉ`¡=×íüü\ÉdÒ4Fέ €9“ÉØ¦„ ×qÚÿÐm-ãÌ ¼ó̲ís Ê1qàÞr?øùh4j›Lçû»å–[¿x¹OŒ[n¹u¥Šf)‹©V«i}}]FCápX+++ªÕj’dôžF£±d銨Ú?ë÷ûU.—,%Á-6¸¸=‘ ½Þ~°¹€â…»T$&È”s2ê‚æñx¼d,½æ³#:ŽÇãÆ£ šÍfv]hÄàåÓ|‡CÛàƒA]¿~ÝD¸’ì÷4«ä[H2M @‡Ÿ¨F#³K…š­f<+N›È›°9‚ó˜¼ÓÌro¸o™LFÒkpÝ C4¡`0hA{èGØd9maÔçÆQ³3/+dØ_³aÁ Ùé@Pã~œ"uèŽÃáШ`ÐÞ dòßô,NgI£ÂYvË-·~ñrˆ[n¹u¥ úS0´ŒT*¥N§cnP¹\Îôе>Oó|Ìf3Ë7 ) …BÖô’ÈLÞ ‡†‰!/Óiš(Iöû¶!NÇ^ÒÂi˜hÄhžpVòûýjµZ² ™Ïç‚è ûCøÌ¤œÆ–æMzMkƒ®ÄŸëDsIóìv»œT!é3Q7À€ñ2¡„‹ÅÂ?îÍ*"~äXéý~¿}n@G½^7'1šW¨Xè˜Ì³=p9õÎëÍïw:ûnÁ`Ð~@›N§F‰âÞsí¡‹œe^§ÓQ:^2$àz¤ùŒœ/®'æápX•JE‰Db DA[YYQ*•²ÏÌö`ä¤Î‘½pºS‘§ƒ-g‰Ïæü“÷- –TÎöŽç˜Íàðæ|v¹càÜ’ 9rn$Ùgc#Ì&˜ŸaÓè4ø¢ÊÝ€¸õU*€¸å–[Wª ÕмЀCBÄœÉdŒ†"i‰ÛÎßCÇ€sf2­±"ÄŽi-“Xèhr¹ÜRzw:6!)\¬‰ÄR“Èwã=#|o¶%ˆÞnP`AúLg±ººªV«eÍj 0!®SƒÂ{„B!µZ-]^^šÅ-'€l®)Bit$wÀÁúúº¥qcýÍiïÊV:[/hiÃáPétÚ2D°`fCE£ 0ìp=ªl,$©ÕjÉçó-Žfº×ëý­)ªÙlšækè8sјˆ“4 ´lÏ"‘ˆ5쀮šçypÞ›P(d ††Ü©Añù|j4F‚ÊÇš×™)½õz½j6›ŠÇãÐïx<»l=|(P€5ôlÞ8 Xeò íJ’=ϼ׎÷æZ3˜àüd³Ù%×»/S º Üúª” @ÜrË­+U4ó¹\ΦçP3"‘ˆÑŽh¢œ6¦€gB6N:Nw!B ±îu6GÎæÌ)öEÈÚív­ñ9??7J45j ìl63A:¯ŸN§MÓ@R5t_§# ?“y¦Ù4Vlsh¶¢Ñ¨0–$kÖ{½ž"‘ˆ}?4„)2±fBãNX'™LZn‡S“‘N§-˜ÐÙ$Ãó‡æã´Zn6›v†Ã¡¥ˆ³å`rLÀ 3C’:g€ãõzÕï÷º6"ÅFÈùóÎ Š [6l¶Ø¢@§[,j4F#ƒ*4MDO~ ÷S’e¤¶¡¬AIC”޵ìt:5@ÁF½Ÿ‰gðN쑱vRÁæó¹YáÒ(cÞ`‰Æ‡mú2rãlÐQPîa–€W'¸šÏçŠD"¶ÉâwœfœÏP(dÆl 4°ÙtË-·~ñrˆ[n¹u¥Š)ª38LŠr¹ll(R±X\ < `%ñúœpŸÏ§~¿ouš[&åLÓ×××õêÕ+kVÑàð„õ,”&Üè5hDi֚ͦÑjhBÉkh4ÚÚÚ²i²3„ÍÐFA CKÂïИ²}!C"‘Hh0Xc‡—ü‰„éa À@ÕbûÑëõ–šv6 Lí'“‰½¾³iôûýÖc©,Éî™Ó ‘3³'1l^GÓü“NNº6Y-4ÚI¶%‹ÅÂ,m¹€[쟡ö2 äZF£QKéæ>µsNxo€zþ?p(àk è"T¬ÄÕœy'õk±X˜ó›3ól$Ø~áä†Î…÷—d¹4l"z)ô)€reßl487ÎÌ—ËËKû3<¸¼|èžN§Í«ßï°ÜóO8¶çêžÇã±?ÙñÚ_t¹,·¾Jå·ÜrëJÍ<””ËËKËÞ`êX+ÜÏ[ªÎf3•ËeIZÒ"@Ý‘d´%¶ ý~_ggg J§ÓFJ&“¦9¡q¤LðбR…/ŸÍfB‚Ó“åR©d;SÜÌØ™Ÿ…ÇÔívÍÆ˜&Œ&úgIKô!h'Ý…¦/ ªÝnÛûJ² 7[šsîô™°øììÌ*4£n·kt6ún·kßÏIïú¼“›'6Y‰DBÉdR­VkéAG›ÏçÊf³šN§\pÜbëvyyi9ÎŒ„ë8«±ý\  ‚aK€c·ÛµsÞn·mÃÁ÷gÂÝ>S~ÎÛº|>¯~¿¯Á``Æ4ïN€‘÷…BæL`p\žA6~l%°“>ws6΀7't!†wÒÑêL&µZ-Û¨qÝÆãñRV‰Ó= ÐãÔ•°%â ~\°Ürë«T.qË-·®TA½`ÊÉÄ;ëððжóù\ÍfÓ¦øh74€N»RšWØÐ›J¥’Æ’ƒ Ij6›’^7^ív[’¬)FX ÍÆÙp¦h‚¡FÑèÒ@Õj5E£QÓF@—‚ÖCcI@¡3§ás«Õ²i0‚q¬f [¤QžL&–`N£Çkó™¸fN‘7“r8û¸B‘sÂf`‰FzS@ã-ÉÔZ­fâøñxl¶ÉÎIö¸ ¶ÚŠ"’TRU©Ô’ÊZ¿ùƒó½¼"l.$˜ÜÏ99šªW•÷~õJïýÝï÷ÞD"!ÈxoPJÇäƒR§ÎÎNøý~©„ÑÄÏ• ´½e4= ÐwlvÀ*MWW—tzâsL*8ð Š}^ ¿7\/zžXÁ`ç6Þ[¬ÒQ¢ÇŸ@ É¿ßïG:–Y¬Ô1iã{ÚÍã¬nVVVJUÅîor»Ýr/ðyJ·ø>öôQ*ÇÊ ÛAÛ×°/Ñ ˆòCÂÑ×' (ŠÒ›„B!Äãq´µµá€À2‘HH@›L&@‚sQ9ÃÇúý~TWW‹ÝívË.<}MMM¨««“ùñx­­­2€p§—‰;1qò3õæ¬`p€¼ÈH$"fxŽ<^;åT4…³ã«# fÙ®×.Oáμ½5lQQ‘t­¢ì‹&îDS‚Æó¦—ƒÆdúpšššdÀåfÁ`Pü0Üuf¢—J¥dÍ™(q=YI …Bðx<())‘Ä¥¢¢BvÅù¹ÑSC ehlÃL£3Qvvª¨¨À É“•ââbøý~߆½rÒÑÑ!Þû F»¯ÁçóIõ×Íχ²=&ª ˜ís;X1  ,“ÉH0H$DrĪ©:±ƒTgg'¢Ñ¨H¹ØŠ2–eaË–-ˆF£2°•»VÞnÎÞ²e :::PZZ*;䔘Ø%"”a•––"•J‰A›2Òz—’ϹO½eYH&“2<‘ V`ı ty>bÈ™;ùƒ B&“‘ë ‡Ã(++“ŽZLfx çIØ¥Z¬´ðïRFÄäŠïÅÊ[2¤ÓitvvÊgÍ!zœ•Âd€’,&gvS3Mݬ0É£š³Cè# ¼÷T"‘ªƒ~¾½‹?J·è“a¢Æª}D¼ßX­áõG"©4ÑgbŸÃ@‚o—Ë%mq ¬¬ ---"gäß`RR^^.¾Þo|?¶EæµÓsB¿ +” ÒÓa’I©+v”±)¿_\‹ÒÒR477çÌ+aeŠ(od·1{¥…R5~§|>ß>ùïÕ7A+ Ê M@EPÄb1Û¦ÖÖVD"øý~ –-Ë‚×ëí1 Úï÷Ëî=¥FÜñ/..†Çã‘…Ô×sÖƒTV8-^ {§$z˜xPE£0‡Ãqž) ÓœmAéÖ1yaÛÐЀ¼¼d7.§R)ÙM///ϹFî†ó¸ÊÊÊœyÝÝÝâÍ`+`vçâŽ7Íᬕ””ˆ'†ƒôh–f0Vy(×¢œ‰ò*·Û-ÿÎàœ]¼ˆ4‰Ò „RšFz<9U K,“ÏÃápˆÔŠV‡x/pWŸÁ-?€ßï—5Üqf†½³477KòÀ`šØØ~×#•& ”±¢Çî]étZ|;ö¿Ë®`r ë¬61I±Ïa…€ßVŽ˜\777‹Á !u&TÉdR‚ZÇíÙ,y<1æÓƒÓÖÖ†ÊÊJùLXåá=o¯`P¢Èµd¢ÈÎd| +;¬fqù™VTTÈçhïB g¨£¢({V@EP0¡àŽm<OESS“hà9«ƒÃǸ ÎŽQL (™±X4‚777‹ß€A¾]^ÄaÊE(ñ¡¼‹‰F:–IÎÔ ³ëßÛ Ù“)NøæµÛ=¬ˆ8Nø|>ѽ»\.1û=YY™ dÙQˆA¥@ J9/…;Ûmmm2(1•JaóæÍ £h4*×ɵ¶Ï„ †r7»Éáp ¬¬LLöÆlÙ²E‚mÎ'±, ÑhT:3±*åõzs:ƒqŽ «Qñx\¦z‡Ãa¹fáœÿBÿ %¿ß/%&ííí’¤ÓiYc‡Ã—Ë%ݰb±˜Üƒ¤ÂbŸÂæn·[V2Áe-??MMM9-¦íÕà¬V±-2==lÀ™)¼×x>ƒdʽ(!bàÇe!Å •J‰Ü+£¬¬LCJšèi`’ÐÕÕ…†† Èí¯ÚÚÚ‡Å$ÍV¾öù¬Ð_ÂŽ_Àöv¦4é³Ò’ÉdÐÔÔ„öövéöe_ƒh4*†s&¤­oKK <***PRR"I½Ë˜×ëEAALrø÷8Ù[æ2™`W)·ÛX,·Û-Ff&rôZ0qáý`—ý¸\.”••åH±˜¬p _C™ý”Ú1qa5Ãï÷ÃårØÞú–ÕJµìó@Ø$¡µµápXªgÍÍÍRµ£ÿ„^!Þ/ܽÅb9³GXµ£¼Šr2ðz½9RDV|‰„tnc·¨ÂÂB¹ÇÜË̶¶6¸Ýnñ ñ~w:…B’83)dÎkâgÁNh”¸Ñ×BŸ“:®«+4Ô³ŠE¿—½ŠÆÍÎI¡Ç„ƒ61Ò ` òÁ`æÌ™8òÈ#áv»1dÈ\|ñÅX·n]ÎqÓ§OÏ™SÄŸ#FôÑ™+}‰J°EP0Øæð;š¡øPNÁ€3(s§•ºoîÆR Ä@”~î\S–E‰ åE2Y&ëÒÒÒœasœ)Ao éD"‘3ç«d2‰@ t±*e9‰DB¦3xgÇ©h4*Ò{pMÝ?+=Ùì¶iØñx\ª v3= ö™Dpí;;;¥Ëÿ.? §ëë륂Äuc ÌYôâ0À¦‡RîÐÛ¤M”@ù|>455ÉgY^^. ¸ü› ò9Õ•…’’444 ×RJç IDATÈlû@JÙù¹ñ‡ƒH"ÀÏÎ.#²' ¬ѨÍ]z`û|{[Y¶½erÜÑÑ!È(y³ÌÏÏGCCƒHÁض™Ÿ!ÿF%a¦W…•2 ‘É6uJ¥˜”ó~£OÄî±a‡¹ÎÎNø|>‘f± 2¥R¬d0A´û8x½ìšÅĘؓ3z¦¸v¬œ477K’gŒA}}½TÌx¯ð¼ì>¢¾¢¯º`-X°ï¼ó.ºè"uÔQhhhÀ’%K0zôh¼ûî»9 †ÓéÄ£>šóžûC1¥÷ÑDQ”…=1ðûýRmðù|â“`  ¥ÊÁNK L¸«Î=4AÓçÁ Ëì6Å ˆƒ:J”ø<»ñx>Ÿ]]]9!å1ôl0áaå…U®‡òó …B°, Ò’6ä Gd{dJ}Øå Ø>%žÕ&6>Ÿ™LFv×í“ÏÙò—>¶Snmmé› °ª•N§1hÐ i}kŒ‘çZÙïg6°{Mx~LLíM XQc%ª»»ÉdR¦­wuu¡©© n·[s 2wî\<õÔSR€)S¦`äÈ‘˜?>{ì1yÞÝÝD"!}[[› ¥ »½ìHdŒ‘*‹ÇãA]]°œa`—¬¤Óiѳ3PªªªBcc£ EdðÅzzXXQ¡lËÞ%‰­r¹›Ÿ——'ïkoßÊ!o4³Å0=0lsšL&QQQD"!;ç È™c¤zÄÖ»ÜùfÅŠ ÀQ®ÆÀ˜“¬™Ø;i9N ùٲŠׂ­s½^/JJJÐØØˆH$"~Êöì^ rn·]]]âÛàgÆ×³Òf¿6»¯ // kËd•ª $çÈÏØ>?† h ç DV™¸ãÜÝݪª*éFI§´ßvc…ÝÆvì:Å5å50Q¦ÿŠR+úq˜”³.¥Sü^°JF¥[*•Bqq±$‚ì®ÕÚÚŠööv¸ÝîœFœAÂûƒþV‚Ün7¢Ñ(<lJ0¹£w„‰»ƒ±=`}M_U@N:é¤rÈ!8âˆ#ðùçŸ÷xŽ÷þþP5Rúõ€(Š2 à þÓápÈ´qú;¤·´´È+Ä *i’¦® ÍÒÜeòÁÝXþΪHss32™ ZZZr–”” HÇs’žP($Õîîr!Ï‹m™8”——K@œŸŸ/Ãá8ç ½½~¿_:3‰„ˆ»Ødw˜;óÔÃwvv"KBF)Ë–-[‡‡% O¥RÒm‹A!4Jp‚Á  F´ïø3qbÒ©Ԭf1(æÎ¼Ãá@(’êeCvó?+ìJÅ6Ç”µ··£©©I*ÙlåååˆÅb9Iv¶—¥ÜÁ4%~Föy2¡PHÞ€T˜¸x<$“Ii`¯p-ÙBš³WÂápŽ2#^#çËØÏÍÞR˜5éa±{lèQaâEI“'vBc‹iÎá5ÅãqÊü˜L&#Ÿ3ÿ6“ ˲DžÈD¾¹¹YÎ…Ò/¾Ö>G„­‚Ýn7‚Á <¬+ElõÌŠï{¶¥fO€œuíkö…ý»$5áp8§1°í;Æ®€¥¥¥˜9sfŽ„O8h¢(Ê€‚”Ù 5‘HÈ.,½”ç°Ã Ûβ:@v“©ßç¬ ûÿ¬inåñ4¾²º s¦š3a‡*ôx<ðù|âK°,Kµ‘üü|TVVŠD¨¡¡ÙlV$8ì‚ %Pß¼y³$FÅÅÅ(++C4•j¶!åœJj€Ò'Ã.]L ²Ù,ÊÊÊD’át:ŬÍîa¬`p%G¡PùùùˆD"ôÓûaoƒÌ*“,êõ) ²>l÷ËDƒ^z2˜\± ²½•+]û¬ žÙÉŒ]Ähvf—+VLè3`’Ë{.NKG.V(áv»áõz%Pf·5V<$9ôyØ[ßrøbqq1\.ªªªPRR‚––©œñž£¼Š÷0åELHéÑI§ÓˆF£¶O•§ÌÊ s­xS¶Åûœ÷°½á[=Û;²rÂÄ’ƒíù]bÅÐþÝfRÊ®-׈ ;l±Èï}[[¢Ñ¨|¿˜à 2D:¥qcÂ~O)Ûyâ‰'P__K.¹D«®®ÆM7Ý„¥K—âé§ŸÆùçŸûï¿çwÞ~“Ä)½‡J°EP°³ ɬ00¨¤Qœ;é”Q±}-ðq:ö Aƒ@|Ü5eU‚9lݺU•ââb466ŠÑݘmóCJJJDîÑÞÞ.]‰h„å$rVC8ˆÒPwww# IOŸ‡ÒÒR ‚ ‹ÅàóùDþb÷¡ŠäÄ.S ëÇ÷...ƒ9¥MùùùÜQòBS1ç<¤R)ùgEE…L‚/,,”ë öŸ;Ñ>Ÿ[·nÍ 0™tñïí˜ÜØ"²›;6öÚÚZlÚ´I¦|3Y£ü €$RÜ­çûüš­ÔÓà Xii©øe¸ Ï„…=^Wee¥t^c‚Ī–Ý'ÁNT¬F0Øg²Â$„IQEE…tqãu2‘àú°•2Ûóœ8Ë…C9c…Æ(¹±'>ŸOºw1Ñ ‰§‹744ˆ'(•JÁçó!•J¡µµU„^&%L@Yñcìg[`;¬¾Ñ#Ò—ô•kGÖ®]‹™3gâ”SNÁÔ©Såñyóæå7eÊz衸õÖ[ñì³ÏbÊ”)ßËù*? ´¢(Ê€‚…XÍ`û\šŸ9„•þ0ç®/w©9ïö Ò³ÀÀÊét¢´´‰D™Lb çN,§²SvD/å^ö¶³öD"???g wH'š¹SÍdÎ?`×(îê$&N‹Œ‹“±YâóLê(­á®}GG‡TS¸ËNO6Ôyíô%ÐÿÀÀz{þm¶wµ'Iàèp8L&ÑÖÖ&;å¬xq ʽØMÊÞÖ—Õ'{2Ê„(câÎ;Û53óûý2„fgR]ák9„k¹cKd‡Ã!×ÄD“¿ÓéDAAT]‰DÎ\®!«%©TJüHL*˜\RªE??ÏŽŽIØ™ëÉîR™LR©`eˆ9ƒJ )¯cʼnìÝ¥€mmíÆxJ¾X¡´wÁbRÌ6ÅìòÅ ˜ý3ä91á`‚Oy$ƒîîînx<éÆûŽð>ß&¡ï„ÃaŒ?@Ë—/Ú®˜3g,˪U«zé •ý­€(Š2 àÔr±v™3Ê›8í˜Ýy(C¢w„9¥.—+ÇXNùL"‘6®~¿9&fîÎR ŸJ¥$x¶ëéí-]Ù‰‹6[æ2x¤ŽŸÉ°mvwÿ)ÅaàÉrú0è1I§ÓÌ2iày³²ÂŠD2™D,CEE…¬qII ÚÛÛ‹Å@‚lš€é¥éììD$AII‰¢¬„Ãa‘A1ð¥ä† $À VyÝL:éãá| ¿ß§Ó‰ÆÆF1i3±aÒÃD€‰ Œ)!bBdŸI@| T)óŸt¹\2ÌÐnL7Æ “ɈŸ‰ÍøÜ±·,KÌÙ„;û¼?X}¡tŽŸ}~~>ü~¿Üsôñpú«lL X}±ldëè¼¼¼œù8ùùù’4sýyŸƒA‘¯ñ;@îOžÿÛÀDv_T¾ ßõá½D™“s¶Àæ14ϳ’äp8¤BBã>++âÈÊ“o&Ìö9.ü^V íCûŠ}U…ÙÓûf³YL™2ï¾û.^zé%œp =Žá›(3%wÜqà¼óÎûþNXùA  ˆ¢( ö@@‚-îüƒA ~¹kͶ³ D½^/ZZZ$à´/³w*b`Ì„†"z(¸3Í`“ƒú¸‹K_C,“éÓìåõz¥’RQQ7Š.ž¾êùHÀ@šÔéu¡Öžœ8³ƒ&%NœÆNé1î:ÈÑü$‰ ‡r­KJJàt:‘J¥rZäÒ|LÙ™Ëåσ×ë°-™c[aîä2p¶ §R) xíSƹ«mYZ[[%ahnn–DˆíZyÞîH¹eB;JëÚÚÚdÞ guÐçÂÊ åRä3àkY G%‘H »».—K‚yÞ¯”›±¢Àêž}þ ý+ül˜80è'ltÀY”<1Qb`o_V°ìÝäxî”XѓŤƒçÈ{†Óx^¼Ø™Ž×Åä €È ;::dp¥}þ »|ÈçÀ*Œ½Ù“J¶<‰„TÎXáã÷f òóŸÿ/¿ü2&Mš„H$‚'Ÿ|2çùË.» 8æ˜cp饗bذa€×^{ +W®Ä¸qã0iÒ¤¾8u¥ÑDQ”Euu5òòòÇÑÑÑ¿ß/r¯×+þ ,L1¸£¤É®e »Ê  íó+8HÏ^éêêBss3ȬV<([á| »i™;ß±X ¡PÝÝÝâ‘ ‚ÿI‚]Ò@$$öÇX 4™LFäf ÄÙV˜ò VwX¡aÀL©¯­QÙ ‰×Çùvs8‡9òZ PUU…X,&³3ŠŠŠ¤K;•Ñg“——‡D"!I=öv¬@1i²UäðÂt:-•¶1¦W"‹!//Oª?ìfÄÇ!—^¯™LF¤>L6éÃ`"Ê8ˆ—„s4¸¦ èé‡a ÏàÚ^mâ=ŶÆöÎ^\óM›6IrÆ*ï_{‡ëÅdŒÒ$ú Ün·È)Cã÷ˆ‰+5|o¾žIçŽsPèâšÑ{Bi“¶ÿåÚØ;1!eÅÿ´ÏPaõÐîu¢©Ÿmˆ™8Û ÖvßM_ÑW¿ýío°, /¿ü2^~ùåÏ_vÙeðûý˜8q"V­Z…Ç{ ÝÝÝ8äC0þ|Ì;wŸœ·²£ ˆ¢( ó>ŸOŒ± ¦ÊÊÊ$À±kðœr.}@¥Y@N§MMMR‘ \ˆrœT*%I «$Ò’”• jÌ)Éa€äv»åµ ÐÙæµ³³p€I þ¨UVVbóæÍ9»Ë;Î<áξ}j:«Bì,ĉëÉdMMMbn/,,D<—Cí˜è•””Èät&VL>Š‹‹Å;‡EzdY†Šp8,ëÌ–¶””@4•$¤¹¹Y:”qx#“…C=ëÖ­ó6Ê¡(×a"SXX(çÈÉìÍÍÍ9A8‡'²šA+NÜ¡g•‰gÊËìïURR"CíÍZZZÐÚÚ* «rLÜèQa’À¤˜ïg÷0˜noo—éàô) 6 [·n•*“`»Ÿß!vtc’ÔÑÑ!FoÞ_”Ü´··KÅ†É .Jrx¾Làìæw{÷5z]ÊÊÊd˜%«rŽ+**B*•‚ßïÿŸs:hnn––Â|Ž-é%b²T\\Œ<_~ùeN󇢢"¸\.444|ÿÿ±úðæ›oîñŸÏ‡eË–õÂÙ(?4Qe@ÑÒÒ‚òòriÊùN§ xµ··K`@’`0ˆX,&A ¥8‘HDvøÙ± "‘ˆHa(Ea€Ê —;ŒÔÕ3Ø·[írg™LF2V86oÞ,Ç3yb¥€œƒg»t††d»”…]²vLÇDª¸¸MMM"q¢Q;‹‰œÈétŠ–žsF¨··ËÄÀ2Ðõz½Ò‰‰ MÊÜqfǤh4 §Ó‰Áƒ÷ˆÇ`Øï÷ÃëõŠd¦´´ÑhT®…éÓaÒÑÚÚŠ––X–%ƒñ˜´1Á 4‡»ïLà***‰Ddg¾¬¬,'ñ¥ŸÆï÷KâÁÎjöƒr z?ü~¿$L2Ø •&ÀLŒÜnwŽùœò:zeÖ­["ë²Ï0áýk7ƒûý~iÓLÿ¥†¬ÀQŽf÷ÑÐtNy¢]NÆ6ÈL2™Ú»S1¡á@H{"M˜œð¼¸ì¼Å{œ ¡}À ÍñPÙÝÝ`0(í )›£çeGoH_ÐWEù6h¢(Ê€Âçó‰ÖŸU jô „ÆÆF9Ö>É™^J°Òé4ÚÛÛsº\q  %I4:·µµ¡´´TŒ×Á`P†§q‡-pYù°ù ÄÒé´úÜ!ïèèavvÙ%> Tùô)°ƒµüÄøÍ`¹¸¸¥¥¥¢ÿgÒÅÝåÎÎNñº0¨ã:p%`yyyðûýÒæ—»ÏÕÕÕÒ¥‹r—üü|é>ÆîDÙlÑhTvœ9/ƒÁ!_loiÌć× gW½©©Id= ò)²Kðh¾ççBy›ØJ},˹ÿÝ.b¢Ççø™r­èRÅ×r}  wº³Få>e ev³WjXÝØ±íªÝg ÇÀn_/¾–ò9~' Fáóù$xåýÌ„„Æ(Á¢Ênf·ßsìtÆ$˜ \.—Ì›á½K¹çZÐïÄrü<ìbÇY*œÃó¶ãvùbww÷~aBW”š€(Š2 °Û¡PHÌÐô9pÊ4°}º¹Ý÷AGKK \.—HAÚÍÙœUÀŽ:|J|8À->ímy¹“Íঢ¢B4ç"»á1|-°Í …dWš˜×ë•`Ц\VQ8C‚»øöan 8i\Îd2hjj’®FôÏpw¼¹¹9gÂ5×@NW'âñ`w'Veìº×ë•D€´¬e"ÀÿÆÆF”••‰9˜¦jJÂ(±aR$ɰKÈìþ&„d-¸sOI= Z™ QöÇ%øeÏNM|®7¥Lü3p»Ý2ØøØ’9™LŠ'&™LJH£9»bF¬p°ªÃÄ‘²1vŸâDqúC¢Ñ¨Èø(££TНç½Ê›É Ï™> Þë”L577çÌ=a%’‰®=!bM© J“É$‚Á Ÿn·[~v×¢T‰:üd2™3žI ƒVî´Ó‡Ã]÷¼¼<444ˆÄ&‘Hˆ¯ÇÞx «« ÉdR&¹sÝ(ïŠÇãbnçñ%ØÛ73ˆgE‡ïϱmmmp»ÝRõa…ŠçlKØhJgµ€‰ý=”f¹\.¹)µcàÞÑÑh4Šx<.<ÎTaÇÏš’9I€ÒÒR‘0²zÅëp¹\(--M÷ØÇï+<¿¦¦&‘Hù|>IxÎ4Í·µµå e%‰É?VÝ(²›Ëù;ïJ©ø÷ø}â}Ã*gÂÆ¶ÜŠ¢|3ú>eWEé$¬_¿^:TmذAº;Ñ Ìö¬$ d°ÃZ& ¨hž¥œ„Zÿúúz„B!tuu¡±±Q¤3ÜQfÒÁ!sìÄÊ*ûùÛM¾l[Ëac ¾þúk|õÕW(**‚ÇãYå%܉f—*š·HàÅÀ’ÞŠ`0(»ð¬–È™?Á*È—_~)(¯Á-»I±kuüloœÉd°eËäççãÓO?•¤ŽÕ!Vª€H®˜ ñ™øP×oo« µµµp¹\2T¯¶¶VÖ¾¤¤DÚ¶r§ÝžP"e¯4PWWW' &¯\gîú3pf³ÞcÀö]fšÚír.vcãVkèñ±›èY…á°J`»´ŽÞ ʽØl€×ÛÖÖ†µk×ÊßdõÎ>ižIp{2Å{‚U4&`ö®mræÉðüبÀ>¯†³Âá°|ÎræÃð»Ãu§¬’f}~öLÙÎÞ1Œ]ÚìC w¬ä„Ãaäççãïÿ»¼'½<Ùláp8ç{ÚWhµBù¡  ˆ¢(‚ÚÚZÀ/~ñ‹¾=EQú-µµµ8å”Szõo†B!ñ²ì+JJJ …öÙû+Ëhº¬(Ê ‰àõ×_ÇA´_ôìW¥ÿÉdP[[‹sÎ9§Oõ7"‰ì³÷…B8ðÀ÷Ùû+M@EQEQEé5Ô„®(Š¢(Š¢(J¯¡ ˆ¢(Š¢(Š¢(½†& Š¢(Š¢(Š¢ôš€(Š¢(Š¢(ŠÒkh¢(Š¢(Š¢(J¯¡ ˆ¢(J/òÁ`æÌ™8òÈ#áv»1dÈ\|ñÅX·n]Îq‡c—?çœsN÷}ôÑG1bÄã°ÃÃïÿû½>'c îºë. :ÅÅÅ5jž~úéï|­ß†Ï>û S¦LÁÁ —Ë…²²2üøÇ?Æ+¯¼ÒãXc xàsÌ12§àŒ3ÎÀ'Ÿ|ÒãØþ²>;cÞ¼yp88ꨣrŸ>}úNïŸ#Fìô}úýõÖ[;½æ¼¼<¼÷Þ{;}MWWFŒ‡Ã{î¹g§Çô‡µQ”ý D¨(ŠÒ‹,X°ï¼ó.ºè"uÔQhhhÀ’%K0zôh¼ûî»>ñÄ=^ûþûïcñâÅ=‡z×\s .ºè"Ì;o¿ý6fÍš…L&ƒo¼qçtóÍ7cÁ‚¸êª«pÜqÇáÅ_Ä?ýÓ?Ááp`Ê”)ßÏ…ï%uuuH¥R˜6mª««ÑÚÚŠçž{“&MÂüÇàÊ+¯”c§OŸŽ§žz S§NÅõ×_t:5kÖ ±±1ç=ûÓúìH}}=~÷»ßÁívïôy§Ó‰G}4gB¶Ïçëq\[£Ù³gã¸ãŽËyìCÙ鱋/ƦM›d2ûŽô·µQ”ý£(Š¢ôýë_MgggÎcëÖ­3N§Ó\qÅ»}íÏ~ö3“——gêëëå±L&cB¡™4iRα—_~¹ñx<&ïö=ëëëMaa¡™5kVÎãcÆŒ1x Éf³{sYû”l6kŽ>úh3|øpyì™gž1–e™_|q·¯íïësñÅ›3Ï<ÓŒ;ÖŒ92ç¹iÓ¦dzÇ÷èOk´zõjcY–yî¹çöêøp8lü~¿¹óÎ;eYfáÂ…9Ï÷§µQ”ý •`)Š¢ô"'tòós‹Ï‡rŽ8â|þùç»|]GGžþyŒ;ÕÕÕòø›o¾‰X,†k¯½6çøë®»©T +V¬Øíù¼ð èêêÂ5×\“óø5×\ƒÍ›7ã¯ýëÞ^Ú>ò, <ñx\»÷Þ{qâ‰'bÒ¤I0Æ µµu§¯íÏëó?ÿó?xþùç±hѢݗÍf‘L&wù|]£T*…îîîÝóË_þÇÇTûôîIDATe—]¶ÓçûëÚ(J_£ ˆ¢(Ê~@8F(Úåó+V¬@<ï(­Y³pì±Çæ<~ì±ÇÂápÈó»â£>‚Ëå°aÃr?á„`ŒÙãë÷­­­ˆF£øúë¯qï½÷båÊ•8óÌ3Édï½÷Ž?þxÜrË-ðù|p»Ý8øàƒ±|ùòœ÷é¯ë“Íf1kÖ,üó?ÿ3Ž8âˆ]×ÚÚ ¯× ŸÏ‡ÒÒRÌœ9ét:ç˜þ¸FÓ§O‡×ë…ÓéÄé§ŸŽ?ü°Ç1ï½÷{ì1,Z´h—ò«þ¸6в? EQ”>æ‰'ž@}}=î¼óÎ]óä“OÂétâ /Ìy|ëÖ­ÈËË둼 ´´[¶lÙíßÞºu+***z<^UU{|ý¾bîܹx衇l3ä_xá…X²d `ýúõ0Æà©§žBAAî¾ûnx½^Üwß}¸ä’KàóùpöÙgè¿ëóÀ`ãÆøóŸÿ¼Ëcª««qÓM7aôèÑÈf³xíµ×pÿý÷ãã?ÆêÕ«áplÛƒìOkTXXˆÉ“'cܸq…Bøì³Ïp÷Ýwc̘1xçw0jÔ(9öúë¯Ç¥—^ŠN8uuu;}¿þ´6в?¡ ˆ¢(J²víZÌœ9§œr ¦NºÓc’É$^}õUŒ?^¯7ç¹L&ƒÂ¾Îét"“Éìöïg2íôµ|¾/˜3g.ºè"lÙ²øÃÐÝÝöövÛ¤5‹Åðî»ïŠÙxâĉ¨©©ÁwÞ) H\ŸX,†_ÿú׸í¶Û wyܼyór~Ÿ2e =ôPÜzë­xöÙgÅÝŸÖèä“OÆÉ'Ÿ,¿O˜0^x!Ž:ê(üêW¿Â«¯¾ ø¯ÿú/üýïÇÿøÇݾ_ZEÙŸP –¢(J‡1~üx,_¾|—2gŸ}ííí;Õ©£££c§¯kkkCqqñnÏ¡¸¸Xû_Ëçû‚Ã; §Ÿ~:.¿ür¼ôÒKH&“˜4iRÎ9ÕÔÔät:r¹\˜8q"Þ{ï=d³Y9¶¿­Ï-·Ü"rªoÊœ9s`YV­Z%õÇ5²sðÁãüóÏÇ›o¾ c ‰n¾ùfÜtÓM9~ªÑß×FQú M@EQú€D"sÏ=‰D¯½ö*++wyì“O> ŸÏ‡ñãÇ÷x®ªª ÝÝ݈D"9wvv"î1ÀªªªBCCCÇ·nÝ {|}o1yòd¼ÿþûX·nœÓΤ-åååèììŸC[Ÿ¯¾ú ?ü0fÍš…úúzÔÕÕ¡¶¶mmmèììD]]š››wùz§Ó‰ÒÒRÄb1y¬¿­ÑβÙ,Ž>úèÝžËÑGÖÖV¬]»6çñÿýßÿ…eY{|}oA©JKK ªªªPYY‰úúúÇÕ××ÃétÂãñèëS__c fÍš…ššÔÔÔ`èСx÷ÝwñÅ_`èСøío»Ë×§R)D"”••ÉcýmvÆúõëát:áv»±iÓ&477cĈ²†cÆŒeY˜7o†*éÂÚ(JŸÐ7ÝEQ&ÝÝÝfÒ¤I¦°°Ð¼öÚk{<þž{î1‡Ã¬^½z§Ïg2SZZºÓ9n·Û477Ëc---fíÚµ¦¥¥EÛ¼y³),,4×_}ÎëO=õT3xðà^ŸSÐØØØã±ÎÎN3zôhãr¹L:6Æ3{ölãp8̪U«ä¸¦¦&ãóùÌĉå±þ¶>‘Hļøâ‹=~Ž<òHsÐA™—^zÉ|ú駦­­Í$“ɯ¿ñÆÃáÈ™ŸÒŸÖ¨©©©Çc}ô‘),,4\p1Ƙ5kÖôX¿‡~ØX–ef̘a^zé%“H$Œ1ýkmeBEQ”^ä†n0–e™óÏ?ß<ñÄ=~väØc5pÀnßóþûï7‡Ã\tÑEæ‘G1S§N5‡ÃÌŸ??縥K—˲̲eËr¿é¦›ŒÃá0W]u•yä‘GÌøñãÃá0O?ýôw¿àoÈ\`Î8ã sûí·›GyÄÜyçføðáÆáp˜E‹ÉqápØTWWŸÏg~ó›ß˜{î¹Ç~øáÆår™O>ù$ç=ûÓúìŠÖÖÖš@ `®½öZ³xñb³xñb3nÜ8cY–?~|×÷—5:ýôÓÍøñãͼyóÌÃ?lfÏžm\.— ƒfíÚµ»|]mmíNÓÖFQö'4QEéEÆŽkÇ.ì|ñÅÆáp˜o¼qïûÈ#˜áǧÓi=ôP³xñâÇ,]ºÔ8Ž’1ÆÌŸ?ßÔÔÔ§ÓiFŽižzê©o‘ßgžyÆœ}öÙ¦ªªÊšÒÒRsöÙg›W^y¥Ç±6l0^x¡ñûýÆår™³Î:Ë|øá‡;}ßþ²>»bìØ±æ¨£Ž’ßãñ¸™:uª9ì°ÃŒÛí6ÅÅÅfäÈ‘fÁ‚¦««k§ïÑÖhÉ’%椓N2¡PÈšAƒ™Ÿþô§fýúõ»}]mm­q8;M@Œék£(û–1Æôµ LQEQEQ”šÐEQEQEé54QEQEQ¥×ÐDQEQEQ”^CEQEQEQz M@EQEQEé54QEQEQ¥×ÐDQEQEQ”^CEQEQEQz M@EQEQEé54QEQEQ¥×ÐDQEQEQ”^CEQe¿fìØ±8í´ÓöêØiÓ¦¡¦¦fŸQO–-[‡Ã‡Ã¼¼<Äb±^?‡Þæ¾ûî“kv8âšEù~ÐDQepÅW ¸¸_}õUçæÏŸ‡ÃW_}µÎlÏX–‡cûÿ®¶nÝŠÛo¿üñíM,ËÂ}÷݇ǧOΡ79ï¼óðÄOà‚ .€eY}}:Š¢ü€°Œ1¦¯OBQEÙ·455aذa8æ˜c°jÕ*y|Æ 8òÈ#1aÂ<óÌ3}x†»¦«« ŸŸøðÃqüñÇcéÒ¥˜:ujαÝÝÝÈf³(((èÕs\¶lf̘ 6àÀìÕ¿Ý×Ü~ûí¸ãŽ;ÐÔÔ„`0Ø×§£(Ê­€(Š¢ ÊÊʰ`ÁüùÏÆã?._{íµ(,,Ä¢E‹úðìvO~~¾$°»}³¼¼¼^O>ö%­­­}} Š¢(ß;š€(Š¢ ®¼òJœrÊ)øÅ/~ææf<ýôÓxýõ×1oÞ}: §Ó‰êêjüã?þ#6nÜ(ÇŒ;§Ÿ~ºœÃ 'œË²0mÚ4ñ\<öØcvîimmÅܹsqàÂétbذaX¸paóu8˜5k^|ñEŒ9N§Gy$^ýõ=/înøË_þ‚)S¦`È!p:8ðÀñóŸÿmmm9ÇM›6 _ý5Ư׋Ë/¿\ž÷Ýw1nÜ8ƒA¸ÝnŒ5 ‹/þFk +W®Ä˜1càv»áõz1aÂ|öÙg=Îû‹/¾À”)SP^^Ž’’ 6 ·ÞzëwZ EQÈßó!Š¢(JᡇÂèÑ£qõÕWãí·ßÆ 'œ€k¯½ö½Ç¼yóàp8ðË_þ¸÷Þ{qÖYgá£>BQQ`éÒ¥˜1cN<ñDÌŸ?áp‹-Â;#5kÖÀëõ~ò“ŸàóÏ?ǬY³0dÈ466â7ÞÀÆEÊd÷ >wÜqn»í6\uÕU8õÔSÿðÿ ÇîèG˜8q"Þzë-\yå•5j^ýuÜxãØ²eKDäí·ßÆóÏ?k¯½‹/ÆäÉ“±qãFo´NdùòåÈd2¸öÚkQZZŠ÷Þ{K–,A}}}ŽìͲ,tuuáœsÎÁ©§žŠ… ¢¤¤ðÆo`âĉ¨®®ÆìÙ³QYY‰Ï?ÿ+V¬À¬Y³öz-üqL›6 çž{.îºë.´¶¶âÀ©§žŠ5kÖÈqü1N=õT᪫®Â!C°~ýz¼òÊ+¸óÎ;¿Õ:(Š¢FQEPÜ|óÍÆ²,SPP`>ú製~ÝêÕ«eYfðàÁ&NËãË—/7–e™%K–cŒéìì4fÔ¨Q¦½½]Ž[±b…±,Ëüæ7¿1ÆÇeYfáÂ…»ý»cÇŽ5§všüþÁ˲̲eËz;mÚ4SSS#¿¿ð Ʋ,ó»ßý.縋.ºÈäå噯¿þZ³,Ë8N³aÃyìã?6–e™ÿ÷ßí9.]ºÔ8SWW×ã¹¶¶¶ÍŸ?ßäåå™M›6圻Ãá0·ÜrKαÝÝݦ¦¦Æ :Ô$‰þý½YËT*e€¹úê«soll4~¿ß\uÕUòؘ1cŒÏç3›7oÞåû‘ßüæ7Æáp˜h4ºÇcEQŒ1F%XŠ¢(ŒP(¨®®ÆGñ_ÿÓŸþTvæ`òäɨªª’.Zï¿ÿ>Å_BƇaÆaÅŠ€ââbbõêÕˆÇãßå’vÉÊ•+‘ŸŸë¯¿>çñ¹sç"›ÍbåÊ•9ŸuÖY8è ƒä÷‘#GÂëõâ믿þÖçÀª°MFqòÉ'#›ÍbÍš5=Ž¿úê«s~_³f jkk1{öì]v×Ú›µ|ã7ÐÒÒ‚K.¹ÑhT~,ˉ'žˆ7ß|‰DðöÛoãg?û ôm/[Qe—h¢(Š2€Ø´i~ýë_cäȑشiîºë®ÇD"„ÃaùI§Ó9ÏrÈ!=^sÈ!‡ ¶¶°qãFX–…Ã;¬ÇqÆ C]] °° ,ÀÊ•+QQQÿøÇø·û7„ÃáïáJ·QWW‡êêj¸\®œÇ‡.ÏÛ‰U«Våü¼ñÆxá…¾õßVEù&¨ ]Qe€ðÇ?þ/¿ü2î»ï>TWWcÑ¢Exýõ×qÝu׉, þû¿ÿ™LF~:thÎû¬[·®Ç{õÕW5j`È!0Æà‹/¾ÀرcsŽûâ‹/0dÈœÇjjj0gÎÌ™3ëׯǨQ£°páBélµ#ßdèÝ!Cð§?ý ét:§ òùçŸËóû’O>ùëÖ­Ãã?ŽË.»L·ÏbÙ|0Œ1øôÓO¥Ø®ØÝZò}ÊÊÊvû>ü¼?ýôÓ½>GEQ”o‚V@EQ©T ³fͱÇ‹™3gªªªðÛßþ¯½öž{î99öä“OÆé§Ÿ.?vO<öØcH¥Ròûòå˱uëVŒ7pÜqÇ¡¼¼>ø :;;帕+WâóÏ?Ç„ ™Lííí9ï]SSÇÓãq;L$öÆ72nÜ8tuuá÷¿ÿ}Îã÷Þ{/Î;ï¼=¾Çw•+‹-ÚëDjôèѨ©©Á¢E‹zH¶ÈÞ¬å9眯׋ýוáŽv"‘€m¡1cÆà?ÿó?±iÓ¦½:GEQ”o‚V@EQ·Ür ðâ‹/æ¾×]w–-[†Ù³gãÜsÏíá•ØÁ`?úÑ0}út444à¾ûîÃa‡†+¯¼À6 0cÆ Œ3—^z)°xñb :³gÏ|ùå—8ãŒ30eÊŒ1ùùùxþùçÑØØˆK/½t—ÿàƒ†ßïǃ>·Û —Ë…“N:i§ÕŒ‰'â´ÓNÃ-·Ü‚ 6HÞ—_~sæÌé13äûfذa8øàƒ1wî\lÞ¼^¯Ï=÷Ü72Ý[–…x“&MÂÑGéÓ§£ªª k×®ÅgŸ}†•+WîÕZz<<ðÀ˜:u*FK.¹eeeظq#V¬XýèG2WdñâÅ8õÔS1zôhüË¿ü jjj°aüúê«;5Î+Š¢|#ú²—¢(вïùðÃMAA¹á†vúüûï¿oòóóÍìÙ³wû>«W¯6‡Ã<óÌ3æ–[n1•••Æår™I“&å´“%Ë—/7Ç{¬)..6¡PÈL:ÕlÙ²EžF£æúë¯7#FŒ0ÇsòÉ'›çž{.ç}ÆŽkN?ýôœÇ^~ùesä‘GšÂÂBãp8¤%ï´iÓÌСCsŽM§Ófîܹæ€0EEEæðÃ7÷ÜsOóu8fÖ¬Y=¯©©13fÌØíÚì® ïÚµkÍÙgŸm¼^¯)//7W_}µùä“OrΛçîõzwù7ÞyçsÎ9çŸÏg<9úè£Íý÷ßoŒÙûµ4Ƙ·ÞzËœwÞy&˜’’s衇š3f˜ÿû¿ÿË9î³Ï>3^x¡ ƒ¦¤¤Ä >\Z(ÛÑ6¼Š¢|S,c¾¥³NQEP¼õÖ[8í´Óðì³Ïâ'?ùI_ŸÎ~ŲeË0cÆ |øá‡-EQ~¨KQEQ¾'F ˲D0þàƒbΜ9ߨ)€¢(   ˆ¢(Š¢|gÎ=÷\¼ñÆò»Ïçëóé&OžŒ‘#GÊïášEù~ÐDQEÙkt·{çTTT ¢¢¢¯O£W4hNJWå[¡EQEQEQz ¢(Š¢(Š¢(J¯¡ ˆ¢(Š¢(Š¢(½†& Š¢(Š¢(Š¢ôš€(Š¢(Š¢(ŠÒkh¢(Š¢(Š¢(J¯¡ ˆ¢(Š¢(Š¢(½†& Š¢(Š¢(Š¢ôš€(Š¢(Š¢(ŠÒkü?Šr£m#âIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/acquiring_data/helioviewer-3.png0000644000175100001710000061075700000000000022134 0ustar00vstsdocker‰PNG  IHDRä†0€IDATxÚìýgivß þnzï‘ð@Â…ò]¦mµ£÷¶Ej8#ŽÔ£àŒ–6¤ØånpElì'm(6Hªc—šØÖÄH ­šIE×Þ•w¨*xoÓé}æÝÿó¯sªPUHd&ò=7òæ}ß÷ysÜsžcJ@™V ªVºëŠXa(`…¡X€†bVŠXa(`…¡X€†bVŠXa(`…¡X€†bVŠXa(`…¡X€†5¿¥•îÀ=èq"¶‚°¦(àn°}­QDA+ kŠnk ão…5¹¥[>°v¢f¥;p7Ð<\fV`#ÐØ¿]jIà20@ò×ÕÊkWk¿(? Œ;Qà*°Ô=ÀTüf€j`8®×{€3À›ÀÒJè=ƹª :F4™‹ñ{c|oE˜>¿}øTÜ{:®Ï! i†ÅœAT²š`Õ,@ ø ˜:€sˆ€]À5„ÉMh¢77€!Öôà,âïͤ½ŽØÉšìÓÀ‹À÷ã™ÎX¢ W€+ÀŽøìFTõ\´·’Ô}Ó‚nÅ®Zà×c‚¶§âS0ÿ!àµø¿<Š&þ{1qG‘þKÄžêÑÄOcñ¾a´HÝhÂë×u5"Y³ø ÄÊîËI+By%àK1YõƒûÔ!žm-æ\ü^“x±¤®ø\DÚÑü’;bPCˆ5íB5†(ä Zôy$sjÑBŽ­À$-ûÜú‚*à€q„å/Å$OÇdôǤ¿<ÏEغ„ØÑËÀ!$ˆÏ!ê9Œ0y<žŸ')j'ÒŽªÐB^‰ÿg£_SÀ·+þ¿_°ì2 ròKÀçvÄë¯"áû1`?pi'ÈEìDXÙ¿/ J©E ñ*Z˜y´8çÑ¢tÅÄo÷ÖÆõ~` òíˆ5DˆP üZœû ÕÀ?»/*_ˆZ³9¿_GÚ̦øÞ‰ØGÂ¥x® ÚjD Lþ ÂàÙ¸w ©ûÐbwÇÄ?„ÔÒjÄþFµ\B »ˆí䃸Í;{b ×_¯%7UMñÛE¤&–H62‡ØK ¢„RõüzÜ74¥_ˆ…hD,ªŒ6dÐâoA2`QdsôeQá³õÀ?AXWFX9ˆxö^´ªŠÁ?‹3NRÀkñ½ ±‘æ¸^5wW´=“xÉÿS, ¤y Ї~Qι°÷c×¼ì2 „„ÝwVŸGlàFLêË1ð=¤}§„0s0&?Z¸Wâž ²<Œ0铯 ¶3C ûBüÿLEû/ÄB]D kv´?Ú¿ûƒe_€zàsHnGB®éà/#ÖòtLä«À;ˆR:Ø“_¬žõˆeôÄÙ<±xmÐöÿ%ê*ð8b9ˆÚvÅ{[u”L!ªŠºÝ&©Ò~/`YYP ­ˆg/!,ûz|ŸEØÛò9d¹Ü×:F^Fìà Âæj„ýo!Œþa,ÊþxΦ‰š˜ØŽøm:Þ÷Ýøþ8¢OÇ=^”QÒä}úãZ ðq¤© ¾½±ž¾ÄÕøýXÜc-h;ÚìDØ9‹ØFZ7§bÂæ€ÿ)Úˆ{K1°¦h·QÏf„6W{¿ÐmÖ!Mm±«>´™_¦É_ö¨EXT6/ôäT?xöæø«¤!îa$dÛë9Þ½=~aí§+Ûo ¡|!&øM$d«‘Ao$&Ùf‹F´Û@nØúY^èžÈ€;Úêb2âSBXý)Ä.6ÿ ÌQ$ FØþ1a-Ñ^S<3Yq¿á²ým,â’3óñ2OlDZ×ÎxBÛ‹€/Æs»cm$\Õ p;¨‰>IÚe®#žú’319ãH&ìE‚t#âï;¯Þ‰°u ФžŽÉÚ‹÷L,Ø<²¢^CìíÚÿïÿ÷j>ލl)žy3ÞQF ÿ"ÂøVD…{—yî º][»ˆ6>—H¹+ù?5@Ó‚,”cqÏâåWbBöžŠÅéG²ä¢°mH–t!öQFXu)ÏÄ_øA™‹ b]Sˆ¥=‡XTGô{‚† eȃùêxÏC«½Ëý?Æób’ÏÅ„Î"ùÑ“|,&ýÅX€‰èϦèñžå‚eYk@ñÿÜE¤­Œ#ý¿ íúz t;´ýˆTÇäÔÅýÇbÐH€Å‚=‹ØM-¹“mCºi9?m]G‹=„ØX7bW¿Šþ‰XÌ>D1Ûãù½è\Âììß"j [.X6!ÜürüßOžÃ.Æoõ1á­¤x!&d.îñÁú$b#5ÈÕd8òÉxÞ§½Hc:ƒö§«ëB˜#ˆrö#wŒ<1[ˆI.!SÃ;ѧDmAì—Ú|u™'YÀ°Dúô×’vþ:ò”ëWbZ%´‘:ú÷–ŽÅ3 ¬ß ñynðcâ®Äý{%|ŒÜXu …3EÌ“†ºa„8óè,aŠå‡ûâíè—1„éÃäˆ-˜uˆ*ö#L½´ak]Ü÷rQ·žßý*šeò$ëí˜øj´¨³h/ð-$‡ö ª™Ž ¿J ùïssßrÁ} ÐxaêÂÈ+ä}+©Ó?“j¢·cb;I¯ŸDìëWÑnŒ{›b«PmDÑNîK.EûãHÇŸCH±ïhŽ÷Ýî ~ÍØ‚n…2º3ˆ¿V# ½“wŽôûÿbüÖŒøö6„‰H;ÒQ$ ÿ] `’4ÐÙÏhk´³ í »Ñ~£íí‰ï{Èx4»°üB€òmƱ&Àÿ÷Û."*˜"7Q“ñ90qø7{7Û­½ø&ÚDùÄ« ×ˤ4‡Øž6"v¶\ðÓHÖ@lèÏI3öý˜œû!c^ÿ?"ÝzKüÞ@j*Í1ÁˆmùôlCÜ–äéo#ÝÝžÖíñÜpLò¹ø¾'öýADׯ×Å}—ª4¸-7Ü×T嘈;…Ì ¤7sMü6‡L=H弈öG¯oEÔpí. ª‰v/!y°-Ú´WÃSm¢(#jñä{ßp¿`Ù(àýnB­æ˜ÈEÄ.Ž#aìÓ¨Y´‹ÔJÌ’¾œ“ˆJ6!Öæ` ÒÛîÚ1—ÐÂŽÆÊDÓ¯Xœp aæ“K=2´-ÄÄ\‰õ¡ˆã†K“÷"J™$C‹ö j˜ ®DÎxÜ߃ØÏ¿Y©I`•jÿwógHwô¶˜¨IÒ1k;i;jF“׆¼ìž@;îˆílBlŦî1„áNЋ„¼ÙÐJŽU¤*x ZOœ7m[+qˆédܳ€¨ÀA JéGòb)®m'}EÑ¢‚äÐý¶w‚_€[;ðY„¡•¼þRüµ¼°±1[5A²¢ QÉ92ò~ ’ßG‹·Ò§ñ¯ (!–bŸœ%DÐÄÿ}à!…ô&$œÊ ™“­u=†ìWcÊšU¹·ÂÓHOï&"ÇÉS»ÛŽÓ÷Ï&…Õ:ÐUÑ/wâý:c[LÚp9v`‚ÜŒM²¶`U,ÀGíH峫f@w «&i߇™´ÛY'×Òä{ k­Ï¬ X¯P,À C±+ Ŭ0 °ÂP,À C±+ Ŭ0 °ÂP,À C±+ Ŭ0 p¡\.S.ßlû,à>ÁŸüÉŸP*•(•dD÷B¬‰2÷Êåò»µ\í555ðû¿ÿûï^ܰa¿÷{¿÷^ô•¯|€ÚÚ÷Noáöï7|ùË_~wBŽ9ÀsÏ=÷¾Ï={s”Ø?øÿàGî¹{y/˜žÎ åâ³üŸ½{÷–_yå•wÿ/kµÊʼnØ}‚J6Tù½X€†bV 5t…¡X€†bVŠXa(`…¡X€†bVŠXa(`…¡X€†bVŠXa(`…¡X€†bVŠXaXó p? n.wÿ‹±„5CkÓßk\¬ ¬ xP±ûn`U,ÀíHðnÅYRÖò®:t»íˆÏU”²¦ŸÌ#WC¦³w± TAcU ìŒwU€ÓË/ ô4#(ÛᔄicÜ7†r‰nG‹ÐO^sVÝ3d"îÕ6àUÁ‚ÌBjQFÝgPª1WÚ[Bé&ŸF“ %ešG™›Ðb9 «KÞ>‚öDÕ÷jY]“«Ä=½Œ&iJÄä*JÓhR»P–\§¶ì Kî!Y+hœˆÿB‹ôbY¥5û:ËWéƒÂŠæ õß_"«¤B¼¾2W\/ÉNF¶ÿMð Âø…hëY‰©øy”qw¥Æ\Šß]2q¥aÅXPUZý2ë^²¦û[(KºË—çœ%w¥,ÛMÖ!›Bu‡û†?’õµ’X¶+Þû1”4ö^VÅû0pßàÖþ JE?FÖn|±›Æ=ˆÍŒ"*p‚ïs¨@çÈ’W5ˆPò¾·ãÚ³ˆ²†ÈZòýdÁÑŸãý'MÖ”¯Á|aýu2µd;’ÍHØ~É€.DãˆBž#sH7¢ÅùrLê^”gzIWЂ¸`s Q;~_ vpßeÀVTóË% ]i{ Âl×ßI–¼º‚°¹ƒ,}å²´#ˆýl‰vÎ"*èBòd -Ò£íO’›8ñå"]®Òåw‚e-ä7“oªp±)&h&&mað&$@gcÂ+þw•í¦hÓ‰\ËqÏKH#ZD•2ãùO£…¾AÖG‚|/Z k±HPßO¸oP üCcçjø2*Üsåzî@‹â\ Û♣ˆïŸC ÑIVBC‹y-³-NÂöY$CNÇ8Ëîb|p@©­Ýɹ/ PüzLÖÂ^ïpŠþÓd)óchã5 r ±W7ÝRÑoE%I>‰J—,õ¦ø„ݶU¡Ý‹3Ž´)Úü÷oŸ°ìr§D²k#m1Á›bbëKºZˆIwÁÍÄNö!Ìvá͉˜ÜËñÛTWìbuChÐížCÔWOéé~zAûQ5îû¥–.û4#íf±‚çb1\ÿq,ÈW‘ŒÅYDlÂåÌ#á;ŽÔ¥ÈPšûGc0Ÿˆûÿmüö}Äæ\´¡-Z,F#¢4oÜ\V·•û˺Uˆ¸VØY5{,&o€¬-J¶ý2®=CÑlšpi¨lÕ\¼ç͸¯?æq$#¼éªGT1‡öj´cÞÏÍÄõOp¨`Y UÇp­ø*àG¬¥ž¬dÔ„(äq„};b²ÿZ¬%´P¿íN#jxɃI$XÍÎj«ê%íHudø…Xˆ‹ &Ú}3Þ½±Ç:n÷ra>òÜ©3íhCu1^Rƒ{4&çÒlÚ ¬'ëÄ7!ìÝ“ú&b+Gâ Í1Y7b!G»»÷¡ÚeK1á{%]~ÉŽE$è/ÇâÜ -”o3¾{­µ|ä}ÀÀ¶˜‘˜´î˜ˆ£ñÌÁ˜”×b2†ElF²`S,ÎãÀÏÿ9á8âã.Øü *ÐЊdÇ4i¢î@êeêfƒUˆ}íþ, ßàócxYR—³ðò± šp72 “*ßA$û‘úyaæ)„ÕÍ 1 üßÈï¶XÀD!m1™ýHvüW„Éo"L¿Jª¦#5ÓZÑh<8ÞWÏ”I «L;²2á#S”;U¾å·à7c›I=¾QÇvŸÞTÁóH‚°» aå7ÉÍU )ÄŸBZѳ=ðÿR›ï âž—•õÿOÂÆð÷þDÏ—=íX屸ZßßÄ}Ë÷Äq+fT!ò®‰‰ïDÂrmšÞˆF,b/RkÆNÅÄmŠ…9׀߉ÅÉ;íü_¦„µûcÛãÙŸDÂtä"{K,ñJLú.ôb­¨4b]\!Èée\€{‚n%¡ê˜¬n²4ÉcBÿ$b(&Ðdï‚Ê}1yW»™E••b2þ8i+Ü[¿Dlî :|1ßÿËXìW‘0þ³Xœ DM]ñÞ²ÈèTÙ‹øƒX”²þð R-_B,¥ øƒ¿ív6ĺßB’OEõH÷¯‰¾.·+˲± ³–CÈ"iã1 sH6lBBr)œ¯ AØ…jÈ_"+bO¡#ͦ˜¼Îøþg¤º6 63ÏþÚTÍT,êp,ˆ …S)–¥ŒEèey)`ÙNĶ"ý|±•ëh³ôT ÒUî¢ÇÄu!¬{&&'b)§âùRÜsi)¿Œ0¶|/Úû IJ¶‘eÒ*&Øç»ÑfËöçÉ#ÐËqoBÊ:e÷–M B˜5аy¦vdoG2ౘ„ë1ø¦Xo"¡ú]òàÞW¿°þ5äv¸§brž@ªèFÄžëûS„ù>žœŒ Þ“\EnÄZ¢­>rcfMè^³£{J•>6µd=øˆ"ΓZHu\+“;å·ã·–¸~.&ü@Lò|<¿ˆ(â'cQ|†<ïéCšM â÷'ã=›æß@fŒÇ”ÖwÅ;m8<‹ãò=žôJ¸§2 \ñw€ÔÉçbàƒHŠ Fìåb\ÿõ˜lŸÿ;KkãÞSh×Û‹jaݨìñ˜°¿%½vÅûKˆÏoI¯‰6_‹ïçv´#øµxî,Ë[wxÙTÜ™˜¬ýˆÜÆ@br¼6Ö^E¬£QÂ(òál{N“u†çÆÒ üb[Ñf}´u ±µq„íˆåU#ªš M£í-aUîZ®ÉYî(‘¤^“Ú¶„ØÃ RçbrgÆòCDÏ#Áè±­qý yh3ïñžÃöœúx¦1ÚYD¬j.ž=‰ÔÚ«ñý Ò|~‹YKžO\_í ð^5ÿ±ØZbR¾‹ñlLÚ'£Ýˆ×Û‚újLð ÒÕ;bQcÒ¼aûA<_ƒøÿ!êÚŠ,«õä1çŸ#õ÷`´U~Q™ë7‡FËíqOÌÑå÷¸ö1×Úè¢Ì¯#6³ñòOÅÄדgÈe„¯#]þHµ´áî§I;Ñ|´ý é)qaóÎhk;2SجыxÿD\ëŽ÷^Cû“ÿ7IËËv"f؈„ä„Í#ñÒo!Ñ÷Ô"’¿ ô2ÂüvdOšC”äzð6àŽ ?Ù¨nSü>ï5êÑ‚¶‘¹ñnHG_k.7,‹¡ïÖË¿MúæoBØ×‰XÊÚtÙ`÷jüödüµçÂßG2c”’V¯!vV‹ö 먊 žD;a[T­ó?ìO¥X +ѧIJ./ÇäÜ÷Å7ô"âËKHM|aëY„áº;Ž0ó±˜[%[Ð.·1îG†·‡cÁ>ïøÂ`mDrÅ!MCÑŸ¦˜à.„ùU¤Ûb’CßbyÏ‚—mnÇ’æ~ßNz Ô’¬ëä1æIÄšÎÇ“®"1yåX¨#ŠAûdÄbU'bbÛâÿƒˆ=G<ÿyî°‘ôÊþ÷ˆj*Dz\á°ËNÄ„C;CØ5Ç$‹É]D°Æ„^@la”<§Ý€åâÑH^D <‚dÅcˆÝ@úývÄÿmEí‹û/£>í’É[ÙOå"ܫŸ/1 ¶åœŽv¢]ë´¡ú<ž?†0ðIä ÛŽ0z;¢’ƒ1Á§U‘LjSˆ¢<¹ãÈžÔMzßC,g0ÎN_—Èó…¿%þo7ŽÊÝþ½€û ñˈ¼½#®"O¾Î!¾ÿð¿ÆØ0¶„ØÕ0âóöã,ÅÄw W”1áŸ@ÔÓLš$fH½~ ž;‚¨eøß¢o÷îûìFŽVÓ#{b’fc‚¼ {‚Œxax'b'uˆ5!!×ZÑdö#ƒÚ|ÜÓ@š¸ME3ˆrêÑm‰çø'H&¬ä¬xª‚ щH€:òe ÆvRP_Aü|QÈéQ Z ÷F$KˆñP´ÕŒŽ:¯²:òF¬(ÜêWº Îy„å p5yj¶ ÉŽAÄZ®ÇýŽ58€äƒÔÇIÓòY2Íj˜|ÏÁŠåЏS¢¦&2®¬±#»vGˆv¸úT|_B‹2Ží"Z˜Ò-~µLüûÍêéÌ~Ä‚¦IUsŽÔç[Ñ• Û‰„ñ ´HnsU ô}Ƽj;àC—=Ⱦstyœ#ý~V|PË4þUÕ‘UÓñû<îUk}k½ÿkVEθõ Ŭ0 °ÂP,À C±+ Ŭ0 °ÂP,À C±+ Ŭ0 °ÂP,À C±÷Êå2åòͶÏbîxÒK¥¥R‰ù/ÿåÍ××û§¬Z¶O©T*ÿ«õ¯îôÎüñ÷ÿ÷Ë@¹¶¶ö½À÷>|øÝß¾ò•¯ÜÔÎW¾ò•òïýÞïýȳ_ùÊWîÛD?÷Üsår¹\þÚ×¾VÊ_þò—ߌ[ÁP*•núÿÓŸþôMÿïÛ·ï®Þ=::ZÊMMM7-@q s \.S*ÝÞ™±÷J¥ÒM·ò{A+ Ű®¡¬k( €u °®¡ €Ö5PÀº†‚ X×P@ë (`]CA¬k( €u °®¡ €Ö5PÀº†‚ X×P@ë XA(Ýæïr–Ê-àGaÍÄÜ®£·¦š^sƒZ#ð Ïçƒ<¶ x_XÓ*ÐjQJ·ùÿÃöív•âîç8WËœÞÏñ€;«S<ذ¦%À½„å*!SºÃ÷Ûýϼ^ÀG‡/Xu¿`99üíĨ‹#î& ,ºÞ÷|Ü¿@Öuçªãs•(ª©x¦R÷Ö ¼ÒÜ rÝZ“TSw BÒ:Tª¯*®/ â”#¨ÂÜÉx¾ÕÙÕàšŽßæQ¥ºGâ™®¸g.Úª‹ÿw¡rPçQ¥¢ûQâûA…bp¸Ù»¢Ï#D¬AµËªQ9ÅBê&²f%ñ›K)–â{*­u=îG53O£ŠÓ¨Bà*4÷㨬î`´½„Ëå-]ÊÑÆd´ñQ꤭ÄX/ã¼í ß‹ë?LÖvÕ‡›CDм…¯!sBèI„Ìd9zÁ|ø’7oGåŒ#"+“uH]«z+"†‘èG'R­žö/"Iàjî[Ȳ§QÅÆu·Èw ëŠÞOÍi~ !öõøÛŸKñÜ(B®Ã·"ße¥§€ƒñw Ç]Bz3Bü!ĵ{„h@’¥!íàMT‚úM¤&mE5Ç·!¢»@ª^WQ^‰ï;‘*5ˆîdŒ} xu´àwëŠn{’Ô£Mg ©VÌ!®;‹µ!ð""ŠkÀ³¨ñ TÆ»!{?šÜãñWwåèW*þ·Jµ™Ü/\Dˆ|I“.„Ð×£½óѯ’:›Ò»êõvàˆ¸,…æb cñ}­^½Þ6ÚœônL‡Uˆ“þ<ªG !áBæ£QvoÄ3®O?ŽíBೈ`ZHn2€f!ä"”R´s •_ÿ"´.ÄáDzEÈù’*͈ØêI½!žÛUñüîxÞÏÖ’ª[ R±¼Ø<|‰ÜÃ|Tn¸}™ª¶Ò¸_Pü,ð9„T=H½˜B w$®M#Ä;‡L”Õ$â\@HÒ÷ÅõÖ¸§xI‰Åý!Õ¡ý™è-?ñÿBþiT‰}>>ûã=ÓÀ£H:œGÇ’ç"’õH5zØ‹$ÖFD@»‘„YŠ1÷Äœô =Ï£ñþ»iæC>»’ðÀ€¹ÒçÇk@\÷ø;‰ì,BðE¤–´Æß ÁÞŽëK±ªtÇ÷úh»!\ BøëȲӋ}:Ú»Šˆ¥!Í´aÝí- î} ë.„ô5HyóûSÀ±èËI„£1¶$YÚ‘d$7Ò嘃޸·ø,"«K‹+½€Ë kžÞKìÚ"òËñ®#ŽØ†»Lš+÷Ç3ÍÑæPü?‰n*Ú›‹gÎ#.?„k !îæ¸çm¤‹w#N=€T˜CÑÖ B¾fÄ™»ã~bCÞVà;ˆCw!Ýx ²7ÖeD@§a]Ej–‰bI˜ÓñŽêh¯À÷€§ãs²b¬*¬y¸L5H¿Ýƒü4ZüÄí7"dï"Õ µ„Pmˆƒ ýz!¾wFÛÇ¢@ó²Ü4!¤{%~ß“݃6© ˆ«/ }Ç6¤yã}!óóÑÿYD(3ÀKˆ›!|6ž›ˆ~ÏD{ÝH,"B~:®]C‡mˆ¸Æcζ"-#‚zÏðJ/ê2ÂE%R§ýoÒÔ!¸Ž¼!£7Š%„ØÇ‚@| !ssÜÛíM#d;ÜV]ñŽ_CfÐKˆ˜¦ã½Ñ.G_»w?m<…¸ö\|Ÿgr¾…x'ÚÀŸ¬KK\Ûú\<{™lw#b[Bÿ|Œ©Þeò<£I„ZDè6¥>ˆêÐC%„Œû€Ï …½‚ñ²©O …¼€òp<ûB˜~„hWâùfd%šE„qÇ5„¸ ˆ›0F}!ïVÒb³-îíD*Õ®¸·†4ƒ¾ý‹ë/!B‹¿-©m^}I˜V¤öìEÒcx,Æñ$R·~ˆ$M=Òñ·ÅØÇõ" 8˜ÈPÜs:úóñø¾ÀÚÛè¾<çU9ö!=Ùœ{#Züi„D[Ð"7#n¶!E'B–è h!Pmü¿!Éf„ÜÝAGbmòô¦sBH»DÌ¡ýÅ(âÖMñìN„ü&€±èß&DŒ>Q¾Œ8w"Â]ÑÆ(âÚMhçb¼£ñÜ^à¯>c8KªjO‹?sPŠ÷\ç§âÿéx×7âڃ⴦%€uýf„øÛâô d°jR…¯„óJÅßB #„ç")a=ø“Èê²Èkqm!S"˜‡÷ìFˆÙm®¬E8ƒ½7úPÿñ® ¤ÛÏÏÄ8ú£ï&¸Åø{Šô9êŽÏ7!,ÅsUÑ¿Nr_p†‘þ$ávÅ|µÇ\÷’0û1­yÎÉ'€´pÏ …ªB\·>®5 Õæ"BˆE’`Î!Dn ½*gÑÕ…˜˜n„X dœ÷CÜû-„ =qϵxî-¤þ #Äû "È Ñ×6„ÔÝÑgH¼!÷®¸o©F›ãž $¿}êþ{„° ˆ ® W}¹ãÿ:©Þ•â}V§š€?~M!0ý™'ýžÚblSÜ—íj> [ða&§!N/ZP/ZâàÓqßShá‡ÑB."Ý.ÞûE„XUˆÃ5’Þ[ ¼ŒtbëþŸDˆÿR/ú‘Jñ0BÀ#9Žw/Ú|‡<ÕŒ¿¯!NmkOc|ÎÄÿ#7ñ¿}ëF[ýñÅ›ôÍÈäê ïh´áSa«‡Ÿ@›ä#H:Ø:5×&¢SˆÀ¦I+Ò8wïj¾ aM@ !ÿUà'òŽ!`2þߌ¸ôiÄýv¢…´}¿m §‚¿‰ÜŽÿ*þ~TQö¿| mLŸDû‰¿A7ŠîÚlv#³è­'°É{r· µÇ–ªZ„X³1ŽjD$– ¢?¯ NÜŽT+K’q¤B@ b"˜=ñ9CJL{£NÎ~ó1w߉>N¡=þ¸>†«/Ú±ÏÓ,·ÏÌq/Ü+–Ö,Ì?Ô‘~´õˆkíŒë¯’H¶ˆ­•ä´£$’íŒë fqKo2¿ÏíBp ¾o‹gÅýW÷ÞÏ–bÎ"dÛŒ,QÏ ¢@ˆvQ+BĽˆ ?AnD7“¦NÔ\E„ðBú9àu„¬ÍqÏ0éþ½!úqq=¹©½üJ-L-IêŒÅ æb6žé‰¶GX»›âUA wëGbŽÒ„î ÄÉiÕ„a&î߀8iq¶^´øKIæ7?¸`?Bˆyr‘?‹tä­qí2BÈR]8Šä2R¹."îGH|qÑ.„È“ˆ0_@ÄéðɥжGúzy’k¯ÎjÒZÔAê÷+ú¹Ø]>'âØí\Fa{—þ5’P󎘣GéŠ÷]ADÛóU…¤[ð+æu­Áªðþú¡¯Õ¡…ÿBÐ*4ùÓ!o ¤k@ºõH|·µc['iÆœBˆS‡®!çcqßU¤~Œ"D±ý;iÓ/‘1¿¶D}j3’1.EÏ"ÞŽÔ²í¤P R7¾ï˜çA„|(~û^´qsð?ÿtVÁsÿl¸¯Ž¨ÿ=i÷ÿ…ô%ºFî ."Ʊãé@Rn›O¡ßA©6ú·V­B«†àýU¡*´ 漕þí{‡¬&%À.ıêÒï#Ào7@Û‚þR¼{?B”cHš~û¾cýBIs`‰Xƒ}?égoÕ!$Ñò/"bßsºã9J2žµkŠœmá‘økWáCdtÓZA¤Û¾Š8àE2håÄ}›âï„ öä4wÞŒ¸ÝDŸˆwŽ#"±¯Ñ[±¶#$¨Ž~mŠwl@H³ qâÚhw¼ë9àkˆ¦¢¿>®‹÷µ‘éRÎ#‚ïC–Qòœc"ot!"jŠþÔ"KÑ_Ç}ãH}ÚŠÔ¾Üì¬gOÓªó0bBIoÖ ¤Fqs¬õZ€5A•Úˆ¾2HÅ®m¤¾ôÏo@ 5ì1„ãhqípæ}A'B²ïŸgNǽíñÞ}È9LžÈ¶!dtœÁ5Ä•?‹ç|ü6Œè""ÚHŠíA„;íÛ±¯.ÞÛ_ñ9ÚñŒvöD›5ÑϧHÎr<[‹˜Cs|@ÄÛNZw¶Ä½ý¯C §ӧAÕǘâýkm#¼&B"½¹ª"OhÇHSákä&± !QBÂãhA¯“^eàW‘ª0‚ܦO¦÷^Žwµ!Ž;€$Â9d1ù?×ë°k1ÞÙ6èVwFISØÔDÛO!b~,®5\üMÄßDˆµDþ‰èó$ }i;}¼ïÚ}:óÖót<úó*BÞ!äÞ‚ö¿ˆ˜ho,žûé ÛÎòeÖ[nX?šbð³dPÉé&Ü@¦$qŸï£ÅEœ²©e´ˆ§ŸBq‘´ ÄsO#½ý$†PxåÿkVïz¢Í­óHeÚü?£­„T‹ñy !߾ϛ¤]ú‘èÇÇc ÿ!ó DF¸Ÿ$cz÷E{×¢O!dý¹¹îŠù:ó°"?cÿ>ð3Ñö£ˆqÌÆØG±ÖÇün‰ß;É3µkBªûŸE:z?ZØžŠß@‹:þoC\ùéæ0€¼!ôóq_ZØm¤P Ò­ÊœCù/òuG?#äFæÐÄŸ&Ý,)œchðx+K ›'-[óÑvBÚE”¶ÅÄÔƒö/6<‰tù‘è‡÷AÓñ[côç ²>MÇ÷‘h³R'b]ä!×(R¯.rgÉ@óH» ´] kŠlk·¿N#B´Ø{Ñ×1ÄÝêÑ¡Ïu¤ãE‹z‚Ü+œÿ§È ]R}œÀªŒ6¬UH­yÝe¤;xä<égÿ,"–Döïˆß–¢½&൲úëýÈt†0}îDúéjAÜÛý¾í~!¢Í½ÝÀ‹ö+N¸u:Æi"´·ì8bÓˆnÈëì51ÛH"µGëÔÖl5K†5EîpÒU¯¢0‡l@Üý!d2´ËÄ‹qí]µ/îé!U—Hˆý‡>SÑþUDH/#•èt¼o!ù&„'É¥)durà»O[Ç‘YuqöˤYñÚoÔEû&ðm¤ ³-úýM$™.)ÛÑL#åmDp#ñžOĘfÈ3Ž.DäÍÑOoüÝ·­dLñ ™£+úý¹WXK°æ`!Q7y.°„¦-ò0i6lEˆ|-nâÔ ÷©æ6„<}ÑþA„´ßGºz’0‡IŽ÷E„d'·ßˆ¿!‘32Ô‘>?ŸCÈbOËvD8Ûw@„æÈ±ñèwMŒD߈öv“æÑ)¤¦XÂíF’c!ð(™gôWIóo#¹²T»‚Ä&Û-Ñæ$âü}ˆ@¦‘Ô¹ÎÚ ™\sP&sélC‹|-À0âP^éB*ÑnÄñߌß6Æï™„XÕQª!8qí[h±‡ÈxßwHsì‘9Öw çB¾n¤r84r ²¼ìŠwô uf/Tc×ã ÄŇbì]¤·¨ ðSÑþÏ®Ðߎ÷6§ã¹§‘'«C4!»-N¡=Ñv$E¯ÅØZH7rK€MäYËjVuîkŽ stFܲA*Äñw-ð<"‡H ÌÌ!Âè‹6›Ié$‡Y›ê¬’MúéDejó>Ä5!s{Ž£…¹ˆrcü~IŒAÒì×…8çT|žŒkŽ'vÐÇ8B0« ‡¹ùÀ̺·£¸.!+Ð;ˆÓ¿L¦œCR¡qŸ3äIòFDhu1.[¼jÊâÚ»rΧ¾íÇbnF»O!Ÿ¢Žx~1î&\¦cœÏ#5ñ(i :M(ZÝjCÞ}ºA:ç­EX³Ä!O äs¡ g\îDÜv!YéjìxáãdJCsïAÒ‹Ô®Khkã]oE[6“A9×Сš·!žƒæ‹÷Æ»í¢¼ I±IÒôx m˜7™+¬Z'ýžvÄ8÷D?ºã÷o"bÛc›Žv÷Æ{Ÿ¶_$-_[¢¿Wãˆ0jDú+2fx­"?¬’“àÂýo}nYj†w^ mùBבA#NqÞŠ6ŽÎ±4¯þ|î­&#»\| m’ç5 Ï#$nBD×…²;óÂ0B<›A»ã9#ç8BÜR‚¼¿} I˜‰x§9úÛ1Æ}dÀÌÿHfµóx©XÞü!iõ&R÷.Fû×gÿocΜ?¨ø¯ˆ„A«B|Tp‘ˆ_D6Arôn„ìvOp@úYd½˜!3²mFˆògKÉ|Bê‚'‚oAˆÐOFl^O~9£Äé;cŸž ñÿ8Rk~ŒLYx!þIRe;JFf5""8ƒ¤ÐvDhOÆoUÑß³ˆ`KdŠF§TfH5¯-T!æÒY17磟•%˜Ö2<âFo£M`;iÊlAÈÙCš2›Ðâ;Eøn$)N’g•aŠý)»‡mEÜöYÄU7¢½ÄRöEìH眞½Ï>…$ÂUd›™o¿Nm»7ÞFfrþR=†¡mŠ1 qæ·¸†$À…hç`üæ³g­~Y¿¾÷õ î?Mº—;/‘HàvE5xŸßV#<0PBDàÜžY"@ÈäSäF„<;‚¶ ´…¨qºf„  ¬AÖœï#]Þ§¸ö´‘x¯ýûÉÞ*dNtI¤!rSy\9ù”kŒ]÷½ŽyíS,™ì„ç°Ï‡£ÿ?ÔÛï!COÔÉÃJùí˳?®=c9‹Ô$ÛûïäßSùûíþ®6¿ Uaº—÷ä~ Ùím­Y óü;~âÊoÆw»( #Žiį&êþЬ9Ift°„,¾1Gª—¢?WÉ óyò`¬ml)Ô&G‡.Ž# Bb›.#]™{âý=ˆ0Gâ]µdΣKdl„çë*’‚"D!o|ÿ:"°­Ñ®úÖ4òTŒ­á¶P…þÑ¢µ é°!ÂB¸QêBoˆû>†ìé›È ñsd¹ÓÃÈéΛäA„ÄGÈÌiH^‹¶Æ¢Í#‰2‡T¢=È¢äÔê5Ãß^¤Md›BÂD7c¿€ôûÍiŠëýñ|GŒëAn‹¤ÃÞv¥v•<är1K€[O×"2­yèNâ´ŒÔÖ‘]hSé¬hW­û[H—/“&Ð'HWj[œW¿—$¨W!Ø!÷7‡ :OÿvD0 dº“9ÒÇ&Ì ˆ@“Å+j¢ísd°MéŽ=…¤Ý)Y6 Âë‰ß®Æ³ã{=YÛÙ¥m~ýs~ô€Ëùó<8…3ÖÑÞm‡MmhÁ¼ùý-d[o@Hó8BWjy‹ôª¬!sƒ6!ÿÿgâû@<{–ôÐ\Šví¢lg6ç}ø_£ ®ÙkÔ™¨BHÛŒ°© Bë‰ÏKìÜþsdeù‡Ñ>eSüßÔ/#ïyDLWHâ댱ü iÛ_ĨdX«ñÖÜ‹A¶¡h®q2ªl!ðv´µ÷c/B«4É“Ñfd9Ú‡­™)[ru#5ËüX´Ñ÷8„ë ;qÕa’óºÌÒ¶I–òTØ9:«Â[5³î~'HísìÂxö8why¿ù\Ëð åC-â¢Þè^EêP?é™Y_FªÍ“á6‘«ã¾wwCêÑSaír=‚T,Èý‡SœŒqsÍÞzR¢ {šY²`F'’<ãdâÞsˆh;I_ «V½dvé$ÑÉ4‹ëÖ5TúU£pÃDõˆ;“fŤ¢ü7'–AHd7féôÆóãÈî¾ í-Î â°:pYggFÈȱÚxo#’N àÀxb½‚N‰ÛUèG!-F‘Õh”µ—Áa9  €Û|oFöïdÀý62+ÂÎøkä‰ûÚ·ý ²Œ=7»É<;£dOûîoDS7!^!k˜Õ ë9òÄÖíÍþA2,Ó.>/8¿»ˆÞÝæb]°n àv~E•×* £ql#û!„d ¤]ü B:ÛãM ÝH’ØÕDúæï‰g ýÁ$Bj;ñùàl ™azÚwtÄ»‹Ç©"ûÑþ ŸÛ›* ¸Ö%ÜéíýlÚþ­ql®¸†pÚð^"3,¸î¸v†,=äÄYítrßêxn‚L¦»ƒ ´¹ï²$pF¼u·÷Ö%,'Ô nìŒÐΨV"ërm!3@Ì"n½…LÉ8NÚéçA\Fª“¥ü¨3Ú{-d±Ð·‡b^xïô{Ù¾¶|÷Ým»ë~ñ>"s¸ða6¡ÅB-óºÆ X°{ Å|°®aU„DPÀJAA¬k( €u °®¡ €Ö5PÀº†‚ X×P@ë (`]CA¬k( €u °®¡ €((—Ë”Ë7ûw–J¥ÛþðA¹\¦T*Q*•hjjºíï·AAœ=«ô¶• ýÄOðÕ¯~õÝßowÿýõ×yüñÇø£?ú#¾ñoÜöÞ¹9%G|íµ×nÛ™™™iàÌ™3?r½ªªŠÅÅÅiàw÷wøæ7¿É?úGÿèŽã6’ûû¦M›¸té/¾øâ»ï~õÕWoK΂Wnll,_»víG¾ûS[[[Ê¿ó;¿S¿éÚGýÔÖÖ¾Û>PþÊW¾rÛwW^«üíÖëwêcå}wz×Zÿܸq£,<(—ò /¼PþÒ—¾ôîÿ·»§ò{åo·^»Ý}år¹üWõW·½·òÿÑÑÑ;¶7}x¯O¹\.×ÔÔ”ruuuùþÃXÊ_ÿú×Ë@ù_ÿë]Êííí·¶½ò V|ŠÏû}NŸ>ý.¿üå_þå¯ÿ‹ñ/~„°Šˆ°H¸ÝFøvP@ë (`]Ca*`]CA¬k( €u °®¡ €Ö5PÀº†‚ X×P@ë (`]CA¬k( €u °®¡ €Ö5PÀº†‚ X×P@ë (`]CA¬k( €u °®¡ €Ö5PÀº†‚ X×P@ë (`]CA¬k( €u °®¡ €Ö5PÀº†‚ X×P@ë X!(ÅçNÿp ¨³ÂP,ÀÊš‘¥;üVºË{W+¬ò¯¥ùYn(PëÖŒ( €å€‚–QlŒ— ¸ÇPºåï}övÏß/"XÄVìЉXŸPH€ Xp½CÍJw`5@Áý×/€åEþÒüýn¯po`]À½¶¦Ü-R—î²ÚŠ>ˆa]¨@eîbù=e„ÔíÀ4P´ã@5°ÌmñxöF|ŸŠïÕñÌâVK+=™¬ õ׃|¯Á~Øk .Òugü6Œ¾!p04"Įƀæxf8ž«BÈ¿¸†ˆÇ\ê:p˜»CÖÅbÞc(æ,àƒL„ïÝ t!¤^š€ ñÛLü½Ž8¼9ý Bú @7ÐK"ùðSÀ;Ñ+Ú-#jÚKÀ™øí^Žm½A17w;Ï Î>L€‹ÀÄÙ»â喝o0‰8üæø­!ÿ›ÀÇ¿Aˆ<ÏWÅõÓˆ0f$I¦m@C¼·ôGû ’áƒB17·ï*'¦©%77 U¥ !ë"P¸³‘ØErê2ÒáŸ.Çu«9ÛâÙþ¸§8ÏÏÇýcÀ¦¸Juôc "·Á|”…]OHQ ü³•îÄJÃÜj‡?„6±õÙ6"¨EÜüz<[‡8øBÎ À¤ãO#.} ® "8€v3’*]‘k£$¶GŸzAŒOU¼ë"ŽCˆ–!›æ÷†uGwò·¹õžO#¤[@~0üš´7€Çã{ !l ’݈(†g¯Fœ¾IŒ"¦„ :ó,p EÓˆ¬8÷Õ ¢iB*Ó8"ˆ´¿¨B{“jD,ý+=á«Ö%¼—xoFHÞ¸é8BºFàShóyqßA„È%„à›âÞSH´  EÈ:<Œ|ð-àj´Uß7! s !ÿ0"´À_ƽÃÀ¢½Rý²„éGDØ ì‹~ôßfÜÅ™Ã:"€»áúÏŸCÈ8‹¸ðä1¨!h3²Êt!$BH»éèsHjÌ"^ 7Ä qïvDd-¡Ñž¡qòkHмïëŠûXü?c˜Ž÷ß@R©™TÇÆ¢Oâ'¬§ýÎm\BÈöy¤VLÇoUñ™G:üI„Lóqÿ4Ú˜v#ÿp!:qß©¦<Š8òiD4[×€ĵ/#‰s m¶«u>žßÏöÆ}–:Ñ”£OWâ_Š~Ù2´;®—"¢¾Ý\Ü/dX-ˆ·Zú±"ƒ®>ƒL˜ ñû "„q¤6T!µfÚ"ä™B*Ñ4Bü%RßoFjR#ÚœÎ!B™B„ð_â}MHݲ Õ¿ût<3}œˆç/#®¾}šBD5Eª_GôÙ…ˆ¢8Ͻ„ˆóNjÑzAŠÊ胈özà‘q-ø,âÀ“HEùâÖ „!U 2;þeÜßKª ‹ÀËI'È}AW<ÿðŸRï>‹v!íëˆ߉çÑÆ´÷x4Þ» 8‹$Ú²©´9¾ãkC›ûY´¯Ø‡àÖy[/ÈØànÊl®ü)Äy/#ÄÚ…®–”ƒˆÿ]Äi/"}{![3Ú#øÀªéÞ³1gA4 ‚˜v{Çâþѯ—€'£O3H—?8ÿNà{ÀHÍA}xÏBêÀ7ãy›Q'ãûHÜ;ããæ´â·÷Jïñ½øRü½„Ô”%ÄYKˆêbÖ#õå$R3fÒO!•f<ž÷¡ÔN$®Æµ*¤FµÅg Zðmò$×Öœ9REšGÄÓˆöZ¬ èÌà ´é~!ðBÜׂ¸ÿAdª­F*Ïhô§ŒˆoSô£Âh>œX‹È(Ü Z€ŸGªÃ(âœ67žF\{!]â¹z„˜åx¶éþöÖœFÜô:"€Žø¾qÝ$UŽD›û‘äÙŒpO´7‡ôôäPWüíŽ>#bç½?h¿¢_Ñ!„ü{âžóÑþ‰¸? ¼ÂÍ’àƒÀZÝL>pp;^BHü3¤y³xž´¦4 „m!¹zâø³ñBÎÇT˜Au©5vQØ…Ô¤1„ #¤«'÷#¤CÛ8"Ê_Œ6/ƵÑŸ^„ä­hÏa¸ˆ8¹O¥í¦q4žÿ,BÊêhc î1Æï>0Ûý\äƒC!V)XçÿÒO(® ¢ŒÒn !b¨FOqmm6Çâl^%}õÛ¢ýYRµ¨Fœ·qØRÜw!^W\»|7Ú>„ó"¸šh÷|üµ5jR•^{.")Ó‰Ü+zâ·2"ØÎ¸¯:¾ûí"œÃqÿ8œ›¯UXÓV ÷Ú°ùšuþ“ˆ;7".ûF\kFQ¥7žŸFœú/"ªÒ~DD툛Ca[¢­>ÄáÏ ƒ¬ªxÿ¥hoš$žV$5@›án„Ÿ‹ç_Šk äéðĹwßAfÙ&™¯Dßçš8š‘šÖsщˆrø"òn>R¯Eõ ð^Pü4‰è×Ñ‚QÚ‘¹±„íDúRlRˆ{/"¤¾‚|q뫈sÛô¸©!‹ß{nwE›ÝHbÌ¢C-GŽÙÅy'Ú˜7#®_On¬§Èƒ»vĹ·!Õnsô½µâ÷Ùhk&Ú¹€ˆhmš}6ð’,×X>Ä^-ã%€`/ZÌ„h›R^B {DÂqä›cšŒk'­!O‚¯jÒëˆKÅÿíé¦ã9»@ôNn›Ú†ˆÇ.ѳ¹½ÿØ„èyÒÓójŒãñç""¨F’(í|wífâ¹ò”»¯âþ*’Èl®‹9˜¼Ïëv¿á"€Ês€nÄé—BB˜vD;Âqêãž sÐÊ.¤®Ô!$µir qÐ^„lñ™^@fʤ‹o%Op7#©ó3ˆÃ/Å»êc ãˆ+7 Sé@\?ˆÈ\ßRãyú;F"ícäéö«èlC<ÛÏÚ칄¿5Úòþàéè«ï{aÍÀ­P…ðBØ¥øiâœB»!Ð$‰ñL+ðu„ Ñv}ÜÓ‰ÔšÍñ™#9©9v¨ô&}ääçbuÄoÍhŸðHŒÁ›ÜH*X…Ú†ˆÒ[}ˆË·£´v´G©Fˆ½=ÞWâ¾Áhkˆ4åÖÇXgI¢¯GÒãA+XÓ›àJ0ç¯F§¼c¤]ßÈ*„pÐÂÚɬ!ÅI2ºkqM[l:Iÿ Q¤ m@mMÈýa qÍD(ÿ!´7® ä\;)y¦âû^$=¦Âu#5f#2³Ö#‰0Cz€!.ý"Bð§Ç?÷?sKŒec|ßÏþDÌËR‘ej,Þ³ôƒ(·À#”Ò‹÷Bž]1®Ä}­Ñ#džGøItÚºqh»_@HóNüu K‰Œ×@ˆ~éö ¤^ߌ¶©EßGæÀù„¼Ãd<ðâаy"~ëŒ÷BÈëû1îˆ;ãz_´Ý„ú2韴„ÂŽ|%DØ›cÞ¶~B Uînð×<0Pþÿ€Ù‡Xo¢nGœù»!ìó¿%î;…8z5²ö "Dy!V/ÚC4!Ä;‚Ú/Ä{¿ƒœç6"‡·¦ø>‹Ê‡UÅe>Þ[BDº=žÛ¿m'ãˆÒ¥!ÿ Òž?‡Ô¡–èG‰<å­þ×!5¦Œ¤Ê鱺%úØí8‚ìZŒÁ¨‹ˆÐÖª¹óNð@€]– !QyÚy!Ç’›¶#î8Gúì\ŽÏ~„ ¶ó߈¶}R:‡aÜo[ºÓ—œBHõx<ÓýØ}ëAg¯Å÷3ñ¾#(ÊkÊ´o8ƒvI”݈ ÊdW‹£ý»„ÖÎt£ÈBÕ¿/ļ\@±&úw‰›]²{Èt.ûãûU¬Mñš'€B”v´àޱŠÿGããŒÞžBHö}2dp.~7‚AÈÚ‹8ßB¼„cˆJé½v¦†ø;÷4Äoöá !UG‹¨þ3Ú =ãñßóHb=ƒˆãÍh»ÿ7G†â=#1®ÓߨFÜÓþì>‘-!.æMï8²‡w"ËÍ´?˜‰ëóˆ¶Ä½O’‰hõ­ínÖ·òœOOôk¹yœáfÓb"–Kˆk&]£ß"³:œFúþCñîͤófà‹èìb;ÚÈž'òw’A;°o÷>…ˆâDl? ‰àBîóä~¡©eû‘ÏÓtØÁÝåÖ_ÍÈ«„>LôQ 2îGÈ×…8½M„ûòýâ–!Œ?äË]ºoqï½ñlšè3‚q´g&¹âÇI‹O ߣŻN"$rlñÇû0yÞð2y@µ9ú½=ÆØƒÌ¥;b¼§£í^¤º]~YÕÚBžBO‘¹ŠªÑ^Ç–¢§’oBªNwŒ{ÕD|ýñŽ1†#(wÒ¹hÏþKï6Êì~ÀªP>ÈÄøÞÏ!ïFÜ¿—’Û©ë dû¯CúòvänÐ ü×iqò¤‹‚3;ԋܤ¿Í¹ø8{óeDˆÇInîMã;hƒéì þûiB}!ÚñøÍA5ç£oo"N\‡k!à)D8(naSô"Õ¦3ž?‡ˆx*Æt5~ßD¦wwhc)ú?c$Ov·“Y+æHÿ&§†?AF³•É´,ŽkX«ñ«†îös¯‡دþ$"„h1zãs÷×:1‡T õO"®;€àD,vBÛ†ñÇâ½/""™'÷â»dA'Óˆ0êâÎÙ¿!ÞwtK.Çÿƒ¤‹ÆëmÔ ÂØH&ÃmFªÈóˆ»/Ä{·Ÿ(il§È*5=H‚ü*BðQ’ûï¿#dvi[ÇÌtf£_ýdLó yø¸aÍ€ï«EDà$OÇÐw!äÝ@Šó×aØmØÁ.…ÌîÐ>Õtª'Èê/N{rƒô‚$¾&„ÄV…&I¤žŒwô!©3FªZÇÈàøŽøìŠk?ŽÜ)–Ü(×#Ľ×J½5®ýLüÎ?†ÎVx|¼p*c ã}§ÈÜH›â½Î’Gô{1 {ʶY¦ÇÉ”.1ÇkÕAnUÀûåôt…•݈K]ŽßOæ@¬8O¦oG?Gâ¹'â~»4ìDˆíû¯‘ºív$M|Ê»)~ÿ©¸·!|C´yqೈËÚ¦~ 1Dˆsqã7£ÍÁßY2ÊàÏ‘éòµx‰ü ©¦¹VÙO=scÐÚ ÃРˆmŽ4eº “™‚ƒ~Fî¡f+Ó^´_±UÊ1Ñ×B|Dx?äMz7âLudeEW^œ#sü´ ñÞ‡²·}-°ù¿TÓ‹ÒÙ§‘ªtš,9däð¾Àúõ<É1m]2w|Yƒ@Hv!NO¼»Ÿ²Àö‘xï–_W\{’ƒå·#n| í¡·ëŸY‚·®HÂ,! 0sáý„3Ü•HIv¼O¤¯VÌË`¼×ge²&™s­Åðš"€ò4ÓÊq¬³é@bÏÎ×òÙ–?ƒrG<!½ƒè'2/Åçx%^D„ù i’ÜŠ¾Eb@® vÕ°šáÌ®+¼…t[°o‘ã†{q|‚$‡9îŒþü㈺ˆbF*ÛQ„ÜÈt+ÎýRÞˆþ:yزüÒñxÞ6CäéúZ4Â#B[UǬ%²ÈÐÂ#ñ[ ïú(Zx[v^&->ýˆÓ‰vG’ÅªŠ«>N‘,Æa\B_û猑Õ\Ž"nù0iG߀ˆ×›ÇnÒ¶>‹¸ö+¤ÓTŒ÷»ˆ]ÇØéΛ‘´rêFÇ7ô‘‰kâÙD 31OW|Ÿ¬Yæ8—µúÙ‡öo‘•&}Ú¼Ö`M@#Bo[B  Éß¿YïvÜí1TÛùs^C ÜJ–êD\Ô™Þ,îÏÅÿ-ñ§G™Eì“ÚÚøý ²t".ê‚'Ñ~â"Û;}c™!‰±õG_¶E[Ç‘DŠÏpô»<Ý>‡øL¼ãóñûp¼ÿ‘˜Ã£d&»CdNÔaÄ’cöŒŠëÕ¤'låùÈqŠs€eKûÇøDø[d ô&2Ýá,Z8— Gœßù0ÇIßšz´€5dpû4ÕˆÚíbs»‘MÜÅõ^~'Þi¤:‹ÕéR1vŠôNýBä#H¸úËV´ùK2¦×ªK Å$¿AZmÆ»!3LWºu,ÆÿŸA§Ñ 1o[ãgzpJÄyDàÎCZiªý ¹É§ €e@ ²^Ì I?H–!F dN¶t9Þ­ "UeÕæxS.!Ä=ˆÈ•ïB?DRáâ°G¢/›£¯vëAêÂv²ü‘è¤Oþ\ÜûêaËbFiUÞžñüÛHš¸Ìë—*÷(™`ë"À1Gv^[BêƒïÏ‘…¾OÅ{fÉ[ÔêÐ^ÂUv&‘dqöìJXí±À†5G•N;Ѥ[2ôÄÿÛ^:‚¸SBÆ“hÉŠŽ½ÑÞXü¿ÜÔ^ˆö\@ïçøDù%¤þL"$B„7„f>þw:–G²MG_>‹T§ÚàßÏfý®O¾¨{|&p„ôDŒ÷>ýôIïO#‚ ]CjI?ž‘è›Ù°9æ·5úù3H²Ù=úT\÷¦ÛV¶.Ä6#â[àGÍ¡«Ö8&õ™ø~-x Zl—ùqѺàï¢ÅrŒË-Å=G"F*Á„ä]ˆØìr`ûù#kÒ¿BHÿzØ‚6†Ž&;‰Ô¤×g"OŠ{’íþlVý¶¯Ò8Ê×ÓCÖ1û „\[‚Æ»¼!‡¬(ÿñè÷fDdgÉÄ£ñü“î%N¹2¤ëÛd]³+ˆØ–bL>Ͷ¿T/7üíÖ­t¿­¬)°?ýç§Ú„¸»S¢Œ Å.!‰àÝäÚà,u(=Êçãš¹o+Zx‡úM"$íŒç^Fú³Ã¯#Dû"®´™uªr[núÉè©ëˆ 6E_›âó R¹š"W†TN LÐgcL!Îü0YgàT\ûVŒßÒâ3Èl;BäÏ“vûÉË$‘Úã·Ý¹¯›Þ—Ð~ŧ¿Þ(Ÿbmæ ]3YŒúa‘Æ'®Ž{ž$ˈú@ê*™â£ -”7p=H½FœÝ…2œÒÐy‚–H™‡ÐÑ4BZï#\øÂRSäIê¹ø}s´;€¸ïÙxg™CBçÑ¢o'+ª_'‰äTüÞÑAã>røËh/!.×C®Ÿ"él‰y©&&Âs¬¶lþ„¬ÙB¶›"æFcLN›ø’NE_\ÖÈ¦Ý q½:ú²I —v]B\"ãö’•sœÒó0}Ý}:ý«Šë§ã9—[#%°z ±6ÃV5ܪ':{Â^2­ø(¹)kFÈj~çÑt”Ø&ò@ÇU_ÕŒ©'î !Á²â˜ûv"Õ`!ã6„ •©Ú]àbqðDh}¤Û°£»\wÌ&“›¢Ÿ.þQý˜ˆþ>…ÐRä*’ ç£ ÇMï Ï!j¤XDRd$ÆÔHÖ ¶™Ó{©y2œ³ÌÃT¿ Æ|ß)CÜj‡Uí q» C¦G'µ³˜Ã#/ n:G&™í­¸æ] ™9®!ÜR:‘*ué¼¶2u#w1Râø\`!âõxÿ‹QüÞcQ:ÒœˆwO‘›ío£dëïñÜeDD7Á½ƒ$ÀÁÃDxçÁ»ž±íø¹ÕgöO:ޏþ™˜“cÜTŽñý_Û4÷µ¤ÛˆÏ4ºY›>@†U-îÔájòðÆvsKZøM!u¥!ÃÃd¼À¹Y} ©#öª,!Iãôë£ñ¹ˆj!àIòpn/BžHó©Ó¥8ÃÃÄE›Òïg¸kšô÷¹HªgÏ"¢r& oÐÍåÙy:úç‚ Ñ¿ADÕÑARäO‘EÈuÎ’E4Ð&|ÃlÖ$è@D¸•Dü[ÏÖ¬9pO»-O“ÙΦÐ" „ØŒtú#‘k¢½8µS“WÇ3²>EƼ6’©ÇÐ/’ÕÚëRÏ“×Lúñm˜ MöY”—ßõÀQŽQ¿çòœ`!b5’z¢×È‚ o#î½-ž@Èîƒ,b¬‘‘mÏ" ä‚Ú{*úþ "вÐö;¤Jd—ûD]#ͬkVµ t'X$ká:€ÜÛœb乸É`•V¤Þ¸ÐÃE¤Îü"Zô·Ñ‚Î’.ÍÏÄDD*U 7#£3@8¤ÑYäÚH‚<„s6ÚwF‰ÆóÎÆ6mm' Rô‘u¼&ñøäº7Æ=BÆÛÔÛsðãÈ4êw¸*Ž÷*ÿ!úº›Ü(Ï!‚í$ÝLÜçÖ˜‹DH‹¬»þ…5' .tƒÌáiŸyû¾ #›"Ï œöyòµ-²}‡z£Ý“H­y ÙÒ'ÿj´áùsˆH S%6ƽõáªÈL³IÒfÊ¥Çk¤Õªe©{÷28¥„¤ABNŸÔúÄúDXÞïÌ"buué‚=‰ˆì ™¢q<Û×÷ÆÇ‘ºs.ÚptYB¶ËdA «3ÒoEj’Ëúà­Ts."N½ mBkâ=Ç;·A8;¢O&PÒŸ6ÞŠ1ºNBéÇÓAî-0%Ʋq|Gzm{=LšY!ƒãçHÏÒµ «‚>Œø\@çº`ÛHŸÈ“ÉkˆÃ:;sZØG⺀޳ÈÞnd¼­ÉN!ÙNfŒ¾„ŠÕ9ZëbÅ3O")â²"¢2׬!ãj«A;Ú~‡ë’' mØõÙû³;gè(Bô‹dÞ£HZ| u’/Ž"Iwí“"Bôøqº>Þõ"ÊÛù­X³à“ÙO’e2ùÕn„È6E:Qî~dùI²ãf²beþQ¼M‘‡>Óy7#$هŽs5dÊ“áøë´Š>¿pfhŸæî‹¾^A’d/"¾¤¿¿cžGÑbgü ù&½Ow ü2Påq²zæBÜ_ãiGDÝJ©“Œ]"]#œd×Érߎþ¬Å`Ú"€ÊûêɬmhÑŽ#ýý-2ÉÓZ臑¤¨Šû§I·ƒ*Ò«ÑÔ&¾qòÌ)K®’Þ¯‘&Ó!2'édÅs½Ñ×—£¿Ñö BD‡f‚u3ª/p XýG„„ÿ†$žIÄ•{ñ·Dÿ,Ñv"ÞþR÷|÷Eòí|<ï}Ê"BŒ—H‚,“þAæú¯°¶kÀ&€Ed½9@ZB6 ýq´¨6QZy!‡cŠÚc!ïMmFˆîÈ©¶èÃ÷šó$âž¾Çɰœ‘n:î·Ä;¤Ùó“HzG|#ú¾©X%r¯ó6"öĵË1Fg¼{ ©5SñŒÝ›[¢mÏÛRôñh´w1þÚÅäoÈè³µ k–@H°„TÇÑÚFîð>§RtÁ‡ˆKö‘IÎÝŽ©ƒŒÜzqí12ql7R þ’Ü|e`0‚CRáI„XçQ!dÚIf¢¶“S¾W#ä~ž4ÏFýÙè—O”7‘ñÃב›ÃÙËgɬw'Ð>Å)YžDxŒ,°·1Úœ kÏŸmm‹ñbíš>+aUÀÝÀˆÄO/X éÔUéÀUéù(’ öíBÖ#¨èÝNàÏÈÔ } >‰tv« Ÿ#]Î"ŽêÄ·dJ–~2šËÁ÷Î8Wƒ½©çW¾Ï›‹Æ=]ˆðZ¢­ñé%-FÎ8Q"C*÷GßkÉÌÕÓè”zqz{…NƵ 1vç'­‹ö¿Afо×ëy¿aÍ@mnŸC‹6„°qÞK$‚½ŠDü0B[‹6}¥,öð*™×ç;düðÉŠ¿NÂ5‹«žtFs(âÑhûM„Ô}qÿÕèã5RJ}äâ~[š^ˆ~8v"Êa²2½Ã-]uærŒýb,Nôu8Úx.ÆîÌÔ ¤cßÒÜëðÐ2ÚÎ1Ï‚úkˆÞ É´$ÑB6!µ£©%„¨æ°Ë€cƒÏ“YžßÛIui!Ã+dö‰+ÑÞ/ ý¼!O-™þ¼ä¸oĵ¤‚¹´êj£ÿõ$'>ƒö›HÄŸCªŸÃ7·k×fG‡Õ‘)GHµ±Á’dbžö)QêHWñ1´Ùþi‚ÕÃÉ?,<Z°>2ÉëI–+*‘QnoGçȃ«Ë(ãòÍ7F›ñ=…Õ÷Cˆ+S¯_$³ÃíŒëÞË|'úð™[s<ã¤aÍH‚|Ÿ» |YMAï﫞>Ô#¤˜Aðk éúd]Þ²ÆÀö¸þ8YüúÅøûâ¸ýH:l"3Lœ!óv.éÎ]ªÉfÚID$#NÚG&§u:÷gã]/“‡g>Cøëˆ0]ÏÀ)[Hu°›´þØDkߣ2­›”’öruÙ£Z2Ñ÷I+ÜÁKwñ}5ÁA%Ò Â”݈;úä·I€~$ Êd]àù¸ß‡ZÇÈjìûÑ^ © O B"~¿ïŽg]W`œÌ7d×ÐÆ²šŒµ=Ô%'ãrtÛ+äÃ'µ>£°ÇëcñÜp8ú8:(²Ú0ŠN{g£$5šÈøâ2¿¦K‘ÞŸŠy’tö&u7yý4RS^Bk§Ctì–CC¼ÿ8’uÈ,{%úéÔ‡Ûãžmäa˜O¶}úí0P'ÿ½†ö £1~§…qâÝÕÆÍ? ûúÑ]‰f-ÀÜ kžÞ‹ó8yÖ Úü õ}/ìY2ÆÕY¼Èöô¡‘ó÷ŠŒ"óf¹!Ô6¤¶t›îãÑl}r¯áLÜoSi+é"Ñ‚ã@ôÕg H%j$7»Sˆè¯ÄoÇHb#Ò*ínÄoˆøêPÔ˜ óNˆ¾V9þ­°æ àýÀvþ62aÔ B†ëdàLB¢¤Ãû°é8é^0ü|ÿw!iÖFÆ;ðÝêãnI¸A„0Cž:ßOµgµ Þš‘nå@Kd!hçÒAH;BºìA'HnÚ‰¦!X âÐÎHÝHÆœEHÙHV±qpÌatì¨0g¢èER¦žLDÛÏÜ@a„ôú´;³Ï#Žq8~`7),5lóßsð$œy{½ÁO•PÉu†È\Aγc+ŽÝ•CÈ׈8:éId³=ÜîûÉpÁd­`W´d1ú `˜ÌÂfOÕR‰FI¥Û³Ãß"Bv›s]£©H®òèô0 ñþkHíáæ<¢ë V‹$Z1¨þtæNõ,BªY2ñÖY6Ô¥…H$µþÿN¥«â÷ÒÞ‡e͈붒ì¢}ç‘Äè%}qº¢>ŠÔgŽ«#7ãNxõ™rIç=GR£ŸŒƒu¸¸ÖÜiÀ·†í•ïp½„Òž¶Ò¸ˆ÷™ÍÁ1ÊõdL®Þ|ˆ¶9þº‚S­8OÏ:؆öÎæìòÚ3,Vôo]-èG„b¾ÞîôL#âðMˆs;3ƒMš6qâ®IDWIS'Ç‚ ãt¾íÑÞ8™}”L©~+·/â-àG¡˜›{µdŒìÒî^ƒºqòëH%²«³ý|êI§=Ç-÷¸ú¥+5Ú$z;x?ßýb¡Ö=T"Ó­™ îV ¼â¹ ]5âæ®·åt-‹ñÝÑ].²7ÁÛ«¬û…ü°îçíý"ÊîEûå;ü­|LJYˆu¿x÷Š9¼–[]x¿ ö±NðÑ¡˜ã€:éË}ÿz†uí ±Zàý"Ý d^>(˜Å‚b±î=sZÀº†B*`]CA¬k( €u °®¡ €5-½‰n TÀº†B°®¡ €Ö5PÀº†‚ X×P@ë (`]CA¬k( €u °®¡ €Ö5PÀº†‚ X×P@ë (`]CA¬k( €u °®¡ €Ö5PÀº†‚ xààÿð)—Ëï~þðÿðŽ÷PÀår™ÎÎNJ¥Ò»ŸÆÆFÊåÛç~(²BðÀ@¹\¦T*} ë…(à€JäþÚ×¾vÛ{J¥ÒH‚‚ ¸k¸“q·×ï466~°qŸçóÄO”¿úÕ¯–r¹\.Ÿ={öÝïwº§òùÑÑÑw¿ÏÌÌÜtÍ÷~ík_+ÿ‡ÿðÊ@ù×ý×ß½æëôGTþÆ7¾qÓ3_ýêWËO>ùäm¯¿þúëï¾£²ír¹ünfgg¤¯·ëÛ­ÿ—Ëåò÷¿ÿý›þ¿åÙüçŸþÓZÊ¿õ[¿õîw~îç~®üÜsÏ•ÿøÿ¸üK¿ôK÷|á¾ô¥/½Û¾kll,ÿ‹ñ/ÊÀ\»õ·/}éK7]só7óÝþû¾ßüÍß,ÿöoÿöŠ#ër| _ûÚ×ÊGŽy÷÷/ùËåçž{î=ïÙ´iÓmèNHVùÛ¿øÅÛ^ë­·Ê_ûÚ×n"÷BÜ;!ñÝÞûå/ùÝÿ¿øÅ/¾;¾»"€‰‰‰r¹\.ÿÖoýÖ»ß}íþàÊŸþô§ËüÇ\¾víZùܹs÷lѾöµ¯•wÛ¯¼öÿñ?¾ã5ÿæç+?·öñþà~ä¾þÏÿùŠ#ì½þ¼ð å/}éK7­Ý7nZüÛÝs7ˆy§û÷w÷=¯—Ëåòßù;§ü /,;øïÈÈHù³Ÿýl¹\.—:ô^ï[ùE+>Åçn>wCŸùÌgÊ@yÇŽwÛÆÊ¬øŸ÷ú|úÓŸ.OOO$yë+?ÀâS|îÕ§\.¿»Á÷çŸü“rGâ(Ì ì\?HB»€µ…x€àN¹mîç»?Êû×í@bÆÍ@W|ŸŠO'búÕñLbسˆ¹Ï#†=÷ÏÔ»€·â·` ØŒÅ÷êŠk ñ}X¨¸Ö„ÊÛñœ…ÊžÈ áPÀrC! ¸ î§}’a×{€MHS¯Fú,Ò¾«£?KHCŸGZzbêÍÀ`´ÕŽ˜ýbÚ7Ãn6Z€¶¸§×ͬ[£_ÛÑb1óóñ· ¸}hˆç&‘0ò»@¨!ú7mŸ®"Áñ~„÷ æƒ>¾µÅ:ð#ðQµù[‘ª ø8b€cˆÉ/û€+@}üoSË4bøCñl72ÝÌçâ¾:ÄH;¢½³À`8ž=÷Õ{‘€AšýiÎí&£ýñ¸>}Yˆöw/—ãý£ýYRÀÌ !A´Ù¿—b ñûtü¶ÏŽ!Výþ s¿ÚÌ~¬ (@w YjÃë@öw›iÌ8G⾃H›^gâÚN¤u#m¼ œˆ¿ ˆ‰NÅ;ºÐîa™æâ÷:à:b¨ƒH0x71‡v =hÇp%þÔÅ}b,µh×±!î¹ÿ7"&Þ…v—‘i‹wLF[Kñwždü5Ñî[*ÆÕ}^XéE/à†Bp[ø e 1ÒzĈ}Û„¨ÿbzÅ3uˆY¾ÏU#¿+ž?ƒ`+b¸õˆ±ö"&9Œ"ñĘ‘F>˜k#b¾Ûã¹sˆÙ®'£/=qÏHôÅ;ˆê¸v„<ØvS¤é¨*ƺý¶™j.~›Œö[ƒ/Å=Hå¸>óê߉÷^ŒßÆHW|(À:[mû·cðï‡ -ˆQÖ!Íü!Ää«ÓÚˆ4n{ÓÌ¡@#Ò²M}iþsˆ6"͹1ÐíHû@LÚL¼–<ì½÷ß@Ìö:ð(çâÿÏÆxê6 bÄcѯ‹Ñf5bô“䎠-ž}!Æ}6ú°#Þw€4³ã¨GÂÅg oG{‹ñ®óÑö^àtÌßTEæãÞ™h¯íf&¢31×cÎìýtëZD]ÀÝ@+ëî¤Í-¿ x™@êãõÁgµ6»lELq*~›@ m1FHÛÿ"bÞ—ƒì Í-[ãÝ#È4ïi%=~z‘Yç,Ò컢o€'Ñì+èp·1ž=Žrgôg.úæƒÝq$0v f=7F¿®"¦\ﯯȬs:Ú˜vÇ<ÔÄsžÇ±èÇùxn8ŒvAõñ鈶Çãž«¤{êu$0縻AAø@,|Ô@%›hº3nC ¬ž´}Ï"&Û¿u MÛ^/SH›¯BÚíb’>µ†{iáÛÐîÀZíFćI¸×î˜J"÷DÇ‘ùi ®3Ñ·Öh÷tÌÉÎÛ|ŒãSѾíûã1¦AÒ µ …ëq?Ú¢d Í ñÛæèw 𗤠ͦ¡yRMDmñ[ ‘s¤»êBEÿêãïå˜W>ÄÚ°~ ëîf‘½¨C f?bþ³ˆÁ4 &ÞJzíL’þõÛcî'TCÌÒŸ1ÐÞx¦»¢ýtܼýjŒ¿¥èÏ"Ò¬/D,4ªÐ  –zRø8@lgŒg/²ý—Ñn¡™hœk 6Äðç£Ï¶ëoŽëWH¯¦)òP· í.ï ¢–x×DÌÃãÑÇ&òð»;þÚ¡Xûuw²÷{ñë‘V¼™Z|°Ù÷·¹‹ˆáµ#fæÃÞFÄØ¯G SM{<7Ÿ$`úã÷nĸþ1³¶x¦9úvƒ&cñ®ú¸> #Ý.«‘`Ašvå®Äç—bÜs¤ (!ÔCÆ$LÇ»<ög*Æú:i³ßí^Œgºão@Áe‹ä!±cÚ¢ÝÃH8ÌTŒy„4'µ ÊøýPÜ÷N¼ËóâhçêxWg¼c$Ú.ŵHX.Þ‚wm}7÷°ö kîµwbr;Óï%#n'É`*Šãæƒã:Äh‡‘½Ý6oŸlûf£BŒr bLç3¬#ÏÃ*! Ùf“Ñx¦ ¦dŒ@'2¥ØeòbôMè@¸'®ÕÄßêø  „9RÈŽû&ãÝý9sÕ‚ôDôc bÌÓˆ©×!ÆßCF£3†’Á{žfã-Hû?ƒýlGÌŸ…k2CHˆ~œ |»÷~±âž+1g>€®wxÎ_#Ïj ·Ã¯"ùÁ†B¬R¸Ú×íÎê‘&ÙßP:€ì 9G™dÂp^œGIÆ÷íxfiÿOE;Öx߉wì%ýð{3ª<ð¬'ýæ­…×#& 1m÷};bxÖfm÷Š÷L’6ó%$DÆI¡p-ÞÛŠ4õER+o1_AšbØÏƼœ‹û¼S²ðšGÂagô·)ƾ;æw /fDŒÝù†l^²ÙÉço!Áàù¨Ž>ŽñÙ kg¼ãõãXïÙ=é>:ï­>9UFeÌÁ­»Åƒ Ás «îE)ÄÄ º#³}y þàM$šVü·ˆm%™“ŸuÄóÇɧEà Ĩ/ÇýŸ@ÌìÄìþ™R¶ äç|žp6ÞUF^;Àr›#ÑŸCÀ«ÑŸ«ˆñFõ^Ĥ!mØžI=ˆQŽ#†èèÜr´k¡5…ÔtŒo2yuG?j£mñiN‘))ªèy®‰woïm1ÖKˆáÚ”ÖˆH'¹;¹BzU!:¸ãù8ðWäAô4¹;óy‰ÇdÖvR0WŒáR¬E¹âo%ÞÝ/fQ0ÿû…XÃð^ÉßlãïEd'bÜ‹H} 1~ÛÅç³™B¦f¤n'3cÚç½i§ ¬`æ€IDATˆá92·&>cq_gü1Ù†xÖÞ6öhÙïÚ}>Š„Q_ü?÷"V…¾S1œ'½xJˆ™Ýˆÿ›ãÚX¼Çq fvKd`Ú\ôÁ‡Ñë@Ly²âšç¡òฌ„ÑtÅøþ•b ]ˆW!­ÿðùhçøUí Æýï©*vÇ=ãäaõþèÛx¦!æ|‰ÌpZd¥ëéò¬ÅÑÎÓÀKñÝÉìnůå‚ÕVûùA‡jàŸ­t' xx¿JU·š{ê3ø$b Þò’‰Õºº 1þ Ò%³—̤9CFän@Ìey¸ÚaôW½ˆyÌ FØG ¤çFï>TG{“H£ŸkgãùãÑ7 ¨KhÇâÜ9Í1Æ‹À³{,Ú4ó·I¤i½>AŒ¾}ùp¶ Å 8ÕÄËÑ'k&½šÁhvõí©˜·+äÙÈ$TìÁTй:J_@§-Æ3íwEÿÚãýM1ö2i]}Ü3÷uG[í1wö¢š‹~ûººb¼ŸA¦0 »Åà …ö¡«¬ÉÃ߭תSød~i"5fß7ƒ˜×uÄlíÏÞ÷õ“¿3uv"­Ó³ qocümG‚å|¼¯iÛãñŽÙhß.ŽÏÇs}äÁ§ž5Õ©èg}ôy#iŠª‰wwE_£ÝÀ/“ÂW¢›K6GuñÌtf±ˆlá6µ ‘t©b¾¶Ä8Û£ß%$ˆÎFŸ¶‘º6Á,B•˜ß1/o‡Þ—ÑnÁQÉŽ{ØDšì6Dû'‘¾÷9;é éŠÛ€4y»év sî‘‘Ío’©%FÉÃðƒd ç/º.Þ+(JrÞ_(À B%ÿ°Ïƒˆ·imŸCŒÇö}Û¦Û£ð¡ãɸ6‹[/é¿¿1œÄXæ~1ð3ˆ‘Þ@&â÷íÈN~6®µDÛIMû¶?„ÌñîÍÑ—Gr`ˆÅoS|6ú;H •EÄÌ–󻎴ÈOqs Y[<ׄ„ÓNïAŒýb–³Ñ®º†bÆâú2Î`iFór e,D?ÎE;¢Í‡ãù'¢o'cÌ6Éœ‹g“)"|-æpsÌïuÒ•u"ðasŒñH[ÈZ ÛI×Ý}茢1ÿÞƒ…ßSÑžÕ­™×’»ƒ{͸ Ap 8XAø(\ªS­ELñR›lAŒ®†dZíqÿ4y˜8…ˆ~4þßÏÔG;Àª"# ì br;Ñ¡1ä݈Y]BŒÄ±ã™FLu‰Œ~mŒ÷"ÍØ;çðé#™cªÓ#w ƒd0ØdÌÁl´½Ùɇ‘§Ì–h§DF÷#l—Ó³ñ\5r›¬‰k3h·³¹^ÎÇ|œŽ±Ì#æìäp“1ç³äa°èdÌÛáh{™‚€Ÿ@BàtÌ“χsß÷½ó~&ú»+ƾ€vódª Ÿ\G;g.½ˆÁÕX—³ûbަOÞˆï΃T$¤[ÛPìV|ÐÌ›öãoDÚmb*çÈ4Èά b U¤¶ŠÌ)c|S¼¿‘ô­oˆûjÑ¿Ž›Í9>;°½]'›â»^wüÿ6bÛ‘P°Ûe?©éöÆÿ7¢/›ã¾Þè«Ï̼çã}I/š$€Úb {É<ÞøLa eù¼€ÎÆI¯#?1Õ=ÑŸqìDÚüU$t6"FÛIf*µæ¼•¬0MzTÕ“9ŒúÉ3”'ѹC'ð³qÏ ñüO¢CÚÑhgg´?Oš›Ü§‘C'™Ÿ©:î÷í&3µÚS¨>ú9ãrų-1v[õ:¬%Xký]N(À*€»EH›Œ|Ðø«ˆ¨M´fKˆ19g+yè„dCÈíÀ&ÛØ!ÓØV>HÚ¯“™)¨1ÎÄ<÷#†³‰¬Ô5¿µÄg1r'/sdk y8í@§ƒñÞóa'“³'Ï:nIâúãm!½`Ž FÖŠùnÒ¯~:Ú܃˜§£l ·¿_&#i#³Íž˜“—¢Ÿ s\¾Üœ®â`ôi)æë:2¯•£ÏÇøPùL¬w/bÂÎ êÐ2}]Ž9‰õt»ÒDWë0‹ʧc^œo3©,^wFß꣟‡bœäîƒâr« °Š¡òÀÍŒ¿ùÒ†tGlE hivöyw “‹ŒÜ@ âE¤å’³Ig´µ‹tI<ß?AšXÚÈý91ÚD|ŽÆõÎøŒ!à"íöRê@þû ¤@óaêQÄÀv Fè _—‘`›kãdä¯ÍNMñÎÝñ®öxÞ êìuäƒÜÎãáè_)~_B»‰³¤)Å»­!Äp'ã½}ðz ÅÚ¹Nñ^Ä8÷!à4Ùöø±”w9ÞñÕÇÜÖ#ðlÜë´Ò-ñÛv2mö@´áB=f×b 7 SÝ$bú×â™ÝHÀuÆz5WÌ—˜C‚Ù±¬-(Ζ>ª[›M>õˆY|Ýóv>®UGŸÛÉ’—ÎõoÚH½F±5’gÞ¿‰£‡¯Ç\kä «c·‘é¬gã¯]K¯Ä÷ U±6®É0G*''‘Àrñ›÷Ã÷‚ñ¬(v«LT>èmFŒà³ˆ¨+M#.ƒh­° 1 —ÓW69ÍeòÐ×µtIZFDm Òv¼ïsfP»Tv &ã2ŒG¢ŸöŠqP–+w"&s.Þ〲®ŠïûcëŠ{ÆH[uY¤Æ™BƒµY§í*ìÊèÔÎUcZŠ~, CÎ1ÄTO#Æ>Ž˜ÞdžñA© ÁØEÓ¾1Öļb¡i䮼'úoÍÜýr€¡xÇ[¤ šBLx™yÔÀ®kp Ô*RèÛlØOzv-"åÁf¸%²:ÚѸo7Î4º#æ³.úp#æÐ± ×)ÊX®%(À*33æfÄè?ÏuDˆ¥ø¿L2Ö˜j-b[Á÷Çÿ%²€J/i6€ ür5,›Fs³Yä:b6d”q3b`C$ƒêBîNÐA¦8A¦ÞCF»ØH8M#fxÙ×ûI†YéÒÚ÷‘õæè³ƒÞzÉÈYÏ_¥Ð*“‡šÛÝýÉø>÷Ö“;›’TÖãmˆÿ-縹ä£çx4¾¿ï8ëÐ÷Æ\{.“à8‰1òœåir›F‡í-d0Þ$y¾ƒÜ¹ž±£}T×@fI=Iz•݈y÷š9µµÏlª£?ƒd}†V7`À­¶~Tß <€=w\4¤Úp\ÛPqÝue‡ÁÚ·ÛƉÝú3¶Yi4ž™G y;"ô)²H‰=IJäanbh>®Šç!†þz\s€Ò.Ä´ž÷EûÃdÚ{¨85rw|š*Æ:…èAÒS¨ ŒM1ÆòÚ&#[9J‡]й)“y†Ê1>WÛÿ?Š4óFÒœôZüE Ó.¹‡H“¤9j Å€„õ Ú!”¢ý dŸwð¡:1—»â=®(6×ÁÔõçÉ€º^r—·9Æe$Ïy3bø®{°c'Ú©X‹Vr§´ «mh—4@!V3`•€ym—Þ‚‚ºœÒ¹Z@„çˆQ›‰|PWBîƒ[¡~虢`j"ìSÑnI°Ñòbªõ¤éf0þ?Mº"ÚϽø.™PmW<·4é~1îuÚ†Ó°5¾ŸŒ÷^DZ~é?9Æë”Êoæ*kÆÓ$ó=ϾHÖ)ž$½•º¢­1$ø£CÎÑhk'¾ÎÍÓc¼\ñÎÍdÖM{]Í’µ†ß@‚oi†s-äÊ2—§‘¶þ2¯_¼g{¬É#À×ÉxçTr]›šNÆ=ñ‹¹ðáp+™êÃ…y£Íi2•ö©À«+h·ãÌ¢€³pw¤WI×Ó[“˰: «Ìü½ ïBÑ—ÓˆX¯#­Ê®ã¤Ø~ØUˆ!9Xk1µs¤ÇÆ)Äàœ§Œ§ýÿ]Mª/þß„˜Ê$é1ôqćlôÖl»ÐŽãT¼7 Ñf)úáTΧ+Æ;JÚùî`_Œýéh¯™´óWzôÌf”#¤ÝÚ)2jâ]#ñÛ¥Š9ª‰ö<ç6Á8›i+©íïÏE'HóÉÙxgòà9Šâ2ç ǽƒHˆœ#]JGÈšG=1''ÈZÂÞ5~;ž·ù¨ôø¹ï9Cæ rðØ Ú­¸pýYy̵Z¹¹¶óCä™Ä 7×”(`u@!VlòqNZ2Íó×Ì!fûò¯_$¬áÿ-¤¿}™tç>¿íEŒ÷:b* ˆø›ÑÎ`ø0"ö!Ä&6ë|þ¯Ä{‹{çc<Ñw– ÅõGflÏïFê‘ùÄZbåÁ¯Ï9QÛQÒÆÜó²%ú×Iž[4" øyòµ“<#piÄŽÑÇé˜Ã‡SÞ@ ¯2¸ë,MÝïóyó$Í#Æí|GNvw0æ÷¼%ú²€Ú¤á¿¸±7Æ;Oz yç2ãÞL穾ù€÷\Œù™Š9m%=Ë6ÅØÆc-ZÈ4N2×Of”u9ËÏ’g³¤m™Œõp‰k:ØU´« °B`"0ó¨Eþ R«·}Ýîž®ÕH¦qpºßŸ"ñ(i¶Oþ‰¸Ï®˜DHCsz>´Ûp’3»~^FÂÃõ€¯Çµ>R“¼m\B Ð;ß¿€´j»šîDÌÉécà3sñîK¤îü5µ¤›âfÄ8ûcL?D v<€¶Mz+Y@¦DyïG ë2ùRô»ŠLׇL ™h.Çg úöt¬©ýí¼m#i^Ûk}€,«Ùï±Ùf/©};G“½£fðwéNŸ­øÚñ/Gœ Ä‚€4åý¬'|ž´ëûPyg\ ϶E;>ó° ›%ã®Å\;ö¤-æé^™‚JŸ><`Àˆk­Ñ5yŸBL|²íÔµˆ¨ÚqÛ\2@øx ¥ °å©ÉÏ’>þ "´wNeýßd·…4)Ù®?NÖ³í"Ï#FÈÈTíYÑÊ=›`òÁÞ).˜âªZ3ˆ±X \@ Ç ÎêâûÛdb8{Î4!E§7îAÞS=ˆÿ1ª%ÄìÉÃpǸ–îåxödÎ¥ÅûúÜã°&oSÌL´·D¤ŸA)²Ç‘?D×q5´ídB¼Íd:ða´ór)ÏAÒt¶ ‘œïv Eo6Æ» øZ$8ín ]ÜêCjwÛ'¹9E‚3ž@Z[OôË‘Ÿ›ÉñŽK¤+¤#CçÙMÖ(#!2ýÜHÆ ¼Xñ~»l:5„DcE?+}ä7!óÓ~´Sy9új¦µ™ÌÙ¿5æêÛÑÏQÄø‘¦#§Ê¸@ Þº˜W§©!‹¬l$¦ë#Û-u[Œy6ú²'Öa?b„›cŽëжÐs±øNÜs>pÃ…tNFßì¡™¬Íµ•ÆÃ1ƒh7±ín…j&‘ö¿ýýà-plN}ý\´÷tƒ1o 3Vm¬Õ¾À¡sѶý; ÞYÁÖ#þ¨p;aPÀûC!îâ˜ù7!"ìC˜M>îÃ4bšN5àÂ&cäv|1"W™:Eúõ;Uó(™ŽØ Ú1þ|Üw 1­Ãѯó$3ñ.c1§ÍqŸí¹#ä²ÓL?AÚŒm{7s„<ÈîA¶nûß× þ¡x‡5F×9p:…“dDp)ÆÒ€4Ýù÷Þ˜§-¸Ž˜pUü~11'D;ýóØGc.gâï3ˆñ¶G{¯ÅïÏ#ÑŸî˜ofw¢»ê˜ëÑ×!2]õÇ£] …­dp•Ï:jðuº…Mq¿³yDÛä9ÄR¬A+¹Ûýx„ l ÜüÅ\ OGúZH9Ðg§PÁ¡ãÈ[©†<(?Fšý\:Óñ#¤k¨]Pï”nù^ƒ÷‡B,7¢˜‰µ!Â>„¯9Þ=„˜ÀXüf›©Û>ÛŒÇæŸkqÝfšÄìN ¦ø4™ïç)X|&`3“µc§KØ×ìo‚šßÆHmy8®=‚´áï FiSÕ Y°½1³®è¯SRØõt–ô^Ú}XŒqW!!v9î«FšíÙ˜ÛyÄÈ^‰±:3féMãz»Þ}ÔÆïó±6T¬ËnÒŸþ?àz½GH“ÏyXosÏ–÷µè›k _öPv×~rg÷P´éº Òßß9›¦éÇç!{cm&5mÛâbÞ.£ó˜îè)Öá ™¦Â¹¤\þ²/î‹víÑTƒêÛüU]¾?æÓ Σ³Î´ÀG‹¨dô•^F…ËéÝA!–S¸íED°cˆpìqa›k?Y³RSrîõADÄ“s5/ —j'«wY“?Kš–Ì”_‰ÿ{iàqßĤ® p;"ÚCÑ׿&Ƕ’”D?œfÚf ›°|è{>úþího$ÞÑCšÆ¢Ý9²Àz=7§ØVñŽGcn7 óÖøß5 ̘'É€2çÔiFBÒ±fÚv!Ýïš‹ùñîêm2cêyrÇdý[¤‡ŒË^Αõ\µk¹Àº±wcö@²ÛêãäîìZE»“)­’Qß¿žë…ù =ëªcöÛ·wÐË1vÇštF?N£ÝšÝC]?øRÜ¿‡ŒŒö|Ûiàr´]GÆQ\%ë ”ù` ûNÚ}Áü?89™îòì!Ï,ÒÐÉâæsÜÌô\d1à:dþhFŒg ÝatÀé"(õˆ!}1WV¸€x'"èdÚ8Š˜º3i~1ŽWÈ2ÅÜ8eóÀGŒßZŸwû‘`*ú÷8ð+mpmLÌé#íþ-¤ ¤‰ øšD÷ÖÄ=MÑ/™™FLæi9[SsFR›a†cœ® i©GI¯¥-èðÔù¶E[ž5¤éTÌÅ+1Æî˜Kü>‰éåh×ç$]ýéE´ƒ±šbŽŠù|•Ì»4‹ÒÏ“‚bŽôåw6ÑwHÁ<cÛA¦î.“ úf¢¿žUÆoo¯GbŽó¾s=}ø4 Js¶ÓÍdQG*úEþ½hÿ:éíö~ôW0¬{ Å `¹v•‰Ýªcì%½…ˆã"\kM½¤;¡ ® “l³M' ƒHãuæÎ¾x×EDПC̺†4§\#sÁ;þ/‘yæ!æW‡´Ü+ñîF²˜Ê"½z„8R¼›4:%w÷ p« ñ^¶ Y|é n×¾YD>ôt°”½{"Ô‘£oùáÇ£ ìè‹wv †}±mDp¯Tô©i›ÎñïˆÓAÄ䈴ˆŠMXγßïöb/YƒÖ©§]½™®Ú¯ƒ œ©t0Ƹ@æÓyŒôé߈…Ï5ûü~ï £PߊßíÃþWñûbŽî¶?DŒÜ>îe$„Ú‘V?O¦G îFŒðñX—óHC¶O?b¤;bÝkãöÄÙHƸg™rº DoÙ[ëZ¬IcŒÇ ß)E ]2íBëx;#\"]I«É?}ˆõ±÷Ò,P^Ð<™Á$SvÔ“ÑÚ5qMz® a§‚BÜ_(@Àrùé­m¶#¢²Æjy޽iv"aÑ@2ÁNÄp›±´“®vÓH“n#3MZó:ˆÜÊ kO¡Ch{LÑà ¢.:ãÁ¾x÷¥¸Ç¹ˆx¶-¾O¦ —wœBBmg<ã(d§X íÈ F·1VÄèíŠ9†˜Ÿs Å»ŸŒ1[£÷!·…eijs-bÏG)ú¸€´ä>2Zb®f¸¾w„¬Œµ„„³›ž"3–^ˆ{§+Öm)ÚØGæÔ¹ŠnUÜãHëθoKÌófrgé6çÿ÷¼vŒÝÚÿc16‹„±ws3Ñׄp: §»€LÝQé<àΉèÓ•èÇÑ'+ >s˜$SL;6 Ì?(à£A!Jïóÿ‡iÏ.ŸÖ~êI_oÛƒíR…s‚ÌÕs‚Ôí[?Eš‰n ­°Lþuùm7#­þ-Òî?´Ô+ˆxúù8"À½¤‹™L?bè[Q Úifz ™–¶’Úi-™ª Lº?v1›Iè1Äx\jŽ,MYU±SHãte,»•BšªÑާ=úã¤evcü\|_ «dU¦†nD‚p1¬Cdr¾KhwæÚ»žÃ¤ÛçÕèŸßœ ‡¨.¹)Öõ2Ú%tÅØ‡Èš N)as×S1¶½ÀçöÁ'vÃPßÕKZ#ÇvØ7ß.¦§ãûg£¯—I¥ dÚë­äá¶nΣ9þ3Ãw È(é¡d¦^&KlÎÇX§ã¹Òµy[´é— ®›÷ PºËß>H{NîæŒ•v­L¿¼ 1ÃÄ .ƽNÉÜIúðWÅ3$ÓpþõsñÿÞ¸Ï~õÓd¾ûzpvÜ.D¼‹dzå1ÄPö“¦†ÞøþZ¼»ŸÌ%™tf#qe0'r³¶}2Þå S@{ 1‰I2Ï´ì‹î‚36KYPnŠq=}GŒ÷»ñ×å /Çü8ãç\<ï ¥ž˜ëï“YIšÜeØd:³7ÕĘx¶+úvœ<»™!w[¢½62³§ÓM8I³l¶D¿ž~ág¡¥yaè2ôî€ [ oœ»¤5™'ë6[PnŒv÷Æ2ºø5ÒsŇ¢>|ÛGnÑÏF{È,˜&>Øv“©««ÉbðUd=ŸuÇ÷d2·ñ¾ÓH¸lFŒx >ÓÀ?ê…ªI1Ÿ§âžYò<¡6ƾ5úh ô]¤æ}Ln׋˜fcü?ã%´FðÁdŠÐ=ýxŽ<³é%½¬¾N ‹)2ujÛclS±.£9†ƒ¼[³PAÚùÚ‰¸ŸÃdÆÐÖ·w{6=9Ô!ò¹6>—‘ÿþkÑ·oÇ;"‹Á¸Ö€ËKž‹~ÏÇ8öÇzÛŒÔE¸o'³œn"SpÔ;ÏÙH üw‚»‚á/?`À Ûìçn×½qýd\߈Éþîå¸ÏU©Ì´êɃJû÷!ÆxŒ4ÃØ5óU¤ÍÕ"ó]dJ_G}.DÛö”G,_@Lë5²¾®Ë Zƒ;Kfò´6zž,4îÔ~n1T–±Ýÿb¾ ˆIw#Ó¼>©ù9DBíC g1ÄæèËY2-³+”9¸é$™^Ûæ(§€p“£Ÿíþêsˆ †Úý3S|9úù&x>‡qМýèK1Îf²vðpô¿“t;}1Y›‚.ž¼m™É×!ÓßiĘUlo£$ø/‘ž\3ѱX¿¾˜—çãÙ31^›ól6sç²ÒÑ×ã{{¼{=m/¹3pë*:'ºsâÙv[¶÷˜Ô`ù¡ËÎÎè”ϵˆ!O!· Ã|(hO'ÍrûæCšbœ÷~bÔˆ9ºvðnrë¿ ¿·Üˆy &w 'g&=˜k X 9»¥SüÚUµž<|ž!ý÷»‘)ãSˆi¾C¦0¨è›S];uÅ Ò?¾–dèWâcÆç½Î™´‹<´ü"b‚q}bD®BÖï¼c\ˆ÷=ïŠ5h'w:â}[ȃÖQ’qV#ÁÐköñ˜3ZÙÏÇWR™@B×gœki[´{0¾;Ñ@à† Ì»ÖM@ÄXŸˆë—â7Çš<söPÌ[g¬¥ý6#Æï|Scdd°y#Úíxç[}Û}™F‚Á;•Ëd:{}m¾Æ{\»º8 X^(LkËöów&Å/""ê#M1L‘îr#ˆÐÄm‚pÕ¬YÄ >If¯¼DšÄ=_@ÌÝÏ®x[ɨb×x‡Ì?ˆl²£]ŵèßȱ›ÛÿýY¤©o&KßBÚêfÄ€;Ès‡‡ÙED.#-ÒC›ÉRŠûÉèØÊ\A5ˆÑ:µ€…ÇfÄœž‹9;m•ÈBõÕˆÙ\F6v»Ð:(ÌÕÊ@ñ‹ˆ9—Ю¢)úS‡˜þH¼Ãé-œðì7ç"Z@ÅÕÈlS?×%w—ÉR݃H´ Ý]ż}ÛB–ñŠ5;k4köx¬»Ã,8+pp"ÖãyöÓø{2ÆàÒ™51ç§£odsáš®˜‡šèÇ2šÚ»§ÐþYÙ‹>×*Õ½‡b° pk¢ª&²Ê é‘bï—^Ò®{†¬e{)¤æ\Ï4 Æ6Ô¾ðv©³W‘_C韷“ÚáfÄÔ¾ˆzi¾éAÌÄïÚH¦þò‚™CÌd:øûTôÑY.}^q‰,üâú£Ñv"ö/ Fy º„ÄuÄxv¢D#bŽód>þjÒv ¸&²êY#ɸö‘®´=1wc1­dš„¾¯éËñÛgãÿcñüáh?éùÔIîæº‘à¬'õ6Gÿ¶Åû£p1ncwJó±v—wÙÆ 1– kVë8Jæ9:sᄃSñqU³‹1Ï+úíÃà’W§bÍËdt¹ž³b·çGɬ£ŸâfG‚:²x‘ Î8°Ÿ,mjz*`y Ëö*!FÑŠ´ž«ˆ0¦Ðzýä9A"dëGDr†ÌØ8IÚ‰!‰¾1“%D¤çã÷*àKÈϽ™ŒÄ¼Œ_ö·§}Â&Ó3£‚«˜=Kæ'úêø‹d….ŸC؃æTÌÇéGï¢ñ£16çØw‚³…˜‡£ˆ™;“µÕ‘ÞGc1¾ë1.¯ƒkÌÄõšè‡~yváDu>¨&úgý‰hÓf½Á˜ƒöXãm1îMd¾›2¿M2—swIÈÍ1Nç^:v3­äÎÁÞT®…àÂ6>7raœÉ¸ßf¹Í±Ö}d¤øx¬Ë#däwR@NÆÚþiîÙGž¯œCBÛʃdÊän`0ÆßKž=KFlû|áe2úÙ Ðü— pàÖô´•:wc||8ù9Y…ÒQÀÎã’›³`6U¡„t Œ#ˆÍÔΠLŸ»cø6Y+à"òfÒ[¤3ú»™´‡!b¼ãÙˆ&}€ÝA2¾«äÁrÉXfclN;PŽwž"sÐ\ v™ô†9ÌJ§Cpý„6d~éˆû·#íý™åÒ;¥‹ˆA¹ ™MYÄu·=Kú¡[C}5úåCö«dôð 2'ÿ6$TxåÂ+dq+ÞÝLŸëɃu×8p×~¨‰¾¹²›ë¼PÑŸ¦xï9$t]\g¹d. ³ÛÄd‡Ð9‘ºF‚s õ’Õ¿¶ÆµdÎ#»ô.‘BÍÁ„Ÿ% ùŠn?Fº´.ÆÚ9•ò\¤ýðmÒšŽ>W¦7®&{k\;\1OÞÅ€˜ª“ØÙ_–¬qšŒ²žß>ÏŸ‰±nDL¾›ŒÂ¾Ž„Ý¥x§3¼Î !ጠ£dÝfŸãØ]Õ‡å=d²»mdùÇzÒ 4ýqZéá¸þ4iutz-éIæŠr®QD/?`ÀQÀÎL9‚˜Ý"Bô³ˆ‘Œ#†Ú4ëvRs%Í Ní°‘ôŒ±Ûâ8™öØI»ã×¶Æ;Núbnö˜9J¦“˜&ƒ¢&+ÆQO6“¥$½CpYH ˜^Ä6’Zµãl+o$K:êyK<ן‹djˆ¦è¯kØ“f2úr7]$“êµ!ÆZ"³e.F]d0Í Íz ЦŠy^DÌ|øf÷ÉýÑw®º¨Ms5ñ¬ƒ%²8ÊöxOk\s^žHp_kÝdQ•½d2GïA»œİÞíöƼ4®¨[ÉâïµdIÇ—7å[Šwî&óJUG{Vº£íódDù(7'œ‰ñxÝìv[E¦è¸Aî X^(À2€ÍAu¤è!Ò>êªY[QéÄ&ÒcâC[é.Ò§ßž+nû­øk;«™žóµ,"F°!Þë ¬2í-2¡×ÚæÛDÑ¿ŸGLµ þž‹öž$íÛÛã}Î…?ížFZµ]GÄ` ³ƒL“}0ÆúçÑîN²ÚÙÄ(ö#½„ÌIõÑfuÌãfò }ެÇë$râºÏ<ºÈ’š»*îsúè2¿ÍpŒ¯#úg¯-¤‡ù¶‹;åÅ4b¶=ÈûhiÃw,ÇLàÆ©ñŸ&ó¹ ÜRØ:HÎkµÑ·íˆ™w’磤÷Ô: m!ÚG£_Nÿ½üv)S‘8•÷T|wúíAÒ4f<ó.d€ dÝ…rôËëRƒvˆv`(Ì?Ë…¸‡Pyàm½óá;å‚ó¼»xÉ2eÄD8[ÐvÙ•—œ©Ó˜~]DfÙA\iìcˆœEfŽ´åßn1ѧö¸Þ‹„Àb‹Ñ_§˜‹>ÚÜOúÂ7‘ÅSÆ£/ßBDíÈÕIÒ´u‘ÌZƒ„Ôw€¿!ÏF>m½ó7L–¢ôAéõ˜«h‡ãèj»¹:¶1ªi²(ÏÇ ü\ôÁÄŒÛb<óÑþÃHH9gmÜGyçp̱ów“ÂÆ‡ ÎÆéHX§è‰þ,Æš=íW‘™F{âÚ*8c/ ÅØm‚´6]í5ÆZ]CLÿ2÷ôuÑGãŠSaô“f+»ôºRÛùÀ‡ÊÏ6Kî!ë=”ɳ#{½9èRɹFz݉Π¸7P€e›€Lˆ-H[žDy ¼FjK ¤ y øF<¿ iŒ£ˆÙ}†mGŒ°¶âz{<Û‰öëñü5ÒÅt$þÿ"ÊFé÷‹äö>ÒÔ3ïý"™KhCÜ×…ßµÁùÙ,¨n»¿“ãmD ùÒÈ}Àÿ8b¶“ñûU´SšqÔż:î 1ë^²Vƒá8¹³x%æo/bÂHÐC¦ô×#Íù|ôõáh÷ZàÌfdÞ²Òp1Ön/R¼Su¥®Ùø)H?Kºß6‘i¾$è ±~²€P}¬Ýv2x°Ž,³HÖ0Ø´s4úæÀíÒ´ßngp«#Fw…XF° fSd!‘ò€o‡½Ff¡m& Åì$}¥î?ŽÓq/ð õðÃEýv 2s]ÖIÄ8,˜ÆÇÑ"øãñî%ÄwÇóßG[yÖ°‘Ì[¿ÜÝÌÄû‹v{foÁèÌgÈ앦 ¬òPÜg&Þ¸°È7|†´ÇoB Ï9ÿÛ£ýR̳w:ýñžýÀ¾¼4«ëgãl%MWÎWó¯É]Ò½s{ Öi3 Ò;óoÏÙX£Ž› ­ØµócH ;R{KÌÅÛdt­S>|†tŸuVM+ä¹Gy´DÆGì \p:ã[5$3¤àöŽÝPpóÙÈ,iç·°u€× 2ÆÁ±gã{'RŸ‰wNp³ÐÝBeâÆ[…@éŸE€Ý2Á­Zî&¤­CÌp ‡³26"!q13cWíº@&d«"mÄ6ØTÑ‹t óÏL!Þ„ö\¼Ó6oÜUÄH]nÑîycˆ@Ï!v˜ŒîôAkM¼Ï^7oÇûìÏÿ:Ië ¡[H³dR±V¤YÛ=ñÒ$7ż؅²ƒôD¹s{†ôˆ²=¹DºŽžkÇI/šÒ>cŽtU숱ÌSã1þ2ÊØ¦‘'ã÷˜³ãd½ß62ÂfWæ:ˆŸ]<ÈÞ6Ud½€9´k›Bfµ-HÛÿ8fß"s-!aèä|NëÑïòÙˆÏæÉú ʉ¶Ç÷…À•s¤GP™—ÉB®št-­'ƒ}vŽ› Ú×ÅÜ]D¦¿2íý˜“ØGÉÞ»ž¡ØÜ%|P­ÁA`ŽŠlEŒüMn»EÄriAgÉ:©öõwÉ?çË©Žk¶¿_ED³!žóÜÆ¸ÖãHôÇîo ¢=…´±Ä´ËüÿÙû“˲ì<ý¬ïûÞ¼ï£ÏˆÈŽÉ&I1Y*‰RQ…zï ßH€i$B€À5Ð@S=   ¡„œ< Š«¨$™$“M¶­÷½™›»5×úÞî¬õçÜÓ#Â#ÂÍÝ#l/À`f÷ž³ÏÞûœ³ÖÞkýë_.æ~'z7 «Ù±BæTs Tû øï„Ò\!”ϯç÷2L?$¦Þõüþjåú/gÄ5¤€¬’ßäÖ¸G=¯`¾©m.±{mtPü½¸Œ2i[0’¦1ÏQ…ë9¦Ñ¼«˜æã.V˜e¬¾C(GUE“Ò“"¾žÇ‘×>–sÓL(Ý Ì¸*ÅØ—÷b1ïßrü²ïJèeÅf}}éµr?‘÷p×i§ÜTïU®¯àt3H—aS̓CØ@ ÕKŒöãØ¸žòL¥Oª=°ž}?‚‰àö²Ý¹|¶ç½ŸQ-çh ZÀD„z‡ª¿‹<^)àÊG=ÕW” ÂaË·¼C¼TBÍ4ŠW/}c¥½VÂ…Ò™'oá K ¤NJ¢JÃÐ’×ÛÆü?ª6G(%‘É5/osþÝD…BÁ‰àLx÷¿‡9ú¯ãìaeÛnWÚ=WÇßâìT&…‚9–íUÙGkÙß·0ÊIÙ°Ë8ÃWþgA;·E¥„9õ§C/•”v:û¨j\B£¨žÀ¡¼/糯䱗1kë±rVí„“Änd7Û…‡è-æ²ÍÉÊ#¡b@й a¨øT`¥3Ï,WIs#ù<]Ék÷ ‡1\1N'%.6c‚8=kWóøfìŽk ”ùfŽE9 5œa¬d¯ãÄ£žcÓwuÂhnÆk‡g°?R À>ŠJ’?oå[ ŲB¬» H¢‚z½˜ÏF=¹¶pÖíÞê¿m¾€  ‹‘R¾~Áïåù ÄË+êÕmÝÌcTìUB©ÌÊä …ð.5øJöM\ÿªm»çuá܇*eµÔr 5`ôŠ\šÓÕœË#8>!?· ÛxÎÓÛx…{ƒ ÅS;˜³ÿ'9Æ?"”ÑhŽ]ã„TÆâV^»š_qsÇ®¢qÞÈók9¶ œ½üvËÕr–ò˜ïæg_ɹ=‰c8ãùì¼–ÏS Ó0g_¶ò÷Ñ|¦„,“ÿ)KX†|—ДûMíærü‡q}ès•¹èÃÞƒ¸læVÎ÷TŽA _Ó9GdŠì°¢U‹r‘¢)¨*FGUrµò"ñý<¡P†²ñî‹âX~øKØ7­ÆeÂßý"ñÒ7â]†h‡ò3qß'”b õ¼æûñ3B¼¤ò‡KIT]„;Kþ¥ü9B(íüQÂQ7vÝÆ|?¯JìxöSDp'…$8¢2Œ c§„-‘¸5`t’îÁvµ|3~®ä5sœòÓOὯ`¦Mqã\Íñ½J¿^YE^og„wæù*—8’ó#Jj¡“”7–íˆVb0î 9^Å{fsL¢mÐýüåÊü¶` !±^ÏkÞþA>o{„b¿üÏ9OwpŸvF³ùhÇñµ<_î”÷æT¶q5¯sçP¼])=9¿½¸RZ j1·ªžï ±(P¶‹Øq|ƒ(Ð3™cîÄ9Jüz'Ç2BÅžŸv‚ws,g²í7s~òü{yDЏ‘sq çl|ü‘O/Å[î¤S„‘è$^"ñ _{ #F612æ BiÝÂÁ9‘rÏvpý^pjñò #弋kH)«Ÿ£˜~7Çu£T¤`;7À¡À‰•º „[yîcw˜Ø1ûqÙ(ö㷫ЫX‘~)ÿxp„Ù'/)£¶žó%Š‹ã9¯ã„á[Ïë Þ:‘ç¯ä1—óó^Bñ Ê÷\Ž[ß?ʶŽf¿6p–ðF]Ì{ü‹D"ÛµÊý9ŠÀ¦rŽHè«jc>SÛ9® „뙕·iޱÿEù?y)àÙO¸™îuBñÇþàÛùû.¸½C¼¬â€yc®ûqµ¯‹x%¹F m. â4±›ïŠ®Wl£ÊŒU2…–QÀRŠn€cnÊ@ÄcZ]¯aþŸ¬¬E0v6û¡"7k„B”1;žãüÓlÿ4±’GÐ æ¢QRØ®ðn7B(%Q È=3†«­ úø¡äT¡ë6Λø›œ¯³¸þn?.ž>K(L‘çý(´Uôd0¯!ƒ©Àª¨¨Ûqq!¨^Ëk¯æóò圇Z^ççr¾îà@êX^o8ç|!?’g.ûò¦ÙP®…ÊLöäó*ø§vewò{!~Îæ÷'1›©2ÑE¢"7zÖçº@ñû?M) åIq„Èç»SàE'R2ù|»ðêPO­ÞT©›PŽ:ÿ[˜‹¦JJ×N(¡AÂ…±œçéûŒ“Wq”)ŒB¹ˆƒ¥Âï‹Û}sÞ+m‹@˜È·]Çq%{½‘‹u›ˆW´>y0íó=b5¿F($QGo+Èa¬D.åœ eŸ'óG|óªFÖD(Àp©Ã~Â}²ž×ƒÊþ0=žcÅñhÎçZ^ãõ<¿7ïGkΫ¨dLD`÷‹8€º˜ó0Sèµf{Šñ´ã$6•¢ëê.޽\ÅÖ ˜¶£%Û'ÑPeî¦ wÑ/å½ÚÍëßÉÏŽԎ‰ñnåØF0tt/ǫ̂DfFyòR @Ê“J4wŽVåGq@ô.G¨¢'‚Ñ}ŸxIÇ1*HI¡>v‰—mcÖkyŒ2+Eƒ Ä£‹ÙÑ5%\/ Dÿ€x¡Eý=\-l #šäû~¥ÒÇ?Å+A¹D(w™PžÏUúw"û°šm‰çÇÄ*v…X­nâ U¯c—Ð9Bñ\Î9ÞÅEÆåã•X=æ5ç0òe'k­å¼«Tã,¡ä^Ä´ C|óDοîÑ0N›ËyT²^?¡ÀO†¼–óõ縰Ëq¨ÌábõBúË9™Ì¾¨èÍwp.Ár>/çñÏãBKÙqøOàÕ¹èfÛrµàÒ˜Æc;Ïû›J»}xGÖ•s·…3‚7óšïå¼ßàÑyŠ<~)0Дªxò A©?ð¹|ä¯/DPýÄ ÑO¼X¢Ø"VnÓÙ–h ºq÷é<÷âeÓ‹»†“¼¤dÅ,9‚])¸.ïñBOaWÔBË• ŠgÊ]PaðUœm;ÇýÁÓ#„RQñ¦ìׯcþ˜Öœ‹ÅÓMBa¾D?Ï>ä5_Ån©bu*úˆ›yÌqì!ŒŠ¨¦ 7JKއÄü#Biž$ œ ÝNw>?{ó4ýEöaègÖq©È) µ¬Uúߟýz%û¨ŒÛw²¯âïå½ø%\±L†r3çá®Ö“ýìÂ;¹EÖ'¢Bq‘÷³µro¼ÿs"(¯dÂ&Â=6÷°ë¨+ŸÙ¿ÂœQâ*JèéHÙ¤<ÉTóêµ”Iz˜x‘´ÍÖjN®ùÆO/[/.y¸‘ʬCïD*7Ž©´b=N¬²Ûˆ•Ø ¡L§ÓeÆy«°}•ŒnžPpòë®c¦Nõg#˜nb?õxŽKHža Äñ£š݄ѻ@(Wp+õWœý]Äj\Œ¦KžZËñ<‡3c»Å%Ò·ã.;@Ž¥¤.æø›rN.å܉a+Ïc¸xºŒÙ±CÝt-ÛlÃÙâõì£(•ÅŸ¿˜ãW,à N ûo8Iëç1´V”ßr5Šûÿû˜ N»¦]\Äf™0&ÊKQüèfÞ×»97Êwнør¶#®vºWr 9†§¡ü ­„¥ìR÷àQ¯%¥õƺ‹T­F¼8w‰°—x‰¯þãnÂ/®š¯}Ä‹]%”»›ÇM.þ˜%V——qE²…¼®Ø*UÝé<¦C>³@…j%V«'ó3Õ‚í!€˜8gs¬§%ò—Äè/rl' E,¨ 8t¾H(ùõl_ñ‚ L©!êˆ\n°3ÿžÆ•Ɖ•ñÌ[¤U­¸ï¿Ž+em«spÐü6áVYÁüL£ŠÙ„9}¤Ž\7p%0¬Å„*ÿ¹øú…?’í¶á ÝÂßζí\Æ´ `úpݧ͜ãòù%vb[˜%öUbQ±†ƒ¶ëÙ·÷³­ñœ¿÷ äP#ΘV,£;ïàÁ­w“õžôô¤ìý\<hÖêG¬â€_&”*d)‹XJNå7p)Çfb%¦OtÀÚ~ïФ†ýߢ€îÅ¿ö¼ö. *KôB)“ç+õ'¸˜Ètž?†K)þˆXåvçÿ— Å!šãÍün²)ëùEB‰‹JYIT]ÄJ½ ×…ÆxöM0Ê»9?kyÎs˜ŽøKÙ÷Ýü{8ûr-¯¯Ôá&ÉcÞ®ÌÛá¼ö \á+ÄJüuB¹þuþôäÜ çÜ¯à ±ˆß„¢y šÏ>K)÷äuáŒâÎ÷«ù,ìUÎÿ+ÂÔA,6V ?ü áÂjÉy™%\¿H¾¼rYž&Üh"‹#Ÿ¹…|¾±ËïjöYIi^ßÓäï/;K1û ŸQ$j೸ð†|è}¸“¸ öke¥ M j Žx$ÏWñÙ(³óð«„⪊ðõVhÞz0û©,µìÃnþÿsÙÿ)Œdê#”–˜PUŠR9}˜jZ Têß¡l´ªTnDù±ºî$v*‚ *éHtÆÚ±ÈÀ ½´K'Ák;³ßíyÝbeÝM(F´)i®F(SA%•üTËãþgwT¾ÈñˆWèjöQÅm–q¡ô¸dd#ÆÐÅÙÐk•ëß#”´h–kùÝ/p'œµapvq2r͉*DðOeÿöâ`²PC·p.†Êtå½Ò¢~6&VäéH1ϨÈQBÑêeé$â+„9C(%°»Œ0i%Öœ ¬T}µy%Sª‰Õå=O¬Ô;€K»qýÿ3ÏQ)@ŰNÁþzå!ßðqBI‘×X'ÅE ÅıRÃhSSú C¦’†"$»‡IÛVr.e(×pp{ŠP|5œo¡Ý‘\U¢?8–c¹L¬œ›ò>Ê>Þ̱Ü#”ªHÜ„ÈÈþ+Ik=û²ƒi8ºò¨dg3¡4qòŸ²»—ó>*æ2s7šòº‹xç!øëÙìç÷p6´¨Ä—rŒ“ÄÎF™ÉK˜¾áx>[Ç1¢l Sa‰&7æ2áêkÆ5V*çJžüºÈåĞ!iÄ5„‘Pâ›ÄK§ä¬5Âü-ñ²OJ¯ŸðëNã‚ u4ãLX‚y—H0©‚¨*"lw_ó6¡ „å?é}ÿ#ÏT EÊFíÇHš«ØßL¸yTê“çœÃ/üWCs‰P2J¼š$”ã.ÆŠ+ЪŽê t ëZþÔò³¶ìÛ,¡•ô¤]Æ®7;”}ÁÅZij•Çwç8ÿs½Š³£¿—ljShYïÑXÎÑL¶¯þ/䱿†«j)¯oáÂ(sÄ"@¹ 5\ħ¦Žl³ïê¸XŒ2zï`Î)q.µæ=Òý~¿?ÇpŽˆï<—ý¸”ã9… \R·ó™]ÌöÿÿUƒ¾ðɕΓk). Ç$ |¼íì/Èüʓċ+Â4K;1šä9"À($мL¬0»qð¸P<‡‰õ-Â$×M¡lÅÍ¢Ì`ùùÏ+ÎéìÛÿ…ùŒ®å÷J(ºN(’›„’SÍÚ¿ÄuT°}#N dãÅûqT4 ¢3XÅ•½D³=‰‘=âö0žZÝJÁÉmÖOìF^#ÿßW•ÃNæ5GóØ{„Ëã=ÂüÎ.ƒèKØh*®ïdD{­:Ç[9Ž—²ß 9޼‹™Çœ<˜ PeeìE0x:ŸTpeš0<ýØX>‡‘hË•öÀYäàœØŸ#Œ‡¸©þ“áU9þ?HiÔ{S\Eû#eð ɃðÐ6Bá!V¬ZÕO+¶¯/õ•\'à&FöŠFœ÷×—ƒ8~T`Dð¼Bù¨Î®Šº¿ƒÁ*3©Õd'á.ý¡ðŽ`_¸4ïŠéµì÷w Å,¾| ç7+ÞXù¬à Uß÷4÷sɬàúÈk ¡Üÿaþ}!Û¹…w5¤½žc=œ×¸–ÿ`÷ÔKDA•õœ¯>Âð]Æî)o•»A· gämÅÄtâáYř̢‡V"_Wö]tÛªì¡hGˆÝL^Ù‹u”ìïÍ|nÞ%”ü aXÚr¼yü-Œúq¶9c*¢ŸÛq)Ïû¦*À5©yÄgÿƒäaF ÎG‡‡€b î—âz òQÛÙª±¨ãUÛMBé. KpÀ¨ïN»z”cp)ÛÖ ÷2±b~ óÎüvoLá"ࢦ†0§ð‹.—Ï›ù÷ Põ+AE=‹3µê•ðqœÔ¦â/‚)JÁKq'”ê ?Ý vC/ã¼€Lœv;Ç,ªæì[_ÎÙçULq¬º j§‡0$ ªŠÙò^öSå«ÜMu檎('Ž`Ìü¦æø¹œƒïç\JûvùÉçâý¼wòÅ«½Å¸À6÷nŠf…x™;p‚V7æòQÑŽÆl¯»TY¬§ð«$¡\_&`…ÍÄêòuÂçû¡8ŽŠî¡ð'ó÷[Äêy+ûWûę¯ÕãtöKÁ„ò:J¨‡è±Åᯀ£Èãºó\]SÉm9gCÄBÕÊg;ÊÆ½”sSÃè%•¦\Ã.%Ú«˜šáH~>„Ò›9W‡qýÞ:v—má:Å*v¯¤>¹zñnä$aLÞægýñrÑ(y® gË€öFM¨Õr¸Gä üpóÎqKŽWî×®q‹ˆ•¨8P•&Dõ¤ôehôLyúR Àg@ª/‹èt¯/¶0åG1íÂ,®mÛL(Ð.ð»ŽékÌT~â1\µêÆôŸÉëÝá~ª1ŒŽçgZ‘Ji¬aƒ"C$6ÉÍ­JJ$b*|3‰ƒÊ šDl—§ år;û9† Öjöñû„¯ú-L¹,w•å‡ e¯ª[Ç0Þ_øøñü[þqpPs×à•ûæ*±2¿’}»™×<‰sLVa”:¡œïâİ•œ‹ÃxU­‡‚¥-y¬jö ƪ™øöE[-XçO0âH>xíÄH*×àùbôÜÎ9ÖNM;$]o‹€ÊT…t>KJã£\FÅ¥ôÁR Àc–‡%¤Tÿþ´xèúCþ~ðù¿[‰@æv(´øÿÿ_B‰¨Áé<î8¡,D²6‰‹Ÿ šª€§Ð'5BѨ0¹ ÖÁõnà*Z Ù†ÊÞÃÅÆÛå?N(Л8©©0¢x#ˆv ¾šuÂxÝÄtÙõü~0û+¾~e$ßÊë ©ô<ÎÚ] rCΑv05‚‡GÕÅj˜LN™Ü"ië®´ÝŠs–xVZp |<û¥ÝÜJå|%ý)~##S-¼~ž0¸G° P®ÃmÌÜ©@³ ñü)ŽãÈÇ/yÖÆ£Ä”gm OKŠØ'yRûAhýßH(ö¯c.ú+„BØ#”£’‘€­Jf‹P*­Äªxg›î® œ_0†K*nc¸áqì6&ࣘSH™ËÊHVõ©IbU«\„ËùyöµÂY¬¢ ÌŸâ¬â\n±“P¬c„ l¯î»+ci%h+FrL¢ZÐj#Y!üÿFLµD8wíëÄîC®¢LÝ­ö•õ«úÐʦ•»¯—Ú<ŠƒÎ-9´‚¡ž/bäÓlöç¦lÖý\#’¹Öðî©*ŸUEQv,ÅíÃ8N”ÁåU#@õ`åæ¼/Šåo0.ý‡˜vXÅÚk„r²¨PTk¸ªØB^CTÄKD°·Ó?Ì`¶ÓM~–&ZE^†ò÷ #®•hTñzòÙ÷Eì êĆp\c)SiÅF"0»D(Ö&\vSU¹ú E;ƒs*Ôß¶l[1œvÂ$´L3a€úƒ¦Üuky=1~ʵ$’”y&ŒkÌûs<û¤ÚÝ쳊¿ˆ ¯ªü‡‚(ŠæÙ”r_>çò  Jÿ?qEO,VËIÌì8Áýu^å‘Bm"‚}„¹Ž¼”¯  ¨®«ä£_ÃAÓUìžÐ øV¶}uµz– bÅýá6úZž+´Î ‡ÒFŠY}Òj]™®2‚Š{ì`—¨•í*·v4r{íV¾S•7Á>W0]ô&†œÇu.b×Î*fõ¼‰ð5\GXTÒ«Ù× ìVÓý»Iìng{?æÙvóÙ)à3,äöù ÿvn7¡ÌE¿,¥’vFqàx ûùë¸|¢2Åÿ2‚ °¬g[_ÀÌŸ‡ ×KX)ßÂy‚4N+êþlWœDJXR‚Ù\öSälã•~Žæx”¬5K*1i“0<}9¡¤Ü¯Fë…¢3˜ÏßrKtÊõ]BqÊïfþˆÛþðÿʶ„ÚÀü÷Êàí'Û;¸Æò,±¢õ…’«Êô®–ÖK¨™œ—uL3=”ÇÜľzå!ˆ[¼@/+ï)bU¯,è«ÙwÕ(VYÉfÂpÖ%­2žëyα;èÏc¦qPøZÞ³—qþƒŒz(ô2_é÷ã(ùlJ¹ïP>êÅWVè B Êã.¡üUÄ^¤p3¸—2\‡q!“ LC°E(±<ç&•SàRœ;yŒ ¢*sÙƒƒ­CÙ×;˜Sh ÓM‹´nŠPör5}!ÏÙÁÅn–åþ¦,O¼‡P¨SyœY[1Ý‚r1”I­¶Ïe¿å6ÚÀÜA ˜~û2aldµ#é"b›º¹€3 Gð ^•ßV×ÑFùTá›å¥/Åí!b¥«d¥MœI«w %x '<©¸M æÅô »„’—ËEŸËXÌ.”0!žè'”Фâê"hÃÜ=")kÇWe«.@+±ZÿÍ-LŠ'7M#±Êœ*™Õ+ãhÌþ]É9Ù˶TWÐܱœ_e7àzïdÿ†q=àz;ŒÀÖóºm¸@̱“šã~øæƒPÈgñY+òt¤€*æ+<øùà 9E(¸UB!`£ÐNàçE}|›P–RÆÇ1ßþ^ k!ЇÂÕ¡$¦beþ>®sÛ†aM=ƒ(‰A• D¾u*çõ²—Çuf_„´iÅÕ±Ú Å.ê…Åœ‹7‰]‘XU—òûsy­ñìèžUxø…œï»8Bø3ùÿ]ÌôÚ”óª{£¼Ísµìâ‡Aƒ‹‘”gâÊ'MŽi|È1'ðŠV+ý—?$”¢¨”Íûe\œ}׸è]\FP˜÷C8‡à¸|¤°ï¢EÒGÍ1 ©<ÝNJŒci ûÒ…R[Õ(h Ü)Û8ßa'ûûrö]´×p¡zíT·`(Û÷4•…,¤2rÛ*}U0ûZåúr픹È'‘òÜù ÿƒß~—fÂ=rg­nâB&BáÈg¡¬°2í#ŒDð'˜”¬ ¯æ¥¨‡wÒ¡¬ûòƒyÝ B± nªÀè yü[„q:œ×^ÊãD‰<Š)T¯W†Iî(§©½BkØ÷¾Žkú6ã àÕœñ+‰Ç©‡Pò2ê›PTÕûT^à"ŸFÊósäã(÷Oú@<¬+9F(pQ´ä÷*:r„P¸„2½šç¾H”a¬ ;Ó¤ ©ª+ܘ_"m7&gÓj[Ù¶¢µèÎUO;…ù‚fŽ”ç^Ï~Í6EQ-Ž#Q 7æç þÞÆÒ•X§„¶#„!Ûäg·¥¤a‘ý’b€|\ð°c?jQ=®þíôcÌ{voÈX(‰i¯Þò³v̺9Ià}ƒ.ß"”t^ëÆíÏ`·Ì<öã A3“ýéx~: ƒÐ‰ ¹LF@dx*(äŽè´{Ãv¥oªu ¿ýƒóEáÙ) ÈS)91Vª(¼j ìá X¢D?üa Z å;—çI±Š,m ¿W©È~Â5uŒ`úTæo®²%Οfbµ#û)* µú¿)z%?E¬ô•&yPéP°öQ ïÇ=¶H(à™”§µê{ÖÍCSå·øp†1 éfüÜ ”½($äb'¼âUVLµSQU€«b)éLq¸ÙÄî)x8ªêaß}Ðx?ê¸G™·gé>yv¥<+E>ô¬¸$–¼Ve<­WþÞ{ ßUNýß„Ë8 Ã߈ýî¢cÞã£ÝZQŠâø|H¹E~*Stä›~åa.•s³|ÐxžDмH‘gAÊó[äCå³ øuŸåþ)²Òøé›(òy–zåç³.U:ìúþq\c?û_¤È㔲0*R$e?^†ò‚y–¥ìŠI)ŠºÈA“bŠÙGyVŒJqy˜”j‘"EŠP);€"EŠ9 R @‘"EŠP) H‘"E¨P¤H‘"TŠ(R¤H‘*Å)R¤È•bŠ)Rä€J1EŠ)r@¥€"EŠ9 R @‘"EŠP) H‘"E¨P¤H‘"TŠ(R¤H‘*Å)R¤È•bŠ)Rä€J1EŠ)r@¥€"EŠ9 R @‘"EŠP) H‘"E¨P¤H‘"TŠ(R¤H‘*Å)R¤È•bŠ)Rä€J1EŠ)r@¥€"EŠy†å[ßúõzý‘¾õ­o=rÛÍO{pEŠ)Räg¥^¯ðÎ;ïÐÐÐðÈç½õÖ[?=÷£Î+;€"EŠy†D+þ .ÐÐÐÀK/½ôÓïþõ¿þ×Ôëu~çw~çÏùå—ihhà'?ùÉ#íêå§ü”ŸòS~žþÏ7¿ùÍz½^¯ÿþïÿþ}ŸwvvÖ뱬ÿX?¿ÿû¿_¯×ëõo~ó›ý¾!ÿ(R¤H‘ŸJ½^ÿXn‡O{^‘rÝÔëu~åW~…ï|ç;ÙÆ©S§hnnæüùóÚ&<‚ haaá§ÿÖoýÖC?—ܸqƒ7nÐØÍþïÿûÿέ[·î;fuuõ)Mí‡Kkk+—/_æÍ7ßüégöÿÇ?þ1¿÷{¿÷Óÿ¿ýíosùòåŸië£Î{Øq»þ‡ÿ°y¬Îÿ‡µ§`ÑGõ¯ÈÓ—ßüÍßä¿ý·ÿÄ}›™™áܹs?ýÿqó loo399É—¾ô¥ûŽY\\ä?ý§ÿDKK ÿüŸÿó<¿úùöö6¿ÿû¿Okk+ÿù?ÿg¶¶¶`ww÷§Ç9r„õõõŸ9ÿî©¿Ï;Ç;w~úÿýÑñ›¿ù›tþîî.‡~è<¬ß:ïßü›óSź³³Ã7¿ùMZZZøæ7¿ùóòqEúô?þÇÿÈÙ³gùÑ~Ä?ý§ÿ”††~ý×€ýèG?=þÒ¥K÷¹>J>pû°±±Qê¿ýÛ¿]ê¿õ[¿õÐÏõÓÓÓSÿ'ÿäŸÔ¿úÕ¯Ö_{íµzCCC¨¿ýöÛu þ»¿û»õßùßyêÛ¬ûùÓ?ýÓ:ðÐþõßû½ß«õ–––ú¿ý·ÿ¶þ ¿ð õï~÷»?ýþ£Îû¨ãtýªçÐÜyxÔc?ν~ð¼wß}·þ¯þÕ¿zh»ÇŽ»ïÿÿïÿ}ýWõW?²ÍÊÏÃ;òGôG?ýûÿã\onn®ÿÖoýÖC?ê]]]õ¹¹¹úo¼ñÓïÿëý¯õ©©©ûÚ}V ÀñãÇ:Qÿò_þˇö_òïþÝ¿«õ………úÿñÿL[uÞÃŽ{Øõ?ìüê<þÁüÁÏÌÿÃÚûƒ?øƒzwww½V«ÕøÃ~dÿÊϳñók¿ök÷½Ào¾ùæÏ¼Ðã˜GUn_ýêW?¶øÿâ_Üwü?ûgÿì¾öçææêõz½ÞÚÚú±¯©c«º§^¯×¿ño|ì>œ~?xÞoÿöohåG1€o}ë[½Î… îëþáÖëõz}aaá§ ôêÏŸüÉŸÔëõzý?ü‡ÿðA×|úxù)?å§ü|Öþâ/þ¢~ôèÑzOOOýÛßþv}eeåµó­o}«^¯×ë·oßþTý¹téÒÏ“J¸H‘"EžA©g azzšÉÉÉG>ïÛßþ6¿ú«¿ ”<€"EŠùLJCC |÷»ßýX™Àóóó?=÷#¯AÙ)R¤È”²(R¤H‘*Å)R¤È•â*R¤H‘*eP¤H‘"TŠ(R¤H‘*Å)R¤È•bŠ)Rä€J1EŠ)r@¥€"EŠ9 R @‘"EŠP) H‘"E¨P¤H‘"TŠ(R¤H‘*Å)R¤È•bŠ)Rä€J1EŠ)r@¥€"EŠ9 R @‘"EŠP) H‘"E¨P¤H‘"TŠ(R¤H‘*Å)R¤È•bŠ)Rä€J1EŠ)r@¥€"EŠ9 R @‘"EŠP) H‘"E¨P¤H‘"TŠ(R¤H‘*Å)R¤È•bŠ)Rä€J1EŠ)r@¥€"EŠ9 R @‘"EŠP) H‘"E¨P¤H‘"TŠ(R¤H‘*Å)R¤È•bŠ)Rä€J1EŠ)r@¥€"EŠ9 R @‘"EŠP) H‘"E¨P¤H‘"TŠ(R¤H‘*Å)R¤È•bŠ)Rä€J1EŠ)r@¥€"EŠ9 R @‘"EŠP) H‘"E¨P¤H‘"TŠ(R¤H‘*Å)R¤È•bŠ)Rä€J1EŠ)r@¥€"EŠ9 R @‘"EŠP) H‘"E¨P¤H‘"TŠ(R¤H‘*Å)R¤È•bŠ)Rä€J1EŠ)r@¥€"EŠ9 R @‘"EŠP) H‘"E¨P¤H‘"TšŸvŠy’Òð1¯?í)²Ò@yÆ‹@y˜!¨W¾+/E‘ƒ åY/r`¥jÊKPä J1EŠ)r@¥ÍOü¨ÇíGÿÇ1EŠïRvEŠ)r@¥ìŠ)Rä€J1EŠ)r@¥€"EŠ9 R @‘"EŠP)™ÀE>ò,böŸÅ>)òq¤ìŠ<óÒðÿ? }*Rä³(Å< —\dÿ¤§ýnøŸ—çáÃåißË"—’Pä™—ÇÓ~`?ŒG¨H‘Ï’Pä>‘rû¤Ey ŠùìHqù©4|ÀßEŠù|J1E€â×.Rä J1E€‡»m>‰+çYtÿJ ÜçHT^ÏŠrªúÍWŸ+¿›€Íl¿ ØÉ¿kÀ0¿wòゥÌk‘"’bŠ<ù¸ÒƒÇ7Џ‡PÐ @70I(ßüìN×O¬Âe»@(ùö<ŽpÕˆ•yKþ¬J{6Ïm%”} p$Ï»‘×Éï/å1ýÀà"¡üײ/ÛÙæ¡ð»ƒ´Fì¶ùd†àÓº—Šù() ÈOåI¯:åÇ—Òþ¡,ç…»@¬â‡°_B±¶æßMÄ ¿=ÛÛz ÝK¬ÂgEÝ™íŽ;‡<þ^¶·CUàÕ¼ö\»E§í¼ÞÞ¬„qYÎkLf;Ãyeàíüû³µ}ÜR”γ#å^¹OǪóa«ûBYJE9œ¿›åªkw ÅÙ@(x}ßJ(ó]B¡®Êx$¿¿ ÃQÂ-ÓG(ðKÙVGö¡%ÏéÉëÔòÿ¥üý…l÷±û˜Éóòï 5æO+ÞÈe5ýÝ$ŒÅLöM†äq¼„e·Pä“H1E~F>íCQ=¿XUÞ!VÒ§°ßÁÁØÖü{;[Í6&ˆ]À5BÙÊÇßžß]F ·ÍðV^_áW…¼Ša {„«¦)Ïd_¶忇]J#À‹ùûOóc±ší­ã`ñvýŒe[=ÄŽd%ÏiʱhŒ—ówÕH~œù–”—¹ÈÇ‘bŠÜ's%Ù@(¾£„"î'VÁRŽÝ6b•ÞOŠb….c°š¿›ò¸&ìR»uBy*F0I(ã6B!·Óùw±KX~™Øi¼Ÿíµ†ª?¯ß’}>Š¡¡}ÄŽ@+ÿÁü®==B¸¯v …¯Çhös!?ßÉëíæœhw xˆæèIÞ³"KŠ(òHòq”Fbž œ \ »„"¼K¬Æ[ Eþ޾O(T€+Äê|"ÏÓJ»_N ¹‘P¦÷e½C(ÕÍü™Ê¾4 ¸-û8™í- w‡PÖrI ú¹–}é$Òr߬«üÎül*ûÒžÇíTú&¥Þ\ùn„0FÍÙïÛ9öwòû"EöSŠ(òH¢åÁ$¨ª«bEßM(×5bU;N¸Uº1LSÈž~î÷ç·çÿr­Läç«Äê¾ +ØÂì+ðuÂØíÉ¿¿Ïsk„Rt.ÛÀ1„<”@ õä÷rÕ ƒô.ðBöa&¿¿‘ýеÛs›„¡ÚĨ7ç¥!¯§œ‚Ùãtöo­2çOëe-Šâó)å¾ùù¸.…nB‘ËÝ2@(Â]ì"Y%VÈcÀÉüì<¡k„âk!”ÝH~¦`i?¡´Oå÷í„’žÅPÌWpàVn”Aìçï'\3oFé‹yþÕ¼VOö­5ÿïÈv«î¦wó»sx²žãoÍþ÷å1š;íBô¢#ŒÕÂÈÔD¡‘”œ¦|‡+yÜ<ŽA”·È§•&àß<íNÙy.žG) YåΩÊþŒ~©•”î ^Ù ñ³A¬l× ew’XQß"Vÿ‚¶g'å'J+±ÃØÎóú å©>íÆ žÇµäß‚s.äµ/gÛýÀuàþ^" ‘’Éîf[#vº@¸­tmýôç<ô†e—0€£D²Xð:ÎAP†ò*÷»œÈù]ÃÉpŠuh×P¤È§‘²8ò0”È'¹ñ½ÄÊxžP|]„R¯Êl˜ðÁW•±°÷‚Dþ˜H¦êÁ<;׉Õz¡$w _zC~¦ä­A¼âW x.ŽâÕó»Ùþëùÿ:a„”¨%Ìþb¥Ÿ}„aÍq á&±ún wa4º³7 å< <Ÿ}ïÏ9YÈy[Íãky#yýZÎ æeø–KèÎ<žËÏÈ{ äP‘"ŸTÊàs.Ußýðù§aByœ:÷ˆ‡hùª» T|ëÓÄ*3¿gÏ$æêi&\C£„!YÌïºò罎Ÿ¿P>c„Bß!“VÒZùJk¯¦åËÞ%Õ^^SdkuBé+Ú›ÙæÏŠv!¿?G(Ñw‰Õÿ±Ä¹“ÙæeB©Žg»íDfïßâLÝÁl‡ìëñü{0bÕ1“Î)º‡;ù÷]˜¬f?Ã5™ýœÍc: w—   T‹‡hûüe_e¼{”ò#š ƒCöw™ˆ»<êý|Ô{_äó-eð9—O[$¦‘Pú'p´•XŸÆ µŸPtc„rÇ R;„rÃ]BñÕå×D(Ì»„"^~›pílÉ]‹„ì ŒN'À®f[w1¶þB{ø ±j¯å÷?ÀÈ¢&ìÞÚ"”öF¶ÛO(caö¿—ó"šÅÎF¥-ûñ&áÚ’?øJ¶÷rÎÑ 6FÚ gÛ÷Å~8û¿€EÍ9÷ëù÷0B Êú(,¤EŠ”ÀçX>M†h#±êtfŸNn®ÅëvŽiÇ ¶ˆÒ? Õ-/{‘ª”ÀçP>ªFîGI+±’ÿBátÊxC"Ûp’ÖÌÖqÒÓBå»M‚WG»­€{³ýÄŠV|üÛ„¡®\KpI¡ëÙ–’®ÄË#ŧ1?ƈžqBa÷࿨žó;u»¯*Šlj„!ëÃî¦-ÂH,åØÄiôÕìã|~'xl+áöÈvVó»Zß‘cÍϧåß@‘–üLdx{•sjülܧH‘ªpäQ! RJ_"Ü}8«€j3±Z•»áfž¯î2¡˜ÅÙÓ„)™[ 8…wÂ¿× ÛN¸\6² t·‰Ý(úˆÝÁ&ŸPS~.šg¹O&‰ î F5e›c„âTt9Ï{>¿ÛÍóv0±›ŒŽ¾ïã…„A{‹ˆIl»»8‹YhªC„»ª»¾ÀFa2ÛÙ!v,SÙ†ø”U¬¸ÊN¶)‚;%±=¬Ìf1 [Ê®ðs.ðÓ÷"=;M(O¹TVp¹Ä1Bév ¨;Ûí'”v#ðg„‚Tá”B)ÛV”׈սܺ÷«}Á;û³?ê¿ÛÔÖ|~ÞM¸F~%ÏëÍãnF¬1ûߌWèÊÂ]#ö±¢—;j5ÿ?I(ü~¬LçòÚÊh^#”ùHÎÙùü»?¯ÓœÍ>߫̽ŒËqBÉwe{]ÙïÛrªqÏs?„Uå-;óSùÿH~w•0Ê»|lõ_vCÊà€Èƒ;By/÷[k¥o5"‘MƬ–;;‘ÏMà*hÚõ䜊çh'ǯ·í>ꙑEñù“²ø Èã\IÙˆÂá$±šT@TYùù!V÷uì‡>’í(`+­õ<ç6¡xäzhÈ£PÏߊTy븚—8ýû dËlû6«èËs›TõW°2]Ê>.aÈçÂõ<¡\ïà,ÜÓyÌeÂg¿‰sä²zóøm J·?¯{3ÛkÃü=Ã9/˜ôN(SÍbíZDŽ'ü’m~#Û;™sò<±‹›Ëãó•¶j„¡[ÏãD)ñaPá’3ðù–bžaù´þ‡µÕ@ø‰_ˆùà›e׃+Z]Âծ޿w{„ϼ‡pQìÊU¶DépP¬Ûye °(ëVº´zÅÌŸ›Xù¾J¬rµ#èÄôRª_$²JÈR²ÈØF²­%B!Ë]#7Õfå·à–ý„b^À+ú>à³Oïâ è*f_†P‰j2¼*VOöç^^k0Nm¤t*ÇÛ“mαœÏqmåùs„!ÇüJ«y!Â`ŽFõ¹œo]Oý~سÖðÀï"Ÿ/)à•‡¡5>.uÃÃŽï%@öC‹Øì6†c e+<±yÊäP ó?H(“IlDó{•€T„ÒNãæØßÁymñM«ë=B¶«è£¸ŒŠÎtçËÄʾPª‚‚w(‡Ã("¶)L(7–Ÿ­d¯¸›ý–Û BÉÞÎÏ_ȱÌ»!!vT˜f9û"ÄÒ&¦XÄAeåZìq Îlû5ÂØ~Ÿ0ð½8ø­û6÷Q…mDÌW-<óaFàII½3)òx¤€gXÇï—H~ð1o`ïÊd‚P"9«aº‡BA’ÿO«ì÷0ùÛk„ÒWBÔ¡¬æõß#”ùZ¶7J¬v±›I £_ÃøûAâAÈŸ‹Ø×>B(±áünXM_# Ɔ€vaŒü†dŠ$n/?[ÅJú$¡0Ew—P¬ãÙçÛÄ®b1ûs4û Ÿ-b‡ ø€ª†)Žñ7„X"”ô±ìÇ­lwïH†·ÔlëPž'‘¨©ì]!”¾b½8ø¾—ó$Ç 4уÏ݃u ž´°¿R À3,ËLŠï7¸¡ó-BíŠcPB5BÉtsuaíÇŠs“»­`·O¡øÚ1IÚ=ÂWÝßâ W‘·uŠWü7¸@Ê‘Ÿ j_í„1PÌà$ÆðËõ¢ÝÇH·œŸ 3ßI‹Åü¼Ê¯s‘P~gó3š½œÇøڙê_ÎkÏr?¬ò£Ìh%‹ÝÈþÌâ<…6ìÇ—‚¾€ƒÚ-¸ÎŽwôbn&ñ2© Ng¥Ýö¼Ï[„;ï.®ßð Ò’JøÁÕ‰=ì¯ð‘z>l›,è࡬¤Xºp­ˆÛ^ ‚¼“Àÿ \!+„’èÊkÌFãöIÏ {#?ß"\ ÊêUÑ–k„¢v_þùYÂí´ŒÑ?‹˜ãG˜üB‰5þl‘¢ÕqC~veÐ.î.)B]û ±2¾œÿŸÄÁiEy'çìHÎ_g^S‰ZkÙÏEŒÝ×üôä¼õåwocåÞŽ Å«"Ú×q¦ï]ìšZ¨ô«…@MຠßÅÜE=„±Et®¦Ø€b4B7)^Дó&t×ø„ž”".+þ'+ÅÈ~€<˸zILû"V¯¢Rî$Å,FÖLn™NBé¿“¥äßßÅL•mÜÏÓ?L(Ñ–ÊÏTžÛ†],r7u l:ÿ©ÙaB!]ÊãÏåw5ÂE%~ ˆ@n¹?ÞÅœÂEXp” ãD¶ýÃlû6Áî9ˆ‹½tá]N/¡\¥„÷eÞ“s¥Â7Ú1 bΠ¡ë&v[ õÙüLÁåÛÄ.HÉ^Óy1¤V±Qa¨f(/^$ PJÕ¿\\çòÿj\æI¸ƒžåE×çUŠø ÈG½tU7˜:» 8äNpºK(-Á'ç e¨šµw ¥},Ûš#’¤ˆ&óï%ŒS×9 ºª|¡¨ä^xûðÛˆ8Á@å8Å äž-ó8NÖå³ÐI»9æë„² Œ—”—XBµª¿G(ÁiB©ŽJWtÖÇpûV'Û}ÙÏ‹¸ÖñxeŽD#=Eìhna—ÏqÈ% ‹èŽJ\¹»yûsž®$~›¸FƒF[1ŠIʵ‰0"[Ø`&vbÊ\®>ìŸ÷Ï“—b>ò(p8£¬T% ‰SFþµüþ&ñ‚×pÂÒ(vÜ$›vÏЍÓ!Ë­²‹žìÊG>m¹.Æñ*|.¯#Š…^BY-ŠSuw·±¯_°KÁ2ER'ƒöBIËvB¬ ¥Èû0eÄ­¼Þ‹X ËŤ’Žg è¨\_[«¨`˜ÃÙ‡)Â0ƼIÕâîõ#ò0#ð \¯‰P´¿‚ùûUœ}‡X¥ÂYªÍÄË.~›˜õSÊVBÔ¥NÓ) Ð%ªƒ„2šÃ±)·òØDÌ¡ˆAÌ£PÎâ×iËë +ß‘}!ǺI¬˜ç‰`ª”áVŠK„²{)¯ÕÞaÌn%”l±–’WPy"çj'ÏU]ÞmÂÜÉãoâÝÄæéÅDKŽ©–çÜÄÔ ºÏ*##ºžóºDœ·±WŒBÄÄXº†ùŠÈ6D5ݘ÷õNÎ÷.ví`¦æEÒóöà®àqɧ©_Qä“I1Ÿ!ù $ªòÿ±2T&nVÒ×…8Ž«Y5ŠuÓ (P+¥»D(¿åÊõDmÐC¸š¥9@(S)£6BÙ¶Êñ•ì›P;{ŽØƒ‘3b#mοëóÞ]ƒÊKeßE/-–P‘ªõP\ú-˜CHs$R6Ñ-_ v*sùù.vK]ÂUÈšq ]FRuÆsnTw`CQÿA;@®§sS„a™& ¶îMo^ó±À5DÔ§ UE¿]ùL™Æ³9ãÙ–j «?†{'Ï«²‰öUŽœRvOVŠxŠòqöÚÆ÷âÅÜÃ8ôV\¬e…X-+‘Jܘcg óÝ ãÝÀ¯`ôH COЂj…¯B.‚šjWpC:!”ܲo/f;ZA«œ¢|Û¿’ýk¯|¶C(ÏÌÑ#y ç6lcHØN«i{œ0‚¹ö;†IŒ65Å1œÝÜO%´ÿ†ˆ-È7/¿û­œ£cØP)Æ €m'ތ浅jÏ~Ìg_䊱ÛiÌOô"&ô›ÂE~düº0ÛééœUfSÍwpM‚Z¯¸Šþþ¤Ïò‡I1ONŠxŠòIRÝDc4JãyB¨ÆmP ʲ¡Ô% ´vª¦¥ f.ê"ÿó&¡dŽ«d•5ÜÌë­fß:…/ßþá›ïÅì ZUwæõÀ+VË]%Ü‹9>í0tþ]i4‚!«Ê…„ðòWpõ¬&˜Æ™Ð2—ˆÝ˜S/ç˜5Îj,d6Û¾˜×kÏ65Ž…lc4¯#ÿü¥lG¼J+9¯+uU SŒB»0A:›rŽ¥Ì•¹­|ŠÁÊ=lÊïÏWîu7¡èµûçWˆ/i—¨TaeeýÙ–bž¢|Rh’7TÁëë˜ YðBáõõb÷þnùü¥˜ú²”–’¦š+ŸÉP¨ÈË:æÅo$Õ|^C„oí„Â]Áè!60­sñÞ!ÌeL§¬²ŒÏççâÔ™Ç,—ªÈu‹PxªD¶@¬¶§ E%£³šÇhn„:™}Ó5ŒFõröw1û*:†fÕ¤–NGc¤,äœC¡zZÕײOr“É( É5M@Pû (ìJÎßQl¤…žºKì¦&qLá:&ó“ò%·(<šq¾À!Ìâº@(퇤üƒb>ûR ÀS–O¢üåó¯âü[‰•²pñ x%¼I(¸NŒù!Vƒ*Ï8™í" űò<„·üåK„¢©Ò)ìb´Î"ážȶÀ®$)èN\P~+cáÓdzoÇò»/á XÁ0EÝ þžÇ´ r Eݘ@M±„rkÁ;‘ü­bòÂá÷g[ èj!H­ŒÜFí´ãú¢¤®¢¨À¥5åú¹Lž]n3Dmá"Пý•òoÉÏ„šÅñ]_»¥;8Ö³ÏKoÎ{[öMÆf Ìi—©˜F‘϶ð ÈÇ1ZÍi5ùeìöh#. ؽL(=Aµ‚^!Vr÷0¥ƒ¸æÏŠæ=Œ¹€ ÒŽJLmueû·qÁ‘ì«v!]„ÒXÍ¿»±›e–Pp/àÒ· …u wÙË>)§@µwåÚ8ŒinaÍ(¦“Ìc4­Üÿ¦Ò?MÁ!¥8U‡x$Ïkȹ^ÇŒšx÷uç:Ñ$Ã=‡]G8WôÓÇó¼Ùüîâ½5L%ñ·„BVÅQÂ%ä–’ïÆ_ñ Ù÷Ó+˜ã©X‘íu‹ƒ‹Ù/eqë‹NºÈgSŠxäQ @ëßGE«EB:ˆ³Pâø?‹™"µ}—K@ ë8áV©Do3„B|ŽP‚?Î6Zðê^ïJ¶Žëü¶âàèut>Š©äÏn$ ÑH^KµþC6Û1,³7ûºGìPäcïÌ㵫›Jõ¯ä˜F0ŠE0ÉVÂUË&q—ˆáæ³} Ó„ÁùQ¥ß]Dì@ý»dŽ«lt·€ŸÏ~­à]ÕVŽq,çA;¾5ìë—Ûm0ÒBì¨,汃:ŸsVÃàõlëN^g;û׊Zªã<žó)é‘»R À3 btŒV“/ãZ¯Í˜YSnaºE ¬Â,gˆöñ"/`…½J(ÅBÙÅ´ Öjõ¯ø8ÁK,”‡ e*?{ +ñù©#_²”NÆã/h}À÷pùÙÇ»„aÁÙ5´¬º'^&V»"œSbš £óùÝ¡œ'±›Š GEa´ÚßË¿ÿ6Ͼ^Ŭª]Ùæ¡¸ï`fNUçªåõ¯`Þ£Ó„âVÅ´ZŽ¿g Ïæ<‰Fz3çK«ÿ‘¼¿2ý9†3y¯õlœÂÁÝþ¼Ö?ÀLøŒï.¹Tqk+pñèÈmr3ÛÍhå»:ñ’¿I}'´V´­ù¿«=xå«]‡üÓJtÆÉaäqÕc6rL‚VŠ#¨›ØÍ¬å1ïç… §V¦‡³Ï‚,ž VÄâåQB“’æäŽ‘¢W¡x%¢)³wŒP†«k±#yÜ»ùÝ Â¥öNög ¯ä×ñê\ËaTßÁ±‰¡ü_«öCyCq+ïá.ê#”û9¦«Ù^7vqÝÅyëxGößqYË…µ«™Íë+IkÙżþ%œ#  jS^³»ëáUµ‚ã{yO¦pÞ‘ì_/a”•„õ¦ŽhÄu)~ñ9Í;¤{8»zC>› cÒ›ãÛ±#QoÎûs:ÛêÏïkÜ_P¦ÈgGŠxÆEheÔ~PrEÌ`’²c˜X”ÀZ™Ïãb)ÏgÛ³ò§‚ cùÙ<ÎÄ%`£t“P&RþÚ,à¾4Ç1'Ï,áO?„Q=ýyMeø®ŠX«ÞN\¸^¼þ‚z¶çx´:BGUΔ ¡D«½o-Ç!®œ> yÝ$Ð8s„qÒÎæ÷×R8Ôy,¢<Ý›­ì»üùʇXÃ,¡‚Üž&”þ¡ü=ˆ]{=9Ÿ}„ËH1—EL цù”ÏQÃ;Q{¯Vž%܉iôZöe!Ç2‚w„2þ"°[# †2…uõ_J=>;R À>˧}صÚî!?¢WÚævû¨ a¡DÞ#^`ù´• ªÛóç¡ø:eq‡P‚£„1©a´ŒÆ¥Š`"”ƒP Ä‚¸‰•ìr¶ÑB(Dù—¥¨„…¿@¬ ¥8åÊV}ø+B!Ë?®±hSØÂuú³ïÊÂÝ#ŒæÉlWt‚Ÿeß›³Oƒ„2M¶|î‚RŽálf]û0Vðãy­·°ëLY¹JN[É{<’ßýýlG1¹`Díp6ïW•2¢=çdˆØAh$â@Î…PR·ˆ˜¸›^ËyãèRÞw1“Êe¨2”‡ó^Tk ˜åÿìH1Ï TKâ)@{‚X¡Õ‰—sœ€ð-«¸÷ñ|¯Èú‰—X|þ‚ * .z"b6)µ9¬ôD$&¸¨d`„Î&v£Ä*|“PÒ2*|ÒK(¶;8[·›ð‰Ë_~ó-åq38~0“×ëÉvU¥KFåZΙ‚׊YS<ÛÔÎb!NŠô|þž!û.ÇØW9g>çX.­˜MU1†æ‹æ\¹ýÄŽD± ¡¥–1Ù]aoåÿ­˜Ž[.*Å"Dö§ÔlG»Õ:œø×²K9/«Ù¹«˜Z{§2–õü{0Û¼U(³¢ä?R À3(Uš‡&âå}û}®“˜Üm³LváÕ›· ”²”¦Ü÷ˆUÿ2ƽ7Jì:l*O`g—Vý½íyýMœwð>†4®ʰ¶5» ñÿÊö öAÿ—BTÑz!zÔGaû²?*ƒ(Êæ^ [Ž_. å0\Êã徚ÃÈ¿lÅì͘y´ –Q~BGömP¢9®•œcU^ÓÊ¿ gåÎ`Ãz§ò¹ŒÄHž#ÖOí¶r5Œ@Ò¼+ÎÓŸç(ßAq‹{ù»?Ÿ%ÊÝ!½âoã‚;K8X-öÕ*i\‘g[ŠxE+eÙÅIGb…„xaÏb^—Abe)ºƒœpµŒýÑò‡kÕÚˆ±ó¿”¿¯cFPÁÅsˆxpäSžÏcä2ZÏ>+0(fÉyìkß"ŒØ"Vf¢m®åõÅ:ú&¡xÄ¡ÿ£ü\•°v…%¡qBñ¶«æ­<¿ ó5á‚è*/Ÿ|WP’›¢5­¦B1¯h«#fĤ)4‘ˆÛÚ³O«Ø¥uóó •³Jಛyÿ5å8ÈXˆ½uˆ0l5lœE'÷‘¸’ê•sÉ{¤Ø‹ˆêt_ãEÅ(v7õbJlíª¶"ϦðŒ‰”¿ðþ„Rn'”¢ŒÂ[„bÕ*T$`zi— WÆÌàx‚0*m(ÞûymÁJåªYÊcEWЂ8riŒŠé]LX¦$01IÊeÓF¬ÆÅŠy ³q. pPøb­”bZe*)êNžêÆ®qñôåj¸ÞñŽ›¨ÙI PbyþD^«˜Qb™ØOïæg¢äи·….ã³—÷b–ð¹+ Þ“ǪzÛ(aÌžÃ%·pýßݼOóyî\ÞÇþœ_ÑUËM¥ŠM節¾Hog¿T]¶b ×1·v›Ê´~-´È³)ÅL¬v•Xµƒ‘!òño¾à6 ˆîuìî隌…Ür¥´ d!û®ÂmÌ^)÷Ê"¡¼ÎŠV<öR Ç0ëè¡ØDí,â2Õ%^ÆÐR橸º¿Ï”¥c8;\.¦"Ϧð ˆCSþ/lû×å~‹Pl¢}hο;02¨PÞ£˜>¸—iœ!Á0¡Øv±ò™Á¨;ûòÚ§‰B3b \¨ô³+û zƒu²C(å÷ð*P+ËãÜ_P¾±ÒO;Å_?D¬¦µcÄ+Rq‰~z•¿Š¡ž—p¬B¤s?"”xw×Ê „C(y­–Ùl \1‹˜÷G žê¯?«„tÚ™,çÁïc˜5Tu´{ùE¼óQqÕ8I(ýœ¥»•ýk«+Û“ èΣ¶ÇPÁw=Úi.åµdÐ;rl­8E1-V1tXÐÕ"Ïžð H•äM _$ŸV¹¢BPðNt÷°+ãUàÿ$”Což'ú±z–›gˆxI}<‚kÏvÆÌ@y‘x™4½‡¬5Œ‘a걇B ö éRw‚Xá7àÌãfàçpÚk˜îAI60ZG´Ë?ÄÁæ)œI,æÑ›9‡Ê Õ‚2\ë8fÑL(æ×0W8ûVå9"(Þˆc! .7à fÕc¸„)»G°[h.‰›r¾9ïÇT~Öžc:I ¥v‰ØËm¬Ìwˆ ½\09öÃ)&÷ÕRe\Êô®a”W•|n Šç*ýiÃ㮜Oå¼›¿ cè³+Å<Rå÷× øeB!C¼ ¯/ó='P%-‘‚‰âåü_)ýªü$Â0%I( (DÐ\ðd›Pôò7+K+>%w)SW4—1²ä&ƽ++µØ©ôbhëxöOµŒÅð©tµPŒÜ „R›hFÔ¬c(gGαŠÌÕ¸º0R¦ûâ7ñD«áþ¼'ËX± 渇0ÿŽª“µd?D‡1œó¯ò%\~=ç¸-Ûx#ïY{åz¢‘á~#Ǽ3#½…ÝXGCv%Û>J…)¢æÀÝ£•1éùPf6Øï/ª-BTüFù!ZpšˆgSŠxÊ"åßšÿ÷àr"ÓŠô*¦xn ”‘20av g“j‡0W»ë˜Gþ&Æ× ¨b0ZµËU#~% íb?õXž+WÖ0F‰ByrW|—ATò˜(ЇpAø-Â%¥ÖÝPrߨî@/¡ìÎåõFqìhöç0¦ižÎk¯äÿ?Ì¿Ç1ªfŠpɉ˜®•0’ª¡{3žöä½:]9¾'û-_ÝŒåuo;¸abWч}ð‹¸‚ŠàZªÄ¸³˜ I°ZAl•@w7Ç«˜“ž‡eb7v'ǺšÏ“Vò¢|hÉñôb×Ïl¶ÕH,4¶aÌD@¸C„>‹R ÀS½R°Í„âûV»„»@¼”{˜ÂA[ö€Høg•àU]ÉŠú¡œæ # 7J#¡ðV —Ë F—Â+ñIŒ×_#˜'iTR–þ¾ší·cha+v )Ák‹PzUS‘›nL+¡ñUnÕñ]&ìIÂpýVür…ÍgßÀ<ö;¸Fòdž¯„Vþu Ã\ Ü/ïaÞŸ¦ìogöù27Q€bâ1Í{2K€ƒÐš·ÉìËlþ^É~ ùõ.,ßH(ïÆìƒ(²•‰<–ýÛÊù=‡âö²mÅx[mÏsØ%Çt s1 !$Ž#ÑŠë:׈…Àeð,J1OIª«!Qt+MA"…õÃv¨l ¡¤ßÈ¿W…Ð…ƒ¯¯/ÿ(±\!”Ò]BÙÈç~/¿Ë~(À¨z»J~ÚÄI¹‡ÖóUõjÎßò=·a£4ŠË2öc"³×Pöû5B1ŠsÓ9‹ûgû¢µRíTöwgà®cß¶ÙD¬wÓ"  Y1GKö½ïšÖ0¥ób¥ü ¡üžËcÞû±ç*}V¤'¯y‘0FŠ…(#\Ë9ÇyßÞÆN¸ðü4±#:ƒºòêXqËõÓ™ãêÍ9ÐNb ÿŸÅIi1¥çN¹FrÌŠÉy¶¤€§$UÌ¿Ø-'0eqcÞ‰] ¢zVÒÓ{Ä‹÷*Fº ßH¬DÿæèïÂ>æ[„ë`xA/ñƒ1B©Ìd›SÙ®ž|ÎÏœ%V¥s˜ç^Êó-B‰uRu„•Ñ{9ûuûïEm=K Áµê<Šqþdzíw²MBqžÅb)4‰W"•ü×JhzžPàïæµÆ E©q6ââ:Н àd,±‡ÞÈ>½Šc.;¸b›j «v‚ê8‹ùõ2æa¯S …Uë·ºêWÂÛzŽïLžw'-äwSy_´Xh®<;·㵃cM Ù¾ŠŸtç÷Cùlk7»‰‘bSÜÿ)òlH1OAªDo"(ëÂ\îrˆ¨L¬‹Ã˜Ù±#WäïÖüZ~¦äáÇÁ™¤B÷ta®œ Bñ,¾ð&Byˆ¡ò0öeÏ`0)RµûÎ0í'ÙX¯ê[¢oþN<»C#!Q9Hq¼ƒýÕ¯ÊæmB!ªÚ òàXËìÆ²¥#w ¼ÐV‚½ŠèìPŽãPÎóXm'ÜC›˜Hoƒu†å:‹ ²?Gì8Ž+v¹þ:²­1œd§úʧh! Œ¤ŒûVè'sŽ–ò ¤:Á}y/”L(Ä•\„³8û#Û¹™ÏEcŽéfιâÊY È"F†}Z)”ÒGŠxÂò`‘½°ƒ„{C…T”¡*·Vh£¸‹0÷¯awÌ®¥`­HÆäêPÆj_žÓ‡Q<¢2P!qÑFtç±2¢ |sW"“›HFŒ7WbR¡È;p. ”T][}˜{f¶r9\ÇW4Éyž5#yýçe=C(Ù›y½Yœ1Û–sû%Ì_t<ÏíÉ>ͱ÷ãÀíT‰hâQzCnûpðt>Ƕ‘[+„kf#›Äý$´“ ÔÈx —¿1Ü¡¼…þš"Êfvá"<·0ñ›E¢‡hÂpTц(~9ÇqŒûYTÕ¿µœË™|~U_BpT1Ž~ZQvñƒF „/Å<Q u­ÄKuW¯’;B>Ú:¡8/b߯ †½„+HTƒ„BêÀ»eÌÿ£J`¸"TQãV A«nBYÈvÇ0m¦.–ÑR¢Ú*áNŸÍ 6$-„bÆ<úËÙŸåìÛ¡°~’ו«¨½ò÷pT¥ßÎñœ!”é‹„ò¿“Ç<‡á¤ò§FT ì:ÎGžýHþ=ÕA(웄âv!ïË*¡S˜ÃÊq.çï"ö©ß#ŒB'aTör3Ÿ vÍŸóØ·>ƒ¡Ãº†Êf~×\®ås!ƒ1ŽWÿ˜óHÕËsìÕ"DÕ\q\¹ì=L?¡Wµ²Ë?­4<ÂßE>ZŠx¢UKKågP–w0ñ¡ì¬›À>äì¿‹1ëÊ”í&”ªVí‚¶åõj„’U‚T¡hUìDôÐgãt‘Xa®Ô1mD7Îíĉgâ˜% ˆ¾›ýíÌ9‘"®BNk„ò;‰–Y4Ê"/»Žqø*¼¢\…‰¼Þ\¶ÙŸ«Ì Ž»È•Ñ˜s¢¢îßÏqw`êé9ìƒoÎ{q—08¢OV ^°ÐMÌì© ^ œÖp±{AP$׸”à&&Ø;ùÙ¡è›òy•Ç.®Á Âk9öVÂe$>§K•¿U9îa””‡póUöSwej¯c«6 mÖŠ}»)·ø°ÏŠ|°ð„¥šõ«„œ3„âP0N.­ ¥Ôå“­/»øj„‰ŸÃ«ç*w“ß)]¿F¼ø‚•Šæ¡TûTÐð4¡Ànc÷K ¡t´’ì èTüDµFr¬âŒŸÏ6Tm¬Ža–ÊUÙª{lQî²B‹ñSqŽ~ìÒ‘ïý4a°¾‹•¾*’fi\Ìÿ厚ÏsD5¡Ý“|ë#9¶% ÑìljQ*à®:ÆúL¼AKy¼ò<w}ço|5û!$ò)0-´ZUVSäpJÄë%v>bEUU°ib‡0I„¯öÃÚ†é#ùL‰µT5.ãúЂÁª¢Ú¹ì‡*Œé¹T Xn Ç]3 ê*FàÑ¥€'(ÕÕ¿2;ˆ•_?¦wPÅ*!Nª·ð˸„ƒˆ ùû^¶1Dø©§²½5â¥WQÅTr›pƒtâ‚ï‡ å*zåØuR+ÿÛ˜S¨SEwc|¾øq„Bçv ¢ºžÂ0M‘Ï 6*X¬Š’‹nx!çN.¤&B) öZ˹“!’{m “µ‰•Tµ€Ç1ôv c蛥x Ó`(ÀÙ–óq4Û‘¡•{G ÷ùlg»|^"\4½ÀŸád8)ñëÙ'+1¡¶e[bK­áœ…ìÇ ÙÏ·1^_ ¤ïgÛùÝå —ó8C}vr¾ö0eH-Û;Nì8À cýyïo:ŽÍd—høˆÿ‹<\ŠHÙïFí+xu”¨ñ+¿«N3†ôI©ŠtKè›*çÿ«ÙÆ$v;¬çù§0¥"*¤þð¿ôÂ7C!ŸÈk߯tЫ¹B¥¯[XqÓÿÎd¯b˜çµìÏBÁ-×'”è L\Ëk¼@¬ˆãäÉ\ξ6æ\K)®e;ýRy/ÛQ•²ãyžôD4'÷’x€”Ç!Cµ’÷äÍ<î6Ò¢ÜPmßç³_2:_ÎÏZóÜ ¸>ñTŽiÇGTñìBÎÏ‘ìo~®:ÐÂïËðÜÅ4Àÿ‚sO´S©å±Gó¼;•ñ¾™ó8+i·¨]ϼkiÈkjµÌý»€Ç!%ðɤ€”ýxXªp5eÆž&^mÿµ–‚pöã/àš²Ê –»“–1õ¡ÔÚòz=¶_Š®—HÚë2¹'„ß$¸}›·J@ý×Êp0¿¿J(Ã=B¿ùЦˆÕý¡d¯á ölžó^å—qU®|½NÔ=ÐÊ_%'ßÅU™³·ñ*UAó]Ìõÿ\ž«ò’â4šÊãT GT£yœ”ôv^WAz¡²Ä›#>"‘ãi‡õ“¼îx> w°r¼rÄùB¶[#\GŠŸÈ8^˱ʾ!Ÿ…ìÛr;—ÏÐB^óD>5\Zó±+˜À»ÉíìÏéìß"±{©a„Ûaì;³\%n׬þ4»€†ÊO½òYa}t) e?KÔ^/æ¥?‘ŸÉÅ ¬[ù«Uäc Ó»gm /çfÂV|’x©¿kþ't­ÊŒã~ý0NÀR R|¹”ý8‡±ùŠYÈïÿ†ZŠŠâjöA1ÙÍþ®å=‘x¥>\· )ë»7ïûP΃’Ū,¬›¸±è.Tû¡–×Ùà“€†ùy‘‡K1)ûùàÈß)nžB‘¼‚kÿÞÃOQå…xÁ[ð ë¦gØ%^F!_v°â_Àutţ߇¡ÝÞ½øñböf_”,4F¸1&£óbõ×E(©Þü_¥~‚IÛ”üF-fÛZi·áà¢òD½0J(¹qÚ #äR-çKäf× ¥&7‘\ r}h¥-8g?ÎÄÞ! ›‚ìšCÑEë^ÄAü=ÂÕv=û§’— J/a:æqb×¥gàn>+xE®Â+Õû¾cBÍ„aµÆ±ëŒU42PÄ‘QP^.°  ®û±«[%v(B4m ^†\1‡Ý<^T'1¿’Ð>/d¿oäøoá\‘i zxTŽ êŠÿƒ¾/«ÿ'Ťì÷ÃÓ@¬0…ìiÁ¤gò…jµÝ‰³1åcî"^à+8¨ Ì[Xq¯«5a×W1¯Š°¨èù$± Þ$VžB漎“†–#ó"ðÇ„ËsªtÍ*²@¸|îäøiF³Ý3„²¼Žƒ›ªÅ+Îûµœ‡Ö½QX”K˜±t3ÇT/+`¤¸ÀŒŒÁ^Îá‡]**ä"Žš÷òúWó»L³ÐKhQMƒ_ ”ïì¶8F¬Â`t=ϹŽkåþ.¡4„S¿—í Í^ýÃ9B7#|å „Ï_ ©`DOsŽuÇ)¶s¾~@Î{9ß*ƒ©`¸ˆøDŒ×w,BNiGð®’ÖL(õp}Š#j4Î0s©VàFoµfßOæ±b@ç ˆOé¼âê&”~wΉÚ(a øùa˜Z³KM`ƒ!L>¸š}W6òMœ#°C‘§!ÅTd?wÕ²ŠC¸ ¹”´”~3Π¼M¬âD®¥Ä$3D(£fÂß,¿¸’´zðjŸü[îŽ~©…à#”­\Gª(¥ÂàRŒâsY VºÊHý[ÌÕÓ‹iq1ôÂX"8†]ÓÙævŽ÷Z¶ÛD#Ä |3Û0ôrök†P2 F®œÃ„¡øÓÿù—¢·^Ìû³¸fä–2Ì—0ßUsåx]¿ØÕ­óx¸Š||) e¿‚À¢}–¨ò²hõÔN(Â%â%iÅ+ý1BA]"”ç ®ò$Žùz¥\ä'~ŽPbÖ¬áL^qñŒp’“°øBÉe¡âÞ¢nÉ~‹+Gî›AÌû>‚W~úîn΋ ‘ Î5\ðþ.ƲÏ+êál§›pGMæXdX/åø”Ëp‚iÎ>á `Bf‰ ¯“Ñ-ár‡û^%Y[Ãù×ò~´AnÑLˆÂb+émÌw¤c…Rà\Á])ê–¼·Ã˜OJ¶ŽW×àÝ¥ŠÒÏã¢ï£ùìèyyŸûƒÂ"¨k:ö\#`"¯ÿÞõtæ3 j`ZTˆ+h9“«n/Ç® ý…ÊóV*†=y) ¥J$õ¸vjG8ñ^âÅ8L¼ú~PhRf`”Å2Þò«@x;ñ2/QñRžÀþÝ‹yMˆ—ùr^Wäa7pe‹: P ÊU›gÓ/‹‡§-Ûz ûѧ*}¬ãàôTŽ[ÔǵÊÜtá$5e¼ö ]Xþ6b÷ò^-Oã$¸—³Í*í†\ Š4n!ÁfEè¶‚c„kåHÞ³Ù/Å8OLVTϪ&ŧD¸îÅt•h<”ã—Kf“ØY‰Jp]¡tDÙ\Ã.=AO•чŒ£ ¨2Jš'Oq]C™êªPËk©~ð±\Il€ %4t¯Jµâ—"'”OsåüB±½‡]J#ÙWù­±’«å˜f±bÖ _Ô§pön3¡ü¤Ô”´&j QWT9šTf/ÿ_˾¯ TÉRMx·p$Ç=O(·\R•Ä{¯f'_ÏsÚ c¡`©`ŸG³­9¶³ÀÙQxñ9-ëлfjíþ<Ç7Öð®ªSn×0¡D`]hÑrÌe?¤ÀeœD¡‚î»øœ†1ŸÕáÂÛ$ \O>7·1Æ$6îzŠèÉI1)J}cP5B±¨B’Ød=M5;ˆ—\äZRÔÚ)€ÆSÄ rWˆÚ$^ìW #ГmjXÑj妜öz™ê˜BY´¢j;Ç1 HµÎÄkuBq´«pòw±ëFèEŒRpuWÑZ% bµ]ß%”Ì&P[™Íײß×0Ñm\ ]4;ù÷p%.áíuB/±r”¿¼7ûPú‹93„ò?E('åKˆFISµì˼}™p5áZÀû»ÄJ·ÊCÎù*Έž'V×¢¢f »ÒȾ’óØÉýÆ¡›€”jNÅë44¿øÂl¬ÁèaèzÖ§aiÞ› Ã%´˜8§´ã¬åuw*×›¯Ÿ)ņ1œÆäØ”¹~3Ó.à$Ç©¼·¢…hÅ%"n £§ èÉJ1‘èÓ€*ÿ Ψ"x­;óûYÂPÌâä㘣¿Ÿx)Úp õ(ñR‹R¾oý×kU†¯ÒôŸÇ«/f•$¤`´`€*ç(µëÄs’PºÛyþð*ü$ÎQh!VÊ‚NjÜO(ø¾ü»O‘ÓÝÌöUF¨©Õ£ú¤¹Ñ óUÌ3/wÚ2Þ ÝÉö†²Ÿ'ô†¬Ëy»‹³´«ÔFÂH\Îk ªÛ˜×šÌ9Ò Yý¹Ž¯’øõ”²̹?ý÷ ;жS—áÅÜEíÒ6ïÿl¬ÂÔU¸±é$>˜…·WìDˆ›Yœ+ ´”J‚Îç|i§5“mVsN†s »zðn™Øéig*Þ&“QÖ·XJEø§¢>ªwPÜ@ONŠ¨Èƒ«ÿkÜ(Á¨³Xêe¼W9^h˜A„¼…‰ÂÄq?E“5â……xÉÿg\ïu'mdûS¸hû7ÎÀOæCaá~¦Ì‹ÄŠ]Íwq1˜//H«èޱöÿfªl V•ƒ¸¬ Ê,Ê% Ü†fL9=M(ñõÖ¸‘ŸÍà¥Vð‡ˆÕù\¥_Ê„mËù:C(ó†¼'—0 ¥»•¾˜ÇOç1ÄÎC”×"‚Óæxþ^¬Ì}WžÿZÎIWžÓCb%½Vy&ŽHÌ`qÖjp믶Y[‚õxçÌlšo'Þ½™}?›í/bÄÑ<¦èÞ$bŒ'+nc˜ñéœ#1¡nbºnŽ®|ÞeVLiC[•Ȩ¹¹KÞa–À““b>@>M  ªt´2ï!^“ˆ” ¤B1˜¯_Hšu";‰ÇÄÛ/ÿës„ò;Lp×ô KTÐk8اD§fœä¥-û bÅ«Â"gE0J¬>µBì!”£V‡›yÎV¶÷vöõ…üì^Î…'w ¥¦±ŒçuÖs>Lj ²ê!Ü%\3GˆÕïeÂ%ÕHHaé”ïɾwàÊXãÙ¾\(*yÙ‘íî¼D*Á¨¹ý6öy÷cFÒeL'­/Ñ=\Ékþ0ç³ôÌGRC^s2Z¹ŽãJsÙçQì¦ø(¦¹ÞË>Ôòó·òïpÝbÑ]Œä<½ƒáŸ×”“ž !†ÀðXÁEE!Þ‚YAµ‹Eô%ÌKôAPÐb¿°Ò@¼ ZñŠŒK.¹>º ez㸷1¹—^‘–i-|ü«„|—8¼C¬Ú”qºM(ŽëÄ‹: L¶ÃÔŽ•Æqâ… ”ÒH¶%×ÈNLò:dög?D2§-ñË(°Ù“ã˜Á|Dk„²–Âj$ Ã7˜ê`X¹~X½nÁ8»³…Ië”Èô6ÂⰗŠˆ¬ló'Át's¾”Õ‹Q7‚I®ÆèBÎéaÌÔ*’¿+ÜÃWÕ­½ì„B”ÑG l=˜IS»'!Ç”D&þ~e‹Zû9b¢gNPa%ùʹ®æZèþ¬gßTòQ.Î[9§*fÔD(ø Œè:„ƒãŠ5(Зã5t‘'#Åv1†ŠåS d_ ”šÜÝÙ— ÄŠP 7³¦wP5²LS0@ì‚^'Ü*ãQL-}˜i­ÓJ(.%iieúåœ7œmˆnYŒ§£x×%*éÓyÎ2¡$'±qWnÅΕ¸†k&ˆ9u%ÛéÄe9ßËû¨¢?ë•gg‹P°Âïøô@ËVÜ+rnk9'ª }W;Ž´ïæ³Y ú=L!w•ÆgòyêÉcWrþ{0\´ŽóVð¤ÈþK1 Ÿ6xóÀ4âbßRü£X)Š z£ƒ”$¡ðvpP²-ÿ~ƒ(SÃD$dÇóœCù]Gö£“Pžyþex>M¼°Jú‘+@«²þlOäkç…£B#"¤ÛÌñµ¿šãþvWÈw³/B€&ØJ°Ö0^½†ÝFëÀß!VÓWs¼71—¾Ê1ª¢ÚFö¿+ûý¿J¶Ž‘X§³_WÑ¢jPÆvgenóú½„¢”{fž0h1Ñp‹4ï:&Ãëξ^ÄÄj•1ögûGòÿªñhÊ9¼ˆqýâîQ¦ö0»e«ÈÕœ_%¢½”×=Ž û8í¤j¸…Vðzf•p(ïç$±òWýˆ+8Ïc' çM¼•Ÿ‹¢}÷_ŠØ'iÅÉ`£ù;öã‹G¾vQ"«"“8SVqÑ åÜ!^@mÓL¸˜þo»å÷?‡3=Eë« ì±â»­„йN¼ˆ:N}Uî$¦–Ä`‚»Šâ<Žuôã„§#„Ân ”î­ìÇ®E| Íë {þ*¡€×ˆ•ý)à/qQQ.ßË)ßÂ0Ç71Y]C~?‡w<§±_ú6¡ç³½8È}'É É%—Ô4N¨“ÁòEñzÎ¥v í8©ï,¡\/äuo`dÍFó bªle|‹=v£rÞżwrá(† û¢{Ò›ßi>UÇZ¸ýIsš¨!”µŒ›”²&/ÊP‰`B_õWÚêGÐ\F›²Ï§r^ßÌþàâ;‚BjwSå  ´\|g*s+.A_Å-p,Ç5š÷Lî¹6Â0(Æ"LüQ\jq7çXñ–¡ÊùÝ9‡B/-åç?ÆtϺ/µÊO'&ÎS݇#Øà)˜]Í;ÑgØí´ã9„“ÇqB Võ½»¸°¶+?Õw©ÈþH1Q$‚“mp3¦ú•¢é'^ÖF 0MøcU€Dî“»xõ¾D¼ JPÚÀ/Ì6^a©‹P1Ïcšg3ß!àƒâãQ¦lÕ@Èç}ŒØœ'VË„b_&ˆŽƦS+±§‡ðÙ‹ôKÅ;9ÞAîÏÆ]Ĩ f‚îBÐÕmBñ¶`â6±v*aJFñËÜ ë¹<î"†ÞëøáJÇ*×SêYByÝÊ{õwò¼˜Ëc®g?žÃˆ®iL¼×NÂ7P"Þb¶#·\ (Å*THe/ &p`UÄ{}D–÷]Œ²ë¥J­ÌµÝ—[â6¡4'p‘“;8kVDiýy¾¶â‚ ŠÂYd_ª[Â~ýŸÇÞÊnɱ‰òºŽ9„Ô׎p!Ç8šãPpZî1±}*X«EEÎÅsyvrNU"òfeLš¿W³íwpùÌåÊ3.•žûCyÞ|Þ{шtäÎç9;¼³9V®Î@ߦȓböI´ è%üï‚}JAi²‰!‡pT ‰R6`VEÑô®â-›˜ßÓ0¼9~FqÑð ¼8G¼àòý+Ã÷(æÐ#ufØW½x†v°|»5zòx­ZûqU®áü½„ Ý$.-Y'¨ŽJC‰Y9"Ï_+û¥ì— ™×r>O`­‚äÇ%øBeì«y¯NfûÛÙ÷“„²º‚yõoŠªÇFîá>÷²Ÿ2˜s¸"˜\V£ym)Áqœ[ÃAúaèF*ÏŒlÈ*«Üe.+€~|»çàK½ðÎfÜOƱaYÍgé H˜Â1% -Öâe'è)|—ûTš踋ì¿ðäAPu•ÓB<ÜzA´ ìÆJCéô›˜¯§‡xyñ\`d‹P>ç1Ëc3¡vðêú]Bi÷`h¨ ™5Œ¬i!V——0zC¾{ñµ/ç[XyTëº.aå£Ä7å:/ ¡?O¬Lç±û¥…0<âÓ9‡• \³ÿ×±ÂN®1¡ îªU¯”Ü0æV" ÀÇ® !wÄC¤„µ¶œû>«À´¨…R¼7Ǧ$«mÂ7~§œ<¦xÌì¾Q–­j,¨ŠÚa"g¤7Ý&vC9§âz‰ØQ‰‰VpÏ%¼ÐŽo%çxa3ÎSYÌ-Lk-÷ÕÑü¬†³w•Ñ^Ëñ‰Âc(iÃn7¹q|äŽIÐþK1A ´‰X5Æ>gØV .”Æ®·à¬Ðéü\Åbd(Fqq6Ìà(¹C„ï\˜yQ3÷Jùvöó N½ïÆ. âålÄ8o%’©ô£´*QUƒ·“xÅ.ÖÇcÄKý*v4 k3qʵu2ûóBI‘sÒŒkݶ+ú¹ìÃ-Œ8êÊ>È&Ez×[V•,eì*cu Sr•$&QÅrîÚ….^£FBÉm4aZMT•Òk ûYË6d³-åF(éLt ¿‡™YU`¯¨·+÷|"¯]Ãänòå7ß貓 „2ŸÀ„nŠq½™ý«ç|/Wú.WÕ^庂+0>†+ãc?¥4ä“‘bƒ<ÌÈЃŽr_€ƒ±ã˜R>÷÷ò¼±oVå"O`œµVæ=„Òê VÕ·q]^16Š:Y¤bç…)®nBé ÁQ¥Kê.¡lðÕʾ Ã(UñK¾ß/æ|ˆ©ò®Ü™ÿÅlšb]ÎñíáÚµ¢¬n&V¼J®†|¯´G è付ÓFl“Í•k·cx¨|Û½„›ê8¦DÙÙbέè+„njËãjx§ WÉ*¡Øºòï»Ù–’EÕÜ’};œ÷°/Çù>.‘ÙKì0ÎâŒå½lSÆA,³“¸>ÄLÞ“vL%Ý@@IQ‰—s,í›Ñöó9ŸƒÙoq‰ŽB\@[9_·0zKî]ØðöàœƒN\³a)Ÿ§RàÉI1û 2òëŽ/‰Ø*µš×êY®ŸAÌ»ÒKøfEª¦@àñÂnJáA¦KU»Œá’¢‰øû¸¹ªV‰f‚0H è6¡<„wWU¨qUœ/â;šÅˆ"!–dH¶ð¶…0&¢3^'”îhöKk"ÛÝÍãw+sûýœ#!QÚ £³óÓcÑ.CʺZŽP™­UŠ Å[ä¦Bk3] "ÙüY~×A¸æT_ ï`a͉¼VæjR±Ñ-¥£9—‘'”õ×ò\Qj4b²¶#ÙöyÂW$ÛšÅך·^bQ –Ή|>Ø­¦÷âÞ\Á+yívµ T?Zò~ŸÍÏTn,ǡʯåùªŠ& Œ"û+Ň0WÒ2¦jЮB»¾×sÞçòz‚õöçu.åü½Ÿç»Âíʼ*ð-æXAa¯«{U÷R|D;­ð»µ½˜í¶¸?_b˜0š‚ñnFgç-ÈXŒäÏ»8Þµ˜×ZÁôãEö_ŠxLÒðÿ·/d?N°x©ÛðÊ_;A<{‰ ãáþÐêr#DD\#^¬ <·á»ÄŠQ+Ó~¬Øb…®¨8cT}¬»5.b¿º\%*$#Ž—B±Ö(˜£‚Ž „áÛÄðUÕ@B”¿ü$°¹}ÿ.X*Û¹ŠÝ;‚W*ÿB0H~ÑêVß^bsW«º˜}VLe"?oÂ>ëÁ¼Gr‘-Êk“¨ZaÇó^)÷cgUo`í¸Â©ï‰ü^î¸u ©<ší(0-*leÖ Õ€QQw0DXAdÑ:÷ííœåšÔrÞjxa"2Bí˜6+m) Xqy\yínåù×nQT!•´ûÝÂqœ’B÷ø¤€Ç(Õ³Êt†xG0/úu CbD®ŸXI ²§džãÄ +y/ñ’ŠbâñBÕ%¦€¯—{˜3HÉ7"€ôS/÷8.brÃÕWí0™šXJåÓÝÈþtbTÔÆ³ßÃ>qÁSE…¬â5—pq”œƒæÊ¼ŠaUAáünï¶ åúëØøhw$öÅû 9_*lRÍp}‰ð‘+@+÷ËÝœ;q‰¥ó7ÚàònÛK7rfòç&®³|ŠðûÏFYsz7ç@®º[¸pŽ’ª RŵK9Ï‚œ Ѐwb5Œ «åñãX‘+­øÀV>ÇŠɈ‰¨oSicû vÁmæÜÞÆnÈŽ|þþSQ<ÌýS˜A¿°"¥!Μ Œò¸¡p*…'YÁ…R. H<;¢ ~²)©GÜ@â{¤T+ߓĊJt„r¶ÿñÒ«ÐÌIâÅ„P@r©âS=ûØŸ×ÙšVòrOËÏÅ~º…ƒ´Ã˜7GÐW­$Å$Ú‚ÝB"7Û \39ÿÏXß‹±Èwo0z¢Îx=ÇÖŸÇÈ.FÒ+yÎÞ¹ % ÿŸä˜gsEg± ¦‹n¢g7þß$”¦` ç0¥¶Æ.Ä×aŒÖ0/’ž«…üî6aäZr^D¯1š÷ëa$ªœü#¸>Âaî¯,&¨­v+*ñ¨¬ñç1…Åpþ-%¯laÕU¼¨†³ŽE"N+)ùEœg1šóª•Æ\}¯>,.PŒÃÇ—böAô *ƒ´“PÜZy*+èåõ<~#2 ¥-ýKø¸D(‚c„ò>…Ý9'×Q'±‚l'ÜA2@JÈQ™?A@'÷Éû¸8½’¬Ö³­‘“‚×5¼]?›ã˜'”ìßÉónŠä&®m+£¶ˆ3låJÙÌ1´JL1”¡—üÌ¢¾±†òfΛV*‘¸@(Daç€sÄ{ôåè‡[«.K(_t/Q‘•÷¹iCþ-÷†Œò$vÇ)ö¢|…Ãxõ;“÷o%ïßµœ£_ÆÌž‚PÖ²íç³­L}Ñ ä0Æü‹~C¹Ãy-í;0Ô·£ÒO^Î>üZ;ÜÚ‰gX…ŽT a£€6r®X÷]ÏçIÀxG؃w½ÕÀ£‚µ3c‘G—böAìRз™Pj׈¥ŸxyŽb_ëVås_•ùz;—ˆ èNa?ýáüüZ^SÅ=^Æ\óÊøì#^´Ëø%׋ˆåúßò*‘\u"û'jãS8鬗x‰å»GþRöë®[ÐD1¹žº+ó¡¢Ü#¢nm­Ê5J±Ý$”ö5ˆõãr‰5B ž¨•¼bód±’8¿c¯P7ÞŒ ña”úóû:¡Ô1š¦pyÂ…è[sÜÂ××ò¾ÞÊs®à|‘ç Ó8ð/㹌K9Ja*Yp–Pê'¹ß¥8üfëyTžA¼Ã”QºƒsF†ó¹¨ï˜ P5'„`#?´U‰ok9Žñ¼W­9†ùì§ãÙæ% @xÔJ` ðÿƒ?E,ÅìƒT‘@âcŸ$&ûfN”ë¦?¶ û“Å{'åû_Ìöz+Çá¤$UušÂÄiJ<úqöIœ#ÄK_ÃER^Ã.»˜°­»t”ñ¬$5å9\˶[¿Ÿ¿G ¾÷)ìË—ÑPyÆnByÃ>“ßÂÕµTRr6ûø<æ¦W²Ê?ŠõsS\+[WAȆÝhû-\kóàȨÝÎ~ˆŽáaBeCWqa{¹™ôœ,ä}:‰s5úq^Â|>—{9WZà ¤Å‰ŠÀ¨êÝÍü\„q% øÙ‡}~Ð¥€}j @PPe{.ÊixA‰½m?¡„”´ 3‰îKáä·ó·‚mJ2ºŽ“„: …¨Õí ù£-¼( &1“£x~Öå­,q­f»ý¸Üß4.HÒCœkØ—?„ °ìaÒ»÷¬@ñ@^WÜEâ¾¹WÂ#˜Dnsæ\ã~½€ùjVrGs>þ‚P‚í„;¨G&,SòÙ¶h¯`9›s© `*€²˜mŸÇõ–•É]ãþÜ…¼cºžóü2ð;˜ç0¡\g~/#,jõyS/‹ŽC*±'Xâ6æG!Vˆ?Á=r' ãú·0ÕÂö÷nVþîÌ6DÚ¦D¯NB'¤àx3„òV¶¦ ‹Z(˜ãaŒ0’^EAÄ©ü‡y %Ü#”Š^úÞìã*áÊ© ¤#ǽCÄL&sÄÚ‘>r?Ô Å5ƒ1ü* 9w "ÍËf#¦¿A‘a«7ïÏ©lë8¦ŸP0¿•04ƒX®ä±¢º˜Ç4 §óxÁ2§¹ŸFù+ &Èç]LiqïʤH{:…ýõRÈ#˜°Pø~Íu?V/åóÓFÄ}TáKIŠÛy}ñ5i׫ÏEÞ”Çb4™v-{Ø(.T}ŸŠì°"¥§ª`m„’Eƒ œóx ,X¶â3„‚”?UXþâ…Ó ú"¦™˜'ÜÇ %Qõáîr?c¥RùoeÚ1¼op?>y‡P/côÏó8È-zg­n…6]ÅÉìÃÅNX‘O.Å|y”-i#N’Q³Ó@(®Fœð®¥U­ tòí‚ݓٮ*_5¾mÁ «ºâêï$°J!^ê;Ü_öo ¯q gt^϶ÞëJ]û ¡,Vˆ—XÙ¾Úœ ›ï @\?]„R•âÂôM„ëä*¦WèÎ>@$†­eßêxÅÛ¡´b!ß½üËºŽ”Þ$‹9†ÙI/VæK;íŽ&1e‡8˜î`ªð·pÞ64›ÄŠWõzò³*2¦9ÿ¯%8¯âD¯&¼›[Çq')ýÕìÇ Ø`´æœÈÿ>˜s!—“M˜[õ)úr^/ç÷lj…‚ŠçÔ¸ß5&¤Us^g{µ;R\Gó9 X( ÿÉH1Ÿ@uK*2µF\>OØr%„ c—Èñ¢ÊM!?@(Éab5¨Ôù=ÌâÙL¼xr=õ®#½h¯PL¹¢”d¤@gk^C+Æñ¼F vÈØˆ&¼†è扚°]Ù§‘&±;„ñߢ‡þ ®#;„Ù/O`œºÜ‚FÎb7²w¯àê(.|²E¬6ïJç )£\QŒJò:Ž´ç¼VáŸ9¯B] e[Bô@áÁlç.ÇØ†¹rŽq¿Ke ¯´_ÁÌ¢Ó9W*˜#„Ð\~'´˜Ø9ÏTž£¦¬j%nÌëMe?®æy2ˆ‚+6tÇÄÄÚI¡£}pk3ú.WÕ^·pýʪ9¡€ïàøWqÿ<9)`Ÿ¥Ê ÔO¼p*Æ¢„§=â[Ål¡BɈ§N¼ˆ*!¹„Q2Ú~/[€öãÀà!âÅ^Èß P6â¼*\/Š*Ç1¹ošƒÕH(Çs„Ò¼’ÿ·«iå ìæ¸Šö-\êò¦ $b;Î)˜Å”ÎS˜»=çêNŽ\OAïùìxõ‡ csœP\ó˜¦{1Ç+z ­`e”OâjV*èé/avVÅ ”<¥ØÀYÌw#’:­Ôß˱µTÆ%c¿žÏÉk9.Ý;áæ‡rüº~ár|0¾rA‰4ï^œ\$ º'óÞéþìå-Gñˆç# g@u¶7Ý´w‚×*îqžXè4c6ÒYœT¦DÁ"OFŠØgi®§©PŠ^rAñ䎑b]#VÝ5L䥚Ó¸2Uñ2Š:¡q­HÙª’•ðÛM2D«H¹Kú0_ü ®ñ»D(— 7EÎÒe„rÞËÿOå÷·1eñk„ÒWþ‚v&ÄCÈ¢ÍÊ5›0¼¨ 6 …TÇ…ÑGr.5Ÿ¢G®å=Qõ%Bq^Í¿Çeu7Û’+ìrQ%½ý“Àýh¿˜çÝÆ†àË9G ÙGJiÛuBù <°‹)˜qE0µ{»øpŒ¢‘Øá¼ó­ nÑI÷ƺ)Ÿ‹qŒÂºˆoä=z?çg…0` Z+IOUÇDýqˆXÑ ¶+ ‚þ—áÛÅüP‚ØVsŠì¿°ÏRå4i$^ )Eá±—‰Dõ‚o7æ«„’[ÅÅÖçò3)­¬”-Û‚©!VpòMW)z…§Ä(­0·p‘r%|É ¡d”¥»J(–eœÉ¼B(ðœ3°C¼èâ¢ß!vC¸ Õë˜&¹?ûÜ]ùÿ 6`„B5µ”ÛUŒÐþ'Bñÿ2Áá¯l]ÁQ70Bª·ÒQrÏëw ³†‰ý®`7YFMõ«\Uy“ÄÎMIWÂÄÏçq"³[ÉëJz8Ÿ‘ƼoK˜ŠZH³®ì÷)\Ïw>ï­*ÒÁ»B™!þÏCËŠC¨¸Í1œ"—^cž«Ìer—‹n—X$\ÅeLU a9ÿW<èv>³Ê/(àÉI1û( •ßRÀgp¡t±`j«?qÔ <‚•\Aë„B‘úæ†W¦¬hë„Òx'?Û$Ü bÿ”»CÈ–=ì¯m"”ˆ¸\špÑt¹. Jòño`\ø2æ=úCL‡1ß×0³èyBI©ÍZŽi–0ä9w1ŽÜ`5B©àD¥îJ»ÓD|ã9Â0¼™}SBÛ2A½ˆcŠȤ­\(ïa´•*]Ï{R˱*O@‰Pª1@Îå(öÇ7 \ÇNd{±{LÆS»[¹™s¯‚8NàzÈB› ôÎpÌù[Ìþlb2¹3„]Ê{,wœ rmÞɹ³§-bdmÂðe›ÉþÞÊö èÉK1û,U#ÐJ(¹~\5ª“Š)Su€xI” ñB)…_®ñö,ä¹·òØbû¯B%BüH)ÁY¹J®|t”P(c„B«/~/±BTò‘\ ãù¿ š8I‹<þ*a@„óVyH•UT532¿›cz%ÿoÀÅJ®FOaDN·˜k¾”7PÃIHBI‰©²#Ç÷v«ØHSŽ_…y ¹ŠwEçò>ÝÅî¸NB¶`–Ôã„kHÁdWÍÂݨ̫ ±8™Kî·É|>® |S+ÈPý(ÿâLh©]¼³l!ÈKyÏf߮幛y¿ç³q ³ÒŠâ|b]k—äœÃ4 ƒ9 NOå8…€R} íŠ<9)`Ÿ¥j„“V‚×=œÔÓG¬¬^ V±ÝÄË.º‡.è¢r}§ dÇ›¸Ì h{JPÁæìNÿuœ{ †Ìoà•&8iK<ù¥ëyn_^OÁÑ~b·±†!‚§òØ7 ƒ¡ŒeÅ@®«W)f•Ñ’D+ÒaŒHÙĤxR¦ÊÐÂéÞ]uŠT,UÄR…±öJ_Eq —|ÞªvŒXínáU¶ò&¦q"šV¾ xª&Ü?òÉïšÞÏþ]Â;í×s¬ Ž_' Ãé¼÷7òöTîïR~.WãYî72³Ùæßæ=Q2áj^o‹089õëxЇ »ôfŸ”ð(¾¡õü½ˆ©ÃL´Ug‘'+Å<ÑÊXÛÛŸ#VšÂ[·+I‘–]ÁI;rtãçòûî/P¡¤û&^ fâåïÏkô«QQ(ÏáT}Õàí" Ž|Æ+„‚ËH¤hr4¿@¨óy­="ÙJ\?“Ù¦1a(ªj+à«„¯Œ Z'”„EBˆDL0Ãk9öÃù¹ ŒZµŠtO1Ý)ai=ÛT¥4ÁUëyì¥ìÿùÊun有³H|6ª ¸K5ÑOh¢›•Ï^ÈßB‡‰æA0ד9_*«¨ü·e€| Sbk•.Ò=01ÛjÞ«·r.DÍ ˆÙìÏßÃh¨œ¸Yyfúó·à°›y/ĉ%`>w\À®ª²x²R À=Ü[˜{F[gÉäN8‹ÓëUÀEÊ«…P0[yÌâ~sáÈÏ«•«Ü·°’€ØM(qh€xqµ]MPRmÙ¿†dnæç‡óÚoÊý æäéÏëü„0N"zÓŠOˆ£yb¥)êìÝì»h4zpܼvþ-x¢Ü@Äh)¯+(åa"!MÁt­¬÷²o­„RÒxµ³èÇAõ®lWs|£§1#«ÐZâ%âh'Q#’àTLn®=ì#×. ?ïábåÝ@TZëÏk+ '·ÉíòU7j" É]\Ó`•0B/c·äÍ|„²…µ²±_ÂtZpÌc{«§r, (k‚‰U±‚G©PäñJóÓîÀçQ\É(! Ì%¯-¿Ø•®;¿?B¼ŒJ ëÃ( ­’/â’~¸Ž«”µ’w%U@N+çã8Cµx©—qM0‰šØJKhÊk¶î•l$’Ð:½yÓ8®!öÇQîç•Ì^Q^ªŒ¿ûÅ—×üZŽ[ôÃ-˜¢€ëQ"x;W‡‚íZÉ`/>Ÿ‹¸¦¯ªdÝ!ŠüÈÕqÇ7HW|e‹pítÆñ.ƾžó7K(ÝE­ \±Évâ ZñU­âùÑÊú»ùÙBÙ®9í8tkÙ‡/çØF±O~+ïéæ®ú…¼þŸâœ!ÁD~'Ò<%½éÚŒájwÕä°¢üŸ¼”À‚»ðêª gS*& d'AâÄÅÓN¬lUå*ζ\"V“W0¾¾×øW?ñ »},Û]ÄxÕ">Wvw%הnjcÑ"†i*ÃT+{Q Èå¡2’_ÂPL•M”qÓª»-ÛWæl?a…ßżý»˜üMälM9ÇGp’Üm\øDÖ„—2Ï’r!dxEñ ‘Mƒ8.£s𹇋©ýÂ…$š‡ëÜŸ» £¦ll­¸•-êïU ,P™K%Næó²Ap ‰äŽìÇòÿ:&Ø›ÏgïHÎçæXj ‰âʰ>”cS—ìƒâ4Ú•­¼ëÄŽñ^e¾‹xòR @Ê“(:¡ö‰—¡#ÿî'^Š% ·7ŠVo£¸|á¦<¢â\¶->•öJ[J¶ÚÀ™d[óyýëX±w/ðìÇV ÷æÅ$V€ªè4ÇýÔÑB A$·ƒàªC˜šXÁ;„Qz‰ðK¿í¿Š³xÅÁ¯]T3މ’¹†Ý5‚uЇIÆ@}ìÊï•\5‚RÕG=‰á¡FL³Ú1ˆÉUõ|az‰qŒ(R¹ËMbE<‹w-º7}9ǧ0ßÒFí(øÜ‹‹½Ôòÿö|.ng_&pÐwP⇠E?‡k>7âj^ÛyÜ:vó :Ò þËPªÎÁd7CºøVƒeî¯ÅPäÉK1)O²èD#ñ"+kWÙžM8I檽„W^ÂŒïå1â™9„Kö‰>aìŽcÅõ ñÒjû!éñÛLög*ç\Q”×òÁw`å/C ¼¿ ¼»ŽÛK@-Û¹Ÿ²ùZ^oœ0 ¢[»Õ¾Žé£U\æ\ŽAÂ0ˆšCÇŠ¼cÄ9 +Ð[Ãö©Ê½T€]»JíºqùIÑjLa ”kÑ%”šŠôy:R @JUéïÇjDa%¿ÈÏ­@æ,^aÍ Wu\ŒmJžR™Eí$PViÁ ³[%â‹„?C¼À È®`Š­Þë„Ò¿ ©µlsXÅí/û†0*Yi…P.=ÜO '¿÷5ÌšP¾—qÒ›úô·˜¾·2WÚ ÍóC*÷Š “Røç°¿z ïÅbŽ©ó'­RÍËyMÑuhõ|(Na:„Öo7ÎH^ͱ¶c¬ü¡|¯TŽ]Ç®°»¸|ã5ÌA$ס2~€¿Áh£Ã>ªçë×p|¢–ÏbDr=‰‹IñŒIœ;¡êuÍ„ù \o¡çL á“bCë8éPD{Ç?ÕídŒÊ.àÉK1)OÊÔ†!p¢U¥²‚’cCå lkÎïïa&Å5F Ïã£w³¿/ ¹/û¦1*î!ôØì³Ü8r1Îç=üa‡0EÇrž×“¿ÇòÙ™Ës[*ç`©h­/s¿ÿ¿(ÿ§#ŤÈ<ÎñaFE+áüþfpl©œs'`)ƒW”¹‚Úk×.äù“ÄjZËráÜÀ8òB±ˆˆLIW×põ§1\L]ÐN°!RÀP¾ýNÂW}†PÜ'ˆ]t Ý„Që&‚»âœ¿œ?*<Ó3‚¯`¢4­´EñÐÌ×0!›”[KŽUµŠåÇVìc£ò#Ô‹â J8ëÈs„o"2¥É뫞ðpŽi–P‚7 ÔÍ Î^ƒˆÿ¦ó^æg‡¸¿\¤Ž~59Ãý†ýÞ (AÁ~ínÞÉkŒåqÝx·´…qþŠ»ÁPݽÊ3ñµü{0(¢÷èÄõ ÇÅÅxå·²…¯ä½ÙÀ`žd ®ˆ¥€”Çý6<ð»*ʰm"”•Ê váÕá.ð!28¡Y„W‡xaUv.?oÄ»q¬ˆ1TŠQ«òIÌa£¢)ZÁêå¯H_!f3öOâ¿ò3/`’v=¢›ÐJ÷"®Eð¡8WqU +·s„ûdÞÃù8Am cÍW %|8çç&mS0²-ÛW™N)á«9fŠ[1:I‰kbRíËë\Ìöç1;ص¯bwÍB~þNŽE|:˜ o1ç[%@ïâ8…b÷0? ÁŠy¼”c˜À9çóz‡ˆüU®Œ¸ÃD½õ<ÆýVÎ]! —²„ëy­ÉÿQ=mÇ+ÊêÿéI1)ûeüL.áÕ;¹®ÙŸÇ/Û«Ä‹§À"yÞIâeSÅóØNBíà Íâ¥lÄ˜mr„P87ñÊN ã¡°d˜D$&Ÿ·´â.’¯» —}|—/”Pu”/ ýwãµK¬PDz­¸^îaÂTÃq¹%D9ý¡pEë0Ÿç(ÇATˊüœ÷à}BYýB»Nì@fóø±¼‡—*çÎÊøL÷ .Тb-—q „‹8ëöLÞ3•‹TV­îÙq ó£êL,Ø@r­ÔÇóz³„›Ëñý%v™mæX'ò>Gì¨Zq&¯ò¶1y¡¨ªwpPXþüQœ‹qט®ç1¢)Ðϧ/Ť|ØŠ}¿®±:zžxõÒ‰O½êºP’VšZQË竊]r5¼›ŸÍâJU[„rêÇ…à¯gû¢""ÍL -UlRb2w…lQÂÓ ¡¥Ô[ïçñmé<% !”—寱›c£rM•GTqõ&¼šÔîcPj‡`Ç”¢zg>+Ρàú]\dFùÃxuÚsòŒPz#ÛÐx~·€yf1-ƒ\nŠg(Û[h¡ë¸jÚ÷ïʦ7\ sè+YëmÌñ$ø­®'Ê ¡z„ Ò.ôp^s‰XTÔ¸Ÿ™v›ûs¦ã'¨°è9TËB»Ë6gsÎkù,Q¨ž) åIú *?MÄË!ÿõ5B‹z÷ƱëÅ—ü†PÎäß#ÄK(…݆…ȘƊW5z/å5O cgÃÊO”¿;Ùw­î•ɼƒ%]ùӗ׫JKÈçp+—QÎ>Wñê˜áTØnb5+— £”×lVýè¼AÊ\U5±½JÿÛpñ÷Aîwߌå÷JXÕßÃÄn¢Ou·LrŸ ajŽÞlãb~þaDfòç ±:W±vWmÙçñ®|ÖB‰Wðj»¶zrÜpr êBkw4‰³wEo!’BUS ¢–cÏÏE "r=Á>eT>‰”xÁã“bR>àïý¼–ª<µŠ÷¡ nanx%ÿ¬b¸kyü5Gûñâ/Ü¡¼[0OMØuüx™µÛP‰I¹¢ÄUsà û1÷Œh6 7ÆIL€&Ì»Éj˜ Z¨ŸË„Ò“;£ —?T ôyBqÕ±Á›'”êZŽëf¿câõy sÝ@ìn9· ¥@÷6T‹9÷ªº%ZjeÊ®bʉ~¼r¾‡ í^"”÷höU…b:r Õ{©œmœ~9Ç'ÀÀ@öçE\²ó(¦ ¯á……J¶g_dðŸÏk  ùà UGåô5"Vp<ÛšÏkÆTËÙ¯yœõM>{çs¾Døi¤Ç#Ťì è£Dˆ”*äbþÞÂ[D |{;®¦¾‹c^/×¹ß1M¼¨ý8qK|ïm„¯ûR¶+t†âÀo`¥+þ¡ç F(âk8{VqƒÉßU­%^¨ã˜ÐMµ¥ÅU$äѳ¿½9§kùŒlá¢Bgó~\È늨ïvöùFµbHrsöYÉ„ ïâ:ÝyýÌd[äéK1)OÊ÷ÿ°LãE\›V>ia±Åý/Å0L¼äZQà  ª   àâl&†ü¿]„BúbþÉö•”5•í-ÆD,“Í„"Và¶ Wù:‚Éß¶ "¾ý÷0Œq=û½Møäå»VíÚcÙ¾‚¹ªz%ªåhÊñÊ>¯aWŠ ˜âÝ{æ×±«çELg ’’„rºE¸GdìÎÿðÜ]Å9G˜G²Ýx÷öjÎÙPÞß[„ï» Î.Â@uà‰ÊSP¼fÓN úª¸DG޹¯ªU{@lJ°“Q¬a‘h¥ãB±+wÿûù¬-eû/æ½ë­ôûNŽu9ï‰\ZÊÜÖ8¯N¤€eÿlH1û ÷áìQ•®z…Ó†ýÕ* ßG¼ø£˜Fº ãfe¶‹ ‚Ü%ÛñÂ_Íï.cÔŽŒÍðjº1¯ósÐÛ—6C™uçwrí"êg1g*È8K(‘<þ¡LŽààdæºÙ$UGmï`C&^ü!¬$e[xÅ apçýøÿÏÞŸÆXšfw½èÇ<ÇŽ)#3rÎÊ{¨îr·Ýv·Û°Û×>ÃEÀ5‚OøƒAXˆO$ $KF²’m%Ì Ã•í ¶úrŽáÒ¶ÛÇnwuuטóÃŽyŽ÷~Xë—뉨ȩ*³22÷úK[±ãÝïû¼Ã~ž5ü×)¼ žjÅXHèÂi¿ì÷äÒ’ï 3Ìxí EEñ¢Lí>^ru…ÈÞu¿½8ÎDñ“*côž(Ö£Z›ÅbÇï#5"ïøßÍMùµø?y,ñ㲊ëmuû³Cw9ØHèù4||,6~ Mú=F'ˆ.q5îŸx2Èà àQ’¡XámŠÊÎ üªl¢àK +ÅP&q&å.Ù¤Ò¦È ø1±ÔŽ)âÜc’~¤Uj¯‚ïÞ%©mUzs=šG0y\U,+²‰J Ìœš‚eÔ¡K8ª°ÿØÏµOÂHL̨£Ê/Gü¼n(âú· “‹²7¢xs2 ô„Ì =¢h<ÓPÄ©™Tß’MÒ5Yx«ÓÏëEøâËŠ ¿¦ˆwÃèê”y77eÞM„pF|\s~oÞ÷krÆ÷ÿžŽªåMÙÄýCŠ~„ñ.ùu ·Ä·ÝËðÈê²æî0 ®û±èömÙb1®XX^ð}Îûù ùMñÚ°Ÿûe©mz óÜ}KÁü!öŸ! Ã\žv(óH6Fö%–M8²/þÌå¦(ŒÉõÇnYH‚ä{ŠzƒsŠ^»e/2ÀJõKꨤƒÒÿ½a1á$½UEµòª,Ÿ0ácº­ðžCø Aºº¢ˆ¨C6Ù *Ô9©)àZ\’Mî´$¬sA!sͤ„>ÿ÷Yçüú!ó|Ö?÷®Â*¦ìªBA3:†]‘M’oøßÄñßðs”-ü¶ÛϽl¬B“tä Údìq™çÀ€Šf«iC‘¬eÿ¯*ÃÔd“á B¼¯îïµÉâî›~^Ò-nM6yÂÕgÁaá¾¢u+zí.)d¾¥ð8^õ×®B-¶îû¢ó¬ŒnÚ- g‚|'MßyVY¤} Ða_ôãþ‚…DÈàé#€C‚Ò¾.›œh xJf}^Vtûº#ûRÏ˾¨¨Á0A½N<¹ƒ-E‚µ¦è~…«¿¦6¨û¾“@r«”¿çd–aˆ-ýOƒb6 4d?éç¸æÛÎÊ&ÂE³™RºBŠ(ôW–lq:"›„׋±¡ƒ´ó» ý{ŠÕÞõkðY¿îuÙb:) Gññ Û1íc»âcïQÔ|†]ó’ÿ_~`KvY“yE½ † ‹9ª®½Š„,rÐô0¦#u G¬2ª’Û}Ì벉™Å÷Š?WG}ì×d“v‡¿Bòú_>þ?£  ÏûX™Ô—Ôßs~̯k¯èÛA à\ž.r8$(ÝâÙ˜F’M8Ð'±¦éô) „f\kbÃÄmQ·¤SÔ°BÕò¶ç¨ï‡ Nÿ°Ì½¬h<ÓP$¬áÕ3ùœ”%l?£èFŒýeEÞ¡îï1¦.…uY)úØÂ é÷ÏPÕü«i]6AÍ˼€²=#û”,ÆýŠ"_ÂBJì…”kôFò€–’ë²°qvú&ôú¶ç•ÚT!c¥SY}Ê_esÂk=Š~\ï1Er|ÌÏcJæÂþQÈOÐIŒÚ²,&?ã÷åx1®šŸÛ¤¢¦ƒÏXC᥵ú±©†µÕ÷…áÇ-üJ<äpˆ@‚ŸRhî`íR!<.û’Ö“øˆì‹-™åF1ûä‹|K¡ô9ÙDÒéûÌ9‚®>^ÀgíQáœUÐßöñ•-4)Ÿ‘M®§Ö1!(ò P Ûdþë² º+“ž y¤":a d,˜hUè%Wä!èaÐ¥è@Â}¯Íù¾ Ë\ò±Ã&‚+¿¬é£' ZBà ŠîMYb¸´¦w|»“~üºó¬"Ì3éûEIkË÷› ï«_A¸æûyÑÇP—Yø=²øºoÿÅâ{Þ¯/õçý'šOkŠâ6úü¾"Wµþq¿ŽL?~äðx’]¹ïÒòE «¦ÐŸi(&ij¾MŸ"6Ý/³‡Ò>¡æˆWAÛÇþ÷¬l@‚BÚ+p†hÙÙ—Ÿæhç Ê,¿º‚÷ßþ´B^šf)wŠc øqá‘·)*‡Ëz‡aEì†5/*’$Pi6sEÁ²šy\ Š·¾Ï½ [ ^R44ÁRï•-bŠf*°²Øß¸ß/:n¡åCøµTò6­²š„ EBcŠä÷ÙBxIÁ’‚ Ü^Œ°bv„d~»e“÷UÙ"uTÑ&ô¦ósþ¿Ïø¹·øûä¨ï€Þ ½•"6j)Þñq`€€ƒèŸ3©ç¤ÿd ÀSÂA}ùw›l2?£HÂö(’m}²â²I{MѼ¥æ¢ÕÆ’}q?¥hó8%ûŸMгпó²É… ƒq"Eý–ì‹>-³ˆwÍjf“õ°Âbðñtû q['‰zQ!L·¥HÓ!lK6Ù¾/›Ø&}ÿã ©j&«¿ž½2ÏbXQ|‡çò†ÿ¿MÆ]§iù€¢RxE!ÀFH á¼óŠ0É~H¶¨àÉÁšjñóã|zŠë´- é,Ê¡Ïû9œWÔ%¼.[¨èÁKE35„Äzd^Æßß¼ßë†_Ϻ"1Nèè–̈à-~Ir×|ßC~œ.?Δïãwýš0ùï×ý¿ßsÊÿ—ÒÄÇG.‡¥‹‹J%¬³ žõ¼¬ÂtD6!|N!1Ü#ûʬÝ%…>;½j™ˆë²/ö€‚»þ)ßöˆB¼ jbŸ¢R·]1ARà…’d—lRšUÄ­'ý|Füœ‚†G~ÃÇŒ%‰€Ü¢¤?'m£ˆ «sÒLjÄ=i K,É»³~½^Ò^þ%…º)ÅÎÈTùu?.é‹~·=ÎËbé+І5üÿ·2 ,ˆÃa!Ï)BhóŠîië ¶QÙDLOá9ï÷+¼† ~í˜KV‹‚‚w,!¨£c>ž-?ÞUEèé‹Ú›@Ô*L]Q°“Fe“b{5E-Š﬌2º£PÖìñ1]TÐP9_¼Z>žôëG} Ö|ÈLsÏiJó5?¯Û²Eˆ|ZG+~~ä{h*ƒGDÅ1L(ÂI°‰v‚ƒŠþ ;¾XòíèqFQlÖ©è)½­ð²À~ëýa¥ šø÷‡’jl_»Ç߉½ÈàaÿCJÑÓ¬ì¡?&›`´ÜPèÞ,Ê&Ò/*ÜômÙ¤1*ûB·Ê$‘»ü˜eÖ<õ07Öd“ ÖÒÈk¾”'ËÊÐmÙÄ4£hðþŠ¢Ï.lä*­*’ÉGýLîÐ;is8¬h“‰ì0·*’Ú?$éOûõ˜—MÌT¦r\¤§oúghºÃjZæŒúûWý\^õãPX…&“z‹,DïÿeÙBCïºp‘dm“-®¡B Û Å׿ž„qÍ!ë0«(ü”B:dܯ',*Z;®ù‹\Ã%ã«~ß׋íÉ[œRät*…^ЊÄ<*¦-÷²úæï\ö"€C€{=¸<ð»²É§Oa#™ðª,>>!›‰õBE$ñ»äïWÈHî –;®(ï¿-³ ÐÅ 2)šÇ÷(ê(ê¢1IÃ÷Û¯h&.E,žD-“ÇG´]!p7§H4Ó‹—ªÞó 5ÌÙä|T–¤ž’M®Ë¾ ݺ_S¤ê>†Û¾ EkË~¬7ýÚ}JÑÝLŠÚ„%™‡0çÇ;*[X++¦ÏÇpF{C},«2O£ìéKëË¿–úõ)¨©0nºaÂ…>Ð{Š—fò’ Y¨ ÁÀa™5‹E Šì‚‚þKQÛ´çà´Â @Šâq‰¼ô*ªâ½ƒ¶W±]" À!ÄþkiÞ†¢ߎÿïUÙð†l¸,›Øº}„5zõ·5o*Š’VîTLäum’P={‰¥Ó±ëˆ¢å# Úñ,®È•]EãÝÁ >†uJÜú¨h×üº ɘ;½²|Ä A‡\’Y·äCèæ…d‚¢}&!7Dö¤˜Äº…Ug}“Ц.ó>.Äå¤c¦ãEf„èý0é÷ñŒŸy£¿gxnW}ßxk$éWý:³xmÉ&èEuòÛŠFñèõøq)æC±<âý§ü\ ;}Ë?‡X]‡‚‘†²ë“bï”ß•´î¹<<ʃZnÛ/ûrŸ}Ñ^“}±‘ ø@6ù·È&À†m*,¸‹2f ÞŸÂsSP_ðãQQ{D!!M½@·û3¾bÙÔÐIlÞÇExcË·§›UÙ†.L`œI‘(–¢“Ú¬lbcòBªzU¡gí´áŸ…Þ8à×C~îWýýYÙ„Û©Pñk>æŸ[öûÒâç-¦>Ù¤¼5õP')»î¿St5å÷`CÁ²j(´øa#mÇo‘Müu¿Î튰‰ÿÏøÏ6ßþ¦"|×+›ÈÏÉ"òS~=æ]ÇvÚ®çˆÄ8¹ŒòÅåd}8 ÀSÀ£>ülßYË’M”¨WÒ¦qT6)MúgŽÉB |†/eC6Éì(4ñ벉ë˜lBb›Ùd·%[\ê2‹°]6¡¿æï×ü¸;¾=½‹iá8/›¼ÞW…¡IxY)M¼¨è^uJ6 } ›PƵòɴîÛþ@šÊ&šþo(z'TŠ‚6ž¾ŸE“nk$_ÇeÖ9a¤‹²I˜0]©Õƒ8µÈ.Ÿñ±ÑºqÔ²P­÷¢×ÏûÿìŸ(ÂuEûÈ>ßï…ü6rÐgdUº¨ÊÊ&ýW|PC·eÛèm+ú/”ª«¢Xô¸V°­î(Œ<˜ Á.äpȱ?~9/›àøcùÁäƒ4ð‹²ÉvG»"a|LÁröÿOÊh…Lx“1ª4#ù®lBú²z'±äÛ ™Ú&Žû±*Ù„EÂpPauw(8û›~>·ýsLÆGeÕb"Eð®]¶8ÒfsW:¡`ê¦:úð^–ôƒ>¦£Šø7”Òe<|âöTåžQ„•v:Gä\°º;|;ríŠÿwd“fM¶è_o÷c¾î÷”ðÜœöJI#q}Á_=þ"±|[Q@_òòg&ä<¼K²…ôºl±˜“"–"èý Ñæã]UôpfH/àp €gû¿(XòèÙðÅZWX拲‰áŒB“拲/#Å[ôì’ï®E_€IDATMÒ4¡/ 8ô4v懺& AZîÈ&®i™UL#ó ÙÄAŸâAEµñ†Ìº¥2yQª y™@ÓÞ¾Hf#¸FOä²Ä'‚z0$›@ɉ%EIe»°à^Uè!áŒôÄUÙb%Ù—é¢_+)´HN¯øõþÀÿD!µÑ¡`ö4²Í·ýþ~WQTGa=$.)ÛcŠÄt‹ÌRM± ‘ß9ãc%ô×ãŸ9§°øüœz]ÕÞõëHŸŠß …pÞ²Ÿ‹N©Ð*¥7p À!Fí>ïÍȾ°uí Qh¼ hÓשж’M ŠÂ¢EÞ%EN`@6¹ÀîVäîÈ&¾nßï²É`W6™Áì¡Ñý‹Šb§UÙ$:诺¢OÀ’ã™ÇÐ*³|é:Ex¥¡è¶àŸ›óñ®Éú tË&¿â Rô[.Ä`E—ºú}þ~»ŸÇmE¢–3uƒ ý¡]¿¦—Éê1E1ÓÇü3g^áŇûk-ŠD~¥X(h|s?A¸ýèÄ“E.‡µ¼‡5ùŠB ½WAI„i‚NJ”ÇÕ‰cÜó™%‡B&JŸ„Zè3»#› ŽÉ¤ ßÇúþ'*£íŠžÂm² M ;ŠÜžÄ¸¢Ó“öI…|ò9E/Þ—e‰Ü%Ù"·-›t‡ nZõÐa‘²&tDLžMYüªaB,eÕ¹h3 ÈÓŒ) $ièCëEXe‹DCÑéL²ÅÅzÔÏ»îcå^ Š!ð’B§ÍïÍq…è"z EOz9Ÿ"\3%“øåçô'ŠES:8±[Ö¯`é§E8‘ À3†ýeï²Iée…¶Và°BOŸPÉŒl€ÂÃgUk¯Ë¾èhóÓjV¡º&›ˆÞW¨tîø{oÉ&Æ›Š~±Û¾ßÓŠ¦+ Ùh*^QµÄòìôm—Vú ÅtÞ¯“"jôÃmÈÇÛ~Þƒ~¾£ŠÞ$‘ o¥ìZ¶U¼×îÇŸô?î;²…Ž<Ǭ߇/+ôð[ý&q{*%›Ø+Âuw"m :(òØÛŠD/2Ïÿ]¶`b÷×¢]–ÿ¹æû¥Uæ‚‚P ·¹….å÷[оP;µÀ+‚Ã…\ž">®N eøë²0È Exä¼öÆšÑòG]´&û¢¿#›|^÷í™/ÊZBA”Âò>ª°V¯+ZGÖVë¼lZ•MH¯Ê,×;²8z]—¯+$X¼H&(ú “#ç¦"®> c#rFÑ™^e/[ÔL)ŽZR,œ°¤†âyÄØÑâYòkGÏf¤—iä3¥ÐkjQTüîúùý°"´vÄ?‡3ÛOúgèàEÿÇΠDa½—ýçY¿Ÿ=¾ò¼¸ÆÈ`àiTаÖï*ªÉ C}Ô0M.‡¹E5Éiª~ÏúùW$b‘=¦7Áœ¢ŠZŠŽeS¾ŸãŠx{‹Ÿ;õ㊄õ¢lá£i:z4º'‘½©h¨>çÇkõ÷NÈ%ä¸Û|þ³Šv“Üw$>¶‹ëÖ*ó6d9•š_Ç3²jp>o*Dë®+zN ŸýQ¥î%×x:Èà“Ò€Ìâ[ÑØÞùª¢Ïn»ÂʃWOrp×ÿ>*›´çU´ÐEi»ˆ„A% +@ñ£iM‹Ìú=%KÊþïþw‹¢Úø”lRš”Mˆ£>†Eè‚MkºÒÒÐ[ÉNšÐ´¾SѤ¾ác\ók5¡ Mþ±,4BLy„…^?ê›…Á¸:æc¸¨ð,X„i§H’•îi4Ú™ö{9 Èõß}»Y…´ûèPô.`a'ŒÄ}hWT+wùXÏú}8'[ŽËBwu…´5þ} KºçaBz¹<ã ¾»(›$§d_xšžÏ*¡×e“ë¦Ìš”M†S¾ý¨ÿ½#›è.)’Ê/+Š”HŽ¢ VVhóc ïCìø3²¾º×}»S²‰ ‹=‰aÜóÿÑŸ˜nZ¨~Öe F»uÙÿîQ°YG8ã·Ê&Êw}¿‹Å~vü>nй˜ )t‚Ö¹¦P`e‘ZõkE£_~:¢ \¢¶I¸©ˆo*’¸(“®):±“-?¬híYÉ¥›>†Ó f*­ã¾/:„1¡s¿ðøŽÈò Ô” ìYR> fÈEâ`äð±?ž.ùãÆ§e–ê{Šœ²Ågd“ÄmÙþ”BSF ½uñ †}»KÅö´•<íÛ–M³Šþ¶H@¿"›è§üôwýÿLdHE h†Òå…0!•|¿› MžEEÑEJà 鈯ȼ¡÷ý¸ç}» Ýœs~ýÖe“麡7ö¿+[0&ý½IÙd ›¨Õ¯Ò×xK(d¾ l qÊ)E‘rÔòÏ­*hžüï5E±˜‹â†Ì»àç^W°˜Fe Ð{¾][qý–Šç縉rÍÏû ¹ B>û[;&Ôð~ö8¹Ó÷» wôhˆS¯(ÄÌŽÉB%•Bš…dK6Á"[‡}L!:6ªè¢5¬=¼¬Ðª§å!:>,3Š\ÉI4ƒÐæ¡ûU§¤/ K7ÖB|lP!K¼íÛPï€pÝ-Ùb4­ˆí×ý3[ŠdoMæÀgòó¤š DÚÈo ÊÔQ©˜žU4ú¡:·M‘_éSÔ/°XSø‡ÆI\ú@ŸR¨‚®Êðf-É•YEƒVݾßÿ¥Ðpâ‹„ò5Ùbƒœr¿l‚ÿ²l²Cv¢[¡‡D,1»-Eq܈¢õa«Â²P$¸aX‘}QQq‹ÇôŠl¢kÈ&öN…bsÐ(Y Î®+&zò(/(Dæ8Çv…FNg@á½ )Z2’HPx'^P¿"ÿð]Ùb5£ šJwâÎøûáD.Ï1HF—I¼2 ˜ÆåÄ©é™[É&”Ò*Þ‘Mht~zC6iÜòÏ’”=â?‘…@qŽûuEÌ™8ù¦"ƽ²,6£wð¦b¢$ߥ—þÙ„ÖëïÓQ¬R0wh$Óðó¨Ë¬ÿa…ú(9€1}¸ð 5ÓÙÂD¡­!I S=ÛV¼Ç‚À9A¿$vOÓ.ÉŽ‹²Übtä?X4¥h°3¢H#µÁxçEdo÷d›Åæ@zgÏ9ö'IÀ~I6¬+bø]²Iº¤3Ò¨å{²I©Ë÷õYÙä8ª°dŠ&åLî}²‰ö¨Œ’Hß[(”TïÒƒ`«8nÝ÷2ÉåÏ*š–lø°”G%ý¿eá$¶›öó™—MÔè#Á¢¢vV!r†¦=úüR,tËQ©¼¿òq5Ú0Òº‘Dô¦¢›6ŸÈ4ôKú1¯_ÑU­¯¸—cþÞŽÌ#»âÇÛPXÿ4ïSÐV¹Çœ¬¬k~ïîµäñü"=€ç}y)F¢¿k‹Â`‚CÎà¬,_´¡©È?ƒP«l‚¡1{¿"Q µrDO'ÆOŒ©c,þÅä4îÛM*¬Ø]Ùä‹fÎ)?׋ é šÀ,É º¦A‹Å;Z”…[ð(é GtGÑu‰M}×ã%Àˆ"AñÔ‚™Å·îÛ‘ôF¦¡_æÑ›¿"›œ7ü:HÑsT¶ ¿¥Ðx‚¢ÚëÛ’gèõ{Gý›²0ÚuEî,'üæB.Ï(bþìç<ßë‹L?k²Éä”lBYQ$…aé ¼¹£˜èCÙ’I—֒þú P×ë¯Eÿ<hïj/½r^!‡Lßß3²IôsÅØ`I6QWtJ+αG–p^WÄõ ‰QxÅd }ö˜,¯náªbwýZÀ°YU$°éMÀ~ýXs~MÖy”A»¡8¬ý?—!ßñü†ï«æã\ñÿqmþX‘ïP„³zdÉñÛ oóÈÉ¿9‘ @“cFÑïµM6ñ¢ñŽeد˜Ü`¸L(ôúgdW»Ì¢$A‰D3Â4«¡?-‹,¡óþ9Ún+(“C²EêŠæ V]oGkoeUf³°u+´{¾  ²~×·=¯°ü¡râP°Õ§h9¹¬ÁÀUÈU‹õcn)ôÿׂvtñšWÈaÏ*úê.)’Û—üÿï×ꦢ75Š„õUT)ã1Ôd‹@Nþ͉\šxï*¼Z8®+à°–×dñü]™5¼ Óú9%›@ûeÖ²¢röŽBæ`Z6õûÿPñ¤ÏÀ™Ô­‡ÅUgdm)þÂj§É̪¬qIMÁl”YÈÐ$×}·dIз}çü¼hqÉÂF³š O+šÒ×}|'½˜Oøuyϯ/U·»~L¾u…DC]19ã¡´øµb±ý~Yx ힺƒB¯rÁ#Ç2%ÓõUй¥åßÜÈ !)’†È&øô“Á®éUðä)X*5ö™ÔÛýç˜,Ö ;6N«nVá) ïOáÔªlaYy[ 15: Ñq ±´[²…àUEBÝ!ˬ*šÝ7üx3~ì-™Õ|Z6‰UtI#Ìű©\ôq(ZPÞ–MÔ0•YÀ¡…dKñþÙ$Æ÷CØ…73PŒë~^ÑfŇôžL:{YáÙ65ÏÄÓC.þMˆƒn:ùbͧe íoÈ&B&ó²PI‹¢‰ÈE…¼C›¿®È&®EEc»We“42ˆŸ™P°d©&†?¨àñÏ*’©ÐWkþÞ¼"æ½(kØBa ãyk§¬jº¡`u)TA/)Úivùñ;dÌ´°D½ôŒ,A?ezSØ5$[x/)ÂD£¾]¢ ô†"'Ó§è9kŠœ´—œHHé$ö& ÐAé(Ö.›¸¨ðE^¸¿øtÏE®àŠ‚žI¼}LÑ gE6QSL†Dì&м¶üºnùu ‚÷ˆÂ3BÍôe‹ÄŒöй%û‘@âžÀÊ=¥è@£wòã2+ý}…å»%›HÇe“½|i4Ï¢Q&q™0I6Ó§vUæLÈ’œhÛ,*(ÂQÐ2)›³ í££~>5Ù¤ßðs"w€ú%ÕÍ„fÆdá±›¾í‰bßC²‰yÆ·½­¨[•-6s2¯FS§‚.*EN墂®9æ?+¿nUq]Vª£ËŠ~Áøñ©=àìG~á íãï"ñ¬á~j¥¥E€ðØ%Ù¤3"›\+ô‚Þ•MŒ ªä¼l1@fâ%YdSVELL¾îï¯)”;Šf3K ~>Ò×È1`Ãÿ¿$›d?¯ŠÞPÄɧ²Ø ª*1óY?¿AEײ†l‚QðîiÚþ]?ÞmßÿyßçeE^£Uæ- ûõê-Ç_¼Aÿ ´Ù?¥ ŠB9ÝñÏÑ ¡h׸­HÆo)h­ûïoVô&BzMˆRhõ¼&[Æeù ò ¥B)=–Oø/È”^×¼lñ;ªHŒßòc“ŒFªù–"±Ttyó‹xäsÒdØoý—¿Wø\Y4T“MVŸV/í(TC¿«HC÷ü¬lBžULÊXÖÇdÖ814É6Ù¤ ¿ýMSª)‹Ì²É”Õ°ÿþ®Â’ïôñÐgxÎÇÐ.[ èòÕð1NÈä,~OѼºË²ÐÏ)YH†s¦:Xþw—lâ'K±Ø{þ9(›Ðix[õñ2É·ø¸Já¾gU³çYïóмM‚ýqÿ{-÷úìAÞ9»ŠdpŸ¢ˆ‹P ‚p$d)*ë•….(;"› Ûe½|{zÖ“ômÕñ¤ïgªØ×¶Ì‚¦õ%zE$‹a$ˆ—|¿oɬëýMÏÏ*¨™·ü'e<² 0pê M¥žb|'d UÄ(ò(Ð4[%ý¿dÐæm8©î%—ð,±{2,u8‘ @`ȧºÏÿöa8He´SfÊÉS6L©+Ô>¥˜P7d“Ú˾wü5èÛt)ºXŠzÙ÷‰Z(.!ºVb|RÐ$_TT57¬žNÅ¢%…2(Üþ[ ¢Ýblu…ôó²lQ¢`4Ml +ŸžÔ\¬øøÖýüè½¼ÿÚ?«xÎáy@Þ‡çšü÷o÷¨PÙ‹˜Ê)Ù¤=“íe“Y«lℯ?-›L±r/Ê&Çc² •ËnE!×€,Ìó’1´QIÿ·"é|ÊÇù–“v˜ðÿáå(äÚý˜SŠ„÷¸•0 çé)Ìø¾£`þp¾ó² éfj&¨ò—y+ÈK_VT]ï¿ÎºŸ‰Äà €çbÝÜE`ÿ~ÐÒGþéú£5tT6ñ¢ÙóŽoߣèM¼«];!³Ž{üó]ŠÄ)ù„i»¦W¦A aHÑ+Xþè¥uE?„9oÉÇA‘×”cÔ³#›ÄQ:e¡Bp­O¶€!V×R·Í¯OMR¢Y< fNú‰'‰\žs|”à meqØ¿*tÛ¬$›¼á¿âÀ{¨É&X¨“ô¸íTTÄÒ@]œ2ο(›D)ˆ¢bCÑ‘>ÈRèR­Q=Lèa:ª…×Í]Ž(:nõÊÂ8“2ï䚢³¬¨»¾OÂbùeL|’ÈB°Ä]dm>*ÊP“RRpøK¹¤†Öø¦lâ$¾Ná×€¢G.Ñc²šd¤I>QÒï(d+ˬïg[J¢Yýºÿ>[ì‡d팢ÁE¯aÏpœ;²…†œÂwŶhòSSPÛ÷3ùü‰Oé4å&?颜Ô:¼û>ÿ»C6ÉÒP}\;§/ÖûˆBŽ$oI›¬û{7e‹ÂïS2k¿ì‚6 hàÒ¢j@ß¿RLæx0}ŽÉ¼wŠ}´úö0¡PT¥ç1ÍþDúþß59Ÿ_æÄ£"Ÿ™ÄSGMѾ.›ì;d–6“펿Ú"m«Š°ÊY¯~M¡!´­°Øûµ·§ÁYEÁ×msPa±óÅèõñ-ùßK²°9Š0U«,¡K'°ýŠœ÷»ÒÞÅ@z´ðÝÃlŸHH¹$ JµLj `æœôm¨ F6ée)dÂI4|ß”Mö[²‰xGÑ[€mût)Ú&ž-äx$ÉàÇýÀŒ—_~Yï¾ûî#}æÕW_}èϤH$‡¿ð ¿pw"ßÝÝÕ×¾ö5Õjµ_?ñ?¡ IÒ;ï¼£_ø…_xèãTùÊW¾ò•¯Ãóúµ_ûµ œ?þ¡?÷¹Ï}îîç~í×~ía>óôO6_ùÊW¾òe¯Ÿþ韾;‰×jµ´ðÓ?ýÓ÷Ý.s‰D"qˆPU6%wvvjssóîûµZM[[[jmmU­V»ï>:::î·mæ‰Dâàë_ÿº$é—~é—öLþmmmº}û¶ÚÚÚ8ùKÒææ¦þÕ¿úW{öyÒH$‰C¬ÿý“ü‚~üÇ\ððXöÒH$ÇÇùÜGÝÇãúü³†/ùË’¤Û·oè<ùKºúÊW¾ràÿsH$Oªx’ŸÖð·þÖß’$ýÃø÷¼?44ôHûùûÿïßýýŸý³&Iú›óoÞsû§žõÎW¾òuo6Gùû¯þê¯V’ª7Þx£ºtéÒcÝfÿqú§ºÚÜܬþëý¯{þwöìÙêÂ… U£Ñ¨þüŸÿó÷/¿ÿÐýP599YMNNV_úÒ—ÜFRõ—þÒ_ª¾õ­o}è÷:æåË—«Ïþó•¤êWõWïyüùgög«õõõ]‡û»¥¥¥úö·¿]íììT’ªŸø‰Ÿ¨ªoûÛU­Vûй=èuûöíªªªêĉ{Þÿ'ÿäŸTßøÆ7*IÕþÏÿù.;¨»»»*ÑÑÑQÕëõ=Çý±û±ªªªêöíÛ÷:î½ô»¿û»Uggg%©úîw¿{àû¼~ñ±ÚØØ¨~îç~®’Tõ÷÷W+++ÕÏüÌÏÜÝæÌ™3Õoÿöo?õ/ÕA¯_üÅ_¬VWW«?ûgÿìãÿ;çïT[[[w·ùå—«åååê/ÿ忼g?úܽ¶Û|^}þ ë¸ÿúßk¿õ[¿UUUU5ûŽ/_‡ãÅ—ùå—_®&''ïþýÛ¿ýÛÕOýÔO=Ömö÷üƒPµ··WßûÞ÷ªóoþM%©:qâDUUUõéOº©VVVª¯~õ«÷]^ýõªªªêÅ_¬^|ñÅ»Ÿ—T­­­U'Ož¼û™jhhhÏçïwÌŸú©Ÿº»@UUUMMMU/¿üòCžíþñ?þÇ¢\ÞoÜUUU;;;w'k¶=wî\uîܹ»“ò£ÜëÝÝݪªªª««kÏû Õ¿øÿ¢úÍßüÍ=çõöÛoW’ª‰‰‰êõ×_¯$U§OŸÞs\Ƶ»»ûè ÀoþæoV¿õ[¿õ¡ |ÿëƒ>¨$UËËË•¤ê—ù—ïþï7~ã7íÀëý÷ß¿çøñqσ*©úOÿé?íùüƒ>w¿íÊãïŸÜË¿Ëëøÿâ_<ðúïßÛtß_¾Çë»ßýnõ•¯|¥úõ_ÿõêoü¿q÷Ë]~É×6å«|¿³³³ÚØØ¸»Ÿ×^{íîÿ«7nø9~¿páBõÅ/~ñîû?ð?p÷9ýÑýÑ»È~«™ßö˜x-¿þë¿^}õ«_­Þzë­Gsùºß¸YÊmßxã»ß÷}ßGöö~UUU T’ªŸüÉŸ¬®\¹RIª~ø‡¸êëë«fffînûoÿí¿­þÞßû{wÿþÉŸüÉæ|å+_©«7ß|óîE<èýòuòäÉjnnnÏEýëý¯W’ªþÏÿy%éP/w'Ãýãß?Q^¸p¡êèè¨VVVüâÜës÷Û®<þ½&èû]Çòúßk?ù“?Y½òÊ+{ÜÝ\ïëÏý¹?Wýÿñ?î>//^üÐäò¸¶9èùÜÿ÷ÚÚZuú\ù™Òªíîî®VWW?´ÝÿñüÕ?úGÿè#ó7Þ¨.\¸p÷ïÿõ¿þ×]ï÷QÆ\¾î7îýŸY[[Ûéêêzä€êߟýÙŸ½ç½¸páž9c{{»ú‘ù‘»ï·ôÿå¿ü—UUÝ·*øàÁ,,,T“““Õüü|õúë¯ß]ö¿¿ÿsÿú_ÿëJÒ݉ñ—~é—îþ=99y×’8l¯¶¶¶ê7~ã7îþ½ü÷š(ÿûÿï{þ~ØÏíßnÿñËWùù]G®ÿýö'©ú/ÿå¿Üw|ù:<¯rÂú+å¯T Õ7¿ùÍ'²Í½&EþþùŸÿùê~áî;Öý¿ÿʯüÊž è?ü‡ÿ°çûñ;¿ó;ÕßþÛû#ó›ßüf5??7»‚”1—¯û{ÿg~ù—ùn˜L2KüQ€¯~õ«UUUÕìììÝ÷~üÇün¸–ãÖjµ»áªªªî.è511q÷sÙ _ùÊW¾žÑΪªª­­­êÇüÇï¹íøøxuñâÅ»ÛßõT¾R 4‘H$)>ûÙÏêÍ7ß|¤Ï¼ôÒKúàƒjÛÌ$‰Ä!Åw¾óÕj5ýØýØ*¡àöíÛúò—¿¬Z­öГ¿”ý‰D¢i‘@"‘H4)rH$‰&E.‰D"ѤÈ ‘H$š™N$‰D"‘H$šJ$‰D"‘H$šé$‰D"‘H$M„t‰D"‘H$‰&B:‰D"‘H$‰D!€D"‘H$‰D¢‰@"‘H$‰D"ÑDH ‘H$‰D"‘h"¤H$‰D"‘H4ÒH$‰D"‘H$šé$‰D"‘H$M„t‰D"‘H$‰&B:‰D"‘H$‰D!€D"‘H$‰D¢‰@"‘H$‰D"ÑDH ‘H$‰D"‘h"¤H$‰D"‘H4ÒH$‰D"‘H$šé$‰D"‘H$M„t‰D"‘H$‰&B:‰D"‘H$‰D!€D"‘H$‰D¢‰@"‘H$‰D"ÑDH ‘H$‰D"‘h"¤H$‰D"‘H4ÒH$‰D"‘H$šé$‰D"‘H$M„t‰D"‘H$‰&B:‰D"‘H$‰D!€D"‘H$‰D¢‰@"‘H$‰D"ÑDH ‘H$‰D"‘h"¤H$‰D"‘H4ÒH$‰D"‘H$šé$‰D"‘H$M„t‰D"‘H$‰&B:‰D"‘H$‰D!€D"‘H$‰D¢‰@"‘H$‰D"ÑDH ‘H$‰D"‘h"¤H$‰D"‘H4ÒH$‰D"‘H$šé$‰D"‘H$M„t‰D"‘H$‰&B:‰D"‘H$‰D!€D"‘H$‰D¢‰@"‘H$‰D"ÑDH ‘H$‰D"‘h"¤H$‰D"‘H4ÒH$‰D"‘H$šé$‰D"‘H$M„t‰D"‘H$‰&B:‰D"‘H$‰D!€D"‘H$‰D¢‰@"‘H$‰D"ÑDH ‘H$‰D"‘h"¤H$‰D"‘H4ÒH$‰D"‘H$šé$‰D"‘H$M„t‰D"‘H$‰&B:‰D"‘H$‰D!€D"‘H$‰D¢‰@"‘H$‰D"ÑDH ‘H$‰D"‘h"¤H$‰D"‘H4ÒH$‰D"‘H$šmO{‰D"‘x²¨=àÿÕÛT÷ù,ÛWJ$‰Ä³ˆœÃ‰D¢ q/§ „D"‘xþ‘€D"‘hb¤ÁŸH$͇Ì$‰D"‘H$M„,N$‰D"‘H$šé$‰D"‘H$M„t‰D"‘H$‰&B:‰D"‘H$‰D!€D"‘H$‰D¢‰@"‘H‰D"ñ´}‰Dâ1! Ú‡Cí¿§&u"‘H|2È>‰D"ñ1ð(Fÿó4Ù>êâѬ×)‘H$#’”H$Ÿž'£¶¶ïçGÅótM‰DâYBf‰D"ñ‰#ŸD"‘xzÈ98‘HˆýÜìZñû'=†œ¤‰D"‘x|H P"‘؃ƒÔYjøÿã<öþã%ž=Ô”*?‰D"q˜‘€D"±û¶êï—ÿK<ÈÅ!‘H$ž_äŸH$>„EnsÒøäq%«ÒGwÌîG¯z4gJw&‰Ä³t‰Ä¸Ÿ“Ƴ‰rÂÿ$ë+î•UJ$‰ÄÓA:‰¢Œ4æÃÒ|Èhï“Å“¾¾OÓ‘{˜c?+ÎÁA—Ã:ÖD"‘xÒ¦K$)ÒÐx¾q/êÎA‘ù‡¥ä”Fuõ€Ï>ÎÉÿaŒø{erJ$‰O9÷&‡ I½ùèø¤£éûk$—Ûô¿ƒj¦^àQ¯ß½¤b„{óaÎ=‘H$9·&‡ ÷2Üž–ÿ³€{žOê:=ì}¸—á~¯±î—[ÝÕÁÏC¤~IwdZÎ;þ¿~ß~Éÿî*ÆÐ&©OÒš¤ÿ»Õ?»ãÇjñ÷v%mû«ER»¤-ÿ^ç‡ìç®îÎR-™Û%3ÚWý÷I³2ýòÏOÈ"àÛ¾ß~ÿ_»"²?$3~y5üxØu™Þ­È8,KZ(γUÁÛoóŸ2ã¼ÇÇܦp:ýýßÿ™¡UVÐïïs º|ý>¾5ÿß ÿì÷sï‘9m~¾PŽ:}?­ Genßõ­ùg·}_»~že½÷÷q>¿‡ÅY½×ØÛ˜ž6òš${‘߉D"q k´ó~“Öýè;eö¤UfÄv*Œðv™Z“öPm*×½!iXÁ_'¢MT[AQ!/ÿZ†~K±xû›þ7û¨Š1tøÿk¾øú’ü»¾ÿ6ßÇ~Ǿ}·ŒnÔïûÞ–9êm²Èoq  mËŒõvÿ¹+霤“þ™?öqSË0$ËrÌhoûÑ® $MçÔ¥pfpp:ŽK‡‚nÕæÛâ˜lÊœˆ E&÷¸–ì÷aé_åÿ¥'ûüfÇâYF^×Db/ÒH$÷ÄaÉ<¬þ9I7eÆ_¹=ÆêޤqYN=Fc{ñ;‘ø6ßV c_2g 44[%÷íëþÿyEe@f—Fê¢ wS–Øôí_ô¿¡øHf4³ …µ«2‘üœf||-~œV™Á{Yfôoãï•92ác2Ã{ÉÇ¿¦ˆ´Oûqj~®DÝq2Ú‹ãUù+2Çb½¸žòq÷ø±ÈŒPÐÌøF}{(H}¾-ôŸU?'®µ ã~}q$–ýØÛÅ1¶|ß˾Ÿ%íu4xž>éçüq~×raO$BΉDâ¾ø$´õ?Ž¡S“³Ÿ–„»2ÃS2#°¥Øž,¨È •)Eñ+œù…¢ ô™}§×.*Šd¡¬`8#ÕYWÔPD»ìÿ‡/O¾Ûÿ‡aü¢cKfßòÏCÙiQ(ýðêñqÈœ—™ÂÏ¢oAÁÑo—Ñk¾=õÛôBj•eÞ•9}¾-”¨ …ŽQ>¤½ÎöÝ»öâo¶iQdkºüPp=äÛ.ø¸gœî‰ü÷5™¹¬P=™|’ÑÿÃâh'‰æA:‰Dâ¾8l©sƃ ͸Ì„ƒq~DfÈM)Œ= èßþ¨,ÚLtxE?"3—õa~û¬o?¯(þ¥ˆ÷ŽïŽÌðìöÿ Ë Ð%3¼zd=ÑûšÌÀV¨ÝñóëQDô+…#ƒêε Þ=Ñnh3’Nùösþ³Má„@oZTwúõAîJT·öã,Amê*®Ýª¢ ÕÇ6PŒ£»á×x¼oY31Sl˵ÁÁá9áÞSË@¯ƒöbl82ÛÚûŒ£DD¡ö–‰{ò ÊÙ£ •…‰Ä'‰t‰ÄcÃÃvš­îñ÷½Ð¦0òûQixï›ÚËWÇHÜV(Îl+8ò¥jN]a( ñÛ2cÞ=2–kŠˆü¶L©§CÁãßñcoù>{ý3³²È:ã§P·îc* ^1z7| ¥l'ÅÄHz®ùk¸8Oè>ݾݪoƒsÁgU\G  jdHwdÎr¤›2ÊÐjq}[¯ÌY8¢ >!å¹å¯ÇÕ#Ì+œ(2.+ŵìUô‚¾…óÄ94 G<7Ü7”‹vÙ•†¢ÉZ·_‘©Xñ1@m"SÁ³ü¸œg£`Ö,×"‘8ìÈïc"‘x(|”Eü~QÍý…¹eÇÚYtLFå@ñeSÁ%—‚R/Þ[—E”‘¾\–tFQÜŠ¼#3>Ûd†Ý®Ì°$º¾«žÜ’¶”+¾ßA™18ìÇk(¢ìGÑè.EñïŠBǾÛÇ8©ˆRËŒR KÅžMí•ùÄéèôk1"éÿ¹&é¢"S!ßǨ‚4#‹rí¯û>GeJD(ÉÞñs¡& Ãÿ×Pã( •ý zdNü8Ü>×-“ ¥@Ù¤ŒëÂ{Ü?ú HA¥ÂiÁ1Ä™[PÔP”ÊM›Å9HÑ´ ‡lØßßTdsjþ7޵ dpôJÊ×–ÆóÚÙ; þDâð#¿Ÿ‰Dâ@¤Râq(öùë¸Ì8ìsÐaJC‹H5®¤B{~Ò)3ÈúdFú Â¥Ùšòpå{µ7ÒÁTÁÓ§¶MÒ_|P¦{Æ?r›(øì* É>…\ç†Ì0åœvdFw¿¢6a]f,£“?T\‹™Q]ùÿ¡(íȲ ÚŸ¨ë`nú˜(hž)ÆÓáçÞïïÈŒÛ%E  £yHa¤w(>CV@2jr¤>ÖºÂAÁy˜÷1pŽ4Ã1büë :]‘YmSÔQôú±ËÂpz)¨8.ÇãyÁ™[”efz‹m–õ;>–NE–ƒqѯ`¿ôìÇE.â‰D⣠çŽDâ9ÁÃ>Ì—þqD&÷G®‘_–N5™av\{¹ã}Åg–Š÷1Â1v[eY§Ìx¤׎öä6ü3éuY${Yf–ò—%­ZæU¿öSŵG͈á÷µ£2iPކÌ)Ϫ…Æs ©R)”’F}Û>E‡åi?V¿‚®sÛ?Çñ–|¿'}¿Û~Ýú|¿ þó¶?¾Ý’‚N„£D6ˆçºÅŸù5\T5STL6‚÷pø”-³%‰Ä't‰gµ‡Ø¦zÀv÷ãé?êX8Öˆ,RJÁmMfTõûÿ:  ê`T)tÛ‡e×´"º 'Å”g:‹ß§|›› éÉŠH?™„yE÷]ÆÖçÇ_WDÈo(èGŒE!´ù[‹ãS ïüŠ÷1ß?Ýsï(¨,Ýþy¸û«¶*"ùc2£vHQ€Lqí¢ÌaèT4£?ÆhIIê÷ŸDño)Ô&ü3·d2Ÿ£þºæ¯ÿÙ(î?4¥Vë¼ÂëR×.h/¿UÁõçw²#ÐÀzý~P°=ª(Ø-Ÿ”¨ÿØRdE¤(pžWtu¾£€•‚ÚÓ¢0Úû*O8Zd‹P ‚&Ô¾ïÞmø3CáâDÞ Ï+U(‘H<=¤H<㸗a_=ä¶k€"#…ÑÿŠÂ0&êOÍýu…¡ˆRŒd‘[”nˆêoÿQ(ø@—ÁXƒ~CaŒö+² tÈí,Æ×]> Ð1߸dÆÞ¼övªí—Eçoû¶×Eº8.›4²šò¿Çüxõ›þÙ þ~¯¢(˜l †ñq…|)´©EÄ›î»øçP ¢»oÍÿ®ùØ¥ 5ÑŘ&bÝ2k]¡ÁO#/Ô†8?xñÝ(­úgÉäI) ·é•@/¨>ýŠnÉPÈúàè‘!Eæg»8×`YQ«pKA1b{îñ¸¤ëÚ+Kñ0MÖÆýù»©weŒ|Ž>S ÊP™UzÜ‹s.ø‰Dä|H<ãxT™ÎÇÁå/#’û‹w{e†]! ‰ÓíŸ#*½-3ˆæÝn»dÒŠ"KÀgZu{œz ³E…s± àÅÏhoñ/X·ÂA8®èÄ‹'ÚñÈ}ŽÊ"ØòmÅïtæz¬*¸øDÉŒ`ÀwÉ x¨GD¢ë nö†Ì¾$3‚Oø½:æŸÝQБp& TQ×…‡Fl ’¾çchø36QÜï·d5•ïcBæäPð =ìŽ_Wžj5ºªG×üzÐ A Õ$Š¢ûÙ®Y£A…BÎeI¹Z.öƒÚЮ,‹±¨PWZT¨6I}ÁÎ>‰Db?ÒH$žQ<éh~uŸÿñ™Ëc²¨5Q|(1Pe†Ñ´ÿDmwq » ûþWj*GdÆÐ¼þ„ DUfR!)ÙëÇšñí(h¥(³ÕÏó+ú Ì(¤ˆ•fcg* 4™áy˧H´äóKyÆÙ™”E”øQðßOúõ¹ ëìÛéçÚ'k€ö¢ó¢ŸQdœ’º" ¿äïO(TŒ¶‹qQðÚ­ ±`Ì"ýIñô÷å23ó ªÎ!$ ­Éá”PcQW(7•½0ÒÛýþól”*O842é”ÿ\–tÕ¯ÏÙ Bõ‡Úêàý/ûX‘a¥¼_æ|(²O·} È&H‘ÕèöÿCeCªÌŠáŒ }º^œ÷¢ïïãçŸH$rH$9îGñù¤šqŠK‡ 1ÈB’ÀX„M‘í®Ìx¡ òÓŠ®²2c§€h´dFª6’¼4šTtž}AaÜ5 7PW¤P¶iWpñ¡zÐ@‹LÄ”ÿ}J¡qCf¨vù6\dB§ýý~ ¸ýœß¬Ì€ýÀ¯çª¯&s¨ê>¦qÿ¹¬ˆr£`Óæ×d½ør¥u…£¶éŸçHé*®)÷xÍ÷7ìãn÷}q1ú)îPt Æ!Úò±)´ö»ýú\ó{2¤¨£ àZ~܆,“±¦P"cÿÿE¿guEVcÁ_‹Š†lMŸôûtE‘™ñÏž’ôm~oiˆ6ïׄk¸¢P?’Bm¨ÇÏ—ŒÍª¢KõEÇcœ úU´ú³H!tÙ‰¸T%Â!(eV¥{ÓýrqO$÷BΉÄ3Œ'éÀéÇ(ƒš2¤àÃKÁÓ4”*%.‘]Ä¥àt x>4ò•“Š¢a8IfˆÁ!?'3¢P`éS4àôã,Ȩ84r:éŸA¹‡±m(šiaJ{{ E‰(…Ì(õ=Š®ºý2´&3Щ ¢‹ñŽÊüûu„ÓšÂù‘}¡¸Wò”8]GNQ~î|y¨Q» ƒR2êPYXÜ«p–¨“8¡ +1Þ)¿o‹ÚÛqwÔ¯Ó"3Òðs(£ð8œÊ9‹þŒ–„ýßý‡m¶—ƉDs"€DâÇG­¨îñ>űD’ÏÉŒfš*±šçPà„#YWh­c¼6¼ö™Ô£PÿéSP0&dÆÖ%Y4Íþn…2 …¹+Šh<ŒX"®È|"SŠj »Ö_ŸBˆó¿ìãjQ$÷+vÚF'’›~Ž)Œ^ú Ì)d'q`hÊuDfÄcLcÈ¢FÇü‚ï“ú r;|l«c¾ÝuE…M™1¿ëçZWdæýZÐs€"ß}ŸA ‡®ºüJ{›™¡,´"3ˆ‘níQtY&cAa1ÑïEßgŸ¯]!çJ¡oŸŸï€oCQ7Fü–?ÏP¼Žøs‡’O‹‚öÅ{Ý>fè^8dCvuОv‘}zR,+$ié$”­Ýâoœ)TªpŽ”(êAè¼|¯&\«ö°xÜûK<¤¡—8ù\$Ï8% p³ÐRü¯Sf`V2*ô ¨<ŃÅ>è¨J§Uh%;ÙÝ_|»¥ UÀÙÆnø~o(¨,m¾Í5?V»BE‡fPÐCeFºdº¿Þ–QJzeî!ín¿/3² ¬@‡Á`$òLÆAŠ"[ XP¡6fU!IÅ©DÏ»|¬×}ߣ~NPP–ýïEß÷UE!-™°#3ö{dNãXQd:]–É,ÀÓÇLjÝRPÈ®t)¨4¯úß Šî¾¢P…–}[’ ?uìs]á@Ò»5¡†Bå§[¡ÃãÀ{ç"%ŠŠP·‚Oå Gµî¯NxŽù¹åû^ómæÙºãîQ8\ëÅs²©¨[(¬¤pTy¶3Î)™Š)FŸWdÇßY°?+P¾÷(8hΩðw‰ÄáE~G‰ç “Òg"¥áŽÊhððQã©Qa) ­>™±At³M–-  òŽÌÀ$ºqó®o3¦0ÈÐ^o‘þ2íxèEƒ2£¬[æ Ñ‹¦>4Wn)Š6ÇeZöbv+¢âW}¼Dÿ1à ÷Г ’9"D…QÈÏÆÿ”‚FBQ¯ü=¢Ç—ýœéy÷þ„¢ÀyQæ¸Ðq–1¬ûØ)X­+j¸†“ %#²"8|PŸÈd ÃIQöŒB.uÉÇAã/”à®Ó!yIFÃûO–gN¡èeÍ?KÍ=¬+ä7)þöí¦…¹Hµ"ÁÚ¢(Ø%óÒ®…^…#´Yl»ë÷ÞýN1&¨c«2§o˯qCá ú9Q ÓÓ9J+ Ú[›sCÑkb}2§d Œ¡L5«½Mç_e¿ ÿ}]á,pœKýyØþ#‰Dâp"€Dâ9Äþ/vÙ K Í÷³2£ ™‘Ø#‹Z’XQpÓ1술¢¾¥¥Õ÷sBQŸ•ZÇe+—ZdFf‡Ìh¢1ÊB £=y ¥YEA虑Òÿžòí^ösY”‹ ­ö“ ÚÉ-E´~Rf\¢˜=ggÅÇŠÑKmÓ„ÂH¾¡0D· 2uuG2ã˜ìÁVq^PBÆ|[ U‰.SÐ{Ba ¯È X”“(F%’O¦€ëLÍ’”3 5¢Vÿÿ®ï甂†‚C@Q¯dÎ#]oQÔŸNG“"`´ï¥Ð×?ççXWÈpâØÍúµ¯$½çãF6´T“¢ÿ¬¿O2 Ò¯»2ú´-¦ñŒ“) KCêb¸Ðv¸[ÅØècТ½Ñ|²I2ÇöŽ?—§ý3PÃp¦‘FEB—såX¨­÷D Êݶ? ׋ýÇé¤A‘H<H ‘xL8l_¦ýZýGe]¿‚³ ÿºt{(BìT(ÅPüJ´zQf0É  h2#|TE¦`GflÃ)_ðqÎ(xà4ÔPìJÁ]Ÿ”Õ@‚Ï= 3$øXo+ŠNg¥ã¾¿c ՘߶UÑí•sìQ8Gu™aõ¾TQspKÑñN>Š8- Þ<Fžeš¯u×nÓŸ•ë ©ÕU™ñ?¡è^<ë÷çkTQ/Ct½®("žQ(qÜA…1ë×þ5ßæ¦‚ºuRA9jQPæ0èÉŒ * Ô‘ÐíRÈÅ6|Ld¤¦üZ‘a>œã<¬êÐó€2£ú<ŸgâùF>¿‰Ä#àA¼×§ñeÚ¿ø"Ý ŽKúœ‚»-…ዪO›,»¡½j.D{Šý–Úè·´×êPDY7dØ€‚:rBf¼¼ïÇ'r}[¡´$ÓM?îc"Ò= 3r®+ôð·d‘ZΉ¬Æ’ÌÐ’í …C2¬è~»"3´^S4x"z¿©p€hÈUóýù¸7üý÷ŠóÙðíGeÆ1”•U…2 ™y?Od)Ѽ?&3Ö&dÛIcïupø§ý¸#~Üš¢¶aÇÇ;[l#™#‚Œ¦|›²«1u 8³ ‡#äM7}¼c ú®ƒâYÞ£^`ÍÏûÀóIá.õ#Š…)E‘ëuY¤nûMÿI7Ý…ê²"KÓãÏDÝŸг[”²=œC¿?£(J½X<# z²ªÃÅ~—Åß­2#}À÷¹ªPÚT8C8 Ë ×˜¿Î ÙŒI…“ʱ©©¡FFÅ{d¸||·jJ÷Ê Üë=éÃÃûmû¬â îçÍàì$ž_¤H|DÜ/ýýI/ ,êðš'd´tCmWpÔQBiU“×d†[÷=§àI£‚2%‹zbP4Ô]™¡uTMFÑ…âË· £-Äp–ƒ½2# iÅ©â1 iPÇœÇI™‘5£Ä„öãˆÌÈ–ÌàéóÏ`¨.úvò¿{dÆ&E¥ ~-¥pz.úõQȘ¢Ö"?6êA Í\(PH€BIBêñ¦‚g~TÑdìvqOkÅØ(ŽFYgYæp4Ù]¾¿Y ä]~ü1Eñéu™sw^QÓ@·å]…ˆù®¢3îiE*Y¥]WÝï'ÅÞ ¿Ï­2CœhzCÁ¡oññÖÍØ6r´ÔU@Õºè×î˜ïçFñÌqÿ'dÎoC¡±r’õ8o¢(æ^‘eªhDÖ¥p¬¡ï´Ë2T=þÙMuh]áÓ€Žï÷~dbÈ2Løÿn+:ãpQ$ MM '²îc€ºFF€lÀA*BáyÍÜÏðžÎ3Ñ|H ‘xŒø¨¹>ê‘ÏQ`øªÌ@;!3´C§‚ª³%3¢ZdÆUŸ‚7N!ä˜Ìh©+7}»q™‘²« ŸÔ²Œ D() …v€!D4•(é„,zË1Çe+5ÈGR¸ŒqMaÔlø1nú¹AWòóßÌãŠ:…M…ìé%R‹í¾ Ÿí2Ãñ¤BΑæfôøøý¾=”˜Eçd"­¥Œä¸"ÃÐ¥PIB‰f[Ñ¢ÙQ¿öò1£ƒÒμ™LTvzF2:üôY¿× ê ºûóŠâßýZÀe_ñ}®ù}Ä!!{‚sÓPpýq~pNkþü6üýYE㲆¢Žcɯ#µG‹çfTÁ}‡òEk®8Ï™â;0¯pV(þ®i¯cÕ(®OÍÏ}GARd1pnÎ(z Ϲ¤h¬×çÏ΀¸–|_è¾MwmÆ×¢pvVR¬¥ÃÚR)mЬ-5;~ý–r¸H“ÒÓâ~]‡K£Ï‹Q‘@âyF:‰Ä!ÀÃ|K~?\ô~Y"Zõ» Îu›Â¨Û” #2c ÉÌïÉ÷›ŠÈç®B&ó¦Âx.å¿OÒgŠm¦òž ŠÂâVí5èË+\s)š IÑ—€nÂDõ7ÅÁ½’¾£ˆ|#㹡½tÉ h›>¦¿fÇ‹÷'T¯"âÕæ¤B»~Zf°Íûßoù~1Ö(àÝ’ô†Ì ›P#càÒ>8Q^xß·E¾ôcÀm(h_ëR\Û¦Pç!±$3@1¬)ʆªD‘îY?? ªQeº£ 5üÚQØ/ûs€¢Ò€‚“¿ìcîòÏÑÀªÛÇ|G¡LTv˜¾­È½¦P2SÔš¬ì»O·ŽÂ…ÂÜy¢ð#2ƒ÷´Ÿ?ô/¤aï(X²8(i1F ¬)ò]RÔE ôª"{ÐPhûsß×ý>”Ù8ɪ6EC¼ßfןµe™…šÌ‰Á©xÕ÷ƒ³ƒ£Â÷®EAÓ¢W jCÈ .ùØÞ÷çñ£Ô ™b\*8Ò,ÒDØ1ˆoÉùS ÕŒü™=*3ÈÚdº7üØuE„›î¹mŠŽ·4 £î`ØÇG$˜1¡~Ò£ * 6DÊ4Á"»!?Ïd ´9…csÔ÷ù¶Ìjø>‡ýZžðsm‘®D°wF,Ùê'0PÛ} 4Ë"RŽòÏ‚Bûž"ÙMmfXfpö) t¤/ûÿÒÄa©ûþ7%}AfŒaÐQ/%B¡]ðë…ŠÏHåÛ ŠD%ŽIݯ+uÇd£+ e&‚Í):å^T4xÛñíOË ý%E&iÇ÷;èÇ‚ÖuQ‘õé÷Ï!§®dQ‘Í¡9”8ð]~O‘ú\ó÷Fý÷Ó2Ç9Rj'PmêõûPWÔÅLû¹’} `~Ù·¿¥È²ôûg¹Ž4î¢È¼KáØãÄc¸¯*h9}þyæ•iEäÔ´‚Z„dìN±_ž=(V}ÅsuEÑeúë($±¯Ë2g‡ã^¢åïmzø‚ÄtÏ3ÒH$>ÊBqЗ¯¶ï'¼ç³2à¸ÿïªÌ Á ^—etò½­(¼$âOºCf(PìyÂ?wAf”mÉ kŒ "°Ðm êT ÚŠ”˜’›?£ˆþ÷( .A¯ ('bBfС~If€µøõ ã-Íæ},3~í®û¾0<'|L4=ƒCO“*ŒïÝâ\ÈlÀÕ'KPJ€ñkµäã­ï»çKþ7Y…eïó²(ÿ-}‹H÷’Ÿè5òªPN TqÉR@)šVD´eÆ)E¶•¿.ùû•‚µ#S¨©ËO²üïm?¯Ë~®•·dF(EÂ=þ|)º"£qMøsˆÔI¿WJ7¨ð ËhF]Åxךù’9 øJaÔ.øßd€¯eLPÄè< ·ç{µ¸ç3~ý7ü<Æ…ø8#“ NþBqí+ߎŒÕË>¾²îaU!Ã{TQÔ~YAgÂén“eªâüˆäCÂhññ,+œLê„PBâyåêWÔS´Hú¦?SëÚûåYÚi)þ÷,à ú¬4˜ÏòyN$3¶ILíïwÈÝOÉ J¸ýD‰þÉ]’E–/Ë 4æQé¡°¡àn÷+è2DüêÅûk2C®]¡.mdK¡oŽQݦ¤y\QD3q<¤0¬‡œý2;Ðîã¥@jÄnñyš€Õ¡ðýWôž; íõJfcàß’…¨ Áyî‘VEH8B— #CzI¡ÂÃx[‹qò·Ô&"ÓðÈ©ë@Öò]’/ÈŒ6ŒÏŠl ÏÌ L¡™_êï÷*¨OG}S úÓEYfÎùm9×A¥¤!+'Ò^ô@QiYÖ‹¢æïÏ+ä<+¿Ç¥²Ó°Ìùl÷çCµß®û³Î³rGACƒÃα;eN"õ ¾¢ÿè÷k¯0¨P‚ª(¤mù^Q¬Ë³ˆ£ºªP¯‚ö6àÏ ×’"óuECµþ⼑ٽéï£ÞD#³nC‹o˽‡îC-È®¿ŠÌÕ)E­Î{2ghGÑDŒ‚qjnè1ª¨Zôgt^Ñé[Š,J 2rëz¶ðQ…‰ÃŽt‰§„ÚcŽÉ Ô|¤ˆ.bà.( 8 ÛuÙ¢|Ma@´Kú¬ÿ~AA)À`k“e: ª®)8ø]Ÿ&Í´è2JêSfø!EHô–¦M·töEVsGÆŸn(ä:ç7d‹ûQE#«£ £ö…Tc›ÿ$j8&3ˆ:ÃÛî‘þk %ÉŒøäák : tôëÑ-ï–MoÔ¤®NicÝh—†9/tî_–ïùy ÉŸRÕ®õ¤ï¤ÌpW4”"+ЪhÀ5/3æ>ðc}AQJÒ‘Ÿñ¿üZÓLmįïëªÂ%s±#sÆüÞQP³Ú|ÌÓ >þ‚"JM£³¿÷~ïhüUîJá¼-ûvçýpOø¹PÄJtšgä´Ì½éc¢1Ø”¬`Î;õS¾ïº_×^ÿÜ€_×^™‘‰N?ÍÄÚÊP£Šì’£CŠˆ2 fº÷ËèB[~íÆü:@—êU82Ûþ|cO(ŠÚÿPQ´No²'51W´W±‡ŽÅRpû‘Þ<ªpÄäŸÅØ^ög‡ì™² ?á^Eý«þ™ï*¤[»eÙ ù~¡y]÷ïjLÔ¢p»Y‡E&ùßÔhôù>ÛŠíWdÙŸ~¿îtéÞôÿõû·¡˜[¹¯+űÔUø0â0-‘xTäóœhJ|Ò÷c$´cŠE¤<§e 2 ¤èpK/ΔbÖ7d‹0ºã¨ŽPt»æã9¡Gsëþ;úàÔ"E¥Ã*4tý¡Ëô)" Ô@ß .ƽ P,R1Ž Ì-ÿ|ŸÌPÃðAæCbÏJ¦Æ2¥(HÅØ”ÌÈ}ËÇ<§(®Ô¸þK ™ÂÚ¿–(ßPŒ]6O¢vaÐÿ>¦¨—h( sœ^×zÖÇÛðý®ãjQ8‡Šaž¯¿“þ¹VEmçØçŸÁ(Ã@¿¦ vAMá<7d!:çžñýâÄL+¢Â …Ÿ7tÈãŠ^ˆ¾©pP®+úR¬ÉœUŒoœ\š­í*ôê1¨qBˆlS`»êÇ„¶3¥ E}VAƒƒj C/*ê–ýÚQDî¡Z1®k¾¿qE­§ÝŠNÄìC7BAˆû3ŽAŽëŠ_ãQÿ»® öP~K‘8ªøîâ,tùþÖü{TJ²¶ûØ(².¯ïëþƒ½gVVÒPÔf@ùc®*;§’H|òÈï^¢©qÿI|!jû~'×)3DÑGz*E~Ðm0Ö–e‹7¼Û>E×Ò²E¼W&×'EtCa@JaŒLûqú|,­Ågê úÉ€lAÇyZVDõq j xÞ/×RYÇ‚ZŠ-éÊJéCŽ7#3z|vèLh”÷ÉŒ¿7ý<(P¥¶Cì!3n/*Œi¢æœûŸ Ô&:«¶hoG[)•E…â ‘Ô\ )(AïùgࣣXžÌÁ¨ÌèÝòÏŸ*έ_fô-ÊŒ¹Rm†T\÷VEö ¤n\ósÙòëˆqË3׫0ê iÍ*Œl¨%ÐNî(èmÈzöÈ.ílU–a€Êµå×"Ù[ ×°Ì8ÇáÀ(æžÕýzãdÓgJÒœBR¶M–%jSDë=.¤ u(pálÂíçžá¨sþ¨d½¬PÐâ^Òè¥mYfæ˜_/}T±èÍ@”½KQ¿² PÍê•e;üô•ÑzüÚò½¦žlBcþ oçF·lèÉA¯„šÌ}_QØLqóAÔ D"ñÉ"€DÓãIfö«úHÁ§ï–cþ íò²“+ÒíD`)$¼¬XÌ¡bÜQDé(ŠnûmÙb½£Ka”átÉ Œ#2ªE©ýOa!E½K2£€‚Ê9™QzFaH%ÝTd#0ô‰÷ÊŒº÷V>>Š  yÓ …Æ;ŽMÃN*² §­ '`À?¬$jA•Ìô}×ü'(”}VeŽ›|ì¬~ÚÇÖðm²„>ë”B^‘ÿŸÒÞŽ²š¾è㾦ˆxO+è)/û}'“ó¶‚Ã=]Vd~Ú†Û–ÂȆÃ>­ˆF/û~1nÉJÑÅ—ëŠjÏC‹gÄ÷AqñR1 VQy Á9¼¥¨ VÐ6dt ã²>|_ÈJ! J8Ï´dœö› #—ýÑXþìRwƒòO]A_ºî÷£Cf ¿Q\ƒwü^ôsyMA¯Û’ôû~MŽho= u x¯ß— ΙŠ\³~ìSŠº›9ÙüÀu^òÿVÐØx–Îøþi¦&E-ŦöËóYúTÔeóȰŸ³/úõœSd7$ý±"£X) ë“[ÿ䑆^â ´JúÇO{‰ÄaÀƒ:?~ÔýÑÈ ’gec{ñÿ%…"Ël!RDÃ1ºˆ Îjo×ÙšlQ½%3ÜhnDj.}«ÌyIfÄPàºTìK2¾1Æ·d‹xCA‰¡Øíò™…ìg»‚“¿¥È Ɉ¡ßxÝÏYC$0qtPmArÚMŸ¢°¶CݤxyHQ{LA Y÷ã^öëD—ä#Šš†>%cʯÅQÛU-‰®·DåÇ_‘IÔ_œòk4ë×`Ü÷E„)ÒE´™ûÚ©è%°è㤋ó¶ö6q¹™RЀ0ilvÓÿ¿ácDW¿Ì:‘ÍYôsSÐ=Èl("ÏHÍB—"ƒ2¯ÐÉñ}ÖÏš]Šß÷ýu)ú)Ð+nµ-þ÷-?'dF*$JQ#‚F§jŠWyÏø1Ž+ŠÌqfÎ*EÚó|Àù&“Æ3ú¶…,Ø”‚¿SAÖa»ØÏ¤Â9Sq/ªK[þ;u5ß×¼oX6ÏÐ〠ÙEƒ?¨{Dì·ü>ãPrwŠg£Gá£(DÍÒ´Bú¶Ï¯3õKPÞ Aâ¸'ž,ò'B:†‰„ãq~öGüKý¨lQ>.[„ûe†F‡lÁD‰§Û?Ñ×£0x¡i@Ç‘¢+)Ñ\:»ÒYu^¡íŽdå˜ÌP@åC £îu·lQ'€x‚oLT}mUm=~î8Ô!P´º.‹f¯û9¡ rÒ?·® •t)(»2ã—ñ­ûÿ *¸îÓŠ®ÀP.Ö:ç} ÚFô2"32ÃsÙÏå¤Ì˜ëWP:èK3¦6™3…Ö(î=Š/_dL6t™1¿D7MËú´­>E4®~]ÑKbØ݈"Ýißçš_ iœ¼UE†Ê¥#‡æ~‹Â8D:¶®È€ ´Äõû~…Ð ™!ûž¢·ôºåÖýºrýf|èãC‚&Ó§(v¦ùjMÔ tú¹œT¨QÝ‘ÇÈw"ýºåûyÁ¯ÍºB=‹ïÅüW‹ë;ïŸYS¨êð¼žTÔÇÐPmȯÕEwbjN6”ÁaE³²k~¿émA$LѰ¯_áÀóŸQdcF´7kpFAÉBá bî3½@ŽùgºeÅÖc>nhG;Å>6üúàˆS ¥A’H|RH ‘ÐãICe—c\fô´É ´Š†:¡wÎy™ñ3«PÔ7Žs%`Jý—-âß•u™ºÈ¦¢£/‘N*Š ÑßGé¾:Q_(;e½É9GB5d]!)Ù/3Ê¥hœµ­ˆà/)¢·×ý÷£ U“aEA"t£E?šIa(½P\"èo+è!ƒŠâcôêûüxeó£U?\úY…Óv\Amº£P:îçø‚‚ÎDáå¼o·®à÷¦x^ íÇÆ‘Cñ©TVªË µ)¿vP[Æ 2Ô‹4ò“+ wtàÛü¼Fåÿ~MF¡`´_á˜Èûž?Ç|‰“•è”E¤qÚÞU¨Ï”EŸ.®Á¿þ~¨Á˜¬)º “—e¶…F\PÊ^ô{M§[žažý’J…31âÏÞªÌÉ¢f]‘ýÂðþŽŸã¢o»¡¨iXR8Ó~ìPDç¡Ñë€Ì ݹq`WýzŸö{C£±?‡2§:~N‹Å³Ü/Sx:!“³•ïã¶Ÿ×âùãSÇ#?î̾ïÏ™¾÷êS4(çYM$Oé$zô/Â~‡a‘oKñ³Wf˜bÀ@—8¡Pµâó™Á€”âˆÌˆè’9 pðáRŸTab¤7ÊÇeÆÅM™¡qRfx\WD©¥È,PºåÿãüJ @Ÿ‚¢³*3d¯(Tf(r]õñ—=ʈ¡™ €eEgà32#ʼÂCò¥!Š6¡! )( Ðg J`èoû~ë ÙTÆG+ê1ƒ2ãfµ8èTRp þ;Zú'dõ%¿Ô<¬ÉŒQd<ÈŒªÓ²,HÍÇCׄ{Áµ@Õ‡ºøïpæQÿi)ƾâǦ¨yÓŸCãCUˆhû¤‚ †.>¿Pë¸?DƧ‹k³H­ˆ´·P'kÈ÷A ùRΙìÏy…‚ÕŒ¢‘×” ÖEÝÆj‹¢Ö¦UAQ¹ê×¾îÛõã¿çÿÇÉàºɾGŠk@¦¦Õïç¬ÂYîñç𨢖ZÒÿÙ÷õsþ>¢ÏÏÏ+t%ŠãÉÌû³Ç³C4¾kH˜nú9Cç#cEÁ~©Æ÷²¤z•]¡å×ôŒl¾’ÂùÚVÔ pÞ—飤Uv–Ò8I$ž$ÒH$>"ÒóGÙ†¨3…°Gü=Œƒ†¢øŽÆP+ŽÈ"cèn7t•3’¾­ Ð¼*[81èGd‹jgq¬>¾óÅ8h0t%ňB2Mú^?.Ù™!ÓPÐ!(æÄHãœ[ü|¶eÆÍM™ñQù5Úñ±õ(ÔF˜˜züeÝNßÇŽÿ¾&3Øê>–zqü)…ÁLs%èçeÎÙ²"Œ¡HZ™Š%‰’6üxs2çE™£µêÇQÐ&P„¡`óƒâpnu™‘„C$¿Î­Š"f¨SDöyI¡:S)de©Ãè–õ¨¾PQòÈG‹qÝöë=îÇ}Ëÿ‡ãrFaL( z9”ΑrjOèRKfÚͱhèÖ)3Š)äFòµ_ѵ—ì t%Ô{*E‡aÔ« ÒЛÌÕ¿>t,.‹Ý|¿t%U\CQQQwù6oùsLñãÈH`´S«Ñï?‡dNÆöLq hfý¨OA¹Ã‰_T8s­Š¦bòg€Zdq`©y8ªÈ6ð ÒxoÕÇÑíÏý%E§aÏÜŒ,VS°äß#zmì/FJ"ñø‘@â™ÇÓnêÅñQÜ¡Hn\ÆûFË®ñ-…zUF£Àpº¦àíC;™÷ÿ‘Ç(ÔÌ+¨%·à µœº¢O²EvA¹‡ï:Y‹,Ò˘ႳoŠ4‘E"Ñ›þ75…–y]aè!݉s€Ô)ÆS[Š1¡l³%3*·rÛÒ©uÁ¯7† N²(¤idDT¶Ôõ§Ãé¤B±Wf¤¶û{·4‹qgÐï3]wqœ¤(ª…ã½êcl÷c\¡Ã¾êûâšIA“9«Ð¶ç^aL¢E†„¬Ë„‡hWf¬S¦ ?¿o+ €·œo(u™qy³8w2RªP“u,ƒþL¼£Ð™ÿ´¢À¼¡è> =‡¾ ~(ëЉ™çaÕï ½ ¨OÁQ¤Ñg:VãÔRSÒðó§ýŽowZ‘™€WÏ=¢Žd£xf¸&Ðv¨]¨+8ò'ýùìös§áÜ1E†Š¢âÒÁÛUýcŠ bdã6бQ«1ìç¹îÓ[äÅâÐŽ [Ù³âªvÌ·çû@•3ú P¼%£~AŃ^ø8³OsH$#ÒH<óø$›yUûþ.µÞÑÍ–E»(Æ+‹-o*Š`OËK 'áD¯Ë ©1™á2®Ð,ÇØ»­èÜ®X”‘jÄÀæ¸w…ŠD'¡Íô)TVhH4àǘ‘-â°B": %¨®PýXóÏQÈL ¤ËÐc€"K¸ÿ+ Þ;»v’²¬Ç-Y¦¹H¸ÅD·k jP[1¾™#5©Á\W¨¡ í¢Øç¢ƒ¢ÊV…:Ô’ëŠî®èÑÏ) ŸQ…ñsSf(¡´3.s‘1QtY¾î×€ÌÆÑdq]Îúxç}œ›ŠXDX鮋$*õ8\·²çº‚›'ØÏ{ÚÏó‚BâU&2=£ #ŸLƤ¢žƒ"Þ>ht·íç1âÏݸ¢IÕeE6']û)ߘ÷˜‚®D§\hKÈÌR›±¦p0¸ÈU¢¢„dî°oC?…>&tÓ?wC¡ DC3 Zhv’5ÓV4K#sG÷ÝYÿœŒZдƒÚ# ¥!¨kˆ (ú^àLîúØ9Æš?³d©£‘BÙè%E15ÎF»Ÿ)ŠÅïø~qZp„˜› èñ½¥h(GWgzM€4X‰Çƒ”M$û%=yÁõǘë—-’çFʶöv(m•5¢áœ~¨)ŽD1bIµ£Å^qÿ¾ácéñó î5ª%È:bÁã%:ÏZÅ®Û Y? ˆÓþ‚¾´êÿÇX<¢0¦}œ NQéÒ^)N ™†ÿ~[fxr½vŠsTèü·?9/)TXnÉŒ»I…áÓ*3îh`†1Õ­h®Vc=«P8Bv´ÃÇ ™ 2¨(Rt<&M-¢ÔПÔ±›Å3=醌bRSðúqq\É@@%9áÇF¯㎳ýºÍ("ë‹~üËŠ&l¨$©&s@VÃkÒëמÞ8ŸƒÅ{GýØ|_ ‡£ge!tù©‹ñç§hEQÔÛççsNÑc‚,Ž^WqÔµ lD&9ÕRѦòŸC~Ö>…Iä¸á_(ž3èXde0¾Ž*xï·ýZ“É:æçCÖ *–ü3Ãų²äÏ”} þü¬¢.€1•tî5#eß„‰âÙ¤ˆùŽ,KBÁ;éæ}»£þ]šñ}àà8b¨BÏ##Eo‹.ßLjÿoJf˜/*²ßÝ?NNÎY§‹2C#gœždüê …-žCî!׉¬RGq,¨I*¶mUÔ:ÀqF>:"Ž2E^¾#þÙ…µ;¨`!ÇËwží¯(8öÔ”]„¥4d‰GE:‰Ä}°Ÿê%(}›l{CfüÐwRöÅ:¢Ðío—xÒ™¶¤¬ÊQ¨ Dü§üûE™“€Qº 3pP–š‚¾û‚l=*3þî(Ø÷e ïgd ÔŸY™aÒîc$r¼¥ i8®èLLGW(An7QGÔx$ÚØ/3và©_òÏ+Š{|\ô9 xuEy'CõeŸ[2C ­óÏû¾(Rþ¶‚FDs-$[gü~.+‹ê~o‘U„OWXšiù{Z×’¡Š&\HU¢ƒ!Eƒ,ˆ´·¾äŠ‚³ÏgàšÏ) •1iä%ï¦ß›²7«S¾í¢ÂðãË ª‘gôÜ¡æ TDtšqÌ(¨&œ3c’¢ÇFÿ´Bñ u24Ô¥0ž¡âYlW¨åìú³AQý˜ß¯;2‡ã˜BZ9Uä{1Ø©=8æ)êyZ=v´8zAPDŽÃµiU‘Y –¤S{)„ƒ2£:ÏÒ¸\/$yɬ(jiuÀÿ‰ò—üõ~…Äß÷ËŒ‘?Qb uË­iíÍð7Qº)/¼R%hü£Æ²íûŸ—/Ó ‘-™Q=ëã¦+è9Õ#eÍÒ(kR¦ô1.s n)”S0Œ; 0ª9 >ó–"Úß­ ! IŠL#ý*™ñeêÿ£è‚ - ¼çÿ–ñ¿eFÑ÷üüfÔd ç|¿84»¨pî0Ú ýÝôë0«Ð§?­0:N( é[²ˆ8-Ù—¶â<( ž—ñ¢‡Æ,üòv…³7ác˜ò1ÐIGà¶Ìh$ê?ªÈ¬ÈŸ ¸ðvbXÑù—Bìnæ ]Õý(0ö/ûñ¨E! ÝãÿÓŠ` –qEß20ÔoLkï\JЃ€Æ²ï§® P‘$ˆAQ?Nò´‚–¸$›ÿ0`ö× $‰#€DB{{•Q"Qè¯÷ËŒ† ß»S¶}G¶(¾ HO/+ælÉG4ì1:†d‹¯üïO˹÷ü¸¯ÊŒ’ïÊQd%á c¼¢Å½*3á¾Ku%³Ð©èB¼.[Œ1Φ|ûu™á}‰k¡°ác›P4 ¢)Ò¬BÖ1Å­­Š¦Iü b˜Bí©ò—:-2£ï´¤o)ÔqPº›LÄJÁ3§€šH8J-ÈF}E~µ¡ .Uð¢_R/ë~¸ÞhèóöyC¡î3£(¦öéÍ9™±sÁŸ…aU¦”u•ÿݯÜéY6 EÑÉQ ƉÐÒm˜g¾×ï Ŷ4ùª+ê)úüšöù¾áû#å‰3I?ˆS¾ßK~ß?£*Å€¥.å†B¾•zŠsïøþ¨ éóïߨã¸?‡ïú~á•KáxBkéR8Dº‹Ïݯü ¸§g¼øî ùØÿÄ÷MV‹×ýŠzUE‡âvÿߘŽÆ[È·ÖÎÙêFÊú©“~ínøX>㟧ػÕÿ·¥èÍpÊÇM4 `yÈŸ…7ý3gü=º“—‚!ÔtËœúVÙ÷“^› yâ e&†R S$/eIà’"Ä÷¤Q“H<é$Ž2â?º*ÞcÁÿ”,rG ~SÒ+RúChwù[WDï1²GÆÄ™±¢h\tLÒÊœ$ÈŽ…ê } yÐ>…cA.|÷Eë†Ì»VƒhUa¤Ðp‹EyÍß;âç{\Aßy[„¿O‘.Q>øÐkŠ(”8ðè¦SÐØ/Ëh¬É šY¿ãŠÎ¼-Ú+¡¸¡ÈLô(:‘b˜Ó ~4õóŠ9Rœ(É·Y÷1–ÝU)píðkÒV¼Ç¹¯+© }bIÑ[ ìO@Ä”‚Ýë¾zìø³€&<ÎÖY™Ñ¶)sZ 0ÕúðÛ>ÖšcÔuŠ^Æž÷í_VÔžüw¿ÖÈ ºQ?—c §kÁÇG͆751d–Îù³1¬ ÁPç°à÷FiÔ øu:çû¥X}YQ,óøRqèI€ºîÛÏ+¤(·üA©š’ôš¤ÿç°´½)ílKÿ¿u3v©é ãEÃ1xò~ü7|Œo+ŠÃQgê÷Ÿñ) ç)Ú…âÖðŸÔäŒús²åß ”£Æü\Èq¯©ñ€ª…§â™fŽ+A- û CDGè>I?àÛ¼íã}ÕdzRŒ¿Ì>t×å/æävéŽý^ñ\p7ãaBÖ+$ÒH$¥ßÚQÄ I?¤0Xà&Ù‚žRòæ¡¢P|wuEY¥ $ýÞ.Æs^¡ˆÓ#2#¬Q|ž&>È^S,Ö_9×eQ½[2qJ¡`DgÐÛ •^Y$‘ÌC¿ÌH¢ÈÝuTj¦|,¯)TenÉ NútË S(4‰‚¾'¹K‘þ§®bÚï úáÇdYŠdÉÜПà=߈‚¦Ó©0„0„QSj(2>7T(¢ñû)dH6ýþqÜ~…QƒV:™Tˆà_Sh§Ÿ*ž½EE쌢1Õ‚o[6§’ÿe‹âèSþ\@-Áh‚–Õ­0ºpöJ?ŽÐ²¤ï“ÕNÀ»G¥jFF‹k($‘ļ¤hõ‚ïgRá•´² ×™4êlÈ ÐµÃyXápLûñ¤¨ 9¢pø‘u â“~Îȇ®È v”†/íò÷id…1Š4è¨_):óûÙ÷ú¶ŸýDî—Ì uÈÚRã³ P""Ãp«¸fƒ Ïźt÷Æyâ™|ѯ'³çתͶ?³+Š"÷-EôÖEȶ":O¯ƒUÿžP=Sì“:„š¶ý¼¨3A«®¨I¢éEÜdÎèÄLƒ´6ÿžQwuÇu0ËEçíy¿‹ïÌz1î5µPôX ‰BäÓ *(ÁPÚUÔ(¡&D­F»bNZômè$ kDÑ쬡Ȳ0F)‡%÷C:‰¦Cí€*!RðäÉø«-²’(eC¶HUtÅ<â¯2"|KQHXWê¢Ó¥ˆz¡D2©"$NÁºl¡ïö1žT¨ññ1÷øùÝ.ŽwCÁ¿EüU™£@±ï¬Œ@/‘÷£ }ó9YTíþV™“Ò"3"Fý§…œc2ãà…ÁpE!åˆî? &çüóH9^UhÎÏ+äMˢ׿\û¿ötÞ%š8å×ã¤ãŒB´lÐEV [Aå©ÉŒõ…(r¤¨Ã Èœž V0±“~íKŠôŠ*¡Ý’g2*×5EÆ…N¶H5¢ Äx;üž`€Ò8kן³šÂèìQDŒ‡”)ê[( mSdcPuÂѽã÷³«8W à(ê$èLñ4ý2¸–D¾×Züd£ú}lëŠ(÷K’^WPÄnùgw)nøµƒúÕ‰LÀMí~Ï·i)Ž%‰ú.¿f+² Á)…z Ù”œˆVSàνƒ.W“9©óŠâê­âžï(z1д¯¤ÍŒûX¸?›~h„ƽPt 'Cñ?ŠÀùNâ€RüÛîÇcîA‰Æ_ÇýÞ d€¼ñ’ù`œŒ}jv–TIú] @µ¥² ˜9>‘HìE:‰¦Bmßïü].(ðÆýuZAßÀ¨Bž¾1Q;Éø´m2ƒ££ ÊÑÄ[þ9"Û²ýŠBBRæd pR0€á)_—-ðgd øeÙ¢¸ãÇ›“-ÆK2C’ÅaEW`TuÈ6 W_Wèð/+Šþnøë’o?!é-…aA—V¢ÄôB‘:êÛN+d%3 {eT]AÍé” GÑ¡ⳓ ¹Kš©a„wûv\ý MüÛ Jõ ò(þy£ß¯7Q| ' \Ñý‡†„¢ôˆ’¢ÒPÈ¥¢©O¤¾&sŽÈ¡`CåE‡×A¿6«Å6]~ÿ‘hD‰†{7鯒ŽÕ«p°èhK,ü{2oÊ2ž¤L—üy ²àÛ\Wt‡®ùö/+ÔiŠ3ôš Pœì\‹"Ã…4$÷ÿh1ÖºDõ‘ï¤Ð»§Øg«¿wÖ?Óá× Ç²[!mI³<øöǵ·†e£S §ˆöEE¦ÚÜ"Ú½&s:¨OXög±SLŒDV¬S‘“¤/ù³‹ŠÐ¨Ìp?í×¶¬=øžßsæ>žv?G2ˆRPÛ}ÿåuÂqFYˆ`ÇM¿7|Wpš×áR| xE{ÅhHÈ3ŠÔ**d̵òÏIžï‰D kM…ýÑ "v(»°À)j!³y[¶`"ŸˆšE©ÜÁ¢†A€á?yVAõAGý‚,‚µ%“ï“ï+Š8ï( ,{a &‘n\P6C êŽlÑ|[‘ʇ»N#¢!ED¸.3Êι(äŠ'rLa%ò—Dµá£ÌsÙÿ‡B ÝHËNÆ×dËgüܦd†Älq.}þ“hk«‚2€êÉ; û‹Š> Ï6]^{ý(êœP8bÇdFÓ-ETyÅwý&ŽÅ¢¢`wÅ·_õã4ò#þsÊÇ‚¦=õ%{ŸUt]õçiÐ÷‹A‹?ì׊÷è¼JÄ£Š"õ›ŠN­2 å"¶Deßóï ò8} Õ£›þ SOÀq),=Y<¯§jE8O«¾¿£ŠLÈZq}PPÂÀQ¤C/€‰c$×üÚl÷ž¾–øv(ºÙbìâpÞPP÷èÑÑâ×󘂺ƒ¬.™Å†‡ŽÈ …!Ž#ˆjtžaEw]œ‚¡â;ÿ~׿«“²Z!ßO¨7¯ø¾oùù8çû±ºæÇ(®ß¦¬^aÂ÷;àã¾¥(‡ö¶$ûÞžWtÏîW8ÚtýTÐïpÊ¡Ñ'Ê"]“*£QØÜâç1©èÇA×à²Hÿi;ê=“H|’È @¢)Pþû ~ûd‹ê²Èä97µ¡ˆˆ·ÛÃC'z„(NF/úñ5…ÊR ²Eâ_ Üu…$t1±¡€IDAT‘0ŠQÜ2òKá2 À5¤c(üå9È 4Ö‰öÑ*Ѫlñ?æÇ$ºò‘Òë²Ì /—Îç@wa¨UDÔWeF÷¤‚Û!…6:Ò«4F{Ù߃ç¾èçq\‘Ù@UhÃÏC­EQŠá@}ÈmYôvNQÛ0(3î ¢Òd8ÈlË"­W‹ý´ù¸Ž+²O4Æ"pDfpá,öùsƒggHQH¹­0FÇüZ-ù¸nøþoËŒô«>~XÇíRt³%›2âc|¥xöÇ|ï²A«q…*Õ§}_×} D–é–;§hÖEæ„gjˬGp’P+QÔÜ´+ºS¯+ Tq_WîR ±äï£EWå—dF'r™7ü™„‚$…rÍ« ]|Ç8âãÃ'+s\f$Ãã?îŸ;-sX)ØŸV8B ™ñ>¯è¹1åÏU)G;ãçzU{‹uQÒâ{MÐm@Aß,ž©;ŠByšuÊ/Šñ—¢Ð×(\/%)¾£È¾Ð›âíâ:MúyÎû3Âó@s3jiVü8ßÒá6þy¿v÷2k‘x’È @â¹Ç~Ã_²Å£Žr©õO3/"¢tÑÅÀèPPYàB·*tì{d‹]=ç<`:·ý½-‹€þ ,2?-[ô¨I¸äû£”i]¶XwûþQìi(h$# Žv»>²¨kåûêòí)Ì…?}ZA…˜UDÜ)DÄXoQDéP2"=Wß®µ\«m…ÑØ®0 Ð?ß*Þƒ6pJ{;3Ó”©Kf0qD«|ů ’wdL¥è¶Ja#š(C ((4§eM—ÊfHR4ßSðþé,‹¡‡S÷y奡PôA5Jþ N+Œ4 p'}ÌŸRÐNî(jPˆ*¯ùõ!Â" óK~í'gš—¡&ƒ¸êc9æÇ=íKáˆÒoˆo‹ŒÆDã5Efbͯ7Ï]Ý÷·è?Ï*œé!…e©²tÇÇ÷9]ÅýÀ(%ª>*éOùõÿ@Òÿå߉YV‚(rÍï ßú8¼«(²&ê šh+þŒÒ@…–€B©ÜuÔŸ8óíŠâW }¡Wñ}’¢`{Îÿ¼lÁ‰¾áã&kƒ9¤ ö+d|+}Ìô²ý’ 9¯Ê—mÙw¢òA…u$kŠ:‘-k Éa2bëŠ^ ()}  FÒ‹ ¾4šãY"P:OÃ蹟1_Ýçÿi %žÒH4Êh Š9òÿpz‰È•¥{&Æ?‹ŸµeÛ€‚žÓP¥p]wúõDšá÷"ûwSæ„ ½xZÑè µ”ó”,{Ð%é÷…s '¤¡0‚(ÚCÝd^!!H·Y¢ýŸ£¾/ŽIÑߪïcGA+‚Ÿ‹O7ÞE´¿®(¬-†á@1N «åãZöëCÁ(k7üšAO ÃϼMfØ-øggÆ2\x¨lKýÅû 9BŠ@qQšP4T£¡WÃÇÆ3DÄžgBŠè¥Š*tµ%Jÿº_ã׊çcÚÇ6(éweŽWdQä~ÍŒë_*"µúïë- ŠÌŽÌÀ^ðŸpÂ1 ÏÈŒûVE–§]!áXv»¥á:…/É ïAYV€ûAï„Þb¼+~½¡‰Á§Gñ Ú Åß8}=ŠŽÅC>žÙ÷*Qi”ÊŠ…zÎÓŽÌ@¦@·áçóYE·kÔxºÊZdPp,‘`}¿xÖØÜ,¶ÅÀ/kqn*²ôâ/¶kõ¿ ˜õs;£˜CØ/AŽ~/ ì}¾x†™ó$û¾]V( Ud >Nû8ô'254®+úH{ûVP(|Õ÷ûiÇwýŸRPݸG ¿¿·dÎ=p´ =M£ça¢ú9i¨%7ÒH<÷(3­ÚkÈC] YRH¶¤ª²†hÖj±OTVˆ«]ˆgeD¿bA…fC”T;Ò”(¡éÍø(ªl‘Eì.øÿY$;d‹: ÏІO3 Þ/R–§ýï%¿¨ÑL©æ¿×†äK2¾¡(šl—BRðã×eŽØ˜ŸËÛŠó>†SŠèå{ÅõB±GA!ñžß#èH’h(n ùg1>©Bƒ}J!¯ø¿¶Hoö+dc)h^Q­.ùçÉèœ,ž‹5E·1?šø2zZÙeø]o»¡ÈnQ||NÑ€mWáÁ¹F†–"âe…4.ߢúu…‚Òÿ#Ÿn׃ u¥ß?ÞVE- Î1÷|CÑí…):kßÿÉÈUû~_”9Êdæ¨QÙöû޽¤(ToõçfJ6ŒÈ¢ò½’¾¡†v×.s®*¿W¥Óv± …ãpè©W ˜(¼.k(pŠ‘é(Þ»¡½NçiÿN¬úçG‹c7ü|yíôûÕíß‘32gìš,»Ó'kx¸*kö¶)ûŽñcôIú}E®#²Á5™S€ºŽúœÂøÇÀïñ1ÞÔÞ¹^+(Š>—ýº×ýL OK²ÎÌP•è°¦ÃG ÂØ¿_à0Œ7ñü!€Äs‰Ú=þnÝ÷êTP~ŽÊÒà;Šô>M¯n*ÔàÀ§ÐãÂ="û[²ÅzQ¶ð£…¾¢ˆ“ŠÇ@$Ú/…d`—¢ÑÒ ÛEÔ½ÓÏc^¡…΢2¤ˆø)ÆI6໲…›N¡u…ã1« ÏÀ£?*3ÈVàÔ@ ‚>ÂsE‘¦ÿ~Y#sPaˆŽ(¤üäç9 éÆ/)¸Ìœ'÷V êY"Üàã§šöPLè1pCÑ­©TúÐW£ƒÆ](C*uÐoñ{E- Îæý: ¯Ž¡Ê3†<Æ65<8¨£\’Xo+ŒZ néØÚ®0<Éì@‡ƒ*Ö¢P£é’9lô|€bÔãçBÃ;в{ZøÔ+¼è÷âÛ2£žŒ™´ñQ%ÚE}Oì;?ùûP¬ ÈRЋÈ2LúïjÓè RêÈšnû¸)x†žö ™a<ª 8­úõø‚Ì(½)sbk¾Ím?6üwŒOú.lU8]²ã˜A‘¡ž…®Ç MI YaèŠÔnŒÊŒp jd5Ç%ý¡ßP åçõIÒúŠôöN8ùRP )<¾¢KE…G~]È"÷KÆ`¼øÎ cŒã»® 4ñ=íóïP™­Eù‡kF–ŒìK«¿};jˆ¸ž‡Å(ñ°ÙDâq ‹€{ð<Tô+ôU™ÁŒñG4u)Š=18ˆ¸—2|èäcXæG ô’"ÝdQá<…C킈ÑkTƒàkýoø¾F¶BžP¨øŒÉ °W|v ^¢ýBaÁÙ¹®(ä¥~õ˜†öjØcÀ÷Kú²¢PZÛº_×÷<ëE¿Æð)†ÒsLAAY”0hÄÓ”ê´BÓ}ÍÏgºó°Bié–ïŸâmŒù}ƒþ0àŸ;¡È|Ѐ Íu à¿&¼füØ£þjQ¨Ñ8ŽbPŠ´‡ÍØj>^:IÈŒÞ1ýiÚ’ ê/®5Y)øÔèë£yOâ²B!iØë~ÎGü9!’Ã"ETÿS>îFñ}xÅ7íÇ{_aOÉO)"¿»~^è×Sd^óók(jNä÷à='…­•ãT"i{Fѹ—Z œúlœöû=ãÏáŸ(¨GÔ¨t+š²¡ö'þ¬ û}zEáó§`N|©HD¶¦»÷eçƒpiìŽ)¨€ô€ H–Úê?èËÁ÷‹L™ ¨8d+ßݾWÙ>¨¡(iašã·ø5>é÷æ¢×ýžÓ8ñ¿®WõW¥ä.™æ<æ=rœ§ºBD@*R\—í}û*£î‡µü/‹„é$öà ‚Ùg µ{¼‡–9:ùúp3©2zˆÌ"ê,4ëbʤ(µÓ??-[tÊk‰$çŽl¡ƒNñ9AGyAfäÀ©WDSÁE*}A]ÿ´l‘ÇÀo(¨FP,Æ$ýo£ÒÀj•Bö’Žš7e4¡«2ÃdA¡¡BJ§¢[ñ¤¢C-‘Ï[ ú˶Ì<ªè`û–«ìüIQ3üv2tá•Âl/îáß“Ó2GÝ¯É …èIEa'M¦Æ}ìgŠÿA¯—Ñg^Pð©á¶ѯىâø7t)"¶+~ÿPP™(ž!¨6<“8,€(E!ïŠd+…åG|lDGqP†’ž»ŠâÒYEï†EYt{YÑÈn^{•®>ëÛN) t ŸáÚßRtMæ3Çü4u#ŠØc–õtž¥ªj$ ):~ÑÏùŒ¢Žg[A!Þ„Ä(cèSDÏ©U¹àÏèi?c2)Zêbúü8ìÿ¨Ìù8®ƹ¢®f§øÙYŒ¯]!¡Ùðß©ÿÀÑÞñçk¾x§ø½ŒúCkë‘9ùPï®*j$(HSÐäèl}Â÷qÆïï)ß÷E32ùó3äûVP˜NùyÑ+€@ˆüzP0ÞëÛ Oº¢ 1ã¨î*ºAo׋¦tk²ï4÷·]Qo‚JWk f”¥¨ 8LH£>ñI"€Ä<‹“OihïçRöÊ5xÙ/(Še ¾8ZÞ·e_ ¸ç+Š1*,’-Ô¡¢\¥`T­¥9òœR(¾¼àÛ^UÔ\ôÿ£†A‘æ´"u>([ä®ÊŒ•9ßEŸþ³Òõ)‹¬Íû›Ppf·Wm1…ÃŽ‰±uGQL4šhÛ™aÔî×í²¢cð ‚³N'¬+£ùû(Aa (”g&™¸oûu8æ×ýFq6Ò¨¯)ŒQ²2'纂:6êã…SZÎ…}ãÄ輡è/±ìc$Ã÷"ƒrJ!K÷]º'ûùÁå'›øŽBkBFê÷ã~ËÏïF ,VŠL¦üZ}àÛŒ+œwT¾ZÍÖP;¥ñ<ª¦(œF8<Û'Îç¬ìûzÆ4Ž[RdÞ÷}žUP‚zü3<ŸŒsTáäl)ä}qÌž’¦~¥ Õ $‹ÃœK<”Ëa0ÊÉZ ‹?“?2tHbB˜•-º/(x£7ŶußÊÐ:øI!,…¿wMuˆï( ‚†‚nÁ³éû»VŒúÏ´¢Û(…³²Èö¢ÌHé-¾£2CŽº€÷‹'t$Iq\WìWô(Xók÷²ÂX¡ñÑb F(GR¨jT C„žˆ’ã×dÜ’¢`ï´¢èþ}‹" Iôõÿò{·PÜSŽßP±¶Ê Œ×´Nûö(«PÀ»¬((¤Ãð„ò€“LÑhŠS¡J¡¬Òí× gF úF?™ U™A†ÒK›‚¯?èûyͯŬÌA¸ª¨'€ …Œg«ŸÏ.ú÷PFÈbᤔ )DáÙþuÿÌœLÒtÁ?Kvê ~îÔ\ôëB ê‚æBFŒfn/(œ©º¢À•ÌÎÛŠž|/[| ¨=Qø;©ß¤®JÚ)?îuÿEïÐ`NÏ9Æõš¬ðý¨?#·‹g¬Ý÷ e'‹l{K1¦%E½ŽÆˆß§/+‚7ü®+ŠÖ;µ·Öª"×™ŒR‡Ì¡»¨è¾"sB óëÙ¢ÈJè?eßêŒvüù¼$3Üy†.+^(BPƒ>%£ñì(ÄÖR£uEƒ¿# J4壯¢¤R˰¦ Ô 8A’5Ù㻥¨s¢WÏÃ'E J ÄaAf{P»Çï‡PB-ÙP,ÄãŠfN¤|*”QX|ZÊ%VŠõŽöê`£4¥è @aÜ®‚#¼$3¢ze Ò„lQ].ÆJÄìŒÿ~Òß?*[X×È(§`D"c8­ˆŽRŒKAoÙ¼Íö†" >äãzUü@aÄ!Õˆ:ɼÌHãšb´J±(ù¿æç WnoŸÂàÞòÏŒû5à!ûxEFúnÓÏk@aËŒ;$ibvË÷÷EdŸf`DN¡ `0BŸÂH ˆ·äDC)ê’4+%WwÞÇUiDŠ‹OÊ"š/ʲœQVšI}^a`RðŒÔ*üfT¨àw×ýšÂ×®ko×\º^Ÿ’N'üZÀ}Ÿôñ#Ù[|¶îcÜñ±c(¶(Tkf%½©p©ya_ïûó&ÿYS4¾£ž%"ÓkKŠÂ÷3Åûó³R’ÓոݟyèY„Pë.)ºP#mŠCÏ>¡Ä]“ñ4D#ªþš"{@à‡ï}¿GGE¾·8íȈBѺ£È$Aÿ¡¦æÛ¥ï–^è:×£XœÈ9ûåü :PìNÓ3®õUÉ¿;ǵW©‡È;Úü ~ÿ–jh­ ‡†9­¡È QðÜU<ËÒÞþ 8Ówtź"{‹ãH_”žâ™Q€#ð@_‡²Žåq£v×½Œû{­½iø'žÒHìÁ³>ñÞ­É&þs²Å• åÎ( ÍXù<͉¦Ô"²ÚÛÈé> ÝÖŠWÉc.U„Ùã~ŒMßo¯Ì°Æ „M#­^ÿÜi™¡vCa€oÊ ÚQE”ô¨l¡DSŸè.~:¹¶*¨J7eÆ ét4É»2.ðk)Xðã/ùgßRtm%•OZÊRòÖ²œÇdÆÂ[2žÅ‡f[Q,J±ëiI_•Q¢fM­0†ß×ÞZè'+“‘ €Ùʺ¿ÚÇð¾‚ÿL=üj"™0(FaÜp Qy¡X÷ÿ¡Ðœçž^—É-¾© ­•Ê&\ßa¿wÜd7Oú5祅¡Ètò}Xö}^sdPÅ9îÇzÉÿ®üodqk Zøð÷çeކ†'ÅËèêã8â (¤jéÝE¯TzêõßçÓ£ÈúÔpœ ЧýóÃ2'ƒ› Æ ?cc>ö¿3²¨9Š5'üÿsÅsÁ÷ÎýE…0ž )Œæº,ª¿¡èÜÌ3?ëcFîú]ç®ÔÝ"M-Ú¹Ò8mÓ·¡ÈGQ¿„¬¬üÚ™TÈÈÎ(‚,L(8¯µÌ ¿×È$£ðíhFæXÑ%Õ%²‡<Ë U©u…ø” T¨Ÿ@ZCŸ±×}¿3ŠÌ!Æø“ª¨=Âûû×Ýg)ø–xv‘@bžå‰‡±SP‰ñK™hî …*G§lQ¢C-„yE¶UaÀ^Uh‚C'B J ¢jŠèi§‚7?«è:»¦hêÔP¨Ã (ÒPÙ þ÷MýJÑŠÿoHÑÄ YÓnÙ";*3ì1’_’4D#çeüèwº÷ð‚áZcŒM* G}([ìÉdôùø–‹ë†‘IáñYµ£WÒçkf´ÎÊŒi~½ª½QY:3C™ +1¬ xP1X\g('8=42‘ Ë?ícÛ”tÛ £¨Ó¯é·eå›~¾Pºe̯͆鲢³4¡Ô“ÁTC¨!ÑŒŠ&NuÏEv¨U{å\Q£êóófvY¡ë^WÔP¬×ú%ßÿQÿR±4“k—Ý£qÿ¸¤ÿMf˜N+ê`ý%¿WwüïE”›è4ÊHH«ŽûqG]´QõÁB:•û8¢ˆ´ã4±½üY½¢0 ‘>Z<[¶öË2 ÐXn˨0DÏ7eÎÀ²Bþ¸Ž88ŽC~ ½!›ŸÞÙ´ Â7’¤ÓŠÌJ{ñ‚¿¡¨mÁí‘ÖŸòglį!ÙÒ —"ÃI@9‡ç Õ©ã²¹ïÔußö¬_«UEÆO UæXœgÛPû©)ê¶àýÄZPÔ,jo?€dïãÂAFýA<þg1Жx>Ðöñw‘H<}”ETþ;ÚÔ¸¢A¡â¨l±ýíítÙ#3Xj ÃzÙ²]¯"‚ÝP4¸éTÐa0ÊBÇEqi§Ì€ùaMcÖ_ý Å‹qÿ_Ca\R§ýø¨3‘EÁ¢_ÄkÚë0^‘ÂÈ­®i/­†Æ~(ñÌQ@}Ê´¢Ð‡‚WùÝG@Šú›a…úÝq1F¯)Xñû>âÇþ–Â8D†•οó úÎ1Y–‚‚z–;²¹0¸óƒŠÜÃV® Š‘ùŸŠ¦ZȲ¾)3Úoûõ¥ÈªÓ´ßßE–£¦è{ò9™óqÝ?wUÑñz[a´€iWÈ£’…ÛÑ^§íŠb€š„3YCžuæœ;~ÍqÔ™“):oÓÞº¢‹êÆþ‰æDf{ð¬E%ö˦µ*ø¼C ~7‹F éûk y>4·+Ùb˜1$ ŠVÙbв²‰k2Ã…E’›‹6 °Žù~¿'3*—ýÿ_ªuÙ"†á?¼’-¼wQK$Cg êEcôɨc8Üöל›Ôþq™áÿŠÌ¤&`B!#8æãDÒñ’ÌÃÁ¹ª2¤‹, ‘O¸ìD…)N‘î-*xðo+ôÆGeê4£>Æ+’Þ­ÂxŸõëvVQƒ¡â\¿¨0d‰&Rœ8çÛÑÏ—z”ƒÚM³P“AJ’èý¬ŸË1¿žÿŠ¢fh3d„¨GèVP¶ýܬ…–ÁýÂ8íúóô9ž¾ ,WÔW,(´ù—ýþÔZîDx‘%kƒs‰‘‹ž=‘} Åáܧxæ ÁPÛ‚ÊÎ_§6ËEÿ^¬*Œ´n¿;2ƒ›è.Ô±q¿‡8žtÈ&SFÖ®ácø¶,bÞ£ÈìPßéÐÓŠBãw}\(2A×£N€ì ²°2|ÝÏ àë>îý:ÓÄM ! ¶×5$¾Méüó\ì8ê× ºµ&Й Èpàñý¥ÉÖû~¬Áb›% ©bh;ãJÑQyÀŸÏ…hA›¢æ¦[Ò§;¤#½ÒâFP>#Ã5ä÷ü¤Ÿs—ß³Åb¼uY4cnÇñÙ->·£½t g9#žH<©”؃gMy tXp ðÒþ§ZÙ¨~,(¸ºe—Ð6…ÁGäšÂ[”e0Fч·;SìñŽBB”h8l”¤‰”Ñ@jÖ÷ ÅcEÑàgKɮ˜švEr\¡~AÔŽña™!4­ EíÊi:yžSDU1ðº}{¤@QöÙÑ^UŒ~®1µ+¾h Ë2czÎ?û¢“kœ˜×eF‘Ã~/K½òQYÁì…t*Æh£¸xwÈŒ¥ Y4öÿÿ9n=™ˆ“Š((Έ]e)èOÔ.4dÎT‰†ÿ$‹„áIæ€ç‡à¤BB’bPº“@ÞšH—B*µGÑ5¸®0ˆWÙ‚-Ž)pÅà‡>ƒq‡cŠ$)Ñu´î¥P$¢^£îïOú1ù~y¦‘ÝÄéYðÏ]#NÄNáèPÏw‚Uœ*ÍÍúûD¶ûdÆ9¶œïRñ;r®ÔÜ,ø±)ŽgB)ˆLɘ?W<ßPxøn"³I!.âó~.7‹óÀiÀ˜ÇH'»C0µ¥.…ÓWªtÕõPqP£€zÃ÷]6ÿ"CÓéŸû²¤Íšt¹ŠÚ§%E§çaÿ®4…óòkŽ¢Ñ…Áy…3Úªpt¢,úµ‡~Gpdº¸öŠÌ-Î×ÂyD×ljÈàQ%þõ/‘ø8È @bjøû0¢Ì´ïÑÝ’è Ân*ŒºuE¤ÙOôËá›.*xÙsŠÂÙ—dÒyRt—%Z*Ù¢?¯0biJ³ àÉ£½Þ¯àÙwÊ3 ûü3GeFàI™ƒÒÐ¶Âøa±DJrFfpaàpîÕR”{B9¤1 :eŽ#…Q#…±0#3>¶ª;Cv)¤18ȨôãÂPŸR4`‚d$÷v¨Øï)¿Ÿ¨?uˬ›~|šg¡øÒ&3:&üú¼¥Ð"§Î€ñЈè¦Bû}RÁ “EøÏ*d:éÊ{D–åAj“k§yØÇÒ«¨õXòϽè× ÅÇ=ãc»¢è(=­P‚â^A— Ðö™ÁzÑ·_òû·¦èˆ¼YœÓŒ‚ƒU ùOè=>æ-mC‘,µ4(ä÷÷'}ßdÎë¶“lÙ¨7‘écŠúä 1ÀùN󽂳ŽÕ¥0$ÉìQ{ZæHà˜•´!œ3Œg(pœ#™CÇú oÕÞ¹gAáT`ÓÜ‹~ ­Å=åyÁ˜‡ ´©p’)œm(œŠR&™Þ íÅxËŒ sX›B’³R¨g–ô©A©kGjÙ‚ö3 Ū£ ºÖ‚zÐEÖ€Áií .•ßVÈ5C/«Éæ™R8ªX™µEþg9f8Ę¿‰fA:‰=xBÁaC)¯Ö¢  /aXÉeâ§³$úïC²Å‰ Õ ÒÓ¤ôK… "Hs²È*‘Oí9íí:{F¶@®*h;h’¯É Ph#ƒŠÅšãßRF(Ñi–ˆélq}êŠÈôŠlÇøÜ)ÆI:QŒñ;~´û1Šá}Ãæÿ8_(ít($Y[ü󊈡|Ü81Pª¨-SÈub`•‰(‰ ì‚´ªÐ‡ã_*,È((æàÍ( -É27‚= { Q½ÝÇüm¦|N/ù=àY¢Y¸•Bº•ëÜâçXùþ ¥!³X¦ÜóE‘-Ž)4¤Q¿Æ<ÐG %Q´NtzÀ?¿Q¼×ªè(̽˜ôg•¢†"S°«0 éy±¨È2à µmøØÉî”QÚã 9Þ·eŽNM—Â)À)†B†aRQd»¾oßDשóU()QU°OAã‚Zƒ<ç¸"ÃÄ\Sfà¤ã4­*töQ:"š½®pXnœ˜RtÎeDµšãœ¢Ð›û‡c&ES®öâXÌ‘ƒÅ5]—4µaÊCÛþ\ ž6Z|–,+ƒEvuLA?bçûAfŠûÔÍáݲì(ªj0n):=S0ÌJDdd‹tŒA…Üé-w[Æ­§¸Žè_CA"ÊÉsƒáÃ~Ç|œ6(’ ÿI…!™‘DíF¿:Ôj(ˆlr q\2c¨E{ëFüï÷”ôík~þR4}c|‹ cî{Í–úê4¯êTDºoù¹w+"÷eSª%™aFÄ[²,BWñ| +9ç÷ Î2µÜKîռﯔ©EÎzV]áxÀcÇ0,žu(s}ŹqíéöÜêÏÛÙâ¾2f$bɘ!Í¥„ë¶ë×ù‚ïû’qIɧÞiH¤G/) y)Q2=d÷xž¤ˆ>QPðvòšd¬wÅÈæ9+›VUÅ>Q’ÂQå^‘-CÕ‰U2W’•û^2…ÐjÊÎÂÔÑ ‡zLñ}Ǚű®k¯ê՟äÂá x€ñ²ÎtMáp®+šæQH½îçAýÿŸf‚8wÔ2qœs J×vVAU¨§~ëœì;yÉï2µÌs¨'ñ,âø2‘)[*Æ‚œ4x\ëÞaZC‰|{ð F%Oóa¹Wv‚B[øÿm Þ/ô×ÑÑQE±rŸDáÃm„c¾"[¸_ò}ô+:ÖbÔ@  ƒoiicƒF±ìû9ïû¸¥½úå¥ö’X¡ƒÍ¼-[ÄÎÉøñDúnÉ÷ÿc}S…ŸPÐfÞQ.ósTÁEG¾)G)hM’Dú‹k0§ýkWȯ"OJÑäªB¦RŠÈ‘ÇI…ñô’o3£ ±¬ûù/(¢°HP7ˆÌS H“%¢ÔTàà¡èDfEQ/Bq#÷4 ØÂ`®ûûPn+HaÍø8®(8ôg…·Y#èg•Ãn@A_ª)º±¢4t§8.-èÐ~ÐEï÷çŸLYI…®MŠlE©ë ºF¯Íw 8y eH{¹Ùc~|2X¯+ŒÅ›¾¯ó~¬ºï÷º_ÛvEs((7(Muɲ=õâ¼ëþ™³’þ‡¢YÛ1¿—sþ7Ѳ…sEm2<œÙ5œ×#Š Ž6ÏÏ72¨Ô­+zJPƒAÊ#2Åô™àùáûÔW<Ó‹ ÙÐ]?Þ¤_k1æ(Ž’^%…³ÀšÀ<€Œ(MÓ:ü˜È u‘:õ675g h¨¸áTÁýïPôj9SœSÙãâŽ¢áØ¶?|WÖýwÄ®*2qd¯pг ñ<#3‰‡ÂA§ Œ)Šw)0•¢ÁÓ1Å"MÄpAVôÇ¢pK¶°B!ÒY“-È(^÷}ÕFÙfEatp|:žÂ†×~]{ëLÊ~(DPBÚe†]©0¾®*ºnž‘óIï)("Œ 5¢Á•¤ßSDyW}¢Ò”¨¦èú t>™8·oø¦ÑCŒ %ßÇiÿS2Cáÿ”I]¢ >®àæ¾¢0„®ËŒ cŒ8Í5?>\oio ÈYµãª JNP{È­ûs²£è8\É )ŠS¯ú¶¯øyü¾ŒþCAã¬"s5 ¥T‚ÈœWãP®J§Þýœß«Ï*$Z)àÜöóBÙ…Ì šý4‡jQòðûë²Âáa] lÊ·{ÍïCß·~…ÓÖë¿ãDßT¬Ï(×QËÑQlƒ! æ” ãÉŠAçÁá&[׫(žõçŒkqÔ¯Í1ÿ›"} Û÷ýskŠÞd0È"Ñ‹bÏ…Spr@ÚÚºº¥Öv©£Cº}3jcJZó΄B^sCÑ#:Ù8²4Ÿñï|‘ÛÄ‘ØOá›÷Ͼ&sœ;üd¤pby¾éÛ’9å<¡-úßÔ0,×¼_‘ÝÛñû‡(šÇµ*úMPؾî÷~+\{¨k« C¾òk÷‚?)šßñ}âDó= 3ËóDíWYp˜Ö¾Dâq €Ä=±Ÿ tkJ'¥ˆ2²IC&ÉŒ6)º‚¢B±Ò@ ƒdJÒ÷+Šr÷O.ûOÒùtý„.ƒ‘GeÚºå†ïƒVº“ÖÑòeY!éYYÑ1‹ë€ïÿ¶‚FXpÙé&ŒÜ"úàà ‹)t(ø¹èÐI$b5¬3’~ÀwCá}O5¯ËŒ” ZÑ"jGÃ$(OË ®z‹LáÕ )¢–Ý JÐDñ<ÜVd'V‹û„z Ò”d“¨ûÀéc|ðÌ¡bÍû½äclWDâ1àÛE«H¤ÎËŒ º‚vRSл £ˆûÁþ¡Ù¼ícjø3\ù{<“D…1È)ð¼£h>…ñÈ÷ç¸òÏ|ÁÏoTFÕù¶¢öá«’~Ðïa{«4»c†4t£~EÑôiß'Eî—ýÙ=áÿ“‚6î-E/‡™“Å}‚‚Gí]—©caüeFßO)T©à»j/½iUáˆ%îW¨2÷IóËÒø¨Ô;(õ™ÑîkÒö5©­_Z¸!­,Iç¤¤Í ij.Î!xýtËÅh¥oMÏ ¦Ãû ­}:C‰¢€gGwÄï/Ï Ô¥3~ì‹þý¬Ë lê6¤¨‡@…ˆF€ˆ@ ¬udi„ÇÚ²©¨aNAA‹š‘óŠþ/)hJ8$ ?jNô̘óëÒPHD÷ù¶7…÷H–Æþ‰çYœØ ý’÷/Gà …¢J6ù³xÁM‡[ûšÂHB٣៯d†ô²¬@sAúœ¢’¨1Ä; ƒ£GyEÞú|aƱ$[ .* GQÀ†B&tEF‘"íOc"¬D¸¡S4‹<ˆ/É"`8 íÍHЀŠF[} ƒ~Caäò9¢ÂcÃÇòª,’ú-£E~WfàÐ@(Å ~®ßQ4_ª"Šš©™PÐ60LéfZWÐi ì I„±×¯É1o\¦´3¯à¶Sô:¬~ÄÁ\ð±+ä )böçá˜B–´®0( ël*š©uú1OÉ â>¿æß“_8‹HœR8‰C@A •&ꨨû±xö¹fb÷)ê5È‚Í+z“ô#Š(÷Iß7Æä€Œ¦Sók¿äφ MÈè¦{Þϛډ]¦eþâ¹(ÃÓ gÚu0cþŒ!3J?€~…üî1¿†M¥pˆßPdxxæÆ|Œm¾¯qû9I/¿* ‘ξ(õ H#Ǥ± ieQj]“Þú=éý?”Ž¿ ílKíæ ÔǤž.éÚ¬Í ¯øu‡ârµ¸v ?ö1EA,‘ÿEC¾/*z} Hp]QtQÁ³¯+¢þæç:U\'¾Ïûk‰ç é$ö vÀïµûüï“SíS$×§àœvÊúS²…Þ*]N)ÞEúí²ÿÿ¨‚Òó¾,â¯.=ÑùA…ñ„l*­ø½{ÓŸ†o÷Ž‚&EBM{ íçÍÂ.ù±·üÿ4£^㺗š${;ýYí.ž7(b•¢c0ׇybEf˜¾ícB2u]ápA»îc9Ö.½ö%iü¼´³!M^5ã¾Ö"ÍÞ–G¤Ñ éÈ Rß 4}UÚX—îÜzû¥ÙI;ÇUY$)W¾[¥¢Ê:"fýž"LOêr ª ó™Q›²y¦GA{Ú.ÎmAQ¨ µlÊÅ÷Éá¡}÷Ï@Ѭ÷Êæ¬—ý ¨C’ YQ2ºë Ŭâv(jº¨¡jÈæWž³†"PM”g‡{MÆOúp0,‘x^@âCØõ/ßû¤ÇqPÔŸ Î,Q($ Ñ–§žýºöm–Ò€= ʼn› c§® J íçŠHOñ‚'/ÿ½W±H‘m+Ƹ¢ 'Q4墻붂&Õ¡]…BAáº)ò “ݧ(ìëU¨y ÌQ“-ô¨À ÛI3œ)ÿ[PppkŠ"ah;©8Më2Ã^Ú¢YNádCÑ ‰ˆE~d0ìnË Í›2Z@]¡î±)‹Êå»äû%:I±&ׄ‹aŤÓïÕUE]ÙrÕ¯ ' nåŽcF!E:ìیˌä:‰üCzIQØIÆÎ4zï(L])öj<ïË £ZÍ©Î)$*ÉDA›bÜDCqpÛeÆ}{ñœà\vËœ‘š¢ñ‰âúaTó}h(xí2GqY¡œÔêû>¯àÜó=êðûüŠ‚’†“Hó9²7HP.*¨dÊJÍûJQ´!:ì×dÄ¿/<³dkËÒè ´¶d¯#'- ÐÒbÿõUi`Hš»% ¾1¨ÕëÚÙ–6×Íø¿¼ÆêEv‡ÈþÉâ»Ê÷bALXò1ØÀ8§.´8š´¡F5¦p|ˆ†Ãçߨ‚b ßžÂê“þþzñáû=£p6(:_R4+\.žåÏù³>¯(¦Xáê/v…øPÕ¨¯YPdõêþl#ñ9§p ¸¾g½)ZýF ö:‰c$Ï2²®%qOÜK¨Ä“zxîulô¸1¤)þDïÔ߯Ë"ÉpêKÕ(Þ(üô("øôƒŠèåEY¢Æ›2#Ž(;‘kœ è"È“ö˸^™¡tI¡[ý‚¢;p·BÁ£U¦¢± 0‰úAB%ºD¿ÌXzIÒ‹5éBe‹)J?¨‰eD! îð®Ì¨DÙcBÑÀ«òkÆy½¥{2õlÃï¼^ŠZ1ú*$Bü¢¿ßðÏœS4»ºìÇ9¡¨[ ¯·Rv*º·(¢ÈD)ÇY‹2ç…qÓU´îÇþ@æ`  ?/‹ŽbbìQÐ~h2Õ(^4ô€ »ðšÿºÂÉ€ƒ½E~Œ~ÝI ž…¼çMßnɃÁ,…ê™sTÖg,(hQC2‡ÍýE¿ ?”‹ÿ?{ÿù[W–mù‚?R")‘¢x(CÊ›0‘y3¯«[U¯n™¼¼þÐh ?ößÙ@7ÐhÔ«º6ë¦+ï(Q<D‘bX󇱨.ïMŠØ èÎÙfíµÏsÎ1Æ\¡‰Q¥{© XÝ Àù" Äìññ߯cV|¬=' YI8WÛyRûبuõ. î§êo${Àÿ»Î×`à"Í hÄašÌˆ8:ém¿SûÕ>üì™:Ò2þüÛº^kptnÿ^ìÀæ>~ÞŽq޼Z]úIýüoþþñï[5bðü­jý4ðºIDú~îÑ*(ZäJ«:JܤÆuîçêÜïÖ÷g„ÒcÓºKÝÚûœvOjûk"ú¾E¬Œ¯‘Ÿ:ÕlÏñÚÞû¤áÙcbE¬Wÿ6©ÎÐt'ê‰Þ"Õ>)Bö‘γSÇt@:c?&NM&¦ˆ[Õ¯ÎgÇà4ŒïÚ€a|íøªJÀjñ¸_øfÈÌ’™1—‡zö`{B‚Ìôh/¸D{Ü M¶¶h€c“ö;G£<Жrû§ÏÜã‘z`™^>ª"4Eäš=BãÏÿ9)ë \õ<÷Ád¶î4ï—iö¿¯sø‹úÛ pêÜßoÿÿâªr‰ÙÓµýY""rà¥dHí†u½¶wŸˆe âÌ(_¡@ºÕ¬ÖßOw¿¼Y‰t¶f%f‘X7Ú‡b­Î_ Q{u —HEí4 ºÇõ÷ûõÚ¿&ÙöOI• Bùy@€¸{uŠEäs¤á–üö ZEa¾®ýà¿Ô5ÿµ^ã=gˆ5¯°‰a€ ÷¤¢œŸ…—/áølŒÛ±lÛÀë ¦w‰>eðùÕ“Øàk™ˆ–­Hl×u>ÛmËLÿ* ¤Í¬x¿¨5£E¦÷ÁÔÑZ›ûuL»ÄÊó>ðÓZïÎ"`u0ÒëC41Óµ~Þ¢Ué¦kŸR¯tMÛ% )fÞšÌ×k/ÔõµoʘÇ¥ö=¥}®)òV»°UçûK"ž·q ÁçW=ó@5Œ7i  aüVC þ‡þ›è¾fR¥Y8N{X\®‘Œ²|szRSäŠ[–ðhÈwïKÅZ Z ÐYˆÚ×]•‚£cT«Oë5Oiµ³„ïý€V&„îÒ„ ääçÊ?ÙÏÚA{ðž Á“4Ð#}¹;)Ò€|È ˆÍpo*‘?¾\êžWÿ¬Îé}Zp²M2ÓÒ.¨vŒwëZ©%0Sìõx—d ݧ 3ý'H r¼®Õm`¸D@žŽMB5X&€R= rnÔëÇ5·RÐ6 ïüë2søßi@ㄟ––V6CJröß­¹‘f»æÌž -ŠÁª™ô ´ ÑÄíI:—Mä®wkà æK½ÃfÓ.‡}ö§k­ýE­7-NÏÖÏOêx ˜Û„ëä2 2´§T[1GÉÒIZá÷lío\_S5gêkþ–ðëÿŽÔüЏdýïunI s‘zØoÒ(QÒsù×ðø¬?Mª’Ç{’pùíë±N(^š\!¢lnÙ;@KO{HH×1‹~˜œ }ª¢œç¤ãõˆøòÏ€­7 x«æa£Ö’Õˆk˜ÕSÁôóz­«R¤É]©÷@+B>Nš«=­}LÔ:Ñ”@kâ^<ý”Ã4(¯§ÎoZ!A™6¿š cßµ1Ãx#†OüÖ C?'ˆ®*zÙŸ$œ÷q½ç:Í*ó$ía¼C+¡OÑ€Æé:_ÿqžY¸Û¤bðkfëuïÔ¾Ñìr„çÔ{wˆXW§Ÿ—LÚJ' é=;$óíƒr†tf†hNγ#H.{ÏWD`}ƒ˜ß!Ù9}âkõÝ>ÌÔ-ÔõxRÛüœ&J}Ax _@Èl À±y] Ãtˆq œ¯õr±ÖÇåº.¿!J_&I:žØ¼HMÃoHO‚Û¤Ûª"g»œÞþŸõÿYÂÿþ”X9ëû¤Ú#@vM›eU8’4V²á€ÉÊÊ…Z»=uÌ Cþõ˜¸hÙWÀêÀRÍ™ô#×þ÷I%쓚çÒÍÙ€sLªTGˆØwšèiÌâo×ýs³ŽÛ¬òLmKÝ ùöˆë×$ >n‘ ðE—ZuRž¼×~I»'u§š!Yl³üj0Ž’€ö8 ¸ë÷?O,ß·D4ˆK¤BfRâUýÿYÏ5Ò lµÖì2-£¿F–¹ÚöwŸ"Ô¯ÇuήÿÅ:¿ ÆÏg+ƒ:šyÔjA湦 ­n)`~§þw•4t ¥Þ©[Ø®s6Ñá}l‚@ºÏfß-RUó3oÐ ã»4†`ßÚÑ‹‘ýYïó¾aÎT÷º=Ú‡½¼áWÄ=EÕûšÏÑ>ôÇäÁéCÉÆBúÜ›¾C|ë{ÇEªÚõA8êfå-Ù ˜´+TH:M{ˆšyܨ×ýºöyšöð|diûÆ76üyLÊýf£Ã4@z²þ?C\@t×ÚàG`ÁŒ®f„ fÌÜMÖqΓŒñY!¾ê: ê|€o‘†jHC#y gº}¾Á„_^_- ;š…Áaª”’Ok¾ÎðúkZVö,-{8&= Nu›¸jÛ‹¤:"Ç~ƒ€µRùx·þ¦ ûaÍí.Îec° ZøÑ2˜–"uŸP,&i@¬çdÛtl³¶»Þ÷a¿=®KéÒuì™0E‹\K 6L›ï®\tiXÇH“¶“ÄUJ€©ðRÀ÷â÷¿HhãÚö…:žõ¾· ˜îõ@TG¥1ÉB{Þ/ë¾¹^¯[ªã÷z¾Uß·j½8úÊ£ÂüéÚΧµï%Ým¶®ïÏk_ÚÏzjƒü\3p¿6³â`°#ÝÇÏ«3#Ò ú2 ȮձÌ×õû”˜xŸý¨ö¹Jú‹<éÖ´Ž?‰Æç-ø´‚µÓ­í1qRÞ‹µMƒ"+JÔº>Múqœ&zªÛ„F¥-ëE"ˆ¾O(’ÿ–XÔþº›/;5KkW¥Í:ÿO8¬»1P0Ù2Œa|ÆPÆ3z€6€fåõž¢ø]ÚÃE:¶ofXòÙ!¹È> éÞ÷Šö Ò?^× ©/vµ;¥M_JÐ)âàr”ˆA­jœ§ñ³ÏÐÏKâH£oÿ `½E\n 3¯êõö+xN8±Ú™NѲð}_Îþ<ɮвÁ[$[j¦X@б1½ŽI5Otj.ìSpصn{Q½ß Øì# àÖŽR‡(›®YåÑ‚€eVtà9G\¥&ëk›t÷U4ù´æ÷êvlý˜X9Ú_Aò§„ó-µåH½O÷ÏÅ>Šn=¦µÚæ[õ%=ã¡qœ&@\.¿Üž IùgÄAå%¡@ŒˆÈÚÊÁ1Bs´ªI8I2ªVcöºã¿Kpk4 õœÐÇ <×ÕZËu}­Æ¨ç°®kHP­ÎCŠ•UiGêp´œ}›ØC.Õ¶ghe…ÿVÍ–?mŸV '‰Fb‹vo¿ª{ÇÏ Ï]ªÕ$±¾Tƒò²»w}ëÄ@ÛŠáiâHt¬Þw¥®Ù…:–¿¯µ+H¾J\€ìÑk¬Î,!ûYâ&ôkÚç†÷ÆŸ“&ˆ·ëË„ÃTƒ•×–È“Ï-iRxî’ʇ÷”Ÿ3Îù" nçêõçH ý´¶ýé .eL1³–¯~Ö÷6ůº¯a ã»2†`oÔ˜xí{Ï3?F>ÀЀÖ]ÂÉ·ä)H¹ÝýÍÌ´@a‡<Íö Žä0pñx¤Èw…p°Þ­Ó¸èŠp¯°§õ¨€Jgm ÿ ÆîÒ2ÍR)<–mÚÃï|wn„J°BÀ¨t¦„št›ö ß Ù ¾[Çûœd‰ûÒ¸T!éò|/Ѳ|!ŠìF´qŽÙJÉ^«—ÝJ¥ íuÛù qºyDZ+õ»`…|ÿXçüïI×TÝA´­4+(÷÷Híß×õ”œÍúÛû$“¾Sçð ˆ<®ïIõ$:,!Ywµ)WknÆÄëÿG´îήEi /ÿs¤Ë²ï;Jèb'k½õëBw)ƒ¶U’•ýQýOñ¯ô¶Ku­Íœ_#EöÒ\®Ô9ê²c°!Uk™.ð?"¬Ý~í$;KÁ„jcj¿Ú?"݃Íä LëûúÇntçq‚³R€ë¤uµ¶y¹æÎ`ހ˵á½z­Ö™ÜúUâP¥Ø}‚ ðûý Yõ”¦%•Ç„Àdýÿ, 2~P¿ï‘àØ ïéù°L ìG𫚫·º{ÑþOj¿Fú1H±Š§~ȀˀÅÎÀ3Ý{´à<Ù«Ö²ð‹„&H[Tm@íÓ¡ÎKËfãÜ®®Ojo^ÔïV'üLï“QÃÆ›:†`oÔð¡èwh¹æ:7ØR ‹n0}fÜ–|ßi’)ê{ H—8Bøéfõu¼Y#€Ý¼>K8®3¤)Øç´ÌÔ]ÒtiL„Šf¾.“ìŸÖëµ l=$VÚ~Fìwê\`ñg´çC )5ƒ¦ðV°!EjDhT/Ð9K:oÑ£Ôš“¤sìãn¾œwqÌÛ(h¯®Ý§Dó ËŽîK[¤Êòˆdൾ4[¨#‰âFÃqZ–S¢gû˜Ñ4€¼õ`v¢~ÿ€²®ÕkìYqX~F¸ðgê:¬Ö>& ¿~Fœ¦ "iAðˆøÇ_¯¿ šåÕk+LwÏiÙY…îˆèÚ@p–P¼ÌOÕ¾ì{!pºNsz·¶ÙÚO»µ±F*>Z¬X¾Uûü„±Oºí(<%U²¾ñÜd]+ ¦­¬IÀ×ëˆtï±GÄÑ8œ%<¡;5wÚ´ºNöºã³¡Û¡Æ"€Zª6•ö,Ðëß`T+Lo“Ï”UrODü¡Å­tûŸ Y¢ÚŸÃ{þáå[!3±²[×ÀŽØgkíZ¥»_Ç7Y×~D>‹¤îy-. ¢Áx/ž©û£@·jê7ÔzHU´’ø!©ŽA>ƒß#Ï uOk™ä°ùàU† `oê€a¼1Cào&ÙÌ¿‡ÚCªçsko(‡T—“žogT^Û|Ia¯žö‚÷e‚1áéšß"~óK4Ð~…¸Úü¢^'õâ°³ÓÉê™I“ÇÜ»á(LuÿŠ„'ëÏ“n§{u WëËÞŠBõ,¿HÄ–÷ëØÌ2+d4Sfó6ƒ1êøÍ J瘠eí¨zœVmÐU©AÁ9ÒéØë!Õ@PjÃ&ÁçyœPçñ»þšh7ê8Ƶ_וT–ÉÚž³i6’ŸÔöß®ãÐnÕ.­Z ½C¬PŸÑ€Ò˜4ü2û¯>c›ˆ¥–lǸԘ—ݽ"5C fp¢þb§{ÿŸÖ}``)UÆÀÚkºV×Ï.Û˜®ÛZ7R4&jMöîSŠ:mFö’ôXðÞàk€gß„5 Ü­ïöàè{¼$4)+ÝúyÙý,íAmóïjµÒ”†¤ÃÎbúèŸ%wž‘¤ƒké,¡¿Œ €_¬ù¾_óh‘½ÚΈtñ630Õº´á–÷{ÄrV}€®` ¢Ož$ÒŠÖkM«q°k÷¡â9w÷»µæö§»ùÒåçç6?4XP§¤¾Çä€þýVi,OÖœÜ!Ÿá&j6»s´Ê¶LF+¥® uMt×Çõf°ßýüúè5C00Œ7i À0Þ˜!0„ÃA€÷ÚŬ¬â8ÁŒÀY"V9ïý[ÄS ÑqýݪÐe௰|ŽÄ'A’ÂßÙZ+'hŸ+öó°·‚î9‚ÊT¥U~¬ Hý›$ºˆÈ^ªÌòù°Iª˜ŸÑ@¯tÅÛ«5D¼¤~—äçß&鮽J«°j.îÖ—•¨qÍýyÒìM šM»^Ç*)=®}üR·b S ¾l ´ a¼IcpÆ1zî¿`³òvÝÔ;¶{½"¼"f½F{pèa~™XxnÓf'h HOðK´‡Å˜öлD2¾×H ¢Ð`Ap`vë(iJô¬;Î[$hϨðS`µ[ÿ÷áOmK{Ó_Õß®Òøí>Ô!Ô'³a6s:I„­½g·~Û}æâða¶X ÿªÎÇ÷h )`þ»š§Ÿÿ‰&H|¯Ž}»¶¹SÇ%uå »f³µ½¡É­~N2éÿ¾Þw†˜_v_Ó4`{¡Îñ! Ô\$ RºOOaê)B6F’f&mÀëy–FñY§}E„›¤_‚óéð‚8R Õ“ÔkÎÔ¼üqDêµëÄÜAjŸ¡K„ž9O@J×ôÞyBûlPô­8ý‹“Ÿ“0ªa¼9c¨ ã¯û„ªc†KNO•X tˆ¸Ž˜1‹uŠFç“`à Èlp˜BàûG$£ú€–-H{@'ìg„×.§Yn¿®2 ×l@æÃJ-Öýâ×n)|’hªR…´}B dnÕvoÐnó/;  Hz`¬U÷™9ÚCYñrmsŸÎ×i€hXix†HFEp3éu>Aº°Þ% ”Õaèx£%åJ·®+Ñ¡eDõ–ƒ«Ý1mÍŠÔîØ¬tíÔ9]ì¶±Óí{½¾Sss£ŽÛªŠó8]ó£ s¡®ùÛ¶Û¤®ÿ{µNl|õª^{Ž–Q¿__ºò,Ö:>EªxÞ“GH`¡‡¿–RDNw¬‘ŠÜ|íC°é¹Kùú+õÄûAѯiS¾×k¢vÆk«ÍëMÒøìx½n‹4°ºH*3}À¤ ®•·H r‘¸$í¯}¨ôGÏKªÖN­3ûZ,’Þ›u ¯Ö|_#º“Gˆž@J˜¥A#n×üëRf/ û«ô•Æ5×ë¼—‰û’•qÿˆ$¤iž¯ûK*æR‘²©ðùÙhÕHš•9âÞ¦ÆÉëÛ[YvÈúãMC0ŒoýxÝùGÚ Xðw†–±“va·IA¼ÁwëïŸPfV}ŠöÀ‘Ó~šdwi»½…Õ=ìß&BÔýn{‰8U°{¦ŽÁ‡—àM›Å"„ýKÚÃìim_ñßíüu\ºŽXN?UïQà¦ùñîÿzÿÛ@~ó>)ñ+pVs õj©ÎýsØþ’X¦.×6.×ù|@@„‚ÃOiú‡W„®0I²øò–ûÿé/~¾æò\½v…{Ï ?Âi^þ¤®ƒ@a{>[¨Ø*€ÝWÏÑ‚Âkõ7]{öˆÕz]›@yI¨=#”ƒ½Z“Ò‚~Zç8&ÀT÷i^rÏåy»›#Y]™¨5q—PH 짯ֵ8O²¡)ùøZjãiø¬æåÝúÿãî¸ÏÕ|\U…ƒZ+„Â$Ål…¢=Ç;µOuKÀÿ‰T`äý÷ôƒݧ.‡¾6‰ûÌ<íþ6hû‡Z“ž£Ço5FQïÍzïŸ{PÝ}¤=¥¹7HÀt¬Îg¶ûÝûò8Ï+¾•s²^oSÕQõKo×6ÔÞ,v×ü×u·»mÌÐ2ö3DçcV^ëRMÈ÷kn®Ó*:çI ­[µª“ Ý~ÇêuóD/dìùY²âä¶m:x½Ö‡k[­”A›Ö1ÚgꈟÒÖî“f&\tƒˆ€¿¬0Œa¼ic†ñ­¯gÿý®£‡Í¢.nÏŸ5s­ë$á†êø#wÚ‡•v½¨U‘®þÔGVÞö>íš=š'@`TÇ£`§þv…žÍ²™MïDЬ>ü#Êk5cûiâs@-‰=¥ ô‡¤" øsD²}¼EÂC×ÓÝþ Ÿ¥`hÅ'NÉ>ô}Ý9šŽANþ?Õûî*‚ÙS»2S×ËÊ€íúÛˆè%vê<> U7kþŽt]Þ®s9]Û[£U'~VÇnó¢mb!¨[or»<[yR¯Ù®¹yFD»vÁÝ&‚ì“$XГ}›]»3Ý5•†3¦Jf´§\ìæéñìW8ªh·×É¥'éHÒXtŽ1ËnWÙǵ¦Ìæþ¬Žÿ>Û æçIˆOhÔ¯…ÚþUZ寛eÕ ôhmûA½Om…ú‹ ¡­t ¥s<«ó²s푺v óÕ"øÙb{Ÿo{GìÀëgÅ6íWhô»‹Ý»µè4ȺJ®Ûu|V[6ºs‘wŸFí²j0Oìé&NÐù:þ„28"°+õ?'Í~ê÷ë$h–þfeÍ@y³Žã}BEô<ï×ßþC½W]€ûê]€l¾w„|féPfåã Û#á>±W¶3²ú+»dO*‹¯‡‚äëºëøcçåî}Þ¼ àoê€a|kÆ7P Ä!.AŒVž:?ÌÓT6[¼¬Žð~·-);ÿà3<¤˜—4 ¸BÕˆ8¡˜%7Kj&^Ðr–Ø÷iÙ·íúY9êÎG¤‚ß1±çÛ¥='h°M¼C,ŸçâÒ!ˆÔ!ç9?^ @E:€¢iý¶·çxƒBfÀ ¸œÃ<ü ÎŬŸAÙ&ÑPhaè5÷:iÃ'Ç\Ë^?½ûçi Ý¬¿¯Õ)åÉk×A{W5 º*ÍÖ¼*½GËRï»LµÚŽ.ÖûÎÒ€‡ö­º3Yy1k«—ý…:G³­ö¨:c…d¶Þ/\»ÎgÄ^Qdzºº«Hr¾œ3+GXrà ZÌŽë| 3Sn`|ô•PSq„¸þlÕ:ž¬uc¦ßy¿ß­ÇI$)üÜ%:íe¥zI4àSŸcC4›B¹Î¬˜èL$MĹ\ {¯Åûõ»Yc·o`+–Sþ˜4©ÓMë<åš9÷ž½A£ÎmwÛ9V×ín½ç\­ùù:ÖIï‡WµFí3 ½ªB_«˜záO‘`î8±Ï=N X¬jÚ³CÝÕéî¾"9×ÝwÕþÔšìÕq«mÿ©ð)J·GÆÕ:…¹ë?9«{¹/ý ¾$Ÿ™‹Äu…T. >ÇÝœë’5Ws¶Uó¸Uëä ûÆ0Þä1ÃøÖŒ‰oð?5ÌÊÈ>ÅáfC#ÒLPw’ö`˜ =\ˆ3‡¢ËW4 :Gz˜¼~H{@]' ÊLýs$yrþ¥!è…>ü˜V’W´¬íã6ÉRš¶™ÓˆˆKAË®Rß Q ®°®2–¾ÍØyœMvÆ´1]€Í0 ¡·“õ7E¶Ë´G™gÄÖoTûy‹„Ì¢Û4jLxÿ€Y•ázmOG+9—êÚýdD­Dèý®3Ê^}""i׉ÂZù¾$ <^×M`¡SÓ1<˜ÍÖO\Ç»«zM͆^&t©e˜´÷ûݼ¯ëòµ³ãIÕëx]›Q½Gq´« µž­`˜Ùöþ9Þ͵Mwcu­/֜ݩëöøæ ºm®t©Žõ |ôk7°xÈáÃR¬t»ÕkVêgèŸ%zh9éE§Hwé ¤B¥pz±æA°U+…j2 "ú`X^þçu\Iû˜Ú ­äRG¤˜Zפ5"ÖÕÂõ)¡½¹Nú^k¤:u‚|ěĠ›Û¾’a¢@ÛX«‹RNÓ?/_÷àê$¶É{¤µ =7‚€a¼Éc†ñ­_Wè¿l.ãƒåqܱy’<Ý1íC~Dè(fŠ¥¬›<»ÓÚdÈÞ û^Œ¥xEmf™ú@³´o3«§´²øÏêg]¦Iv[øQâ¿H\zÏ|+‹õÞËä{‰øÿ4ÉͶâa¦Ì߯¥eöà?El¿©n?ˆEŸÇ+Ÿúâœ"¨¿EЪ)/h b‘tGÖzï­óˆtó´ÙÑÉÔ¯Þ³ôËõSµ_Ïçpu.´s;Sû´9“×ï?ê?Α®©ÐDÒ³Ìö~Zçj¶_nøDß§5ÿÇhÂb+ ¯ŸS×ÃugfRà嵸OhKKt èO?sE‘½ŽTÒéÔ›èO/Õk·;f«%×H6}Ø×z-¾浺E2æÒ¥Ž€Bxu0÷H—cÕ®Ÿ_ê‡âäRÍ貤ólu÷ƒ@Ù!À÷sç]BÕÒñçy·])FÔvz:ÓçÄ…ç?Õ{×yÉé›ÐKìã Xp®AêÐuâù„PdÔp<ã°žä4Ñj=ìöoÞŸ®Ï·:ˆ1iJ¸S?j{Ho µtç¿[ûÑaš|P¯µwˆF§ˆð׆s¯8ÜT Ð0Þü1ÃøÖŒo(›ê¾ôF?A R568,ˆ”ôœÐ|Ì.ZŸãpÙZ;@›sýˆ|õΓ½^û:è˜u#’a> Öo×ÿ¯‘[6{Iî€Ùƒ&ˆ‹Ì`t—:E2Ò¥öˆ_»™è•:_« ' XPè.¢È[~ü3 ÑgL(hZBè;Òäz Þf %íZwϼêæLá©n?^o}ê?%Yl§ÙêËÝy=¯mÉ1—ú% Cº‰Î=¤ ÞC"ÄŸ¥ÑS¤gÉy—>&t+qáŠm¥wH™­cÑÃ\ûµC²”’3$=Ù·Á€A”÷ç,­º±\só€¸')ê5è>Bó©±Âp¿ÖTµ=Úç‹êG´Ào|fI«²Ñ¡Ÿ¯Hµn–ˆèõ¼T«±ïÈísᇓYE3p¶‘ß«º.NÁü«ôZÐŽ÷$I:(F¶æ½jg¢FËR©˜~æÙß@ ÄÑA(F~÷UâM0šÐPhß7‘›î¶i5bƒ…¥… Àß•1ÃøVŒ¯+¥úÁîUÿv¹Ì‹D˜fÞ÷RÎÑŸÆ ”\á0íDžéKÂí½Ñý®Û w–øŽÏs˜&#ÅB[ºõ:>ÝLÓˆ<3|sõ?)3Úoê1K¬ë¦µd†t×øÙ,I»ÐÅçët°éýþµY…dÕ ܬR°õß×õHQ°Ùñº.V_ >¦ºó2lÀ!mG.ö¸¶÷iäæ¹\«}Æ­r,‹F×Ôc×WPf†t©æìx·oíÏPñ€è3¤XÁ8ʹ䪙XâpY{3˜ýP?$ô±©òüVúó ö¤6ì´ÓmW ‹T5« 6n}é‚rõZoº.Ôטý>Jš(QÛù”Ã=-±/ÒøSD¼*ÿ†8Xé<%GýE÷w-6ͺK¥¨ŽˆîÁ cŸ4™Ó^J™•«Zãnž¯¯Ùn=°¬oé^fè¯À?U¿ÛD*Õ˜ŠÓ7^;vµg `Whü”8=Yy3è7Ó¯í©Ÿ›Ý1I‡š¦ÞËDc°4Ûûm®Âºß{ÊÛ<ùl~^×÷. Ô¤õMÛìéòˆôîP»£8]Âúõzâv9ÖýÉ Y°·j­BœÞž×<ªoÑRÁ(@Ãx“ÇÑý&†1Œýø¦Y•ÞÁ_3¶=§Xà(ðô!´B{h.Ò@ŽN Êùns„‚p‚ˆ+ÿ”x‹›÷Á&èPÜ·@h Š?!¾øö ’Í•‹êqßé¶i–öAwÞo ÄÖòÉz?¡=è/ÖñÜ Í|öhI­G·iAÑ< œ<%Y{]—|{žrfíþúÐ6ÌÐ Äut±I›Ž1ïjŒßghYP9#멉찻JÊýGj.ˆá©ˆ˜å~‡FIÜ?ã0þdýíç¤;­`Õµg7Ø£´ þ+’÷,eh‚Ðlb4"ªŠ"íaPyPç"uÄ`Jǧi+µÅ" pë4&4 5±¹úŽW¶Xž®s»_ó( 2Ëß[í~JÐ6eëi| 7oÔüJAQÜù9¡°½ Ùx³´ÎÓ˜ØÜšA^ëþ¦HàgÀë=z–ÐŒ¼´×œ®käýúœV)Qóq—¸ ÈïÕ{¥Û—­ ÔvÔ¨Ü$ÍÑÌèß#.CºV5 ¨¥Mõ ¨ ãMC0Œoí0{ïè¹—–°À«§›dC_ÕßÓ#R^^$Ý3ïÖëõ\÷aôáçÏ’à@¿¯•‚$˜¸h!gVÛì•eð1MZÑxNEo‚yyÀÓ4G˜W4*°]Âó=G{8ëêaÙÿ­”É H,Õ¹ž à 8|LÀ¦4§¾ÚSò \¡LIvZÁç €\$î/>”× Ø“w?E@|æcD¿ §¸¿ó (¸”süÓ:ÉC˜8J€ó"ñÏß&ö˜6áZª5w…ðíOž€—Ïag¯ñÑFDß³õzÏ÷ Îk®ö¯HSOô¤“¯4û اÂ@q–dê­îhëœ×‰ÐøbûãÚÿ»´lð PNu¯ª–ØÇD?#…éi­©¤‚¥@}¡;'¼ê÷ùzÝG„£=Û‹£i"vVœyª[sZËz?«¹Rã±H §‰ÀS^ùCâf°2ÑmSjEÀŠÏJ})*5P•o³*ˆ]¨ÙyéjÏHÇ^©ŠãºLLæcê!ìƒrŠT˜æê¼|ÝVmÇÞ š#ü‚P§‰!À)ÚçÇyÒCa‡FËûŒdñŸÑhK¿föáü¼8hëÊ—ëQŠ„Ò4&4ÄcÝ9ªË¤Op˜>8O.öŸáÞ‡½p\º‘úœ—$9ð#’œ8^ëÂjŠÕ5+Ë^—a ã»0 Ð0¾u£/­¾^fU@&õ§×˜E•'}ž<\O’¬«b²=P–C{P#^Ò*f çi櫤i“\ï¾i–Y[Ëøjä&›éÛ¥e¢×Hcž'¤B±GêgEÉlêÿ•Tö9üpºFzÜ#NGI·ÐÂ_¬ã¸@¼Ú¥tØÈ­–¥ˆZî­ óÉÐú^- µºTÜ,¯ö TÊ;þ%¡è.£Ì6¡ælw¯ÑÝåsàÙà0¥B5¹Vû×ÁÄã“æ#H×Çfkwê}7‰3‹Œó5;Ù…O_µÌ¸ëñV«ýì!­Èlp/ê‘JůI E·Ú®>#âÕ B’!ð_¯ó²Álû)пSózÖ¤Í@ðÑhá¸I’Q­b¯)ÝÃ}!ZŠÞÎÒã†)Ÿ‘*Æ)’ þ!^®ùœ¨í_!À]KÒÊ´‘|\óõëZ+VgNvç>&€Ïò, ôJ?Ú¦%Þ&÷s8öîZ'hŸ+Z_$þôj½ÿ¦~×yh{;M4ku¼÷º9²’èÜ¥UoÖy>#Ž>ê÷{´Š×d·ß äž_ë^«˜~³æOÑlßpÐìýg´ÏƒÁû…îgõX~WH`qÐmC®¾ÂäKä3k›ô³°òcåÕù{_?ïgt-épZ§Xáû²NÀÃÆ›8†`ߺñMô3}S´‡²™;ËÏ–¸´´¹ån=ùåðÛÕVž³eë-ÚÃó*í¡³ËcÂË )$f»ô9—·ü˜æz£¹ÜâmòðÖ¥e–ö; M ä£*^{H{€Zê?J{¸ ú¤ØhHWºHFÿ8É<*<8œ!@)‚yÉëDTgÕcD2¢ò¬Ð2Ïû40b­(Ë7C¸M!§I§Ýψpp™ç븞€Ið*oÝðáTK5ÒŠu‹L‘¦E‹4¾àêiýÜ"×i`ÈÞf¿—8l+)ï€ò ÒÀk¹Ž©wŽ€›åW°(µFêÛ[Ö3@8^­uëZrÛ/h éó:†ó¤×À…n)uû®ui,?¡Uf€ÿp¤¹/-‘÷jÍéšu¬ŽÝ̽ÔcµMê~ø¼O‘j€p‰ž÷ëm‘ûµÝêuH'Ú5GÙW5ãnîµ¶BeYûQ)WV¼¿/Öþ®Õ±œ"â`Ý»Çu,§º÷ß!v¨û¤–4ª+¤’ãý¨­ï^Íǯh‰iH÷‰ÖÂ}Z¹š¨k³F40Ò!_uÛ„tÇÖíÌ„ˆ×eªÖ¸5Gºã·¤ÿi8g x–è¬jHÅÚ©9úŒP¤ŽÖ|©™šªs:Q÷CßLO+ØoÚ`â+¾†1ŒoÀa|kÇ}PÊ÷‡G{(ºï'4à+Ðþ œí›Bmu„Ñn"¾PÇsžˆ«×Ë…–ŸVtê=säóE¡þ":6y´XÛÑ@Ç®Ó5ÿÒ™ ¬ºBøj@?ñ ^Ó¿vâµ÷ c¿ï1Ãx#ÆÄk?ëH¢eœÙn›a="€a•<䯮w¡=P>ªŸ§ }£ÿÿc’ñTà(MCºÞý6Ú&öޝ8ìÖqˆåiY­7ÿ= ð^>¶\§ePOp˜êq@wîWË»Çõ>;ƒJUú”DØ+àe÷ÙÚþ š16ÈÑ[Ý, Ù[3é‚;3|Õ¼[r¿Rst‹ˆœG5×ê:ÎtÛ¬¹½B£ ÍÒÞã:O+:{(@ÕõH‡›‡Ä§^ωڮ¢ ÕƒK}ï‘ÎÏ‚”¤ ™^¥/Hi÷š)Ò´±×Ú†æâ×>ChF®Qñéºþ»Rç™é3àu¹Oò9àà 0÷öàîz – (yëâb£3)_·k{gêX–ëšß¨×H§ÓQI®¼÷Ð*iÞ¦öB«ðû,éº|œ¶Wˆï;侟è¾Kü~NºW;_ºeÔz¸Lª2êt¦¡mvÇŽ€n½ñTkuz’TûÆÄF¡³½ËnÃćÕ(©‹‰˜"ø‡¤‚ž£Ù}õó5SºÂ6às;³õ7{ ìÛÏ› |thòsc™4ÙršÐ麶‰˜AU‚­ºv“Ý6ŽÖú°²0_çx¡Îé&ÙVöS4!pß;Aä¢+ù¢&`¿ °þe•‚/ÓÁ}Ñ{'¾Á×0†ñú€a¼1ãu1°MÀ¢ó´¬û]ÒúÝD4vt4[·N{ˆš}íB–ÛåÜϒ̮͙®î®àPzÀǤ˜™NE’´Ì¿.9zÅ ò/ãƒö0ß ü_u^Õ¹ˆøvD:KÉ™ @Õ>;D˜»Jü‹D+`µ@£Æu¸ÍšoÓ@™ù—µA½ö‚'‰3Ìiâ²ÔŸß{¤GƒŽDRÖëç­áTíKñðv]‡hõÉvÊQ仾Ô/hhÆßàÀfBÛÝ—ô¥i¢eÇÓ3„ òŠ_->­}Ÿ arš·ê|hàÕFgÓÝvô»´~T×A·&©[34}ŒzqÝ#¯½ç8°²GöáþKøGZp(WZð8M*c®¿Ó¤÷IæïÔ<¬¥’:NýC½æ izv´þ﹞#7§êZjÝ~D€à,MTk0©®Áæ]vv¦®×d­ uM4èuV¹¬–g¨ÍšS+/u½/Ô>Öþ@|òÕ õ•½:¿EÒ|Äa'ûlè¢ef"c›d³µ<ÕìH—çpÃZ1óg»u¡àqüš¨×ÛKÁ5º^×u‚¸|iÙ«Ç*¨t&ƒœ™n›}ŸµYÎÿ4©ú¡UïÐîs©Q^{éxVHú@Ѫ}Vì²B«XY…{Õ}=£ÿ¯׿ }èË^÷º-éö‡ñMÇ ã~ØéþãÏ–c}(KzNX#ànqØ{ý¡dlÒ΂߻ÄnîŸh½«$®Å娎ÇíÜ'¢@)FgkÛòs×ë½´‡Ü[´Ò%àíISøß&àöáx”쬄˜Ñ4ÐоÑ&`Çh¶µ:Áîûµ+ðúàSxhgÒž=ªc|\su¬þ6OJð+D“±D{àn“&OVrôÙ†PºóZ氆ÆKys4uŒ(¼Ç43OBËYdçIõB0cC³;4 ½ŽÚÁ¹šë%ìu<:C«V, ôXíG~ÿÛ4QñPĺp’øö#™D³k6î‘Þí!aæ_ÿèÿH ~ÎaûËi2¶êý‹N+ÚÍÍÐ6hàà:ñZ·[é%à?ž‡£›‡-O_ÿZ¶Þî¨}é\ g0³×ÿqšÙ¦=¥¦èza#¯-Z@°BJífu62ã|‡dª7iàlXJ?â"eè%ñ"ïAÔù 쑦S#Òdjµþ?Mk»Ý6Ñ8çw h5»+ýÆ®žfq×k\s¤“°î3fû=‡Óu f·¥›¨Ç+lç<( 7¸›¤U ä– ú¥\½"nAS4`£¦ÁÊ‚t5:ß(î6»:YûÑ.RàmPu¿^’ÃÀ[­‹s®–a‘К õïï]oô‹7xÕÎô-ø5Ûœæs´ HÎüg„¦ökZ…Bq­úœ3u ãn=Î0gS´=Bc[âp³·Éº†»µO­U¥º JÕü*àW“a³8ƒˆâÔ¥.`£ï×Ϻq½Ws!•Ž6K@®}%ökŸÜ®¡vˆæGJ )µêf ºÕVIÒØŠâþ%€÷ØÎÚÛÒÖS=Šî_KD›õ”$Z u„2ðÜ#£_ÕZU'¢çV‡•Fï½Ùªñ>ÏÔù_%Ÿ«öç“ʃÚÇ¿Öôë@ú`7:Œß÷€a¼1C ¯°T^¿b¿YÚƒ[:È'¤l.¥F0=&¼VÝ;¦hÔõV/i9í+Í\=# SK:³¾Ò0|€Ú HjÏoˆN` 8R<Ú-ÚmFoØ®} `×uE5ªí –¨÷›)žè^+èSâ¿.ÝàsÒ©B­éA mµÎ$Ùli‡ö`·š¡Nࡨ¼ Uµ1„8ú˜Y•6¥e¢n9žÃ*éhüª^3_s ÝªÀg‘t 58yF€<„3¿F¼ãuV ÔÐ@ËuBÉ:FúhÓºN\aäŽo‘Æh „³|¿þ~¿~ÿMÇÒ N«Ë™ú›Âo÷½Z ž›ÙÕwêûv‹¾éV̘”úИ1—HàeuDZšô¡õÝyõžT—r¤~¾VkôqòÙ A'kßçœ%hÏÐö æjD¦Ë¤²¦›”®H‰c—Ü{)„6g»^¯5°…Ðë>¯} v{—A¡óµVûy¿öc`rø{»þøY÷˜ójÔrHכᰛŽN?ÇIeâ¾¥­¥Z¦—5W#Rýs6ÏêçW0µŽý}Uëj‡t쵚óœ¸M½[ P-Ž{°vž¾Çu¯+”Çÿ‚Tµ6ˆæÈëfê1z¿P)äÖ!iµ› mørpþÛfÚûÄÖø‡ñ‡C0ŒßÙøCޤ1˜a×FSkÈ9’üþ4ÀRLÙsR)Ò{Å=!.'ŠÓnÓ(óõú¿&¢VùÞŠ,WIÉ CZ‚4÷XÛ»„V±F‚ EµúÉËmUü&_ÖîÄ‚›ŸÔkïÖ±ÏJÇRÍ"Ð3´ì£äÇõ³‘` Ï-Htû³Äzrø‡ ø¤÷lÓh0EòvõH§~_¬s”ò!eÅ¬Ü B-‘ýĶò/h îψõ¨‰SË-2ã'íÀ¬è‰ºfXݯnKŠ©ýê­nUD aðd5Êê”ÿ§Îá1Ÿªm(džëÖu‚A+OÇIo9Ý{µ½]"þ¤ÛÇJ­Ûû´L»M’tN1pÓâõGÄyEÿyHt¦Ö—@ÞJ™ï_£Œö¡˜#ØMZ@ ‹Îl­w=ó_ÖvÏ“¼ïÒ2ÓÒu¬ ö¢_·3ªã;N¨Ræüœ9[;A:\ëžóœ¶¥Í8C MûJƒÿ·ô±:·ÇÄËDhCZàP¸&uûiýïåëkåª]¨.^kDÓb@ é[i ¦îÅf|:…iùkPo®»Ñ¨æÜ㞦ݛ‚q÷¯¿Ô)-O½ï¬ÌèÜdµÊjÝQ¢ß²Ra%ÑÏ^«?&"¤J›%}&h ‘‰&Dîÿë4 /rïè6ÃxSÆ ãý¬ÙKºþMG Ñ—IC%Eˆs„ß¿M€Í Z6o—%àò¤ÁX:ž¡ehuRX«E AÊ$íÁ«+MÏÓ—þó>ž£ß¿:†[D,Gýíný…d¢weæO§UZ‹.(Ý> YµÏk›ï =«òõH—ß-•ÅÊÆ3ÚtªæU@¯Às–PΊūÚßUB=P—!Ÿ%‚ê ˜/ÁëÉšãã$[ºBšç5wzú 6ÖI÷XÏÉu1[DZZç0¦elÏþû}È[J›1[9E DÞ!œ¾Ã«AR/=KÀÓyBÒÒÒ,ü* æž×ögh R^¶ÂìÉ:/3ÈÒ1î’,¶bî}B‘¾Gì6Õ²L®ÆC;\+eV °ÆDü=]×ê  µå4@’޵Hi·‰ÓÌ*©Xí1¬w½ô3×Ý·­,}Ü­«%¢ãXìæ“ZcêI¤{Ahuº]§#ïýõ:îÞ"Ø m™Ø½þ-i`'íǵTK«z^÷ÎõÚ¶îJ6¶S¨üœT&ç»m©Ùì¶)à5˜ì«D^s?sµF50·É—ôu Föñxý|¬î\$«‡IÒ]ZG E¢ý°Êe%W·-aƒK.ƒÓ1öºµ)îî«`ž7_óó0†ñ&Œ!Æ3^/—šI–þâCûáËΓn¥‚i=¡m\¤ V~v7ˆhØ~‹´ŒUAþO ÕaL2{ĉÂ,¯Y®1¡­Ò¸Ã7IC.}Ðu’îC  –øçvŠë^‘^fIåF%þåc"ˆ{»^û”xÚïºÎ=Ò(j8¡e½Í\îÿ†Ã‘7i€L1¬¢f;}B2ª·ëR%¦»sµÙ—Ô†ÓDo!…èUóCZ`õkR=:A«‚\©×ìßr›I=¯óqØ­É ælmÇÞó¤r³Jô»$˜VµRç$àþ¸ö+?ÝŒ®Ô#³§Ç»s»A–ÎCGj]õ=!tEÌïÑÀÐ3¨M×9›m%UÞ3ÒxM—,)=çhb)p«„ŸneéUÍÓ©€Ì×Ú;Só¢Æa™æ’%Eošœ«SL B]K ÕO’ V¾÷=Ž 0ŽÀ¿_Ç´J»§oÖœ¬†v®ïžvc•ʦRjD+KñSû”ˆ³§È=.åÍdÅ©šSûl½ô¼'j¾mRfC7©HŠcO’jDß'À Þ96sªÞ7Cª!§ÉgÈÍ:¿Ó„²Ô÷8ðžô3sDèFê 䶉#”nCjh¦kŽŸÖϺ­:¢öÁVtÇ$°6ÐöóFûÏÅ:ֿ鮕›¯C0Œ7m À0þ`ãwAòýfdz+O;°úÐÐ_^·#¤Lø€Õ9å)åÛLL‡’k40"?ý1q’˜& [æíÁú’p['ë»”.ÖñNζ/iÁÿ|m{‘öÖ[!T–ç´Ü6Šñöi€e‹VÉ8 •ƒâ]ÿ””Éš­Û¯órÎÕHÍ‘ç®HUѰ d•ÑGõ?ýþß'™ö3€I{Ù Ëfc'xª{½w}ÀÿçšÁÐÓî8¤N'(ι.JgêüΠ*õÌjÆ[ð> ³‘÷º5z¢®•bà[õçdL<é9ï¾\ã}Òöˆs“ ¾ÌvB2±nç8 ØïÚhM¿}mG/Ö5²&MKùmb¹©%©4Ž)Bø˜Ê/ =çÉ÷ÜÒÐLzLß ÉjÆK ¹Nü›÷ƒAØS[äoÔÚ°Õr¿î>ZëÿÿTç}š|®ØíQíçBý ©ð(ª6`5PSèjP©CØK"J·B§Ç¿ ?ÎQ¹Õ´ýZ —ˆ#Õqéò¾–ò£{Îz·Î=&õÏ9\€PÅâÒóÔGìÓ‚m”§HUM—4;<l‹$˯>g›P¯¹îž°ùàÇõîŸ×û ` ¦u6“"5[¯Õ\¡ÝsëëôÃÆ·m À0þ`ãõré¿$èßcÉÚ­Y.3;‚ J 3½Û„—|€‡1-#ìÃVnºi)6°Ù&œè}âèr™ Z½ù­’ HÖJïOIvû yàj_g3ŸÓ®6Úˆ\«s¹UóÁfp`€ñ´Îc‰pšÕâÍHnÕÿ®Õqž­k ¹Rû´ÒqžX¡ê¤àÖß—ˆO¼äj'ÎÉuBE:E*7I–ÎæFWê¼6h \-Â&á™?­9‘6ô²æR»PÝ@|z-Ž’àæéÔ*7Þ,º"ÄóÄúRzƒ•éJ³4­†‘eÒNšŒkn‚Pj\ïjJ¶hÔ,»©î`5Y×n‘ئ.Àk…á¡¢è#Hì 4Õ¤¬×qÜ%âMÏñákÇaõGg&ûq(âô¤Ò= ¤åªK)ñ~}D8áÒ½ 6’®Ç'êïwºã‡¸A="åÆõ»î3 ZbXÓí_ú×q´101›¼K F¤By”О¦ê=®…´®s“‚Ì“´€ÊÆ_~VؼK@ý^÷9"Â×õÝ:¦cÄAGÚUDé’&¤€õ¦ ¯}ªR ¬_¿÷ò7J“.tÄ$Koðí}ç5;VßOú¥¶ÕØ-Ò·`’|X¹|F莟’êšnLRá«þPÆ›4†`°ñºíÙ¿v;~÷ÃÙ’ð1ÚÃÀl›Ô»|Ha^cçÝn> äy%.Bjìi {Ž™R¯‘vuux’#ÿ’F¿Ù! Wš”Bc3ë®W5 WˆUwyÇ´ ¹uLY!Ä%ZÐ`Vتƒ”/ik]ýy½VÞ¹bl…®#ä^ÑDÁKµ?õ[u]¬Ø8w ^ë>û/]k¾Öù2±?µòò¤ŽO]ˆö§Ok>f»íêÛ¿Që‚P–´|"´¿^¸îz«õ&]Hà(·]{à³nôµ]ÿ—R&è-¨ÙÿÀ¾#ït÷×B­gu!ä3æ4-°Aôi§ˆÕ¥A”ên¤Uªf“µ½+4Ð}ŽXé dUÃû÷^wÞ®séjî_‡-é6 h_º™ŽXV)§»sÑ!êãZ—ºXY0x–Æùig¢F“)YcÒ{C-“ÛõZ?½OM(ÌÕq÷÷¶¿½Þ勚 cß…1ÃxcGÿ¡l–Ý,£ @¯~’f|úù`²‚°T߯ÐpƒöP!˜vq:‡¬0¥{Žžõ/ºc¥=˜°mtç0OJΟIyÒwºã‘«ëƒWá=’±•/¿ÐÍÉ¡bLÖënšÌû´ÌéZæð ±ÜS4*—{—&ÜŸ“IÚƒ÷/Iu¾Þ«˜ÓL›Î?Úyju*X;NÝ?~Dãïÿ„–áÔgþÏk¤$ÌÕö>¬c{N2ýVNÎëÉOIƒ*G]÷šÚÏçõ¿Ùú¿• ³èRÐ郞¹€E/{ÅÈròͺŽ9܇@ªÇ4eÀv”Ø*T÷8ûžVh2ÌZí0pÙ¥£¹îúܬ¿Ù|êA½ÿ á·ž$™ÛgD l¥â,µ/i]W_tç¹C€­Àp†€ÜǤ–ô9ùä6¼û¬¾÷M¤•ICû¨®ñDío¶Žs–tÇV/a0¤ƒÌù¼8Õ­«·ˆÐx½æ¥ïï°J„­'ê¾Ó!Êë~²»oÍúë6屜¯ûsŸXf¾¬µÿ_heº˜iõú‚öùaEBíÔ‡DÐýˆÐ5¢R‡`%`ŸÐ¾Þ%§&"ÖˆØ×/µN¡.µ.Þþ]Ý+ZúŽëج-p8(pVN‘þ-Wê>ÓÉ{f—PÖ|üš¸&õî?Ž!Æwi À0ÞÈñºÀàP(z€IDATL¦|{»“ ÜNÒ~àëo/Ȥi9±:ΘÕÜ!bÐq½ö:á»ë}/Gu™Ï½f\Ç9G{ ߤ=4§I¦Mk¾µÚÎqè´Ôq±Ï-Wö‡4€`pãþ“#"´3Îû4 tšÃ Ä&ëxWÿúÉz_$âDùôµM3®ÒMjo“ªÉn÷lÃT]yÄfé— éç40ìøUíCZטèÌ^Ck.ԜȖö"å`d—ÿ¬æåV½oŽt-=͙҇ &Ÿ‘Ñ/kòù_’îËçkV9ÜàMW$é7 >u–¹_W`Gdéa:d)Š÷Ümˆgå£wnž¬yÖþTۘïR{ x×îЂÙy@ôúÛÃÁ`áDÍ×¹š‡Ó4@ø¢æsÖ’=_$všÿR:mõ¢~{Pü€A+ö‹x@zH%™'à~‘TôN’¬¹Cƒê%’å¶ú¦ˆÙªÑÓzíËîîËác5·ÒmþŒì.:ŒÕ.yíÒxúž~VlÓè†68[§}¾ÌÖv¯Õ:¿_óü-+ÿ²ösž–D°ßƹzïÏÈç‰÷´ºÅüã:n+ž½£Ú"q„2ø°‘ã Ju{zUÇ~h¾¬L-›_«£®uY-fínçkýÃø®Ž!Æ?zÇ}ý-¹ëUý‚öá®?·ÂÝòPP;`ÇÔ[$ÛÚ»nH9(NŽ«Ù¨#$ñšTXìÒ @ åƒíZ}×çúX½O'éRUZƒàPJ‡tÝi¤ÿ*ŽÒ2ézø/r¸‘”s§ðÚ ½t9Õîÿózíˆèû$Ó.(éé1×iàPA£ÝBíòz“dr½ŸÖÿÍÆ^¢Ç¤ª Pvø1éÆ<¦emƵM:¶Êe^$^ðˆ«“à_·)÷¥æâ6¡›Œë˜ç‰Bpms™ðB·oi,¤ù•îTr°µ¨5Û:M2òÒ«^Ö¹¼K³‹=QÛ:Køè#Œ!`Õ îjý®†Ås™éþ~¼Žw‰ˆÅuæ‘Ëî56›ÿ´;OµÌ5ôYmCPkS6·cÖÿ"þ¢·»”³óZžj_*UO«Ò‡$!`6XM‹ô9ærÔÑø¨î©«„z÷¬æ\ë÷vÝ[‰Íï2 œµwµÿÈI÷³Âûx­›sÁ´v·&1lnxµ¶û~ÍëG´ Zw§kî<·Ý}p—P¡Í·êÞüYmGŠåz½n»;Þ½:ݳUÑ‹@ïòcµC`qÉ2X##ƒÚ;µ µV êM²ø9}ŒFAtMÉý÷3†@`ß½1Ãø?¤Ê¸Þèv0…PnÌ)Tä¦ÓÆéJz‡dFÝ®-îçº}î“ÌöÈÃXj@ßðI÷ŒEB·¸F(F§ëøêÚ•ÕÎ< ˜-:ÆÚŸY~¢v<¶Ù‘b8…q /ÈS’)\ïÎã±LT£°K — ÕnQ7=ö¡µû5×r‘×k»[D÷p®¶ ¡¡X¸ÿkõºsÝ\¬‘`ïd·-Lô¾—v—ÌÞ'`Ôff 4 p¹æûr·í«µ´a$(h§8&¾îRͶ Zö³D—p–P•‰: „úÆK§êB§]¨í>$’/òà_w4Zdjmædç]Ç÷ë\N×Ð1Æl?µ¿~é4„Bö¬ŽñW$ãjWVu&Äÿ zïÞ¹¥Á)Dð®Õ¦º³áŠê!\öãÄùF¡ýí3Aݺõ##’DÐ7ÿdíãt­©ëõ¿ˆ€ý>qTr. ª/ÕõUcuG÷©î}[µ–׉뎕†ÓDX{£ÖñZ½v­îŸÔZùewI¹êré*äšþQÍÏUÚ=¼^kMÊÐRUZ$‚[ƒA+nêFžÔœXý<__ë$© #—46«­ç»µy@ DŽÆn½6Å$ÁÚk÷¤7€}»z™ø†ÛŒèíA Eèá?£=ÜõU7›Õûðë½ý)×Ë[þÉšÛ$Ëò·™OÝut@ÑÀÂýÚÆ|½_°«cÑËú»‚_:b˜ýÔÚó’5{8¦›­³ÍîïÜ œŽÆiºgÌÓ€Û.C+@R”w„ˆð¬fè¯o–PÞ¼àç ÎUA¯n5f zãºö—ëgÝâpÿL§]Ggh@å𛚯Qí÷ ê1Eu¤‹ B¬(™‘· W[Ÿþ)h²_C¯w°ãZ˜"V²Ó´*‡Ô›¾q©¶ñ?ju—ùˆP…î€4Glj{°¦X^‰ó?¦ó¤úò9bí¶?E‚­›D(Ÿ!X)S?%t;ï¾ð0†ñ]C0Œ7vL|Áï ³À"žéÐÀÃ:¦·hE½[40u—üäëŸ Yô}>¸÷ˆ¥ŸMÂÌš‘8B2·‚C«6þ¼VŒj8ìT:&ÀTÐ7&¥ ‹¤eHé²Õ-@Ðý˜Ã±îtžÜøìÄ÷ëZýLÍÔÚqO`¦¥©ÀNªÚEšó74j‡Æ¡Ìœ"MË<6_õ>ýÛµ=ˆ¤Ø8j]LÑd¤‹8ŸV¡& uêiZ¦O¼é]ìùù`b#«ª÷Þ!®MºÄè£{•ý¨µçº3˜;ÑÍû¨ÎuˆÁ¥!Ù¨Lðy»æÜ58¢rú£Rg°›å~NœË¶8lKªïþ#·T¯×÷nÝÿTÒü<|J>sÎ’®Û³Ýùøv¶^÷ózŸ÷Lç¯w »HÜzLÌh0°U¯y›$&¦hMº¤J€Z‰“„®µzÿÓ:wݹ6hÁÎíZC79ìþÓS€4Œïâ(@Ãx£Çõ8R¿O®\³|úÛ¿¢e{êÿŠj'h…£„×lvάÞ:-Sv„öÝ%yëk$ë%gü4±HÐÏÖ×* ”˜^¤¹DíÞ'6SúçõýW4€/A?íçÄBošØOºME‡«Ýë_‘†OÒ|p^ = Yšm=In ?-÷[á8QûY&ÎG6Ë9B¼Ý=.x>§=Œ7 ­eI¯8BËJšÅ6€Ø$Àð:Õéßn`¤-àç„–ÓŸó{4ËÐËumî×ßõîÿœd:‰ØYšÈiÀy–4’þb…e–ÐsÌk©ÎÀÉlµÖ²³¤ú!ø˜íŽ¡·~´¿Ã[4z‚DõŠ·HVÝX´1ݬí˜M gZ:É«nûì±âHm>¥lô:•%b±(Úí¶)8¼W×ñ¡Ä-’€i\¯Ó-f§û¿ýÇ´¬ò ¶¶067 Wû±Bª·jýN“.ÈZÞ ÍäJãrÎåîÏZ4º;$ ;R÷Ò R­³Á^׈TÜ\76{;^ëPç!hÂY3ãr׆gûœ®{ïiœ¥“üø©îõCÚÛíiî¦%¯ÍìžÑ>çt>Û¨ûÒHqTÛY!T»¤%Èù÷Þ8A pÞ­Ÿªš ÞÅl½ÎªÀ&©ÚZ%P—ág‘•¦Q½÷<- Ù¨óY&vŸ66TôoUt¿[÷V]†1Œïê(@ÃøNžók&}‘¦Xâ0¸±Ñ’M¼|Põv{cÚÃê Lß'–F„ÞáÙ@:Xl‘,¾¥z+„Þ!ˆñá£ÿý)½Hü$³gÕB°ø¡1É…N{€k+zpÃ_Ò’#âF4O€ùL½þ$gn'Ý·hn3”Š4/×ûcÒ€ún¨Òo Òþ´Žcb~zÚÐZfÒ!õUwÝäóËéVW`öVëÅ¡I!‘Ú£eãÑîïÒa¤ )¶~J ÚN'"ë ’é„d§ºÿË™~Aœ¤ÌÊÒ½V=„¯;[;M^gê=jíPç¢Èý4 ¤ÛÑU'û.XíQHkEJ…`ø“Zë6&Ó­Jðl€ã=6CtÚiJ‹ÑÕÆ@l¥þ~­Ž]ÀoGîE%ÉÆMòÒçºßufò*—b{pxŸ=¯õj6Z¾M ÄÇu|[äÞõÿÞǺãW¤z¡;–=ÒPP.Åíq]ãWµ uIVxzg¡+¤Gȋ׎ßÀ^ -õLg#EÄÇêïêuÇëx?âp#“´à}ºæLÃW¤/‚Á§hÀßÏÙDƒBmÿªmü0ëNec‡Ãâ]«6\$Ó)B?“‚¸C ´ìQò+R±RnÕé1­òºM ¼7úÏ0¾ëc¨ ãߤ k†Ï>¤Ì­‹è§>dä Ÿ =ìµ…Óåæ,æÚ{@1¬BÛ „¢K… R—ψøqµŽç-ÚCN «%äZ†ÍæQO9L71“éƒÊ C:‚ÁŒÂÀùnßò×¥òÈž'M¬R#Î6l &õ=ÕÛPÒ3ÌZI‘†qº®ÓÇÜœ!¼èg4 @ÑÍÆsÞ%¼ù3D0{›€:3í‚8=Ù¥=ꎹñÀâ©’Ô ­Xh“¨¼Á‡œù™î8ƤâZÜ 6œn{Šhiéú˜à=«u4MGýý(佨t“tRuýë¢ã±JÃÑùJ0¦àÓ{c­û›´·“„6&Vb—ÚÞbÒìµv“{¤R'0³"°L›^§¥ÚŽþðR¹ ¬Õ‘\ M¿fk>g0^¯5p“tí¯•k߆^‚{ÿçöÔW¬Õz¾OáBÓWüˆTnj–‚é›!ÍîI·®¼ß§éG溵¬Û— {Žxí_’näãÚ¦õ,-ó~„¸|­t÷â$ úÔÝÊÒ–L4˜Èp yßkeÜW!w‰!Áv]³yÒÔË y¹¶û„o:œÝ%A‹|ûU<§}?&NT½sÖü‡ñ]C0Œ7bL¼öý«^ózÖF`è_z“>LlBÓ›='ŸîÕ>ß­u°BÅÍ ·ÿÚÆàù?ŒïÛ€ao:àÿ¢séK»f±ô®Öï]1^oY©çµ }Ô¼E²{ÄåÄN×1yÀØ LÁ±¾ó³´­àÔ’ùo¥æ-‹(—U>»`ëyhÚHKá›@ÂŒžŽS´‡å|Ž2‚2Ý]´ûÓŽp’Ž.ž´¼õþ\S·»\¯¨X‰Ñáè iõðw-ÅrwŽ:«Øu¹æè( ˜ˆçýuŠ?ã0»K«î˜%Ÿ'ž®Õ¾nÒèIÒiæêº]¥e÷‰…¥ÁÕ³šséfH@¡®`ŠøÀ/ê…T'©·i4 Ð1b7ùq6‘fô H>ªmzí!ÀHć„Úõ²öaÀr†¸4Ùçà2êÞªõ÷ Ò6I ¨£=$Úï i &hDÝqfë:~PÇkã*iw*'IöÞûÏ g¿æ`©Þ{œ Òxù=íÒß'÷ù“ZOÛµv>¯íŒIk?w æÖëöêguÿ@>‡zë\{¨ÑågD*dvÆ©ó¾UûxDªe~N¸EßÒ_Ô|<%Ú•1 ¦´É´ŸI éÿ±Žá ²½¿¬°i÷ûªþö›zÿ~÷åõ×VõF§U»YÒL*æ§µm¯£Ÿ_}Ÿ µ^&{l~¨kš×jÈþãû4 a}pÐýíM\$¯ëzšË<ðïi¿· pÕmä,-s-PŸ%@G+J3¢þOúC/•¬£4 m9 lVDÃ1’¥2CµL@:ä@šöœ®¿ÿ†Ðe*”›¤¹ùXM¸@ z{›±ëéQZ†Žh€P[¾HuÀ‡¦~Á¥Bx³¤s°6ŽŸ“ÆfŠ[׺s:K2zÿ›6à8N²/j[Ïhùebw¸K¬€(µdó©úYàxƒpœ}Ÿ™Ø›$lo†W„Ûo·Ö^#¢ä|Íå*lʱ÷5§i¼tß§“Ë d °nNvÌœŸ'´ê7ü›Õ(ß'–·3…ºê´Û”/of—ÐOÌ,Oÿùã„*bð·×Ýk—ëœÿG½_j4=Óc¤´#3úºÜxí×ê˜wë8¬íФV­uÍûâb­3){Vi¶ýMßùOëØþ q±z@ÈÓÄÊ´×H¥’&¥žÄ*¢ÀY޼: Ò‘Üm)¦Vøï=iµâ-˜uç¨ÞÅý[mÞ6A z^ÔµQœ¬¦È€}D¼ÿ¯ÔÚ3y ýéE·OI”k­wô²zàkgÈç„ÎjV=Üßïî!û.ü¬®¯IµZçy®õ!Æ÷a¼©Øn¿§ñzÀä7u‘ôý ÏÚÃì=]f‚-;_ ´OÅæOêu·ëo Í,-pc†É‡ŒnnW04Ù¯YïU"jûAíÇèÙéÖ²Fzh¨3‘¼Þû´à'õÝ1ìà*}‘xÍÏÒüÎßíúò\mBt¶¶ù+Ò½V/ù‰Ú· Dçh€â2É6j}©×÷ àÞ"•³¾Z^ Ù­ú~¹^w»Žq¡æç½šÏÕ:H¤˜xl·ê´7=_ÛUs Ýá˜Ø°Ú( ,åY;§GëZ;7'hYN­Xu’Qìú¢Ö®4b HìTë{×I×bçeLš4I; Ý—÷»c•g>Mš})N–&%Xõþr-ïwÇ<_×áI­—s$ûlE‹ZÓÄÕH½‰Ÿ¯Ñlcÿ_¨Ù„K‡A~ß©x™PMVê¸ûqŸè]̦ûy¨ ævÍs}¦®ÿçÄqÈ}]¨}Ð’ Òd›:ßøûíþÓÒô?‘Ï¡G5;µ]+fÔµ·_dz:>ƒJH…@Q¿s­ëWýÿìÛZ5J®!êzL·'È~¾iŸ»E Št²šíÖã)$ÌÔÚÿaƒÚ+‰Ð? x¿æx¿Öð nN’{vµŽYsà°sÜ›ú¼Æ0~›ñ&c»aüÆw1ÐigDû$ãÚg8¥ íNêõîw" èríGÿh3¤f‘G„ì•ã)ï[¶~A#ÚQ›ÁõþËÊ?¡EÁÚzêNb@#gYá¦<º¥H 0iVQg%®fà|xëd4UÇì¶l6%xö¤­ÈÁ=M]^ÔõPï åã/9ÜYY%5@ºÎ+’±´›î5:>í®ÿc"`õúK‘’ŠauƬöO‰§ø4 H˜i·Ûêš5âóúÿM"^<_ï½@„׺¶œ$æt)i;4 4Uï9¨}mÕ6̆ªø5-°š%âÌU"’'Ýf{pª¶Â÷É[¿AºkOÔ¶®‘Œø©z­A—]’×ëïRkêIçPtÒã¬$ëÜïj ,“Œø: ¼«Ë°¡›ëø3Bµš&š»ÁR³ëóZͳô‘’ù¶bh%Ãþº`éeöÙ`0t¦;/~}N*BlþkÝýx…ˆïõý¿ß#õÞG5G/÷ëÜÕ9ü Žù“Ú¶•¤Gµ–¯ѹôŸýÚŽÕŒ3´`z’V©zI«º†}†Xaü¨Žå<íós\Ñ>ÇL¸íÖŸÁæË:ÿmRm¼PÇ`3Èç¯"ó#õÿOˆV¡ïøÛÿ7õY7Œaü¶ãMÆvÃø=Œ/ ¾mã‹t _óÚþ=–º/ÑŒ—ëýÒ'zJÌU’½\§=˜þ–ö°»H²Ðç‡V £¸NGÁ¢ÜßYâ±ÝÛNJx\¿ÿ„ö ^§e÷¤Ð˜{E{x~Z¯Y¬ÿIu0Ó©³ÊKÂI?K¨IÇkäÙ~Fš!Ô·ˆ;ŒÁŽ6—›dØI€h@% æ-(z\ó<"™æMƒéMàxVÇp²æ[«É€»J€ùúÿ­î8W‰ð×c¨ës3¥´’ŸÕïVˆäK«0(òx¼'´ˆ|T_ËÝ}c ×ëI¤ )ˆ…ÃÍÙþZ°ª›Œó†1ŒßÇ€aßöà«DÊßðõZbž ¦ëÄ`«ºUHgyNl2¯:À¸^?G{Ð<§=tä鞦Á‘ÏÚCK=ýìÌ»G{_¤=ïp˜¯þª^û˜Xå PN“î§R+ÎÔëˆuá=RÅЛ^§íúôf7 9KÁ‚›Õ:¶+$ó~†pÓ쪑g$Qð,>YXÛµÜoeG7)(VCÌ BžQ¶} ì«àÚ¹BBûDøøŠ€yæÇkÇÌIÕׯh€Ç÷Ü©y3(ü2¯Ò²óHㇴ »Ûš­}l¶`džVê?Ì4Ké0xPkGÛ bùx–ÀÜÇúÙ*Ëêúüªö¿Wû¼Äa;D‡p¢ŽáfËf­Û;õ:+NÒLlXe_‰-"ªÕ^)<¨µ|‰PJ¼æÒÀÌú>«÷Û}XªœÚžš×ˉ(ؾVMäëSó­že¶ÖÎ š«“5R–i¾Õ‹K$Sÿ²Ža“؉JÓ‘Ú¸A»w½Gÿ„pá·h‚é·j¾ÿ†Ã–° f‹ˆšŸÁïeÒpì“:‡Ÿçƒi@êu'ˆ5¬÷É&Ñ,ÍÕÜRëož¸Y­SÝ|¬¸8šL˜!«µÍSõ:éƒvû}Âag+ƒøö=ç†1Œ?Ä€ao è‹ÄÊßôõŠuã™þŒdíÞ±Ž(6ŠÒEF÷é+Š¥Ú˜Ùß«ï«Ýþu¦X£=°µi„t5ëf³­ú¶_ÛŸ`Dþ¿èÞR´ç‹ëÒ#Ýä>S«XWá³€Û½"fƒ„+„J³HDÍ‚Íc¤|oV]ð½:WÅÓÒVê¸}X[}0‹(à“ŽðœP§žÖ9êõ+$3x’–‰Nñ$é`»XÛÝ Ô%«4p£ ê¡5Iýy‡PÊ®Õ÷4`oÖyŽ¥c-×y÷ô m4÷êX>¦³àç$ÈX¬×œ¥çiàòtë©:ß—ÀÿD@âT·í=b?)•ä¡’-“àL‡•‡Ä²V>÷iÒYÊ‘œm­ÏÕ¹  oֺ̺§ˆE«^ó Ø/{|6üzNãiâ’£•íz]³‰:ökDc²M ÐéÛåÙÀ\jˆw p×5°¢¥kÓgÄɹ»Hª%knåퟮmý”t¾•ŠõI}»ÖÆb¡;ªczJú=üe÷÷[ݽó²ÎIª•Ë$à¯Ôzö3Îj›œï]„lô×7²sÛ×ëý+Dhnÿ{Z8çê=}€cPb`d•ÁÊ“ô§G$ ;ÑÝ'&E´ÍÕ÷ßÏø~ñý¿Ïðaüñǰ.†qh¼)À¿ö¼¬(´|ŸðjÚ‚Ž9ÒX?û3´‡öuÚCf‹tü4+-/zšö—«­cY+¢³~Pp\#ü~ÊÛ„*ðˆdŸgi})þ¡j<¢ ųRäøkWyªŽïhã/ˆxº¶%Z·AÄ5b‹jÖíÉOê‰nNìjP$˜¹^?ÛVº‚Á‚V†-„YÆy_ùiýߪÃѺvoÕÏOhÊéˆjõç Ø A¬ÐyxW\j€çµ•ó/åH:Ó)B#™îÎýe]¯ç5Wˆ(zí.±mµƒ•)`Îý|ƒèƒÚÞ…º.hÔ3ƒ§SÄsƒøë_!==¥bƒ€ì’à.õÔ_ªßõï¿L¸íÚe>%–š»õ󉽩Yeõ3c 6õ[$ÁªÂoˆƒÔ¸£õšu OÔyN°ì~ṵ̈z¦†hžTÈŽÔq¼$¶ÎÖ\/Õu:YÇ"—*tððW»}zïØmÜÇÞ7×ë<>«k+Ç€÷r‡†ÎÇ$ihPbµÎàǵ|¤ÖÉ^Ýg‰SÙ* Æ!÷+Ä=j½¶ir¤_¿ëµ ›ñ)D>BÜ|ÔÛ]úaw¼¿î®é¡ý|ŸÀÿ0†ñe㻀í†ñ;ß%Ð/;¯þw3›'hàáÚƒGÛ;i,f¹F¤$®ƒÆ˜°ÔèîqŒ8¸@‡éÚî? /ÕG°õ’ív9¢¿Ë$Ë.c¾¶y“Pf¤yLV6cÚÃÕ¬ÛéÚ×oˆ›â¹ÿš!¶©“` =&ÙÁÞ—^@ÖÛŸŽj{[?­ù[""aÿ8¡0ÈÏ—O.uêS’m÷ºÙñøÏj®ÆÝûÔ|TÇ{ŽŸ‘§Ý\@|(˜Ö£|¦Ž]Z‰A—vŽv‹6C~Ÿ¸Hî^gÐvTˆÔ HáØ«ã¸G4 û4Àª[w]Œ¤OØíÖë Ïî«÷IçXip/iô¥ÿ£»‡fj.— àïI0¬Û>kÄõB­ïÞ&v øe‹VãnML)È?AÍRμ~諵/+wÁþé4+èQý¾L‚y“t‹Rü»Àá ”Béû$ó-5MŠŽ_ ï~ýí½î}VÈO‰ó’kåV­Å‰°~²ÎÉ@åZÍáËš3yýöñžSã4¦Ñ¿n‘ªÙ>“oÔvîÔ>O“ûÞ9Ú'®hkµ–n×Úª}ÍÒ‚f)jR%WI3¼âdó6idê´ì‡òÄ1Íþ0Æ㻀í†ñ;¿ÀöMýb—CkÆXß÷JïH÷ÉS´‡2¤I–™ï ÚÓíêŠóŠdñ,£_%Yii5V¬¶èžñQ½ç$íw•Ø‚nÑ¿ S·]‚–‰ÓL$Äß{£Îo—ö`>Vç÷Yúý[Ä&°ï`üˆôX˜¬ã8UÛ•¿+7Ý «Ý9ÑÜãúŸ"_3Žs¤–"ÝgD+}8ƒø¦j:öhÀ㳚÷ÿ¥þÿ7ĶЮ¥ÇI—ç‹$¸û˜ðœÍ$_"ér³!üoâ{5ÏŠÀ¥/¬Ö6—HõHêŒU!ÝO|ߢû¸Jœ\îËÕÅ:OéY¿!ãKÂ'·z³O,išÎÑírÝÚ¥>©¹43+0¼P×óu¬¿âp±‡5rðOѨ5B™7×ß Ó whÀÒÊÜ5¢“ð^›"AªzÅ¢7ë˜M÷Ž>/h®ã$õZ9ïĹër7‡Šà×kGµígDs#lj4̲W Ô1JMÛîæÂ5»^Á½^ú6"ó³Ã C^~¿ %# |½¯_Õ½èyÜ':Ôzßþ;uÏÑ·Ÿ g8¬÷Ø­×HaÓvôeûtýþŒˆŽOϵ Oó´ Óû¸·_~½Ûñ}G:£ÿúM¼QØüø1OîÓÀ‡aì"l–þ8á£JŸY¨íêãÃXnóóú®ƒÏÒ¹Ô¤b5;Í„']Uçh ôTƒ@—»ó°!Ò-‹+§]þº´ŵiju‚€ç´‡»žGhûY’%þðY„¹²1ëºXû–®`ÖßN·7ˆ.òÿÍúÛ4-3}‘²Íhš…T÷ðO¤«¬Í™Þ&µvi`ô&¡Ä<§æ›uÝ¤ÚØôjr•8ň@V>¾-#~t4rûŠÊGµŽ×û—êú¯ó «wxF2àïÀwŸ,Âa±¤–ó¤Â`÷Ö¥ú»´ Eb™¨…£¯œi9j6õɤD_¤Qe>¤5ÁÒrs£ÎýY]+ƒä%^H…ÂùQ nõímà¯h@ó¯ê¸í ¡Žåç„:4®}ºÞŽ×êm ÞÔ:Ö;^Ç âð£S×c"8V(@\nÔl’&WG æÑðx\'Ú‹Óu WjŽtWR´Yó¸Ps!Ð@ònÍ” ÅâêƒÖ¿#‰·ê¼vkäÏkß/€ÿZÇêgŽÚ??MŽØ=y¶ÎǪÔmbq»O,püÔ6WH3=©w:ùhO»HÂñà¾WçðŠT6ý¾þ‡1Œïû€a|g‡Yþ¯>ôÏ–ÛqºR#gøLýOžòçfͬM‡yþÇiFÅ…s´Ü?Òª‚’Çä¡.Õd›ö€´)ºÜ Ê-3i\G ½úßoêü&‰~A‹OÁ²ó´ïÅÚÇSâ3"•ðW'áÌìlÃ…¸·ßà ðôZE’>àm°äñ¿M­ÖÏ‚ÕÀ_ÿ÷—´Ì±"KE´HpfF[«È¿¢=›­ JÞ"€T¸Ú­]·k›ŠZ RVHï½èÇõh€f™T ÌÜJ—™ïö£àÙ üÕÚ—\çÇÄÆÔ,ªSÚ«$“=K†¿ U'{l“nªZ˜.ÑÀÕYÎz—âqAµÁ,¤ß…ïÕ÷þóZ?³Ämȹ1»Yóý˜Þ¡YéfjPžªÖ¯ lŸÕùÔ¾  l5WÛ6ó|†€×‡Äé=¢/9Ú­w‹v _ÞŽË‚èMøë”3M€·ý úÆXÅàO÷05V5NÖûY´Gº’ÏÒ‚ƒY"¤þ5 àÎ×qÛ¬K[`“!h³}'Þ#½¸Ý^Ÿí~L(WI‡[}õi´ƒW´‡öˆdá©f ÷HÖÛÊYÕïû ixt—d£¥½<§=,oü‰:ÞD˜'x•g¬ËÈ?ìæMR%Õ÷¤¾ÚÃU@x¾^óa͇ÙQ)¡e?' e«Žõl÷%^ª}\¯kuŠtóµaÖq ± ß}L…÷êµÇÚk{ª¾´.TÌy»þï6ÿ¾þv¿¾&kõàß¡µ#¤²`p÷”Tql ÷awžëÄs¡ŽÇ&S¿ BZšÇÿˆ¬É+»t é`GHй]Ç;&ìfkŸ?¯ë´Jeö°¸\ón k6{t686r>ÒªL®÷“´`âóš3«h$0ðnõNó°[×÷1 ô´5P»J€÷Nwÿ-Ôß Ø¬vÉþŸˆí°nAÇ Ë5Ÿd½ }$ „ôüWw²R篵ª×ýýšï£u}rø~;݃:‚÷k_UJÝÉ3Ú=|¿æWÍ…béc¤Ú¡µðsZµê"Ñ”¨_©µjrãQ·­uwÕë´½ÌáÔù}Dª´û¦VÂýÆ0ú1Ãx#ÆêüU÷³ “¤ÕXòߦ=lû»D´çñ™¡´:ÐÛMêf#p:N,3ÍÀšu}^û4»û¤¾ô½_©×/t¯×GD‚_£;þ·‰0ùhíkDèGÇiÁÎÛK°º•LùEXØ ew_ÁW-cøÙA‚‘ÇuL–þíL LЀ‹´'«' rv_ãzÝDû"6Thúaõ>3§òׯ{4p%ðß v+:f í°Õíë -ëz4_Ú$T–1ð§ÄYê ÑØøIv«¾ ÏÙLï4¡Vü»š?­,]cŠEŸÔûM«øLÓ…K¤¹Ù­*`†ü2±‰4K=¦w­4ý^+×üR—±´€BV5 çkí¬Ô<)¸µ—T Ö½ UK:›Û×zõiš )F÷ë^²qÕ™:öÛDØ®…¤™g›e`}^?ÿy]ϙڦ]¯wH34ƒcרԩýÚ×6¡õIºVÛ¶ûô¸þg¥¥ïf›÷Žkø4©@n‘lû4þï7)©F/IEQ!¶“ Õš™¤÷ó$xºH8õÞk6˜³ï‰v²Ÿ×ÿµR^ Ô#j»:&i–`%Éì½ÁÜ2Ñ<ÐÍÙ[¤òð37ú3Øþ:ÊÏÆ÷y À0Þ˜ñ‡ú°Öô€<´? Ý,R‚t¨è´Yó©ú.¹D{è™õ;K{˜oç!€fH‹û[$¬Al†Ïú1 iChgQE¼.«$Ã&@:G¸»ë4 òñVô7kûãúý @Û,ëZ0§VBÓ;Òhmª]à)Рök·X;ÝÎÐ\a¤ŒI³ªYR]°Âp‰ØÞ©9˜íxI.p% ­Õ—N4‚ FùÊRäŸ Ͱ¤ÎØœê\Í‘Ž¢ÛÝîg©7¯jRŒ~UçòkâÔ"¸u¹v `ïa䏿|“¸3ÍÒBµ  Õ\ªk¤îEÚùÚ·ç6I«²h¹©z¯kYºÉ©ò<#V¡ VÅ´`®¹uÝì+×ÓÝ=Ú‹x¤Š­ˆHÃ:K‚t…ÔZ]J;¹Ø­;­w¥×I§“Ôwa¶ñà_OÁG¯H¶J¸Kœ¦Åö·°î ”Û}ZJ‘àÿXw ;Dˆ»C òìáàý"/ÿE­a«†ž÷íóm«Þã¼(¨ÕW¡õˆ³Ñ¿¯c¿\ç®ñ€6ߣ]ç ’¹×ÚT Z ©aóõ?›}ý#©6xmý|ëE¾¯¯}Æ0¾oc†1ŒnøÀP4ñ¥¿@RWäš%~Û ¨3˯ðÏ ³;Žg ˜9I2{ºßGD4z¯¶½Gl=N¨f^ÎÍùº&f/uò:ìÒ›z‡u"ú¦GõGh`ñRÍ¥Ž>¨x»ö9ÓíOß|id§êu­yPÇñ6-(¾Tû¶S¬Ým½óõÞ%–nµEÀòÝÍøJ¹Ñ“^­ ¯ÁÝ|ŽjÞgjÍ«kð°Žc­¶©üÅ:né-OI€Þ*÷U½ïI½æÒ÷Ãä€t(Åíñ#õþµÎ·j UÊžÖvVfÐùV‰ØÖ`E7/R{”L I_m4ÛÞk“.’JŠU2ýZÍŸ¸T,;$ëdÐâçØÉzß^ÍøÞo ñ‚–8QûÓ´à¡]*¤—rwŒT6&j®¬$õÎK¿ìþgUËãƒÃâß×ÇÄ—ü<Œa|_Æ c¯ µruÍÌë2ãƒËr¼ÙÛ-âС_¿Ðe—ªsŸ8Û,Qߣڮ4Ý/¤ÌÔþ'I00G£PšOÐwŸ–!Õ^QÐg#ªn B F}Ç{Ç¡Õ:ö1ÑØáX°ìÃ~¡ÎùÑ\'Ü*ô€WD訕£–‰6øÚ¨¹|\¿ÛKèÊ á›o*ܱڮ÷¦ëýW‰]«•§)@«=pïÖšÐ;_Š]…¥åØÃ`øïDŸð î!çÂõìýš–·¢"È|F»¯7jËDo¢[Ш^{©»Ž;Ýñè~äq½"Õªç´Ï›KÀÿJ¼[µ¨¯Öõ±bsFK²Š&'_‘®®c ÊuVú ¶ñˆÚømDë»auçlÍ»kÈJ¨¢lõιûõ_¤i?ÎÖ:Z«ûä3"üî«/V{Jç—üãû:Üa £¯7B;J2¬–àõÍF´‹DÀ¦Må]ÚÃRqè ˆÍp¸“]³ÚWh @ñ¨ ^ñ Íuäð PlTefSζM¶ôà?FÀ»Þ¬ñB‰™ë¶µXï¿ÉaëJƒ£ñ ?EœCÔPïy§›Ûm"X´rñ©llJ ¨s³‘”AÂYbé¸Zs£ "õ½Þ¥~œ¤ A¦Y]IÙ‡APh€&¸P¯_ª}ôÈ‘ÌÚaÕŒ§>õ6n3Èè=ËápFü éWqŸ—R8zÀ®`Vqê~]#{©×HmyNªR6Þ~ÒmÃl¯ý D6꘎ÁºYñÒ‹À¦q¿&YàÝ9¨=X¬} ¤×I•Äu~8@Yyëû&èÈd7lÝžvd6Ú&_ýõ¹U×v†Æ§·×Ä=¸HÇ’®¢×ÿg4@|štè˜t‹ôy^Û^­ó¹_?H‚eivòçµÿ…Ð#+Y®ÚÅöóè=¦¾aD¦MBÓyXóãÚV”?WÛÒÚwŸ&l×êvž¦y¹Bû¬z\kéI6ü°ŽÙnßRý¤KÍ’e8ÍÔuøiÓÆk÷Œ_&o¾Œþ3Œa c†1Œ6¼)ú`@ðq…öPÕùc‡ð[ϺN5–³B¬v\ýœ8 ˆàño‰{Ý}µÎT(è´a= UfÁÎ@x³Þo'W- ?þ7Ò1õ)v‚3EžÛõÿí:W¹ýf{‘žƒ»™J{‘<â0¨7Xy‡Tì± M@ûÊ_Ҁ؉z]Bÿžø†ÛYU»@3¦ibɾ‘•üy9ÉR¶¤LÂ)Ÿ©óèZA™©k+/|†¸ßØ™ÔÀê, ܨ­pÛRD%kÓjçVBI[±“«„Ô13¯v|ÖEǪÖd½ön7×Gk®'ÿÿ“îXN×1þ€Ý«ëó—Ý1Ù‘xd¥KY­9Jè*6LS'¢þAÈ<É€Ÿ«ûH[])u7i`Ó ÐQZÀ ýä˜t÷ø„?ï¾ìU`/›Ê}Lª!³$¸˜!`ô"áLj¥ê’]?Vsq¢Îóÿ¨ãµß âL´CDÊÚZ “Ô†cj–ëº=#÷¿}MÔ*ø?ª¹œ }&¼¤zSu­ ,¬¶\Kѳ¹ÙL à=~×ÚÕºÎ& Æõ·ÕîÏtó©–H‘óßÖ}Dm—‘‚ÿ×Çr†1Œ>†`ÃøŠ!Hî¹vy#Zƒ(ÝYN‘†ZŠ×hÖ›#XÙ!t!ˆ¥£Ör„ÕßOšÀÿ›f™ô!nwO}ÍçÇ]Pvƒ4»Flš…6{/Ø8JVza´ç2C–S„s­ÓÐåšCÝhÜŽBN³ýÏjß׈SŒžï?!bàuB…Ù%ƒÔ¨Þ Rp§b_E™'YÙÞuH·AŽÂЩ:'4m×~¯ÐÀ°×sŸˆ‚÷¿ÛÆX;Ý5‹tg}FË4/Ò¸Ó6qš¨5g…B'+.ú$ ^«ÿK š'âk…§/iL!ò4¡V¸Tï·£«î?j_“ÊÀÛ´Œø§À¿%™ÚËœ_%´{ Öc5/ŸÖPq®¶£ ÷ ­{³ý¬è˜ÉÕkŽÒŸ `µÒF]ßQíï£Z_ZSöÕ¬«ûL‘¾.@¿¨ÿ™Q÷ž»_×ÃJ‰¢]ïÙãu,ÚÿZ›%Üþ1ѰhÏ« Ñ Ra“föÛ*Ö< \÷HAê™î?6Õz\ßµI}‡P/Ð>/Õ<½"]­ÙÝx¦ÞsôÔø§î¾Î§ÎÅž:û¨Ù€Tï’®ÝZ}Ê÷7 {ÐxŸ ó»D¯W“+Òa|ÛÆ Æ÷r|Óž½`Ÿˆ6–Jû\¯>ê$íÁ¸ÙmKèoHÓ›wˆ;‹ÀüxmË,«<Ù4JÂ+@ó:M¬üöI°Ò7ÁQ$|ÿp8£ìþÕqIQ0E±}#ÝnÆD/°@nVNþùIXøyýíNíK‡™m8´Á™,ü+õû3`™®cÔ‘FçŸIÂ-_ ‹üàiBg0qž ReÌVËM¾G—ìq…ðýµ{%4†="öŸÒ=ŽÓ€´ëÆž«$±¤Xú.ÑØ¤ B“ù öÚ>$“ÙS©UvÛ½]ûùq]ƒ“´¬°ŽPëĺõ7´qš€Iƒ …çÔœ/“ÆgsÝ|›¹ÿQmw‘–•?Uçäz?G4cBYªã¾V_Þfðm¶E2æã:ÏÞïþ]RõÑ[^p©Æb™ÞÏÕ¼<£YPÔv-Û b\×Âkd)UPpnåFŠžk­÷³÷3GY…ÆtǶ›Ûcõ¿‹¤¢´KlL§Èg„ÁÍ&¡ž«k¢/¿H~Ö=­×Ï=Ã4i$¦•¯Úrú™±Qóbã©jÉã_¬ýýM­73)Oþüºåço ´W®@ý³å€oþ¬Æ0þÐc¨ ã[5þP ò›ìçu—«r‰Íÿ)íÁhÖê>ñÐïti á‡´ý§µyÂi8ì"”~ó 4ü -ki·ÒŽU×ëgi@[jˆN?«õþóõ«WI•cšVÅx@ý^uç&ÕBž¸"TùÍv$Þ'–¤hóg7RéTíï}xûŒ¥*éJ¤=«ÀC˜ÅºJÖ9Œ‰;ÓÃÚ‡ÂH-&¥š¼O’Ìä˜4UzA([;¤_€@W¡ãKPìÁ˱nÝLÔ5¿B¤÷HçÔuW5Æ$s È-@½Kó6‰zUóöˆˆgçH\êíZ?—ê=Ku¾žßzíÇàÇŒð}8Øj‰´Ïq¸’±A:Àö@ô€4Ú²R §ÝænºåH;’¢b×jƒJ_ûª^›869@ê>ý‹îziñi†\à,EƠߥí·×<µ¿kİ`\ûÕᨷ‘] Ÿ#爵†o]Áˆ8OIw´—ÆBå±çÄI`ŒhŸ-V´¤cI[z¿»Wý_!Íì¤â-×yþ¼®ŸI µ¾þ³ü›T^ÏØÓÑSF_ÿþUÇ3Œaü±Ç c_2¾ì|šdÁ¥,Òš3õÎ1sÄ¥ä)í¡|–öÐý1-sú+ò|›öƒ¸Þ&Y¼§4ñäˆÃ– ¿&lÎdÅEqç<©(Lvÿ·C±€Î†O—ë=f†Ö:;^ëGëKms¥þìÕ:ºK\ka§ê\¬Ê=鮉sûY­ã ü/Ô6šÏºÔAwíué1ƒ¤æè:éñ’ë`ô€vÿ;§ró!M´Vê=/»¿ÛØK†‰ g½"âæJ•€ù±óÜ'ü|í‚ûfZ£ú_ïèô€ô˜©kÖ;ûø1_s}¶ŽÁû÷iw.;I×^'R?¯¯gÝq¾â°à÷·¿kšÏÁk{=ø¢ß‡1Œ?ö(@ÃÆŒ×Á_Ê}½W€ PÚ™;A‰R³¶÷hÀfT¿›ñö.0”×n†W„xîëÿ-5GAëò?B·YA³À>ì!bÐè]'Þÿ‚@}ô§ ¨“"£éc’9!N…ÌOIæñ dݧ¬uZ³RûÜ$­ €ßm©{­”oÔùê+¯0ù!-x‘Š¡Xr‰¢}ý\íÇ̺®s5Ûü§Dw³H2øÞ»;µïsDÛ¡¶ÄóܬûD‡÷¬¢m³üºî¶¥惺†÷ëþѦõyÏ»´Ï¯ß¸»¾ê=®vsi†\jÞQâd¥…ªBb¯“NdÒh¦k}Ý"ú€QÍñƒîý}…G­Êytû¹¡åîf­õ^µM:0ëæuœ¬ê¢ågÖísÀÎáfô™?ªãö3ÌäÊ$©t}Ñø&´ÎßGðEÇñU"àoÔ¿I óMä ãËÆ°6†1 ~;~h?¤Ù¤À\&‚·"¶ƒdÍ^Ñø‚ðH†K@¼OxÓ¿! zäx›á”[l–̦[‚Ø1qT™ap<­ãY¨×nÒ@¼Á‡û60Øê4ÔÓ/–ˆãŒÃS"lœ&Ggëõfô¤@Ä}/iÓMÒÝXz΂s™4³Ú%¼éOºí Ö_ËSÁœôˆƒëBJ‰ Y ÉYBá“àÁ~34!åríkµæé¡'ÙxKÚ€z®þv@¼ô h”39쟒 ê*#ë<äúÔ†ó9qá9Ù³A­¼öq­Óõz]ï~u‹è–ëKp|»Žùt­-š\ß—ˆ‡ý$ñó‡t ¾C¼á½¥v~I‚E¯¥›Ž¥Óm‘àK›^3ôžó&iø6×íÓ ÁÌ÷HÐsŸôаr¦~—6æíiz6ø{F¿óõ³z`Ù·`±ÎGPo¥Äëè‡{8¸508ÙmûxwŽï»õ»Ý“­Nú9epmЩ>cž|¾j û¤~‘nÇÒïÖ~üLU´®eî ‡Ú¯ºŸá~¿ŒâóUA—ýÿ«´ßdÛ_¶­a £úÆ÷b¼.Ðú¢ÿÃ—ß _Æõì‡+³‡WhLýôÍfm‘€@@jLE”r–·ëÿWi4†;´‡ã4-£©‹ŒMµ ›¡žáp÷ZÏ_ Â5Ò`j•–‰µ:¡˜QšÌ áÿ*r…Ã"A›!Ý|ÌãzÏ}ÒÑu™Ã¢eÒ„ÉꊶŽZ]¾ªmŒ‰ßý$ ܘ‰W¨©³üä34 ·Uç§«T¤ÇDˆ*P3“ªCÊEb­©xói¾¤#Ì-"¾´[ðK`7@›­÷{]~DDߟÖ9ÎÓ*ZŽº-“f{ÍTÛ ÷fçé0¬Ç¼üj9õ^3·:ˆm¨¶ S5RfÔMØØ‰:Nùú®ù—uöiP<¾^ïÓFý‚×@ nFß@ó ŸÓ‚ŽS„ßïú’›/um³»ÏþZXŽhƒ÷º5¢nEjÛ‹ºnÞSKD›`Paƒ3ýüÔ:0PÒÕj‰¸yy­­êþó¼ÛÆñú¿z…×fõŸÐ*‚G‰ë˜vŸçiloS»[ÇøF£3Ø"]„o’àöí^µû¯ Ÿ¤ÀˆdúO‘d@þí³ÍÏ‚mb5êš\&€ßž ºh­wÛú6‚š/ ¾)€ÿm·=»a|“1h†ñ½ÿZ+¶¯ã^B>xu¯±3­àDºŽ\ci%6{2“~†öP]!n=ŠJårºå Ë­‘L´|óS„³¾NãÕÚ)öImÿiw,ë$ˆ‘~´Þs¡Û§ V‘¥üé=Úƒü3r{_Ôvì, 6¾¢8÷ê˜¨Š ¥…ØuŽˆ{˜Z%Ê÷XI¬Ÿ&¼h¹ñaé'ë|¥þÌÑ2½63Û®óó¬ý§Ã2øjµèü˜>ZsõŒtlíÜ1D*$Þ¢%}îm¾ä~剛=Ö‡ÞÀhŸh¤•8wÔ9)}BºïêÒdÇÖ "x7Ø:Ý­ˆ{’š{(×b¶w¯ê»Ù ¦wˆ÷¼àF·'ëAÍ™î¸þoåf“tܵʠs“ó·]çt—pÑO Îz͉t׳¶°Rgn=Ë <ß'.VI×dc"B>  …Ÿ’{Z§-õcBõZ'?WΑ@ÿêøÎÕ│ã*ä/Z Ÿ?hI¥úÒ^ÖÆ„s¤šµÜÃAý~†F[¯]û´Jš–ubã+•r¡¾NzÚ˜Kî òùºvëÛÊ‘û0þc†ñ½¿þ×?´Ý‡.zÚ JµÔÞ ¸”°eÇ$Ó/ðñujŠò´®”"Ç[‚âÕÂ5¿Bã›ëN2®mŸ#YK)+¤É”–Šf/Ñ€ù{õ}•ÃÙðë4zΨ^³Nç ÐSý 4ICц:¶340¢°÷£:–³õ·ÄÁè4©–LñÏ"ý¼ö{šxäoëXc6ÑÎÆÛÄæFíÇæY T àvë8mˆ4êÖK‚ä=ë¦r®æünýýZíç1  5½@Ökó8ôÌ“é4©©E±!•Tƒ”ÎRÒŒ~Mè3ÇI ©üi’1Lè!ïÖqß!”3;4¯’Œö³šgÞIJfïÍÜËó_ ÒS$•dÅ`²¶ýƒšWÅí3¤·ÂJ½GJ‹ëÊ5M­™‰ZÇê äèŸ'Á¾×Åfÿµ¶±C*®Ç³µmy·þ¶ßûDì~•ðî[X;ŽÛ¥ù)¡">íî…Åú2ðñóAOýsµ¿ͺv‹¦5ùAͯú¿­¹_&+m‡Ÿ×}²Zsµ[û±"e¶ Zrƒ˜XÁÝŠ÷ˆÇºFê~ÎÙÝÏ-ÏíõÏþos 0Œaü!Çxã{1¾Žâó»ØöýÝÌçÂU·)‘MÁäæ[ö–#¯óÍ\}FøÇr×ͪú°›§µ§¤Ù޼ÇĪs®¶oÓ-÷{ŒØJêô¡;‰ÙR=º t¤q%™Å“À#]?ß®9lý-z¸Œ¼_¯ùMýŸÚ?4 kVo‚ˆK¥v'¢Pm&wi@GKÂwïø%À®zʈP´ôÖ·"°F§ @”S?WÛ5pÙ¦›iâ#7[Ê…×G ¸Jº¬Ú‰VúÊ#RÙ8I(U .gêXÔ—˜mݯ×k™ø€Ð²¦HÆÞªƒz–-âš4¦e{m÷Ÿ_{½Ùii /HõÀ ÀYZ0ó_‰ÆCjØ ÉÈ_ªyDªNóµ=g‹dѱ…–ï.AéÍ:×+„·Ñ»¶¥ó4àû4ˆ›¦Ñ|Ô¢¼Cļ;õº Ø>SûÔÑç¿ѯs$=GMŒA„•˜ æ»5u“d¶u3+îzš#};N“Þ$gˆËϘôê8Bñ]¯ëô²ö5E‹=¦Ý£ö&18×YëZÇRAY¤ÝÛ÷h‚ðö8ìœÕ7;ó3ÊŠÐ "6vÝî‡,]¹¬I©ƒ¯v Æ0¾ïc¨ c¿ƒ1ñë³lc’ÙÖG÷Kè/h¼ÍúY>µàF÷˜~¶Ò4´+\&BÃÞ’´oV%Gº÷D—k?®×½"%ù3¤ÝFõ—ïûˆ’ÎûÓ=BÇЪ󇩪ɿ> ø¬Ð‘ ó<¡ÒôN:GjNl6®mž%T"A†_}Æ`Qa&_Þô»5ßÖ1Ý'YF#ýí/νYë34J³bÚÇ´qL]oÌ g‰JmQü-˜ÿáµH¥Á M^·\xçài·ï5ÒAÙ@â¢WY£õDD=M£qØWb²ÞsX7ŽHc´)baû¬æk‰è)kªìr]ÿ¥šO{ h“kuÍê…MÔŽ“¦sÛ¨Jqòþtê¶%UJW+ÙlóÛ4n7dí-'iÀÚŠÜM"h׊UzÝ©èHÒíJJÜǤbbã;×–MÍviôǤÙXîVG nNÔñ/’*“]É àˆ¦áq ³§ÈýI}·î#Ï×*ÁÓ:‡Ojþ_ꃼ~ߣ(ߪ٬”Hû“â7&O¿&9\ è³ÿC`ß÷1T†1ŒßÁø2×d÷?é §¿¤=l8Üw–ö ³áÕi"BÕAå8iÄE½N›ÎO‰ËÊe˜xÞýÝꂎ2v~D{пUÇ(•äiºegÙ«´såÑÏ®îL·å:îÕ:?«‘,áF½F›CîlwìOHça›q­’,ñ¸Îy™ØQšá~J-̸=Ó2öo°¬VLÍÆ-§?[¯Ó¾Ñ@G—¨ õ÷ÇD ió-›]$›ýýx½æB½î&¡Æì×6tsÚ#z„ B71H;ÚÖšcâ“o,çÆ ¸ÎQf ½¿ìa&Ùª;î1‡ñ¸[sïpX$+]Î`òxÍÅ1Ra [‡ku|úñ»"úiWRëÞ®ãP?pFãùˆ5«¤ûî[Äòu‡ôjØ$>ã u¥X©;ºS¯ÿ æUjØ­QÞ;DxoÕj•pý­ Ø_@‚‚~-P ~¥æÔšþŒT@÷H@¢åËšjMÒ>' d "ˆ½í¹_§HÒ¤ßö¿ðü>«ÈÃÆc À0†ñãu÷ /³lûª÷¿¾-9®ºåèb"•E0+g׎šcÈ9Îa0ô”t$V,;Iœrlö4& pD2£ž×¯êµgh ÿ(i^µJ¬ š- Žj{×h€ð> ìÌÒ€ÍKÚCùÃÚ—¡ü-ucV‹²[ǹPsë:±‡ÂÚÕ}¬‘ŠëØ$Á|­-zõ‚Y› þ’Øóª±wëlT)DKS2øÞîþ¦þ§±ÀZ«$R‰û÷Ÿ£_çqïùèöÚ ÝÕz7«ý×¶ýUã_û™?Œa¼)c†1ŒÁø2Ïç¯zÝëùÝçhbAAˆdz4`!ýæ d*bPbᇄ—ý ®Ð÷ þ7&|ýO Ð|—€%Ï—iÅlá}»ÒЀÊMºI?WêüûޝZD>$€u†tÞ ~æÚ\ÚHKºˆŽ>Ú¦¾KìmN‡©6=åbD ‘ìûêrãß©ÿ=&ý<Ž9wßå“K³9]? :g ÝÌæa®)+MË57ÒcîÒ¢äèoÖ~ÿ”€¿íZ¿óÝ>~Z×e§¶ýçµÝ™Ž`|”èFÖi´ÅñÇk}ÍÕ¹­êŠÎ2gˆ/ßðl\ólï ¿O‰{ÎÙZ_ KÍØK«š'€|›8ùØ¿c©ûÛ\£÷ˆYù#´ûS*]¬ ø'êžÐ6Uáòibÿ«…­´©{$¸•ão`z†h¤Yõ}ì"|t³~Xû:WçfUÅÊå,M/¤±€Õ6Oêÿ®-y!Õš/ãê•móëÿû]yÿQ0Xkã»8†5=ŒaüÇ×Ù‡jÝ8¢Ò ̪ž¤=h}Ð ú¤ Œh[½¿g‰ wD,!À]·I“J±CË·ëoghYz3Ä40pš6>'Þêò ÍŽ¡>©3³õz3Ò¤ Œk›ÒiÌàoÑØYZà Ó ÄdPLVë|uN2;¨­¨ó+@‘lç1èZ'@eD¼Ù_]òÅ $ìh<ü5iV$€TäªcÁ%âtýßã¬+‚6 2“ì*ÂV›a“8K þíÿ 0JU03½O£âH8Eì@^¿¢½ÿ{kÇM"´¨ÌÒl×hÄ=’ \ž!Oü ü¼¢‘y’q}Ÿ~Åa®ó-3n–{žP67›ù¾Ss²H$;4pó¡çèbò€ðëûŒí&ql±Ù˜Mî¡êÝîZ˜A?M²ïwÿÜ€ÄìíYÒ× 'þc’¡Ÿ­}™Á]©íÚÝU‹P³üVWtkzEègñc¤IàìVý~žF13ívŽ×ñž®cxL¨—‰cÌÓºæ× ïß`H`?A*õÓuž'êHÎz™ó©ˆ=­ù=J*O‹ÝúÙÐJëP«gÞÿ$ÎVvë–Ês’¸5IÓò Rì¢ØÉµáõ’öçÚ_¬yîEÐK„R©*HYü%-ð2Ãï=¬ üw!ÄýmÆÀÝÆ0¾z À0†ñ_U¢†®ÐÀÕ ÚöÇD̸EšþHY£=¼K>¥•"ðû„d†Õöì*ûŒtš}QÿSH<"t+h‡ |‘t™½W_¾1ñCß"Tj»º §ø<%Ï»ýèL$gøUmO*ƈ8Éè~²K´«õZ?ðŠÒMª÷ˆ r‘Pè´N9Ù‘Yÿ]B“zEuÉ ‡Ð}äóï×>´•Š¢ UËWHŸŵRÀ¤¹Pç­pU¡ªT˜§¤"ñ’F¥@­-‡ý Ì^kkúŒxÿKëzZÛ:U×R¹ ’å·Zc_ 5#×EðªØz¯Ž³¯Üh­ ,úO/þ401xžéö9&Ö–vÖ*µIÀ« HõâNä½ð)qÁ1c¿A«ÌH©¨,?¡lçCÿ«Ђ0À‚rƒ'3îÇh÷—NKºTA4A÷jÛúðë~°g¥èbÏ­Z£jœ¿çu=\GÛµŸMÒ´ëÓz ¿¿ª×þ¡Àÿ0†1Œ¯C0Œaü‘†àÂN±'‰ø> xIU¸@{Hÿ€dôtcY n7[O›Ô3u ÏG™'4€¡·úSÒÈGºÎÑ$Ü©÷Øöñ0ß!ô9Á}çQi;Úši× IêÁ&ÉÄÛíx²;ž‹¤ÉÕiY×4Ào%EQ£àO?K£=ݧk¬,X9é³åÏj^£RÇu”¸-Ù Éìðq¦9Yǧ-¥ô›ã$8hi/*l±{Oï¤~ã“:›”Ié×u«”)”ì­ýL­yï÷ëê8Frºu_ìÒ3Œ>þ5ϳ×ßûeôÖaþ‡ñú€aüÑÆ7qsx}|™?ó·íƒïËέ?v-%mq¯§µÚþu‚Q]ƒä3ÿ€P6ifAýˆø€O˽ŸÐ@×ÿ·;N)r˜Ÿwû—»ÿ×õûÏHvpªö)OÚŒüSB!š%ÙU-/Wi MŠÄ[Äw8æi™ýSõúÏh@iš`žä°ÖAJE‹º%]¯}Ý!Õ€ Zrœd÷h“üñ3µ/A¹Ýyõ!ß 4ŸkSçý$©<Ø…õñz§öy¶¶)ßz‰ˆ5ïÕöþ]më6áÁß ©Ëµ?½Ñ8›IzV¤*ieºE4'»¤{®Z×Í"¡±ì×9èCoÇÜmZ0©mfO ÑAÆmIÿ²‚ô™¾™“÷Êl­U…×ÏëoŠ™ îN’ º×Ð`ÚíõŽA»”±)b{´ö+åë(iê¶Ys'¥Î€B¬ölÚØr̓Àúé½L*d¥Ïºó´*"ýl¿Û$ 0 ?GîGê:öjÝOÕ½p‚¦ý±+öN÷¯KOóy} ã«Ç¿T¯ðuÏÉßv{Ãø~!Æ·zLü¯ý¶/ä/Ëò¼.>ø’÷ø³Â¿wI×ßI°¸Oš…mÔï 40ä÷õ÷'4P,`Y¢Òó„‚ò˜ÐقͧÄIæ$ÉZ ¬Æu|;4`?ª}š=×ÕFú{„®ô¬Ž«o $d–öWYŽøá®›ÕVȬ}¥‚ÆŸ—" ¿O«@ê'h`ÍýHÑÎò>Ñjtí¤{¾ÛçÃ:E½V.ÖyÝ ¼ðçµëu®º ­ê„”©[úù«ÐYG³Á¥¼{©U‚øWu}܇U„5Ö5Nù£Ú¯41çÈYG»ýϑhYs-Bç8lé9XUØéÖ©ŸŠÉSݳ¨c3uû¾~L„°9GZñZ9QŸbeÂÆhÎd3ûÏ^;ökÄ1ê2Éî?ïŽGý†ý5¤÷èbtÐíOÁ½.\'j/h÷ªÁôÒ¼Ì é9-àž&<~«5ÚKgó\þ¶¶ë=(ͧ_óû0¾|ü®*_4†Ãø²1¬‹a¼ãë\{ÞÄñÛ¶–Ÿè¾û³±h@ó3Ç:È<&rÕ%(nµ«ï±f½G¼îŸÓª1ê…Ú®ëE@lPªM«bVazÁè iðµBN)Gj¬ö\ })Ìlk#k€7I(cö(Ø$•€âš$X2c/w«æDý‡n9ö³pnÕ­x¯(¦¶Suoïk©€w‡P¦œw9øcÒO-ƒ” kÝÝ!M½¬d|D,vuAê ÿG mÌ ã×´ŠŸA’×éõν_4ÞÔÏå?Æø]jþ5ÛÆ÷k À0Þ¨ñ]]°_W®ý¢„ô ]Qfˆ>@ZÑ6q¬Y!âaÁµÙô=òà×güiŠe“+­µ”ï¯RJˆØÿÙ ¸Û¦–qýO=€´ýÏG¤Ãés€‘2ÉØë4KøãnO޹€Tpùœž§rÆÐÀ´€Zç%Å—ûõžµÝs„ZòŒh ~S×Bž¹bdÁ–méVc(ש¿?ªy²•@qµŽE_~ƒ1l©×< €\Ú™Š«¤K¬õRa²Õ?zÉ9B©QÌÚÓv®÷br©?Ÿ;u|jtŸr½[U1`PØ»N¸öºõ8öÐßs¯ÛÆcbÁiv´ÛWj–Õ¸IB;èÖ¹×Yñ;¯½O[R³þ Â¥ÿ¸¾âüØÈÏkm€ägÁ“úŸóvžt„^íŽÓª‰”6+3OêË@ÀjÝÁkß=§×ÿöÇßÕgÃ7=wÇoÓQyßï1¬‹a ã[6¾îúeÿ÷¡nÆ|Ž`gIé^pbÆô(ñ¡Ÿ¦î}èТq³¶£›ÙCA±B+ ºß\«}Y‰0ã}šˆ/ªŠ“×iYõGD°hvÔŠ„Î& ž“Ä^tŠø¶ÏÓ@ªÖ’Ú Êç–¢ RʄڊI"´]¨ãš†ÙÝÕy^ç`ó3ÔRUj»*(¥ ±µß4 M`Ûó½¬ ¬mÈdÖZéLFi' æD½ÞÞ Ki ^ Ù[—*ÀéÖ£Ç3&]’gºc0H5ð\&"oç×îĺ[I °[×О {¤ó¯ï[$Ý’Ÿ“Þ6¥šêÎAϾY× (I:Y»ÍëuΟ’ÀÃ`ÀõèïÚ›Za°A Õ ƒ.Ñî?­ nŸ’êÅÒÝ×nã½~äËÆ·@¼©Æˆ1½a|ÑÖÅ0†ñ†Ž‰¯ùŸÀEåæ"ib´P¯ÓÊSÁ¨^JŽ÷—ðšÑØèbvóÉÖΑ†W+4ÊÏ]z4"‚8윯ߟрô2Müú°~·û†f€_Ð@ËÚÎ"á¥÷ÔSuüµ )?ÒlìØú¼öwØcÊÍŸ¤‰™—Hc³.½ŽI‰PWúÙÚî:ÉX$H-±:é°ªˆÓk¢VBëIi>[´@BQ¶Uƒ«µíb „¦H¶Þ¯}ҬˀdD,ï>¿\~EºR´-• æ9J›">ôïÿwRpžG¤#µü„~e 2Ñ‹t³ø æ­t©o08>Vû±’5&€ûémµé€¸0©ùxQç§gµÖ­bwµì»J;ƒjEçVùÔìX=²÷Ã1R±³ba@ô6鯼Lº2ïÖ5ÓÕê³:†Û$ØÜ﾿¾ÌØàÛ2¾mÇ3Œa|[Çp¯ cäñ»´€ëÿ®'ú<¡È {N¯âM ™J´v‡v_}A(RXvºcX¬ÿ}TôþYíƒìå¼›Á“î·ò¤u6Ë]–ß[SÎêÓáÇÛKadþÍæŽëøÝ§”%)Іý'iÀª›/H“$iJf÷Ÿ¯ô·ºíºE¨ž«–—R³ôÒÿˆXw¾[çud‚ÍÚÛUxªþ~¿æÚ·‚LÁ®àÙëwŠÒWëS3Ð:îLÔRûPü ¸hSkǦdÒŠfk_f¼©× Ž¥‚öÉîo³$˜jäÑ}Ç áÉÖ÷Ô'+5žÿ˜TÕ~Tó~ ø¢±Á—‘çcöÞ BïÇõûj½Ÿvoª°k°ÎYÔ>×»y8A„Ó·I@kàu¼þ¿]ïq =!”>?læ¶E«ƒºûAJ‘Ü}ïÉçÏv÷š}´i]%¢öW´ûw½þ.(ø"«åa cß1ÃÆx|SŽÿ—½æ_òP~ÝNtšdNÔ×9¾fH×Où ”˜µä™Åu©ß§i`ɹњr’‚¤=ªó»Wçu¦¶}—æ À.-À DÝ$™Üž_nf|Ž€v©R[µ=³ÚÒ U«sѵÊ`k·ÖÝÙš#» ÷‚t_/kD4^ƒ}šg¿¼~µ$R¥\³_7@0Œa|?Æ cÃþy@`ã£eZfSnå@NñËîÒ_n’l¼´3°/i€ç"É,›)]¡e0­H'Q«0OV—i"ןÓÀ‘–‘Óv€Yà07Þc‘²aZst™¦¹Ò(d]­/©DωÌCZ pBïc¤ã° s³^§pY!ª`²y·8lѪ6AºŒT“ 5w{5—ˆHu§ŽMÀkçX]£viÁŠœú4 ê5[#Z3Ï×j 2ž±÷mRùp=¼êÞO]›¥îÿfÿ\×v•ÙyEº/I ×ÇAÍ™UÁ´™ÏHGg{¬“\ç Ígƒ쥊9¿Úåê¢s³¶s¡~Wl»G«ÌüUÍÛú–Çi="zñ.„®£5«Õ)9Šy{1¼Õ!»y¯•óÑc œþa cŽ!Æ0¾ã㫺D~ÑÀ믗žrŠðìm‚d&y$íNú¬^?K5r”µS*@¶·€}ägß š«t+ÜÔÆr¶þÿ-;--ä-¸˜§»úßi`¥HU@'Ÿ]ª SWAr¯)X¢/¹ôv\¶3¬Öž¤ 0ÎòO’`A`<& m$/‹Vˆ‡ÿ±­¼BܘViÀÓkØwÔDPMÖ|ÚLL«ÊÓ¤‘”üsyõ›¤$Û+á9ÉH4¬5ª¥ )0¶9׳:¯ ¢Ï°Ò  Õêõºcßëþ¯\ù‘:/;VKG³úp‡ô“˜­ãîÁÿD͓څãÝ6u52Àu ¹Æ_t¿»–œSA¾v¢S„Âfàã¶ŸÖ\«sóZnŠZÏáôÃÆ0ú1ÃÆ0¾tôÁ€à}ÐN“,µõÂË7»ÞƒF³¹[4 z4R¢þg¿‚_˜9¢W8B@¼ Jßyõ 9å|OÓ@Úéë^GíÿÇ4zÒG´ FN¾¥,I ‘©¨#€ˆJýÝfc—êø®ÖûÕךhYg!)Pw g¾Û÷ãÚî|Ó©:Wê¸÷IµÃ€iš`Ù l›Wu}ïÖ¹«ñÍ×qì@È i­®Ífó À&»9“ä°Iݘè" „î’àÊÊÑ)àýzýͺž:Z,XÙêö­¥§¼ü†6©üù‡1Œaü±Æ cß‘ñEàÿ_“Åÿ—¾ÿ‹¶÷M·ózß-Cå ëü"0¸Ëå^§·gD|)ÿ[Ùóïßzí½cH~NžÁc$ýŒÃñ4àx‡€_Dyœ‚Àž/ ×Nr¡ö¯Uè"ý_Õÿî‘€BÀmö^wº=lª¶D£ÒÜí¶áühkj“+݉Ž{W…Ê:í÷yþŠ‘µA=_¯5ë¾®ÞUÊ•Yû t«wxÒ]÷IÒL)©Ev–özé„ô‚ åÚ[òõj´%]¯ó70´¹›ÖœtsñUÂÜ×›ï |þa cÌ1ÃÆ>^¿‰Àâå$òEç"¨“wmævDfIˆå¨¾þºIÑðw³¸ÇЗ#ŧjûë4ð=Qû´Ãë ˜ Hå÷ ŠÕ,¬¿fð¥®\¢N;øn±ð"-cߟãÍaè€4;F*[ĉh³Û·4&i5 ˆèËÝ5—Æb•e—æÐóˆØtZ=°cñ ±z}UDZK²ñ§‰°÷ÿßÞýYU×ß]vY@XXaÅá +Qéîà„0¦ƒÛdŠj*1ˬ¿Â •±‡#Q+SkL—ÜÂØUùJüÑŒˆÉ(¬YceXâ”F›FQ”°,+°?îÝ×÷»ï{îÝ{÷î½wï² çù˜yì=÷žó9çÞÝûyÎ燯œüžú‚k¾ œ×ð.D>6"–tŽçX<ñ)³`Ed×à]ª\ò=–ºF„™Ñ>~ǒίۂ¸|ª¡dú]â‹Àhãïp‰î;cy:ÁÈ€ÿ{‹ûD‹W¤=10 º§D-µe»Ï‚™n¼èýÙß±`¯·üúì-½ýÇ™Ýÿœ?[0W{¹Å+‹>ïû Z•§[0¸Ô»×xKy—ý̽5Ûg²)O:¯r‹'"',^yö©&“»ÜøT—¾òmiÿk½›ŠßמÞ?~¼Å›äŲ¼«Îäþóõ»'û¯­_c¯ÀwôÃ,^Ñ÷;>ý¨Oùêýä½Õ¿³_¾žÄÿY¼â¼ð˜wÉ9`ñ.X¾hšßÅð)LOôÿëw5ª’ŽgIåóu|,ƒwýñ)A}¸ß¹ñß«\Zù`¬ãopšË6 ·ØûÎu-€b–¥iK½ÅÛ^šfAEÐû¢ûÊ»'-˜Ó~œw ¼òìëøô¥>ƒwWñЬWH}>[Ìäþ}L¶`ªWà}}oyöÕ‹}A2¿›qÜâ}ÑË-è~tÜ‚ÙgÌâ•ïä™e¼kS,©Œ'’þïƒ{,hÕö±ž|Tõ_»£oiOhì_>}¦ÏÚä­ã•ï²3µÿñv ÁŽëßgò@d/³'“,˜ *¹kÏ0ä]ÃdÁX /_…kôYê/ßÉþ×ù~}–(¿Ó”ÏŒXC=Æà 1R}ŠóÝïXªù8¯œût™1 *ˆþ˜Oê³yEÙç¡/·`ðh§«¸z_lÊW¢õÖñä9æ}–#ïãîýݽËM¹ÅWÛõµü1¯{3Ùâóý,°UšTfï^4®ÿx>u¨Ï ä3)ù ½~—ÓŸñÆuX0SYÐÉ»6õZp‡ÂÇhøôŸ~—Á×ðÊüô¤2ûâW^†2 Zê=Yñ.QSú_ÓaÁ8 ?ŽYú"]ÞuÈß3¿à}ÿœ8 òøÀí#™xÀH#:»LùLC^Ù?»ÿÿ¾ÐV™Ýc¼Â>΂ÙŽZ0e©WÂ{,Þ¢î †”õ©O½;ÍÄþ²øüø^1>jAוv‹·º{k¿eði6}a4´ì•ïˆ}âc¬0Ó‚•‰;û·ûÀWï²ã}úË->Æà ýù½Û’¯Çà•î^‹'&É ‚ù dï䋾ù ]O,&Z¼rï×ÒïJøÝO:< ñ–}³Ô±¾-šTÖ¡¾è ]Yw¤’€±”D83‘½ ÷ÿ÷Z½ÒêÝe|o‘¯²xëzÔ‚E¶ü€·°›³ÐLµ ’îw º-žxœmÁã·-X#¡Ëâ €Ïjãã¼ëŒO›éƒi“§ÁôÖüj‹W²ý€wgê°ø4Ÿ^±ë?cdnIDAT÷®8~^ŽŠ¤cÌ´øàe˜[Óœ?'›—ÃŚج·-ÞåÉNûµ÷•¢½•Þgêé迾~NíÌdäc2Ž%ígà{;XÅ=ÓÊØ£ÝŸmÅn¾¬ ôó™sÌRkø³ÔdÁ»Ìø‚^S-¸³àýäË,^Áõ~ég[jkºïËwY0W|™-þ>ŧËÇ+̲ õ½Ë‚þð>Ö[õÍ‚AÏ>8ד¿á]x|0°ße˜0๾vBòJ̲øÝ ïO–ƒ¤Oö_ƒäkÓ™ôoYÒù•X<±ð™’¿¨Ê-Xix¨VùÁVØ-Ä©þ²Ìw äŠ@ŠÝø#‘nà¼îf©×ªÄÒ¯ÿìÝŠ|ò ýN°xK¼Dö9÷Íâ|ïZäû‹YTL²`ýï›ïÓ‚N¶Ôµ|Ÿ~»(ùl7,hOžBÕ[ò½kŽ·îûàÞôË÷äÆ[ð½k”×Ï¡ÄRÞfºf£5ópg*¾Ûdìv©+D!ó}í™j°k2pJS ò³OÉé­øÞ=Ç©J^ùpÿóNX0hاí°àN‡ÏŒãåðùö'XÐ_?fÁà]¿áÛ;·ˆ¥²Ít- ý<ð¥ÃÇßR ä2­Lš©…;Ù`ÏÏö\þÐ .[?ôäëæw2mÏví}­äYpÌï>“) ¡5Î|/H“mäÀLJš6qàs0´\î Z!îÞK8ýþ.œi”áç­´ø¬|¯_.•ôá ~-æ{JB£‹ïicÀðØQì…à†3w>`lão8œδVu¾œ`ä” €±$2 NW§cù#þ€±ˆ1pÈ6P>ÆÊ„Ó¹õŸÊ?€±ŽÎ@…T ©¸ß霸ºYN;Åô a D¸„w8„y G˜Ï( 8­Ñ•È g€0W‚¹ä‡1@ˆp DH€!B„ DH€!B„ DH€!B„ DH€!B„ DH€!B„ DH€!B„ DH€!B„ DH€!B„ DH€!B„ DH€!B„ DH€!B„ DH€7ÚÎ$Ë–-³… Z]]ÍŸ?ßÎ;ï<«ªª²òòrëéé±ööv;pà€µµµÙÿøGÛ½{·íڵ딕/bf틜Ž>þñÛW¾ò[ºtiÑö¹sçNkll´gžyfDÊLäaåÊ•ÖÔÔdãÇϸý_ÿú—mÚ´ÉZ[[íèÑ£väÈëê겉'Úœ9s¬²²Òª««í /´E‹ÙâÅ‹­´´4㾺»»mõêÕÖÒÒRÔsAAAÙcË–-¨¯¯O6lÐôéÓ‹rŒêêj­_¿^}}}iÇÚ²eK±Îeô/&AAAŒÕhllL«Œ?ùä“7n܈·¬¬L›7oN;vccãp÷=ú• ‚ ‚ ÆZ¼ûÝïVWWWJ廵µU%%%C¾¶®®N---úÃþ ×^{MçŸþ°Ê²iÓ¦”rtuuiÞ¼y…îoô/.AAAŒ¥X¾|yJ…;‹iáÂ…Y_SVV¦GyD[·nÕŒ3‰DŠZ¦‹.ºH±X,¥\Ë—//d_£ ‚ ‚ b¬Äe—]–RÉîííÕ¬Y³²¾æÖ[o•$Ý}÷Ý#Z¶9sæ¤Ý•¸ôÒKóÝÏè_d‚ ‚ Æv¸Ñ>Þ©.ÇX;>qjâàÁƒ)ìÅ‹g}þ§?ýiIRGGLj 03]qÅ)å;xð`^¯g%` ßš5k¬¦¦&ñóC=d¿ûÝï²¾æÎ;ï43³ï~÷»FG¼ŒÏ?ÿ¼mß¾=ñsMM­Y³&çד€ÓF$±H$Úãcä]}õÕ)?oÚ´)ëó?úÑÚ\`½½½vÿý÷§l»ôÒKmûöívìØ1›2eJ^åX¾|¹I2Iöâ‹/¦müñdz–; ÐÒÒb’ìæ›oNyüÀ‰/í¤l[³fI²æææ1»Ÿ¡455%ö—6þü´ç/[¶Ì:;;3¾F’}ûÛßÎëºûëºþúë-‹eëëë³Ûn»Í:;;í‰'ž°gŸ}Ö>ö±Ù¶mÛìØ±c)çøïÿÛÚÚÚìõ×_·W_}ÕÞzë-›>}zb¿;wîLüÿoû[Úqßxã¬åJA}æÌ™£“'Oª­­MŸùÌgR¶ýéOÒ¾ð…œŸ?0.¿ürþùªªªÒ%—\¢ÿüç?ºöÚkÛ›››ÕÚÚªêêj-Y²DZ²dIÚ~ž~úiýêW¿ÒŽ;F½/Ùé“'OÖ< ‹/¾Xçœs޾üå/§M35Ôõ_±b…>ñ‰OhóæÍzðÁSö?nÜ8íÝ»W÷Üs&Nœ¨††uvvª¾¾~Ð2 çxùî/—ó¹?×Ïc¶Ï!åÛ¾}»®»î:UTT¨¢¢BãÇ/¨üA¤ÆŒ3$Iï¼óŽÊÊÊdfºá†$I?ùÉOôÓŸþT’tà 7ÈÌT^^®ãÇK’f̘1f÷3X¸[n¹%mÛ’%K$IÿûßS¿÷Þ{%I?úÑ2îsåÊ•’¤Ç{lÐãåòøC=$IzôÑG3ç‰'ž$577§<î×dݺui¯¹í¶Û×n¨ãzžÅzÏŠqï¹çžœ?û…^ÕÒÒ"Izä‘G2nOžs$·°õ©O%¶Mš4I===’¤¹sçÊÌ´hÑ¢”÷áÜsÏU[[›n½õÖ´}¯X±B’tèС´ïîäß;×ÕÕ•ÏyvqÞ|óM}ñ‹_ÔüùóÕÛÛ›òAÌ”d{~¦¸ë®»ôßÿþW½½½úú׿žxü]ïz—$iÊ”)‰ÇV¯^­ßüæ7)|ïÞ½š;w®n¹å€aÄÌ™3ÕÓÓ£÷¾÷½9_¦¦¦´ e]]b±˜***=þøãzþùç3¸ÇÎþ2¶ìøC}|ðAmÞ¼9§Ï.帿íÛ·kÿþýÚ¿¿vîÜ©~ðƒy•Ÿ ˆÁcýúõ’¤Ûo¿]%%%:|ø°$iΜ9š;w®$éÈ‘#*))Ñ7¿ùMIÒúõëÇü~2ÅP¯LÛ½²FF‹Å‹ÅÔ××—²ÊiOOOÎÇËôøÉ“'%)å»%9&L˜ I:qâDÊã‘HDûöí“$}øÃN<¾téRIÒ¾}ûÒ¦q,öyã=+ÆuÎgàj¡×{¨cù~3UvÍL§$ؽ{wJÅúøÀ Ïõdèé§ŸNÛöÀH’~øáŒ¯mjj’$Ý{ï½iÛ¦OŸ®'Nhß¾}š8qbÆ×éK_J)çîÝ»ó9Ïü/Lss³¶mÛ–øùßø†öìÙ“øy`0Ôó‡Š 6hãÆ2ºwÁhïÞ½‰% @aQVV¦§žzJ=ö˜JKK£B~á…j×®]:|ø°^zé%µ´´hëÖ­23­Zµ*ñAþÅ/~1ì㺿ÁÎ?[d:~1>ÉŸÿá”Ïã™gžÑí·ßžóûEÄàQYY©h4ªîînÝqÇ’¤ÿøÇ‰í7n”$}ë[ßROO¢Ñ¨*++Çü~2E! À_þòIrúÄ|Ž—éñ7ß|S’´hÑ¢ŒûZ¼x±$é¯ýkÚ¶Ù³g+‹éäÉ“ªªªÒÔ©SÕÕÕ¥X,¦Ù³gøyã=‰ëœ- ½ÞCË÷û¾÷½/ãö… ž’`Íš5)ëLwNÌLUUU‰ç ,smmmb[mmmÚk×­[—Ø>ðýlhhP,Ëø]¯¼òJJ9×®]›ÏyæwQ®¹æ9rD³gÏÖÌ™3ñË_þRßÿþ÷e–šäòüä˜ÿùÏëÜsÏÕ´iÓ´råJuww§Lg–ïõ#"5î¾ûîÄp__Ÿª««Ûª««SZ`ïºë®1¿Ÿ|*ÞCm¯©©ÑÛo¿-IÚºu«töÙg«´´T•••ºøâ‹uóÍ7ë÷¿ÿý°Ê±`ÁõööJ’6nܨy󿩬¬LóæÍK´Ðöôô ÚÝô³Ÿý¬$éÕW_Õž={$IW_}õ)9Ïb¼g#qGâzu¬ (J’šššT[[«²²2ÕÖÖ&ZËOE`–> èG>ò‘´çxÂöÔSO¥mÛ¼y³$é­·Þ’™©¾¾^Ï=÷œnºé&™™^ýõľ¯½öZE"]uÕU:|ø°~ðƒ ¹Òðç>÷¹”òå; ¨öN‚ ‚8c„ ‰>Ù¶î»ï>Iñþ¹ƒu™Kû)fàQUU¥µk×ê·¿ý­ÚÛÛFÕÞÞ®—_~YßûÞ÷2¶øRŽË.»L?ûÙÏtèÐ!õööêСCzòÉ'õþ÷¿È÷Ñ»âHÙ»Eû<‹ùÞó:Äõεò¾|ùr½ð êììTww·öìÙ£o¼QS§N•$ýïÿñß놆†” v___JwÛ’’=zT’tÑE¥½Þ¤'NhíÚµ*//OÙ^__¯½{÷*ê7ÞÐwÜ¡iÓ¦åT¶ h +®¸"ßsý?žAA1X”””è…^ïu*ŽùÉO~2­¢ÝÐÐÓk³%jÉË/¿<åŽ$]yå•…ìkôßT‚ ‚ ‚Ȧ§§gÈ™$‹uuui³íÚµ+ïñwÃH$¢mÛ¶¥”£««Kuuu…îsôßl‚ ‚ ‚«ÑØØ˜–ìØ±#ëÆbD$ÑøÃ´c766wߣQ ‚ ‚ b¬Ç–-[Ò*ãÑhTßùÎwtÖYgå‘HD«V­RGGGÚ±¶lÙRœcôÿ@V­Ze6~üøŒÛ;::ìÅ_´—_~Ù^yåûÇ?þaGޱcÇŽYyy¹?ÞfÍšeïyÏ{¬¶¶Ö–-[f ‰DÒöÕÝÝm«W¯¶–––¢•Ÿ(ЕW^i×_½-]º´hûܹs§ÝÿýöóŸÿ|DÊLч>ô![¼x±Õ××Ûüùóí¼ó㪪*+//·žžkoo·X[[›íÙ³Ç^zé%ûõ¯}ÊÊG„HÉhÀ©C„ "$@ˆü?ËAú®Ù"DIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/acquiring_data/helioviewer-4.png0000644000175100001710000151117500000000000022130 0ustar00vstsdocker‰PNG  IHDRä†0 vpAgY‚ÚD€IDATxÚìýyüeYVЉ~÷>óóSfDfä\U™5$P RŒ‚ŠÐ€ ¥ òÔ‡ˆ¶Ïn:?öå9>}bu#ÈɆV´Ŷ˜ (†"kʪœ"2æøÍ¿ßÏ|ÎÞýÇ>'î¨Ì¬¬ÊøeTP¹>Ÿó9÷Þsî9{¯½ÖÚk­½öZâG@€‹x@ä@€Êê7ªßŠêz:s½¨îIU]/o¹Fõ]V÷Ô€U]spªß‚ê§jãÏóéð]U»%`Wÿ™ªM»U;< YÝ+ªw0ó|«z_DÕÿ¶«sŒ€°ºVÎôŸªíõgQ]³«wY3ï*[W É«›ìêAõ¿jx4ógUÝSwÔ©î¡Bxýð²º6‹h«ê”œiœ¨þcÏ „~‡Ï~â3\ÿçÕûí™Ávª£Z$9t»% D9LfnqõyTµSU}­[pVý.ªþÖDžÏ¼ß®)ΫVT5ШÎNõ9ªZsL<ó¹¦v§zž?3hzæ9Yõž´:‹™w~ò³Døg ï»åûOͼß,:>¸žA~™>Õ\^Tçq…Äš‹kdª™Ágú,«ûó /zÇv¯ºP#ªˆdæ·F…¸ BjZ]¯ Y· BMå5§ÔÍfž}ÔH5øŽ™ÏÿÉÛ…"3g€²€4†!† 2¦X÷¡&žºŸ5uÿ÷ÀÏ࢖.åÌ;s@üÐÙ̃ꬩ•jPjäÕC†'Ճªƒêžé<’2eÇøí;ˆôÏ¿Ø/€,…ƒ¡‘ùW€~Õ·C Ô¢6ŸA2LE‘àfQW‹Z‡)ÁKÀXz::ÉÌkù^Ï ’ÒÜ×c*~ÆÕý ÐÁÈÆzÐêüæÆîk€¯›ýLÕ¯} ±Õ•Ý‚üºßuëù¬»Tx¨çÏ„›'b»=eiØ­ÈÀ)nn×0׬ ¤„F%ôÊr=0Átôƒêå5gýÂÆêçßRÿ2Ó9 ƈ\Y Ȭ¡™Êøš˜õÌój_Tÿ}‡ÓY_Hs. PüÀ<@)ó{ƒã™Á˜ ͵85 Û«6®Îà_ÝiLÞ&xoÕ¯a…èZÝEpP]«5Y³ƒáÌüfâü»Íµ$UÄg‰A~D[¶‘‹ynîÉ«ÉÁq!ž˜Ï‡†J®aãÿ}§1vð8F¼ÂÔF˜Xê\«›µmPKˆZu¯çˆƒoB¸¾¡ò"ƒÃJ›ßÀ|¿!ŽlsŽÆÐh®@86ÕwßiL1œaª ÔjlÀt0ê¨)¿ž|ë{Ó¹Bì~#:häê ÙªA{׌˜±3O™9š]ÈÓJLU¢)áK¯ÝiÔ¼qp’[DI…ìú3ÕõÚ Î1Љb:_JÀv\CÑÎS¿CÛ< y Âk†ºkŠÏl(rð›F< öŒÞü¥/Üi”¼±p¸§ú¬0T?kÄÖ¿;L ²ÚbL¹ÄVʈКMp[@4õiî‡${Ðß1¯J˜¹ÂoÁ#OßitܸXO`DR͵µ?ë¶©=õ¹vˈᷢ›°`X9 ^lâÈ&æóè„!Ù5£)9m8÷;pÿ‡î4>?àS‹¿œù\St—é Ûoª¶ À÷ NýA˜; /ÀüY·Í[z6îZ[/o¾‰üY¸œÅÈúZû©EQp…Azí]ö;‰ ³,Tw{=(ÈB¸ÿaxÉ8¬çÎN蟇l‚û7¯ßé>ÞÁ ˜É¹–ý·zŽ}¦ÞÞYy Ž ‹æj2„âyó¹{Òp„×…í§aõ ÄŸüå;Ý×Ï[¸Œá„˜›‘=ë)¨]<%•Œ‰gïð»î@¼o(þÞ¯‚`Î|âôWßé>~ÞCÌÔûY¯}ÀÔ¨Á¤eƒÓæ,•®ÿ8-°|6\ú%wÞDþk„+L]ÓõD\OÀµaV»3l«^v%ç=ÈC_iÁÊ[!› žü;ݯ» Î0Õ~`ªzÖË“F[jbR°eb"X€¥‡Í¤{ð<ä“;ÝŸ»ªYô†Êia(¿^7+h60·`,B{ÃXZÒ2ƒ1?âËžºÓ}¹kaXaê!­Ýµ†$qä‘Q=£]c7æA:Ð^ù¯úLÕÐÚF¨¼Œ»ZZFëi­scŽözÐX„p÷H'>‡ÃŸùúì!^æ]³Ïx9°Ä§·ñõÀ Lbf½£f>è¬Aç8)¸mãð]'@|ãOé̆¤|¶0‹Ä9J R€/Ís ãbe®ÍÂì÷Ú‹ùJ×¥0k#¯rŒóÖð›"6>ŸÖ*´G\Üç[žú¹×ýÒ—ëÜ,Ëר±š"—$$ Z6¸¤H[@¡ñ}˸JeVóERBªaXÜŒ\kæý¯ÖÎ×ÚÆÏÏ_ÎTÕj©ÍÎ>t@Xfòm®×ágŸ¼î—¾RÛÅ-³Ä§_÷¤9ìê³-`!8¶‘š¶xŽDJcÖà»6%æ%I®p­‚qR2ÊÁs`Tš÷&êö!ö³Ó¨…1ÄÄþE;tN'¡¹‚ø®ß=’Ìâ¹a™ï ¹¬ôdaWVkÒŽÄu$ž#YhÙ´]ϲhlË!›RK¢…`œd “”Iœ2Œ ¢T‘fаÐ`X¨€TÝܾ7bL¾CT.Õ0î›ÅÜð2,]>òF4,˜³Á©d¶g ì Ñ®-€cK KÐplV¿ásÌsY´mæ<&ƒ1Žk#¤¢ÑmÇ—2A’%Ä!ý0æÀ9L FqIG@©4~TÒ²4W’Ï<ÜnXÀ´Õ¶ø½³èÎô– hBûßÜþ—Ö”o hZж`θ–À÷$¾+±-AÓµ<DZiØm)éø.7ÛØ"d8*ð]‹²(Ç9–ØB´\Š,£Ù±ØÙÌYZqq} aϱÕùè8d/IÉ•f”¤Œã‚0)Ù—\M_~^¨á(ä/1 Û±·.™¥Æ"ƒÅ#xÛ-ˆoYàÚ‚–oáÙ‚À•´<Ïuh{ ­&s&iq¶]"EÈöåëŒCAà:¤…FH‹nS#­’þ@î±,›q?ÆvI£¾‰ßî¶5_wr‘§'šÃŠ+¶­ÏÎÉ2ŨÔVV¯4·›3ö«³Ø›)Œ7ÍâûÁöíG¾]Éô¶ |WÒnX¸– p$MGÒ<æšó€nÐæÑ¹d×ÙßJP¥¢Èlºm…´`s¤81/°‹p”“G9Žc1JrPš@Ø BhW1&Äá6ï8Þ¢ï-ñ‚?¡x\Ø0NJºYN  ãr:7Ì]ÝNø×ÀŸ­ñ3Áè¦a6¼½/ÀŠ[i4ž¤éIŽ…o Ú®MÓsXí4é6šœì.²êG¤“«\¾râ^‡áCIB©”R,’ñX±z×Ïï1> ÉÍÕK‚µ]º<ýü˜Ì‘ñ®_pò¾&EÞÆóǬ®ø<|z‘Õ{¬[M²¨¢Ád¨ØßbI͉‡ï¡ÑqX9i£ËÛ[@íî1¿äsx­AVÄeIßuqÜÇØöë]’yü|5<õ#zø½]›À‚¶kÓplæ›mVÚsœ<»†ßìœßÁvræW,.}ü%^øø.ýILà i´”eÉÒÉN‡ÿÚ!ュàù i6mî{Ì#O^kŽÃí àÏ2·¾FÐö8ÿÑëä‰fÜY¹gŽ4,Hb…çöÉ37h°u1Çsc·RâÐæÌ;c²3˜ôÑBÒO¢4%Ê5×'Gc•ÙG54‰ïÚfPkš¶Ã\wǃ"‹Icؽ$hvs·Çl÷Syp•F»äW~å:=—h «§4;.«'%y1O4Ù'Äa<°Ø¸¿ÍåOía;>¥I1àùæh%ˆCÅòqA+!QRpí2”/]áÁÇçÐEÎÖ%‹îrÊÒ‰U¾„XxŽ‹Ìl!(5XG7 ðÙ¤¥&/Jò¢$LR’$bý¾y¶Ï]§óÄ{8ñÖU޽% ÇÄaI)ª˜g«‹M £.+'$I˜³µÏÜÚ:ÇV|î×¥.gÞ~/¹E>ø¿?G¸ñöo}ˆ·}åiz+]Z‹ë4æ:x­6÷?ì°qR±qÂaëBH•t—žEÓxÇ·á˜x­q¤Ä¶Kòh,Zk¤%q?ðhMâqÆÃ_þ0ñs¿Nr8†TpéS»\ÝÍ8³Ò ½å†ÍA©Zs¸¹Ë'žŽØßÌVÌp{ ÛJhŸ<†×]¢Ù;­8Ní¼xžÉ@rüÁ%ö¯ry3!b®Ë‰'ç·Aè-ûxߌyæW·Øþ”ª$-2ãF­n•ÀN_ÿ3^ ¥ÖXŽïùÛÁ²×?õ1v/( 7pØß i­ÎSŽ_ð‘ç&t¤é¸UFìlZVÆøP³*:aqõRÉö?ûuŽÝ×b°§YZÐ àÜ‹Šp’Pc’I‚e§ì]Þf÷¢äԺŕkp|=%‰FƇÈ&AËåêsN½%%?_"”R€7öÉÉG8y¦È EV*š¼,í^g¸=`2Œ‘V ý˜//èµÌ’µ3‰‡ ]yaã{‚8-ÉÊ [Û\9Èé ?¯¸v.!‹.¼¨(›¦/údbOFì r<Ï¡ãå¼t)GX{[‚ ȈµÃ0Jè6r/`a]â6šh¥°- [l­‘òè´ ùCG8¥Ò Ò¢ FÄYBŽ#\/q°3b;)è A³ã0L-–A Å×þ‰{¤£0C”9±¶É,ÉR ÉJÅÕ]MÐTlKÆJѵ-« (4Ž›r=‘,µ-š–&Í,”Ò4u*£ÈS¼ `y!`”A–•Œ$“1®ã"´F*G»Py”s0qn¨?-J³;0 iöF‘d{Ïfiö36|‡ (9w%%c>ùü¢ÐüâÏ^âø"t[€ã¡ñ7ÄEÉBÃæ/Eœ>ærï’‡×ph·aí>›þ!œh¹Ä‘¦( ^<ˆXî qÁÜ ôS­ræW çdEÂÞËó¿ù<{“!£,EIA©5Åív…¾Qæš8ÍE ד„"h¸ v‘¡5Grj­Mw±É;žh2H̬ä¸4ˆCEKÊBÓu]Æ’À’² 4»»Šö<ìMJö÷Aç>Aã?JÈ„`aÅc¾å“ç%Ý<ÿ|B<˜ðÒ‹¿þë[î$8®C%ØL²˜(ˇ1Ji,ë 1à©£z¸\¥ð‰çXtl›e«Ãîö˜Äui ÑYF(ŠÜ¦Û\Oùêo[âàrFéøØ óßµYYjpò„‡x¨BN šM‰cI»} ‰Ò¬/‚t{‚nÇf<(iý„{r°•C•<ðVI6„1aZpæŒÅˆ ®N†ì Ç ã”¢('êÈ ±#å€TA¡0K~yU›´-œ‚~˜]Û¢ÝjN–yÏ×¼…ÿ·á´xÛcÒqè¶dJ3L%'Z`8rp½’¥5Ò!--ö¥ÅºçòÄç?™¡)ÉŸþ®&š(N?¼Îýoi³sÕ#s:,¬·Ù¿îqßcó,·VÛ.Ÿx&D¹;€ÒŠqR©±d}/<õ{GôpQ-Æ·\ÉBÓãx»ß˜gÞhÏKdaæšõŸc÷wp½œh }ñI:sO™g+Î>Ò¢áK¢1tzš½ë)q¨™[v)Ó’•^À£ïžãü'"x¢Ã±³³Ýä· †Š¿ä,–˜Ðê5˜ 4Ñ$¥Ñ0Ñ9í9Ÿf:­ãÒáZ8bœ¤D¥"LJÆÑ:ãŽ`áhmâ2ËBæ9ì BÓ>B$ØŽb©!鮬¡ÊŒå³>ñ¾Cg¥Aï‘w²÷ô'é.l_Ì8ñöÉA†×ôq{v’ŽžgóbƉ³ ²Dð©ßÜä¡w®m¢‘ÅÙ·Y\~ÆáÉo|€(NÙ¹ÖÀqKî¹/åê R–ä©ÅÁNÄÜb€í¹8Ñ!$¥†Zo¨ÆLĺba­a”°sq‡ÇÿÀ ýÀK¸A‡ô­®M:¤çÈ/þ2^³MþÜE’qEA¶ó Ë_üEœÿùßc~ç‡îKº®E8I88ØÄÖš‡òivlwJò8áÚùmmŠ,%‰®f ’K N-Ø„‘…ïJ6:óksdiB¡J2¥)Ê¥4Zk¢òõááUà(G·¾ÕR „ Ö°UtöG ÷Y¹gμf°[’e6»—ˆû#ä™E8X<¾G«gqý£òßþ—œzl¿ÝB:’$ÚÆò(×\)#žX”…¢À²G4-ÛqØ¥Œ’Œã¹eNŠØÛLÂæôqA8,Íðtš0(á…%¨<Çó@šP ŠP"d# ŠÜæKã×sJÅ©SKËK\¼>¢¥Ìu$…€“½6çìã ÷ØOÂ$co<¹Üßå“ý6Žë´$eî0,”*ôCÊ6:–P²L`;šQ¡É’„Bk„*i¶l†|ô£DaAǵøÐ9³Œ‰Ò(K ¤Ç}g;ž¸‡‹‡;\îØêÙ… ‚qX0Ì4»•è©Û ¿XÉ~Ûgšý¨ Ð*pK`RPv•{N“©ÈÁ%Öüιì_Ûb¡àØ6A’kA>ɘ¤ËKh8·«XŠÌu(…f/̱‘¢íJ¸×å÷.d8Î=RJÁBËaõdß˺ìM¶Ù… ˜0-I3Å8*è§šëÙíÙüjŽÁqÀ®7Œµêý“·f7b÷s³=tÅä¥EZ(”Ö¥‰€D/p¢·F×Þ'šø¼åË8ÿñBkÜTÓ™3Ý}žâòµ1;;!¾'ñMØ™ì±=œf…™lã‚(SŒ Ø{•h“ þwÐݶɆ¦ð­·ù%·4-³kÆ[ຒ^Ó¦éI[ 曋Í+íyèzhQ¤E⸒í݃ ûYÁx'D—š¬„@À°Ðì–аH»Ï%*[;s?› $1›Ã ýQH˜– Â8)‰ r¼‚_ævÇ¿d&{–+¦ù¢½Û¼üYSÒìzRTmÿiJˆ•¦S–&.?·(ˈ$/(Š’,ˈÓ.ÝF›c¶Ãp2¸¼Õg’”¤i‰*4Ž#*EæIâR³ÚÍ»X&tœ‹">váüd”fDiA—Œ¢‚(׌ 8(ÞØÛõañK‹è<5™ǡٮô'Žà¥³[UK]•‘гÍ6¦Ž+<‹¦oŽŽç²ÔnàÚ&­#@jèX—’Í«;„…¦ëFQÉü\ÀÒñuZs­ÈÑÀvÄÎ8$LJÇ9yµ,TF¼FÿvÍOS;`שë³äæT*·êù î°Â˜÷;¤¶á†V^0IJÚEè† Že,è¢ÔH Í-™kØvm‹0(¸¨=ò¢ ×£¸`æL¢’ƒÜ…¯´¾þr{„ùÿÐh‰£ˆÿ`¡ÓrZGF®ßpD!sâU¾7%,ºU)iy@ òR“)ãàë4,|G’df½9-̾0! J+‰Ò’¢ÔìeF¶'¯bPY¢Ê릧H?ª`”Ç$úv«÷ÚIi,²¼2:3'Ð?ä¿\Ššº£‘‚ËUyŠÙˆpUÍä ³Äy—ΤÔгK…Yþ®jZŠX½ú6ÓYŠ/õÍí8*ø1¦©‹K Ó&1:ea*aF^8 goC±——£$ý ×Č֔ë›ËÔŸ'¥Ù:jUy|âìæçÚÂPü æŸEZœ—kãí‚¿‚É^·+¦Ú'lY&DÚqM‘Û……Uè,|ÎïzEä¿Ò@ÔÔX§w¬‘ûjÿ}%YžßBͯ¤ÓkŽžâgáácnÖ‚d= ;žIc¿¸nÄP« Ùû>ç÷½,Ò^ no„JøFªïãæêI‚i…)iY†ê]ßPýÒ¬ªj x ÿÉÉ7®¥¿Oá4f#¼Ï´ÞZ=ØR™¿r¤«ÜU`eÖž0 ü8ÚÜq¿Ÿá‡˜–®ª‹¿Õk0.`Û®7u¥ùÀñ³pìKàÌ×Bs}ø?!æï»Ó}¹ëà˜–,©ûai¹+{neZÀ'ha”ÔŇáÄ{LúziL3]æËù¬ñ… +L3äJŒÓJuRoLQžî‚EÌuáø—ÀCÿÝ ä m´®ãåß„ÏßδXLUé:ë³ëA{Ψ þà‘o7¢ÇöïtîZønLMµZäÌt«+kÔÕ4l­Œ Ð= Üÿ pö›LõW€7¹àÕá[1T_WΨ‹;×PÏ šÊë,TF×êœþ:8ùe7‹ž—£Ü5x7÷1-Ö¦0>˜ùS´.e%{Kà,bDϽïýŒÈ¯áÍA¸þ87׫'[Í´sÆ´0t]aÕ^z°þ£ï–rÿMqdà[™¦"®'X…Av²>åæš2uemÉÚÆòï}¯ÉýY‚ÖšFã(—ô?¿¡;uìÚÇSgJ¯«çLËâÖu›Mòî`¡ªœá˜ãs€04鿸aø òëÏ.Ó*z†Êk5´œšÄïã`7apz÷€è‚å½ö–ÌÀŠHú3Lµ‰±]k¹?[²0cšbv .è`Îñá€hFW>g.¨AœãÿùûØ÷}LëÁÜèsõ}V׃³È®˜Š&Iÿ‚)_â¶M±6ñ9n Ô%l„+ßro» ãNcê6Ãä™ô˜úqjLÕÆV½¬[WÓ®©¿¶þ•Öük­y‘iUUóŒ¸ÏÎê×òsÿá?ð×ÿÚ_e41™L˜L^[6Q×u™üâÿ‹ÿõ?~˜ÿòÍïçÏcj+v¯Þÿþ—|üžïù¾ç{¾çNãöUá€bJùÓêÙµÁUD}ÔÕTëAøúŸþi¾]þ”<ü´Öä€Ð?ñNÍÜþþ¯Œùïûnðæøû?ó[4[m”†?ÿçÿüglä?ÿΓœûoWxiËø½×15妞V‰ñ‰ÿ‡;Í×õ\öOª¶çÀ©lOªþE3ˆ®)=eªŠæÀ¿Öš?)ŸÂÔó€ß žˆc$élŸ¿÷3æ¯üèãá¯üNºs Œ'!›››/ßBULϯÇßý¹]F'Ÿä«ìÇø˜ïó«+p¸÷É'ù‹?öc\ÔñxòÉ'yòÉ'ßpľï}ï»àgžy€÷¼ç=¯xøðÇ/šÊÁ»BòÁw7?üÿ˜z9ÿW­ùß´f“ý_0|©pñ1àÀ¿žˆ«ý©úŸœÔú'Þ©ËÿòÿÐkËóúC¿ù›zooOïììh­µ~ï{ß«_Ê\뿆þ¥EôÇ?þq}íÚ5ýþ÷¿_üã×ß úkAÜøýëA5è÷V¿]»v­6?/Žïý í[~ÿaÐßW}¶Aÿè¿ úmþ‹ ÿèýg@èùêø³ ÿ4è/}æÌýôÓOëUÐß Zk­ÿh¡¿ÍŠ-á/~Í=¼ãÛÿ&_ó5_@·ÛåÑGåùçëšp\þ5ÂÿñËùÀ¿…Jø«Z³µµÅÚÚ_'Ä yùÏ67Y[[ã«…¸QÖï_UœõGÖ×9lµ83™ð‹o8?ÀwVXn`8¶Ž‹‚i©Ùf.s™úw"ŒˆÉªûê‡ZÍ„›#:~\k–…àkŸÔšoú)4sÆ >õLåÔå·@ïÔË·úÿüN®ÿèOñÛÿžÃ¬î «F­×™Îð0-^¬¸yª£Ijºv‚XÀë¯ßôÊðÍ3Hª£<¦ɬӬdºŽÛ®>g˜ynÖדcä>3Ï®¡vÎÕIÒëç×:ñ# k«Í™¹¹팩5W? Nw\7"žýœ›ë%Ö‡šù}¶¸å칆zR«)¯.zF…¤_xÄ~S™«+¤v*ÄÂPyRk)7U‹¹%p¶êã¸TýwP!Sn¨ËRݨ_ý¿Öý-Œå|8óÜZuµ%fXÆÍjV6óàÚp¨§˜idV5úÖÈî L·̆ü ¦&{45óÜOòÙÁg øI åÖ}«õtŸ)¥Õ`Ôí«½–#ŒÖ1%¦5×Ôý½K]¬Óü>äæˆÀÚ"¶ëÑhU/ñ«‹kÅÔ~ëFÕÚÌÖ3Ÿ‹ŠjŠÑ3/ÐU§j­Y{6NFc %üé[¾ÿ8S]^cBq,ÛxäsS÷ýÐP|ΔÃkÉPdÎÍvAÉ”˜ëA©Ý³® ‹*iŸ]ýØa:ùô™²¦W!Ðáf±ÔcZø¡f±ÚÑT#x¶†ã¬»¶ä³§òÛ ß=óù?yfÃ\211R~`ŠB#vj½¿À|¿•úëþÔ”?_=7dJ`³«'µÄ(1n¸›Vè[XWnTÈk`X1™ù^SA³zA23³KsiÕ ÜAÄ¿üáJÆþç¦YÆ&LgPõµžtk⫽Ÿ³eikI ¨ªÃ3å„úú¬ä¨ÿkwÄ·„e×똳3zÍN†#ŠêEM ·DÕÿ¦šÁ¬Y^¿s§1ýàkC Ùb攦>üñ5áÍ:Û`:—ÍÖfðPF=:ÕÀØÍx™‰- (K°,ðl³XDÓÀ-«4]ÃP‰SÇ3±gο|§1û9Àw`œo£ ™5×ײ|vñ¥&ÔzƒK=õ@Õâ'¯eÖ%m·º&F½È!M£‰ƒ&„CÃ’s­,ÍNšFÇ„}§±Éw“”ÓY¿žÈ5pEùÞPøÿTç?ÎT嬃ªf#nâ®q1{­öÖó‡S]Ͻ­•¥ ªÐðJ9/ 3RšMybÁkL¹f܇¬4>à"ðw{Gs³–7«ÑÌÊùzbž]˜U½ëy¡Äà[L€CY@\©4ã¾$2a‹ÑØ\o´š–%§†sÊrúŸþðönsý|„û*ÄÕöOm¿ÀT…¯ãJnl©Îµ6YkƒÕ´zæ¥ ¥ ý]8Ø2¿å•_VÖ–íš5ã~Å5±ùß—\¹Óèyãà$Ÿîºà–ϳ>µ]Pk—õ|aƒ™ti€UÇV K°p/ ®ÀáŽA¾V¥æ~Û51~á!à2pŒ›Õë[#¥f ®ú;L‹9—€íúLÃw}Àk‚߃þu˜ƒÞô¶`t`(¾‰áˆƒ-SúÎsww®a8¡Öøê‰¶vÙÔêzý[mœÖçé¶àš—‚.¬¼²ÐiÕQrË>á%:ÛCÔÄü,$œºõËÛ —3L©{VÄäÏzƒëyâÆ¤ìP¦`¹@<4 ôkO@´o¢%² ãÒ†nÜü8$o"Îc&çÙPt0ÈO˜–0WL¹ãÆ=qÍc˜ìz–ñAþÒÃæŽƒ*䟂pÜ&âOèN÷ùóÎaÄ‘ÅTé]Õ7¯‘Ì:ïì¢^Ö‘64 Œ¯™ïs§aã]fí7›€í!¾õ?ßé¾~ÞB-Ž|¦k ³.èÚ7SWµ´0|‘¥`  µjî·¡ÿt6àÁo1ƒð#§¿á¶Zà4Œ¸Ñ%¨òZ+ˆ¯û±#o ø,ù®ÛŸé9¯uѤº$ûë}¦këu{½²hÜÓ½{ÌÒ|62!êhæù¡ò³·¹ú3\­P§´©©Ç®²\µ«ììÃæíêÂ$n¾JÖó[#×fáFZ5ýêí­ðà ¦T_kA6ÏÁú»`þþiúÄ2çù¹ ·áÕŸ;ÂoGÀ†g#1é/|W"µfU|OR”š¢4%S<9„¢ÎG¤oΖõjq»÷ÜÌÁÆ=Iaûc0w,¿´B|ý?¿-/|-˜eqYêt„AXÓ2¹ãl ç@§iH\hð RàÛÂ<Ã’¸R’kE’+ÆQ‰—–4RETšÌ½aYÅ÷ܶOßÄ4JäÆšÀás0¿:}ÞLÀÍ•#oŒ- b™³-+ÙX§s”×&.É•´\‹ù¶‹oIl)±…DJAÓ±Á²°,‰‚qš‘%/ápœ2”%ÍRÓ̹mòÈJó0±wTãÓbªš¶©\/½Ý[2¾}gÄÍËkBwtð«ò&¾®#ql‰çÊòÝ­Š>´‹¦ï2﹬¶Üg ¼À%K2T©ð‰Ò.n§ÉNÃ"§Èvã˜ýqÈî$æ06U3’\%%ýܤ̜…7‚1þ:ÆQ/Øid¢Š ÚGTѧ-¶€9Û8^Gà»Ï‘ŽÄuëÐö],)iØsŽM×÷xû²Ç`oŒhŠâIB³“"-—"ÏÈÃUŒh•‚fY`Ù.§[´|Î… ç& ý<'.JFIŽïH¬IN©Mß[‰ä(d6¨mˆÿÚE¯2éÉüÝ£A¾[å]°!°M­ù†oáX‚¦oÑp,š¾GÛ÷Xlôš´æx+äÚ¹Ò\á¶òB°á;6¥Îéµ@«‚<-q}XZipíâ>R 2aÑsR’´((bÅpœÓj$¬5 N·[|Ê] ŽØFIÆ$*ب¡ mRb&jª”úh2©ßXŒìC`\Bsÿö¿È“pÌ3¹@[¶ Xx¶¤åK<[Òv> sÍ';sˆÁÒ"F:%MÇF AaIÊR±³W2߳ؽ–q߃­áÌé6£~H’:%ó 6R¸¸~ÎáNBбI oéæœ·Pp¸è9Í¢†¢Ô$iI’*&…fX|ú$};á'€ï¡Ê#b|ßw/Zt é,)p-m Ú¾Edzñ-‹žï±Øj°ÑêñÀz‡—^"¥Ø”iB»ÛÄqlšY-O²¹ŸñÀ›óçKºsÃ>,;‚†/hõ[{0ÉCÚª`÷ å˜Î˜_Zàòóû,-†Ì7×p—4‡Ýœ´( ³œqœ0Œ ü¸À‹J]Ï¥åÚ,¶º¬».ã½ëXVÂ$SJÆf<@ØYa„¥%/<Ÿ’g™-ˆ4lÌÃá@`¥À@-Çf"]šÅîPÓŸ X_2½][Ô,/¬s!–ôã ׇl¡Z£ضÀšX {tºT¯[x¶ p$ÀÆW Z®KÓ±Yh58ÞèpætÍs{4Z0ˆJ¡5t|–KÇ’4ZM¢á±ß És¤Ò¼ëÝm~ïé”w½5à¥çJ”[°vB²s%Ås=\múµxj…ùÁÁVÉæaˆæì 69¾ÑâÌ=_ΕƒËäEŽÐš}Z$$UÆv=Ê)9šhTx·ž€§ŽHõg=®d>péù.Àc­°Þi³Øê±±°@rõ¢ÌX>¾À`kHéØdQÎür‹µSs¬ŸY ÌÆŒ†žm¢#ͨ/˜ï¢q€ï•$‰b¼Ÿ2ȧO6Y;n㻊ÁP&̯Ø?Ñf4´´,ÒÁ.Í… ²"#N#”Öh)Â$ WÊBqx™ä?ˆÉ"`¥ñáÛ‚–'ñmI7ðñ,‰/‚{W–ظ¯ÁKOoÓí4X\—øÍŒc÷48q¶Ã‡~iDŠ!áÁ€ÃœXkVïiÐ[r–K8ÈØ¾”#¤`±çÓh'ØNƒsb–&m\:-—²Œ1‡;÷ÜÓeÓÂöœ|ä¶â³B‘%h JJË2q=¥&/”Ië~`ò …âû¾mÑp<)Xô\Öºó¬-¬tF{{´ZÜ÷ø2Ž—²öÐ2®'yú—·™k+F)ç>²ƒeÃCOöXñàâ'#mÊÂe2Œ%ƒý £Á!¿ú»EÞ¦TŠý½>ŽWÐêÆ<þ Ð[^$ËlÊ\à7ù[[d“ˆG¿d•áAˆV6ÛsË ë]¶.ö9Üž`;“¡Çú1ë T®8+­˜ï5Ø8Ñ`{G¡RM19$l…ÅÙG{lœmQÄ‚,Õ,=~†vÃ%ÚäiŒ´,rU%QfÊ ^› ¼°¾žúõ#€ûz‹ žçÒñ}–MÛoðÐÛæéÜ?Grm —ÝgG¬Ýãcéœ{ÎvX?Õâéßóäׯ°~OÀÁõ„Åõ&{W#Žß×&‹mò4âpkLo©‹ÂaÊb·Ëcï^ãÌ㋌>oýÖ·¨Œ/´‚„§Ú\|¡àä \}v‡ûÞq!CÊñÛ_"<œP ATdLòŒ(ËI²’Ë㣑¿X¿Oþ9Õ±hÛ‚¶ç0xÌ5;¬Í-²rL D‚åØ<÷kWYXƒßý/Ä£ N‹ÅÅŒðСHm74þà€(Ô$#*SZ=(Šª,X\w9ý¥KxÂbýñe¶ŸÝ£=7`ûcW™[‘Ìu®]-ÙÚŒ¸ç´O8RÌ­\m„å±pª‹%–’å9Q™¦9Qšsqxt‚úèÐõ-\ÇÆÒXhÏqüÁ’P׿Âï^á¡/;ÆþÕ6ÇĪ$Ër>ù¡+l^ˆ¸~þ€ÑAÁþu8s¿ÏÃ4{=”ì`»‹œ}û Òj1>,¹òá”Öâç$—^ÌøÄÓ6ók.|"Æ |2¥L r’NöL€Ä€ñþ6Z”ø '-<ÇÅ–’Bkôg`³8B¸§cãJ°… åØ,MξëA„»Kãø´ÜCv_Úçc¿q8/ 6Ö;4;Ÿ8?¡dXHæ{ÉÁ–fñ˜Íñ³‹dIÉñ?ø8M+"IÚììÄ4œ¥³>%¸ÿm-TÝ•U²$ÇÑšã'K®]uH'.¶‘Æ*r¢ý]ÚKŒ¶cúñ˜Ã,¡%dEÉùþÑù%Ž”`Ûžçâz>f—Ãk›4=D~ð/==aÓakÑt$Ks>«'}ÊR³Ñ´È³‚y¿d2H°/(Ø/ʲÁ=´‰Ò„kçû¼pHsù!l¿ÉÒ÷²wy‹ÁnFwAðÂG,UP–%–E³Û Î}2&D¡(TA¦i–#«ÊLG Gì©´FIIà{ø^@¡Ûç_d÷â³”iÊÒñ6üù mÁÛîŸ'ìmÚlÆ%4\›½­ב$¡äüAŒå{¼ó~Ÿßþgÿ…ÞR‹Ë;%gNHŽ-$h4›/E¬Ëg^+‰'WÙ½:B ¸~NP*Éð b㟃­ËÉV›ûõ¸ò|ʉ¯o¢Ëœ¢,q¥@:âÂ’G:Y¡)Ë’¼,É‹ T‰.b6<Î==SNBé4q}ÅÞõ„f×bg/ÆWšcÇôw3O0”t…àäªÍõËa©ˆ¢+K‰Ç})gÕ–´zûhŸcKŠKç&Ø®C?)˜³q¢h´a˜³HÄbg7£Hr&“”ÃŒHe4lÁùŒ-rü˜OÇòœX»DYJœå$IŠŸ%󫣃œ½Ã‚ì`@·)±,—ùZl}$g­Y°µ“à+'[,.p\š í¤ääC=»W®EØ–¤ÈRTc¹œå U­t¤àhJÍ\æë;xÝ.«ž¦Ýµ(RIi„ãÐð%ËÇ Ñërò±°œ1'1O|Õ:[b¼ CwÁ!:죵BZ%ŽÃÒj‡Õ ›,–t%Ýî2«÷ø$‘CŽ RVޝ°~oƒù%Ç-¹ºYŽ ü†J½žÇÂzƒK£’ƒ0"Êr¼¤ælÇG7GÎE Q®È•Fç) ÷®09 àØ ‡Ç¾|…‹ ˯£'ÎP<qâ­9Žï09<ñîÒÔçÄÝGo}ƒßùÀóÜÿ„`ó“E&ÉEš¤œyûChea÷¶“óÀ“gX}ǽl~ècîH\7" -Μi“Fý½%¡» Aö"–²ªìmÊä%©’UÛ0Y¡')¼`0i°¸ÑàÄ}MÜ A»ãqí…˜…uŸ|ã<ø• Jl¿²¸Þbþô<íãs¬þÁ/&ÜÝäðê5æ;šüÂRJÖ$Ä a³ùâ.ÁB¡áÑÿþ»8õíßËÁ'>ĉ¯ü ú1‡Û!“a*K¶ö ÒRÑj(†‚A(ÑÒ"ÕY…:–G,‚ŽV ÒæÈ EV(¶£˜¥á¡çR”>÷õÒ#‹búûšÅ·ŸÂY{Ö ƒ-ŸÆó#¿µûjñ$r÷ݯú”Ñßàü3Y¡i´%þT (GûiD¿€×^ãõ ¨Òfë¼`÷âÏq}k‚ã:È¢ ‰-Úž….4– ÅyFÎEtÙÐ A©4G]*Gþ±#|¸ÖP(à”kͨ(9bYŠI?"„œ¿x@—8vI~uËë’>óœ`…ñÐC ®ãô–(/^f²9 üÄOqp)dõXÇwùÄG†èÑ„åžÃ\à#®ïBïò[ÿé;/]Àõ£ÃCv¶Ç¼píÑ Äq2$^ ñmN¼åR­HÊ¥EQ 4äåÅ¥T`=O=wD÷¤‰ˆkûϳpm‹¹ÀÇò–Y]Ä“’c6Yê0‚ßpàê/±w)äâÇ·q]Ídw‚ë$Ø®Kó¡·pé—?Áá~‹Î|Æê†Æᢰ\î9Û¦”dà Û)i¶$Û—bÂaÈodL‘)¶¢/W¤Ø…Kg¡…¶N°=>dgÜgg2N2&QI”)ލ¼ûÛéÕÐ2­Õ^”šBiâ¼àRœ`ö‘N­]uô'¸î„ýk‡<ý_wÑÅÓOÚ8~ÁæK£mAžh>ù3Ÿ`´R$^øä˜ý­„­+%A @)žùÔ€ —3z‹’ år°±3L8waÈb 6EšC¯%i5Bºt—,Olpy“ƒqŸ½(&+JÒLQ*ýªµè_/üª¼¡G ¶„ Í5C™ÓtlÎÇÁnƒfÏçò§†t;9[[ eåh­ñ/vIÆ1W_ ^ø½/ðHTYÐ]´ˆB‹ëŠTiâç2â‰äôéEP–]raëá(¥HJZ6'{‚½qN˜h.^JY_Ó]\áàÐãÊÁ¶ÃaV¥qªDå‘„¤ÔàSÕ”?*KÞ')Ѷ TŠÍ$c¾?`!iÑ›Ó$…' ší‚ÑÀâÊî€î¼Ï^”Ò¶mÈCÖNJÚs×ÎåŒ÷'ØÂÁur%½†íH6–lž¿Ô'/Ý,&¦%ôzšFKW†¬-5„)sËm¼¥Çy¡¿EXìŽ#†“ˆqT’¤%ý‚#å°Þ O}ðGð4êmF–¨6aX( ©ÖÌ E£¹D8 i¶›Û%“¬€¼`o¯ åÚlœìíæ„û1–Ð öR†9:ËðŠËýœÅ–äêX°»ãf{È0*…âĺËÊ‚C’Z\Þ yìáe®îNX_ê N=ÆÕÑ>ûÑ„KýCÇ!ýIÊpRÐO4ûùÑngú“È&íðQAX…|¹qMÇYÁ IÙ c>ÅôúÌoœ +‹> ާ<Ê¢D–9Ñ$‡¢ S‚kÂIJX–4;ñ”b4R¬ùmˆŠ’3 ’¥¹‚ý¨¤·èrïÃK¤IÉz×cóÒ!nçyò,¶ya÷:—öØŒÅa\2I»ùtCßQÀ¯,›´oö 7gȽÝ*ˆx â\£ã‚v©J¡µæ7whÅ\§Eý”w~‘Çoýê˜<“XZÒ àÜaÉ1×¢!,ŠBsm˜°>o…p}/Á.5óÍöVJTH%—¯d@φÞ| ­'x'ã“Ã}® „QÂ(ËI’œþ¤`ÑSoo=Jð°ëç?ÍѤœÔ˜X{_Â(.ÑJ#´ ûK …~§T,«Ï­’NvH,—O>çpö!Áö•œÕSÛWcz¥B • 7ÉØV6Ë-E|X’¦%;ýÂQ«Ô\ÍÌ.l[Àoìf|ì—8ݵù¢‡—Yëz\m-q%³;³73ŽsFQÁ8*sM\šÍzùkؼ};`ŒÙ !»Ù6éŠ-ÛÔùú#·yB˜0íU»Ý ¥(KMVh´Ö”¥"Ì Ê¼ ʆI‡–ãÐ+K¨àüs;ôÓ’½aNO@?S(K°Ø”™b¨àŒ#8¶âÓð]ìVƒLRÆý«LÒŒIšÅ%“êfF¢n–õ·î¤¿ñ0Í'z#k¢f¢£œ«Ž$Ê ‚ÀD}wµ¦( ÊR‘åŠ0-ˆ“”Ã8¥Lp- ) TšåÕE–•âäZɰ?¢SjÆY‰Ršã§çh//óR‘’jÍnœp}¯Ï LÆ%ð@ ™—pø*y$ÊÛ”#âå èæ`òm‹_l£ËòÌøîKà¿;‚‹—ùnU{‡[–IºÑ´ é[®ÙØáÛi „6¥rã¬D+-DZQJ!¤$Îrl!( %qšS*ÅÞ$g&ŠAavºèWiß­YÐ~èv;l¥ÀŽ'F>ç˜Éø¨âêÇÎÊ×Bj˪Ì&‹ŒŠK˜MržF…-4tØç ÍæoÏ‘ÆoS=Ó’­5aR2.ŒrX¼²:)ÅÍYQŽÒûü“TeP††ør v½9¹a›”ôZÁÛðžÍ×ù¶[à•ì™Ye5lgÓ9cZ‰Tß„”¥HŒüv%´¬Ò¸;ªÜ>Qi6ŽŠ©,9¤ÞH£onËQB=QW/€í:†ܪ’š@o ¸ ðrØ­œpëçÙûf©²¾§ž?„€´4‰7ÀdP©¡Þã[è™8jäÿ=¦Ä–1­Ú'íÊ­”A¾ß2YÑw¿ñõ¿ôV™úrߥ˜~V3çÙcö·’i:HÅÍÿU˜™-9[NëÕŽ£„ï«Þ1dZhŒÙ¢d§-ð›°|Ì|^:6刣†ÏÕÔ¥ÿ½Ö网9ƒcZúk¶^H¥5Ö[2ÈovMàx Øú\ßù&Tð·1e]2L¾ 67Wà–AÓéiu ô–À° ÷oÀú»Ðú‘;݇»Þ‰A|Š;[˜,Šu­ËyÀnÏq#$tÀ¹¯i*ªžü2¸÷½ Ã=DséN÷箃¯`:¿$˜„}ãêp¨VÄZUÊh)Í$Œß3É[×ß íbÁïcøËL+ÍÖ•jëJ0­,k[¶Ñz¼ JŽ~ÿ7À™¯3iëg@¿›~¿À÷qsAϘiºJ˜VQµÜ_9ÞPønÌ„[×…™-]>›¹.s^sD]“¾ž$í5ðZަ5l?xúé§¿`ÔÔ?ÃÁ&+ú¬ÚY'eC ƒøºqý]2¼é¢Ý×55èŸü¢;Ÿ#ƒwaò}ÖÅ`JõUÐê÷’iá†:Qk]й¬Î¦ˆ*¡ÌMœt™jŸ+üýcüòß¾Î?~ø¿î4Æn#ü SRU³ E³ÕTër…õ| 0õÅ~³’ß&ĨIñs¿ò¾í/ýmvÆ%yó§þÔŸâðyÿûßÿš÷}þ{øÈŸtù¥¿so?€Æûßϯ8¦î<€ã|zöxøïác!\>\5æþê%&æèó^N“û['šÄ¬\ÕQ«)1SQ2[À¹æŽzõ®~Kþêþ(¿ñ½ß{ãÚ¿ÑšoôO~±þ¿ðçôÉõE½ººªõðªÞÝÝÕO=õ”ÞÛÛÓ¯ ›¿§õË,ýý ÿèo³,ýÐüÉ'õýØé{@ÿÐßú>ù¤þÆ'Ÿ¼É6yòÉ'u³Ù|-+†·åxÏ{Þ£µÖúßý»§ý¾÷½Oü´úÏÍüÖBÿÈÌ÷w¿ûÝZÌ|¿ï¾ûôŸ­þè&è¯ý]ÕñíÕ1u t£ÑÐêÿßZèŸx§þÀE—?ôU_Ã_ÿ™‹ü•ïûÓ$Á16ŽŸ$ŽcÎ;Çc=öédóáÌKù/ñ×e.˸ \r]–²Œxí?ÿó?Ïÿõ=ßC„aÙvíßuìØ vý©k×ØØØø¼±#ÞÁ´¾õ"ð¿ÿ#ûÃÝßüð‰[žñÝÀÿ£)eWüs­™‚‘¼ˆ©®Ô„þ!ôöùÄé¿ÎÂÂ?þÿý[ RÉ?ÿ?Å£>Jܲ‰Ið/žäÃ?ò4¿sþã©Sœ¼t‰ pñÔ)6.]âŸnn²¶¶Æ× qC5ûñMfñMëëxU‡~vs“­­-žxâ‰;‚ðïdê0«úk¾ÄÈòU¦…9kQT/®ÄL}þ³A…uÕÔÙyâ_T"çYàcZóBBÿÝ®¦{Ê,Âl¼ Ž}‰©ª}«U¬ ScòoßÇoü[xöš‘÷{˜ž8\¬n¯#êÜÉPrsÅÑÚ<·€Ÿ;"„ÿ±êu¨J]hy¶æo=9ÖmiªRîòÇL¬Z¯¯ÕËÚÊ­]9S¨.êY»! þèúFgæ¦:n¥FNMɳêVÊT· g:Z?£Ö…ëŽÍÖV,«wÖ×f§¶³™ÁªÿSälÇf-ÍÙ{Ë™ï· 3sm¶ÆoÝæY—BhæYV…£Ú¥ðkGD4¯O`òO{˜…ËEÀ÷!J̘ŒgÆe¶hD퓪 O1•5ë2[9S жLò•‚*ʽ êK5# Ž0–~9s®­ÿÚS\+g)7×›õ&ÔßkÿÚ¬g¡îSiâÏ´Ý«ÞW÷µœé{mÔ¦‚]Q]ü¹6èTõ9›yˆ;ó°šCÁpgpKÇꉣþ­FdrKg$ÓåѼú3U·g#¹nÖøf™²–õ³õ-×jXÍý³ðr|õ{>õÙÓåOWÇM|ú}—éØÖ [÷YaÆ¥®¸ ¦Ò ˜Xí¶3-ïg»P@ZmoâÔÄ›…Õ«‡˜ñK™ÖK#1fŒkM>ŸiG=6³zìkÁ8;µJnöoÖ’½¦µz*¯ßÃLëxˆÿtÍaõ"Y=5ÍJƒúž3-ÕÜë1õv$Õ½ÓégVÊ×fJÝɬº^OÑ‚©S3Å,a×’¾žufý‹å-÷Ïv¸þ½†[û£ùü&ô£„Ÿ«$¸' ¡Kiˆ[Jã—Ò¬O«Â\Æ!¬ˆ?ÅœG˜ÀËZ%ɸym°.Þu#&›‰¼“Y¨™5ŽcÆIÎ\«s=æ^õÎ:ì¡®[^ñí Æ¨iMü$èÚ¾vfþT;;êÆÍ6p¶¡ÎÌÿfãíàæ).žyάZ2»€šÏ<«f€Yuƒk⯟ŸÍ<·þOýŽÙ ÌšÐoµšÞ„O‡ÿÚzŽÒx¤Qo¦÷Ô24ës³¿=ÅNSCéV5õÖœٙxv ëk>px†©2«Úê™ßj•[Í<çVæÿrºW€¼zA­gÝÊ‘udW]öªÖçëi¥þ_0ó¿tæÅµúSKìz*¬\³È«Ÿ½7eJäÌ<¿f¢Y׈üÍ#$”/$øÅ¶a‚<0ž}ÍQudL%}XkCQõ¹&êš`kAWÛaõõYûôÖbÞµê6«©À”¡jB‡)ÔŒáâÿtÐVÅÝõ½ÙÆÍ®'Ì–[Wü¶!Χÿ©ÞðÌõ´êq½ «–ȵVÍ5Âju&œiG-ík¦¨U ºMõÿþÛ¦”/ø‡B`Æ"ÆH{Í”àS>]ú×B¯Ö,f¡&Ö—¼9SOUMܳ6CMܵª]Ó©=óîY•©þøà:ZHcÜd•¸–âЄëŽª˜i±Þ3SÿÌu­ÀõÌæ{U@–âW œÊxr|³1³¨° ”a¸Z²k¦.½dqµ*T3@íUPÀÇçï45|Ãwa½¶·&áUbnV}àÓj ³¾è[UëZÚÏ2À­µÉkcy–ÐË™gÎ2B ˆgÞ†.2CÐÑØ8Žk¸ÈͬPKqË6ÄnÙSâÏðSÑ© ¤š)ÂñÍTÐ4„¯UÅùô9Eff‰é¶Zõ ™Jÿ½Ó#þ&¼*¼#À¦Æn­ºÖZ¬~_3Fm?º3×k®½W³nòÙ­¯µÓ¥vàÄpcÁ©Á”‘f=G% ®}Z+“Û³¶úËŠ`³Ê¥–¥†8k¢McsOí!s½þî8S鄆±Òºjµ=u­ÕïÌ3ó­Ì{ÇéÔo<þ‡;=ªoÂç0õüÌ1àÓ׆f¥?L%ü¬ë›™{guþú¾Ùûg™ãÖwÞPv¿í†(k‚3 (e=O§R;©S¢WÊ|¶«™CJ£ Í)Sh–e$|42’ßõ¦j—Fõ*r“²(KöMwzß„Ûg˜úãajè§ûía*¡ëõ©Yã¦D<»ž4»@6küÎþ¯Þª—cœ5¶®$°ëƒÓ2³Ú'„ùýÆ›ëpv$Œ!‚¯g„<«¶øU PdÓÙDÈé&X?0Ä †iÆýŠyRóß?tx§‡ëM¸Ýp~æónލÉlv1L0%·Z…ªõ÷ÙPŽZ%šfÃ>˜y¾Æ¨CpóúÕ uÌÝ̉¸T¹¨cxaÎÂß°MhÀ …1d±!ä$U‚AYyŠJ½©U*ÛήgŒí4†/½v§‡éMx# f†{¸9œav}¨þ^»ØgWªmnö8ή$×ÌRËíÚÝ9^QÇ •€| ºÑ1z;`æ‡nu‡×çõª/üìçlb–ÔF§É÷4'FÚ™!òɰê¤23ÆG•/ÿM¸«à>Ý-:»R<ëõ© ãÙàÙµz¶¸5þçÖ…6ÙûLž>¿]ýÚdð³tÖD* Û0ÂøÚtm<›˜¨Åd~לu1½Ö¿~ɯð›FuZ<ªÃ7ᮆ{˜³ÕD>k,×ú}Æ” k¯g ˜F2̺Cg æ:ÎM ¿íú†0i0]âu1QQÝSf×°íÁÊ[͹výDà6 á¼`®Õ[9‚E3k„ÛÐ ÒD)âoÞi¿ wÔFó­nÏZï¯Æjbžu¥:3÷½\³ÍtAN ¿í¸•ñ:W=µÙ4’½ŽI¯? †°‹†ðƒE#íUy•mÚò $^6ÌR$ˆoþ÷w§oÂ]'™n¾¨W‚koR-õk#¸N=6»>PKý:òt6Š¸ŽŽ½xcÞ±CC¸µî/mCüñÁŒš³h${÷¤IêaƒÖŠa†ñuho@ïâíßw§qø&ÜÅp¹:ßË4ZyvA«†Ù°ˆúp˜FÔîÔÙ 3% ÒïB»FýQçh£Îx=£Ëû=sDû†à¥}óá´ ñ׳ÃâÃ0¼„xÛûî4þÞ„ßGp‚©i:»»ö Õ3Cm Ô»Èê{ ¦½êï¶ëqs?#½ýžyZ¥Â0¸4³ì›BgÑ0GsÕÆá¶™ ú/!Þù—î4®Þ„߇pCª'™†XÌ.UÍnÔR˜ý .†èkh=‹ÌVK¡ÿš&f— Éï´L¢¸`aªã§CÃáŽ9{U†Ñæ*ôNÂùÿŒøÞî4žÞ„/¸Ÿ›#–g3¡ÔêP½KqÖCtëvK¡Mt›=¢žfƒæfC¬mº'{ÓòT÷ºÆ¨m,¢Màu{³±e~ljÿõvœÝ‡: ³õ o¼ÖçÕŠë{íªš]Ó2em1ÕsSeJAÕpk½ÅÙß„˜JÅ[ï}¹}¸Ÿ-¥˜*odž[á &Tm•)¡×Ñ=³ý¯=Euª¡ÿáŠFZÐ\™½n ФcAk]…Îq(SÄ7ýìëiÝðêüZpþF&>»±ÏU@ +³žæÐi[†h 2Ø„)¸ã¹9V†ñü'€øÀ<ºÙ3ûwÛs&*Ô² X6ÌÝy{÷eáV£M0•ìµ÷ÄàWo ,p]i$¼×–ضÀÛXÂHqײ–ÄsÛ³-ÇÁ‘FM™«ò‰¯[6ëKšÁ^L–aáù ¤&™h¤”4:Q(èÎkwKö&1=[!-È ‰Âñ4ÃTB©èøŠ$RH)(”@hMдHh4¡»`%ó+>ѼV—kcÍf2a!Ïy./L”¢$ÍrFy*KÆiК(S„QA”*¹):–Ÿ%ò+¸›˜á{˜&Q›Ý…&þ è@˜Ào¢_X3 qæ7ît³_X•ÎÞ±§*Nm˜–ÀqŒ´¶,[«1RàÝôDZ±¥$˜!zßuh¹®íд]Ö‚&sAÆ`k›«ý”“ 6{; ž«ˆ#…ÛôsÉ¢cÔÊa¨ñ¤1t½À¢Ô6ÒqØ?"³‚¸ÈY]4yšÃQ‰ß(h´l‘$MrR,\Kâ9Û)9H,–›!7"!×.­¦ÀqekË©bœÆ$EFšåŒ³œ´(ˆŠ’ƒIDœ”ŒÂ‚8)9ÈÍLPèW÷ Y3ÓjíÑ*õÝÃßUkÏP âŸVéÑ›Õ.àYðG>G©ðF‚æc€Ú¸{xŽ!:»ò¨xN%é+ðm-¤‘ÒžCÃuð›¶cã¸.]¯‰ï8,8>='a|p€ëìmå¤EIÓ¨R¡X¶M{.góZÎú†Eg>àÜ‹9ªT,/Ùd‘f+ ­YêA<)ˆ£Uxä –tmð|A‘+¢‰É$Ðé ’ÔAØ‚Õ5‹Íkйž %ížÍÖ~†LRÖN5ØÚ‡†-i~ÃBA£·ÄscÍ0KHË‚½É„ý(a8‰WLP*]y›Œ—IkH cCäSd•g©ž)^ξáÏñé••ì!Ó-fõfâà. ~€žc¤¾[°–ÁTÒ»¶‘î¶%pl‰ï,®%ñmW <Ǧå{4]‡–`;.s®Ï=‹ Šô4“†c-¸p)£í˜|fy*iÎ7YX†á~ ÚAx’A_Žs\ók‚íÍœ÷Ú°/#¸°_ÐAPX6Ôä94tFccTk!i4ü¦Í ÓH%HBcÜîíæx®ÃòñYšr±Ÿ??¤×³‰b ßµ˜Ä=DRäWð¶sîm»Œ—N` q#Ûœ_’u5¹RèRQjM^*ÊR“VvCVyšòB‘”вŒÍ0.«4‡¯¿¬Ü ÿð—¸9Õ§ø‘Ê[V/[À_¹Ó-} °èöãÏèõZƒD#+ÉïUŒàØ’¶gTÇ’8–…gIÛÂ’’n#`ÞoÒ) 滤“ŠlB™—ìîfôº®ïâ¸pýJ̸,9¹äÒh;LF.«'ç_ˆY^4:‚ÍËãT±Ü•Í’ ÏÇØRã7Ž'I²€¢Ì¹Ö¸gN"¤$KK†M®4·yàd‡þaÆü‚ÇöV„g \_0ìçôæmCEV*¶£ ;-±«`­k±°àPæiQç9Ç×\&C‹¹å6ÍÅã<;1)2 U"ª$Ê iF”f„iF–d¹"ɹ2Ì—š<7 Vk ai!¿¦€ ¾Ÿ™ ·¦¾ˆ`ÉÏ‘¸¶Àu%#ñ,a¦g¥q„ñì4 »"öŽçâ»mÏÁÏvð-›¥VåžM:¦ÙŒaj<[¢Š‚ƒí’NÏâØ©/mQ2؃ö\Æþ¦@9;}E/¶èÍCv5a÷zB® ÏÂõ`A6)eCV]Áý«M¢IÁPòçК·qò”aá8A’í­ß±(Š’"³žÃÂZÀšMž•ô®§Œ,I˲H³œ°(X?pñŠÂR ®´xi»À÷÷­[ìo^åmk>¸§h—QчŒ“Ï’$¶Åر‰²œ0ËñÜ’,/)]I\)ýqZâ¦%Yiì¬Z=ú\é7ê"d6`=OÕÙš3àƒwºu¯V]ã®tmi|ﮤåX´=‡NàÒözGà:̾ùl[,4|z6 ­.ëÍ÷l¬á¨œ4 )‹”ëç·ÑeÉâ±E¢Ø%Öš(*AÀ=g'ãêµ ­lš Þ’Ç0òXhùØ¡ÒÈÂFy.±%ÙX²s‡A¦MÍ+Ûq !Ì ‹Ks6AÛ"™(<ÏÆšÃž…Tš$+YÙhS‚TXL%ɨ +Z˜k¹lœò…Ù3- d2дÚMF®gI¼ %¥Òä±ÂóB–çr¤µN`;¸Ò2µ„Æ–[J)±,‰++ͳ Eµ^!¥o¬‰Dw ü¦´” ØõfãøwºeŸX¶À‘æð-Aǵq­Êeé:¸¢Òõ+ß}ñiy>m¿IÓ è5š,·éoõ±Ä€4O9ÜK˜$ÖȦ¸0áñ¯™g¼¥ù•_èóð#mlk/\fÉÓ'— ’ÐæGÛ”…fõôq¶^|¥Ú\??a 5;CÉÛ¿hž Ÿ˜Ð]41ˆ£ƒÛµqÜ”3]²TsåùFF9‹Ë.áVF^àºnÁîÖéùœÚ°é.zhe3:œ`9=,+âÒK9£,§X¢T‰kYÌ/ ÜKû˜ËÎN@“ë’¥žEYØl+\÷îi¶KÃvéO1ãI³-bÇAV‹qE©°eŽc Ü̸ÝT1º›t ¦›ç­'á©zWÍÝÕ¢exß“¸– áÚx¶EÛqè¸-סiÛ4]‡vРãù¸R2çl›£ÙÎéÌkš]Mj–N®Ñ›Wl]9ûHËi2Þ·îÅÜ÷p›ç?>æðúµ“²DÓõ-7ší‚C„ppå­bò$çúvÂxâHÉ\ÇfþØAÓ¦»Ôf~U³¸a3ÚWl^Œñ¼œ½ë½¥¥<ξ=àܳc†1k+6‹kyæâYŠV×X ÂrA›‚T­®Æ±§Nù ßwð›‚í«KÇ,´†ùå&‹«]„vy苎“ç k Ta´RVVìr[J”*q„q&x¶…86žmãX¢ ß@€ÆÖZiö³×;ªoü"ðëK*øÇwºEŸ%  ×·%m×¢ã:´=×¶ñm3í{ÚžO×oÒõ¬t8õÐ1(û,Ÿh¢EΕgX–"žäŒö lJ®^‰HFc¶¯òEßv?~w‡Õãmø‹Ûl^˜püÌ2‹ëmšó>mOóГ‹,¯Ùœýö?ÌÉG—˜oiŽ=Þ=aåx‹4ι~Qóî?2O6VŒK6Î̯7(ó’w~ÇøeȹO„8Nëy8¶àøÙ&ª„²´±´baµËÂz‡ÞJ‡pÐ[ôyæ$Nƒ eÑšó¸÷msD£;÷h.¾˜JÖøL#T‘rßã=šs­[øA„×,èïÌãÈm®¿8ÆvaåTÛib` I^HU"¤E)4Z+ ¥J‘j³vP›á]¶0X_Oý;ÝŠÏ\pèx–‰Àà[ÆØu-ËèúÍ. ×§ãÌ÷ÚlÜסі¸.h5aóùCæŽ8²Äktè,:ô·‡\{á*ϢϥçGÜ÷ ‡e5HÂ.>sÀ Ùà $W^’†‚Ñ‹ÏspnÄâ)ÁàJL{užËÑßNp}›í ’FKà5|®™³¸"ñ}›{ç/ ‰ÅvX°6g1¿âŽ\t™‘k‹NOsíJJ8Þ²ŒOZ‚kÛØ–ĶL,~ÃsèmÚÍ6Çî[ÁoH4Ý6ЖK÷±?D˽ÆÁÅC­’dl–ëWÏCZ’jhÙ’Oîäx4Z6Ò†¹ù.“f”dN df3)®“ƒðÒ&•\}>áúå :É•Ežš:Fȱ·œ¤ý®÷°òà2+,±úÄÛXhçíUÖŽ;<ûìv6Aë”$ŒÉ¢ˆ{ßûE¤»Ýù” Û µ°D« ë͹í^IYä¹"hª`e%gyI29,)K(KP7:s’õû ö¤TÄA‘Ä,pû!¶Ü#ðºŒû¥q2!)s"U2ÊRâ,'+Ë*†ÈìG¸2¼ûÀÜé|ŽP*M®!&Ô¡á»4}³ðå{–ãà:>ZeŒvQEŒ;NÙ{f‡dòkÄè.y|ìWúŒ÷v9ØÚ'UšÜ·¸·k‘¥6ï}w—çoBg¡Ça?çøýøÀ!v®ޤ3¯Y>f³¿5mq¸3 +ÇÅWŠPJ.] ™o›à[Çn¢•æü‡žE|ø€¹eÁÞu ÛÉÉS‹¹ÅiA:é'9ãÃʉ'#½¼‰$ÆñR®=;¤(,lGríÅy–bÙšQ¬ l K‚8Ô¼´ –ÎiZ’ÌwYpl&›ƒTã…’ÝËŠ¹Å’ƒm‹QRrÏÉŒÍs1JÁ•g¾âïþYä ?KœEH YYe Rk,aö[jÌN´òómoäkëK᩻Ͱî?µe ³ñIJh¸6M×#°]<ËÂw=&‡Ép—Éá˜ý/sù¹qy¦‘2¢„ ÷C²8C4zÝ6¥ãÓ°ã~Âa,˜ïICMÃ)ÈúŽEÏXŽÏ3WRT¬˜ŸÜûh—­Ë9>Š ‘³w˜b Á\W•6EWv#YNPEÄKׯäcÆã1›W'ô7aÎÜ’ƒ*aw`qñ…1V>âÒ'CT¡xñrAËóü'‡4|¿© Ý–b*â‰"‹¥R̦€¨`'/™o*\!Ô"MÙ¹rÅÌŠ4‚RyÜû–EŠtÂö‡~/r’²,È”Z7(š²T¤yIZh®Žï¾ÀúÊ t·Á²gV][àI‰m[8¶…R [€k»´<9dw+b~aÂæÅ“aÉ$Jh·r·S^<7âpB_iB0Î î[·™ Z]‹N#@«‚râ9/]NÈK“ƒ¬Èks6¶´Ø9€è0f*ÖŽIî}¤ÇÕËM)I•ÃPk¢$cµ!ÑZsn?ã亃•eììEäQJ'DqÉÐ’$cM‘ 6Ö-z=ÁÁ¦âz˜Rô3–滜sz½d÷ZÌÞ0Dz$ó :ϱ­‚öœCÉõëÐ8žÀW°×Ïèçšõ%V°›Jœ’­PÑ „(xñÙ¢ Jžøú÷²i×LÔšI‘fQ–3É ò,'ׯ tù.T,îVp@T¡¶-pm Uš}¶¶ØT–Ð rTzÈóŸ“…šùeI¦<ò¦قøpÈpX2’‚‡ï±q3‰Iaqm¬Èâ‚d‘¤šk×S„œXëg´Âo”<ðö&û—SÒ¸¤XyÁï}*A—%÷Ý0 àséÙ”8¼ó+NsåâIJ±,—•9›²H•Íñ®K?U,¶mÊTZ²?É‘ ”€í!&þþ° ;÷?ðÌ )>Ò ;/‰G)ã°äø=]ã‚A^²Òq)“éøD¹ ×qI TI’æDqIÁB`‘g%ãQaRˆ—Ší¨ÀÕ K/ÏüФÌ$Ò‚Ãý %ÿoöþ4Ú¶,«ï«ÙÝéoïë£ìÈ HÑ%ÙX½H¶%4,†UB%T5 ©dF–­aK¥d£2NpaY%ÉUHÆê%Ó$ B4I$d‘ѽñºÛŸ~·k­ú°ö~gßGD‘$ùò›cÜqÎÝgŸ}v3ç\³ýO FAÒå°”L²“,ç4͘æ%yY’æi^’¾$â\ ÀwÂÎS\CÖÕX<ηô5í|q]× 44›[1·^šzgÙ d7!Ë+F=K ªRÒí$(­Q¢d}7$,#zI‡«÷1KG Tvû]b­èt;¼ï+"Æ’[· [»!½žæS?¡kréC±¥LxòJÌÖZÀ|âû6w,¯Þ1lŒ`oO“•!YiØé†ôÇ/ÙÚ¸²«0UÌ…G&Sï=ó¥ _÷¾€ÛŸÓ96wFLO-‹iÆÅÇ"²yI™9œ„`°ÇA¶dYzÛQTEÉ2/)JCi= EaÜùL„=øå}Ÿ‰çGKèHAx0ªHI:Z……Ötl|>c‰bc]Ó턱”¹cÿÄ ŒCk4q"yÇï¾ÆþK›<CøÂ¯'=°{Áµ§»œÜ5¼íkÖ9z© O¡;\£× BIZXöÖ5þ§ =äâcŠb±¤*-Òh¤´ô†EÅÅ‹=‚ÈRàŒd·±40v8Ø/yäÝ=ö?5g÷jDg¢‚Bv©rËú®a|h™IAžV<ñŽ ÆcÅÖN N0Xï1Ë5Ã^ÂÆ–¦ÊËiÉ'þˆ­ e®È‚íKš­ 1¯½P`­dá`og gw‹œ´ÈXVg,¹ñ¥¹q¤…e™* ·—çPÞ xöAŸÅg@ŽFP€Æ!j¨“Xû¡(Ð »=q—Ž.XtšÅÔ2OZ Ej$Ý$bk7b°‘0¾íÈ—%[—4‡·q/&KùÆ÷²6ŠyìË®b–9;oKp Éî#ÿò=ö?µÏS_Þcï‘ÕT³{­GØñ%ù²`÷±=&G‚ÙeãbB;Æšõ =.Í2¾>ãøÏóèWî1¼¶.l^ñØû6¶FûœÞ˜²ýE¨.‹“SnߘS, Œ1T™Dj…’ŠÁHp|âH§‚tj˜¤–XâÐÄAÉ…GC²4A'{ŒKŽ#7>â“U•ñÌ_”ެððŒ•qž£~€†ÔÛà}Ðgñ’qÞ dmèa ¥pàV ö” ê¸òä‹IÁÖHz,oïB‡~¬ÉK‰–ŽþzÌæÅ˜Ã›0ܺÉ{ÿj½Opõ+Ižþ&¦¿ø÷‘[2þðOóü/žt%½ÑÑÛ®áÊœ `.¼³ÿQ²ìˆøñ߸ø»Gëœ>÷ˤã ãÃeU^°s¹CÒK˜O"NRC•”Nrr+çàÀ"%é&¼üó·YŽgLçô»’Nw„ Ft/Æ,?õw>y‹tRrðñzƒ9YÖ¡ZNI–þÀñêqE–DÊ`Œâ …z0®¨&sh­A‡Ý'®q:ÕZò,YV%EeÈŒ¡²>Vðñ}ŸÉ‰³šúH¥/‰ð(¾Ÿµ#:_°<-YÛÑ,g–Óʸcª¨ÓG‰D„Žå´ò¸ . ¿¼û[ñõqw>Œîö˜þÚ'PÚ’t¡Ì óIÅàÒ9¼€쑽ðÓD¥¦šUù«”Ïÿ,r¸ŽžÜ!éÜ~qÉ4µ8ã¨2Á«7sÆ‹Ü÷"wGó’Q·Ã»ÞÛáú+9wîÌé†Y®Yß0;¶ËŒ=fÿS²Ù §ûZO1•æÇâG/ìsóhÉþxÉ‹G)%IY!¥áÕ™a7räKÆ¢˜Z¶.&ôÖ†l_Ûer:d?[2)RfeÆ,/ÈŠ’´¬(+CUùØU9ÊÒ’8­4W||ô|àíø)ç‚î0–)áãòZÔàW¡öˆYZ›’ÞÚ”à*&‡)q'äøö˜ã,CX‹B’¥š‹kH RtÐ˱|ñÇ™þüáN_B¦9áVÀÉõŠN¿dvj©Ê7O‘‹cfŸz m2¦Ç޵·]àø¯QVëd·¦Tå÷™V¼÷«ºLáöÑ’µÄÉ‚e ×g»f¸æG<œÌ W.ºÃ>—®V¼üJ‰Ë &GK’ž¤Ó]²Wc89²¼öò>³YÉ,3Ü9-Hœc2/é—–×rƒ.,½ÝW[v.9ò¥es¯ƒPt×dçqf³GÙ‚iºd²œ³,KfyAa EüÊJGUZ¥#­ñ‚ÎéfxÀy£µ9¨açÂá!Ä­C;ˤ2\ŽBÖqëvAw´ÅÆàØ—O2Þ÷_Ãþ¿ýU¤´ßq(µà¥eô{ óÓ‹_z•¤qáñ.G¯œÞyޏ²uÍqxݱœký‚åÔ ”¡;а:£é­9‹yÂþG_F*Å´p`*Q²Ã…0PE.È–Y¥|Ý—nP–Û¯X6/’0`|$8™sa;âÊÅñ]m‚éÜr÷H¢ò‹¥¥X–T…EX‡ˆÏŽ+„rË0Dƒ€ÂZ´ ¸|µÃá«%{’ÅT÷KTò6ö™V¹sLò%ËÚìqÖQÖxA•q˜ªÆ ²«牾_‰þ3àyÐgô)h €”~šŠ¥ž˜RZ%ÖZ0Q’w.&$Â!×Ð!ýõœÓ_úî¼l1¶B8ËrºäT+œµ¼:6 ª‚»'Áœ0éqºŸL-'w$ÃõŠùñ’Oþü!—ݵIO¢‚SܾQ‘–»˜G“|‰Â-™ â®ãðÄKˆ1ŸxvεÇ·O Q:›Û—z„‘åú˰³›°œ–LŽ2N³¬`-°œžz=ÇñÔ‹(G‚ýÒñÔÍá‘Gµ>œ¤¥A¿X T‚©bú]†{W¹}rÂQ¶dZ¤,²%‹ÒÇþ'iFZVä•!«CŸEiIK½~ ¨/x¬ôó”h£C×X¼V²øi*Pã^:J!@H*!(LI>1@B&'½Á Sddó%R9:ºÃ|œâÆp¼(1ÓŠõÝñþŒÙrÁñÝÓ´¤ÈKlU¡¤%_fèÀqtÓ¯˜çŒ†iêÐUF7´„‘c1W.Ö×4Ó©/'ØØÝq »Š¤²s¹CºÐNàäÐ’Í—ŒF! >öÂ)³´¤È yi8Ê,Ó©Aï|,"—š'vcta™/a}-@Ë€õõˆª°t Q/xÿ»©äS¼2žr0s2;åp1åh¹äd‘2Í iÎ"-É Gšæ©aRÂIÓÊ#ç‚èÿ_ÍCê‹áqÍD_ üÒƒ>³7I ¶céVä „ :Ú7Ê(3눜¥°;ŸbJÅÆn)JÒ™c¸¡9¾[p\TŒzQ9.]—æˆEA‘f¼z˜2êH°Š W4ù\0:–sÃd’S¥%é¢`°VRå–þNïæˆÒWONs‹(¦X’ÏKòÌ’¥°,Jºè@s`Lf˜å†Óý%¡ÎÑ®b1I¹;I9½½À• mÁâ´bÃÑÄáçŠ]Û‹Èd‡iVb3ÃúHòÈ# 6“XkqÖ’t»¬oõ±»Op}?åÖô€“åŒÓlɲÌ%‡³…gü¬¸ÇôóÌç–……Ãò,>èy€o«£è>^ûŸ7jßl[ÿ•”e)À Edye˜Z‡0†¢ª²‚A yZ.0/UØNŸÝ!‹“¶.„t&%QÇrçÀqúñœ½mAe{W-ùË'–PJŠT¡lî…ŒS:‘a±¬H³’áZ‡ÙiN‘9ŽfŽÍ3Ãî¶d>-0º½€(±¼ôZÊZ((Œäé'#Æ??çö,åÑÉÍ…`r ¸¼eØ?±\Þ øÔ”ýIÉZ¢H¸öx‡'£ˆå¬`1u,sÃátÎÛ¯ n Ê æc0B²¶¡è̇r§,˜LŽÈLIa-iY0Ï N)¥ñÓh–™7y²Üø¬o xZùr”fäÔybþYÏÀ( ßn€×žüï|Ðgø&¨=F×e=å‘¢å5aH:±"¬çh%è+‰”‚N é„½(¤…\Š;¸¤Ë»v·^¸K¶¨p¢@wé\’•%½.L;ËþaEP32BpmSãlàçŽ÷rî8"%Ù»"9ÊÂà¬Ç¬JK§W±˜Be$—UÜzÙ²È Ö‡0=µlì*ª"äè$ež^Xã ÁÌ8"ïÿâ.Q§Ã­ë9³¼¤£-é*¥PaÀîî€|°Çmk™e fyÊ´(É‹’ÊøšÂX_ïŸUT•e™z[^8 “Úäiè¼Í øÑ¡ŸûD þ6¸zØ~5ø¶}†o‚ÄëüI? l„!¨V–8ªáÃZºd¢…ôÀǴbS+ƃ5ëXœ\g1¯PBÐ(ŠR–ýà ¡%¶*îÜ2``´!™N+ˆ#ÁtVP Á(L A¬$ çX»W¯<_P,3ràé§#î¾æ˜”Ž“,g˜[ŽJË㻊›'>ËZ–X2›U¤¦Ö¡ ËÎ@psWGÛëš²t/,3!XÓ‚µHÑé%¨kOq·Ì™d Ò"gœfŒ³‚²ža¬ì”54zž{ÍŸ—–ys §Ÿ&Ñu^à_uWïuâÿ®ÀˆÔx Æð{Ó}ªŸžÞhj\—Ftë×DRC¤{ôˆ(õ|/´¤Û”9Ú÷kE7 è…!ëI—^§ÏÕ8ez4¡*¡š«W5w^3t:!WÞÖa²Èþ«%(ÁѸâ–b:®˜ Œe8é¯Y®_¯ô$Gã‚À9Qrû0c8JèhÉk§)i¹>5Ä@?”Ì ïÑo÷®äÅãŠé¬¢°«É8;]E¢Þ uŠa"ÙÜáº=nE{º˜1NsÒ,+–EIVV䥥(½U•ë¸Çø¹ƒ“ò7ž.yà‡©y<ò+€©@üpQÍPqâ7¤%üÑ}Æ¿}º9À/#íW†@ÖcMë9`R€ÖW4 %‰–ÄZxhÅPÓ CIH'ŠT@„ ˆGI¾œ‘ô$G'‚ÝÍrn²g Ö![–ĉ¦*'§–^"ÈA\á¬ãµƒ‚½%?û )ý@r+38` ÓÊQÏ&äÕŒåüÜ–õ+€IDATá·­‡Ü¬,qåX%O¼#â—žMäéK]®¼í*×'‚kY”9ӿνœ‘ø±5\Òõó3Èæ^ŠÀò ÏþM’ø4Û›9ÁÙÐŒL 媔‚z¢LH:@(I/ôe:Z†A=CL{Ò D)]kt–XH¶„ œOxîú>Öø1C³Òq9¤…ãÊ¥ˆÞpÀ‹¯œÒë†l®YF[1ÿöß™:èÖ­†NI¶×#Òyɵ§/SvûŒ­%-3¦‹%‹¢bž,Ê’ª2¤•½7>¯ì½©¥q˜Ê3~ZÍnZxc†ÿ¨=oëóY~˜ÕŒ`­ 2žù ~jWÖέ È +ýš ;«@›>݊м6ñ# z5ˆU½*Hßf(ï,G$Ð~M¤I •Ä H!)=ÚƒïLó3…µçèT†JûÁÙÝ$b$`Šïf‹•º×`²a,GJ"•!H+?ZÞ:ç§Å×ÝoiQ2ËKÒ¢$­5{QZ²ÊR–~|Ѹ©Y˜7Ïä‚x£ÝïMûùÌøÿ¸Å :ôŠÞø„þõŸG8gaYzpõ¼'…‰†õ—ÿЃ¾’·HoFšmJ¬„¢¯Kˆêj¢N€’õ9íǬÊzꤵ'Î:¤„Ò8¬õ°á²Þ? ¥7­”ð™êš™-}B¯²XãÊÏ: • ¯Ò8R¬ò3ÄŒƒ¢°d¥ÅÔìÒÚ|™ÿúV³ƒú1ÿy`ú†þ!«:·¨6ßÂÀ3¿³`-ˆèߣñv‘ª¿ÔhH!WC³¿qö /éÍ“x ûÝÿ@Û«Cåê|áobT›Q‚•ðÔƒäÉ­gD¿ÙzE鍿xãÓÊ ˜À¤•¬Æ áK9d-”UlФ?ÑimÂd5“§¯SùÙbÔû¿ž˜ÿïâ§ž†ÔãP[ç_µÞ‹®øå@‡«(Pg° éÐ?¥ákô¥­èÓ=׳M_O(Úš¯Éj¾‘ð´‡,·W×c”F‰8VΣh}¡ý}jj¯P÷Ÿ{›©ï͹}ƒ$T{Ÿ×»Þß!ÍOG?X_к ÿ<²z{ˆ÷oÅ?×MüržÉ… ö !$ô†u¼ $õ4ùkŸÒoä€Ýÿðݧù.¼ñdt‰7MHðöÓý~³z¼&Ô÷1ø§cì7C÷O{¿ÿ÷ÞŠ†3‚ô èÿÉJI53‘Uýל®­·j@J_¡´gp]›`eþ4&¯ࣜâG‡¸Nß›>¦òŒŸô¼Æ¬{g8ØúÀÖ;`í1zпè ûmO!vŸyÐ÷ã!ý¢¿ÌªˆS¶¶7¦O³­ O†5Ba%+[ßT`Œï“tÖ›>ÁÐýzè_‚§`÷½0¸RC² Úw8çâ7ã¦=¤‡ôÓUàà5ySÓÓ„:žÉK|¸SKVBІ.’€mùì¯>ò“tÁèýpéK<£_ú2¸üå^ÂÞëžœsl…Pé!}¶é;Yå``eë eÕ)à…Î2¿mý:_z³g¸ám}kýû¤ìWÞW¾ .¾¶ß ƒK¿ñYJí®é³Bÿ9u‚’U²¶Â;¼UýטBoßËz?Sÿ5~€Ã ƒtX÷C éÞ¤‹güµ«ÞÔ¹üå^6žzC­ÿéè¡Yô~³ô'Y1t£Ý›6—ů+û?då /Y%)›ŠP-dÛï@²l(Ø~\üxôàÂû ³éíýÏ®é3¡?ŠQÆm´yYÖTu&õûû›ÖJV °ÆñYùz}6/ÔšCÁÆÓðä7{“çÂû }v®ÆVá!½)ú6Î2zc×7+€®ß笒^ Ô„<[¿)•j’aMÍ[³¾ü¾Ef{®}ì¼Û ÀðÚ½èÎg…Z+ÈCAxH¯GߪQEµ¶·ãögí}]ÿ¥¬âþÍþ +9«?k¯þ»{x[ï½ }L¿Êayäãü¶úM™?ŸŽ ÂCøÃ¬¾ÉØæœ‚vLQá… éZlV‡‚•oИKÍ1tëÍ* ÍÕ¯†xt-H6À™•éó[Äümj Ãïjš¬flœÙfêmí,nÌ*”ÙØÿ†³ù€¦b·í3„x›_³Ê4ý.C²*ôQžr*ò«­@(_¤þ9¢F¾á¾û±‡%¿èðœ-Tk'±š:}8ëoÂ%+Ó§CkJžaµ¸úxÔû–­ãU­ÿ½/!ëàU€)`±ùŽ>Å̯€~ôGg Î9¾óOþÁré7OÏßüàëY1b•¼ÑÞMxS¶öqõ¶Æ$j˜¿±ÿÛ%âš³Ú¿i~i£ñ JVÅpšñ 09l¼ f7aû]>)` ˜rÕ!ÿ¹$gýï~þ¿¿¿rro¹Ÿ¼ø©Ïý=¤·@_¼‡¬¢7힉67ÌÝNX5 ¯6ðtk:îAiökŽUµŽïZû¤¬œa¿šTuz Ÿ‚|àG^â'>r¢!øßBòâ‹/ò]ßõ]üÈüÿõý_3ùKé/}ÖnØ÷|Ï÷ðÍßüÍþøÿÕÅ'üÿÍüÀðóÿñ{øø»ù± ÿâ:ü 3à2Þ†¼lmmðÁ~ð×·ù¬¡w¼ãgþÿîïþî3¯é3§? ü•úï‹X 7hƒ!5*«l­cÅ´í.º&œÙ´5ì=äú7›¢±Q$ð÷ãï;LJñB`ŸâÞvX™I% Ü}±°;¼ÊßúÐ1á½—¿ö/n vù æ[ùÞÿùŸòÿÜÎßùß’?ùŸþ ¾ïÿõý|çw~'ÿìŸý3¾ù›¿ù³ró^|ñEþé?ùÇüÅ·½Àÿ×þ'~wÿݯÁðOwcîß&3àC¿w¹$de"À;ÇãBðÅõ6¿ô¶Á•ü…?ö•|õ÷ü _ôôEþÂýR¾úþyþâúMPÌ(Š‚oþøÿa>ùÉOòMßôMŸ»¸ô¡ýVòÉç”^yåàldí™gžáïþÝ¿{oûëíÓüÿ‘|„÷¼ç=|ÿ÷??ù“?yï³?[ïw(Š‚¿|õ³~Èî/ÿ-^(þð_fÿð?·€¿îc`œâµBŠ—Ú^C´;ú›%³í,µmÎv!õöÿ-e½Ï:==emmí^Ö/üÂ/ð½ßû½üðÿð½0óýûÀªnË9ÇcBð2ð'ð~—sŽ?-?T¿ÿ+BðWã¿‚ÿ³süØýý†oàÿRþ—…àß_üUçø…àLøo‡Cþ[çø/„à—/Á ÉŸþçú»F~ >—?|¸Ñº¾ogõ|›Õàï8ÇÕ àVUR|û·;?øƒ?ȇ>ô!¾î뾎ú¡âß|û·óo†C®Ç|k}ÍÂ}ÎhC~âà"_û®þÊÏøcÿ§ÿŠ?ùÇÿ(õ¯ÿMÞÿþ÷Ó-î°÷è&.^æ?üþ#~ð€Ÿù™Ÿáýïÿ?Û*Yú‰ï¢üG›O= ¯>·$ê½?õSü7ßõ]<òì³¼ü~ŸüŽïà¿ø©Ÿâ/}Í× Ÿy†ígŸåøcü ÿ;¾[o;þÄ?È¿üŽï`þÌ3DÏ>Ëì™gHêÏÏ<ƒ~öYŠgž!xöY€gžA<û,?ƒ÷þÚ_ûkšo5•– 3xÍz?\N“<o×wðÙÖ.Ü35Ú ªŒUÄ¥1‘šø}‰Wj)«HMÓ¿;¯÷m;¿ù¥—øéŸþi~îÛ¿ý×)?êßü!çøÑýQþ×oüÆ{ßmÎÝ_ø½ßËw}×wÝc~áþµ;ôy€x份º»þµ· ›ïðÛ»;þÿ·² søð÷Ãý߸ó pûe¸ñ<ÜÆ›3¼†ÏYÕvà}õös6=Þv–Û°Ñþ¶õyPß\8h§Â›$KCºµ/À¿ølrÙç5×{ˆ¬ÂŒóÙØÜ 5•”M‰Á=H<³Z¼tðMƒíï5Í(Eý—×ÇŽX šiý^ó<›Rçæ8°Âø•sÜDsÚLpøÑû̻DŽà}¬VŽæü„ûë]G<‚áU_õYÌ}=Ððš×ÜOùf˜‹ï{ówÚVpýCðcžâ—žçåyÆ?:‚#¼Í¾Ä3Ãô4X°ªl¿¹A̓kGšÚܸ¦^¤¹yMh¬Ý0ÑÜÈ&™ÒN½7cXU¶5aüë·Â}¿Åô¥À%Ά±QÍ} Yiìæš›Nªvd¥­]Û+@£`šŠÌF¨†õç g™³1Km+kV‚FšÈMÂĵþo?£v©CÕÚ¿ít7ür6«9ñ×jd¸æàMØ©â,°Ps#ŠÖ6KfÎY­ÜÜä¶d77®lmk3k³L6ŒÚ\x;»×¬Í÷JÎ&<Ú1ߢõ½v”lýfI€³¡4Ûz/îû¬)l´Xîs¬V¶ö©ZNj̛§?Ùº¾¶Ö êcwëßïá£1C ÑVþú'­ûÝwŒæÿ&îÞfŒ6¬HóY»~¦ ú^™åø}Zÿ5¾[óû‹ú{ ¸`{µožQóL>hø6×Ð^Ášg£ñÂ×”@7Úþ¾l½¯ð`¹÷¤;¬7œ•NÁÙÒÒFòš’Ò¶ö½_ÐÚ®[ß§õ¬´|ûøm©oê=Ú‚ÖÔ‹T­ókk‹æÂ›ï´oÄ= À*©ÒÛý…ÍMk˜ 9ï†ñ«œë¿ó|þÝõuH¼$5¨Yc^´ïE£µÆjþo3øë=‹öõ‡5V›‰¤€¹ó ¾`Åð5J ¼ ÀÊj”Vû5\rÖôu­ÏÛ<Ððo³bg­ímeÖ^9šçgÝ8:M#1õÚ…ÐömV„6#47¨œkÇw›¦¶cgµjÛ¤i„¯¹àör&[¿Ý^Æ,ZûÜCfµR5çÙþͶVy½?Zš>Æçý:·½‚¿ ¬qV!iVæ62BsOÛרhÍ FlÐlé'¬T…‡X/ÜŠ)+¼´mû¶3ÜðQ#œm¥e8«ðîÏþ¶^Ïoh[*õrÖâhîAƒ ×$æî™1 –Jû‡álõ];C×hù6ã´µx‡³«õï´L£‰MëûmgK·Î­¹‰í%ó~¥mr¸Öï´¶í34>Dóô}ßý|bø7Cßõ:Û¾—ÕŠÝ8®íB´†‰šÕ¾!¥ÏVÂ( E¹B ÌÓ³¿Ý¼Ò6•ÛBИ9÷W€ªÖkCíHœTѺÙzmïßðU»r´1ÿšóÓíª9ÅYDZm–­›·ŽwdÄ]X1e³”­ï·#4}VÁæDÕ}Ǹß­Ïڽ͹6B[Ü÷½¶VkL´¶°Þt«ðQ§ßnô[0´ÍŠ{f°8‹£„~šb™{¸B:÷ÛK ñš¿æÞ7>Z#¹ÚnXo‚Mô­éh0=%×6µþhÇ"kJ-š}ÛqÛ¬º×PÓ0OÛfj×µÚÃ3³|6Ì;bUs³JY·—«æfÜoK7dÛïhkˆ•@µÿo„ í„7û4¦Òýñàæ;í0êoG¦#ú3­÷ÿ«U¯1wdmò4!R{æÒ#hëÀ§Í'þy/Y™Mò²­pšç g}³ûƒíšžfÅnÊ=‰/Yp6ùÙðíë·ýȈ³¥ÍÊ¥f”œÜˆûИ:@´°9áf©é²Zªše±ñt넚ï5õ#ÍñÉo´};²ÒœÛýæYcþ´oh1¬½<~¾ÙòŠÚCOþI}ƒ!pve÷ £MÏô d~Á8_ao6É«Fi6 «Ñ·¬LàvàÁÞw^P¶#€ÏásCW€aÅwmÓ©±Zš£AÊ8[Ô©ÏK·K ©Z CEœ…•nœ§öêsVŠ“¨m´w;âÒÞÖ–ÐF(ÛæRÛionªá¬™ÕìÓ\Sû:2þëÓïky•?½æ\Ùr~g§Þö/2ÿÙ¬ô<ÐÎÚ6Ú¿¹ï+ah¯à¯—gõó÷ºµàløõßøpï)gCÄ÷†º°R¤a}N!g-„vß°V­/¶Ãí^ÊÆ4jZÒÚáOÉY“¦‰Sßúl´|Ö:fÛoPõgÍ5Œßà9Võç²µý~Ç©üjnt³Ê<û[ÎB¿}è«ïú×Õõ°™Æx“¨,ü{S­˜ºY¡í›áŸCó¼ÛÕ¡°âµÆ¸?ôݼoXußgMMPÃôÍövBV>H jG–kEQ @¸?û«0RÈYil¶eœõs¤¬Fx†¬œ×vÄ¥¨{É*јLÍ*Óhƒ&ÌÚvÖÛšþþXÿ¿ÿœ°Ëo_ú¦:¸ÿôk·Þ^:ÏØ3ü½nœ`8«€Ú ©1k'ø~[¼Í Í³o¼)•v­}¯ÝýÕ®hö/ï;§û#Mº'ü”öï% 8›dh~P¶2`%@mD®Æ n_@# °†ûÜæÄÛ>E“nnš`a°­slöý÷œE {H¿9jfÃýc©óJ¯Éä6!Ђ•"jÇÿ‹Ö¬”^ãã5<Ñε³¼í•~½uÒðX;òÓ|Ö®-¢þŒ³–‡cP•÷ø•†e¾ª·¾ÿ Ы³Í¸!ýÜÕ&3ÚØ|ýÈ‚+‹•™¸³I¬ûíÂÞ¦l#4ўƶkLšvìºYN?‚Oÿ?¤ßúýõÃú۬귷1]-ߘD9g#Aâƒ×¯ïjgyÛ5_í’¶Ó|­œM–µóZßð´tƒ(||·!SùH€µ j”¢fB]/5u´ ˆ!_BRÇËÂzܪ±Þf ¿=Š ­×Ê&Ð8Qíâ³Fª›N¡¶d·íÍæ~ xíAsÇï úsõëw³„&ÉÕnBo;Èí¤iÛo3ýýæJ»ýQï u·3Àâ¾ãÒÚ.[çÁ}ç!~æ‚?^‘Õ™¾Ü3t{hOŠÏô°Š8ëcÃÖyF/r,)¹7µJÖ«cn%Êë›Ö8QíBãL5I¶æõ{ÐÜðø6V«@c5~Áœ³¹jã4ÚºÙ~¼–óÃY¦¾?azà~¨•æ<Vü$~ñ \žÖs¬OzX Ë™gиë™Ze£ø8p;UÞ|fªÕÄɪôÿ7û5S'«Ò‡Ò„\ „qg;ÀšÔySO«¤KŽ×ú¿ô ŸüC:C¿Ï`3ÎF‰íÞfÐûËÚŒÚDhÚ¶{ÛìiœÝ6&h;ÓßD~špøýÓîoÐgЪ6ƒFÖa TA·ß¢®ÜTÅ+-¾>$ˆ`1ñ+C3–VÙEøðZžúLUáûqŽîžM\5NV[€ëøžÓ‡ôùGÿøZVÏ«©ájkï†ñÚIÊ6ó·ûÚˆÏM(¼¸­Z¯ S·M¡&ˆÓP;ÑÛø–â“_‚ Bï¬6N°2QÚNl‘ו€¥ßÆžy•öLÝø¬!øcfËÕöÆÙnFÕçéJ€šï5µåsV«Âøú ?¤7Mïf•k¨]‘Ù®Ùi~±åýÍ7íP©iíÛ6§Ú‰ÏÆ·l¯6íÂ8qû÷àŠ¼Öæ‰ÇÃj€â„ôš¿ÌW¦«Í£†aÃh•Q”òŸ5Â+ªÈVcVG[H¿_Y¬„o¶XEæøeô¿|ÐOô!½ezš³áí6Hœ s¶W€¶Ön3x»g¥1›î 8+Í÷ï/·¸®Wú³ Ùhm¥![ø³¥gP!½ydªÕw”ø•Á:veú8ëÇ®ÂÊìi„%Œ|tH‡>š^˜:¸ÜKïŸá!Wz®~}¼~mGøÚIˆY~}ånüMˆ½]Úî"kÓýÝbí0i»?ê<€Tž ¯C¿-WZ=îz‡5]x[ßÔ™¦"_•ÎÊZ8ÒEm…+Éÿ˜Ÿ.VMRx,^Sy ›ƒ«ëÍoÊCúm@/â… ÝWÒÎÜ·ËáÛÕ¼m¨›¦¬¦l}~·XÕ:V»¯¡ÝKÒGcRù† QÇ3A–úmIwż½‘7aÒ…O‡ç©Õ.¶¶ã›ÿóGÖfTÍ KÒ]ÙÿM·QUט(µ ¿~ÃÃŒÖo+zà×6WîïwngƒÛÌ Þ$n'°j;ÆíS;_ÐäÚÎs{V€w^ÿi¹€¸~o+»õž!$CH,ع¯LžyóŒl*Ïܽáê3¡½pU…ß^^Hšpèrê£ÉA8 _wô ×Cú­ ¬Ì¡6QÃè sßï̶Ývæý!ÕvÿoÛOh£_4ѧ{ÕÌRÕ±ÿd‚.÷Ö&I½WŸUŠ/Áp ú§>jÓäÛ>_ú¨RžÉ•ò>¯ýФç}ŠÆŒê¯ù÷ïýäƒ~Dé·š^¬_¯²Òøí·vù}á¯)µo÷Ÿ´¦á¬oІqiû“Ý[7É®<­¡>ÖX‰É«XVƒ€*P1èÙ9fûU£Ó_™G.^ CÃäó äõoe3oû7­wéÞ÷Òƒ~4ésI7ð@Ç÷œÅøw³4¶{[»7É­vH[Ë·MfŽðý øMiƽ~ÛŽ…@y<Ð$óÃòª¬>zý*5D]Ø«¦9ÁÄÛ÷åšO‚M޽æoŽ;ÜXE’ÚŽ±µ™ÿw*Ý嬿oœÓ&ZÔ8Í)«~”Š.S³ÖΆ_álcU—Vyö­¸¤B€ìÔ[û¬ Á3»Žýk•yô¸°ç·Moú÷Ù&‹{…ávîW„láà¦F([x¦oB¢ïùèƒ~ éAÓUÎöz4LÝg¶‡f´›¦Ú ²û[,›œA£åÛ+õ1ô½Bµ.gcSéÄ3vØó¡E]Û§âØ­­V‚0º½ÌO™±22t¥/£ÈRR5•wžOöýëC›ÿ!7‡á×·J¶ûÚ-¯¹Ót¶Û"ÛÍ1¿gCªgòM¡Z:ñ"•ؤGžùû—¼¤Gžá{;^ãÛÊ Dg²‰ÿíq¿J¨»  !>†É¾·ùuà§Ò?ùïômHŸOô >BÔD‡Úè$mD¸¦¾§ñ ÚÈ€írˆv¾¡i«Í8› 3€(þ4.ˆð=‹ ¾È¾Y²Éãövüü`[ùy'ϯpþ›•¡Êü|a[ùVû*÷Ÿ?çM#€&·`ôyHéu©Y Ú¸B1žÁSV¶Ãüí ÍYozÓ›i;|¯/¹j R|”§ y‚7mÒ#Ïäû¿º‚Eß~·w«Ì ˆ­<ïÂÖ;ü~£«~eèíÂÚè‡Ìÿ>=½ÂÙ’‰¦ ´×ÏY$ÀŠÑÛ¦RÛîo Icb5“ã¥i×”6Ýqê\Ö©ôØ›>ó}˜Üð0ê;ïö浉²ö˜g|[ÁÆÓ~¾ÀòØÃ«_|9âa9çCztƒ__/”²ŠÎ7ئm$ˆ˜U…iÃÎ÷Cg6à3™`U#¬Yi÷ÆÌÉÆ~‡¸òŒ}üœ7:›>,ÚÝñ¯AÏ¿&›pü¼g~[ÁéKˆïyзõ!'j²Æ%gQÊp­û±foÛk¨1—ç· Ü ›VÅ{E÷ý¡gúx乜×y€Ü›Bö¦ßôügýK~u°•ÿëîÀáÇ}X)ÙôÌÿ§?ü ïçC:‡ô">OÐdÛŒÞ 8i„£ ˜ +Ó§Ám¨É14~„uó{Ùx³É*Ú“yFzÞžŸÝòf­Î¾W±gü­wxaé핯‚rŽøýÿ냾éÓËÀ&gMžv×W» )—nü€&¯Ð|§(£ÙžþgÞiŽûxQéâ}ðæŽÔ^‚º*®IˆµµþÖ;<ß¾äæÃkpú"â]üAß¿‡ôÛ„.±bæöœ Xiõ65Í3ÍëýåÑÍ÷eA<Ä£…ÞÃÖ^«7±~[Ábßý4Žn6^…@³ ¼ös« ±­2ÿCú¬ÒmÎâ~¶#>MoS&+§¸ýv!]cN­ åV%à5½«ük6^ ECÝ]ï'Tuö÷ÉtøqÄ•¯xÐ÷ë!ý6#‹ŸþØÄù›U ÝøÞÌh7Ç7~A9j§™#]Û-n(ù× ®ñ {^»Ïnz»_jÏì*öNp³­XÀÍŸ{Ð÷ê!ý6¥ûá1ÛÈämHĆéÛNs“îjC¢ ­ºøØØíú0fgÓ-Ù€|²r„]å?Ï&Þnjj‚½ÐL®#þøO>èûô~ÓóÀcõû¶óÛT„ÂÙéDm˜ûG2òž­á™;yÆn ƒ¢áê×U¼ú_j8ú8,îÞËœ5ƒÚóã|oAÐ:Bcú4q©}*^5ëºô9®µ~P—GëÈ&ê„Ùâ'éw­ú}“åmÆø6“…äˆöDÐûÁ¸ä™€*ƒ| ùÔ3x²±ŠöD#š%µ_ê°<¤ßÁ4fÙiúj|„¶…ßžEã\Qª÷tÊÔ ƒŽ ZB:†¨îüZž@²Rñ+ùÕ}ýéw8óëp·qG›Phc"5ù€Ua\AggUÞO¡\Bv¦ô°m2XA»%pô<ïý+ÊÒƒ§O±ª mþÚ“î•Û~¯‘¤‡>¡%µgtg ¢뎯z{°<@ü¡ô ¯û3&ñi>sobŸ·ò;Rx¼T÷|_гça>“ƒàÇY9üy4רîœz³×qÿ9(qö˜’føÄV;SÜÀ£´ýƒûQ¢5ñÈïVå~†QCÑpå [ãÞñœåûþáƒmè}3¯a<%~=ã´íÀ×ûÎg‹ÚଟN +&5t½sGù÷U뜌óC Í}Û`5·íõ¥ù ãΞ˛¹—Ž7>ùi~ósI×wrv„oƒ Ô†Ooã“úHQÐõ¥ÌÙ)¨Ð3}8ð_‰‡^Ê…‡Š5_çÏÿЃ¯ïoâÝ÷†‘Ûæ­h½Ï”Úw?Ã5Œ­ZL­ õêÜ2ë™*Éúa¶NºtŠrjÎ Æý×úf¶ºû÷fè~Á{Ðt±ÒžÚÆj"Bm(M>õÎo¼îBuâß›Ì ‚ªaWA¹ä¿ø_xÐ×yÞÌÃk#À§×ÄŸ íßhp‡í)˜Ï$£:w¯¤Ÿ¦YÕZ=’þ{‰-Ö9?¯¡¤Êy„½a-D•óÇ/oåÚ á3QŸ/ŒßÐ1p…ULÓÐ<ÿfBd{ªF*°%3ïü.yAø„˜PPL}ÿüÿãOÜzÐ×ù†&Ìí{ïbÅoíRÝ0DWyÆ—¢†VUõHW ‘ð d 3'¡¼gK뼩¢Q(ý¹[°Öa¬ó¦ˆuÈÒÔsë«r°hexî¿Î72~£•ôÓу6{^ž¾‚£·‡®7+BÛ/о¦_Ôƒ߯cè_öO*;… ¦@ü‘Ïé\oF[µì=áÏÂk´Š-ÜzáÇÄfÚ3ù ¾ûJpã $Z‰{àJ „ðؘÎc¥J%¤ßÏÔà”ÖQ„ÃKhV×VÖ«m =o_óotím…òyÈ×o‰ÎÎVœeþ6lŠæp j ] -oM_óþ€)½ý¿û…°ÿ‘}]÷èÍ< ·ÍQ-f~#áxS¥Ñ$]¹ZU´çq†Úkn èÄ)E-,~%R ´)<ƒ;)êÊ B¨Õê<œ£2–Ò9´@ c) pÎ2z™`C@^¯ yoMðßj„èó‘~ ø}¬°CïŸ@ß`9@›Ó:Ô_X¨<Ó'ë>Ö_Ì}2l~ûÜd|ï·kaåŒÞÿÚhïHúmXi÷ÂúmºÞV:¯å©Öïáß @HA I¬Hjm/Á3>^;GJÔL¿ú±@)¬s(é+S´V«¹XΑ%AVV¤´•Hapx‘…Å:ç°ñçäðà€¥ñ«|~š-¿Ôäg·ñš:¡{Cô&Ç~Ùíô!,¨Ÿž\÷{$pð±}=oŠÚOû97LÔÌÞ|Ö­™XËÚ!~? Tõ\c%V+ƒ®íw'JxÆ–UÿuBI'R„JH‰þsçF`¥ðHJ´V8ªž<(´DÔ’Kh¬µZ3•ù=G;‚²²uZ§¨¬7·Xåþ:RãW‹FÞ(ìÛÞt^WƒüIÎΨð¿M‚,ôôx5ÄÎZýCoÖÆ¾NhÄ~þJÚ¦OÃÔ±lik<©ûþ)PµÇèa3<£ç•DàB „Jâ„JjÏä‘–$JÑ‹B¥ˆ”DKI BHB!(Œa ˜ Á¶Vœ*åWJ)1õÙ[!È«’²2k™•%¡”ÖJAšW… ÐŽÂ8?àP9œuÞ^ètéH „ ÓÊ so|ïÚÁƒóJ1+ø”{&~hfhSyófE‚Z‚çÈË7`~ãA_Ç›¢7 s6fLWAؘ9bÅüºfp­¼ö–Òÿh‰’«Ð¢’µí.Å=R-‘R+IhzZiÅ ØÕŠDxs§ß•¨ $›çH%)sËpCpz$¸Öw~Lm7DjM^„LòŠ¥,?ƒ67#­˜YQ0P’Q«’Ô8²ÂÛ8Z׎^­ÝËÊGÀCéÈÌÊ_™™7N˜Ý=¯«Àÿ|7Þ¨Gב”Q €µ­Ö¸y]ò³âo?èËxs$ê~²~£ ”gü¸M6ñw¥¼ÖÖÊk})D½ ´’$@Héís!ÐRK/AR´ E¢5Z)Öµ¢'»]âŽõÆ]T†la8l­Åœ¦„ãø.Ä…5šã¹áBgA±P,§PÒ•Æ NäU¡‡ò° —e,•äWLH–Ìu…*½_ÐD¨ ã(+/ÌyiÑÆQ”ÖG‹ðùûBpï7.}ÔÀ¢4‚\ÇÜØ€Â E ”tSŠDI*çH´"‘!=)ÐZ{:à±­“£é2£Lg¤3A!%£Žô÷5·ô´#_ŒÙ½œ€Ë9¸Uac¶Ö`ª‚åÔSY0=ö¨Åý5MT\(ʪO®5)sÞh^ÎrNËŠae)Œ¡PU†ÜXò²¢ÔY i)¨œÁâûÔ¼¥[îáoU3LÓoHƇ6qý5?£w°æ7êÀOvÜø‘}úožš‚­F»TËÆÇ Dx=”¢Ñê#5J@ ZI””DJiE 5a éiEhÐQŠØ’­¸‹-NI:Ð… Š IŽï:úC•Jx‚ããœXW(åJr<@ Ò°–á@0W ZZ²JÐë(¬uH)©Ð\}L±˜FŒ¶^Ø)Ë›§¼PU”ÆR˲ªHËŠ¬2”eÅ¢0XçX¤†yj˜޹…£â­3óyaþ†¾½~ÍXÁ(6­‘ºÌáôÀï …Ç Â/=/Ôh¥Xz;?l´}mãGZxÛ]BJdíì†R ´ %¡VÄ®VI?ŽH´" CºaL_*c¸Ü (ÓS’[ÙЂPIâPjéÕRê:j£¼I é…ý(`… â˜nÓ c¶Ã˜'¶-ÂqóÎYÆG9‡w ö.DÜ9-u‹Âò®÷t(¦ÞåŠÁ4ul®‡tz–ãÇå'4Å$G¹JCUIlmÃÁÌ2Ï,ËeÁZOPKÁv/æhf¥#Ö~9N%²(‘ʰ˜BU v¯Z¢,c¯ÛljÑ%‘’8)É+ÎQVgyé¥/»îkÿ—ÈU6œezÓÊ-4Ôö½>Ÿé]œm–¡ùÿ÷ÀÞ&*J°9¤3øá}Æ¿ ¼­¿ÔŽ.µ/¡£…¯»©Ã™amëGR ”$ªÝP+"­èEI0ŠCâ  wèÅ.G {IÂztÊáÍ1Ešs:¯pÆ!-t­ /Âí[†Xù2«¸+ŸŽs¸´%) Áщa4rœ¤yIU–DÁ¤Tt„áèÇ0Î|ÔbQÀ°§N2XtBµŽ ”!ô"ÍlV‘t*²T³¾­°ÆQ¤0§\XWôé°@ ¥BJAU c©Œ¡¬jÅ¡½PÐÑ‚Žö+d\íÅõýŒÔ [³"=Oñ¯_Ì* Ú橧 h<ã¦kþ[>Ó_ùQsã×kæ¿gïK_F¬” ŽA ˆjs' }F6R‚X+Bí3µI $Ã( ©mýAÜe­3àʶÂå§Üš3Ú„ë¯eôlï NÆ–0™/ãcÃÚX$J KiƒÈଠË}Œ¾H¡ÓS$½.óÓŒã©ãâ–F %-㋱ŽQG"”f^B?’8i.Xf–=ÅÝe yE@U”¤0êj–K‰5)q·ÂåSÖô€Liœ¦¢¬**gQ8:±"‰A ‰I ýŸV‚ ö§´XeÉEmÙ7xŸïô%¬šc$ ÝxÆi½Óy0ý›Òâ°®ÂTµ)$¥@8êÎHÿ@ãFûK>Êjí£=a@7Ð$aD/Œ È­¸ÃÞ(ãðÆ)Ze Ö$ËÙS”¨®æ•ë%_ø»6˜§HpðšÅYA§c™/X’hÁ2ó‰ÅáFÄþ’Ó¬"?´ zŽÔ)¶×Ž+–EA z! bEU "Vkœƒñ„Hî¾j‰tÅ`3áÕWæPUÒqt '•ä˾°Ç— ŽïZ„,§¯pecÀ+ш~’çÊ:Ê0¤´–ÊÚºÜÚGŠÊQG^ ªÊ!K‹2nURì|¶qçÇþo¨©µxž7€úà÷wËüøƒ>Ó7A_š“:|éËŒºÑbµã›hAH_–hB) µ¢h´TtBM?ŽèÅ’(f/ŒYï–Ì÷q6c>-™ždDI@¶´T¥aÐÓ,§–ÅRSæ‚Ñ&œL‹J ‡5SNrA¶´ÜÚO lÅÞŽ¦ß—N[kë®0tI§ãèáðȱtŠaW ôz“Yœƒ@:ªÒ‘WŽÙ´ öÇ–X9ó’ÌN,e%I—%ÓÓZ¬èµ‘/×5@šnš¤ûjÝdÃe9ó‰5…-V…€ ÌÈy¡_ÞÇYp]-X!èVÀÿõAŸå› ¦¤5 ë:)®.Óu=O\ E“ÔŠ”$T t‚€°v‚;AÄ¥ $ "dyB:Yr|7#/,IbˆbEo䨾ñsÿnÌAd‰bÅ¥Ç#žûå)ÝÈ1܈;Ž>gØJ.u¦t·+*‡·+ ÒOBNœæŽ kŠ,µ ¯¼âÐàñkppðèc‚»7 ãØZ–3C**#Y%“LHÇéÜrêÅ‚^ÏrùJD¶€ÙtiÈ–)kë ë&g}´ÉílIY•غhi*æyÌ oÛ[Öàœ'õê*K‹®Ü½‚:YWÍ6½çó§IŒé¦3†Öëy žöšH©•à €shá™_Õ™Þ@x»¿£5±VRh…RŠ$ŒèG I˜PÌ÷É Žǹ¡/‡cC?,?e˜Ǩ³(Jª‰! 2Ž9GHA7|âNÅ ±’œ”è² , ý5M:µœf†²JYd9'X%K(Õ¢HÒ³G,+n<ï‚€JX²¥à´r ¥÷¤RŒÃÂ,Ù„Ä•%®,S㸵¿¤#ÝHÇ– ²÷HLºì2 œ’[ƒ’¼*ò¥¯"µi/­®£k©pÈ ¤t)ÂâJï”Öû s~ á÷:Q}Ej?ñ ÏðM.Æ‚(T„k¡$j;¿.l‹µ¨ÃœšXJ:Q@¬ý($Òš~Ô! c.÷ú83ÇYÉÚNDUd "ÁÆžåîÝ’^¥•¬÷W._é Nqi'áæÔr!Ö‘DY eż´ ëk’EêW£R@`O½3`6 éj¡b}M‚Ô”…|T§72SƒÐ %»W$äÊŘÀ8*©¹´Ó¡£ÂPc».oô9ÉK–ÎAê˜ÎsÆl™rõb„÷uàmÿª@8{¯ˆ®±÷}§ZSý*ÐÚgÐEݾÖ8ÃJÀÒ~†ósL?|5^ú€úÊÚÀ_~Ðg÷&I[¡7â@>ÔÙÕŠ$T„JÒÕ’PI¢º:³[—(÷âˆNàÿ¶’NŸaR¡uŽ©ãý)U)é¯)N÷ÒdiI·#é‚@(G–ÂÂj6ºšÉ´ØÝ XN ⎠é,sH¤KtŽ x|O“‡w,JJžxOÀcO÷¸sCÐï ©ÃHÁµÇ%{W×?UÒ놸(á8«È&ŽáH192L¦%[£ˆ¤Ÿ DÀpSáL€´ŽEiÐίFKyeyü1ÉøDâ*Ë£O (Š8ƒ¬«ç¤X9»%ž)´ƒ¯ŠSµIY´BA¯ýÏ‹üü º.vžÌŸ¦îG°ªi÷!;A¤ýZ¦¤¤£$‘”$&A7ˆè„£ ¦“ôØÙ3ÌN,³Ó g¦H‘³{mƒƒÛ**YÌO°ILÜ5ØÊb*86†‰ÐqÀÖ@c]Ìkã´`{»äæË•‡ðÆäókýÈprì…!FZóêó0ØH)¤¦œ[:F*ÃÑ­’,ÓË&ŠË#p.&ÄpënÅ0Ä¡¤ªÛ—Kn¿â¬#ÔŠe–óÄ¥ã1L–]eXïÌÆ’mCž–ÜyéˆõMUu1¦¢ªJLURÈ’P+úÖ²tŽ<ð÷V ãe% $Ô¦RåÀÊÏä)>Xþiz†Õ·V€û ÏìM’¶¢&âãkyº¡F׉­Xû ÎÆîÄ!ÃN‡n+Í0éÑ B}{Är²3ãðæ”Ùé’ Rœîç 7Bº}Áb̨b]L™§LŽ2¤ƒq³Õ‹ÉlÄö^BôØÙPìl–d‹”ã TÎñäÓnÀxæP¥Xß qØ0æÂ•€ñ`8€"µhmYæ‚»ó‚D8 븺i°6f´V⌢×ëQæ•G%ãKçì¿–Ë`àM·"ŒÄ•³T œd2v ×5³ãœ|±$ìmâpà,YURT¥o¨±)e]Fìý+U—†So3¾a\}æÏósM¾‰Ö˜¥ŠóÎp/YÔ¡N­$±”è@“Ôµû­<* ­¡ùPçF·Ck„€ÓýŒÅiÆÖ¥Ÿz>#úƒ˜Ñ–f°ÕãÎ+w™œ,xæk†¤sÉ+;e^IÖªŒÁzBœ¸t-`~j¨2Ãb6"³'­8=)»$ªâ±w%\ÿDA”ÄÜ™KÞñ˜&é÷ ‚%w_M9±°«5ƒ®`i °™/yùµ‚·?]’Í¡;Ôl^ÔŒ"’ž ‡LSö ©Vè²b1qXcHbAõ™Ísœ)qHŽOàêãkÌÇÛk‡Ó=?4œ5HRŒsÈÊPiåñ‰„ÀZK¤,V{¤Š8’8ç(?›pzŸ#:3gÌóAŸÑ[ v«b }}OЄ;ëªN-¥ï¹­M#!ÚYúq)»ت$ˆBº£„ rHAríñA$Èf'\}zÀ§~-¥HDIDn5ƒ^Ähr|{†©J¶/Lîìsp»Ãñ­ ƒõŽåî²…`÷Ñ!q'ÃÚ‹…t×úì\sóSy¶ÄTk[c5Z ¬5Äe3LòžwoòÜ'NÙÝ9>„IBžYÂx .e´3´–²ˆ¹³_Ñï—˜Òa«”¤"ÌSÅB*v{š‹On ;è8D‡›[ ìÝ„aRaMEi ]çPJ"*IVzøVN_6SàœÄ8¨GìšB‰óE ¨ˆóDŠcGKߘîœïæªíüXk:JÒ‰Bú.äKÆH¥é—ß¶-SŠ´@)Ãcï’ô$룄G‘U›°˜õØ¿Q2ÚìóÑ_šsëÅ%×ë@Uu {è ¦È(rXNf\~2b9“줋©qWÒ@öè­Å$œùDbŒ¡ÈRîÜÈ8¼5§ÓI‘#ŒàæÂp÷µ”ÞHs÷Õ™ÄdsÁ…‹–ÝË3¢²¹@‡)-ÙR3ÚÙ`­ÑéǤsÂ/Ëïèòø•![W"Ò¬‡V;Ww^®ÐÚ°¾5b˜ èE ý "Žb­}y¸’ô¢€nÔ…¦‰( |¿óy£f¶°z|@ãÃCç…àR_‘ÔUžP“„‘ò H)b%éjMG‡tŸéu‡ 7Öé$czk]LyJÒ•’g³ãU^°˜¤<õåëd3¸úö˜ýÊEY²¶sx'¥ÓÙ©%[LØ5çÖ+{Dt!ƒÝˆn?$=©Xä†ÐYÿ¢.RHåPÊWÜÜX²yæc‹V’éiA[®¿¼$æä…ãîØòÈË´ì1›/Ñ¶äÆ­”»/çtºk ³S©O~õ-º8ãpÖP•†Â(ö®)f' k$ý5ÁáMCÆ‚,íÑ(.Ñ; uI:–`+T"…Ä9ƒÀ7âHå;ጃ¢2TÖW”–ÆaŒãNz¾V€ßM=CìwÁðùƒøùSìu}9s$I­¡B¥M Ô=³(Ñ!Ý(¡D¬m¬³{U‘Î8'™XöoÌ1•%Lb–ã9ãiN‹¿¸ÏÚvÁpkƒÅaÊ|œñÈÛ"¢.<6`ç’âÆ —ëñö÷í±ãˆÉ‘$_¼öÜi®\Ž™ž–„:ã•M‰“ˆÞZÄñXÎr”ö¸aXÑÜ:””±,sÃB@zdFý¨K·'1Æ#Ḩ–é¸`Y8’–‡q7&[Zf‡1‚¢´$q„ ºä™FÊ’ñÁ”ªLO v1tׯ&†°7B ±¹¦ªÊ:7à@(´’ •µ”Æ`­o¨©j°n/Ï—ü8ðµ€ú2ø@üòƒ>£·@ /½H‘„š¸)q4‰ò°$’¢Iˆ…t“.{׆D‰%Y+ÜøÄ”+o¿ˆ9agÈhg@v:¡qÎñòk·>~Š© N$yºD*Ew9¼9f>‘ï§¾š2ÚÞ¥È$=M·ç¸úÎ\D:+™œÎ.Ï0Õ% zC³’åT0ÚŒÈ3‡ÈáÂnÀkG ãt61N—½ky ®„LŠˆPIlrq[Qäk*ÂHÅ– p„qH–¶v#¬ëÓ_lö0EÊ•·­±}¹O™ ªÒ’ ºc–)E®(—9‹Þù•BP:‡1•/§vš±r–Ê8ªÊ;øð¸oü­}&o‘šºt'ð¸;a€¨£>Búº &4 t@ =¦f% û1¹›0ÚRiF¾” 6§”ň˛l]T¼ôì>k®¤·–ðò'Æ|áû»Œ>úáSÂë”ÆÒ q$™§tú[ä G™¥ÌN-‡·RNgŽ‹{!E± fã‚£ÃÃÅGºƒIOqrdètCÞñ¥=Ps>ù¼d#Ö\¼œÐßF’|iؾS–1›½Š~ßu›— L3þÝ¿ÍéLfÄÝS:’ŽâÊYLSÿ"ÁÁG·™`r$Ú¡ãuvž*¡—`M‰3K}ÒIH^jŒPôtÀ«U›˜Ê—Ÿ4÷û“·H!°Ó‘¾ÙGT»…MÕgÑ b’0$ BúQ‡ÝG6îëzˆÉM$†þ£™Ý:%NRa+ÃøîŠtÁOæÜ>œÒÃMEcÊ”¸+xä#Ûšîã°øÔ NîäiÀ` ÉӜ뿺$éZýŠ+¼òËG”yÉÞ£1˹`ëQÇö^Ä­W 1%{šñAÉÕ·iÖw¬ïH^}%gg;!ŠCœÓȰOQ$œÞ™qáQÁþõv‰‹1!J‡8²¥!PŽ½Ë‚t\ÑhʹàîËó㊋O•@DÔ]'é òÅœÁ•‡/̉‚ŠñÍŒþå˜@oà*° ƒ%+rŠ£rŽ´2¾«ÌJã!©oÌΟ|!uGØy(€k“® ÕªÞ¿öâ@#œ£Ç>„ô£„ͽq§ÙA ËbRP)ñz‹?÷"½õˆ¸’Ϲù„ž›RÜÅ$%Š·^8e´ÓçÕOfœÜÎH)±F³~!a9ÉHç’—_È1©¥Èàà…S„89.¹óÒ”Þ@1¾[°¾“Ä‚ÅTR•ôlD,g9EZò%ßðvÒé’kïÚcëRÄp7fyZ0;žp|gÁöå>G·O¸ûZÆ…kýKŠÅ±@QâœdzhÈ 8¹5çñ/Tl<àª)ò¥d1NÉfKò´¢×—˜*FG):!LÉ`s ¡GØÊQ¦ËlAa-Ga eUz_ òNq^9^=‡ð €úÚs¸t€G7C:¡¬áM|l:©aM"¥vDR» é¯ òù’hÛpóW÷Ù~zˆì±‹ˆÑΈ ÊyñÃwxù… &¯—_ü¾u&G†£ÛË…áøVÆÕ§a1+ #G>¯“ùIÊÖïz’“ç˜ä>*ÕDì\–l^êE‹™ÇöÙ¹ð±g+†Ã˜ÍKúë]:ÝŠÛ/gd‹!¥G‹s1óÓœ»¯Hiyù£c“‚2wS†Ë©C–“9³SÁÆ^@[¢nÀÞ•€;G:QN”@oc“tV’/JLeéô5ZÇèP1=€ánB´·M¼µ‹Mó£ÊeAi* SúÈóð*YeÈŠ’¼òHs¯NÏS5ÙŠôyÙtŽT3†›ŠeZr¼4ôbÉbjÑZ†)„Xðïÿïìzåc½5‹¼á¸öö¿òÃÏñÈãtbÉ…ÇŽn9*;äîAN<”ÆÇŠ5Ktb†W>ž2 NŽ$ˆ€2‡ XNöé_Üãµ_]'!KS¡´æè çò#1—žÌNüÌç¿<䯝9öse¹uTQrù=Š;/ *3aý¸ È;t‡óSÃéAbN:7èÐqøÊ˜­8't{Hé<Ю³¥Ð:@Vå½gàœÃâÎ *Ä‘ú)øÀƒ>‰·J1pq¨ˆ”¯¬@(RH„³h ‘èÅ1ýQ0az4ati‹î~‹O}¥c†[k¬] À–äKÁ/ÿÄ«T•!­,=é :ˆ™, ÛáúõŠ )Q`±&bc'@…´ ‰;Žõí’áV€Š<@¨€µ‘¥;ìôz¤ Ç»¾vÄéÝ„ÙiÁrZpá±Jk¢Žf‚ÉÝœ¤“sr7 ÛSì¿2ãòÓŽí+[ÄÑ’«oߦ³^Ðíu˜%ȯ Næ9 ¥$5ŽH;Ž÷5AèÈSMt‡†ÅØÒøÖÇ ŒH‚N7CiÁò°"yú2=­9¾=¥X”ä¶"¯*Êt+·–EQRT†ÒzÓç•ÉyT¥ >p£@ ¸:Ô÷á¥|ed]Ýc°µµÍ“_ö‡/¿D•o{„ê•O>™±óÌò£}NoŸrpcÉÉ­cNŽR:‘c–;lå8[.íi6¶¶„8ˆpË‚[§9½HQ"XšQ”¬m+²¥ÃI:sÜ~)#[B.˜LG\|´ƒ©nN•;.½wÀ…k#z£„0‚x0àô(ÆÚ »œ1>(ؾTtº\ýÚ/Deç,'!q×pôª%î%¬ïE„É€02ÄÂ"€þš`}d±Æ°u±çcýMYh âp_Òí t µÆVš"7S‚Óhq@gç*¢È°UIš ²"%« rk˜—Ë¢¤²ãÖÁËç©´Eòú >ò}~Ø„ªÿ„R $AàÇ é W!´@]vŸ¼ŒÐ ˆ˜í÷ frÊôD3ÚYc°5âðö‚[ãŒë'=…t¤ ,ŸzÅ1 Ö¶c¬t#ÉxQ!‚€AÛ—¸’ y̱ޚ&K![LI—šÙbÎÁ«Sl9cór—­'6ˆý*ÔhÀæðÙü²¯"Lïý}²> ÛWÃ'.sùmÛtG!ý@Ð|¡È²(qŒ-'ûyjéŽúKXҹ߶¹ííFqÈþ-Áä¨âø¶CØ S~bBF,f¯Y*3¨“b…µã'|“¼8×&þÍâsOþqÖU¡ªÀò?ZkÂ0"ŽŠr:em§O¼·ÎôùOm‡,?ò³\ÿØ‚½kU ã;wÙߟÒS‚¹–l4C‡s’0‚¯ýú ÜzaF¶(ˆ”GK˜WŽÇ:p|´D8?éäî’ùÄ›ZUÄ݈éñ%òEÁr¢Pºä±ÇŸ@dÇH½ÆáOþ+”œ£µàµß ]J²¬b>1l\0(¥ÑÀÍcòÜb‹u4#\K8x~ÊÑÍ)EÞ¡BÊ’kï°ÿÂ)/~¼Äš’åxŸÃ™a[J’ž‡ƒlÄLq_²¶¡ˆã c ãÃkKÖvGÈî:<Æ9✣(K¬©îÍF°ÔŠèÓ¹€fÚ‡Ä/ÁJ) @‡a ¥FH‰TŠÙÑ]NnÞaÏÎIçÙlŸtV2;D±`v|Ìk/œ°4ŽR¶’(娹²oKN÷st³SÃQ^¢ñ€»B.\0œÀîUÍ Ï-v^zÍâ¤$çô¥  !˜)¶.ŽoLÿÉÇ*b¸)8¾#‰’œ(\Ò ÉlY0³ŽÅÔÑé‡\|ú‡/¿ˆ,:°¼ö‰%J+Žn•,PÌËÒÀä¢X` h!¹ùRJbÎif3‹t– ÊiÊ—³TbMÈô8#С·_œ2üÉïc´ñ4¯Y‹µ¬ÁÖ}þ1¦)K˜sØÐæ¥sG¨l3òFø!hÂ;BH”öPæBnjŸªH™Y³ËãSò,dë¢B‡!*¤ðÈ iqùâˆù8åS/ehkÙÙyùåŒN§Ãö¥©>ñò’QpçØ0œ;:½€ëŸ,(¤¤Ì¡µ”Ö27–y°f,[,/Ý(‰¬c3<" #–“Î0¼vѽs—+OjþÝMƒÒŠã»š»)eqˆ) a¬0¥fq:c°Ë©evZ]-ØŸ 6 ߬‡†ŽÜXtcª¤k˜•ÄÝ‚t¦YÛ ‘2"é*FÛL±äð6ì²`ç\ /¡„di½“+k“'f¾¨ƒç•Î¥XÀ•ŽØ: cëÙ»¾Î¾ªJ%en°eF6-yá—^£¿&¹üt—Û/”œrz"•%ÑŠ(‰˜N ¦BAž‘*Åæ¥€ÛÏÄ|ÎA&¹q;c3 Ù¹¨¸{,¹“–<>0¼ýKÖyù£së–ë7 sc±À#ö(j•&1)RŠ´`zêˆbÃKÇ%;¡F¸Y`ùÈ¿ÉYï+ªR0ÁQ–†Íé”å\'‚¥‰ˆ˜3gì^Q,sEÒ ©%£MÁdòm‰?¾É9¸³R”tz‚ù\ƆÙöK°`Ø QŸ Usz¸dü‰ÈfSÒÂ`ª’@H©J+TéK¤Ï¯þ÷•<è“øLNz¯#‰´oÆèë3®;ÁG1£AˆtäËŠt–aÊ­%w_Y€“.8/Ñ¡&‚ÊÁ£— ›Z´u,]G1/H—KF}AUl<6‚…aœJŠiÉú.ܾi‰œ#±¤b‰b0¸»Ÿ3/-Î8º=ÁìÄÆŽØöÇ)W©xáå’ ˜[I?täV±×U™Ÿ læ`™ÒU–żàÕ»%޲ô“!UbÂq:-8™Æ™/Ü\·Ì¦†ÁPÒŠL¢”¥Ì!uŽ,¯ÖkøþÀ/¯c¸³Ç鸢4Æ9–eɲ,ÉŠ’´¬È¡2ŽWÆç3 zÎúù=9üÔôªvÀ*ëpΑ§.¬Á·rDÌNÝaÀÑ­”ÓÃ’“ƒ”ÉÒðÚñSVÜÏPÎ1« ÇEIŒ UåM›GžVÌÆÝ¡¥È wN,A0)CNöç, µŽlYñ‰K†CغØaóB„†JÒ§Æ èDŽã;J ÂDp:©*ç~ÍÇÚmeèÃKKKÇxt¶Ñ6¼šVÜ]¤ì%†»C^ZÊ)‡EÉúРtB‘:’®%Œ®ì(®Àa¬(ãæ‚ë¯y!‰:`¤àÒ&t5Da5G7—œÜ~qNeüu„:¨GSù&øæžã|öy¥s)MC³µ«QK–—~°t™QÓÓ)ŸÚäÆÇOYL ʲbš: ô‚€$©°¹áNåÆr¥'H¬ïhNÂ!¯|€¶#V“^´¨'¡xô·HøRˆDj:ñœ»‡%®¬¸üDEÈÑÒ!²Š£Ã)YZ¡:šÍNL’U‚a¬(çKcˆq|ä# bÝî fy[XT$ÁxôKI^{ɰ±-98‚!–»•¢jÖG~¼ÖŽ0wlîh^ÜO)—K`o«Ë{¾0æàìl(ÆÇ‚,×ìm ^zŰ¹Ðu9ºSp<·hkH‹k Æ8s¸qb8®,ˬé'S•à|ïî…‹šý8)-Ù¬âÊÅ€µíeVP޵uŽé $IuÀÁ¾(ŠŒ¬*XæKÒªò­u€© eå¸~^K!8§°€T¢ž¿ÕÀŸ+ºZãp:`§ß£ÈRßó«,G`‹W”t:Eš1«Ã@ÒíD\¼q|TkC–UÈÊrcnX%ýX`•$‘‚nW“/ —žÐܾ ³c˼ô0Ðí)lå›öãHq2ÂwÇQ–!¹¸î˜O w?0>†»™eg Hg–\*Bp´t”v†££ -K¡08v7"ƒ/~¦Ïl®X‹ea8]@^À¢U& CZVŒBÇÑAÁô8']t:°˜‚vúÎ z‘á8S&,ò%¹5ä¦"-JÒÊWÆ—AX?ré¼ÖK<,·µ~t^ÊÊç%‡³óeFQ Ö"º}ÍôtÁržRd¹ƒ^/f¸2/=vлÞÝg¡*ç¸úäãÒ±pŽÇ\Ž• ? C BŒó€¼¯(W±µ"…`¾€ ”-%J+fN0K%¹’T…`žD‘HGWXŽN,ݾ + “£’é¸$pPdÞ¬X½AÀ3ïîðÄ5ÍͱàÄ:±d=R\ÜÃ×^ÊpÎW)·ÇËÂж4ì—äË‚Ei¸“Á¬¬È–9UQñê휪*íl`•âºAË Œ±J‘[CZædÆP‚ïÈ ²¢ÄY{~™ˆs¼h¡s¨Àc©%NI‰’ЧÉÎå>7?uH ¦0™"O±R„‘ÄØ½Ý%'§^#+)èG[9¤­yîqc) èw$QÇKŽöSlî(KI æÉEž±(ræYÎäd\jÃÉÌŠå")˜ÍK¢8gÈâólAZä,Š’´¨ÈÊ’¢¬|ÄÊAQ9^O8—«—¦¦yoUiÉ£°Ö× iM̦ÓqEgàq,}w—æ¹/ Ã(¤ŠíuM· „äèNDÔ]cssÄÉIÄ Ÿ)E# *»ƒ‡!Òðž·Ç m—¤Ò™ÀŒbò,!]hštægle©`ïš‘gŠ+=h–(+öãtº`sCsé‚A‡!oÿÊ‹‰ãcNQì\ŒCE:&Ç9éB¢lI6w\yªO,ë=#fc+ Óé`„Æ9EOK¾æ?ìk$R0ÚˆŽÈ*¥\XQ ˜•%Aˆw¢…ÀÖó¬ó=ÀÆ:òÂ'Ì‚sÉEžÎå XM‡Œk„ä8ðs€c¥*E7èËéô%UY!|ìùWûptTŠ‚Ô@§“f¥BÖvGÄc5¾}‹Ýk}Šeɬ€Çžˆ*®<bÊŠ*ówãcËps÷Øáph¡@kÖ×C.>Q•‚<×”i†3°¶-8Ýw¬ïjN ºýˆÓ™!Ö’¢4<º3=)è 4ýµ€eÊbRòÄLŽ$ÖjªR!¥£È@*ƒ5¿'ääNH(5ý5ÍbáóÆy0­½+ÞŒ»sÝÑí¥Œ6#.=¹Ãâ¤BHEÒc%ãÂÒ1–¨ Â>§ENa|æ·4ëðõŒ£,-¥ã\öÃ9]|F²5›ÊÕæòÝ )H(g©¬ Ó—eDÒ×$B2K}Éa¥¦²-¾£Ãh¤LÙºPrøê„“Í—þ'_ÆÞÖ¢ƒ€ÅD3ÜÙ½c+KH†Ûžx¢C¨5Ý.äR'–›/@Ü ÙØ„þše°!8¹kéô‡7 AèØ¾¤ÁŠbžù‚„Ùcc/æø8àänƵ·‡<òަLØ{´GÒöz(Ð ^Š >þk‚îhHÜ ) ÅÛžI(eÄÕ'5_ð¾k" 'évU)˜žZžû¥C”,étC¬Š°UåÃÉ£€¤S¥))Œ7q„””ÖÞ[ ÒÒ—bœW:·+€ºÊûô ­Ý Æ qL%ì¬'LOR 'XA 5½¾ ?ä'(¤Ò\¸‚)s8¾]2Ü0F✥×+ؾr‰ÍKQ”3Úîv`rè¢çˆ…Tä† RŒóYÂp½b°rzgÎéAÂ’ô<ÔøæEE *” ¹øhÌ| ïübMž&›£´a´‘ uÄÎ#[Içf?S,îIÚ!µfïb… Ö°·æøn‡‹WwnKn\Ï …a–Yº‘ ]ørp!B’ž¦ÈÕ§z£É‰ÑáˆEUpRd¾¾,É*ã•O½Tõ*p';ŸBp.@½AÎJøq©‘”%ˆ´BiI„I £>Ù|‰Ф#(²ŠýSÇòÔ(²Z1ˆBFëG—þsKò4CJK%Œ®î1Ÿ°ùˆCªp“«ïÚåÎKSœ-n @j¶¿ò÷SÅÿ«¿ÏÚNÈñ‡Ž$a`0z:ë¾`rdɳŠùدAe‰cÅüøU–¹¤;ètRsIÏ9œôeÕA弟cÜ ÷<Ó¹\¾f¤ýÄøHûI‘J "-ˆÍ0 YÓ“-%lìÆ(]‚]Í‹ŸÌÈPtÂéÝaŸ|iè ¬Ql^ÒßÛ ìYâ«l½7½Íà‘Kô6dgÀôæ ZAg Ø|Û&°¬ÍDŠ1qÇ’luéÿž¿ÊÑÿ]¢^ÂÁõS”Rh•RU/þÒ”Í]A§çpVðÒ'—ŒO¬oI¶. ßp×ðäïù"òñ’_ý×Ïsõ«ÞŽ(gtÖ2l±û®mÖžxŒÙ'?Ák?ù¯Ù|ô"Q§Ãü䔣ÛKNKv÷y*H:Î-BYÖwb¬-Ib¸}IRä¾Ënï©kز"«"2!8ªJ²ª"­*JcqneþTÆQVŽýüAsÅgFêÛà}Ðgñ©’§…5(ÐöÓáC)ÅNèa×67˜OJ´–h-HçXÉövÂæV€¦rX+ム)ÁÞ6ŒÑ[o£Úÿ(Aú~d˜ðêÏý2ï~’î£OÑžûÅ’°"Ï+†*7He˜M ãÂӹ%T ´e¾ ®¢*!PKÒj›¬È¹+$iU’–%y]QY‹1> _UkûŃæŠÏŒôy¬än@°L2ÖCs¸º:´´–´(Y9¨ƒ zG &ì Y,&”¹!ŒýПlav$‹Ó”8QôÖB¢ÝgHú{äû¿F÷ýÿ%âà#è;/,ÓÃÆ›}‚D1|r‹`ífÏýÑp@uûKÿ þêñSäÿ¤<&Ž5¯||F.‚ŠáFD:O¹} ™Î œ”¼ðœ!ÖŠ¸SòØ»4³IŸOü臙,Ç%ëÖØí’ݼpôRE¶P|âŸýOý®Sâ^E7ÎXÎJCXÎ$‹e‰}«Ûë[CÍÍ[–Ð QÐ %ë» Q·Oá6@¸ÅäžÂquÛ)Ôù€Úì?ÏV<'ßd +× SmðN™­§—Œ« [d,NgtÖ†„I;/gŒÖs6öz¬í­ãèsõ .3ÚŽÈRåñâe½ÙAŒ®¡Ÿø½¸t ÇŸ¤LOÑAL÷bŸwí’/Ýa‡r|‚ç„ïút¤0ÃÇÑýñrBuø dgƒþÖÎI^}.#- Ú9ŽÊB’-¬sDR°»¦…C`9™~õW nÜ“/ : È‹]NŒŸ…›Ÿœ2¹>a~ð ³Óœ…øðO¿ÆG~rÂÍWN¹ygÆì4ãhšQ•%7î–hUróVE•[SC(sct,•“ $QwˆqŽ…³Tÿöþ;Ú¶ì®ïD?3¬µv<ñÆÊA ¢¶ 탰±I@€€ÚÆF<ÛÃm<ÜX·ý0n½¶¡ÁÃô SÈ”Ýø5`ƒÁ`!ž%ªTáÖÍ'î´Â ï¹æYóì{ªTUªª[·´cì±ö^y­=ç/|Éê¶/@„Ÿc-8)ÂD¸•+C¨×ÀÛÞw³ïâR”È[‡X¦ƒL¢•`¨C±¬sJ‘á.@‰kÛ†¦r\y¶Ï*wyOñÈ# Fƒààºô1 6¶úxeÐ[÷¡7ïGà±W߇šv?vªšj^cƒBÐ?»§_Ió㰘1¿2Ç×5ycð‹Çðöå5×/ìa¸ýNÇåËÞe÷Z‰­+¤uLç–µ1Üñ²ó]ËAcXw–Y-—”šý« æsö¯RÎ*”¬É•frí*?~"sT‹†G+vŒeÃ{„u4 Ì€µBRÎB£‹õ±DIØ>;bëü:jp?“ÉŒ‰©™Õ Û‰ÚªÆÐ˜PÝOmã¹Ö|BéM¡/ä­¨ºÅz”1¯r jœÇz(=ÔÞS9Ǥ¬qÖ0;˜qáC%‹ÃÂícê ƒÑœñFEÏÕ”Ó¾ÊpÍ1X`ª>~çÃTM…«ö™ýáÿ…ìoQNK¤#õŒ6sÖî:‹«kìÿ-n?£ÿ9ÿ›/»ƒÝ‹—.ã§û<ñž‹<þ¡}†ë}ǵË9=ï9»áÈ)iæf F=Ko(8Ü•Ü~_ÆÙžb´‘#€ÑX°w­A‰}®]¬¹8«84-,ëα˜„­5ó¹`mk"'ôXÌ(s”¶ e ¡ø(eCJªužæVT#€¯!H±[šâD"§ÒR`‡§j'ÁÁlŽÊgî=‡Î3ã‚ËJFŠ šÐ‹µ’ƒ‰dýÌ)SdÛ×dÕ>Óßý˜+{4ÿ½;֙YÆ0Ùµ\øƒG¹öpCyé½\?äÚ¿ÿ¿ ‚ñVÇRídl߹ɿ¹ F›cÖ¶3^þikdZqõª¥ªBÓ>0](SÅÆiÏå+š+“š3wõxåk ðSÎyü‘Ñc²gxäBÅÞõœé´BJ¸|Íãf¡€•«—kÇÝÛ[Zv†Òy*‹!Œ¼Èk§z¬ŸÎnݤfê µiÀ…‹ÖXm@ÈÀo=ÖµÞø[$ ^ oÛ.Üì»y²5 ýVʳÐ%è« åBPä!0n 4Å`DѯoÔ O9³Üý©C”TlœÎ0•ÂT%×jLU2ÜpþÑÆÌÕ´äòGK®|à2ç^–SN¦îhFëç ÖokØÌS <£õ©5ù`ÌþÅæ“W—ì_ž’sžøhÍÕ«†W}Æ—2è ¶ÏfL÷ ÷½¬àÒ¾ goËèIPZòð‡K6·*ê2ØX®f_`ÊeÓ°3™óø¤Á5ŽÚ{®Ï û§o=צžscØ䔯±9 ^ï¼(£4µN¾våÜÒÃN9aRÎ1Î3©jÊVrêÆQ5AªÜ‚¥Aÿ %pÛ;“gH­ŒÊu„uàD(n=,œãÐ{¦ÆÒhE5·|ôb‰ÌÖ¹~±¢š7ôǰuÿiêJò±‡-R”L÷JŒ5\¿ÿÑu.|xÅ$Hˆñ†e¼1§ž.(ç:TvŽQ™ãà¢'ïiÆw¬±{šjÀÁÕ=lÙ¹°Çõ+;ÎJ.=bð^ðÊWk>øûWQX¤r\|´äu¯ïaMŽ÷P-.=Ú`­à‰‡¦\™-عê€jå¹ý~OS;¼sÌjÃ(¯93lØt!a£¯h\ˆš=°pZ{&‡k k…b}[1\ëÐôúžéfíÌ]^›piÿ ûMEeJg™5 ®5x­ 5™Lës®"nER¯…· à7ûNžE 0jc” xn¡J œäBÐ!(„d(@éŒB À–œ»· èkšjj6ãŽûz\xè¦6SyÏþarŽj:cýôM9G#v/-B2Z/¹üHÅõ‹†{>m€VWA9ó\z¨dÿj‰³ ‡û3¤÷lmxöJfÆ`& Ryú#ÃþuO¦“=…÷Šz^³WêÆp8kÈñÜy>c6qèL£‹; :óì,˜•“ƒšÉACàôPòÑë5‡÷â=lhI©%…x!>£šS§‹…fûlŽÈï`w1ç°Zp¸˜0­JË’IYQ6á~jã¨ê0jã(-,ÌnÁt€¿hEh:w«QD”HR+Ú µuL¥£o,»¹gÃÃù¶ܹ{Osù¡zCçjv/W˜º¢© /fd:Ç×%;5ˆ©f´yÈÁŽc6½ÂöÙ ”*yäýs„’Œ7 Þó+—Ù:7àÔí9½¾b1“œ»ËðÐ+¼ G–‹Wj¤¬ËµZ• {-`´^p01[a™×0èSãͽ¡Ñ°;Qœßt¸Æpåšco2gV7dÆã›Ð´úZü"5ðª ÍÕCC¯ÚÁ¬öx_s±6œß0;ì³±súþ×òè#ט8Ça&ÁÂÔ”&¨<Æ9¬s-Ü쨛P ¢nˆ[þ5aܫτ·eÀÞì;z¤` Z˜ú'Âà %û<¹’(!0R°FÈ”ªJÍúVÃd/$Ó\¿>ÃLçïéepz öjê|z!©æ)rÖ7õbÆÕ'*2m980L÷+ŠÌ³sè9w›çàºg~XqéJÃP7m¼Œ!ÃÒÔžÛîéã]ÃtÁæ¶¢4 ¼Cã1Npÿk4O\…3Û=¶Î Ù¾­àÚ†ùƃйå‘Gg̦%¾l r6ŽýÊÑwŽƒÆó²3šV¸Ú17!$ë#Á¢tä¹$ÃÓï+NÝÖcó¶sLf[ìT3væ‡ì/æL«³ºfZ7,êšEYSGY{•eÑ8æj»æÖs†}m»”a}û;£gH(]÷™5޲r,*KÕx£v!Ä·ôïWœc¯®9<œR. †k‚<—([QW)-R†Xù¼ªYÔ¡[zÙ4¡“$ ._1ì]«™”MUc›†ÆX& Ççk>ôžŠÉNÅp\Ñ5Y^c±L¦Ž¢/ØÜ\½ìؽb®b@¡-R8ãXÛ€¾NçšÁX`ÏG?\ÒX(_žSÎj´1Ìg5 ÇŽ÷¼æ¾Îy¤’ܱ.É„¤e ûšS}Å™Œ~¿Ïæšµþ•¤?Ì‘*gtæÕÌlÍ¢ ¿lJ¦MÃaY±82~-MãCc<ã)mxï·¢ñ -¥5‚Õ;›gH޽-,ÌÛ?¢vP·á¹Öú¶‰L}0Þ­cÚ&¦á°œqýñ«ÔUÎ`ÝsîÎ ¥ÁAS;z}Ç™;=yÙpPÖd.4‚»¸;ccX£Þq0ñÜqFzȼåÚyn¸óS¦†Óç B¦µãÔ¶£. ½¡dr8ãú¢¦œÁ£ŽÀÔ'å 6ŽÞª¹ã‰Ë3®Ìxbºàâ¼D× ®]œs8«)+ËÅ…cl<ôÁ¼ ¶De¬ofܽ³ û’áHâò -£BqjcHo8 Øú žxbŸ+Ó]榜\jc˜× 󺡮Œñ,jKÝ8¬óÔ>¼ûÔ+‘$´ÚRo€·i‚>ôî›}WO“¢ï"Ô§PhÌ PR u›$/¹’h)ÉÚ*ÆRtÝ … Wk—ŸÓHª…¥[œÉ9sÖÓ:feƒi C,{ èçŠ;îËè‚Ù¡cs["EÍîžã`Ö°>t¨ÌSN åÌ“{Ë|bØ™X§0TŽù¬bgf9;–\ØqøÆ’I‰ç4óÚÉÌ᫚¢iø”W*ö+°qÊájÁãSË+ÏJš:$ù{)8·¥ØøÀaÃâ a] &^õò5¦×æ…BÅÖ¹>zín®55ÕŒI5gR—LëuŤª™.ÊPù¡q,jGUµº;ø§­á+Å­¥ýß¡™΃ÎÛ´y³ïêY’]†˜¤3‚çÉ}è`bœcb àDC%ëÎS-*vv î½gÄbRâ]C1€É¾Fe–¦Ô^"|È‚š9IÏYšÚ1ÙW\».q&‡-•ñò~Í«^ W/8†kÁkº?=в¦Ârî”æp×óÁ©c£1Œ65ÎHvËË•²b $kÊq­¶ì¾{‚užÙ"¡ÎOSÁh XßÔ\܇Ñ(ã¬a£ ƒµX×|Ö½›üÉGhdžÎ úã SÍ©¬an ó¦æÚ|Æ¢ œ¿4†ªq”µ£©ƒê3³Aò¦E n5 ÷À¶ª›ú³ð¶^;€>øÏ7ûÞkÑ¢@±mm!ÐJ TèeåÙ?ΣҊLÀ–ðX7Fë[;®;š²a¯Ö\Û©‘>”ïgšÇÄ…C¶ñÜv‡dkËâ­BxÏ|fB2ï¹tÍ“‹/»{Ѐuœ;å™OÃ1\9ðhë9•;®VŽí¾$/çÏä\¾:gä, ‚‰ñŒ\0Î]+É.îÕ!½SflŸVyÎÖ©>§×23Kf ½Ì³5ÎØ›8zÒ’K–ý<ãÎWå!¿Å¼.™”sf¦bR•LªŠÝé‚yÕP5 uŒÝºöTU¨¼±p°gŽ{o±ñÏ[zaÜXC~Tí§w³ïìY÷Á!¦d@$¤c™ø¶ztm-™wL¼§g^+®V5 0ƒä`¸…Z\BgÓH”‡;OõÂó±šB+r g¤c:µŒ†š‡j8Vbª†'®W ´BáŽåÜ2Ÿ9Œ…o€Ù¡ ´Žž‘äŠà‘Ë+Ï(žØõÜ{Þq¸W1TŽñ¶;»Ž­Sc“ ™·|豊A¡x⪥¬+^öêJì^±ì‰ª<µœ9¥¹¶cYËWö-Å ‡Ï`óL‡›MöÊeS2/Ì­£4kC/°yÝ€µæl¶²­]àþQï¿U«¢g”³ Ô—ÂÛ†@Ÿ0þŸ›}wÏ,Çã”-CûT¡²­i­žÚªE’›î (kãMr7c㘩¡jdÈ?F²¹^pí°fcMqú6ÍÅÇLmÎpu·a¨„àÞ; &ÉxÍQÍ-(ú‚sg$Ó}Ïpà˜M%khò‚‹åú³Ë˜Æae0PÌêœÍ- R)÷ õ ì_3lmj.XîXW\½nz‡ôï8ð0Ÿ zƒPS4÷/ß”ì:ÎߣøàC u(ã8¨,sçÙÌ%× =ç>”4¼xݢƻó Ü™9~û?^£7Êè $ÖzÊ9\ó wØ2×ô76ø°Ûæ š1­TMMYÕìU!ŸÁ´Qž 8Õ¸Pðªq,Œgnaß„÷{«SSµ -¡¾¢ŠP¨¼Ùwùqè$Õ32£L¶°œÙ†íÆÁ{ 7„  v˜¤U)*)¨¼cs°ÆÖ齦œ•Œ°·dR3ZË) ÷‚­­ŒÙBÐïK6†’ÃóáÞ{Î/ðšÊpaÏR:Ie^…’›C.]®ÀÃ8—4•¡ç¶t̃h‚ºd¼DËPÜvojH˜ºð,:—l;‡†õBá3ÉFžqþ®5Öï}99;‹)ÓrÎÁ"ÄöÖ Mݰ¨ÒÔGÙ„ŸºvÌOÕ½/…Áÿ €³ÝÿõÕíÈ `܇7yxàE,ÞžÌö²1ø«ý2`ÃÞy<ãB•ä:ôQEµEv‡À 0Îpè,ÆåŒò5Ã’é¾ccMƒÐÌ WäÜñŠMFp°gô3œƒª’¼î³Ç,¦’¹P”%Œ†Å@0PŠǵiCááìm‚K—JÖFMeØ=¨8¬×–;O+êZK¨jOÖaÝ×ÛÁÿD VÀ–È\RÎ-Y®ÈsÅ=÷ž™seý,׌ãp~ÈÎbÁîlÁ¤®™W ‹ªf^ÊvàW­ºÓ4c<ÓÆyzç/Áð&h’åa"8ÛN€^;P2Dƒ³/î 餉PÅ ÑÕ}ôÞ#|Hêö.Ô’G1Cà¼ÃâilP ”1B0󞙲ž)f‡%RzF#‰i`6‘T³†yåɳÐ/ëüÝC®]RÌ*ÃPIò"ãԙІh¸¦©KÇx ÙŸÔ|ôñ’iãØõ]Ãnå¸}]3ðð‘C‡Y|[üèÎÛ»3Øè & ô5,|ܧ /¯{í:{±qŠ'ú}öë’Ù”ƒªfZÖVóEŒÜÖO`L(r[ÕA篌gj`悳knŸæ¼† 4X ZCcÚhÐ~*Ú£4Áš¼…Hµˆ„'LëÁ«.}Rà‘µG ökƒLâ¼Áišm<ÅB.XXÃ0+˜êŒ{OÇÎ)«`¸:+އÜ>rx}AÙXLÔ™ógzÌ§Ž¬€ÙGç’龡j`çÊ„áØ±(-Sëù†"¨ Cßù±æ¿N=½Ú’K˜|Ø¡sÉB Î5/eÁGiØ=l8@ð™¯8G1:…|•àÑrƬZ0©jfeMm-µuÔUMY9Jã°ÆSµËÆ8ªVª=LL0zãû|)PI°qÓ˜7­o(' ü,‡¦¦ãð³À×ßì»þ8”¢Aˈ„õÁUŸ·F¯u±Œ'÷-Î) Ô#BHEã¡—…ÔÀaÑãcB°>Ú`$g7,f–¼”s‡Gpö¼dïŠbã”`²Îf ÞZ;,‘BpioŽ\XFûžž mDˆ¨Ü°!`ßÃG =b™rÀUž~cÙ\Ï(ììhÎm¼òþŒ¬3Xßâ¿Næ,ê’ÒZ¦ *Ž1LËšÚXçYÔŽ²Uu¬õÔ6„NW>ÄTÅØªg‚ðtÕ"^ÜT$@Ìß/gÝàW:ÔÔ¿%KF/QÌ80!u2a`· iœ§pÅ9ïɵÄg04.dZõC]ääYh$¼ÇYC•÷ÐN­kòÞ‚ÅtŠ©-»—=:°qÚsõñž¸>CV5‡µe&³Ê2¬‡•å‚… ÕÆ3y¸½/9³–ñþŠ™5 F®|!¸X{Îh´žF „kè †Ì²1YÏìê5-¤Ù4†… u<ëÆP¶º~U»¶Ÿ‚*PëЪڈÚÊHù¤Á¯Ú\ ¿ôŽÓå‹• (41ï%üË­Š~óCèFTå-ðd‡lûgXSÝŸh h‘¼q8$η¨¼¯©]Fí<çPÞSÃZÖ`¬¡l*®Õ}r­Éì€Ó§2®^Ù;çƒï©¹¶;c>/)”ä öxcC° >“`„àT.x¢úÇ^gç²ðmøPÛàù¬Ó9£Í>uÝpîö³ì Á5 ³ýJk©]hUdLüµ±4& øªUsêVÏ‘´¦¦¶«³t Â{;Éñ•&¾X)øÔÅÓš0Äo߆æ“Ö@4Aþ„¯»Ùwÿ4I/ý9Q,G/±ÁÈ÷iËnÙ“ë=Zh‰Î%…ä™`˜ir%fš,Ïeš\kÖzZï­á›-’4òŽG~”º4ÌÇ¢q(çÚÇ›Tó¹Vòi÷mãÜ‚?úð›I¤ñTR ð µ@ö5›ýŒs÷߇‘’+MÍ´œ³³¨XÔ uƒk scÁ{ÏQÍž â„ ¶XÃ3B§s8~ý,G®OÞsúûÅF?C ðYM&rãÛ^sÎ7AÄ9Ûþ[I2þ8*”Šç»bÛÈÑèµF² .áP™MAéÚyÈ%TMC_ Ö±f,¥ÖŒŠŒÚ‚\)¼÷xàº( òŽÑÙmJ¡’âºr ²6¹>Ù•RkA¦%Er z™¢È4R@¦ ðB … ñ¡,£’ÑÖ ·ÎQxyÆv¿ÀJAŸ`tæúR±ç,MmhE h¥ðx&Vi,®=_ã<Ó²jkŸÚ£˜²Û™·!ËSÛ!cåSÔîñ<¹_å¤}o5úZ¨Ú¤§°ô.LmZ“8–¸„ít¦[%<â©è¤?ζ"pfį=í ”.„2k ÆJ2ëqNR©)dC¦BEj%®Í?vÎIMzaœ§Ð’Ac(%SëBs9!Cضu޲1aâˆ0ÑjïY4†~žQZ‹°ŽÊ:¼€¦±LË­Y6޲¶ÔIœþ¼åúé³?玃?ì¼c|N¢w´K)¡„AßÖöÅÀ A篪0S¢ã##pÝžèM7ûiž&}<Ž–Šñ¦E5|«ÇAГ0V;8œ”CË0èµ ÒAËîœ!ô!„e7]­Gk‰–õ¡ç°6ô´dfBO2-‚ZF[hJÄszÅSO/kpx¬ m‰Â;ÊÚQ×ÓB©SÛ9®¤¸q°?cúVSAÍQªyÿŸ‡ÿÛ905躄² ߨ /õiËۧÍn±'_6Жק"è8^TbH…A2Þ£háCNëAŽ*PÄä²ÅÕ­o}•cXHšIC¦%Ö*ãÈTˆí‘­ž²h|ËoäbŒÃ½"Øet}ã=ÆÁÌ&5oãô›Öz¦¥ #º£ÄÉó­¨ûÿ$÷÷€ò [MG¨&¯çMø¿ƒvi}R†Yó5|ÉÁÍ~¬§GÏT§=Éx^´UÕb%êØ”{¨ºc”è¼Ì¦Õµ#Ž.[ûb¨ÀU¡´¸––y[BD GOr.D\Fh¶iv± |¯=>B–Æ…ÀÕ ÞÚ§Ryžl»dâŸô~àÖüÐ剄vå]ÎrÔp­W8Àx]>­˜È{ zúªžµÌ±žjBœ´ŸñA’¼¼ˆEƒRµ5Ù.=ÇÃcx6g\!Ã~û-Ò'‡'@—‡&œ+Ý€ŒÈ0Ôᜇ&lw†ýÇÿ3n?~ º8 k!/ ?$´Ë):‹¹7€?óØÍ~¼öÆ“ïþ®OiÙø[FŒASî”îÃÒ>69ÿÑõDwßËÇ>©¥c–éVàOEß ÜÙ¾‹œðÞb'ȇ®TÇýÎBŽ篫`(x`£Ñ:Œ7á‘ÿáf?â³£8ðžŒâ õ×…ÅS»¬"8ºêqÛ„›Õçø$s'œ3ž÷¨ðïÒõ޶/…-<ÝÁ«ò§¢u j?óv]EÔYнSiÍñ ™º ܾ?ìÖ ×Ã÷ÁøÅ¥ =Õ |24è¤Á¼ìtÍÓâþú„Á#––)gO¯J„§«WÇk.K ¿ôýÙ䥻.üR˜ßIxWeû© “ vEø/âäˆ)C´d–w\_çAH–Ezí¤¸þ•pêßÝ܇}ª@¬§¤·Eƒ5niIûÝ38ï“­&M”O¥³?“ûñÞË­> ^IÉKÂñÿÓ¢@a‚h!;'X¯õzõúa ý60NC&Âh½³^ ä99”z™n†sè¹¾æKÅÁuýÏt’6xE`\*ù£Žì+S}_é…È÷W* øázP}Fëá­Kù;nö#¯hE}:]ZoŸNmŒ Q‘lû©Ú¥T: vS5 =¿?‚õmØ8 [g»`9!ƒWMöÀÿý›ýØ+Zü3‚aÕŒ a<=Zøº]ï9®"i×êþJîß 0ßÔA®·êP¿½Ò öõŠVtsèK ƒ;ª:£Y#¸‚0T#:¡QCZƒ·ƒ‚ªSôƒ1¼qºÛë`8 %µ6ïÇÿìâëõf¿‡}’Ò êþq"LÛuýv]A|ÒP€ÎZ}¿¼Ù¹Ñ@gØ<ÛÂB#Ø~eØië•øßÿ ˆÏ~ëÍ~+ú$£¿ÏÎÄ8ȧíúŠ0t£Ñ«è¼ÂÐãMÈzÛý0àukÖ¡?n÷a|ŒÎ†åæýPlÀì2œzõÍ~+ú$£Ok—ÑÁ¨èŒÝ†n°7ugBäIÎÓö·ÎZè³è4Hç¡|\ìF%jûUaÐÎÂú=0l—k·ÃùׇÚ;âÙ¸eV´¢gF/¾„0¸tÈNꌙ`²ÝO‡´©‘t>ƒß"Þ¯t„iröÕAå…3Ÿg?-¨Aª£7@=À7 DÖ¿ÙïgE/qú‹t˜~„ô³t>€IDAT3£y*é=´~:Ùl†HGž`è Îþ0 @ä@¯€b=èþã;`p †çÂR¶±½öl=¼mêE/±¢—ý-Ú$:g9TÄÓI€t]4–5dªulè`Ð( p& ðÞ:Üñg`ýn{ò;Œ“bE+zŽi“ãÅÒï%m ŽGÊöwÍñˆZÑþÖuÕÅúô‡mØs „›/ êO4tŸjð·´²Vô\SøFn 8L h {€‡.”<ª@ þ {ý}ö‡!t};øä&pön8÷zØzœ}˜ O“V“`EÏ%}3mM':Ì?ª: MaÏ8ðãDH'G/¤Sx°ÖF€nkEàüëwôgx.¾Ï€V“`EÏ}+]4nÔácµ7—,Ë—´MÛã£HÑ"•œë(`m«åü‚¾úÕó¯Ýþ´TŸ“h5 Vô‰Ð7·Ë¨ï×ÏŒËÛuQXއuÇIÐ$ëÐJµý’29÷?÷ú€øœ{}˜ë÷|BáŸi ²­øÂàŽ…l}û½¢Óå£*ÓЩ6ŠãÙt5J»mÞþ–iÈ3ë„Æ©£³0¾=àýÅFÛJï£Õ$XÑ3¡7Ó®©þ ØÈícsÇØðÚ· ŠèPªJè¼ ƒ1|n«õøÞþèŸzÖªÏ äÌJZÑÓ¢¯ãF/n4f#’gƒ;ªA1á%¥xžX:N(}Äý `¼Tžs¯o=¿ÏÑà´š+ú89Å>ްûv]Š-WЈÜ>–B¡Ý7zŒcž°.úÐÛÖ×á®/€û¾N¿&ئ|NÔà˜ƒl5 Vt}M»LZèôùˆùGnžªEзxNçñ%9wú[æ=àÜ0¨<ºÍ‚—ªûþ<ÑÊ&XQJo¦ô1µ1 qޕܢþoèŒcèPžèñŸ¨ÿ§•;b‘dv°qd£`ôJÝ üç9¬a5 VAçOØÓDö¯\?Õñã„€.ægA˜q÷‰Yaéq’íÛâ³ýÊ€øô6‚ÓË”!èy¦Õ$øä¦7Ñ•(Éé錎[G½~™‹G‰Ð$ç€ÎO“ßí:¸”£}7ïïЩ ¿›óÑ Øæ½g0|â'ZÑ-Cšàä’„Äõ8È! æòpL_O>©}ÐÐÁ›QŠ*RŠ&ÅÁÙzˆ%Ò=X»¦—À_ì„å ÀýSšÍfÜu×]/è5WtshHhÁë An5ǹ{Ö@ò;(†m„h¤çHs€ã¤ˆË®Œ¥wóçCèo…Ë4³°|'Á£>Êg~æg¾ ×\Ñ KÛµ'urõ¸1Æ'6hãˆOZ*2î¥GÜ1(5šk:I‘JÍð,TûP¬Á|6î ãl ú…WKÞóž÷¬`Ò— }+ÝŽËßêÿÐéüq¿Xà*J…Ô±µl+Â$ˆ• Òø¡*¹F8wÔõU®fÞ‚©Âò&‘÷ž¯ÿú{¯ú=zð?q˜E0€#éþͯ‚kJþù·}:õwÁ7mÜÜ[YÑ3£?|ð9ɺ4OŽ«6ñ7I·Ÿ‚.´!• '•šO=Áq°§s#t#DB4y¢í”­C¢»!"ÔÖ`+n*ýöÛ¨~ô¯ðÐïÁ›Mç*_Ñ‹›þÂÀW„¹zŒéOãsR5göLã÷Oj"’s§¾lOaÏ8 ¢Ä×V¨"8¾lÝB 6|ÏÇ7ï-þÊ_eö3ÿ„ýxÿ{à‘i(†ô×èŠ"­èÅE_ ü]à³è¸qvÂwè¸òSõr‹#O~§ƒ:h3^#ÞðC?ÄÏzôùÜú¡cÒ"õHlt}³à~}ÂË¿ä»xËßý—üÀ¿z/YÈþüÏÿ|þâ_ü‹|Á|?öc?Æßû{Ûn»í9{q¯}íkùÚ¯ýÚ£ó¿úÎ5þñáu?ð¸hကW¾éM|U{ì—}Ù—Ýp¾7½éMGÛÞüæ7ó-ßò-ôû}Þþö·óæ7¿™¯øŠ¯8Z®è£ÿ x-w—„/’ÏIÜÝ&Û–£?Ó8iiÃe£7îû›ÀOzÏææ&_"o‚?+ý~ŸŸõžß¤›<Ño ÷43¾óo|7yäßùßÉG>úQ0¿õ[¿ÅßøFœ ZØ[ßúVÞõ®w=g/ïý£Ä?øÿàèü¿øú ~|OO˜ K~ ¡œÝ=ø ³w¼ƒ |-ðÆ7¾ñع|ðAÞñŽÐ#üo|#?÷s?Çÿøó}ß÷}, .^¼ÈÏýÜÏñ#?ò#<òÈ#GË=;únàûéôô8ÈÓ 4M†¡É¸_æ\'çM£ÄÒdòïø O[Íí·>Zqû½¯âßsÏúŒ×rû]÷ò²ÿî<øï~‘/ÿò/gww—ÍÍM²,ãGôGùŽïxnºd¼ýío‡ÃÇy‹ø1êÿß”ø=ØÛ ¥ìjàSß¡ƒÂ<ðr‚D¸ øàQBýǽ0ô}.OPIC"Å,®t€ÇïQ}YÖ÷Sý= ƒNÓSƒú§¼çs…à.à|ðA¾ú«¿ú(· "?;Àòžoâ(zTSî‚8k·ó¯ƒzí,üÞ#|Áko£–ì=Äý÷܉–ppõÛÛÛüÚ¯ýßð ßðœ½ÌÏ<=ã v÷ü†cú(œÝ…ûÿ lÀ=íƒÏ9û8Ý.ÏúCÕÀ¯Óu\ÑsKÞ{þ¡ 9n˜„€³ÿÕ{Þ&Ä÷ ØÓ$“l«“uQ",‡AÀñ ‘¼)ÊaŒ,ªî7ÐM 8a–Ó»‚º– ™Â|‡‡î+¯øÚÊ]–<”}:¯øsß{å¶5ÅåG?Ìgþ©/à7~ã7xßûÞÇxüÈÎÀïþc>çþ¯ùw¯ä‹Þ¿FÿÁw1#TûµOùæÀX[ão½ë]G/Õ¿±¶Æß~×»È ƒ^zmw½ë]¬µËŸþéŸ>ú~Òº—}Æg|?ñ?„û±}ìèû“í“ÒÁÁÁÑ÷²,o8 ÜóàƒÜñ ¿€~ïk¾|O{ž8÷Ã?ÌŸ{ç;øß¼çÿ^ý?Áo~æg"€Oýáæ«ßùN4ð¯½ç»þ莚/yðA¾ô~ø?½ç‡Ê’_~¸ªøñöÑiÓ ßÝk üù?ÿçùiïy/ðsÞóÖßý]~ÖûqÀÿ諽ÿ7_åý¯üU×]wùßþíßößøßxôÝï~Äß÷~ÿ¾·}¯ãßè‡Ã¡ÿ’/ùÿE_ôEþ¢jâý/}»·ßç;ßé¿1WþWõWýç}Þçù/ìõüŸÖÚ¿óïôŸ¡”ÿ48Úö齞ÖþµÉº×õzþµZû¯JÖÅå›ßüæ§\÷yŸ÷yiùÈ[þéÁôï}ï{Öÿå¿ü—ýçþç?å>çÎ;vž¸ü+ɺø¯ÿðëíº þ ¿ð ½÷Þo&÷Òÿ¾÷½Ï?øàƒG×\O¶÷Úã¿ü·‚€ÿ"ð®ýî½÷ßšìïå[Úý¿ü׃E»íëÚç¼³ýý…_ø…þ½ï}¯ÿ‹íïoh—o†£ð?t¿çÜëƒßrÆm gº>ù¨+‚û‰Òáø•ï ùO¿Ì{û¸âa—ÀÉ'í2íóë¿@’ÍÃnq{Â÷¸ý?=7wÿ¢¦w¿ûݼýíoççþçâ©öööØÜܯö¯øƒû~ðùnïù4!øcà{€ÿ7p¸â=_÷u_Çßü›“o~ÃøBWÇiÏùB𯀻 ¶uæcÞóíB𯖖©,Ú?î=_/?Ûêø?´¿Ï—ù—ó›¿ù›|ê§~*{ü _D°Þ"D×(›b&`z…·üÜòÿyòr¸ö~¦·}!Ÿñß%¿ÿ'ùò7½…?þã?æ oxßó=ßïüʯððÃ߀Ä<%íü <øÕìüü/óþwÁC„×}ô!Þ¼ìøQà[þðÙ¾÷¡‡ø-‚®öU<À¯ÿëþáQÂô›’uÓö¥¼åømà[x€¨àüåàÝÀÏ?ð±¶Ýøåï ù/¿ÏGÿ.<÷ÂÀŸ{íË« Ü Â`?øà»~é8Œ•öx…ãõ"Ó©QDšd[ä816<­!ŸÓq§ø2ÿýó0èn&}%aॅ¡Ò˜œ¸Œœ>žW“fXE/ì8ù>¤kPÑåâÊvU©Aû=¸:jXMãï’uià[êŽ\=ï§Ýï³~è‡økí¯­ûáþa~§eÒi¹táÿ>ží³]  ;þL˜Û¯ >¶F*6Žw…y:ôÿ ~û{™½ç ¿.> ×&ÁkwH0v£¨¬éb´-!šð¿p¼æKê„ãANiNiœ±“ÉË]ëq{¬:×Ç—_Ö¿}FÃíæS ‰µqÒ÷”¤¥!Êqÿ”“§Alp|ÅØ›¨RŒ“u‘;×tã„èÑ9§bï2sŠv^“Ü{J!’{‹°xú¬†NºÀñz@iÞ€fÜõüebd-—l‡O6zfUâL ¿úVøÝŵ÷”çê¸4 \þà•3t¾+Žs™ßáø¬bwù%D©õÓ´öc|i±$èâΗcÉ#¥Žš8ñ¾Šã\©~å鿑羆ãN¡8Ø—3:,ǃÒ"'Ž:zÔ§uržô=§Ej¡K6s\wO“ÖGt“ NŠ4½1Jߌã!ñ?]Nv‰÷'ær`\:Iî==² þq{|zÈjº«ÑHI ¦z¡%ˆÀT=Igr«ñ»_Ú7–·H¹p|ÁñþâÅæ€ãÜ-þ¡ñ¦¢{¹¤Ær²OԀε¿œi$“ãÓL¥ÔýŸB±ñÂqËúnêåL߯àøÚpü¹Òë¦Ïšž;¡Y.!¹oº?Or”"CXtKóxc)ò輂.n(=.N€4 .Ò  D/&¦óñhø :{º˜¦È„â¶(I Â<êÑÙPñÆIí­)ü©¤Ž’0FÑÆÿ<ªúiøyš‚çg5âNµ¯ÔæŠã0ý¿Ò¹’º âõ'«´ÑŽŒŸ’Nmn‚3­ôCcÒJ q]vSs<30Ž×ÈC–çJ:/–ƒ3—çP\¯’ó¦Ë4ë1Èi§Hιœþ›†üÇRAñÝGaœ·çŒn¢e>Ÿ!åCéý‹>µ‹R†”¾È$‹ä©/*¢f29O:pâ`I†á¸íZr<‡Yr#“Œ“ O'-ã÷8²äÞ—æ)cK_Ú¶\Q#5Ò*ñ™ã`[fº)¨!–îA$û¤÷IE*dÒ™»ìÐHm½x½åò;)^Äô˜ôÝœ”"¸ì\žiËÞxÿ•Dß|]OïLƒµPù.×A7ŸæE(2ºœãaUi–iÆñ€Ý”ù¤‚w9õ: ªeAçÎQnÛqÙ;(赬Ʒ¼¡¼ñwZ¤#ó«è¡ó…§Å=R%r¹âMÔÊËäâù"¥ã>›éÜJçjZ!óé{Nßk|ñ¼Ëó3eò’“•,¹´}YgKçK)*àq‹Ç €J¨ü‘ßT:§R(½©J_Fú"Òþ}Q‰’:-i”´ÔôYñü©öÒ,­•š½©Y¯E Ž.8»˜2´à^ʰI®—¶bH¯— ¿ô;ýãâyOµҀᨽĉî’}â=¦VÓI‚jùÙ"JŸ–•Š÷Ï3 ›x©@Œ#«€÷³¢ç›ÞNç²L;#,Ͻ¨%Æï=Žƒý‘©§Al;Ï2‘8÷ §³×y`òYû=6]Sš:ìW ÂRH054MÇìcý‚κ‰óªj?Ñ"H•·x,KëR(¥¢›;qü¦ónYé…ñ⸎专pi–Ö§ü U°ât’’»Ì‹ã9Óøêå,úe"upÀÉÌ_âÆÝw)£Š“>eªq?–ÉqñÁ£™zêŒÇ/kéöø{Ù+×¥)B<ɹÒu'1ò”1FÁ˜&¦AðéµYºfŠÆûZÆÓN—\#-c°ŒóÅ{‹&ß2,µÜ:=ÕFTrÔK뤃óÉ4›ƒñÓ¿ ©UçzdäË~†4¶$*YÖ1xæm}{î"0õ¼Y¦Å40þbM€l¤Ò°&X63sŽÀ’0ö¦tÎíô>Ò¤—_VNS‡%ÜÈC#ãûÕK÷*þY Áq)”bƒ}:Œ®—챨x“i(A|a©ä+8ÎèRÌ7^?BCËÒsÙy’Âñ÷U3;Ÿ ¤eì==Wêר9ÎøS†€”Á/Ã<ñ˜T, ¯Tão8þŒ‘–÷Kï}ÙÿÒ²ãN8Éy<]ÔäŠ^Zô“÷ 1 &8®!B€vby°,L×íÉ„ì…iºu´ç6 8‹Ùñ¹•úÿ"üñÿØÅ3·edà$Ü¿ZÚŽCÏQ!KkÎFZžÐ…ÅûtþÄ}¡¨±XÛ,¹N ߤÂ6>K*xã÷ÔòOC¶Òy¾ ý¥‘±6n‘Ügê‹‹(‰øðMrƒéËH!„¨u¦û¥bÔÒ¾¼Éù¢Y™:Žâõ¢c«NÎ]ÑUÑféÜ©c(}¹ËÌ5=w’š‡©àK^ËÌ7Z&¹ŽåÆ?)-H–žk»_v“|OýËZDzà‰ý+ñOO` ü+Z¼ƒ–aL—˜¾5A“ÛâúØH! „xL*8š*Xñ<‹ªÃ÷çt|"~#£"v¿¬Å¹ýËs0ÎË( N jH÷L1Õ—¡eåiî…  ß|z»Ï»è"¾â9RОgÁ%²RŠ÷”·ûÆgH}¡1h µR8ü$?~¹¥ÀòÞ5zµÓ~}©‰™>LªÑ¦ffdLÃOã4SÏvúÂÓ6hËÉ‚ S\´ä¸Y•FäŒy±4Pâ¹¢“;6’.Ý#ÕÈS'n|†åA˜ž'…‚H¾G_Ų ¹Ö2ü•ÒòÿùǬhEOŸþ]ëÔÍ{‘—ÓŽGgo\BØGµ“ÔÚEèÈù $ÓàŽÐÌ„Nóñ)æ’²ç~ ¶_v§ó ÎÇ“–­éå˜ñå¡å¨ eJyš"ƒûÂ`—øp-¹‡È#Óëœuç÷2#_¶(RH=åßiHo*Ü, ~2±"³rK7šIËßÓЦeA_~ÊÔÓµèåÈ‚“¤pНE“,e|q Dí:á‘%û,;bS!’:‘Óè€åw‘B4 Ç6Ç%E²$YŸF¥½zR+½¯ã_Î9É/ò‡¬hEÏ=ýêf`äεNÞvòºvàÉv W È’¤Sïó¯m`ú݋鄶Å4ÃÙ–f•³4´< Kç;8I±“„êy×è„F¤eƺì°Mad’sÂ1úi²É23_ö3¤Ì?Z>Ù7í –úh£Å’BC)*s–KÇ)¸ïh@ܦ¤Å—³,¡àF)š&:Çíi5ßO™X<¾Ÿœo9Ì*z´#^¸|O©ö:ª—ÍA—œ+eÜiÄ€ã8“N!¡8HÓl#»týe¼9H&ÇÆ?z9¾9u§¥_âõÓ{PÀï±¢Ý<úcÐ-·ŠNbçƒpð.ƒº šD &„ñ~Øž#ÅðK:x(u\FM>íý–2ý4' ~¢Ÿ2jÀiƒ”4<9*_ÑÒ?‰–£èì ßS$D-›†Ú¦L{9·6Uì"Š‘*ÙËÊqô,ÇüŸëÃq§°ø…Ö‚‹VÀ²”KærztäFoyzá4Lª¡ #´É¹–­MçÄHÿ„‚?ìü¡Ÿ©ÀIÎ"N–úÒ¸ÿøgÆýâï¨Q¤Mã³D('õäÇA¯Ï¿ìHNš’:¶–¡¡åÿ"¾ã—^ǽ”è—’ŠM ÆvÖyLýJOŒØ‰N߸=ÎÑe¨7uÇ9³©ÓýR^póÎqÇSÆ—ë,ÇcH¶“¿œ‘†…’\' I!­¸=õ—¦Iz¿'Ýgª‹wÝ@ªéKœ61ÉÚr±SÕy§ÉW‹Ž™ÇíÎ…¤u!`Ö@ÑLºZ„mJ‡”ð¼i|q.·kU‹ ²ö¾t`«T0Å{Ž‘ Ë­…øœ£Œ/-M+OLiŒrÚ÷Í$Û–¼ÑHMº¨ñ|U¤ÎŠV´L_G礉q]„âM9ÚyôDFÝþ‘™/¦‰¯ÁvB#ÂWÝÜèxŠB Š˜¹¸üKV´¢=ô:F¸\+Rªå¦9@©ö¾œ›2ÿxÜ2\7&‡.÷´8©„Är"hºþ¤<«Ø'"Í„Ž‚#>KZ"µ|â=Ù§¸#_ÁÕ/ÇGxÅ, ¨µ§ðŽw]a§½Ôe§ÇsE¿@´"ÞÞTs¾„^?‰”ZJu)éÐ1hç:ÿDÑž'BIQøÄýS+$Ö0‰”úA [ÆïóI°B¢ è˜ûãÜ­hEÏ)½jéwZír9¦?¥”IGM>vå:IPİJ8î”…ãKÚÝ+F¦ðOʼÓïpÜr‰çÉgÙ:I¿/—éI‹jFüy_ ˆ¯Æ›:À.Ðeîé¼cðŸ×Yо£7:e!0gkB¤µáØrÞÁ7r¬˜ú"„<$d[90±ÒðÑ胈Ì<©O ÖO±÷Ÿ !ƒ#ºiºÖjÞ —(@¢¥P¶µÌßòÜŽç­hEÏ’^Ö.SÇñrN@dºËa›±÷Aj,Ã9im±r‰pJZM -~…IšÙŸ–†H™|z½¨Ù§±þ$÷ϽÜ1õ?¤QF©ÿá¨3ŸwAsÎòNc b8hÄÐ]ô ÁÑš ‰èŒÑôÃW*ì?Ì œ…}{ýîºñ­©¤hU´¢ÅQ ‚ ˆ‘Q5ðçg¬hE+z‘ÑG“ï÷¶ËæIÃ/—­ƒ‚ãtáÆŒÞ4Ï`938eò†ã|„rÒˆ!¹týåÚBiùŠcÅÛ8^âÙѤL“¼Òým{L T‰YÆ .ý|ŒÂ‰ZuÖîš»JžÔ4­æ™Æè¡ø£xI²¤¢sµ©#.çÁ¿pæ™Dù˜º³¢c:2eï½E'uŒ JCPchišÛ·îtR]æ-‘rÖ º6j(ÂN1¹m²_¼÷|á­hEÏ5ÝÇÉŸ©Öèy²rÌÞIC,OÚ7qK»ûÉd™  4|õ$ǯO®› °´ÇÀrÅåå¬åÔâY†½$ ®%>Â!:ƒáZËðcg¶j~<{,Ø“º¥¡³+¢ÈKí®¥,¨r˜n„jÓN(ˆÄŸ)B1:ëüÀ±Ò´Þ\?BE©“9†ƒ¦QHÓƒ.Œ5ž;ú @Pÿýåçz8®hE+º!¢´ejšG!—åþ&iødzì2S” ›øI¡™å `¹t|š ˆôÜñ;tQ@iNÃr‰øå¶#ˆêúWâ³¢ÃÓ{ƒÆéq\tEÑ…CZœ&ñÉ0"驇w„ eû}ڬÝ2X uÛÔ;ð¾ó¤I_‘™§=ÑÚˆûD¿tqÿÎuQCÛ?úóÚk¼á¡g:¼V´¢Ý tw»Œ0PZ8âüi©úßO«QGŽL|Áq)îŸfGL?Fï,3æN×G¡£OØï¤xÿÔÏ!’s¤a°inƒŽ¸¼Ò¡dÃü°ÜäÇ2Ú·1n¿kŠ|çª «™W0l½ÊnÃmh¦‚vp Ôuð¦™.È.UèŒU—á[-:¦aŸX^v´ÑeÇâpº =2XB‚/»È%¥Ãó™&øb4Rµ€ÏX5»]ÑŠ^òôhò=ÂC5Í-—sˆAŒæ‰Ì82óå Û˜˜E²·+}š¥sÄ¦ÃøÓR»·É½¤ýR((f{º¾ …CzÜþ›B5м×:q“R®Gx¾$0ü\&^@Ö2ø¼-ôãL›ÅµÑÞñ4|Ÿ^Œ¾HÖÇ㜠BC÷`v9ü޵c¡ºZûô1“·l°¢õ Ôe+lp Ö;|?6¡°6,ct‘”á²R„s~ú{_Èá·¢­èÅFwq<Ö?çO!•´ ~êN™uü†{žÔü%M\K¸.¹fÜ¿áFdz"ôQ™Ò 8.(ÒšH˾E+t~œ9ŠöNe´qt{¥ø=/@è ÉK„B>„zÕ~88…} ìcK0e`öQX̯‡}u/l‡NxÌ.·xP{ݘ}¥šÖqÛ «90€ýÇ‚Àع4û™C<'{áY?û#/ð([ÑŠVô¢¦{é ¡´éRÊô—³s#E5þ´ëâI¡©:Ù–âüO–©œv #Y—i“,¹F<çQøéü›Â9#Þ íÞ†À\#Îßtª˜¶Ô0¾½…uzêq&0õzö)÷;m‚ ð­ÈF Uàæ¦ ¿uTúfÖEQO»ãæ¶+Г8™³.á¬èÃè˜=BQë20ÿOý¯7m|­hE+ºèetL|¹»W\·\?ÅÝã~šãBb¹GAZÚa¹Œ3ÜØe9Ó8êä©Ð‰R¬RÇ£žRÒy/0Ìá0œÍ¶6ƒÚLλ—€®Z'q ߸¶Žs¿lÓl‡„õÃs0¹Ðiý½°Ý”P(5ô·Ãù&OtÖ@ÿ ¶Ã~ÎÀÞCAdɱ³ð´ èkè»ð*ƒæju wþÚÍL+ZÑŠn-Š9ÑaœbîiÏœÀz"SØ^ŒEYŽŒL?Æâ§ab5ÒÈÌ£ðˆŸåüƒ´ªgô%,¾#ùZGÓ¾áŸ,oÃ=G„n Ž{ BÛ.Q<ç_uÿTÐÖÇ·æ<8ÖåCßwµe›6»ÜYÕ~Ø^l´Ï zëí˜ð‚•`¾¶G £žáRí·eBÛ7¼æ°8€ÁOÞìá´¢­èV¦» L³O×ë#MÒŠpLt¶¦íc—+FJµñ£ÆZtU…£àH[Û¦uŠÒ0ÕÔ9!žØŠ7eøñ^Ž„ÎäëC"~}ÌM㔢/ /:(Gµé–‘ç#(Ööþ©Îœúb£Ãùg—ƒÕ`Ê Ý›20rg¶¨ÙA°@8gt ÛVû/÷ÛåAÕA¸‡‹¿; þ›=lV´¢½”è>Žw[¦47 í>¶Ü^w98îŸöSO})ÅÔ4ªg¹?qtþöé„CìK¯%i-ÎßbYŒÄG €í‘d7¨®‹Êúí<#5 Ï :øG÷Âzè„E=í` z˜ú|'l‹ÐnѬltÜg°Øi­…$¢(ÂLWþâ­O¼ÐãbE+ZÑ'ÝÅ…ÜÇcøS‡ndø©0H¡œ´ºgšv•Fî¤ûÆui¡¸´8] 0±K×q´Õ@ã®Lr]ÂÚ6á÷ šx ñt¦‹æïL»Øè š(T¯ M…)‡‘Fk¢Üï¶E×Ï®tŽá™ A|ã;oö¸XÑŠVôIDwÐAA1Ê&í?µòvI¾ËÂ"­šjô'õ H³}Om™@'<Ò<1ýÆPBÐQÁµ‚`Ä„¯4Ñk|G‡õÇHŸ Ù20êõÖ}¢“h¡,që"8{û§‚@X¿'hùõ4Ù¾š(D;á¼½NH ‹ëˆ?·ÂzV´¢Ý<úR‚àÃíïXõ&-ÈküCg ÄIJˆß§å"¢æ.—ŽYnj“–ªH÷M[A¦a©©ßBKâýERB9ÖR¢~„l_Ýʶh ˜20ëÅõð{q6ï‚@êÀà‹ è#fÍð\`ÞÕ~‡ãÏÂÕ?‚í¶º÷`;[†D2[u>„S¯>:V|ÖwÞìÿ}E+ZÑŠøº ¤iéXm¹ÉLÜ/ºWã¶´$EC×§<Íæ@Äý£FŸZ1O íV$÷¯¥cIç”d©[ºE|ȆAK±ùå~§‘ë^kÇ£w²QÓðHgIDÀc¿ÕAAÅF8×ÞCÕpúÕ]Æðä Äg¿õfÿç+ZÑŠVtD#0Þ;9ŽûÃqø'jï·O1ùú‰¾‚Ȭc Î(`Ò =1Ä3–˜ˆb¹üCZð.Dý—ñJì%{ÅH GðuHüÐùâ2MöŠÎà¸.:l#¿Ggp,¡“ßÞ1þ|óëˆOû–›ý?¯hE+ZÑS’îI~§åŸÓ¤±4<4®k’u1Ï5Í0NÃK#¤ä–®&§-û&¢²€0ß„“êÓÅ ÐÏZ[Á³XïJ8DL‚¦DZØ[̈ŽÚâ-KÓ¦P¬Ý@±¶\áü+ZÑŠn9*C©µôÈœ£ã7…o–ûÃñ2iYêôižÁrW²´réZ»M«¬UèS[ÃÐ1ÿÈZçl> LÙ$5—u/`þ³ËGZúQDP3í ŸÞFÈôU½à p&8~{ë.2eXKJèL¯¸çMÿþfÿ+ZÑŠVôŒ©.ÐE ÅP͈ϧ‘;ËfÒ¾ZÑiË¢E‡ïrÍ¡“ö=êÿ›3!Ä÷ÿVü‘æßEȨÕm¬¿$àþRw8ó@÷º _]„hè Ä™ªÓô…‘>ý¶´C,·¸Þf'!¡“ ˆoúí›ýÿ­hE+ZÑsBcà6NΈ”âÿñ÷rc÷å ¢ió¸±G@ÚR2­l  ÄFÌ6ÃÀ¨óÖ ÛÛè¿R&ãû¥NâñËÀÜ¡«¤{Àz‡õCg)Ì®á1þ¸}ÅüW´¢½Äh\ε¿—Û@¦ÅçR†ž2z8®Õ§mZÇH, ¿ÇõѧE‘E{F7 ‰1‹ÚRí•L1ãw~½]oƒÖCD£o@÷Bî€)»²ÐRæßÛÚ?@=E|õ;nöÿ´¢­hEÏ ¶ŸMà46Ÿfú¦Ÿå†ðb阜ãþƒ´Ù}Z~"BO&Ù ªµ5öÉþz÷@ŠiËà¡ÌtîxB˜hëE…A¬ñŸ‚@ȇA¨< ³Ëˆ¯ÿÕ›ýÿ¬hE+ZÑóN{ír«]ÆÂniÿà´”sô¤ 9),2úÔ§f%§–Eú¨€´†y ë¨òi@f!+†h ¡ >xykwƒ™Ãð|›°µµòaçX»½=ç,l÷¾­<çaÿa®?üGœþ›«~Œ+ZÑŠ>y(Q{Oãúc=δttlb!è®9Þl>m2}i™è£ðSÿ=øЮíi(ÖB£\©¦ŸÁÕ ûmÙç;Á,‚p(Ö „ï2ƒ¬N·—]¤OÑâü½íÐf7ýâÍþV´¢­è¦ÒmXhÇO»|ù¥uÐ1øt}L‹ÇÅÈ¢´fP2’õä"4Óo¦/ô7ÃwMÛæ±½-Y„ò ®fµm7öfÕaÐø³A`úÑ\O 7n} }˜]âwÞý‡+æ¿¢­hEÀEà:]BX ëŒðN\¦¥#Ò¤2Ûçx=¡Ť±¸°šú[á§÷08Ý2íyÐî‹5˜_ëjðÛEÀøëIøíMX§Š°o> šÝæ ôÖÃ-èafÁÿý›ïå+ÿéïÝìwþ¢¥ÿ{>Î+–ÖKÎ?½c_,¤Ú‡X~û,o2FJا¹¿ǯïçÉ®³ßß2®ü\‘7®ó¾ë+~ÒûHq>Œ¿¸ïÓ‹/UºBøNPù˜ØÇär£ø”¹§ÝÅRßAÚ‡Ø%ûÅ cÍðL`àÎíßY¨¦àmÐþ!8t'ÂáÅz`úº´~•ƒ–Á"*ø ¦—‚axºmð¾ Íš9ÿú?þ å_~r2ÿ§;Ÿ¯ñïOø.xzîÅ6'—™ï³eü‘btE<ßI×Y¦¸ŸL¾kÆwË4|Ïúgv¯R´ àiìŸ2Γî?…à¹û?ŸôÞüŠFzÌ‘öš¼%^|ãì…¦«„ñržN‹Eܺ÷‹ÌE†žf/G Å´Œãã¼4ÅÄzûÔ³àÌ•±JœNßl´|©ax;Ô‡à]ˆîQE[nÊŠÖÓ ù›*t˜)÷ ž ¾úßÜì÷{S)eºéï‚ij8f™ùgyžç›>Qæ¯ExÖhZ÷$”®µ í4~ÏD`V… š®ðÇk¬GtÚÙ°¬‰?­÷ãYñº)ýxû.7'ºôL4ô·[|®T`½Ç× M×ÛÏ+銷ÅÊ¢±éL„|ÒZÑù ]4Qš]¬“ßGå§ý?;ïQYÐäU?0nïC÷ã¯B€³á·ÊŽ ™‚‚AÈà8ÎGÁJX\C¼ù?Þì÷zÓé¤Áý|B=O÷žŒž‰ú|RdÎwŒîÉžÍ&šg.;xZFß¾›ÈÄz2¬¢-ÆÕîo¢ÐóÝÄRí9¢­ªe]÷¾Œï x çÛ*+íÒø ´€Æ¿K÷wÒ{x.ÿT)¹ I(ñz²gÿd¥O!´hZ=‡y  í\n*“6€I-‚,9^ã[Ug¾ ›ê°l˜|ÖO"}tÐì}Óf Á4!´ž„[ž Äb&ßò»7û=¾h(Õ¢Ÿí8?i².ktâ)ö}ºt3&â2D"Ûûí¶ž š·Ç›\;ÂqQd"AØ×µK™r{¬’PÄíR´Ïìi\«Qû¤…Ÿ©™!ºs9&Ÿ÷a¯$sžÚfo}ˆ¹è‰N(@U;ƒM‚¡§ÿáIŒÙª|¦$–¾¿PVê2iýqa½¢@$D½ŒÎ)œbüq§É`ôüå¸Uš†Šhšy`Þˆ®¾·­ößjþ½°] Àä"dkÐ[k£\ûÌGí•2¨§|Ù?úm~é®Üìwø¢¢çbb=•éþ\1ÿŠ–5@A`ðé}-3×ú­V¯Ûãô²Æžœ7—­Ö,D°f®ê½G P-A¶Û¢°±Þkâ­¤@(´Ä·°=:W¸²óA¬wÎc¬G[m…óP·1–ð]Š€ÉÚd£³z¢ÿ R|gq{¤eúLÿÿžL…ÚJó?™öÆ>ãÚ{¤Ô:ˆ%¤Sí?eþ©¥ ™OA)¨Mh¬[H§X‡b2}½ƒÑy˜_†}8÷±g‚Õ0<ÖyÕ”Ïù;¿Ì»?²ÇŠ:z¾Æ÷²ƒï½^ 5¨„A§Îº£k,i«)£Z@’°oÔ¦më$í©¶‚a ­D¦{åÈdÐþ•h%JàGJx{±¨‰‹–éKBŠÀì[H+Â3J†}-ƒ§{Nx‘hYR©p‚c…ï 'k=y¶ sÃ:s ­Ç{Oå‚€‹Ö€i­„Bu ñT¾há£4‚æ¹c'ùn…â¥JÀšã‘<Éb]%Ðè3È’sÉdð½ýOE»&#xrüÃsþÁXgp:„{Ú:D 5³€÷ÎÿÁá^ö¿ÌCWæ7ûÝò”2tÿ$Û¢£òÙb§)³ŽÌ1Â&q}ãƒV^¹¤¡utàµÇD|½nï!2ó¨}¤&~¼_•\/:aSK B4ÂCžK2˜°RâH#÷­´È¢  ÍŽô× -E¸žÖˆ´Á@€u@yà !pÞ£„@ Rîã;w€ðž¦1!e_œwxçY8°ÆYµñXëqÞcNbƸ#í?±¶nK"ŽÊ ·¿3Ñöõá¿N€<‘Q'ÑIÖÆJ(¼p4$ôŽÉ\ŠPÁ'DM?þ71³8ZiIh›ÂgmÚ˜³mîVrHÃÈŠPºØì2{ Ô!‚Øøæ_æ`Þ°¢Oœ–À“aÿ'…ý¥a‰éñË”µŒ¢¯S[Ž5Ö'0ñx®x?ÑYœF¿ÄsÇ‹FÁa}Ðæu»âÈi%=%:k¢e܈ÀP‹{Ï2‰‚\­>Ö5A2…GÀxO&F ´­•!ŽÞ› iÏ#ƒˆûùVYïQB"• ŒÝ9¼GÞcƒò>ÄW·¾c-sçÆb}€ˆjãi¬Ã˜pø`%ÔM°‚vi­ãÁ¸Îâ¼– ,¢!F/EH, „炞L 9iÛŠž?Ê€¯¥ÓäãºX (mC?IÖ§¾qñKñÎAÔõÎ è :Ó^n[CXk+zÆþ¿½Ö¼³+ˆïXÕóy.é©¢†ÄS1ò¡ê˜nÔÐŒ;Z R$ ]%ðLÔУ¶™<œë ·µKô.ÉVEl<Ÿ£Û·§D`N¢ÃÙu+Ž "%(D€|úRe-%(¢r¤$“"i›'È” “¡e°VÒíµ‰ÖA{üY%Ù‰ƒ¿µd+À£¤®gœC ‚Â{jkq6€ú°Öa¼§´k,ÆX¬XçðÆRZKc=µõ8çq6ÀDG[ÆïǶ–ƒõío:(-’óÐDAá»h£Æw묿Q<+áÉü +ðÂÓ·Ñ%0¦Ì=ÅþcrXÁp^ˆÇ¾¨ûïtÅ TvèÃD¶½ÃÔf»Stñö‘ãXü/³›ý>^Rt’yýdL?µ2ÕýÙ¹8nÊ–¹Æµ~D/ij"0f8¸”q¦&€mªñØ€„æ|“'0Òæî…ød{¾\ „’dB0–+%¹8}®$¹”¨LX¦=~Mæ-D³)3)e9ë:Ç6µiÐÖQKAßû€ Á(/pÀ”.žÚ¹T I! ²+³ëÝQBŽç=38k­ÕᜥöžÆXjç°&¸‹+c©­ÅX‡±–ÒXœ Ö€õAÐàëV XÖãÍ?BW´¾ Þ¿uZ²®ÍòôOÁùÍ-\8ÿ³±žÌ‚€c‚àCŸƒLßÈ{Á'\ ‚EІ•>âþ(ì×;ÍQ‘ ñoökxéPʨáx\ûI™Þ2ï"cÖ£ jøGx{¢eK0õ£ÐH%2b…!i!’ A+ÙÂ32À.¦ +ðF¯£[¦¯¤@x–é=VMvŸK‰/ƒ¶/d`ò¹’œ‚!(´bCª˜Æ#ð(Y3Ÿ:Š~¸OÓxœTµeó”f0–ì] í1Ö·=Ööè `ïZM^êR°˜{¬…L{Ö¶2ch̘ÉnIÑ3ì] µóž¢?RX›1Ú±»/©LÍÂÚ#ç›pé,ÎZj<·Ú¿i Ò9ÆÎ±Óö­¥´ŽÆ:*ï1Îa­§l9w4ñµ0«ÃÎK&FYŽ1ÎãÔ.•Ææßx˜Ù0¦ÿìÁÓ±VV KßCWëgAè<æé:ü¦a£Š èÔ„šAºiÀM³=`Šå¬33… BÁû ”†EÝY-nöã¿´(2ìˆážÄüÓžŽé²ÓèU" ây¹ Z†®ÄQ”D Ú=]TLð}¶L]a et®J´”ˆ?w­¶ªeÐìu õènÉ… ‚~»>`ø‚¡VH­(…P’T •äŒT4¦¡©kzÚ£µd°.X¦û L%Ø+!³å=0*-Å@‚̺2nÐ45MnQ®á°4H¥È¤ ¶ŽEk4­eд’‘&S>˜ÞV„ Z9à#ÏóP'w^êõ¨ÿ‘® i-‚( ž)}f« „’GÑ5ñœº¤!jë-§Ïd«á'á;‚6ŠF†H!YÂø•”()‚”²ë_*e8–h‘¡Ò—!$[Z!•f#ËkGèXLt®ÉrI5·ìMÆ=Koè)gpyÇÒ+$Û›Šj¡ðz=OU ´vôG! ö¯RC]z2å,ZÛ(ê ²Üaœf^YÖú‚íÛ4ó‰ÄÔÄÚÝoõÀ=^ßiüæ‰ñí2†M¶xÒ–q~ ¹Gø|Þ†EÊVk2D¾d*0õ¬Å…´”äJ¡•$SòÈÈ”$S -U8¶ÕZ•¬ A_JÀ@I2í™î†ýpHe˜O+@Ðh&j :Oc`8”x/ЙÀÔá~¤j;‹jÁxS²˜z®î N=¦Ì&5ô­ëÔ­Ze)Ö‚5žÁX±˜XŠàp♵‘>…„\K|í(´¥¬`8j[eè !¥ôGc,u)ñ”ö8*¦èLRWïA)‰G2Þà3ò“õ{˜¦ 7ês¸_1­ Ê6\±†ë.0z/Ö{êÖ§`¬£¶–Ú:¼sa[»¾iL€ãDð%T£2k-ޝZÇmŒ¾ Ú|´ E«ÝkÕ1~/ýÕ(…Ö ¥ZÜ^+M®2 ¡‘w¬iƒwÞÎ"£u%0MCSv'k,¹H,J c8Ø 4Ë$ÞŠÀð F糉eR9ƹ'/$³Rpöœ¦?Òx'˜O ¦‘Tóà¶ÎÌâ½§W8êjk(¤B©ï8¥°>ôH²6× ©Cõ¡ñ Z·³Žµ ÷ S '8¬T4e˜.ÖÔÐHz}E9—ôG0/=¦gɊฮ­bЗ€¦7]Œ™¸‚k@iŒ³4ÖP[Cm-sm´£²–Ú8*cZg² ²6ÀI•¡2ÁÑ\G]»6Õ³°Á70±³øÙòÞ´ŒƒOÓlå8ÆÍ y>ê}2Ò7ÓEÿÔíº# œãâj@üx›ÉÞowÎB ˃váOn´'SðÙ¹ÙùÒ!•h<ª…n"®ß“í'»Ú©ÖŸ·ÎZ­eÀú[l=“"d±&Otâ†ä*Ñ&:µÖ„ ΃L)²ÖÛk¿n5}-ô£¤$o™¾”ñ+¥È”¦'#©ØRšõm‰­gî2™6hoЙ`·!ËR8²BR-,yÚG4µ¥?‚¢ï¨’Ù¾ÇxÈ3Åp,é %—®8Æ=Ç|½žÀTžá:6¶óCpÞ1Z—8+oæÜöò³\þX ~‡rVsù±š¦n˜×†Q°V¦Uˆç¿÷lˆœ®–kS“9V‚Sç%‹©¤œ{¶Ïy¦‡Šýiˆ‰íç,ôú‚ÉÜ!lÀLÇ ¢èIv¦’­T%äEC]¢tll Ö·G\{¢bZ{„¬õ½aF¯¯Ø<·Îä àʴ᪳A¸AÔ8‹±–™±X¢jçYâ6ÔuMmem©› šÆQ7Ž™ âÊ/Káˆ72ð#Á¯/Kµ›NpZÅü¨Ï*Bèy¤o£ÃýӬߌ®=äÔüÃà%]pÌ‹HÑFµÂà“›ýx/ŠŽÛ<éçh߹财Bv¿#Ĥ¤h’d:…xZ<ŸÎ‰+Û¬WO€#´ „a*E_©°®Åø³ö·R’¬Åö{:#S:|¤BII¡4ëR¡¤b­ð,&×i Î:„²,&g ª«JÏx]°·ïèi‡TÐhö÷=ª}Ö¶Ï &{0ÞTÑãêŽE9Ûfüz²Ü!¥ ®ÀIÉýŸ2`v(˜ìÎ8Ü·T^0ÔžbEßs¸+¢ÁYOµh¨kO¦%YOajϤrl ¦QôG>TEÉó‰eá<[kžÝ(lJÉ™;;A( Ç’ÙDÒ.îx6sÏõ™£ðŽ~!)ú’Ù\°pž¾RäZ2¯„sh,Óæëjm-ñB(t.ij‰Ö`­äÌ]ªjÄ¥*ä8Ki Æ4xïiœeᳪf^54Æ0k uÕ0oZK q”•ÅYhÚðÓ”¹ÇtŽ˜‘KR,×&ŠÚ¤qoT®Û– 8"Z1ÿ燾Ž%*º¥ß)D$þE(ýv¬•XŠi‚ ˆÝ’¾þf?Ý-Lé»ÕÖu²):GnœXÑdî%Œ_*AÖÖ¤ñ¢+ˆ–)qT«¦¯Bæ«$LÞ¢uì"¡'e ûD A¶>I_kòL㤤q}%)¤B´¸þ Ëée›RqœVšSÛžý+SŠ~Å^¯á)g–ù4h©rüH‹h-˜ÖŠHáA®\2äpž… 3RSù6C×{çÚ¶x‹g¦gû!4²7xï(gpxhh„`{ì)ŠkWÒtî¨&XY}Rcê +`mÍry_rj`èàp×Q—‚çÉÛd:ƒ`\Hj+(´gý”âòŽd{,ð^0Ÿy´ ÷b§Z€Î¦åžY£ ‰žÃ]ËbÚ`ƒLq×==¦ÞÍ4ø"î8Rf\?Î3)о Zú£ŒI=䪔”ÎQ»ÍLÃb±`f ³Ú0¯ƒÅ³°S[Ê&8Œã˜„®Jªm³˜ñ]F³k“М j¶>Š¥­£P8–ˆÖf%ÇGQÀ|!rÊyM­8w”YÛ/$¶£ öÁêé9ÖžºöïØ8­8Ø!$gË ¿Þ[„r¬mö)g†Ã½¥óÞ8 ïeŒ­a0ôH¥(áÝó©ÖJVòBÐÔGÕ sk+oJ¤È¸÷µWÑ,æ5‹i…Ò åܰ˜¹PÓHJ¶Ï(Ÿd(COxYÆúPQô=ÖÊl¶©:“ôGk\”,ðL›šY5gn ³Eż1”ÁÄÌdÊCí=ÂÇ\6éŒ6Ó›Öï<ÂÅRÛ!sÙ[Oݚƅ$4ãnÌ8ŽŽæ•ÝY¯YÍŠžúëÿ„ÀËc!9KÈáòiǘ´Ë|ÄŠjà¹ÙOó¡\æ#yúíw!ƒ†«E[ÔLv¹C•º…t”BY ´ô¤À·IY1[W+I.d[Ë&8…ó6¢G´B@JAO”V ³Œ,Ó(¥ÈUN®¹ÎPR1ÊrÆR±¹Õ£×;`÷â40¯i…³žù´AJÏbj™{ITÖÐóÐXÇx š t.ð.hþ™œ»]sí¬¯y¤ôx'mxö®ÀæYؽœœxÒ!2 {W-³iÀìàL_÷ {×a8ì—’>Ìj…±6X°ÂÑJö,kC‡±ŠÓ·I®\SÍñ^€pŒ7û×C¨¬qS74Z3\—Ì#X”Šºý¯FJ2Z!‡»)J½¾eºï8u›äúUÉBIJc9—ÕH­¸tµæZiÙ°¾&ðFb¬ãôyÅÁ¾FY‘ñ²×d˜fëOL0&LÝÃI€Äòžd8ÖHÕCHC]*¦Ûç9p–y½`ZÕ4Æ`¼ÇØ1d¼ÇºP|ï ÔÖ!2Gù!)Í»`u9BJM›tæm(Kј¶ÌµmÏk;a 謂*QMW°ÐóKÿ/?/€9CØÑ ƒ˜¤´™|\ÑS“ 8z³ÿ/$IuË®lqh*âmÉ„˜8•«®ü±”Ùb³})С°=š ”ôÛ%ma4­T„ó©6t³È4…ÎÈuÆ@çôTˆÑ ÉöFES.Ø¿X3Zk˜îÕ,¦ŽÁH²˜YšÊQ:XÉ6“ב—’ié‘Þ³»ëÀºÎÈ{ŠÉéSŠÉ¾Bä kecX[oøèCžÒ{®zúm0;v.;vçÁª(‰Uš;žù±É"œãÔ+À=®™ìj‘ƒ±&/r²Âs:wì_«ñH>òØÞÖÎìвW{ÎÞåÉòœ?TSZƒpª\3†¼ÊèÿP;O&áìmм\ylŽsÁbÑ^²h—Ãìx†G5‡±µ¬ŸÏ¸ö„¡‚ÙYÏþ¾§2 Sã¹z`9µfÐZ"„a²JÏyß,(z; •R§ Ï|V!E…‘ŠíM‰ôÎ zäkk\™;‹uŽÆ9êö»qI¨?$}[ÍÔû£Ö¹.ìÔ„ZGF…s4IÖq€!Æ…„3/cÑ;wT¤.o…Aã»è¶( "­¢žŠø¿!øx#ÂÓ#$މœ„Âq¢ø»7û)^"$€ÛŠ®Tr&^èÀ°3¬€Øœß5.‰½²…}2ÙEü@X†óhzZ"”""DøB¹ Sòɤ@ŠÇ^hM‘ä:§PŠõ,'«ô‡‚½ƒšÌp J[¼3Löf„µôòN9Z×ä… +Ö8k’ƒkžGw+ )Âζ3O¨m€TЦ†j.˜Î|HtÓ‚YåÉ¥`ë44 \¾fÐÀ €²‚Í-Áô ¦1Ž¢0ìíA/趨ÐþÄa€³[ì_—lV FšÅÌrpÝ0iÊ{zYˆ¤šTžL vmðIX›R°µ ‡Aˆj­¸óe9}BP4†­-¸ýþœ÷ý¡ÃYË0󡤅omáX/ 2‰§È%ÓÆ3Êe)Øi ‹ÆÐ4a€eŠ‚ þÞÍ~‚— àºõ‰öŸiy”¡« ‰<‚`vDz¿±<³”‚ü(v¿Í´mµy-%ƒL£• ·ZfßVÏ”’µ„¡œB?ï1Ò9C­É´c~8C2£71÷JlãÀ[tÖF.YæsÃÜyNrœƒý&d¡Ž Íp£ M½pì^÷XgX[SLŠÚÀ– HÁíg%UÙc²h¨¬¥ò{aKA¡Bæn¹¨¹¶×°h,°é=›ÛS+*#p M³g!¦n‚SY'êzORÛý´¹æ¹~3…GŒúµsVAƒ`î<§KvæÁRËœ£rž³›šý¹dVVܶ)é 3._6:ˆQdŒz‚ÝôZØN!Ø[4ìÏæHëä’GŸ”1äÂsh<•œéeh¥8h,#éŒ`1uŒÖ`gÇ1ȃuMo³u®`´¾ÁcØzÊÆi…ÊF4f“+Æã´Æ#pÎbŒ¡25•i¨MÍÜ4˜¦¦´ŽÚ*ò l›|flxfœ£ò!'»ø! ¨Qï1mε]cœÅšD‘é/\'VôÜÒߢƒbÅP ˆ·-Án’®Ž¬˜ÿsI¸Ð&piI®×m]žL„ðÌB%Û"j.Ô:_x(THØÊuˆeÏÚº÷¹RJ‘e*lCÐËtç%©èéŒÁ Ë93ì±¾í˜î-˜O yn±V1ÞÊé ;g,çÔ¥ÅzÙ5+ MU£µcóŒ 7ȸrCA9‡û_·ÁCœ3ŸWÔÖ2ÊwÞŸ1›(æSÇÄÀÖ@¢µàjÛCÈ9ÏÆXsz#cvXác:±ì•†Ü:î¸;㣫hÚÂj.´÷"‚ógáÚOå<%p~äAæ\߯q PH!Y[œ:•±q{Ÿƒ‹5;W|¨*<; ÃZãuÅÞ®Ge–ƒŒTî¾+ãàšgáåÂÑ‹p¡#-Ù÷ÎÛ.  ±juˆ ÚÆR…zHÚôÄB€ÇµÏhå.VÀsN¿ ü‚/ –Œ€žÓiý'RÏæ +ú¸”l uy‚·+܆lÆHžv¢eídÓ"DóȶöNœø¡V~Û¤-¡d¨«ß×Y–S(Í8+è·±ý[çBþw5Ÿ"”fãTÃÕÇ-å¬F õK;xE&Ù8­9wOj>çê¥>Û§sS¢FZ@y¼ÏØ8U°w­æÃÜgc$™X&žIéèiÉÕ=BTuPU ‡{9YãmÍüÐc]$lk¶Ïô05”3ƒ”Þy&¥§ßËi¼ÇÕ ý\sÛ}šÃšÙ¡enÖj÷/åc0ZhU sÃbÞ6Œ/r‚Çw$ž)CšC¹‘Æ8„!„mT0ù‹¶Vnkùdmã”ìÿ“Nµ±ÿ}¥}EŸa1 ×劵ÓC¶Ï”³†éÞïö¯Z²žçÌŠf!ÑHª²A;‡’í­‚Ûî¡‹œswe˜6N Â™šù¡åÊ~ÃÚÀ³¶=âÔc9×/ΩJÀ+Z³•ifÞ!«šÑº!ËAÅÚ¶g0ÎpÍ.ƒ1dÅSΙìì"¥"ë…,ÚÁX°? a†J€È4Ú ^þ†1Þ Ža´î LqÏ«øà]?=@ˆ>ƒŒ7s6Nk¤ µÂ{‡Ö)<™öäʳ5lnµ0Û@±}F 0l a”)^ù)=œËÐVpöŒbP ¹:²à±F°±U© -›g‡ä=ÉäÀsæ¼å¶ûz ÇŠj!°µç¾W CúŒa_Ò 0J"œ§šYp–²ò˜ êÚ°¿kXÛtL&ž¢È¹ýΜ¦…úlíBŸåL£dÆÚ–¦è眽gä:ýQÁ`­ÏÆéÎ îx¹Â7#„ËéÉPÄI‰AÉRA&ÚÎl²2“í'– }T[EVÅv¡m]*ËœˆD([vÂøóF_JB Cÿix[ü}/?x³ïò%LçmF® a›J¶ ÎÛI•© Iåm9æž x~®ÕQÿÛž–ä2ü޾‚\©#m_‹š)E®4ëÃ>ëÛÖOQʲ¾Ù dTA Î:ÎßÛg¼9 ËkwšP L+Œ÷ÜóòY/Gç;ø†Ý« ûWKÉ}¯suÇQÏó½»—@>Cg‚áZÆæ88;ÏŸÉPº .%»× ãq‰©*´*Y»}ÈäÊ”Gßw‰ÃݳCÇìÀ0Ù³îY.]«Ʊ[Và=%$Þxæóå<Ô/ß8•ã|ŽÊFôçîéãEï Öx¬ô‡¥k>ò³™à¶»%½¡a²4ÿ¼\›j´“¬oÃì@òÄ…’ùaƒñ5xK¯¯)ú¥‚5Ó“‚‡ö-c!¸ó>IVIJÓ9Å@#„Ck˜ìy>öx² ÅÀ°}NòÄC¡”ÅÖiÏæiÅ ï³½&é÷[§%Û·iœÑ,¦5³CÏéó)%Û0Z ×<Ûç4‹IÆ™;4MÑÏ5w¿ºÏƹ-òáið’ís޳cêºG]†Iª­7 Ç}°úˆ¹ !¾õú·š~, ¨T«ý·ÝàŽrM´j{LȶI[‡*ö´h“è„hcÕ[HÔ;Ïõ•xÞè?_D½ÞvbHø3Þ}³ïò%Jpû(”7.tÐüó,ÔÞÉ•Dª¶ Œ]Çr GL>hYyëôæ9y–3*z Š>ý¼ §szE^VÐ+úœÚè1嘺"ïIŠA¢¦^LñfÆtïþH²}~ÈÖí#þo©36NKæûö¨¢àú–äÚ…Á¹{·Ñ…fólÁb&Ù>[cŒÁ ö§ JËÚP³±-É ÏbîÙÙ«1‹%оåp¯!Ëáì‚ñ†`>…‡þÛ˜)Ûw9¼f8Ü­Ù:+Ø8Ýãôk ×nµTÁKá|`|ç{ÜþÚ!Ãá€Ñºd´©miŠAÆõ ×.4Œ7Ê©C©ŠµmËöù>Ó=Ãmw{ê©ãêã×+v¯–HÙPÎ-‡%sëȬ#ë&»%OÌ‹‰ãÂuÇPNÏ©»¾`ޤ°ŽqÏã½æÒ# lS³˜–Øfʹ»$ã­I ƒ³ž½«ž¢/B´Ðȱq&£·vŠÁ¸`>-˜L=®–Xã‘Bbgóè\1ŸJö ž 6O+.~,Ce‚ÙTsú\N¬XÌ›§Ã5K5«Ê3Ùõl,f‚z÷¼ºGÞƒÌY;•ãíl(=âlÓö…ÐJ“·]¢tëv1¯EJ²,ŒÍL'¹i;Ã…:Wþ¨Šk3=!Í'µ‡®ÕÏn~­èéÑ—PžPÿ¼MÑÕ©ùç7ûî^¤sÃàËbÌ[¦!àû’~žQdyÓ¯”lË7K2Ñ–hn3*3¥é)M®3rœªý¬`\ôõGl®oÆÜvÿ:õâð¨\Á`­NÞÇiÊ!ƒò†KÍYÌFƒ¦¬ŽE?ãÊãŽíƒå=ŠAÁöù )œ)™ìf‡S zÃŒb³wqÂú©ŒÁH³vjDcÖ¸~aJ]yÎÞ%i¦–Í¡fQ{Μ’îz®Õh,ƒQÍ|Úpù‰Îst¦)’­ó=fû’áz°(SÃü@PWž« ʹg}ÛQÎBUOçBâ\¡<óÒpéjÉ—ä™ã³?{ÈÁUÇ•¹e6ñ¨ÚÇõŠƒEþÓ¶Ae=Ó&ähë¹z¡âC)¹òØŒÉõŠ ;†óg=RÁlßRÍAiÍæmм(B[ȪàÜ= •)œ ÷vqÊCØØŒÖrî{݈‡ßk[’þP2›8¶Ï6ì\²\¿8åÚ…W=d¶¿`~¸`´^Ñß’¬Ÿ>C–ƒÎ Öï:Çú½h—qúvG5/Ð"#“9ý¬ Ër2<Á! !ø ²X"¼µRƒÆß–Áì|,(˜¿ˆEäÚ̯üs¥\e‚=Ÿô++ Ô´NàXöa¥ý?¤3=Ù¶KäZRd‚¾V×Wªm#jô碭ë“tÜRmV¯hãĵÕ:Bù¤¤ßï1Üqîž>‹é%ï5H%PÊ“o .T±EÞ²saÂ`=£.ýñ˜ƒë £õ[[¤t\º Û[ïs®>Q³(-;&L/]g1]P—‚ͳ‚zn؛Ԕ“†µ Ïp Ó¸ãëÜñªÓÝëÛŠéáÚKŸíó§xÅgbºï8Ü=`¸¶Î£š³yÚ3Ú3Ý-Ù:ªO|´fm«à¾O?Ëí·Ù½l™]šºâC(yôñ³YÅá¥Í|ÎÚv(6'€+jv'W+ð–+;i=yáñ^R ,f–‹{–~¬ff:— ¶‚òÐ1^×Ü{wŸS[=ÊRÐxØXËØ\W¬ 4× >0ÉFI¤T¬åu©¸zhDâú‰û“À— âmxõO³Ÿüeøñ½7´þàë¾²_áÊ€£"ñ¢‹ýðW·nˆ{U)I‘i„ Ýh÷Ãß=?»ØÏôž…¡öGôLk겤×ÌV8³EJÍx.‘Âs{Ö1{gÀò³+¶Ë¤;}úÜfÑS4y©8|šqôጃ“ëGQŸæô}Íü4Ç»Èì´Â[ÍÑc‰s%O¿=dþ¨`qR6ƒ¨™glV%ÎJF›ÛY.ÒÕýÎo’¼‹ ý6#ôKD\' cÝ7Æ´Ð – ’÷ÙÐ:K­1àˆÎúfŽ{[ï°— Çø¥…DÉ‚ãmøåל}öÃâ½AÐÿ뾪_ñ*ïHªL2Ê%Y®¨tàæ¹¦ÚG.RP+E‘g)r‘/9ý¹ÜçËî©xPf9¹ÒÔEÉt8`þ° žÔxJXÆGúxDð–ë?>gô0b–’» Ãø° Ø­ÕP³ºÚƒ jŠ–øºÒ¬^¿f»ªŒÿýåPR”9I»xg(ªÈãokþöÿæœ]gö60© fÇ5Á÷Ä ±&ðàA5˜ðó¿»bµl8˜ˆ!0= gSêQ†5žÛ× YØ,wË€—‚ïþFÅä¸àü3ðÖqp*xýi²K&¶[‡u‰œg<¥rº.¢óœñ4gÓ+j¥AÂô püLóÉuHeYߊàÕmG×ôdÆ3¨s¦9£ƒ‚ÁX ógBfÜž5=8[0;ÍY/R¤L!Rô³Dø)w¯®9|¬Y^k¶w}ãYm<;ëðÖ’ûÀxœ(”ĈÊa±T£!'ïMxù‹@ôÑw¼ó‚Ñì„ÆÃÏÿžAÄͪg8…ÉQÅhžC,ñaÀvé‰ÑñøG3”³Èù#ôª£ï œh¼iè7ÛD‘sõyK»ÝÒ™Æ;\ðÆ[Ì>œ¦w6YKx‡uŽÖû¤"öïUòU‰Îced˜éȾ§R¢ï¹ÙðÅî+Ûã¯B¤rÿ ’ÑZ³^1 òÁ¡!qÍ­ ªP5OpÀözÁva™?2t«€Tžv«i¶0šm±e·ÜâlïÎ)#šMÏþááõJñ¨,ヿ4À7³<ÅÐÒ½jø (ëÎ^”4ë;>øAÍàÏ×—ˆRÒ\I677ˆ\ðÛÿâCbüìßÉh¦9z§Få97Ÿ[®_.™kú¶FHË·þÂgÎm¹~épÆñà½!4ÇOznÏ@©‚¢ôMd0V„Í:°¼é‰$‹‡¼4¼ÿ¨ ¯S‚鯱åèIÆÅ E=nÈ Gñ²gg=e¡ ÏNK”–ìVšÃGŠá´ hÆóŠÉ1¸N¡ËˆTžÕmFŽ`zÚmdµØñÁ5Gï4«ÀpbÈsE6*ñ]…3.>³¼X÷`<óadz¹»ÐHa‰ÑQ vø^1fìV–u8ÿX >\rù"0>P|ð£œåë1ÛzéG^’Õ§ˆ¸Á™³÷ Ü­çöÆsÏhW‘vk9û¹çáÏ1ÛÝ>!GʹøÐ>ùiöÊÞˆäJÈ?g1„ ܾɰW§Ó,2„@‰ˆ–ÿÖzøU ¨ß‡àÇ_÷ÕüT<)”dÝÜ'9~f÷|h±§ƒÆˆ÷>åÒJ…V: ¾ö¶ÍÅžöYg%òb41=S F³ ïrúÆìŽl ¹øû/¸;ß ¢eptHq|Äæå%»e‡íK²jÀäX£µ£zÌ®¥onÏîXßlX\68Óq{Þm`×bðà{Žžæ\ü¼áìã5Õ°$Ë”Íú¶åúuÇdÖcO PŽ×Áh)ÆëkÁݹe2ô»Ëí…åÕ/®?︾h¹Û8–7{‹ \œmX^o¹ºìØÝYš&pùÊpw¶aþÀ1?Í1M`2÷½£8~ï1eM%¶Oá4"8òBrs¹¹ô¬® Î8ʆèÏ2ªÚ£óš“wæ<81¬$‡'%J+ÆÓ“)óGcÊaIßjòªÄ´%/~ÖrñiC³Úñà™EˆFEÅpâ9ûdÉõˆ~gØ­y©fßyÈí'm+>2ht¹<‡Ñ$Ò7‚«µåúÜàšŽ“Ç–3dTdyÏÍ«Àp"pÆS½s‚[Ž>œ~ë!Š)g¯Y]¼Æõ–¢ìin J&ÏJ.~jØÜ¬9x˜bÍöÒ±º¸bøîMM>˜2˜ÉÊ: Ø£F EÐÛç Âû½åCâø¹ÿïÀb “Ä¿ &ºÿ=$8èõî­Ä›¨¿ÍÞÚÿ¯ûj~ jü…‡9…JCàL2™LÝr¥¨”$Ïô4ÏZ«¤ì”)f8QdJ¦aq®2r¥ÑêºäðqÍôXÓmz„ è,PÈ"Ãw7-èxô½1zpˆޏü;ÂËŸ7猣ƒŒ¢0tM`»Ü±Y4¼øx‡ñl²F ~øý!‹KÁíª§Ö–é\³ZDÎhª‘J1kò*rsæ™Âx–FM_’—kÇOr‚F¸Û5íÒ¡kÉõg+ḇ¦ãîÒ2ÃíµB AÔŠGO:«°½Äôg ——=…’Ä(xÿ{ŠÍ]†·–ŵ#Ë“§ÎÉ;okÖ7†ùƒHß²\²]ùà÷jbh—[^}dh6:Ó<ýÖ˜Ééù,çÕÞ¢²U¬9¶]rúÌ¡‹Š—?ëYÝZæÇ’rX/,ÖD¦‡Ó\¿î0½C«H1Ð8#øà©K.>—D Ú†uz&sp&`M Ùˆ¼€«×–ÎzÚyçD1™g>™RO蚆í£`ö0çæuÅÝÙ5Τ)-'OͶJVQà|I=‚ÅeÁt¾ct4F(Éf1böT"O?¤ØÌ.²]ö´G³niW¶mË®ÝÐv-]ptÎabÀ…äÕ8CkzvÆÒZ·‡ƒ<­±ÉmÔŒO°]à?ºx+xS¥ßŽ[ÞlJ U2ÌÊeJèÒRöÉïåöbŸÍÈ„¦Ì²D¥Ê<5\$¶PY=Ω&Ø~ÇèpŒí[Lëˆ] ä‘—Ü]9º'ówöÍFòî÷æLNßc6œ,.WôMËzÑ!±lw"V Œ‰\ŸuUÍÑA‰ww×'ç0;r,.-›­çƒïÔ\¼ÌOÝ.ðê#Ëüb·Ú2šH•c{Lj}ÇõË–"§Ï2ŽŸÔüüz|H–dÁk¾óÛ’ƒoqý³¥în”ƒ•÷¼~)+ɰ §‚³O /AÈŒ“ÇíF sèÛ’Ã’Éñ˜² ØÎñâgNžnùé¿¿e½t%ôÄyÉ£wRŠÚêrÃañ€|0Äõo{†£–Ñ»˜^ÓîzºòPŒ§è,g³Ôl†,«ENQåtMj2Ó£’w¿§iV>æ4]ÎÝëç4EéQ* TNô=R8«YßBðwS£tM¦5«¥£C0ä<|wÄx^Ðm#O>,NÇŒg©J²¼äüsÃpZ³[g\\ Ì.pyцÊ2®¦ìúH°Žç׆qѳ\ElÇ z‹µ$Ôm±EiE³ö\|ºåâ³ ’ £™'8ÏpéT‘»KÏÃo”(íÏK‚í¸|)X^µäjM\­È§# -5ýÎâ] ¸ŽhE‚tb ˆDd°ÁtÞ¥420¤\æ.ØCBÄ”Ñì—oÍ€ÞX©¿ ?~ëùÿfJF*IácZ›ïyЉ4~ÿ<î3qŸBHN¢B¢•¦®j†Ó‚ñÑ”ù÷rù>fuyÍn™„TÓoý€ê%Y6ß½¢Ì£Ãf'õn™ ¼í‘²8ïÙ\7ln—¼úhÇÙMK­`˜œìBÄz¨ÉscÈË´ðå¥`2ô-XãÉddÑÀû$E^òâ¶eZJL¬ðM$“š¢È¸ØXºÆãŒéQÉh¦(‡ïÇOrbìÙ."ÞYt&h6‘nè;E·5t»€é;“ƒËÐyR)ïÖ9:Ïpez˜N©'cŽžÔ¾“SV»u†é<õHR *¤.yô¡äòyFÓVy…í[’ͦÃívØÎÓ)ê©cúx@®JÖ—&i#'Okõˆ¢´(Q i76™ÞE…ÎkÖw9ÕŽŸLªb³ÍyïÃÀê6ev¤)kIYÃpš#|Dë@î"£IYD篓t^&að¼ÃöÞyª ¨ 2Òµ2QŒkI–'>Óõ˜6`ûŽåµ`8i©GÐnÞ,Éž}‹á7~mÎ0뎾éñ6-Û1J„Òôû,{AQv‹Fó!ŒÉ¿mÿ˜ÅÝPHÚ…Å™ ÝNróbÇí‹Èêºeq¾æøÑ–ç¶cµ3X1´ A Ê,ã»ß­é[Éí…c0 ô]ÆÃoL©Fš«£Yd·¬n#¦kY7éPjÈ«Àò6w–i-X6’Ø N&‘¾MiÒw×zh8|¤i›4³)*MßIª¡äƒÃŒËÏã#Èóžå•§ÛEºg³h2LÛí¾1ŒÿçŒN¿I»Kn¤Ö8¬7¸à!ƒÃz‡óöK¬ÿ~л'9x †€iÿ¿×º}ñý·õfJ¿Õ]¼¹JùJ{ 6éØöø¾'A?¨dªUj•l"dÂûµTÈýèB D—%{”XqñI‡R’fÝ3Zœ¡–/É+ËÙ/n™í]#h·‚Í2áݳg,—Ÿ[Ƴž‹Ë%‹ ‡í&D¬€q¦åG³‡ÇšíjÃêVñú…àô¡d0Ûë¥Á¶¯–i;àÑãÖÖw‘B ²R²[<‘q.©FŠõA)#@g`:¸x‘,›U€§m#xq‘àƒæ¹¤‚>:´÷t­"JÉÝhd¹PH" „£]òÒ°¼òôx…Ò•¥0–õì–gŸ;¤®ÈtÀ4KÊ:b:KtžLzÊhB@iM¦"y!¹½°8ë8|T£ó RFpwô»@»q0î‘²Ä›Ž¬d¹`sg®¥Û&ï)Öxv›€iqÔB°ŒVpw)Œ¡¬$ÇŠf z“Ng·‘†ÞF2ÁFRзŠrg7pPé W/ Î$S¹ÁÄã¬b{ƒ‰FH…mau­©0ȶ—€£¬ÍªQ¤][¶õLÿò‹ñê7šÍmJË…$(Eð–“îAÉe²“6RRȈ)C Fá‹Üë·ëÿ›-õ¼Õ€½±ÒÀi†or÷(d¢Ç))÷ÁÉßGK‘RÁö ß\ë$“É€KÓBÕ:–—œé‰niÊaäê§W\¿XÓmç)Öp8ÍÙ­#å c4,¯ ÕÐóâ[¬ñxhº4ÀÛ“ñªÌ™ 7·žu¯é”Äî:¢ ,—càýo(\'ùôÒ"µBC°ðø}ÅâZâ#¼ÜY2-kA­3ÊR± ŠÅ60̳8~R'ÇÍB’ŠÐ ®ÚÀAÒƒõžR®{‹z)É/3-yöLñÎo VÒm;+‹Œ‚Õ­%Ï{n/zvO–Eî®<¶Ý±\néMÏt&ÁoQ²cyç sÉô0²^Xê*òàT“gðè}øôeÁzY7‘Õ•euÕ°½íñ¶ãê¥aqa¸9l—žóÏ=Í]ËÝUÃú¦¡kl¾úd ­µ`4•¸. ñD¢xK!Ñ^°n%¹„f›ðòñD’E(kÁm¥L'‘¢H¹»"B2åÛ,#TÓÁYœ1Dß³[öHeh¶ž,³l—ŽƒcxøíCn_)N¾xðîûœ}²a8͸zåé~úï2}ÿ)‹O_²ºµøàÙ9˦oé­Áy—XA1‚x‘„_‰{Ò ,&§ÐÒ#Ì¿e½ÉR¼mo¬î#!¿LCúJ@ü}ð¾h àä>&†ù'e‚„ ©Nrº­Ãìn!:מ¢‚f™?ÈxýцÍÒãlàôÛw¬n;ò"P çŸîh7¼‹ŒF–í]Gë#Ã2çÙAÁÎD"‚¦õÍGsO)˵GøÈ"DEŽ–Þ{tŒxÀXˆóçgËRN‡’(sÍÃw5‡s†eÍú¦ev Ø®"Ÿ½t¼ÿAÉÁIÁ`¤ÈœÃ{¨¥`ÙxºØíÿ90Q’§‡× ~çw2·’ÛE _Y.¯ ]c–°5‘“0>(˜JV7žÑij½ë9ß8çÑÆ±]¶Ha)êÓ-®-ëEÏç¯ wFE»ƒ«-¬®E7f¹ðX/8zéš@»u”ƒ”£ðú¢£±–ùÄ£2K×noýÎà­ÀAÓ |ë. H•H¬/o#™ˆà™SÁbgðÖ±Ùd€¦‰L‚m/¸ÙB¥/—IX¥ˆÌO%·7ÉtÐ{(JÉô8¼ä|…,nwÉ0²X:Ú•gwÓâŒ#š”œg4\½N!ó¥nÉ«Œ¢ÌYoËÇî~ –ˆßÃ@&D\øö¶Ð!å„€ BÄExùvðÆJýwáÇÿϯû*~M*cßä~ñßïþõ~ñ¿÷ý—÷iKB"B@÷–»’LçäyA®3£â Óõä¥f8Hé¸9[¢tÇÕ+  3Áåë–ÅÂqt,xqáiov˜.à¬ãõùŽÏ.ZˆÉÊDA)"½ç|ºN4í6°¾ ”Y¤Aá5UizÅx"˜Ì7g™ð¨¬¥oÁÁ®w,LÀQp³Ü^x>ø^IUÎ.%ÂKŠ\bvÓZnÎí.ÐÛˆ’‚ù\òγœY)8˜jj-(rA·ì¤Â,^J®}ÄîR–1Qpté¶‘WŸv,¯,½ ˜N3œx*"³A ºÒ2 (o¯¯ï 2Nºmbl­¬\ -%U!xúHRhÁø&³”ôu~ѳ `úÈë;ËÏéqäü•ãÓ;m=•„­ ,›žéÐ`:Aë#U&˜MÖ²:Ò¬=Ó‰$+2º]é#ÎG*ñ>"ñtÞ3ŸC™KÆU ^/¤@ùäz¹ˆ˜Ɉ '¥`·ÌŽ%×WA$šHU^®Þ8JéÉò@ߤ…zqÙ“eïÑš]`8†‡ßý±]EÚÆcDØk ÚL‹½qŽ>$öõ{=€I¼Ç=( øü- è•þï}ÝWðkTI,“0„€,DbØÉcòDq{/'½7%÷Y͉~)EG¦Ne4Û@ž9¦Ç%—Ïw[)..:V7iÚP#«•BçšAËËÑ@pw)3Ïõ²ãyÓs`#½håÉw`ñ¬µâ»ƒœ²v8㙟H^]D†J3œhLÔÙ JÞûîŒ›× —ËžZÀü@òÿÁšBàșŸÂ‹‘U8°¦…Ñ 1Žïæ(­¸9ƒÕÆÐºÈ.F”V rÁÂ@o…È€¹å1Òn"õЃ‡+³:çÁXß)œó¼¼uôÖ2”‘ƒ Dˆ6rƒ {‘œY1RdIÀv³JÃñ²œ¿L)WQE•`½« ¬ãÃ'f”ÄE!)¬ÀYŠù$b¤,fØÅ@Ûh² Ì.eõƃëŒ1*æCEQ VwŽãÄÈ$²r €IDATÇ/<Ó BH&_‘´³~8„m¤ÌBšAyIDÒm#*ƒRI¦Óô³.DFVp0×H-ÉË$¾3-Üöžæ*2EÚ.Ñ–W×Þ‡”é=ì9ýB$a˜ .xÜ>CàÞp2å ìS•ÜÏÆ<o×þ7Zo! 7Xšt¸ßý§p씕ª÷Ùª÷‰Já+YJ¤›F*‰Þç³ö¦c\ÂêrÉhê!6|ôÑšÛWÁ{"Û;<+yuȤ¢ÌR—H©8<…áDsûjÍm“ÍCHÐG­³Lp4×|ïÃ’ósŸ\L)¸ÙIZïYt°èÍ2°ZwƒµšÏ>íq]¤.ÇüT`{ÍìtÌwsJ´«Ko“+êÓw ¼7àú³…Œ¸>¢,›@çÁ°[Ë'?3,L`#xÏ{‡ å4y¦˜•‚Û-,…`"Ì&…À„ÈrgQ.ÒxIU—”ZQU‰Å´kGSÏl iw‘ç ñ+Бf M¸†9Ï%­ÓŒ‡%JHîVžñÀ'Îqš×4k™Ø^ÁS×’»M‚ò„õ¬­g> ®ܘÀÓ‡‚Ñ8c2Ëh·ž»rï98¼º• t㦠Ü^þÞSAĀБ(Ž$¦‡‡ÏA0»@QK¤–Ü5ŠÛ øþ „:âú|GÓ%hí¢ÑF¶;–0:PN5EÙl­9<e„`øüÓ-+ÓÑzGë,;ï°1&? ’\H0ëýþ{‰ j|ÀÆ€÷_æ¼¥¾¹ðÖ|ãMU|s¹¨,å¤L`AKJ¥Ð{;èB}µWdš‘VdYÆPHê¼ÄëœwGš,ë¸=[¡µãÕYK‡Hžy„ÌDÖ2g,“Ý„‚GO`»rüìU¼[sÙz”X-¨3ÉqYðäYÁÝMä¼±äZñtž£¼¾6ã˜M%ÏŽ¢Èy8„åMGÖ9œ‹Iè#a(k@ìÝ­€*Â@JF’ñAäò\á”âáaxuxx’¡td·4ÛHU{¶;ÉRJ´óäÀ­”Ì«Ÿi¢ ‡PôMDÈÈbe¹§%|ó‡CΟ{–«È]oX÷ë<xZi–6RJIÃôP!uäÕç„`T Lh<9Õ/©Fpp öMצe`t 1m$ Ið’M1¶çÙSAŠfS°Ü*ݳÙDBßÓøH®$&Bç<2B+`"y€w†°n ÎG5y!ø³O,C¥(U¤¨y™áB)‰³‘àR¦¨É3uL+˜Ÿœ_KdŒdÞùfêöc<—œ_Eަ‰’éœä¦Ì´¢wž“SÉù:§B1JvâÁ“MÁ¢kpÞÒZ‹ñ–.¤…Ý iáoüÚ›Àµ.å8ç0.AZ½ü­×oCßT½=¼ÁÀLß/†iw¥… îOA$²tö&M@ë/üþ­sˆñ{¦P! Fc‡Ö†»+GQdèê¡&FA3Î$ƒ‘çõÊb­c}Ù³¼ÞÐ-[nLòg'—T¹b¦5ófk<µ” kÁíÒ#Ûžªì¶>Q÷¸ã²w¬:·S¼ÿ[S¶¯[n—‚Õ:0.‹uà|ê”q»Þ ŽN±“Ô2b‘ ÷y øÁ‡ŠºœÝ Úš@z-|à½'‚ÃÓ’?úY`·utmǸrè‚Ö8Ž?.ɼ¢s‹"AŒšÇïeÌÒ›†·’%¹N¶ ×gpv+癊Ç%!ŽX¶’h#Ë>ípµ,/-EåQZÒ¶ ¢$ÏAg’ŠZv!9Óª Ë3~ðnA°‚;fÓ£ŒË‹ˆ–žù¸Äv–ÞD6=Œ!"Õ ¯­àÆGÞ“‡HUúÎqÛx)²<çõKÃÕÎq0 ©q70œ(nnÆ Þ{!*z'^s4T•¦,·,v\:…1Ý> &ì᳆Þ9zçp>`¼ÿB–" IŸç½%D `CäÕæ­ô›ª· à –Æ2Éb0öؾ‚HL–" ƒ‰à| „€é ч”å Êš£QÉnÕR n£A¤mRZê‘b½0l[ÃEgM`6” òD7TÒ]HöÎZrªOO3Ö½ÄÈCÁ·f} ·½Eõ‚£“œz$x~帱!…zÇÈ•l»½xod× YÃ:JÚ(xw¤pA³Õš•ÀõÍ&ðüe@¶-Í6€ZQ Ë6’#0^px$Ù6‚¾•8`ƒà°’,cb¶X!;Éb'Q¢RlbdSÊT³S\ÜE2çOëAZØu–q Ar½ò”:ð౦ÌRÌaë#gçžËe@´• ô12)a8´»H%2׌Šô~ 9˜ nšDãt¢s8©¸]zn¶ž‘LÆzë XyÁ³I’a–qt  DˆÄ"äÎ ^®=æí:ps툆CˆF`zÏ«•Ç­ÛµA‡ï-™÷\{ÏÓi2ú»Ùx¤q,o;v«EO<»µ£k='3>yíxïÝÈéCEQ\\€tç,Í6b‡ÒPjE/ ZQй”f%FOï=&$øÇ{OïÖº}Cði8|ß bš£ˆæ- ôÖÛðK“lü~ᔤ9€”ih&"™…'y¿û=NêcòãQ2e<Î%'ÏÆ¸vÍâ|I0ëÛ†*·8JEc3Þ=*1ÇŦ Î=ÍÆq¹ d¼O¦sÓI͇ßÑn㢤iK꡺„ç¾óþvy½¶|c —md L€÷æàz0BÐ*Á@ æ#Á8W ´`3„Î8HŠRPÑÃx Ø­“¹ÀtŠÓ£¿ùÏ}HéîxyéIP’IN%AI‚HpGÜÏM¶RsPHÆuÐD(|@g§5#Ç'v µŽ…çƒÀæV>xOq·\,Czý¢`>Ä >r0”ŒKÉÍ*ЮY–\+$R òBQÔ9ë;E Rg¥’TZÑ:Ï2B-%ᆱyü~ͤÖÜ,,‹+È…%/q'!$ÑØ@)‚®‹Œ$LŠŒ©’°_øF3w‰ºZx­‘ 9ZçH-Hn7ix­…cu¶âùµb¼7Ì+”B Íü¤@A©$R+ÆJ2¬R^ÀÑA µ7ÀÄȳŠƒcÍ7¾'iW‘בBI–[â,^N2,5·kEFâåRpkkAáI¾õƒ «EšƒlZÇtœ‘—’¶‹Lf)”ÞôŽÉ<"0ln ƒÚóà©d0©ØÝYòy0¬ÖŠËËH»òÔJòðæ|¡˜Œ})‡’“§’ídµptÛ€Ë Î7Ûyœ D!J0*Q+PŠR …âhšþÞBi“aCDxÈ2™æB0› îVo=1KAD Ù¶]ˆJ ¼Ç¹H×d´[K³‰HiÈG3Öd4}‹‰îÙ8‹÷ÞzZã0Îá£3k=>Fâ>%ŒÖGœOì8"¯¶o! 7UoÀ,I¢‚ª½ÿ† ïÅ`B ‚˜Ø"R’+I¡u‡)‰ÑšÑL´Â{ÁzÝ£dÀ‡w‚^jJÃBr8òþÒïZ®×GBËV0ÊB+N ¼/ @&žFœ¬OàÑ#Éf!ÉrI°’^fø,#0“ñ(ãð4§z&ó‚¾“Ä èZÅÁ‘f8ÎȤ Èò‚LJð} Ï»VQe /‹bãÈDzÕ Ê4ÃaJúr^¢óŒ 4ÇÇJkæ3M»“X“ § “BàLäês1I%…g<<{&)tÆüaF×*¶ÖS*Á£'’fCüŠ´#^˜œ«sÏf³c³5 …u‚«Eá‘걦Ì䌦„ÄÞl<Ý6…ÑçB ´"X 3Š*à]RòfxÖË䡳Ýzµ§Ôué•ò9>k%E¡xt¬9<‘§ÉTÆ£g5Y!Ø® i¹LJs"‡ÍáDñ{ÿü1“áœh,ËΑ#ÈTdv˜“IAÛDzãÉ„C*’¿ÑÆ#­e4 Œ&9}+(+hZI¬fÜ™üó!Q@}À}ÿw!©’­Où.DDL¯uÚ¥Üà· àÍ•ú×áÇç뾊_“û_$Ë´øßãÿZ¤ÓÞ‡eGRƒP¤…Cìç¹’ •d* ‹%§Ç9ë«ÛEÉôs*FÆÃH߯§x¾&ø€é½qŒJO׺Υ…/S4Jk„’t.‚Íh›dNVF1$¨B 9~gÂɃ1¥rtPsô8§3Š»eäf'Ù¬<¡1f &:—O "ÁRVœÀû@žÎ.=®<ùFIÛ(‚ÐdBb½âhžqò ÃØŒW·0gH¥ÈòäÉg“«ìl&ÐZbPÌ3Þû:âåÏ®“CT|ð}ÍÁÉ1¦`šù©b{ׂd2Læ\ãÉ´ÄI»³,,t;Ëx PÕ ñ–Þû/X?Æ{üžZ|Oiv|LïiCÄøt1}Þâ-ôKý·'€7V û]!÷@¤c¹Ü+‚•J6Ñ™N ^&ö±‘JR)I”¥Òb7œdµÞ2K&sÍÕ*0Ÿ)6»4ȬjͶI! ÆEfcX-=Ä$À™…ÖÄ=¦ž PRòô[³ù€rPa;ÇÁIàèQÄΠ¨2kÂÃo>àá³CŽO2Â&2äeàð4ãîŠ:çøQb%çÓe Æ‚¢”èšt±jV·‘Õ6ptTRW C& A† (n¶‚ÙP’e‚zœQ2t¡9yG­¢ï%×7ŽÅkCQB®ƒ‘Àö‘õ2R–i°*ÈóŒ`Õ0âlF5(R¶C•!T…1Ší2P³£€w’Ï/"ÎD&cÁj(2Áñƒ!‡OŽéw†à^kª"ÇÚˆi$§Ç»>c+ó‘Ä{Á ƒãSA5ÊqFAìvpö¼ãò³%ó“HQæ($E™!„¦Ùôœ¯µ­KêÂö’×׆BXZi­ÇEɬ„÷¾uL·Kæy3lŇu.Í­B‚ylHP ao‚(ö¬Ÿ=ôãRö!b}úù³·¡ðo¬Ô¿?þ»_÷Uü•Ü“$iÇ#å—A|!ÉAS¦& •b¨QkJ­‘yJ3ÑAæÌ†–õÒ}@xI^(æGÉMt4“ô;A^hŠ\P”‚áXq½¿Ùw^ Ë´"’J)¤X“c:AVD”êñư[{„H¸t»µ¬o;Ö·=ÄÈüñˆƒÇïR'Œ§ 8¦‡’jTà½du«q¦£Àv-)kAQ*°‰A‰È³oÍxúSÊÊ1Î%f dŠI%ŒÁhZ¼…®ä¥BiAQ ´êÉE‹í<Ö‚÷Ðî~¿ëŒ1PÖpõÒ…ÆúŒè#J;Š*`ÁÃ'‘Œƒ‰bvª±½ NO2Æ‚Ó\Üvt[G°=ÑXæ§5ãiA9(Ž“'‡ ‡Šõdˆ.JÚ]¢_Æ’¬ º³‘ÍÂPäŠÖirhÇÁ¡DDCßÐYưÎyü^‚a„ÐäEE–g]Âî•TÌŽ úîîíÎQ•Кȃ‡I£Ð5ïõ6ËÀn婇çHU‘—{÷Ø.ðï+bÌ ^±“Š÷ŸfTƒ’¾qD9ÆFÏsì¼ÅZKëöñÖ%ØÇ'°Éë߇äû<€˜„~.áÿÖG.»·Ò¤7Uê7áÇï뾊_“JVéâ¾ì?ëÙþ{÷ÁiV ȤD(ñ…ÇJ.%y¦É²œ^g*E=¢D‡í%E©ñN19Ò¸>°^Æ‘ë;Og¡O–Ä:*ŠBÒxðZ1Î3ÊL3žJòR9ƒÙ˜ÙiI»îÙ,:<ù~ÁòÂÑ5 ´e0Ñäe *ª£Å(2~’sðä³ßú‹z”T æšÙÓCªÒ0{2âÁom,Eyø­)ƒ‘äöÌ $LçRÈë‚Ðï½o¬Be“ÂÃÓÓW”Á`ãé«›®·de±×[€5‘­£Y ÙÀêвâÑû%§u²&RO†=>`z2æð‚O¯ÇüAÆÁƒ’Ã'vKƒÎ,ßû½Ó‰`4+Ñ:§k2vk‰÷Y5dx2aøÿ4íÙ åÜ]FºMG¤Æô‚õ­grTrúlÂô`À`ûÀგO57géñŒ‡ï×LjÚmÄö‘rPPO†dEÎx¦(­3Ú]@ÃíE‡Îfçi}Àô¥5U!88)X¯`0T™"3«¢ÙJLÈ Ëç¯<ž>ü­÷¹zÑ#¢¤¬5ælWJgÉoh0Åö†.vÎÑû4ð.ÍBHÌŸèÓ<Àï“Ââžuæ÷æoÎß»‚¦ÙÛðæJýøñ~ÝWñkR_•]g2A?™L;hõ•0x™þ†ÉxLII&Õ¥YN¯2jYR2=E¥ñ.e¥ÀîÎ#"œœ¤„¼ôE@Ö¹À‘QÉ„‘ד ïýpˆƒ‘ŶŽL¹»èyð®DEßÀÃ÷ÇD9Á{M»%B òY1¥Èßÿ}”vÜüô5õ0àû´s ÆpóÑ ß{‡áà€nÕÐíZƒÖ‚ÅEÊ-ŸäLç%*Ï™?(÷ ;ÌN f'’rSMÆŒçCæÏ0: <û½¿Èxöo=Ö¨D1Dbh§ïDª*R”‘õmÏúÖ#¤&+2FS‹šÝfF5Ô(mÑYÆÍ«žÍ¢ç³?Ùqø0pöi`{c Îq>£¨"õ¨c| ûõÉ7Øþé/¨F5ÍÊRÔpúnE )å‹àh·†¢ò3 N¨Ç³cÅ£¿ò—˜"™\r{¾A Ãh>@ª Ó+º£Hצ`ÛEn·LÄF‚ÁT‚Uœ>Ê™ÎRs"F³Ô0¼4[Ø6‘à7;ÇöÖr4‹8£Y\[ÆSX¬ o}«ŒròB’WCœsˆ Èã&¦ÅÞÆ/¹ýÆ'ûç=ÎïÁö!ð6¤™À!ì#!CäªÿºïÔ_ŸÒ_÷üºÕ= ôþ$pȣŽJ¢e&@º)‚8°1RÆ”*¶²†‰Tô6:gèÊQØÃpVÁž¤¤$"O=í&°ÛDÌe²ç-´Ä ‰Ìd0ÑišÝ\…Ô9¾»ATe²yž•´7-»ë åqDϸýÉ+.>ké¶=y%2àmâšG§©Æä2 ßÿg~ð»ˆÙC†ßü¨¿ý#æ¿÷Ÿ¡ŸPü‹ÿ5Üæ5yùÌzÃíÙë4Ýú–»‹ E%ÔšÑX2=¼ú¸ç¶ñL†šá´"/:Ï”ØÞcz…’°^Y°…£.5G Ú[C×xt–aº‚ÛsÃõ hÏïènw”G5¿ÿ¯ðð),?û%VÈBì6\}t†šò"0þ‹ÿ2ƒJ’ƒßÿ¯3|ÿ/Àðóù .þàtvEþî uQáçïR<ø>ÓÑ ±•\½²8)r‹kÓ(%¸x8}É O®=¦óh°Æ3™ š&ãoæ\^ 2á(ŠsÝ5µWçFiÖ EÀû4p>~:1"/Y5Äš\eÜ A|úîíܽçLy6F‰÷ï÷°g…H‚öR7o­€ÞXiü5àõu_ɯAÝS;#éøköÔ·ø’ˆŠç#™„à#f?–Ò#¬%'î•Ñ !+PE…,jæÃß^â¬Dç’Hòûï:GÞ:žj)G5xüP—ÙÄ”­A ž¢Îé[°.#FAD1˜ ªÃôŠÁ†áôÃß"tkÊg™lö.îìïbò¿&{çG¨ñcvŸü{ø‹K`‡¬ÍYÏóŸœ3˜(²"§ ЇŠ“ï‘=þ]šÿ&áîSÔüÌŸýmºx‹ï{vüÛˆá„f‰ì;vúo‘p«ݲ!¸Ûr:L©†5¦]q}ÞQ’å•à®÷_h.„ôè²Üc‰Ôw7–<ƒº.¹ë¶]É6ŽzX`aucXÅH¥“:rpÒ²¼±¼ü;ÖãJ^@– ² ÿ_pô¾bt<¦ÐÃßù/£‡§øÐ¢_,ѯÿ1zdsËúú©4½ ¬ÿà%§?<¦Ú=G|ò’ÕGk\¿áäIÎ/~Ñ“w’ªVŒI¼ZDÊÜóü³ˆŒ‘Ù f‡’Wç‚R¬ ¬åOþ8r0­áõŽÊÀPG–VðøHàbŽ"Ò·ÑLš³ ƒÙ–¢sg§"Ù²t†ôž{*Š¤Ãˆ÷‰_ð%Î)â‰xˆ¤nw 5B)AoßÞd©ïÃ%ð¾î+ù5¨ѽïÿLïølÏùOé`É+(îÿ (Éå]ó컇خ¡ÙjÚm¤õœ¼“¡TÁÃoLÉsI$gz˜³Ûä4I^åÌN2Ú&#Ë)Ê@»‹ †’b±[y²BSÔ㓊ìÃß%Ÿƒ°zIvô!awE÷éÿpõŠ÷þ*´ d>Ä¿øc¬ödÇ‘e†ª"Y4,/-ÞEA·¿±r‹yþwíƧˆ‡?B?üüwþUÂíOˆÝš¸5¨Ñˆ¬ªœ~›ìø›hêÿ,Õ÷þ*ã¿ò¯3=‘Ä›çt»–n»%Ë=m»uTÐúȬ &Õ@CÌ8xPAÔt;±’›Îa{G)à`,Øô°é=íÊq¾‹DOŽ%ÇdËÍÕ­b·t„¾…è¸[8š•gþh†”3V×ü®>áúïþ»ç/ñ}Æò³;ºë5·Ÿ^Ch¸9 ˜µçÅ‹ŽÍ‹·ï8ÿÉ'ØÎ±[G^üü:ƒ±‚GkOð‘Ý6°jELq¡»UHsƒÆ$[ëQž<–¢•œIn¶lâê_í"…uìv¡$¦U ÆŠ¬rütL>|‚ð%&x6ÀÆ[Œ³´Î`¥óp/ú"íî‰ûMŽ÷ø ̸§‚†¸×ÜŸ €[ûuß©¿>¥¾?ŽÀO¾î+ù5¨´´îçû“@¶§…ÞÏ´LYÁQ@.AŠ/¬Ô^$¦÷ªáqŠÑ@Æ@2zšµ<õÐ#u¢€nï—çŽÝÒ3;-Èr鯖<|¯`µÊ°¶äøI…5RIúV3˜ä˜>Í L§B¢ô>®°»B=ü>zöŒîgÿ~õ õèw¨ßÿO"ÍWÀú%zþq{‹¹:C !鲈3g‡O*¼‡¥ûèÿŒ<ø½úwõ'!±‹Y©0k¾‡ Ùܺ#/A*MX¯QÙš%Åd£ úø»äßüP›ôw7Œ&äZ{ÃÕ/V¸>$¡Ón‰0·4ÿ!Ê´¬_ßÒïYañÝ.YdXAQhÖ62+ÃZb{OˆÐ;Ï]ãXn,[ÃÔôtÆq»5Èé­§‚ÉXrtšñî_(X_G2™ñîÓœ°õXëSLä â]ÊRÑ4]cY_µ,¯Ë+Ïõ¥aq¾!Ú¶ëÉtËÅ'-«kCž9Æ3CŒÛ³žË³-7— «mKn§›årãÆÓ8ÏqÜ´–mg™ù6¬´1Ò…HîBxž¼«Zb¶‘ù!h')ËÄ;9‚]§ÉDd8É(났,(‡5³ÓމòÛv!96ÖÐ;Kï]ú<½OØ¿Ù/ün߬÷ؽà+ø„ÿ»ý) ÁöÁ?–îÿ›ëmýc×ÿ„}ˆÀ ðg_÷ýŠ—øÊs¹Wç2©‚s™ÿ\¥R%ëÏdÜ¥Òp˜ý @Ê{±˜J§Š=×Z ÈdÄ»HVQÊS5ݶÅt–›+C=”Ü]C^–ä%dy¤YÚÆ1,Þ{Ö‹>t[E9Ð f523šWL‡äeÆêª§Èk®G IÔsù'ˆ~ÉÍø·(¤ƒv¢@åÃiM·Þ±]ìȪ’²ž¡³Š~ÕS?›QjnŸÃn)pV£sÍÉÓÈÑú4âý—Ïí> ¬ðÖ âÍÔÐ?¿0½­_n ñ¥+è}¸WßÏ"ÉB _ùyGš!8’unçN+f™FDØ9j!¯zî6ŠG“#|¿`tS‡“cØÜîÈ2(šn'È M®Èd å5BH­AâmÃù'‘Õ(2;)ÉŠ‚né°ø7(û5泿ÏÝó :‡ö?%Ä3tþ)¶Ü¼Z¢tÀþâ! ²¢¦l)ŠÀæ¶%Û6=;¥o,ëëý‹H³Þ ³OˆÁ’ÓX=£5"LÑE‹iz–gçè¼`³”´Ÿ´t»a0x—ìõÖw%ë;Ïhªxö.”µæîrG×Dn®#Ó‘âà¬É0±çX –>à½äå+ÇéqÊ$—¯í ®£]÷lm`éæç»]„Mˆè΃Ü£%XÇäÈ:>ª¸[wh ƒƒSÅ«[užJJÜ>„½ ’<ÂõmdkòZ2eÜ]G&‡ y=£(ŠÙXßöØ®¥‰ÑcÛžÞ|ŒÉJ*ŒH°VôžnøžvÿÉó(ì5÷ Œ),ÆÔ(ìþñ¶~ùõ_"AÒúž—ÿð¿ÿº¯ìW¸âý/"±&sùåk#D‘n !S&0Be’̇=g: «mµðH"p§ŠRæÜ6í Éû§äÒaŒdq¾äèIE³êñÎQT‚wóAÁó?YÓm#m'™GºGéŽÛ3Ÿ€T¹@ "ˆÛ;ôÏþRk¦Ç9õAF°¸´ ·¯ž#bÇð gö¸¤¹c@Y^ÿ™¢še<üíCº'Ô’ÜGÚ­%Ë¿9Fª1¬Ù¾Øà¬dö8CV%bÁ 6w ·¯{bØQÔ ! k›Þ‚G_;ê2pòNÎÕˆƒcTŽ«—޼ð,.J$‘Íî–‘L¤Ð”˜Á_üÑ€WÏ5ƒ®—‘ëUà`)êŒõ&gZ8¬(Ïáâ³ ·ËHÛ[Ì%ÞKt–2”ò\nGµ FÉÉcÉn¥Éˈë»à)èVÉݤ p¹ Žàï—¼ø¼cÓåüÙ­¡‹P‰´p–ÀåÚq±Úç’µ|8“¼¾Œ”ÂSN:¯8ÈRVD±…¼t DFß ¬“ìËñiN»“”ÃHPïý†Å턤GdyE Ûwt{Ò„@”HŸÙ{/ Áïõ-1ñÿƒ{¸dí÷aÿ¶¼‘so>Iê_ä½­_RÝzãW~à 'Ðûáð}^¤€ŒB&‹èµ—"=`ö ãƒßšrõñ’²¶Ï ¦sà=JAã<ï¾›qø(g}µ¡Î=…VH—fƒ±$™M6k“Y¤ˆ’á(§ª V£3º¬Ö†A™ BÖ=d£ƒ‚Á¸æá;£QM9ÈÐZRÔEÏïRàûüœ lvŽË»ž?ièV ±7,›z‡¶žßøíg|ô|ëe?¿ÜnCzÝû€ñ‘C%8(îlŠ’›•‚µ‰˜Œ'9ƒ œû°x)J¥lýÂïIŠK³?- bĉÖbL ŽˆFˆÛ[²\pñÙšÍm‹T–ÙqN=Ö˜Þ±¹ìLJóHfs‚g\GÊQÁ#B¤1ŽÌyB•ж–]o™o³“ï2ªŽgÙ¤WD Á`¬1MÄD0R0Pž¦sL§`[ÏxxöœõÂ"=t`rY ·¯ ³cAwç9< ˆ°}òÂ÷­àÝok„—\Ü8ÚµçÕÆ¢B¢WÖÀHÃvÉ2hŒ ™EÚ$/4å@à{Éj+pm iÎ+ÃõÖ!Åue,Kæ<²3l‹4ŽñÜÝlgq.Ðøˆ5‹tå0‡E'>Òt#yˆ,6‘‡Ç}ž1-m¯YyÐQ³j,¥–˜> 2I¯íª,…Û_î  0§÷JæE))ëšÉ´b0AýˆV²Ùu¬{Ë]¿eÕlèmGã,võ؉‘.xvÖ§¡¯õëÕÓù=Οà羺ë߇¾‡ôyìcÚí7áϳ~î7Coë—WÿEö6ô*ÁÉâ_Ý7„òçw©ÿã¯ûjÅê~üÕÒj•¾fûÇÏe¢i ±ŠÔ 뿎,túZj…ÖŠBI@Ph•¢$¥$ÓŠ‰’LöÊa-…dYΠ(EÍá\cš-ÎZ”tÜ\9Ê<`zÃÝ60j²Ì³]%èÁ9Ï£wóäHYÁó_Xª2A ˆ1%s Æ‚õRQVà½d8N­Í{(k…3žvç" ubŸ4GË 1Ð#gŠ¢”¼ûÝŠ¾\½HAï³CI= ,® ¬"¯Ï=™ï’”«09„fX­<Ó H¸ÐúÈa‘6ÁhPP(R‘«µ!‹‘2KyÏGó‚z˜QTˆ!]yÂRJ:Û§ ßà“u3‘Þ;\Œg±þžÝc±{† a¿È{:ç°îKzçX¿O<·~¹ßñ›ýs÷´U¾LÇ»¯·kÿ/§þ­ òlb#$xºâË…ßðå08ã­Bø—Y{T'y¡ï-qUHÏýŸÅ{¡X€C‚{Ø“¥Øû­ƒñ#>ìäd ø!b„ àdÊð!òQˆ 2ÅCà FÚAQrw­Y©§• ¨®‰Acºˆs޼øÕë×—ÜOᇹLÔM-¨¤pEv+Ïbe饤‚¡—8ï2 …äx¦(÷tÅv먪ÀÙkOt-"ÎÂv•T«]„ ž›3Ïn}ç $ÝN$×Ó±`Õ¬‰ ¤@fÐ6ž2Dpq™Ej<"ÝBÀ` ˆ.²qÉ¡*¬ô>p8 ÆžíV3=°¼øÈ°ëãJ⌋ôš÷&òì¡ ª ŽŸV|üV|vXì ÿ©áåÒ’‡H¡ï(®®"w}ࢉlÉÉQÆë—‚a=äðAÆp’‚]ħ=]×Ó·%J‚ï$‚’»MK锳ØõT…FIÉé$Åa.›ÀlÑúŒZT,Їl…¤·=~ïßc½£ó6eõ†ðÅðÛŤ91Þ³ë ½u„{ÿ/>_.øþ«<ÿ½ÈËÄäícbZüwþ˹—_ÞJ¼Ýõÿ²«¦uDé´ðË=Þ/þ ˆ© d¤7(ßÿ¥{Øóë¾ú_‘úGA@°·€Ø-ï=D‚ôÞ&Zíq»LI2•æ…– •Nìê‹Láä*÷°…ûÓƒ”J¡•¤ÔŠ\J²L1Öš‰ÖŒ”Æf%1/˜hͼt¬¯®Q:Ò·. š€PTŠ\KF!#ëÛHÛGæsÉp*yñ‰gÛLˆ %ŒÆ KˆŽõ:ÐÈ…¤‹‘B@¦á¢qè±RPŠä‚:,agó©b~*öY´žÏ~bYl<Õ~@2 l]Ø!8¬Õs³lmd˜Át.hÖɬÍûÀ¦OCËà'SI×(ZRKê‘:b‚$‹!Yáxøî˜Ÿýñ–Lƒw‚z Ym=;à ϸé-ÞZJ!¸[[–½§ l#Œ¥À)Á¶õÔ†ÅáPc‹ …ÀÄÈÓ¹fµ ÊÈëÇG"‡CA× .:Ça  8˜Àv-0Àá´@ª@ ¡ÁIt•㎟°“ o{–Ö|Êï {lßÝ»vú€I´}p{$†Ü=£µnïÚ™0}»çøû÷ôà´ðÛø¥±[·çö»„Ê÷>ã5{[ÿäêß© ¨ÒsgÁDJЈÿѾöðéxë÷Ïð¯}Ýÿ¿"õÿíD¥¾Ò0TûFð¡X¶k´zo§D:Èý¼@ïÃÐ…LN¢Zì‡Çûy%ås‚<Ód:5…J¥¤±‘Îé´&S…RL›Yni·ž,˜.ݶ:8+˜Ì%7P Iã¡7 $¡ÈªÜœ'Þ}Q :+(óÄW¤’?Îø¿èÒ&Dæ¥d0Ҕͫ«vŒ1"­gC$R@ӡ井P”)ñf™ SðIYGúN°[b ,ºÀÎ:´O¾õµ””™bKbÓTR ‰ä{¦_´Ó”Š­…q!i;ÏJIžŽ$JI®ïmoq6ñõCç¹êOÇ‚éLqyæ©Ð6‚,‡ãSÅÇÏ=óää¤â[?zŸýbÉíå-2ÂPblûÀ|O¾QòÓ¿×’U‘Ãã’›³D&îbòtQ…&C0=œ0˜¼S¬Riˆk{¶{%¯ÛC9Æ%ëæ">$ÖQJꊸÝ•¢}úÙ¯Š¹ÂÞÀ͹=üãö´Ï¯ìúÛ{Øçc²ûvíÿ'_s–r£»]‚~ªX â–Ø…_,úð%å«õ_ýºÿ/~Jüÿð½ûFPÈt¸? ÜŸ*Én¡÷†qZ¥¿­öâÄ_ K‘ ¥ûL!eš H‰V’\) ­(•¢V’¹RÌR äÞËf4ãð`D»:'¸æâ]¤7{; ¥pBP)AQE”¬0žD.. …Œ>’üôÃ;G’Ë ‡–k÷#e®)ê ×;&G‘—gésy|:Ø>pqæÈ5T5”CÍ͹O‹•¤VŠ[@„ÀR ‘®IœóƒIärèzK<ã¡fÓ:”ó¬ƒd¨%Û½üÆcÅùYdë=Êyœõì\d'à´P̪ôF9 ½M†f ÜÙDmùîû’Ÿý©¥È­I¾N§GšEýÆ"¬\¤&)­U­¨š¨%ßy–±Ý Èô†_¼²ô>2É$Ñ*% 5 élò††ãŒr0`r4å¥8Ûsë\‚{b ·=kk1ÖÑ{±þ ØÇÝG8††Ê!&ºqHÄ|çScør±OMÀï¾v¿Ð›=¾¿ã7áAÛþÉÖßœA–%Œ5PÔdÅÿ‡½?›.­ê{ñÏ}žñz¢»¡‘1€ ‚zš %(zL%q¹Œ&ý%1QsÌ9?r$Ó1˜Û!âg4šÐBŒ¨L”¡™zÞñ™ªj÷}þX÷ª½j¿õ6=¼ÝO{]×óTÕ®]{ïÚ{×¾ë»Ö’÷ÝÏÔ¼ ªç_²<1¾¾ã°¿Í#\Îõ%OI`ïR$–&p€O3îq”Þ᳤è]x§ÓÅÄ8ä)’(’1(‹\à ÌS¨Qð‚ç?.óÌÊ£²ÄcÖŠ’Ç•.œem{ w¸ý“{Ĩ+Ø<â¹ýt`ìfò^”ïÅÇ{‘ÝýHÕЦe4”ãÈh’Sͤ9Ý©;Õ ÆëŽÑØqÇ(C wRQNÀû@l¡n`ûXAwžlÙÁ|ÁIñ\ž´›ë0çì4TUK5­Ù¯‚s<ëÙcF“5n¹ñ€¼ðì¶d™¸¬wžj(Ú–Í#97ß6' ‘&ÂÙÉãÀÁPFØm#W¬Á™Ú1­Å;ÎCäŠ#žýýÈN€Û÷ZŽ9¸;5nk‘ïq…#Ë=›y¢¢ÂÑ ÇÞ®¸Âq÷푼@jšÈNyÜ‘œrœá}Éx}„;úxn‘:¦MCÓÖÔ!P7UªÖm”“Z5¤‚-ä31êÔºÙ'Å¢ðö ’º°`ü$vOêás<}­î½¿0Î`.œ¼3hªì¿HÎK> _#µHÚ k §ø\ްTzt< ¹·7·„eH m%™F'ü<øH–yêqQZGdN°ùÆ;¢°çwd.Òfމ·×zG•ç”Þ‘‡Œ&óLƒç fäÌÉÛ†Q]‘e9M–s$+Ømàò˯䢫öñnaÆé»ö¸ìhÆÞ£e܈ì‘ù»—^™Í2&ë%—<Þáãù‹ë[9!´Â·Ï›G";'6³ÈÚ¶çè%%wÝ\ó齆Kóš@ô°¿“±¾W\–#lùÈ­·Š˜¬{ÖœÝ TÓ9¡‰½¦»‘SwF¶¼ÿ½Œ³E‘QŒ<‡s§[ö›–ýáÎ "À¤„¬õŒ ˜Nu˜yǼ‰TYé9VJ±ÖFî®#×âfð„‹JNTl9¸+ÂA åf$z/…R8fNi˜ã8{:ƒÜ#<í‹·9y{Æ•þ€¶Y£uóK®ä”óL«g§»LÁ÷çu-ÕZvæMCâ‚ÎY7)HÅYuVÍ!U%6©¡Œk”ǺQʧÖ6yù-ò=êôz‡‡”E§ìcº.ÕLu™ûeˆâÉ4tŒ &)yPWb1^´‡wÑ$ÒÔ‘ùfAf&;æ¸ùî†#EËúf$ÆŒÉFÎÉÛ§œ>ÓàÛ†³ûsjNU2Í¡ÍÆ;ö‚DT³6²×F\9^8&¥àpm ¡jYÁí»2}«®#;ÀU¥Çžª <媒µ#ÜrëÚ:°¶æØÛi93m)ËŒZÚ#lg¢8×KÏ,DÈeÆÖFÁ3Ÿ³/.å¾µqÁôÒÇsz>cš*sçMͼi¤xHÔÌ„éWuÃ~Ó[iãÐ4šÜí±4m\àû:½1tΈ(xÜ®­š•³¿g(÷îYuoJÿÂʯêTèPœ²§pê˜Å_Ií ÉË,;+ÑT]¨  /a:‡—ö·|„Ëý1ú9Uìk)Q¬“Å2:~õ(K?Ö(]F‘@ª%È2 Ì½éB ã´‘ÜäòL*³,ÃçkÉYFîe–ƒ“â³<+X+JFYÎz–s¼Ì)³m=£šEÖ¶<Ó]o8ʱ—žG€‚Ó½9k»o®9¨`k#±›JGÛzÆhrã_Í9v ª)ìï‡ò6ä…´ÞÝ•Šà¶ª9u0£™¶ß.8}jÎ-; ›™ãTS×BÕ\r>«>ç˜ç¦³½ Þú†ƒ#¹T²î´ðÔ­Œb’ÑT|j_jiÆÀÕ›Ž"£Ü‘£Üã Çz„ç~ÉqŽ\ödÞûþ±sÇJ/Íû>÷ÒuŽ]rŸh² NúŒ³MÅA]Q71F¦1š†yBËlÓé„¶]@9mÌS'Î&qöÛMÂñCšÌ%µ$jä 4Áô§B¼|Åö5±{!¹û¶7Í` ˜ü<]~I¾ºF”}½ãÞ ±pR%–—F¤É‚ºÏºª½ˆT>~ëaÛGÜ×b;»¾V ¯gÉûGà Hý„\×_Ò:©¸,KJÞ;²\ª‹3¥:y{‡Ë¤B–e”y¶€‡ò,QJ3Ï2ÆÉ@”>c”yÁ(/(³œÌgäÎã3ÏUë9E9£žVÔ•c²!Çw殆ÉzKSW´md4vœº«áâË >s{ÅÑ“—‘ÙAÃÙÝJF=V5û!°Ó´\2 œÙ ´©ní¼e­쵑S-G2G]'ÈB„MëcÏÑã#î¾}JîÄ0͹‹L‘ÄîNs¨Õ¬p¦•ë°áÅ04 ò²Ö½ãÈÑ’›÷.›d´À4ó"GÇå¨d4sù¥cÈ·¸›’=Ÿc`o>£ U+s‹g©·ŠR…{ÐbêÂtìb+ý÷ëÍÛ„ç·MAìi WHOèA;Ðáûñ„îw¯÷à=)ê{c¥ÿàÈÿCÇâ¬Ò2íî ¹]_1Üo:¢ó°¶%ô °¼¶‘¿˜6å™<ŸG'ò¿Iá *÷ÖØõt¸üb¨L‚…ì¨O­¶,ÒÓ9Áœ!›%Již¢‚, ¢QªéÈδ Hy‚2ó¸,“žC)X+rò5dÎ1Ês¼ËXË ò,§Ìs2ŸÖñE–³éÇ5ÔgÙ?sÀü ¡m Gã¤{åØÁhR3Û¯8Ø›qöÌŒiݰS·ÌQ¸ä©¡¬9ØŸ¶¼øEçS}ïýèT¾KÛ…çL˜&E¸åå½c¥gcœqzÚÒ6Ü;NTqAÅ-€Ï$â"<®”çy:$¸mâBÊ3G…ι±6bûŠK8…ãLÛȬçË‘*Uܶm  2e‹uÛR'W½Žå4©X«M¼ü:inMض­(ù஺ƒ WÚŽY«vµgõûÅY…®*ìêËù Á ô/¼ü:fÄ,rfY§ÃáÜf{îmëÄ<•þz'Þ~žx£š9V($(¨I^Oá›û[? åÞ‚~õ¤Uòš#–ò°ÜkH#ö’¨ HÝF³Lò™I;ïÈ2¥‘ú”DÎ}‡bšV¦Ã(óä©ê8Ï2rŸ‰!Èri[í3¡Ç&Ö‰.ŠQ çÈꄊ*vö[Îîî³7«ØŸ7´‰Šxlœ±"n.ƒS\Œä™P&ïšµ/<3 K?‚i) G㉗dŒÊ‚ѸàÄ©9w©Ø™Æ¥§ÌU„½y‹0)œÀ"!3/Ñ«6sËÛ“ŒíµãÍ Ší-B–q&æuÍ~ªÛªn˜&Jæ,Ú¶ÅE„™“êðLâå‡ "FQæM¢g¶Éã×$®xú 5fÚV4ž~‹(ü6’ P§$ã&î‡è<‹È¹}~tÛ«îãÁ <0y3rÏÓó~-Wæ öŸ–¹w^B,Ç)[\‹ÅÐŽqÓýå<@b ”T2@A†ÜÛzU²`py3ƒ8QJC”å6q¬ù­3ÈR$á]Rö^ ƒOŒ¢"±‹rŸÚSgÒ€®ôò…†ÄD¤g£”<Î2Oéd0IŒ‘ÜK—LÊ¡z’r$gø¸Øy"Zi3ÝNgœÙqv^ÓÖ"¥ƒI™±=rìÏgæµIÆ‘­ ÕtÎx\°»WQU-Mæçž-ï8˜·462k#Û¥'$-vÐH‚xRzÖr‰€ŽÙ XÃdÌ<Ï9Ñ9&ˆqÜÚ ìœ*ÍÊÝ­jš¦¥jå/4­@UI¹W)9Z©—P(Æ‘nŠ4h=Äñ´©.$Þ~rÿ4[ësÛŸ&,_½z›(|°eÕ==€.¿B§ìõ|–)ŸÛ$(ËIŽ@CEþûeDUî1y ¡YNþÖU·³¶ÕA#‰€Ô|çaŸ…G©ÜXÈþˆ¬Ñè:ƒ0Ny0TRºö¤e1vOUÉ>uÍS„ Uǹ¶­NT$Œ²D+Í*ʽ—Ï¢L%écä“×›;G›ÙmÂÙIMï´¨MšèÉ·‹é}×¶b$æy–QfÒ {=ËÀ96B`îý¢½IcꠚѶR$UgyÛ0 ŽyæÙqŽqŒl%wGiáB q©_ 6L“¼÷ô–žTmK]ÕÔ!R5Í"iÛÆÈ<õÓ‰mçÕ«—_¥N›U™ÇÎK×èn±ß¸° ÂÔ¡ó¼kãÙ[ÿÞŠ7×â¾Ê ð|y3Ýì5æ#'ÌMUþ ë«cß6r/xî†Ë‰Õ,Ý ²9}]¥«fq&è Á·öÙxÊýñÌ>Ûg,“(Áû‹þC¹èz ×E,úy©4nã0ÊR3ºLf DÅÁÒ¢8Í7ÎjrŸ:Zçä_pBÀ;G«ô˜¨«.%1™‘q©MéÜ¢õté=ã2ÇçÙ¢’sŽbò¤­“ÊY– žžš 5A’©.}ò¼÷xóÄŸob¤ôŽà<1FæR5%SÉ"Ä¿dé½YòüiaÞ usžÜðª]GÍÄÍ·}ŠÆ,Vÿ`%P5ZTÞ3Ê raä×IÔðt’õ7å…:`ÙœòW¸)רšÉ›*x¿4tS½ËÁ›Sj衦<0Ýz^69 ]t`_;$(]÷¾>®£œŽ<”iˆ}ž¹E÷Ì»…g"L#™YœiÍ‚wDdPJ란H†ªµ¡óúL–&eÒ6;¦ig.¦èŧ·Ì1)v‰2 /x} RØU8y­}‘jä>öL€654ÍX¸$E Ή§"³6yGYdxç¨Û@†´çV–xórê À<ÂÛ—¹RŒ°M•ÙÚHm:o?sbúÊß¾~ †!;ÏMv_•?‰¼ê8¹ÿòtceÕogÒ/Ǣ˵￶€¶p~–ƒûݱ(eXÇÁŽ@<>% 4¹U#”¡6ít­€ƒZ~46± ïËaŸÇ€Ü/ÎU }å>ÉŒg‘§4e¬{©/ùÔH0yŒÊ9†nœ¥ ½ï:”f¢,*£S.¹¯?&˜G¡e¶ãâf±‹^”ÒZæž²ð}Ä(ÓÓ2™g,¬°¢wÒ=1 Ò¡ü&¼£tФÈ%†˜ª©óq¤²×{G™¹Eò48ˆIÑÇUµA&oI#µ ŒœÐÍÆ…®ØJgæj”ÝÆÏ\?»‡ Ü[°êþ…•_¦û`ú#ºQ²eÖéqç;g–QçÁýNAœÕË–D[B+Ö¯Æ zžREÑ%tàÀ7Ô‡}š½ro•ø½ÝÖ=‰îGóYª;Ð9QTºž*f]6rœ`sj0´†¡Mï×IáÍ{tÄ*.´”®32¥“HDON–rÑÁ´¨M|'ƒä²TíÜ¢‚‹(‘GRêÞAÛÄE1 퉋*Y-Œ*r¿8gm”n©Z<¥óŸ5Y7p¶é±öº†xá ž;ÁûÙpþÁã¿°ò³$Ç›®ØKÛøètvÿ÷ØÒéí"9í…K­ t%ËÕ:EŸ¥EÙµ01ˆ!È ¨çðÂÝÃ>].YõCŽ÷ðÞ}Ýöª¬Ý®êWݯ§S€Á¬ks F'/õTºªz.ûAÖŸ‡N1Zï×BT‘nž²ÂT‹ûØw̧Y>ÞÄ®Ÿ’:3:|:¦LÖÕ~Kú=b\î…hÏ‹B3]>EÏI•˜7Ó°œÀÕïÕ®¸v”s¡«vÈ1 _XGî_íÔ¬=ÛTÉ+ýSÙ}Ð9ímoÝœÔ B±Ú‰ë0"õä˜QºhE!æ,ëC <ÉwaGQÊã5·öi{øÊ½ý¯RÎçûìýMßÛß佞ì¶Vy ç3Z÷ô=ûÛÑä´žEd`˜M–ßCÑ$%¬^û(±žæFI÷Ï…7ÛµÇÐÇâµV·_:ñôWqêí4,5t«ÎóÕ•Vé®âåßôõáËÿ£c_*cÛPüüþ*ÿ!ûð‘<žÎ *Yf]–tA!J½~ÚT£aè#5î7eò›âømÓUÿzßµ‚ÎòNñ+<¤°O–‹Ç_Ž»l³¾ÖÏ\þ‡}:rOXþ=}&>€ÏßÓ¾ï­èÓEÛx®¢\…óÞ“bµËî ¤µêÜÓw·Ç|oàù ÓªÇÜuø?tÍÔ>›Ü×Hä¾: ýï®r À½Ý× ^¾¸Š.·&F‡í§éŽK×­E Ÿþ¤G…TÜo:¢*r[8 ÊX ŽA¼ýr,¯ó¢3ÎËòÉz·ñÑD–×»Ï;Û¿vاvAäá+¯žBå,¢Z–‰ûï;%‚÷«ò/X†ÀýVFLÍÉ3é>‰ç^Ž:/_‹ŠŠ1Œ',’ÖÄo9‚#,øÕy±-”×ö)dAyxÉ«g#ʹa¹Íƒ3¯5'ÖgþèóÃâL}VPä>%jëJ”|áÎm QŽ¡ªßW¿ #(Ëå}g’È“ 1£4NÒV yÙâûׇ}ºdAòmÀÓ­bôª¼U±[î@¼|G× ³@ ÃTÉéŒAF¬1€òó²SØk›ÆcIrwmSþ¼‡õí e™–O6¤ªXÂE)Bó þH:¢­îC†dǶ|=ð¿°Ì6SVÏ„öñˆRWc@Z^Ó)zí]„PÐÕXÉýNÑåx´Ðd] ¶ˆ˜¬‹‚×)aêÙO6ºoÛ ó§mÒgGt“æ5K¡æl#ƒbò1¬_†ûÞöùdAyÈå«ç§ç‹ ùô¨ _ÿ”Êl™@ŠÿÛ°FÌè R@û¿;’ýÚrš¼í'|˱¼—åÝúY&Ï×6Á—i/kˆÙZË!6¡Ü€f&VåèÕ0>"Ï×/“ÿº7öõdAyHäËÐaü–ç¯0ÏRíËÉ^o>£†Á‚iY ŠöuÓ|A äêågŒ×R¢6ëX=ªø•öcâü“X=©2Ø—éhÖ‘eó Ùp>NaÄq9ŠrC~Ð)ócX¿¶¯"þõ×àþÆKûº 2È ƒ<¨ò%ÀW±šm©šªÀ•÷¯°*ù±8 «öÕB±Àr.ÁF kr¶˜t† m¥ŸJÛˆ˜îwž‚ýktP®#¦gX?.þÆeâá‡6¯”Çí«DùçcmÃÚE²¼Úƒz¶®„ÉEÄ»þò1îØSû 2È ƒ\Pyð é¹bñJÍTz¦V²«Xƒ Ê»¢kï`Zü/5ð´…£ëèl£‚|4‘äl^v¬ž,tø–wõ£I×ôMi¢Œå€z¶Ÿ(Þ¾ÏEù·Åãß¾J”?ÈëÍ+  Däsy^lÀü }21JûÜAdGƒ<x!‰}Cû(¤Ö0ØÂ/Éb;~jgÏrr×&…F²†BD¹&|¡cüxÒ¼£jõ¯&xï Æ¤“ܶ`úÛW‰m‹Ç¿v‘@<“‹`ãRQþÓ²ñ'Ê£•ËOc”ns.+dAy$ÊÈŒ”~?)ÅøÄ£·ý}¾å.´Ú K£åPjÞ@—«a©{ëÛ¶-çe—ÔÕ&pšÜ ±ƒ}ЬËøTìå7H@R&ʾÜ/~r\ÿh[ Í+ÄûÏÆòxôÉ÷þìù|ˆdG¤\|3´£x¼õìm‹õ§mÓC]OÅ™÷-ÝÓÑE êéÃG6ÚȽïÁÖºv Y“äù{“ †´LÛËåˆÒ¿ò+:vO¹!ÇŸ*ž¿bÿ@†h`Ay¤È&ðÝtÊ:…n³Vûê_mÞ×Á± ßnÓ¾o÷Ùš}LÍ:«â/ÇÒîx‡À,¢íçƒpýñÕs;ƒ‹ž!ÐŽÒ:·¯ZÐ: ¢ü’¢`ˆd‡ÀkX.Àê3}úmÎATjE׳Ƕr¶Óáö´kk–iT¡FÀ6~«Òv´"8šÏT@žåâýolÃÑK:ˆR;‡5y¯Cv4mml¼þâ§‹Ò_»H ŸñQú—~aúf=ŒÿÉ 2È 7ù.–°Ùfm*¶W¿õØ=ËI`Û÷'OÛ]g9JPEn?“›Ï©ñ©zÛÊHI`x'Ëa¶/ž~™*|uôãdñø×ªçøˆàúGŸœ¯†‹Ÿ!ŒŸl,ÆàARüV†h`Ay8ÈwѵdÐV ý®®÷Z¾p.=ÓÎhWl_{ü`>Ìv´N@Ã6¿P# Íì+"íá?šˆÒ×êÞ¼„b¡ynO Ü«…Þ¹qiÇöÙ¸L •Á 2È ‡!/g¹ g软¿¶b¶É_è;Ðqûu:ÐeA´¤«äæó÷o# éöºé`ùx½cey×br)]Ÿ±aùl^ kÇᢧ‹§ôjéè›±ò·2‚Aä¡—ÐUÝ6tXúmT´ÿ¾*l‹ë{ºþ>ÐKß\ÕÖ¡? ^a$;R——æó]¾!WÅ¿}Ü u9šÖ\ֲ޶yì©ùl]) ÿ¢§Ëò‡ò¹·2‚AäÁ—ÒÁ9sDÙªò¶¸¾>Úþü*ÚQ¨hNçÉ/æD›mi¯]W÷?AZ@>ï‘ö#:ØGÙF *}Jg´ó «^Ê\öìTÑ{DhG¯–¿õ˺¨àa*±­Áçƒ!dA°|kz´ŠY¡ß{m™>¶µƒ¾Öh@a›ñʽY–õöužÌ~j„áƒy­ÆH?§Iáاƒ‹ ß:.E]£5™òÅb&Ž^!Þþöa+=*ÅóqûtIQÉ 2È ÷G^FõXÏÝzôêá÷Ç6Z£  ÙR?m;UúýÏØb/ÌqØ:Æl¯`9ê¨Í{j,ì\€\‡·—ëHŠx¡vn^ÑõìÙº²SþÚÔíaùÜ[ Á ƒ roä[XfËØ‚,•qz¯bÙHèŸ&dûìž~å¯.Ç,s湓’ŽÇok "ˉ]m‘°ù‘ä—Òµq>~•(öcO¯tDàŸ#WIµ/tŠßç]KçG˜ †`AY%/c¹'tITÛoÇ&RK:HG ®œy_•ùw§SîJÑ´@ËrXefž[O_Ï2ŒFtp"ÍYØ"³œ£Àh]¹›WÈãÆ¥¢ÜóÌÎÈ'ÖŽKûæñ‘îHBóˆŒ`0ƒ 2ˆÈ·Ðyø‹éœ;iËöãWï>3ëÛœ¾±¯í¤/ËðÁ¬«^º¦c–q};(&vÍqåtÍå”}¤Š&›5'süjQô“ã‚í«ç_nÈcµ/^“‹äÄ”AäÊàï#PT±ý÷]﹊-È"­£É_›TUÏl¶ÛïÓ£,;¤EÅõö£|ÿÖìC_«ç¯=‡t}5j ]ëˆ*}®Føÿóô¨ÐPŽsâåg#8¸C6Ÿ ´•°w»ô~žŸ…f[OHGšu=$Åò×ý׋ç×\s ï~÷»ûd{!—"¸`ޱí—Õ ·\zÅåûü}«|GtôË`ÖµIWeîô{ÙB·ÝïúiÃa–i”aûüXÊ©æ ¼ù¬æ,¤Æ"'C±)`ÎC¾žšº >øg㘠.7Åó´/[wÏåòÇüÇ|Ó7}¿õ[¿u؇4È ƒ¹*=>Ÿs[*XÈG<+ÞW%®ë–1y« ûTO»?[fÝO¿Mt:Ÿ1Ð$nŹÉi5Ðåt{5]îÂ.¾ù"—‹okQòk%c0†rKÞ[»ÆGåu>Ô$ƒï¼ò•¯äºë®;ìÃdÇ´ü à–•¬UðVúÊWyò¶}2½í¨b_…Û÷•tßxØõú¢Ë4zˆ,{ö}é°ûå}Ûä´5pyo›˜ýyÀÅ_ÿúH–P­r+%ƒ ÿßç2f|Š5X»¤c¶:åÿX4::-4°'|üwù'ÿà5¼î=‡}`ƒ òØg_N§¸õÑ2eìsmÓ¬JÜkÑǶ·®…]l²X÷¥ëégív-¤çF öØú z•èÃVý‚0Û7Hû‘ÝD¿øe_ˆbið6ÚÆO1‘~Ðë—$tôj¡…}’(ÀÉqQþΞšÇˆ´s¸óCð‰?€ÿâ§þŠ3Ÿ¬¹ýSpûíð³·Á[ûäQ&ø"–[kŸ| ¯X…®² r±ÏûU¶¶(K×±‘tûŠ®Ì²…ì ËíW:¦än[9ÛJ`Ý®Â;öØm-AÖ{®Ç`gÓÛ_Îô”(òf.ðÏüŒ(wŸK¯ÿ¬†P¹ÓÓÒ¢©RËP;Ê?FÐ;?õkð_eú‘Ïpú3p×-púN8؇Ý9¼ø2à$ð.` äþÉ×Oc¹¾B鈩tIë[¼ÅåU!®ââùÅ_}VUèªÀm!˜M$ÛuuŸUï,lc{Ù×ýhFÅæ”ßY·í§.34Õ´ï»dn&“`>uËœyâKøýwýoÿïÌ·ÿ³ë >uçYÎ4üþü×ʼnyï{ßËÍ7ßÌÍ7ßÌ|Áð_þËáÖ[oåYÏzÖb½ƒƒ.¿üò‡êÞ¹×òÖ·¾•O~ò“|èCâ…/|á9ÇëÍŸáƒü ?û³?Ëÿî«øøÏ¾Ž~åoñË_t-ú~øÔGá–ðþ)|Þ_¼ŸxíµÜüUYòËŸøüàyðÕÀSÓ>oºé&nºé&|šÁùþ÷¿Ÿk¯½vé¸Ê²äéóœçs*1Æ¥¢¶w¼ã|âŸXù}÷÷÷ïñõ ƒ–ü=à›ü3à 蔩ÎÌUš¥eÞ¨¨ç\Ò)fËŠ±ãû¼ú~’Ø÷ÞËÍqXEl6yú³Çi©¡ö˜WE2ºøÆ·¼…ÿ#ÿOŒüjŒüçô÷«1ò+æõ¯ÅÈ›bä}Ë[¸Ë‹£ÒH¡£Šæ´xümõ¾xûùîâòþ4_ñ¬Ïåy/ü»¼ðyð pžË¯z _ñåÏåyóù¼ð…_Kæ3¾ä9Ïæó¿ð™|Á|ÇŽ㕯|%?ÿó?O]×¼éMoâmo{ï}ï{Éó‡g¾à%/y 7Üp×_}wü§>ÛÞô&>ví7òôýÃÓþ-7ßp NÀM_õ,øÿ_ËÍwÁÀ'Ó<ý¬gñ¹×^Ëp¬ªøÉ«¯æ;ßùNî>é¹÷À³ŸþtþÖ‹_Ìñó§ú§<ëYÏ:ÇTUÅÕW_Í;ßùÎŲ§?ý鼨|NåÙÏ~6_ó5_Ãçþçó‘|„?ù“?áÇ~ìÇxÏ{ÞÃW|ÅW,Öûñÿq~ò'ò¼¯ä¡–× ëñHÑR¿èIqy‹gÛ~7ÐõÓWæ‹ëmǶ^îWйQC?X3õE¿Iæ;œuÔÇòÞ Ü”œ¹øÃ|‰sü :¾Æra—´;û—ÉÛÓg/rޝíƒN‘_Œ‘¿ùüçó~ð¹a,¸õu>òéOó#?ò#¼÷Oÿ”!ü«^õ*^÷º×-Žë‰O|"1Fžÿüçóƒ?øƒ¬¯¯óéô9UþozÓ›ØØØàúë¯ç¥/})ù—I]×¼öµ¯å'~â'ÊÿMozÿâ_ü‹¥ïÞ=È …üðúô÷$àrV8Ì{ ™TfÝ‘Ùn‘^ÇÞvlŸ|åÁë¶,ÈÒ;U6±^<½c„åæofY‹ïÓNâñß#ûØÇøçøWÏxOn®ø‘á×cäªüù3º‚/….^÷ùŸÏßsŽ}èCœˆ‘ozË[°™ÝŸ$ùšH¾¡‚ÉÅÐΤث­¡\“<@¹)µkÇaýRÓb]º„Ž$ŒÜ˲ÐtMâI ¡f7½ >øŸà¯ßÊìã5§n‡»oƒSwÂþYØ«`?Ââ}ÌÓE8@*ìú¡V3´^Œe.XŒNqÄwgûœ 2È’‰ü´‘Œí[¯ÊVû×üÓôøcÜ3¦mûØáê:W+ra99ªÞ°ælKX6ýä²eaÖoÌq­ZÇFYO?óÜ7¼ïû¾ïãñyûw71 o][cç/ïmËÒBsºÁ1ø[¿ð |×w}?ó3?ÿöµKŽì»JÅ^ùDÀņ€•k¼þm·òñËþ/øÁ_äíö¾ýÿøMؽ…×ÿüáã{[¼à¿ ê=hf|ô£á^òrÁÈ?õW¼ãþ+ÿê§þ5Ïþóù’/ùÞþö·óä'?™ç>÷¹|Û·}Ûƒ|«ÝG98Á?ýÞ¿Ã?÷^ýý&Ïø'Ƈÿ¨æO¾ãz¾åà~àÈ5|ð.xã×¼˜³ÿñZ>üÎæ&¿ùœçpç«^Åo<ùÉœEnäà;¯¿ž›®¹†›¯¹†“À΋_Ìó®½véÂÔÀ÷]='®¹†S×\#ÆäÅ/æ×^»èä÷<àë믿žk®¹†k®¹V¼V¹¿ëÇcŽ;vÎzƒMÓÒ3m$`£ ]¯ŸGÈÍk +5À'€ïû¾ïà7¾û»†èmHŽîùÏ>ß‘¶ÿIàz–‡Àh{‡÷]}5ïêSñi;¤íæ,çJä ßpuŒ×=;Æ_~^Œ¿ö¢ßü 1þîwÇ3¿ýâïüÎïÄ_þÑ¿?ðÄ7þ³oßömßÏüé/ÈòýÃñø@üË?¸6ÆÛþ<ÆïüØÿŒ×^{m¼ý37Æÿö¶ß‰ïxÇ;â{Þóžøë¿þëñ½ï}o|ýë_¿þë¿>¾ñoŒwÝuW© ~ÃSŸ·¶¶âÏCü“?ù“øjˆÿÄk¯½6¾â?‚ø²BÖ?ñ¼úÕ1ÆŸúùÜ7§ÏýMˆ_Ÿ>÷"ˆßß[ï›Òzσø¢´Þ×@ü¦ô÷¥i½§õž•^¿0½Öûì)i9iyÿõùÖÓå×_½ÍE “¿—¿üåñmo{[bŒ1Þyçñ©O}êâõ…\ÇþÅc]×ñòË/ÏyÎs–Ö9{ölü¹Ÿû¹XE|Ík^³xï{Ͷìóÿb]×ñ~ábY–ñ—~é—bUUñ{ ;z4¶mâë!>þñÓé4þho[«öù·Óo+ÆŸñ©O}j¼ãŽ;bŒ1þ}ˆø‡_þò—Ço>Ïç¿ âkÒçÛ¶W^yeâ÷¤¿¿užãþjsŽ~â'~":ç"›¦‰oxÃbQñ oxÃâø_™¶÷Ýæï» ~gzüˆß ñŠ´Ícüfˆ/ƒø-½÷1Æ?ò‘ÄÏýÜÏï{ßûâ÷|Ï÷Dç\|Ñ‹^ø¾÷½/N ú´¿ûwÿnü–´]•oK¯¿%mûåżáêáKbüÍ¿' ñ÷¿7NÊ,>ý‰ÅøßÿyüÚ/{êââOÆe|úSžãÇ/~íó¾XNÄïg?úß—n }àýqss3®­­ÅŸþ韎ÿá?ü‡¸±±˲Œ_þå_þà(tý»§uÎÞãÇ/Æßýîÿ%qúÄOñŽ,ÿ~â%ÄË þ@ïòäÞë—@|i:±›ésÛ_Ü[ïÓz/é­÷½õ¾.-ûFˆi½-ˆÛ¼Þ„ø•iýçC\(¬áïÂÿÅã}ÑÅo¼qñúÝï~wü†oø† ¾Ž]÷|¯W I±Y¥×ÿÌ?…øÏ þxzí þ[ˆ?þã?åW~%>5-ÄŸ2Ÿw÷°Ïñ¿ñã»Þõ®cŒ?ñ‰OÄg?ûÙ1Ƹø]ïó¯1ûQ%ýÊô¨ŸûÞ´ì;W|§W¦÷캯NÛê€ïIÏ¿7mÿ;!~{RÊâW›ãüÚ¤¨Ÿñ¯þê¯âýÐÅ«z×â寺êªcŒ—Cœ@ü÷ÿþßǯúª¯Š/C ËWšm¾ Ÿxü¿ÿ>ò?Øù4Ü} 잆“·ÃÙS2Ta—®ƒžþiW½H—pÑÐSñ~¥ˆéÝ]ˆ‰yݧÎe<¨DVsšëëY±Ì‚·öyäË ^ðþèþh1«âƒü _ð_°4»âB¬c\ùܾþ.௾ôKùŸÿó.£sŽWoLë}/ð³éùk÷}ßÇÞð†Åú¯zÕ«xÂ߸hªö½'OrìØ16F#~¢ªpÀ¥Ïÿ+࿜gŸ?üð–ùà?ȯ<ó™\œŒ‘¼à|á;ÞÞ}žÏ¿øæ8+àºôú{€ÑŠã®ßøF~1“ïqnýlüÃÈ¿ù7ÿfåyéÿÎ-=Ó2t¾8åÞúÖ·òÛ/})o2çþåÀ¿øØÇxÊSžÂ?øA^ýÌgòÏÿ÷yÑ‹^Ä™3gøþïÿ~þüMoâ™tºè{®¿ž¯üʯä?þÇÿÈß÷-`°ˆ&_7Š‹A/ªð³1oÿDà?Ýú…ü§¯úþñ_F=;à¿òõ8çxæÁrÅKš¿ù¬'ñ¸Ë¯à¯?u;ïúÎç>ùIüàk¾‹ŸûÞÊûÞÿžö´§ñ½ßû½¼æ5¯á…/|!øÀøÝßý]~ï÷~~ô£lmmñÎw¾“'>ñ‰|Îç|“É„_ÿõ_¿0¿MBŸ¾Þ÷Føð¯À§oåÌ-pÇgàô]¢üÏžÜþÍÀû¶±_ð²—Ñüæorâ¹Ïevà |ïu×ñ__ñ þxݵ×ò¶W¿š[Jç5/{ó7¿ÜYäÏ}.'n¸tÝu¼å¯à?uíµüî«_Í8üÛ‹‚â¹Ïåînà‡®»Ž_yÅ+ø³´Þo¾úÕ ìòŽ¢`üÜçr× 7ð¿]w?óš×°ñÜçrÛ 7𯻎_~Å+¸êå/çCo}+ÛÏ}.·Þpÿäºëøw¯y Çžû\n¾á~ôºë¸î¯à)/9xë[9úÜçrà 7pÝu×ñŠW¼‚ïüÎïä—~é—.Ìyä/ª°¬²€s)‡Á,×Q‡°\Akñð#FÇŽNœ} %½ý[g¨¥Kðê`ÛxM?k£2Û³Û®{Û…Ž‰¤ ž}–¹ÁÍoýÖoñ¥_ú¥|ËÆ—°\ø¥çS¿¯:〽å-¼ä%/á¶Ûn㇯¸bqnþi¡¢It›3Ñsñ“7ÞÈÕW_½0&˜íh®$çäŠ[e ã‘ÔŒÀ\»}VpëŸ2ý¦?à‹§SF£Ïþò3w}ÿÇ÷¿„7ýÉÝ|üïàÙϸšúê—ñœ/|Î9žý¬gò/~ô‡¹ãÔ;;;üâ/þ"]t×_=Þ{~ôG”/ýÒ/å%/y øÀîÿ]«IhdbÙ_¿>ôŸà¶÷2ýÜySRø'áÌÝR­»‹(ÿ øà•¿ñ¼ì[¾…/~ó›ùhQ°: `øJ³»§ÿò7~ƒoþ–oáÔ›ßÌ{t3?'®6ãyæùõÖ{²yO™ú¹ 'Ç…Àéõ]ÀZh)ݸåW•3éxŸ–ŸŽ„ÀãÓëðÉ_ýUvŠ‚íÇô%À­¿ôK<xÁÿþ¿óc?öc÷ÿ òˆ’ïf¹2ä¾SŦÅB:]*²œôÔç–‘£ÛRÔz›ª´5‰;§S`ã´oßÛ¿*G87J¶}üû,¡~kD¬ÑÐ$ª>WfŽ2ñÔ@XfPf¶g鯹†¤÷ý«¿šÿŒ´¤ÆœÛNÂõŽY—ýÞK_ÊOïJ^·ß~;/¿ür®D”¿­ ¶Œ§ˆ°ÿá;ÞÁW}ÕWðtçxËjì €È„nÊA Œ¶™Ž.ågÞ}YɬõŒ Ï}Ý¡Øà_ÿÁ-üÍg?•÷~â,ÜE¼økžã#|ô¦üþ à›¾îkøœ§1ºñ6þøßÍ·}Çßg{{{qábŒ¼ùÍo&ÆÈsžó~û·{ñÞýÐÝ÷;¹™ÁÞpÇ_ÀÇ~>òpÓ>'o…âVñø÷vå©ÒŸ§ç-pøk:ÚÓÒ{®N'ðÃÀ:pEúü§é,êSÌEÜn>'½þ„yïjsѦÀmf½Íö®67È^ZïñiÙÜø6øä™Ý!|ý;n‚“°wv`¿…³ˆRoè(›j ôâØ)Þóð:ÏÈÞlÖ#‚s1zÎÚù£VšŸÓ›Ör¡Uô¤7÷ñú-EÎzÝ»2Ûê{D– ­Ç^š}þ6ƒ<ä¥t÷¡*QKyì*Awõ‡¥¬zn+hõ³ ç/¤ÒG¥|Bçýëû¥y¾–Ö±ÑFïX2–«„•ó®ûVW›ç¶]ƒîËöÑ×B*½ç-Ld Š- Ó±‘ÎìG ¤<¬2×ï`+ˆ1Û‡ecÖï<Ú7 vR˜F4«ØYb‹ÜËâ¿$â3QòÍL”ùì ÿ–eã#âWÖÐøL4‘[íÁÙOÃ'ÿ|ò¿ÂÍï;ö™žlÿìIQøÞËó}© mé<„]sA÷è<°<ÚÍ*[}ßzÅzÃYÏIÙAö¡Óâ º­~7?]îÌ1ô/ ,cúÜFý‚}ÃÐo Û—~ˆo súFD‹O,3©è}Vo¶o0Ÿ³ßß³ã±e(ž |¡9'ý³6)j)æµU ¹Y]Kb… mħ÷G[ïß¾·/k`ìõÕ? »Ømzºùö~îÆ.¥&³FSºß›½¿tû¦ÒßbìíSIѧ¿*Ýšåß‘…w 3N}£83ÇÑèÞ?X6bºÿ¹YG“Ü…ù¬=ŽŠn4åª6Ðôö£Ñ»ý~î_A\e=Ô«ëW±©ÂуÒ/«¦_m×÷L-Vg-hcžÛ›Ñ*]õ2ûmúXfäüÛv´ La¡>æ×÷ Š}DÎýŽª|m{‡¾â·%ì¬ø\ÿæÑMxÙ÷-›ÀŠM¬éwż¶QÇ*8ʯX¦ËmD`EoDõ@¢Ê{ŸSïÏþЬqµÆÌÞeïüYÖÊßü&F¾øe$iú ÈpqUz¬}LYŸ«ó`–åˆW«ëª‚\KÛZ£ózs ( ª—Ù.¢õwÍ1ŒÌþm$§ûYU‰jl¿ý°þÖ6îwo“¶zö|ðPÿ7ª×®¦K:×,S±ÕaÓ¿Q¶êˆÕæ˜tzfÖ³:ÍžCÌ2{Žúm–­S¦ï—,·u¶‘®±0•þyÒkÙoò¶…@ºgÌy¶Ãgìù·: ß±T÷gS÷¦cí·6Õþ¦©‡gC«44©c•“f§ívõ=«8õ¢ëöô¤Zæ^TÅè×XöÜõFÕýYElo:‹ëÁò×*¹ªwÌÖ‹ÖÏ[þ|†Æž[køV)jÛªU·c=d«ðíù¢·ïUø_ߨÚ÷ôZûÞúœgVVÁzÍúÞRëô={ƒÚu}o{ïBØÿ}Å9{8‹–í[…¬‰NÛ¢@[¬ÑÛî@Ï©*+…<Ö´FHÛ [&™uèú­úÞ¨£ÃéûѤ½gÕ;·CÈWaî°¬ -.n=ïÊüÍÒŸê†}:¡¿=ÍËU½ez~ c©Ó¤÷ª­ÝaÅqÂò=ßw>ìïÐKû؇ÇJºH¦N¬³£‘µ5ƺ=sϨ~UÞ$zǫחß!ïÿج\cYÙ©õÐç6™c-M"–f›ý¾ÙÖCQcÑ÷èmâ¦F°Pí\¯7¬^dõPúž®=zÓÙÜÏÆ+UÌ*?Ë#¶ Þt™ -¾g·mþû,[h+Ö;É8¿2´Çm=mÌó>[Ÿg;Ö!°ÇØOêú6ì…»ìwöëvÎ/ïà‘'¿|ïý0s¥Y(UþEYÕ ª¸ìêoE¯êl>Àz‰V‘[Cl}]àY¾ûF]Á&{Pf„Øc8¸¸;E®J\¿§Š­çnuЪUa uÀ¹4æýþo`U·_Û`í*ºª­[Ð×)X} ]tØÏ¯éþû¿)ýžŽ.`±~þNh{ü¹UÖ#Ó“¬ïé`­›å÷Žz®7SÿÇo@?9ËaÅÞtÙ¡bêIÐÝ€šÍ·ÜXëEÙ dIO¾ j³ýö¼¨m?k]/‚ÅÈ1ǬØFDÖö½ {AmÔ§ÝYŒÑ¯½N« /û=ú,¥U†ÂjÛìNÏųBUý mù©ó,<¤ØFˆR×ëj•ŽuÊ ;߶˦þ­q^ÙYeoï¡«ÆÖÀòB€ªQ>BÛB»}ÆdZ ‰ËQ¹uˆZ:˜Ëþ®úsšÞçúy7«€õüØZ€U¹±>÷_Ï©=‚ì9µp¦žË~î«X±¼Ï&T#TÓEfýmÃr;lÝŸÝ—æFÊÞz¹U‚}i•ŠUÒ}ï–ãªíèçìÙ©á©msP÷öaÃ[[ýæzïõ;ùÙ `ñ½bûÇki–ý„h?«çO„Öbk4T÷–Ù‹co[¸âV¬¯çÖzy}¾qŸáËÞšå$÷£Œ~Ô`€õ€¬²boNý;>Î ÷V^Û_PæÃÄõzÍè2 §ÞÞ“6ÁªJÏ*(›\\Õ³Þâäz­‹fµ|~ä Že¢äóÊ̦fJÊ>÷çbB»ì¶½cÖ? X¦5P6oÐOÌÖf=XÎWÂr‚ÝB^ý‚óE¾*}'KEѾse)›«`j;SXõâlÎÎm ËN™î¯ïæ@Þç÷ö­«Íð÷w`o[XÒ/áÖ3‹ö³â9(«¤ûI ]ÇëÕÚxUáŠ¾Ö ?B¼ 뫳¿`µ¬X¤Åëúìkáû=‹Éi¬žý*V†qeo»ú}ûE)÷”#ÐÈE¯Í=Øï8Ðâ°ú=ûÇR07È…“o]±ì_#×eNIZlÝFªˆ´>dUòÜ:-]Dß¿/êÚDçŠ 0@Û@ãÓïÖ%xÇCÖ¦Ç<éŠYUÛ—%74,Ã¥°¬„m‡~Ô£ÛÑïe[<÷‰« ±¬œ/÷Õ¯ ½Ïèo¶bù¼Úã·Î*–`?·h“¾zm­C}[ù«Ç8î­\•…űõ@úý²}ï´ïcv¢ÊÌZ6«øôdÔf™2 †Ñ¤“M²ô“6-]_5F–®Òg7Ù°HLÊRï£ÏåÕäŽ~?[|£ÇdOÙ6dì[e«è­§ßß§õ ú8eÊ ½e}ªÏ ¶ÛÕ›ýÀ¬c᣿bÃ~½üO±Ì¥×{Jó 6B]Åö²¿E5$¥Ù†zù o¡]ëÍ`FÉ4 4 /F`ѱÅ-Ó]­§o»αN$œË"R¥ÍÀ¹Jq•ƒÙr®£Û§ß®ŠT¬CÛ?ßVV1­N³ëØç6oÙ7úÝǽã±ëÚϲó¾õ·J+ë-×èsÏ퀇¾ôöbô)a}£Ó7(Æèãöýä•Â2ÖÚä®õ‚¦±ëZÅ»Ê«îŸ ëù÷³újÔHڋ׿™1ûXAçµWœkí>ì9´ëØóaózöëZ”þÃQ~¸÷úÿf9ƒe8Ôrú-m:'H™JE!ŠÝ;Qô1¦_×ùÄåŠÔÌö!x(Ɖc%h*)ë‰Q¢€à`;‡M+ƒÇB²ª¸ôww>Æ›†#q€IDAT>·ítûýz«\1ŸÓõ<ËÎ*,ç6U¬“Öwê,zÑÏyöY×±(оߝRV)ÍöõüªµµM‘”è‡:Ö[‡e%eyþç£òiшū¶Ò ·ždì}ö| J¿˜~ñUFÉâyý j“Õý0P·i­½FBñ~,þØOêèo{û²¸j_ ÷)cºÝ¬·­še#¬¢?ÐUØ£='6:ë'Õû¹þ÷ăÂäÉ?0Ï–îžT¸¯9@ç8Yg;Åï¼xýer5ÛŠ^Vq”2•>OÎa!M%Ñ@Œ%>pÕ.ÃKúû›±|Z6‹…x`™45ß«1ŸŸ² 1éïËê8ßÛ®­ÑPƒÔ'¶X'MGö7mõ@kÖ³Þ¸îËêJ +C¥ë{–*jÏžÇ~òºí-³¹- YÅçVhH‹3ÆæDX꣧«Jë‡ZÒÒÙÐÆž(«¨,¤b“‘«¸Æ6ÙÑ÷`m¸×Wþ«(ýG¼Ê<ÿe–넉íÀ¹‘,Hò–¾ì࣠Þ'zœŸ-S?«9Ìë®_Ï*’‰*Võôûø··÷±nÓÂC–.~>éç¿”Q¨ç£ï Úuõ<ˆ~Ü3Çbß·çÝBã¶Má[Ñ­yœ¶w Ù(D®kCW§ì 5 5ˈGn1g{pֺ؃±úå;Ìó·™“ƒºMÊÇ¥{0Ý,>=æe÷Ú%E‚À?:ûi>•GkˆbŠ´,´BÕß íÇe:…|l䯿¿~ÿ.ëTY½¤¿ÛÒÙ%V‘' ó°û¹û›±|~«3Ÿ>ÿ)¤íûùHV_öÙzV”,+s[à߻¤kþ¨ÇoË:ªš³\8ª˜ûÞ¬ž<µ «°Ä~ˆSö>«'W“4zô³úhÿªÞzö¢ô³Þ–¡ ¯ûÞ¼54j)ÕÛ¶…g6¶tF+¶c åÛD•ý~–·mÃ9Ëèçúø½½ˆýí÷Ų{4S«o¡2½Y2gǦ¼7Ô›ITÑR”ºóÝ£JÛ@ôÝ{Þ¼y?/ñpàRAX=諸!mËÖŒÌè¢ë€õ“¹ýHÖ³}¨Ô }gÓ*[ý¬ªX%úû±}=–}àÙÀç7 5/™P½¡=~Ž§Ï¨Þëç¦f¹ê/ÕZÕ"½ÎúùFXþí[Y8™–¾iéMv8ƒ}m-m¿jÍ^{’û‰‹£«'¬ëôù®z²õ„©Ò]Üx½ýè2Ì>mý,÷‘±Q“‡IºýG•» åìþ-UR/|ÕÛÏ= Kmë_8AôYýN×Wãò!dY^¦Oæð[d^<üÌDÞ(ÿÊTVù”ÈKXÛ”¼À| M-ðOÒýš¶©JÓ*½`–Yº±Öûy;Xþ Úh@÷D'µy<«Ðû0±­‡q,G+Ö Í›Ù"Ÿ‹tq-_CúøØ}êïs·w|Y(ôÕGNì±é>aY_êö,ÃÒ:Êtl)÷ó-þe¿PßÚ:ÎUð¶÷¶e­*RZåi[Åg÷¥¡Ü*N¿Z}{±m83ÛÌèŠfìÅ]UT2í—nK9Ñ6TõHBÛZWå4ۨŶ–Æ<·ù`ùÆ´-iï{9ýïÝ·òýë9(þAî‹ü¦KÅ]cQð³=ÁÿÕÓ¡{„ÄõO?Ô^mº4s˜¥¶Ú¸m®±›Ã­³,ú ]ûs:§¬ ©èï±ÿ;Ð÷ú¬D87Xq¯b;ZHGqüËÿ%íë=ˆqPé7åÓíöiߺ¼ÐØåú½ú3 ¬Ò$¶…³ZR`¿”Â"}kg³UÖÚ·Ä*¨Už¸t{¹Ù—½ÈË! Ë<²'@•%t 5.v[ÖØ`>Û/zÑbKíÅå½mèçûÉ"K?íç è­gë+ú9Š>KIÏ]ÕÛ¦ý~ÿ/ƒ rÿä›´Òlÿu¶Ž Ås4ïÞ—©Sé¼3!&è'~…tÃÇV(¢m씵má`Eu޾×g¹X´–3«4õ±]Ûý@Øß9f?ÖaµŸ·¯…]ôX>ƒ”ËYnŠiõÚ*H¼ÿ^ŸÊ®p»Í—ö#œ~j TÄRõ õ³îý„b? Ù·P–qÓOöÒ;€~DÑ_ÏÂ8ÖpØÜƒ õTÛ„ªöÐè“UÆ6cç‚ö-©½úxºž¯~’¸ÏýÕï¨U}ö|+¾gia­y,9×pôÏÀûd '_{8 ÿí¨(ÿÀ…„ågÂûQþ1 æAŒƒNâ³£-íÑ]Ú¹1Û†ýß!ÝîÎ!O\ÜM5¨ô©Ô²¶b…E5V‘-,L|p‹YÞ‡¿ûÆB¹eo™îSÏ›ËZ#´ªˆÌ2û¨An»Ñ©2³EEö¤Úu¬¨bì{µ¶e¬ŠÅòú9€U/ØYÁ|^O®¶uМ…RÉôÂÙã¶µ––ªû´IëÜ,·^‰M ÷½ ²l ~!‰Ýf¿Iœ=7}xÌ^ä?gA<ùšÓòø¶õ”RVæ d©Ð+´-4&C¡AmÔo‹º¬÷ªŽœÂ̺ŽMjÚ<‚Jß«×߯,ëƒU¸þ®úŠÝþά²J×FÂU%mï¶'‘Õ¶†VçþìqØBµ>«QE—) Þ‡žò~›*?›°í‡Dp®•é<èSÔº»Þö,nÖûÊ¿ßè­‡gtsú”1UÔ#:n4ÇÕ÷¬-Ô£7ÛùøÿöD÷=÷þEëÃcJóÒ›^ßëSsûû±ûûSä¡•íwÏÿÄ JÐO[ ûÇ9ù«*šôƒUE>¥‹²m_ýÝF–<•>\l#dU†-Ûß®í¯Õ×i:¯xU²¸Oté3êlÎê'Ì1ZÒ ½Ïõ!ã>kQä–,cu¶®×'~XY˜íh½•òyoÇб^lo ûû'^»¥oYº¦zå¹9@Uî5ˆÁ™mÙèÀV0ZÖ€U¸ÖÚ‚±~/Xöü•êjg èqöOf¿ã¨íWÔ¯øµ¡¨UâÖ¨ie`0Ç`a.›´ÉzËÞà ƒ¾¼0QYþp3åÒ½®¤¸®¥k¨{Q¦Þó•Y¦^ºÍ§i4®ë÷Ûô£«€-ç– …m$×OòöG}âŠ2tÔ`•¬öòm=v;^•«Óý¨¨ÎSÛã²Ð‘5XVO¨¨ÞVc{ûËuŠ—U¦ FÀBB¶Y¿ ž„M–Ã& (V¯L¡µ”ú%mh”#Å*>Ú b+ðT¡fæ=U®öä:Ã6eyBRî±x|À„ž Û‚W·oÎÂö/œ~÷~DÕ‡—ô"êëü ƒ òð“7§XŒ)ñ–!Û~5­*TuÀÔSï'Šm4`s–2Z³AÀ2,»ªXu•‚ì~^–á$ë['V—õsª³lÑ«î×zóý¶/úÕõõ,<­ûµó’U_Û¤qž9S©—à ]nO†Z1ÅÜ­5¶•«º#k0tÇv`µ5*ýŠ;=Žåù8•««Õ·G-zNGÛÔ‹¥Û´ãô@Œæ==n=‰6ùdóýJ=‹KZïÝ^0-àˆ½ýÙmÙs°Š%ðnäá-û¾n —?ãD§Øžýúœ›eª'¬ÒîsÿËúÄFç*ý$*œÛ¡·_Li•¥€œs¥Ï8´°uÞè=ïoS•°*`ÖÑï«Ç¦¤ÛÄÏÂö–E¤ï«ÑP*{ÿ;d@®ß¶0O©Z6ÉÑïf§ÓÏ–÷kTZ_?o­ZæEÑ·q¹’Õžü¦…µu +³”TÒ [¦Š‰ÌÁ(.‡ZV¹ÚPÖCh‘È@óz’ÖÖ,—ˆÛ(G·m= =gÎlÏælÒ¸ÏH²8‡ÌÄdG’ÜüW?F§øUéõ=|û[Òß®:z­ù³,–Ø[Ö‡UVáô°ªíGVOÙ\ õðûœ[ÄÕ¯ï©Í1õ# »ݦ…ˆ-©ßê¡_«ï{D¯ˆ!è#0îw ¢íåå¶<ŸÏ—“öËêά³Ä"³í:ÅîÍ·v^’DuË¢Y”¥~†Þ>2`-öZ•XÍ:òâ˜â2$£ÆDÃÅyïd:º™š,Ùp:¬R»„êù°=†lup½8öBë±Y˜*ogAòt¤)æül>@ »–s‚ ±j”Ðo=7Ÿïçø`™!ÔGV‘4ì{ç#¼ôE!Ëú³°2æ³ýZ*;‹Ã²£¬ç̲߰´Š_k‚,´lÙ›ª·òÞgm"9/Ç’´ ©¹“óRùפ³W¦^à¶7ˆ…aÔ«ö §×«סÃNßwÂŽ©$Üû¤×zC\öàsOqÒcÒ×hgH…[Lw„e4ùÞ ™š÷ô†Ð0[­«ÙBJzÕØÞ%«f$C×)°sX:ØcA]òa¤Eõ‡eøG2UäÖ+·ÔÊ$Ì2|¢baX8—™Ë…–¶j½½Ï4T‡Ö:ŽŠ‚ô›4Â2)ÆB\}Gºïý{³®Tjó¾Í}ff][Ô'ŒØ¶˜mäy‘”mYè+H™wSu¯ÛF¶öôÈ%b§üÕÃw|ů½ÁCO?ËÓ6ÒsÒúm›NZ+ $¥—i󩮺î;3W.¤Bºþ¼·>´E¼Íæ[¶‚­…ø=äÑ-Dîõ¯aÙ“µµ3}%o1Uš¶NF?g›Aªaé# ÐåúH½ÏÛ„©eØØ– VbÖ}þ>f™5DÖ0Y£aY‰ýA\zœš÷´F³ÿ}”qi{º‰ƒžu–‹"mj–&ÿT³ôžÉRès-ðÐ#³-dï*GQæõ¼ÛVŒi?øôÒÀˆ¢qSÉg|fI…®‰÷2‘HßËòs»¶)/`#è’Ø˜Ôçòopn¢F/†ò÷í͠إ‹!Z.°Š½©‡AylÈûÓß—_Ì2~oó_°¬ü5BŸÓ)Ó¹Y¿ß†¥_ÀyOôK[K`—«( p>±´R8¥¿Š«Ôû 0u¿¶.À¢ÖÐÙèIJ|¬Ços›  }Taªçì¼ôùX,Ïà ê<ñb$ÿÚF #UÎÚªm¤”WèÈA91†!¤/U‹òYÊ ŸÓ"5DuÕ@6îŒ@–KYz r£µsóÐ èà!  x½­sЛKO 2~ìIµ!«íËc© ¶@Å^ü6ƒ òØ”÷¦¿/CºgZHGWvཿ8UÅ&_­2TÚ/ ²Í6-ïÞváT±ý·úä•pž×ºL›DÚZ©~ql?Ál©§«º*ÛâÝþ{6¿` &€û“'cè¼yUðÕ¬Ñ6bÚVÞo*y¯HÙ‰ùT«zþMÕyòYžxÀéê•£®T<+ä¹ ê³îxÚ åÊõ\JÍÕ`å© •N Rïº|F_4 ß±®„YË|}…lÔÂÚ"[Nng™öq<]nigêéTHÿõA¤“ç"Uútmõr• ¡ Rwª<ûœú’åvɘ÷U‰[HÇÂJ–Y£ŒýL?é«°ñœeVßZZ¦Ð‹åì[a;uZ¥o‘eQjR×âü*«ZÃô{–Ù×-àÞÿtb]‰'®, rÔ)ЃÝÉøÎTó.¯§/‘ÎtQHåŸ~ õäó泄קåÅ(%‡ÓUtéÈ´‹`Ûžk˜BýBçñk’,ÆÚ)Œ¥‘IÛŠQÓ<‚ý>åÔ± åTÑ«1°Ê?˜÷”‰`Eo`›ä±½K~í~ü8ä±"×Gè`Týýi"Õ;ÀÝòâ-}Ý*K ©Øz'X.¢²‘„*bkDl²ÕF–Ïo!%ëµk$£ä‘¦÷9Ë:ÔcÕü†Fjpl…°m53_±Í~jä6髞¸*Í;{möÏÂxCÞ/ǰ–‹Rm*Qü:&.ËR=A›’´šTκ¤/®Ë”cùJuHPzj[³˜_ªQ)'Ð60Y_Ž 2d½0ïúš‡F¶å½ÀEš,.Ógšyw¡-vV ^ˆµ®JѪXÆõâëMõóè'1È ùc:Ârñ¥>ÚúU½w,”d›/öÛ'X¥h•h_,«±ïyëö´ÏXÓÛ~ÞÛ¿FÊ|‚e˜X!/X†tæéW¿Öɲ&ûíd¬QT“;/K  h~ v4V)›!ÍÖ¶XŒ€ñî³\ìt¯Ãé‹Q—à…åDòB±ô£uE2Õ¬Û‡zêåfÜä½0bè#‰b@½&¸}Êi´K£îŒ¡›G¡¹ò(!œ²wÔÛÐı^dµÂýÊD½ñjå?È ÷Uþgzü2–Û¹œOÁ[öÅÌmÑ–‹½Û/V¬g; @Çö³m'Ô0ØNý\€Â8ö˜¬1±9B›Ç°4ÓÆbúvV°ŠF ý–ö}Jh®PŽó0'Ei7-¢pUÁW³äí»nÿŸlttOï»±p(žM¢†&3åHÉÜDôÏ•ÏDW“à“‡Ÿei¦h€ñš,«³.9œå0›v†Ja,ïÁ—b ŠšôÝÔhd´^"•ù´£´j†¥gÙÉöFÒQ×Õ÷ßxŸoýADå"L!ÛXÍzÔýV*}x%³ŸØµÑƒ}mé£ýÈÁ2t›™Ù—¥“ö)£º\ÛÃXce‹n-¢`»ÚcUé×´Mô\o›_X´‚€îN©Öu—ÀÍòNÁÛQpÊбgO¿£µtPŠé'Oß§¸'´ÉÒ¥3ꔦSÎ ¬ŸYªÚÒúUúm‚t\€ñ$QWËŽªßOF^vÛhéò šCÈ2ùžgÎÊ×Ó± [Ó k§sÙÐô ÷êödA>›üYz|foy¿½ƒ…;úU¼ýõí2Ì6,‘ã|­ìçÔ;·?t}÷û5ö3ˆË£-´µFE×é·Ž± 侑XP>W|/wË×CÛµPQî~5KØ»I®Bj·`ùö ZÔÐeµIÑ+ο€zRâ×Ñ=_ÌM‘ˆ1šå‘šî™µ¶3Êô±Þ¿ælýÂâ†î¸]ŠXô}ýNUÝ%|•á£É_½³ôüø)dCžÁ¹|ÿ>áOëpàüÉ`k(,岟赞;œÛ"ëí·,öó–Á”÷¶§ÛŒf[}hY½{›ûІ”¶W’×*Ø«_…œCÇ»o[C¬ey9–?eâ@‡—g&ùjY:ªhJ¸§ÒH-$”¥LEˆI'†wéËÄn{º}M /Ø;óç§ìŒ€*H‰fºÏêñ•eg´ôxÕ hÞÁy8˜/7uSÜM‡WgÀ?ÿ¬·ï ƒ ò@Dg\çrõ5ÁªMU‰÷yó¶(¬_œi½V¬7¾×ÊÅ·Ï-ÛHI#¶Ås_!ÛÄ´ÒZ³Þò¾A™q.f½ÿUQÑR/ ¶éØ0°Œ¡çE§èUáª"V[ÍÄ3Wcà³D¹´4Ð\&Ùí@×¢ž›"è"r´\iŒ1Χ„uÊÆ㎅‚×¢4e­o–0_ŠÁÒ‡6ÀÙŒºíó“!)ÿø~Ý΃ 2Èý‘ F` Î@ï.ç¶zè‹m ¡Ð­rýa9R°‰X[•k•nk¶¥œK=UGi«˜eV,Œcóp.ÃÐ>·•æ#maœÛÚ¢%Ñ@•5³T\vÞ²zõúÜ%ê§VÜúäÕÇû;ž¾(KmF©Ñj%#¡û6Hg¢JXËÈPëjX|âѯmvù˽‡Äîq©jwÞAC8Ó¿'Uã:ÍAï>ÏRC¥QÇò)ôsGûŒ$Ö!&¶O%æF“äm—«‡U¼V”é³Í2œ”Õðí÷ñ&dA<¹1}úc¿×,Ã,ÊŽé÷ѱ^²õʵe„íÃo#Í?ØÖÔ"êS>õs–jªðÍËK[RØæy {ió9­žV…?¥ëš#FJg Wø¦0´É…—*n•%BǦ™¬‹=^ë°xo@uçå½ÙAÇî©SM@hÅ0„d²¿ºî »B„ñHÖa¹C©BK³9nÍ]Œ&²Ï½³Ý±/~Ť;‘ÐAA*š7Ðy>ïjÔ|”d‡Ü˜?‡Õ8­b½åÚiÓŽ‡ìþÜ›˜Õ×Ú!X”¥¡ÍÐÛm6©Ç«p•Â?º®…­tŸÖx­ÑEµÙþbXŒm)n®Øþ¢ˆË ·¾MTÑE²·MœûyêºÖ%“•ªYÍD‰êgfÓå¦r–=¤ $§;]t”rê+ÝÓ&¡-ƒG#¥©ú©ì¦å¶kiº:z,ºŸj.ÑŒm>ç<¼hÿA¸kd *Ÿ®JÏûL}ì;+Dß³íßm˱ý‡T±öY8޲IØh>k#5FJ97ÀÊRÛˆÆ,[%±·®æ¼ù\®Š//:ø§ÉÚªTuPK9£PŽ“§LV Ù(Ñ05Ö0)!ÖPEéŽf0ÛÅŒ!iS1˜î×ÁE1ÅoÚ‚zÑ®êÚPg¹ä/T4¡l;”B26HRy´Ö½:ATÅxÙ0hwÑÝÓð5§/ð]:È ƒ)ñ"e7êº+ÊÊ‹®mC8çÙP¢3¥i™›@Ù@¬Ähd9³.¡Û¶’ìƒÉ7]£8ËPšM“27PUn<Pþƒ ò¨‘‘ä0t-¥3ó§°ŠM¶fæQ€òïû}ƒ”¡cg À²'¯JÚ•©ôá›{8_T`Oj'Ò~R¹\ñk(r¥gæ¦ðË{„ÏËÑ€ž’eò¬í|”›õ&zædfò 7 ”(§ÐÎ¥U¦I_³.Y» Œº–±É[KÿT£Ð6%¸Ç'ŠèÌ ƒÑnŸ¶Qœícô7=·à ƒ r˜¢Éá>þ¯z«dUI*ÇŸ´®Î±Å`ªûõ£×íÚfqvưÍ;(u³?R³ŽŒUýlûKµÌ&ÕĹÎî…Î žîÃ$‡P?nöÖ'¤Žé¦Øê…}³Wç$Cë<äãÔ"4Ð@¦íŸ³nŒd>Ÿ#í§pOXžCl å†|¦˜C>j_ëTû2  ˆpM×ÇÁ{ 5Š–l[Ž4kEAk—ÒÙ¬>MU¿ãõλoy=Ÿv‰^•&µqVºg5ëAóig žõáùdÓO"F`Är’ײ~”‹¿ÊË^j&‰(Y› XUí[Ò!êv=t)Ô çΰ‘‚vÍ̶j³þˆ‰Øay™ýîÌˈ‹É[ʉ9"Mþz`ñò‹ ˜Ÿ…"õdP¥ùúN3•ê°ƒ»S©ñ†¼ßÌ$ÈЈ!ih¢ù>‹8)´ÂÝŸíÉG´ßVç†Ξ„í”ÄNÁÇtOÖ›îuƒíu|¤O̧gþåa߆ƒ 2ÈaÊXfâXO¾Ï¨±˜ºõÀûÌ 5}ÐÇëö±Å\-çvî¬{ûÔmNnÄ¥9ÍèØJ›˜Öè%‡.±ê“Ù[°fúñHÕB8 £¨òQüMà[ŒSfy“ãÉÕžK"¸XO¦(ÙÀùŽÊä"ù|[¥ñ`Ô ÙÔ8áü™û2;HMã¦]Ã:03ª÷×È@‹Éve[ƒòdAnB’êmË„~×PUê6©j{ýXXÈvUQåÞ¯K€å–°ŒÕëkÛšZ£Ž~}Àªš ý8³,“\ÕaÇ[Ž¿FÜÎÏ÷靨€r] žùQâņduÇ)ñ›ÏÄU÷¹àÿ1@&»ë²a¾’!Û—¿Š‹T}±•Žxe‚6Ž"Y˜` ÎÜ$Ç~òvù.£ÑÔ^¼þ“²‹gÿõaßvƒ 2ÈÃE49 "¶^ý˜åöÒý>@°Œç÷+Ž5rΡjÚjâÌ|~Õºº¾m4×{lJ²Eajr›Õ*`¯ž¿ÝzƒaýÌa2H'‹AðÛ°vO „RÏf_H„0ÚNï­wIÙpVByy³HmEbõ{‰ÿ_ÃæQA—6¶¡Ü†“Ÿ–¢/—‚“¼”ÿ ƒ r®| 1}üÞöûYU¸¥Þ·í:ª‚±£ u¹ [`ÛCô÷c?£b£Íèg5wañ»Ÿ\›… ¹ØLéŸÊòéGcŒ’o»ß¼Bà lœ˜@­$›©D !éÒÉ0Í45“ˆ 9¾Ð‹– LŽJŸˆhÒíº™™Ù’:¥%ÂäâtS‰ ˆb еŽaÔÌ`vòýå³8›N|è ¼f·uÝCc„§ýùC}; 2È 4ÑÙ–¹£½ù-‹¦¤SÐý„°~N¡‡P3û3€­7nÑô¸v=[# “Ì`™¾ª kMëgûƒæsïåÅx"kè|€vÙÂ5Ò-®!f%G2°ERÊú8BµæŽnÿ5‡ý»$2ð¥ôgÖ.m΋Òu=Ôû©‰Ï¦$‘ó‘3ŸìšþèD˜ý“‹36نɦ YÑõšîÁÞ~Ø·Õ ƒ òH‘éZJë$Ø>”’„U&ÎØHë«wo¼äˆ!)YîùoÛCÌéjiÇt ÝÔÿ¶µ‰Ø„oι†@¡'…©T"¦´2B€âhOÐMK¶æh#)ãjë—Áî-Âà™I <À±'§É.¹DÅš$|Û4çQ¿/;o_IùÙH ¥z ÕŽÐH}¢e#X7#Áê=1f_mo™íAÔ7 :¦Ò›ý׈±±s‚a¹ÅÄÒ0™Ìá]6ÁÎ1›µ0ÎäÄŸž€Ñ‘ϯ`3uÚP>ÃúÌOK2¸™ÊòõKÅ@´É¶Ö 1 ÅDŒÃü¬ä.úÐìKb9o–«³™°‘r Ì!ÀÚOîÍ3È ƒ<òå3ˆÐþ?–Ÿoë·…^–Ý£IYí®£Ñ‚eõLYöügt9Ìzª’­÷ËCg4š¨Óóþñe¤Àb.nnþ”ý£åbkî¿h¼?†½;ÄSÏÇâ…‡F”öøXbï´ÿ8åVóSÚ¼LbJi çµågœ•é¬í¦hb] ¤Ð$FÒLö;:"y‚y*P»í½° îßöm3È ƒ´ ØÖè:ºLóš³È{ûË!%€ÖLÑï¤YߦoÜJ‰pÓÂ|¶¯÷›™dÖ¡=Îk—¤n LOËòTƒ(û<-ÃucÀrͬɡ‡FØFÓ“bÆ©…ÏáâgˆQÜöm2È ƒiXV¦ÜAb¨f¥DY‘jÒöc” b_ÀÙÏÈöò²›ë¨ÝCggqßvýa߃ 2ÈcLnAöê.¢*Þ"ÐL;…ùl]™æLR¥Y#ÜÚÌN¥ÖÏ©ÏÏÖãå³ÍA*Û”Ïú¬cµsX»B`%-:«÷pßô+‡} 2È Qù$ð·ýctJè”»öÿ±Å]Ð)ee Ù¾@–Ëos ¶­ƒ¥„êÈJ…w´HÌŽ¸lXN`˜J`íŸ3Y‡ZKÑŒ¤oN‚v’ÂWEœ¥Ž ®Ï|íØ¿Sà™rS<úË:ÑìŒ(öñ¶(w VŠŽ%”—b ÚZXE/Q>‘mœ¾÷·ºÏ ƒ r¸òÀWÐ)p…n´(K'êöÙ?ÚKºzû9X6 ÚmTº YŒßÒ>íû˜}ú *m#5³LùŽ,šÖ­àðJùT¾Â@ó³âµW{0>ÚÁ9“£Òã§™ŠB¯¤ÍÃþÝ ڽ ¦w'*(0Ú”H žJ´à ùÛ¸b7 ÊAy¸Èm,'p¡£ƒÚ¤ìª6Îú§¾N ³cØûõ}HŸ[™Ð»´£*3³nÞï”—i€¦—[:@ɧÁï»·¤!0©%ƒÖ”ëb$tšûhSZCä£é”Éè䯧>*9€Ëäoýb¡zÜ-ÑÃøˆôt¸ø]‡}½dAò)„j7*Úö¡¤kö¦IX}‘²+ýh½};ÙËÂ8–Óoa"m+Q›GÌg´zx1¦È—7²¨^£7­ ¸g´Ñ)}ýSCÐÌÄPÔ3iÛ°v‰Dõ~ªäML rM&¶Ôû4³®ÝsH§ žIpüóÄ2͘žÄ=ïÇûz2È ƒ,ÉMˆ°ÌXîý¯IZ[™«¼v Í{Ÿ·Æ@«„aY™çæ}-üê·œîÏ.ö@® ÌÅ `MGWt#ê­"FÂÓW6Öh}€vè¬öOZ;ÞÁF¡NÅ_)PjæÒrt1GÀÉçÎ|ZòY*t>òÄ.jØ¿÷%?pØ×yAd¥¨è{çZR¥† Ïò±´Ní¤Ÿœ›°í$‚Ù¾æìöÎä¢ny>#ÐÎdö/¡ÛžÖÔ³4Ó±”íÎNCh¸ê[Žgöûš2È ƒÜk¹x ·=ayN¯ÂDêÁÛœÖèzŠñ«WßO6[£`á#˲­)ÖIˆ–A«`’¦¤Pš%å?¢ƒyÆGDáo\–ŽNƒ„׿wWÊ褯õd#y?F¨wÄ ŒŽ4?'S´˜?1=´Þ[n?1È ƒ òUÀ–ñ£Ã[VU ùtNû¾ › ÖAðZT¦ÆC#X6(QŒNãÛh#yÿÉ?#˜±ÞMaÿÁêóQz\…>=™¦ÌK¡†㕉ê!¦Á ½ ©&㾃›NLû:2È ƒÜgù(©@7²ßéSëoA”·ÒBµèK?§Ñ€FÛ·4P8ÓB:Ù†¿F7a G&7­(ûµÄüiSÒ·™‹W2ˆ¥X—×å†ä 6.Úgµ+QC;—uðéÌN‹òÇu•¾m-5ņŽÐ@µÃ³äz>rëÞa_ÃAdû-7Ò –×É\Vù[üߊ.ÓuuZؼ÷™‚åÚ )iä 0”eí"€EeÂØÉÀ÷<“~ÿQàŸk ·yE—ôÍÇb@<þùLcë )_°&Üÿvž¼ý„ñ*j¦²\¿Åf§¸æ'þ”÷}z÷°¯Ý ƒ 2È–OŸGç‘÷{üÀ2 Ô¶Ž¶…`ÊÓésüsóyMãÚ¾ž*¶Q|Þ’F:eZ1ùh¹í³öý×ס‘uò‘|Æç©‚w;õûÙJ`\êö™Éóý»àì§¥L¥Ü†Ðô”AdG‰h_ÅßÕCWßFªôûßTٯћ¶Ó ÎiO¡¢ClòEG¢1]Zz´ž³°ÜòA“±õ¾wec(óåA1£Ô§?ÔR1¬Ûð³®´ €bã‘R%ð)¾öß}’wß8àþƒ 2È£Gþ x*Ë…^ ÙØ¡ªð}oëÍ·,cÿÚ+ȶ£¶Mélu±F3 _ª$8HÏ›}ºîœZñ«a²1L¶»hdˆKhÊ)×ÅÓo›d&À¦À=Zàré:Wn¤g F¾éõÁûËS‡}­dA.¸|‚ có¨(cÇRBûÑ*õšeÏ^•|ßègm{i;C _šM¦ýÿÕÁw¯3yõyhd ;Hs6oÊ´P¨„Õ“$d{õS¬ClùÖó~ëÏn?ìk4È ƒ ò ÉGè"z6iÛogÇ ÿت_kú9;K@Er(ghm”ŽÀ|ec¦á[Þ ‚×Êà|œ°ÿ”(ŽK°¶€ÈÇRÙ›a’uË õ øþƒ 2È£_le®Ž××Êæ±¿MôªÊî·‹¶FB·a!&…•lï¡|O(É´š ¼3>ÒmÝç©yÛ,±uŒâ>8kuÝ@²Iªæ­º?Ù8ÁB)*oA¹%Fd÷f^ù3Ư¼ç¶Ã¾.ƒ 2È º|©V6†)Œ£œ;ðŶ†°lÍhÛ;tƉ¾ÑéÀžù˜ëÇEÑû¬óð§'÷ßÁ,yê'ÒÙ¼R”ûúei‚vÆü¹î·ö5dAyÈäã,{ã}ìßV÷! è˜A:[X׋f¹eÙ庿0M £4†±XOоe¯ÎhK*z›9¬“±.Ž?iàËh;õüOŠ? 4J-ŸóÔ"+`ïöïüӽþƒ 2È ‡&Šá×f™FZ£«Ã]l‡Ð†å†qv(¼;#ú0ö À¼‚ý™ÀELÌžV·¸dKf§D‰+-´:›’»#X¿H”}¹)ÛPO?Ôݰl,0R[qöÔ]üÈþ?÷Ç'ûü2È ƒ<äò):Zæ(ýi?m ¡ÉÛŒcçÃrgQUîšÖµ3ìlaìø˜Œr™¾Õ$¦j–#ÔâùÜ-×>ý.vµÔs©äÍGÝøHUüÍ\è¡£M‰Ú†ÿû÷?ÎϼcÀýdÇ®|‚N‘Ûª_}­”MëÑgt#ó‡yÔõ – É4‘,Iá‰K±A“4|=F1Î ¼ÛÔÎ9È{Ú·ß§÷íXG­^*òžBA¾€¶âÎ'¸íÄý 2È ƒL锽F¶Jº\6{³…b–E46ëêŸm§Ûô¿Aá`còu}ú‹uvœ—ÆnMêå“¥Þ?¡I³ø‘<†* ~%O?ïþŠ51"Í”Ûo»™Ÿ|ó‡¹öCâwAD£Åû­²WcàÍ{ Ú¨B·l!}T(ÈŽ’t+¶)Þ>Há—¶rh+IÔkâõ7 ÷¯¤R¸ÚíÆ<:RŸŸBUriW¾€ø­wßÈþàÆÃ>çƒ 2È ù8Ë|~;'º*`‹ág½eÁ|^aoktJXN=fA”úh3µ8½ÜhÇùäÁïKbB--²‘Dù¤ÃþcL Þ¼@@õ7Ý~‚~úôaŸëǤô‹E2m\½¾½‘Ú϶ñ‡P<âwôå|ßÃ~®ß«?›õ³l¢Û–ƒ`VÎÜùážÎñC!ýÖRì÷Îz×dÕwönùþëî0ÏÓÃAö –û©§¯ }ÕðÛÎVg½m@—d–|€Ët…ÿyî}ú•91õ4uèôb t¶¯&C“ ¢Rª}NvË|‘C{¼ó7ó³ô©Ã>ÏYQE 7Ã=ýàtÝ–GyÜ_ +Ž;Ü‹\ÕÑâ§÷é’âòr'?G·LŸ[åï÷Î'öºÜWÑ}Yej!~o™ %m”¿{»Ý»kÌçtù…>¾Gš|’åFnÐ1|l{5và‹=wv™½ú³ƒ=kÇ’¯»NÕ~ªüMtÐl”æùÖb t‹Ñö®Ë$)ƒ(ÿú@:‹Ö{|êÖ¼ëÿ½ó°Ïñ¡ˆ;Ïó‡Rî‚éãŠ'±FàB¨žêÎõf­Xž`f\8(½kúÞo_ú?âì>œtUÄöø¼[½íãZFs öXηnˆé|§ó¨ÏNŽÆaÉó\¾jú¬ Û5T×WåßÒ5Ór/…”´PÎä(Ô¥@6yªÞ©óD>%ÞžŸò˜o¤â/DÁû"€µ‰òY¥æp1Uþ>}Ûi~òWßÇ/^ÿÉÃ>¿ ¹¿!¹õ(3×ý˜îË~ïϾ[VUB^HQEmá’þ÷/\‡£fÆ^–ù¬ªä êØ)H{^?ldÏwV‰?{¤a¿÷a\âþñÙïûp¹çKnF®Ë1:öŽmûl[DØ–ýkéYna£ˆ®¯PhDÑ09*Þ;®¾÷ šK ¶e´ ÕNçå;Ÿ’ÃYZÞHŸ…€ª]>ü‰[åoäþÞãöÇqo(ö·v_¡—”ÛaËùŽ×žƒÏ¦Ì,;ŠG<ö6v }D-èu® ›ÇÉ»Ï}ýD×mÛGh¡‰©\&vÆ¥üýïÕ‡sâyÖÓã[ÉÏ’×¹·çë¡’ûé›Ü/Y# ¾÷¯ð2cL“¥\8%O^•(QÞÏÒ:!ÂÄÃ,H[]·Lï/oÑà´š ?àIúµ5@$"pÈgïéûÝWOøÞD‚']«F® "r;p1ËJÜŽ„T…oé¢}'Ç6‹kè ÏC#,žØ¦ŽÛâ½ç#ˆã4¼Å¥a0 ≠¸R¿Ò<‹”¨vÒlà³Y´Ÿ¾ã4¿ö'wöù|ÌÈù”ÿýMv^H¹¯›S%¡Ê¡ŸHÕ׎åddž’³ÞoÈ|N•:ˆGoqÿ6‚OûX_;Øò]´§í*n’[fó,™O]#´\r¿|X>}oß’þ÷ÔõW§ûZ\h±ÑÕ…¾Ï r;ð8–+€a¹—¾†s Û%Ô²„lAXN ’Ü Dõ¾äœO{(:€¨ËãgÅBª¨÷$'0ÚLMâj>uÇþÝÛÖO_.äý¾ŠÞy!<½‡ƒ7¦Š]´M¬êM\x˜š0%OÞùX‰l½s¤ Mø–I±ãR‰}ì šnŸºÝ,Ÿ6\DhC\”¿hİàd;ÈRRTñØ2“õr“Їs“øzïÃê{B+…õ>´‘½Æ øB ›r3yùsxÚº›â¥tÎâ"aÅ:½ž@SK¢¸­dk—Èú'¸ëöÛø÷8ìóø° EÅë‡yöq•1x¤HŸ[o=UúkYÂB{Š,ÁU±câ.5²5ÛóF±*ŽŸ‘Ò]F”©w¢àÁP>sOž9bŒ8ç!’EGŒc”„UÜ1Š‚Ë×É#Q~ß:&cæ ýÏ\DÝf_9?Ðk}˜ì4¬‚9Ç ´,w#×øÉ,'~¡óîm+iû›±°Q4¯¡»Çrbb“6ûu잸–Æ6ÂúqY×Öiš–h£Ú Îe©ßOmÅMwíð£o¿V.Äì|?ú%Žï åñp=nUâö;æN ›‰¥hºîG÷¾cá:ÌÂä œ‡2“ûW×kBçmÕ€ å8çð™£È\Ú†¨Æ;"QåÑÑ1 qa¥u‰ô,·ÂL6*ˆ!˜‰¬Ø|ÇgËç1 ¾ïóÔ :uÍë”2èe¾#Ïudl寘ÈÖcäö;|ûø7|dï°ÏßÃN.gV0N’Øâ£‡³8:¥¬X~nøàIÒ–F®Ãöµ‰ÞÜe¶Rî`”¹´Hæ%pBòÞwx™s *§üˆÄk_ŒäKÂçŽÌÉÁ¹ÄŠQsò$†¸ài i"9G$‹b(ÔÀ5aùºeéø"bTÙ/1Ür¤ÓWšŽs“â÷õz zøá'žÅrWP•óÁCê©ò·L }žÓΤñÛtFUWü¥ÏjWG[ÂôÙ9 ÛŸÓñÍæ;]›HÝ>çìïrÃ_}þU.4æO¯¬ýÞ—ã[µß>Ýϲu”±Ó÷üÕ“W¶ŽÂ6*>YTÕ§ý$/‰`‡sNðx!ÈóÂ;¼#áÍ6cp䈑ˆ@æ$sGtN”½Òc##G3GA‚~R9kåµC "¢(÷¤ÀG öi’Ñ ®ãp·Qr–9dÏåª\Á…¸~}ŒÂáÊiÎ¥ªb×¶ÐÚ÷_{Áêúèf çÌhö j`÷NÈSŸÑ¶$s›9Dó30=#c ‰ùh뇵‹eYŒœ8u†—¼þOûœ=,åBzÿðàxø«ú»ØÊÍ—×écëý‚*›ÄQæMì¼ý±ï¾‹ÅìuÙØ‹,”…Ï=íAtGߌI!g™xë!)zÄ„÷+¾ï¼[@2ιî‡e›Ju)Bð¹K¡¶[JÈÆ(@›»œ‡ߦ*L'³—æmú^úŒË„TÅγ%÷¬‰0O‘@arJmD­Ü¿ÇÜŠåƒ<´ò^àËé  †ŽÒéa2:c¸¢3j T|Z&`eS°_Áz ̺°Éq¡‰žý´xùùH˜B.Oôј†ÁLáÈU°{+õÁY>ð鳇}¾¹Ò÷Ð3×A–¥1òI™Ï(SF=p[5«ÅOÐQ.'ˆW«¾wËÞÅîË„ÕgÞ‘gòçœxÓj02ïh¢L8ŠÑ‰×ä™[Ô3â ÷ò^|_ïR$‘¾k$y^¤äAî“Ù‰‘\£¢0xBƒƒ|Ù6vFÎ!ÔÏ6ÈöH ã<Êrç“uNòÎu‘FY\­ˆ/$†þH&W ±?¾U¼ðv|?™й[ZeˆBV:ã$Ñ+SGZ¦»«ÖšAßy¬‹üD씼“IÚ€§ƒ€‹×Ïg¼w”¥§LÊ?óáèÍîœ#x¹mc:1:T#÷N(šÎ Ÿ¢…ñr.í_¾tD¹ç‰àß ë,࢞V¬Iˆ„¶¥‘àÄóob$k#‹Ô.’ÇH“.Rðàj‰(BŒÂÄn#¥ï”nS?ÆØýxs’aUʨF\é:MC]cðÙ”ÿ<ôòàoÓµ†PE¯’&³t5tø¿¶”pH} @>Û…b$Üf ’ªãdgd@¼Ï,´- ICqò˜0ß#„–Oß==ìóô¨‘UÉ^̲Ņ6̪×p.|˼ú<)ÅäkÃÆÑ¾7Á(r蒱ΠG^a¢~¢J½k‹÷|ÁØY4¢MÊ6÷N ªrG‘y²ÄÄQÞþ®q®cøC²-Qô‘‘ó4tF¬p‚ëã$j1’9GôÁÇ(R–-¼ÿÌ9ù:Ç(Fš~:±mŒøh\„&¤©Ã9ñך6³°ˆ4æU H_~‘ ެºþ!g[GP%£©å™ceAÙƒuòÐÈ>¯®‘À˜åD%G¨Ò×ßbIG˜ÐÈ>o[ð ´ „qäóü:é×x&Ni¤ã,A;Õ¾(þrMŒÁÁÔMäª×üáaŸ£G•œ/¡zOá¹…e´å2k”¡b7‹B(:<D¡«·Óë^,˜;të(ƒÅîÛ²êØí¯ÿÅÖÑmå¾KÚf™£ÌNOÃ|ÊÙƒú°ÏÏ£Fî Û§ z£ü5ÙZe¬=lTùk³·Ü({è šE‰‚tPÎxò*–Цí‘åFs8â{,3Ot½õ3Yt(~/7qÂñ'¹‚Ì{2¥qÚïì=¹s‰>IŠy„‚hºÛMœÀ:Þ{²ôecŠ¢sŒ£Ÿg$£@A)Zh‚|¯à}ªˆÔÁ“‡ò ‘„׺®]—Kl$ç#±QÊ©|‘²Á.Õh¤gû¿ëµ·UžM‘>8©)x JÚæìvÅ8¢‰Þ>®ßké½yz±<ÌBGÈ«™„Ì“ Y)´PWRì`–WÇ€ñ1;·H ÀøH7~ÿNÊW}ø°ÏÍ£J¬‚Œ½eŸí3#/оŠ_§ƒaU‚I», ‚Y³,K‰_eª8:ê¤s)ÑâÂëö‰e‰_¯ø9‚éJ¿4°÷ïÉðd^ðþ"…+ãÜSæ9#ï ÞQ$è&÷O¤Àá2ñäCŒ oÈB;DÁé³tÜ—gžÊ{œ“~=¸”Xv´Èg|–%~}ÂðÓ6 n[F™'¶Ašm)$®m!F\ô´š¦eäÀùHÞšm+|Š’2’K‘ÈAÎgá NÊÐQgÕð·&¬}†²¬»N1÷'p½ÇUïé1 òÐɾ‡Ž¤ÊÞ›ç-FºÜ€Õ#·tr¯AUÁhuêòÃ,÷€bN}T¶´6êÆ>†¦ûä‚Ê*¯ëžD=nŸ¼|H½kÌ/µ°Jžä©#;Re¿0IÁgÞ-`ÛÚÞL™PqQƒóºùœ&mÕøÄÈш"sIá§JÛ,A7¥wdÞ§$¬g­È!ó8çȨ)óx2œàõ.Q„òÄjÚvÑ6W½iï=G½g'aþæÄ”–ïìñ‰ý‚¸Óù‚MŒ”>#„–Ö·àU(b¤j[9ÆØŽ¡¦f´Bà ‘ÆAÞBë5± õÜS¥›‹nQlæÓº9P‡9y̳µÅ”PÆÖŠœÐ}¹?Ûò zè¥D®±&tÕ@ékõú+º3Ç(Êþ`W°ÿ¶•|@^ˆW²¾•Z)²3¦sXŸÃ&IùßûÿíÖäÞÉù¾ç«àG¾ër©4NëÕ«P˜F¾“jßLr…wä>P{*æ Z*ãÀµ¸˜h¼(÷*&£»; n!µ†zµX#J¤@ô\½Þ yJÓ¦kó@"¸âµ;ϲÁ <¸ò€øäsäw¸A§ô§tðÖŒé®MMŠÚ4·%$Nr Påò;j1õÉ®ÓC¨¤à—éI¹ÓûT<:Åb¯ç{ß>_Œ4,m‡lÛÛl¹€qRËßaë.m@<üÎøùŽ/‹Ë Ìb‚P¼ï”»©hž— â‘݈wœ'Œ?Ï<—àØÍ¼`ûÞ‘ç…wlfÛÞS9Çä†gŽ: Sh2IIÝÌÑV ›u fï"UjuUŽ#“ÀþÙ–&ré–§®—øˆË26cÎÚfFÛ@QzšPÐT5'fpŸq„¨}F b`åÑ{Ï®oi²@aÔ4Œ½I£j[rç¨C ‰ŽÜG¿Œ8ZEß6PŽ?­%l=í(‡j&¹‚¶ñÅ,2 îÿ<ìÓðèþç³õIïa•> 7¡óîí,ڎ‚>éܹO®ž{Rôêý+#F±yŸà‰T|Û añ]1•¶bÈéPQ0Ê3\âÙ;çÞïç¥s”ÞCæÙJTÌ,˸2Ë)½g<öÄ)Ç5Ó½–¦ŠLÖUE™îG²Â±±íÙßiqDÊqàÈÅžºsödCQ¶Ôs1gv¡ ²uÜÑ6W~î:·~ÂQ–ûL÷óý Ÿ;FcÏ=ùh‹º.9¨+ÚÙ #eŒ´±%oê¸;FöÚšW7‰‘YÓò©¦a"MÓR…@$R‡ÈA„ã:{a<ù( ?hEqˆ=4’ô®ÚHQz…®Á\¤ªxÚÊ`¸ï‘À=ÕœOáy‚_þ ‚Ÿ"ÀŒ2þì˜R UHNî<ÌXô3ù17•,+F¢ücƒ0?Hù= m %6|¾§þïz¹ú<}m(¦NeñØV YâÑ;UìÖÉ’Òw©Zô©Z²(™®£|üT+ýp4wàIÖ\“½À(aëÒ[Gfœy ï)²Œ<Á?8žy&^Ø;#ïØÈrG– ï%„–¼ðT³–жdY¤ÜŒÌYæ9»¡j8~4cçl‰söö"Åœ9Ñ2¯*&GÛf\|¹§šyFy¤já®»[2X¿sav©g-³:r|Μ ¬¯C]a4ÉÙ,=óƒšã›ŽÙlÄA“SFG“EκœKql¶ >kĸµ-E戙ç¶d ʦ%ÄÈ^˜Ð0j¡ŠQØ[Zu#…s2èÛKíA  rÇÄÔ£¨ Ú¦Zò¡íX`Á [èþ´‘°Ñè=A”î>7È…;jŽKÇH*üSÁ¢»m™^G`È«ypAJÜé`‹ZI=—çY–*4G²Þ4Aþó¡æë‚Ë=1~l|HÉßõµWÜ?bàÝžV–&%î2·¨´%j1`gNW…¯†$÷ŸÂMÎJ}@L‘…xñ¥—$,$*Ý\eJºfv_äã<§ðŽ,ËØô—ä9¡mpUEæÄ±Í(Öœ@-ÓÀîÙÈNÝp¤ˆ)‚m¹øŠ‚¶iq>R•c\_äňñzE °¿ÓPŽDGláÔcÀyÇdûB°üÌ'Z&EdóhÆþA #ròNȲ–Ó'`óH ([Nb¯Ý³‘&LÙÞŽ87Â5ËÈ#Ói –aØiŒKÖê–Â{ö½'„À†o™;h|óäÄËW#Ú ”61~‚wTm\Ôè5kÛD ž2FQF}¸ån«÷% ÐÜF|÷å^¼ÿOÕSH+äÕØî´uúÓ\€ûó§óÊäé;ŸÆý–RPŽåu“¨¡£”Èr¡‹nÿÚaýG†Ü,T1ûU°mÛP¦dŸpéŒZ­¨Õ¿ÒTÌv‰[ñÜó´³E4`ð}—v¤Q®ëœét»n¼HùÄÔÑ"1ŸÖ/Å’,G…sLRgN2áì¹$b½s|N^°½5"ó¶­Ù?[QÍj²Tòš—ŽýƒÈƆgê(óÈxä™NGŽGöwg"ÛáÔŸÙ©ÉbËã/ôÐÓw92ßrä’wÝ<“uO^xp9³}¨æ‘Z¶BpìŸm­yfžñ$2š8ò"pÛMÒüÍk(Æeå9„Pà\K9Ž”£‚jîðÅ>[ãàì.ÎE¦³š]ïq1²×4œnZN7-uÌÛ õ‰RÒĽŒAM´!Ò¶:ö_·ReÜ&K‚<¯ê@ÝD¦AZPÏ¢ÐB÷Ûûf,Ù !T÷Kcpáå蔞³¿¹åS-EáÈËHh=wÝ<[Ô¾Üu Æ4\tyd²ž³¾9ØuÜv§0$6¶ ­#£Q`mËQ”p÷í#òì€<ìO¡ªaV9bØØôäE DI*‡6—‘v¾G¹±ÏåOZçÌÉ’¼lÈæ-XóyÞš†i¸¨i9#Ebù˜-¦‡5m NF4óQÂy—n5è“hÉeŽ,@™ ¢ZÐÌÏPÍ{gp‘½3N<~—›–*F²d¡aê³ý†g‚ŠG×#;gYî™î6„¶e7£©!Ì(GPW,z*ÏÖ82kàìN`\ˆ÷½¾å`9y»ãØñ@^L÷fÔÓ9›ÇrÖÇþtPG.nöë9YÛò¤¶!„À¬ Ô©ž¡‘ºi™g‘Qh™µ¶ äé½ÊŠ˜Æ@LK¼Ï<8B&œïH7x;‡³Íƒ;‰kH?4ò¤0LõL@ ¼‰)5¸›–ôÈÁ®0~öψG¤QtQÖ?Y7´Ð¡îë>‰ZÜóýVyýÊâÉ]š…«l§ìå ^MôzçɲäÚh@»`æ‰ò¹ølÖ±v ¹Ï¤ÈD-åãgeæÉMâv’y²,£È2¼oÜ…œÐ88ǺsŒ¬•9MµÏí·î1.EÙ]ChÊQIZö[ 9³g°¹•¢#ÇÚÄãòȉÛçRÌuÌZÏÎ^¤ª"k›žq#<»udV|ŒŒÇQ §‘­1T•£œH$»{&âBË4ÀŠï ›/Òt¬"½§ýò ïÈsQîEf)›¢Ü¾6 à“úì _&…î>?Î3Ê<#ËÄóå£"gTä¬å¹´g( ʼ ÌG¬%yÉZ^°á=yÁºÏ¸ò’’zï€,›³y̳±æ¯·œ¹{ÎÞÙ†zˆ¡eïl˨„ƒ9L|äÊ'—|æÖ†’HÝ:*2v¦y ǶT³Œ¼ „*0ŸŠ‚ËsÏh˜Œaûmdkݳ»+ ˜‹.uìî8ˆ{û;ó†Ð´ŒÚ–㎢†ºŠl¬Áh-£®"mhë@]GfM$ê$0Ãtšº%/#ÞG¦ûR)'­¤ÓyÀņénÃÎ©š¢¬™ïïÐ̧äYàØÚ˜Ø:ö²œ,/ȳ\ ༗Ù©q]î.RÝÀ(óRŒT7©kœÒIcŒ‹YavŠÎ/ £±êþÕü”ëê̆¯,«  UüY¢sê ô¥b.×Ñ= ýÑ$,÷ÍÒ¥_¥wŽ<±z”ƹ(øJF%Óa+^š´åN”ÌH °–Ÿ9Áù /É[að g¿ðežSæŸ1‰‘QÛ°µÙ²f—éÙÀhçî[+ò¬á`¿æìN#𞪠䅓Dfš‡xçÍÛ¥cÖÀñcœxÃ'O¶ÜvKàèÑŠÙÔ1žÀÅ—•”ãŒz˜î—ìÍÛÇâiÇ™@„2z×-ýiC–yÆy¢[ÉaœÙhE˜oé.TÃr¨Z‚ƒí ¯9ÚÖ3;€Ýï=mã}dGÎûæ€HÓ¶6`6‡iÕ’¹Èé“‘Ðx²<°¾™Og¬oMxÂlÄNV²Ó¶ÌÛ*çðmKæZïiC òŽQdddŒà<>j ‰‘"‹‹òì6s´ÁQ8‚*–¡Ç{R¼÷ä¡÷[ŒÛu­­ïÅý?D\TÙ[†þb6Ëí + Ÿ£máøÇô)—Á! ™ØØ†½³ 4È“~%¥í¬é¼_½þþˆD5>yº‹9ºÞ¥œ€P<…z)Ëm K9‡Áú½OÑx—2}+“ÊÜdŠ´,Ë<¥Oüý¢À;Oé3rçgÛY!Þÿ¨¥žpòÖ]Æ“ÀwJ¸èò1GÆp˧ZvêÀØ{.}œçÔ‘y-M“2g2nÙ¯Ö3‹‘ ³ýH^¶d¹“ü²¬m#míØ9UQ¼g4­õ1Îp“†éξ4[›CÝ4ÔMCÞ:Š5Ïú¦@Lõܳ·+…[Çò–z^PŽkÊqNS眉‘¢­˜îyª™cm*¾‹Qê²Â³sª¡éy†ÛŒFpìRÇ·Æ£–Í G]IÏŸÇ8‡¼¨8uÆ3ÝÝa};çs/9»ÛÌê9uwÎ7d¾¡ Yäm ðÝù‚Æ9\D²Vàð„$ ôŽ˜Eš¶kÍÝDÂ*%¬Í=‰vA/>÷½E+ò¸îÿ…;‡CûÿÏ.¡Ú>Zó# {1ü„† -›Î´©[a3—ª¹‰gþåaÍGèCqÔ"Á:.yúê¥ç¾Ëä ÿÏÚñŽ,ó îñi™$wµµC–}–Ö/R@?“'L_:rŠråùÂŒ³ŒQ&Ë&yF‘äyNé2ò,OË Žæ9—mçl¬5ÌvN1Ý›²P‘¥¾ó™°]B[SMáØOQ:ΞŽLÖ#ëŽ#y¦»¶–ÚÍ5Çñ­œQ™ Ìç©Î1Ãh,íd=£n"£q3ó\ýÌu&›G™”3Žl@˜F>²?­¥Åô$'FÇM§"aÙÜÊðD\8U;Ú&êÀd#RŽ!O&›#¦³À>pÉ:ä.c} ÎìÂînK]væ‘K·åÈ3¯<³ŒGŽù œ ìM¥¿ÐÑ‹M•±s60mÚ4ÃØSW —mÏ9>3©=K­µe 1…ó©Ñ^ê©”ç©CªD".ȱ†(ŽœÎi<¥ÒG¾kÿ]ú®®¤pòžöR’¶éÃ5Ò›©{Ý· ; …až¼ø":êç‚ Âr[èEž@#-"È(`m ©YÜŽ¼œÿ 'êõ—¾ó J¿<W»w*,Ý,ÌQ'º îYðÿ9Ù™¶zpÞ¥ ^ñ”Épx'`ä=YîÞIÞ‘‰²Ï}&ÆÂyÊ,g”–m9Ç. œ½ûsj¼k˜Ô”E¤©¡ž29yºaÞ¶{B[@pT!°³ =§ObdËÑc9[ÇGÜyÓœÑZ šy²\Ú5Üq§ðþ·fŽã—eÌöaóˆh¥ƒ]ˆ±e÷ä”j8që>» η̦36Öú:{ñ!²æ=!H@ˆ‘ƒqNZMœ­#'oi(|`³È8r‘ã䉚¬yÇɹç¢qA]I„³‹c-#‚â-™ó̦°ÓŽøÈ¤ˆ8¨g‘³; kãŒQð¸(½Š÷D8yûïOptsD~°ÍéjÎŽ÷ÌC`E–AÓ,ú½„hÚ@Þ¶Ô™'‹yŒÔ)ÏÓ†ÔëÉE¹·R0Ê–•ó¢€+å´²C•¹ŸuÙªit˜íÚG+C paD¾«På¯Ãcó^®^€V‡5¤©…v?)¥±Dõ^¸{Ø_ïÑ!ÊÜQvOò‰zÁl8]£ Ø}–Šº¼ë<{íç£í@=¶ ¥ee²Yˆ2ÎDÑçɤ$°D™$yÈ]ÆV–1öÛk>îr×§÷ØŸ¶dBÛ2Ÿ7ø(ÆÝ ôí‚ý}G>Š„6‚gkâXo`6‹lmFŽæ>kÈGp÷à|dwÖS^ªi™ƒ‹×3¶Žå\tù·ÞxšÝS¦‘YpúÎvNï3?hÙ:Örö¤ j9ØlnzÖsω:péX ’ÓÒ0î’ãžÓ'16sÀgœ¨#YÓ²Q{ŽuL÷ÛŽb䨫–Ó»‘ÒÑt§ul´ò;š¬;NŸÄ6³Œ­Ü3›EBXß‚ýi}PœƒcÇÕ,pËÇkfSÏh¨ïn9~ÙœÍõ#œÚqWÈÚ†yëSÕ·§RHVÓÐxOHÉàºm%é"Eî¨ëä¸ÈÈ$„­^xëqyªXÍ(J¤³ªvÕ„ró·°%< ÿÁ¥~ªØ(@_+⓽~:ë¯M»¢y M3‡_?ìo÷{ã'2cŸº4úÎÃRc°`øÐaµ‹>úÊï'p¥iZÎôíÉ ãgé³ÉPŒ³']6G âÉËgœgx/­—‹,£ÌKÆYÁ(/)²‚£YÆz^°žl¯ybsŠj:c>­)Ë@^´»ÓÀ4D²Š\†ŸÇ6²}4céá_B1vl‰ìEîÜ ŒÔsÇÅW8F㌢ø±š Þç¾ôºè"ÏÁnKhfœ¹[º`Îl®Á±ËàìÉ–ù4à\dïlÄg—AžÃÆ–cwšÑzϬ‘Ž¢ÓÊ1.=»»ÍM¹ÿÏV¢ñJäGtfæ8~$RÏ=»SÏ| ã1l¬{Ö6ŽÍFkrìó™£ ŽË.É8²íÙ›z¦u#­©×6¸ÖQÏöfÆ|æYߊøÌSŒb¢õ™3‘Íí†qÙöcæ*ÔÐ ”GdÛ ˜o”ˆÀ‰Qæ/„¥Å‡àIeî(r),2LP¤³›éXiy‚Š‘,ËcBϧì]ïo #ïžÃ¹:GÅ›Çì…)`•¿þi/ õ*à7ûÛ=BÅ^UþëY׿'K˜+ˆ1PPúÿ½ÿê±4]Ó3±ëuŸ[6V¸ôåv›½ÉæˆÒ4ÙÌÐŽHj0ôôèD Â>›C ЉŽõ$jÀE€"ÙÈîͶ»|¥ »ìg_§ƒ÷[‘YM`†T廒ªó‘µ"c­×<Ï}_÷Q·?êôuZð§÷c_Ž ý‘Ñ£ßYð¥dJ`Dêí«c ÊØêÉÇEßhý ṳ̀$3£F ¥ÉMÆÄdÚ ¤âÉ BG_°ÃÀÐZŠ*â=ìî!DœMhd#"JIæ+A ‚($Åé¹B)د=¶÷ô½ ëRÿ½Ñì7žºÖªJP}Ô ”&ͧæK˜Î Û}d¿‰,NÁ+m`¾ˆ´‡€)¤ÒöÉÓ „â´¤¢¶g\ÑyäM­0!ù›ÍÈ0ª´f·ƒÅRà­ÀG‚¶‰tu¤(R^Ò¡I «³-"‡CpŸ_Fðmàf9;ST•Ä»)¶‡ýÎ¥EÝh®ö‹8¬Á‹í BJmÒ©oÜÐ ,ÎŽ Æ0.þãï^KÌø–n|òA"lŽÏ5)Ócôˆߎø‘ãóYŽ«üQž|îÜqüüþCÿTÿ\ßÚÇ à8p;¾hŽ}þãMÀŒÃ¹£Æ?ñzä…óx8*}ÌC„"H­F¥O‚ó_?"Ô;ÞqȤ5ÿ#FjrmÈLF¡4UVÃÓ¥FІ¼µì¶=O^&fO×zÖµCYÀd¡˜Dv[؉Ì$C ‡}$Ë"m“T1 ´D¥È3Á|“éèI‰po!ZÏj!!’³©í&rØ! ¬VŠb"! ž}\ÑÕg#BD¶MêSœœINO3bH ›i¶ ]d½M‹g#¥‚i¥˜N­Ml¡¶ƒÅL0 ‚"K§ô>HŒ´Cd^yΞHì  ÈqÚÐ4é#¦€¦¹Š4}äõ6pºˆ”S‰šÙ,µ_ƒ ” úª©[²Ž¡k™g’Žî£ßÅ‚éï}RŽ >A:ùkNüÇçÐÑnÆÍ!-øï‚c6¸ô}Þž&ß]d޳©£'ÀÇ·ÿ¾Rÿž_÷¾þ»ëw¿ÆÛEÿøû9.üȘ£4(çíiÿx#8:È2Þ_Ñþ¼õîÐëÌþÐïçÛ¸æ”i›x-jÔ=È7Cßñũƾ¿V©µ“/Ø(F˜H'W!@*E>žbów¤êØïÃX2¤Jj •6BgLµæ|eh¶·ôõ€bbÉ–vïRÓ7–®õ8ë˜UI©²_[^ïy&˜å9Z{NÎ(­ÞIÚ&â$TYw°P‘¶4\\(¤‚Î{BU’ë§¶ƒ`2 A0ÁT íq6òêË@YD®¾Œ ]Äùäz<™ ´ŽÜ¼t¬.j„œ1´ïà ˜."«Lq[ >œ9‚—¸A²Ùz?Í09\¿ôtMÚ"‚¢‚ú}K°§7/BZž}:›óG‘rÀÛÀtâYßL¶Ih†ý½å—10œ£UгÜ0™'pnWyCïi÷k-ö ù#n•N /Ÿèª>F¼Rh 2ÆdcÞÆB1"G¬P8Æ|j«>ÄQAñ"Áê²1&Ä dcš¦ÃJÊÐïlðß-û|/ ýÕÕqmy7 ã-)Ôêo3€c†äñã£aÞ^þ/?ôOô#(%Þöý½}ùgNþéŠ>ž¶èœo#%‰ÛsìëOþâØë?žøÅ1½+™¸Š‘ºiÆ9€½…V”*-öFëo){Œ6”J3Ó'™æÑãˆë¶¬¯{²Üá†Ã¶§(“îÀdçõΤàd©úÀý.$ìÁ£’Ëç»õÀ|e09dy o™M%åD±®2Bi•à„A‰õ?-³e@iØíŸÕ¹$¯UfÀ'ŠgàM›Á¦Óª’Cˆ˜™-Û:ýº6²Ù´XÑZÑÀ¶Ž<>Om—y))Êtžjö‘äRpn€¾‰,§õ>I0› i[ÁæÆ£´åteèꤎºº|@øÈÁ¥[5 Ø&ŒóÀ_úµ ™UØš½%‡É"Bhœµžà":4äÅ Obùð!¤|áÑ/¡EBo‹Ñà—Nrl#¾= 3"ŽÜ¨1îùÛQs¼ë*‡–c»òáÀxTñöðÞíûýÔñ x›¦y«Ò€ú{ðó?;Œyw )oòùCÿ4?‚:öN+ù¶¿Ÿÿw“¹8žôñ‹ÇE{”ò¥1ºtG…L‹æÍ,e2pCÕNßã)_³9¢ŒN*­4F&Ê uFn2f&cY¦Óˆp^Ö0_v¸ÁrØ è,pÿ¦§n=‡N cH¬(!°M$ËÓ2ÉJ÷»ÀîÞ²8Ñ´{¸» L¦)'犡¬–’ù*á™{ “IZg+ÂSïáfí±"ÎòÜÓÕ–Ý:ú÷!pZ)¤O·ŸL ²R¤À{‚V,OŸU\¿( È4œœCYI†Œ1xØîÁr)¹¯%…I-"ëžYKŬ¬ÎR&A½yM:bm ËE!ð|ºƒÍ7{òÌqØ;îöžvHòL³‘¬ð „RÐ5‚‹gÈØo{ÍÞs¿i1"QNç« ïá°ÆXOWTÁÇ”a`¤$SŠÌèu—ÒcÛod8åZ!µ"Ž ?ù` |+PJ<8ÏoGåÙÑ­þ0àNÕø¼÷@ùûðÝ׿þÆl¾M Œ¡ðÇ^û3ïßIÞׯ¢l÷âmËG>¼Àx›®ÅۤᯀÑÕ9.òÇï5~ÃäÖåÁèu<áÁÑ9<öwG©'B IåúasH:ÿL™‡øÅ…ÌŒdZõ4»64h3°_§~c=.ŒiCΟ ®_²Üú€W‘z0™@iÍê\á¬ÄZÁvˆLC¤˜x&RY&ظˆ‚¶L§pØDœso¥$ŽA5¯®]ІŒ–,<_I´Ö„ðÍ!H^5‘Ü{ÎN“’¨m"÷7-JIˆ‘éIêû;§ÈóH>±l{M&6F®·‚Š€@¢³€÷’Ò æót\Ú­¡iR¨vçaµŠ´{¨›H' cØÝ[l„U »z 2¢¤àÍœ.1Z¤Òxç¨7uí‘2IGE ,ŠHs8"JLæ»–Án¸pa±@hM!è”1àbÊ'ÎBxÈ8Ž<éórŒ˜ìC’çúnJœOøY9Ú‚ÓBŸä¤)´&µ™ðñ!|è˜<æIS[èhJ{_ßmÛøÇÓÿ‘ z|S~~LŒywr¯ÞùþÑý“ü*3°GuO±É‡AœúÖÉê¨×?†µpGuàaÏÆ“\&RȇïY[DÂ8d2™¾ô;CàÂ$}® F–Z§¶, ‰bK{h(ŠÛ÷l¯®`=JÑ‚j¦h÷‘Õ£ÈvØõ2@í*H&sA9UÔ;A91Ü;ÉDB&O‹[ÝÃ!D³B`=L§ºl»Ôv±Rá”äÉ*pØ‚̧‘ó§’¯¿ˆ„Á±R@ºŠó¹`R úÖѵw»@¡e™Nºß\ytŒœ]F[ÉÕ­cÛ;*!èI®ãÌhòBãØ[8›K–gŠÝ½g·sh•nÎ >R<“J¢Æ&‰‘§%ë6rßÄØßõfˆ C oƹ@)'Ùj† :$• XŸ~>FYg×8¶»##RH$2Z¦Õ+%bts•Ú?ÙxûËN·­Ò HkÔÑ .dJÛ;‘ÔŠ1 ƒÏç·nÓôgGÐQÐð.âr+ÞaÒ¼¿ |§õ;¼=Ì+ÒM f¾Pÿ~þ./þÝ|ÏÿÕýSüJ':饤träök9Ùä¸PÕ‡a¯±i3HmŸùPæ U@ûåSàÅ®zgé‡À½ Ldd2KYº¹‚¦Iy]ˆ>„`1Ü;I!——›NÒFøð TóœÍm ï=ÖE$†Àlîà) Ôƒ`:‘©ï%wÛ€m;Gƒ{ã¤`Áédžxõ²åüÂ{OÛxŒ ìÚ”HV}(Ð2£ïYnÈ‹Œrš‘ Ãr²@q"Á¥²ÑäW*=Ò[Åx08BÁÇa0o)¢þRDñ-}ÿÑd(ŽðA¾†8žFß<ˆw¾æý&ð«¯üu¾>¾F'0|› xÜñß¿¯?=pVx—§2žœŽ'ÿø6pGŒ G9Æ*>G ¿Õ>ïšmÌØßÏχ9B j7#öáè"Vê-ÎA*…Q¥3ŒØÒï4­µDï(´'/ÓâÕ5©¥ C ŸFl‰Q³<Ì–ðåŸVgŠo®z¢Vd$ UÝ{²C@k…3e%Ù­^~–ÂTNf°ÙEöNP"O/_ò™kIí#‹ Ô»È~3à|@P&õ¹óRR7馠¥`¾p¢hñx ×w‚J‚w‘zï9™N!Ù·»t$Jðb–øþ—‚”de o5ÂznÞD?ëÈ«ŠõΜζóXžJ6›@.›:Ý ”Ì…FŠH/"è#©õ2:²³9¸´¸Ç˜ÚgVJ~ïjÎJG"ƒ[篾ˆœ^8–§†rVP-*Š2cw³¢CPb‡ž.jB I&;¶Ð|Œxï±Á…‰2"d’õóDŒé@„ãÊ0>ñˆˆGµ8‘V1愎*Ô‡çéq°<Œ L=n‚ïU@ßM¿püBÉHW¼5Á[\è»Þ€÷õç¯L¾ù¢áÝ¡ZL½àÄpn0žôäÃÀ9SŠ|üΔf¦ e!Ùß@9Q“@[ ®zÁJÁå9ìî×w´d‘E¾üÚ“™pΟɤ`U*öG‡Ha½h#˜ZAÓG?¶³µ`6h#yyˆ\YJ‰º±Üàyso‘! bäÞNƒÄ*ɼŒ¨LsØ:öî¯R¯;½õ4Rp*#ÁÒú(Y×JÀ!–¢–ipª%›62ÓI3HY…ˆ=’Ñl»ï0ZB`W'²éý]ä.F.µ`:—ÜmÎhD„A‚’8áÉBD©@V(r-ñRc$s">Â(¥à$3Ä1•-#’iÁ~€'+Éd}[bû¢’ÌOûí„{”rœ/%fWñ³i!Wš(ûû+§E^ƒó3Ä´ t€–@’Ð&½W AŒARã³UŠˆcWA¤CŒ‘ñAêÞYä€Þ§›ñüàý&ð+­w±Gбã£þ!üü8øý³j ã•á¿ù¡‚A à̼E>h•l÷[:*[Æ+ÂÜ툊[?Z¼Ué1“7Û:ÇÅÿØë5GµÇx;0Z`75š¼r¦:cª enðÝÄ0°8•DÚDŠJ!Ú@Ó9|'ˆÑ¬§ÊÒÂúHÓùn5L¦šéRá:ˆ‚‹ÓÈbi¨­ÂºôsåJ²˜HªB¡uÎv†Ôr˜)A¥NJNæ‘Õ,r3ÐÚÀn E¿¬"EeȵàP ì8@™Äñþ„ ‘yŒ#ñªRe‘““‘¨b¤È5W6=ÿ§•`oÓ´¾Ê¡Þ vA "štO®rɦ¨àxú 8‰Ma½œ_jŠLjRÚã•BXIÍÒhŠLã&×iø^jÁ¬TX!)‹Œinˆ:þ§ErϦ°[GÖëÞröDá,ÌOOñîï|? D$Ë ™ãM1J)”]ãbïc ä ¤ÛÇñ}ÜÞ® â¡<È”ƒ8ÞlßJ–Ç9ñ·D ß2ñVqd½_ÿµõÏHj ãø8 0Œ>€#òáXÇ_Lþ«úÑÿHJ« ÌÑ™{Lë:ÚïEÂg: %JÎ0¶|’E_>ðYŽ®ÍBIĈtGF¿)˜E¾äzÄ:ÿN¥Á¯RšeV05)”êÙ­=Õ4¢t‘ÚA¹À[K³K¨;(Ê ž|,yù&‰ˆTc¼Hxgès'Ø ¡ƒÕ…fRân*A’ËgŠÃö1!—JRe“KÊ´Ü_”H½è¹£m¢mNf‚¼ˆø! .-ÉW‡q+ȤàÑSÉÉiF[g¸ 9É$Vj¼”<{¤(rwÉHU Aë9iœkÉà$³ ŒIá5§+í"½‹”"©Ê‰€A°œ?VTSIe/>IöáÓ2àœf(rfyÆéÄ€HA;AJ\ ưª Î.r¢7´Þã-l,tMÀh£Àõ—kèZE¿nˆ$#™÷×{¦ËÈÉù ç&(¡GçpŒIýB Ĥß1¡2ÄÈ—’R&-ÿ(LˆB< ‡­Ê¤ýýüãs‘$Ëâ¸ì¿…;ö¢ëÍñó÷7€_}ý'Œ þø¹fÌø›ðóã?ü±çÿî/çýéÿWSÇ!p2|§x-¢õt;¶lÔhÔ’ã€7Üø–u?ÐøK̘`Fr§>žòŠŸQ÷IE¦ 'J£M†QšIVpºÔ?Ðì-Yæñ^ Œæô‰â° Ø®¦=8¤ŽÄ(ÉrÉíµ øˆ1‘jyü‘$8“p>øõû­Æ[Oc1¤R¡R°aܰ‚›.$R©”üåÿA‰í%]ã1yàæ&Ò…Èj•‘Áz8ÆÞ ¬Üõ‚“L}›”*ðá ‰²Áy¤–jEÓD&É‹O4ÓËzˆiZ(6;A"O/Ê(¼è"-v+X.™1ô6AåÖûHÓ¹„ö–§$·]DKIUQ!ØL—ëkØn<û½Ã9xô(gU(&•AJŒÃR%§wž“çŠå<©¼®[>$Ä30Íe¡±.}¬•`{pT™§˜(¼dyäöÊrz))u ÌÒÊMÊ.Ž!aßžìÅC>…™â1ŽÏâ1],Žhˆ£Š)Œ3ñà{›J'H®öðÎ)ó(?=nÇ¿:’Eßׯ¶þßÎ 6ŒÀ_U@ïÖÑ>ü¿ù¡õ¨4°4o1ÿND£J}ýäðåÁ°•ñw ]F¥ÖީՓ¬þlLöÒRŽDOyºi´6dR§Ó­6äYŽ6§UA^DêmO^´öì7é±Ü}³ÁÛ!4Rª4(ÖŠÃ!òÁ¯il-h£f¿Üß$xo%«SEŒ‚j&qmË4/‰`$½”œMY.X·‚™Ö´RR˜ SpŠíÒý4Zøà“d; ’!Â01ƒN?»m“IëRD¢ zÁ³%OƒÇui;X2c™Ì4Ï¢i\RÌJCÛÀÚ§åqie *‹,V‚åÊpsï9©Zjf Ce J¬óÜwý¡“ô­`q–°Ö÷wžÖy*-‰fËœýNðáO Íl¡ÈМ_ D¯ÓMp¸ÁSa$º† i]¤òQr+d¢Šž>Òlïyža;ÇòBgD1úñ9(ÆvxdU<æ4pìÇÔâ7‹£Y4ާÆ#;H"TEBŽûƱ½ã[¥Ñqˆo¡öýð+¯¿IJó¤á¯ã|z¬üC?êQ `eÞº~ï Ó5ú¸øÛ¢/tÙê¡Í“^üíã©ܲㆠä(ñÔä2m¹RLÆ¡¯Ê æUÆl!¸Á|`hû„K^”ê1Y`èB¸`.¡ë£i"FŒÖLŠ@?>þé„ g>”XÇÝ]àätäy…‘ŠÓ¹`ynð>mr‹¥¢‚‹‹‚ë;ØÞûįW*%iEIß{‚ÌrŲPÌ3Aë*†…‚\*)XIˆ†Ï>ï©Oa"E.qAR;I!#&\xî#_)‚YˆdšœÍZ&¢f½õìjG×C¦5óTƒLL 8ÈGDódšúàë«@7D„x!Øx…±‘gŸH®^²\r}yñQjNæ‚®“‹„®dD ÍÌHŽš{A)^*æ¹ 2‚¶SÖ MÊÙ>¤ÃB!˜Ÿ„˜Òql÷D¢1ïÌ+è-DîÈ ã×ûþ2F⃞?=§ÏütÚ¸h¨ñÍùƒ 1¦EÉÅ÷ÀwQÿøû¤ãŠtPcDApÇ]ØÿÑûúÕTœeÇhÇ4ã,À‰ÒÇxÆõ 0.ôJ©|ó1ºQkM®$¥J'}m4åÑê?n¹”dÚ`”!Óš<Ë™+C¡5Êä¬Îg MKW{šƒÇõ“Y/?Ýq{Õ œJt–£LÁà‘ÐnpØ‘<©Q(ÈŠHðžfçÉ øâ³ƒhgpN0¯ ‚“…"FÃn'@2#qVÓ mŒ("Q)Ê,£Ì"¨Œ.@U„Ù\°íYˆ ]6@a’L¶©¯÷bÂo ü$£*À5iNPèÀ’N› eQ¨4¸fT!5ƒ Q²÷’‰Q ¤n"³"òñOeJÅó ñ‚Æz:˜›Àê,gè=uècäñRPÍnLç‚é Ü™¯$y¥À*¬RÔ½`¢#ƒ ¸.¢tääBP”¥ûmjÅçð.ž7à½ÉKÁ|¥©*Mp`®e \!´PNtÞ !mrE9H­°½g{m¹x*†j”ƒ:bÉéKò„Æ·8ÎÀŠ 0R²gcj“1zŽ Â0ö}â8cx7#@Š”Müg=Gÿ÷z9½¯ÿÀú‡¤“ÿ1ØHêwÆÀ»ôO€ÿú‡~´?²’ÀéØŠˆã—QòíÇ2¹‚‡?©~Ĩüï |ÕHõÔ#(?šˆ”¢0YRüŒo™ÒÚ›œe–“e#ËsEðŽno!v˜¬åîåšýºc³i©»ad¥Á͵#¸”_;[´µàò™¢ïÚõ€V‘³gvÐÔ=d1RT¾±è: ê­1äRRƒVŠ!H”,8¹0d…¢ï «Ç&“Lg‘éÉ@Y:”:°¹uTS¸ºuï±^<7Ì–¥ ¶ôC:¹—¥Â8¶Ó& @L—’¶—d™áti8™K†Z(¤šE6בÝe¶‚íA¦| )Þ³>DçØ·‚!Bª‹Lçj¦zƒí“y€˜åó“ŠÆ)Š9¹ˆøN „$/$»­áî.p¸s”Gß:ìøòÆ3¬;¼“T3ÉaïÉ2IQj²Ra2E‘Kš>R˜À0„Qfœ`n>€2Ã&¹|O.¯>óØ>¢´Äv-¹v81M½}F44¼¥‰?¢¡Gihˆ  ¶o¥ž~”}êÈF‘Ôj1Äi•9BEÿ1•¨0Áê÷ÀwRÿˆ´ ý]ÀŸUþ’vô}ýêJ§Ùk;=G§TiWJŒÛd6"±|„R‰¤TKI&Þ…C<#’ ¨ó{ö!-´Ó¬ 4&ù²dÒ&Rï}} ÙEv÷!J2#¨­§‹‰p9 P!Ò8År™³87ÌV3Ö×¼ln¬õ˜\±<˘L*ž®±Ø!’i Ü¸Ôþšçg§ÞGŠjš3]jì ˜ΟU(åm]s÷z`¿ÉÙí%õÆ1™òuC$—à}”Ð@BqùB²<5¼^&FQM5M^Úƒ`6—TUÁòLc²ä"î›1Xæ¼÷. p~©)Tòø‰R²¶‘Ræ¹¢÷Ék÷°ºH¥Ù\{Ú„PÜì$“2'—’ó§—ߤ›‰6§ "J2£hÏÍÆÑ;ˆºÑ‘²Jn+!#åbÔ©ÇŸï#›Ö%¦”(“fEë6âÚ” cjw…¨˜ÌsòBÑÖ¼è1ÙéÚA0ÀbHpÂQÝCLÇÃã Æ^>o‡¾ñwðÑáÎ;-#øöIÿm·! ”ƒàÃû à;«¿Ï·yoê·áçÇùcÞo¿êRÀeùnfïØÿW Ê–KAnÔØïOšõ㢞éÔÎIâ· Ÿ#êÙŒH)%ɶ%F¸[†Ö†Ü “Q)Õ,GHEðõ¦!/Í~ÀûÀéeNô18úÞ%)jŒÌçNjʼàòyÆì¬`²t‡ W/{j.²8+˜,J}Prûê@;D†„ÒI 5óL)r:“,Ï%YiP:-nùdŠ‚n¿C™,rBÐ eéØnzâ¨trmàä<çäñ„ímêcç¹fqª1yN¬&WH¥™d¼^§vÚl®9}Z2]f˜BPL$¶,…‘´}DHɲJ ·à%Þ¦vH¦$Ÿ<Íi½aR .WŠ}§h|`– ¶[EtÅ™ ç‚‹g:ÓIo?ž| )'ÎåU@JGmS£Ø!RkE&FÐwû#S"ENN<]-úˆwiaþ𓌦NŒ§ÿ˜RйÉ(³‚Âh„°ä•aq–¡Œ`ýºEÏÐD¤tÌW©"ÎöÛB$É<—L–«•áéÇ9Þ{\ï±…Ðã‡À¾‰è˜Ž?žÑÖžfëé Q2ˆÄ›ZázRž¼ ]¤k4óUR¬4›5å´Ä{A·ÛÐZvwRy‚·´ØEΣh£yñÅâÑ‚ý­c¶€ÓÇ‚ÍBëH5Õ<JV'°\)²"2t  f{Oˆ(å‘J1 åÎOÒ >/%ó•"/eæÈ¤`º„Õ‰¡ÙCW^|`°}.2 Iô>_)¼7lnB©Zí§åTÓ×–ö©¦‚ÓÓÀÐ)\¬Œ$ èØxtûMÂQ•@g©ÓÒ7Б2•¤³`Ddï’·AkÅt®0™æâùe*ª¹!+sΞdÔ{Ãâ\RN4Í^‰ä"âˆiOü~lÕ<¾iµãblñ£"„ôïÞÖíÆ³¾w(=P‚¾Õt}Úhž}bˆƒáÕÎÓÇH.y‘²zQN2²Â±Yƒ6åtY!°ƒÄäc¥ÌVéE¥#yÉrR ºÚ£t$+áü"ݦLžÚAC€i¦±RR£3f§ÅlÉôÄ`r‰³%}Óã& x›§lä0À0öþCB$ePJ÷’£†? Cà@js¾Û蘇HÍd!¾W8ºÂÆë÷ÀwVÿ7Ò- Yÿ’/ øw[@ïëW_jäýè1@Éñß|Ä®’t1qÔǰ!ßiïŒá.ãÇÇA°†Ñè¥Ñ1>¤ˆÅ01RM$ÅÄpò¨`su–²ჿ,ùô_µèLsþB±¹îQ²ãÍ«€ÑŠÎû‘¨ gOo¾”ÓŒfoé;ÅÕ×-«K`iAÒw‘OoC5ÍhkEQJ&Z1(ÉrúÎ#„ÃÛžv?0;QžT¬¯®Ù¯Y!h‘b’ÉÛ;Ïà.Dö¶g–¥òîÎÓÊ”4­&/#]m(¦é¢;=x§ ÎqóCˆä€}ñðåôlkÁja8{¦ùòßÖ¼zíX-›ƒ&HÉ“J•šÃv s{€ÇÏ5Îiª©áË?(cÑRâ¼'/ËóÀ~hÁê"Òì=ó•@kM½÷ e¶„“Ë@W î^A1œ=•loå4G›)Ê©"x:K½õÌNRLe³É0FPNËs…TY¤o"î.2Ÿ ž|R1 sBÔ3PÎK"gCãˆÁrõeäñÇî®OèEz¤Py#ÖÛ‡v¤Å\A1åÄ´=„‘:KHñšÖ§ÅÆ<½ ³†“‚¡Ý ì X=š „G)A[KbŸZ-Û½§«áƒß0Ø^FÖЪ™!FC$GÁt‘P¦ZrX;´ (cQJÒ7ŽÝ}Úh³2G…Ê41–ˆÀƒ ÔO>©€F4Dˆ?}EŒ©E$ÒÁFˆ4‹Š$³!)‹ŽrÒ4ŸxËš#¦ðyDRLݽG§u?lï†ÞoßEiÒøå£…J¨a9ò€Ž!-Œ=ÿ‡¸F¥¸þúÜs6J>s¥1&¾Ì˜ì•éŒÂœœ”€Æ-YYQT9š]‡žZºmƒÎJN?œq¸·l®Y)¨7{D0¸Òí1,ΖL–§/4ÛkGf>ŒÜ¿éy}ç¨Û¥¿ñ›9:KºòO?ëú@®#ÕÂsØ8ººÇ;Çò|`è<_ýqÇö¾¦üät×ðò— ÞE&Ë‚É\!¤&Ï@#8ïQ!Rxò¡æìEÎòb‚µ.éð0™ ö¸ù¦Ç%áõ–G œ?Ñ\~\Qå ÛÛH{Há0÷W–JÞ¼vÜ÷wp¶G ‡Ýz6!²kÊÃò$RÎ*6[Mg4÷¨à) MßFn^µgyõ™e:ï˜f”‰·¥ëëÀúZrþ¤ÛE ó³Y9Áä’»×’¼ð´ûˆÉ#íò,²z¤Ø¯S˰­áäBÐ69¯®'¨®#O‡]$ϪŠ×@J[s^QN C/™ŸH¤ªÈ§3´„8Á»„ŠvÞ&–‘Hó(5¢IޏˆÔ¿ã J= È©aG(1âÞióˆã ð òcvÀÍðüòz_ÿõ_2F¸2nï†4àÿýC?ÂaàQ•zþGžT å¬T:ýZ£d¢uê±§/F€I"*àùpLýJm#ùÀõÏMFžT™¡œU䓌Ì4C^Mš†rê¹ù¢¡¬Mc!ÐlzBd¹BiÏúfÀYËbÉ ÉМ?—”«Œ~ë(§ó³Ä¨ùÃÝÒ;rB¤Pšj–ñõgU™-«K‰íûM@ÊHŒ»{Çë/Zš&2 ΞDº»Ž‹%ÕLsöbŠT%B¤ÌÞà-*úÑ•‚MšÀ(¨V \ä°Ô»@V*´I Ÿb¢Ñ:Bt¼ùÂÓì@«;Hn^zbTœœ{ê]¤i"1´PtÝ€p–¶¶4OQ në˜Ü­R0/ó¥¤kM2Š5­õtc°ƒ 4M ØÜ¤ðlo}×ñågŽSzZ½´u`¶,öëÐ:ê- ­àâ¹`è$Á†¼at2ו’ógšî "2­4}í9}”ryƒ‹¼úzàpw·=Õ,eSäE†÷ ââô˜iu†Ô†jÚÓ5šh#2ŒJ(¥ô0.Æð0à…ä‘ÐR" 1†‰1ðÆYÃq º9¦‹…wnÇßoßmý] 'IžÕoÃϽe€ÿÝýè~¤¥ËJ>ðþ3™ôrDCå ™1˜Ùç8oÇÖPšÈ·7¥G¾¿NrO“SÕlÂdQPÍ"1ö#ÑfÀö Ûµl®Z‚—— VÛ»´ >þ©¡Ýx6×2#é;AS{êMà°©¹ùbÇP÷\|0Ǭ íý›Ï[N©r\7pñXSï"Z òR°»AN93œ=ÕÔûmíAPTy¡È«a{BÐ8Q ¼Ÿr÷ªãö›ž¼ “€í7=œÏxÉfT™`23Dݱ¹ŠH¥(§ÞIÊ™ Þ‚·‘jîØÞyt.Nñæëˆ*µf¬Äõ"y‘2¬›ÈzçišÀ³O"¿ùÑŒ?ýªgˆ {˜Î›ÛÀ®ÈÂhN&’½M§¬VI&f3ÉÕÏnÛ³ÛzlˆHç9}œx=Ú@×H&ú@q"Ñ"â\äöZqñÄc2AÛÃþàQN. ó•ÆÚ Có•d·‘Éï°÷ܼjÑqX;¼‹4»¢²ÌN2¦O&;c20§d2¤»‰ «%ø§)Äh > dB‚ÎÑJ©„‰âAõã0æ6@jùQYt»0nGIh„ëþ‡~µþ¸ë‘Ô@Pÿé;3€ÈûöÏwU8Ïňvæ!ÈE½óñCËgLÁR£*(±Z¼Ã "¦©Ðʤ÷"™Ãв œ¬ºÝž¾éÉK…29ù¤§¯#]«!z‚gÈ*Lž±»jٯƴìw‘º hz?0t³ ¬N¸þl—BGr;ö ÝÀó’|Ò)3.Ÿ'§¯Éóܾ²ÜoÁÏ~{Îóÿø‚úF±_ß\ÆîÞ³z$ñVq÷Ʋß7ô‡À~í™,sŸçBç©&­=_üÛ?¤~»‚É\C¤ÞÞ¼ ÔkG ‘râ™.%Í.‚ ã)ª”¶V”’ÛA`£ w0•##‡ÆóòUä—_w¸q#„”rR²œgI‚[¦ßgˆ‰èj… ¸È´lÚħÄ(Xo!Zp}šœ%y.ê¡g=JK6[‹Gpy)(&w¯%»½dužQï"E!¨fžÃl?°²ý¥3|ÇSV.î8$1Œí •†Ããm Sšb6cºÌ(§o{bHê“EôLRß4˜Üpút‘ä˜}dº(£p6§šçt‡`B*$)èÄ’àÀ¹ÈþM‡«×Ü¿È+Aˆ77¡OòÒ¬6©4Ï:ewWg#mmÁ ªÙ”‹N(ÊŒ?ý—_òèCÅöN3´Ï~ºÀv¾õ<û8'ÆœfoyúÉ‚Ç?›rÿRÒÕ=ZE†.)n®7žz€Ý¥¾íÐ&¹‘»ŠÂs³ èõÖwfˆä:bò1°ÞHö[ŠR¥0ø. &9\ïÁG¬–äFëÄg’R0)óe·?-q½ânãé\äd®™T€•ÔRá}è[)(µBWÎAQ‚]çô‘äþUÄ9Çaï8ìÓYd}¯6ŸÅB•ip[”ÚÆ0[*†Î¡3·‘“yFVfèÌ£NŽíçiËÄîQ9*‹ ¤ øA¼%²$„Hpï<~»10F*‰ÿ8Òj£ež¤ Œ½ž@Ê@flERÈ:ÐÆ4°ø~ø>êo1* ÿ‘ú¾¾Û: )8Jà„$ŒL?~Á‘ªx¬cäÞ1Î xPùñ#¯EÓÀXiò& ±“EÒÍ'SÉ44-}Æa]aÌžõbq&8^bfšè§é”}Ð:ñcLk‘J±i=‡;Ïfé}`’i²Lòë¿Qò‹3 ´Ç»@Œ’b¶äEÆ7¿¬ !©[b4»ÿôÿºgZ¦óŒÙ2ãú«¤Vyó©ÅŠ<ï0¦buÑòô'9¶ïÙ|˜."C±[ûäž.`‘C;¸$¹zÖמjÚ"… ©%¿lïLSPn"³¥æÑ‚ë—°äe„²J$%Ï_FœxCâ5™4›©2ɬÊÉ Mûµ¤š”[…'ýNi¾þTbB ú@á™ô2Í1拤~Ùo=BDΞ®¾êÉ«ä Èt \*f+M×Jt+¸kRFñìD±X {ÅÙSÅ~£yòÉ &ïèGµdEI15ì׊Éܱ{5Oj²²eFœ¿ t-hF—¸DŠû1"¢ðdB¤"hƒcÊ#90 ÁÙ# "ãdj[!$J„äƒ Çöç[J¨(GCÙûúnë¸ iÃÛ@ø÷ÀwWp. „|ÈNuqœÄª‰£w&Ĥ¼Ñ£ùë!»Uy-#v—4>~<æ1‘—šbbèëŸt–SV=Û›©5íÕ@°5!æôÛ“Sƒ ·ÉžŸWˆ(ÁUgÏfÜ|ÝcLÃóß0ì׎b/9´ŽßüËž»×%Û»†'Áé‹ ÕÌð‹ßy•S”w42Ь#µ‡RâÐsú¨$ž=å7ÿºçî›5ëë“'³ÄËOk‚˜Ìâœ$xA9UX›±Ú ¥"™‚Á{Þ\ œ.}‘2  \S°º””Ó@q6Ò·ð‡ÿ:R)3–瞳ǚ?ú]G9±´Ä„H®Ò頻Q æ¹fQ̦†åy2ÐyëW<7TówùækÁÅI¹Ž•§=€šLyœ©F‰¥´Q²~8{f™Ìs‚W,/ vèé;Á|e1Yञá} ï!ŸD& :«4øW«SÊî BíÓ-LÃRÖWfçÈ«’Øœ~˜á» q­É?ümÔö}š¢ÝnOQVt‡6íJ*r´ä‹\i)QÁ¿uíJ/F$³˜‘%*„Qõ“ 2ˆd|_ßky@ýí1Æÿûúýˆ+ÎËôÈÔHýT Ml”"3zäø§°”LK„VcD¤|þþî‚ £“$4Ë)LÆê‘¦œOh65:ËXœi˜Dbçh¶fO'ôÛ! C_0Ô7_ÀâT’—¥,”»—–¢ÊÁqú8çÑÇÑyî¯O­¢ßZ^üô‚fÛPï$7¯E!É ÍOþRÆWxùMÇýëÀ×:p{çØ<¥Ñd2RÅÉR{óz=pö¸gý*'¸–<õVpöD°¹ LзŽ7·‘ÍÞ²œYNIš}j]Í–’éB%)£W(éûÀaãh÷»û€–žé¶·’é2#¢¹} >Jj'8YJÜ ˜Ì%å49ƒ³Â°¹ê°Í3£YUšG—§2NgĘƒÖg5åL0;É0yFV$ФÓâ\1[hŠRòáï,fšåEDDɦúˆ]–çm"Îìï-}“úÍdùhÎv]0´‚å™ ˜iòR±ßln$׺A)Ëöf`2s„`Rž/¥ –ROJDëÁÔ`õ–þ0 „'¸ž¬xg°#ºä ˆÁýOò©8ަ±2H 1¶Œ$b„ÌE\÷ŽÈ?8Ž“,ôª{¿|×õÿ$¥„©ÿ ~ž“Nžïùÿß])࢔¸ÜŒx‡ wœaq…>²ýGOÀØÿWbÌ ~¸Œhh­ÉD"`*#1Y ¨"Rt« ¥s”ô¸a ¹÷ÌÏNèëËçì×=ÕbŽ6»W¸€ÛÓ pL ÕÐlkêm`y.¹þ²ÅvÁZ†.RÎ&8õ½GHÁâE=ìÖ>á’U’µ>}\°8+™ÎB¤„–ßúK¦yÁ~íX¿´Ü^µEÀä’?='+s‚aðƒÁ·+$•‰œœT‹ iò\!dFsPd&‘ˆè‰DÑ".›CäþÞs¸wÔ‡¤<±¦`‘EΟ¥PšõUÇÕËÀa#ØÞ[j!PÁ£…d2)8¹(’™m•r|•)Ùݧúd.˜Ì1eEßHæ'Š¡ËPç‚Ëÿô·è¯óU / »›È~­i÷’ 4nL$kwÉ'Ð7ï<û] ÝƒÒŠóçÚälkˆ6ÒZO Šªäü™`¿–ܽjO»O¿Ãå…b²ÐÌϦxW2´-a?°øð$É6E‡ð±Ì¡íð."„E'¸Áá†ä‡ˆ1ŒÉuî %ˆ±0¦ŠÉ˜úþÇÓ½}ø»4xë HŸ‡q8ü~ø~ê?tηsÞ×wSÇ8öúS(L„"Zñ õÔðà ã\@ƒ6¼Ç(M¥ ÆdH™¦Ú¦ ‡RiL!°~‡6s¼PJ‘/ †nàìi‰05“¹bþÈÒ­W_*úò*2;Oж ê»W|õÇ->Д瑛ÙF³Ðó_3TË ÏtÎî¶así õx§8=-ÐuD8Çù£ŒÉ¢àÑ&\èѲ@†G;¤6¼ùbÏéeê_þf†ì{n_yÎ> ¨|ÎÍ/ :ëùø¬AJC½“Y–ç%Ó…àþÊ’åŽà5J§¤­Ë•¢Þn¯ÞzºÖC®h¬çùcI½<{!èÛ ÛDoÑF £Gˆ@Yçw­`P © ]«i;ÉécI1)qN¡´Cg‹KMVT4OWkšF’å{¼K1‹ýÿgO/ùæONEdqž| k4çÝ`­$Áò"âØ>µ±ö=”Spƒ#ŸTä"rç¨ Óœžâ}ŽwÅ$pý•Ãdjfhv ¥£­Õ4,•Š 2f IÛ¼,ækŸ)& ˜Ì%Rin¾˜¯Àä)!ËÎZ¾zii¤ä$Wœ?ÎÈKÍÙ£”Ó;Y$ÀšÉsªE†™D› DI{Hng¡W/#“™¡:‡Â8„gRz^üÕ9™ÖT³À~uLy“L—]0" 4œ=–´‡ÔÏ·Îãld2íÙ|Õ±~ÙsrÐ:§Ù;BÌ©¦žr6eöø%rúúÀd˜ŸOhw ¼Åp÷ù>©rºŽüƒÇèH†^':¬OÐ*)ÕˆŒNIðad:Á[€\ R¾€ a<é¿5†ù~T ÁoÚ÷›À÷Q Pÿù8ˆÀûC?¢qÍÓêHgŒœô1òQÑb”J‰3šl”R(!GÊg–ÚA*mFg&ãò±¡\̱GJKpž¡— œLÙ|öUЬ*ÌÓOp7kºƒ'ØÝ¥Ó©” UŠCÔ™¤¯küв¾j˜Ì"Å$ãOÿx˺³h˜Í¡š•4‹‘à5³U1Òì:ì‹SÇå‹)}mDÊ'OP}Oþk?#÷=Ê´¼ú㈑-:ìn[ç92Dš=ÌO;v÷Ûy†ÆñÁÏ"«Ÿ]Re5×_´)¬w( óÉü4G›À¾¼ð<ý­ §—',žx®> xïé»Èù¥Dg@”Ü|Ø\[ž|¢©†jžŒU«G9³eÆýVQÅÈbaÐ&gºìîrÊY‰Šr–±ß(v·ßÖo:ö·«GiH½¿ØìÓIŽs†v=Œ#ûŒ®(c°§©5ûµÂBC^Áê"rëÁê62 bd%ˆ ‘"rÿKid¥(=Ó3A^hf'P.N A1Ô?lG» (™?žòæ—žj^SNC'h÷=ìé‡TЬœENŒ•ˆ¨“éK\8ïñÎ"bH^€c»GŒzÿbò)£Ä„>²‚Ðìî¯.ž—ÜÖRß·LÊ–~gùôÿ³ey9aúÑ„íWõÎóÅ4Ü|ãØÞö|õY`·wìö ñù;^þÁšOÿ°a·õ¸6ÐuŠõÕÀþ®aõXÑ5$UÌY„É5Û× y%ˆ.Ò5–r"8lK'ŽJ”Ù"ró%x‡ÒÛy"9ËYIžÁt¡ÉKÉ5§O&ÌÏf¬Wt ä¥bz2eè·/;lÀ7”KV œÁäÛnÙÝ54û–¾îP™ÀÉì7/Èc`s5`çd‘NÐõ.âmbøl{¨­cX[gaT@å×§€—™a:•Kæ–4÷-³ç+²bŠm-/ÿxÃäl;àl$/=кàöëšjå˜, ºvÁᾡ˜ªùS”(3 :ˆÖ%-¿·t¶Æâ˜$–˜AÖ;úqÂ{œ7ˆF‡°`áýð}Õ?gÜðÿø¡ͼ$ðlªÈÒ”÷m0üè–ïÐ@•#$F'²§9@Fgh¥ÆHÈtò7B‘C^äÌOïÞÙ—8]U” ¹ ]{š½E(“¸ôçKÚ¯^qóõ=û»ÄžéŠ10àúŽ¡Ùs÷ªá° \]5t{Ǿ…b¹T\·ßyúg:…àW_µì7-O5íÞrØ¥>úakZw7æ+.<2sdÊPTš|.¸ÿ²&+$ÏRRo‡ÚáÇñj!ÐFâ:Apv*™Ls\ÐÞZÖÇáf@PFòòSOýf4ÌN2î^ŠJÑ[Ã|!ñN¢³ˆ6Ëó9BÌN$sÿºå°qíÈKX](T„̜ո\”dž~¢ñƒ¢š(¼‹ô­'H ‚£˜hLivðê•c{í©¦ðì'®ÏY¬ Ng ›\Χ<úIŽÑbÇæÆ¦ÀoXž/Èš²šr¸ßSÍ3[xýyO¿[£iÙÝ4|ù¶7§ä˜:æPZâ;Íú:°ß;ð7ª¹"xÏd©Ø] Ö×)ƒùî`2 ,N!hŠIJ kš'ÏA ÅÐîZØ]{ª*pöT°xZ1™Óf™.3ŠyÎîα»m!¦œe%f+I$'+"}kèO>ÍX_N.%ÞkbT”‹å Õ“3BðÎâ‡í-Þ 8p. Îb”‚òÐÚq‚´9„øÀJ½ÿ€?O3€1&ÀËúýð}•6?ô#ø R0Ðæˆ­Ž­pd£NyGË|a 8n©2$"m™¢šÊy…=ùTÑ<¡ nƒê®?m±ÝSÎÁpýHËË3¤Ñ,/3\×åŽû×÷lov4»öà8x½G Á´H‹ýãLç†_þ""pôÄèñ6²; ìvª4\>7ï¸ý:Зš}ƒ HŠ¡,CØÿþ§¨ÌP>ýˆåùg¼ú´'FC½÷Tw0YääV!E"cJ±¼P }d²Pø]r›"2ž“sâo4}€f§h†Ç•E™’Íïß1¹ŒhsàÿiOsC>2? èLðúÓŽçÿQÎÐhcxõ™„xGWGªª ;ä´‡Ò×{>ûÅ€$Î9b„¡•¬N}#èºÈÐ;«@pšÍevY¿‘œ>Ö)>SJÀ#TSCV)¦öA¨w ¢Cßoð¾çì×gÏ–H•ü#:Ó(™ÌóUà°-Ð&â]B3ô’ÕcØÝ M.*æÏ = Å =¹A™ŠÃÆüð"1¦y•Î x¤Ög‘!¥D{‹’(ÍŽÇøQ!¥Š¥8Éw ðïë{(õ·ÇÀûÀw[àñL%öÿøBPcÛGH1¶u’é«<Ã(ùü^ŒjŸLi2m0JcÆÏ'óœùÙœr–ä=QÏ êâöþšû×5³úÛ¶ëØÞý¤$+R6xÑâÚž¡ihë;8º£q‘JÁ¶ „(0QsóÚSUŠzï9´é¿<dìw޲x‘Ú“ežfÙÝ%÷k{Hð¹¾´{(*X_ ®¿Ø}~Ïå9}pƒÄZÏd±½ä¯üƒSNV {”Ɉ”´µ‚Yo,y¡˜VšÙJrÿF0t`{Édb(3) óUBBŽ”`{ÁöÆ‚ˆ\½Nf1¥%]—PËsÃdQbkÉdõˆÝÕ å,#øŸüöŒÉ¼Dª »{ÇagÑ*RMÁ¥9NßKk‡Tœ@éî2]H² bÈÉ ÁÐ+dªÄ»HŒ¯ÞDn¶Žýmz\‡5D y¡að<~,¸ü[ÍýG½µ4wžbš±¿oèëžj9{6¡œô­¦Ý§¬fSDºF0[)ì¹þ²%¸Žé2¹É‡½§xv†ôÝ8ȡ˰ý7@p–¾óô¶KÊžñÞÇËãm $Ž !zð>Es†ã `„Á|ó¾ô½•ú;£ èýðÝ–æm HIñð^ A1Áèñý1!L)9¼'Ø›Ö% 0Y–ctF^fL–%- ¶e×S”=}“‚Ô³EÕŠúë¯ÚHð’ë/†v`wï‘ÒS-¾ëÙ^uhã8Ü·xëúÈË/k9 í¨Že.YÌ'LçŠú¨fžf|ð¡¡œVtµC+ÏvùâUÃĤ…|è!X„4X ÞEœh£(g0ôŽzYaQ*2 †“3‰`ºÈ˜”7t4{M1­ÐÅ”Ã\ïQÊRÓøŒÐIœÒ„ )§ÅT3t"-Ö:Ãä“EvëŒÝ «}ÕD°8St óé¶¶ß–ç² Ë´š M`þØ’Oçh9e}ÕÑ"Ñ&ÙhÓz¢ ©ý£4½¸ 8YIæ§Οe)±mL¹ÁͲ‚(8{ªY_ –z3 B ø@ÛCè=‡}ÇnÓâƒ(ªÏ»¹Mþ€é<⺆"}#¹ùÆ£äŽý}ÃúõžùÊÓµ’zëék8y AÒ×o“—dw¯ˆÑ¢\ Æa.>ÁÝl q”Sšm—Z:ƒÃÙÇØþOð^¼w#Cð„˜þbR …€adY1Þv“ìýðý•Vþïñ¾þ=*r Ç~{Í=jرõ“¿ƒÓMÄäfM/Ÿ,øQá¥49Y¦Z¢ÒPNçÐÕ’b"0…@(‰(OðV‘ ÿ\Î E5!DÍÉ…çpÝ1Yf¨,Ãvмl¹ùÚs÷º¡ó‘½O'´’D]V‘ó§ÐÖ‚“3ía5W¬¯;^ü†àÐ(Œ¢\¿‰(PN/S®mQfìºÈ£sÁt!PZ“åGz¥GjÃa3ðèEÀ}zE>¯èÞ¤€rSäèLázÏîN²8ÍÉJÃ9Ð „”ÊÕu‘,s¬˜rBW§T2¥RyLå¬Ä ž¾‰,ÎÒ¼£¾òl̵ãê"Ÿ´œÊÈö¼(JI¿µ@G×D^ü”˜qû*gsÕp»¶@äü4cõxÁýËvðiÓ‘å¥û¤ë$Ë™f·–Ô{ËÐFlH\G’¡¬÷‰¯o…¤“)¸}_ fO5Sb‡ÈÐY>ûý{îw=Ä@Áh]RuB b š ¤H%¸ßêÖRå?H{Ïé…ÁKE½ÐFRdŠÍ^°˜Qb¤b¶ŒÄh°½b²4©]37ä…%+ ÞvLOf ¡wHZ H„Ô©Øß'¥‘6 2@ tF^¼(á¹üÐðø§§¬_K„2)â2@ôÆ€É ˆ!§Ÿ”ÄA±Û§Þ¶tvÌqnè[Ö»»¤jZ=Íh÷××Ü~ÓÓ·-‹ ¸üµ)±3„¡gq*¸øhÊÐzʉcrVQoY±ßh”‚rZ1 „¢íCp‘æ>Õ4m¶‘±‡"y h¸†N&Æÿ4I/ë}Àä¡ë!8f'Ð5i±®w“Eêmz…¨ˆ˜ÔŠ;8lïÈKOp–Ã& T…ÊÙ¯ÿ rSà÷ õ¦%XKß:¢‰|bù!ÁƒÇ—ÞÇtмDžd ;â¢Gªqüپٿ¿|_¥ßï·ßO9’!&"ø‘(b2zIédä#¨ñ…"¥ðRŒÿmÄ“¥6ÆädÂò²ds} Þì!öà-ºxDþá ÿõïþÑ&0Y(Šé)CÛpX·„AàLàê‹=“¹dscQ¢e}½¥ö‘Õ\¢Œæê‡à¥`)R릭R 8 çÏJÎWå9>øäžîîá·~Kóß\<³"÷A1ñH]ró:Òëžç—m §YدˆHµ(q­åÕ§Žù©`Á9†êÝ@9‡Ãf ²+¨fPjLž±¹ñh-PY +áþ«Àå9Å<Ò2š­c{«±½Eg‘r¦Hwo¾Šä&'xG­3ªè¹¿òdEËÅsÁé㌡i"«§Šz=¥œ ´‡í•C„†¢* «)Õ¼#7¢˜5Ûמ¼Ê¹ùÆ1_)¼Ï‘º$ ‚®˜*ÍáhcàÑ…"/"'&%õuª#Â@^&dÇý½AĎݽb2dyº Ú>Òì#˳¤"º´™tµ"F2}ˆ$†ÀЂƒrâÙm<§#ósE³zM~ùWaÿùrƒÒ ,—šà#™“ôÞ!œCU%Ÿ¤Ûñ sŒŸedZùÑ I|ø¾Ký]øùßä½ ø».<ªûþ,1PÒ{=Bß$éj|”†J‘¢"sò~Rd:#׳Մ˗LŸ>a÷ò%·ßÜ“—ŠržS^TD•á^þ.úü7i¿üÛªŸ rÈDƒëúÝ€m;œµ ­G©/ÿä€ï’QHk¨»ˆRb|Ì`}dßFÚ&pzf0™ oaºT ­DiÁl–\}í1p_;r™²cgAÓ+‚”ø² `;‹ë’ ¹kö÷‘¼ˆiÛ%y«³‚¡±Ü¼t©±}`è'Žc»ki{ñ>@#§F€ôB00&ÈEè;K`ßG\ˆ,2ðAÒ5†~ÌæÍ¶"EŽäSëFæØ™ÅÀj12í')·k='J¢È€—–de`è,!X¹u,¼‡›WÚ5È6ýÛ9«ðÖ“å–j!˜­¦”s<æ×ÿ6Ô7¸—ÿŠèþæc)~ö÷þøŸ[A–/™œY¤h¹ÿ#Íà"F*•Ϋ}R¼;`ûÀëöÀ¹û=ÎþÎÿÃü2£«k”ꘞ’ùãw ­£\¢²Ä>ùœ…í­úH9…/ÿÔ‚çÙ7_*udŠãöu Ï%“…`þ\ð§ÿbBnvă$¯À¼£9Dò*°½Õ¬tDjI5Wä•D©œÃV´µG©H^@{öž2œ>ɰC@,SÖÁ櫎ÕÿpB°)Ò{ 2‡XcƒcpC ¶a8AG’†ŠñÏßÍ÷©¢|Ë󾾿Òî‡~A*dD¤ø˜xä¨ÿ—£Ö_ @Œ§9¢„”¥‘B’™ i„Ô/h¯_“MD4Å—3öø:¿£øørú˜î÷þ1Ömi׎7Ÿuè¼$x‰·ÐZê]Ęž—ú†ÁtH¾ü^·“Ú*7,­CÎ1 žz9”Y2™ ö›†ííÀâ$)R./%¯®"­x Ï"†€Í ƒcaÞökèêH9 ¼ù¼EJI»TÓ@ßö뤟ZÇta˜.4CûC‹3‘ëM¤=xœuLg}ÊIþ@“ÿÖÿn~ûê_!²)âüg¡ˆíšØÔþõÿé‹ ÓŸ\Ð¿ŠØÃÛÁd>½gˆðéW–¹rìî#!(ЉBHPZÓívû×ä‹ ú¶ í®Áä‘PGä³²§çä÷_â•äîW(YÓì74EsÐ\€™œÇ1¤YÀñ°yl}Šã;Áû=à{-mèGð¤ â·O?.‚ŽÁiX6BáÌø^SÂÔ;®ðCë‰Á²~]“šb!¨Ó_'›~Cìö 9Ô8w ÛF®¾pNSÍmr»º@³Ø~àæ«×¼úrÏ#q0´žJ ‚Ä ‰!-ØÁi"C×s¸®™Üüš ª:EÖ=¢y¼¿¥½kØÝµD?P¬-ÍË[´Ñ´udw³KCÌàÈ”¤qžÚ¦›ÒY%(J(ç9Þò ”sEx}Cï¦ C0 •ŹDÓ}ñg_1ÿäŒáë¶WkBHÊ›®)ð¡àO)8)ĤñŸžäÌÎL–×´‡ÈúÊÓ»„Û¨*Éòiàæó)]»§Þ¼d"Ò:I5šïæ«HVzT¦©¦š¡O9½³A9QܾÖ,N-1x„ ”Sxýe’ÎWÞiĈé¾ù²O~õê_!Ô,Ý6F¿‹c??œw£ Å?*ÉXçE ‚‰#î˜wñ~ñÿþK÷?ô#ø R²‡èñïr)S8ŒL ­Ò £4J „|{ PjÔü»äðÖ¦aisë‹å%¢Û!ŒçÕÕLîLWš«_Þ1?MäKo%úRÓ"÷o×_Þ£d±c, p¢HˆêC€IýSÍáìÉ’—ŸA½ïÑZÒrˆ’û׎j:0=ë+E½ï6ÐXO©¡ñ)Q99ƒÇFô—‚fo9ì@…T²‚ÍíÀv€6š›—›]`‘ƒ³Ð É,rßD¦Z0?ÑÜí-‹J ¥&bð.Pï$ˆ5ò_þ.³Ÿœ£ÃÀÕ¿ÝáÝÌO¯?wøÁbrGôç šlðN0[F>û½¶íñ!Ð.À~í!£šy&‹)!¤4¼þô€Î”‰ÌŸô˜{ ëž»—R B¿g}Õ²½ ÔÛ–yÙ±ß ‚V¼ÚHô( ^¶;ªÉŽë¯:†.2¸>päyë¯õ¦!ÏM/|$ È3˜,$×/ý«À³Ÿx‚“ÑYº-íׂó§°ß î¯ õV3]$álnˆ´‡H^%ØöÚ#ÍTŸüJ”2Ä""}bìñÇwÒ¼íõÇÑ#bl‡:)FóÀûú¾ëýà{*ÉqÑO:î1aY)Z)”Ñ) L¤T0-Ó¢Ÿ¾(/û7ŽzÝœ¤˜Hîßt„Þõô6‡$JzšÆR)¸w0W‚ímjý@zÞä4L£àz¹Z.—=›F$ !K‰µ©íR–°i"_ÿÒ±º£úGpØtûµ`2‹\¿„,‹ln œ¤'iÙ*rØÂІÞiYyGyyŠwß,iaW1Žæ®~ !ýYJþJ¿35š¿ÄøœG „£!G_ÀûúþJË?ÿ÷x_ÿH­ Gú!i@,GµÎ1OÊô9B IB¥zˆï”ŽôuÇPï©wž¬Tìoîpí5åå%t‡1ä#Û[!P”! ðbÏÙSxóeÇfí(Ë@ÓBC¢”–¹f:­8_ehcÙ¯]¹¿NÃß<ûƒ¢ªR,cž}„͵ää2 „`!"“¥d³I ’”©Íµ½!è¬ïRz&3Éõ×D@™ª”N6ìÊyö£‰ïé|àDDöBÒÚÀ ab'RÐ5¶…‡Þ3—0_Ö¬oÊ@³H9!¯À€Àߌ€Œ&DŠZ²ÝY ‘ <Àõ6²ª"õdŒÜõë=µRDCˆ˜x|¢S¼ã>ÿÌnRkâú%odzDŠä0ASM¶7–ÎÂG¿×/=6hðŽjÚóô/ÏÙ|uàOþ ej’J”Ò¼¾˜ 1p¹«‰Ñ‚0¬.¶Ãf‰VŽõÎ#D­5óU@Ê@{HAÆç+ 6›ÈV h%™ô­cy}ˆx'¨Fýl)(zÈËä0Ìr‰É%»;Öj¨·à,N=¶÷ £;¤,!#ó™ôþ.¹‰OŸd ‡±‡Ù"²¹ \~(yól>ßrñÛÙèÄ-Õ@#}pÄ"-Ó'"‰éyŒ'Hé xÛ…÷s€ï»ôýC?‚¿ å": bL9¨Î Œ‡Âã)H†@ˆrLTH©ã-àøê!àKp×÷”S8lÑ7Ìϸ¾¡ÞìšÈÐ{@qñ¼bèSØ;Åö¦Æ;Èòç½ 4!"B¤0’Xœd#"}çi£ W‚Þ9¦Ö¡´`#ç2PN÷w‰¯‚§îgO ·¯ ÞZn–B %x|jA²ï  ‚¦Ì#?ûIFßE¦ (5ÃÚibDÔ°Ì%¯[ÇEµK£CÉ$Apö¦šU|þË=ÅÔSo ®Im°×¯‹™ šKÞ|áhv-µäJÒ5 DM´°8çùúßìðÞ"gñHÒÕ’j6æàŽ¿Û]ˆ¨»Ž\Y–çšý}¤ÙK„ˆHíA£UÏÐõ´G^Y´ÖH•³Û9&•@‚VÖiñ´^ TÄCL‹1]«‡BJ².2^²Ý1 ´ +ÍÁÃ>Òµé{d¥qÔ®ŽH:K~‰«¯A)‡ÐÁ ¬“ :Ÿ0;_aûW<ùîŸE¶7×He¸{=ðòŸüŸþÜ*lðtC‡µC‚¼y‡ ÝØ‚Òä@B ò(q"Œ7Þq>ö …x_ßg©ÿ ~þOèGñ  pY¦!¯é Åñ& Fã×hSŠìÿËÞŸüjš¦ižÐïÞñÏl£›»‡§GDFΙU•Õ]-TÝ%Ñ-µX›^ ±BBü¡^°e+°`ƒX°@ !  )U‘5dfefUFDFøhæfgúÆw|†›Åós¯Ú‡…”a·d~ÌŽ™¹}vìýžá¾¯ëwƒž( (…ìõEžå”¹"xM·ß1[e´›– GpÛ›»×1Ý:<þÞœã6$é©Iù·Æ8‚s„~$Ï:DŽNXæ‹"'(ÈQÄQØhE"KÐx”Rl½pRæ\>˹ûÆMÞ€HUÝ^8nG®'¥b¦-µ…å©b¾*èE8DIF³‰1ðÁf¬/ædDn÷‘‹NÖŠý.)I›UÌ€ÑZ~ãDУ¦6¢f±„—“Ñt·Ï*ÓX˜-#Ñ'cW=ï…¦ólg®Rìæq¹>DŒ÷ É_°¿w\ߺâ“b€¾…¡ÕôÆ2„È:ל^ÂîVèÁûÈú"!¹oOÛ8Ö+Hàú:`TR6mö‰Þ‘•ÂýF¡¦AQ9¥é ,ŒÐ«„¡O­´¡æëtk[h¢S/ðfTt£Eáò´tâ"=´ÕzDÅýƶCdVÑëH{pìïZü(¤ÈÐÝͨ,C#,OV,.ž±y} 5]pŒ.!9äp“¬sˆG’A+™²¢¼=ôøéÇ>¦9À{è»+óÿpÐïë—[¸(þ=ô”¬Ô·qÙäÈ”N?¯5ÐE–Mia°ZV”óŒýͤǂ±‚"£g{(* Yn16²¿qýÈâD‘å‘f×ÐìFÆ~$ÅDJ|ØÒ<à= îÝ•ù¯áÇï³ÞM]•‰ÍbµÂh¦ÓþC¤cȵž2ƒÓ ÏLS±\Œ±d¨Ìlr½[ª™¦Ù9ê9ìnV§)èc{ë(*ÍÉ…âýÞ£uм{5 ˆ4ûHð=_^¸t5A‹" ¨Pìcär¥(+CV¶÷å<-RÖûœ]ÂþFðÎãCdlÓ0pnR~íl¸ÙG’ëxw[Pƒ¶‰©Í¥&'ÐæÚQTBY)67…°¨Æ 3kZiQì•B·š¢„»¼î„y€& FA®Ç׉‘ëk¸d¸›U‘ZÁºÜR–²‘ÀÕ‡Š/>÷Èàé1 ¢»Sš’„6ÎŒæ` ͼ²,Úï_ »AðL…‰,×°¹ 4;Eç#;ȽgVš6-zZ)tŒ›Èr ™Ž4‡VÿFð.ÇH#B;&ÐZ&‚‹Iev~z„Þ kÈ2Z–kE^h^o…ʇ=˜‚bP „1Ä´Q4–¢€¡O8ïùÚr+ä&¢Ð<þƒ'Y%¹èƒGM  0eá1å„ÀÒÆà§¿•JùñÎê½ø•†¤‚AM ,õ¶å©I3+I‡LÚ!¥(©¼H ,D´¶„†¹EÆ*Ü X]ìn:¶·ž¾D­ZÏ7ŸG”V,š¾w|õ“@5š&p8:ŽÇSoxˆ‘ŠÆ+j锢=b¶Sš(‘J+šF( Åj­zA鈉=ehØŽØô°Ê5Ênïg§ ÿhÎíKÅgßWŠÝAè!+àÕׂ’€œœifKhv–z9Ü´Qô­° ¯5}#8¥°1²w ´¢ª#‹ Ž[áÍõH¡Î)j-Ø,"¢0ÖpV¥[Š#ÿä¿)Bduš ijçB¤a'ÂB%…Ñ÷NSçþâôJ<¼~í%-f7÷à|`¶ÒäeäM+´.TÚD\Lhfˆ(UP悵Bð ®6útÊþIÉËŸ̖°QDQ\Í…®šÑag†å)t‡”8·<Õ°ñ¸A8î"[¥XkM^›]bNÕKGæñTJ˜Yè£âµ ¬DØÝ e=ƒæxÐ4{áù'ë-QGÚc ¸1gh3‚Èm–L_1bƒÇMý}H›SœZ>Näm(NäqÃûz·eÿë_õ+ø5©ô€§a\  lú¬–¤ÎÑ’°A"9fGÆ;D| øàˆ’`b~ 4EQ§ä©vßÑÍn$¢ˆ½'Šf˜Ü0_AtI|z¿ƒY!lû}j` BÔ‘£S8“@Ež‘e ”§PŠF"³…!èŒ\ÃÙ£‚j¹þ20ô¥áòYÆæZáÇDÎ,­&·†E©¹÷Šó…¦é"/Þ¦ÛCax}ˆ”»¬W‚Š‘~p•ÐÆEeÐ&]×Ó )› ³°î7‘3mx)I‚Ö\eС¬Mô~ JÃ÷ž²<¢´ðúKžCVZh½0ÓÂ!ÀW×B¡<2ÍgÎE¸á¨g’¤™}ñ#Ü}å, î!PŽ£gsÁ{:’ j6K-§È²ùzì9Ë-ÅjmP£¥ž »¾çæëcayjÙ7šy˜¯5ñ:QVÇNq܆."ª¹¢c’\×(¡=(ŠZQ‰0´ ²H®…õ|ýFqn4UÕ,mˆ]“zL„/ª’'ÁX÷=nˆD?âC’' ³FE•ZB$ŸKFR›èaÿ®]i…Žéçß×»«÷6€wTo_tÑ)#€„Ìp¤`T‰çA1JúuCðéû)C‘Ö;¼ó¬Îs†~N–ôM ë÷{O{LèÝr–¬öËZÓÓUþü©¢Ê’’hã<]bº( 1 åŠRü£RT‹ˆÉ„Ù–…b»5Ì+ØI†Rбšƒ'Dá“ßÊZÅÍõ@QgÔ¥áß?ㇿ½&è ¬Ï…Y¥øâÆqù(1íŸ_(Ú©%p¿bˆ|r7×¼g¶2œ>^>Ò;hcd7y%@„2‡ÊR/ÙðA(g—‘A$yî"y /?WD;A"«sa5„ lcŠ7,­¢6#ggÂ…ÖX¥8ˆ0Â7o„m„Ü֜ZC­‹:’—в“pZ8ì…º0Ĩ¸z‘ñt®ðƒÃ#oî#C?ðæ«ÄC{E;À˯…“•æâIÆØelGX)Åq„»} ¨#7;Ç×_u4£Cù@–ÁR°y@Ä3ö­¡®„õËÔš$FªòB¼žTE&apŽ,W‰0Kd|½'¸Ä¤z Ø><ë.Fœ¤–ÄtèÐLF0•ü ¢Ujsj=ý{É{è;.Ãû!ð;©8+ÓàW´"7)^OhЦÁoº+4‚}‹‡N.J­uÂC(…‘€­ó“_ýÛW,Ö#7/ÇD^4‚•ˆÍ —ÔC‹MßvæÉsa?Ї¯1°ï#3«p^øÍ¿;çäÑßûý9´ðúó­=¯èŠõÚ0´Šm¨D˜Ï…¦‹„!¡T¾ù2°»íi8HÊ•-Œ¦5†Êpˆp¦aƒ"#ÅoÚ˜ZI›[µ‚²àl–±8Ú] ÈëÀ Üá0¤¯Cn ŽÄk:FaTšJ4½›†âçšùÒrsÎOàn+œÃ¼ÐÌf†ÕÚ0vоSl·BY¡ÛFŒ^|_¸~¥p}jǨÌrzfXÎÍÞ3K'[tšn ì[ÏýµgYd“ÚF…‚0ÓŠõEAßFNγUÎæFÓ·Â0ñœƒwŒ"ÂOÃÞ> ÄøÖ¦›€™Œ`“:ÂW‡÷3€wUïoï¨Ó &°I¾"½!Éè$¤6†Ÿº!ÄéM’NT‡¡£weý±áèüâ/§^> ¼PÏ OÀ¹û˜ä¥XËÕTs!/!„È…< mN8',fŠõÔsh›ˆ¶š›¯…F`?1qÃÈÞ9ö!rV–§?ýÓ‘CëY•–ã¹z*\Ùóó?½'t‘ùR³À88ž}çõD£Ôi” ùÐNîÕM/ôÀÕJ±?j^¿†µNm…»×ŽýÝHÓDbTTó”uv.,OR› jÍé#Å_ÿy¤,À šª ýH½(•ÔDY¼Þ&ï€ÄÀAÒMÑ*™eŒ–M¥àÅot­f™%%YQiÎWé†ôøÃŒÝ^½Í¢ðÎ0F…ÍóuN½¨Ù¡”¤Î¹»¾ú½£¨àê¹g•)z‡­g>›ÆŠÒ³íƎδ~ÄI$*&P J½åý»)ÝÎMa÷.¦°øÄ zx—õžôŽJ¦ÿ$îùÄ>Ó`÷;a?1X ­ ’\Álu Á&ãÍ¡Ø^7\œ)®¿±D dJ!z—'wª±\Uý1]½‹ÚòÍg7&õÈ,Í!Ñ.¬áìQÎW?bpTµ¥=@ôBï’Á§SÏ÷ƒK‹ˆC¼¼ãÍa ZV3»{8½Š¼yÕðÿþ?ÈMJ­jœâñ2EV‹Àżê’yj¿‹œ?Ò,N*~ñ³LÊ™FcÞÄȹR\½°|õU "HH\k_*®¯#-š¡i€ZVµ¥„³+øêo$8îZOŒ‘¬Ð˜C:=ŸkxúBsØh6mê™/ÏÝQƒÆ{ƒ„ÈÕSMVÊ}Ê%v£¡ë"ëµ¢ë…,Æ!rØ*~ó· ÌOcÔ:éÆEaMÀf)€äþ.-ÂýtJ›e†¼ÌÈ‹­n;amÒirw¨¢°R GpÆQ]äz§)Ã. F °(Ú#¼ú“ÚjœVek«Xœ@{ˆüÙÿ§Áf–‹'ŠÛWŠ<³œ\Ž;GŽÂÅîËi±Ø(Å_ü\È3p*ݪNµâìDÑ7Ph˜WÐvB¦5ÿÈ2tp÷¾þÅÈõèh†‘\Üm 6I!“å“)¼ú詌a¿%ŠåJ3[ì>þáÍ_~Ö‘ùÈjm˜¯5¯^œÓôCd3ÂãE¤žk^þMäéeÁí+‡áieéÝHð‘íŦg…¸Žéyù~ׄcäñ¥fq’ñÍ«€ï"¥ÕˆDÓ£×Ôu2ÃÝA| úÅkÏZ å̰Fñz§(„¤¸Ê-F·s½¢0‚²›Án«hIí…—ËÈüÆÁ2´‘ã.Ö çh&Âg!Ÿn«ñáó€1£RØ|Ôš"zrÆ¿?ü¿ûz?xG¥I,«™ YéTT˜””•M?6$@¡™5”Ö¤7ŽÖ˜™C4ÚhÎêH9Ÿ14{¢”Æ|À*¡œY\ÌQ8]Xî†H;F¢|?²½mØí¼KŠ”§3‹É kk¨Š c#ƒ× O Ã8†qD‡À~êÁ×ôM`›©ïo£0×[…ÉZ@EaÌ&çsf4Z Zg´]œ\¶‘Õ¹âêyÁ/~∴p NÈŒAB¤48•NÀŸœÎæŠÕ‰ÍAè¢B|D¹À²Ð“Cà«{ÏЬU ‰É`w¹P¼ø¤&ŽŠïÿ¡eyªQ(îî…§—6iéGÅÙ¥¡ Ûmäò‘æú+ͱñtCàòܰ¾È(ëC¯9ì=1B¡‡#xX¬4¯¯MTtc2×" E´–e®yí"!¦7gëS[ªÌ-ý¨É”`šcÊÓ:¡Péæ4ögŸ(Ž{Mãaça3™¯BɊȼ(89Í(ë ðcj1:¸zÛ{“ÒÒˆ´N–Ž m + CëéöÁ3ÿÖøåbÀy÷.¹€c$ˆàL_S»ObDHƒt/à½ð²yo{WõþðŽë!ýHx~%h ˆÌCtÞ‰JÎ`™Ô@»©b ‹¥3¬9ì5-e©Ú‘A)æZ18O]XbðTQè|ò Æóz72zÁ‘ØÔ·A(uBV,Öc û.á} `Lä‹Lˆtu ‘»½0øÀfL'=ãÒÂur ¾¾riØýdm¹=&G°µŠùZñâ~Ÿ»õ þæ'žÛ}¢WºÑ±ó‘6(®Ö†öN+N E5{\%I%$¹ìÕSÍ_ýpJ0¤^r­…ºP|ð}ÃÍ×ÂmQÎÓÅÈþýŒ7ÿÄ‘!T Å—Ÿ ó:ð—"8`žg<~ 6×øAs‡?û¢çB+.® 1(Æ~dy–†Æc/DþmŒµÌæŠþã I l# “Ø„o¾Å|d}ayý…gÓ;$FV¡Eqý¥BLD[˜e£3n¾Ödydè °~¯>`=-R(ÌÃpW“†ºÉå 1©ÑTÿZ¥ƒ@˜ò ÿZ¿7¼ËzxG¥•M9F§ !žSŸÔjPS(L¦Ó›Ã¨„Š Ä)G@‘g³¼àâÄÐÝ®§ÑšØ{²LÈLjÍ >08Ϭ tG‚P—B{ñ!…„ç¹aaRìã ŠÊ”UÎ,ϸk…Vt.Nû]’Œn%²2šûé‚0º€LOTjýÌ*Å]«Y”šJçÈlVh¶} ßDj½£9**B Šû6P´á|•øõc+ä¹f¾+Š!Â,7õLsØ(ZŸ"'gJ¡E˜Í"û#hRÖÀaä!à”B:Åx ,3(*Ív™×ÂbYrì#——†õ…fwÙ`7Z@E(3Eß*ºÞ­%7ŠíQ14E9¶QS (ç9½ÐtMàØ@ðÉÖD8“O>ðüQÆ…\A#\*î6éÏì‚Ç€Qi1WJqs <~,Ün-ó:röØÐì Þ[†ãˆ°°isN1¯ e±×s†àqÁ'´ÃÔû÷!Ll &ü÷› )5ìAå&“ÔË{Ü»®÷À;* ̧†[j©¤ÞRIÔ“AæûDÞ²R,`ŒÆMa,³¼àѳûÛ{Â0²=Ðõô}ÀZ5I_®¬á|™£mŽÖc ¬…¾ñ &Òm¤ÒŠßú»'*ȵ%·–B;|8½¬XåìnFº1ö éôV|| %©Wï4œÖ°Z(Œ3Ô•¥í“tq•+$‹uºÚ4[¡š ~„Æ+"†ßüí’a7õ¯}r¦1ÉAkÒUÊ(Å­R̬af¢4qê)È(  µÖdœ…à]¤*…à Za^*¬J†«ƒ‹ì6³óÔ¢Òƒ Bä µ&ײÃÙܲªJe¬Î2®žgtá슠¨²Ö\Z Ãú,ãüT³m€~àüªàv£Pª¹aߊ<±‹)$¢Æ‘óóÀÁ•Œíˆ‹0Œðä錮q´Óæ”+Ø ‚ ÉYîD¨Å#E"®á$)ªp‚iN3´ŠÂBÛ^”l·3¢Ø¼`ìÊB0yšIåeÎî¨ Yν÷øèRÿÚ FÞb\Æ!àBx …{‡Àû àWPï}ï¨éIœ ÉóÀÿñÓIÈMWgHú Â0YêE„"xæyÀðtƒ°È,l¦éC9³Ìê‚U™#ÚMŒHô›B;ÊYŽŠB&08p#¬O,¥µ\=Î9ì#®7TмþZ(¬¥TŠ‹Zñú!ÎRƒë oÚ@Њqš_(™…vLèæ¥ÑdVQÍ Þ'¼ƒ ñ£byf±QXTBµ8cy–4û•N÷•ÖdF³^*¥©ŒžFÒÆ)Z3ª„ÏPôJQU1šp"‘y¡˜kÍÕ œ?3üÁç ¯þºeV(†Œ#g^k†ö–ÆYMÓĄŠåô€ ÂØ¥\‚LMùÈ™æñ©aqb0ÖàÅÑi®®`m>ÓTE ]RØ\Π¬?ÿ™` )ÑC×Ö…âê±¢È5yah[ ‘™Vœ,nLï03зE2T½iiƑܼ¾Ú¤€—Y´m0|ü»9â4‹SÏ|©9n=íÁSd°8IÆ«]§(ŒaVG.žÊzšqxöa¤ß$–EŸÍËÍé…¡o4b óYʙ؄B+òLè‡i³ÓéïûwþîŒÐ§a}7xl&dVhGØ÷Â!X*•Ú1N2FœWÅðøƒœÃ½åš‡bÉèz†ièCÀ…Ôß÷S‹ÓÅÔ "É)R;(e'±CÚÒ à½àÝÕû àU:í§/¸RÓM@‘òWM‚½=€ßìôycÒIº°–Âh2kȬ%fs2ŠÂàú–¬ˆ m ï1%ÁßV†çŸ^rr¡¸ýÆqÓÜ(h/€ª´œ^dGC…å f«œBçlX¯®W¯@ ÷ƒPd§ÚGÊZ(ÊŒîö=1h 4U©P:£o û6r±ÊCf…ãÈuºídF‘¡èµÆªHÉ,mË̽âÕ5h¥‰Ú ^%ÅÒL±ßk¶Ç´ô*e-ëÍ"‘±†æ3áäRÐ&#Ë ÕÜp·KGÐymßÞ bŒTJDÓa¸Þõ˜~ÄjÅIqp‰ØúxmÈrËâ´àä"£¬3Æ.à†$—m÷PÍ5Õ,âF‹ë!Íb®8ì"®Wœ?Ž|ù³‘~Td2b³tcëš k ni[Á“òš½Àr–a3°YƶU\M~{Œ“±ëÁAžd«gkËÅ…åâÃߢÝíÙí\š䊲V¬–9V4yˆô.P)¥,šœC?²ª‘¤üÚd4Kg ¼÷ÓP×MÞ@ˆi±Q!N&±É),Iµ§YEœ‚€Â”•ñòý à•ùŸÁÿ¿êWñkV…Ní­’,ÔNˆÜlÚÔtC°:µRÔÆ MJË´a© ËUNÜsØŒPÍ„zžÔ,™ú}Ñî[®¿i|äÓOS/ütX¬Ç}ÄÚ ï ež±\NøáƒæÙ§5ã.`Œ¡3‚Ë 1ã{ŸŽBÔ†e³•æÍ›ˆŸ3°(,1$…΋O5»» °ÌjÅ⤠;–'žv ¢)sxò=‹U–¡`}"œœ*6‡i€ Ëyj e™Nik(KCˆ0_d„A4'FQ•å‘jŸ½ÔÈ[TVh²"ÇŠ»kÍÞy.çPÖ–®ÎÎÀ·iÖpãý0’¡xza™¯a^O¯‡ÿêyÁò¬àôûkºÛž›—¯>ØÞ «Ó‚¼òÒ€hbŒxoÑx‚bô "»&Ã9AÊ»²¼àƒO-(ˆƒb#xáÑ•!ÆŒqДµFÃèk2‚ ´1ÝhP)Nôê™æ£ß\òÑRLá¢Òô!©™f Íþ> ºCVB š²4´MŠ)¬Ê„N°@ Ø)г^”csΞd {!#󹡋š•N—>h§Ô‚Ò­ò„¶¨#O~c‰ëRýåóŠznš?D”Î)gYŠb\xo0FÈ ¨êH½T¼ÙB TɸÖã˜Qk²ÂÒFÍ8h6cÂ=‹RØÂrv™qÔV³Zt€ùB±<µˆm£èûtIî²6l®#CŸ’¿ºÝÀvã9 ‘Y©o¨Kp£¢íGœ´€!/4O?Ê1YECB8zGü$M$P7ÁÞüwdŸ2ùFâ”þcJl# nÚ$«÷CàwVæ ?þ¿êWñkPɲŤëO ?o‡Á* ‚µBM@n’ú§4)O×CeMŠÐ³†LV6§^XŽÛï ^hƒ"W†“ó â=(7-„FQèdçobjA9­ÑÖ €eiHnX<ûý%ózÆöMO×xÜàÈr˜¯"Ívä°q7ž¡…§?zÌò´æþ«žÙ2É ‡N1BY„ hw‘f'|ðwJ,w/“C6ºˆIX:®ž.Q«‹Œªˆ4‡ô:gZ³rz®èš´YºA(*ÅÝ] #1D,çÂùSƒë³•å¸ÄÉŒÆØt U†z™ãÆ’E½Àžc4! ÁÑ‹¼U…TŠ?©×Õ„~FMóBQÂ7í{7Ø»*ó÷àÇÿüWý*~MÊL- =©|4iCHqS»G%õOf’ÙÉêÔú©§ ³c-¢-6+˜92¶¸ÞF±>WHÔä¹ÂPÖSÆ«Š:½!Û>2Ï EQäèIv¹>µ8g Û—‘ãV@z”h£ð>£¦Ù%w­R`s0º#¯+f« Œ'%™…ja(ªú6ÒoZŽ›Dñ¬¥!údºßø£3²\¡ÔȸUø:·Ìg #Æœ±‡¼0(å(ÌOsL¦é›@–·ô­§ÙE¼ÓxQFèZˆ.²<5ä¥çÍk(Š7*ÀŠŒ½P/2´Î9YjŒNù™.iʪ@éœÛ½#Žqš²Ëê,£^fÄ ¬ŸÏ¨Os|C^e7jNÏ5õªyòEw:GVäÔì÷Úh>ýmËÍˈ’”¹[TŠâ `{g¸x¬!$wõÝuäü²¤;Žéÿ;¯"n€Å:3V§–ªÔ(¥ñNqÜEº>’gO'£=žÐlGòÅ8Xæ+ÅMk9Yæ”øqD!lbÀ‡oSïßOÈçÝ Mÿò2 ƒCº ¤ØTázøU¿[}ÊüüøOÕ¯âר’¾ŸÔêùη‡ÀÛoSn@®Ò&`'û~n •µ¨,ÇØœ¹Ê±YÆqÓS¯nTœ=Vt0VÑ’¤¯¶pëµN °Ø§SãÃX+EYXæK‹Í—Ï+î¿qĺˆRŠ'¿kyó3G{P\<³hS tEµÈ‰=Ï?@i*óØþ¸þ¯?k˜-KÌBȵaÜ÷ôÇŽrf¨?ù>õ£ð÷Ä÷ÌW­„ú"# Âꃚî>³œ\fŒƒÂæ†ù‰Nª¨ÅŒ¡Õˆ÷T‹œ«ŸBä´m¡…ØûãH= ¡kû{Íl©¸üð’¼®ñ£bq¢©–¼¬è[ؾ:2v޾‰t›€ÒÂò¬b¶®9nó¦^€Ò–Õ5ÆfÌž<ãÍ¿¹£;ŒÔKËb-ŒÃZCßÜhöaúZx'<ú¤äÙ÷?åÕßì©f#õ“92Ú#¯f(­qc$/R{¥;À¶ œžŠ™â図¨D°F±˜–'&µÕ´b}š¨¥1PÂvaHJïâ&á¿Äãùý€„áýðËüüø_ýª_ůA}GÂÞuR=@âæ³€Ì¤i±V cR*Xa“)LMi,ÚZÄX.NK$´ôMZ€ŽÛˆÒšåiäÕ+G¦Á‡ÈÙ"ÁݼD'Ì×F FSPÊrõÑ’Ù:'Ë5yᙟÎÙ^GlX¯ÖZªyÎìt±šãÖqÜŽœ=”ÈŸýSYäÅ?Äs䛟Òl¶œþè)‡/z²*ÐíFLXþàcÌéÇŒÿö_sÿÍ7$6ýØA°¹av±À7#³uF9/(ª”~uú('øÈb“Õ3Ο֬?©™=Z°\B– lozç"µNm¶õ9¼ø ËjfpCJ ‹A±>³¬.rúƾ«ñ.ÇèŽà›7#‡»ôõ]ž9Do¾òÌõºdw—SÍ-EÈrÇéΨ?úìù'Üý‹¿ šg@DÈ«‚±´‡HQŽ,Öžj9GbÉl™SÍ¡>…Ù“Sê|àþõÈxwÄæB½œ3tšýæKà~ê…pwiŽ‘ãÖ3³ŠóÇŠÍQ³œ¥á°É »[Þivw‰µ½2#lº€xÏz y¡yy¸:  áxŒ”Ós4c¾ ˆÆÄ‰ÜJB;?àŸ}Œˆ¸ÉË¢cd"Q§¡ðƒ#8~û¹‡ñÍø«~·þú”ùÃ÷À;©9àx¼ñÖíû°øç´IÉ`Ö$5ÕéÇIþ9m&|ç 0¹É˜gÂvñÞPÎ`1V’Y«öGáùÇí!Ð1¤Öˆ ˆJQXÅêrEVääUF½Ê:!ËÜI²Â°¸Z2[”•%ËYî8¹ª¨Î–øÖ`Ëm TwƒûâOÀƒ™ ××XkY<:%¯ ö_0íWôû7B,1YÅÙ“9ÕrÁâY…‰%â#6‹ÌN l^ÓÆjò² >­X>?!»zFø?¢¿9°¿Oj¢õe6µ»àúˆ²èؼ¸yéÐÊs¸q£pýu`±6\}8£¾²œ=¾`l#ûMÆò »D±¡ûükºí†j««9JU˜Hÿ¦6ÓÌšæ 89ÕØ\sØ2m°Â± d&ݵ"ÉCƒ0¢01}¾¶iQ>îáì$b2MY†Ö1[æô]F{lüÈÑX:B )×WÒªÞOQoçWÓ ?F¾ãž¾Åoçbïoï®Þoï¨&äÿ[ЃÌLíôQ+…¶I ”M7;™Árc`ÂA(£ÑJ£­Åðï"³¥EC5÷ªŠäEÀ÷Âl¹{=r·Ô4#X­ñ“¯`}Zqùâ„bçñCàä‚i€¬©•dç'äËv™Ñ\Ö?¼$ÜwÔ?%»ø;è;"Íý†,³Ô³S¬QÚ’¯ÌçøÝ›+Ú½•Q”Oõ¹&;/Éÿa÷5E“-4¦.ioö€A©‚Õ£ŠâêŒüùßCm^ÛE· xohöŽîàÇEîQZ8îàþçDˆ1 '³,Ý>ŒI>‚Ï~:òÕÝMÏnÓóô{ü FÂÈli’¤²1”µáä·?æô¹EðÍ_íé7-~ˆ¬çðì¬ȳS X혯 ³u†ÍrªyÆêIIVÔ|NöÃÿ>»ÿÛÿ†Ÿÿ¿þŠ«?zÄÉßÿϱû—Ü|y ºj>p÷j kc32v»6RYa»SÄ  £FD#^!ÊYd¿æ‹äð^qù,rw¹|ªˆ^1:hDñø"ýÞ]“fWOYQNž 0Yš£s -Q„Ý£0ÆÈ81€âwy™Nýnê÷‡øÝ“ èý à]–ùƒ÷À;©ú¡úÊ|ëÎô´è„96Ó¥¦ù@r[k(Œ¡´&5µÁzÏØ·”Öb³ÈùÓ< SMdì!Ë¡k§ ŠÊpûzLyA³ e,3Kž)ú.½3‡6RÍ};0{\2ìÁ+ꥦxú²¹#{ôìï1Æc¼'›èÕ&Ÿ¡Ë¡}:Fy¾ÆÔ%¦,È—–òÙsÂöžãË=ý1à‡Èl¡(æBYòyN~² 3îÍ”?ü‡Tþ>Ú@pyiXpIµÎ°WäŸü·‘ùú¿þÇ Ít{áîëZ9L¦ ½g¾ê¹C"ô}äþÚSÍ «³Œ“1 "ÑÃØkºc¤i“¬q–{¬Õ<ýޜۗyi±6cwiö–à“âG[È«S–ß{Æ7þý¡£,-Õ³„7o0gˆÛó9Ýíˆg/”/>&{ò›¸íçhÛùá«¿<òècÍê÷þî/þ ªX²<3D׳½‰ŒCLáíÃ(,Š„šîZÈ3!Ë£…¾˜,’åÐ7‰â¹:-¸yP18¶÷0 ‘:KŠ´z6'G™ƒÍ"1(.žŸ£MJ+fk¢XbŒÒlfÊv1¥Ø½¥&ÞÃäôM±ÄDþ„é60µ€Â4x¿¼»2¿ ?þxëúå–&-þvjýêÛïç*‘Õd~he®Ð£“ (Óšµ5”ÆP+E¡4Q"ƒ©ËDìÔ:¹\§†íMdy’úÀ›kÏqëÈ•&³–¢´”Æ`3ƒ1Šzn˜­-‡M@ˆHTø6b CYÃþ^#Ç-ÖTÄî–ìÑ Tn1ó2CÜ\£Ï>Ä¿ù JGŒW„öšîë-ýÝÃf‡¹zÂøõ/Ø]·ìo;²"Є±ƒ¡I}+‚ýðGØ‹¨_üÆ×ÎìÿçD­˜ýà‘=ú!Ñï0?ü=ú=ÆÏÿ1ÐàïîÙ]D§ÐYÆþöH³é¸úºã¾ÁóúÚSEQ匽ÂfB5¯©—–®Ñ¸!AÛܘöÊ+Öû{Ïl8Üækƒ3š£0öÕï(çË ê§¿Gí¾æ¸Ù1‘CVÒsÇpû%º2?üGœþèw)»W¨'ÏÉ~ç„Úü{ú‚Û?ÿ’q÷š³Ôäÿ!ýçÿ”úüW,ð÷¹ÿÿ”®Í¹¿8=¬ñ÷°ZAQ%“[nµo=cÿ-WH)Áf–Ëg–ݽæØ$DõÐAž§ØJçS޲Š"rÜ)²\ÑkÊ9ØbÁÐE<ÐEÏ^&ÕÏ´ ˆ|7ï7Ý ÂôüKLùÈßâ¦ÍáA*pë~ÕïÖ_Ÿ2¿ ?þø‹_õ+ù[^š´à÷·«¿èIúpÐo“Âê:…Å×FSë” œgy9ãìôŒ±–g†¡MoncVâþGéÀ¡3Ì'CŠõ\'”B¡(ê ™"³<#M9¯Ñ:µ+bTŸSÌÙ¼DŸB8~ƒž_bŸÿ(åǧ\¢]¢ðÇ-¾mÚÈÐ ~ñ%Ç]Ä-NsD &Óœ<™söƒPÑãzO1 äëè>ÿÇDï8þÅÿ‘üÉïÑÿôÿJ4>DòÇ¿GûOÿW¸/þŠØ5´÷;ˆý#x2„–»W-~LjŸþØÓuºRÌ׆¡K_ßõeMQ'eÌò\³>WŒ­¡é“Ûíü.Ÿiî_[»¤]?AYæµcè,V:r YØÒÞRþ‚‹”V†z–Qž^‘_|«ì¯É>ø}2I­”ñóÿ†þî†ûoZfOæìÿâ'Ôç+Ëì¾äõ_ݳ¿mhÆ€o¡(5M™ @`{“ŽÓí!¦D.I5ey¡Ùî…Ã]àn?"1e1¥¢ëkc'ç–ªV¸1Ò7¢BÐ4ãH•GúaÁî臎ˆpŒ^¦ô/!Æ)í+¾ }O  ÈCìW˜NýQTÚ0·^€»÷À;+óÛðcáýðË.õö?©†Ávºè ¡§9@’ƒ’ðÇ&á¢s­ÈµFÍ|š (›cm†1Ea‘0à}FµÐd¹b{/,N4ý1ƒÂGÃÙ…Åæ†àe©Øu‚ÅW k6Ϩ—91ÂÙ“‚nߥáp™ãÇ4 Îgúò˜³O±Ïþ˜â“ÿ”ìÅD|ý¯ÐâT<€IDATÝ-Ù³¿‹ÛE<ðCÉå“9ûWGÚý@– ]cÈ«Š«O×”þâÅS~ô»ÿJ)²¬bóÿåîˆðŸý)Ay†¯ÿ ioñ_ÿ3hïÐ2:ºm3A×~ðc œkÄ;ŽG½pFLT,ÖŠ¼²BÞšœÞ|>p÷Ú37÷ÎùDÝ n0t ¸>°ë„.B¥—O§ÓÍéÍÏ|ög{|×àFÇÝ« faCFõÃÿ˜üôc²Õ üŠØµÿú-ÝW·Ü|µçòKóª'+kŠ'0nG¸»¡¹?2_ ý¶¡q)8¯(kD¡õ‰å¿Ã~ï?Å>úyµ¤ýùÿ“x¿AŸ\bÏž’ë@¶z†óDßnÿšü·ÿ‡èbFÙþkî¿rô›|‹ÇBã„Â{–+ƒÍ3bL§çzY|NUÁM#HðäËBs²†!eîÚõ«2XÎ2chán£hÚH»õŒmxe]R¯Op.ãx'„ÆÑlíNèïA‚Á؈5oØ\'£ÙÐn6 Vin¾:rxã(ç–Û¯wÜ^„1AÞÆ>b á°œ`bê¥h9’³Ø éõg:‘`ó†VQÕioÆHPIÛŒ+ c«CÛ(êEÎÉUE>›ÊÁGú0ÒyGã=Þ;úè ~ ƒ qRüÈò"¨··‚oOÿÈCF¢€&RèûÀ»,ó£ ý¾ôË­‡ÀÅ·áðš$ÓG; }QhRoÚèÔúaš ä:ùVZ'$°Rd1¤#•ò"Ü@–AßEü8òÍÏ[¨)jËúÒ hú6'Ï2Æ^¡åñ÷–œg¾š‘ °—Šà¡¨Ò„ȪԌ£¤Ö^–üû^^ÐiFád¡^8„H.pv¡º”q\ÍrLža²9¶8asBp4ÁÓ{ÇàCô„àBÀOý?©€üÔ EÓ‚ÿ68AàÞz¦\à÷7€wWö»`²÷õË+Ç·m˜vÒ×Þð­LÔN½P5á¢5¼=EEÆ(ä1¢BÀŸì Á‘í£¬ ;.žö·‰óß·—Bð†à„±WÔK ÊÐ;¸ýzäãßÉØ¾Qh›SäI£å)läî•çô±Å¿üDa.‹öÏÿ÷„Íg˜ßøÏ(ÿ–ˆ(e X¡t†È TÛÜ’Ù¥Ó‚Ö#Ñõˆž¡ò9Å“ðõŸ‘•¥ ý?ÿ_3ÞþœxèÈ——øÙjþ¸Àp}Dôº@_c/Ñ«é¾ü§X«ZáÑÇ3n¿±1r<¦ÙÊ­hEÈ„$ål4E1àÇž}°¨ Å1_ û­b<¤¡e¯Ežññsøê³ÀÞDkÊÑQÆÈb™S”˜‚/~¡99I§ê¾ÕÐAd Ù„Ì}0=ÌŒJQŽJÛ ªD¨2Ë&Ùžj^PÌjÜ0`L$øÀØybpHthípƒcìzüèÉKÉ…e¾ÒøÜ±Öx¬²Ò‚Ψæyc*KŒŽìÉß!Ö§ØÕ €ë6D×âñQ¡GEGhZL‘34Žò,c8(ÚýˆÒÂâ,C™‚ÓÇs²g Žo’ääÙó¿=ùˆæ_þcfŸþ6WèÒáŽã¦oévÆìÉŸÿ6Ýßü 9l8ÞÜsÜŽˆî~$ôBYXBŽgš¾K§ÓVibˆô1²÷ÌlŒ¼é=£‹ˆRLŽæâÄòìãŒÃ6°ßD.® 2Ræ®5šªP­‹Ø)ˆÔ¥âàtŒh¥øÍ(Ζ†f¯È 8 »{XŸiš£"³–M/¬fŠÅIFðE•‘•yYBöŒþèéCJÿƒ§w#cpŒÞ1zOç=1 Ã$ùŒ!N‹ü´1<ð‚L›À·Hˆ:˜x}øU¿;=êÁ” Ào?ýU¿¢¿åõïÇ^ÒÉÿáÖ;¡ùÉTÇ)#UDp(F œbõF@”¢›Rå}ˆØº&¸þ®ûÁ%icp Á ÞEöw R²81hk¹­(ª@s ¬Ï Ý%žVŠãÖ—šÛo ëG9J[êõ ž4fÿ%Ãgÿôåo£ÇÝŸþo‰®O›T9CÍΉ(4ÝÞQÎrL]aóžàf;²<_P~ø!þ›¯ˆeŽ– î~¸ÿýWˆ(†q Z>A‡žù™# ÝMO–G–—ghñ%Ü}¹e8v ­æî•"zË|­©—ŠÛ¯#c§Ø#Vk”Džž¾y#d!CÐ÷"wŸÌ$gu–È™Ý1ró²"-håLÈ÷©rþ¤äËŸœª"£^FÔAá\äâIàö›tSóc@€ÕyÅa3²ûƳ¾ˆÜ¾R,Vžlfè[8´Žfðœ¯&Ó¼üEäÕÑJ1(p"ä@ œÕŠ›:'D«¨´b67Œ£ðòo"‡Xh…w‚wEiö©ÍØ5‘u–ÐÖ2º.cyfzÅêRÓ‰¢Ç"(•¾~~B<øIæéZ?"ÿΟX@зdø’˜6yp¿Ïx§¥ó›Ó @ÿæWýŠþ×CŸ¾5‚iõ-ô-bÁ=PAíŸâ›ÞM¥5•1xç±Æ b@{O–çh[P- bHRËîàpcÄ‚HEÓêy†DL<ñ°Ûó‚1m,y™SÔ5J×ÔËœÙiÅР許Y üáÙŒþßþŸlÆøÙ_ 2‹™¡ó9²ÿß´Ø,R,+”Öl_öD×aL¢–FQì¿ÜÑlUeÐÀ8ÜC1güò Ž\6HÛ÷žl>Ã(hwG²¢B™‚B+ü³Ë‚Õo<§2Ž¡MyÈÁ[ŠÒsrE]b€CéœçØÀã+ÅÐE‚ŠÌÙ\Ó‚S`½âùÇ–ã6%–]õÔ£¤,á8 Ru€³™'HHªŸÞ¥ÎE ý1ZáFá8ÂùEZu‹Z‚¦(2ΞˆÌÈ E9/°õ3´Iÿîi½£÷#½wt~dð#c˜\ÀQpo#!§ à) D•>?å<0€BL†²Q yx'õŸ3 ¿+Q|_¿Ü¦<à©”úö ôÝa¼‚·€‡ß'“¬.ž„Þ-Šœ08‚‚h-å,ñ[òz…ïí9ÖjTI©R9g ÷ßô¼ÞDŸÀM0ècJ;;I™²£Ó,Î*Vçû{á¸8PÔ5c°e@í¾`üòÿ@÷Ù?GQö\ûS¤Xc«9ùãGÜýùÏpNèÏÅCw&l¾H-­f~ãÑs‡Òp{i‚bŽÇYM•\ ”•FéŠba^}Érciö‚±‘ííx?Àñ¹Ý7tAXæ†Cã9?Õ|u) C?F¼ŽQqf4*×ô] õB¡"ó\³…S£9*E"Ož)ô&Ò šÞ±. ‹ÉÍÞÒµž“«›[”ã1†¤Õ—ø–ðùðl¦Ïó–Dœ2cœÃéù•iðð›ä €¸÷ëл-óƒI ðoÕ¯æoq=ôùˆ VÁÌLTP 0ôáÔ?á ô„ƒxŠÉUZ4ˉÔjŃ Sÿ¹oàõþè:‡5-Á9D47¯ÍB€ùŒäy ®o:¸|¢Y_vÍ0zrÖeòMä…¢šYÊ*9eƒòɳ!!²X\<ËÙÜ;>ûb »ó´C`a…²Š¸1 Š<Ð7ž±ó´‡”^¶ëã(4z϶õŒý€ïG¶.²s‘…ÕŒ.²é?…A+Ú!0´QÐ~ã¯îâ…uWJYº!¦øF²€ÝN!^±"µÑtƒåìÒ°ÛÂåÓ‚¾Í¸úä#Æa†Ãà 颧;FŸ~œ¢“þðIŠš‚áÃÛ\à8mýþÓkIó€oûÿ^ }/Kü¥×ÿøïl X_ÿª_ÙßÒ²LÒÎéãw[?jÚì/SX€yëHÌ~­ykÓo¡q飱…µh[1³^Ü0P”)ÞðìiI^Ç­PVTÅâÄåWŠ¼Ì™¯3\Ÿ†sZƒ1ý]OŠî°¹"/3l CÇþå¶·äUö­ÚeˆŒ½¦o-ݾåps`yY]*ò"ÒîÁ§SïüÄ2[gß w)ø|v J,Ái¼.>ãÚ‚ùY‰. zq‚òŽn£i¶1¸·ùÂHäpÇHØýÀú2çú«ÀÐôÜ7ϾŸ1v7/ŒŽÌšfy©Ù߯Y(áì‘e¾.x³| O n0|ü#ÍØiªLX-#ÍÁâG»ñD™Ígç焲bH¦,?&×nðšå)ô­‚Þ³FL’Èc$÷ž›n¤ Â0F'”¤¼æJ"Š;q½@XwLjë¥ÕÊÐî-~ޤ4¹«ó £ !j2fE™2dVF¸znqnÆé#ƒÊ?H§Æ'w¯E<£iüˆ žqêý»n!NÁCL§~IÊŸ‡V).òa3ˆ¤öÏÓ·÷õË-üÓð@ª\ó~ðˬÕ@mþ]:¨’ïäëpú(Óæ!/òÔ2Z+”1ÔÖRXCžuÆp4œœhÊ™póõH»;²8YẆùÚP­˳Z+6׊ö : ,ÖŠÃ}âé·N¡c¤œ)ü Äi¡ÝÞ m`󺧚 Õª¤˜ "aéÛvwäôJÈ«“ybP¬®,Z Ççêw.©/N(êÈâo"Ýv`õ"c63¬žÕ 3šÛtŠ/-ÐMÄCÓ±¿\ÙÑl´òlÞŒ€£†„@^ Í.RÎ…Ë+ëÛ›Àý›Ž¾ud¹°ÙEF'7‘èÞ9^|RPÕw×­ÀiÍýu¤È` Coé:OtÂé•âîu`×8T Ì—šë[M])´ln"ãéœpùŠJ=(û²)rO]Ež¿P4»Hz2QN/üàG=òÜð² <c:\x™5&DƒO~YA&мÈé‚%·Šïý 㸠ɤ ó™b Š,3›Œ²²èâ³eÆæu‹ó]p8„1ŒtÁÓ¸‘(Â0 “âÇ ŒßÉÓfÀw8@!!L†°é&0Nm 'ï7€wQÿ%pÅäþî à}è—Sƒv=m±š´g8­’e_+r£4Sá0š\)¬Ò©7ŽbÉd ÓŠB (,Ge­¸8-iv´I³¬èÍÐ)VW9«O_0ÜïéŽz©¸ú ãöUD$¦€u/xy–‚Ãgë×{l¦Ø^ í&¡¤ÉؾöÉú¯!Ï=Ä“å(­)ÊÈØ—´;O³š=ø½ÃJ¤¹÷t›tRΊŒî^¡TNQæ"nÄ’©ͦÇõ=Ch÷#í¾Ça};Ò-Ƨ$°û7Žè3æ+Íl¥ùê=¾ïÈKzáꉢ;¦ÈÄ.ž>¶|ô; Æ®`¾ŒÄÄÁj©YœÀ~ M;¢B¢]nî"]3°óž27¬Ö%çp{-,W–Ÿf+ÃöF‘Ã^Ó•Tš‘j¹û&0´=»½'†ÔW7ûâ®K°®é$ Dzê¡_Ì uL·ÆE Z4]М*¢3œ_Dªº¤;&ùj–k2 ó•Åõ°:ÕøÑ²8­0åcš½à|äÐíhÜ€“HãÍÐáÇžÖ‘Ôú™\À1<€àÒ¦À¤ï÷’"8Cx‰á-ÿÇóí¯y¿üòë¿bZ{~?6Ó'ï7€_V¥¸‘o‡¾ÅƒòG}Ë2$µê[I¨z…šh¡‰,ªÞšË%I>š=™Ë2‚JæžÜÀ›¯,Ö‰BwP,Ï,ûÈ$Åü¹!¢­æòÈÿâ+â躈̈́õiä°×ˆÉ‡HÛÁØŒôm¤ë#„nïpÎ`¬¥;Žøq¤¨NŸW,ž-ÉÔ€4óóŒ/ÿrdh>ü‘!øÈ݈ã62v†~oÎìl†ï »{KßDæ«”ìÍq;²½Çq(kÏØÜ0°oGŒ2X ÌæãaÀž5ÑÞÜ éeí¦E[¢U@ë!ÑøÂhÈsÅÍ+ƒÂÓGò\s¸Oøˆcïi|$ŽžÜzœ‡Jk²™A¸ÛEª\PÊrö(CiC– wß$LÇq¸Ý8¥pÎ3Ï{´V¼ù¦çM›ÔA«YJc‡Èz­ðð²ñtVÓ­°‰)_À{áùcá‡:3ÔsMã„ÚZ£0¯²ä(„Æk– …“K×9áӜ_NŸŸ¡+ˆ1rpë½£{œw .©€Æèé]úÖú”Ƙ¾æmˆ„µÏ´Ä(SF€L¸ ÷¾õ£ÓÏ™[jÑ[ÈPd˜Ú¡tJ’µ)+CQkÚ¹BYѺâHÅÑÁ˜Ñ ¦í,ƒ²D•S[Î8¹ÅÆÈ²2¬E©Ô*ŽŒÍ¤ˆši…ª§/kŒS´˜ÂQZX5ŽSçV Å|GÑÉ¡®‡ ËÐÂr*ß$­ G«-*žK»e¨}»—“å9Içt6Žlb- Ð ëŠÍªd\•uEUW”F`¡Â³} ¿(êz²€8þÚ®jÓ̇âp„ÿÏüÿMkÇãÿD Å!ÿ>Ñgx ´‰ä³j‚@¸(Ï÷×Êãþžço½œŠÒRõÑ: ÐöÓÁ´RÔJÑÕ §Ziråa=«°.¡6€K¼£ª©J%ŠŒFa­åèJÉúPÑÖ5Ãõ!£¡èÇ[)ŽnW1Z´ÍœÌ9޶”•t{ZnìZ+ªBQ–]§8vì¬Y=TQW5›EIK”c,ƒMÑáYYr_ÈY…5ŽÅE‡N`¼éè-TþnIÞ*9pÐAmmœQ´±ƒÌY†kÒº¹n(KG ì=5#IÒ̰zØpäHÉŽÂ~Y;ªØ´ ;–¸šÑX £DÃØh:©¦ÝWì>½Ãþ†*Iè¤) Ë9Ʀ8Ztz)¬¯8”ª®UØZÑï:² ºsŽÃ f\±1*ZËrÆ£š•±LÊê· W6ØÚ1®Äqwœ<'ßÔŽ=K µÆ¥š~KH…Stcµ„ÄÈd7gaa‡’Á;NƒNª˜ë¤TF3·Ñî¦tçsP9‹§üUÕ‚¬ÅzQ²QW ‹‘ˆ¾Õ•@@¦ÂXÃÈ;û±1Bû´–²ª¥ñ+¬Œdúµ×ü©<¨rPÚ0KØ;ÛƒgvÓÚ£hH):8ý@GLnÄgvͦðãðh¾üµ/†•þºñRY[¬Ï˜Œ/¢9+…ßRÚ*)#ñÍ7Ɖ cædß°‰cÓXŠª¢®*Fö°Ö”¬6T•æðìèƒ9r°d}ÅÈÀ%'ÛnÜcsÕPV†aePÆ26ÖŒams@]l]г…pë×8LY³°PÑ¡¦ âbªfµ®9ºéè9‘k.¬e©g™ëÖTE…V†rl¸òKŒ½yK'©±ÆRU–¹¾¡Ýˆ#Ïå°Dka ¤Z²Ñ¼•°|RÎh H¹¶´»š¹ÅyÚ팼®Ù fÿŠpÕûsŽýCè0Xc(†Žv'¡×JÙÕÒ,íLpVq´ÐÔ˜J>¯$q˜ÊQŒ¦ªkÚ½ŠÝ§µkkÕ†õ¢æ²CëciðJ Öó3SÐÁ±£µÕ¤Ö±kÊBQXÈRÍi''$y"0bª¹Õ²°—:¹£Óv–²£ŸrêIš0?¯ÈS™\ÖnK€^Ü•Q•]NºÍ"Yw‡f­³a 㪜Œz› SWcCaD=µ¨ Î;}ëÁÔÞÙ×R.èþ¹ˆ¦ó·ðø`…>™™Ýt6€ä.~¾ 8øì‰>Ë[˜xME·Ãj 0„,^%Ñ5Û‡ÿÎãùÚgHÊãDV)t¢Éü¤0´fA+FJ¨¡ ²ªHüTúñÀ2¿” M³« 2:=™P5Ú4Ì-$Ôe 8T"ŠsKšñPÑK©‡5ÑÐOœ8m« t޹L³V;–û0®4®Vôæàà‘’zPS;ËxèØ,-­ÄŠZéh+5Y ÆÊw§B»g8¼_¦S¥©Ekr8ÇhCœ¿V†þ¢£ÃêX&NUeÍÜ‚@jJ)§¬[VVÁ KŽnÔ$TŒGPŒÚK«-ç¶kY‘«›°w‡¦×J¨kÅj¡¬QJ§éõ¡ÝÕ,ö¥‚vôhÅ¡#5à ŠÂ1,*kêÚ1Ú4,.Öà`s¥ÄÕU‹sœï(TŽÁÈrÛ3‡W›ÆFº{ËJè)'µèöºV©f1O©J‘{N°…â¤] u’°ØëPYÑš_Ô m…E' –¢ÕM1ªÅÚªb×ÉvÞön¬PÇÀ”ÕceÖ¯µV k&M^cc¨ëšjr]$ °Ž²v“©_ÖاÁýk‡.u”ùÏ7½ÅÿŒ«4E 0j"³রàäÃ{[y9Ü<¦‚*q¦òXÛËýj$JX6Ä)”ˆQâœ4 Œœ£åG¬eÕ%«œÃ”I1¦—å\õí„»ÒL1¿¬H’yzs]ªâŽŠ¢pÌ-ätI JkVVK;_¿ÒÑuŽM Ÿjæ¬8Ç‘ÊÒÖŠ«Ökú™ÂÕ–Q‘ÐÏuQS–±ŸuØ@G)æ3™Q[•ŠÊɸÆÚbŠ‘¢¶  Kž[vŸ–rù×`¸a0F±¸ìd¤£Vl®ù;P\éè´,­nÂÊXÑ3‹ÝšÍuK?3¬ `€£ØÜ¤ìYÖÌÏ+6:Ž’ÐKF ¤kwW¢Ð‰%ËêRº¦G޼mØÕµ¬žµF#Q[Õ$cÃÊÈpvßrðªŒÁÚˆÚ9zÎQس+á[‡ ½ÚÒQðÝïhjëÐÆ’9Gê¤w@ë§ÀŠå%Å)”áº(ÅŽÊšù<¡(-§Ü*¥¦(U™¡”åŠÃ ]–$¹¢rÐî¦h£3M§•±tÆ9¬\9¢¶ ›õ&E]b¬Åzf)Ð ¶4†²Žð~c°µ™HX”A4~­HA8[ÈÇ"×dz¦¯ï©ÂOð÷ÉËCfàËlpSš¥™<²M Ô_)Â:—ˆÖBÕ 7ù¯IEKkœV(Â蓉Uµ©I8m“f¢:XÛäð•%­¶4Ué$%ͤAj8SB]9vŸÜfceÌÎEÅphÈ+ƒVŠ¡uôµÂð a›Ssë;¤8ʱŒ [G´•bÏi"dwt`1@¯%ºEí #Q=meŠÓÏÖd g ý…”î\1¢cßj+66 p–ÅÌÐﱆޜ8ñ={R6W-ß]5¬nÖØÒ°0/òɦ¶TÎQ-­\¡ÓU9溎}›NFCv:}¬ié9è(ò¶#IŽÔ5†¤ªÁXÊZe…)+vt ©q¬±TEÅZQ‘Ô2œ¾²°9´èÒ2ß…±Uc#™²•D`Ç|†Jý¾æò Q =ãô6ë+Šù ûW+”A¦Å%š• M¿­©]Êh¤°uIQXæÚ TÆÎÖµÉ[);÷öY:ùdVVd,èÈ”lŒ7#J¯ïS¯çã,¥5Œ­2d,ãZ&‘•µôHXã¾XiH›|½üs ÿŒŒÀžÁÿ‡ 0K>oZûE¶ÂýÉ]=7„)à?Oô™ÞÂLEÿãf¯LKgª›%¦Š¢ð^Âc%A6ÿXî‹ÁÊw;¥(”¢4ƒ|†–*MItÊŽ½mLméô;¬Ø [Ú=Mo>ÃYÇúª%I , I!o+² [+6 +rÝ´U¤yJ«%DU(FCÃ`(AqߺàßÎ9/…гe,™u$uÍÑ QHÔ†¹¶FCQ 525޵ÚÑR0¨`ÃBWÉên` )ä'YºÒìhe8¥X=j0e)ÕÈj…Aëb:Œý–3Nx¨:æsÖKÅÂ\Jo¾Eo>Ř.ëì¤2V+Šº`XŒÊBÆ>šÚsý+ k(¬¸±Çþ­µ~›Œ~¬L“ýK"†À»I‘7Öý ¦³Ùäß{ AtRVeÉ9>„B°£QŠ›ãgz›ûÂl€ úé}ÑÄù‡‹Šú”} íµ2¯¤´åŠ GÙ¾TŠÔ9c½Ê¨Bk .¡¿ØfíÀ:åXžßÖŠ$uX«eZ×bÂå#KÇ)Z-l*:ݔ՚SÏÊiå2R±ßUXêÂRZßå8gŒhólÂâNÍâ®TÎ=×~PºayIÓI *-kCCYCU[2¥¸b_É\×RŽ-¶ªQÊRj†›g,G æø*K1’²Q[Jk GŽ:´1¤IÉêfM˜ÏEßg£SË@“\‹ãZÚ™ Q¬Že©Á8%c¹W×èÚÐQÂBZè:N9£…*j†ƒšµ¢ÆÖâ ;Z±¼'¡,4†Õ±å@m¹Í‚b÷ž„ Åá‘£cä ›ˆàŽyM¦NÞ•‚n32–#Eµ4•¥—ƒ±bï¢æä3æÑ©bcµ¤X“’yK±²áÈÚ-ZJjí^‡µÖIŒ­eXW¬6yºgm cSQúA/e]1¶†±1T•8ÿ²¬¨jQþ¬|á·ö…ßÚký”F:¥«Ú‹ÀyæOádå;m^çp¶ ¸‰ìŸ“†UX{Ù‡äÇ#9蜭âOè3¾ÙväièÚ*;ÿÔË?+ÝPC•jædA"Ú;ƒ e5'ÕÖdÎÑÁ÷àÐZ“*Všµ5M!ñóƒåW¹qÔ TÍx$Ì>0tŠ\Áp`iw¡;—ҟ׬¯8¯Y´³Ô2^€»5½¾B—J@,åèÏkFËx¨éÎ)Œ‘‹u¥( Åʆ¥. 5ÐR í.R†ë°c·Â¹„4³ìûn©‹»DbÙ‡N‡7¥1©«šÝ;-¹2¬lÔPZöîQ¸\é8e—è¨[Ñêˆ$µN4JiªŒStSŰ2TE%«-ç(üð“Óo²¾k›W WlV¸ÚzЏDŽWkkV6-Eíè;pNÑëJσ;R­Xž×¬*Íió [köœ¢©Š\‚PU†=‡¶ŽÒ*vîLqµb÷IŽ®Ô\µjÐÖ220߃N?£0){–4Ý…ݹÃìd6¥B˜;ãªÄ)Ei*?¡Ë2¨ /1®kƵ²ö°5¦š³ ÜSÖ¾Ó·¶Ô¦iðªÛ†ï0éø÷1 7=ZK比ãDArxq†8}‹Ìíú>~¢Ïødj›Ûq–ßÒMwp˜’7i¯"ç‚hœh'°¯¤ü¤0åe"œw¢cë(q,*Š´N°ŠÆ•ý¹8Ãæ:Ì/)Š‘Áq\Ýy¸Õ™]ö_^qúm3¾{yM+1Ô%¬2XEa:i>3ÀÆH“9yŽªr-òXÜ¥(G5‡C¿+ª*ž¦ª4Ê ÓzC1UZ³kwF’XzóšõÃâ`Låèô`°aèöae]œnm#ßid­¢(epŠ+4½y‡FcjÇáRš‘Ö«Š¥VBš*º ç4k£kaÕú¹ËeŨª©±³ÓO‚ýWXêÊp؈ZQY´u$Ú) k‘ðÈ•HKØÂ‘9GbyææRò,áàša¾«9õŒ ³ e ‹Kšþ\ÎÁ#%ƒ¢¢,,££(T‘«œÛÜ~÷[êaÁ¸’`>´Iè´s:­¥4ýùUÿLÖP>ï…·cTWÒàe ÆÔ~ð‹ÈT *ƒñ¬cŒÌOö°hÿ‹ãÁÀXÏüAâ`áêsù8BÝL è{aOì‚5²HÚð~ ø?4]Á÷bŽ—m·p[¢šª¡ˆ†Ú Þ¹kå±ó Œã'ˆiÁüÓÈqäFh«ô»Zkæ|'±CÑV°©5sy‚³†Þœ£,ÿß::Íу%Î*ŒKX˜KÙ\+(F2?¸“Z†NŠÀ‰µtÛŠ²v”F3ªA£˜ËA)‡©ëEå,õØ2·(A¦Ó*co^±±n0v¤¨6 i¢Ùµ[³±j=/u€VGÆ!:+pƒ)$CîeR ÖžQ“)*¥À€­>´{šÍ KËÖ$(Œ…,QÔ…bc$CׇJ±K $”Y™ò•ùá…½Ä1ØPN$3;ËÚ±)–SnûCmªšÊÀÁ¡aeÓPGªEz¢ÓÕ¤©TßÒ$aïÞ„ñ@Kçt u¡X\J©F޲Ù›µ£›Èþ š±u Vkz]KY+6Šš…LÓVйž¦ÓÏéôºó=JÓçhÖ¦45cßÑ[Yãu|ú)L-¿©•%£ÚPUµ@=µ¡òò•ñ‚„A×ßÿ¯j|Ñ·“¾Œ|-âôý"uæô¿öŽ ÒÌ‹ðYß\j!¹¼¸…/6±µLÿ~¢Ïübjêÿä~ÕÌâ˜vp®™(&µE–(áøãë7N2jCø×çõ×'^cÈŒ{©fX(´Êiw5Ø‚õ£–º’îßbh¥‰­v¤iÊ¡uÃæX~Í5BC]ì9Ö ˜Ë3vîTœqë”+÷Õô´bd-ÎÊ€òQáØ½K±{&K5ÃuËmî˜0X‡£-Ζ–ãMËÑK*Ð;]í¨ PN±ÿ€!×Jê¸zV†"æ†U ªíK;,‰1¹DC/ƒ£%(ëp%Œ6aï^G±aX3P Ø9§¨*M®Ë š;Ü¡ÅÚÁšQeYU´œùõ;ŠÎQ8˜³2ù«ßSTG雥Ä/ÛW³1‡™YÇÿpÊhÓ2°š Šv«Eo.¡'œtzSZ3ºiBªd%`êšÍ‘eÃÂi;`÷ž”Í|!TeISG–(ʱe±“0$a¾“ÐígX“rêíævp 3Ϩ*¨­¡¬Dä­ô²Î…'?ª+JŸáŠJøþÖ6´Ï‰üƒïîµÂür“â¯Ü7I:|Ã×Ð6…Þxö,ÜôöøV˜ð×8g!ù)¯ª€Šf%ÐF‚‡Oô™ßBlÚñxg¢ûãš"p”ÀA&BM.A4N)a…ì?n2ƒFÞ;îñ0JQ!OÚÅ ëa­:MY·éæŽDUäm޶”#MÁ:M·£9:¶ ¥—$d)$¹àЩ’ân96ll t²©”¨f¶;GŽ@1„n?¡Ýոܒf†á¦ashY[5Ì-j¥ŽÅ|_ Ç(‡)jÊÂ’·`ý¨¥7­ŽnXòÄ‘§2Ü}sCVƒ¡ kÀXQMí/"«£–áÀ`•â´eyŽdÛV®9¼ÏkaoTŒ ´²„Ò8úÅÐ(€Sn•°¸Üá¬;ïáè¾ FF1Ÿ)®8R3*,]-ïÁÞ] ßø¶ae膥v‚s)Je´ZvŸ–Óî'¾Êrxli+C»«(†PZÇ|¦È³„ÕMMYXæ{š‘ 9´ }%pžPÛd3ÇÖœrë’ÂT¢íckÆuÔñ[WÒ`¬P>aè%Œ§÷ÖÖN}í'{ÕòQKçºwþa0²^ê¹o‚ûG+Ö¸éqfÇß~yNþ[¦_£”o YOMDœ¿¾!Ï4³ëdš©Èh%YRÇg¼ÉžÀwó:Y^;­|SM³Änùã8-Ê Ê(ÿckº…S%6Š‘’å•‚Ó•Á™šÔ9ÈGµfW{‘ñÁ1yËÐm'lWKrUZr›pûÓrÖ+æ—¡*j2´²„]»5u i*úó;÷:ÒÒðÓ³g:©c46 öÁé§Bš äcJK® ëÖRµdëαÜKŒ¡]AQR%«‘ÇkÉ.W4µs¤ÎR[ÍZ ]­X^T¬m@;q,íV¬ì‡¥.Ô¥ÃT–µÃ–#cÃÈ:ÎXJH5|稢Î\‚ª’nãVKÑé9Z¹b×رStýu’0_ZÖŒC̸ÍmºüÏÂÕŠ==ÍÊfM56,µÊ)Ö øîþš Ea]­èt4{NM0uEg®Å_¯8åLM‘$TªfPÀÊÐÐϹr$J“ç)+¥¡— =7SR Ï¬a8ÎpZî+f®­è/αҚgl*aúÔÖšIwoUÕTÎ׎œclD€®ô#•RÔµŸ÷leZe#y#uc¹ëõ}jä³;}ãѨá·0©w1S½),óð4P¢!¹¼8Gœ¾ ––ì?Ä=x߉>û[€Kâ$üâF¼À aøÂ¯NÔ„æ[¤. 2R+¨qX ŸbZhüjÁßg€ëi£m#­”Ðë÷I©pÎÒíÊ—§*!Ë£Btä»}M» Ö(p Žb~IfÖ^u¥hÞ¬nJÆ}›³r¿ô¬9¼*N¼® GWj´u\uа^Ö•c¤E¨®Ÿ(ŒJH³„={º=Åν"Á0‘jE¯ïÐ>èl–Òô¶kY18ÖKIEµV´:PW SÇúšc¥¥9瘛O9´êh' K™fT׿ÝÖ 7 ÅÈröÝsF›]ÖÕ¬oÒ,£Û†²V rðÿhA­5G7jÆ…áhå(jEbaÅ:vwÖ+?'WŒÆ@©¹lŲ²RC9¢:ì¨"3ŽUçH•¹¾‰fX:ŽlÎØ£¤¿bd{w§à4½~J+KرCaLÆÂÎõv145eÁ°.©LŸ®)MMU×^ÐMæ,ÆK|[‡1B¥­|óWe^¿1²"1!ã7R´·Q±·F²ÿÊ6^“ßCô½×S?Ž™ÿ?¾öîŽ}ó«`@–CòÓðâ62ÄÑ„ ãÞ{¢_Á-ÀŽ\t ?†àøÃ!Ì Pžªüò-ð¦ÃLØ·¥Ö`•¬.,ò¸ñD!uüª T0vŽÒ÷X`äà´=]œcÁEšË¿0Ž^G±1SH6QŽà ÆÃ å,kµL˜êi¯E¤èt¥©lcà{½x‡£‹£Ñ 6µšPVKë8uOJž§=*°Qå‡Òkmä|G¥bèý¶fy9¡×…ª€Õ¥« K‘a÷H¡®,Ž#),ó-i–rFS8E?Õ,íRÔc ®eåX¯j¨-㢃4ZœSdÚÑ[Ðd.£ƒ¢®jêq͸´ØÚqd,}›µcXœgˬ‘í^\TüðçìÞÙa°¦ÐªÂYǸµS)ºÇæÀ‘™I0®­TaUB'wŒ«”,sì95£®Z,ìèsekckY¯ êZ8þe] Î_K?D囨j?5-ˆ Ja؉¼ƒç÷;_ì­½ÄC(ŸÆNÄ ƒ²gðR»«7yÅÓï‚@âŒtÓØSæÁ¯(ì ñaSCÚE2ÿÀü  gê ÇÇ&ůkØ&è…fZ¨¢äA…Ïk#%zñ5!£’Á!N{‰`­É¬õÃ7Æ9Z€u‰Ô´#¥D9¯ùb _¸*åd=G±Yћ׌‡âzy‚±¢ Šb¨0‰¦¥Ô5‡–tµá¤Û´ùÊ· ·?VU¬ì¯(k…Rš¹ÊÚÑïÀxà8ç^¾ô©1›µhíc-‹Ý”Íõ„ÚYß@ä®ÉØAŒŒÂ9ÅROËúHÞ“V[±º)Md»N#û`÷©‰dòcdžõ‘¡SÊÂ’ h;'5 GÀ¼ªg®ëN¤+Z”c¢èj8Z86X–ç-ã‘aPVlÖ–!Ъ˜ï98e!aÇŽ„ýû+òì@qêéš#û Pâ@u²D]÷¨ƒ]-ɣ߃£E®§ßŽTÔZqç;g¬ÑÂË·šÚ†ƒŒGÇ´¨MÚs\žö¨¬aTW¦¢¬J k¨<³òÝ0̽ôŸ½v¢ácãU>­u‰gãÙ?a²Wí Á¡Ó·ÆOúòÅßí Ìó½3ëÄáâWl YÏÃ@õZ@JÑàAÀ»Oô«ø>· ¼†Ç-[û=4@D%”hY$~BH‡•„EMXEAwH!CVƒ2<DOÎña EC Kw.¥9vîÑ2V²£èôdÖm–+êZVs}Ãpy–°ï¨ÀýÌÒîæÔÆÐí)67-¥qtRÉB’Ýç­JèhE–¤ì<9em2ï$ëèw,ûG–‘sììiFPÁØ:víPŒ‡Ž}c8y‡b÷© û¾mØ}j‘²ü–âø”•ÊËméŠÓ¯-©çU›ÚÒÏÖKé—£#£Ù¨,‡F&ºù.Ù= ŠýCGK;+…ý£ÅDæZ•ŽM+3ŒR\5 åíD“çŠÚ¤XÕ¦½¸—ÃIÊ(jä*MMe*JŸõ×ÞÑ×¾©Ë¡|–ÇoÇÿ½38~&ãCæ_ûÌßÐ@=ÛH>ÏìÄÛcù®Y UÐû2 ’mVà¡] à0Ê,Ü»®”Ú¸0ÖÒ±Dô˜ÇÑv¶ˆhùÀ Ícžþ‰’aÜȸÃJ@ 4Òa¦œ›ti–N&})&IâGUâHÒ6‹Ks´»5gÝeãÍã(bšJÆAfÖ±V8z™¦®K;z½œF«„£G7WèD±û¤”rSqúY"ͰvÄ‘·-%ÒÐeåÀZFÚ~K3·yªig–rgýHÆæyƒ40.-‰oN[_³håXÞ›°rТ”£ʪæèذc>å‡ï¬o<³´¨i9E’@®¡B±·£èd ~ÂâÎ.ý….ƒ=·a]3ªJ†åˆ¢.%ë¯J†UMåõ{ÆÆ`jahç_ù"o(+EÃÚ;yç½LÀüM#ð$žK›¦ÁþgvâíÖ›©¶ö™Z.ÉÃ|ˆ $ÆS¬RÀ™Ý´æy¡Iz(g²* ’¹ªéü… ä)¢ñZÃÃBB•¢®©h/J˜D~%€(&0R"ŸPªfIŸ{,<ÏsF›µÉs µnOQ:i6+Ih§Š##-v8œQœrZNÖR ÖüÄ®$åè «I²„ù¥ha™K¢ƒBfŽAᨠG’¥´;šºÔXíŽ |W6­cÃ:ÆN1€6–$qa©J‹-aõhÂá#këÂàÙ·îèçÒôvpdYÝh¦ ð3wuäVØPs™P<ÇÆÒmAf5•†¥®ba^aj·ÆµÀ=DMFƒ¦J‚@;U¬GKivÏiÖ7ëµ¼Ÿ•TiFNÑk); i–3¿Ô¦ÕéÒ]ØÁêÜi¬UÃr̨.{Ÿª®;éêW¦–.^ëÎX c¶Ìí zþÆK9ØHÓÒåaþi ­¬ðýgÎÿæcÂû$B üçcƒ4C>À°ÈhèX±óÏšÖҙݤfç¾)Ì*§Zï´…S2¬½v"nVXÈ’«÷ÑJaý™À¹®|y8qN Ïhj¯ÑVÎHY›ZØHÖ°ßœN°6§Õîqê­aýH›ÞâìW~³f®¯QcÅÞ“spšÎX‰2d’dŽÁF›So—±¸s“#ûFŒG–]{eôÍÊaÅhS¡tM]9Ú©fn‡b~G‡ï()¬ã”¾ãŠ5ËÉ”£a~‡hæ›Jd/ö¯[3ÍâNÅêšcmP“ö@)KÞ¡T•WÖÔŒH–Ò”UÂrê,«ã*ËÐ:VKËn$9šë+”K¨kK{,Ü÷U”Fú©b9õ«™! ¬%Ï!H“_«¥©††–‚ '‹»úšDi pt¬Žj–çGŠ%•€ƒ“w&œ~ûSøÖà´µ‹þ.V³>UU2Vúš i1ÎyxG$œ+ëpFX@¹ÉÈFç$ó‡F¿ß—v–Æ;œdþ•k¸ý•—v.fÎÿfgyÖdúÁÂmåWÉ#¢Àd ößRÐ鈆ģ¼eö!ß ‹k±ÌõmŸúl¼vQÃŒjh¥‰¿í“!+“@ïÓùÐY,] ;C “Èù¢²óZa†°uÍjBn‹SPÀX*aÇÑ5MÛYªñ€Ñ¦c<6¢AŸi›Â[_Ü!ç:ZŒÕôæ$cï-ôèôvˆ&P1²ä­”¼%`F) £1•f×ÉýNŠCªS2¥9\[©Š”D%$™ÆZE;Sµ"OL­È”åàÐRŽ£ÐÚ²ØN) Ëplh·5J',íÐln”ìLei+GWÁ p”Ö14Ž¥¾¬˜ÊÊQǨ†Åž¢.LÑmkº ´Å pÔlŽ‘‘ÕÜUeÓ7t°3…ÒÊ w”b42´HT‚Òò$YB§•2*j•’µrFóËVPð*(ªÂsûkêÚ0¨jáù×Rä-­¥®kÁÿýô®:à"zýŽdúñªÀM&•è'4wŒ€™Ý|ì­4ÒìÎ5L  WÄ?–‚,C»4Ò¡8˜y[î«J©ÏV7ÌBÜlŠ·[íXªˆC+`©j†gÇCd*™óg4 cÎw'8´RTÈRÐ)™0f­s먵àì“f´ÚšD$' ké$ÃG¾JU´ü ‚Ò%ìa‰ÎµU”–a%‰v(WsàrE·ŸÒj'Rü, t+ûJ”rhíØ\Wt»šþÅþïJS‘vŠNªÉZ)¶NXY©é$šõq αCkÖ•¦«4e!xg])Ö Ø³#Áy³5ŠÓ–RêÒ’dä|ëÛk¸Ò2¬-ÝL±¸#guÍQT–“{­RVŽÖVÌìj+J«±ÆqtÝ0´ÒGÑVÐi9è¥(L`®Ê@7Utj‡Î NŠÝg´`µ‡¹3“Èk•e·ÓŒ”%I4½ÜwÑK ´ó”ÁXSÕù‡º}¯Û#TÎÒYLUQXiêU5EUc¡´^г{ ¯ã£=¼f½„ƒqÝãU=X¯à|ÆêCq(ìÖÉ^á»~]I3»iÌ!‰{9ö쬀ù§â#L-dŠä½\ê/ÎÿÏU“q†ÈaêÙ àxØõaA£—®üõ@ò‰Ù@::º$“jR$n~a° >ë—€qtÆïd¤p Y¿_˜0Œ†@;•£Öα‰cP¥ì^ìPFæ½~B»«Ž Óq”…£ÝQ^Q,-whu-ë+5iêX)™UôæS­vÂâ®”N¿Çx”`=‹¥ÓN¨Tž] I1·Ò›Ótz$Žzì@%ìØ“°¹féôã‘b½°\cƆáFÉz-bx›µ%W–õaMQZÖ7 6¥®±gGÊÊÈRÖîZ¾34dµ#Í5¥ƒQ-ÓÌÖG–ª°üø}wph_ŦqX¥Ø»C39†(´…u¤×¦­…œ+Å\[“·*Ï2êe '/w”¢½“ÎÏ1Úµ‹•,chj/é`EÖ¹ª&Þõ—ÆPÕr©ý ß*°zŒÀ8f2®Ñ: qw7‡×ôñ˜XÀ^ä­p“þÄ-ßïëúŸ¹“ãooAüAQKâ|„sœ…ºöÿsáÅço%ÕçzR9NsÀ5«€$…‡Wð¶ý ¿Ïíš~A+¶àìøŒ[VA54Ð@ƒÒâäI<ä|cA¢¢á~[å±^åë ᱸYLæk/â%Ršhy.ç0Î`£6kjuX춨ÆÒY e­°•¢² ›ô²„ÍÕšºJèÍ%´:)Ý4c<„ùEËŽ“r«–#«Ž:a¾'Ý*eõˆcqQ1בa8ãB1¨ªòÉFÑé8ÚmM«£Ç‘Ã5U%գÂÁ æÐXæöj+ÙðeCKY9VJÃJiÙ?6¸Ê1Šn‰b\9’Ê’ÖP(p•8Ïõ±¡ŸjFR,§®¬­H X£VŽV"¼-`Î7ó-&н”5_$žk%Üõ. Ì-,Ñê´èd†ÞÞÓY™_d³.©|s×°5Ï0¤}TÕÒŒæ!ŸÚË0¸F^¾oâ2’¾—æ©#^¿±š§óßµ ìÔ<Ç>ó·n«ÈÛõµ™ó¿iì4 aOê}ϧ5>àÿÊïž)T•(Ç%i3< ñ›Jð€_:ѯðûÜ®-;:äçÁ“*Y¡u (319iðU“ëJËuí‡Á¤~è@¦•Ø.ÃPRÏkr­ I„ož$¤‰¦•&´Ó”çÉ^kHœHE;çBXÀX2?H-4ÑK…&W–’¦™¬Ò2QÚúrÚâ’Df+Cš¤8r¥Ùgæt‡“Në2\ÛÄ .a®¥HsÈÛŠ$…V/¥›€5–ºÒhm(ÇphÕÒ*òVBÖGB«+Ãa6W-íÔ1·¨8rÐ2X”¡ú à¬ecÓ16Fëkcz@90$Æ’;@?òïgŠüV ÜV9)ÐóÝ„ï ûààõþš%à*§jØ™+VJ¡^^œƒ+V+jÆGì¹DQgšë8i˜°çV§Rè’+7¾Í|æW]ÍÉ{wÑêv06áªÍ6…Ì~èEÜjçDËÇá ¸R·1VµÔ~D£%4sù‰]uÒ.ÙÚÓ9m÷ÍÁÁÛ©0Ž$àø±}Ž•èÌì†ÛëçJµmš9/!ëqþiÌüIs‘…Æñ‡ëa’|Q\]Ùof×Í‚®Oüº!XiuH=ìSá;ˆñ ¡þì{¼Ð2(Ë ‡v"gÌ v¾@{™ˆ$PNµààiâ…Á”¡N¤8\&–4ÑŒ%O4-­=y@QG¥Gs2=Ç®T¡UA±dõäE]*é Ø°Ô¥PO«B1¿¬9{oÆå_3¨D3X‡å“ƒuMšÔ8g¨JË‘–õÂÂÈQ%¥µ\¶áh)Ei-ëã7¨1…eÝ9Ö¿< “jRkÙÑKoÔ(O»Å¿‡ß­µ‚9@Õe¡ç`>…u{çÈõoo:Y}ùÕ€[Y9ìQPg•i Ž3²„4Møüg÷ÑVнË=[Ë'eŒº·ÄѤæ+Y+Ǧ¦®+jç0Nôz óWµaì%œ]Àú­™dúÎ ãCS—õ,™/!°“q 4nW®¡vVîøw÷Î Å7åˆ?²>ÐôtUSÛ)˜À›äm ¥tù“å’9V¥tâ·Sþ‹r!ð¸ýj¿Ïìxü€ÂÆúÎËTIÇp°ŒFAÔúâp…PŸ{ißlæøÉ`Ö9ŒR“€b±døÎU%Ä.ÑdÞ‰¤‰Ã(üÌÝZ ÐFŠ› …25µUìs)mÝæVí »7o‚nƒN=äh Ý‡Á˜ZsàrÃÒžŒ5#Íi•ÂÕ5W®HŒeXV(cY7âwuë5ZiÖ|£S:6´3ÍeÚE¥0Æ1ª-«®ÕÔn¿¨i·öoZöX˾‘£­a.Q8­é+ÃHÁA/º7Fz4ÆV®Ïi‘zÖ‰àãs öäŠ~7ÅË ¶ìé§ ,ìÖ¸Íu–{ªÓ¦ÝÍpô({=Žê„ÚÚâ'tÕ¾?¶Õ^¾¹® οîÒX”Wô4•ô…X+ŸµrBaµFŠ¿Ö7tAè(o>!ó¯œ0D”j&{]Ÿïn¢®Ûö!¸°ïÌŽma˜×´ø¤ €òµ+€´©g¹8ýõ;_üqH–S3[Ü,8ï°tïû¾òÁ à}.* k$€k¿ôOüg¬ “‘~‰–Bfè@.‘îß)TΑi3šR ×>s ÆO‹ê$‰Œ®ôÔÃZ'dIJ–$8_PºòPÊ\:ÇòÉŠbdH’1Õ¸[räª 86Ösó Zçtû ½9C’–=0&¯Km(c¡ªÅÁU–ƒ›N†Ü ƒ×ëÂÒV°a=¥0•eà˜ qÔ# 7,­ ˾v¤p÷³—˜_,¸ô‹c®øy þ}í!˜ø†§è,ìÎ…¶9rÐvòœk›5*SÌgš#™®¶#U Z9yžÑëw©Û}¾Y8†Œ(£´c #+ª¥ÎJ3Wí|íæ)½”s(ôšÚ~ï¹ýµ±^.<Òð÷ÐOá?–oýJ²ö³{`J7jʦvXåÞPG>sþ7ÜÞ~ ”|®m…‡àümtŸR-ÒëèTdB­/ú–ãÒH¤pìï2ë ¸ÑvC—Â&êØM”d£¤¹?(1ƒЩk:‰C¦Ÿ8ÑB¹ £È ¼"©x=íá!ƒÅù°6¨f8 JãêšZ[RmÈt‚uë2éHvPYËZ­9tEF®–[=–öÂÆ‘ŠV[ÆN*ƒMËú°¢ÔÃSW…\òÊp¤¬Ä¡ÕŽÄ9øÂ–OeSëh·Rîy¿%Þ÷þCu’­Wj-_ß¹D±nGjèjÉŠÿë›Gé·:™†ÂÒA`Ÿ@“n'ŠIý{ÚÖAÐv¦Š,SÔÖ‘&й–4tµ=7VŠ“ç±ýWXCQŽ%x:ÑãÚÊ;úÚ{•âveeXK,Õ\z½ž*@<Ñmg›F® ï¾?á;RúÀ¦ñd ¢œ4z‹ÙdLÝ?}{;‡îŽq}f7ÎÂo=|ODÁÁMuio˜¿ü®¡Õ‘Á€à±>¤~í׿a¦äÌn¼]_ç7”MŠu¶ùðsÝDü¸ÃÛx¨G9O5 X¿?¢QM0Ö‘'ÂqO”£pŠ4QTÚÎÊìahÍØ:ډƺDV†ÖaµÂ&šZ'¨Ä •Ì­ItBšf[Sh™9Ü[Sh×c÷®£õ!åáF9Œ­Y/ VøŠ¬o”E‰)eò––» +ÃS;´q^¹ÓYǰ´¼ý½ékžâÚF@'U”JQ8;Y5%J¡5¬Z°Z‘9G[ù:A"µ°®†n*ŸG(|_Åò|Ær¦±í”“[´»ß½rƒÖ\—¹ù>C­©¬åòñ˜M_¼µN†Ï”V4zðŸWaŒ@8~B—³VÓ¬Ÿ¾åUX'ÍaN¯ƒº¶“q²oÃÙ¯£šG™–r¸¶L<$×4ì%¹_îx“Y0¸áö4HMHü H3¤· ì9¹® mu=ߟ&ãO30yà PµM18±Òn<£„Þ8›þÒ߀P»¦SØX_PRøÅ?®”8ü4èüø)1ÎÊJ 4ŒdèLi,)¢d'ÁÁM˜‹²N(¡+Ù9‘JÖšÜ&ä‰Ã:ØžiCi ™Ö¤iNâ,µÖ Dhï t,¸Û[`!U 77ikCY;Vªšª¬Ø¬j•ÅGK+6­ A·N Ü$š~CëDúqrÝ\“X9Ïn¦ii8ãÔ8è,-òÿ9Äá‘Ô œƒ¥T±™i6 CWC¯`J‹Ñ %@5Rôí¦š,Q¨LÓï¶¡Õ§ìαç¬]\Y•1µÐ8}!·4–±±cä½³2†1Óº@×ôj«Q6o½DCí>Vš¸ðpOY7,ŸPĵ ÏÈÃ~Ajd¢6{-žøX‡’Ð@z¬ì_±=þ?³nñ8ÍÀh›Îѵ÷“áOÔ–píN“Ñk ›k~tX-PPè 0µ\/ "Kß'žèW ³ Ûs]m‚ñ{'ž(è%Lt[r-÷gªéHi2´pê{ø9¾&Š$\¢^‚4QäZ‘¤‰—ªÐò¸Ö$‰¦“&h­Åá'š,ѤZ“§)I’¢•"Qzâ%Ãíå/c¢è-¥(Ê1G¯pd}€«,©RŒŒeT 4²ea1•Dáa± )…\–2߲+Ö+z©æôSw«’ñpÌî¶›}Ï•lV–J \•!Ó¯ÒL3ò¾ y¢Xì&Ðɬ—,uSvÌ3¿kNi†:¡pŽ©±ÎP”ꦬk*ë(ªz2Œ¥˜~àâ×v2!ÎÀ$‹¯=fSûoå?Ö:?Ê9*Ó0wj× kqž<¨úÑܸ†®ëcñÓÄ`ú±™]w»ö1ÈêÖá'ÐyiïÙŽ©ÛËÛ^3¢Ñ7íƒÁh PP¼0¦áæÈõèøZüƒ¸¾+‚ —GÅ!âgZ@[ËõðX˜7ÐV^ö¼3W¨Dä‘LAêƒ@¦å¶RÒP–(å½4… M®5mß<¦µBi9™0è>Ay÷ßÐ’„¥üpù¢·8L3.oŒX— C][rëèç ½Ly½}ËXA.§›¦duM­`e­ÄjHRÍ\ªQƲZŠBæjmégÐRµŒ£Ì3M¦¡ÓÊi%й….ªßGµrV£@:!FÎùAì–²®%”õDž¹ˆ€óŽ¿²øL^xûaœgù…Oïø½³oæC7|þ°2  H9L¸þ|ï ®1|y¬ÇfvýíÍl…v@~ÿi.þš$¾6’´w<„—Z+¬àb$á‰Z\î‹aHÍsƺiíº8šÀ¢M+Ìೃµ§eÀ0 ²Ò퉹 }´²R¶‰¨t ..™§¶B­´¢í—ÖI#–ÓšZÉ*Áj‘Ž(­dîRd– RùsÀ¹ Õ&Q8{çØ@lE…£Ê3ævd,;ÇkÉŒea¾Ïp0Ä”ÃÍ!¹éåº4 Kƒæì\ê2¬*ÊÂp´4è ¦—(’„ù–&m礉æÔVN¡iuPÎ2։虋Ÿl µk~J'Ò•k u] [§ªÕ5ÖX6kaûX=xê¦p÷“é[e%“ÏbpçdK1Ô¶™ý;ùÂï;ôXpÌç¿©!˜éì>~¾i(hÝp‹•ú'@7>Ü8Pþz¢ åW„PÙ+ì¼ û`@? hÝh‚@`–„¿|¢ß…[¨]— °+#†‘BÁg’øîá 'ä%‚œAÈü/3Ór‡ògZ MÔK•çß@C"—*…ö™’$ä‰À>᜕ *ÒÇpÁM¨—øNÕL‰Pš²Nè©xš«µÌ[K•ˆ2è(KèiÍÉYJ­5•sÌ9Ç Iè[Ë”2¥©µÆU%#-Ía¥¤Ö¸$aä½nGkl’²æD0¯pVÄð¤ÖÃ4~60Làc½@[µŽAUãj©T¾K·ð˜~í…Ø†_ õ³°[ášàè->1£!Šgà÷ÃÕE¿W¶ÝsÍàžãko£ùN„Ͻ¥ Õm²_Vš ;¦nj5ipòqñ&PBƒ„‹Ä¡B¥9vL3BЉµ ÿ¸âXhëŸ|nV ·…’!%¸&s´ZD¤¨ëqhëHµŸQë1h…Å‘$’±N®;'SÄR¤'•–KeôdâX¦µ‚¼´"Ÿ(˜ºÉ÷L{ER­„­£ð¬ä9•µržÖ²™&¬kMb e–ʤ*ÿÃÚp²:ÑZ‘kÍ’Rñ¼L½2t­C§–InœRdºÂ)­*/íø¹‡p<-3ð­’×oŒa\Vr|/áljËØ‚3RÌ®L4k·¶Þ7úû•ƒ‘ÿ¡Î2ùñ;n¬smÙ÷vì7Ôâ¤dn¼eþ{©&i*JûÀ¥‡vCP*+‚$õ±“qå8,Û›ÇÎ?ÜÔ±inpX <áD¿·@»¡íò×´Ÿö:@J5íà‰ï(VÈÿ°‚HT#v†ß.Ó2D&ˆÌ¥Z “ç§nÑLßÚŒ¯Ät¿ãíHƒÃõõuþ×tn³UÀñ±·é€Ñ$ðIÚ@÷ЬB²Ì:HÇ#Éöƒ™z ?ª›®`eš¥FJ¥4§3;ñ6Í®˜¶LfC³5£qµ)M±1Ó~”¤S^OVœS’8*'gl¢PVQ{8$óU+Ic+$€§#«ŠÚSÕ¬ñ2´B)ƒ©-J)‘(ŽtëCIYGª,*Ç?§òÅjóp …gD¦Yyú¨qޱÏàGÖ’(qøá=* l“Á*R—bwé»voÒª}s\è3V†ÈWuÓìfìÖþzgÃׯ¬×oq°i·28b,}ú³ßîþëjq¶]xü×ö<–Íœÿ·80[ óŽ"æé~€~ˆV ªê}sòY„ÎßP-Özk] èJûãLà ”fhy<öD¿+·0»6g~}Ž[€/âì]Ô¹¦8ÜÑM ¬2ÖP¦eõzì? ¦OèDMd(ROUZz 2ÿ¹ö´O­(mSÌ *¦ ¡¡‚W´d’øËjÀK ¶%I ÐÏ5í,Áz'ŸjaUVôÿKJkRëÐiÒf9ç!—èEK’@RZ Qµž W,ŠkSv>ƒïmaýu …—g®jïì=³¨­ï–}Æþ7þo˜­Žy;*%×rßu±c9üšý‡ëÇãÜf¶Õ.b«´H‡zHÜó¶‡x"5ç…šo’BZ•hšÃ h¦ƒ+h2þÐA9]už}¨7M³&®‹ëÇçŽñx˜7%>AŸˆ%¾Hœzn¦qR€­}52Ѿ+Õsv´V8/=œh0Þ k-°Híá£Bù‚¯³Q㊚È' á³{¥2‡Œ¾”F&9Y­…9ŠV¦׎3¡²­DjÁ8Rܬ’}3ç&õ‹×ÌñÒ‘îÞ\K6ƒ,‘ó¬k©;„H•úâ¯eÕ0Wäy•’eÀîñ¼ÆØÉð•0t%°t†V0ÿŽÙ®ˆ»ÝïîDþ§Ù=7§s»%Y¬ö4ª‚óOR仂4ðO€„êÔ;[¸,—Âïp]X>¡c,ddR …¹nêi& Ýe"ÄO9Ñï΀©ëðرþµíâìC‡q5˜eJúZº 4ÔVJ_â›ËÒ*œhY!(ïœwŒaÕá|Ö pÆM²k¬ Nµü3Œ¾ÌE–kZ©ò¯O‘&`*¯ƒ_…hÿ¤4ÕJ2õ ‰ÎG…ãñ¼Dù€! ž¥”% ¨‰R®qPúÉ*<ä€âi­£ðpjå§3…cmš& …Î`×–ùߨï“>+€é0søÇßþŽ­ðmPöÔþ’'Ÿ‚£:@0¥! …^S7LŸÔ5êqAY®ÆëÍ#Û¶T£hH¹›²UxzfÇÅ®Ïéºf‰êöŸðË]3ˆ>œGü¹lsü ‹Œ¦ÁLX+mûWÊÏ#vÍYIYI¯ ð”mKÓô:眕HPˆ¿u’ýJAkE†B9ô^çÕÔ¤n =•U)µENa¢”êÏÉùû”oˆÓ6(jz©…D‘ùÀü}U Td­H2O¨ÓêÛ†T1­Áó?„r¼køìÂÌé°»6ú{y,®ÿÌŽ¯kØÊ¬íáãqúññ¥Oš ÿÛM ¨wd¸qµK Câ×Vӌۂýû/J–5]gI ‡jøåY8®6½¬>upÜcYxïŸÑˆ´B˯ ,^3 æé[»ŽCí!påCmš!6¡Kµ°W?—àL‚vˆ:m¦d…a=Û(ÓrÖ¸²“ :ªt(ûûLmQÎK.¸†íd¼G¯m³"¯£4nâ8[©g29 4u-Áh2aË5³›kÿc\«›•RììãŒ{»UÛõq¨Çë{rMÇMM=6 Ç×.€ÉxÇý„ßZ "­®æ÷Йà·3Ÿ˜e Òàüñ……Øù‡ÿÁÂìY¥#Ýy+A@kheÌVÇÙ¦ÈÇóG=}ìøöäìz)}Aphñ6¡× óðIî!"3åÈÃlcc›mƒÔApþ¥ ØüÖ1… R¬žè!çä´ì(+Q? Çгj´Ïl3+ÛdÖ¡µ¯#(‘oŽ%’S`¬Üd¥VD‰r“Äg" ¦ (…eýŠÇ Y¾ñÎÞш²AÃÛ·njBÜóš>§k³ï¥ãŸ>Ǚӿi¬ƒ@>‘ þšÁéž ’¨ÞÇÖïÞd(¼Æ3<’¦ñ+8÷ð…Oü¡h [1¦Ò¾3†§ NôÛu˱k*¨/†P|¼íœM:uG€d Éî=ksâäãš@íoýñÂP{K£N‚@¨-Å_ðp8˅į¢UH¸]yç[FQÔßiù¾«èÅ®)†s¯#@aZ5j‹ŠæÇ^Kìø*Ïà1ÑqÓ(xNcåáz(ˆßP':ù½F°ÎñrÈ×å8Ç ³i_7ÎÞ“/¤£iA( Ç«ohP3µmŠŸ–ÇZ‰3™Y\€Ê2qöuék]¶ÌÐþòëôŠðÌŽ›]½î†Ø5k»ñ5)FÆN˹Fž Q eÉV¸#`ùñ@ûøyCð˜¢Ñ8](jì<\i9‹$ª¬×QÂ6ÇŸO¤W œO ŒŒ!üy†à“ê’ Rq÷m€±šñœJm`›~“è÷cúÇ#ƒŽ‚ã|oè®ñk™9ÿg¡]KE׃ ¨ÌànC€‡âœ-<†Ä@½Ù¯ž-¢x¢Iºµ),|©²Lœ’4ºASª´ÏœÙî[~ùÀ‰~Ûn¾vCè׿¸¯¯]×Ì욊Æ×öÜñk ß·íŽsM´âx5 ¦8ð¶R8N€^B½9UM0™¬>"2C²|¶:âܱP€ÅQ3°ÂJ@E×·¦Î#¼¦éÀz¼Vvpìé]×Çf~ûÄÛkiºeëìï@ØI¢K°ÎÏü}Í÷; ˃¹¬‘~˜tþú_c€’Tœ¿V^cÚ7´: íäèÖDh3›Øu¡h^—ý`{Ç}C‹~ÓM@!{„ú øx,HŸÛôùÆF|^Óβ`kƒZüøô} X‚3 XzÀï+Zj ׳®‘5×SNr: ¯¦^w|7ýß5técs§?ý9 Ÿkpþ¡€>Ãëc3çâí/Ù ±†ïÁ¤þÊÖÕrHŠ*X¨ÅÖähì÷×-|sW½u8|í„´†¼í.tçšÕ€ñÃb á–NF>Üaþî6'úí»ù™;Æõílº ›uÇv7Öbø/@ÓrúùâçµSÛn·ývç­¸z€ˆÚ?ΰ'›¦Ž?+&Æ×ãîÚíV Û½>¸zÐT4 ’êÿ§ßÛé@q,»!A=0­nÊbðÌnz«€‘ÿ_!‰KÀ>á7Qá§½ù}ÂÿÀèLüã[™AZíN# ºÅ”nF@†¢o]‰ÓtÏÀú|<ÔéIh÷à'öÂ?ü؉~ o^;ÄkûqNg½Ó¹kÙ÷šŸ>^¸í(¿K¾.l»s~l:£‰óvû^Û*búø¡®Î[³}0¡§ø¼×üZC±8<籘;ñ¹‡íâáì×d7Æy;·5¸Í0øï?{¹ÿ˜<±CM3Ÿ%‹Ð0…‚… áüý*ÒÐ`øÅP4$ ùj!äm|Âä0¥ý ¥e•`èDG’1 ¿mç`®m{¸:cäÚpùø¹®ih4~¶5ÕlºƒÝ6›l§'ãŽñ?:ìäúv¯i;çzM¯;\âì7^BOo¯:â÷u:XÄÿc†Í±Îaú9¦˵9äéã\Ÿ`Î/†ï®‹]ŸïäÌnz ŠÀ6ÁÂjÀ «:ºŽ¿‹ÇÑ>% K_Ø2ýËFà`±,t }†ë©¯ôÄù'iÃJ3Áï¹ ¯¿Ó‰~+ov]Ù5í¯nÀ~×d1Tr,ÛÎÑÅŽ2vr¡(_bg:½ú™†ÛíwMïDZ¶Ÿ†x¶ë£¸¦Ì}:kŸ>ÿkê”>Ü0§ºÝût},œßͺ1ê¢?ˆöÇÑõ ÆY Î|ÄVöO9µoXÕ%‡‹†@¸¤ósú§²r\pôAZ4I›`y«Y$©¬¬ïÈ2 a¿4ef‘]ßßÂ51†®+›èXŽøºü0§·9–*ådÀKtN×ex,'w¬Û×eå:z'ã¯å=™>þvøtf˜GÇbòo»±Ñk²Yæó²Àú ”NØZμåï«£Çh¢It¼¸xœŽ‡âèÃ@ +é!yK¶ µàð«Jþç-¡&d-‚”‚Ÿ? ^—ÀS?s¢ßÖg7”’wmNñ†ëXÙévÇñî€ÕOï³®ïù_SaøúÜ?m!˜kØæºžÏô* n»)çõ! k»û›Ù÷Öþ‚&q ÞÁúÇ\]¦'@EñxÈ@-iz¦»©óœ¡æ +‚Ô[]¿s4[RçâÑ[k¡v€“íÓä¹}î­¡Tð¬OŸè·÷ÄØÍµw]ÎëºbÖ7Ç×xSœÓdÇÍðõÞT¯ù–xN7g‹ a%ŠÁÓ™~²Í> &6ÆšAT‚“×Úo±€Bc—u’Ùë¨?`ï¤Íª¤ Ý§Ÿ¦²_ÖjZîÓŒ™Ílf3›Ù1ì•4~pìV%DR¶€ÀùÏhpÿX0.ÈA6x9hcü( tZâеòtOß \Õ~Œ˜nþ‡’$Í}I*ÔR/÷Ž­eÞ€Öð¤ÛKûþ¯}âD¿Í3›ÙÌfvó² hŠ»ÖQÑÿñ„Œ>@:%[ƒEÅV¬?øv¤q¯1î{`úˆª¢8öN×7ˆ©¦û7tOê™ô„¬ßY©„‚R³á™Ílf3Û΂#rü1©"a«²çt€™Ô·]o 4}0a%iæsUŠX4áz’KX§iÏÃE ¸¿ò«¥¤ð[Ž}=À¯LåWmxö]a¤á7?z¢ßî™Ílf3»yØ_²uözÜðý€ãC#ù"ôÐÀ ÔP…¨<ÄzA:Y%¤y[œµ‹º~˱ï pžÂ™Kƺò¶¬:}qø­®ÔÚ]Ù7¬p ÈYp°rð¼»ÃxÑ,Ìlf3û·¿äê2ãÏÌ>n zSUOØÇÝèØqoN€‹&ÁcƒêçDþƒH~„&pÄî˜Änwþš5´ÏàÜ»ó ò¶‰óÿË1Œ²Jhw%ãÏ;ý  i³5¬µ´R^øóó )ùã®è÷f3›ÙÌNˆ½”­™|ÈÔN?жíÑôÚÄŠ}75'Ž×;@2ó¸0›ú¿Y.ì ñ“y±¸¼Õì“úŽß@ÿ4µpÿ[=9«ÔáG/ѱwZõ Ÿ‡dãD¿ÿ3›ÙÌfvBìizÈڃÎåHBw€dÿávèð­h°ýPˆÇ âã´ª&O謞ÀõòÐY.°Nijƒ ³ìÏ0hâÏ6K mK›p{A6lÍóGOl3äRþò}ß=ÑŸÅÌf6³™}O-V÷Œ©šÓÚþ!YçX"ÀAŽf®{ÀüÃ6lOh &¤!›½ iöÚÒÙ‹Ïî39“,o†©e… s$e4™¾òlÕ´+|P[K è,É* µÀ+~íV ÝǸàý—žèÏcf3›Ù̾'öÖN(î§Ÿ²»‡­ìhúB@ dùnêvè ÖH¨ðR£¯¨Lœ~ÈþCÆMÓ4+€p¿1ÑAš z}qðÚŸ¶N¡» æN†z,” ´ ­èíæüßC.äÍïÿì‰þ\f6³™Íì&µD×sö\].ÜM·ï4( øa.@¬ºÏNhŠÆ OÕ^±³Ýõ™¿æ$è'o7܇²´©ämÈ:þ¨ȵ8ö$• pÚ†Ö¼oΠ¿C–:õ-@od1yif3›ÙÌnÙ|CÖ[‹WЇ@ýt4à 4| #ÁÕ§ê©÷/à:½FÖ!Ë ,$Ì-m…‚ÒLfý¶{RÎÛ~ŸÐ÷G^PКƒùÓ!ëC—qX½A‚A§']º:„ƒäC xZ+!€¼çŸiè-ƒ)æY8Cžº·[²þ¹S<ó§í%ÉökÚ Ð?EGÚâ|ø×ŸèÏif3›ÙÌŽ«ý¶ÿOŠçö¾¬÷{Œ±}5õѱC‡04L¢ ºeEðžni@=i.u€4oêauxÈ'kIp§'ÚHØÑ“™’»ÎzçüiRôÍûÐÙý“…ÚÙ!«î.¨†”‚Å[ $ÔÙÖpïû=òS'úóšÙÌf6³ãb¿AãðƒnÑ0{`+ë'Xpø1Í3fA£î ÇëÒŒÌü¾%MàH»sPø' ƒÑÚui‚A×O‹§‚‘sHëoÞ•p%ä;ò™;ú'‰¨PÚ‘`Ðê ö¯S)ëTƒœmê3›ÙÌfv ²Xî!w ôMhpý\hœ¡ã">?[%£¡aýÄ]ÁáùÇ4lý‰ÎOÈô‰ÆB†I_­ŽtûÙg~–n ó§@{§T…;‹ÐÛ ÝÝò¿½èlj%rVy_.:èHi) ÿþ‘s—¿ŸûÜŸèÏlf3›ÙÌn”ý:W/ 8Ûˆ¶‰È–“"qÆV¦Ðôüì‚­x?4,¡ &»lž³Ók ŸýONÒ„ÑZŠ¿yKt~²V´­ö—΂àù(Éî;˾ðÛ¼?Éão-JM ³$Å߬++ƒ|Nj*Pr>ûŸÿÉíoûýÙÍlf3›Ù ¶ç±ý\ìà ‡4EÞX²ÁEÿË©ÇÂñâûƒ+އÅX®ÎŠEÚ:¯ñ¯a7ØÚV• ç2¾ºí˜·ÄÑÏ"zÑu)N>OÛÂùÏ}ðüiÿ¨íÞ–­öÕ/‘ÓO?ýD†3›ÙÌfv½íyþ˜Îqâ!ïq7oðˆ±$t¬ï[á!¢ëa H`ˆÇAÚ©óÏ‘ÅÏ ú þv"rÐÚÃBYK¯ËF ˆÔ?»õ;k‚õÏ Ýeh-ÉõÞ ¶…¸ë:F'×m»™Ílf3»Z€h )ÃÕuââo(àÆx~b1¸ØC†¬ßDÛÅÄâŽàÐ,–Ç_ŽEí3̰NŠÂi.ßz*hê% t §†3œ;E ´õH2ýå;4zÒHWâzØw¾ýMví9‰Ã‡ŸèÏsf3›ÙÌ®“ýo¶Â6Á¡Ç˜üt*†µŠgn«€ÐŠ™ú ¿ñèÈJ Àॠ²œ«Yæ;|ƒFP§Û 6.E“# _ ·ØgñLáõw—¥Ü^((ÙæI®«é”CöÑ›[`8žsf3›ÙÌ®«=‡­Eß`qÙ4dúq£Ö˜­aÐc·x0ˆ3_â©ØÊ‚&„=Á`C‚€³’åX(Íä6ø)a™PAÓ0ž¦ô ¿W~0}:Ë/B9¸ñÎ?˜N ßÛOqf3›ÙÌ®§ý* 5sšù²h}˜ã(¡1C(ÎìÃ6¡ð‰ …ÝM°ˆ5b¨(.§ÚtTZ  N¯Ù0IÅñ·ºâø•¡1hDú¡›Hæßß#0O{Ih Ý=r­¹ãþæ:çPJÝøÍlf3›Ùq¶ö­BlÓÚþÁi‡îß éˆÙ@ÓÌŸé½~<8ø[›ÊB°i³µ'`Ks™ó3|ç–š‚04³;^´Õóg1‡€¹S½¶ÿN) Äz?²8Ùÿ”Í‚ÀÌf6³››=qÐÐÀ,qœu(æ4²ÌAô-Ö Á#8}hz&>MÍÀEÏ+ІûƒÇ´Ñ±Ó$šg«#A ffÆýyô¢ ‡yúÎðM^-?(Ñbæ¤g6³™ýàXp¼!£Žš@ §îŸ®Ôleò„L>wãY¿±P<ÿ7–34òi(ð¦¹0}â@ª›ia*I]ÄÑww ó§½à7nK0˜?E  ÔMJ㜭f6³™Ý\ì)4w;q¶ÀŠ%âbm\ˆ‹»¡Ü2û0‚gžöŸ;0‹ÂñÂ9Z< (\ʱøì ýØAyqü!óo/ ·îTz–΄]w”`v¼ÆÏMÏ៙Ílf'ÚžìÿǃZb‹ƒÂ4s'dë¡+™Ú'%[uýããÇY\ˆƒK=oØ? 4Ok!O#ÕO¯ÿ£æßõGÊûù´Åá·å>ðÍ‹²BøÙ,Ìlf3;Qö¤èz xØ&É´|‚ó¾à¢Øâ,ß²5°a¸x›7•ÑsX)Î1ŒžÄÔBýL3qøJù‘ÆË=äˆÖÚçßÛ+ÌŸ…[I¶Ÿ÷…îÙÛó=uþÁfA`f3›Ù÷ÚÃÕe™c¾þô`—øqØ*ådšã¡ï!HÄ™üt]a2‚­ÂqñJ <—õÇ* HÃ@wkE¥!Ô²ÜyÌý¥½è³þņñÓY–`0ŠÏüoX§ïñ°Y˜ÙÌfö½²GÒ8ùààc|?–€°Ñÿí¤!b\¿¦t‚ÓA#VöŒá„ö‹›Ì’©s3ˆrhio¡qúiÖ ƒÏ—iÖ:3–®ßö‚€ó¾¬²¾…á„êøÏ‚ÀÌf6³›Ú~‘­Ó¶B¯¦›½Bö&…ÂlÏÄàB¶CG!p„ÀKC„ã‡c†û3¶ÊA„brÆVm ]Œüð- _Îùî_ ô€ùÄOêÚééž Ã_:³é€›ÅçÜ?ÈÌf6³™mc¡qÀ¯„ÃV¶P ˆaši:&4Á FàŸP¤ LJ­]¿ÓÐQ,÷÷¶6|…çŠS8–îÎIxnIîhu<îûò…[Aµ IÛzß+Î>ëËHÇ ÝLlf6³™o{$3å–ƒx'hýÄcCÆ7ƒ…B¬‰Žàœ  Ú¢ &avpØ/Ì ÇŠ ÊA?(ì?öÏ;ÇVÆP ‚÷›ÚÃ@óÏÖZÇßß#XÿÒm}ø Áü»;oVÎ?HSÏà ™ÍlfÇËMÍJe,Ùsëƒ,>l7M ˜}(ÇúAq!Ù!$ÌÂï;Qá§aòÄ04´Ò¸Híá3á6@¤ùã°-ÖÒ™^òaQþw—Åùwv6ãoNÎÇÖ³ 0³™Íì¸XÌÏ"kÓM\aK.„ǧe›‰¶ aZ"z"×@ b)çJ çz’èáø9ÍèHüëHó¶zvze"PÑM$û¯ýs8ý´-—Àÿ¿¹XL¥Y˜ÙÌfvC-`þ’‰¡“€Ëçœw\°ï ±GÚnÔ£™z<ö5Ûìk‡žÑt O7„A,Â9§ížÈ=(í•>û~«Þ^aúµÏöbCÍ|æoë›× >—Y˜ÙÌfv#ìQluÈ!³ï¦ O÷Š!¡é™¿aÛxÄcqÍ]áz ƒÆã#c)‰¸Ø\E÷)¶Qxî÷ÏrDê!Á/ v äÓß»ï$…ßÎÎF âæ®ÁfA`f3›ÙuµG²•5O֊嶃}âÞ€ÇLë%Sû—ѱc7ƒÁVØ'fM{Ÿ4qp0 èNOœÒBÂC˜÷Ž?ïK¶_ x%àþáò}d3vÐÌf6³k³GOÝŽqÿO'uMË8ļñj!üÚ¦!¡øyãmutÙn•0- á¶y<î>HûKPH™yGÏ«zúÎ^[‹Ão-H ÀÖòø÷™ãßò¦ÎV3›ÙÌŽañÿÔK5'ZÒŒnŒåB£UAÃðÁ?Þf«ÞO¼ˆ3þ gø¯çdÑ9êg|;e++©Šž/nKÉ!ëâ ¿;~˜òÕÙ)÷×ÄùÛº 6^P|ÿØ,Ìlf3›¶G±u†n¸žG×c¦Npâ—œ|Œ³Ç¸{VHÙ`+϶j …ã˜è¿ŽÎ£@øý1«(l­ÄCgšíü‘æü€åO!ñ,Ÿ+šîß´%_¹o;Ú?7ÖfA`f3›Y°ûÄ¢jÓ’ ±¢'\=&NhÄrSÛ«èøA°mšk…cÅÃ\âàBtß(Ú¿ÅÖÚ@\¿€­kz½êYîˆ)¢ÓEã0å+Üt‚ÂÊ ^™„矮ÔÑ6ñ¸ÈðM@#§VOhìêím¨žAç'<ÞÙ)¿Ü<ÑŸÙq³Y˜ÙÌ~píQlO—Œ ªÐèéOëìÔ4òÁÁÇ]¸Áá<>8ü’¦¹ š,?ˆm 8€IDAT^Äš?ÓÛÄø~8¯ MQGçÓTƒìtX$´t¦oêê50Opú Ø?ˆó‡­Í_ßÇÅàØB˜AB3›Ù†=Îÿi›ƒež¡É¨C–[»oc‘¶í&vÅÅMbññb‡Ã6±ÃÉŠ"‰›žI_Ÿ&McXÚn¼§mÁþ'ÒΉ@@iò®dþÝ7¿àãdÝn€ápx#4³™Íìæhiô?LÎ Ø~Èäáê<À09 ó'nàŠáØÊÁ…4¬âYñ1b­¢s𦒆ë±T…ÝæùƒŽP|¾S)Ýpû³®hþ—M@”UÝ ss'úó»Im0°k×.>|¢Ogf3›Ùq´ðX:e¬“OËŠ-Þ4bíÿ¸»×Lm7j…mㆭ8ÓYFŸÏ¦ö'Ú&®+ĵ‡xESEC˜.k:Ë‚ë«TVåêRîoÍKpðÈ÷yá÷ºØ¡C‡8ýôÓOôiÌlf3;NÖC¹H%`ü¡¡+†db¬¶âê™L‹è˜Yt¬€Ë >vÊÓ0lÅéw?±ÅðU8n=uüP\ÝÆñë“sÊzÍ¡ó9}”†Ä2ÀAYlÚßo«[t øÎw¾Ãíoû}3›ÙÌn¤-ÒLñ Ž8fáMœàhu´M¸/.Û9ãØ ÇÃáÃþpõ <†Òè±XtÎF·K¶²Œâ5¦ L5[ Öñ튦QM‚G¹!cÀPPÁ\ ³êH@Ô”¾ð«ü>·lûêW¿Ê9çœÃ9çœs¢Oef3›Ùõ´e9—Æ©h%8rh(žÁK´=luø± ÜôÔ­éâk<Ó7‡ ýqÐÐÛ'8Ø:ý+þñŸèÓ™ÙÌfvlðsþz¬‰3]3ýx´c¬õö‹ë±Ôó4Å2žç¶%£¡qøÓ#~ÎiÖO\‡ˆµ}¦§’…UL\?ˆFñì-z?sÂòqV ŸÔëCÔE“õ[#Ea¥¥ عþ°ø÷ÿw~ögöDŸÆÌf6³k±“_àê2˰•Ý3íà\²|=µ]p¶1ï?W›féLvMt Eh¢cÅVGLj3øxÐ{¸?žU`ÙJ)5lmþŠ“@Þ— ¢ð™CÚñÎÝÈ%m ,”uÀÍé:# ÉøA°÷¿ÿý<üáàŸÿùŸOôéÌlf3‹ì ÿÿ§ýÿX-3îÀuS—éÉ\q×.ÑvqCU¼_̱U@ãžiÇjq·qpäqJݰuŽ ÿÄç™°õu‡ó uŽ˜u$.iIÆŠ»Î‰c·¥ÏöK­€[”]Šõ†¤Ã\œ»øâ‹xÜãÇ›ßüæ}:3›ÙÌ€Û÷ŽnÇ\øíºk§¥’l‹±ÅÎu:‰‹­ÅµƒÒ‰¡§i)ˆ¸¡Ëm³<è%~M1þkMÏ û†àCH©pþçÄ¡×%è˜J ˜«~hpãÕF.¦pì /¤ÛírÁœèS™ÙÌ~ íˆóŸÎˆ§9ï±ÈÛt†Ã7ñ>q†Ûô4.7u¼Ø‰oWXŽ=­Ø;ñóÆçsþã`¥œ~ŽéûRœ•/u*Ðz,0O>/ÎÝŒ½ h!—´Õ‘€á¬¬~ÐÌ¿îóÏ?Ÿn»ƒýüå.:Ñg5³™ý@Ù!YíO²•ݳq¦´ÇN2ΰãûc'ÃDÁ9›©ûcç:X¦·‹‡¹ÀÕWDûèmnÇÞvº+8N¯¶9vècˆ زB¨Fr3Ÿ‡z$À­ÙÌø†0É%éÌû7[óŠ—=¾þNº_»ˆ?þĉ>¡™ÍìÃîBãøƒÃ‹™.±3ÔSÿ§qücÝž±… =vÒ°ÕÁO× ¶«I8¶_e„}§ÆÇÔÒéÆôjššÂt° Û§Ò\ƒó*Ÿó§ ¶_nJ¦;éö/µ7"pJÿ`®jý øîGà‹ÇÜŠ+a°³r¢Opf3»eÚ=vw¶ŽJŒ³êXŸ;Øc´žfïLÏëÕSûÄÒÌA®!†y‚Óž–›ç³µc7^µÄÇ ÿƒóŽ5ƒ¶”‹§“mÝÔþR¯JFß^¸'i‰*h=ÖO8Eg¡5'2ÎH_@ŽøA3SÀÁ/Â7ß _þ'Ü·¿ÂæUð´p´†ò(üí;vf3ûžÙ½€»qu¶MœÑÆÍVá¾iÊ&Ñcñÿébm,ÕW¯Ä<|7õܱ—˜–à—8°ÄRá¼ÂÊP´–­Ž!(ËÕ_ÿ4ÅÔ¹¥”)êš¶È=Ô#i «G0w²ô(-Á”¬‘U€)n1’Ð×hÓµŽ#—Â¥ÁßJqée¬ïƒ#û`ýl®ÁÏ9"ÖÅ'úÜg6³ïs»'Ò­{';æÏÇ“µb‡;b›.Oãøzê1¢í§›³:åVšh¼2™fîÄ=ÛAKÇ¢ªnOÅÁbº¯:Ž%JÁ·ï÷ÒâÔ뱬 œ§Ÿv%”ˆ¬h(É@  èkpàóð•·ÀçßÂèÒïpô;pð 8zFCØ(`ø $ÔÀ;OôéÏlfß§öSH±7¤™q¡¶Ò6ãìwëŽgéNS+ããM‰csÛ78ãØÁÜ=öŒÓN=‰øüÂíø5… 7Ý/°]f¿Ýë›æý‡•M²å¹§?ÉšÃ%-?ü½Ú7…¥} Î4³oÉæŒ0¡‚êþÏÁŸ_y'ƒ¯\É‘ïÀê!XÙGWahdóqþ#àö4“>t¢_ÏÌfö}b÷v·¢qˆÓ6»OÃ3Ó:üÛÁ"±]ÓJ <>í`c§<ÇÇ™øtcY8Çé󘆮Âþ+÷»¼éMœtÒIÛ¾ûöíã‰y ‹ýèdŽñ4( ¬ß ޡDZ5‘Îàß™“ö7Á¾<:…ù™Çðï_¼œ“Ïü¿ŸØùçŸOY–üÉŸü ŸÿüçùЇ>Äp8ä×ý×Y]]àÕ¯~5ïÿûùâ¿xÿ7‘]pÁŒF#÷¸Ç1 äüG…œÿÊ!^ø»¿C½óG¹ÍãÎgðå+yÙâs8ù}?÷eX[ç¿|û9ÏἪâÿ"à6¯z‡,<ä!ܦKñU¯zEQð’—¼€ç<ç9TUuµózÕ«^Åp8ä!yȶû{×»Þ…snò^Ÿ}öÙlnnò¨G=êjǼխnÅûÞ÷¾cÞžÙÌN”Ý™ÑûãÀ!ÐÏ4&~] °ÝôÀ–6‰‹³Ç:SÇŒ-~¾í¨šq`˜Æà§ñûi¨(\>öÙ\èïþð‡éüN:é$>ø‘ðvçøÊío?yíÛÍ<€¦p­qN ç$㯠(Ö¨†«¬­­sþëÿŽ+7üKRšÊ8ÖÖÖ8ÿ‚ ¸òŠ+''ðÊW¾’¼àœ{î¹<úÑæ'~â'¸Ë]îÂît'î~÷»ܬ5öÿÏÿù?<ÿùÏçÅ/~1?ñ?!çÎ9rþwý1.zã«xïÅU†ß„xõ+xýß¼kaXÃ*’õ¿á¯à‚×¾‡¬ž{ÞyܵÛåþìÏøp*p?à¼óΣÕjñK¿ôK¼â¯àµ¯}íÕÎë¼óΣÛíògög“Ûñ~çž{îd[¥‹‹‹|å+_¡ßïóÈG>òjÛýå_þå–瘾=³™ûi¤Ð{; ÐO‚›n¼ â3±“~°¸@¶¿¶iÌׇ«gïÛísZ=4Þ/>çélj®WÀ]ÿâ/øÂ¥—Êë°–þìÏò“JñP¥x¬R<Á_¿³R<è瞢¹_—|õ«Üý/þb2ñ,Ùæ¹•Rkâ°FðSNø½ºŒÇ?þñœvÚi<èÉÏ÷GÐüÞÿ}Msÿƒ,ûYÇ>ø~Þò–·°¼¼Ìðz½O~ò“¹ä’K8tè¯zÕ«xâŸø=ü:]?[YYá1y øÀø¹Ÿû99ÿÇý"—|öÓ:x€¯<ÁH[D GöÃù=3dþï> <#z“ÇÈ¢³Z->ðpðeà(Âa>í´ÓX^¾v&UËï,Þ¤í¯þ꯸ýíoÏx<àÛßþ6yžó =hËvò'2YMlw{f3û^Û½€g#Ù‡†ñœqܼÓ§š‚Ì3\=ÃjŸÇr¾±ˆZàßO;çchŒñõXÎ!®EL;xËÕá¥øù|á…<ç9ÏàögÅ’„½ü ·ÚÑ~KÀå÷½§¶ÛÜãÇ~ Dáa^x5&Òôsk’\¼˜­ß·5ëüöŸ¾ŽÿùŸÿáôÓOGe]ÿTüö ~¿¹_éÉ„°#‡óÝï~—þçæâ‹/f8òõ¯sÎ9‡V«ÅSžò.½ôRî{ßûr{Üã}ÕŽmŸÿüç9xð õWÅŸþÑÊùúÝœsÎ]iaXýÖçÀX_#«Í—b¼ WDb NSžúö·ó»çÇ9Àû‹îuùåüãÛÞ¶å¶4MyûÛßÎyç7¹ïòË/çmo{Û–íÞóž÷p饗òÞ÷¾€ÛÞö¶”eɧ>õ©-ÛwÞyìß¿ŸûÞ÷¾ÛÞžÙ̾Wvà×û§ÓdýÓN:.¶†bhE£ØCB!p„ 0ïL‹ªMS4cŽ?S×c8).OË7gÑñâKl±Âçô1:O{}ìc¸­ÖœóoL^Cb«lu<Ôþ¶—\Â=}Íò±},sO{Ú–•LxOÃ9*÷¦û9L)élo7¤m.?°ÆÛ?Ãe{#d}~÷UÿÄáÇ9÷!ä¿ú\ö•ÿ¥ùÝ—¼œ/_òî÷€Ÿã}ø0÷¹Ï}xúÓŸÎúú:ûöíãcûÏ{ÞóÈóçe£á~w¿ûÝ7kØá‡nwº©åcÿõž÷¼ça>ð×Üîi/á7Ÿÿ»œ¤¿þ’—ð~Wn/+ů!ÐòK^Âoùû”b-’Ë^TŠûìIï}ïäýúÈ›ßÌy/y Ï÷û)Õ|¥]´¿RŠ÷Fû½ùÍoæ¯ÿú¯yæ3ŸÉÇ>ö1îr—»ðøÇ?ž‹/¾˜?øƒ?àÿûÿþ?Î9ç¾úÕ¯N¶ ö¾÷½Ÿû¹Ÿ;æí™Í즴»FF5†di:CoOËÇ,—0à=Îø‹©ícŒ>È#Ç«ˆØbq¸ð\[3çš­Åéxeö â Õ¼]§ïtAø¿/øßüi­÷+ËÉëy»RTUE’$(¥xTt^Lû’<çK:S)îÊVúìºr¯»›cîéj]> ê’µRqÁÇó¼Gü$9/Ç×Y+î~—;séwð¼§ i›—Ÿÿ6þÐs›½ßþÒ§ù—†ûüÔOÉ-kxûEÿÄÂÂÂý—¿üå<÷¹Ï%In^"r/ùËe´q%wÐÿÃzŸä­\‡5øÿò]øö*ŒJè"_¸ƒþÍo·Aо_C !‡l·}ÈóÈ  üýW»‘uWkþƒùò‰~3f6³›Èî <q\aå —Ø‘…Y¶°uÖtfÓ/¡P+¶yîr›ûB7q¶™æìgÑvÓ\ÿXª!f"…y¡ã7îôûÂëÊ£ã<éƒäþ÷¿?çŸ>Æ3&_oOS®¸â î±w/ÃóNËK„×ùS¯~5Ï~ö³ùЇ>Äß=à[éä|ÝßÝÛ‘vEþ¹³KºçO—Z@ÞM |²9è.CoP@Û‹÷¤k¸½(+¥å>[7Íbúæåèiõ¾ûQøüá«ÿÈøë+ûàÐU°rk°YÂÀ‰ó _²š†ò–hñ—5dÚ0q!hzù,Ìì|׉~Of6³ãdgODœ]‹­¸zü{ Îñwü}/bk¶K5ÀÕ‡ Ç¿µÐpb,b~Ó’±Ds\KÐl=ï°}¬Þ+z›–¥(ÙZÌþ.ðQŸýß[)NómoZ[ã| ?õ)î>u¼BJ” f8Þ=•âôèýiλ.¤ë7ŸÇõ¥(œwyË¿~…W½ãó¶ùË¿ÿöŸƒÑaÞrñ»yÕëWÁÑoÁÆ•¬ÞÇþþBÞôwoS³o|Ã|ô#ÿÀUW]Å«_ýj>üáß_¯iå&k—\Ä+_ðt>ûî·0¸´bß·á¯À‡¯‚ñ®,à=>âßà£À'€o#ÅÞ0x9|—ÓLã¹ YÄÌÔ@+4™Åwü¶-ÿ>x؉~oföiîNú‹÷sÎq*ð‡À/#+âMÖkÕl7âÐ97j¦ ·ñ¼ÞHÅTÍ„­ÍNñÐu¢s×Ëè¸ñ±ãíÃãqÁ¶®`Âs„îqm!nØŠ_ïD]ôž÷„Ó«è\ÞÌÏÏó)ïüãùÆáù¡‘‰¯õ4˜0ƒ²{Ýkòœñy ¨½(οÚôg?àa/úg>ö:ËüÌÓ^Æÿ~Ù¡ó°g¿Œ}ñ*‘‰îï†Î2ÏýÝ—’·{¼è÷~†+|í²«xöÿþ îr×»ñ²—¾„§<å)¼ð…/äŽw¼#w¾óoЗë&±áa¸ô"þþSGyɇ îøê¿÷IøØÎçÿŽwñŒË6xå>vî¹<ðMoâ=ˆÃ?㕯䋻wó†ñ˜OGÂ}Î?ŸKwíâÝ|HÎ=—_}Ó›ø Á÷?ÿ|¾¹kïÙØà¿üÜsyŽß.þ²ý¯óÏg×®]lllÒoßvþ Ü®ÝnÓn·ÙÜÜ<ÑŸÄÌna¦”âÉl¥U†Y¹1¾cá) 4×ÂðÇÈý6¡¨trRÿXX‰OÓBC6wËÆNxºkx;Z(\=x=ãt燜1ƽö¯^é.¾øbwê©§º¸ƒºç?ÿùî¾÷½¯;áf*燜ûøK{õ™îƒ¿ˆ[}®,KwfŽsιû‚ûÍóÎsóà~Ük^õ*·î·Á îYÈö‹àî‰È~·÷ÜóÎsmp÷W¯z•ëƒ{4¸G€ûÅkØ® îáþòP¿Ýé~»–¿ ¸óÎ;Ïî¯ÿú¯ÛÜ]· —½èEÓl±Ùåfp ŸW¸þÆ7¾ÑîœsÎqßúÖ·Žë6ÓÏû´§=Í•eéÞóž÷lyìÖ·¾µûÆ7¾áVWWÝÃö°«í÷ÌèúoûÿÀýäOþ¤Û¿¿Û¿¿»Ç=îáþܢ߿\p/÷gàùÈGºÏ}îs“ý_æ{ÓÏù\p/÷íoÛýØý˜{¸7¾ñÎ9çÎ÷X¿ÇÿN§÷¸gDçùk¿ökn<;À=ÜÓÁ=i›ó~‚Ì9ç´Öî’K.qÆ÷p?ÿó?ïÖÖÖÜ%—\â”RÎ9çž“ËS£ëOöþâIþÿãÁíÛ·Oü©§ºGyñ“à~ÿ÷ß}âŸp€û§ú'çœsJ)×ét¶¸´vž»ÅÅEçœsgzŸôÀ<À9çܾ}ûÜcÀ=Î÷‘þ95õ6ˆüsvKÛ|µ}O.þÇ·ðÇ/{ /=ÿ!\ðÕÑÉ\|ÑÛùã?z)/ý‹ dÕÐÛËüÂbBÓ6÷ýéŸæé±9r„²,Ùµkø‡È­o}k®¸"%OÙÖ.ƒ=þãOáÒor§ >þø¡Óéð‡>Œïb«Fþ[^úÇô/²ýƒ€7;ÇS>òتøïw‘sœç·ëm³l 7B&ñCÑö1³çšìš¶{á _ÈüÁœØÏdf×hgŸ}6˜ôÒ¼ìe/ãw=kìxol÷îÝôz=Î8ã Þð†7pê©§ò­o}‹‡=ìaœyæ™\xá…Üç>÷Ù²ßt1÷wºŸøÄ'¸÷½ïͽï}oþã?þƒ ïxGžŒÇc>sÚi8`ð–·¼…ûÿÌÏLöWÀë¶yÎÏùçüßù^úÒ—²xâŸÈÁƒáì³ùw¿ÿ½wn³ÿwîsŸ-Ïòò2NgËë¸d›óþï;Þq²B¯ªŠ?øÁ$IÂît'Þóž÷ðc?öc<âÀZybè)^elWÞ³G("›‡OÞÇ/Ï}îsùÄ'>Á;ßùNñˆGȱœã³Ÿý,J)N9åî|ç;óÀ²daa€½þ˜‡ìøõ†Uî5g;÷ÚvîoÒ¹·?¹w>Ź÷>Ë­¬¬¸½{÷º½{÷º—¿üå²8ë´«Ý?øêûœ[ùºûû¿ùK÷º .pgßîvîïþöõîÜsÏuð஺ê*÷#?ò#î·~ë·Ü‹_üb7 Ü™gžyÓeõ×öx±áÜUÿåÜ»ŸáÜÿ]pæWpWý<îßú·°°àžØk»_÷º .pg--¹µµ5· îáiêþæ5¯q»Úm÷3àÞöÙþ®í¶ûIpw÷£~¿Óü~}p÷HS÷Ú×¼Æíh·ÝÝÀýH´Ý©~»¹©íîêW ÷Ûâ·ëMÝî‚{̹ç:À]pÁnÉß¿Ýís±à666Nx¦;»lùÒ—¾äîu¯{¹‹.ºÈ=õ©OdòqF¼¶‰/ñý­VËE19ÎýÐM[XXpW\qÅ–l:^<Ü7¾ñ w·»ÝͽÜKÁÝýîww_ÿú×ÝŸƒ»ÿýïï¾õ­o¹?×óYóã¢ý_v Ïù»à–B6­Z.ºè"wŸûÜÇ}ñ‹_tÏ»†ýŸ=ÏÃ}fÿ”è8ïgøûÂy?ÕïsÖYgM¶ÿÆ7¾áÎ9ç÷ pÏw—»ÜÅ9çÜ3|æÿdŸíÇ+€'ù,üÑ>3+€³o{[÷8¿ùùy¸=èAî²Ë.s€»÷½ïíúý¾;|ø°[w6¸¿ýÛ¿u¿õ[¿åçù =hË `ú‚{õ™Î½úLç^ÿãÎ]üXçþå‰î~ëgàïýMç>òB¸Ù:tèø;þp¹¦mÖ.wîëï’ ÷Üè—q—Ý÷Ù;lýòŸî|ð£eee…ÿ½¼ŒŽ>ð¼õ­oåG¹ðAçÐZO>çív›¹¢à«‡±{÷níܤAìÆ µæø@:øÀê*€r¾Ç‰sOő봡ƒêTú®n¦ èÚ‹ÐÙ)ÅBO€No^ƒbV/ƒo¾¾t!\úIÖ/ƒCWˆÓ?²ÖV¤²¾8ó"º”4üýàüC…>pþ§õJàêºáá)m±P•ãêÝ‚Ž­œå°ß´f¨›ºk”ÌÁ÷¿9çøüç??aÏ9ç¸ÿýï¿…R}<¶‰þvà)JñiàCW]u5eʧ)Åëüvñõg*Å;+¬ÏZËí’„§#Žð÷Z-6ÆcŽ9Âkvî¤ü¦ßÿO•â]À[·yÎßSŠ øÏûߟ~ðƒ,+ůþüçùÑýQ®gÿ¼k›ýÏSjž­%ly ï.Ÿ:ïÓ“„¯óïÏSi¨šWEØ×¿þõ<á OàWó|K(iä)`k}ñðNŒŸTŠø÷¿Ÿ÷½ï}|ãÏÿœ+Ï:Ç'?ùIžóœç°ï¿þ‹+üö«««,--ñHšdôËÀçüãWj¢³'§š´Ý4lWas?làËg¿ˆùõ÷Icðí¯}‰ÕÓÊ»ÿõS˜#_ç+§°zòyØs_ å&Ïÿ£×0Jxïÿ§=õ)üöoÿ6EQðú׿~‹Ù‘#GøÌg>ÃáÇyèCz5æãj¶–é]_|áðÕOräç¿rV¼ó¿êU™=þ9ORŠÇ‡@|ùCB)Ž‘ßÎît'”RÜq¶?¼àä“Ùé÷ߥSªQÉôÇŠogˆã}üy§JñSIÂ/øç û„"î­»)E¢ JñÖ·¾•ÿüÏÿœ$nnÓb$!¼ÞeàC’”í×ßö6.CD*ÿâ/þ‚yD)àþá¸×=ïÉÙÿõ_ô€Ó”â®Jñ«KK< éµÉèóÞô&ðÇìùçpl[2Øßdó!ãO<×T°ï³ SÞþõ ¿øÿ¸ðu¯ã~÷¼÷Žßç%Oû.ýÒ%¼ó_ÿ“•µM~þ~÷d~qÿùß_âA¿ð <ñ‰Oäk_û?þã?Îð”R$Iƒü`žûÜçò…/||ä#|éK_šÈ0á _¸ñ¿˜ý¬]—¼¾üf¸ìJV¯ðÏA kkï çwo<ï<Þøµ¯qÏw¼ƒoïÛÇ)½/¿à~à¯à6g…ó_Úçžw~Þy¼ûk_ã®ïx·ðOûö±·×ã/.¸€¿þõ¯à̳ÎÚrz¸8Úîï€DÛ…/•Þµo{z=^qÁ¼8°o»{=þò‚ ø[à!çžË;/ºèj÷Ü·]½¯¼àÞ<ôÜsé]tûöí£×ëqÁlûßÙ̬²Å§øûc¾ûÃØÊo74ÁBû}bîüYÀiVÀAª!EdTþŒ­+å?gë xð4M[?ŸObëêùùlíÌÕÈp™_ž:ß 8fõ­5ßЧ`ý9ß!zoÂvOŽ^Ÿ> <þñçóo}+w¹×½xÿûßÏ駟ΦÞËðšÃëŠFpð'x÷wŽG>ò‘¼lÇÞõ˜Çð8¿í:ðÖÇ>–Çùmœf|Üwð‰<çM“-ÿèàd®®}$ÍdÃÊ+ý­–8ÿö¢lak G¿És~ã¸çOá=ê—¹OïËÜéå/çÏx}ꮼóã_â o|Õ×?‹gð+¿õǼþ o *Ƭ¯¯ó¹K¾À¿ðy~ôNw&Ë2~ÿ÷Ÿg=ëYüÎïHÃ÷§?ýé‰ ó 2[o½®SøÆ»óÿì_Q}ËpøJX9+ûdnïh µBðþÿð²Ë§½^ÛÿñÑ2=B²šu¿ýnàþþ^¯ÇÀ'?úQ ¤›7¶¯ûz»ã¥õz=N>ñÑRúÛ'ùÛð/]„›º»íþÙËA÷z=Îô÷§42Ò—\r íö5é’Îì–lÏ@T,.EN78Ç ³e<ã68´i4H훊­™qhPŠ©‘á¦ëgDçwOÃ,ñ6ncñ1kÁVɉ`ñhF¢í€<à¼îu¯ãÊ+¯äŽw¼#÷½üò-Ý¿áõL+6pŒ¨¢>ûYÏâ¯^óþûÈî“eœU×ÔÀÏFÛ…÷§ŠŽŽ÷-àÛ¾øYÏ|&'Eïc¼"‘×3¢Ñ2€‰¼óäÔÆk\üß¡®kÞýñ/óÿþßÿã£_9ÌcϸŒ×üÎø§w¾/~ö“<ù)OÁÚ†GøäÇ?ÆŸø$œ)ùì~š·¾õ­,ùn¶ªªxÇ;¤¯àøŸùÌgæ?ýÓõ%ÆÖÒÏðßÿþðŸ¯dt©áÊoÀ᫤ػvVpÑØØÿåiʃÞþv^tÞyÜøÿÙû÷ Û¶ì. ûÍ9×Z{ïïqιî¾êV«%%¤0P`ìɱ…#[¢, ‰1‚‚Øq¨¤ˆI0…Ë!RNDbì@¥º <-@B€A½!ZR ©%µÔÏ{Ï=ïûöc­5çÌcŒµÆßšg·ûÞ¾çÞ;UßYg­=×\sÍõßc»Ýâ€_Í|aH*xÜ4ø]þÏãüîßÿ6€ðOx¿kÿâ¯ýµ·.râv;ÑN?xÒî×üÚ_ Çë;µþ«A‰¡¶Û-nx»çõ½Zÿe õ}»Ýb à¿ÃÛ¯ÿú_ÇWüøãoréŠ÷~Hzþwpü2æ”Ϊ)/ [{véEÙà8U‚,­ßkÄüŽÉ ’î@4ÝSòÿË>zlÒ¯®‚¥ó߈Ÿ …¿|Pö긺*™.N#Ûÿ-÷Û¿¿{µÂýê¯Æ¯üØÇ¦ñétÐzYOÏýÍw|>úÑþÞ0àÇÿ…áVÆO}Þú#ø>øA|/Ûý?úÑâñŸúS“ÏP'›óé™ê@ž™3?òó;à·ÿ ξñ?ÁW~Ù ø¿ýðïþ;߆¿ð}ŸÁ“_ü»ðÿÇ/ý¥¿ÿ?ômxòä1ü—ðÿøU¼ú ¹Á'>ùi|×w}>üü†ßðð‡þÐÂk¯½†ÿè?úð ßð øæoþf|ìcÃ×ý×ã C>VûÇÀ§¾^þÿø¿>öý¸ùqàÓŸ ³ÏÃÏðßxˆc‡ïàO¾ù›¿sÆG|í+¯àÞÜà~è‡ð¿äÿaüÎßõ»p3þ&€ïæöOsÆ÷€2þ~Á+¯àc¼ß‡|ïw“3þ·ù¿Ð´ûÕÜn›3þ¿ê‚ý‚W^Ás»Wxý'xýþÇßñø^_ýÊ+øIµý«U»÷ø­ßñøÓî}þðßû{øK77ø3öÏâË|€å_…Šw¾dª³‰¼Œ—òÞè’†:}Bƒù¥j+uÉÿõË^c½X÷ çO²~êí{³]Kéºà‹,u.!ýÁð ´ú%o“¸é,¢ò›»6™È¹Y&=G=>}]?Xï»Dâøžoû¶)eþ?øþïÇ5 xí¿? ²\È|PVâúÀðÿÔOácŸ¢*âOü üe6u˜ ËÛ.ÿ^dlx¦·^ÝÇŸüt@èðC?»ÅïøuÆ¿ôu/à'å=Æ/ýE_‰v‡ó×ýr|Ù—òê>þÜw?²_ãòoý¤‹/ÃGÿÒwá…^À¿ö¯óÑ ~üãÇw~çwâ[¾å[ðÿâ_œ¶Ý×}ÝTÁêÎ÷ä¸þì?ñWÿŸ¼ÁÃO“´ÿÛü¯¯Hâßb~ñ ½3‚lxr\‚J7~œ'îË@Ô3€òq|N]pû`Žþ,ï÷2ÿÿš'ÿ AÜò1?ÍÿDMÛòñÏø8‚Oò“ÚaŸÅl×ü,èaù0«U Ê çõÏð¾ävžÇrÅçòŸ‡@çD¯ºÁ;¿tŸ 8NtfË%êºHŠòÂS pü”}˜³|.•9Ô¹t—sòCñ/H!y9ê”ÉòŒplj’çXK¹öØšÅ5ùØèüDÚd¢5rMÕÖæ*‹Í-”T¨6å—¿þýÜ/ù%øÛ?üÃoèzý×| ~ù?ûgÓt8NQ-}SA˜ß‡ŒèàlîÏÉáÒœ½ ÜÿÈìX=˜)Ÿg/“¶pù!ÚÞ]¾%æPwIíÂú­‰H#½üý$ð‰ïæÿ÷cøyzé?~Ø^‘ÝÿêÑlê‘Î{ÜþÈÍ5`6ùhIàWø¶ øŽï~ÇÒ€U“µd5ªß’ÙÏÞ„bƒÕ7¦‘Ìì A㯻µ»Bí/ßx‘ÐRÓôC¯·Éþ5MõóoÁ, Ë=$/m£—{S_{ýжýcêà±tßàXJ_2éèÀñÇBÆ*’êÇ’²´0ß¿O0 R:›çÇ/Ñ ?[À\\æMþuD/@RÿOÿmàçÿ1}>ý9Ü|†¤þ×?K¦Ÿ›'döÙá8ºWòöKž\Tí ÑvB¥û3þÆ‘9E;V¬:mƒÁ4ïÖ^hû¦L_úa±7ŠH( ôò×ÝFËÍ­í£zÜR IÇJ èc _ù‹¿Ú'ðoªÿËË^›5€Û¶nýRÐ/g{ŸÛàE1Ÿ¬YÇB„í¶/Kó_îeÍVÞï€Y³Ei´%n1•éë§5 Íæ’ýÄÒpÐè8ÅÃȯ yá¾ï¿5KýÝ}6/Óº~éO©!Üœ*"GÀ¿I€~ùÿìß>ý}ÀOüàç¿éç¨HûÕ#röö¢x>½š«v]cvööj)7ŽÎ½-7‰V妸,ˆ=$iIºŽ_üú"é/º­Ìsaäbé‡Tï³$= êÿö&ÒöFÍÐÐ\i[á¦}®"­ÉXD*úVÌ7©ù!þÞ›q¼‡ñ­êÿú#./F¹åºj²6-å¸_zé-9sõ V›;-Cª7ûk­¼Ð4³Gòýt/‹éGîMG_Ž/ÏÁZGkк@‹Ž3Ð/l¹PÍ’Æ#B¢>OkjAB—¼©lùHý ú½`}6åÌ1›ªe‹‘Øø/?D6ÿ³—yæ®Éœã©0 Î^&óËpMí2ýô7s*ˆ7âø¹¿üØŸ§Ò?÷qô,í?ü IüO‡puC/}¡qIJ‡ÚÌ6«h5Vß,r¡÷¸ÍáÕ’³¾YµT¡!7ÔRŠX½.ÎrŽ-ÿZ¿ø­½ªåÿÚœe‚X Ÿ~ôƒ-’-©'û¾ ’ö#È©]ë/ã7ªÿëk$Xâ«·mÇrMŤ –è¾fõdsݯoiŽB€cA "²MkÀú<ôLKû²¿}VÄ~.m{Õ§Õʳ.WÑrõ{`)‹>àøÝ ë–idËDjˆ€¤ã(„r«} úzhAÄñÇ@_ý.‘ñÈ6ñÉ|Óõô ½¸%ñÛäÐm€özÖÄ9|ñ } º‹ùñyùÍÍÿ“"à=0쀧Ÿ~ú{ÈÖÿÉ¿|ö»‡Àç>I/ý«GÔô°žÞyr¶fi“¸É…nÓ´´º(Ò€¾ už‘Ôµ3UX – §’ÄmÍ5Ú‘§¿ÞÒ‡M@§í–¶/í{ŽH¨>µ-YÔÉlúКó-UK÷-ªø×€"CµDõA%1ß+øV?À"!k‡¾½–ZòÖ‚JPÛäá–k!¦‹¼°W ÖÞ.íä忤Ñj¯þMSEuÛÇÏFPûJ~-1MZÇ¥@›(Ŭ«}z¥½® fç…y×Q¼ÚϦÍiVæ8Vkq›‰u~vžäÁ+ñ­õý°\³Ô^Ž]¢8.­[€=Ö).y0û•®± d²Œ…ööø%ôYsµtüS°÷Ni^,–Xv²ÔA_¢íhÉÙ-O›Ç,EU^¬Á´Yú¸Ø±-] -…/]ú“9:¶0þÒçúK…›—–—’Bä¿äå·›ù°– m–Öpf?»]®‹‘}äúÉ}ÑšýôŸ´•Ò£r­…ª¼Âñ}%˦œ†áøão¿[òmØ™sµÏ›ëL±í-aBæª5ë¥ýí=gï½`ú±Ï¹ý®ËyÚçÍ~ïKßH{>öÞÐÏ¢Œ§ô]×°B|5•\»ytp©Ù"@éåêSŸ‹,å~ÿ¼Ì‘µvع:˜ßC¡¿’¬VºQhWº—¬UÓú”íy—ö—kÞ›ßí=Ùú+}kõ7A öKÐæp-tkYÐ’™¬+EÎ)ƒHIâJp˜Ã„ìýl­^K¤$ݾ$Øç¦}^lýøiNÿˆ™ÏR‡Þt,O^LÚ,§OÌ^,;{Qe`R›Í¾ht(yø¤Ë^´Ûå8öE‘ÌŸöÙ‰5Ç[뎞­=ës;3Çε@Ó–5Jqéegü¥9Õp…v‚Þü^ºgì¼Øã—Ü$oT¡±Ç‘¶Ö𶤔`-w6Z¿tÿ.±ïôïC¡} §®íÒ¸õ\œRÎö¹.)ö%åìÔy”`?%Ê`6í­" ­;:´À’Øì‹|éÖxª9Oz½ô.Í­ $•®Ac?¨%!I„Ø’Pg5»Ý>ˆrâ%G\ªöÁ•xBüÅMª-–—¢÷—‹©5~¦oy¸…ýõ¹È‡H.ª”t·µìKÖ>ÈÖŠrʪ+°Ù¾ KÖ’@³½¤Ä ¬eÃÞ#ÞìoÛÙ‡¥dQ°/ëê^šë%² ¡UK¸Ò RÑŽm)™Â]Pšk»^zŽO] ûbºëxJ‚Ò=TêßŽÛ RM¡]‰ÀjÙó6²¾îÖ;ðc˜§|!øÿ|ûVÜ O0{Þ~¨2Šüµ‘Hà%D°Á±B -þ>°åÿä ùø;e¿cöÃnŸ›’§Î>‚’%±$[AÅ~ƒì7â”\`ßÅö½Vz^íûF–V^°ûuÜaæ)ÏǣΑ‚ïø7ÕNús k7#ç…Àf%³†%í}ÐÆÆ’Å½$ ÝÕ‹Ú›ýìµ³8e…FaÿSß«TÙýJ÷”ÝÿY&Ïj¯·k¯¾ý6‹ îÚéí–«}Ͱ€%ºž¥ÜØsXoËKû”ž£\øÝŸKsߔВ‹AŸøÒ~ö…PÒÚìÍk= ±ÐŸ}1•ˆ¯úE£·Y·¶Z¾¢~)ëh){.§æPܽ’ Ã~ ÄÛa_‚ò».#¦Ûõ¦}éÙkyW*L»’µh)®_/íïvžJÞ¥Òqmx£çÒ5]z¡Z·¯“¾—ôKÝÞKc,½´JhÉ TR.쇶ô¶s[ðïJï*] « –¼?§Pò¤XÅÒÒ´F VIÏ ”™ï%žqÅmüÿÝ¿À/Çñ;ÖÈ#+™„È”IÈÔ¹9€ÛÏkIÈ)Ê`ö+yö»xJq>…’`_zÉ÷û”G¦U`Z`ÃÖ œè˜‡æ{ÕÌýçL!#"è/}ãï~>žû”zü3Ž•+dêoÂ^µÕ×ÊžcÉøY¢‹ž¢¾Úkoå +_XEɪ\ºf¥w½½W­7«ë Øñèï¿~÷?ë[¥•7¡û‚êÃÊö\­!QŸƒõtYY±ô\œÊ›PºæöÜK4t ÷Gy+0X¡ìf]"'tÊj,8%,.¹‹¬€¦…¿Ò-ßjòò'ËýÕ—`e¹õòÒ³VS{Ó”¸y%í®$à—¬3ÓN`¯yéÅc-þö¥n)C¥y*ÝK±°~±”¸ÿúżt­J–|k)–{ÀÎÍ’µAà ¬Ö’wêZ•ç»ZÖNÑÂ,N)¶Ÿ ä‚?¥ˆœ¢èó•ç| ª²WQñváÿ*`¿ öÝ)Æ ¥, Àü½ì íì{ÀR|¬ ^âa[fÿÒókÏ æwÛïš7ì‡ã㯸ãwË~äŽ;>nMvÌ¿g åwž”ƒA轎‚ÍyV€ÑœˆÈiáOÇZjР–:`PK=GV(Ca»•JÔÝÞ´ƒY·Ô¡S^œ’%ß¶³ß0‹SáN —(<džQ¹Öø#íµ!p‰ PŠÓÏÙ’ÌXz®ì\ØkeŸûû)œ2¨[6ÅÒù@cÝB¥ Ò‡Ý.O]üg©D!(ÑDô Q¨@PÛl”µ¥,MжXkªp¬Øs9ˆ!(YcNÑ1J.¾’à_‚&§¶ÐŸUâìøaö¿«5Ør"K0ÖRÿ¬ÀWíªÍ Û½ú³.{½¯ÎÙ'‘÷úY°/;·VÉ*Ï—”³»z›J()¼ÖÛb9Ãc¡AÉÓ!Ô@û*¹¡ï25mTÅóßÇvŒ—ò¼È{Áz}Kœõ’7¸3Ûå¹[›u ûÞ:%ð[ý©÷…æö»îxà-oƹÃQIÍ@PRšs$ìg~açLÛB3¯Ã± íH˃~m°þȱuÞØ’å(•ì»Ï¾#% z‰Nz0û—”Ë’%ý®‰,ÞhÜWéi/§¤ëïpi\bõ/År-É º¯%–ˆž[»n;¶%OöÒœ¢Ô•dÏõ‰~&EÀ %¶S!; ;à’U¶Ä!^²ê‹a³)ؼy6Ò[ÓC¤ÍûÒ®@gÚŠ'@§³Òc(¹J.2 {-Öf?ûX*PI8•¹©ä.²'»¿&OÑHìøm€›´·ç³t/.Í¡¾^Ð'׳Äá³A@ëê³ÔÙ©šÂÒ9žò˜éãê¹8EÉI'Ú•î û?VòRÉ=°-ôS²øÿ(**Þ;ø_œøý?å¥}ŽKœ|ké·T¢’ü”°U¢àÚ÷™G0–|»>y, Q¾%E@·b ÃèoŒóø=÷“"Ùc /gç‰ö£Ík¥øýWs½¥[º±ãµ¥ônµë¡/qøO ‹Và?~ʨ[òNÙãòXäÂú©{¼Ô—–ýìõ±^gþìù,)úKq–%OœÀ^s+ÀÛ¹(õk=%…c¢žÒüKZ^8ÑÞN€Õrí Ø‹ú,jþݺ@-/L îZø·!ú¦Ð7ésÕ4£’EþY–ê¥s:å²³¼Ñ’VX Ú-Yƒlðr©ßXè÷ÆF”îR ¬~°[_g+”êy_´—<=%Ø—½l;%ðZK{‰eçxé4NÛ–²Ø9*Ýöå[º—O=¯UЯ¨8ÿàÄï’—%ž ”ù¤)l/¥Ù†ÙÏoòLðÇCvÏ?ˆ@/{äŠg@¨>ò{Ç’OËÛǬø{ΠÙšßmhûx õœh)A½‡í¤-€œ€‰‚A” ±þk ¿¦úÈvù6HÁ­4·€ý³Äª°×'¶Û8ûm±TãRºò’ðjQêÏú)}¿OÑÀKqeÏ¢§jy@ß»z½$ã.õµG‚ÛY€l%Æ ë›G`½?w¥Ô ¬wÈîßœºvÇSÜÁSQ¢wøýi¡tÉúžxl÷ÔñÌÉ¥ ²V]{lý€ë›¢8)();wU–JŠÇ©Ô¶³îä’+ÐŽ³¤Ù[¯ÐÄç4dzç[º7JóXrWÙ@o­íjî¥cgúÐt.ûûͺƒeŒ w€íôTð®]/Qà`~¿åj7íJV™½ë®ÁÃUÀ¯¨xëñ{ Ûÿ/íÞRûJß ’a¡ä½¾eä^PÜ|`¶ôwƤ)ŠB{"J±“4/¿°Ÿ$ Ñì+ˆ\jã.¬ÒT¢‡Ÿ’}N\ÇíJëM©PÈ©(~+TÚ|¦r¬M?¶HÉò Be)ÅZ{=ó!æœÐrÁ²ùŽ/þRxæ>ôÅ× ƒn_z€KYqì—^Ê––qÊ [ríüKýJËe´…xJöëw+ 䀖ÇmSCZXÁ§ôð,¥x”J⾓þä Ÿ¯ÁñÃbG Š€”©–ù°/QÉ`ŒSv Vi* …Vh”¥UÊlûSµžkÝÞŽë”õØ §%á)÷Ù]SVjªÏ³Üt6hXÿɃ./’RT ø*}`KíN½0NÑÇ,NYì-ìñjÐmEÅ;ÿvaû_àeàP/Ô~Lœbw¼nvoÖ›nùwgzQ„úã‚pد—Ùßy~WRâ8ÓR$€}ÇGÌ9þµGë8@˜ýÕF©~MˆPªÐ[¢]–RF[E¡,|йp×jÏ©°<ÅsX:Z)NEä¯/WÇü÷}mö+A+Ò^Y(á¶Í³æJÚJaÀŽ•À)&Æìoû³ž:1˜ïÍñ,íÊÎUɘjã+­ ØXÍà”UÖÞtV¹+'qÉz«f÷_€´æ%Ê€å<Éoö¦Ò|±%@o7¡Ý´òàk÷†( ¥¢/–›_z°›Â~‚?ܾp¬VZ ê=” íJ°×Ô* ö˜ ë%k»V<´ÛÖf ’bpÖ£b½BrÎÚÅgƒˆ%N^ÉûaÇ~ ¶u'[%ÌjöÏz©êíÿðŽã©¨¨x÷à[å?æõçx9åŒWyøeÁ{ qÁR¯÷ó…ýÄÂ/ûËño)üsÊÚ–Ç 0È9ò<ø@c2÷«-üò®pôÍR ÔúQÊ sWZF‰:{ŠVZ¢ƒ–²Úe‰±0úùba¿Aö<­Y*ùÞ€¾á¿ˆ×ˆÚýƒ¼Ïë¸MýYJø"ÅaõߨSùú[¯Ï³®E‰coe/[ðËÖ€’±_ñÒÊN¥ø‡Òw¿{-+D–²{XM¥”‘Æþ^ÒfKž‹’â°”ç_ßàK¼sMë°aùÝ*š[f]â7fi]‹’eüTÀç© eëuµÚ Ý^*.c¯ak–²ŸÜÌb¼9åűÿR&§g¿-þ$}êà섲§aé^í¥Ê¿:”î/bù%Q¢²Ð—ŠS©_KÔ£‚ŠŠŠŠgã7Ù ,áüe~ñ~¡ˆ?<¾ ø÷…*UÞÄH?g—´ìVdÙï÷ü;ÌÇ™òü'5.IšpTXØbÔÓrŽ®ô+Þ1io€]jpÚ@VzgßÕ3`¿ö{^Šû²(Åâ•ôSTbÛ®Ä\(Éšןä>> ’9¾ d)ÿ&ÌòÙ«  ì#fÏÀÒyêX`úKóg Ç6ðÛRƒNeT*#Ôq–æÈŽ­”>¿dL¾0Ç›îÑ?ÍÇ(ñ¾Jç”VëNl· Vë,e'*ñÌõ¸—¸{Z›µãºoy襋'\Àg äbYMÿT(+Š[ÈRn‚ùýTà’Åfû®°Ý^C9®Ím_dV(•í’öjÓ«Úk*àú›b¯½Ý®‚%@‰Ëi·k«ÑRlÉ)+Ωk}J“?õ|V¿¢¢â­Â_â•êä+üž¥0áþ[‹¾(v] ýó1‘,ûm7 þ‚ L…¿rä€=¿óóœáGÚö H[þu|ÀPXŠò ¿ŸöÛµÍ~÷E³†²S! û}<õM°û•è¦%+sÉ#pW/÷)†Ý)¦@¾û €÷ƒÛ^×c}uR ,D(ѾíX—b—æø'Úëñåè§èY6ûTâšfÉR®ai"§´º’e³ä¦²•‚KÔ]­áÚ:¯ƒy$¼>oúÕÝ¿ÕíØO k¥ŒG¥›À*  b©0¥ÂY%޾E,ìWÊjTªò\rA–RË•Æa*¨H”:K ZRO èö*åxÖýb¡ßR%û<Ùk]òXüSTTTT|iñ-òB:/¿ë>-ï½DKIß¹b÷ðd¹ç¢¤íy«$>ÎDùñ3µÇ*‚YðO´¿Xóµ¥^§û\âúßêåBaÖV2¨•Ø‚’Á¬$lÚõ%jìÒxPØnyï¥ï¹=nIö;uü’‘÷TZõºÝ~$ø>}__#…Î#}êX>+ ÞEyÑ1¥kp*»¥¶ËïV9<å½)ÍuiÎNÉM) ½8%7Ò] ‚ ‚<¥A-i2K‚½~JÑüv]G€‹Ô1Jž+ˆ—ÒgZ­®÷PréY¸”¿weú)¥ˆ:•#¾TtÆŽ«T\B`ƒ¡K‰?fûUj‰¿ï°,0/E÷ë°¥}t0°>†´/åí·ü©ÀïS÷Žà¡¢¢¢âùÄ7>áÿðò»_ ¥þBÑqR@Ò‡ò 0¸þ üÞ€¼ô²fë¿P´ð¿Çm¡_ämý×ïiÙ× ëw~ƺÂ13@`ùßÖXú.œÞQ{ Ùÿƒ¼ øîÄ~§RR—’m”PR,ìy½ÑÄKTâÀ§ùÿŸ0Ç´ÙíJ2¤52Û:v.›¥´™zà›áe]دtñNÝìÖMVÊ9¿TT+4Ü+|þ³%`‰*$VÝQý¿ÅœaF[‹KÚ 7}—ª/Ús³JU)o¯}” ‹•”¹’‡ÁZümJW¹)íµ”8¥ÌQ%…ȼ”*êù–þ—‚~K<>¹'ôË^+€-ޝ¹(öE±ä<•IÁ¶û¨¨¨¨¨€oº:^ÿ›œýgŠ0îåq`/Ç(?cž¿ã:Ï¿Îä£×f¿Ç1EHþ?àø[¡”b ’cjØïR)e¤¥þ–<%¸”ã¦ý©ZL§(>ùÄï% $ÿXaU~ï ûÙóµ†ÁR‚—Á¬ë¾K8¥ÅÜ2ÚBÿ%joI¹*ÉKãÑso•ÂÒyN”ìO ¥‚éØ «¥ÒÇ+ÜI»ËÂÀ¬Ëŵî:¹(RLkïz¬UXÎAsÆd¿Ç®ÂhªÇ%piÉe¥Ï¥TùÎZöCa¿hö³ÇÈ8¬Ò&Êœ­7 8Eí±ŠUæJî4{oØÈõn)¸Y_Qò–ÿÒ=îúYrÛ}ôÜXåèÿ‡ŠŠŠŠŠ»@+çø¨úxÉ»[ÿœ˜æ÷´Öc®¦—Øv"ŒêO'&߇Qõ ”©½ö{fÓmÛj°Vx³5šÆB¿¥-§Òq¿Q!ò”"p*^TP¢&•ŒÇK´·Ð®Äý—ß´ðm«B[hÈ/ô-²‘x–JÊÙ]3#¢MÛsµ²YI¾.QáZeÙrÏC>Þ¡Án5ž[P¤÷ksI+¶VaA‡å‡N¶¥‡Òáva1™ì%˾ÕÎt šÍ1\>Þ¾–À&¤(6¨fÝjè2¥¬C¥ ~Ö‚o÷Û˜u»ŸÀ^cû¢(Ýt¥›Øž¯i(Y,Dà×¶Òkí\Çè·æpÊmá°%j¥ŒéãËXõ½ñ}x6­¢¢¢¢â4n2ðo¨œÔðÇøE;æcïíRñ.-Ð ×_{ ô;<™ýô{ÝÊ@Ú ¨aé%CàMõ|Jƺk"˜~JÂ¥UJYûJã.1JTŸ’ÏØ®å¹aáw¡ÉqKÉ?, \÷£eK¶Êœ¥´Û±—¨ö¥XU»¿U4l*öS×`R¿sCmm©î)G8x"ÄÊ„£g¬Ý¥ .V‹µšI ¥)ñÌJ´göu áDéÈó  õ¤ iÚu:ÀR¿gø$Ú[ö€d”Š–Z¼Tñ÷„ ¸xME‘ ímüèäIa3áT[Éõrº|ÄAîæA\¯O…>¸ßFh/|Ñðäe?gú‘qÈ~9Ó¶ÆTþJ‘-û‰ý@¾´-%îÓÑ9ËvÉ-œÓ,ð;G‘ûœÖG^/¤.³sa‹—Lç sdæxÚßÄiLÞ;gf?o¶ ,uÈ>ø6pïͺ½©ì‹IÚ•ò‹bq(ô'üÎSô. ¬·K&(IåfBú°ãqüæ|ÊïL|œÿ¾À7`þl@Jþµm=Ζ:˜ßµ‡ª?+h[µhKÙK‚KûS–ÿ+à î®ð»¥àXáÖ ¡®Ð®Ä{/U Öÿw(+K¿üß^Kmí×ýËï¢dØÚPVÖ°JÛÒØõ菱Z˜ßKý”²•2.Þ’ý$½–!–×EÈ*Ðd=oL‡²Ÿ?ÞÏÒYšö¸Ÿh< ôãvÓ‰—køâ° ß*©5é'¹a—ϼ¿W>‰¯†gYJ³Ðî4ݬ4ÈØ'…= :"Äz¼ñ²H?]w<‡vNåšLJñ(4’#Ù( 2Ç·4iÞ`£íƒmoâ’Æo);Vð·Ç—í‡BÿÖK4Ûl/Yt°¤þL¦9Æ ÿÉú'|ï&üÿ ~€¯Ç,üßìXê¨ nÇÚ6Öóm…²Xhó»Þ`ú±‚v.ìwŠ’Sò$”‚’…ß~ÿKÖìU§DQ²ç¹TÏÈú´Üþ§_C,þz—” pª¸i)к ]øQh'ýKÒ,Ïaç¾i(Â¥©Á­™ïVÙÏ›L7­C3â†÷sS—û¹å`މ6$¯ú×ûÐÒÒ³êæ ôã1÷ì%ˆ‰ïYö3ÝhRbÜ.CžI¹Ñ7Áp˜•ÙïhÚã9²sï-áK¼3¼ŸôN„å[EÁö'wGg(DV°/;•³Öº¥JÙ•žU¢\kÙPýhß’D?xZ³¿ðóÃþI?ŠŠŠŠŠ÷~œÿ_ à+0+p; °¿® =Ë C)Ù†"­§ $T–¶—„ÈÒ~‚’§À~·K…ÆJ|s›Òö[Zba})³G*í¥þÏˆÛ (|¶_˜¾KJT)µê]ëYÙê” *ŽÓf’,ÅÜ6+Î)Öâd¤;Q:V)lE>oÎLúYŸŸÀ`]Eî6ÇýŽ;±Å_Ê‘‹€íÍÝ­•×e?áøË¹Ë܈²$í²y"CáHû¡à˜”2¥4ÅS¨C§ÜV6¥kIÓ·ê©Rà¢èથU4{úu€k¯‚¬û?ŠŠŠŠŠŠB| €÷aþ.½¢ÇÚÂ`Ö"®câ¬B —§òÞ—(9%¡2覟’u¹D©Xa·Ô¿—x¢;îgÑX$ˆ×ίæúg³OR¿[O@^h¯ÈGçjƒ„õ¹hÙÆ¡¬Ä•¼¥u/ik:ØßOÅkL Ž©3"|ŠÐhVÅŠ= ¯2é&[þ=ÇL)/à?y ,EÈpüƒ ovÂñ×AÅ"€{`µžo§zVB"á¿á‚9ñˆÇ@ü"Ï €s4¾éF.þHíEY²>Ì\&º• ¤Îê¼ôœÛ9›‚‘Óñµ †J”Óq?ÁP‹l?B’Ø„_WBT—æÖÍWº™K)­J– +à?+Oï È¢/ë¢8¼ ¢÷TTTTTTœ‚¥ } (ˆøæ¸2àX`•Ø½Ý ]wåò—,á¶KÙ=e­.Q†J»RlÁ)â®ÁÂ¥üÿ§* /Q„—¬÷KžÙ#`5žå Ðÿ×–w·ð»¥EÙÄ*§®¹û’²VÊT •Ì1Q¿Äªãˆ)Š„§;>ÞDSÙ¯çÌŒSÈ ®ùð†ãÏ3êà[LY€l¿ò7¥åýƒPÒñºœkTó—¥O§”3g¶èšäÓƒd,ó“GÃ̵U’&êPá¸R#A¹íÝ&ІHú—xK²ž Ùn³ •\¢¶ð‡ µXô(ìü('ÿÇPQQQQQñÖÁRH¯AÆ«÷áØÒZ¢¶–íRЫ]/YyKÂ_©Ý)Ki¿Òþvœ%ª),µ×òÀÒœ•< úxš¦SšSË0Ðý{,Ÿ§Ž°sb¹4–£o+øžRÞè½dÙS µw"„Šð(ÛmJK*mZÎÉ2ÏëMaÿ$T" *æãY!Wþ#Ö牞bÎXïY«K³%yV4ržSJl€¤ýX1Q‚¯Ë8Š˜ŽaŽ+ÙN%šÕ¹bÞ®çÂr÷§T¬qî[o¿5÷F°Üþ`(?öZM™šÌœÊx¦ìCR§ÀÙÄ“±cS}é.½0¬…ߺ0E˵éÕ$§ÿ?TûÞø§¨¨¨¨¨¨øÒ㓼ÜaöÀË8*O ¼‚uö”PYúþ–úµ(å˜?•áÆŽ#ú+Yú­p«—\½4N#a…sYÚl=z)ÿÏÀ¢wD® v…~n3Kô­Òœ”~ÇÛÝõ4+¶Ì7FFÍœòù›4 S%`-ÅòÔ§¥NÅŠmcÄ‚/í=o‹q¦ûLž}òùø‰°®gÌ…Ùš}Äýç+/ÿO#ßb¹Y)p·½ ²ï‡Øö¦xó„X€7´§)FÀXèƒܧkhR²“â5ˆI~GCa…gò⓾1¶š¿å.ÂlØÊŸûü'¨¨¨¨¨¨x~ð)³.É*ÞÇë¥B\0ë% ŽÍ¾ÓoÉJ|*[P.ôc=©ÐÅ) ¥@•¸þ§¬á0û[a‰Ž#ÖùlÖí\[ŠñÍI+w6STÉ"_*VR¾N)a¥9;ÅýŸd2Kk¯Ð'jµì ]„BÈ:ñÁŒ°i+þŠG`RLÌÁ‘*¹zÂØšï¸X—Í¥?‹¦ú„…”›¸­¬$-èj%Á´ŸòøK°,Ïé$p›8kÉŸ~ïŽ÷³x@}+>¬gÓNàÍÝgS²B):ÀLë’ó[š—Ž‰PÝÞ òµÅ.JÕëþ/GnSÿŠŠŠŠŠw¤¤-Œù /­AÌÂZ“%·ûÖô'x–…Z·/ “§‚†OUöµã8E:%Ø?«þ€S%ZŒ¶ÜgµÌ…ýíNQ—æì®^—S”Sǹ+ÛÂŽÃÎUSâ‹‹E ²5‚»U&ë³QäH£ñØ¢X’&´1qäwáäõ£h9q C…†ÎEŠs%¾[„䘸•ÕÌ…@¢DÄ‘ÿ¯Ûé™×iBÕX% ]-WßÎñt£•ØVߢá¸_¹&%È\£\èg¸¥¡þˆÒÖšk›Âñ~Ñ#—ÊN‹ào—¥¼Øþ /ï\<4ëò=ü /KÁ¹:(p[‘8%°Ûõ» 69G)k>KÁ»%ë¶Å©ØÖÛáv¡QükÓ~Ú _9†—¥ùÔ©C…êS¢-͵õ¢ØsžbiÍv»<å=*—„Fè’‡_2ÇDÄUJMàvÊJ[Œ*+òäIàuQ,Dȵž[ wƒI¨>bë¨:¸;QXðOiæöK/ù Šò£ÏM(=)²wBÍtŠ|láÔó?rÜkƒ»ÙPmn]u#°KMKÝñvÎMÁpmlæ)ÛO8îOÑ*{6[g?ÐŽ÷“v6ƒ“¼±J®DÙþ§›ã¡¢¢¢¢¢â݇Ǽ´Â xJ‚õÁìw*g‰[_²Ûº§ ¢êXÊ’¥ü–Ò†Úý­€¯-÷¨ñ,ú‹Ã¬Hè?½ï)+¾ž]1øY×B`‹£Z½D+Q‡NUK^³F3 ³FXA\¨9x -ÐI$f0ô'¼wæÃGCùáW< Ñ”ÑÓirž=Óo:€—gZ<5%r%a? þS0pš•plû ¬ê {ò¨;ÒRƒ¢I«)Þëý˜ª1›«ãL°Ì±Í"d-þ·l‹½eÓ®)йÄC Uœ§›V™p|ž‚†Ó Œ·ÿ缬EEEEÅ{ Oͺ¥ š- ò§ªÃ¢°©²ï]c,Jõ ,ìøJéR­ð*"â’õÜÆˆ¢ )AbÙ·1KÇ’~´7Bÿ¬–¡°¯ ›ÆÓ*K%…ÂÎY)è×*o¥òfâ«!T„ÊÖd¬±¼u +ø#6&X¯­§a* æn/'ê's0pÎ$” }ljǀó89îG U(gâÈ'uw‹ G–½Ràæýtq3çE† 9' ž”*snnŸ«¾ØÁ³ŠÌåDű”"¹9 ½ÊÖ°ÊÜ4LÞ.^"ëHŸ¢x$d>þ0oÿTTTTTTT\óòÓ¼ü ùý”`ŸO´/ñÂOY­¥€ÒÒ~6ÙGoÖOy`Ú‹/iAu¯£xPsû=Žì´·`z—xõVÀÌv˜þOQrNh—¾m\„ØÁm\¥¥•èYµüÛJ½6wý”òÒ·‹Få!u4•‚§¢RãqÉx„òsë‚Ifs,ûá°eaž+ü¦D‚}€²ö«+¦…ø¨îÄtkš‡ý y>t11`N÷Ù®pT`:oöBØ`ÜIÀæ¥x1,J ‚»(ûíñµ’9—LN‚)¥«JOª? þ&-¨½Ûì5ž<ÖS JdA!ø_ŠbÂýþ*******,$Îf²!Á)Aþ”¾DѵÖjÛ'ú»«å¿c`i.άkJü^ŠÐýÙq.¯”QH¯gÜV¾Jô¬‚ˆw«VD©Âoi.m%aQÆý ©áÎ ìŸ{aÔÒKD¸l ?ÁßòÒE¨µÇ³™f¦ºÊjž3ÓpXOi>¾ðÿV D¡íž}Ú½›³9ugÇ‘,õ>²’¢ú¯¾o¨¿Fqçs¾}®SVCý™.®Ù.×¢3›·_ŽÓˆ‡áü¸_«xØ:6{ÐÔ¿¹¶"àÛZ£©ö<ŸïïaÚ×OžJF[QQQQQQ1agÖÅ3ðŠÙ^ú¼ZÁÝ ‘§2Åœ Þ- [A…þJBsiœ§<:§ÃmëºÞ®‹|-qú-¢Ùß„9N” {n§›íÜ””9 ;¥ŒN6ñŠ=^3åŒ7Ùy&*ø,ŒŠœ wìßžºoûu,°·ŠŸÌÕh³&¤9ÀéÈ ÍšþŸ# ¶Ãfž‘”XhIˆ‘„Uáú‹0qÿÕ~S/u5ŽÓ‰JÞÿ£``uî“`ÞÒb韲Ù@h¡ôÈe®Ö­Š¼F 暉§`òXp?=W è§|ÿBÇ¥omú1AËÞÔ„¸aRão{LËOVÁ¿¢¢¢¢¢â‹†Ð=>m¶˜—%‹¶å™[þyé÷f» $Ô–¬Ð%ÊíW§·A¿KY|´gÁÒ~n óöœlšPíYn{–æÞökò¬³í\Þ5ï¿í¯¤œ D1h„æa«¿Ú\öÎô8Y}YhJ·Öe˜!~¥=o7®Sfé?,/% ã}¼Ü#ÍVb«ý8@;ö,øsv ‰@šùÍ{zǶ5-»”"Žøù¶Bï$ ó{ž,éOÀ!ýš4œ“G@ q™¢mÙ¨Ê"à[—¥s úýq6}¨åðÛ:²ý7?¢åç«à_QQQQQñ¦Ã”*ZwKÖæSÁÄV!€éçTŒÀ)êü>ú³”ŸR¡3˜v¹°¿-ôeóþÛzº/݇ÇmAý®©RQX/qôO^Ëñ,µèT•f{mšI(ä=¤²ocL§‘šB`¢J¯=ŸÃ$øËv¡—X?‘½ªöÌlÒW­0dLuèìBC©> g¡È/"-Ю' ©Bƒ²öcÎLmÙ79Þׯ= …”©·²ìG_H-íG“‘IöÁsqÜ^ÎQ*‹¥>™¸ «(ØãJuç{þGŸ?>ŸÇU𯨨¨¨¨ø’á§ÍúWڢ؈8Йu8jëI8•¢²4.+ü¾@»dÅ/QŸDÀ×bмû%,åç×ûÝ5^Â÷Z.¿;{ \¡Ÿ…º¶G°ý6Ö*âœö3JðJèc²¸Cs¬ÄñöïÖòoa…éšz–ïŽûÙ ½ÊÍD¼’Š_ à“aôSÛ°¡™‰s>®" fAú°;^.þНz¯ªë~DÁßV–)’~E·Á¿²<,÷gû+ ïØX¯6ë"”Š(g-ð§¬Ê“ìÈK+ Ûö¥ª¸Ò‰#ÔœQý_¶Û =bñö8Nõ¹`k…úe!Þž“¥ é9Q³Ga-óvl2³] àw¦}É‹21öÅ-ürËS¿x@Ë›+>Ðý…«Ìwôl£Îø¶i÷ò¼ÎõïÎŵ æî‹ãã4{¶ôs°+uRUëš$ß~`áÞ“Bš.ßÃnèÿA9¢¼§(æ4ãf!ñ¬G 3t¤¶› ‰ÁG^² ÀNÒò¡Ö|•¬å^æZ~…ÁóZˆÀ/Yâ5Dð—u9žÄqHÿVøeCEEEEEEÅ»Ÿà¥("ø—‚xó» ð®ÖìSÙ„D˜-Å,ÕЖ~MeÒ¼íYˆX’[îg ñfEb)m©ü•â FÕ/@Êp›9?,ô­¯eÄ žšþ]¡Ÿ[T¢Ç¿‰~›¬Í¬ˆ"Ðm° ô+ë—rfR@€¥ØÃ^7Õª¬ / €,׿ßr&Þy`uÚl_ÃÕ§½8îkÜÏë¾¥ªYb¶w~öø蟲bÁ¿GÎ*W]þ¶8¾kXǾïi]‚f6mæ”~SN™·?yHË‹ûÇí¤â¯ô»ëãþd½5™š¦¯Ï!ŸXûçïQ|/OåŽ/+e¨)ñÔKVðSÙ‚´¡ƒ}åØZX²ôkE`‰êã ÇÖt"Mn ð¥s´s&â5‹n·<‚Æô+í,£(m½.ÏÆªz£æÙ 3·"9,zIÏ‚ÿʸ¬à/_ îÀ\ùË9’l›5 ýë´:Ú%¿'“ø›51-yÆГ"2léoÜ“²à[`õ`V †-õ7Í"kn å@ßÙ\XKPÞ.ÞIÇ)…º„Š#y™cac ÃÑ—íÖc`«+o¯Ž¯qü+******$LJ [aQ„ÍRá.ë°–þXX–^­my)ˆYsþ°/1Sl˜}ôXDAX î-1á%¥ÈzAv¦?ÛÞöo½–RT¢ü¸B»I¸°j;н¢ˆzg#@ìöé®`Þ‰†a–b¹ïØCгùüð˜ûe PwA§ãõµYѺœÃ³ŸüE!p~.I<îç¿ÐQ¿¾¥~§ÿiÏèO„î¿NýK1öØ;¶½gf™§ 3ÔŸ‹øw‰‚‘°y¶ø?þäñÜ?üÌñµY/Í ¾fO_ã_ñc¨¨¨¨¨¨¨¨8‚ Ø4¡%K½ˆ16­§`©@×JÕq—(E"èk«cú!/Ãf•_ââ[oÃÒ¹:K ºK|Á³æÌ¦lµœì8­ÂДAƒf½µø—F.#º•å‡ù&I#é‡x]Ïž‚3Ž:nVÇý OÆŽÌeJϰãäýûYà÷™ç™ß/tA{6{„ä^&V2y/+Tœ#°}HÊBÇ·^`e¤»¡õ&ωè:¬ƒLYzDéº>žªÀ*÷%+RdM¨A/þ -¯ÙÙâ¬ó„¯]ü+******NA‚†Ex÷¸- ûÂ~%Xëw©ª­MÓ9ú²àµÐ®‚õqm@±õè±-)B¥:%JPÉËa«pØx‹÷ßÚã'k{±2KšÏ`Ó~Ú,>§<¢Üä¹_~ˆ–B Œ ‚ƒm°()²ßÑq&a]k<Ðégõ×°à<í{¶þì÷iÙâߪ”?ÌõÉؼÀ^V’&ógàÌÄ3xQ^øT’$Õ”×Rq— BùX1‹÷ ·g§É¤¼ñ©_=¢eü+******Þ(Dø…¼,Ñ[J¬pk¥¶¶ã’uº¤0ØÂ\%[´E¡^ 1ïzs ÷_‡jxõ»>f)“QZØiiçÎHÏ·j6Jq(lonþ2±"|N¢Œ=gZñÓ…úî›S†&.%< ø<¶`”´øV—1&öÈ/SåÉÕ</E9ûðßBEEEEEEEÅ[ ,l…O[IX "¢¥þˆ+¶ãÑì/Bºåðs²Eô¼Þá˜ÞÓp›cĜ߿åßælAZÈÖõ"Hop[q(qû­8lKS²ýÌöRÚÑ“ùþM¿“ARRJ,@” 6Âr1eá‚¡äý—3’M¯Æ¹1mgüå—›3fþ‹XÍûk’pýS}^ä Ý qôÏ?€ÉЬ9Ýç8gH18' Ùž%V@èRæj‹ªÌÍDzðçPQQQQQQQñ%…ĈG Då±Öp[å¶d%‡é·d5—>{ÜæúËv¬­ëÚú/ûÚ _MÒ}èqZ*Ž‹8U 7ûÙÔ¨VðeÉ þÖòo©G¶Œ×-Üôedb̶Q öªö<¤u8^NûñvìZX=à3PŠCÎ$4û¸ø )¾¡Ó¹ù,+Ý|za \> >â;Ø”ßÿØ=Ö/÷?Àõvóï65Ò°¥—`àõ‹ä hÙ°~”‹ýë´Þs —¿ŽÆ*–~I*JQ©êq aûã«”GW÷ìÿ„ŠŠŠŠŠŠŠŠ·âE@„Í Æ Ã¶Î€åÇ[JÑß^ üšN#ÁºbÁ— ÀÙü.–}9F™RÕ·´ZRcöØs¶brÉòÓÎ*MB—ÌR¶Ÿš»É3põ›é·)# CÒñß öµ”Ÿ`Ö§Ba†ú#‚~0O€,E–Âa¾!!zýÒ\xš?â ¿½P…Á8X<93e‡cÚ Y÷e=ö4ÌT¡Ãc®?fž @ÇðÍLˆwBÁ”â”çÀÒœöìõ‚xAd>ýý´”|þÏ%¾š—Öz}WØ cúÑÔ [ùW øA­Ëï¥LC6=¨( Bÿo‚MßY‚õÈÒ劽4W–R´1ýH¿B:•u¨Ž/uº$E¥ôl¹þ¢¬ =7<Vðw&@¶1õ¶ðæ%Vçöt)2_f©Uá¯ö ¸·&á_úoäK²ÒK%à)¨ü‡Ý\lä À¡ „¹0+’æSªÇ§mYY¹|î‰wz’´»ø-E1¸Ï:ô«;ºŠU𯨨¨¨¨¨xÞñ ^ŠGÀf¨±ë–Òs‹MŽãl?%há=r? Ç´KÖz%.½Þ§1íJÎ%¯‡­\ª`û±íl…¯(ÍÕ­‚aSð¯tÄ*D»)ô m„‡äºOf]J¼~`!øþ‡Ž÷Ÿb¹}{ÎÖ÷s¶ëœÚs³bË?çôHxß¾6Wö )‰/£ÍÔœ×È‘èFãöñÍœJT¡ š÷q<€¡öHðïŽM÷¢ˆà?Íoß/¦¥( ÷QQQQQQQQñŽ‚Pƒ¾Âl·Â± t…vò[0,âXà×BºâuïRA0à˜d÷}–APÄ­â€ÂïËí—¥0ñeÎÆB?%ÚÔ4®¶PÅa*f-þ¶˜ìß²‹ 1;ˆ`þ€–6֦Ȕöà ¦|ÿps¡/©Ü_“`Þ² ö\ÀÏ @XÝå|,©ø+ôñ4k²â·çsÞÉ(”ó¬øîXˆÚ_(@‚ýÚ_ÎEèOç†ó/ Ö㠮?GÃü½ŸBEEEEEEEÅ;Ÿä¥Ô°tbmõç_„q›³_k^ û¥ÐU¡üxÕ¿î[¶—¸ÿëI( à…qØ~J…í\Úº6«ìߨ!i@e)éA%·ü=›åGÖϸ+¼+\~KñØÜø‚ÑðåOq³ž H<Îs±¯pÌÉ I$Ø Äòº™.Ô¬+û`ê 3ݨY±ÒqvLjV46‰78<ÁÑmSòH²'?CÃþŸþ********ÞM:’ÿÑÒ^ÎMûXX·½JI#Š€´×K>T{M™qf»õHèýJýY½”¶³ `³úXXA_¤â[uVLñ¹ùÀê×Åî TéWHLk¡ü° /¯V€¬‹Â Ù¬"p´žÙšî8Ï¿RSsZN ª§^ªÃÍ9üE`w@>›½¾á¡áv& îb®2œÕ”¯+O~–ëhlRfÙ}MjL•‚)è×ý–¿ŠŠŠŠŠŠŠŠw3„è,Á–/(ñì—ê@µuf][þ3æ"_–$ÃÎ[òý{Üö6XAü”`nÛYU¤Ž‡fâÌͤÓ¯Ec-þ"÷ʺ,EA˜˜B¶ZÃ(ùû%“Íãã#I¾¡þt&Hx²Ž?à`…A8ÿ{ÎãOÕ pž¢•%ësìhfô±æLAý5Yç›3²âwäYؼH¼ýÌY_Ç=g :ç_œ H{ nÏØ‹ÀŠÂÙ‡0y/€ÛÙ8=¨û–¢¢¢¢¢¢¢¢â½ þWy)&ÕŸà¥M@ Wü j˜ùV­[€Ëfù“8‚¥zZa>Jñ –»_Êdóûë±ë¥- Ö›þtã¥ã&Óÿ­JÀ²E`Ãþ˜AFfUñH4‚ùÊH[Cõß ÃG?ÇÛ¼DËóWH¸Þ¾JËaK æö7kʨ“# ï¡¥Jf²ž²þ»†Ž×n(ßi{6÷Š{ö›yìÍš„ýfÃJë‡B `Ü3‰Ïió"ŽÙþˆœ`î_©i}*******ÞÛø¼ü5¼ávIŽ‹d9*Š@Vû/ðŠ`oƒ~YQfÝÖÐý¼­Uû·©8VÐ/Uê=Åá·ÄúSû[L1¥à_Q ¤Ú¬P…¢Ä ˆÜmU“)LY²ý°g@›÷Ê”óÚq»Ãcêüì%ÌG ¤îta¦ï¬ïÏZKŽLñYSpI8êÏTlKýž½Ø8`ÿˆÚ\¼B%ÉþÓ¾Bã]]RpbÁÿ„S‹îhÝ·| 0èâCtã ©‚EEEEEEEÅ1>mÖS¡MÅieK):u@ð=F ÓûIë °Ç³yùKÁƶè™Ý^‚-øe)B­Ù^J/:Q€¦4 þx}¢±Ë™Ø°eéÑ’“„#VoIm)¿ %ÈÖ°AÄÒŸðæ7/Í);}˸`Ï€ãàÝí/ëãž„ööŒ„ùqKÕ{÷¯…Hbb¬S;9qßP:Ï©}ÈÂï[VZÜÌýß/¦~O(;ŒY²üTTTTTTTTTá§y)iC—2Ü, ÒÚrïA¢hâý¥°ö H€ø*@´¦‰À¯9–N'*ýŠÀ]¢â”òó—¨Dr¾"Ø…u=Gú8¶âð”HŒæ­Ñ­Êf¶¶ð™ix‹lÄšP{VŠNÌ‚½]Z…à(˜8“K"' JBöê ï›—•åŸS‚bdÊ+y ¤6Àæe:Îî!YÿÊ~÷sаODWŠpxJ¡ {ÀõsºÐ—¾Ž³ uô{âÛ‹ë¸_û¿EEEEEEEEEEŸ ¾æum%·–y p›†£­á6ˆ×Zàµb AÁÖB¯iAÀmÀmJ‚ySØßú*ùÚ:%O¤ Hp¯ÈÇ‵øË²7Ëù}:C¶ÈKq,›ÈÖ°u¦@Ù:ž—ã»ya¦ü¤H4üµÀpŸq¦þŒò} CXÍ™„¤b°ó4vß(¥@Õ…ó¸÷aúMb äV¸ùÜ7ü^TTTTTTTTTÜ ¤xÌiC—¬çš£q›³ùO(?ZAÐDziBe»üf?]'@ïg©6"V‹Å¾TÀ–×ræw›.4™u}.Kû D|oœ%@YUe,ün+ÜRAxG[@¡øL3d.«(z» ÀýÌ €¤A…ŠŠŠŠŠŠŠŠŠw>cö¼ ˜uvÉû/±"èëàߥõ’ nƒ~KY}D f›ÔqJŠ„µüÛ a[Ÿ`igšžs¾~Éão-ø²¾cAÞî’Â`²]~) f „_Ï)ÅÁ9¢ëäì¬ÎD:{Y)~C{AmâH™ú£+ÇpxŒßû_ýSüÉ¿ñ TTTTTTTTT¼ûðˆÿ^Å8ú&§HKœ¢ ,ÑÝ ò%®¿mo“v–<öwY6·j,øK°¯åô[ÞBÉÞ#–}ké—Š¿¢L Gÿõ:ý¦üœ“•ÿìåÙày„ú“L:Pæb`L<\“·bÜןn>ž¢¢¢¢¢¢¢¢¢âÝ MçdÌÙR¡(-æ£PmÄžnƒ~mp/Lû’ žÍï–RäÌvÛ);Ñ<)¼Ü3•'ñò\*ÿš¬? ¼yyy†­Â`Ó„øw›UHÒ|Jð¯œâh ƒILÀÄ×f@‚»Kàüý¤,Œ;Rr"¯Åö5ü?÷Óø£ÿõÏ¡¢¢¢¢¢¢¢¢âÝ×ùïý^ ò$/eúÊÚ6m§Ø;^ZÊŽ„ØnL;éÏ*%Ï@oö‹æw(ó{˜öO¦G[yàŒ›–‚y­'@¸ÿ#ÿ><¤åýðq •È.E·ªN³¢©ù4| ÿpEû†û´o3[û%í§T– ÁûÇÀî!þ÷áÇñÿ_?ŠŠŠŠŠŠŠŠŠŠ÷>Ï)À1ÕÇÖ(eëñj_ÝÎrøEܶv÷RºOi/)y,…¨3ûY…ÄÆˆbÐL…¿lÔþÁdçñÆù Xð[“ÿ_–[V¤âo)Í24)ü›¶$Ø‹SF<Û‡s=ß0%ˆ‚'®?÷OÉóµ7¡¢¢¢¢¢¢¢¢â½øG,g ²AÂ6Ï¿¥îÀ¬‹ ^*Ff9ÿ6H…u쳞 í¥]3qý%{p÷E !¹cŠõ„ʳzÀíLúЉ¢cb DÀ…JÀbÉ—ßC;sÿ³;¦ù†8þ¡º{sðïHA¾÷@ƒ?öW?ŽÿÏü0**********>Ãy$@A)í§…Í¾Ó›ß­gÀ¶·”Ñü.ǵ¿|¡ŸöÖþlë ÛȦå´¿¥YNÿ`¨=²æv›—Ž÷¥)ä³ÊÆ£àâñû† ~IÌB¤³oÖ´Ý7”âsûÿ—ïú)üÏÿ¯?„ŠŠŠŠŠŠŠŠŠ ‹Ÿå¿¸‡c*Ž °–öR:Ð’@ó»ÅXØÏz lÉl·Ùþ †úŸä"`Û _Ðmž~±øKVi/ûX(fc ²ßTi˜³û´tºã–R@< íQ~¤¢ï¸W.ê•KÓ\QQQQQQQQQAh0ëXËý·•xmÅ_ «8”}˜v¶ÐWÀ2’YÚ¬Dó8§–†’cóþKA¯Ærôy"°‹‚°1T!ÉdÛ[ ›q´ª.@NÀÍ«L âÀÞÍKt:)Î1y¤ö±Wø3û§ð[ÿÄ?@EÅ{KüÂSyŠßJ/¹7óïxw÷y‰ùŽ Ð•*ßI°)ùNåÄx¤|»¯wÚ,Ýw=Ûî®s÷vÂó sæâKw|@ÞÈóñFž;¾—žçù«xëðÓ¼ü€K2 c,¬@n³ûØœ;¥ý,Åȶ³ýž J¶ûÏ §÷Ký­¢ÆòŸ UH,ö; i?… $‚¿ôßH»'´<3T Û?@o†ýRÆ=YúÛsÚ~õ)Úw}ŸžØqËÁ†jñ¢ôÑ{' oÖ\œÚöf£bZ¨Xt¾X¡_ã‹éJ?+;îëÍPLô¹/=—w{^­Ð/ýÆ|{~ß̹Õå[Õ¯…̉>·¸ ðèöK© Ÿ·w UÚbæŒ+ê½#afÌwW–Ž!ýÊ&¥tÄÌõ{^_Å{’ë?c® é@æà^+àj`Àm¶ A.¬Ûv}¡?ë!°AÊòûœèâÁ]ß·³ùL3"Ü}>” ÄÂ/hÏ—û“ãJÌÁQ0°c.âö™3ú„9-hàB_®¡Ó‹‡)èŸÿÞOâ7ý§ï-èÞ± ¾ÛP:o='o¾Çx»ñÅž£8¾X¼÷¸H‰°©(ŽXlQŽ¬Ð >OI¥'Â]ËýZA¬qóóUr<-6ŽCì–¬È)Ï–;‹Òö72Oú8_è5ùI ÛÖ èæ@D}¼SDZi ï²Ïó‚Œcå&e%ļ '!sèÝímúÿ¢0T%འñ|-æ˜ùæØ„k-ù­Y··•°T"›Ö3šuù½3ýÚ˜ëI¸Mɱ¼Ek~ÅaÅ}¡‰Àïu^< çܯ("7Ÿ£·aMÓÒ¬h¹B‚ÿêb>~ŠÀxÀwþÀÏá_ÿßý-T¼7¡Dg¶ïœà› kMýb…×SÐw»ðÿf£Xm¿"~!^«/ÔÚ+ÂŽNe<§¿s@ŸŽ&kEA ­ªÁÍ‚zpÀÆÏÊÄäNg!Oúþ²þôñrz¥ ¬<°K³°&Çr|2c^¾ËÌ(Å,K×^„õü¼dÞ?fŽe|­›-ÎÀÚÏë“R‘o+bÖKýû$Äbæo;бí½ì@,QÄûœQ0ܬ‰‚!ýÈÜI?ŽÛöéXè ×g\¸¨6~à ¹·ßÊøƒ7 ¥¤ÏáPß4ØgG{\4ÞŒ{ âݯ á ( ð¹°Þ˜%L;+¸Ãl/úHU.Q T ÃÅoŒ¥^~EÀfí™ÚŸïgÓ}vFðëåþìqÆCqóY2 u÷æýc"ŠÐ°CEÅ»%¡séà Ûß* Ö;É-þfÌÁ³N×ᘦâݲÀoùþúÚy¥{Ƀò±@ÞrÿŸûÑ|q­ð8ÛŸÒ S¦¾´€.<ô ú@g¾~WÌMMQH¦ã¸™«ïp6h[èÇŽs–¾mž~¸…ú#¹¥ð¤…]ÀLé®—Ûµ&ÖÀþ.T áþûföHÚÏ4‡Çø¾ö¿êýßÜåzU¼‡ðN²p-Yõ—,×îÄþ_zXª™½×xWLƒéqÕ%¸pãû¸‰Ç|¸™~Óòö•?<ÓTÇÅKãxP"TËqƒggª›•{Pã‰næ§{G4Ï'+Š|XZ7+ÓG&¸é8D±p%‚•3à=Ð$ #O±ÀñÜjá¾qó±ÅÓ!¿Ûg|ò@ˆ`ç€1ÍJMç€&°ÇÂ{£”¬ÄSÿîX9‘`äçù¹\òÞµí;:À¸¤Üi…»¢¢„ñò—€¬ì–ÂcŸ)„k9úÖC`±*ô[Ê*$(õ{[`\P,•g²ì_/ÒNio ƒI!/QalÅáË/'³Í% þ#gùÙ½FqWŸ®·¨¨ÐXâþ¿(Y–Æ»4v½í­Nùfày›ÿ/§âÄRh¯ÉÚÓËö<[]&޽Ÿj^nÌÀýæÙ”/±¦7Ìi×1"[ëyÏ?0óùeüÁÙ¹ÉÊîYk˜ò]³d›R&%D§w䀅k*uì<œCv@héàù,&!¤ Œ\žùÿ)g¨ AÌêœCŸ3:çS†ãùïxŸ¸/7 áÂí–ùeª tLQ2Hð÷|ÝäY»áâòCžiIÀíknSJúÊçÙ[ö,Oá’QâÔ{ì†Ò³­Ó„z÷ü½_+ž/ü^þ WÑÝ–òùÛïä©B_Ö`ŸÑRÐ/Ìï‚æ–åý–ÅÞTþS}„ûß*( 6˜~7Ù€âB…`©0­Ó>?ò©=~É¿ÿç¯NÅ{:0òíî0Ž\ø¿ì[Â]qµ»û­þ ½Ó`èu2ùD;±r¯<­7nÐõK[,óÉ‘UGì"´êy”L5§×g<ǹ£m˜bÄÂú$ä; xG¶(Þ͈2ùwHÊÏSÔ.+žÆáà›¼ Þ9žéËó¸€FÎ52÷ $ddæC¹œùü"{MV >h,)“râ2Où8u(Ÿ—Î*$@J€Ä!´ŽæIÓ.)P>ÏÍ%·q:ØY–_h]‚·¢(Ö…~g½—ä`™Ó*üWÜ–Šk oYÞÆ ÈÒÆXî~)ß(,·cÄâ.úêÁ³ÏPñl<–:äM±­,)ùXP—qt`Ó©ðŠ×>½°¹ç¢ø¸‰N‚ƒs‘­ãDÕqÓ¹¥œáœ# 8óx‚™èÉjÀ!#Áñùd¤ìœ;γ;¶d]¼ƒ—´C<¾˜3<%ð,‰Ç<+t<‡AVD¡Àìݘ•¤Œ”X H1g¤DcÎÁ±v!”ŸÌT£˜ÉšŸAó>bê…b•2)2ïk)vB7êÓœ9Iß§“CÝWKÊîRhêy>—ÎM9ôE™h‡÷´[nâõgÌþdežÆâ™ê¡"þG¨2!»É¢®ÿu2VÌ^‡ÉÛáà=“~¨¡sî(`×±‚Ñʵ“kš2œw“×@_/ÇÔ ºo’Ë“Cpäˆ.ÃûÀû²²Â ÌœÿÆe¸L1¤嬨X<ír9ö†…QÖìÐÞ·1ÏÝÒŸ¾7mUeQ8ŸAÿ–æwÈÐ+*¾do‰Mÿi¿ÿò»”ѵ…ÂDÀ—d6v@bJT#{œÛ•€÷¼Iq9â“Oñ‘ÅRÏŠ€ø²,Yî§ ^ÖwÛÙ‚c’»_êR¤Óèoð™G;|ð·UËÅ;w ¶{³ñf§h_ Ï9`NÙh Iiˆ tDuÁl¥áYWøœªÆbN?)T8*Âûä†uÂOŸÇ&•ñem˜= ÜÛx¢”„0S`ÈÚî¦`\ÀñPHƧ“óêü„ OJVØú?)-¬ °²!‚²(Ô'íœøP"œ6ÜI̘òî7p³µÞõ"{„&ãÀ´ÌJØ´ç@_¶à;8¾b¹žä <ž'z²üˆÙñq3SÜ\&6#+d.9föpИÉ3âàb†óÇʇïòÿ³dzç só¹ÆL^©} ã l€°x’$^dÇ_êÖͱÀ±‡àyU že¬¨‚Š àïðò1{„Yð–4"ÐÛÂ`báïM»½i/ÛEXaÖ30×'°™3¥‰«õÒõá¸(R0L¬ò¯q\ôŠ©?’t4Ü~I;*˜Ò‘²G᥯'ŸdêÏcà`ÆPQñ6béãw,Q”Þ*ÜUˆ°yýíyjÁûÖ¾˜SIŽJˆ×Ç6È$(Ê\èu%ÔŠP/Ö~¡Ï4~ί~-\Éob±êÜ$CÎdµz0e¦›­¼“×`‹U8p”Û4Þ³e›-ÿ…ÏãÝÌ]wlÅeÃÃ!±pK¡^ÎsåY䟤¶Ð'§>BYeûqüä:ä9MgQ‰€9SOë¼*REt Ÿ)0w¶zËEœšÄ”ïc%l–Û‰r$ë)!øÌ Á¬¸4ÜF²!Í÷DLô0SŒF¾cš¯yæ›Ç{7)6™½MάtÍ÷õäIt³ õ ] mÜGJÎé™çy>³¢°vsÁ2¹6B-{ž-ìÖËj=™§°ä ­¨x7¡WBçu¯¶åzV6í’jG,ù¶‚péùk ë lY—Ê‘ä`A_¨<’5Èn¿x l dö—vBùÙ½FÓ°Œ'Û¾ý¯‘—¢¢âÍÃ’+ü®´’íZëïj)\êW(8¶’g“ZRµ_y¾Dx“ʯ©¶™3dœ£,+WŒu˜i2Sñ&5N]EÞs*ÊffwÀÎr§Rr!DQzuF.Àô¢Uã±~3ŸÔx…ÓNé#ÚÆ}ÅqZK¦²? èÄ—÷Lõ¡AzþÝ;7Åè{j²ˆÊ@‹ŒL¹q̹‡()$œ Y';š·Äã:ç H*-'œC 2] ,dDçÉ"®hI¡%çÐx‡‘×¹ž'T<0r9#ò±úH¼Î9¬Ä£<)"cÎH)!pA³”àÏÁºrß{`Œ€O@›¥-0:‡²¢#Ñõ#Ùc0)Y}Œe¬|åþ—y•ûNZ)¸6â±â3ŧ(M8æÙ#•2¿OeØóàpjùF‡c ÏÁéTT¼éøk¼üV^Úà]+fÛç`mÖ­B`ƒ}Y ýM Ç»g2KQ9Ö,à‡Ç´‹þüû€û¹¼}4 €l·ë}åùW<ß°.²Œb²6Þe`¶·é6É Îî—i/¹pláÅkŽ`½H²›9óbmoò¼¿"4:ýj»AS~ø<ÿ®qÆé;7Ï—â·„sF4}7˜yùKçÚçAYþE¹™h(Ù_ÍI+¸lsÚ¬xî¢ 0ŽrÞû@³§Ûè+3¯Þ-v/ ‚²Wîñèûnå)Î!x‡³ Þ Éö3Å ¨ó8ºŸ˜Väá½›—ç:D)rÓýsV^!ê¯ñž‡Yý˜”¥É æ•zÉ“àRÂ!g¬¼cN*t¨ ¤„œ=g§„ä3šL U—)Ø8cN0—Y9bÆÈ÷‚›Ž9¦€½38œÕub·ÃôÌ(]⎊§á8ݪ¤+ ˜ŸÃìÔsè”’ÂÏŸ‹r ò ö}žÒŒ–¼„¥vÏÑÐ+*Þ2X -ä%öuë°ûÛôŸVýVfÝV–uwý[¨MkHH‘åñ I{xä^|r&g¦gÉîsÎÔ .–l@"ØO…Ř"dØÐýæÿúM»o–>rÖ#–¥ýK<{kE¬ýíL4Í$\ÝÞÌ´Ù&ІX¹m1'`ÎÄ"¹ëEƒ1!G CÀ±UÝ*2ÚB~,¬ç·ëø”dÇBµô5YS¹­óÇä™÷ž2QRëN|xGèJ·n²ôNž¦ûx¤»àà æç+{‡Î9 ÜnRî˜ÞÓ0Wž‚ˆFÐ2ñ‰É5 Õ9˜8O´7eÈi9haàs•ñ{[8út¹)ˆ×óñD Œ= Ü~Y©É3À¼|ï霔’à¹v€ss†!ùA\þÈVýœR"K?y$õ& ô|¾c"¦ÿGÚ!S01R&ËzÌÈ9cH ÷{ab¢åó§9¢vQiã)gä$q3-Hž¡¤M÷´zõýÔº~^%KÑÈŠ†NKºOóó¯Ÿý·Ë+ð,¡¿4$ë-­t Š÷~ /E\Ìï¥ àRúÐREápb]ÐìY?˜XÏ#ô¼çšýN¢¬oAg,ýxL ›ý§dùO¸>üœØW©»CÛÒ­n©:d͈G<ä9ݘX·YÀ—àÉ ÖE(ÑBº˜W60 /SÚIÜÈ•sÕ|{éVh*©Í´_#ʆ톾c-åÚ*>SÍÝ¢B©,åÿ­ŸeíÅ8:G¶èkÞþ ³G!:G¼md|ñ,ì‹Ý<[þéO„ã5 Ü“"¡´Q Gž¹>‰¸œ™¤‚VAV{™‡¤pD8œ)éS^Ûçb‘wÀ=ï©À€½w¼ŒãxÉ&$ÊЙxŸ æ”)B2ÎÈVûÀû6NŽO¿Kv¢”39Á±ðŸrFÃ8RfeƒÎaÌ1‘0sÆÆäàR"o…wì HH)!&j7)#f¾_Íc’ªÌéø~jøoäùX¡H|rÈž½S±4à8.`ºÅ”ÇKîmíY‹ «¼Ÿãcwü ޼“ÿ’Ž6æãÏqVã(A+oì{À<^‹íK}Ô¯~Å»¥]¡öÈó|fö;˜õ•Y·Ç)›< ŸþWéycƒ 6Bå7#lùH¢Üú0?àÿ¼Èý{_ÎgŠ€öÂñK¿d ÁÍç¨ÿßñ1TT<¯x–Eÿ®Bÿ]£€Æ‘àoé<:{Œ…Îw/‚¿.N5Y$•Ào…}Ý·¦Žh¡?eÉ-?·ÉLìŸ,õLM‰œ³GT ±ÐOsÉÖ`ÊÈ2Óo"EI‚P1iyAÒtú¹•œ§Ìe£„rò4Aå¨w¢9æÞÓÿE‘Kz ¢Ã¤& ï És€0¦þH1f«ût@ñÞ9D—:'ñMŠ,É™Væó{VÄ;0SŒ€Î{¼âzGÜøkçBÍMu&V òµñ|^? #(ˆW.à CÊ*žÀzJ ÿ™ù7‘Eñ˜ùø/)Ea/Ñ¿9QýGŠÑIøOʳÐ'RžH) “Š)cd€ÔÐÏ–ÐD‘@ž­ýx,³7F¨eä­ŸA‰q\ð,«7…¤~x³ªPœç{bE•¯x2(.G¼‚’aá­¬PüF»­BÅ{ ¿—rß[N¿ÀR…N ‹BPò¨YÏA#TŸ‘}"à÷Ìõ_19iÊ¿ 'E¡»–žÙ¥ðúÇGtÆÿ)ÅØeEÅsˆ¥Uéö…þK¨…NÉM/‚„µÂK&± j¡˜¬Ì˼÷)ôãgë|ÊüŒ+kæDûq3Æ+Kõ¤ °À9Q]´àêfaI”Þ$3 Ž”Ž²Í³õÔsT°žwMOrj%#c!}ÈÄ,ïÓ_Øå0ñýUDòœKsÅ‚vpá(ÐLÕ[ë³ðüy½uŽï°òƒ# \ëÆpþƒÔ `k{[óã@aÚ×yÆ{çA\ª~‹bBÌ#¯2pÏ‘ÀøÀ9zç°òG#€ç8¨yöjœxÄchGpJ$ø—‰3æâdį§«A)D7`ˆspSÊOþMC&+¾Ë鍸Ršh@CδNR76!cH ^rýƒù.gŒ‰¼}ò@JTy8%äœÑ§D÷FºL…Ó?{’Ÿ2+›i¦úˆ;rá5zÞÜt®N¤vw›Ú5o™éOòdå”2e/o@âç]èD!Ït!Qø:~0{^Cë¬Xo¶ð¯ná·SïÂgíSbªÒPñN… þ=ì+°” û»µôKÈnk¶OÔ¡OþúåçH8ÿ+VDQذ_<ç÷Ì^0Ùʼ?._âß÷ÖàߊçK°|‡6Ï‚þh–b:?[k¹À”XÍEH+½™æ|ÛroǨƒ¥­pžµ•ß³/Ê@ÎdEŸòæûY`ŸŽÃÿ•ì7Amtj\b-Õ£›©Ý¬Øˆâ#¿ õF‚]³:'@‚9çyÖʵ›i>#ÿ>y2àÐ9âÉ Ç;ÉîC¢^ë^rOø·ÄÖt€=ÀDÿq o€÷Î{\òùïY)éÀ €@ÂþS „uœñ±ŸÀÁû—!`Õ¶4¶8b$ç0öx®0×UpT\ d=èÖ¡ñðÁ#‡C¤aÁÁ9O‚}J8Xyï²w2óyë°M$tf2)@›"bÎxÌW UË{ZršÏ!'äDVüÄ' øª)8¤TŒ)Á±R0²¥Ý§4Ñg" þ#{RŒpö9#Eñ W`dêQif›üÈ‚f ÿ˜¨/¹U‡¤j4€¾‡y [–û{–þµÇÌ;*B6ùòÌÿO)OâÈ8ö:è¢cÀ¬L™¹2Å H¼€Þç­†õŠJUm‹SVÿ%ê³hFU¨x'â÷ðRìäBñ‘gy1·}aì[A‹e”ž“É Ë)(.¯g^ïy$bù·ÁÂ×ûj7ÇJ¬Šx¡“3µéH+*Þfœ¢õˆuí‹¡øXÎ|p*½;æôKuÒI°wLã!ŠÛÇÂíѺ:ÆTaU Ùž¥çE)˜­úä*T?‘™Ý4`¼§1ú9ØÕñºœÇ$ çÙ p%½&ØÓ!¨’/dºqÐgúŒYB…Jˆ]Ñ|0+6Ù9\0µ¨eK6˜–#K +@#>x?Ñ’>â®ØâçÐzÏ©Mà=º@”šµsx9l½Ç9ó·H¨ï¸±Ze¬6™2ÜŒ@3œX‘…¼iÞßD û í2úЬRrð‰ŸtøŒÃÈHÈ hZ‡86hZ‡R‘cÆa„†wäŒ|àœüìŽ  m=BÐ:„¸ÿr‹Ã6a|8âr1öç÷×ûˆÝõ>.¼”ºuÀ~›àü ¡ñè#0z‡€{¶ìSêЄ”Iñ˜&ä9šø0.g )bYâw9ãâǘ(`8%¤˜0O X§„Ç)a`ZPL‰­å‰è7)MÏù!3·?gÄä0Ä4YãOqâíð˜+H`¶J½Ê4&¡€Qp4Ýk¤Àd¤$Ä8+Øt¼c… e¥URî¯áçx€Mvñv2à­Uì»0-¼õ;ôY–þ¥}Jmª"PñN„µØ‹}¼7íÄS Š‚-æM;L ³]"tÝÇ=3ÖÒ/K›TÚ‰°>?>€(=Ab ¤¿õûÌ gø¼ås]Qñ†`­To&Õ8.*%ÿ?Êp¢ýxÓFóó§?E3ÐmE¸ŸGiŪ?_„|%(W^ú—‚ŸDÿ£l8pó6±zJ?ÀÌ‘oTbÍÁÏê+/ ŽŽ1”–ăÏ\m–h9b™ÚLb%gJ»©Úðhà‘y<¨ Àùé8AћĪ¼dË!^ÿ‹|b½sh½Ã™óØp m’ zíÊasNžÙáñàCŽ.Wv7R 8»l±>Ûãæi #%‡'3º6#4#Û„aÚÖaµº•C¿w¸ÿ¢GN)9äDŠÁæØoýu‚óizÉœ3zø0À‡Œë½C·rÁãé£pï{!ãú©²ƒ÷Ô×õãŒ×?G¼ùnpØ^£é®1ŽÀÙy=nè;}ÆŠMà^Ú]É7¤&`ûtU»†ób$œÃ†-ÿCÉ{#B¦ˆ‚í~¤ï1¶ Î@õ ʼnHþ£Ð‡8`ØåŒIA˜(k9Sæ%¦ÍÚñGYê:€÷KIÒ²ß߇!Q±ð;޹iÀׂ…dòˆ’?¥ ŒìýŠc"å$pRu8fà*ÎãÒ úÝ |ñÇî üV•€Šwlä«<Ûù]¶[êöò fù]ž .ÿ…¦—à^îq¢ HP£H°°X%8X¶K?"„ˆ‚ ýí Åߦ­¨øbñf½ü³ù¿µ2= Úú%l°…‚#Á½Â –|õ"Œ‹ÑÝ«¥ü¨*ºü»¶œ;>˜ý˜¶Ï<ö ‚¸—ñ8Ž`$ë6ÑN•ŒŽOÞóœŒG[ô7aòh0ï>8ìˆgŸXpËœ&“æ!LUFæYn:ŽäŬH :GbaŸ³‡dš™€9;ó~:~ç.‚Ç…sØ9‡•Xû€•ÖÃzíÆˆýö€GŒ1a½vè{ ßgÄ1cwãÑv‡pØxü@rXuôŽL1ãñkT“whžÇLç–(gBØ_?çŒÝMÆõ5`k:àÅ€ímc‚÷#{g=ÚðÒ—mpýÄawÓ£ë䔈êÓíŠ(+>Oeøàñès݈ÑÏUް9wh»ŒÝ6cu–Ñ¥Œ¦¼OìA +öîšöÙlš†¾9eì·ý¶ ë3êx¿ð͈Öç9·û2VgÀ°÷Ø\xŒCÂØ{ ‡]BÎ><Â8P@t»q¶Jh×—ÈpH‘>>Þg ‡€#bjÆã±9ë°Š”9¨G¼¿ëp@Æ.e ™¼‰-ýC"Ñ3Ú”1†ŒuN³=Ï)f0Õ!û]²Ž•‰Ä14!“×E ŽuÞqj+ jÌéë3Ù¥åu ržãgR¦4¢)SM7sð/yŠÙÞÆ·%j¦¦UE â€hÖ-h*³ÅK«DÓN¶f)ÁÆÓóñƒ_KÏGêBg,ú"¸Ëº “úEH’ûôÇë+ 0Å p»ûÿÏ/ñLWTœ€¶òËäß_SmÜÂzÃTƒ•ŸƒuõGÊó6á Ëþšî3h=ñé9§·¦ìèñ;ÇÔ¯Ž§Zg…aæÔ/ Y8'?c*:Þ&¢ZG/®Æ1÷’hÎgï&›FêÝ,ØKA+/í ™~2§¤8€Ž…z¡éØŠ½!ƒ‹n!gï‰;Éí£'eΡóÞVXH¡8wïo=Vkâá¯ÏÉ¢#—°½¢«ÔvÀÃפa`*cÕg—4¾q̸y’¦v יƻö”6³ ÷^thZšäÝ ¢9C‘°9÷hZä€ëë„ý®Gƒˆq$PDOi:‡±ÏLÁ̭ËðXmžÛ+É*—1Û0ö9'¬Î<†CÂõ5ßSœF3 2¦{<´ç÷Ö›€að8l3âHß«û/Ê{‡¦Íˆ£ÃöŠîÉõ9š5v»sŠ}ˆ HMqýt@G¤¶Ã)î€j$ 9ãaÊxÊiI)íhš<9Sa1 ¨N ÌDÄéŸ9þ‰3L º”°M”2•Ò²pê+rÿ ó÷Sž+9#Fêóä%%=näØV\âÈˬ2Þ]– n"­KJÑ·Ò ðV¦Õï8»^…þŠw"~//­ ³]ÍÒ™õlúj‘(“@–Bá…`ªl‚~e»´Æ‡!þÔ.·Ëõ ­x‹°† ráå]o7+àOЂð¯û ¾í9ë0§ð[y—´Ó}h.þ”…Çp»äÉñhnæÝ­þI(óSEÕáÆcÎrž-øl9ÜnÊ»¯TŸkÓl:Žž<¼o㎹ô‰ƒZÞæy¿Àí“Rˆå(m£sSðï9Hq €ÞÈçÓ€Òv:NÁÙû€Ëðµ‡o˜v4ð½COÂí>¡[<úœGÓ«5]Ë›-Ñ.1áþ&ãü>ñõ»MFh€íÓ€”^}5¢É nÌpHÙá¢ñ8¿çB@hÚ¸¹JŸ:z`³Vk‡þà©zpqáЭ~ïðô¸9ŒÈžs³noÇ 1&xŸ)ÛrvˆcÆÃÏfœ]) ýô(cH”sårÊèCŸÐ­Î.<Ü (`×9„”áCÆvŸáö”§ Îe´+:öpÙ«ëÐm¶×ôÛå k\½0;ìö ®"†œ±Ê!xxïù£•©rJ"ÐûƒÃºK#à8õÓÐ{¤‘ŽÙvä5iWž3TqôèVl6ݺA3Röð¾ÅæÂ!§5†ÞcH‘Ù§„'èsƒœÑÄ+)g|Ó‡¾ž©´å·§”±áìAPtŸ!uh•3ÆìqÁu†ì™þõ1R"‘ÏäãØ…I à"e1‘WÁ{J²dv¢}G¦å@™ÃÆÈÙ‹ÀY»@ƃ˜³@Õ…]¦lDTÿVà­þÏ¢cVe â£‡í,È úvÝzî{^äwK%gœÖ3 ¿(’Ôz«BùÅ@ö·”¢þüÛ0»'pŠã_J×)šÆÑ_ëçBN s¦žfA8×…¹BûÑí'ÜÏ©9=gÕ9R*„Jãç|áä;Ó³>Sþs`ö>HU[É«/•s'OÁ¤ÐŠ] ögÞa€\cõÎÁ{?yZ¸)Õfã)ëŽsk>¤Îl8#ô)l'¿óS63GÙY"ˆÿxŽŒàÕÄ%ìnH¸lÚÝ:¡[g\=n±Ý% 1âò ˆ=[¯ÃŠ).9): }ÆjCãzÏïÎ2®®^x‰,Þq;òµÇêÌ!§„ÇÉêܹ„û/9\ÜxíÓ^{’0ŒdlsFŸ6¥©âóÚet€pÏq}–àgJúfVþB¡cšÞ¬€á’Ag ònÿR¥L­¨(A …Y‹½òB²ÄœiW*6É µ=Î$‚¿dï ¾(÷¹]s¼ÝbSÈ$éEßÿWÞÆÙ­¨(`I¾×ÂùD·1tŸ™SOBHç·ËÿþSP¿O ÂdqŸyõ^¥ùi‚¢ñ€é0’-h”y|²› |•4—SªPn4ÓÜL‚zyðö‡•s”&r¢âPÇ+æõg¸9…©²þ¯$7~Ì;$ìÐ8?Q“DYh}˜¨AÁyVFºœ02¯:8²Ž¶ŽÆàpÆ™}Î;çÆÃ)H1"4|yp~DÓ:ŒÃ€ÝU›mÆ8F´>#F`µöèVã0âz›±j‰®³Z{Ü\e\³ÐÕ!  ËèÖôn¼|ðê§€¶£9¹é3§Ÿ¼Î”ÕæAç°>s{OYwZŠ%ØT°Ì`uæpïÍõö ûˆÐDŒ ïý!Ã{âŸ<ÎÈ‘„öäHØs ´–÷‡õ ˆ£Ã8: ÷^$…àê†òä{.*– Ùc2ÎÐÌw;àâ‚®ÙÙ¥CJ7OúCD#^” Å ´-)CqLˆ#)I¡qX­ÉrG‡óûøpÀp‡Œ«Ç”ºt€›+âÜ_Rv¡8Ò÷iCûnÎ{R*ãè‚Ã8°W %á¸iË9öŽ©]ýÞÃûÎ÷_Xá°ÆØ"À~‘чƜñó9aLêRnÌ.'Œ,è{^¦Ì”.Dl£<ñ‡=põú€qŒèTŒ ÎÁ3ß;å<¥$½\») MNÀî=.xÜ< xtM–߯9„LÂïzCû¤ÐG²ƒsèGNQÙe¼ð~Õ: áß­§ßR1±Úà°¡ŠazϰX‡=)‡”˜F<)ãbÆúŒâ±Ögp ~fD?$¬WÀæ¢Ã£‡¥ÔÌ”^Yy»¼G̠܇ví°Ý…dÕŸ :):ô=Y°)—ƒ_…ç–óÔoð¤Lµ+‡Ã–bM‚£Œ@)gNê0(¹m)x™¨?  àBCÞ†8z ‰*Ÿ‡ gcŠ#p³ 8[“r×ïI1È™¾cÞ;Œ=„g÷<†Þa<’£9?¿c ç;|æàpÅÿ#ßo »§ú¤ÐúÈõ E¢¡SjÑÈs’rÆ!eV6e[J A*U;Rà"S‘rÊ”žtà~2]GNcšÐ1&öªd.^ÆU‚AJ@ÌÀ ~«¨@w…¶ÂÏU¥Oï·”T²ª‰wC¿ß—º\òîVÁ¿âíÄ·ñ²ÄáÑ¡3í¬Â`!ÛoÇðg,ðK>Q $ë÷ §ÿüÿÎíEQÈœõg_ }U<çÐk– Ôp5Ÿ?ðWE[’&– ”ÀïØ ÇÂΔ¥†i9Z`ÏZI£Éü¡þ8ÉÔâg‹¿›Óó05FâÜ‘â9&5w“€O¼É‘`.<~©â+ÜÇüûµ÷8pðoëü,,ý 8Ŧs”'?±¥¿™‚(ïgë=Q{H©h|@ç²óèeãéå|ï±é€8D¿C¶¸~±eSçn<é#ÎñÊ—78»tøÜ'IPºx±ß:¼þùˆ«qÄ)ôÌ;¬Y(CÆØ'J™I{ºËÐz|x½B»¹ÀvÛáUxìRBŒ#bŒèsFL”z4¦„+- î’Y(±rrÂãI7B¢ÒʉîœIÙí³§4¥)c5CC…Úb¢ù‚\r‘|†wž*³ )K‡DB„s”†¸qä ø%M¸«WàÍøµ÷RÚä U<0Ï™Ôt{]l– gáy CUT3eÇRxlp°Mj÷³ŠÁ”6ô£ÜF~XáG,û"ðOùÿYåJXúÅò/‚x¾îûßî)­¨˜¡­L¶*¯@WäŽÿdý—4ŸbÕļ>¥ä¶sÞz]¤‹( N<™è)ÈÇÊÁ¬H̃œªïrÕÐ ²ª&¦'ˆ‡€þ¯)ô1âiʸއDÊÀ˜rºZf OFJ ¥ lõOcDN ™/Lžâ€>%Ä1Ä„8F¤12ígLcœÿb¢ éÄ Oœ<¸âq¢kÑ'z7’J#º- ë†â=w)pì´‚µÄ.-YÙµ÷õ®ŠÇ)ßÞW~ÓǪB~ÅóŽßvâw¹‡%é ‹á·<v}Šø¿KZcÞ`²vN;JzÐ)ø·9n'œxSð ÿìí›ÄŠŠ%4æ#a?dñùXè×¹º)‡þì²ôçg¬õsÅP€„𖿘žw l;dmÀËø´es*ÎÎsQ"ÉÏçÐøùÜÄËб'@ÆÖ:ìÉò8‚XòçOŠˆ÷¬ÐH ­ãlDÏ PbZÞsà¯ÿú©€gk¿÷­óžÿøœ;ç±q÷[>à1zìžnš„ëÇmá|ÆkŸ‰a„÷› àú*£ß²ÀàÁ‹ý.ã°KX%l¯=Ú8»¤âWM ì®2®vDÃèq“H ¾×Pm3†‚-'×kçáC@ÛQîúÐPÑ«×?GF“8’‘F`è·¦eÂ6ãÉ!cŸ3.<°iˆS¿¹ ^ýkŸ—¢ª´kö($¢Û\>ðè6÷^\#g‡G¯žáúÑSÄa‡³Ë+ÇCŸ°¿&ºÓÕÕïIò£ô™cOt¡œ)™Cï=gÎáÁƒ€õÐvý>ãé>b v|SïS‹ÑMbf®ˆþ$Åżº ÕTî÷ ýH<ôÑ-í}ïóØ]¤Dµr¦z O{ .^匵§kà=p•€ ï±^9l.=ö7¤ yï0ÂálMžèë§C†aÀºÉhW »k‡Ã˜°O4÷¡¡kr“é¾^Ý£GtÀ*œSÚÖÐŒыڮ g è-vcÀ˜3®SDŸv)áÀu"&ËüŠ AG¢ q Ýã\FîíLj1EôcDŒ¬\0u¨O ý8sÿ%N Fà(.d`JÐÀ€$E¨´u1ãØâ.íœzOfµ.ÁÆB™L˜ ,Z©óq13à˜ëo9ÿw±Üƒß»c!f@{Vï¢[T¡âyKo–VЗ¥Ä X€ 9˜Žl‚©Ð7Êxä»}zü»­pVQñvCÓ|Dh×,æÿë?q+{7+ÞïîÓ³‚@p*äY`^´(˜+Á· «= ¢P|€;Š%Èú,óT d-ꘙ9ýS0gç ÌãGðįÆL; l©o¹½ç\ö:€2± ï¼ÊæC‚_ÃÜþÌ4¢q–¶þ·ÎaƒŒËpÀ¸¿Á§>žqv9ûK†w ^¸ÚϼM ]ðhBÂþ†ròoÎ8$ìÀÃW]<~¸LëîÚa}NªÔ~ÌH9¢ ÀzíqÑ‚è ÿ›  <ÆGŒ›àpñÀ¡íH‰cƒ×Ž‚'A={àü‚ñÝ Ÿ:Ÿ1öÀ6raïñ(gr@Þ·h:‡~ñâËÈës ~ò˜òø‡F2Æ$¼´Nœ[ßáâr4ŽØ>ñøU ]EvqŒÇã@ÙTèË{ìzº¶yÈxš3î!cÓf¼|"U>ôÀaq¶ÉØt/^‚ ˜5lÅnsÆõpKq(g[‡{àü¾G¿žM*Bçc‡Ní9Ûû›+î¶ÿ_²û°×À{JåèXYp˜r[îWÞ#{?eüé8ß~Ëý&ï±ò~¢9?çØ§s >Ì–TP1) #~ÿÚ98¦iëÐã°Ý"Ž=¼xüzÄ>F4  ¸¡!KtŒdÕ¿Þ‘%tˆ s8;§˜¦¶ãk¼qMÆÃÏ¢ ÝZ* %¤[;ÜleÊ3º†ªÒÆÎH“±Ï —¥×{ZÏï{„f…Ãn…¾OÈ1âºÑ匽sèR¢{Å“Õz¼w¸éº_ËÉò~Í ÝƒˆÏ~<ãÓ??à0FtúLyâ#(ýæyë°éžh|Âæ!*š¶Ýуºj3ÚÎáõ§«¸¸ðMƒ8zÏE‡¾ïðd<Í »œÐgP¼@ÎH9q¥`‡ѧ„Ã8`Gô‘h?c¢z}"êÐ0FŒ‘”ˆÈñóþ#Ç [kÿ,þŠå_^š>a:³R€ÙK@” ,ñìªã<=oiAˆ×Ùyfå‚~“*ÆÇÔ¡”çt¥šNôFþ»¢Š.Ïþ]³nïђ׫¤¸?É}Xc:\¦€Yðoͺô÷›ßî«xOÂÞ§b)Z{`Àëìn—6NïïŽ?R’åBÖvÊB/E³¦üúœB3ç©zmÎyÊÜ7O4?gìI޳±ÒÌÊHƒÛJAë‰râà8NA T2 •¡îp; üm¥èôÁ-@ëýdåo¼'JsszNçá|€w§ýÐxZ\ú€ÑQ°6g\:‡Ë °Ú$Ä~‡ÃŽò¯6Ûë×zd.ƒš‘qv„Öáæi†ó ˆ7WÀ~äj² ôûìq<¼'AþþË$˜=}ݡߔû¾¶Ñc Mθßá°%Žtʉ͗Î'ìö”ý碜óx2’uvå=¥Sõ”ýè’k ¼ð d‡W?ÀeÄ‘Ò;ç°eRþýØ\ÜsŠ'~ä¾pŽ,â‡m\ÆÕc`ÛÄo¤¨5)áþË”CÿÑçZ\ïF¬[`½ÉØß$ ‡„qŒmÄp "ã@1 d¬9? ÈÉ#œÎï“©êï•gžyÂz•ᛌ'¯“÷$¥Œë2RFŸ®Ã:g\ºZOÂðvðå¯ùþÝ8‡{÷+-`¾jÁ™{ÜÄ7?¿G~®Ÿk|)•jŠÀjCwôÕ–èk0'«uÆaŒX»Œ_p¸ÿ²Ãþ:ãæ)0>däqØG´­ÃÓ'TÐ %òË>Ü #`84\íØawèÐúˆ«ëˆU“pvhÛ€íµÇÅ}‡Ý e¼‹ÞáÁ=RdÀÆyi2èz ]upÍ›OùŽSš>¸=ïsÄ8 8 Æ”°çŒA»qÄIˆü<€•ƒ1Ò\eÎ8„”'kŸ¤æ)3¹&cFØ1[È#=Ë\&/?¥OàXðgçí“çÌBRmöqì]ï+0 õ}žÇ)Öþ¥Úo¶BP€Šç ÿ/Ó‰vÖâ?íór¢ý1þ­¤!Ø:_Ùt`=rÀßúvÏTÅ{Zˆ×/ñÆåG(¹­'~þ*°ßzæ¸áõgG d;ÓwˆóO´Ÿ&4”²ÓyD° :Oÿ{—«n@¿ëÑï{Ä‘¬Õû›9pnrâ´Œ‰2ß8¶#Ëó“×ʾ°Ë]ÊØ¬š6àì‚æ®í8X6'\½<3+9+÷ïøÐHyÜ€‹óŒ~G\÷!FlcBçÈʾ:ËèÖW€Ð$4ÒpñÀMV÷¡Æ‘ËCÌDå{C½ÃH ML”Ñ$д™(-«à°eé':΋ŸµÖ«ŒÃX­š¸zêpÿ…Œõ™Ç å]áðâ—yøpGŸ}î ö‡ˆàH©qÎaÓTLêüœª(g8lÎn‡ †>ãú¦ÇȱËBBkY¸=)¶]ƒnÐ OJðzÍAâž r 8Û8ø6  :Þí(ø•ÊIyjZ F®Ëð Ý»»C=rLh›ï¨*ðÃGT(ëþ%ð¾/‡í*àìH±ÁõuƒÏ¿žá†iqÿ’+êfª@|ØEô}Âö:!§‘(¬™®åjì¶žÇà¦pÞ¬Ï<ž\;ª™0 X5\ÜÎ{„àÐm(õ&<>7­Ç8:D®ÇдD!ºzLóé|BÛõ«kôížz$,Èè9«Ð0öÆ‘‹…õ1¢Ø#)(x̉­ÿ¤´å”ˆâƒcëûÄ˪Kÿ‰ÝœBÒü˜YQȳ-ûÊ;RöÉRM,ÿôÿIøÏBEʬ([ý™z S„$Ðxœuä%w÷›Îsš3UT¼]ø…íö6µ±îó>$ÀÉ~Š…r¡CQDøúo÷ UT0IJ¿òDýY‰€9»¹©,›³µ\(8 Q,$P—²±Ï‚ú”j3S°w$0à,:~¦e?söîÇOü|ÚŸøÿœ6R!€< raêƒ(<Ñ9t ØÆIñ/P`®Já8 ·UžùͳU¿e+¿ó-ˆ¾âXøŸÐà<4ïí^¼ô8¿Ÿ0zôÛRLxú: ¥÷_ʸ~±>#áÿñ«B“1ö»ˆËTE÷°OÈq¤ê»ûŒÝ8bÈÀýàqÿUÐ]ŸS°O_Ï£Ãù9sƒf}†Ë{-œ;àõÏðÒ—5xðò ã±»RJ»mÄã§#r¢ê¾)еkR¦`ÜCÆUOÒÌ‚ÚH²Z|凗^i°»nñ³?áâ@®à\BI¿ºÊØR~F*ZuéЭ<¶O8ÝcöèSÆaº¾$,µ)ãÌeøœp“9ã¾V°Ûet-{jZn®3öcÆ#š œQË877”=fLPzv–q~ØßÜ\QLE}šÆ“'#eœ]PÚç›Ç7Øx²îwXm2?Ľ—ú/ûà± ï_BŠ»kÀ¹ˆÉSFÉ%B›‘"+®xùË<¶W×Oà"®÷×™¨O÷ù¾Þ nõÞaë<¾êËÚÕ › Oÿ,B¯VÌ‘?Dô‡‡]Â0D´+º€ãÀr™»×zûzn¯[Pv !xäœqžÎV7®B@Û Ÿ9g¶ »›mG“w ?BÄnçàrÆ~L¸êGäœñÒŠNw=R¦ùÉ™8ÚÖãò¹Q>øU+üä'^8K™îƒ†¬÷Û+ Ü<»q:\?œ#ªÖå ã\?÷Àý6ãì’b 6—ÃÁc¿ÍØ^¥ÉšÚ®¼ØßpÅZdlŸÛ}¤¬B™R’Ìëpàråpù")›s`wCÄ®qÌØ^»ƒ(~”ÁåQ¢ÂQ)'g!#4À~p8[;¬Ïnžûˆ.&¸œ1 £…CÓ8ÊFå=bL¸Œ)ãÜ‘0–0"£k(ý³ËMGAÏ»kÖ^ß;ø”poÑ€1s ¸§¸ˆÐøé;¿ÇiOw1:<¹É@ÍÀ¥÷“>$`Ÿ3t”6µi]O÷öœC?£I =2Ú ¼ø>ÊÏ¿»jÅ\ë”ðÂû€õyÀþ8ì"Æ!a¿ØîGÜp`ì.—.Vdµ?Àá^GŠòšS¹z°€Uëñò+¯~–aÏV >ôÕ/E‡×?½¦ìEûWOwÈcDÓã‘sBÓÑ=Õ® ¸z”°Ú›‹Œ«Gë³ß8¶DÏr¾Ãê…qÝ´xœ3Fþ÷‰¼Tý8 Ž€”ÐGŽ™â fCÅ"¸Ï” JÕÉô æ‰gq22Lµ ¨M‚Xìóÿ?fzîœú-± ž©eù9•€äœfo€Ð¾W7ÖÁÅ“ÐohB ³Ð/Í–¼ ÜõéAU¨x^! €ÈÝÖ0/òº•ã{³^TÓ0šÙ¼¢ÒñøvÏLEC,ð­'á_±¬Ï½¬«­úÎÏôï%çùì&þ>÷Ò²ñ$¨5bá—Tœ¬tEÕM|:ç »9“dßP`+?¸€VV‰éYäÀÞFeü¡ 4~î’JÔó8õ' ÿ]DâüüÎ æå¢\1dN#ºñ'šÏƒ3‡Ð:¤˜Ð4#öØ_d„Ðc¿qØ’°þàeíuÆkŸÑ5 ):\"V™Rx^oÚÆa½¢”ŒWOž\hsÂÈñÁ9lÖ볌ýÖa}–#Q‚v×Ã@)=S¢úÝŠÒ4n¯(–a»õLû¢ÀÖ”2Ò˜pï% û-ÑMÎVÀÅ}¢©xì¶_†˜àeÉ£C·ÊDêÖ«uf6pØ×× @ÏñgÞc…ˆ®MØ]S:Ê'ʲsÖQ6ç2nàñò…CŠž2ò¤„³s²üÇä( ½ÉØrʸJ k$l°>Æ>ãâǽ=ú½ÇõãŒÝM¤Ú›Œqà!á°£z¯2"S™ÎƒÇ½KÕYÂÕðô†²ý4™¬ØmðH. yà| Œ‡!S ¬÷g÷Æž”8R&¤‡³à°jÉsÓ­ÀÜüLuz›Ñ@Û€c4È#0öÀÏž:‡}Îx凫ƒÃÕpHT0ëeq¶&¿‹€Kxýi¢âW1Súšærµ¢çqèÙï6Àå ›µÇÕµÃõÇÆ½Ç7«µÇùeÀÅ »ëúpó䇄ó»+àÐgìû—öœ³X;‡î;¬6 ¶ëÐïÆ1ãп?X½p¸ÿ"nRÂn°Í ý8b¸•Ð=²0?ps!‚üd…Ÿî<ñõ5_xek²Ì牮#Š˜( ~¥€!ß+_õœÉ t#ùMâƘèF"üëÚò›Ôò«%±\Àr¥áªPñ¼ã÷ñRäsað°ãõH<cçšûܰ(qŠÄµð¼Ý3RQÁ*ãÏš;?[þ›³9/|xÚW²‰¡_k#[À$?0ðfH\+N¥ß侄Î05\@‹¶…yæècæëv/ˆß˸ŊUO€i ’ë_èCñfEj‚Gº Vý€UÈ,ø·¡Áš‰ì(^ ¸ïHaX­<Ú.Ãû=š6âõÏŽØœˆcÂjÕãúiÄÕ£Œ¶ËpœÕå°ËH1âþË$l½þ à­ËXŸ{ =ib¤Px\<rޏ~”qu ÔˆÈ>ë&cßg\ž»ƒÇýûTœ+4dé~úØ¡wÎ)¥cß»L)çδ*ÿvë7OâñtOYzè׳@A4 ÇÍ>dôøà‡2röØßû݈§×T„iã€ËK‡qtx|pèùž8÷ë&ázŸq3F¤IèI ÷=pù°½¦L9Mθ¸ï‘3 žÃb^þÅ#\=ö{ÎBÅ9æ×›ŒŒˆ§IØM9#qç ï°>§{e¿M >ß<Í8ÄŒû÷3¼äá\‹¦Çs¼ú©+ô=yH>ßÓãò “Ã0²âÚ øpÖREáÐ8\_“ vϯÃù=JIêàÐ÷”ñéÉký°ð`EQ3)9ìà0䌋Ñ­éÞ Ã pxýsTaø3¶œ©Æƒ*c¾ð€ŽõhÀ~Ÿp•3v‡ˆÉb=$ºvk=§ýò êÓzF‡<&œ­=Î/ÿÿìýɯmO¶ï}FDÌjU»:çüªÌ¼å»ïaX2ôhñïàn@Da: Ä¿À?-Zеe²}íç{ófõ+N±«UÍ*"sí“ç9õôl¤¼yµ‡tÎÜ{íU̵֜1Gñ-ŠC¶ºbŠéÌØ-WÜ}Ý .0 eŽ™á™f5¨Uά6æì,bž‡¾ÈÕŠ"â¦fUTŒšN9ï=›«nµâ$Ž>'ž³I‚&–d]I9ÛõX_Œð(…A*Iÿç¤ó¥ë¿àòõr?. ¢Ü–-)Ÿ?+4P-ûšƒðâz\àAjNʬS  •¿b÷KŸým™ ,ËY_x ¼(4éEntù}¹ÀÅýxY&?Ÿ |Îø<^ €×øÇÿ³/~_ ûK>~éô—í— |ùß–Ûþu:¢KÔà —íkðì¸ÀØ æ¿s/¤ÝÏñÿ~ñ(¸ûà-¡Îúöÿ³' qIöùŒ7PžçóÉPˆ²ŸÁ‹J7ßðþ/S·tãý‹ ¨iöËKQºù ±w)Z–î§`˜\ayOr‘à”’ì/ŸÏ DÉþÖ8‡‹~¿\(² ž ޵÷4âp(ÎWDçLs¿ºÉÌýq‰ñœ™†Äö:ã|¦?dÆ~æ¸7Lùºs¬¯„¡‡ý“€ƒW®î„ytL“]Á›Î$‡„J©½Àa¥[gNèeH‰>Ù'~åê=µƒí•£élEëà¼#Ç='5nDáÝ­gwçΉá03M‰áœ8 ¶Úç«t^¹¾ut[GtøJñ.ƒd4 ~€1™òNpÖýl¼u­c´ŽzÝ û££­¬÷zu“©ÛÌþ^úÌy êUÙô Y%F š„ œfGíJ朅uð¬;Šg{eØòᬜN‰ûãH#Í æ$œs^wBU;BUŽoÏçóÃlúÿ¡P¡?)ý¨Eß’mï„7¾É,¦~sÛxÞ|JXèF®E¼Òv0OޝÿÌ‘bÅ¿KÌÓÌ3’'µëL¡u6Ú섌c8Yb­dƘ‰ªäØyh‚P7Å;Ÿ’iç‡ik¡iàéö1ÑÇÌ\€ã5Pee*Ýò¥{œbf.ç‹8Û—m°uBTðAháî­P7>T\ÈéŠÓSâáy€qbµq„:r<9î÷3:GÈÙÖgæ¦6ø™÷V$FU*ç¨kƒÕ'Ôž89ªÆ“ ¸Õ†³ œHYÎ ÑX ǤÀì+ HP*ð«Tƃ ø¥“¯F¢q!6®ZÜ„ Ù8eeÖ Y‹Ñâ5 rð\’÷‹T¨¾üž.°$.ÅÇ2ɸÔ|6=ø¬e¿L>—] åçÄKÒ?}–Ñù÷Íÿ븯Àküc¿lÝ·)çÿ%$h1–ÿýÇùòKúâ —DèK€åöÿàýI¼Æk”XŽÉwåhÿï¿À`@U’~ I׆ÕO|.›e|ý\H[_Œo¼{ѳöPà1Ÿ)ô,M~·Ho~fæ… Z^§ò\¹R\t­@pn‚/ ìGE,ѧ@’Ћ^p‹ãïKÁ ¼L*)\ðÞ~ïÞ9j1Ó¯ó"ñ| éÚí–4ÍÄidž"â2«bFÕt Í q Í™ó1*ƒÆLœ†ÄœÍé´)XóP;Ú5äèðÁ>§ÝM FG¨Lyç|HÔP·žiªùñ·'tš9åXÃZ /¦e+6»EYI¸º5PΞýƒg8>}wgF\ó÷?Eî?$æl¦buóX&1l½öt[{Ïþ!H‡%mÙ`JÐ9a{¡†áœÐlFf9eV»DŽŽÇ™iJ{“Y ŽX’й@7Z6«L·QâèØ\ qrïàZÏ›·ŽÓ^9çÌ IÏ0Eë'ংõNŽ0ÍvLÔâ4Lç\ðÔ±Û5[‘¹ vðNZ¯ÔäPWE2öjå¸yP |xrE·>Ñ¡l:#‡Ú ²¡7§ãiH¼?e¦¬\9Gã`}¥dË—i×Mޱ7„·‰Áñl&cM‹ŒÍ\uÇ”qjɰ/ÇýY•¡h‘ 7é%¹¬(Ó'¦ÔôY9e¥Ë ì0(_ÂÚ‹‘Ń I­p©×o<¡ò¼¿‡1%\Îlƒ0D›æd`ÔÌ)îëÜ|å9=yžžaÕAÓVLs`³uÔME¨*šµçød…zÕÖ„fG?fóÀ1%ž5#…Y`;¹,Yzi*d¤¨ÿc‰=­²~!«© ådÅÙ\‹S.ÅW6“¼˜ÍÙX”Rˆ˜_Lâ’ØS:þù…üû¹ÂÐ’üçbé»ümJæÃ‘³~Æ5øý""ꋼè2! Ü¶¨)0æßŸ|Y \ Gì Úk¼Æ¿&¾,¾Dðä/þþ¯p–øò`—/øåíËýÿìOà5^£Ärl~Uþ?\”z^̺.Å@ÑÙ÷‡ïœ¯üžŒè…¼û™ä–¹+Ê:î³×þ\jÓºí\à>KÂþ¹Lÿå„, ¹w–ð/Øüªàþ½+:ý‹|'\ö÷Bîeéò/ÍòÏÞ‰WÞejáÅàU¨EÊÓù@U½M‘ð¬ÊÈ#ÏÏe$*Jš­ËHx—¨[ÓXŽ™yTö½™-µ˜ TÛÁñ©t§È˜l_¯o žgK²«Ê£}ÐÏØ® w=œ3§IËŹ.ï5—/¦/ÉOÉh6xuTÞ؆0MBÌ/_–~6•ÉÙTuD„~2˜ˆ÷BðBð¦ 9GÃÿÇYq¹eŒ£%Y œ¢²2"|æp4Ȇœf¦9‘Eh½iSá“Ü]™ZÏpRÏ&‡ê½ééÏEò1Ç|´óBë…»‡¯„¶óÄh%gÒ,ôs¾@˜ÆS™ÔN©E˜ÎjUj©ìÏÄ‹â”ÛÖdV/Úï@Û›­uú}p4PwžªŽÏއ'ƒ¿x±Ogw 7ï hóñ'ÏÃÙŠÉ™œ2Û´Þ`=1f‚Oæ0‹“¢Ñ$A}0>Ä„uµj︺ö!%¥©¼Ç~„9%b´ÏpŽ©¨Ô”ŒBº×¢šEù|s²$wPe¥ŸÐË}R™Þ¸`ºmQ PŠ‚—ÂÍ úÑŽ±ÊerªZçŒSG]|íñUæö­ç†Õ¦¡ÝTÄ9€X‘>ɦAM 'û@ÝÕÌsâq4þÇyÁý°”&B‡,! ¶³L,y7Wâ”±LRÊÌ…hSzù”Ä?fƒ­¥rÛbF&¥øZ&—¿c²Å7`!§Ï‹¬å;вæÓÂX …ϧ KC`ù'²”}K‚^ A‹›¯”®ýâÖë ÌG–‰/‰/ÒžK€3…ó 0’oðá2pb’ëBú Þ¼£]õ<¼ŸÐÙ½ÎL';¡‘@»Æ^ÈÑá|é*ççŠWBÊÔ5ÄÉJ|¦¹\Ä<=;š`Ó”¡W’&Nª¼íL’3ÎŽÓ LjvDw­gµ5õ8Z’rž­€ÒœY‹²Z;êÆñ°4 2 >V‡ØúÕ bPŒÚKE˜ÜiW%Kæ3ô†¤ÄQ©Ô’f3S¦h¸þÎCŠ–´\WÕÄùœâÄœ3.›ŽsB*ÆkU²8šÊÅ%˜e:+ÍJ¸¾óž”ç¨828OFHšðjÝäI Wå>ÆBF¸Brï& VDxsm¯q:Yì¹È=Þ ¬¼}~3VX-¼ç ¶Õ'裩g˜õ]!*?<Ú{[‡LJμFcΤdÅæQaƒðø)óã½’e"ˆp·5ÎÆi>•á!!ÞqÓ›­ š÷ʨz×Âzã˜GŒ‹¼#9Çý "æÒ{’P&] Á\Ü™'cùzg‰j] mdï.Ó˜X> -ßßRý ÊAMŠÔ—c¡ ¾¡MvÓ«Mo¶(ë•©û ‚óæp: ã”.Êí:Ò® îs>˜çƒ ‘ûo¿k µòÓ÷N3ç~ v=u›MAˆ†¦i¸aƒÃ±Ž3§2¹r>ؚŒ$›2‘%䉔-é÷9“³c–ŒwF4¯‰ÌªøìH.ãñ$±¤?‘Qµ‚¯‡=·”óÐ)Ò¢DäŒâ²0¡ˆÊÅ'`Î/üWº0Ö{ÔÛ¹ûâ] Š¢’–)……ÿ¬X óßTK~–DíÿU˜ÐBޝÉÿkü#?”øé×µ4(—|þRÄ/èþÀ~9ø×9’½Ækü±"ÈKr½$Ü”IÐÍÀœIè—®z9ÐþBòÍjYºF¥¨K§ié,-ܯ îeë?Ãå—»~¦½oÉ¿~å¢xQ f:´xÝK‘à î™,zÞ¾Lr)(LÈáT͸ËùBú ¬|@œ£užUë¨*› c„»;¡j„3ÃIy~Œb¢Í™Í|€8ÙgTw¦Þ2öŽiDrÁÃéͪ¡®4Gúq6©Í9’¢q¶æÖÅßü<§ûŠçO¦Y_5öqPNYèŠÌk»v\ÝzN{åtHœ1hÉ\Ô†ï¹k »çLN‰8[B{}í}3ÏÅé6ÆÄuãp!pœ"ÃñúbÔ$9ÕðæëÎ’¾K*†KçKl¼ƒ§"wÒ¨r½…ÝãÃo”1ãr朔®½ãnç¬ÚšÉ׿Úà*磘$k²ït?{|JôåXÜ.D9 pµÖ[až„iTú³R׿Î{:óœh;+LŸ;7p}ë8>:æÉ*hʦT$BŒðÜŸlº@)®+쟀ILâîfãH³¥ªàùVkGÓ™rT·©ˆ#E 6gG³RRTΨêÄyŸP›]f*ÎG;7sr©øÛÊÑã7æ!1ÌF€U¦B¼ @®mX;åÝ;¸û¦ÆW-?üZùþɱiRb.P¯Fd‹¢N£Ên'ÄèxˆA€¶uÅv¾rÄ1ñðã@Š™í2ž…•qRæ(¬Ö‚ª#„Äp8q>$NGåúV µ0 –èÏ“cž<ßþ¥ã|P>~R'¤ì¸ycP‘Pˆ±ÇÞtÏ3Ê›6ÓŸÃ)SÕŽª4Qùî/ÎWxŸ8>CÕ OŸf4Z‚]Õžq¶Ïû¿úWg² st6ž넬jGW ãhä×_ý˜/nÉmX]©ÒTž«7oÿÊ™±×Þq|$¸F2Šðt„óÙ>Ÿ?ßU4+èqÊÔCÌp>à %„¬‘Û½ãîkÇj-|û×5ëÛŠñÉñ|Ÿða&Tpxô÷6ÁǪ̀WæIxzšÆŒÇTL‰é±WES¾`R9áú¶7J·¶‰Iší³ØÝyŸî3‡>2=eº­À¤ääÈ8V“#8|, •Ù¦oŽÌ鬬ÎBwΟ"UíÙ\AÕ(¾ÊÌ#|ú”Isæ8ERJ¬€Ã³°»Jìn=ý)´ðl¼ÐTžºƒÐ(ûGÅϺʈ(¡s²•ãǃ78*ûxþ9a´åì„S6©ÙY­°k 'aÕ8‘ÇIè‚c­Ø|2~¶Žûˆ¹ˆëªZ¹ygçÖéY˜x2¾²Ž|ŒÊóÃÀxþÄí·[¾^EêO }q ŽyÆ‹Ãåhî¹! Éy’KÄlÅÁ2%ð’ȪÌÎ8%Áe4›Ö\ºóN5(œØDË“™ÅÌüRVÄ\gIú .dI¿M J#%[P‰yEd5ØŽ¹SàLÖ•INñÉÖÛä,ñ÷%qÑ…@\2ü…3€{iØdS´÷à¤Ö<ºLw_ã5þ¢+ÛåýÚÿ"jR¶‹aÀR|9îúÒbxùýõÇ~§¯ñ ÍöKw¬Ü¾À{TK.‘2‚.ceqbpŠÂ¨õe"°$ÿê„°i‹š†ãÅÐfQúÉj þÒµ>ëÚù’ô«ÈEÝçBâ… ¡ *¿WËsxGp60ïÂ#Ó†bäµâ<+çàèÁ-“O*Ö­Pµ39Έ$vwЮ”ÇÊz—‰Sd<›&ûáK\ñîDN°ÝÂÂ'æddâ¶WšÊüVÌ“ðîçÊùN‘mê`î˼gDñE¾›ö3ƒsÎü8ÀõX\tK4û¢6ãáî§éÝ&0 ðü4‘às‘ºUº`ÉíatôÀljõé§‘íõxqí Á”…B•ÈQIIIÁ“r溨¯¬V–$÷VXÅpîÆ¾n\¸ô€<štëj=±»ñ4ÝâÀ¬´žz…ÃS¢rŽUíØn<ÝÆX3óè™fÈdn‚°?fN)™ÊŒs…£:yTÞÝ&æQ¨:áü óœ`4>ÃÖ)g+ʘ3+”¯¿1ùÛáT1¾ô”9BÕ›#'S÷R„y44¼ýJÀÕ8ßÑt5uçXí¶<~Úr˜XARNdMÄÊ9sbŽ3sœ‰Þ€ÉäjÎÄb8—‹ÚO*² sQüùRèâR\ý¹´ä¥ \HÃóg÷ó \è³åuïˆ*S©g_-îÃöÚú¢ôÙv‘#ýÜDlQ J_Ü–€ÇWµ“×øŠÿ°lû²Ý–í窆a!ÿ.#å8ÿCzÿ¯ñÿØ£¢¾°ãúÉY²ñÏnSµäÿóÛ/Ä\G1ÓZL¾lt½$ò î¿*§Up/Š@ÖQzQèY WH½réî¿p FÖ}áØ"a]ªÏ±þKø Ñ×/+¢ëï<ë²ïÃ8çh»šP7¬¯M30œGæQ™§LÝšÓïÎeúƒrÞ'rŽ8f\œþåÿûž8G2ÐVBÕ8âl¿·_{\Ü|“! ÇçšßýC2ò¨®¼©Óó̦t5“XÂ0«Òª2{Gã+ºÖ“câÃo`}ÕƒÂ÷/tk‡÷™•iÈÜÿy3Sé0:gïÕ‰ãæÚ ¾²Ž~š!‰±|pœ¦á~½3Ò/ê¨j¡î„ãcæú­G|Íp4õÉÞH¡@pž·µ\L B53œ2»;a«ûûãÄ„PW©Ê”hš9•çC¦rFèm+ÇÛeš“éø‹ÞŸŒÏ±uéú¢‚’…±…^L ´Ç:dpJœ”a6J¬3|3ìÃÙñq¯ä_g²dÖ>ÒxåækOœÅ Mgå)Y÷ú¶1S¶míHV›ŒfèϦ䔓I‹ÎçÌf-¸“ò•)*_ÿ¹Ðm+ž?%b´Dlœ2½øi˜GænmäÝÇ™õNX¹Œx!ÍÂp ÌQè‚I„&…Uc3¸*ëE¶ôp‚ãÉNÒ®U¦òM™þ¬lvp÷&á\$ç€ùñÙÓ®Mzuµú£0 ™àgº•òÓ¯3q†ŸýM`uÝòî[ö÷OŒ}âã÷öÉÜy¯½p÷u YyÚµp|²¢´REæÌ&:ê”ñ%a²£SeÂ$7ƒ‚ Êy_ûU&EO»†yTªVÈ1S7P54*u@2q¶73óäxþ4š‰ÞfÏúf‹øw‡#”Æ„ ²S|ñ 0þC¼Ç‰‹ä1…2ì3ÌÎ`m`ªbÑeÛïlü«Ym=›ÅHÀI3!›‚Ë™ ¡˜ôEÁK±¢¹ÊElsG_—B!”i@ãÄ.”Eç>|V¬8ì~Þ½@‚8qTEÚsíÍÑ× ÇB¨+ÚµãÝ/*Î8>8=,çêNI1SÕ3¡RŽãHð=RÃio†@ýy"ÎÑDöÑ‚7Ÿ`»ç2‡Ç‘8Gž?:Òì˜ç_5\]9šìïÍô¯þÆ3œãYyþÔs> m¨kOÕ8n¿„øôCâ|Œ|ú~Æ«Òù„¸Œ¯”ǧ™œ­8ëÄ’ç,јpŽÞš¢Mu‚7_ƒyÊF\XK…*\ßBÕ# ÏŽÛo2qöÌ£uO·o2§gøö/&âä •ÉdNçd>ü®áÿ|àtð¤9²¹V÷Â?üÎd-ù¼M•ºF©[áÛ¿r¤N‰Ó>2 ‰:gN9ó¶ÆÉ&F‹é’/&IÞÁN ²ä¼u¯›ÎÉu“©&%ãv8' g!ú€ËÊÕã´:U†i÷>szÎ g%f¸¹õÜTJŽ™ë·0Žý=Ä9R5éòœ;'Ðåy€Y2N3÷9Óÿ-lêžvåÑì²¹;·E-¦W¥ÕHŠÖUnjǦ€ÇyOÝ:F2UiCÆyØÝ8žï(¾ÚÚiè=ObZö)SÕ™ªRNû1Qx~{ãÅQïøæ[Š{´#͉n›èÖ¦|ô|ŸyxŸ™‹Œí¿Œ„jF¤gÛ+X"ûó¸ð(äÀ¬Öµ*Ý6ïJfêgžUi{åöÆëºs4]Ëj“ÁÕÖ)Îg:¯ˆFdÿqóéSæí;‡æÀéìhº@·B°÷ÙŸ2zÈø¤Dïq8ƬQÔeBIHC1ºJýd*<Ã1SU¢cÕ ¢Â4™ÛõùiVB»†iƓ眬Hl׊xðYøú+ÇùØ0LF˜½Ê ÎÊyÄÅUY ³’2 ¡hW&¦ÿá£P‹*o+R®¨s^ sšËg\+ÝjB¾ºfš×Lƒržâ%ùÉS»Ä˜ _ÀyÆMR4E4FMhá ˜á©9òe ‹d(/JhªJ• nî½V8,†y>€G/†\K.’s@æÌTxºð›)by!üºüÙT —Jq.ÀÉ|0^•^ãŸBü¡¼ýÂø´üáKèÏëùðjáÜK² /М‹*{á'—^ìoÕBÈåÅ8 W`«*Ò®°LÜK¢‰ÎÏ'jâ^8Kâ¿<† h!Û`IEÑL%†ï÷çî·âÀ9çñALSBeDÁºu¬w43O‰Ãƒi÷7aÅÇ10õ#óðAhºŠ¦Uª& 3žfe ƒ'TNˆÎ²²òÂzkøÿveôfU¸ŠÛ¯UçIÇ 2²½±¤&Ç™ÃÃHÝ(ÝÚ™ãœøp/lº™v í:0OÛ¯·ßzúcÍ<9¼Ÿ8Ÿg¦É\BCÓù¯Z¤8')˜aUN‡‘œgÖW3MWÓ­…ªÊ„T¡R4MøÐ°¾J¤è uF¤¦^7t.0 Ó0á›È|2U›8ûâ?¥[+ÏŸ2ωÕR ™ˆukwÎ±ë ŠQÕŽº6×Âj h`ŸèO3)Áᤈ:®Ü~#\¿ ŒgÇ4&À3O¥÷ðÆgN{ÇãsbŒ‰~rTO‚se"u”«`ž íºBÄ›¢P§Ü¼…Íg<ÃÃOÓBœ3i6߆·_Áõ]`µõ̱&EÇÔ›JÍ<9ºM¦é E;–†Á‘³°Š™è>+£Úû1S`ëGcšòxo²4‚Z³ÁyRú“Á¿æqd<;æ¹î^x¸7=Jç<*6WÂÖŒ¨?%ú¨ˆÏ¬j¥3ê2Î mœ9–‚£n¨˜ÿŽn[Q5 ãMÅæÚ¸ Í ¼7×qöOޝÿÌQw‘'Žû–”½uù5àÝ 9ÑåDŸcÁUúœˆ7íd&uIòâ l>䌨ÅÚRHÖ¤‹ñ°ÂÆNV–bX„œ7em"›¥Œ”Š€‚ª’Š¢”s^Õ`?æ·R`>¶*Å·Ò(’\mÑßSzåÿ¾ÆŸj|Éå]â’Ë,‰ý2j\ä@¿œŒìwò¯ñoë¢/EÀBèò|®Ñ_:ý®hÿË‹êO¸Èsš"ÏóYÁ¹p^Œ»ì"„˜3& öÿ3¹ÏEél¤Ö u²ò…°ì_)r.ÏçÈj¬8‘ŒdÁ‡ŠÊWT!P9o.¦Á1š¡ñloZšuC³TN3û‡@$Ø$qñÁÓ\;æ)Ñ®mŸN{!kC³Æ!â]$ÇDvîb¤‚gsåØ\U¬¯*B]sÿSbµu¼ýy yfÿqFB]Ó®2çC*0¤šÍu$Ô~íqÒ n1Àã‡f9­ ^Xoí3Ž-óäp>|L:Ô;|ãÙ„€–©J¨üY·æJº¿?Á»òägŇÄÛŸWŒ½§ªsïH1Ç“%VyÏé±Ã…†á¤<}Œ=«õÈ48΀X\‘…nSÔ_DéGEg3JÁ“U©ŠZI,>ÃÙñæ;åæRµžO?¬ÉùL·u‘ÍÕLÓ "D˜GHÉñö»Ì㇈*„ÊàbóÀUÌ£g%™¯®ÎMæPSÕJU)¡ŽœöÊxN ½g§ghV§gÇnã¸z£ }æê%ŠÃYxüØ\›að4)6 ˜SfN‰ Ž®Vv7Jœç½uÈçÑἩJMCq¦3bo%à‚‘yC%œöVL5;×RÊtµcÌžS9¦—I :!gOU;ºµ'´ ««–ª®IÉã<4-4+Ï4:RTê6²¹QR‚çûÀÛŸEªºçÍ×3á¾åù±Â©3U^ÔÌ(Ä`WÞ³!:Oȉ9%[+³Ãçd‰ô SSíYä”SëHQü‘Ï~VUFÑŒ_„¬hèD VTÖÑ^´Lf`±¢øN.ÓÝß/‰‹”¨ªí›ÃÃÀÅ¿!8Ð+ ø5þTãKnï—Ÿ°Tõx‚e„ðùc¿“×xƒðð‚õ‡‹ 0åö—Ÿ)Ò€å1®Œˆ» T‹KW¿t8‰Tµ²»Ûðé·{ÄCœ=Û0³¿ŸYï@³c{W”|B$³ æüºÚÀádI`ÛÔ8NÉ.ÆqÖ;‡¯†3¼ûyC»ŽO's›urêyøIÙß'BmzÿÞ{ª&ðoÿ[þóÿxæ$‚Ã(´O§˜zo¤D2qN¤ìHɳ¹ÊL£}ÛÊ´Ÿ¶7žœ!ÃÕO½fûLNBÖlε²»U†ƒâ+‚±ÀiV ™þ8pzž˜G%k…jENŽ©‡g†³2£š¬çÙ4âsJLIXKæÃ™R¦r Öy_«ƒ78?g6W#‡'ãJää™Ï49šÚ’ÙvÏE½Ê? Ãydµuln*šU` .ôøS"„T|¬HiWJÛA¨¡šy¾ÏŒ=à;âÐÔ«·w_ÍìÆÞºã³ÒŸÌõw`È0Š9N¯€ug$Ô8—‰Æy¿ÏèT`>9Sf-‚óœ¡nÚ:0{‡oU u㈣cìëu&O™ Ng+á;”ë+Ç›¯…q0uœ¡7YÐ> ›Æ°‚`8;®î¬Û½ÙyŽ{¸ŸéOJžK²(loàê 4«Ì.Ì©?Q*¸¹vL#¸`û\Õ©ðBŒâo<çƒAn¦1¡Ùü,ê&Ón•±w|Ú{®[Ç׿À `µ‰…+ŠGu ›lÇ™bÇq•…ãl\‹Æ »kÏúÊ“Õá|M¨[šuK¨*T3íÆÎãªuL£'%Óù¤ˆ&vw™ç{¥?FºMEÝFnß´÷)VDg—Wâ8eÏà"qY% Ê|T¸$ÿ¢Š/° Li„¨)Åb&´è{Î"TdX µµSbζ&{û¼ÚâPœÊÚžs&©XÍJ턃 ‘Õ>[ûêÍ9ØËf)&®K3fán½Ækü)ÆP¶ÿ§²ý’о<¾—ß¿ä¼Ækü©ÅâðëRoÑw» xÄ@=þHñȶðûâ)…1ì–Îq%ý^´ø qî‚å_`ÿغ˜‹¹30èOQôÁÔ7#æy^¸`[r²N\ëhÚ€¯+BíXíZ4MôÏq!Ó®ã9RwÓóxdµU¶75íUâ—ÿÉÀúº¢jÔÔIîí ¦¡áðüD]õÔ9ªçÝWkö#Çžœ ç½§i ?f:gÝÖ¿M„*Ь=M»A$3 !G”ŠÕÕÌá¡gB·ÎÜÜ:v×€(¾r¼ý®bê=ý>|r¦*&r+ïØKb“•uð¤?*Ý&³¹Jå{õ¡ªWw¾Rrö Ç™œ¬¨*{ü§ýÌpŠì'¥ Bœ”ªÎlvŽÝ­c…§¦êÓvV„:o0¬ª«A÷?Yñ]wf ç´IVUešµÐn¾êpÕŠáÜÑŸ ^W7‰¦P[âïƒñúS2'ƒ÷üø‰7ßšq68Xhfv7°Z᫚4gbáT)âœgte’qÑúböÖÐPSù™Dhc^H½—¥©" š™R..½ŠXÏ2=Ø{Vïñ®@±²’²q]¤‚]Q=ÓψÈ~qõòF:_ä—r}ƒ ÑeZLÒWøóküÉÇ—ö‹#ð—rŸòÅ^þ×øS‹Kw}1ñ*Ê?~™^/ä`±d¦*…B#r1sÎ&‹Tç"ï¹ÈqÖåâ0‡¹L)*Òð޼$ý véî×Þ[â/V,W»À]]™˜î¿c[{Bå¨kÅ%ÅHU–?Ç •@¨2çƒR53ççHi×Ðl?ŽÜÿ0°ÞÚµ03ï~¨¶ ÄÀO¿‰d]›Ìf€¯ÿ"r|ì9=)wÛšÕ¤÷W9š•Bâéc‚¬ˆ8Ö»ê¢Kž’²¹iÉ91œ`LÈû™ÕV!%þÙÿÐó›¿Mü8WÄaäÓ”hTïAáÍðõŸ-e•}ÈûxÿÛdºòúbò³²ŠŒyª6ЭœÉ|¶9ÙÄ¢ÛîÎhžQ…á”ùôC¦jOl®žÙü³Ÿsû󎛯¯øðÛž§÷'Æ>³¹VnÞIi¾ªP 8¯ŒýL·›é5çc¢#sÎDIM™Tû~5"n¾ ¬wŽ›o0œvN&sÚª&Ò¬<Í*£*TµM¡ž>ÂÇß:Ä™|ëæÚà=ÎeÖ;ÇØgvwžª¦~¦»ª˜Î )FŽO3ÿö¢[7ÄÏGp|rä˜ÖÒ§ïG²&žŸÍ˜KTÙvŽ Åâ>|*ÄÌãij*)ÃâÍwÂöZøþ_*ó¬L=ÔMfÿh~wß:tP ¤td>õ¤1š‚ÎJ@3ã ìn;674'¦ÑQ·Âùàèž9Œæ ¬B<)%v³9©Jñ4¨Ç4$>}?3•¯ÿB©¯[\ k8œYm ÿ?õi`sÈ£'§29y“˜Fƒ‡å¬æ +Hä8³¿7_Õ̧•v52 Юáôìxøqbš”ã1 1Ѷ–ÇßGb4¸ÈzkÒ›¡¶â7Ï’ò“îœp=˜²MΦu:+מgã™)BŸ2Læžëž„vLœ×œöé:|ÎŒ)!säiœÈs4#²­j¡ª=0 ŠF3¤ åü®¼ 2qý®ßš+µž”*¦)±ˆ@$geìá´w—D{ÙÝyî´¢àúMæÍÏ!ù UG·ç[ÆSÄÇæZXíѾeŽ[ºëâ2M30ö‘Õ¶©™{%dPY3µ·c¹òž&×älžI-ÑKÒŸSЏœP5—á\yù¬±jž𙿀½–8# Gu2NL׿*F`Y¬‰`Å[_L½ÑÄr\þ91DØg6+WÈݯùÿkü‰Ç’×/ÎÀ_úü+ä€%>ü±÷ü5^ãß0.^Ÿ%õ²àýBXQ‡ñE“ÜnE ¡*fZxW’vhÄyÑöï $hIÔ“ËEÅÌeÜ"¤E}ù ¦_ø=-ÿòZ~™ø@í+œ3ýîÊ‚³ @ÂmíÙ^G¦!Ó®aìà V»¥4óÜ}ãÌÓlj”qŒœÊyo˜ïºP²–¤ºÚ¶"Ô áñ~Џà¸zS|’"®fû¦£n·ì?õ '%ÎÂ4ŒEnÕ¾#TØ ¶¿ÕŽÙqa«&¥9 Ö¡|ê'“`=÷ç=í6ÐnŒ¤}Þtɇ¢ï~6·o[ï?ÞüÌ'ã8¨±yµËøàøða蕦Bð¤Ý&Òm„¿k—8ž•¦².kÎ3Î Uíp¾b޳MÅ¢2œ ¨œ²½Ò£°Ÿ3?N™?(«¬d «¬sýæ+áݸæ§ß|êgb†iÎ< Ä£ƒßÙë]¿éI±aèç˜8Ĉæ\”aÌêþ ¸½ól„R`!Ø—¨ qóÇŸà‡gZŸŒ´Ê‘œ…nm$æ÷g3!Û¶ŽÝM`{cxþý}¢mExúh²1ßý£úvKÝnÑû9ÚäÀàˆ¹"¹ÄW¿È çÈxžJG_­0ó0%å—¿É™øê¸~£ ½gµqlÿ¼¦ž¯ùô}æðpÉüüŸ;ú£gì3Ê<%v7‰›·Êã{¥é"ÃÉ””ž"?þf ilBÔvެ×oa<Õ4«šPwl®[²Î¬oÜÁ£f¦1À{Ïöç‰Õ»¯qÇ™Ø'rj©4ñõ]äðxúØ0BšÓàˆ¡!¦Å O€”ˆi.“ÎhI¸f)çCäüœxóÆTRRöÔµðÓ‡‰¸?RFœá¨ÓœiW¦`ã¼CœcP|õ&0œMæóökGÝR4üaŸ•ý”é²2‰gi߆”Øm¥˜û)))χ̘”Œ²VRÎøâíqêM¿];t´N¼ JÓY^Uʇ_MŒû+vw7ßvxW³ÞfšÆJÝ(›ë ” 猣#<ü$Lc¼L+.ÁŸÞî§2uûÌ4:ÆìxsHь¼ƒ«0BÓ ÏŸ„Ó>ý™Ç‘œ³ÁìBÀûlÒ¸Î)ÏŸàôœØ\ŸY_ÍTõDh*4ܰ½}·d}å¨ÚšÜ¦ï?Å}ó3B@?ÁãD¨*NÉ>‘·×žº ÷BN‰2CÛ(ç1óáû‘?\½}f}]ãCUXíBm²“ZxsL$H‰8E†“’c i=C¯ }ñ\¨w_×Ü|Ý>üòL4HÏõ2‘ºI<~Hì°DÂÏõmË»Ÿ¯Ù½éؽmqw×ìÿþÈþþ·ÜÿtâÍ·‰áÜ1œ#Ã9RÕp÷çí?[á×-mL<}œYoáøœé{Œ¨8Û‘¸]W|û—;º£j2Oñ7ß…I C"Lj÷°PB¥|ü!òô‰ªY;ÇöÚóøÞ³» \¿ Ô9«:Ž{Sâ©;+øâ¬¼ÿÉ&]£˜'ƒ }øMÏáaâðp&ÇO|ÿ÷g¦afs¸þnÅñþ §ÃGæ9áƒZ¢ö˜ßOÌcf½™@×_ЊþI)0žFV;Gèm›©Ö<¼Ÿ¸ÿ1§Œ3uãÉÞ”zÎK´êÎѶÂxV$YÒãþ>Q7‚<8Æ“csãØ^;² qL_1œ=So²”»­'a˜Ò­Ï¬W†~~>ÀœÀáØ®”íM0ã¸ÖΟPÍÌcF\ %¥ÑŒÏP5²ò³µC3\åDL “2(d/fЩ@3:/¬0;!z¹tfk/¸ÊL±joñvU]Läš•'¥n3qJŸ•ýr(Sµ<íJNBº7<ø¤Vp·ÅI¶ p• ˜Pò 0 Û êJhVÐLÿ]ŸŽ¬xoŠISqñÚ3Ï5ÍÊ‘æÌ<Âã%§È”  ÐtÐm=W£¹#½AÛÈÆÅ{›¢=¼‡P o¾s„º£¾¯ _Ã3MžÕ.²¹1ÐýöZ/†šzó ñ‘͵ñ Ö× Û!%Ï<š *t;a"â’=ã3Ln&å‘Õ.’æ UëÈQ‰O 3RØ­q)BžÐìÀ9šÎQ·™çû¡LÞì\ƒ¨¹¼ :ÄyÓ"pIÈ’@]1óR$'|qÎ.#Å¡x÷Tá7iUÐôÌGТäDˆÅ³qTs5„Q… JÄÕ.‚ …ìJ—%òâÙ"ÅW`rx×ø§Kaû €%^É¿¯ñ§-V¤Ï =¢JpΜ)?[Ô<(µ-Éúr¢¨¼tí]©Š½3l©»¸H¾ptQâåv°ç¨àBêõEoZЦ?X¯^‹—ý¢ä0½ÿÊy|p„ºfµ 4Í!æ¾§nà|t4mM»QªÖˆp!$3ÍÚÓ©§ ç“gê…8eÖWgRÊ\¿]QÕ+~˜Ø^¹5Në«ÌîÖ€v?ÛAP$ÁÏCENÊ4LœŸG’›©먧‰aˆ\Ý9ÞýLÎb`ž§Þð¸)«-w™ã! 12§Ì§í+úù_7l¯=ßýUâþ§5ß|øaÏþ!Ó­g|n¿ö…ðZÔoªHƒÅIðÁsÿCäð·™@ŠÂiŸñA™'Ź3§YÈ?)ò÷ÂÍ&ÐtžwßUìÞyº›@<+¿øWœžŒçÄù ìö8_á\…ªàƒ§HŒ•Áo܉vmäRøøq"¥±àóA9>Z½ÙÍœ÷0OÐt&9ÙŸŒ°i„~PzUêœ aP–“%^ýɰêηÛH™)9Áüîáð(Ô­'TAÕ±¹6’ªéòÃp²âwÁ—·«ŠnSóð>Ó®”wΞû÷ yd„ª±÷2 JaŠJtB*…³óVt7µc,·VÄþàØÕm]œÐ­ ª=H n¨8íM3ã`2“š=›•y`L¦IXïì4ê6–x6' Þ/§L[Œ¡®7ö™ IX7Êùœ€eŒÇBRúÞ´äSi"ˆS|¥ ÇLJû‡’ôjëxó­޽IyÖ­PwE0 h‘À5©ÒÓ óOØ@³¬®ó¨„`^¡úsàÏþ¹­S§ç†óAùö¯@x|]Ѭ+¦ùln½ât6ˆD{CÊÂóoÉÛÛÕŠçOæâº»;3œ)Z—|s“Ù\{rÊ 'åæ»q:«· ´«gr®Þul¯;âœP5å“iR6ÛúýÀxž93›+ágÛ†Ósbì•v«¼û¶âþG“0ÍYùá—=sÌüø+…?«y÷óŽoÿ…ãÝŸ5ü÷ Ï÷/yüx¦«"m ͪB\Bedþ`Ó’¿MŒ#<Ÿ"S)Àš:AÐ *©3Ǫ́%fxxœY•º ´›Žîê¿Ã×·G8eš6òÃ/GæÁøFHºµçúã¼NÏ=š-ñ=>8'Œ½0ÎÖiaµ1 ÚvmþÓ!“¢à¼Ç{O³2|ò!N©BÀEë¤Ï¥©an»6 ¼¨69OÊ™JN3êœ%ð(£q°0INU)X~GUHÕ•˜›¶æLÂ!9Iå"ZÖf¯™èœ9/‰½h1ø”.i! /Êk¼Æ?…øËöß+Û° ”'à%Qùý±÷ô5^ã¿a3É¢°S`;†àÄtÿƒƒÊ-:þ–ÀW`ãc÷âÀëË4 8#ŠsågSre\¼hWû2E0µW %ç\”¶L!å÷U·©  b±!ø@å=mãÙÞugݺMLç#3Z{RnÙ^ ¡´s4§í”f8ã|fègºñcE·»aw7ððS$'¥Y·´›ŠiˆL〄Š0Ï'3ÃÙÑt3O?&êÇ‘f«„džÇ-õjÅúºæðhýn=P¯„œ~ŸyøÉáÃD»®è~‚¦3 Ëç{eˆÐ„ŠðR'wгrx²óééCD™ÉÉL¸rVšNÑì8< t‚ +'´Á`pMë©êP&%Õ6P7Å7¢ò@0R~4UœqðˆËx µ'O»^8 y65&Å1GóMèYk]œf$¦‹  â³&H™P`8fpèˆ9áÔ¼<‚¹8¢ê." UQƒ!‹ñº2Ž\$G#F§™Y ÛÁo:A²âÅ‘%›ƒbp¹6¨Xª‰ß[¡_ã5þ)Äÿ½lÿݲ½Hô5^ãO-"VÐ.zÏRðÿvp„þgòÎRÆÎ‚ÝOtIæíÆZ씋E(¿‡÷Á9“ŒÃÎ#+ÜgüW‹fó‡ËU»0.æeM5#!IXo¡Ù,¨šDŠ#›k!g39ذîð~ƒ¿ ÌÓ_eºu¦»R†ÇÚFí ôç»7 y`u•1m𦠼ý6šÀx®9eæaâþÇÌjcÆVÛÛŠ·?_ñüiâm×Ð3ýq²Bæl¤Ènç¡v¬¯*Öí̺uœ†TÌ2ëRrÔcsUš€w¾šYïƒP{¥®+Ä{úÓÈ꯿¥Û]#§OÝòôaäø<3 ‰ÓóÄjÓ£êðÁÜŽ×;K:wÿVK󿆸02õ™Í ˆ&æÉÓí<óà9*úcâñã Ϋ-¬WÕÆÓn<V­°ÚAœk ¡ª2ó ÃcæpŒUí>éÙÈ8'º.ÑÞ*)Áqo„ßqRJ])Ó˜¹ÿÉSÕ€d'¡M‘‡=|õÆQ7I¡® íë:àœ£[M¨*Ý:¡T¤9¬9>%æîŸ‰ ï!åDÕDnƒ4p#½9Þi qUãØÞªºbì|Xm<¡ö(s‹s`ó0‚zÖ;ƒÑ„ÚÑ®7Tb ? :FâIé6JŽÂþÑ ÑêÆœ‘W[h7Žv-øŸý‚vwÇá?ýó„ªö‚¯dhWÔ ÑΧÄÔ+¡Ít^Ù’9N‰¹W“*?üZñNi¨;#N?ß š ÊçƒÐgÁPõÂÕšU$§Lw§dmú‰Ã)“²Òó‰Sfó£½ò´)³­<âŒ<Ó‚‡m’q|6»Ù:ã³ÉÉNcb{c.Æ^»¯®©ð¾&t‚K-‡Ç™çO œ|øxßÓ¼Ýâo®`<ÀÕÏðÇÙ÷H“™ŽŽ<öTëTéÞ ãcSH´a¤iÁûçáðMZ„r႘qX…#©•÷Rx[ÍîÜ ç‰*hÎBåŽ j{ *V´¬ýç2!éE©â°x´,S`'ö ‡Kdá‹ñjöÿäââûÕ––‚7þ±÷ì5^ã¿e\¤lóK…+ ¾?,Hœq*ìâTˆ9íh‡C‹§a–µLhNŠƒ°.™:ÐB.°.Ó‹hylÎÅd,€/M)ÄtýÃ9oµÿÁy¦Ñ±¾ñ\¿«ñm¤œ Ý7¬¶¦á­Ôø èœH]EîO$Lý„MÛ›Ù ý{èv†ÇR8Âp¢?ö8´‚ºï…®;sĪÆðåq†u#¤ñÌx„GDÎÏ ZÓ2šžÐÙÞúsUTŒF2¿þ/&ÎÇÈ„MI"ð‹ï„¦«Q \½ lÞ o¶C<Œ§‰ÃCÃÇß ìn•Ý[‡jB‰ªÜ~µFœðÖ qö<#ÄDÅÈ_ý;59×4]K³ª¨ÞUÈõŸ“~ý_{sRõÁÑ^ ó‡ ?üDsÕ²ýjÅÕ»S¯~÷_©Û39eœó´›ÀÍ·FpÊáã=ãàÉóˆ3×o+|Ä)‡'ÏáÁ”7oWüüzMŠÊù¾Êô‡‰þ8à¼i¹¯¯<›ë†º+Û:‘ï"›0œ­ûçÄ,Î{ÿÏ?ö¾Ækü7Œ¯1×ѯV¶SÜܰ… Dð®˜É,ø%Á·¬õBÄàL…gû,Ÿ°8;ñ âŠ~¿»ü«|À;Gð†ñ÷.P9Wž÷÷ÛxÏ›¯9×´ë–ºëOžããç3ˆ󖴥èPjêºÁï®Hý’frTª´Î8Í7wÔ·;êÝŠxž8Pî¿Ït[¥ª'žÞ÷|üÕHœ¦>“¢ñL”ÈáƒPÕæHœqž8|:“æ‰8Žä4r|˜™Æ‘Í5¼ýÙ‘Ä¿Jüò?;ðø<ðÔO sÄgƒøYo+RªL~²5·3Rª:°Úu\}ÝRמé\ôæÉTufµ5ÊÍ×?ÿ›kšºãöcÝÖÓm=á¯ÿ9á»ÿU:£ý3Í»k< ¡ƒœÈÑÓþÙ7„»oÞGž>ì©›‰îÛï×>¹~—yûW-×?_áëŠêÍ›?ÿ \?ƒ>±¾nÐ<óã?$RšÁ Ï”±¹û*sûmËÕÚs÷MÃúcµU®Þ4ä”9>Æ"›:S·†c®;GŽ‚â¨3ýÒäp^ŽBÝ(Mg s»®i×Ý­çMÁéσcêH)â !V­²];¶×Å+ @¨!ÍÓ9`:'š•%·í|pÔ«j ¢]YáèC ª=ǧÄOÇÄl½£«Ìï#ýމý§ß+óiºD· Ôm`ÿØÝ΄º¡[ÖW«ë íæŠÕÍ7x÷I©?3&âd…‚¯2¾ê®aýÝÇÓûšÓ‡‰ºµNc?2f†“r> ç§H% ™¨®É:Z‡jFt&T ˆÇ;ðõ¢䩪Šà+›ÆùP&®6gpÉ,‹OKY“˺Ä]š0ŽØÎ¥±ƒñ \QÊe+ÅÓeñòʪE ˆËßÑ—é«–)1P F?ž_§¯ñO'þ=¸@æ€8Äÿí½g¯ñÿ-ãžE›1Ñ‹³îeqWó£iû7¢XŠl:ÓSHdf Z°DYIRLÌs¤¡ñŽÎpŽJ Ÿê TÈ‹uA—©À21Т,ä¼ 稂]ƒL“çêmàê]8B8ñõ_l˜G#{Ÿóx¦éçÖP­Ñ±GãÀñW÷ Ç‘á”X_Õt·¿©ñÙÚ*ŽØ¿gž¡2õ—œ[ªºes§´ÝŒ¯AîMzш~‰¦óÄ9RÕfÆ•ã„0ÒïgÎlj4'ús¤n„ÇxdáùÓÀ­ë;mÌx§LÙðÝóxàíÏYB5qø´'ΰ¢Ýt¨zú½GhZúãÀé¹'§D¨í;Þߟðnf}U§‰á,Ì£á¯øò÷¿fè#c©zÚ?ÿ†Nfö¿vŸ¸ÿñ{|¸Gı½í¨ºˆôàóž±|üòé‡u=R¯”º9ã÷TUfì¡?Ž…Ì›ùñ'‡—Dx{ëII8=8?ÁæÚ“²çÇøñû‰Q••wtµ?{ÇxNLCÏz§t[áÍÏ[ª¦%‚¸ÈþLÓ)MWq÷3%|ó-ÛÝŽi‰?=áÛgþò¦æþ¿ÂóSD¢MGì;Oh£÷F2ÏE­å|ìI13hf{c¤Ûªµâ´Y5 íjâÝw ÄᫎœÇÇÈîvÍÕ{á|Ꙇ‰Ê)MçY_U¤d…òîÖ1 ¾®MxÇz— 5!ƒÓä$ˆ ĸÿA¨š™8Mœž&ª:§LUÏ\¿Uºë5¾ |ú1ã$ãC¦ª+®ÞÀ4f=SÀWJÛ í¦¹˜UÅÉSµžõdÄû뷉͛Ù4œž¿ÿ[EçÙd¾â e»ƒqPrL@æñ'¥éàêMfê!<+Ïð»ñ2ýëž'rмûy åšÓs, ¨§®=99êz$ÆÌiï8œÀí•{¥Y%sý~×@ïNÊí·Mkv_y|·´æþûÌ4Ž<ü—Ð4ðößr„UÍüfÒ¬ï#±ÔÝ„{8Ó¬Ûë–Ã#üôË™P¸z“×Ðm¶w¿«í\{ÈlS$Å ¸º"ŸíuÃ|ß숓yoø}$ÎVÜÎcÄO‰”¢­‡Î1«¢9§M‰”)› ´æ|1Y €:sôv+nUf‰sfò椆ÈëQRáÍê@!:],ìyÜSz¡Èëà5þ‰Åÿ£l/NÀ à?ùcïÙk¼Æ˸(î8Ã/Æ\ 6Ô¤NBéˆ.Ýþ¨J“‹á×ç2žØ¤ cJ@ÁûËëÍÜljuñ²³N¿÷KÁºYY“u»O(®¿î2ÎS¯*êÎtþ«:“Ç‘ncE†¯ŽÙ&(Ÿ”Ó³ò|¿çÿbË~hè™ÇU3Ðÿ}EÝÔ¬®¶lo;Þ|+T0‰y˜x¾OLC¦nØxxšxþd:÷×o#×ïàðiàÓÂÓFvw=ª†ýöv·FÎsæé½2ýêwt›Š›¿¨ ›Š:µ<êyû-¬6žÇ÷&I:Ùኈ0õŽóÄE¼w¬¯>ÀéèY­\pœ?¿¢é ã0Óg¦iÆIb}å¹û¶åîÛ Wï9]¡:óô¾g<évÝ8¡j*¾ú³Ž¤궦Û:ðzQÞÒ”é÷ 2ãƒç|ª:3ž‡O#iޤ92ž•ªQSqúñ‰Ý㻿r8©8>NGNóxĹLÝ$ªZÙ?ÀÓ34¾§ÛëöqLUËÕ×õ:‘§™06WŽïþÌqz®Ð9>föIz%©A”ÎG3þúéGÅ%eµÕ2mtlkaÌ&%üÓ}F?Í|úaæ«_Œ´«À»Ÿ5 '‡8¥>&rv|ûGÇÐ{ 2‘‚º‹Ÿ)*§çÄúJ8=™QY»Ì¥?>3ž~iV0õÂÇÿ|¤n{ú£ao¿ƒþÈyÂ×5Õj™ÀD¾þ+îÿ!°ÿ˜yü Ü}7¡xÆ“ãêΞ>$?x²šÉØÝÒ~·CBÕ(^¡®è63íªb8'☙ljy4›Fd2ØSE¼'çDk$ŒÐ«ågW&*@qa÷LØÈ •µ:;AJò¾ˆ?äâ EBœ) Í)_¤x§Mƒ?ç‡Ù´÷5^ãŸRü§e.Ž©ì=z×øÿc8 g‹½˜Òb#¯,æBj#d.ã`0¼®ŠN•ª°Ä–rJ ï=.gp–¼»R<¤”Œ3à´8‡RH¸ 9XÀä>Ý 4È•iw¡ò¬Ö :Óm ˆªšé3çƒi×›€«[P!¤ îîÈOØýùw¸ïŸ™'˜úÈæ¦æêmEœWÔ«Wuhˆs&Í#Îeï"0†cϰ7ìô4VfÇ¢å)F:±˜ûÈy¯Œƒ2ÇÄ<Ϥ¤œ{Øç‰ X×õºáî]Í"”9ù=—WùÏký<+\是€×ú¹Ô¥Ù®ƒ|yÃp&š+_&DÕ…$BU”âMiê0Ìg5¯“/ <ÿŠâqó¦Á9E*_Ùd>$ˆxãJ3#>ÿWŒÂF¼0ãb³šu YÖ×Êy—pê¶"'¥)†Ø+%R¦h–¶6 ‡gÈðñ¯ì?|BÄS/‹„늶iª"Ÿ> ,ß® •çéCÄU™±3²÷ÖH‹Ëà,©ÖûÌØÙæa8'â8ðôãD)‰þ”9’I|TÉYY.ÍJzaW”4&¶;jݾóŒ}M³+ôµc&D”û÷põ&ðð½ðëÿ·ám¯äl2‹+”D²°Íu`±6)ŒˆòÃßÎe{“¸ÿºb,A4§D·Ï„Úqý&²ûqàðä©÷žÛ¯•z!´RQRbÜG|Ø~+pó-¡YR~`ø>rÚ'Ò˜¹yçÑ\ó‡¿-¤’YÔŠ÷Âãg!TFÖqÁSd6'zÏÐ ›kH“3¾½:n¾ò,×ʧßybš…²PÒ¡0‰cé-àÊ |ü²X%ª&pûÎQ·P·Jwt<ü ŒEy<ºÂÆ ‹¥ãþkÇr+lnkêEA‹¥Ç.·ÍÊq—8ï Û[{ ¥hÚD™2àL}¡C¼Ÿ i2.8VWÊñy–}ÜCd¹™¸z» \5,¥?,)©ÃáéG“gŒÝ@GÒ4‚f–[Ç›¯=ímM<ý©ðôQˆ¤˜èö‘P®î„P{N»ÀÐgÒ”uá´rvÈÓ@.ÌR¹9ØÉ ÝѦö%1i›“¢²{Ž;¨êÄyãY¬#ÇÃüÚøô{ÇæÆ±XÛïC­†^¢6=ÞÞÄyŽÏBrøªÐ,3ˆ`⤜{kjG§|ÜÃÃ!qU'¶·æ§ØfÏr[HyM»TÄO^²îµæù‰Õ¶&—@î ÷_~UíN‘qˆ¤Ñ<³Ëµ…””›7_{¦Ñ“&™¿&»ùå(T t“-Ý}#,n<Ï?.8>ŸˆS&«kc¬åTøê— ¦©5OÒý,è¶àî¿‚nOëz¤j-ªÃqBœåžk)ˆË„À*Cùødªœ ¡¶ÉÕ]áéAxxxz€íUK³ô<}Ìöù‚¯„õua C§|øQx®î«á;SÊô§ŠfQW*HqP´|£ŒpÞ)ž©‡ÕÙó·ä,lï*ÚUKÉf†³2ö¬#MpŒCas·÷Ç}áúMàöý’’…’•¡sä8²ºr8ß0 žåVX^ÐÂú6óé÷‘aÈĨøª¢h‚§iíJéNf*mVpÚ›Lâ|´$à«{átœ§—ÅúFÄ“REwòÔ§YT+ê&R5+T”­/¨žIc$T…«»3q´ÇáéS"F%Ç‚s†kµ©´"AÇönÞÂòF8> §ŒT#Ûû;”€‘’ÇgˆÑãý„¦3íÒ³ù¶¥”¥(I…~_‘ÓÄ8`Áe®žÐ˜^¿;âPŸ©*™£õcŸç ³<‡ñ)õbö`Aï¡]dJ±›A³°ipU+«+GNžºñ•P5¯o„îŠGœ°Ø€f5Dëä8í}¯4m¦L6ù¯B¡ªa{ãI)Ð,áÍ·Âiï8<ic6t¯B[ÃÕ°¹q³¼ O‰ix ^˜A¯˜Kuÿ „gD¡jqt@¢¤qЍmq´(9&ŠfDL"檉† Uœy¥uW c~Š<{Ü,´tâÈ:›©±û{£¼é<|Ésð,É*ÿ_ﶸ„Å¿&¿ÖÏ»Bþ×ÿ¯õZÿFÕ%hëb»Ð#€—[zaNüµþõL“0¢3ôçE“<ÿÈ/$!ùö“· ½4õ€sF)9›Ñ·T>¼ÚœsøùÐà+OUW´kÇêÊ´îõ²!Ý¡§d¨êÕÈÔ§«j‘@h®ja]¡¾¦d¨›GCŽ4eJêxøí„óÖWîhÓòœ„”<à¹ùªaõV 8ÒéÃÌa×™šboØ!L„µR²#'Ç4dƾb&O…s”l„vH™…Bv¢r´ Ççáñsf³QB%vÐÔ3‡;)irUï¨×J³pf8Npÿ.±ûä¨[!N™>ŒH*´M ªàÍ7vé;ECâñƒ1Õ5;·`ô'L}¢]*§½Gðäùü½I¯¶·ž«7žº œ¹Lüø7#1ÖWŠÉ]lØ?& psc[Šë7BÌø ¼ý¦b{ëÙ¾7ÉÒ¸ŸLr%-Ž‚£;7TuM~2¹VŽDébf,åô*(®òÄè8a¹.tGáéùâG¦5BUÝz®*›Ø;§8¡Äɳ¹ (•¡&Úuk×㪠Ï…ñTp¾ðñ÷ÊæÚRˆGp…Õ‰Ør¢*YŽº†8y~t,ωªÎTM ­W ™õGä-ÇÏO,·…åÆ‘Æ‰±kh×-ÍmE½ØP:eabÿÙ3öÕL)‰˜eReþÞÌ8+¹ÿ½?µw £HU¡ª*1zº½'\p8/8 oÊ€ +ÅQ2ÄɲBV×B]Ãp¶ÃÄé 3›ëLr˜4èØÜF¦^9ªpõfàî}·ç½…¢u‡4‡Ê ç½R2Ü~8|êpÞLÝMÎÈòÕž@Þ-hêïH?~@—#.WhY!ÍÊ£eAŠ8ŸpÙá< ÆÛ)%Ùc¥6u ê)%ͺIÿe›£B.™sTŒÒf÷a›ìA ǹÉ/jƒ›„‘€~ÚÛ_¼a?Åý¿¶ý¯õoCÿ¯ÿ9^ëµþª—{»›×·sc®—`®y]|1_Ì¿•3 +…âaÆO_þ¬\ b¥X$½÷3AE_(e&9WÐ’çQ”œ&‚uUãC5sÿeFkzª¶¢j뛚åU’cÆypăÉ›Ââ®"29ehÜ Ù~Çøé¿"vçÛÛÀ4X‚h)5JÅÓ'§·…P ‹Õ¬}މÃGÒ%›¹ÒÞ¨=‹µ3ÿCÊœ÷6-¯›¨??NœÆÌy*ˆÀXL‚B1ÙT.àPÞ® ] «Màê¾A‹É5†¨ä1ž" )Âjå()±¾ª¸{o—ýœbòŸ¾°\'ÚìxÊ…§ýȺñL¿ÉÔ•{1n‹@ÊÊ4™þùt4¿Àø¡0"ø ,B ­•¦-ø*P2,7fä|þ$ gO.Žó «=¾Q´$œ+¬¯…íí’þ”)y|‘{5Ëšå6Ï…¢±/„JQÝI¸y·âým–@Š™©UÒdÆ•ª*ÜoÅ ň/Å >(×o…4 ÝhÄ’P yö´+›PC¦Y.h–RÝ)Qµà½PµJ ÝQ‰ßפ˜•#7 RJ4‹Â8˜¾¿YZЕ  Œ}$!yG-ÂiTT‚cÿx&4û÷kpוà›DÝfV·kÒT8>†§]@)|vLe¢ÄÚ¶4# =Ü|Á3öþèÏJšè3Þ1fkêjç¨ÚŠP;Å^/9A³t,×ÂÕ½g}(©eÿ¹çð§༲½ œvÊùÓ(¬¯+Úe…8øþ×¶áhWɈB}¡;@»´ ¾Ë³¯DèϠų¹§g!fe”Úú>3dKnç ªiªÊññwpóV¨ »K1C tgèûLÛØæ¸hZ‡ø–”<Î;J±ûÎî³³ëÖòÄ o¿†ºÃ“…j5‹@¨í5üð$TÕ%\P8>Ú-ÜÿYÍrãISBÕ¶>}×"’)>‘¢2îâh}ùíp&,¿ZÐ>¶Ä»'\¸¢Œ?0ö;Âb$4ïpz:´Lˆsøª"ç‘à3šÌUDð3T¥ØÖ4x4g<õÉiZÚ:s¸˜íiŒq®Ì2Og‡Cóp)A!¾Ðà¬Í¿P€.:‹‹éGçïk½ÖϯÂåÒþßý±¿’×z­¿Ãšß^L_ò²¶ ¾%ÿÊKP@ÖB(¦-¥ :S%Dp8p6¹ËØ Ív˜¿¥(ÑÉK"­¨"^Qõ¶²Î‘¨J¦Z.ñÁÞÀÅÙd0Ô_ÕLC&„H¢Äç S/L}Aq,¯¤öÔo R­Ðân…k6t‡Œº%‹µ¡öJ±7¸zá(Ù“¢²Ø:ÒäçЭç…ÃÇç¬ñs-”QјÆLŠçkª¶ÓÈØOìŸz™>gŠ*•Éxiù²Issž³)ò:3œG#Þ„Àý Ôšz%F8>)}Rv †Ë­*Çb]Ø=9Æ"T˜ùöÝ{ÏíXñ·»Âù¹§š9÷Yæ­ƒBÛêl®.l¯Î9ú. Y¸¿¶ð¬z!³áÑ“"ìL ²X‚óùÁžŸÍ!&ÅÁùYß :PÕíʳ¹_r~ln¦ÑÍ8J¡ZÖ ‡Ìi_ætÒŠÍm j°È5 ÉDÿù¸"\¯pUKõö/Óžü ©JØ… ÕH™F›â;‡øÊd—ÙBÀ¼s¨XøY*JrŠf{p/¾./ŽD1‰Ò,é1š/›Ö|iú™sD_š}ów]$C3»Y÷)sãï^ƒÀ^ëgZþ1ýŸ±ð¤×z­ÿ¯ kü¿^» zAýȽ?¼ å Ñi«b3÷~цªZ3[TIj[¹„„Émqr±7"¹0Eç­ùÚü|œó Žº Ô‹†º­©žfQ±½_’Säô¸£ßwŒ§#S¦?u¤(¬® ¾®YÜÿ‚æîÏ©nEý‹ÿp÷äÿã‡Èê&³Ü,P*Ú¥c±®h–¥Xs»ºª¹z»°æÒCµÊ?†¿LGµf±·D×8öì>Ø=L<>Eö‡DŸ ®(ÛÔ$Í,`Rû1*4næ G3Bög »rΑ&µCKQDjš…¼°ñ6]Œc¢äDÕ*S§xQ†±Ð«PK`{«¼¿÷ôSÍñ0R; m‚£©…~„ã„á†aNú”@LžálÏíÔ ýÉhBUãhW&©3箯ŒÐ´Ø`›¯ln„›·5Þ„Ö‰’„©Ÿ¨*£¥ä˜N çì:Œƒ}Oi2”cw˜ØN³73MѦŸY9;rt†‚MŽåƳØT”äâRœñÒsÆ9¸ÿZ¹ý&P­ZÚec¹ µ£YÖlnkVW…å6ª€ â<)Ù6…çOŽî$4­0¡³V‹°nNœ?)»ÏÐwž¢ž6T„P1ÄõÄÂT`ˆ‘ ç ç]f8›ÞÛ±ôjœÏTuaýÎÑ4ž¦Í–PÙ¡O œŸ”§ßGºÃÀþÓ€æ‘õ­£ªkK!4 ý1‚…Ù­¿©ðN;8>&|È,Ö¦ßýèÙ.lî*êeÍé¹Ð+Ä{–ëLÕuÃbSÛf"U”â©êBì ™RÁSNï¹½µ×¶Ð,ë+ÐâP<«Ã«y?‚W*”P`½4Y¢W¡©aÓ¾R><8OŽñœçÃ’m,3N'eµQœ³„c39weµÄ]ü JU)íêB'³6ÈÉ ÏÁ×ÂÍ[‡ˆá…srøãz5v…á¬ô'¥ª2Z&PDn¿rÄ)P’uO;1RYÌ(ÿþïáñR¿ýû¸q×M‘±O¤a¢äŒH!ÅBŠ_’¸.†]÷r?.¥ j´Ë'«RJ!•BºÈ†æÊv«19PQ’òLuËsqù îÓ]/æ_CF—ùÞ®ªüáøŠIy­Ÿ_½lþãùçÿÍû+z­×ú׬Œ5œe¦;„Ù´ Jœ£®U.œh¥cL{f³Ù¬!UùÒÌV€£Š€shÊà,z¾šiâ-ØÆ‰ý˜)U)Zï3œ ÞGJrø*0–ígÓ#U¨ÇØ[âïúR\P7‘Õ7+>ý³39ÆÙp½`å h¡ôgZˆCŽ,ƒ0 ‰§ÇBwIi`så¹ùÊ!Bñ^Y¬š­5YáÆÑø .Ù¶@V' ãçH:ö#9Žˆ€ûo&®ßµT­ÃÅnÿ¢ñÏe‰ÉqÎG3W_ß+›[3ž× ÇÐR‚vS[zðèy÷KjÃp¶CRNÊi—˜“ô …îPÓu…:˜¹ØU«;3§Ñ‚Ñš•Ð,…ºÍœ+e¹1©ÊùPxwWèNž Õ•à¼R7Ž”¤äÓÄÝ= ã¸Ë¸PhZkî×kó”íÒÌö§£Q·âd!XU ÝÑC¡‚åÚÌ·'7û‰àý/ãðåóU­PµŽ4 â…i0o‚ˆ¥ÇIX_Â/„ÓΓǞû÷¡^¡ Óækü‡3ºýKÜwÿSªîÖ_Ãî‘j¨žÁW¥€óbÉêA€V”ýq ˆ ÎS¦)fê "$ñ ±ØÀ ¼´ë4 €A ¢v8ú’üe8ÁìóÖ2‹½7ˆ\Ñysl[•/öà×z­Ÿ_½½6þ¯õs©[ùþ4åZg30?™ö ö¸`8efH_B¼˜¥BþB•˜%CªÖøç#Šˆ¥øŠP‰B0¿8¼ØÄß(Þ¦œ€Lh‹µp÷ h˜hþô/(øqÃ-‰” ÍÂá±m“@ÚïA~‹÷ró+¦ãäî¾½!4®ŽgºçŠ©ŸÀ%R=Ze\›¸ÿ“ÌñS&§Šzˆ¸Ð¢âi7™Ûµcèí­u}—Læ”Fãðw‘š2ƒ* lŠ–f®¾›ö/08G“,U¹Â&r§dÏÍ0(ÑR'è3¼}gf\lš§LwTê6‚c"Z„ÍMMU Ó lÅ0šC—øëZЬTråœ9N™^•­ÀWW&£é‹ÐŸ/ŠÔɦ3®ë A©T©Cfÿ¹ÃWǯYmõÊáCMµ( qˆ„*’¦ÙÐ,™•Å:àƒGœ£YxBÈ9 .0B³,4ma¹©xú˜IQØÞ$H¿ÖWÂÛïà[ñçI‰ ÂæêÒ8fJ.,Ö–U1 °ÚB³´`³ýs¡i³m™®„|Î,W™¯n Cg×ÄÕ½%t‹«-Ϥò¸`‡Ëã®°XÍ’½ùþT2Pìß7©—}ÏÍTeÎ#0\ë8Øfg÷ÙQ²cs+¬oW™á7'!Ô&‹£pÜÆ^¨›*|úÞóõ/Õ•ð»ÿxo™M›X]פ¿ü‘þ÷TÿøE8@[GÙ%Ú•PrÅXyºC$Ž :1 fØ÷. ÎŒù~Nÿ5 ¿ñÙrÉ6í^øþzIw2jÆ_½l”8sÿaôÌ8uàË\ž¥¢úeðZ¯õ³®þõ?Çk½Ö¿Q•¸pý¿ü?ù êSbìeýjæÄ`÷Ú‡KD¤ý}çŒd`qœ7—°w—ˆag$ Uœœ„P¼7*‘sxPgzc-)Õ<,\¿_ ñd„ïÉ9pó~‹PhWBwr,V_µTïþŒpýnýž¤à¦¥{Fª%®ýÿF³ÿ-ãï?So’£ÛâþýƒlµKk.A Ê,74b´¤Ìv£@ „ÂØ9rþŒ¦‘ï:Pˆ“²XCÉŽª†ª±¦£?šÆy¿¦§A µ€žÐ˜ü+'O´æ#Ž ‰)Cž DÓ‡7­³œ/´K¥j*Jê@ZÚUE½\±|ÓÚVWhJÈñwï‘f Õ׆æ âò÷ÿ#_ýcÜÃ_1ýá?G»=Å)ùt$î—Y¬)ÂÍ»¡]q‹5àݾãêmA\KyêKÅ0œñ–5¬å91a•&h+ªz–R¨'Á¹‘3qrLÃÈñÁSý~‡¿çÍŸßÐþãÿˆFwÕ°1Ù’öœv…þp¤n=õ²áú ¨V”ƒ§ÚT„¦âökAdbê#Þ'Û)E µIhªÚ68qRp5©WB-ˆ8Ú+¡j’m~€Oߦ˜ ÎÑwŽßü4ÍÄW·™©g6gšV9í­ñö^ùð˜ÆÄý×Ê¿v<îÌGáÍwÂú»kÿ…£?Ÿyþ •™ôs²AEŠïhbê.Íl&g¥Yºƒpx¶ãrëXm„¦Qúî ÝÆWà¢çíwž8Ùñ¸7œ ôg%E€l’³ÑžºƒÒ.Í`;œ!MfPÞÜ@œ*Êç‰ímÃi—¨Bd±vLýDI…á·ÀËÿåûdSõéDN&Ê)Ù„^•-pLÝ„¦HF¡˜LКøò2ÁŸüFx¡à5,²+ÙòfÿƒÓ9Бþ Êð‚{¾ €üüËt {=¼Ö¿õ’ðZ¯õs)cÊÏùr(3Š/(ø9 à 4̼ÌÈO'&·¸èö/sóÏõüqï.Sþ/xO¡ÌtrJ¶uóLÿ©BE]WTm÷¿Ä…Äéןv? *\½½'´êE¯àÚGJÐÛ¿àôÿü¿‡†¯˯¶„ûoñ‹-²¼ƒx"}øïH’¡é)]!=ž‰ÃŸÿ0rÚ錅 øJh× QèÏŠ©å¸3âÎõ½‚õLJ&Î'{CöÑH?ý¼S?“ª=–Ø”¿ Bå…>Ãdâ^’Úe„Ĥ¨ËÔô' ýêfXådÊR,MtêL*ñðÁÈ%1fšöÏŽ¶)¬7žÛFøü zÍL@Œj+N…¨ÚªQr¨Já”2okÏWKáö›…3zãN0‰ÅÚ¨Jì;%O6-LQXßx¼7¿É”îTÐbºýÅ*¤P/2˪˜ôdéY¬uc×ÓÓ“ÐÇ:‘°ëªrŽUeé©cgÜýfa‡”ØgÚ¥‚]³¡Ú¬‘jÿ+8¤täc"üÉßCsOyúkòóï(®F?þÆÃÃÿ‘rýÅ7+X¿‡óŽªº&üj yĹÊtÕ‡„œð,Ð,TuÅbYSROŽÂñS"—”áãƒP¦‰ÆÃ’LÌŽ:ež? «cÿhiÉ¡*„ f ¯!™q0,i»©þæÿAþæß!T‹›†qX’ÆŽë·‘±_sÞõŒÃDÝÂò¦Â­ Ú6”ë_PW-®Œ¸‡_C©-%%ÄyäñÀù TõHŠ¢âëŠó^NÊã÷ÊæV)Éž£íMæêN8Q@⪙>TˆSD$ÍýBÖLÊyNèÄ4§ý?8ŠÌ‡µ>ûaÿ…”1éædN-C€òe3°{Óå0Pæ­°¾Êý_ëß’ ñý¼ÖkýWÍ|C/ŠSÐ`·|U;äùFïçÉþ¥é/ó¯ƒüE':7øÀ¿Úð{÷r P™Ó~ÃysžàÎWxo!`U¨æ@0÷b¾4C®M"$Oœ”ºõ8)Óž¨¹ªðëÂÕwäþß쩪‰¢=©6|Ýx&>þ×ä§Oäsä|)Ѥ¦evøª6bÍ 8WÈ“¥·ËÌñYÙ}6|¢0òé7ž?œØ?õ|Ü ä\¨ŠÙ6NHjÒ/°áÎÛA©©¡YxÆîV-Ž¡7ž;xJðT%jè’aöV[Û|\¿ ln—Ôm‹ó’M¯xŒô§‘ÂÐ96WÖD9WØ?J†nRœäY|m9¡1« SátÊÔ­y |¨ÐRÆ„SKpm—ÂùÎ6%Ö\ð•c±Ž¨†Np'K²íBœ n3iÖ7°XódaìM‡]r!gkìŒTcñª±Ì‚Ó>’¦ø‚¤ʼ-Jâ’ðd†3¸MËÜäU¤(><³ ™Í7ßn‘ª¦à(>B³AnþÒ?†'´Z"_ÿC4EtxF”ó3Óï?Ò,%¸ª3Õ´õèaD=x©È.p:žσ±Ü%Ò40³á¾X÷¤¥Ð“à4#ˆR²BçËM^C%ÄɓΙÍmÀ‡`ÿ~.ôÄáÄb<ãóŠ’ÍJ®ÉE(%ƒ¸PQÂÊBÁº?DÚó¯QÌ êï¿&¼»ÇQÐéD|úD|ê莙Øt‡ÂpB=™9|òœNžv°Z*Á«Âó'%'Ë!ð5l|pl¿^Ï#So8ÕåJñ]ÄóktSF³2%ÆDÎga½Vn¿R¼‹ìŸú1q8%z”…n8範ÊqJÂ"¯çLû¯ â”í­éù‡ÎÈZ—Tïi4+qT?W÷ÙhI·Â4úYjTΙÅÊ2šÖœUÑ M ®3rÔ” ÃÆsBÜÈÕ½'‚÷°ÚZÊwhjËNFú‡¿fûÍÿ÷ö×Ä¿:@ðášç Fo‡ þúd¸Èx^ý³‰7—DJ‰˜©d²ZJpž]½e¾wƒ’æ@8/Ú9gò|ïÌhçùsë,º@B¹x“_·¯õ3­0þ±¿‚×z­¿ãº0 /wò‹¸`‡ƒËÝÉý,®Þ௯¡½Æÿ鿇|úoÐñŸrüœhV‘Ø–Dœ”•óó„¸LI‰8fš…M§sòÄÏ™v9 ôÓ@Nç½åOT lo…îМIÓÈÊ9º¢ Sbˆ¶_'kÀ4¶£Ç‡27òžõU`{_‘c°Cq®P„ÅRÉ©bxp„ü•%Ÿ+F]ºý&Q?dÒi×ÙBßP¼‡Ã÷s^‚ú·¿æúÍß·¥ÂùyÏy_8í"Ã9Q7É ÕÅr"RtLƒP¼'‹cw2éŸ|N©+k¦SVËÂõ½cxvÔí Í{œ;³Ú‚háùÉ昋M sfá„õÊ ÚŠ‘½R\Ò,¡-„Nøa3)c²)uë ×k7{lº_Ra÷¤4Еۯáî«Â4™îÖW0öÂbm2BÅÎiÓh¾€ª–›ÀÞ¡ƒÅ&³Ü û‡ÌÛo3Çgḋ¼ÿ…ð».,[@ ǽÍL}Bñâ â•#ZÌHÿú/©ªÿÕæ=U-hè‡â)Ù1&rIÄRÈ¥Š¥+3µgžî«רdA]¿É>/÷'§:ÓÜxñ%)eƒXÊ|À°7ƒ‚<úBº”¼ú€_ëgZ¯€×úYÖ ýA¾œÌ„ ÏY°)¶Ÿs¦ý¿È}fS°CÞ’V+o€àÜœæË,òxqLãÜ>Ÿ©Ûl²\"§ÄécADi¶8wúmá´çÃI9ªÆ{˜NBŒv̓³p¼éºÄù” Ø6É BðÊЙ¹VœÔ]t^x*ó H£RøpbDÛDžÂØC7X'Ù«™áE*ñ\È ºQxø”iª¡2ÜjL°\¾užR”£*+Ì›SŠ’² ƒÚ 8ªº0L5ÓÿNYµpóÖ“³}ŸuU#hñ }¡ªM¢3ôöùì:·oðÔŸì>vì”çÏÐ4‰8Ù$eµ5cñ4BÓfBeô it†éÌ£§ÂùPp>±¾®pËÊí¿ÿïÑþE€¿þK#Ýy…HAä âÓ$@ÖìS ¹ìÔ²@gp±-Á%0¬ÜŒõ¼ß<0ÍïæÃeìò’0ß».¹%‚’õ…ñ(åuðZ?Ï îý¼ÖkýWä ôr};æ7æŸJ€æß_> óªÀÍ“¹4ùÎð‘n> èÜØ3öÓþŒ÷£Jó"+ú‚-$u†õf ®o&¸)³XõäNŽœ&G± ÃÈyÙÞ;âûA«‚kW\ýbbø1±û4§‰©ùŠÓÓ9e–#y@aÿ 8',bÇâ)y4ÎøXx~LT’X­3¡š¾9Ž™Ý9!1§L_`,¦ójfÛâ-ˆgí„¶ò¬C ]8ªZÉÙ(>Uí;ÇãF¨[“Ä´ËDÝ:;œœ”>]Î'JIÊ”笜;@o¾[QRO»,¬VÊsg¦Øh挆uc2ˆ)Û%cÍ€a1“{†3<~ŽÜÝ{|0ÙOŠŽ±wöÐÔJw´£ :ç(Ý¡“rÊöìWÀŸ¼q¨:ªº“² }Q|ÎàlíL¹ÐÍfC_¬9¨ÒˆpšLv&^(ðØen#:;„H'Lc!ega4Ói¨”~Ì,)¬6°ºI¤áÀi8—@Œ‡÷B§…ë·_œºÃ@k +cˇÊá}âéc$&O U]ð¾àäD)Î{#SycÒ#‘á0’ÆÄÍBIRðƒ0¡Ô’Ù%¨gù\ÛÀrcªiP«Äã…‡ïGÞÿJi—-ÃÙа9gî¿³×Øé)1 JhSgÒ¢ó.sõVq¡%ïý†eÚô8BJsH–7/F9Ò41ö…î¤T®ŠIOBPR*ìÌ’“-õ9ãÕ¶\§£Ý>XSTú#œ€·¨k€·äëk±kcÿ0çì(¬æÃò~²k¬Wa»0îi4³|<Ñ+ê-8¬®…ó$ä¨Ld‚³×ø4BÝ*Me[¨Ý>3‰RÕ…Ò;Î;HKK÷U¡ª½e>L½@±áEwêZ¸¹‡ëMbÝ Ç“Ààæ –™»»£ešž ×oì°#j)ÑU­tÇ‹±7³º‚þ”Ù~Nô¿ÿ/¸úGÿK}ÿø/iWÂÔ9ºƒ'q _´DõKØ—àHØp¦”2ÿ?ûX˜ï±Y^”âÀÙD‚’ ë)o1c-øbü•‹ø_‡É‹B.vH(E_å?¯õ³®ðêwy­Ÿ[]ÖZò%í¬Öšgµ‰ýe"t9 ½Lˆä%T&À—Ð0æ`à~(¦fþÌ"ä'>€ð⸠.7M«øMÓš„ÓÓ)#i*ì>gJ΀²¾v´ [í?8ª%´¡{ <þŽGèÿåï@=¨px0RŒj¡¤‚«I-n¡h¢dO³,œwÊýÛ@¨qèùÃozNc& ¬êBñP¥Žà{ᤶj/Þ‘ƒ£­u]³mj•ãæÞáœÒŸGN»Lœ`c.¤§‰˵2œËL9)T­§]¥ÏøöÏ…á”é»BJJ%÷¥âÓïn߬oŠQZ–žîÈl²6úþ!ó¡Ë&9Á¬¥ 'L*ä³5v«ZÙïš#q*h]Ϧí””»…Gý>³ØØc–¢ã¼·Íäf+øÊâÓÝÁÌšÆ3 ÂãvHÛܘ|(ŽžÍ­€zq…ª1°Árë‰c¡dË·H!Ž%°¾rTm 4Ž•ãc$G¥iaâø4ððœÌpè’”8DŒ ?D¼CêÀªmXµ ¾®'Ül ŸqÚúœ“0øÀ Ž>†˜©K!O…8N£ÉšJ¨¡ ‚–`oà¥ðÔgÎ"xï "fÞ‹‘Ï ^„õÖ£§;8›&ðù9ÛßSX9AЈpUïýö^𢠃 Gu´*¬ÖJí2iÈ\ß*^Û›ÀiO}¢‘BUÙ5’3‹ƃs'y™,Ösãл~J†®SЏÂ~*tÙŽ™†ª52UòÞÌ‹ªä™´pÂÝÒñî+G»„Õ•ãö­IQú³IŒRLŒz…Ê9Nca8fȦ‘žÆÄéP8ŸLž£2ô…i(œ÷B)JN±莑Ó9r*—•·_;Þ}«¤.ár&§D]µ¥‹Šw…åºpÞ;®oaù§ï¸z9}ÌœO‰ åjåxs-¬jO•«[¸ýJûŠ~pœŠ’2ôQ80&å¼K G“ã˜W&R׉ímaèL³0OËÐ)MêÇH··ÇæøT8ï&ºCd÷ibì#qJì¥Jñ¶ öš:k¶Ua¡rl׎ÆÛ´¾-JPa{m×)˜,,GhÉ»¢#Žee\ýœeÆx SG¥Whf)Wìž³n…ºu<íÚÙ6Ê›oms`)ÆsXWc!_Í¢ðôÙBºR„ÕVi—°ÜØýO€4º„`œ !˜†^$1‘’2Îeâ˜ð>ãC1)X0úWwR¦>Æ®PŠò§ÿcåæë%«ë+ú£gêñ›o ·ßVÔí ÃYÙ=K¨ ÝÁ(B§]¦~ÃâzC¨[Êñ©”41t†åŠ]Û£Æsb*‰˜fÃo)ÿ?œþ‹,Qg9O¼ØæßÏ=> ËiÙ`9r„N„­€ÓÂýÖ®ƒ›7À(œ’Écn¶&zà” ~6*ŠxOë„m)\8jïh€eåX´B¨…7ѲþæŽõMÃÃï}7°¨ š3O1s_;*m]X. ÍÒˆC9:ú^ȥǂ¯`¹–[èO‰§‡‰Ý>r8$öcBPÖb‡þŸ>牱©üedì'ˆ‰œ3C§LCfÿ9ñôëg¾ÿËžÝCÂ9åæ­ãêÞ’fû“±õ(Î9¦Ø%“nÔÌÛµRÔ²$,^£€&úcb8eŽÏ™î9£Úµ'4ÂUëØÞV,7ÂiŸ9œ…ÓqEY£Ô"Œ(°ÿ\HS'üÙ?¨Ø~³ œ ç"«M&àfTHí…RÌdúÃo ÞˆÈÀó£²+†/¼²OoÓgF÷-\½qì> _Ý@Ý §ƒçyPô œN…4õ<BNªT iJìRaÌw1öJŒ…í­œvv-U!SFO½«B¨"»O‰’¡Ðešµ×R`QAš2ÅA”®W@® ©#Ôçm¢¬%3Êþœ(E9 lÄÑfÇiç{L¶“Mï¾r6mŸæ¦Ð{;`ŸfCgU”â…> ùU-¬7&ãûLßÍ¡N^L_ÿÖÓŸ…Ýg%¦H—“*uÎs[ÁùL»´`¶ßÿÍ,úIX4àƒmU*5oB¨lKÒõq8W⃢EF# -VL}©€IDATÂt²{Á}+\ß O•i²é·88¡;*¡MæH ê6П+œO BwTJ¶ÛÓvëH“I‰ŽYi4¼p.BhªóÀBX¬„ãeŒ“ptp>¢,×– š…2vfÚ{ À+ÀS;Ÿ ꘲mËlÄÍÉ<¶Ò”€Žqèqr)Ÿ„œŽÄi0ZSÁÌ¿^Ø@’£ªÔŒÁ? húHX¼¡Z,A&T ÏG“>z-æÝÛ®è|}"–¶^æûn.¶uôÅK—n=«=OeN¾ÐÝLæY¾ø ²ü$ýw®Ë¯.(ÑW Ðký\Ëÿ'ðOþçÀÿíý•¼Öký•ÇÞÔî[3zÍ dž]¦þå†É„˜3.&` ÷š7تù§Ÿ«vîjÔ!}ù÷ƒ3T£wç2ˉjfaˆÐªqL}枺žð(…¡Ï„Z©eìÇM³nÞf®î·œžÏhQNC¡©L¾³°¾ªæ$Ý‘àF>ü>sf¹vÔ­#Ôç3qˆì'kàâÓ¨´‹Œs‘Ï?&â9O…4K¡Bðx',—úlo¬=fjÍ WKáí;ÇõÖqw¥,“lŒƒâš…Ébúlkö{ïY,A„óÙ³2ªËÕ=,ƒ’{ì –2¾(ý¤ä1Ó,ãy ,½c37Xçs!çLÂ4™ñ´Ë¦½asÛR· ®®= ?%–­ðÝŸ;4™T%!k xÇþQ(C¢;ŒLCâñG›~_¿b'¤¤ŒY9Jž‘‚}V¬Y“b ¥@%9ÇÊ 5ÂÝ4;>=ÛÖ¤G»nÞzÒà8%åP”ÇNi‹ÑPBQ&-ÄT¨œ°Öðï’5¢Ô­£i‹•°¹q4 x~Æ3 ½âÈfÖî K),¶U!”„’™ºDL4óöMæÍ7°½w¼û{Î…Ï?FÎcæØg|J”¬œœcÇ Xè[7 Ï£P¢]+^ÁUpTOÀ;8ÛÜxXxX¯•»{%M&}ºº³äêm²~̦½ÏÑ#Å1 0t‰Ï1±Ð²(Û"ÎH>̇ÊÇGÓ|…TàØö}& …,‚WKá4“£dGr6ÝïJa?)»Q9 °ôFÃñ^)SAÆÂ0»Œ“BÝÌbY8ΛŸnÊÄdt›§IùáI‰ÇHJÊ>*OCfLP«‚Ð'á9Ûëþn­,7Jììë´°P{¬âh$+C Ãñ¨,öy\V*[K*x|²mf¨Íž¦Â˜-1»a*s…*½*:VK;Pï:C™’”v©Ähˆœa{k;­ª¶ôçº Ô­çê.ðøXš…뮾®X½ß"É ÊͲ%ª&Á4yŽÝpkøíîúÅÄ«j¡~ªJœÿ¤2kûç$à¡4ÐB,_^§q¦]&ý™ysÃŒ}9¿?f^ëµ~nåÿø'øOÿØ_Ék½ÖßQUÌ€væÀ_¸ý2Ï|ð³¾_fýuIÿ…À…üs¡úTn¦G`>°Æ UT„ nÎ 0ÓÝ…"ä| žÀêðÁ$"% aÄy@<ªž¢ÀªvNÖ—q ?ŽŸ3í¢àCaê Ý9³?œw=Ÿ#}²”M‚§Ÿ‰GYf®¶W“ÒÌ“è1F…Æ ‹J(ÅPÌTÚMá £²\ALÂÒ{ Ïj]˜eš hpx²CÂsér¡¦°\&Rœ8í í² “°aµRާÂnÈUÒûQí |>Ô½éß?Ø×uußR7Ö¬5 á÷?8ÆQY.M3û<†åmË1™ý³Ò÷pÜe)e¥ò&ßY.ìºXÖ°X:o¦ðëkGpBÓ8în‹…жŽÃÑtï:O:½zªÊGa×þ|1´§\èU9¼Ü®óËÖcÔ`˜`:gÖW™Å ž>>}Ÿès¡©Sr ƒRe±¶ë6eáæ-´KÇó³ÑjÄÛ¶K‹!…?üóÌî1±Ë…P ÷×BΞåÊ“²Ãa›´q΄ȪT¥Ì’§‹™Ö?Y-—ájai·FyÄAM¦tóO…Ó!ÓŸ3Ç<§M;»V¦>ó©Kcb+Ê›·°¹ï•ãs¡;+‡cáñ¬†qÅ6Iվǜ٥Ä"E¼&–™|S¾l÷ u)¬¶¡°ñ‚ÏÊ>Âagr¢P)›+%„Bp#Œƒ2uÅP´ÃmIPkf .ºR(¹0i¡njÛ,¬o¬m l[ðA:!}yì“*ãhݪKï>õók4Øeµu”⸺µ¼‹Ó¤¬Z¡]Ø×ñ|F5IR=asQŠ@-‚Så¹W>uÉÖD/š‚eÍÙœb ôñY9>gλD»Œ,ÖÓÞˆZmcySRò‹%,¿zÇbñ œ¯™Æ qŽq´ÁŒÎSw¸i­Ì÷"³~/8Ï<£@Ó¼IrjM~.eÆ„šD*]îÓ—?[ ò“AÑËÏvÁê<ß^¯õó«ðŸü±¿‚×z­¿ãzA?bÓú¹$¿ðŸç5²Ê _ÐoÁËK*$sª¬Ãš± X¨¨2ålŸkÞTâæM³ðšœç º7"öë”*êÇB,têæ-ÝÉÒuà•Bp„ðü¬´¡0ó”hÄ19ÃÆN˜ñÕàMj¯Üoa}mÙ u+Lƒ*Œ|µtÄÑšÔoÙ¬­÷LÙšD‡éê¯ÔBԦζK>(Oƒ™ngÒž&gKP.½Ò%ˆ°P3жËBÉýQHêИa?\-•ºr¨*íR¸oWw5ç=žC—Ð"´KE\… “¡9…¾sv¯¡ fÉ‘Ïʶ¶‡]RjI8繺·„é’ ¡²PÕ8VWŽ«,|”îXøühĨ1úÜ1'aù^øx‚­d¾ýs#-·Åá½I›¥°] ù\„¾Ø5¶lí’“ò°†r¡ )-—P,e}U8íÓ”éÏÂr#tg£Œ‰³{L¨M”“2eeŒ&}›†ÂÔ'Òt¦ Ý©"Ž%Ž Ó ×_æaŠ…w)ÁÍrœYš¤bSúÌÆÿ¥‘Ï—{z¹Äù–Ÿxx‘ ÅŸ¤ë ÎdA¢¶Ì¯(Ð×ú™ÖkØký,ëâ’Š0㥭–í×ÎÍ¡D*T eÆÏùËD_ÄØýÙôí^ižŠ¹-5§ëüsŠH)hNT¡ç‘dw~¸É¤4QR…«ŒyuçÉÙhMâ2Ãi"ŽŠˆçtÌì /É…ä¾(Y…:î³?«¿‘@ò° BœŒ¬q â„ÕF8`*J¥…ÕVÙ#ŸKÓÕ¢¬ªy8 äYºrVÅ¡õ†«,ÀiÞ’D︎›·JœˆD¹[›ñpÿ\øøYøæÏjëHQ{Töc}åh×6É<í#C—ºBÒÂzW÷‹µØ*ÂpØŸâ…¦ö´ÞÒ˜]åØ,+bRªª°ë@'AØ6ÂÕšNÙàáCDé®ïßxòA¸½vGG#FÌq@§0œa;ºSQ*77âÞñR”f™ 8ç¸ùjA·‡ë·…¡‹tÇHÊJ—„¾üd‡ÑSò¬ÄÑÊ q¾fé”û7p]9>=8>då U)ÔÎñ\`‰r a¿7£kâ½7¹ÃˆÅˆ3ñì¹o Û;Ï4Tž)BÕ ÃPØk!Ž6õ¥Ð77˜.½êqPra62/œ0&Û¢ÖÞ#sâö]esÚ˜ á$Â{-P”ýÑ(<¥(q4é×T &ËaÈY™è“rž)IËùñÉÉv 7K¡ª•ªr²ð½ÕV{Ç›|j;7ú"ðþ[¥h`…î t]b±’—À·¡Ït#ôšaJ4ÎáœðãA¸ vh^¯ é”Ù?dª:£ª¬6UËHqd±†ÅÚQ·Í2px´éó·¿Ôq>8¦1Ò§±°Ò²…¾S>þmféM¢“KFövßj¡m„q€˜2S²ça” ¹Pg“ì}Œ6Á¯7Âó'eÌÔÂÂ6 c¯sþv0©ª…ÕVp^‡‚ÏJ•w÷ófo„ÅÚLÆ)*_ÿ™ÒŸÈ±c÷h‡ƒýçÈá±£¤LIïÍÌæ±Æìî½*Çñl^…Ê;–P5…ª†þMš úÎ$Wˆ]f&\ã9&Ó— à‹MkóÌýïæp´FŒ}oaF޵wDïøª Ô•}Y7·ÂæÊáƒo= äÎÑí„qrïŠ8†£2œcW8í2]—9«²®„7ß®ïmºþ‡ùÝo>Ÿ 'Ô‹Š¶*¤ZWüƒÿÑ5ï?úŽ7÷B¨øÕÿ`ŲiØïÇ.ÒL£ÝÖ…ÓTxš›üEp3òo½†¦vœz3) °¨•Õ šÖ1t™Ã¨lÅÍjœ> ¹7ó¨s…çO‘4EÄþù_'ʹiHÍ09ªrarŽ“ÆùÚóµ:©ƒ©wxµÔÙ“@žñ†^°@:µI±+Êf ßþloÇgÇ~´­:!VïX­Ê“Saà|2¹Hš°‰êüºñؤL¼5%™Ln!‚Ρwâ8{Í8籩,ŠÏ°¾²ôì­Y½$g×"¼yg™c†~²Cu»PœÀáRLÓÞÔP¡AXyÇ›Ǫr¤âX/áêÎRhû3´ 8ï…åÒ(t³”í8ëºËQ;xÞº©ðþ½c8Ûã8œáæçýw-•”@tŽ åÝ•½s´à-'Â0(ÇQˆÑáðöPUBŠÊî ‡=-´‹ï…Ægrö4¼{ïh—5ÃCd÷ÙÞšEAõHã>©…¢‰P7 IÈ*DQÇûï*67žºuüð£â¦Ä¨†íL±Ð4ÂþY9OF%ê#Fž›X”•¡Wúcáù˜8C–—Çä Êy*ô¹0M™SΜSaàÝ;ìõ™Lfبp¿w÷±b‚.Á0K¿ºùÏ]µÂ²q¬*»oUIpÞ~ç9í«— ²˜,è­Y8Ö[Û:“J÷Ð.÷ïo¿«©Ú%ûæ·8ÁÓd³N“pðEpb4OBгàÝœG€“²h•Æ Íê…ãÔ™i·ÂrcéÙËM$†cÇÓ‡=O§Sš˜²1ÿ§œˆÅý‰9!y+jhЋ¤ç‚÷Tl³q!é|}¦Ÿ}3—›¶mòLˆ» wò|³emø^s^ëçX¯€×úÙUݼßÔÖð;‘—ɼ›¿—¤P½4ú³ŒÁÏÍÕÅ0ìÝeŠá{ëË6àâ¨ÜOˆBÂKø—m.z}È%âN„MHÓHUOÄqBsÏóǦµUôqTÒhÈ’!)ÌSâ¨65 ÁÑ®*Ú¥g׆läuÜÜzÒ˜&›lm6ÂöÆÌ¬1rTi,#¤d]j /SèâÌ@«³)oé„íQ;ú“à½}oi4}måÍHš³cê?¾á19'bæZ„çÉè1ƒ*K„»k8ž >&¾zWxÿg-õ"ÐF~ø›ÈÓ1rÎ…F„zF”Æd¨Ö«{㮚2£R{>ý!ñô1ËÝÞ8Þ|í»Ï“²áë·ÐÔžãl®=‹å‚t.¤1‘ç© JTœ7yÃ/þÌñ‹_6œ÷õ‹Ï„Xàæ(Âj Ïs3}œ› ?KË®DøækÇ·Rq·ñpvÜ®c’—‰ä:ÌøÚK…oj:k¢K!Ì›€§\¨‹1ô5)%9:_ÓÔzÞLU–K“v<L¤hs>&CÂe±Ípw«ÔâHÉdrn~ÝȬ™ßÞ®„uã9û[',n½pÛ€°¬µmÂkLJã8A7)­3úÏ»÷Ö®¶Žé¨ÄTXó©v°ì:Gw0"ÐbU˜:eŒJÛ(uÍ;±4ÿÕgá}o‡'ÂW[kè†Þ¤X§®P;{(“²¾RVKGÈŽ68¾ýsG¨<Ï "Ç牡Ëw…CæÇc¤š2Ëufè ‹Uáfëh½…ýÕó4z%0óÂÙlövØv–pÿFØÜR´­†aÑ8ÖÇ’xD„û;ÛZ,7ŽMò´\ %#•¦†åÆî§=œp< ýüz‹¦ðöWŽþPQÊ–é<"šé lÄŒÓm¥0g|ÄѨaÓ˜éÇLŠ…vQ¸ºqFš&G™ ®…çÑ3õÌ$ÊWo¡];Dj“…Š’çýHw.tZˆ)2¤HL‘1[X,Ù†'Ũ?¼gV3,[óoÏ£1ÿçP=1ï@)ö#ÍHá’glh1*Î9—?wùûåå`ðöZ?Ïzõ¼ÖÏ®¾Lê¿h>ÎÑï—`5,á%uT¡½H=‹¢bþe•¬?Ù\ô¨*B-_ô¥¹™hMRD‰„ QDhJAsDK¡ZxÐÂ‡ß ”œ©ê¥°Ê!*û"¬+/¦dmÄdê%{O‘ªXC‘*CW6• Å°|tÆæ_®ÕäÏÂó9QkæÜ%šT8õ<-Ë•—™Å ÎÁ¶ ,ZsÅʤ0§½…%1#t ?šq±ÌZm—3Y•18RŽÍ…³sÜyÏÛ{a±VJ±À¦§ÏóÀñ(<"»b‡¢…À¡(%Úç¹[èÿðšÊØôàUI%¡Å¾Ÿ¥³çˆl(à °­`¹µTX¬u8ímj_5…û¯=~6\ž•ºÓYX¯a8‡ÿí7ÂãG9›1¶m”¦´ÝA^̽[”ažþØñÃG8ž ­Ìdý8qÖ1×"4 Zë%h¶wŽêlÌÄ‘²ò8šz˜‘‰áêºâý™O{EæIèÓ®@ÉLcæœ ¤Ì2Yàù¹ð§jX?ì-‰µ–Ìd,7[Xm=Û[UCŠ<üë1S1œHIzp•"Áq½¶Æ_Äq>*)ö½}ýK8í+¦¡ç_2¡*¼¿-Œ½Ðw'ÐÕp·r8§|øÑü ë…Ò•Báæ¦Á°¸×oï®þÝÿ–ÿ:ñë¿z¶4Ý6AOŽ^‡˜hGËS„ó†T¨ “òWÿâ|bèí@3“2Ì„¦5°\-iŸ`ÿ÷Ë„Ül iÒ¤(»£!Q…1ÚÆp!¶5X/-5øðd· ,pscsLÐEXW†¦9<ÃæjÖ°×*å㊫M¨DiWJÝcïé’£ŸàZ„FàæZ¹ÿ¦b::>ü&s:|hfµîG)ɳ¼ÀýâhØÏPAš]¶»£²¹)”ìxþÓ™&3¯‚²×Šmmt¤î\qóV8Ÿ*v‰å˜iÖžÇ!à%áÒĹdrɤRH­ÿŒü,?‘û\|A„Ê9»wçLùÉ}ÛÏ÷èìlªŸ°ÂOIAù'MÿåçKðk½ÖÏ­^¯õ³«„]ØS/6~ `>¾Èv † ½4ð:„ŠŠÍ•ŠûBi Φ×Lè¿òc–1¿ÙHQ2‰Ú{Ô¦ÈÎtÓ“ç¡Ð†HÝÚ›üj#ÄÑ…ã³òœ KïX‰JyÙ:´kPõöª#—@pB…pLç;%øð ,PGú³™%§a"O‰®ƈŒŠ&hT"øJH"Üaëgïiª@Õxk#çù£p8Î¥ ÞS©!<Å™ûéô)Q«R—B] 9›‘ô©(7Rž‘e Ý`)žÝ÷‘˜”³˜ù38ã·Ë¬‰wz„™ZS¹¬ík;«0Œ¦=.Åš³ Œò£‰ªD†sâ3]Ÿç ³Ì§®¾}Þ¾ÿ•÷ÔGÕÑ. ‹•§=»sÁç„Çy~³}×z#ËtÊaH0NäbSß”L~jçXOa[ƒRè»Â>et24ËËs…c‚@]ÃÝ;a<{›&è'xV3æ¶›ZhjGÝzJç“M ƒs4| Báë_:œ_pxˆ“П`,žÊ)]²&ãÝ\¿…’=Ÿ?Áó>Á4ÎâX-•8ÙTqˆ¶VRq¬[áiTR.-ÄùpÈüý{çàɘ¹òWß8ªÆ´ûGá4 £= T¡`¸Ð¢4¢”¬”˜qZ¸{ë¨[Á¹Š§gO—,õ¶O…CÊø”Y”¶×ðô`Ò¤©Ü|øåWŽoÿ–ýç†?FÚ*q>)wo:oЪÆÓíú^m!Xs^/Œ¿¯ª<üPµPUŽýü¸ì{Xo…v!L£0vœmº´Øëåj-4­iÇïÞ;Nûšç‡†1E4gºa‚R^|>ÌŸ»¤Lž"A„A•Û°º®H“c¿ÿ¢ïT ¥°ZšFÙ=Xªµh)Œ¹Ð—BöžÚ9ïñ2ëð‹¨*!›)ÿ¨Jž õl”ÿêÚ‘Šî2*ë•д…õ5<ü ¤”iWp|†>Í÷%·×žiðD`Õ i‚7ß ËuE‚~´CFš1—YMb¤3*6ˆ‘ÀÀ¶¾2/@wê¦b±lnÜ, g¡”LwŒt§lá]µ2 ‚x8wJŒhÔ´5Ÿw…:9©ëÁ‰róF •gìO;8©ò«¯„¡«8ºux¡,·Êá©ADAÃäX4Âίˆ¾"¦ˆ¦øâ“É3¦Sæ),™©dTçÍ@ÎÖìsiÚ i&º©Zßæé~,ååÏÄ\H¹ØçÎæCŠ¥˜G ¨QF‹míl`¡ü—Óûmíµ^ëï¼^7¯õ³.›W]h&IÙZl2X»yÍ[lâåç(áâìã³—˜¼n”ÃAéRfí3)ªÆè(«0ŽÊù Q-'áä±+ä¢ìK¡3ZlzçU)Éøä&s³ÁÂϲ鎫`’„Erœ¢G…˜†ÂiÄ69Øó4&¥e5Ë(Þüƒw¼Ù?ññ7™¦9ì•a0?DU™ÿéÇBÑDNÎtýNˆjD©Åʱ½µÃCÞgŽEøöVèÏŽ·k%¡¨çǽ…@E¬YÄÙçªæCÁØ›Lk{'¤è8}R&a&Ùf@Ô´þ·WÊ4ÆÞ¦ÈÎÁbˆ4!ñ4XS—»\Ka@XÞ ï¾]ð°è8QϾ•ûµÒ,àoÿÛÂ0ô,W™ÍLƒç´sb¦G¹ ŽõÒq}gfÞfiô£q0÷Ô £:ƒ2õ…ILFô¦Ö×öôgûB)& Kê(Þ¡c„qrä“ckF­I1’Sâœ3+Æ*PÂ¥yî¶‚8îU4¢M#Cج­™¾º7ýÿçFÇ©3øo ¶•gáM,ìb!äLÎ…âmð¤ºbÝ oïÎÙuøñCáÃ>ÎYÂv ›¡då‡˦д™’…ÇöZ¨ZÇqc¶®Iìz-¥°¾Rú³#¾dj8â™F¨ŠÇE ÇÒL†±TnÅ®ÛÝÞšwqpž õ™ëÎññÁ ¸Á q•+E‰ÎÇ7½–*靖àç×WΧ”¡,£ÀÈÇží]Kw ¼y3!…ÓrJ qŽ’,™:Ž -Ž«»Ìo€‚p ‹µcÜ‹üÍ4üfôÍ¥X38æÓ**/€¤àÔîynü/8?¦/Û]¾˜{,ÈPìû|Ñý+–1`/Qùc¿…½Öký÷V¯€×úÙÕO7—00?¯«ÝÜä^ÌÁ¾’™Ãn°õ¶r¿  “#¥ŸœmP͆¾Ÿbu>(Ø›¨}lQ·4UÍÒnBE»4ËÌÔw–‚ÊÈÇFVmáã©pßÂгÂ9›zµKk*‡sfÌ…khL³{îZGß›AvÝ uz ‘œ”Ïû‰ÛuááQÙó:ˆw,=\0œTÄ4ÛT«¦bé9xnž·ßy·Ä ‡ab(…s¬ç°«FYm ÏŸ3û^éJf©°³wh®Ä‘œcDUqEéKa m±Æ·`ÍŒÃÒš¼¤ÊÞŠ%ëœã 6•]ÿî/ŒM>Â!™a-Ö¨…*ÆÑp“ÓôóÍ/ƒy&ó”ìLÚ£FˆQ”îÿÃÞüX¶®éØïýÌrÛÄ“æØkëV‹FlAl€” 4  ÐDM5ÒßÀ¿¡Gš  Y·$@ó& MÑUW±È*Ö­ºæ¸4á¶]æs¼kGfq(ÞÆUÄä‰Ì0yvFì½Ökžç÷L…]Ñænœ*1ÔFx±6,/`8 ÷I 1^ šC,x2ÆÂ ]S˜ÆÂ¶hRtmdö)–­nú œö¨ ׊ЈICÉø\hrÆÛÌ0d"Bã ƒ «lüýQ¬ÕB“X÷suáá8|ÊŒÀªÍtKƒ±0œ ïŽ³š­ø…åÓWL½åá}bê )jÓišêCÈJ€Bå(9g¼UiTëè*eôW­†Díî ÕckñVÍ…æ¦Ñ.TV—RÅ)®1fî2ëÀgZKJŒ1qe4Œ­?fŽ!‘€ýÜX9 eNÆÂ) GQ)Ym-5Pbb œ3×7†ºµ¤¨ÍUI™¡OTµÑ´îìfV|f;ªä¤E)I @raˆ^Ýè„þtHì…)Æ•ªèÏÎ5f[éð¡4MÙÌÍ^S¦$,:auexÿ¾p?ÀŽòDØ2ÀkëK V;D%3ÌHKôš·l_ɬ}Ÿh¯×¸‡¥èl–ðâ3Ïa'á †Ëº•†q¹Êp|4|ú“Š÷ßy¦©`r Ÿ”|åKÑÂÒœ²Þ­,US1œ S*t›·ÕâHŠQsFrÒ hQjÚhö”¬~•f/À¼©‹fctç͹q¹<„cɤ”ŸžSyžúó6 ¥Â?~Û·µçó|~ãçyð|¾·ç”PɈ™5þòý„ýL:éhæX{1JÂÑBð†)Š&’šzgs¯™Ó‚)h£`-X΂µ¤œ(9“,  ï0VÃö÷…W?¼fûþî&Æ9N™•3_JÀ¹ÄõkK)ŽÃc §B] ÎZâ9¯À)±ÄËÍ á°\UèÖ`LÆÌ¼ý›µ¥d¨|¡I<-ØbR™ÆËÏ:Â丟ˆÆÄ0ÔŽ•sl^V—ŽfѧÓm"ôšLZw°j._Xº\¾LüÑ$Êö¥Ðˆ0•‚É™KÞÍÚÛ*–sNƒ±‚wBLgLŸÒbb‚ÍRp†Ih£>Å ¯–0ÌÓô “3OØå²ðþ±¢áâ¢0Š2B%Úp,­Ê‡³n¼R†þh‚Ñ@³”é¬^GγìãäQ «„þ" ˜’þ»Þîûv¢GŸ µDRýT'ü)ÂX°–§ð¡ºªV¥Z&Æ47†Ö°Z9¾üÙ‚O¿‚A7JÃXDb~fÀg¥Ö\.…>¬¨|IéS†c&„jÞÉL• FØÎ![bÔ{ÑÕ‡¡Ïú|:Ë!œÀº-¤I˜ŒÅCc-+ m-Ä«jFA.ç V´¸ñ•š›ëZ5ù§±0x…WWÂõÆP7B´ì'ÝØ¤R3:oÅÖW†‹k‹±º]غŠÈS#ÝÌáy2Êq‚~—xx(TNƒó‡zÒ4f­þ|rÖfÖ:‡¯ a4Œ'Ë4Ë®|¥\{g Î2¤‚¤Bcá3ý| ¸éôÿÝ® ׯ=ë+ÇzãhŒÐOÂ!%R¯d)M=ž=B¦Ö×jô>îôùt±r¼¸6\m„U ö”É13…H#2E†)órUX_Á»_9¶ÑÒOIº)‰úYr˜'¡à8&ú!sõãg©J,pœ7)à 3¨ÐfÝͯ›C€I„MQðÁc‚Ç”™¢Jcúùïó =˜¯wÇ¢ŽåšÆ¨ªÒ׉ 'T:µV½?hbðòÂqÿÆh‚ôíÈé0ªy7Dú1‘E·S§ƒáÕ'žÕRX]zv'Gå Æy(†Ó¾P{MM4†˜¢^GQ"XLI_ 1sãLD‹³ 8ÌR°s‘¾œ“ŽÏFaÝè¶0¦sˆX~ò HQ™'0{>P€¾>™'~жºv¼ö/dÏfâ ¯¾„’„íQ·qþ·wN¸¸°\½ð·…Ç-LGÃri¨ ä¬G1™4 ‹ -CÔB·ªKWp•+µa±‚ÛCfwÊ™1«A9ËÒ¨Ù0NNQ§êè¬6+kŸ¦å"„aÝmç°joèOÃTÀZ‹·–b ,[Mz}{«‹óŽõ¥''OU¦AËr†o¾.„˜°ÖpHB ë2Ž=)Þ¼›¸íµPhçíD%¿X#4"4µåê¥!†ÍZ•Êi Ö²¦¤ž’"ÂM£E~õ˜1´Îè4ºN½z‡¢äRàÓ†ÕÆP‰°jáÓ/döºh¡2öBœŠ²ícÁ†H*E7/“‹µ‰0,C]Yrú$ì0¬æ×KšÄúb)¼2cš‹Îœ±¢ÛƒýÌòÅ—5Uå±®¡j*bpÜ¿Ël§Èa*cX¶Ž›×ë5=ÚXðuáò…ÁWBŽ_e®>Q“éû;M ®½pš¥;%ElɼüÌpó‰ÃUŠN™0›k—ó÷Ô¡Åèioy÷^7ÇlS¢CS[­n¼2Ú°6–¾p±®¯ ÎC³€`w'ì¶™¡Ï,WYyû{Ï~²¤¾Ð÷sbŠjöB¦uʨ̫u†¾R|c 5ÔµatÙ4‚ÅжÚÖNÔð=o“,Ú@fóaБ¦¤¯ñ³ìQƒ ÕH®×Gy GtVp•z'bÒMžCJ‚1–ºS?Äi/„1sH…Æjè—s–å¥`åÔŽ!ÓXpNèªÏï{C¦N™ª‰÷Ìz$-î­÷L~Éøö•žŠ÷’3 5°§¬¤fxALóû’zÊ\П§úÓœù‘ÔÕûd$ÎÈfôi €˜Zœƒ§<™çàù|Oϳàù|ïÎY²9dh­1*ë9[¹Î¡/ÌÓ´b?DÊG)Øy àçÀ°$àQN¸Xeq+UÂè ÖÅγQ-‹ ¼)ß6>3'âtÂ5¾ò8«%øØ†c"N¡WÎö˜uí_A C)|ö¥çá}&åÄ»Iñ‰ QiE¡j a)Âñ”!GŒ¨áÍ9!$ËÛ_eD ëÚ0Fm0¬ÕTÜ>T¬’rÝ °+…Ó}àr¨j-øS°œŽóÖî6–ûƒÃ i¸‹uD¤PŠðÕ_^,<«Ï ÷ï"o'JNÜ  |o Åè º2ÂËœñ ¬6ŽºU²ÍpÌJ™™Í‘íÂ2ZùJ1š+ïù¼Õ´±í]aŠ…c)<žTç|ÓJö*¥Épûmf. ë8åB5Äúóî?g²¾ú¼ÿvdʱòX:kÉ”8g4xCUé÷¬ª…Õ•esc‰“aU­”›Ã¨“ãM«ò_£i¹{•§5 ÍZHQØÍqÁPJaÊ™u¥¨LW6/àø¨R«n“NûÄn¯Þµj,«R4!(]jµVÎ~ 2” ³ìLjp%*ë1ºª`‡Â0•)³,1Wyblë8î"}ˆl§H Ú^4žÚ Î%Þe†nûLu[Ø,ôÅן4{¸ª ·ÂÍgŽ¿ñwjâ”yók ,:m__ê&r:0œ`³so8fXÕ…åF©7÷;a57¢Kà(|º2t+ý^«[§Sa±–0žÔ {Üg¶™Í¥~¯¬)¸ª°Zö÷†ï¾…®Êt«ŒMžÛGË1&òXXfXxØ'!yÚ¶]4úy]i¡}<J2ôI¨kݼ‰€¯yʦ0R¨ýlT-ókv\Ly¾ŽÍC kÀ‰ðòBÓÈàúý0Íd:`°{TV“ cRŒ¦3…ªdŽ;™‰M6ÓEÍ,¸0œÆ‘p[¸ôBñ_4%8ŒÐV–ÅZh—ŽÝC!…Ìi—16Q „Œu°^D1le6öæ¬áv -Ê ¨g%kQ_æ-@Êjðe&•9ð.~îuÎÈóøG>º?Ø™q 4ó'äòa¨£=Ç3'åù|?Ïsð|¾wçì]±{À½ñ ïÑÀ¹èÏóÚWòÙ# +c;±3}Ä&ÜÌ–“2fÑ®µjêdΰV'ãÉXä踹ôˆ¬ ”b˜F-P»Uf:Ái¯Eõ4Z«è»©Ūî÷ñV‘ŸÎz>©+êÖsõ¢"LÛo¦±ð8@›3]“ “°Ÿ„pHHlúâXp®`M¦.:­jƒ÷B)N'yI¥DV„ÕE!%Ï›_Fª6Q’åáAH’Ù, ¯® Î wo 1íRÓ8Kxg˜Þ«Êv‰I™ËRÉ\8ƒˆÅ:¨»‚µ™Õ•póÙšæ³5û_þì_~G3«¶0jDƒJ‚–›Âê²àœÊ‚ðõ;î-¼Á!‰QjP>þ1¨ÿ 6¢äž(§¡]Õ)3ˆFQ§MÉäI5ún ¤ÊŒ`£j§:é}å Ë•’G83Ó iÉ> BëTkœ‹¡é ÆÆ\¿Ò´Õí£j³ãÆiŠêTDåDè6Ãz!Œ…w_¦¤†ê«Wää¼ê¶Ç^ êÚœ),Vú±…n%„QºšNHAx÷N‰E§¢ik…ÚÚÙ<?€/fæŠþ›LQ“Æagy8ÂÂ$ú”y'⤉ÏQÀ~&M½0e¸û2YUù\Vs|Õ8®^Í’› ¢¯xù¹~/ëV_µ9ÁqWcd8ê6“¢asS0÷Ú"–˰ï 6ÁÒXÍ–Àñ MoUk€ÙbÝ2sÚ%BÈl·ºE<…ˆN{Ãr#˜âs˜# …Ý}dqa°q~½ $§s‰sàP9Ïr-´ «iÖ×J:ü‡D0úüJβ^C2Í2QÕÐ4uÛ×PFÁ"ØJ¹õ!èÏQcïl|÷Îð×þ^EU]3õ‰¯~`Œ9F׿b±„:ê5îÒ(ù*'O‰©dÜL:3sqüÝ×úuÖ:k5tnPIŽIÈ“yûÖó“Mâŧ o¿Nè«DQ·³ç—Œg„0!EëeFþ–Yºs¾FŸËðsBÉ™E¿Æ~NùCöÙüs&)'>H¥àL‡Ó~ßä¹Q È<ÄømßÑžÏóùæ¸ÿÓü›ÿê·ýHžÏóù =¥ÌÉÀó[˜›ù òs ¼ÈÌ—6g­µ¨ÙÎ@É:M¹ VO‰ óÄȨ4È¢èdÔ¨;ï HhPÕ)gâcæÅ2BÕ¦>p ‘jRy%3Íν"Âú†©p<)_•çÂ4fÃÏþvÇØ×”ôÀ›o H•Kaí ÝRð“v,bÂ"j¨×ö E²·–ÊC±†Ç½ŽÁ\),:•&Ÿñ5¬~VÑvŽÃ!³»OLS¡š2)2B0Š‚ 1ª'®\bFÌèKaŒ‰#¾@Ž‘‹«L Âñ`ñù‹ÂŸþ»[–Õ{–ަõLÙ²3ë–'âÏæÔ­ãðha6ùæÌÚ /~P‘³áñ®BÁúL³â¼!(èºßÏÈMJ./ucæÐ S.$*7¼ºÄèØî…!k³KáþT˜&a½.·†ãÄÂfmƒ¨>=åÂ4<–” §bØ\ÁÐÃõ9¶ŸéÚF S(·Ee3/ ÖÃöVƒ¢ÆMQ"ʲ‚͵ÊÍÚeÆ:C³°†±7´‹ÌÛ7™Ó]ÑÆÐBæÚÁb娕Dõ{tÕ ã 1â«‚Ï’0ˆÕÔæx"6%LÒ”b/°Z.®´À!sØ%®|ÆšsÀ˜#Fascøò,UçÀ€•ö”T(9ÇÀáaäñ¯ùÚP·0ž,U«UÎ'r63ÅÅRæö»B…ðÉJÿ¾8ebT¯Ï8xÔm•ó°}0œ‚ÁÁJÂùˆ$õ`,Râ¸5”IÅ“¥b} ãàYnNŒ'%}YcØXÃ0Oªcj eûy23ƺ֒²0dxqiØÜèÕe8EîßMŒ½e›€Ii[‹HÑÄâ¦>ùÒ°¼²Y=íÂsñâS†þŠÇ¯ïHi`¹L¼}ˆ ¢!÷BÛj¦ÁÍg–4Uô'¡?*±gÔf&ňñ™Å³¥äÌÅu¦]:o59½’ŒñZà—lˆÖrûmBÌ‘i‚¶us"¯C$дcÀ•Â8›zSÉ”³¼yÒðŸ¯ÕY´(7s:ûyPæF!‰Ì ùý³q¾éž¾ö ¥èÇJÖ‚<Ï8¡B"£7ô³d"Î[P æ)@ÝlФÚÛÑñÉÂÑ, û»=>gŽ»LŒó×›98ét(XkX·lƒN¿ÀvÛóçÿjT†+TVñˆÓ3žô&Ö-3‡mÁÚ‚“Ì1&VöœŪö|Y !’3,½!§Â0ú>1gü&ÔUb¹Î¶ÂˆÐÕž¡wc¡±T^1 ÃQðuÁ °Ü¨yùŽ‘>bŒl‘ªI¤Pøúkå€O'Mt­ç2ý{xõªP{Ë&|ó†å²à½ðò ¸ûÎ1öJŽ©:%!bðµ%¥Œ5q‰Ó>ÒDȱ`цªªæéŸ*/~(,7 )h8×»¯ÃiB¤0&KÝêsÁû¤´'æÀµ¢ÍdŸ!nuÒ?ˆÐÄ‚·‚ó¢L{§ÎËK‹1ü”³JP._Êœ–Y,2÷G¨Å—ÁÕO×xª¶°¿ŽÁ¡7b”t µX\¥AT§½ðî+õ‰ ë ÛI¥Cˆä)²º…%Í’ð¶0å¢ Ôu¡¤LK9%Q­‰À~Æ_’2U)\¡«-7ŸYD,_N€+1«k ‹AÈÉ'Ããý>¹Ú³º„2‡‡žÇ÷Šœœ†BŠê{ðUæòµÃ˜Ìp‚õ±_½2ì#§}a}mNj“M11ö*Cd(„¡Ðv™ë×BÝ ïß©Dh<%¦ l,4wûÌÃ>k³¸tLÀåµe±Îlï*Ö×…oÞƒkŒ‚I )† a±Ú•ÐtŽá$„TxxÌL£6,Mg°Z¯MÕÛ¯2‹µ Æâ«šm,4ÆSÂ&Í•X7:\˜&Ã)eöBUšEææÓ+–?¸BÜ}wâ¸=p ‰…;Ë-M ?þ[‚·ž~ï‰Qˆ“ǘ‚©Ëe¦j Ãqbì3Ã$ ÖëÖH½ ¬+¬›aÎp³giNKN‰q2ì³a·›h¬°¨Ô_“’Jé–"ŒÅL‚lÈÄ™‚¤×[½k`‹ý峿j6nñÍgòèuTý]åi£×粞87ïiþÅÜœŸ2“žÏóù>žç °çó½;g"rÆ~ªÀÎ4 ƒÊü,õ¢«~7‡€Ùsp”ÑÐ0oÕÜiNŠÅ0ÿYU £±Zð/¬’~¬Õ 'k-Kg¹4/†Ú{Š«XTŽv!8í&†AY„ukh†ñ§c‚¢ ¢‡ ¬+ÕÕǘY¬ ý¦I¥NКÂë—†Ó^õ¾cT»7‚H“Xo2Ç}áî61ÎÒ(ï©ö稭¡u–åv»2ç'¨¦¼i7ªÏÎâc躊õuKŽ`œšcT¯n0 )r†ÅÚ"¶ç3M—(1¦„µÇ÷#ÓØ2CÊØ’Ù§LS _~j¨;‡P²#§hùäsG»²Lƒb¦[êî¾ËwJYJ³Ûù¼ÍY]@Œ°}Ð01óç•3]bcØßgÆ>1މý˜rÂè TÖðnÖc7Öðb%ìKm b-¸^ˆe{TzO×Y^} ËW5÷_Áþ^¹åÝR%[Ã1‰œ…S´4¦0•Œ/ë2Ö$öÛˆ51Â~ÔIiÐ-´0NQqÊj"ßCS[¬ÓŸAÓeúS!eK Î'¦AèVŽœ-§ˆrï‹&Ïæ³¢;oØcègômódÒ„¥•§]X| ÷‰ï ¾¶ ÝÒ@QŒm jÂq„Æ!â|"%ƒÂsU þâKëß]Á |õ'{Ú•†ˆÅÉqÚg¦QhºŠ” %G¦Á°X%bÆQ‘¨b…Ó61 ‘Œó…õeæö»Ä±[@çÁ‘ÃÚ*¯ä£˜„ª†þ~Ëå«–Ó¾âáãñö’X_†<î’#¨Ežö‡ÅÛ Û !i·µ\/usµ‹BKÁ:5íï”gIŒ ŸÞ(=G‹máÔ†>R;¡nují*CÕrj¨;p.°H,Ö…’)eŽ{Mp®jÃþ`ÍöÎrûÍHLÔP² éV…8E¾ù*0EuÌx › (´tKÇí¾ljVt£QŒ0¥òT´/Í™b¡©„nápUo7ÄzM@“Áw1pJQ ?)R 夘Δs"ÎæÞ˜•J!äŒÌž€óÐæLʳ,(å@Ìç@°y¨ÃGPžèÏLœm@…ÿî»ç °çóý;Ï çó½;giÎyróômκ\ø¨)Õþ‹ÑhxD5µ˜jEYÌùóÀ‹|H6æ„à„ÐCš1¡Îh˜”µFCŠÄP•ÄPˆcb&È™ÅÊÐ,×*ax8¨þÞYÁdaˆ¨'ÁMgˆÁꃥ‰ÔN1¢»]Á”DŒ™}. 1)s½QSäãúÜÌOF¨Ð¯·Îjrp˜é!FË! ,coèV« ÉãkuZ„©Ca¹*¬®2UUˆS&…<Ë´IX_YÖמŦáòõ‚×?ZQ/:–kƒo,ëµÅ%‡XËÆ;c…õ•a±¶ –0Â탢°ZXºµ ¤¬ƒv ÍbþžcqN§ìu§hÃ,1 a´„Q1Ùx´ÅsD„1 w™ýCfš+¼ãêÂb£![ÃPTo,"kðan0D”ø"†~’«ÄŸn!øÚѶ:ýmWÊ×·^ù¯~"û-ÔµE†9fc$ ‰˜¡ëT«¿haÑšVOóó³Rƒ®¦ÖV†Å…~o>ÕÂ{cæ"ÞéÔ¿ž³ÌÌɿ•Ói±ÓY½58£“<ïyiáÊ:¢ó㸴–U5ñî›;rÌ´­Ð®,u»»Ì»c¦1º¡°($FJ ØŸ2%ª¡µ]êwàtÔ›WÓ¨d¨Ÿ4¨+Ì7è©LÉ´š¦É¦Ö°pŽ2O®ÕÄ(ÊÐ.…ʪʱº¬xýÖåOop9CvÜýbÏýw‰Ë B*C\è ç5Ìj±±L“p¼Ïgp®ÂTíÂShXl<¦ŒÄг»ÝóõØóð8"¥pó¬ÄIïãûÌ8 ›EÅë/+\¥ÆakÅ:sØf|¥´ ç §ƒR…rÊä¤<üý}á8²ëÚ‚oð®ÆyÕŸG5OºÆ²¹6ŒÇD˜2·‡L?lQÑpFŸ77Ê[r²l·Š„½^¬×ÍBÎÚ0µË†Ã£0]¥&èªJ … ¾*Äh˜úÌþ! LŒc¢míRþçP¬œùxÚ¦1R7ú³.¥è¿½Êln,§ƒ!5–¦9íΖ›–õ•ô{wÜ'ŒdÛÈí£7Jι½s<ÆÄ²>ù$Sw–ãVè÷Â1B-…û ››ÖÃæÆÐ.,ýÉa]&Œj?2mè.¯~à°¯6Ô6òîO©jËæËq/³¶¢ßØÞP²zë¾Öo<évÃzmtsJÉôûDŠ _eĨi˜’X¬êûð®0õZ|Š0†¨ùsrõ8ŒØœÕî=‹õ‚ÅÅ‚Ÿþ­–„·¿<²½Ÿ†I¹´Ê˜Ï!ÐÇŒ-py•çüKΆº5ÜÞj¡œE˜€W­JÁâd8î ý)óúKmlÆS!L†œ ý!säÃûΛ€©AgžöÙD(¢SN'¦ù¢BSåþÏع9P–{6†Ö°V ÖÎæ`!ËÊX*먭¥òŽb*LJÊO1ôa–µâ%w,ÖºÞ¯ƒ1B·6H†¨%'}|)kÂjÝ MM#¤·!éFc¦E„huêoì8&*{Ú¬”Z{U‰ˆrÚ“£ÃỞþ>²ŸÈ1Ñ-#)ŽÛÄÔ¨á@Öe*G9í2Ã.1†BL·‘ÃÃÄ4 h/ õÕ‚îÕK˜ZꦥòukYnZ–›†\T^’&ý¾¯®”cœ#FGŠJÒ¥ ™õ«Ââ‹ mSs|Lœ0šøê+Åc¶•P5…Ó~"…çí²æêÓ5ןÕ4­N¿ë¶°ØdL0H’1dÑ„ßëÖ¨LÌêó'ECƒµN'¤IpÞhÂì6"&“#ÇBÝUˆUæ|Ý ¾2š’kãq¤é")$ŒcU*<Ü Ç£æ }¡Ÿ2C†¦:£D3Ç­¢OÛ¥"RÞNˆ‰x/Ô¥GÉÊ—)£ S) WR/¬/,«'åŠôõPY¡mu#cc,bÔº©œ¥í"§½'aèáþ‡À“nÚJæð8âBOØEªfN‹}”¢ Øaœ°®põÉ‚fѱ¼°T­P7±-¥Tä¤[çb,§=ìOFcцÔ×é×.ô56öê0M…iŠ$k§¯‡Î 9drJL£58•ÍÓXNŽ„6Í aÕ9–k¸¸²¢…ÐvêIY^xŒ­èOº)éF·CYXšÙƒgOnøÁï9|SQ¤(Šu#Œ}ÆI¦øR¨k¡ng~cÙÁd°^¥m)êÏÕZMÂÞ¼ÔÆ2ÝrV×Â«Ï íÂÑ­*•܉auaéj “zž>{-˜ä„1YÚγ¡¡2–‹Æâ¬¥YzÂhI1és¿4Ô‹š˜"C*Œ9AÎô%g Qœå?’ub?ålÿ˜“J~æë¼ÌwÑ-ÀþóÃÅýü¹¹¨4±|´8{Rž?ŽnΟó¦VJ?Ÿïßy6?ŸïÝ9›~ÏÁ]FÝ,c硜/ô3Ô(ÁD'wÆ(¥äB0̨9,ˆûÀ”ލÁæ(yjnjAq‰¢Su+B•a,ƒšbY]vH9CfœÇ]á`Ù ü¨É»ëÅBG0VSSSœ³.õ÷)*Ñ$ÅÌx*¬¯õÏÓ—ƒn2ÆI°¦Ð'}ÌV„ÊYÒfrá°ÏZô]Æ^Ø=hñÚ.à¸SfŽ1fap¾°?FNH)â½á°ƒåE¢n­:+E öÇL%Ê{ïVÚ…cXn)Â1€OG®>q¬n^ÆŒµÃ~‹÷ß.xx{âe7â½n9–—†ÅÚ1†"q2¤TØßO”"¼ù¹`þrKÎàkÇç?]pqí)ÞüâHÉ c ÷oU¥¡0$z3b,\½îxùÓŽÃÛÀ㛉„«×BŽsRãuÃ) «Ö°yQOZ° 'Eƒžr…EÆH·0¬¯ ) ¢¤#Õ²¦]¨ÿÜñÉß^Þ o9*—±ÎR²#ÆÌå+ÃÅg™—½!Ãö.Aiò”«Ë™H"77JX ®^ ÷oàð9õ‡?Öà«‹‹L³Ð$æ»ï ÃI9Ó8ð^8$ááT¸ñ…º1ÄI¸\Œ'K>Ma¡ªç-C(ˆÂdc¹~ Ö ûGËŵ^gîß‚uE›÷¾h’/…WŸ6/u{7™êPO™««[ËåJè–j̼ÂE«CŠ»!L¢ÉÃD/BÎ ™C½¦œ!¥§ôßTf}N)”¢¨ÏT>pþSÑ 's‚3†€¾ï\à ÿv– oç?åÙ òW#ŸÏóù>÷¼Øz>ß·s^ã2_ìhñïæIP˜¯qn<øÐ!ë*ØÍSL#ŠàfÍ©™õÿ6C²å‰ðQ N@'øºþÖI»™W vnŠ"\RpsD½o:ÚÕˆµ&N/Œu+•€øº£~¼jTk? Ý ŸWÛ‡@Û %èÊ¿ßÃò²°¾4ìCE?eÚÊS  Ò†s’±5 š¼*¦±P5J)Å0M /ÐpùÒjƒ•-ï~}DLѤa1ÂæZxõCÇqgISâ´ML“a8)&P$RrÄXKÕö÷uWÑ*…º³¸Ú²¸ ȢƘ‘%´—”SÏêëïèwG \‹=Æ ¦5ª™/ FÃþ€¯+V/[ª«+l†ãÛû‡#Ã1òÝ/\½ÖB(Œ‰±W‰FUë¤ÚÚDŠ#Î'÷W5„Ñâš5a˜ðu¦îF-^ÂÌ7šÂ{ÿÖQwë ®‚E§Åa†Rj5§ ZóJhWcœƒiˆŒ§Èp „±Æ0?-Œ›œödF™Nº°ÆQåë6ÃIq£)êÖ âØ¼P¹F»°ä¾®€BŠêöˆEV5íÊ‘SæòUËç?ÓWËiyxðµ×¾d._&|íHQ¸| ná±¹ãáíÈöö@)‘f!|ö{ž2eÆ^YþÎgª¦"%¡j )ú£¡TÞ½"RGËr³DL_áë%%X½êXbÀCÚMÜ¿IŒ}$Å‚±ï<Æý1°½‹jV·ª¡õ£%b¡z;`ìH»ˆ8¥XÆS¦ŠÂÕKa}YñS?Qb`<$¯píËë‰öbÂû‰±‡ÓnÂfÃ4 ÜÿR}Uc¨»_[Nˆ!Ñ.Õ„<ž ‹paa< wo#Ç9ÑxšÉJ.kŠuŠÚHBFgÊ,ï¦Ù¿´?ªZ³Œ­‡‚ôê;p•p ý 36YÀòSÒo:oø0J|´ù=#Fg4h™5@yNÏÏ]Àóùžû?\€óÛ~$Ïçùü†Î_A}¢#dAîüûY$ÿ‘$H œ3%ˆ7ó SЉ¹ˆ¾O?W‹f;KƒÄ(:4Íÿ¿s0Xƒ³*OcèÄâ½Á˜Š’G¦!Q5†i–kÁ8Ë0@Ÿ-W—–ne† ¾6ÊhOj$.N'a?Á!É“w qÔ1ŽB#BÝŒ5ŒI)$f–YkñV 6u#´ ý&«ûަs,.Z¦ÑÒ4…6Œ™ÃCD(ÄU#¬¯…Oÿ†'œ<ãa`w—8î ÃIX_fK»ÔE –0yRr´+Çrcè>ki?ÿ‚úr) 1kçFÆT-æú‡ø×ŸÒ­Œ–ÞÜ…ÇGµl±aÚÖÔ8[JÇ@ÉkÔt½øâŠWÿàðéßÿ[¼þ|"Ÿ ý~ÀWд–v!Tufµ1ˆqäm—ñcuÝpqcqÞ2 m¦K³Âd(ÙâkÇæ¥ÅWJ®qÞÐ.=®öTµ!CNçSqÜÝ,˜Ä겦]-pUËò²Æù _{늪¶äh“¥Ï†1 ýI)û‚«àtdÞ’d%ôj’u£(Ði4 §Ìã»ÈØ ÝÒ³yÙ°º\qóùšºk8íb)ÂúR}«K¥;Yï‰Á£CÄûDN#¾ jè-‚1YŸ¬nØk‹õçφp:¨v8éô^ÄQŠÇU…¶‹tW-•opÖQ}ñÜõg¼ù7_qÿë‰Ûo"aRJŽ(i¢®¤a¤]WøÚc)N™ñ$4­%gG³lqõ[µˆÆ^¥j üìÞòÅßýŒ—מýƒáö—t‹#í2róeÃâ‹´UM¿ŸÈQé;ÆRtˆ©‰ÑóðÎ0 °¹ÑI»1BÝ©'ãîáÝmá/™ëËÌrQèØNÂñPh«Âq¯Æú\Ô¿³h¡© &ÂziX­,M{6Á+)«ª Ueùâ§k=›ŭЍ9<…Â8†@áx(œŽ™å:³ßBH¬×…ýuËòò‚ÕËŸ0…ÝÝDÒAÉq§ÿžR4¨nwt¬}nìk’–ËL½X‚ÁUBÔßóèJæó“n?ž¥<0§ýÎ…ülä=‚ËüŸ4'‡¹9“Óœ<z3z8/{áƒè£ÿ•¾•¸Ðwãoû®ö|žÏoþØ¿ ÿX€ýÛ~$Ïçùü†ÏSräSŒmÌŒý>&éÇíÜ8b> ¤™‹{mä©)`nÎÈQanÄh0ÿ}Åaa4hËZbÖâÄÒÔW/H!“b¤iu-í+a±‚é¨4”<‹Z›Äèxû˜1¢ÓÃ>+šr5Bº {SpNEûÑ EÖ€1ÔÖPÁLGï-Î{šEÍbSÓ.ugY^qŒ¤)%³º¶ëO‘0¬Óà¶U ÌîÁyÏÍç ݺÃ× Ji0®¦î”"”3Ä _ïlAlÁn~€»ú ]Õ× öÿîwþWÐl äÇ{ö÷Û÷§{Áúk yšh^´4 Ò)ñþ«žý›%OtÏêÓVµÜŸ|‰Ù¿gøË?ãá—GbHÄ1Ö*ï¿V©MRMüâ…š¿¿©©_^ÑøÙ’³guåyõƒš¦Ó€º-ósAÙû›—ê_€Œ¯=ݺ¦»h1ÆÒ¬:ê¶fóê†Åœ t›–W¿óC.^}BÓ5TË%b,18bp¤¨Ág }ž5ÎR!˜&ÃúBý!¨ÉÓQôê0qÚMœöýC¤?$Rp€êÔë.Ó-#‹MGÕ­(¬0nE.Î{ݸ˜¹ËÊó?n#ã1rxœ8l'îß(ÖÕûD³°<¾O·‰0A³¨©ÛŠåeo;OJ5¥9$rÊø*cl¢[6¯<‹Ï—øOJýÉO1›×”Ó9<âL…«ÔÈ›“êÌ›\¾®1ÖÓ¬,ãQÍÆ1h>FÊLCb<%â4RRj¡8šÎaŒ£Ïÿv‹•gñê–ËUSkpØ]$…q2‡HO3Qw+r©iŽœ…fBÖx_˜˜ÆOY_©ä+LJî!kó¶=b™};A¨êBÊBáj¥—¦³\¾r\\;\eÉI˜5š[ Mg¨ZCUk.CN†þ sÆH¡?@œtë0 ™cJ¤ k’zA, 'ËûÛ†ýýhûõ8ÿ^æ ÈnO F†÷Óoûnö|žÏoþ¸ßöx>Ïç7},s¨ ¸Îçi~áƒñ÷üu~œ¥BRTHj³úœèM(¢ÓÝò±|è¬=EµþžsAyZ/о$RÒ)Y«i°%sÀbÆÂåZX_yN;O˜ãQ¸zm9n#Þ©¾;ÅóD^§Óe^uÇ Ò•N ¦BÛ ëå°³XI%ê?Œ¢òŸÊpš “èš½ˆ’ô{Ô`«†õ ÏrÙޜעoó*â|FBp|ö; ö˜YmztS`ÀÀê…Ó©ÚŽõMÍa;ùHŒ”¨;Ø\+¾»Ñ„Òñ]­¾ªÁ´Kl báÍ¿æp÷gøOÿ.îúw@þœ —?²¬~üSòw'¶ï5#àÍH³È8W¸¸6ì*ê Oó£/àðžú³+ªËP†¿d4 Œ·¤<‚,pê‘­‡TËxÐp³Í¡YY$eÌ.0,õB³|e0NÈÙQ/;âTc¦^xmè6×›™ˆ”QšÍõg¦óJ!Y_2¥V2 øâ!d(U“‘Òà+;– - -3˜ÚÑtpõ†“>·¿øë5vÕ¨iý¿øã9'ÆJ6,7‚õЇ¬[CU;Œ+|ûç”rOŒb¬¯ M—Èqbì#ýQ ÜÎi¶ƒ‰™Ûo•D3öZJ}¤äLÕÚ¹qñ€ÃÚã[ŽS¡jGšÎS²&W§ñu¡ÙTÔÝ ›+\)ý#¹ßñðçïoY^­±6óâ‹ëkÆ“¨¡üüƒçþ»ÈË/áݯãIMÅ«†¥mn u·ašÃQ‘¾¾u4K¡»˜X¾ Xñ”õ%\þ»|`S?|ÉðîÀû??2¦¯{œ?Ñ,;—kr,<¼S‰JȈW_ê63õ2—³z:š¶`Ú‚»SÀT4ñv¹ça·×)»Ðbþt0Üm\­ ªu#F%ÚÜ߃IäçŒ_©wç8Àz9gØÂ›[½žÕ9€>gMö-J&ª0,—Ž0ÓÉ©ay9 ï…1³qülÈ]®`j¦Aøòwo+5é‡HPä§ÍjÄcrœ¯¥*ý’Y2éL&ÎWkƒ%åL.BdìÌ ³æ?¡éEÊÓõ^¥D¨'à ùYž¤>0Oû?&BœõBÏQIÏç{zž€çó½;Ê«ÿ«ôŸóuýœg€0{Ѧáü¾óXèüñsÒ«²¦Uûïçî"ÎëéN2ÙΑ12›k¥¨? •Â>'ÖQ qçéV#† Âé`‘\AÙ#(‰åá]ÆWžÅFpN‹W aˆ ™”bŒnŒƒS*\JàæSË4¶÷‘Ã)SÆû¢´  1 )œÑ"eÈE ÒEhœÓ‰ëÚƒçýw–ål^*Þ¶/¸ý³;Â8`äÀw?ßrq˜–ñ41ž ¥Xª®vIÿ¶§{ÕP½ü)Õ·IØÄÁæ•ã´«¡dVŸ4øËâ»;Åb®kL½Â¬^é&æð†<ôg(ûG†_þ[ª6sùÊaü’ôõ;D ‹µ0ökÄflí' ü‹—\†ù¸çñçÄQ¨›eûo8ÝO”±Ne)u+¤ða:Ø-¡? ¯~à(8ÅŠ¾¨±Ë—”÷÷,.[Ö/„0€-¸EXÆÛ‘¡([ý´U_CN…vå±¶pñ©Ç6b+äâSÌêl~ñ‡T¦¦$!Œ»íH ±žip¤ XËŦ!'¥>…)b²’jL Œ“ÁÝg._yR°üò뫉׿{Íqßc\fÜgrr Q˜ÞV›ˆHÁWž±/LªÕ‡‚µ'¬=ñð휜ІÙ¨^¬yýÓ—ä1“·Ä8>D ® „÷¿ØSh¸ŽIV”4a(\~é±Ëš¶.xãè†5c? y [„I§«×'(B¬È©`³£?låX]Yš¥Ó… _%ü'_sÀ˜Byñ× üOl g¸ÿõ=á°çúó–úêš–Yxã̇"ÿü>û‘ è–ç1™“NÏ ÂykPв® ÐP2±’ ™L¥'óYb&O”B Ð–”"gyÑh’PRC)ͪÎRÕžiïí"SJâ¸n¬Á_céV:i}©õ4ÓÈ9ê6fŽ¥à‚°t¢PÑ1Á‹âL14µ0N…Ýí„”ÂÅk5µîï3u+lï mwËþ¾§é ›Ÿ6Ä£aŒHV×c-¾ŠQŠLöžR/ñ/_bV; …þMpµÁ,[†ïî šOÜõïà/„Œ;h¯tê[„ˆTi`HdŸX}¾ Hç¤Z©FS¦vÂjãøÐÒ®L‘0Œ´ËHÕ8ŒÝ}&†€˜BÕ8Úý–9rñƒ5Ëý.u{I‡€q¤í×<þáϱ~Ï»_=r|r:°Ü¨‡âzÙào>'_ÿ.öÛÿޏ{‡„L½öÐT¤»Œw'Ü/X‡#ý¯öì·…ë×–îÒA2ç1Öá>¹FâDzˆds ßÞÁëÏÈÖÂã/™Ü~µçý×#‹MâÅßþ”. þjMûùßÁú†¸ÿ–íÿ·_¹° È””9ía·($·:¹6¥`G}¡B”ÂU ï,‡½`È„"s–Ñ·ƒP8íUîâ›BÝhØ¥0*üáÏàö;}ìa ›k°•šÆ«˜Y½€i4Ä€f4äBc…1ƒá⌽g"B»ä¤[ g Ý%Uã+RÔ gÝ&r b:\å06)ÂÖ•ìˆú¡JN˜œž®™ðaókýÍGï7óõ3‰ù0ÅÏlQ¢Ùùf ±ŽêYÈ(ùí¬ÿJÎÚläù<{€ŸÏ÷õÈÿa~iü_~Ûäù<ŸßÐù8à\èŸß:…Õ·NÎrõô}væü{#«i¸ÖˆúÎì«„7^c±†Êül¤õÖÐXƒq–•sTÖ°0†ÆZœuØùf”bÄ:‡•ôØœ°9áeqaiŽqPüÞåKŽ ‘‚9Æ*¼z8©èå05‡‡žÝÃÈá1b!ÌÁYK²†¥Ó5ç¤ã¢æDç ÖÏœòÍ甈«µ¦Ìtê)âqNq}U-„IÊaŒ›ñ•aýÅ’°3*ñ5ÕU±V ™!S$aú8w`5¶. fÆpXìOÿ!®ÙÀðHzó‡äÓY¿Àøs8}‚¡§Lþ¶Ç/"œÓ™+ƒýÑ?ÄÓ_ü· ·#»÷#c?ƒRXV¡Úo b‚a !( ¨n ÍÒ'C÷zEµh™˜Í+dý9ÝËßC¶¿$äŒyýŸ!ÀøëFN£fÔ+Jñ¾!¾ÿSLsAv î꧸¿¹üÒîkÂûGùÕ?! †Û;Œ1LG¿¸Ú³ÜTlo3ÃáÄi7!’“a Õú•B¢é2«M é"ã)q÷ÝÄö>²ÝØ3F„+¡^–ž 9eRÌ4ËFÑ¢õ™ ”{}=„Q_UqÊœB"õjÚ´)ÓØHÛ©á´[RªµÈK‘nY½:'×’¦v÷™»wqË…§]yڥЭízMó"#Æ!½!}þº«Ï ÿþŸóË?üýú¬Ã{KsÝP]Ý@)»Âþn¤î»*˜dÓˆ[5H½Bê%éÝVõú“á⇠Ìú³|…[ÜPú{ÊòSÒíŸ1þüß1#»ÛÌñá‹ËiŠ Õç/°‡Ý‹+ê«+–4WŸ!¿àîOnén&okö÷[ßš†æ@²ºÐtZYG8ôÐ8¥ø´kí5!³»Wvÿj3ûu…þ¨á1jš³¯˜)O*Ó{õœáÓ/ «Ëšœ-ïïGêNŠœ…þT¸¸2ô ô$ÕñG8UË ¡”š~L´u&%aµÓN}-) ‹ øá,8>CŒ0{B"§ŒK½¼ÒçS€8M„‘œ‰1°aŸ"ûœ%SRbʉœã–r&Î_cVÃoœ¿yøOYMæ™Ù4\Po@*OT ˜™IAsC•U"tÆ…¦y+Î8ÐÿþðÛ¾«=Ÿçó›?OÐÿýüöÿúÛ~DÏçùüι˜ÿøÏgИ•”j…÷¨>tûg>øL.#¤™ çD¥=ižŒ·S†J2©|ðDÑmD Œ",eþšyݬ"KÝÖX£:ç<•s4>p|Ü3öšàƒåâÚpØJθJ‹yW »m¡ñ™›Ï íjÁW¶ãêÕ@!³Û«ß ® óBÈFñžŠ6—zó{CÈPyp^f¥ÅW_O„Iÿr‚©#4ËßTä˜Ia$gX]9ºµ¡ß«Æùxp˜7™Õµ¡$ƒ‰‡Œ½¹Æu7Hu"?~—k¨˜ËŸPÞý9NHIHÛ‘þòŸ¬€8Œ«0Ë 2 È÷ï‘F9gö÷ÃW_eš…~ü›ÿÒYÂcàtÈ ÇŒ1…ëOô{> ýךžëkå§§(øFiK&LoèÖ‚¸«TRåKH#1gÌæ§Ä_ÿ3ÒŸü׸þ#Üçñ $ ÄÛÿëÏuÜš")'ì‹¿†¹ü1,^1þéÿ’FÊt€Oÿ•€ØA8½¥.Ãá¡çWßœp•¥KÊFFâ Äsƒ’]Ž[˜‹¯2ñððNƒK)´¢²º³€e‰(qÇU–0B»lð5™…ŠÂ40ב±OØÁ0™B9&À:ÇéhXoÀ8¨Úˆ1™ÅÚ0ö–Ç÷Zè®$qx´ '©+‡Cf2Þ;v·‰Ãý;^Ùóù_§ùk—*láðc`órÁpÚÕHU ~c1Wgáè™òaO´»øú#õËRýô¿À…L;ÊåyÜ‘ë ìÿØx¿@|Ky÷'qÈþ[ŽÓœ§qäòåD¦ãô8°ùÔà§DqDïi>ý{\ÞüÓlpËÿ-Íÿ)¿üoþŸLÇGR4Äè9äH[ [ÉŒôÍÜß&J*dS@2U«×¨³–?áâZ¯K¡Ïw‚«Ž[!D8•ÂE1êÀ"%Ã⢰»7øZ®ÞMܽ/ô1!¥ö°Z ÖêÊ0žæ`¹œ1¦¤ã“ a½Ær±&3õ‚¯à´¦ÑûŒ1úšùÕ¿‹œú7¼x]0Ö3M_yÄu„)2'JÎOÖ(½5œ Dc¢ÿß2o]‹¨yÞñaEfܰž'Y'ŠZÎÌ&á³üRÔ·U˜}èµÿÌû,³éø‰ t^ÌÅþx%ñ|žÏ÷èÈÿn~®ŸŸãÿ·ßö#z>Ïç?ñœƒÀÎržúªYæÓ¨gh5þgI?¯æ”_#à¬Nþ­?c>½ÑT-UY5øZc4á×*#Xg©cã,kcèœÅ8Ge,ÎyŒ«¨­%» oµó4 îˆÓ¨…¾w¬.¡] aP ¯˜Âî.§LU.^ §mäî»1™ª‚ÛG¥dT"\_™§ €õB˜˜õ¯¢â“ÿÁÐ.-Ö[Ú…¦‡I“‡}#TmÍîvD¬ÁW–«OV·GÚNiBÖ\eŽ™iXçèÖžz!ˆ3ØÕ©[è®1«ÏÈÇ[pÆ·Ø/ÿ!þò‡`<éí’þ’ôëÿ7å8`«²\cWH½&>þŠ4l)ÂÐN£¢WÊ™—‹%wÿö–‡77‚uŽ0 9 ¾²Œ½²Õ­5\½öˆêγøÉg¸ëŸáš5G¸ýSÂíŸ3¾KT7-Æ æúGT¾æôË¿$°KGr¤}Ä^7¸/þž6¾%$eÒ+TÊàNß‘wßwÈ,ä˜(1"Æ1öŒ§€w3î0+Õå¸r.sâ®2ý…-)Dú]@*8î–BÕš.óîÛS?J¡aÑ–ú³£Å¦˜BUC³°TmKÝZ†Á’BTsü$ }¦®•å¿~ýËã±'$%³xš¢¹Mgh1†»ï"7ŸdÞ ba*Ša2‚·–Æ{*)¼úBh–ž±÷j(® Œ[u¸z©i²CbØo±6hƒÇŒ5ÎÔ—‚]t˜¡ ÖỎêú%öõßÄ^|‰5±žôö¿güêOÀFÌÍÏðÖRš+ ™Ò?À´çôî<þâ‘©gTÝ„‘–å§’†S[^±|ýê|¤L™R"Ó}à«?} ßî)ÅcaØ™²!¥¤›§N‡Ì±/T®Ð-uƒclá´Ó­Œõ0ö0F-pVûÈv1瑸Âí{(IXtjT?í!&õô¤¨ù$g ¢³<…úÚ`¡[e¾{£×E_B€a..Ô7П,ΤDP”ÚÁxÍ h–i4Œhjù~bÙÞ×*²½`r5eì±91ʼnœÓ9½±D`J‘1bÎL)“MsòòþçM@œCÃBκýÊš‰!sxXÉ:‰3ˆRE«RΩ¿óÛyð„=of“ðŸŸ~Ûwµçó|~óçÉ`ÿSþ–çó|þÿðœÑŸo2Ú LóǼÌú|fNô<õ9~‹Šò×—„9n^i?qŽ•—¢ër“ I4à&κR“2; 8%g,æ`›Ícp)ÑKÏ‹\s| ýcá¸7Ä(ÔP5길V¶þa«:ýªµ˜¦bÁ¦ÄÕä¨HQã„n Ó¨MD€õUÁXá¸-& 5«+- KIBÆ9|íhœa8D u#,/-u¸ý:pÜjÐTÕXºµRhªÆ“³U³g2øµÇö·ËŸRößÀú l³¦ˆÁ\ÿ.’Fâ·ÿš<>ªÐ5øßù/×@³Áø 0n™¾ûw¤Ã£Þ´³Ð|ñš|:w;°cÏrSh;-BÛ T­a°ª›o–õ•¥]Uøe…mkl½Â†”‰ìjÌ]~F}ù2퀂TK’õ` áÇô#fY!¾Ã~Ö"®!}÷çä‡÷æ„äšb<ÁyšýC/~[¯uÚx|Oìáø†êøžnû y7r|ÿ@<ì¨;X¼ðœî'vïO„I “u×px8ájËî1㈫t“ñp*c™ÌŒÖ´ªù?î í²Â7¢4˜J(Y‰=)ÄЃᰵôûÈ!rŒÄ”¤’‹1%Ò,¹P.n¡äÃ1“Þ–k¡n,ßþBM¥Îªî.õ©T9³¾Ì¼ø¬Æ:OÝêc9íû‡Ä4D¶Ä ?g1Ð.ç ô.†ÈpŠ4ËÌå CÕ\ RʸËþÓ? þô?Ó×÷øH ‰GÒ»;Ê‘ë5&Oä åñß2†ˆŒ‰„Û_F¦ÓHN–x6Ÿ· w woxóˉñ”ùü÷+Ú& ãž )á*‹]Œln —/3Çm䈴Sa?µ…ÕBp•¾N·X_¨;5W§œ)s!Ká1ºRh*O‰“¥­5Ù{ 3ÙF íàØ ¹dzÑL’‹¥&WGÝ@|óbH›œÙ«úù"…ûƒ€…-¬¯T^ôÝ]aåqìªB …z¡Ám1(^1¬Žª±œŽËKO³^³}Ü@Œ1ØRð9s"Å@ž‹ü4ã=5eåÃÐæ<˜”yrçëwyÊhÑÇ„@-æÏËe<Ÿçó=<×FÏçù|/ÎÇàsü»ÑŸgCp*ç %E£›€2ã>Ë,õ±’Q²ÄScÕÄw6KÖ5óYSE¨ÏzÓ6²dŠÀ1 A„bT‹]IBr‚çIý”ÃdY7ž‹Ÿ. ýöÇ}¦[Œ±ìî2¾*t+Ð}ò#•Çœvó‡žáou¢n"Û{-è›…Þ¼cÂÀJQÄÕk¨wÐòì àÉL¨‰¸™U¥ºü8ibª1¨º†Ó¾0¡Yxý9X‹Ì7¦`›‚l>Å^|‰¤ž˜&¤düþñÛAüúŸ#¾#ニj‰Y}†øvÖÒ¼kcÁwP-ð¯~ýoë‚mzX\S]¼Æ6¿€Û-¹*H5av…vNÏí…ëO ÝÚ1œ2‡mdìê}ÀÕåðkʦEŠGœ'ìïHyÀ5,_Ã,‘þóøkÚ«˜Õ+r ÔËÈé=ã¯ÿ9É5”T²M d±¢ºþÎZòöW˜’ÈÖÜl(b)ã.BõéßEª%Íñ=ßü׌oÞ²{3ÑU qJŒÇÀæ…aµ±<¼I¤ œö™¡Ï4­¥òp Yyý./4]ºnŒÒµ#y}®ºÊà|±Y'þÛDŠê+±Æ‘œ®ÌF%ª+Zê7r,<–áK…wB2™-¼RÏ_ª:³»×-E]ÃxŠ÷ŽœNy£6"‚ó…ÍMÆ×–»ïÔ;KÆJ"†B·ÒÔú -áä9íöØm <üìû7DÓ1ìaœð¢W}Uc¦H><2"%«±ÚØš8ìX¬&ÂI4' ‡ï1À8,¸À9ËÏÿ0±ø‹{._Gr˜ˆáD³¨(É€m8í ‡ûž8DÓN{TBh!Nz‘:§—ÓéOÂaœM©MÎtÆ]«G߃wç… ŠÁÁ{è{aDak««Ó¾û%tËBº š.&Í SfŠúúoЋâ›_„K‰˜aŠB׌=§CˆBÝÀêÒÒ-‹ G³°X_“òŠb*¼SØ@JT„ a%¦iZo&–LšéïË“é÷ãëy½Nζ2K|ÝІ\f¤ç¬ûG³[,sØ LJËü>™=gÙ‘˜Ðçó|¾oÇþÁœ|nþø·ýˆžÏóùO<æ£ß—ÞÊG’ ;_ØÝì8eANÀF™ó[™ƒÁä§»ö»B c°„©`­ÊVN‡HŒ0?§¢aXΪñx{›H!ÌÛ,±ø¦c¹¹Àú%Ö{ƾbÿh{!eKNÚûú}b<&NÛÀþ~d÷v¢ß„1¨Ü‰W9Þݱ}wPj¯2œáq;:¦”ÙRœ˜ÆÄî}OI‰þÈêÖÑ#ûÛãqÏ~Ø#w‘㔈1¦)«¿SšOLOêH1éö0ëÏ ’3Ø9j„µ"X£Èà˜á4B(xÉ,ª‚ËÌø`­OFx<ÂikˆQ¿W¥•°X q€!kó±ÍŸ m£þktÓ0C]Yb2TÎPµ–±÷\½®ðm§ÁnvÉ8.‰±0•4Kr§œ9ÑÇÀ˜"!'RN¤”È9s"gmÎ!_!«ü'Îý4W Z´ŸƒÂž®ùçB~õ—òÁ|þTáCð×Çà2¿3ó! ì>ð|žÏ÷îØ¿67 OôûÛ~DÏçùüμ€4 ø°®žVÉ<VÎ¼Ò ú–yâoçÄÈóú¹ Í‚ÿœç·šü!EX—P‰†ý”\žŸ1–ª$eX§9úÈØH#S M85&‘Bdu ûÇL·úƒáq¡WC_HX'ˆXVWÆU²A¬e÷`O‚¯=/>³¶–œUv4ð\¾¬¹þ¬ñ·_Åæs2²%g8>*=ƺÂáA kc¾OœvÃcdÿX8ìÔàÞ—BÎ*ùñ¥ÐRX/3L…»ƒþŒÃy3BáÂiTròo„ÕRX4À¤·1ißa{‚í)sŒ…!fÆR0¼-¼z)Ä(¬6:Y®ZOÝxRhÀ7tKËpdÆ·:0šœÝ­,ËPr„’¸úÙ‚°K´K¥\ÅI³rVÔÅï­h.Îî~u`8ŽÜ~92)Z┨›ˆs‰ëO,ÞxÛ0l†vá ¬ƒÝ}áçqÏ÷[†ý î¨ÓuIÚD¥˜È!’R&M™Ýcâ0eÆTèSa—2»¤ˆÕ˜2„LŠenÄ ¡¥°Ï…ÍÖBðâHN£n0›N¯m)bGaÙ€·šíÐ )Ú$XWØm cÖ¢ûX ëRh|Áz•#qt¡$a}ii5Æ:ªZýL¾ªÈÙ3… Ó$ 9BŠ„TÛ?kñSNä¢RÈscš©>ÌoÓLô9OóÓü9¹œ7…\t\Ÿç<–³Žß”òD‚Ë1þÏÙ.êпçiÊ?ûdÞçù×CümßÑžÏóùÍwž|>KžÏ÷å<±úù«Ïë8K•-sø—| K¨¤A ¨à)%ÒÌëa#̾üò‘yø#/h°NDpÌÓ«¢³…bÎäž¹© RFRÂú S ÞUÄ’ÈIH1Bñ,/jªV dêÆàœ0–—Ÿ;N{ 2wB?•9¤©pÙ* ,)©Ñó¸‘L*†Íµ¾ßz˜F +J ö‡È~i*å¾§RO:6¶Ð, $ÍkNI‘¨¾ƒ¡ßçYÏ ãÑÐ^/+)€IDAT®,­ªÊAë`¸§ÞsÍHßý+²­1ÓñfõY}ŽÙüi.àñ—”8bo~²ýiÚ“†­šj—¯‘íW”~TÉU€t7¦‰z ÷Žá¡§ßgâ©êÌÔgRœˆSf<Þüi¶t«_R-íë ð²|Gu{‹©¤r „»ÿ€é€"ÓÀý¯IÓ³xA>¾£qmK‰ã»#ÉŒ¸Æ‘cÆURªµGl‹l¿Câ@Ú½g‘Ë“oÿ”T/‰§G¸¨XP1< °ºi¸h…Ø'nùWZÔ^2XgI1áfão½Wî2#P…¤R7„}ÈÉÈ$””a+D#Ø¢ž‰P”„Õƒ”B]TVU“áNÇÌ>ª–{iÕo2…šÆqóºÐ. ¾µ|õï#Û{5%)“‚Íg UÉ,†4¾ýJÀ;¶GKF¥¼Ï¬WF=&ɰ¸€iˆlníÒsÚLо3§Â›?|Çq[ÈÅQ²`½£î,Ö˜¸ÿã7´]F$):õÛI{G"Ù$×7™v!4‹ cV,7ðþë‰ãã–]Ÿ¹?dú”bfm„ƧAhjÃ4Íšþ™v– ¸‚À0æ3‚蘷‘NÉ@LxTßþÕ ¦PÆÄ0_ƒ~ýJ½(Ê úµ÷#¼è ŸfêUÊt¦PyÁØD… â¡.`¥`½¶UµÌ’GJžõ•a±6´KG˜*¦A šŸÑàêŽ~¸ž »“#!G8ô%kQ/†"†"ù‰ºVŒ!—ßüf÷+ÂÝ_ a§;•¥‘2%J øÊbMEœ"%‡ùg3O†œæ¦/(QÇ:•Ð\}é1b‰Sf8d¬<‘Òo1ÓÓ.°Îb|…Üüõþ¿ù]X¼„p@,”»[Êâ>ï1q ’Íæ5U{5…ñؽ c¦dpXrj‘\# âöް{@6W”»7HÚÂî+H#e·'OA 1”l°¾'M{¶ï Û÷qæùC±†ÊZœ…\„®)ÔÑtã $è”]µý‚JÎô)PShšâlôÕbë…˼¸É¶…mÊ”XÇBÐ)l“6¯"¬Z¡]$XªÊâœa±J6…嬜58oãç)¯/g,V Ë øäK “ÐÖ‰ÚB5“ŠEpì·*y™úBŽ‘Ó.°½+œvºÑˆS¢dáñ]¡ßGŽÇ‘iä0q¸?p|ÜSâïz¤ô|óóLJ ç M'ô E3YoÖÆÁpÜFÞîy÷ë#ÇÝ‘"Û]¤Ï:éï2¼~Y(IhšLÝÂÝN§ùKÑI~Jú6æÂ1îÒÎ}L‰ëœ13¦²ÿ´+LSa ãXÇÌnT™ÖÚjWȱÐ-TÏÞˆ’¤ª .o …€Ð¶†å…̱°X>ù°½5ŠÍD¨œ`­euiè–FC¾ŠÅ7ŽR,íÚ±Üè& [w¸î «ú)%& ‘B,*]š’J}bN¤¢žŽ±d-ºsR™ÏÌó7¥0¡Ózø«›€üDš3æKF§ù =Mú saÿQXᜠ0§ó¡)Ø>ožÏ÷èüWÀÉG9ç‚è=¿ýo~Ûðù<ŸÿÏ™ôsÞœŸÛF>üy¦|’ŠÊ"ìÇ•)HVJGÉg)Pa*‚-3?f5–•sc0ˆÍœ*Ùä‚5ò4¹2óZ=”Âb–e„\ÔdœuâsÆ p*S“)¥0Bš„œ"‡¸¸ÕÍ’Ðï()2õ‰iÌTjÁK†ý]á/ÿHÿqÆÎ{ê&Ñ­jN;tRjÕÀ·¾²üê›ÀBô¦q“é‰~¯ë’Ó¡Sa<Àx|£´u™ñHÁàÇâ²!EÅ Zçè.šMQ˜Ærÿް‡·¸/þsÈÿœtù3Üå1§w˜õgTé†1œHÛ¯Hq¢ì¿ÆüúŸ!oHÛ[Üg?Bª%„Y„é°!÷5˜ˆ­fé–c+ü¥¡ßO<¾ÝsxˆX§r*ÒP¨[OÕt,^.0ë ä| ¶FÒñÄýŠéWÿ·ÿ†Ü]#9â–¯)ßý§­aµz‡ûÿüÕÈßþ ÂÝωÃw˜¦¡ê:ât¤?DÆ>pxˆ”r¢j íªfq½ yõª¡sÜÿñ1_Ç#”‰0A•¿î\ž="ÂË/6­e ­èôtÊK/3•JІ…•RfŠJS ‡( ˆ)ñ~~­\‰p±€E1ôÑPYCÝêëæò¥°¼,\\ ý±æÛ¿82žƯ-7ŸZº•åþmáþM ¦ÂCÔ°«„‡·ú8u„I1•½± «MÄì„ýQ¦L))™Šˆ«&Æ“aÊ‚É ‘„ƒAxñ)l>$ƃfŒd,Ë+¡n»ÛˆHæâ*âëLŽ‘q„Q8<ö<Þ ÇHS «%¸“æà U­r‡}áÝ]d˜2ÞÃø!g$‰^3z A?Ý@ö'ÖNxA¬n@¦9µ[¥ƒp¹b2´îœ2 ÎW¼Zú“pØêÐ`¹V¯¥ÁÚH“iRóñÐ+Ú,Gx÷ë3%M¸h…ÅÊh‚¯±*?'÷:RvŒƒÇzO];Lµf qRBSÒé%ë–Sò‡_9ERŠLE‘ežèY¥Y1͈Ï3§¿hBo:_Ë‹~3;è\üÏ“û’ËlêUy‘Jûg/Àü±³lèì8ËΆõó¯çó|¾O笌x€æÿèÏçùüõ|>çï{užú[ùðË|” ç€àf§®AfŸ€®çŸ˜úòau\æm€zÑɦCÈȬA›TNdr&Î\jc-Î;ZôëÃÐ3ä ãVô»‰8FV×SŸ)$¾þyæËß·ìO–8‡‚5™þ ç Öº•㸳 óÿeïÏ^­ëöÍ~öÞ«ÝãçÅo̵÷ûDœÌȬÈxã=±ðdĸëâTûf騚Àé13MU-hrà¸3i„í6²X 9Y»Ú$ö÷Âý!Ñ(4N ÔtGOÊ™óä 82KoÊ7~ ˆÃ ¬×6i¨¡YÀî.³?X{+™Òqš¸^dŽÝÉög¨*SCÒ40ž”Ý{¥;ÂiJT.³YCÝ uHɸçý„¦ldýlÓ·v!üèw„œj>ü"òÇcfŠ&÷‚ 1E¨¼0}´N¶§ÀE¸^oÍ{¤>*“©--³mûÚ ê„ë¥í/ã ¤»>³ Âþè@þÖ^¯Æ¾ãùCç@zú­MöŸ”ÅRGe±Ó–Þá[GU9VÛŠ=×oCWqwçñQÍi;;Ú¥ñ*|µ$,¿Âňæ͉œ&ã4¹ä,ŽìÍŽ\ ’äDL‰¡pL\NÖÑ/0ž¹£ŸÊ}2kþ_ÎáB, k´|Gê³$ÿsW?—P,íýKÎólB Eæù¥x‰ßĘsœÀKüÆÅŸUÌÎÉ><s²ïø.iždC³*‘gg's’4>/$x"ÏnÀ¡(M åuRy,aºÞ!x»esÓ¬qŠLãDãÁU8‰ˆ«qUÍØ'Û+6·#ë«Ýþ‘ªNĦf}£hNŒ}äñ#tGe±òìï§IPßðõ«[8<&vzvûLSe6צ~> G…ü¨T;K8V 4 N™áSo…ÐzcPš6xÖ·KšuÍ4Uœ‘ºÍ¤húæÓiÀ‡ø–¡sè~BÆ•‘‡?²nùé§ÿO¤÷¼Q§Lû5›î=néÑñÄø‹¿‡»ºÅ»òˆ[m¨ÛÅ“5ÒLGÞ©š )e¦wÇ‚&R UīǻÀ8˜Â˧ozªÖÑt¢j”” |¨Yn–T‹„c zäjIN䇟?~àÝÿ÷+eìË­àb`øƒ?`”€ó ®`£Ûšæ•PwÓp¦‰f!„Æá\æð˜p‡åö#)ÁÔ_‘ã‰8Ll¾Þ°ýiÍpYæÑºèuf8'rê9>˜ªÌÇ›·J³€ë·Ž/~§eê„î”ù‰ùôaBûHŸ»NHg¥z„ë+G¨ ±;(ÛF jÖ. Tž÷¯J¢Õ‰ã¡Ô~|L´+h¼£?+CŸ¹~“yûOŒ©÷Ü}#졌9¦Ü#åzøñïV(Óàhíº1ã¨.Sµ¦ÿñWUáÓCbÆÝd¦{^ñ!s8)‚#8GGáÍ—5Wo‚YU`8¬ãͰ»yÜ+‹Ú¦e÷cƉ£rá"‹HñP55$Ç#ìö™Ÿÿ $GTá\ û×[øøé&ÈN¸vÊq*ðCž&}Ù®{`ÿ`‰í«ÚñãpýÚ'åþ"sDÙÇÝ ð‰(­s´Î ýêJÁ9ªJXná° tãD«2ëk!ßÃ8f¾þmḠ²¹'OU›AÜyôx5ÿë7Bßµd]°\N,7à+‡ ÁÎMaÔ¾àüádrN¨:óBº¢üsfš•Ô A9çÂyJ¤/2žJ1ó*v¼©LR™èÅ´KIè²3Ì^,3!˜¢ç?{]dBËýú$õ9¿ÆLÖr®~‰—øMŠË`Þ¹g#°Ó‹—øMˆçɼã)¡79ϧŽÿ,û \$9C¹0»"u8CŠf|¿+Ò¡<ÃøÏЬÅOéNbZÜMyÌÔ% äE˜²R{GåSLè0¼§q†µW Ç ç”~?¢«k|Uá× êÐ&ú³‘¤WÛšÝ'8ïÏ,ÖŠ_x4‡¢¸”‰Ó@ŒÎÁyŸpîâ ŽwLc$G8ï±âØÝ%D:RòÔmC³¬Y^ zõÚ’Šé#‹Me3!1¥š©Ï8oIÏÔ×@ÅÐ)ªá´âôw´Ëª¶m»£%Ú·_)9Úïúþç_y–W£gìÝEÏ\œgsëP­8íà&÷ïz'LIh%ŽVôl×®8Å‚޾>Ñ)+1hÕ.™Õ9!©px4ºf78Ú&°¾ªÆ*ŸÞe>|–F©ˆ5†ÿN‰U†.&Z„vaæ«7B3Ç]àÿ±²i2Yš”ÍòðzŒ ¼(Ý‚ÒmºÖz¡m2}¯L.ŽBœ"U-ˆ‚·ï+¢ìNv¼ù tƒRc<ŸõvŸ nŸî2ç”pãD×E\Ê (B+Ê!)µ˜“ø¨JëøG8g˜’²MF„>'å¬ëÅŸ“ÏY÷þÊ™é`»ö¼ÿ&s—ì»mU©³[ÕÀ*ÀÛ¯2!T|¸ƒ‡¢ö³Lp”£N?o[áðà¨*ëöïîÍ9×'å|Hæ–í<¯ß_¦; âÓ00ʼníµCSMßš…g¹]Po¾&ÆŠGÒ8¡)¢šPäÒéÏ©À~²ñ–À¦ ±H$'1guÊúcÊš׊)¡¬æ 8—ûgNÀEä§ä¾&Ìr¡ó}IŸŠ~gË÷ï)Iÿ\ 9Ö3U{å. +`œÄHÔ)œÇa𬂰\‚FOw„씥Ž\½®ˆ£ÚÎWÔmfsÛR­›¡oéÏS/¨†‚ÃÏ8 r¥¯}àØŸÑ”˜R"Ɖ1N…ЛmR†ù¤Ä”L*Lä $…XH¿š ¼'çKçÞ¡E Î}Uh­ùÉèËÀz!Ãxîü+O0 —x‰ß„øŸ•eU–aîø»ÏVüÛeùoߟø%^âŸ1>/bgò¯“'gG;¹WsRÏlgŽŒMf£˜ä„ZžºCs! &ΡÖÑ*8ÿ¹ Ey,aÄâÅ•ËÓ$àÉqTŽªl½3¿˜i½·Î¤WÓ ‘ áî1\¿ZSÕÍkâxÿ'=ÓHc¦ÝÖ7-‹Íš‡o{ô˜N™v 99†ÞqûUMÕ¦_“ãøŽ;ë*;/„h×ÂyÙ´Ê4f†>¢ï^réVCL=2Î{ªFèO“采Àp>³º²í9u£Oq¤´'Ô ÍÒ±ü2àêIJ:%¦~¢­2US3 ПN&‘šr¼+Xú¬xÙÜVHåéOœ›†ŒÅOÝ:sÂ]ÝÂjA¨\-$tr™õe#.˜^;$Ö·õ«ŠÔNûLÂbí •#Í\KqÔ­c±®p7 pyìpcÆcG¡;xú³r|èqN Õ€óŽv8>:r\ðÄ^‡LN™8M¤±'åɦR³¹ò¤k‡¯*âØÇq™M­ ‘fC- ½#ßUœ÷‰ÇÊþ¬œûŒK™7¯¥¨)]Ý/U˜»øRBRÆößú]Ïæº¢? ûáîNˆÞá¼£S%™ôvŠfOBœÛ×óÁ1žÍM¤;*ÝÙ³Z círà|8í”a„)e|2éÈv‹•C$0ŽP×Bá|žÒùuPõ\ Ö×aû*SՎת gó†`a°™Û.¡>S·™ÇEYK…¥3œ¼¨²]ØãuÏ™s4­È>).+SR’2¡¬7o„åB¸ÿï’I©Þ.ßô‰S‚•(°À¦©L"°ðàb曇œÂ*X“@"ì²°^mcûõA#•ØùiD¸àËàP­iWŽ Ç—_(•ß]?$¥ˆÞTÉjs™ŒhÜwÐ Fl>Ÿ3ÎyN{#Ÿ_× Ôí‚zórv¤xÆ‘©;;÷9_1‘ÒT|*œfsåU39Òdª?Þ‹Â3¬§œµœk $}Öó¬©2K@Ïçõô,ÉÏ¥˜ñþåÔ\$Dm9áÿ\Dâ%^â‡ÿZYþeù§8/;ûKüÐcއ繛á?嶈9]6Î..ïJ¾UÏ^hÖŒ–¹P#õ†gïe]½¬Ä”)¬PPœ ½B‹2ˆP£ H¹È/ò‡M¥WÁû@ð&¡×`*%ÎE4Žtóˆü Œ½ç«Ÿ^3wˆSn¿^±¿ë˜úžÓC¦‘ª]’s2‚ÊjeûJYÜ*í×Ü93 Êò T&÷jÉÉd’¢‹ëÌÃGN༧]Âj=YB:*Ç38çÈ8‰Æ ÃäjŪâ´'gÚu€=ìï4›ï@ÝL 0RµFέš–´«Lšša!d^}µä|èC¨›‰/~K˜Ï0T6Å™&#·®[Û–ÍÖTB-ʸŸ9Üüø÷[\ðÔDQL1fùÓ+þÃOœv‰ºúnÞf*@BÆ5ŽÛ/üÚ!‹\ œ3JôôbÄU5Óà8Ÿ{¦I>e§Dmº2N£a›óDÕDBíHÑÈØ“ºbhdÝR!KNÑ)óx—™ÆÄÐ'º^Q×òêJøâ· Ÿ¢r|Œ¼ÿydêψÄÌŠ"CÛ[ºS7E¦‡aÌœúÉi‹JÊ›[xõeàúM gϧ) ‹Zù­9Þÿ*sßAï*B¡ &]»¹QÞ+‡“·‚8FH™å ú3Ô aê…®7™Ì÷S¤Wåme“†Õ•%Õ§®Öæ?Q…Ìb‘©[oà ”ÄÕÒ&_íRhŽáœ8ìûn0Cïèz8©Ðœ…Œ#‘ec¨v9wÏÇGˆÓD+oR4Wo…ÓÁñî>1b“¦Þáצöû? ìNÂq‚xJŒÙý)?5(¦¢JVûd͉ƒ›úh$Ÿ V8Œà5Ó¶BÎÂuméêá¶véqÞ¦«uäð |zgJ_««Šã.Ò.³‘q#E¡Ù*¯¤ì?yºª t'Ïõ+Ç88N£c³PB€vûŠIßð雈ÒÑ,”±O<î䜊w„+’ž™¡~%5eŸ1'ÆidLÑÄ1åH—²%øæÃEÏ¿ˆ(`ê=–ìωþ“4h,ÓY›²ð&ô„÷Ï3þ?ë38ÐÓ5c^gÒÙ<ï%^â‡ÿúg·åo–óNxy‘}‰ZÌàçP ¹“S¨Oížœ€ý³u‚{‚Íà™qÆÅñ×;“uØ“«?ã1S’â`DD'Ð8#'ÖbJA çðNXˆ°¡.·kç¨ÅÌ„Ö)ÈHµ`ç+¼x_Q{Ï›§Y@÷œ÷gúS"T WÌÊb4U“fafP¡UÇê*ðæ_þ×WøÅÀû?8˜ƒ°3ØÑ«¯kêÖÔ>þƒ·‡YmàtÐbH–èÌL§] wïÁ…G*D”¾x'´K“*<>FœË ïíP!«µ$–›ŠªmñU Ž!dÆ!Ù‘ AYl•„¯®Ù2yŒ¨šj»òÈ& gÏ74²ÿ4R×¾‘Pº•¦˜´ºš„ÌU¹j¡vÜ~Êw\åpmÃé}$NF^_;ê ‚[òM21ç@íñái—‘q0ö±Ïhž ¾t»t"'áêT­pÚyNÇŒwÍB–LŸ ò4_:¥A•à Ï.¥­'Óq÷ÎŒÖ[å|Ìwš'BeNÓ>`JB% •R·i´m=tЕ,¨Âzë¸~]Ó®j|¨¹ý²ïxøväñÃDß%º>³Zdr\™4­™PÅÉ‘’rêÌñwÈ\ôïë2o“‰c.¼ïY9áÕ•g¹uÄ Ž‡l ]@ŽŠ¯‹µçꕳéÊ +ÅWBNJ‚aíl š˜e? uUÑ=yrfFBš¸½Ú•ùÜï&NSd)‰ã`…—IHZ¡¿®}´D8{pÑÂûd]ç ¥ê–ɒΛ*®¥—ÖÎT‘^/E8•Â`»€ÅÂAnÞ:NBå2•ÂèÌy¹‚õ:૚M«Œƒ0–B1‹°j`Š6mû½ªÆ““à½0ôÂúÊ…¯šÛŸ|ÕO»LžFOœ"I3§ñL¦œ‹Æ™|" 92Žƒ¹çÄ'ú41Ìÿ”˜ ¬'ŒVeT57äYt†ÿ$›Ì AsWîæçy™æBÀ~«T–Z „4XA6s¹¦¢tNÖ0z‰—ø¡Ç\Ìœß È¶|‰—ø¡†þšûžK>ç<_αy2 åo?ãK³i­g¤T^íã()#s걄mpB¹©Æœ ßÀ1j&¨0:aÇ†Ì GƒŒX1«Þ­8NyNÃÑ`¾j©Ý!3MåªF©’%B»OÐ,ë+À™™Ô‡¿ÿÀíWîÿ$P…Àr#8ç¸7q÷MâëߨÀÍkÇ·ß&ÒC&øÌ4Á„Ö§’@*Î ‹Ösè£Ù1%ArfÂ’°uÈ”ÔéILƒgÌÂjYSÕ™ÃýDÝfª¶ÁWŽþ©êH¨¬p8爵õuƒLPÁâ§+âî•ÈÝÁþS¢ª¡±d±6_q™ímâöKGõÅÆOG¾ý;Æ~dìÍÀ,k ^+ؾ© ­Ç5ó]&ÅRxewg€ƒÕÖsÝ q—”ã>ÑwÎd§Lw4‘5ãœ"b ‰P¬{QVON‰Ç‡Äû÷`ˆ µ8¢÷d5ÇÔÛµ²ÛY²4j&dSSñ“)ó ªF`¡Û«V‘ó„÷‰Í+ƒ} ™óÎ Äú>ÓŸ<ÓhxðœæÏ¨4&õEIKØßg>ür T‰¿@?•Ï *t:G–AˆâxwP‚@+‚š{Ñ\Wz츪4S×Ê¡7ÄHãÊÁ¢ñ¼ù‘uº‡¡Ïœf &I9 JÓ86k+¦Á™M„î{ƒ9¯œOQséž”ašÔ`F R&äÌMp!ÙkeÇÃÃH?N¥{mÞV•W76ýªCÅ?|7³²°Þz¼MŽu—y÷8rÈ–ø‡™+”àG Ç))»IÙg#ká+©˜"ÓºQv=l+¸m<ݘyè…N¯œá¡›XyáG¿ëøø©¡š2•ƒåÒ1 BN‰ª†i„o÷Zš JÀ¾^]{+ÊÅ1ŽŽ±w6š„ÚÙyj}ðu nËØod3Y”!D”.GbÎD¬(Š)>¹öï™´K)`µ@~ÆÒvŸR&¥Ä  š šSΙs¢¯Y/ @RyQ. B)›Öÿ¬í?_¾£4›„=›ØÄâÉ•xÌ/¨ˆ—øÍ‰ÝpQú4C^Œï^â7!æ“·<û7Ǭìóüñ¹P˜§Y,ù/FÀ¸b<Ë"E.|‚,vÑp…hœË¥RaÒL9çbs¯Åc@zµdyÀˆ€A<·À9fÚ 8Dk„> ICŒœwŽPyÚõ+n¾îèg–[ëÞ5Këb.6‰»o”C§¼ºQÖ7Âò6SÿôK~û_n¸û»ÀÐ%Ól—Èá^øE‘üòwZbŸÙ=œA“À>Ba=Ø6|÷A¨%}ź*DN7Ñg#P&Uîî#ÑDÌJŒX:MqžC','‡óÑ %áÜÜÔ,7ž85ôçD½†ôѺèã/Þôõrï~ jã ï#9MÄaÄ{¨žåZqU…Ë0­‹8 Öi6'ga½U>}›û‘ë/Ž?w«­°Ü ë­%Ñcïð!q¸Wr28Uw„=i Ê…Mó\Õ2@‡)£Œ1áPús¦i„õÆ1öàÔ@Ò1³¨ׯ+¾ü½ÀþnâÿÓÁ'€Iœ%ÖªhJ–`feÑfD¤üøÑ>_ÎÐÓ£&Å{{å49ºl2ŸídÐ /Ö-­*Ϫœ L(V9‰£2–õ­›’@s&”'à$³<®‘]ž ™…~‚MmßgÙx+nU„ªUú£ b:ñÝ ¸…ÐÖ>xNGã4KãälþßcŸq>ƒ ?þ]¨šÀÐÁq7±ÿÕ˜‰ÃÀ^…œ3]Ît'#á«Fœ ]2Íÿv­üÞÊàdíî2yàÆÃö‹LO—,]þÑÀý°<~çŽIþ5?É}NyöÀ„Ê~ų©€–‰Í…ÆqákÍO§üðB~‰ßœ˜óûq¾='Ds!Pvûï”åÿñûþä/ñÿñ9!ø¹€++̪$ù3q×—¤tãf©8ƒ ÉÅ€ò¼„­#n6³i@ÌÖýŒb²±t¥œZ·9e»86"Û팼z±.£+RNTÀŠLDç©*5‰ÏìYn+êfEŽ„z8î•ÕVXl2M4K”îÞQ×?#·oQöŸÝ!3NP#pî&n^÷FÔÄ4AÌ_¾×Q„…}u:oæM±i\¢MÄqŽ£mÍ,r²‹|'”UÎä<1ø‰Þ{D›Ö7'Þ 2C Yd¦^yø0‚NÄq,Ý@“àlžºõTmMwrxŸ8Ý+’¾C¨òxVÃyg+×’4–Øx—ùðÎäGͦæR¦PC1”ªœcÝZ¢¿º‚8 !ñsì…ÓÙ`OqJ–¼g›œu–¼Ueµ„q€ºq¤$L„0ß¶ïÚ Š8½8½.Và’{›tí§H—MåfØŠ3‰[ÔLÀœ%ZËÆ 9®rÔ­§VϤʗ_yBðtGSlzõe9^+P LÙÓ©à³ýÛ^ÃýÅ9˜¥jÌM–›–ÇÆ™¸ßO¤1áÔ\~sE¦w3­Sªô’¬Xå°ƒÃÙ¦*M+ °›2~dVœ²·ÅË,*g G¸ BS{Ö+Åí”MVþxT ÚÁÊUL‹Lš”ë¦Éö³Q`”ë,\oýÉqè•$‰H2B°4;¢Bž †Ø8aU›°ÀÃähzh¼g±ÆÉ!*4­œ©,Õ‹Š7¿÷7Šþ4pÞu‘![‘§Îà[Q3CŠL³»/†ÙÏ93Íÿ”3SáL9¨^ЬEpb¿Ã<%Òç ¿æï¸þÎÊl”óïLüÍj<’™ä;«ü¤gSx€xžüÏ“âùõ_â%~Èñ¿.Ë9º4>ÿÎS#ó;Q}¶âÿöûþ/ñΘ‹×ùÄ='øA,Éw­{¦ù?w÷y’u¥ÛïŠÛ¯ˆiVK) |ÁûÏëÍ…„·`_:iJ`£ôP&ÂJ„®¼fðŽÊ9jçXx‡”„_Êík稰qŽÊ{ÔZçðÀbUá‚Q«€²¤jÎ%úã™ ?v <¯Tñáçׯ3‹M «7ðóÿàÄÝ·#¨AOV a±Ê„¦Â9ÎŽîN¾R†îéä‚+Ñ ! ÄÂ}ˆªŒ)’³iGàÆÃW¿eøû?üc“UÍÞÓˆƒyûªe¹ ø`Ûb§]fŽ‘ª¶D÷t´ížœ·øÊÑ.”‡÷Qª[ëÀÇéO‘œ2Þ›ƒ©HAá,Ö–åC§Œ}dTKU ]B]1ö–$­®„ÕÖqx€ª†ÅF@=u Wó' ¿:ó«t ÛOTuæõ”8Á48ƒ(5–<íï3GU$çâaDI—3!À×? ¦|38úÓÀþ~dÈ 2ó*3ì2ø‚U«ËÆ ÁêÆŒ¥âd*RqœÇDÎÑÌ4)SÌ„ nn©½Ljû¸Ö×ÕŠþdnÑ1—IGùMmb¦Eýɤ8S´n¾mV¡övÜd…åJPÆQhŽÅÚ‘S nõÂsO{ˆ£c}­,·V ¨*MëqÞs>L<¼ÏÜØÄ,8aå=›kƒàuÇ̹K&Õ9MÄ)^ÿ9Û¶ÎÑ\hÇX4ç±éw•”ßú-ÇÍ› ôO||!ÃB_™>~D³áÆU̱·Ž–ìãLA¬›2SVV@í!ˆã¬°O™1à_/"Âã˜ù0Øf#ðã·Âok>|›ñ¡¨lM0&hƒÐ4ŽqRΩH «‰\WÆ;jk±c£‹7 ÇÍë@4œwæN,žféÈÙ”€ÚU ï=›W Íæ·L]IâéûÌq€AÌá|L“êSç?›˜©ú˜×C’¦K‡?ªaþ£*}Î 1!J™$X±;&+P̬tÿg30#õÚ §¢é_ø$©`üc)ò ÷)“€¹«?iÁý?Kþã³ÇfÐðÂx‰pÌ@ýÙýá9âyÌ·_\ð^⇳«ïsøÏŒÿb¸·y0›Åø‚çŸM¿²•‰y.Œ)~€<9Hb$:bÆ{Ã[;g‡\ ,‚¹§"5$‚©·¨]¨qî©3Eæ lT™Ä° ížÌǃ(Ûd€Q=˜¹‘Ó„HÅ4@Œ‘iÌTM Y.N{B!8¦ˆ£rý|ؼjÌ¿@àÕ>|ÓÓ§dÅHã¸y[ñ«?L\¿‰4 %ÊØY·Îyƒ ÄÁ6ö8˜öwpÂÛWö~Ý!³ ÉÊ€©9)¼vQq?Ϭ6™E†ƒÂÂIIÄ„ûû‘zá:¨šHšŒ”\U0 vöjÊzkºïw™"ý!Óí„ó:€­óè²ud—µuœËEÁÉðáU•h–Âá1ÑÂH)ÞÄ“u»ÃD§N‰/Ûã}b±tœŽŽî”ÈIùò§†#iŒ¤q Óùæa„H¢qŠ÷™3U­Ô=,Ûs§’Ε©2 ÊÛß €ãÃÏ;¼S|RRŽÊ0 M-¤Ñr\ %ë~‡:³Þfº“aÀÓ”©›ÌnoIãÕR¸Yyªº£0eÁh[KLÓ$8ñ!rŠ•w\W°¼2c¼Ãƒr•E€›·ÂúÚTwÞý,òévQ‰"ÈÙ³½q\½òŒƒc8 ˆM}êEEÕ +1åþ”¹ûfâq—p"É„hWÊÃ*2£˜ÑÞ͵c±Î~RŠSdœ"ý8ÑHÑzWeÓØt®31eÎѦA•:À/þqæÛ_~Vâ çž?V¦"v!Í¥c¥›?/TN |H.ä?OÊcRT…‚³×|%prÞ’gAð¦T9ÇÒ9Ä›*PåLcýÆ9Ö"4ÎáÅ!>Ђµ^ƒ©‰s„PsýÚ³¾rt‡žîp"E± o—Q››DI£u†›Eäþ}Bs$&×·mæ°7xÇö¦b3q2˜Em¤nàñ®^9Bí9ï­`:™1……®|Ï Œ9S‹àT+¡Jã„ͳ‹ ªsTMk°+Ê–[oúï]BSÄ9åí×B³PÚ…ðñ›Äá>3t‘ÕV Æ_©[%E‡¦n*eaßgjµiNå…}¶}bå­râ8O§g^ÝÀíÎàC£çá£P·öý¯^AݾýÇãyâêpÞÃî ƒŠíŽÖ…¿ÚÂÔ+Ë Œ½°;Xr´ô‰º±Žv»²îþù˜¢aô}°"3FÁÇÍ›šåUC»ŒÄ1³ÿ”ØÝõ¤4ñéI}äë/•Õ•£YxrZðó?è8EKØPÈÁ±€Ìb qRº“ M§Ñ ìbá \›•&ؾÞþ¶cs³âp—øþ?g5ÛÍRhWž8 «)ÎŒ½çúMŧwqpýBPr6µš8&R´ÎïØ_aJ¦Ö³ÚÌf°¹6µ¡ª®xÿóÈÝýDJ #ÃÄ~ŠLÙ$OWª¬DˆI‘¬ôYéÇÌÊÙ4Áeåë/ûÜŸ jÕÍÝæ ]¶ýU ¡q¸¬D/ì'ó@¸n òÞÍbúÕMâ°h­ <œ2»¨¤˜iEðª,‚Эg/*¹œ£~ç÷=yrì„n0.Áj¡Œ“0ª°@YmŒÈ}>CtÐTŽÕÒsuíøøX·Ž7_ª& \“8?rý¦áêÇÿ §gèÅ Ø80¢¤8pžFÆ82¦Dʉ)MÄésFr2UŸ‹ì§%ô“‚èϬâsf,ø†ò÷ÜÕc¼|Q B3¦ß·‘Ÿ]&/W…™OXÔg#‡‹FõåùúÏ— ·àŒ°Æ$ÿr‘ Í^4Œƒ gÂR”]<¡I‚ueíʈ©k`p¤©¦Ú•™‰uƒ¿T E‰&*ó™8œØ}X¬3Ë•²¿O¯8oDÊœ-º‚ÁÍr)¤êÖº"y)´KOœàÐg$+]éîuj’•½lÿ™|}*dh4£É¤3 )ÑhÆOA51މåÚºžÁC?fN‘Ó^ÙÝ)Ç]¦ª2››LÕ(§}fŸÎŠÙ0Æ=à”C—sÌÅ8 ²‚õ•™¦õ6 àf ›+¸¾UÖ+ëÞßPSIÂj£tû-Ž™¿Œ,–‘ëׄiP‚·=qì ‹P9“Tm¦0å½â²¹Ïúå}Ÿijåꕲ¹–â–lû×j‹3ÙË…‘œE¬•s>$™¡Kô}ÆçÌÍufûÊ™ùYr,·K~ú·–,+8>$ZoŠ<1+»,œ:¥Ÿ,ÙMYѨÔ^Y9h6Nh¨ját>|#ìÞGÞGR–Á³\˵Ã[oÇþì8î òàƒu†O{+RßÝ+ÓIi[ƒdõçL?%œÚþØŸ9eާÌj­ÔMÍþ>ñp7±ÝFnn'JwJö¼hû£d#õN }Vª¤ˆR0NN廳r•›¥òå×ãΈÊ3„dX‰°Ýmðì&…jRn[ÏÛ·žõÚ!IHEŸ^ƒ‡¡qܬ*$>ÉV Ä\q"P{6-¼Ý8ÖÇöÚ¼'Ow;GR¡õ•eåX.=*Φb2'h-…­WA“çj¨—qÄ©&'¡]ÁÍ›ŠW?ý›ÄxCÖ€fó§H(CŠô)ZÂ_`>cŽÅ¼ËúX`?óã±È{¦ùñ”Rº§d¸1ç‹„gÒR”n>sÑôbä•òwϻśîÑW/–8K|–Óã¤O²Ÿ±“ùOþìdÿ%ÿ‰rü—xÊíçÿÚ¯áÌIÔón*Àÿòûþ&/ñÿ”˜÷ÙÏa›^ž¼|áÌr žÒç©(ÏŸ—ªO^â ןD.˜'6 È…3P•$~V2Ms¡yÆ)h½Ã9Ã2G'TÞœ)UN³o€®œC©ÿlÅŸµ÷ÅcÀáEbkïΜól^C7QÕÊb퉓ñÔ­ÓDU ä˜øÕʸ}køùoþd¢?%KAœm‡vSgIêØÜXG³?›"QŠÊíðð1ñ霬ÔbõG5Œyë=#>z'œ‹2 XRuU Så:šPqr޽‚ãA¢ãöʉ§‘ñ’2çÉŠ¤™$¸(ÄD-$ÏX[zaӚї 4µ0N6ú™D¨1?‡^„ h¼þ N{á|%Ð,L&1Ž )á+ÃX¯¶‰þ¨Ü0ó5'ÊáÆ(TÞ<Ú¥â¼Ò…óÙ:ê' Ï-ª\UBJ™ÓY–}‰l¤ïf ¨pÜt¤š&£IˆÙ³Xd·dÒSâ4L¼¾µÊátôÜJ žJ·>qûÖ j»OÖ=Ý”Ûká|zúr|5"\m„í­r>X† ý NÙà[ו¢®\ˆÄÝ l·V0´Èá+SíéÏðPœËwÏ"UšœmBᦄ¦„ä̦±©ÀA…•s¬VŽ›7f§ìî ïzRœ¸ï#š ÊÆq±BÏ ºï>eÞGÓ€\ÀU_½©rÅþÓ™o‡ŒSJAÿÆAob®´jþ"¾rHpüøË@»´nöûoaQì/N¼É³ªyJÆÌ$ ƒ(©¼ÖÕµg{åˆC`#Û뚘‹…‘ûÛ…C\ætˆL}ÍÉ;Ü0QIÁ°ˆc*Â×põÊcE¨*¦ÑŠÀåÚ±Ü6¼úÉoQ¯DJ•ý}ỎA„!ti"Å‘G¦h’¶SNÄhN¾SÎL)’ÒÄXŠ©`þ/ÿË™ Àšl½Yég^GÕx&©LrÒ¢‹¼ç³iÀ\䤌Ñx©töçfLâ©™3ê“Þÿ|Žxžè¿L^⇟‹÷ hñÊf ÛWŽÓN{û=OŠD›ò,WBwÊ 9#Ɉ–.Gœ¸D<œ²^Ž•KŠ—©ýˆWà³ÉjÖµj%Ea×Y±Ra$ð͵+É:v6Å©a±rŒ½„«†œ„PY"œ“aàÏb>g”nJÔÌ.Û¶?ÕÎd0s4BoJ™×>Û¤IŠ‘^+¸à‰ÑªÔÓ81N†Iרt1Óe¥… „§©S†}Bbæ«+pÙÑŸ•sé.;c²ÄÓ'e¨Q~ú#OÀÝ]¢®`±Ž'a¬¬pyÓb¹®^›Ü¦q‘̇wwýÈqR|4¸8!N™M%,WŽå:&ƒ¦ìŠ~¾œ§ÖH?Â,0fe#°ÝÚ\ŒŽ Xauñ¤äç¹y¨jG½XÒluk¦Áö„¬Žˆã”FúáÀ&R2ÿ”âÅÕw¾=Ë€æM¡j&ÿfeȶŒ)“’¹k1÷šµýg¼¾ÎN×:G_.øþÙä+©Mrb~"úÎÅÂØ €Xx“>É~F}ò]ø³®/øÿ—ø¡Ç¿U–¿nWöÿ…*ôÆË¿‹Ä!Ï 4x½Ä;f¸I}1Ò¯éë¢þCq~–üÃSQ0#f¯Á|¼1~­Ë_¦¬_,³U¢HzZ??Ç—ç” Â>oýdÆ >¹˜=i‘" ú„w9ãrfšFrN„"ÕiE‡G\EN– °ÿp"„H¨…±ëùô‹=çÝ™w|DÓDU'V[ÇrØÜÚ…ÍWú³ÒŸ”1 û$aúþbI]U W¯„º ôgÃÀ‹S®6޶ñ”©U©5óÅ+È“²šI¹œ°”m­\_)n„³%«)‘S"äDc8BPÖWŽõU0£.oäU²MP¾¼…ØËÅ㡚JHÑT|ê…³Îâ ìb¾@¢s\­•¦ÍÄ“a˜— åêä©È¹ÆÄr_üÈqûEEž<ýÉpëË­çÍ7o…þd˜ìÕF©k#p~z—Î™à•˜!qÿ)sÎ —‹F©åþÛÌã!á5ƒ3Þ©ƒao]ø¯~¯¢Yx*gDí3q,Ö”l»å̶±2Žç—â¶eÿÞ#¯†JÈÙqì@#'ðÙ<RT¦ËZ™’ÁK– OÝ¡²)íìε8k)UkFh)*iʨ&º1“cæ˜,w1âRBR"¥Œ‹ — >²(ÅŒŸ&4't´iϪÎÔö]æÐG< ïÄȱtÕAÈQÙ¸²¯bÇø§Â)بdõ=ì£M|\áÁ¸¢Ó*ç¬T½ÂpÎÇÌvëX.“³7W<&‹{V&Á'O5'¦Œ+@ŸHIyÕ !۹ĊLH †A¹}kŠª"£:6.á\f¹4|Ȱ °ÙxÆ!0d‡TÂë+Ï 5Î×l¶ˆcs½@\CÕl‰òcN±¢;L¦ảsìóD7 ôcÇcqëµ)èOù7«ûdlºáõéŸuþM¥ÇH¿³º^´ýMï?Îj=åþTH¿ú,¹ÏÉ~75 ‹gÀÅÝ—§d?•îÿÍÕ÷’üÿšëÄKÇÿ%~âo—åçÐ~_þÉó³cà×É΀ÿÅ÷ý^â%þ)á~ÍýŸŸÓŸÃ{jyRzý™!A`ûg‚Yî x)²ÖåóßeeWHÄÖô–"#ZH§æãDÊmƒÍÓ‚º*Ј+r¦’2Ø8w™VHÊHQÖh»HŒºPQWM šÀê*°Ú†>1œG¶·BŠð‹t"çÕÒÌžT­Kœ°X+Ÿ¾xÜ%ZoÈ»ÁÔH®›¥°Ø8ÆÎL™D„þlê-9G¡] c.ÀÃ}&õJ»(£ù ¦¨4^.2}8aY ËÖ¶÷0:bž§)‹Z¯’A¬úÁ¸m«,Ó½Ÿa6¡¶®ñp†Ó˜Ù,…ëׯ_8íÍ¥¸ªgAÈl*ã2Œ©8ÈŠÐ:¡*¢ç ÚV¸ÚVÛŠåV8í”Oï2«M(Flp¸ÏFò„Ó.qõÚä0ã˜9<$ªZi®­@p>Ó´&Sz¿³ßt,æY"P;gúbO¦hdЊª¶¢éçM™@æ”2ûd„ÚÆ9¶",¨*;:º³}§c!É8Œ$ë¼3 ]k@£âPçhÓŠÞø+A„ʦ̱Ϝ§È"8º’o2f%NÊA•>šîm7·CZn„ã^øxRNS¦NJí„ImÝá™ð¼BïÕ±YyÔ ]Þl›m…ˆp<À䌳¢M̳ªµ3åŸTäG­[­—IäÊ ×¯…ÕÚ#T žOw»)ój¡,–Ži€ªöÄÉ|Bã9÷®;ÂvíY¬C癲g٠͢Á…Úné«ÄôþSNÄÂÁç ¹wvôµ.}ºtûÍÿ¦è“ ,µøR¤hë)3L‘ãwþ˜ó¥û~7ÙŸ%;gÌÌ 0.À“¤'.€ž ì*Ÿ¨–üÏ$ßç @Ÿç<Ÿ_/fxÐK¼Ä-þOeéf­„’¥’Ð_ @³úÿ5/4'U/…ÀKüUhŽù¤?³G@åJuüŒ/0sæõçBÀ¹ô÷@¼qÔÍžÖ%ßÇàBÆ/%™·D? S 2µ™ª¡LL–ópŽ³×˜9AŒëŠü¨Ãº‡MxgãÿÕ2à«ÕÀrã uæøp‰u®5O—Î-Å¥¶n”í-T-üñß9ÆÌ ¥Y9ΣižWª "¼] MëèNÂaÑ·_:ö™á¹yëX]9rîß%·H6—]Ø=dêºÈ¶ÂØ)¡v4K3ëÊYHê8%;'­¼ÐzW$(=Ó~e¿Ñr-,7Bœ¡Â䇄f{˜Æ„ó–®¶RÓ»ŸeΓRIfˆŠ¨2а!9a,ØÁË['¬×žÕÆà¡r\¿õœŽ””‡÷–ø f7%ãlo„P'vŸÌ¸ª]ÁÐÁùlÌFg9™a¦1BySO*p³¨³}N‰ Í™õ•\¾ã8æ‹äb{+F 棊òRÌ™* BйXÁâƒà+GÝ4jœ„)… ÕÎ)1N‘)&¶ÞF„UªÆ.q?d\VNX¬„9 çýÀ Â›7-‹U`ÿ)²?R¦Í™˜”¾Hw®3Ü܇£p³6ˆQ7ÃêÑ ë†Ì•OÑÜ‘WI Þ¼rÜ~!œ…¡³Äsw]ÄcÛu´Í1¢AÚjUn·BšUå Þ¼†Õºæã] ©²mÍÕù—ç‰}Rn’R‰ÐVÊ8(^Œ ŒWóÍðžqL´|õ•c¹^ðx'ftã8árºœ¥©„œíÒQ5ÂÝ^©Äq½õäìhžÅ¦"MžÕUÀ…%ûüŠCaákép$5ŸÍç= Ì·£(äÒ¡9ÓçĘ"Lë_g(OÁüg5…‚ós¦éâ» :;ø>aþ§¹‹¯<“óÔ'—ßy —Çf Y°ÁŽïvÿ³ÂPŠ€>ÿù»û/€—ø¡Æÿ¹œ ´€þçÄ?~¦ë/ÿ­Ïò¤Ï?¯Žç•ÿ§ß÷7|‰—ø5ñO+fÏs©Ï2Oà‰,<3æçbAféPyšH!+Î’¡ÞqáÌS€ŠCIº*7¯W:ld@%ÖÙ¸$öÏ )ª@óú®SeñE½6"6þ+æbÁ{+|ÀO’Š£s,œçõÖ0þqìé#>dÎ{Ó\ ;E☈1—J&ŽæÈººrô§ÄÕG»Úò‡ÿ`Gã@1C®÷ ¯Ê«kÇO¿¥?9Žûœ”Ý<œ¢J…u2Û`?PJ•šÊï•£©„Ep¬·æ{<½i ï Kþö+Çí—-Î)»O‘ó>ÓŸ-1¬ókÈ ªv÷ʘ _yS‡ ¥óØçÌ“=žM¦té”S,#Œ|;zu&ñdçø­¯?þ›K~þ÷:Ú¥R5–8ž÷Êã}Ƹºu8¯ŒMZr_)‹5ô'å|Pv'e³€8Zñ¢BTe!°^›¢Ójk“–û»'UUp醯Ît§Äá”Qq´A¢áÆ;M!Úv1¢jê>‹…M®˜¦Y·Y é×S·Jw†O£®W"\UŽf‘Ù?Dú!rމÌ`-P åÒý­1èNÛ@Î5ÇÑ @ç”题ģ– O€:ìM¢ZíÌì …Ê g/¼©…·¯Ó¨t}â|*øñÂ}8œMš2eƒÞ€#ÇõJÈѶóþ”Ü .öú G~yPBT1·ìÕnnM1G³0œçrlæ¬LÓÄ4&’e¸¼Þ:ƦÑÈÈ8aÙ8®®<ë«Ó(tÒŸzRÌËþèPòdúà„¦õÔUð4K_\Ÿâ0þâ UM»ÝÒµ_pÎJ7 hNF ,ÛUEl bñiÆ ‡)Y¾£òsN9Fb6C¯Y³?Ge#üæËí!%ˆO @©ƒ£}3ñ*Ó‘8ãýK—?–vý¬ìƒêwL½ænþÜõŸ!˳¼g—ŸÔ›žwöŸç7IŸ¦»Ÿ_?^ €—ø!Å\¸Ïà£É^ ò¯~6˜cÞß—eÙ”åP–ÿ“ïû¾ÄKüšøóNæ±Ø ùi]!ùÊ“+ðl ö¼på¶¾‰m<‘€+±‹é¬ÙíE~Æó›€+^—i@DÈY²+óÔÀÔgRQý12°+År™V¸Â#¨Êw÷Îqå„[ïX‰»¸{ç΃÷*Žâ™¼§õk^½rÎã8îu­,–†ß¾oÜs&=p{ >(ûO™záLþmðüô?m|ƒ¿Èì> Ô hO½N{¥?e+œÆdJeæ.–1S®V qŽÉ9®½)éhVÆhÛËFû&‰è¼úÒ°ì9 deÿ`]}ý×?2ÒíùÝ ¼ýÒÈ©»‡Ù÷MY®û»§¤lû݆AéKbzV;©6Îã*ÏW¯¯¾6¢çé1S·Žf)œ¯~™©0'SïíKÜ*Só9¥L‹ò£ßÞý‰²+lĘr)òž´Sg> NhQ²&¦hŸ€N„kàzcª*Ë­I›]æñ#Üí”CÌô@›32EKzp³t4 ƒÆt,Wžœ„)ÂQ„Æ{pbiU¶å=WÎ!)á¦H#]V’wH‘š‰ô•«k!%¸;ÚïÜ©Ñ*g1_äzÉJ_¾ïXh7°\xއÄù”éFó"ØlcèºÈcoÊ2!eBRÃ_­„¦Žå§ÿ’àðÔµçêÆæî¤|ó³weSŠÎͺB|âá1ÑOçqN¨‚£®¿÷û ÞpïŽä¬¬Öp:™Lï®W:ŒH\geéa¯° Ž&86šÖ³Þ®Á%úÑ“S&0’óħ£2>BVö8XyϺ ÜÞÔørBŠ“ãæ­ÃùŠPyºî–ãjKE»?‘ TgÌ)°2µC­$úEÏ?g’ˆÉ}¢xÍôÉœ~‡‰S,*?Fò½ÈsxOTƒ‘Í2 Ï‹‚ô Þ3y/øÿbì†÷Ÿ•ô™è”?Küçî?ÏÜ~óžŠ/EÊùYð<ÑÉù_â‡ÿ·•-M–ûi0Oò<øï|¶Ÿšê³7˜å„þÇß÷7}‰—ø,>/„?}2še=öö9é÷¹jÐü÷e ðŒ 0'ÿP’ú æ®$ú…àKÇ~V %ùŸ¹Êw¡> ûLî’ì³0÷D&v¥ËoŸG._®* A•–Îqí=\dCMfÔS8øÊ³Wï ߤiÀ¹žó>3™Ãqb½Èœ;åê*jÇÃG+ –+åt´V[w†ªÖ7ž‡'9e 컑Öeº!øC0HJSgrð&ëÖåû,‚дÄxç,õ¥Tÿ¬]ùµEXm`}e ÝáÑîºÆ‘âÕ ô„Ù\ÃõÇ48BmXð¿ÌädœiÈ|ü&3 ‘œÍ¼I0'dP†ŽQXx!–ŽìoÿšÕÆóx7ðᓚ\¬°îe„ª1bqV,ög8LEUY.L5h…÷‡Ä”2KEpl6‚xƒCôG{=ÍÊÕká|°¿ÛµðéÞà #¿®è;µm1˜ãjŠŠ“Èi„“sxl r]ÃÛŸxö÷–T¦ÉŒˆÐÖŽímEwÊx—8íÌàÉxè3y𠦑”PiW-—BhT‹„fÀ®9ÝEÌ]Ù`“œ”nTúdß÷õFhZa¹òÔmÅ4zºnäÝû‘s—è%{•š’R—•×#«•M¹ÖÏÇ÷æ0{µ5Òóba†|û=G¨êŠŸþȳ¹™ÃƒÐÇ!±XG6Wðé[aš„«[Añ|{ÇhÇf2ˆNLŠS+Uá4\9RÏÐL»/¸ žM¡ œz%'ÃÖ/—G!j!o‹csmøý¡÷4 Çrã¸yÛ2tžÉßpp5™ï¬—g ¾>iù+O†^S¶"r,$ß9áÞõO¥PŸýù\ÿ¢ýÿ¿ ñï”D½.\¹©ŸCR9¸Ã¬™>'øþŸö%ÜŸs½—x‰ï;>?‘Ï€YñjŽ©\fÏ® ÖžIc{ÂçJY‚`Yôò~Ìý7+ ƒúÌšÕòì5r!ý¹l‰«—bJ61-zƒ*)±P‡TT† ôç Ë«—©A¤\¸Õ¤`ôŽUJLÎÑ<8EÂó¶UÏîQ ÎHžJÍ«×-ÎXmGÖW§o…¦rì,)÷ÓÐ/ÄH_C£Jmy} wÊÇœIû!3`¸ê*g¼4+nÞþ8П•ÓƒÁEZoê< ¨zn^Ãæ:qÚev IXUBŸ &ÔgÛƒÀã#ø]&“Ùz3«rÞ±Z;67Ž¡ƒý'eye.ÆíÒÓ,*·‰ŸýƒÄØ'çlS†¨,Vpî¬ë¿ŽVìwz™ÖDQŽ ¾¸*†`§Ñd=OŽ”3c!+ÍÂNÀõB¨jØ}ÊÄѸGUƬ„œ9L¶¯%'ÇyTº¨´“RaÛ½ë s_iæî½Ák!eÑ‚?IÓl®Á³ ÜæÆ±»ƒëµcw„3†±ïË~µŸ@~YàE2d3˜jX­QáÕÓœ›è3†LŽ‘3}TÖΈ¹Ã(LìwÅœJMkÄ>߯;^‰£]$BõByûuÅâ¦áþ{gv»È]ïOÆÝp‰$œÂCMY(Y'{áž º‚u[óÍÝ@ŒJÄ&MW•pshOU9ö÷ë[ÇmÍýLjsžªmXn®ßF¦!s|ô ]àñÄ÷™i4ŽÌÍ›ŠW£G8ÖÝÔ>ϯ…ºvlojú“ãÛw=1+­Àº‘ ±ÕŽ¡â%àì\ÒTžÕ:°Ûk![b½.SÀ”œ™þE÷5C×0-‡öŠóÕÈÉd9çDß$:MÍÇÄò…c¢e\Š–¹»ï ÷d*rÇÞ”ÉÉ|f§^Ñ™3 ¥ ÍŸ”ó‰·Q‹¾IügH–÷šOâ1?‘rÇgXž©ìCÏ ¾àOKyÎ ÿó"àó¢à%^â‡>|÷vU°üsÇNüçÿÞg 9!çø5Ëy½ÿþ÷ý_â%>‹YÖöϵnIøç Àl–÷”ô?'ÏÜÙ @õ™lh™-; ”¨*oÝꪜãÉà°IÁ<=Ð’øWØ$ ”îÿ,1:›TI™„T:âMQ ª y6«Êòµs\‰Ýƙè/ê.8ÏÎpž*âùâºâxÇx>“Rf¹ÉÔãÛŸM¦²#ÊiRV¦Ì‘¡Só1xûÆ1 ÊqgÝÃ.eÖΣåZ—¹ÿ9Ç|ñGxýÚsÜ™lä«/çaê­«š&¥n th'›D`í…ë+3 {Kj¶*/8ïÉËZ¸z£e:d–k%%xü˜hÚb&4ÁîlI΢ò,–†ïF¡K©jÜ„@a[9ÐGò/TiœIqªÚ¬j“£œmâà¼3cµ¬ô“±k,¡é0/„(¸ZÙUkÉðÃ)ã¾øÂ1ôæ&<öà+aììÄ*eµ…î¬L ¥uš¦HN‰Hf½°ÎrЦª“³»ÈÎv·ZŒWpß™ö~å„Å&°½œOìîFw‰Z•ÅÚ`27¯=»;ðUf}íp.pïü¯Ër†ú̉ÿL~™¼Ä_åø³`?Vä¹ëäOJW&?Y¤úø.A¬s>%ÎIÝÓe²Öˆy? î Q‰1á‚ÐaúÔ +`á…ý.{e½¸IµçWߨvªªžn„J2!(û{è» ?*›œ©r¦ª0/ ×YÇ».'eŽ¡W~ùËÄÄ™a”m!˜Z•wJíS´ý*TÂj)L}QjªŒÃ“R‘±ôs#Sóª=¾i‘Å+ë–A3cšŠ^¿%þ)§’`?ÉvÆ‹bÁö¦KÇ^/jSÇlŠúN„âTl^ÕÉŒª˜h.Fð@/}áIŸÿ¢ù‘ò´¶}A •"¥À‚’^ÎÍ3h–öœï‹<©ûÌDÞ_'íù%nrâ!'ú¬LZ ?)á´8C«³´gN6 0|½â1'ÞOª;jF(rï ÏÉjÒŸ)Û¤l†òÌ Ymh2­Z3ñº¸ü>­«ÙÈîPà>ú„ñŸ±üÏ•~†ÙÔ+ÿéÎÿ?é\ÿÂx‰ß¤ø¿.lÙ,¾{,ª?sA0OBIðåXöóYí'|¶ÔÏnןÝ?C…þµï{ ¼ÄK”øçmÜ(Ëi÷w4u¾¨ÁêÆ¶~NJh„ÓÁn˜ S[ Ó”™bÆ™¢=·i…½uÅ_¿¶.þaoI{»4Úýc¦iàq¯¥aaî©HžÔÁ:'æp+,Öï¹ï3¾p4TLçÿ¬†÷_`|‚Û¥£]zDÝ©³^# TEùÄ9ëx±m3ª\+'LÛ¥uO'ƒ¯,°¹¶ý¨Y)ÚTc°³oã-)kZKƇn¾CucCv(]gI›'£É°Û3·±ä{ðž¸i̧ xGÒgûf©˜T ŠQ)ñÛq%¦?EÅ{ãZd<µ/KTV £½p½qhv…îØŸ>Û¾ô8Döc™Œ”Ö¬NÙŒÑbfšLi–Áu<%°ÏáÁ 笙s s3BšÆñúMà·~¯å«ß¾aqÛpú”ùæ&î>õœögêJI“aχœqšY”ñŸbÒ°›ZLŨµIÍþ»Ñ i7Kxu+ôÇi°wQÁvã™r ëL 7”â=:O^ßxó쨂£] ž®ºáT5ÓÑŒhæ#S‘òœõùMY'Ì~Qß)„]ÑÙ]7-}}"â–Û¹LJ IÂHÍŠ^:øóz9…-Ýý4ëöϯõ´¼{g*R²çÍÅ@, Ê6e½„sÒ?›{ýya:3 h.ÝÓ^ €—ø¡ÄÿóÖ–é3ÿ¹óïJïKç~. Âç2Ÿu”²œ;ýs>»ÿÏK~‰—øËІ'¹Úֈϒ†™P6kJ“Ÿ<fŒÿ !šáCsಳñ΃ìŠIW.ª?Åè颼-O¨Ã*Ïü€±¼gUÖS²qØi!àRºq˜Cp,Äd¯ŽÑ)N˜Œ SjçpªŒN©\6,»ƒs¨K´ÎðÅu!÷b“ƒQÌüëç{s“­£§áí× +åýϦ!#’qµr„u–K3BÁW£AFœ73ªO{ÛÆµÀÊYâ^Õ™Ã1‘§È²%àµcÍË<¦L}¯|ùeµõüòN‡Ìj UPú³%0IÖº…ãÙºœÓ`æbÙÁÕçu­l>8Þï2 -èÊÛVµ°ÚxÎÓ}?E Ni+åp¶ýOT­PLŸ”CzÂMߨ´Ž¦qÜ=(Êé 륢£Ésê½ñº“Ò¦šÓÖ¦0³)ð"2Í"pûÖHÁ6ÅJĨ:KÐûœTiT9f¥K‰¦$o–\ñ{!ç‡Á7M™FLõÇ9È“´C±}t3Ë=b߯ºNY,¯¾tÜ}+|ØE¦dr¯ …Ç,$çpQY–©DŒ d\Êä˜ø!*›¢ý>¨) §LȰ(œ›/®áõŸ[ŽçóAy8&3« #?ÅL`„¶±Bæþ¤ÜÇÌ×ÞŽÏû£ÐÿA¤?%둇»‰¡ MÖ”í®keêa<ç“d¦k§l®a{8”ï¢ðºqüø÷«Í-)EUÄŸ!9u™ÇCFt".ÉòÊsË |h ÚUE¨kr^rïVìr&5ŸXTzÆ™Rb()Ò?“ÛÔ‚Å7åƒP™·€ýþß1æ‚ ?H M¬hH3,’YÉG/¿SÒK7?+—÷wåR…XÚùómÕYíÇ^W±i.¤‡ü$y;dƒüOÓ€–¦ÏóIÁK’ÿ¿ 1ÃãæÎ~²å ùÉ¥S_­¾{¿üÏË10'ös‡ÿâ|Z–Dz ¿æñù@ýoß[â%þÚÇ_tsNŸwãs vØ4À?›ÀS÷ÿó"ÁR_ð¯Ñy P{S’‹¿€PÈÁøOÁû˳ξ̥2E¨°.5”×.¯å1u ¦ñÌ[Àò )ddg®Äebà DÈ‹°vŽ×Î09ÇQ„Éyjç‘q  4ÁS-–ˆóhìèO¦èòêëšþœéŽ‘œ”¡ÈP*Ö‰u@U )™2NN†A×’„„J µç¼Oøí>}ÊÄAéS"fëê¿ù"Ð.•iȼû6f$™Bw¶DÛœœשּׂì0žÃb ¡Òèh×5iRÚµ¥wïU°©C×Ã)™1[¨…V`¹á¢îsÚgû]3LSÆ9SйëÌyöjãp ºÞº—¬jã ÄÉ>K]ÿ¡Mó}¢$é"¬M 6hZåá£q b.r¨j_ŠˆAÍW T¦­”íZ9ÊØ›™–÷2éV«çúœçi‘oVö~i‚ÝbqGFµCMíe*j[ë¶i‚sVnjXmÓèIêi/Ê0€¦DUàX℺¶©Òúªí*à|ƒ„5çÔÒW- UΚù3š’áø ¦L‰1Çbæeÿ†ò»ëŒÛ¿$ù³ä¦s®˜rQ$ASQòy^dž’ÿ§‰€^H¿—®ÿsH>sï}ÖñGŸÈÀß•-¾úgwý‡Ò™ôO+üüEÇKqðÕãÿ¾±å 1!>‡[6¥Ã?û´³?@™È¿^öóÏ¡>ŸMþTÂÿëâ¿þ}o‘—økÿ<€Ïãyñ\:®*P ¬³>ÿSž­7U!/|¿¹ËwHhÊœŸ[r¯@í¬X˜qþóãóAîe†ýœ})(ì³<½~ùŽ\¨¿@‚ „{â ³/c!Bý 2ôFÒôÎ Š:$ëœ{OL‰¼Þ’ê–ºªÙ†Šuã9Ï û;4A4T0ö,)èN bJ3ÁC½0ÓaˆOÛFE0’kšà<)‹n^ÁÐ+§CbH´¶¯ªŽ÷™]L4NøéÛŒ8eÿI™Fë6ωDl›“²h„fa·oÞ:ÎGû;'Ó³¹ŠÎ”¦ø©Íø‘ŒóèsFc4³!gJNÎ9+Ué“*·bZøCùž¶xãmØF°Ž»–ܾò4Ká´Ïœv‰i ˆÑNîMk¡]Ÿ8çŒ/ÐŒm¥ÜÜxV[Çé üêÝľ€­×"¨*ïYÕŽå 2‡²ß¬‹A]ŸÒ\yÒÇ9™¢QV*Ëù•S¶‰Êµ·ÁáƒÐVVè-V6ùÙ J4•s“‹¢RRö%aŒIY?ù‘ÁÔîï’ñ@¢u²ÎáÏ'…ªr´­7–³k¬o~†»¿;Û}hƒ )c0R÷¢6¸Ü ?¹qh’zÚ…ãÕÊÝ·Êîœé§Ѥ>³‡¡A™°I‡/®àSÁúg¬X_7Â0q™,5Þ¤uks ¡ªXlZÂâ ï$0bû”"CÎÄívqáE Ì''ÆB잌eËY•P¦>.gú\ ?s!Pà?swŸÏ U-ɿ튳ŸÀs¥ŸYº3Ù }7©ŸeC/ÛþœË$ —d~†ñ¤r[yJôgÝÿÏͼþEÆKðÕcVý™É¿CgËYÿ.r¹–΅— ÀçžyùùA0'WŸ«Í€ÿÊ÷½E^â¯}üE‹7<ïð O\€Æ}— üœ <—çÎÉ{Y–øTyn6V Á ÖÚ&r1ÓKo¯ŸM ¼=ûI¹ÂqIø/ÓŒ™“Pî¿ð€à}q've=“îô"—b¢v²L–N¸GPïÙ…ŠìÞyꪦužÚ¶Î³Y ÁîO¤ñL»rÜ|¹áý§#§)SU°®¹+®ÉÍÂ6Öp¶ÄÖ7Ži‚«­0qTŽgë47¬Ðu™îœYÔ ^ñ^˜èG#:.ZE\f¿WÚVá|ÎgÃï7BŒÂØëÌåd¹¶ä­;*¾2¸ˆ2$#쮼‘5Wk+nÆ!sœ`ÕšS×Y‡µ ö»‡ÞùÍ•ðåO+>~ï>¤‹Äëf%´K+R‚Ó TYˆ°©…ÿn`è„û÷ ï#ÍÂÕo~ˆ£ç´<ÞMwfÒuîc4ì·8Á‹£ñæ)ЄÊóæGhC»qœŸ¾@ì3´jèωOG뜻”YVfD–£¹ǨT%a&äâgàEˆ®\/²­S©áê ·ozAˆÙ¼FµÂ/â8N™4e*„«ªH¤v6qéF/4^8$›-PÎùÉãã9·mã…«…ývãç¤\5°ª=Ñ{Ö•%š÷Ñà+¯*gP//Ô­ÉȦ)’QÎ'-ǹA´TaW„é÷YEø*̟¦1nP¨!xν£] ËÕ’¸|ÅsíaReœM»rºHoN¹È·ªwc!÷ªÎ…S*…‘ÉÏN±s5î_Ÿä=gÉø‰¬ðâÄü,ù§Ü7«ÍOË%+Ÿï›»ýÏ]~SzRÒg‰þœôÏξ“Ìçyq¹rœ/ÀKüUÙñ÷syÏál˹˜¹UûÝÛ— ÀœÈæ#ð§0ÿõ¯YoŽÙgà¿ú}o™—økÑÀüz3Éw†ÕΦ¹Ü>+žOæ×y†Ä1ÚîÜáÞ½/O˜U‚ò³"Á‹Åà'Y¸P^G4àf»gZv¾|ÖÖ#Ú‘jçðÞ!ʼnؗçɬ$B5»ÈÐÚ9–"dïðÞ[×ÚyÔW臭cíê<­K`{q8’³°Ü´´ëÌþã™þÔ3 ‰8™û®f›~,ׂ÷žOŸ2ÇYs¡q¦A?©I¡öE¶tå`{k¢Ç{eÌÙÈÐ cJ ÅMWÄÜ‹E„«7‘Šï"uHĤ¬×;:•q°fSÔˆîß)‹•%2ï>fKT‹*ŠIš:ÑAM]èfeÛo.š¢vjÇ›¯=ËMÀχ_(÷#‹ „Ê ¿‡cÆ£´•\ ×&LžµÏ¹¸;Z糖AÅœ/\ƒI'eŒ‰)F“cœ]Zn·í«šf±Ä¹ÌÃûÈé8"$š…Ð,Ÿ>)ËšbT¥loÇÇlŠáÐC š}?qè3]R6ª æ |Rî±×¸Âöç»h­1Å£”àœaŒ™…33³±Äyl:Òes V…:f¾X_~øô>sˆEbR•}ožÎç^á¢Fv TØvlË”nã Ôž JpÝ8ÖGßÛñØÔB³PG“W3[.…]­*M+EyŠ‹[t7Q¨òÂz㨚ŠóÞüļ¯Ù¾jI“°gKÞÜpšFNq,ø~HjŠWñBêM…›á’ø›Ãoœûdœ)9+.Û¾:½M-°Ÿ\ð;éÒV78—ðdŠ8gùs—~ž ¨³Ä‹á—uõ•bl¦³¬çw5ÿõ;¯c¯;ê¦Èö›Íï÷}u½/ñW5þí²¼ôûæÜ¡$è³îõÙí‹ hIàåõÙ~>WÚŸ“?‡}>!øœ<üw¾ï-ôm㟵ø')A<=å)©Ÿsë9ÑoÝSâÏ35  ™^¾+1êä)Ñ€’Ä»BæIQäR<Ì€ül}Õ'ÎAKyâ”×™„P={-_¤B½{’ u—¤ßä/ŹRDØô@½£.Ï«ý¬ äðÎã¼Ç‰Ã‹°qž¥3u™Æ{‚wÔuÅÕÛ'0 #§=4m$„Õ4&N»ÈþÁºˆÁ›òOU Ó$\Ý);rr ‚+†J§ÑdY–-\ߤ‹:ÎþÁáêš/~”X]gß™aUwŠ81ò8(C¯Ô5œG# ›\¤«F¨#ÝvG3뇈ÇTŽš¥àƒãá}&¥Äî”éUY8Gãà3=°¨½gÑÇ ¶­—Ê8 ªB»€fa˜í¡Sö†‹_zûmÇ êÄ<'J—½Áº¥‡¾àóÛzþ¼™f©üì.á“ǃ¶Ë@ÕU%ÜŸ”Óh™ße»ræTü ˆWš`Flû£cZ½ÙÓ N¦/•í S‚2)YBž&AœìÖ~}-|<˜Ï…d¨Tyucμc]‚M«¬®…4Zñ´ìsº cR¦h’³ÃøíX]·­ãÍmÍ·†’|žÔޤV¼Ø4ŽEcng+ïX—{•©KL³€3ùÞ·K“ªíÂP¼;–µpû…#„Šï-±–¬Tu`¹ T'Ežj}ÃiuEW ;‘ÓØÓM#CN|ReHÆiaÆî—Ä:–þ”2’ŸpýSÎø¬Lj÷Oåu ¾cÜ€©$ýzíÖöVÐRägAžÏ™—ÉAñ(™|ç"àÙ릢Œ5C|”ïâûáIÍçTî˜U~¾¯x)^â¯j|^Ìê>ŸOæÛsÌ÷Ï…üïÊ~>Ÿ?Çø·óËr>(>w¾È„–þ‹Ÿ“^â%þ’â/zðg½®`I¿”Î%O øóu/Dàg¡Y2ÔódF3K‚:÷]Àì¬EëüÂÀTsfH‘Oïm…ˆ\Š„M \©BÄ Uy/€¶àþçÉD(ɽ–Ž¿xKæM}ÈÙ÷uÅxË•B ¸ «çÈâh#¦‡µ¬œcðjn+ÏæÚCÊ Ýçi‰ÓÄ4Dâ˜ézSH ¡„!ø ¸à™&OÓZW½ª…ªvŸ2q´„d¹QSÊñíÊ“ÕQ·W_úS$ÇièÑ9ùŠ(>8®^™ÓÀ4*ﻘX©r»t,7BŒÊûOVlcÙ Ó T‘~5;®^[ç;ŽÊéIIy˜°iðª^),Vbê@g¸ÿ˜Rfµ€…nH¬—Ưp>±ÚØëüâWÊC—xí °;)ËÚDXm„ÕÖ3tÂãɪÍu0ò¦¯…ó)câ1’oVj…)+CRN¬+¼Å¶OëêMÑJ³^ˆï)+çÉÒee*Y»"ÛTŽºv´Áø!c¶cä*XG>F8 yÖì/Ó€DÊDôb´õ$ÁùÕ™/ðóëɳ.ý¥€ éw† ]j…jÖ'"p,ÉÜðÏÝÿi†•" xºO˜ÿï3^ €—ø«ÿNÁüÞÙÿ¼˜¡>s|¾žüïŸ'ÏçŸ9æDNpªòGÝ~w½™„ðR¼Ä÷ÿI çÿÏïŸ÷Ù  ä祫þŒ\Ö/ ÑK7Þ?{¾ŠA‰Â³Nÿ,óù¤~ž"¸'ÃኖÏèŸ=6C|Á0ù- θR”}f€\:ÿÁ=ù„YAh&?ƒ¹’ø_& ΊçÊÁ{*ç稜§ò…óÔÎ1ù@å<×b¤äÅD'Æ~À»3ç}ä|Ηm®¥ÐP S‹ŠNlÇr%Ä䈣pž´¸1›ŽýbiŸ©]:n¾p Žó^™Æ„Ì Gº£™O-V–@‹ƒœ„8)û¼fj¯´+8•ÇhßóG_x꺓(š­FÅaê8°®•}o‰Ùuå8&XÏríñÎgX¯í$ÞŸ2íÊ’æó!'%Töyúhû‚™PEÎEÛÌ™F•7×ÌK ?ÃãÇŒj¢€4ñxÊ“¹‹¶ Ǧu\½®HÑ'áq72³«>*AaÝ(Q…S§œj¸ÿ.ZG¸Áee½ô w©¼çt45¤CùîÉ0þKÛ¥ãØ›[s³0W‹õÚ>Ø… e½uœÏeºæAEyxL|'õF=ÿÑñWäc¼ÄK\âß*ËÏðsÔŸ‘|çàó‚`..Pþ9ñ_~v{ŽÏ“¡Kðkÿëä„^â%þ’âsxÚ?ïóÿ¬û…§ÎÕT.€»ÈU2›x=áW3ß…Íͯ‘(`P¨œu®‹ë¥û6'ùZ’+-~:Cx‚ÿ/Dd¹x8¡tô”‰_-1gVUë´‹*“Hq&°¤yRK¼E óžž C“ËÂpvæIàÔ”¤LuvñÇpÍ•z#%~AÄÑœKÓºaíZ›¤çÐM,‚)ùhRR´ÏWyaÌÊ!E8îÁûL³pÔ-Œ½ýâ¬cîÄèQZöw#çýDœ&‚·Ò¹LUC»”ËóÄ q€¡Z—ñÞ’ïî lÂêÆÑ,!§À4eè-ñß'G+çLß¿Wh3lÆ·É_ždPZÖ3ö{ÛÖ]Áe¦1Ó«°Ïö•ð¦…ã^y¼ÏÔÇ's‹u^ûÄØ+Ç£rÜAŸÆÌiß™aY4¸H]djÓÙGe 7ó¦ˆË¦¿â.l–¼|ý…M5ŽÊ/>&ÎÑÔz”M%çó•üš7(Ëù„2¿ÑËà%þªÄ_Æ þ¹“pý,9¯ž­³ãé¹spx–¼_”‚Êó¸Ü'Õ 4¿¾>{žsE¨,­cO!ð s–uîÉ­8Ì€'nÁ Gª±ÉÀ\TH‘ôå¹Î9’“‹«pU¼¼sb±8G•8ÄyœóZä¾ã\žqn–µm‘ýî@Žƒ´(PWŽfa°¾7‚iã­ãë½pŒVè´^È8T„NËbªuõÊŠ­¡ËxŸH)ƒ ÇL£²\›´çr .8Þ)Óh8Ês§´ 4«–Ç“'©²Ô‰×_+CÇÇhζ(› ŒÄI/ÅÇ,,ƒ#l® g'eo¸m§Ê1e–š•g}íXm8–-Œ#$)²§ z”ÿ{_wÇtÿÿ>3s—gÏ*"D,Š„Æ®–j+M©´¤Z{(EU”¢µô‡RŠ¢UUK©%µ±/µÆ[¾!dCö'Ïzï™óûãœÏ̹ŸgÎsŸØ’pÞ¯×}æ™™3gÖ;÷óùœ÷çýé%‚®Ët”yH¶z3甕s”õÜìkó!ðñ‡jÔ$ð6üZÖÙ‚R·‡¯·¡µµKî±D9’X½YUóýh~„ÖR„’TQèí9/VÕÕ°T­uúÙ„¢*5VæaÉB`i9Fà{ˆ5G¯A«þsZ|À/bÀ þèlkòö’’¨ÐÐàC4´ £ß „QˆŽ8ÒEª¤Aç‰Tñ9™R¥B©*ñ†:ªOQûX«ùPD?Òt HWî 4ï?­|¬¡ ?Ôm­Ó²„º£÷XqÿIñ‡œÊ5ð‘öGÊ@ôþ¡ˆ=N”ÏŸ~þc©F€4€'ÒèÃ6êúyÂEúVvÜ¢§\u³ ¿06Ç™F(ò_Ñ\ÿÄ齑=ÿä—Ÿ<…f-7DòB”mL“Ü÷@:uE²VôtøÊãÓ8Ë«BAÔ@æj ©|(W J$=µ!™Ò‰ÌD^ uÒÿ׆õ0€•$jnKëQ )„æô+£ßƒ@àéJÅ Ê’¢ ùP†9ɘzz€äCÍGÀžRÒ ÂB; ïÁó}‚ŽýDªTɘªâdð<ÂÓˆv4„@‹ðÐ(xJËÄ‘D¾NµëêRF?)²Èè®”¡’— ºŠp}C’)¡Ê¤K©4Ô»$‚\ ,3Ĩ”"D•ÝŠ†ÔÐEï‘@¥»‚R7 =‰bA ˆ¤OøžD}]a)†ç«DXŠ®ªR#i2WÊ@%èÒïÚ@ õ´w+ÉÆý E*õ.uåbe­E¡ªmÐÕ&ÑFXV !+!â(†W®`iIÝ¡’Y‰c‰þuýš<´·KttÅ(ÇjÔ§K‡}ÏóÐI¡ =ƒtûfOQg¨°ÑF¨ß‘r¬ŒçÆ•Ÿ1k~„¥Ð¥Ÿ÷‚@U9–JʼnèrRMžâÜl 0h@â8Æ‚%ÝX¨‹ƒåõw-'U"w%”èìŽÓH_Uþ-æ¡haÝ1JPNb2"Ëd$@jG5ö|_ ÉX}`€úÆz¬±î@4 jFgkÇèlë¢;Pñ ¥?:s”¤D¥RF%ª(µ'Ò@%RÿG:zOF~läŠC9ÖÜ|*æ¥è?ÐÛÅšã#™7fF>éõÊЉc “H>ŒeÔ>¡IÀ‘4øÿHïYbô£ÚA ¨~Âù7(>H•†>Å{ùÓ€Faà°²ã&=å¢<|ô*_ÃÈ¡‘² 逦Ú ðH?9´œ'%t–Ôtо‚øäNñü=Q;ZEQwúIŒw¤ ¿DʱÈ?ÿf5aÊ7 íEÆIPO׈E*#*cMÉuÖùt\žRùñ´ci9 T±XèžÎ  u±ç¡N+AxÚ T9Oå䩺°¯ ûÀS# AâLíxI‚ª:ìéäd%Z¾*bæùhjÔ¡¡ÁC,c”Ú;P¬‹Ð¶4F¡¨"éu *¹³³]$ ¨¥.ú& »Si¯×5­1ü@WUÎQ#_”ɵ.u”G!º:%Ú—Æ€èŒc´›•+!‘Ë{èlÓÒ„‡|QõV€e‹%r9‰îN‰î(FNMHr –µ©äÍúœzŸy‰°à €J·âÙ—»$D Ñ^Q£94µ¨dáÊQ„°½¿¢xâ#7jF}S#>x{>Þù¨„8TFe¤:OšÎ¥¸édE ´äÂH¢#RT&åä…’%-x‘âÜwIõcÕ_Û}tJ¹m!:#Å»—RUÎõPçÃê|¼Ò)u¤#[ žš/èç¢àC"¡”¥ÈK­¤ä ätŽRE]Ÿ5Z|¬¹NkŽ„\±óf´aÖ¼6,ü°–"4Æ@¨blÊihÎyXkÍz…Š9Ô5ø€(¨ï´È¡=®CEø(ªèÑÍÝ—qRP+†*Nmü—´§TŸr¬(=^LÚþj}¬£ú1õ† ñn¥¥‰Š6æcŒÁÐäׯ¤-s õ;M}ÐÈE IÎ3¡!uÊLÕ 5üÕÈEjÜ“ñoFù©hMÍ}®h˜†ÓJrHVü]O)@OÁ _‡ŽÏ§ª@lûm_¢ö7±B`<¹—"ý>þ§ÒÂdèKFý!Ðö]z®è+é𕹛vóÅûäýûÌÈ‹´°% ›Ñ}Rñ1Š'ç%Œ}“@ƒTtÌlPea(! ­ýBò µ!Q]§ €ÎCÐÉÄŠjä% ÄBGP)QÏCA¯—:18ð<ÉÐó¾©6d¬S‰Ä*ØßGà©ÄJ!” „rš|Íy5êàÅ¢J¹ D  øæ8K‰8©‚¯ t•´+K8”¨”c”»%êúáݹK1YEîRéçJJ³ÅSÑØ‚@Iœ¶ë,ÍH//Åi¢'彄R,‹R IHöÓà«È(ÓïJ¬¿Ëuè+êš(DzéˆE>P•€ër ±„ÐI4Ä9/æ=4ç%ñ)xA€\!‡†:æEtw>¤WDW]#Jž‡HJt†Ä•2ºbUyW%»Fq¬çS£Z†“ôùËÄã׉»Ðó©c}Ë$ש¹÷ä<¢NlíÚJ'£Ÿæ+úw7¡ÿè IqHÆ"©é{¨‹+É`ׯ<Ñht $S¿[×G hÿÊ¢äc¢7£ˆ®sVÜ §›r€æMu³,9ŸoÕÏ9—ó¤È=7ôye1Rý‰X²/Elb#¤C¯°KêàP/Ê è©‡6ZDš÷2òP­ñè(>Œ`Ô§aØ#uˆË¯‰4O@C s|­WSµ½™;À Œ‰$ÁzRòI&TæÊQ½§;ô´±$#J4Êp%IQßKè<_øê)X·ÉH¯k <9 Ø äTzb¥;„”ªr®ïmJî2¬¨ÚJ·¢nxˆäT!dÕ¨gX‘²€Ø÷Q_ŒP¯õös9 /ðе¬ŒÅ—‡1Ú»"t”#T" ?ŠàŪ@¤D»Tü}2Ò Ð2Œš^A”)îX"Ô•yƒðc‰R…’C•¡çÇ*²^ÑI¾±¢Œ”¥ÁÛO0/_¾1PªP‹JJ&ÅÕoªW¹>bý<(UœîPå,-«OƒPÆd{”>·Íú!]¨ ~J6ïˆÕ‡€FýÀ®é-y•S°4–„ÊÀ­Êa.zÍ >„ï% PzÀ¨÷Óg1òêM+:±×ÓUy!%¼X¢D|,ÒîTßU‘yªºK¼~Eó‰ô(€€LÔyÌÂ[æo3õ/`í(7©\§‡Ôðç•b9ß‹¾~®ãŒuü½—Ô#ú„Öy–¡ŸµœßÊèÐ8|ùAød”Y»„¹£§¼n­§ï&©…Ô1Wó!JüFùéAýa;ô‰ÿÇÈÁaeÃçIÊê“’àL'€Ž!€N§B`”P‰«#ý´iÏÜŸ9_ÖF ë ¡ö ¨J²ZêR$šáTàJjúLjá/‰‚!Rǃ~(c¡äI+1Q‚T?ª2©ŽúKá¡à „ÒCÇŠÿ«è½På ¥–âÐ-%‚XñFb#o ymì \% C"ÏCwìÁ¯xˆº€:Há£(ä=EÝi¨Zʈ£J%´/‰†!+YÉJ$Ñ^VQöJ«†ÀC÷G!ÊÝPñP))Jê$dw åîùBˆ¶ÎQW„ \¢]Ú(‘â'IœÚØ[¦ïŸ L¡¶BâX…ò"•\ö€!PÌûè®DX* ̲”Øáëuhk1cvåõBE‡z8„@G¬ôø»"¥ØFÊÐî–@IttFhÉy*ªpWN×èÔ–c)VU\+HלTý4x@ƒÎ¡ ¥.Ä%”–¾EóCê},íŠ0§¤¨)èÚžr yÝ•ó»"DˆPï ÔANÕ¥Èm¥ðúI Å¨x€—óÐìÈçs(6Ô£±©­aËb‰NH,¬@v%‰»‘®5AÕn©Š.EæÃXjMj¾»Šæ“eË”¾S$2àDZÉÑÛã"V×3‰ðmŒqM2GÔ¶†‚Ì|]˜ F4_¦T“Û_å"5z+šâcæ>QðÁü]÷jÊY†t2“ñÞ¤þÌü+Ïh°¼F¹ìã2gü;|Ñ Õú=çv4/ÐKß NŠ-í’\ž;…NÖkê›u½Ç˜}3)òOÓÄÐ{$‚–—ôò"³pò +8·þ³îÛ’•ÆÿRµ DM©N®•DÑ(‘˜ “™*£ã1)@JÞÓ3òÔ(‚:Ô‡HùHÚz‚ƒ©.@š?ÝGžª:–$ú’²Ô#JNTU:êïkçćÐÅÍtb³.>F}Àó÷”ºç)‰Q’¡ yú¼iä@¢@}.FÆhì#ËèZÖ…°\A‹QêJ]Q”ôhCà¥J OË= ļ‹––ÑEÈ…r"Fg)Bw£;”¨D*QÕ‡zÉ·F*ù“¢ýTY5”*Úß)ó Š.ƒH¢è äŠ>êsžièŒÐÆÉ»7g<ä¸Ñ´¨Õ{(©´]šÆSÐ45¡ ¯ù@.§“¸=ŽrŒîr„€:dY9F—Îð==* Õ9–´á_Žõ³å xP•‚‹žJ¨tDº¥1@cSåÎ’ªÿ /Ƽ‡bQ`µ5ëо,‡eÝhï,¡…œ‡¢ï!—P×T/àë¢\­B`1%éÆº€V _R´;V\{Z¦?Ǩ ­’›D÷©?âêK#j™PvB]>7ÙÚ)«ÕzÊÚ2§íÌŠ½”ÌKÛEU” ŠÆ§É¼Ia.ŠþS¤]1_–”_ AQC£½“è6[™ z°>mðk¼„Dö͈ïíØV6PÁ/>BEÓ$˜ÙÛü{U+ðž8Dù¡ˆ ”ª7 PrhÄ@xÕí¨Ô0§Q;ç8¬*ø¬[?IôŸ5(êäàœ§Œ'atBÆ>9,æ<Ñ‚TÂnµS! œ€H·#ÉE¢e­ÇóSG€ê áxóž> _hõ=%ú‘¯Ûù:¢ŸPŒ’ \‘hÿK!Pô· ]%U ÐóPÒÏT(êV©¬T…ÚÊJ&µ^St‚@ «—TœíŽ$< ä•ôë € RÕb•A›‡@>PQxhÌyhÊ{ÜœƒçX*=äJe}…º¢P9Hƒ‡4£"s(ÇÝBI¿–!ÑÇèˆcäc‰º8F«”èÐ ¸‘T‘÷T>SýdÒr¤Z”þ²’¶¿ý§á5 ÊÊR%\S’nZ¬KÿPË”š#b©¢|¦Zqÿã4‘ ­ÿt4@â@H(CÝŒø ¤ºHÙ‰ŽÁÐ#É eµ¡o⋌„›#YX^ZNòždû°­spXø·žró˜³øH?‡Ú–lGÀûª°Äí´ËQêÒ3ׂS‚xA0J &Ïžäœ<¨Ãª€Ï3O ëLJœú! Dš(L•…Í¡ø„J¤#ÿ¤¾B´!3¯@ u ̉g8 ¤þC#ž¦D¤#$šÊ‹R]€@W0¦ätÔ^@qÙ}m´æôˆIŠzZHåIˆÄ‰ šªZ†œP’¥9á¡à „I!3YPÇG# Âóày><áiEUoÀÓûÔ…SÕ’E𫑬’ɈI ? B gÜ7€Gðd„(ŒVÊXÜÙ…ÎŽn ŽEŠBRªD‘’‡¬h.ñ¦»µ¡éå¾”(I}/x@}ÎCC Ð*k®;”h¯ÄŠ·ï 4 õðI¥ÔÓÒP@•ÑÝ¢«h cÔ{í¾J–]{µÖݨq$0ç½ –µWPêV#C‡çP¬÷ðÚ+]XЩ\@y£1¢X"'Uĺª¤æ¢/’û\:vª/!âtt*J¹§à«bqÒS¼õJ9F¬µÿ¡*ò6×PßX‡@ýú·  …‡2€% ê´±’‚#DQ¨ŠmEºâXsóÕ=ÃHÉfjG­¢)?=" ã8©†Ý¥#ûT¬Kè}…Hï™.!¡"æF.QmÔh]‘G½Oб ñcÃÈ×´\«~V­}™Êpr*0–…Ò.ÏiN勬¯Ìèíœà°²áV=å‘û€-÷jôCvvÝÖN<Ø_=÷Eñ·EòÛ[«×Eˆ"ü¶JÀ´¼Tª>ÊR¦d†C¾˜ëëà°Ü ã™ÿ(~^t!s¿f$,H"ëéþ­°"znKÝ‚0F:÷&¥(1pE*÷é{J)†ª h ý?tT_:á7 €á@¤T#庢°Þ&”D¬U†ˆæCI½‰D¨Hª«ÑOïKù"­Rìû)=ÈӣРAôR£ëCçî‘D²NBQn’¢kúø<)ued!•DgNä T2¦ŒQ:HD•2ººKèì*¡­£•X"Žï^Æ*¢[Ž(¦è².ÔEêë|Y÷J¡DÎÚ*JéGhiô<øQ߈|±_Jt-ë@Á“ž„ïK´·GXÚVA)–=†¼‡\ÎG]!†¼@}ƒDE(•btwGh[¡µ;Bg(QÖÆ}}ÎCÎ誨b!G}ŸcmMùÐêBÚ(iç4ð=}uÿs¾:ÏŠy䊛9„AÝ(hÕ§X'‡wAkãCëïÇQ¢w_‰# Š”tj¬T–Bí|QѬ0ލDJfUÓÚÐô™Hsþ…L#éTp+É¥ÑßbïPÛ$ʧçŠõ³Å)_hšOÂÛ•€Ô‰=*ò/«¢ø¦g,SšÍÓñ˜‘ü’>2L™ÎY…÷óB­síà°¢p£žòB_4PdË©NWboGÕë¹¶}¢øèjj©ÿAOÀˆcä1Ç KW °ÕàƘD‰‘SrXðyúæPvo?Àib%%RfŸ9lž×ÆIÁSËr^š@£aÀC ºp™Ð#Rªï¹Ð†¼0‹‰ C-ÕµHiæˆþŸ è¢`š–$rÚèB(®º¨vhgž¡:”Óˆ©²«¯eKdl¥£ižƒâ+KŠª3›/N!DbÈÑý’4B"ɈWŽW*Ø‘Bk!CU;;y©¢þBÓO*aª‚^Qg õùårQ%DJtWb5ä©d\OªPh.CÑGgëR*r]„ZH‰\ÎC]!®Šrb-™£sÔ•‚}O ).» K'ˆç}¡?ªàqÛc­ïI‰‚/Ð\—Cœxú77"hlB]CEð,ƒ’Q&Ž•æ}¤8ð*:ºH•„c¡’*m”z1U&6’‹éE¤ÿõÿª²°^&$<© šÅ*ÚÔ#´XY(JÔÒ¡±æx íDHiLHF e¼{HqiD@ù)+ù€2©„@ Åo‘Vp퀢0© V)«*íÒ½õ¤D@.–¨‡r ¾ÑÜ€NÏC¡±õžá+·M §+ÅV¾¯Þ®•(†,•ÑO¹|±ï¡««[Ñp^©d[ßGÿB€RwE9“¡R%*u—‘óòuÄB \ ‘ sdÁa£®¾ˆ|!P¨ºBƈ…ª÷<,:eŒN¨Äê)ÑG@%Ö#&JöTÆqz-EjÜVbUÁƒr¨¤1¢¤UºŸ b[±L hU´Öe¤û¯DŠ~ëº å(†$YL£=Qd¤vˆ"u'^=t®ñøc©j9@¨%¢ýA)D*{Êéy”ˆKôúþÓ5 g„ |¢ý™ýô¿ùPÏtI«õP^Ç|Y û°¼VTß\÷%¼D«("Ϲÿ=h'$AD¶œF ,üþ<¶º¦&²È}2O„ÙÀëppG€~@é脉ôãÏ÷:;8|¦–eôãÒ×?µ33°ÍE}q<y=Y­¾h¤ ¿Ç/U"z/I±™{`´5 y:F¢ähfGª¤‰ÍèB¸1F ¡"õ9è6:‰8&=)M*&ñÎóÕHƒ§hA±ÊVÖÇ.tŽ„LF y:NÓðu§IÞRg+BZ95 >;©ÅH™ü¾Þ¯ÊRT‹êKË„6v•~¿D‹”èô$U<Ö ÑRWI|u¾‡~žÀ2ÏKÔu`¨¾ÆË¤D—ÈCÝÇnM-*êkáCS°<M©@Àú¼Š:¡µ]Ø …@§ç¡¢ëT¤LÐ@xhÐ#ÝÆsJ´˜²6œ}O$úõžDâL*§•ê¨ùX+ïÐÐx¤ïÝ—Xª>¨¨Vw¨ê+T´3GªÖBIgÑÆš‹S‘R%ǪÞA$%„ž’# ¤úÝJTzb™“ÕP'X¢Ë‘1!¥—‘9Ñæ÷X&×Gmj'zûJœ^Có»Íßæ ðùýÔeЇwB>ô¥kÙwX™Aœ çŽi ùz5å‘®ÖÉ;d§›êpCž7H:¤¡&Êå@“j´cv"¶wG­¤‡UËcøúR±Ø6T]«?ÒÒRŠ@Y'dvFŠþQ‘éÔiô_èrÉ~Ì#船A_ò 4ë…”ˆ<ýÖÑÿ –ˆŒ<!e’Ü ä=U´JËü«Bd4"!$|”´ ]Ÿ –šã”AHDq¢N”K£yVØL-Õïž„TÝ÷‘R/èw€8â2%!§#Ý¿L8ÜtŠ+}xR¿‰¥Ê (é:ð5ÍHK#µ#O]qŒVOè;×9PýP¢ê2¤k:.™ôIy :jNíBM‰Ñbòˆc‰ÅR¢¨J>¯ Uñ´zž JŸPŸp¨©8±”‰+»Ð)¶Q¬¹úúzJ} Ȫ"V>Ôs%¡ò1*ú8ÃXEú#£Â. ë,h?áÒk}H4›8Uð‰b™Ôd u2N“o)O¼zŠÆ“æ~(µœ*”O‘ókNÛs£½½·Áçí§c¥G=’é±Ç²gnÒçiü÷Yv‡ãú;¬,ȱï~"ÓÍí4±@<úq¹zžçò&j1›b õ] î2iáèØ ¾¾Ì¾aœßÌ¿€|Dà‡ŸãEwpø¬ðyåØöµ·€F>´T©øÈk%$OÓ`('®„:6R£‰ŠQ¬G]<)Ñ‘8z‘ŽæSîQl"Í——ÐÇJIÔTÂ|6¥º©>åhè£RQõXÉŠßïkGÂ×¹Te6Œcø:WÂÓÇEŽˆâ¹«{A]#Jâ%ªNǵ?ièG:y—ä7e¬”˜T{èj¿J‰H åüG†Ñ_‘ÿ^¦Î¯Éѯèv¦#Ài~ü·ÏóïìÊsDQó&(ÐðESŽzÛpXA:ÿyã{e‚àÉ`ç”{à}Ú_Э9þ1kH¿w±¶È­Ü#æ‘$S½Ò ¡\N ¢åÄ…Ò#èüL.·ƒÃ§GÖro?èŸ5¸óLƦÉ5¶5CæèÑxʨD)e(Њ@T ï¥ÛùÚp¦ÝÁ“)UˆŽ¤FËP°¤Ô‘\Ož¾”B©µü„(ƒœ™Ju'Ù)Eì©íTÄPxE' !«"•ÊIIa,óR š®5ñÎi×"‚€€Jp­Ä©1J'QR±¤‘­#ÓÑ’Wõj•L£| á‡@Ù‹•Õ3¨õ9¡ôþsèÒF»Ð‡àA&ÅÖȈ&e%x"-,¥Ï5RÓQ”Ñ]ŽUmª5!„®› ¯©Q¥ŽxÊŠèkŠÑ{¢8NG4Tå8Pþ,Qv„M’d°ë /þ~€rôýñ5µGI|j%Á¥ÎaÑçG›¡Qp ×?ý΄0ä5eªµo&ß’±ŸÐfçÉT›ÊrⳌRÉþÿ"ƒ tÜ‚íÔÌ7¢Q Ÿ§ño~??Énœáï°¢Av-}­l…»rdðë\\bàÐ÷‘øœòËHê}‰ÿ6&‚Ò‘âî{¬ÒX2äÀrLi2 ç—ÍcË©]ÀÖ c}à Ïôò;|ÕðyóP³ðyÿPÛ~MG„ÿoþx¦—ÕÇJmH†Ö‘qGɺô]¥ƒ¼H•‰h[³ŽI’jJ½÷EµÔ©'|_$kißI¢3ÀH€¦ƒ×ªD¾Pï@Gö!ª˜Dç_¤Ž ;³Ð"êýDßªŠ§RêÌaˆ•ÐõÔ†ZM‡"Ðæ½ñtb¯ï©s$ƒ:ï „Pð=ä}­¥´ÐåZ$tM±QÇ«ökƒÔs*ú¸U€‡ˆ=KÝ&­T«F)BíÔøBõyßà÷*2.¤ç)®?9‘TÒ§‘>}º¾ð¢8©é|¼L%Ec-— A¬¤V RÃÚ1´Ór ”óP¡Ê¹ºö‚ÔQÿ(–z„ I…a¡£÷Ò8F’Ö$~¾Ô߅θZ[_"ý 4Þ¬$ÿ•)²ßjUãåø""ÿYï³¾Ž¬ ×ÜáËÛõÔt¢Í)¡ÈìnB® ¦¼/ê¹CÀ†„â¯ûHî3ñô†ôÞ©¹E™OôCÙ‰PN‚™¬¤rŸô#ar†žóK* ÑËæ–wÁá+ƒÁCåÏðg92P«>JÕ>¶¬#CÛÔOö+ª#â@šxZF-씩qŸéQƒcßÔ—Ÿô(VÒ/9jÿj :>råøSr&ñ™¥HUW¨š1É_Û‡Š8ÇBïi„2ô›çH”ŠÈS4˜dO…HUpÔ(ˆ2ö¥ïÁ“Ý2F‰*ª§£ïª¼Šr“!«T™HöóiΓöˆ4Á˜F](ºŸÓ Á/Í ^…€®_¢M#:Oû©ñNÒ£fa/R2oF’À¨uüsB$ô$#ÊA¡è$0xîRïW#©Ê4+EèI‚Õ¬Öj:Q9in€0’(…€ïž/÷„V6RÇŸ8,T¡Yç DPžŠ®bi‹YBÕk k‘Á­•–|³îÍ+"š’L`#ã¦Ä"­A÷r0*Ú@÷u;rP’QbHÈH'rkË‘’Ž…PN€0î%d*™Dèµe]ÑÔºw©Ch“Ã%IgßPé!Ã>‘–ÕÏZ$•¤fÉø™mLŸõŸÆ_FˆÇß—3'àÓŽÔz_ÙÞw+úz98ÔÂ?ôÔ&vC*˜ÖŽžýo_ýåm³¼Çaþàšý„25¸Ìe¤8•+@#Ò¸¦Ño^Ÿ’þߤ ýOŽF#IŠ’œ›L“{•ᮬ–NAÉ»©aîëh|,‰¿.µ“„%S˜P²w¢a$ ¤Úõ&<¡+RV;;ŠÎ“vPÒQ}ó½FQ¥!ÑMüýH¢[Gßcí)©U•ð ¨_Ÿ°†Ã¡Ï­$ÐtTµÚT3Ö*<ž¦êШŽÊ+ =ÿÔØ&z)/™2˜\y¢ºÚ19r1´#¦é\¥XI¥–ˆË¯=1úÝ!ºŽùóRuBãÞ•YD? j1Ç€žI›k‹èSŸËSófeøyëÁKf#æwAZ¶ù,ϵ·QZ¾2\7ŽuPý|òšÚ €Ñ»)ä/ef>þ$ÂCö6/êÓöwª«RXÕoÐñ‚YÜ} gIã˜-O’Šuƒ€%=Ã`z6‹%p/)ìà°’ÿ }ÒáëÏûÍcêíxÌè»ìe½Ù/QKˆJXôR‡€¢‹†Ü(T™èæ‹1’*âiN¾D*[*F¤iÄ qôÁ™t!Ê)¨ÎKÊ¢0о¥qLd`šŽQˆÈàô±…²Úi1G<èšy"=nÊ¥ Q”P¦ç›˜õ€œ %Ê‘VBêˆQíˆô|ɉðT…e©¹¢B$ÆvœX{ҠݤFµ™Ëá„y}è~Ò=I¤X ƒŸTuˆ%D# t?á±g’FJ vô±UdzŸÉ°Oî »ÏÔž¤ªËqõóÌ£ødô“ƒHçÅŸùZƧ3P{by¯GoÆÿ'éÏÁá‹À50)®=ŸWN©§y €Gl=_ÎóÔý“#@óþœœc{àê!ÜðçI¾\= çU·K²”iÖ«Þž Ê~< A[E*2ö*/™æà°¡¯_Xà“aóIø¸#Òcˆ0c™Dö/ÿqNxûH ²iÌØŸi¾º€™„R$âŽËdD’4©IÓ´ç’$?Çg_£uÐ}™½”i5eSúÑÕ£YõLcÒ4ôé:½Ô™Iè0ìúÓ¶B~”£8¹÷e}ligJŽ&ƒHë6ê],#¥0$#•×@£ ©Ú)Ó´j-qÝã™÷\襀ŽéˆñOç\uسH÷ /R§-I®%š‰î¯,Õ(E·vROÕµ çÎì—?»fdŸ÷軕ü˜Êê~zs†9Ìçõ³4RMzÎÊ\é·Ö{fyúÉzßô†!Iêà›@½GóHß§@OüÇokg òïSlÙŽÀ•ÉUë›t[~ ä'É26^†&<öíL z½GÒ/¥ìãdƒÉQ{šúyÍó5Žc^ ü¨õÓÝ ‡Ïü‹i3økm¿¢Ž›co†K­¨óÒ²½´ôiFêÍå4o×´<Õ†9íŸÖ'‰¼ÆæDå-z@·~ï”ât”¢§ý“a¹<׋–ÑhE_r^õ§Ñ 2T“*ɨvr‡I7¬èc-ÅéJÑKmªôlŽ8øÆ1мÁ§ã/Ë´2mW Ôé"muBí×ÌaÆq•õ6ô1¯+]ºDÍñEOG© ª OIã‚ÊXC96ä7ÉnŸÔðîëóúiñIœ=ÇfA±•Áàý"Á8¬Œ¸©ä'ÐÓð'p{›YÚñ)A²ílûã#IíîË[)`ÉüíeÛ.I:ÐgÊå’P³ÂE ç¢Pô‹=+@›žê‚ƒÃJÁþ'£Êf(÷¶ýŠ@–‘eØfET³¶ÒH0ïÃv-LêOÖ:aôK}ÆPFc)NÐDI†Qu$ÛÖ‘hª osÛDÖT J )Ëà43¢\Õ/ƒªw"ôy“ ¼@TG¬i])N—S’q %QIÇ@#/T¬öAÎI´R´”oºãêeR_è4NšGÅÍ×zW¨úè ¨­ñoûŸœ¹/_Äî²(X+ ÆBEýé}g£èppÃ= té)wt¥¥_¾rèw5¡ñ2ðú‘ÕS$>)F!vfdÈçuZs¢2ÄÚǬÞ@2‚ ªÛ'ò¤Z˜Û€w+À>Z®ûãàà³qƒ kÞħáÀ~^èMõÃıF{‹Š›×Ä4žŽ’ÉÛÎZo=Æm²å¡Qe9A}ÝŽ§™HÙÛµ3‘u¬Y÷‚hTd¿žGÚƒŒ‹erø³4ì{;Gê—FoLã;ëûúLó¶4‚ÀѶ-_ zþ€šÏœm¤Êv¾+:êÌŸ! :¿æ‹tVôµppX‘Ø@ÀP‘ó÷ H¿<ÒOf3§Ðûl¹"±)þ|?\­3©åÓCnˆ ~Ù§è+F yŠð'Ìô™i½#^A˜’€#ÛÈ‚gP´0Ð~8X÷;JCj½(Ë»þ…ç.oÓבÞßçq}LãÞÏø_ôaçtŒ¾è©:`žc–ó•5玭çÆ%¿¦}MÖ48ÎûëMÇ„ïßv.Yç‘Px2¶7G HÇÞÍrZ8×™ c³/R2÷kJ\šçÎùÖµF9²®-õÉ×õvܶ{È÷m:)Y#m½Î˜Ó tË•Áà5ÏÙ¼Ž&Õí‹*ÎåàðUÆAEÿé½[­EäÇš ZÖóíùv=F Aÿ“¨ò6ØéeÉnÀSò®¯·¯è1ö¤¢0ª÷“$úÉê~=ìëèM^í«XŸ®&€_æGÀÈeÀœnà7"àPY4 ¾þÓ¢ÖÀ'ÙÏçápÊ 7¦©è–è£1A`âþ›û0éY× /ÎïCfL{s²jÝwó¾ñ—27Ôû¾?S!'Ë1áÑsÓÐÍr:l×T°>lçŒ6Y÷Ǽ&YÑ}N ³Ñd¸S•u z‹Òóó5+S÷v~@5íH Í]?å~EÐQèûÅ+z›ò¸+C>€ƒÃ—Ûh„ÒïRJ‰”õþzFì œËÏe÷ùû²‡øŽž†¬_aé/ö™ngRp€m‘8zEø™!Ï9þ¼41˜Áï1 „æ‹i{ᥔ"ÏW}å Àp8y0ðÌç8T#ëÇyy©Ÿd¶vYX:Á'¥ô¦¦ùÿòÐ Lc„è'Yœ|ó¥Å#º©t&°|Æ Eϳî»7ù½JÔ7h³µ‡Ü|Ag9ëÈÿŠáø´ QËÏãz88ì €&T¿ÿM@¢§ÜgÈæù÷ÊVX—¯X4Or£|d€; ‰ PQÜôeá\þ¤´0P˜Ý>&ƒÞ¯^žè²3µå@²¡Äýòª?PÓ ‡ÔjÀ#G/t€CŠ,£ÅÄgñãÆ÷Q‹nòEœóòž[­B–Ëkü›ûæ œ[âj-)+ªŸµ/%¦·sÎÚþ³mY^ŠS_Ö>BµA˜E‡‘5úí‹3b;~þŒñçß\f;³=<Ï¡7£ß֗Ͳ!ÎègyðE9ðf^Îç,'hUq¨º´3þ>Œ0=óÜ!0—› ˆ=%íÖ*üeAÈ¢yfõÃ)F-I† ™Ë xɨ@62.9In#;%r l>)ØãWo'ô rÚ(èHXò9!/l6øËÀKK€«ß…ƒÃ ÁÊðÛóI8÷}50lÆ•Iù‘l¹JdÒRl£üU“¡¶Ñ~–ç\zãè×BoΆmÝ'¡Š$/rc´…¢ÿüzôÅhæ£,êNg^7žH݃›*ÓJÇt¿¹Œe(íryüس”‘l†ëò^có\>)lß½UŸÇ©ƒÃªŠÝ¬EûÉËÍÑlÀˆ°ëi…µãß'¾=ÏÉã‘|N *[ÚsyQq§§Ú&•w‰D‘î hêtlˆŸG ÐBu?9æ@ô ÐýëÒ6B¯È×¥#žgŒWàÃnàå¥À“ó«¦ÃÁÁÁÁÁÁÁÁÁa¹ñ#õÿfPðd†rÀtcëk©åØòõ°~l9Ï’x9¸Àî$ÔfØ%Èg#K>¶qþsœ ”W}ç è>\»X{Ð!8ÀÁÁÁÁÁÁÁÁa9°7€†!;*kÄèñç#¶^1›ú¬]dé–~ù|²?2ìCF*òµÁ^ÖË dØ“áÎ8ÿÜ`' P²^Oi$ ‘¥qæl~ ¶©Óª@žÁ 0¨r0Økðh`òÀ%¯ÃÁÁÁÁÁÁÁÁÁÁŠýlEû©GšÜK2Ìm#6JŽÏöc£öpƒ½Â¶·åZñ°åÉHAY:ˆª’ï³#ç9dØSåߘÔôzJò˜ê¬„%ù4õ§˜ö'¡T…ÈÐ^u®Ð†Ô«7o,…ƒƒƒƒƒƒƒƒƒC¯X *òŸÈfBÙ¦N?WƒÑž z>2`“éäÔŸÛž× °Q„x?|Ä Y?Y§“ájƒëø'º6ì‰ÛO ùŠÎFhìǶ׆~±I÷è@y62à¤(!€ºÃÛñR#9a}'„1#<4ì«äà%eàãpÝ4à/ÀÁÁÁÁÁÁÁÁÁ!Á·Œ†’ú,"5ô9ÌZ2@OÞÜiY^aË}¶œS~ l=àè1Rq£úŸ*ö&2ŸL”Öt%^rÈP¯k¨ÞŽ«þPR/î -º½¨î—F õê(É¡Hd@}uöž¦øðäa@9/Q¨Ž!_Ô•fÀ²Xz¸èY888888888|…±€-Ô!¾=ž´«ÍR«þ~-n?Íw³ù[^dÇAû/±ö|ÿÜHF4ʺçQu¸ Pˆ?9ú̈2”×óÔ/qöÍ ¾æv’e'c` # ŒîuŒuêØÂŠQ)í§ªQ ¯Œvãšó>š‹>Zš"ØÙR_˜RÆ!”uhÊÓ‡ ~BQÏWX\…‡nuòÈ=/Ƙñ x;[’°r$îò«G È/êˆ=%óRäž mN jlÖ2• ªüÛÔ_/×GÀ }r¨¿DT ðŠÃ¹¼2î+%å$¨$[–=ŸƒÊàÈ  à%œ ŠW‡ŠW3î]Š‹Y‡¯v°”n’WÌ„_ šã/Œ©MÞScz$ýÚ uQ»n¶ž›µže¹­@X‰-׿5¹|ž@†?èäJþõMÕëÉ`ç#¼â0M¤¾zû@SxŠ úªÔ@@åAÍœ~G=•àÔA{r¹FäòÈå»8ÀÁÁÁÁÁÁÁá«€]ìlÌK¨(>çГ¡£Ú!àO¾íÐÓ¼e½Ï¦4‚À“}i¾Äæid ›µç#NYJr nGu!°$)W“ˆ¢CyZÎGhJíˆúC²Ÿdðó…bCõ<_ŸoaWÆ^¸KEW7€òFƒ-%|ÀϹz Ð¬¼jc´;áoãOÿ‡//¾ `'cžŒy2ô[n‹ôsÞ'ñl=Øz2oy’.‹›÷TñÑS¢q9QVf+©œ8wªNí±9Ñϳ¬r h9mÇžDLËiÁ£+Bõâ©"pZH _žŒOÈË«PTË"$ |eüׂԥڡù& לÑz×>ð6¾<ØÀ.H#ø” JógæÅ½h9çÜsØ"ïžÖ.oé‡À“|9q‡ üZªBâ?¹jPâÚsYNŠè“ÏÕ|8uÈfàs• >r@ŽCN;)Y ʯ¯×: õêryCä䛀¦5Òåa7PnruÊà÷õ@¾QÍç”càåÏÇÁ¿ùnzà%888888888¬ºØ ŠïOàòž\ןëûÛ¶#ð¯Äksh»›öÕáàíbÖ?ž )¬E9éõ³ä[^,© Ç¨âì'*?œúÃ* óƒ\]õ~’+’×Sì‡ÄðBqúiÞË©(²m tEƒ: Ð¢†3Ì: ¡Zôh@½¢åêáààààààààðå‚Yi×Ô1U~D/ÛGH+  f%^®¶é÷Órn¸¬=—í¡òÃÖsB<Т–qÿ$ÙWAYg#@ª><¢ÏsHˆ¸þœ:”ì‡ÈNìˆ[ôiäê•‘ß¼–š÷ Êào\MV)c>טõžæýeØ{9õ?4õ'ì*©cаPì¯ú ‘ €ñ‡þ wÝÿ(VŒ°'”œ¥sÃùýäHeA³*ýÒrr¸,§ÙºJýv¹OžÔK![ò1ß-y8qää´N?©óäXò/Qwh=—ï¤È?9 ÜÈõžÎˆ’~ªiØ­"ý C”Ð2©ÁŸSËi>(êvÚ ä_?¯FȨ'ƒ?*§Ÿ¸ÔR£äø9å(øªœð·8>òV^| À¾l™I“áržžñ!ƒ>Fµ¡Í#ýä(P. Ùç•|sl¹ ÜÐç¹\¦”âé5ëÜ× ¶í?D-Ê»@Z,`…¿¶ ÀDñ¡È>åP{š&¥ÍÈ W”:Ôé Þ@Ms Ê o^)HçOq‡‚: i˜* #µ®~pš \?hTºTäŸvQ·ÚÞ/¨¼b ÜD% q¨Úi•±Ãn߯SϸÂ+Ö‡2ü¹qorú”!ímb¤Æ22ÚÛè@ÜÀ·ÉxÚôü ¡e¹ÇÖˆ¤Î ‘cAû-³åÉq’êN…ââ‘~Šä›zMpÇ€ú¥íLê}æ•¡¤ß’VNÍÒË- ¨;ÂS†ºçùÁZÙ§QÔ LG„§¢þÉ>štd¿!îšPèW”³àÚ)¨¨‚D ©9ûäV¯ßL쥈¾g¬'žΕ§6¦3¤§Ö¡ÞCu‡õËuù¹£À9üõ›u¼æ”@õ Ñc«gçAÏ zÈQHT‚ôöD õ‘…ˆF(  ~âüÓˆÙÕé7­¡(@ÅjžB“2Äëi`€ŠÞ×VÆ¡)¥‘ hrÕuò¯Ÿ¯þ5(®(J‘¦þ$Óäê–cìÖÛaêÔ—áàààààààà°â°6€ïf,'ZèsêIù1å@mª?fA0 g„'érpƒŸçpGƒöÇ÷cæ$ôÞ. Ã=ÈW7ä‘2ü‰"”úÒGD\žäkQHެN'”ÛÓŠ»/oN©?^ –{¹têÊ`O”}ú)O¹-­L2 ùï"z…]xé…Hl´ñ¦xûmW7ÀÁÁÁÁÁÁÁá‹Ä0ß7æ¹~?÷DùáÕÍä_joR€Ìå0¶-gì'k[Ú¸YœìzÊ ž@ °uȶKF.b½%—ó”5 >_agb«LŽG6v’ÖLÙÁzH i˜:Ì\£š†Ý* _ Ô4ߨ¨@¹†jÕŸ ¨e?û)c?ß QQ„¬ÿ§Ã[o¼X{õ0k–«$ìàààààààðyb€‰Æ¼D5OÞŒâ›<Ÿš7Ñ…"TçPÿ`ý=“ly;[!/°í¨Ná¡íËl{[1Nâ*B å)Ï"ó4å”ŸÕ ÇÁ㔡Bõö‰cÁk“+“œ9Ûa©U^Ãùo¦Œ÷ºiõ^/4QùúÁ)÷_xª?á§Sß&°ô)àùŸ¾‡å‚é7ÿ7i;6ãÛäòÇÆöÕ´ ,u7ß–$Ì©@6¹NôG–þlŽ/4æ±õ‰À þ²Î¨×ù®4@s2ü)I˜(>dàÇL”Ö'ªBtfdïó+Ø4LÀ ½aQ9•v]è«Eù60’€}U:Øóu%_="ðベ ~áûwpppppppø2£?€êÿ³ŒsN×1#ø¦bMÙ‡ø”l&ý’L(%=#ó[Î ÙÔ~ø‘ ¥3¦~©aãêjZ¯ €EušÅ~jZhNU €îVÕ¦iÍoøshG £CIš !>Mo_IÔ!5üÉ Ï!åêv‰M>`*|¨˜4©™SþÓDV}nà—3¶AF{[².mŸgíxN@-J‘)sjî' Ÿ‹Ü%()ØÅ@=ü´}=s ŠdèÓ™’ìg½>TŠø7êJd…~zÃ~ê´š†) P½^‡ŠêS°rý½@Juù#ààààààààP9Çèÿ³ªåšÿ,–ó`³&¯@œÿXïß4þcTGÝù<7ìÉ@'B:?[å`™Ï¼˜M^”öc«`-XF;Eö›úëbÉÁ„2+Fޏ®?×ýoZS±¨ÓœJ(ôC*ÿé©vÂS†¿ðÔˆ€ðV×ÿ“Â9½ã(=åQtNg1#ùdÀ“AOàI¾¾þäõ” ~úxPƱYHŒú7“ƒi9Ɉåk¤‘{~ìÜçúÿµdEy²/oÏ-LNMJrȰ' O’¼«›j&þ=d>µ=îõc^§)>‰Ü§vZÖÖíô†¾”^ FâHyDÊ© °‡´>€©dFüiYÕÔ â6}‰ç£¶Yc;²šI}ˆ;K=d@‰úCIÀTŒ$û#Çf—§¿Ò®÷¤¹ÿdø“~?ö´<ìÎ^ïÐÎpppppppXÙATŠì“ÕB ­[Î^NõñŒ©áÏ¡ZÁ‡¦f¤žœ3É—Wø5)D”c=Œ¾¨½-G€Ú%c[óœ(®ÞÉÚóQÚžôü+l¾›M ¤Í£ãü=(D‰µMÜ~Ê H¨@œãï³-‰³ïk"ÿÄéï¿~õrJ &Ž=«ìÐqõmsŽ€ƒƒƒƒƒƒÃʆïë)רç•|=Á¦YÏÁyñd¼›Ñr³€9Oë=ö1•†h”ÀÌ+ðØ<Ì×éõd°8—ŸÓ™jQ‰6oK ¦í;-ë“ãòØ[á/+ñЍ<¤ëOI¿4_¯“Èð'Êå8ÿ6ø5ÒsVðè7£9¶ÜVõ–Á6c8fË<6¥m¸Ñk®ãÿÜIˆPôˈi{²ÐxÅ_Ns²©øp+˜ÖózüÚre$îdñ‘B¢:D¾(¸Nsû‰”£–I¡/½KŠüW:tO\öSGüÉЧõ4åºÿ=Á"ÿ6gÉ9_4ˆãϹùd½p£—G»}6ÏY[­Ìh/2>ÔÆæH˜ûkÃó³êäØrž|ËYæslZ®±—!%Øâø‰ÊPQü¾î ÿ"ü¬'’í$5âþ'I¿ýª§ä(äXÄŸŒ[7`‡íÚ8GÀÁÁÁÁÁÁaá@=µ%¬òè¸-úm£Ópp‡€kÞÓ2Ϙfõ•õ7#ú¦ãÀ)?6G‚ pNѱ%0Ûòø(?f.•Z±´£ižµç×2±$‰ëŸKôüÙ$CšÂC2üW£çW¯nGzÿ¼€s>78GÀÁÁÁÁÁÁá³%÷Úd9mj=ÜèµEò³¨>Ô/¯äKýòÊ¿¦ÑÎ÷iß7Oæå©dî›S~øµ ð\[$ߦÄçmµluÀÖDù!Ãß§´brh ™üDá¡È>Q8m…sýÁÿ…Á9Ÿ”Ük£³p®?è“Ñ\dóe¶ØzSi'Ëà玧™Žáï"d;W~n4Ÿ¯±—:åÒ¨¶ÑÛö¶|ŠIÀZö³BÙZÿ´g@œý&V©— }2ð z„€rh=mï ÿç8888888,/~Àæ9¥‡Î\ “¦dè“T%§ÃTؼYÌŠ¤9i¹@µ±LuHßtýy¢¯m¨Žö“Þ?pU ›š/jFÇL׌;9…ˆ¯çמ;I\r•;eÜ ÈUÉ‘áŸ$û2yΫÜKŽQ}¨}w«îYþäp‡ ¶ N8|^pŽ€ƒƒƒƒƒƒC-ÇŸSil\ý¼e97’¹¢ Oæ#ÖV\ Ú86Sæ“…@ï?BµmÒ‰¸“ažÏs›,óÜqà:ÿM–~“¤]=í`ÛóÈ>w<"k-숚4gŸ"û‚Eî}¦âÓ6GMyÅß@s‰¨ÐWžþ"GÀá ‡s8¾ÏæÉ´ÑWlÑeZÎaÁÚÙ®ˆSaíLINÞ¿¹.`Ë8EÉ4ž¹¼gV~9ÊЖèy 4µ9-°´ëbëi¿K?µª$ó~8‚d Jà”ŠìSäŸ*ýÆýÔtà¨êi=éÿód_žœ\yGú¢á2ü¹QYbËmÚó|}…MÁ¶ã”!Îc¯U'€GçMCÞÜ7Þ³r²¤GÍ‘ž;`ªèx°'õÚ"ï°´ãëmÎYË!ێߺwäôpç,uH¥‡ê"ÙOÎý¯c!¾=MËíÕS§ÿ¿ÒÁ9_=Õ‡óÊy4™sû¹Ñ ¶î,ôVe˜Ö›#µ¤Jùµ«uN¶¤cîhØÎ½Ä¶·][^¤­§^?ô‘NÚåZßñQõ|L…œÁ¿ªÃ888888¬º8TO¹4¥Ê³vyôoÀuþmýZüy[”œ'ÿšýšn´ûúÿ=³?s”€d@) 8†×oÂ6`“µ95<1šƒ;µ’ƒ$òOÜ~Ÿp€'ñÖŠìsPGýYeárV~Õ‡'˜rãG湃`‹r×’û´%syON9²)ÚðDVâú“oæ ˜´=£õ4oʃRߦî¿-q˜®‘‡j#›;76ðˆ¾MçŸËy‚­çךöONwÞ¸ƒ$œ~’ç$Ðò®…Õ˹ŽƒVêøXﱡz=7øúÏ*ç888888¬|ø›·iÖx7BùHߎÀ y¥x?ä(ð¤\SçßäôGÆ<·Ié1ðQMâˆÐstÁœÚòl4'~­©}'Û/ð<é—_cžpMÇJŽO°N÷ß© |®ËOA¢ú£#ý4@ÉÃ1¨!ƒ^Öpœá¿ÊÃ9+‡ë©Í0·ýJ“WdÛó¤^n˜ƒµçÉÂÎ7ç¹¶bZ¶ÄWÓ7sû,-r ¸î¿Ióé-ÙW¢§þ¿™PœuÍül=Wñá÷ÈF ,í¸£ÛQ’.7ÌKK«[òJ¾ %H;T0ŒT¨Ÿ–Õó¶:«,\®€ƒƒƒƒƒÃ‡Cؼ͠®•8Ê2F9å†ËqÚªÐÚ¤.9o=díùqòö½)Þðä\Óø7‡ÚEúãþ1ÐC‚FßÔ6ðsæ†<¡lYÏ#øÜç€mõxEaÞ?¿wi¿é'ùNNñ¡y2ÜyE_𿨣íh9ïÏáK72ààààààðÙã06ßWßæËÏy霊cs R^yõvµ¢â±e9ß/Q{lIÄœãoæd{=e@MçˆFÌŠsïm£)®Ç_‹ÊcõßÍú©¥œ”ŽÚpƒœO))˜ a‰àSÎÕ à…Ã\.ÀWÎppppppøô°EüaY^ëW7¶ôÃyê¶*µ6›¨F¿°ôÃV[2q˜ÑžÀø?ÎhgŽ˜”žÔ²¾lרAtŒecæµ°å Ød>mU‘ùþù|Í÷tÖxE_Ò÷·ä’ù,!S J°TM¸¼¨Ë øÊÁQ„úŽC-˹l§-ÙÖFùáÆ¤­*­ÎÖŸ·É‹ö•zD([ÚqpZó’­ýĬ P®€™ `öa* ™×”_N'⎀:d+àeStâ£"Ö_‰µO÷G*?MÃôñ'Þ"þ4ßÀ×íÛæ¨iÃêjJ î¥ÕÛ‘CÀ‡¯ ÜÈ€ƒƒƒƒƒCO¥§¶,InÖ¢ÖØ¢Ê`í8·Þ6Â`3N½íøñú:ba«ž›µ­Ò/ߟ`ÿûlž„<ã“^”µ_óm£ ¶c’–õµ î´Ñ~xa0î¥Ö7©ù”;z¿ \ן2èi„€÷Ã)A.òÿ•‡s€IzJFI@r}þZŤx;ŽZt“ö’ÕO-*-bo£Ùúë‡;¼?³²/µ÷ù§í"dçÄm³œ N↿­˜­¶¿7<'€÷c£ ñgÈVQ8H q.JÓ®Ez\ÕGï2"ƒ%SR0ïË:|u`qúd¥Ký3÷9€±óŠ>R‡Ï 'é)×jÏJjzÒ7lÕc9ß›•²Uöåt>Á•jl9YƳ Ng©å`ðó0é/&ÇŸÅf¤ß4ö)™˜ÕÑ~SEˆƒܱѧ ~m£5°,·nðså†=ÁV)˜OЃ›OòŸS¢ŠÀÉz¶P20–ÓSé"þ_]ð{OÏÆ¢·Õô­äjVœ½¢ØÁÁÁÁÁá³ÃqzJÊ-µ¨6¶ ¾°lOŤò5¶ç?çî{–å6 ~œ¡¥ŸZýØö6U!êÃŒr›Ñ^§@@”õº¾X¦ñ' }rì|ù5·åð{Àa«ŠlS²9W6g2Hå9Yt–rV£×³Üš6jÎ?7ü a©z{›¼¨ÃW”òñ«jª ¼ö@×ûjöÝ)Eó€¥ð­÷Wô;88888ô'è©ÍØã š¶ˆ¹-YW²ù:¶?[„G‘ }Õý·Qu`é×6OŽ „Øh0|¼âoÖu39ü¾ÞGÉXï#5Þ)šŸ•l»vÜ §å¦tiÖ5¢~ˆSfí8¥§V‚µ-¯Â¶B€NFñiR=Ï v2ÞÈð'ÐrÊ ~Ú?Ög¨ IhZ³z{ç|ùAÏÀû«éëÊàÇkÿÄ Ôl«~$—-R@g‹;°ÀQ}­)îààààà°pºÄG¤„¼r”Ú¦Nëö“aN#Eíä˜~±nyp*æ.­ Ïᨃ¾|.@Wèáš[îCÅ+âë›nˆo>Â"n¹ýnÌ¿…|G2òùì|ôyóæá7ÞÀôéÓ!„À¨Q£°õÖ[£±1u.æÏŸÇ~ø!6ÜpC|ó›ßD.W}zårW_}5J¥qÄGÀ÷—w`쫇ÖÖVL:Ó¦MC]]6ß|sl¾ùæð¼ôqœ?>ì|øáGØp£¯U]ÿ¥K—âý÷ßÇË\ÅKÛ0¤õ˜¸ýêÀÛ>˜Ìêž~Xe`Ïf`á<Õ÷Ò65¥Òr‹ôç}¨¨€ÑP_2   ÀÇúã —=´¢/¤ƒƒƒƒÃ— ¬…žr”¶¨®ÍH䃭ò®MÏ¿–¢ŒÍ@· Ø‹Z#µÎÏæàØh-¶¢W|}­ëѵ>‹:c:¦Ób:f±±Àÿ¶Ï>8þ„0nÜ8|V˜2e þtÉ%˜}ï½Ø½+ÁXo«Ì!äŸ×«áè)Eøu.À…“߯qg_Ù³gã´ÓNÃâÙoaÊ_OÇ”ÿ½Ž¡ÛüçŸ>^yþI¼þìÕþÚ;pÜñ?MÛ/Z„)=Ð#j¢­­ Ï=÷¶ß~{ÔÕÕáúë¯ÇA„1cÆ ì¶Ûnéõß\zÉÅ8÷ü °ï¾ûaü·÷À½—Ÿ„õ?þ7ºC‰ÉõÇ Î;y܈?RûøhP–Àû'_é8cÒ$œ‹t¸Jç'/²6ýÿ:—_øå¤I˜€4«ÿ#«Ñ¶«¯Ž;f͘1cðá[oa/¤C~1€é^pî¹çâˆ#ލz¾8.¿ürAЫÀ±úê«c–Þÿ[o½•,ïmW]u1qâDÊ=z4`úôéøýïG}°É&›àÕW_ECCº»­î¶ÛnC¿~ý°Ûn»eö×ÐЀ—^z {î¹'&L˜€wÞ¹ÊÀ¯µÞÁÁÁ᫆ Æ 5šˆzjãâsƒÜ&ãIÓn¶=§Ì€õ³¼†¾Jd£*å-ëù~95–Ç–ùZúÿü:çßVèÌv^t¦ãÂsúê,ÅpÑ7â ƒª>~)ñ—¿ü¿ÿÍo0|áB¬k¬£ˆ<²Î!0 ÀüÁƒqÜé§ãøãïQ,õ¦›nÂqŒ¡¢üä¼ñQ¤Zô/q¨’7=_}h>êVšÏ7ù´.^€·ÆáÍ7ßÄÿþÿÖ(œîï0ù?wã÷—]™ï`\=ÖÖ%xkÎÕþÎ;pø&âüóÎÃäÉ“ñûsÏÅ´×^M÷¡?ƒöGÇ8çœs0~üx¬³Î:¸úê«1gÎ|ôÑGI÷n¸!êêêjJ©TÂ?ÿùOŒ1cÆŒASSSÕÉ¿ñÆhoo‡ƒMMM7nÞzë-Üwß}¨¯¯G]]|ßÇÃ?ŒE‹%m71u•Eðtòo©³ ­ÿ»ÍïMÞ~#ùVE°ðC`éBõ)Í–ÌW‰½€zè—AEü_ž4 ?“?“Û<öÎ2ðM…JêÖÛ°8—ÃøÉ“qÈŸþ„ºº:|øÖ[ØÀÀI“pƒ”ø§”8ú±Ç0 À7üëÔSñÕVÀ\ÇÇÕW_ý©®[.—ÃäÉ“ñ'½ÓøÔÈÊj«­†\Æþ&Mš”ë°Ï>û`øðá>|8ƇŸÿüç8óÌ3Ó¦MÃèÑ£qï½÷bÑ¢Exúé§ÑÚÚŠÅ‹gö÷µ¯} /½ô6Ûl3Ìœ9³Çq×ZïàààðUÀ>Îp€ó|Ê€Š ~o|(#Ùciɯœ@‰¦fB)—4ùèÔONhÞ,R%Œ~¹¢ !ê‚T&…%kÞ,jAÚ¡1Oë+èYuçÍÏÏÉ>üüèü©/~Ýi?¨±óü¸¼'¿&üÜà5[]r >”²Êø¿ãŽ;°Z.‡ñž‡§9;/\ˆõQk`CÖþ|#lµ`ž?áLô<ŒÎç«tK‰.¹Ï×^Z>üÞ‚TŸ_¯Ž™ß•T V†ß9OqÚÙã±Ùf›¡±e~qåS°Ó7wʼn?;¿¿à|Ü»ë·õQÆ9—\‡ÓÎ8KµolÂ/Ný `§wƉ'ž„ ?ø^øßS¨¯¯WýŸ{::;ñÊ+¯bÛm·Ess3>ø`ì·ß~ˆã»ï¾;®»î:üûßÿÆ©§ž øÅ/~}öÙƒÆÃ?Œ›o¾ýúõÃüùó!„@>ŸGǘ8q".»ì2sÌ1pÈÆo¼wÞyýû÷ÇA„µ×^;1>ŸzüQì»Ïžéõ?ñH`ÙøÅW©ëŸ±yû<\5-À¬îëõ!|APÄ?ÞÑÒb\¸§+À À.¾ZŸ+ñp¢1 ÑxÕUØóª«¨v'Þ lèûð|ùbo†!òaˆA¾ƒn¼ƒV[ ãÇG¡T˜\1€EQ„¥W]…±º? `xS6;ôP<|÷ÝÐÚŠíwÙ‡röÛo?4 `v ø¾ß÷Q,†!Â0ìq½|ßÇ7ÞˆÕôþK¥R’ Ešššp衇âî»ïFkk+v1öGØÿý‘ÏçqóÍ7£¡¡ûí·{ì1”J%Œ?ãÆÃYg•´ojjJ ü#Ž8Çs FŽ™ÙßÌ™3±óÎ;£_¿~€ÆÆFäóy 2üqÍõ_Fìà[°dP™Zó@u¤› RÀÎyç# æª:6N<ïÏ–ŒKI²t|?6ÉI>¥öœ²6ï[–ÛêðãØz›"¯ÀGVúBEâj>ä܃EAVqàQ£ð«¯VQ}}ôQ9n¶‰cëß4²—x@ó&›àÄOÄ׿þuø¾ï~÷»ï¾‹QPùŠ&8e'Ôÿ®Tpÿĉ¸lâDó÷¿ãG?úà„NÀ¤I“0z“Mðµ3’ºüÞð"mÉ5’7í®Î“TzÈàoÐrF°[žžƒÃ®œŠ®Rˆ×€ç/ÝõƒFö8å&<ð¿7ÔÊ(WB¬5t.iCWw ZÏÿ÷Ÿ¨oP”¢=¾,xäIÀÑGŠ«þ¢"¢¾ì\tÉåX°p:::Ëå0hÐ Œ1“'OÆ AƒðÄOàè£ÆìÙ³ÑÝÝb5ÖÀ£>š2ÐÙÙ‰±cÇâí·ßÆÐ¡C¨8ì°ÃpÝu×e®Ûhä¼ùè-xâ–ÿ‡£/}³?^‚î 0° ­n ìþ8ð~wÏíWp*€ßAqû9@)*ÐW¬jØõŸHҪРýÏr.-PQ šôŽî7„úb4ØêË6i²ƒƒƒƒÃ—;Ø©1hD1‰ÑÓ°´E9·Ýf8ƒ­çódx›…ªÌ)¡ÛÒí¸ÈøãýÚ x[2-§øØ’{m†:,ÛÛŽ›ƒÂoYŽE¹%ì-ãIÀ\ñÇäÖwèÜk/Üsï½éñÅ1¶Ùj+¬ûÒKàÌÿcá™\W_}5êëëñÓŸþóç+ÊC€í ½]{óx鸨] `æf›á/½T%̲÷Þ{#¼ï>ôƒ=Q»‡“%¯«Öµ¬­–´j ÏÀQúªëǦaú.êå”ÄK…½(Y¸~šRnï'ЗŽr ZF¨é2­Ùo2kŸÈsj>Ÿ;Èœ«Óg_ºBMuåÞè}õUž?[-^¤ÙYË4Kh©&ó/Õ¡ -î“$ùò•š E4x…@[ö?qØ}Ì/CoëÌé“>üÜ/¸ƒƒƒƒÃg‰­a#‹jÂ#ˆ"ÂA¿TÓ[LeÚ¬¿,ðH¸íwŒç”Ð7”ûØŽãF­-ÒNÇ™³ôÇyéµäE \]ɼr4$ëß¼·¦rO æ¾Lš–9R1gûíñÄSO¥÷" ±ÑˆØfîÜd$Áìû‡œ~:Î9çœþùøû¯wl¢?ܯ%ÅÊï¹é¼½>b^|ûíªQ‰¶ßßy¦Ç¨w“k+ÿ±£ÚWBÒA6àÉÐ'!Ô‡’×…ÀÈÀ'Cž’‡)™¸ÁRø‹¶Ï5V/ç ~鸪ç|. {E{I¿ÿ-¥ßߥõûi‹˜ä;kÆHG«š¶ëo,üUç†~…-'Ã_²vY/V3¹‡ó+¹þ0ÁLâCfDÈw&°_H¸Å“¿èýõv_p8ª¹Õ&gœ;6N8çTNeû?C/3¶z¾üˆ{K«·çÆ[™mç³å`ËÁúá””›k¬.gÎ[Œ'óßÁÒMŠ5ö¿÷>;Š˜òÔ x£°=~øû»°é¾'] ®…˜ùît<9'‡¥uëaÍ÷À½“ïPÕ‚—¼«>ms€¶9˜ûþÿá7gŸWßz¡WÄ_þò¬»î::ùWqˆ?\x!{â)ttuã½÷ÞÃa‡†=öØxþùçqÍ5×`öìÙ(—˘={6.¸àŒ=¯¾ú*zA¹ÿþ׸öºà½YóÐ5l¼Ö¹þWˆ=~y¼ tLîx§ ÷í} ÜÕqÝ\·ã$|o:°¸˜Û <}ì þüËø^¥‚eW]…_AEÏ»LÍç1àòËñýwßů:;±ÿ«¯bú¾ûâ&¤”ž„´´© ûÜr ®îèÀsæ ß¤I¸j¡Àê'œ€Ÿ¿ü2þQ©`Ç«®Â]Pü;þ¢'.gGS¼åÜÐÑËçÌÁš“&á1¤EÆÖ>áœöò˸¹RÁ¸«®Â}z_¦šÐ7ì `<€ÝššpË-· ££sæÌé¡ÔTc=G­öŸeA@JÙãsÉ%—¬è§ÑÁÁÁ¡&Öð{¨ÞóüH/P”Yùµ‚ž‰­¦Ö»Ÿñ1#üYÆ&OZåIªœvÂ×Óvûð~y{¾<`Ÿ¬DV çï+_^Fµ3aKz¶%ó„SÚÎtƼŒí¹qΓ¦ %¤ŠLfôÞ¤ïH¶é(ø–mÌça €ïŸrJ•ñÿ׿þÞóÏ'Û˜×ä 3üîw¿\pÁˆÂ{"}ÍÝ#~îJ´6ïíRÏx¸~­=„{î¹'i7tèPL8å”ψíZ¦ fMí©Š´#  ‚b *aŒ?¾2_Ûd ^|ñl¹åV8ñØÃñØõgâ­wf`è7S2 Ï>†×'_ˆJâ÷ÏÂ×6Þ4mÿ“£ñØm—cغVígîG °Û^ßðN<édÄqŒ Î?ÏLùV2ÇœüüùJ%s8jƒ‘Økï}0vìX¼ÿþû¸öÚkñ¯ý |0úõë‡m¶ÙaâØcÅI'„3fôPgqйPMgÜ‹3®¸—ßp†õÏc×Õ»ðÞRà¢û§ãôÓOÇk÷ÝŠ“Fæpð“K°×^{áýgžÀ¸"ðK®E à7GS\õ©e;O4 Ç@=ˆA=ÄMP/î¥þ;]õÿЭ·â;¨þÒÎÎåp×µ¿—Ÿxk8éÚk!œxÄØÀ³ºýù—_/pò¤I ÕÃ|ÀG¹þkô7ÀÏt'éþþÇúûÙ¤IØ @=#B s9<¨û›úÄ຿#Ž8¹\Kôú'žxpíµ×z=P´[«ýgÝÇøCœyæ™XýõWôSéàà°’ae0ñ¨,WS¡4Úç@Š9ëØÀXÝæM¦î[ÀYêPýŽïp6ª1Ž3Ùü»PRÓs h¯>ç{c[#5¢?p±]À ºýËþËúÝ ªf àϨ6ÒÐOÿÿ>”AúTP̓ʯ ÀÌ€¤ß°kØ~60[;µ9Êrî1TéPòÝ(cu°Þߨ68ù¾6’¼äûм®û^ª×5`ëã0Tsÿ³·ÍÑþ˜µzŽZLpÝ /`‹-¶HÚì°ÃöÔS=””ºÜ`=÷Ä}÷݇J¥‚––ŒìêB=T¾ãêÛm‡SO=;î¸#Ö\sMÔ/[†]õ32*`Y2޽ ?[(íµîÕ9O<ñÚi'ìlœWîCpýõ×'Çôâ‹/âÒ-·`Ïà x=ä>9*íêC#¹Fœy÷œpÒÏ1qâDÜsëß±ÖZkáÛû„½Ž>qÜsWgþí1œpâÏTûÛoTí¿{ öúñ/µ-P Cóžæ=‡aMÞ|òv<:ùÆô°¥T¹žÖ¥‹1sæLœvÚiÈçóhllÄ{ìm¶Ù .DWW¦L™‚%K–à–[nÁÇŒ¢­­-ÑIÿʃîuçBõyùjõyêœ=záõïwaßÁüü¯âÁÄ·ÝбðXa444àÉ'ŸÄ7B`\;ðÜãc›m¶A+€ ^b‡™»ƒz‘–¡`Žª¦¸~¡€¿=ªúÿ÷­·b(ÔËàeýy@÷&éþÖ*ÈòŒÞ_êKó- ùBÕ¼¿yÞ‚Jü@öÒ_ êËü-;X.çŒþÖ°>€§u9[ë ëõ„Ûo¿7ß|3¥óß[ûZë—·?ÇÇu×]‡]wÝõ‹&VA\{íµRâä“O®Z>gΜd4mΜ9UëN9åH)qÍ5׬´ýÔÂå—_ž9rØÖÖ† 6Ø GûÝwßmmm™ÛH)qÎ9çÔÜç$?ÑÿÓv@±¾ÀìcŽÁ¿¢3¤D·nS–ïH‰DÞ:òH\ õÞßÀqÇ)%þsÿý¸=©@W¸û¿ÿ…”?ùÉO°[Æþ P|ô»üo÷Ýqe[Þ”Ët›PJ|(%¦H‰ºsÎIŒà!P0ݳãN>ÏB®gܳ§ ~s^p‚qÏFè%^ñöî»ãƶ6ÌízÛHJ,ÏH‰µÎ9·£§ô$íçoû¦I‰V)çXAO©É»äŽ9Gæêë,¥DEJÌ“FÄ‘Gâ>T˜ûz=c_wh:ñD<'%éãu»×õ9›×è)ê³ó£¨{©åvõñ‚ê*½AЏóÉ·ñ«ó®D†xçwpï£Ïcøðá¸øâ‹!êàºÉO»“¸ó‘©øÕÙ¥í§<¶ÏÕãô þ¬Œ†ÕÕ'Ù¯áŒ~Š¸é†¿ãæ^k¯¹¯O{¿ýíoñüóÏãŽ;î@]]š››±hÑ"¼öÚk˜5k®¼òJÜu×]øÞ÷¾‡;ï¼3©Îú•þ­ï«Ï”“ÕçPŸ·ßÞ~½à?ÛߎŽcoøÝvÇE'‡¬TÚ_†ÎÎNl¿ýö˜¥Ý¿ÍŽ;âÙgŸM¾t%TG'$‡^Ôó‚;Þ~;&ÞvvÛ}wœ~ÜqØÀ6P‘r^ðâ´t”K°ÞŸõ…Í*êAûzê úšþ¼dô· êÅfögê-›0‡5Íá¿ÙFÅØÞèï}cýp»ØY¯ÏÂ4£=aG£}­õËÛŸ‰Gy‡~8>øà888ÔÆi§8묳ùßc=Æ ÃÍ7ߌ[n¹Æ ñÇ Èçóøío 8ýôÓWÚ~jaΜ9BT}vÜqG466âAƒ“ ^x!xàÜpà =¶BàÈ#Äé§ŸŽ[o½5Ù&+âLôÿpÆ_ÿŠ+®¸·Ýv„8JüA§÷sçwâꫯÆÏ¯¹×C9]~9n¹åì±Çøño~ƒ»¾ÿ'8ôŒ3ð­o} 7ß|3úóŸ±{Æþ€8ˆç!Bà·Bàd!Ðbœçe·ÞŠêmwf÷ì¹\O84ãžzì±xÀ‹ìžíà!‡±ýï+ŽG &cÿWÞz+îC6…‡¤ÓGëÏáèÉ!ÀïØõÞO·ß—]ïß^s AOúíëûú^%F8çÚkñÇ?þÿûß!„Àw„ÀáBàÛº_z® Y?Ðówœãt-s” ‹3o†Ç©mj”bÔ&›$æƒ>{î¹'þ~öÙhjjÂ~ô#ÔÕÕ~ó%ƒ¿Ö–[b»í¶ƒC‡ÅÎ;ïŒ\.‡Ûo¿×[áÂ…ØŠîóío;¹^“&MÂãÜ<9Ý· =ËÌ{‰@^9JÊ+GIù—ÕçïÛ©ÏmßUŸ»SŸû‘³þñCùЃÈ‹.ºHê× ?pGyüÛÊãØVyØ!ò£>’ƒú7ËiӦɉ'ÊQë •=ø jß¿I?qOyü!ûÉãÙOyø¡ò£>’C‡ ’ßt±”‹ÿOÊÅÿ'[g¿)/ºðBÉqþùçË‘ë¯/ŸþyyþùçË%K–È®®.ùÐCÉ6ÚH:TNžr?@ÍØŸÈõ¹/ ϳì¯Q¯Èïêþöí¥¿‘€üNú;@÷7{ruK#9®—õkr7@^}ÕUòŸÿüg2òÜ”ÑÞøÎ×\Õrö@^{íµòºë®³Õq÷qËçÒK/•RJyæ™gJÏóä¢E‹¤”RŽ1B®³Î:RJ)/^,=Ï“gu–”RÊK/½t¥ï'ëCXžõRJ)Ã0”aÊ(ŠdE2ŽcÇq²M¹\–äQ€<2£¿Iz_~¢^ÖÕÕ%¥”²X,Êßò·€<¿ä¹€¬««“RJÙÙÙ) ÿÈ Ù(„œ9s¦”RÊ]wÝUÈC9nÜ8)¥”3gΔ BÈóyAÆþϤ÷ Îó4ýÙìSܳр<âìÿý1Ï'y”qŽäaúcÎóë}¨Þ†¶;œ]oèe|_‡³þÍ~ …BÒçQÆý/‹U×ßÜça€<?äôô0ö1×ÿy ¿¯§ë{ò /TÙ;ï¼³œÈè¶ßäæú˜ÿú׿J)¥¼ûî»å&zÙ×õsqÙe—I)¥üÛßþ–|'F@Ù €¼üòË¥”R^xá…r Ç@Ùä Aƒdgg§œ9s¦¬¯¯—›êã£Ïwyøá‡Wç /¼  ³ÖGÈ?¯'a¢N«÷ô×`Šhí,ão÷OC,-FÂNc†'ëg, 1ù‰7P‰:»Ëhé?®³¦0±”ØbôØiËÓös[1ù¡§ ñ{ìŒu×Y[í'Žpû½ãý…=…䇯µ¾÷ƒbîܹxöÙç0köl [s-l³Í6>|xÒnæÌ™˜:u*fÏž––Œ3£GFX©[ô¼åøk¯½6~ýë_ã°ÃC¥RÁرc1öõ×1éûöiþ„ ¸å–[ðÊ+¯@1cÆ`„ ˆo½Û#ýMø9Ûÿ¹P‰·w/çyž¦÷-<`|Æ=;pÁÿʸgwžz*v… .ÍðørîŸò)þŒžŽþ~sGì0}¾‹–ãz~ýu¬“qïCµ¬çûŽƒ—^z ¾ïãÏþ3.¾øbÌž=k­µ~ö³Ÿá'?¡#·;œD†>9¤‚Äg)¿/†¢ ?Äd@÷ÚsO´ü÷¿PŽÛ=~ûÛßâÌ3ÏÄþóì·ß~ØÀºPNФþ|0Þ{ï=¬·ÞzØtÓMqÑEáž{îÁ-ú}ã |ík_Lœ87Ýtößüå/Á7ÞˆO<ýt¥á»VÝ‚ï?É÷” èÖX£Êiê Bþqˆº‰á®Í.2Èi^›]²×<ô*±À××ëon¦#÷ƒ7VS=‚pËŸÅÜùKQ¨kÀQî†|.íç­÷æâù×f`qk;†®1 ›ŽZ#¿6ù\(¶@J‰éÌÇ+¯MÃÜùK±Æk`«m¶Áºë¬xâ8Æ´iÓðÚk¯¡µµ#FŒÀ;ì€ææfë‰J)1}út¼òÊ+˜;w®ês«­°îºë¢µµS§NÅ´iÓPWW‡Í7ß›o¾yU•µUKßWÓwïSÓi7ªéÛÏ–éÕ ´@†>éù·jaûùP_Äw¡ºÕ¡"ßd — <äP‘ò¨È5½0º¡¾é¶ë±õ‹¡<`j¡=ËU›Fw Ù#€zvBå#”¡’{(Á“vaÃ(gƺ¿v(õ ”úÏš¨½tJP#t|4@耊èÓÁôä+š(³öQ]¸¬¤×¿¾‡ƒƒÃ烺º:,Y²…B_|q$Ü‹/¾'tJ¥úõë‡îîŸÏÂ8ÔX>Àìþý1é˜c°ï¾ûbÔ¨QhjjB[[¦OŸŽÇ·Ür fLŠïA½;y¤ÿp¨ß E>Z·/¸ÀºÛo“O>Ûo¿= €Å‹ã©§žÂ…^ˆÙÿûz§rÙÎüðÒKñÓŸþð§?ý ÿ8áüÕÁ î\ —{PÊ=¯ôï£kœçûS§â8½]ê}~%»gÿ<ùdì¦ñÙ=;¢»yTÿŽ<`FöÿîÔ©˜¨·á Ðï=7Úi„ €Ê“X¯—ëýîÿþ‡Ý‘VÎr&xtº[ßÇ­÷Ú §œr ¶Øb äóy¼õÖ[¸æškpóÍ7cÑ¢EX¸p!†œ><ÇúóáN;áÇ«z¾·ÜxclôÖ[˜à5ÏÃâÅ‹ÑÒÒ‚Í7߯½ò ¾¯·}À«• ‚ @WW~÷»ßá /ÄZå2¶… æ ÞtSÜvÛmXýõ1}útÜzë­¸ì²Ë0hÑ"l ŸSfäwÆŒÁ‹¯¼Rµ~üî»#÷ÐCI;>zÃB^¶¶ZFrŸYg†?bÕÅ”ê0tÂUJæó©ûðê•ÁóDZÉ7ìÆ…w¼Žã~fÏžÓN; ‹g½‰)<ÿ~ìM|ó¨‹pá…âŠ+®@J=¦µKæÏÅ+÷ÿgÿí!üâW§âç?ÿ9î½÷^ttt`ܸq7nÎ<ã zØaøå/‰cŽ9÷ß?ÖXc \|ñÅ2d~ðƒà†nÀ–Z *• Î>ûlüâ¿ÈîóÌ3qúé§ãúë¯Ç¬Y³0~üx\z饨b‹-pà&I+%èÞ,Ñ\ž÷tòþ拓‹¦«YªÌK†?îZ¤U@;LnjÂ.çžÛãzl¶É&:c¶0êšk0b½õ0aÂl¸á†¸ï¾û°Ï^{aÉ“ObSÑþû££\Æ„ ÐÞÞŽŸOš„Ý¡éMMøqFÿ£7Ù¹3ð5vŠß¾æ¬Ãö·÷^{aÞ“Ob=ýö߯þNž4 ßDµl§Ùßw,ýÍÕÊ@Y?›4 ÛëãÏÒ$>ÐÒßO>‰‘~`Yÿþ“ObCôÔ}>¸—öëø¡eý{O>‰ t_ÇxÍ5×`=Ö~¯½öJ”î¹çLž<7Üpõ’+•úZoÒÁÁ᫆ÃÙ<§‹P°'bË=ÖÞ6òi ½™ïr3¸“5¥6¦2L=õõM'À,iaÎ’‘4Aç\ÎØ.ëÜ©°ôCà·x¥ÝnËrÛh3ß%XÛŒFιhÒÓE–ãçÇiVò5ûã•ÿ EÞJö³¿>–ÿðŒçáá‡ÆÎ;ïŒsÎ97qHÞ"«ª®DÏÑyjCõ!b¤Ï‡™LÛtì·n¿ë®ªs·óÎxÿñÇÑŠêJÈŒÑýß »XD©»áèÓý,÷€® õÅó^”ÌßqG<úØcUŽøößþwT]K~M8ËBÈó ÕÁàþ«-ÔtÊ»1†þðfå<>¯žµ‰r†m xáÍY°÷8묳0kÆ4Lyây¬¿îüú€MñÄ´ñ‡ëîÅSO=…{ïº í ÞÇ®ÛÅÞ;o«À¯.¾W\ów´´´`ÛÍ7Â}×_¯yu@<ôôk¸ê¯7àö;î@ss3vÜqGÜ}÷ÝBà©§žÂôéÓÑÜÜŒ_üâxâ‰'°æš*f{ì±ÇâŠ+®P}n»-î»ï¾$²ÿÐCáÁÄ.»ì‚wÞuuu¸þúëqÐAa̘1‚¯½¶±°9å‡ ÿ©ZÑø›Ôô}ÅéYª#ýiQ—%óÕ”¢|u§Ê }À¨—øÿ­¾:®5 cÆŒÁ·ÞÂØ‘#qÿôéhiiÁ˖ᚎ;|0vÙv[ìÅ•ìdèòï e@‡PÑÿAú¡l]}uÜ«ûŸûÖ[ø&ª_þ GŽÄz–-Ãhëw&|0¾¹í¶ø”¡ØÇØßΨÖt†žšýõ_¶ ›X_÷·ó¶Ûbúø÷5êì Ÿú£c\Ûn»-åŒ=0}útüþ÷¿Ç£>º¢Ÿv‡•œfa3ÁÖÃÒ.¶´§vÜâ4Ь ¿Ô?©ÃyF¿f{Ó!È*œÕµ”ŽÅ¤‰rƒžúÜ! ç(`óÜ`·UÀõ,í¸qgs ¸Áo;^°õ9ÖÍwX¶ãÛóyM æÈO*• >ø`¼xÛmø¦±Ü¼Ç¦ÁoÞO4·áU¡¥±|Æ&›àÁ_D¡PH¶}ä‘Gpêî»cý(ʤv²@çN÷"oiG×ö !pÖäɉ2”J%ŒÛb ¬9mZÍŠÃ=Né+Ï­>¢@Ÿ(qñ‰Ëƒq¨OKÞEkgo5€þo¾‰;o»W³ Îÿý9˜|÷½øönßÀ½¿Ýÿ¹è(\vÇóX´¬ ÅÆþ˜ô‹ý1½LúÖ!;VEî}ßÃ~»n /.'g±Û7wÀ_ÿq³^ïcï½ö„ Ñ›|-‘÷ìîêÂâE €’3|ßÇ~ûíWEëÙm·Ý馩S§â£>B}}=êêê°ÑFáá‡Æ [07üg¨¢ Ç`ó l“IDATÿ¥+ÔÍ}O=& õ­\¬ þÅšâÓ® ~J/z(ˆÛ¿:€r9ìýïcT©„ºº: ˆ"ì E "ôCu¥ÄêeЌ었€zðVЖËáØÿݺÿ†(Âv†Oš„?]y%¥Wô‘išP#Û ïå‘F?8Ö西&¤/~³¿µ¹sS–®Õ/»i~ ÎK€Ë&MBª†€¹=90f{ó i@uÄŠ¶ýã¤I¡œ8³¿õ ¨\ô’ ±Ý}öÙ§êœî½÷^ì¸ãŽ8묳úx¾ þ7½ÿÈP°å0qã¹Üh Ù<þrÇ!+ª T'rÂ²ŽŒ}¢˜¿Sõ•èiìñʵfÅY2ÍýòkÁ t?~-lõG×6ßÇ~èšò\:¾Íy³9¼]­’p=O-íhýì"fBÑ„;ô1Ö#-06HŒÿ¬ˆ?ýOŽ€é,š£PY†;Ï€õ§MÃ÷ŠEìzÉ%8á„»ì² ž C<ðÀøÕþûcLGG•eãüP» ›·9ÔÓ„ÀQ—_Ž´|/áÒK/Å¿O<k³íùþhž¿„‡üøPüö·¿ÅÏ~ö3”K]µÁØf»o`È!Øzë­1jÔ(¼üÒ‹¾:îûî»<ðÎ9çœvÚi˜5k¶Þzk´¶¶bƒ 6À©§žŠ+®¸ Àøñã±öÚk〠Š(?_¸@óeˆý–ÖI~MW}›§(>]šâCj>I„_Í%Ôm¶éî)òOwª ÀBßÇŽ7ÞˆA«­†ñãÇ£¡TÂz¢J-‘z¼¸öZ¬5|8Žœ0ÛŽ…¿<ðöÙg¼ú䓨Jç¿+pÔÿ/ðËãÇZaˆ|b ïã0£ÿ|©„5„• £()yMhp†Þßa&`«Q£pÞß+O>‰]|è«÷÷‹ãÇaˆº0DJ‘ˆ^~céïå'ŸÄŽJA€Ÿý CÃk¡ú…3À1º¿C'LÀ£Fế—4è§Æú¯…ëǶÿþÈåó¸óæ›±€Ÿëö?ÖýÝ`´_ªr1­kô÷â“Obëéþn¿ùf¬ÍúËö¿nC¾¾ß~xñ±ÇP(•°Ýøñ¸øÏÆ;ì€çŸþ‹{ö¾0Ò7¸qFæ€-JÌ ýõÇ)?6ãÏftöædèr ™_F…¡9£éÐowÌ‘óB˱qJÜTjlϯ•éÐ˜í¸³U‹Ä®Þ[Ú‹>öËìZŽQ­ó -ÛeÑÆL‡À4ìù=å£8üØÈéó r¹ñFtÐAUm£(Â\€ËÎ;ÃÛÛ±6kÀ<6mŒ?ÏÞ»}4.¸à‚ù­7ÝtÎ8ø`lɶ³9ÐüÞ&÷Fž¤÷MGJßxzjòz…NžòV¾wÝb,íêy*BR¯Ù€çÏÙõðìqÞ xàUe…¶4äá{­@J451d@3Î:zoLØ},µ‡8òìë1õ¹X°x):»Jh¨+bµÁ±ë[ãÌ_ÿ‡ÿK¼=c&,XˆJ¥‚¦¦& º:.¾è"ì±ç^=ŽkÑ¢E8òÈ#1uêT,X°hhhÀj«­†\.‡éÓ§gÞ”6Úo²*kŸ ¸áß½TM¼¡¦sžVS’ñ|ë%@‡æð“šqú;th?qôÝ'ߢÒ\…§Å[{Õr˜ý|JŠë)(ã<‚ztꌃúÂÜ‹ž2š€Š÷×Ûg¡I÷‘\=]%‡Ù¥—å¡¢éT­÷1Ëþšì¢ÿ7¿è ô9òþ¶×ëŸ@:¬i¢ÀŽP?æËy±>¾n½<§¯Ézºª´8_?VÏ¿ ¥U®¾ JJ5«} û{Kß/ZŸ°9ÔÈ+zÛ€¯ëÿ§ýzÝ(fÔK•*æôµÛ =<‚ƒƒÃª‚é)§›8O›âdqÊ ê¯ÀÚ Ö/¡ÄúkÏ£Ù6ØŒc:F3ºŸåÐÈ€™°u\ Îìߌ(s£ÊFáé´,çŽ7ÖÀ–S{º†6ç‰çXø=Žƒ¶£ýÛœD›:_ϟæ|G°9<Dý±)èe «µoÓIãNàBkOš„‹/¹¤Šd¢µµ?þ8ž{î9¼øâ‹øàƒкx1ÊË–!ŸÏ…† † 7Üë®».vß}wì´ÓN™Iö¥R ÇwþwíµØ˜]c›b"?¿Šˆò½ŽŠ‰YKzÊHî³Q«‘|g^S‚(W€ƒÚ…ˆê pyPÛrÚ>(ÂWû>P׿ú6­Ê² ¡&°nÿGÊÀÇôÿ¨éÛ·«é,e–.š§fÉÀ'ÊqüÛµ¥OF1ôÛd;#K;zqðáª.6/X;Ê*ÙLOŸdýÚ"¼?Û‚9´Gž¾`íLÙÉ@45£;æöY2¡•Œ¾Mðè‡-9ÇÆä?xÜ0çýó—&_Ï·§ýÖÒ½â?64?VHÑ…¾ÇÜ`'pÊ-2oãgsƒø¶wu-ã@¿ dNÙŽÏf°™9æ>L^8EþI|¡ˆjÁ>à£Ú‰ Dbþ[Á&>Jb*Æe7¸mQÛZ×’ÎËo‡–öœ‡ÎßíÜx´ÑLl´0›1*-ýØrlƺy}l´0[n€=ÓÀ~ÌYÛ-ÐüÝïâˆcŽÁ¸qãðYaÊ”)øãÿˆwî»›#ý^ðg€;êÜIäß÷4 ˜Ow¥NþI@X=­×f^ËÚÕËy]¢î‡ zÚŽxíMêÛS]O³÷òõjšk„šÕƒ¯µYV%€®þ\Å'1ø£¢“yÉÐ'JO§6ô³ä^Šôóˆ¿)Ãi.·9üÅEW_Õ ¶ÑÓƒ÷VÓ«tꛬ]_¹†`Ûñ¤³s9ÿòöæ?Ôä}zl[3 ØvÌœsLJw9Êl;Á¶· M–-ýñ—*ÿQâ\¿”`û¡·µãû¿ŸDD¥ï—-Êj‹ØÛŒªmÇasl”›Ü M,ËùûÓöÌrÌ(½Iù!㞊üóàNÕ¹uH•bL ß·Mõ†®1åÞ‘¡n ÀºYÿÜ odûãA°~y`ÿþ.¯¶žÀ©:6Š’ÍàA±Z¹æ~x‚8Ÿ§ßsžôkÖÊ:vø5ꂪ0x—]°ÉV[aÓM7MŠ´õïßù|årK–,Áœ9s‰úgž~3ŸykBå99ÞÛ¨GÖ=¨E£JžYyªþŸz¢=,€@†;¡A× hbJé^uî@2‚@ŽõCǨ}☠¨Bm/< n€aø¯¢ HÿRKI½3´~ÿ{Єӭ›¥ç#Íñ_¦#ÿ”ÔÛ¹L·ÓO ½`ȰçüN6¥/hx¤Þ6Ôg“÷ÚZO÷ÐEêžÖ”ZÍ“ly­d£Z_Nj“•dSt°!ìCóܵ$Õ6ƒú£¯g7[O°ýàl2c\A‚÷Ǭlû±9kÜÀ ö“ûp-¾*øžžÚFôl|nNÛÎAço9—óÂZt[â¬M”y|DƒÖ™tF¾½jã–ú$ƒß<Sdþ¯CöõâA›áNûà7žÊ#ó|y-ãÏ6"ÀnhógÎæ ð [°Š—¸Ý@çÁGø¼Í(Ïr yÄŸKÚÁ< 'Ňƒ'‚Û¤Tmƒ-_‚?ÜiªE+«E]ªeoÉ]IÈ|ÌP'ÜQÉ@ïÐÖiI››ä𪴙˜š© Q4œF’í‚êv^ :«8ÄJù·Uæ%P¤æ#jJÜ~Ró™§HüZµ‡"ý‹õ¥&Ê9Dõ!*Ž­boȦdØó‡ƒ+8Ä–i-£“Ö¿¯§÷kÃ_ŸV•rŽÙo­áiÛПéñ÷fÄËŒ-’Í£@µQÈ Ö¾ÊmÒ~¹AÎoùï3¿V<Òo+Æ lêŸóÌùqÛFƒy ÑvOkQƒ¨^Ø lžw iù1i[æõ3ï¥)5Nù %¤J@Qƾ85Øö,€Í—Œý˜Ûm_KEÈ6R`Û.}r¬Ø0çð7Ÿ8þœD†~½Nâ%#˜’z©}§6+íÕýˆòSÖfm®UÀªž1û)@F©zÏ,íÌ~G*‹ì/Ò!r®âSÒ¡ü6}iÈÐç4z˜xòWÈá?6œsh¦âW­$^:>[HÛv[f{_,Ìõ¦ w zë‹'zñˆS-mãZº×6ƒ¿·–~jéþÖrÞlÛqÕ µÝ{›!cÓ²æÇi&|‚Ià÷–×M˜à 88ôÛX3c¹-ˆ£¯šê„¾ª’pž4iäïN›Ï©E6c•ŸíxiܰáíkBÀú³±µòŨ-ç›û·„Ìd`r²îy…õS‹bngž?vþ;ÎÏÑ6RÔXOótøh®Í¨´ªå4òþl×Å&d‘åõå7Øå÷™6L2|4dR„9e˜_ƒZt%n[Õú>Ù®¿§¶kÀs‚ü=açìSD?39@N›—|„€' “z9Ôw8hÄÀM_k_ÐÓ¾b¥1Ð6GÏQ˜9E9³5Õç#eÁwiÞtûÉЧÈ?Õ*#Ù6ü—êÝÓÃÓYcÞ6å}åQþ0Û†ydÀfðÛªÕqN -15϶ëMÎF ²)ödE8W0 ¶d¼ÞF%²®•Íù²ñ,k—­ì:,ýØ~øm/.µ±Ý ~¶‡nÖ__è\¶vê>Ð=Ý@²"æ1½•ÀåðåÃúPªdô pŠçú†H)YÆí{i3LmÁßÒŽÿpóï§[ðïƒm?`ëm›qfëþ6ÈfàÔ‰ì-‡ ë}@FyÀú0ßS¼ð—餘#ú¤dF“³¨?6ƒÔF£äT]~¹“ÕUœ¬kF°=“`Û×zæmÕ¡mùl6zZ­Ña~¼6I[è3ïqŒêïfVÂ/ýÏUÍçƒÞ9dßgÛóm«xm«ý`£Ùî½&Å‹l«ÿÈüéÊ;‡eÖIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/acquiring_data/helioviewer.rst0000644000175100001710000002321000000000000021776 0ustar00vstsdocker*********************************** Querying Helioviewer.org with sunpy *********************************** sunpy can be used to make several basic requests using the The `Helioviewer.org API `_ including generating a PNG screenshot and downloading a `JPEG 2000 `_ image. As you can get JPEG 2000 images, you will need two other pieces of software in order to open them in Python. The first is OpenJPEG which is an open source library for reading and writing JPEG2000 files. The other package you will need is `Glymur `_. Both of these are available as `conda `_ packages and ideally should be installed in this manner. Otherwise, please follow the instructions at `the OpenJPEG homepage `_ and the `Glymur homepage `_. To interact with the Helioviewer API, users first create a `~sunpy.net.helioviewer.HelioviewerClient` instance. The client instance can then be used to make various queries against the API using the same parameters one would use when making a web request. Note that the HelioviewerClient does not currently offer full access to the HelioViewer API. We provide the follwing functions: 1. Download a JPEG 2000 image for the specified datasource that is the closest match in time to the ``date`` requested. 2. As above but return the full JSON response instead of an image. 3. Return all available datasources. 4. Generates custom screenshots that allow labels and layers of images. 5. Download the header information present in a JPEG2000 image. This includes: - FITS header - Helioviewer-specific metadata. Nearly all requests require the user to specify the data they are interested in. Depending on the function, it consists of passing in either: *observatory*, *instrument*, *detector* and *measurement* or *source_id* keywords. To find out what the allowed values are, you can access the `~sunpy.net.helioviewer.HelioviewerClient.data_sources` dictionary that is an attribute of the Helioviewer client. Let us begin by retrieving the available list of sources that Helioviewer supports by using `~sunpy.net.helioviewer.HelioviewerClient.data_sources`:: >>> from sunpy.net import helioviewer >>> hv = helioviewer.HelioviewerClient() # doctest: +REMOTE_DATA >>> for sourceid, obs in hv.data_sources.items():# doctest: +REMOTE_DATA ... print(f"{sourceid}: {obs}") # doctest: +REMOTE_DATA ('SOHO', 'EIT', None, '171'): 0 ('SOHO', 'EIT', None, '195'): 1 ('SOHO', 'EIT', None, '284'): 2 ('SOHO', 'EIT', None, '304'): 3 ('SOHO', 'LASCO', 'C2', 'white-light'): 4 ('SOHO', 'LASCO', 'C3', 'white-light'): 5 ('SOHO', 'MDI', None, 'magnetogram'): 6 ('SOHO', 'MDI', None, 'continuum'): 7 ('SDO', 'AIA', None, '94'): 8 ('SDO', 'AIA', None, '131'): 9 ('SDO', 'AIA', None, '171'): 10 ('SDO', 'AIA', None, '193'): 11 ('SDO', 'AIA', None, '211'): 12 ('SDO', 'AIA', None, '304'): 13 ('SDO', 'AIA', None, '335'): 14 ('SDO', 'AIA', None, '1600'): 15 ('SDO', 'AIA', None, '1700'): 16 ('SDO', 'AIA', None, '4500'): 17 ('SDO', 'HMI', None, 'continuum'): 18 ('SDO', 'HMI', None, 'magnetogram'): 19 ... Every JPEG 2000 file provided by the Helioviewer Project has been processed to generate an image that can be used for browsing purposes. This typically involves following the standard image processing procedure used by each instrument team to convert their science data into an image for a webpage. The JPEG 2000 image is then scaled between 0 and 255 (byte-scaled). **Please note that the JPEG 2000 image data is not the same as the original science data.** Suppose we want to download a JPEG 2000 image of the latest AIA 304 image available on Helioviewer.org. From the list above, we know that SDO/AIA 304 is ``(('SDO', 'AIA', None, '304'), 13)``. So ``observatory="SDO"``,``instrument=AIA``, ``detector=None``, ``measurement=304`` and the ``source_id`` is 13. So we can use the approach as shown in the following example:: >>> from sunpy.net.helioviewer import HelioviewerClient >>> import matplotlib.pyplot as plt >>> hv = HelioviewerClient() # doctest: +REMOTE_DATA >>> file = hv.download_jp2('2012/01/01', observatory="SDO", instrument="AIA", ... measurement="304") # doctest: +REMOTE_DATA Since ``detector=None`` we can ignore this keyword and skip it when we call this function. As we also have the source_id for AIA 304, which is ``13``, we could make the same request using: :: file = hv.download_jp2('2012/01/01', source_id=13) Since this is a JPEG 2000 image, to plot this image you can either call Glymur directly:: >>> import glymur # doctest: +SKIP >>> im = glymur.Jp2k(file)[:] # doctest: +SKIP The better method is to load the image into a sunpy Map object:: >>> from sunpy.map import Map >>> aia = Map(file) # doctest: +SKIP >>> aia.peek() # doctest: +SKIP .. image:: helioviewer-1.png The sunpy Map selects a color table based on the JPEG 2000 image meta data for plotting. This will be the color table that is used by the Helioviewer Project to display JPEG 2000 images in their own clients. In this example we will query Helioviewer for the relevant JPEG 2000 file closest to the input time, for a SDO/HMI continuum image and crop to focus on an active region:: >>> from sunpy.net.helioviewer import HelioviewerClient >>> import matplotlib.pyplot as plt >>> from astropy.units import Quantity >>> from sunpy.map import Map >>> hv = HelioviewerClient() # doctest: +REMOTE_DATA >>> data_sources = hv.get_data_sources() # doctest: +REMOTE_DATA >>> filepath = hv.download_jp2('2012/07/05 00:30:00', observatory='SDO', ... instrument='HMI', measurement='continuum') # doctest: +REMOTE_DATA >>> hmi = Map(filepath) # doctest: +SKIP >>> xrange = Quantity([200, 550], 'arcsec') # doctest: +REMOTE_DATA >>> yrange = Quantity([-400, 200], 'arcsec') # doctest: +REMOTE_DATA >>> hmi.submap(xrange, yrange).peek() # doctest: +SKIP .. image:: helioviewer-2.png The other main method is `~sunpy.net.helioviewer.HelioviewerClient.download_png`. This allows more complex images to be created but again these are not the original science data. The biggest difference is that we do not use the separate keywords but have to pass them as a string of lists. This is the ``layer`` keyword in this function. We will recreate the first example using the PNG function:: >>> from sunpy.net.helioviewer import HelioviewerClient >>> import matplotlib.pyplot as plt >>> from matplotlib.image import imread >>> hv = HelioviewerClient() # doctest: +REMOTE_DATA >>> file = hv.download_png('2020/01/01', 4.8, "[SDO,AIA,304,1,100]", x0=0, y0=0, width=768, height=768, watermark=True) # doctest: +REMOTE_DATA >>> im = imread(file) # doctest: +REMOTE_DATA >>> plt.imshow(im) # doctest: +SKIP >>> plt.axis('off') # doctest: +SKIP >>> plt.show() # doctest: +SKIP .. image:: helioviewer-3.png Since this is just a PNG, we can use matplotlib directly to plot this image. Note that the filename of the returned file has the date and time of the request, not of any of the times shown in the image itself. **This is not a bug.** The reason for this is that the user may ask for images from multiple sources, and each of them may have a different observation time. The problem becomes which time is the most appropriate to associate with the resultant image. Helioviewer.org doesn't choose between the images times, but instead uses the request time to construct the image filename. This means that the image file names for request times in the future (like in this example) can look a little unusual compared to the times in the image. After the date string, we have a number (``4.8``) which refers to the image resolution in arcseconds per pixel (larger values mean lower resolution). The next input is the ``layers`` keyword which is ``"[SDO,AIA,304,1,100]"``. The first 4 are the observatory, instrument, detector, measurement values from before. Note that since SDO AIA has no detector value, you can skip this within the list. The ``1`` and ``100`` in the layer list refer to the visibility and opacity of the datasource. You can use the ``sourceid`` instead of the keywords, so it would be ``[13,1,100]`` for this example. Finally, the ``x0`` and ``y0`` are the center points about which to focus and the ``width`` and ``height`` are the pixel values for the image dimensions. These have defaults set so you do not need to supply these. In this example we will create a composite PNG image using data from two different SDO AIA wavelengths and LASCO C2 coronagraph data. The layer string is extended to include the additional data sources, and opacity is throttled down for the second AIA layer so that it does not completely block out the lower layer:: >>> from sunpy.net.helioviewer import HelioviewerClient >>> import matplotlib.pyplot as plt >>> from matplotlib.image import imread >>> hv = HelioviewerClient() # doctest: +REMOTE_DATA >>> file = hv.download_png('2012/01/01', 6, ... "[SDO,AIA,304,1,100],[SDO,AIA,193,1,50],[SOHO,LASCO,C2,white-light,1,100]", ... x0=0, y0=0, width=768, height=768, watermark=True) # doctest: +REMOTE_DATA >>> im = imread(file) # doctest: +REMOTE_DATA >>> plt.imshow(im) # doctest: +SKIP >>> plt.axis('off') # doctest: +SKIP >>> plt.show() # doctest: +SKIP .. image:: helioviewer-4.png For more information about using querying Helioviewer.org, see the `Helioviewer.org API documentation `_. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/acquiring_data/index.rst0000644000175100001710000000050600000000000020566 0ustar00vstsdocker.. _acquiring_data: ************************* Acquiring Data with sunpy ************************* In this section of the guide we will introduce the ways you can obtain different kind of solar data from different places. .. toctree:: :maxdepth: 2 sample-data fido jsoc hek helioviewer database ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/acquiring_data/jsoc.rst0000644000175100001710000010606400000000000020423 0ustar00vstsdocker*************************************** Querying and Downloading Data from JSOC *************************************** Joint Science Operations Center (JSOC) contains data products from the Solar Dynamics Observatory, as well as certain other missions and instruments. These data are available from the JSOC database, which can be directly accessed by the online `JSOC interface `__. sunpy's JSOC Client provides an easier interface to query for JSOC data and make export requests. It uses `drms module `_ as its backend, and exposes a similar API as the VSO Client. There are two ways of downloading JSOC data. One way is using sunpy's unified search interface, known as ``Fido``. ``Fido`` supplies a single, easy and consistent way to to obtain most forms of solar physics data. An alternative way to fetch data from JSOC is by using the underlying JSOC Client. This option can be preferred when you need to separate the staging and downloading steps, which is not supported by Fido. 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 and a table of these records is returned. Then you can request these records to be staged for download and then you can download them. Fido combines the last two stages into a single call to `~sunpy.net.fido_factory.UnifiedDownloaderFactory.fetch`. Setup ***** sunpy's Fido module is in `sunpy.net`. It can be imported as follows:: >>> from sunpy.net import Fido, attrs as a The JSOC client handles the particulars of how the data from the data provider is downloaded to your computer. .. warning:: You must have an email address registered with JSOC before you are allowed to make a request. See `this `__ to register your email address. Querying the JSOC ***************** To search for data in JSOC, your query needs at minimum, a "Series" name and a "PrimeKey". Different PrimeKeys are supported by different Series, and you can find out the PrimeKeys supported in any Series by: >>> import drms >>> c = drms.Client() # doctest: +REMOTE_DATA >>> print(c.pkeys('hmi.m_720s')) # doctest: +REMOTE_DATA ['T_REC', 'CAMERA'] The most common PrimeKey, that is supported by every Series is Time, that is denoted by ``T_REC`` or ``T_OBS``. Hence, Time can always be passed as an attribute while building a query. Wavelength is another pre-defined attribute which is a PrimeKey. Other PrimeKeys which need to be passed should be manually passed in `~sunpy.net.jsoc.attrs.PrimeKey`. This will be explained later in detail. Constructing a Basic Query ========================== Let's start with a very simple query. We could ask for all ``hmi.v_45s`` series data between January 1st from 00:00 to 01:00, 2014:: >>> res = Fido.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), ... a.jsoc.Series('hmi.v_45s')) # doctest: +REMOTE_DATA This returns an `~sunpy.net.fido_factory.UnifiedResponse` object containing information on the available online files which fit the criteria specified by the attrs objects in the above call. It does not download the files. To see a summary of results of our query, simply type the name of the variable set to the Fido search, in this case, ``res``:: >>> res # doctest: +REMOTE_DATA Results from 1 Provider: 81 Results from the JSOCClient: Source: http://jsoc.stanford.edu T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT ----------------------- -------- ---------- -------- ------- 2014.01.01_00:00:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:01:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:02:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:03:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:03:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:04:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:05:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:06:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:06:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:07:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 ... ... ... ... ... 2014.01.01_00:54:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:54:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:55:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:56:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:57:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:57:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:58:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:59:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_01:00:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_01:00:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 Length = 81 rows Now, let's break down the arguments of ``Fido.search`` to understand better what we've done. The first argument ``a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00')`` sets the start and end times for the query (any date/time format understood by sunpy's :ref:`parse_time function ` can be used to specify dates and time). The Time attribute takes UTC time, as default. If you need to pass a Time in some other time scale, such as TAI, pass an `astropy.time.Time` object, like:: >>> import astropy.time Then, the Time attribute can be passed as:: >>> a.Time(astropy.time.Time('2014-01-01T00:00:00', scale='tai'), astropy.time.Time('2014-01-01T01:00:00', scale='tai')) The second argument:: >>> a.jsoc.Series('hmi.v_45s') sets the series we are looking for. So what is going on here? The notion is that a JSOC query has a set of attribute objects, imported as ``a.jsoc``, that are specified to construct the query. ``a.jsoc.Series()`` is compulsory to be provided in each of the jsoc queries. Apart from this, at least one PrimeKey must be passed (generally ``a.Time()``). Querying with other PrimeKeys ============================= Other than Time, one other PrimeKey is supported with in-built attribute. In case of AIA series, ``a.Wavelength()`` can be passed as a PrimeKey:: >>> import astropy.units as u >>> res = Fido.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), ... a.jsoc.Series('aia.lev1_euv_12s'), ... a.Wavelength(304*u.AA)) # doctest: +REMOTE_DATA Note that, only Time and Wavelength are in-built attributes here. If you need to pass any other PrimeKey, it should be passed like this:: >>> a.jsoc.PrimeKey('HARPNUM', '4864') ('HARPNUM', '4864') If 2 or more PrimeKeys need to be passed together:: >>> a.jsoc.PrimeKey('HARPNUM', '4864') & a.jsoc.PrimeKey('CAMERA', '2') ('HARPNUM', '4864'), ('CAMERA', '2')])> Also, note that the pre-defined primekeys, Time and Wavelength can also be passed as above, but you need to specify the exact keyword for it. For e.g. by:: >>> a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), a.jsoc.PrimeKey('WAVELNTH', '161') (, ('WAVELNTH', '161')) If the correct keyword is not specified, or the passed PrimeKey is not supported by the given series, a meaningful error will be thrown, which will give you the PrimeKeys supported by that series. Hence, by looking at the error, one can easily retry building the query with correct PrimeKeys. Another important thing to note is that, Wavelength when passed through in-built attribute, should be passed as an astropy quantity. Specifying spectral units in arguments is necessary or an error will be raised. For more information on units, see `~astropy.units`. But, when the same is passed through PrimeKey attribute, it should be passed as a string. All other PrimeKey values passed through PrimeKey attribute, must be passed as a string. Manually specifying keyword data to fetch ========================================= Upon doing ``Fido.search()`` as described above, only a limited set of keywords are returned in the response object. These default keywords are ``'DATE'``, ``'TELESCOP'``, ``'INSTRUME'``, ``'T_OBS'`` and ``'WAVELNTH'``. If you want to get a manual set of keywords in the response object, you can pass the set of keywords using :meth:`~sunpy.net.base_client.QueryResponseTable.show` method. >>> res = Fido.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), ... a.jsoc.Series('hmi.v_45s')) # doctest: +REMOTE_DATA >>> res.show('TELESCOP', 'INSTRUME', 'T_OBS') # doctest: +REMOTE_DATA Results from 1 Provider: 81 Results from the JSOCClient: Source: http://jsoc.stanford.edu TELESCOP INSTRUME T_OBS -------- ---------- ----------------------- SDO/HMI HMI_FRONT2 2014.01.01_00:00:37_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:01:22_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:02:07_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:02:52_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:03:37_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:04:22_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:05:07_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:05:52_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:06:37_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:07:22_TAI ... ... ... SDO/HMI HMI_FRONT2 2014.01.01_00:53:07_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:53:52_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:54:37_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:55:22_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:56:07_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:56:52_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:57:37_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:58:22_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:59:07_TAI SDO/HMI HMI_FRONT2 2014.01.01_00:59:52_TAI SDO/HMI HMI_FRONT2 2014.01.01_01:00:37_TAI Length = 81 rows Passing an incorrect keyword won't throw an error, but the corresponding column in the table will not be displayed. To display all of the columns, we can use ``show()`` without passing any arguments:: >>> res.show() # doctest: +REMOTE_DATA Results from 1 Provider: 81 Results from the JSOCClient: Source: http://jsoc.stanford.edu DATE DATE__OBS ... CALVER64 -------------------- ----------------------- ... -------- 2014-01-05T17:46:02Z 2013-12-31T23:59:39.20Z ... 4370 2014-01-05T17:47:10Z 2014-01-01T00:00:24.20Z ... 4370 2014-01-05T17:48:18Z 2014-01-01T00:01:09.20Z ... 4370 2014-01-05T17:49:25Z 2014-01-01T00:01:54.20Z ... 4370 2014-01-05T17:50:34Z 2014-01-01T00:02:39.20Z ... 4370 2014-01-05T17:51:42Z 2014-01-01T00:03:24.20Z ... 4370 2014-01-05T17:52:50Z 2014-01-01T00:04:09.20Z ... 4370 2014-01-05T17:53:59Z 2014-01-01T00:04:54.20Z ... 4370 2014-01-05T17:55:08Z 2014-01-01T00:05:39.20Z ... 4370 2014-01-05T17:56:16Z 2014-01-01T00:06:24.20Z ... 4370 ... ... ... ... 2014-01-05T19:05:49Z 2014-01-01T00:52:09.20Z ... 4370 2014-01-05T17:35:43Z 2014-01-01T00:52:54.20Z ... 4370 2014-01-05T17:36:54Z 2014-01-01T00:53:39.20Z ... 4370 2014-01-05T17:38:01Z 2014-01-01T00:54:24.20Z ... 4370 2014-01-05T17:39:09Z 2014-01-01T00:55:09.20Z ... 4370 2014-01-05T17:40:17Z 2014-01-01T00:55:54.20Z ... 4370 2014-01-05T17:41:25Z 2014-01-01T00:56:39.20Z ... 4370 2014-01-05T17:42:33Z 2014-01-01T00:57:24.20Z ... 4370 2014-01-05T17:43:41Z 2014-01-01T00:58:09.20Z ... 4370 2014-01-05T17:44:52Z 2014-01-01T00:58:54.20Z ... 4370 2014-01-05T17:46:03Z 2014-01-01T00:59:39.20Z ... 4370 Length = 81 rows Using Segments ============== In some cases, more than 1 file are present for the same set of query. These data are distinguished by what are called Segments. It is necessary to specify the "Segment" which you need to download. Providing a segment won't have any affect on the response object returned, but this will be required later, while making an export request. A list of supported segments of a series, say ``hmi.sharp_720s`` can be obtained by:: >>> import drms >>> c = drms.Client() # doctest: +REMOTE_DATA >>> si = c.info('hmi.sharp_720s') # doctest: +REMOTE_DATA >>> print(si.segments.index.values) # doctest: +REMOTE_DATA ['magnetogram' 'bitmap' 'Dopplergram' 'continuum' 'inclination' 'azimuth' 'field' 'vlos_mag' 'dop_width' 'eta_0' 'damping' 'src_continuum' 'src_grad' 'alpha_mag' 'chisq' 'conv_flag' 'info_map' 'confid_map' 'inclination_err' 'azimuth_err' 'field_err' 'vlos_err' 'alpha_err' 'field_inclination_err' 'field_az_err' 'inclin_azimuth_err' 'field_alpha_err' 'inclination_alpha_err' 'azimuth_alpha_err' 'disambig' 'conf_disambig'] Also, if you provide an incorrect segment name, it will throw a meaningful error, specifying which segment values are supported by the given series:: >>> Fido.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), ... a.jsoc.Series('hmi.sharp_720s'), ... a.jsoc.Segment('image')) # doctest: +REMOTE_DATA Traceback (most recent call last): ... ValueError: Unexpected Segments were passed. The series hmi.sharp_720s contains the following Segments ['magnetogram', 'bitmap', 'Dopplergram', 'continuum', 'inclination', 'azimuth', 'field', 'vlos_mag', 'dop_width', 'eta_0', 'damping', 'src_continuum', 'src_grad', 'alpha_mag', 'chisq', 'conv_flag', 'info_map', 'confid_map', 'inclination_err', 'azimuth_err', 'field_err', 'vlos_err', 'alpha_err', 'field_inclination_err', 'field_az_err', 'inclin_azimuth_err', 'field_alpha_err', 'inclination_alpha_err', 'azimuth_alpha_err', 'disambig', 'conf_disambig'] To get files for more than 1 segment at the same time, chain ``a.jsoc.Segment()`` using ``AND`` operator:: >>> Fido.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), ... a.jsoc.Series('hmi.sharp_720s'), ... a.jsoc.Segment('continuum') & a.jsoc.Segment('magnetogram')) # doctest: +REMOTE_DATA Results from 1 Provider: 61 Results from the JSOCClient: Source: http://jsoc.stanford.edu T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT ----------------------- -------- --------- -------- ------- 2014.01.01_00:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:12:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:24:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:36:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:48:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_01:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:12:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:24:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:36:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 ... ... ... ... ... 2014.01.01_00:24:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:36:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:48:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_01:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:12:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:24:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:36:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:48:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_01:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 Length = 61 rows Using Keywords ============== In some cases, you might want to filter out files based on key metadata, also called keywords. A list of supported keywords of a series, say ``hmi.sharp_720s`` can be obtained by:: >>> import drms >>> c = drms.Client() # doctest: +REMOTE_DATA >>> keywords = c.keys('hmi.sharp_720s') # doctest: +REMOTE_DATA >>> print(keywords) # doctest: +REMOTE_DATA ['cparms_sg000', 'magnetogram_bzero', 'magnetogram_bscale', 'cparms_sg001', 'bitmap_bzero', 'bitmap_bscale', 'cparms_sg002', 'Dopplergram_bzero', 'Dopplergram_bscale', 'cparms_sg003', 'continuum_bzero', 'continuum_bscale', 'cparms_sg004', 'inclination_bzero', 'inclination_bscale', 'cparms_sg005', 'azimuth_bzero', 'azimuth_bscale', 'cparms_sg006', 'field_bzero', 'field_bscale', 'cparms_sg007', ... 'ERRJHT', 'ERRVF'] Each keyword needs to be compared to a value, e.g., ``a.jsoc.Keyword("bitmap_bzero") == 0`` or ``a.jsoc.Keyword("bitmap_bzero") > 1``. An of this example is:: >>> Fido.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), ... a.jsoc.Series('hmi.sharp_720s'),a.jsoc.Keyword('bitmap_bzero') == 0) # doctest: +REMOTE_DATA Results from 1 Provider: 61 Results from the JSOCClient: Source: http://jsoc.stanford.edu T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT ----------------------- -------- --------- -------- ------- 2014.01.01_00:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:12:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:24:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:36:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:48:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_01:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:12:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:24:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:36:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 ... ... ... ... ... 2014.01.01_00:12:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:24:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:36:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:48:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_01:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:12:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:24:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:36:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:48:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_01:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 Length = 61 rows You can pass multiple keywords and they will be chained together inside the query:: >>> Fido.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), a.jsoc.Series('hmi.sharp_720s'), ... a.jsoc.Keyword('bitmap_bzero') == 0, a.jsoc.Keyword('continuum_bscale') > 0) # doctest: +REMOTE_DATA Results from 1 Provider: 61 Results from the JSOCClient: Source: http://jsoc.stanford.edu T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT ----------------------- -------- --------- -------- ------- 2014.01.01_00:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:12:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:24:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:36:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:48:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_01:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:12:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:24:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:36:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 ... ... ... ... ... 2014.01.01_00:12:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:24:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:36:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:48:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_01:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:12:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:24:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:36:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_00:48:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 2014.01.01_01:00:00_TAI SDO/HMI HMI_SIDE1 6173.0 2145 Length = 61 rows If you provide a keyword without a comparison it will raise an error:: >>> Fido.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), ... a.jsoc.Series('hmi.sharp_720s'), ... a.jsoc.Keyword('bitmap_bzero')) # doctest: +REMOTE_DATA Traceback (most recent call last): ... ValueError: Keyword 'bitmap_bzero' needs to have a comparison to a value. If you provide an incorrect keyword name it will also raise a error:: >>> Fido.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), ... a.jsoc.Series('hmi.sharp_720s'), ... a.jsoc.Keyword('bac') == 0) # doctest: +REMOTE_DATA Traceback (most recent call last): ... ValueError: Keyword: 'bac' is not supported by series: hmi.sharp_720s Using Sample ============ In case you need to query for data, at some interval of time, say every 10 min, you can pass it using `~sunpy.net.attrs.Sample`. In other words, if you need to query for ``hmi.v_45s`` series data between January 1st from 00:00 to 01:00, 2014, every 10 minutes, you can do:: >>> import astropy.units as u >>> Fido.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), ... a.jsoc.Series('hmi.v_45s'), a.Sample(10*u.min)) # doctest: +REMOTE_DATA Results from 1 Provider: 7 Results from the JSOCClient: Source: http://jsoc.stanford.edu T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT ----------------------- -------- ---------- -------- ------- 2014.01.01_00:00:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:10:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:20:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:30:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:39:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:49:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:59:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 Note that the argument passed in ``a.Sample()`` must be an Astropy quantity, convertible into seconds. Constructing complex queries ============================ Complex queries can be built using ``OR`` operators. Let's look for 2 different series data at the same time:: >>> Fido.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), ... a.jsoc.Series('hmi.v_45s') | a.jsoc.Series('aia.lev1_euv_12s')) # doctest: +REMOTE_DATA Results from 2 Providers: 81 Results from the JSOCClient: Source: http://jsoc.stanford.edu T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT ----------------------- -------- ---------- -------- ------- 2014.01.01_00:00:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:01:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:02:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:03:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:03:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:04:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:05:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:06:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:06:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:07:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 ... ... ... ... ... 2014.01.01_00:54:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:54:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:55:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:56:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:57:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:57:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:58:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:59:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_01:00:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_01:00:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 Length = 81 rows 2107 Results from the JSOCClient: Source: http://jsoc.stanford.edu T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT -------------------- -------- -------- -------- ------- 2014-01-01T00:00:01Z SDO/AIA AIA_4 94 2145 2014-01-01T00:00:01Z SDO/AIA AIA_1 131 2145 2014-01-01T00:00:01Z SDO/AIA AIA_3 171 2145 2014-01-01T00:00:01Z SDO/AIA AIA_2 193 2145 2014-01-01T00:00:01Z SDO/AIA AIA_2 211 2145 2014-01-01T00:00:01Z SDO/AIA AIA_4 304 2145 2014-01-01T00:00:01Z SDO/AIA AIA_1 335 2145 2014-01-01T00:00:13Z SDO/AIA AIA_4 94 2145 2014-01-01T00:00:13Z SDO/AIA AIA_1 131 2145 2014-01-01T00:00:13Z SDO/AIA AIA_3 171 2145 ... ... ... ... ... 2014-01-01T00:59:49Z SDO/AIA AIA_2 211 2145 2014-01-01T00:59:49Z SDO/AIA AIA_4 304 2145 2014-01-01T00:59:49Z SDO/AIA AIA_1 335 2145 2014-01-01T01:00:01Z SDO/AIA AIA_4 94 2145 2014-01-01T01:00:01Z SDO/AIA AIA_1 131 2145 2014-01-01T01:00:01Z SDO/AIA AIA_3 171 2145 2014-01-01T01:00:01Z SDO/AIA AIA_2 193 2145 2014-01-01T01:00:01Z SDO/AIA AIA_2 211 2145 2014-01-01T01:00:01Z SDO/AIA AIA_4 304 2145 2014-01-01T01:00:01Z SDO/AIA AIA_1 335 2145 Length = 2107 rows The two series names are joined together by the operator ``|``. This is the ``OR`` operator. Think of the above query as setting a set of conditions which get passed to the JSOC. Let's say you want all the ``hmi.v_45s`` data from two separate days:: >>> Fido.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00') | ... a.Time('2014-01-02T00:00:00', '2014-01-02T01:00:00'), ... a.jsoc.Series('hmi.v_45s')) # doctest: +REMOTE_DATA Results from 2 Providers: 81 Results from the JSOCClient: Source: http://jsoc.stanford.edu T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT ----------------------- -------- ---------- -------- ------- 2014.01.01_00:00:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:01:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:02:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:03:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:03:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:04:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:05:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:06:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:06:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:07:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 ... ... ... ... ... 2014.01.01_00:54:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:54:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:55:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:56:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:57:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:57:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:58:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:59:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_01:00:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_01:00:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 Length = 81 rows 81 Results from the JSOCClient: Source: http://jsoc.stanford.edu T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT ----------------------- -------- ---------- -------- ------- 2014.01.02_00:00:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:01:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:02:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:03:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:03:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:04:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:05:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:06:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:06:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:07:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 ... ... ... ... ... 2014.01.02_00:54:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:54:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:55:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:56:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:57:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:57:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:58:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_00:59:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_01:00:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.02_01:00:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 Length = 81 rows Each of the arguments in this query style can be thought of as setting conditions that the returned records must satisfy. It should be noted that ``AND`` operator is supported by some of the attributes only. The attributes which support "&" are `~sunpy.net.jsoc.attrs.PrimeKey` and `~sunpy.net.jsoc.attrs.Segment`. Using "&" with any other attributes will throw an error. Downloading data **************** To download the files located by `~sunpy.net.fido_factory.UnifiedDownloaderFactory.search`, you can download them by `~sunpy.net.fido_factory.UnifiedDownloaderFactory.fetch`:: >>> Fido.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), ... a.jsoc.Series('hmi.v_45s') | a.jsoc.Series('aia.lev1_euv_12s'), ... a.jsoc.Notify('solar@example.com') # doctest: +SKIP >>> downloaded_files = Fido.fetch(res) # doctest: +SKIP To export a request for download, you must have used the `sunpy.net.jsoc.attrs.Notify` attribute at search time to specify your email address. .. note:: **Only complete searches can be downloaded from JSOC**, this means that no slicing operations performed on the results object will affect the number of files downloaded. Using JSOCClient for complex usage ********************************** Fido interface uses `~sunpy.net.jsoc.JSOCClient` in its backend, and combines the last 2 stages the JSOC process into one. You can directly use the JSOC client to make queries, instead of the Fido client. This will allow you to separate the 3 stages of the JSOC process, and perform it individually, hence allowing a greater control over the whole process. Setup ===== sunpy's JSOC module is in `~sunpy.net`. It can be imported as follows:: >>> from sunpy.net import jsoc >>> client = jsoc.JSOCClient() # doctest: +REMOTE_DATA This creates your client object. Making a query ============== Querying JSOC using the JSOC client is very similar to what we were doing with Fido. As above, we have to make sure we have an email address registered with JSOC before you are allowed to make a request. See `this `__ to register your email address. We can add an email address to the search query with the `sunpy.net.jsoc.attrs.Notify` attribute. Please note you can search without this but right now, you can not add the email address after the search:: >>> from sunpy.net import attrs as a >>> res = client.search(a.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), ... a.jsoc.Series('hmi.v_45s'), ... a.jsoc.Notify('sunpy@sunpy.org')) # doctest: +REMOTE_DATA Apart from the function name, everything is the same. You need to pass the same values in the `~sunpy.net.jsoc.JSOCClient.search` as you did in `~sunpy.net.fido_factory.UnifiedDownloaderFactory.search`. Complex queries can be built in a similar way, and all other things are the same. Staging the request =================== JSOC is a 3-stage process, and after getting the query results, we need to stage a request for the data to be downloaded. Only then, can we download them. The download request can be staged like this:: >>> requests = client.request_data(res) # doctest: +SKIP >>> print(requests) # doctest: +SKIP The function `~sunpy.net.jsoc.JSOCClient.request_data` stages the request. It returns a `drms.client.ExportRequest` object, which has many attributes. The most important ones are ``id`` and ``status``. Only when the status is 0, we can move to the third step, i.e. downloading the data. If you are making more than 1 query at a time, it will return a list of `~drms.client.ExportRequest` objects. Hence, access the list elements accordingly. You can get the id and status of the request (if it is not a list) by:: >>> requests.id # doctest: +SKIP JSOC_20170713_1461 >>> requests.status # doctest: +SKIP 0 Downloading data ================ Once the status code is 0 you can download the data using the `~sunpy.net.jsoc.JSOCClient.get_request` method:: >>> res = client.get_request(requests) # doctest: +SKIP This returns a Results instance which can be used to watch the progress of the download:: >>> res.wait(progress=True) # doctest: +SKIP ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/acquiring_data/sample-data.rst0000644000175100001710000000117500000000000021652 0ustar00vstsdocker.. _sample-data: *********************** Downloading Sample Data *********************** sunpy provides a number of sample data files which are referenced in the documentation and examples. These files are available to download onto your local machine so that you can try out the code in the documentation. To download the sample data simply run the following command:: import sunpy.data.sample This will download the data to your sample-data directory which can be customized by editing the sunpyrc file (see :doc:`../customization`). After running this you can then import the sample data files shortcuts which are used below. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/customization.rst0000644000175100001710000000414700000000000017421 0ustar00vstsdocker.. _customizing-sunpy: ***************** Customizing sunpy ***************** .. _customizing-with-sunpyrc-files: The :file:`sunpyrc` file ======================== The sunpy core package uses a :file:`sunpyrc` configuration file to customize certain properties. You can control a number of key features of sunpy such as where your data will download to. sunpy looks for the ``sunpyrc`` file in a platform specific directory, which you can see the path for by running:: >>> import sunpy >>> sunpy.print_config() # doctest: +SKIP FILES USED: ... CONFIGURATION: [general] time_format = %Y-%m-%d %H:%M:%S working_dir = ... [downloads] download_dir = ... remote_data_manager_dir = ... cache_expiry = 10 sample_dir = ... [database] url = sqlite:////... [logger] log_level = INFO use_color = True log_warnings = True log_exceptions = False log_to_file = False log_file_level = INFO log_file_format = %(asctime)s, %(origin)s, %(levelname)s, %(message)s To maintain your own customizations place a copy of the default sunpyrc file into the *first* path printed above. You can use `sunpy.util.config.copy_default_config` to write the default config into the correct place. Do not edit the default file directly as every time you install or update sunpy, this file will be overwritten. See below for the example config file. .. _customizing-with-dynamic-settings: Dynamic settings =================== You can also dynamically change the default settings in a python script or interactively from the python shell. All of the settings are stored in a Python ConfigParser instance called ``sunpy.config``, which is global to the sunpy package. Settings can be modified directly, for example:: import sunpy sunpy.config.set('downloads', 'download_dir', '/home/user/Downloads') .. sunpyrc-sample: A sample sunpyrc file -------------------------------------------------------------------- .. only:: html `(download) <../_static/sunpyrc>`__ .. literalinclude:: ../../sunpy/data/sunpyrc ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.5572743 sunpy-3.1.5/docs/guide/data_types/0000755000175100001710000000000000000000000016106 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/data_types/index.rst0000644000175100001710000000033100000000000017744 0ustar00vstsdocker******************* Data Types in sunpy ******************* In this section of the guide we introduce the parts of sunpy used to load and represent solar data. .. toctree:: :maxdepth: 2 maps timeseries ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/data_types/maps.rst0000644000175100001710000010513600000000000017606 0ustar00vstsdocker**** Maps **** Maps in sunpy are are 2-dimensional data associated with a coordinate system. In this guide, we will cover some of the basic functionality of maps. Once you've read through this guide check out :doc:`/code_ref/map` for a more thorough look at sunpy maps. There you can see what instruments are currently supported or you can access the code reference for each instrument-specific map subclass. Creating maps ============= To make things easy, sunpy can download several example files which are used throughout the docs. These files have names like ``sunpy.data.sample.AIA_171_IMAGE`` and ``sunpy.data.sample.RHESSI_IMAGE``. To create a `~sunpy.map.Map` from the the sample AIA image type the following into your Python shell:: >>> import sunpy >>> import sunpy.map >>> import sunpy.data.sample # doctest: +REMOTE_DATA >>> my_map = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) # doctest: +REMOTE_DATA The variable my_map is an `~sunpy.map.sources.AIAMap` object. To create one from a local FITS file try the following:: >>> my_map = sunpy.map.Map('/mydirectory/mymap.fits') # doctest: +SKIP sunpy should automatically detects the type of file (e.g. FITS), what instrument it is associated with (e.g. AIA, EIT, LASCO) and will automatically look in the appropriate places for the FITS keywords it needs to interpret the coordinate system. If the type of FITS file is not recognized then sunpy will try some default FITS keywords and return a `~sunpy.map.GenericMap` but results may vary. sunpy can also create maps from the jpg2000 files from `helioviewer.org `_. Creating Custom Maps ==================== It is also possible to create maps using custom data (e.g. from a simulation or an observation from a data source that is not explicitly supported in sunpy.) To do this you need to provide `sunpy.map.Map` with both the data array as well as appropriate meta information. The meta information is important as it informs the `sunpy.map.Map` of the correct coordinate information associated with the data array. The meta information should be provided to `sunpy.map.Map` in the form of a header as a `dict` or `~sunpy.util.MetaDict`. The keys that are required for the header information follows the `FITS standard `_. sunpy now provides a map header helper function to assist the user in creating a header that contains the correct meta information to generate a `sunpy.map.Map`. The helper functionality includes a `~sunpy.map.meta_keywords` function that will return a `dict` of all the current meta keywords and their descriptions currently used by `sunpy.map.Map` to make a map:: >>> from sunpy.map import meta_keywords >>> meta_keywords() # doctest: +SKIP {'cunit1': 'Units of the coordinate increments along naxis1 e.g. arcsec **required', 'cunit2': 'Units of the coordinate increments along naxis2 e.g. arcsec **required', 'crval1': 'Coordinate value at reference point on naxis1 **required' ... There is also functionality also includes a utility function `~sunpy.map.make_fitswcs_header` that will return a header with the appropiate FITS keywords once the map data array and an `astropy.coordinates.SkyCoord` or `sunpy.coordinates.frames` is passed. The `astropy.coordinates.SkyCoord` is defined by the user, and contains information on the reference frame, reference coordinate and observer location. The function returns a `sunpy.util.MetaDict`. The `astropy.coordinates.SkyCoord` or `sunpy.coordinates.frames` must contain an observation time. The `~sunpy.map.make_fitswcs_header` function also takes optional keywords arguments including ``reference_pixel`` and ``scale`` which describe the pixel coordinate at the reference coordinate (defined by the `~astropy.coordinates.SkyCoord`) and the spatial scale of the pixels, respectively. If neither of these are given their values default to the center of the data array and 1 arcsec, respectively. Here's an example of creating a header from some generic data and an `astropy.coordinates.SkyCoord`:: >>> import numpy as np >>> import astropy.units as u >>> from sunpy.coordinates import frames >>> from astropy.coordinates import SkyCoord >>> data = np.arange(0,100).reshape(10,10) >>> coord = SkyCoord(0*u.arcsec, 0*u.arcsec, obstime = '2013-10-28', observer = 'earth', frame = frames.Helioprojective) >>> header = sunpy.map.make_fitswcs_header(data, coord) >>> for key, value in header.items(): ... print(f"{key}: {value}") wcsaxes: 2 crpix1: 5.5 crpix2: 5.5 cdelt1: 1.0 cdelt2: 1.0 cunit1: arcsec cunit2: arcsec ctype1: HPLN-TAN ctype2: HPLT-TAN crval1: 0.0 crval2: 0.0 lonpole: 180.0 latpole: 0.0 mjdref: 0.0 date-obs: 2013-10-28T00:00:00.000 rsun_ref: 695700000.0 dsun_obs: 148644585949.49 hgln_obs: 0.0 hglt_obs: 4.7711570596394 naxis: 2 naxis1: 10 naxis2: 10 pc1_1: 1.0 pc1_2: -0.0 pc2_1: 0.0 pc2_2: 1.0 rsun_obs: 965.3829548285768 From this we can see now that the function returned a `sunpy.util.MetaDict` that populated the standard FITS keywords with information provided by the passed `astropy.coordinates.SkyCoord`, and the data array. Since the ``reference_pixel`` and keywords were not passed in the example above, the values of ``crpix`` and ``cdelt`` were set to the default values. These keywords can be passed to the function in the form of an `astropy.units.Quantity` with associated units. Here's another example of passing ``reference_pixel`` and ``scale`` to the function:: >>> header = sunpy.map.make_fitswcs_header(data, coord, ... reference_pixel=u.Quantity([5, 5]*u.pixel), ... scale=u.Quantity([2, 2] *u.arcsec/u.pixel)) >>> for key, value in header.items(): ... print(f"{key}: {value}") wcsaxes: 2 crpix1: 6.0 crpix2: 6.0 cdelt1: 2.0 cdelt2: 2.0 cunit1: arcsec cunit2: arcsec ctype1: HPLN-TAN ctype2: HPLT-TAN crval1: 0.0 crval2: 0.0 lonpole: 180.0 latpole: 0.0 mjdref: 0.0 date-obs: 2013-10-28T00:00:00.000 rsun_ref: 695700000.0 dsun_obs: 148644585949.49 hgln_obs: 0.0 hglt_obs: 4.7711570596394 naxis: 2 naxis1: 10 naxis2: 10 pc1_1: 1.0 pc1_2: -0.0 pc2_1: 0.0 pc2_2: 1.0 rsun_obs: 965.3829548285768 As we can see, a list of WCS and observer meta information is contained within the generated headers, however we may want to include other meta information including the observatory name, the wavelength and waveunit of the observation. Any of the keywords listed in ``header_helper.meta_keywords`` can be passed to the `~sunpy.map.make_fitswcs_header` and will then populate the returned MetaDict header. Furthermore, the following observation keywords can be passed to the `~sunpy.map.make_fitswcs_header` function and will be translated to the FITS standard: ``observtory``, ``instrument``,``telescope``, ``wavelength``, ``exposure``. An example of creating a header with these additional keywords:: >>> header = sunpy.map.make_fitswcs_header(data, coord, ... reference_pixel = u.Quantity([5, 5]*u.pixel), ... scale = u.Quantity([2, 2] *u.arcsec/u.pixel), ... telescope = 'Test case', instrument = 'UV detector', ... wavelength = 1000*u.angstrom) >>> header # doctest: +SKIP MetaDict([('wcsaxes', 2), ('crpix1', 5.0), ('crpix2', 5.0), ('cdelt1', ), ('cdelt2', ), ('cunit1', Unit("arcsec")), ('cunit2', Unit("arcsec")), ('ctype1', 'HPLN-TAN'), ('ctype2', 'HPLT-TAN'), ('crval1', 0.0), ('crval2', 0.0), ... ('date-obs', '2013-10-28T00:00:00.000'), ('hgln_obs', 0.0), ('hglt_obs', 4.7711570596394015), ('dsun_obs', 148644585949.4918), ('rsun_ref', 695700.0), ('rsun_obs', 965.3829548285768), ('instrume', 'Test case'), ('wavelnth', 1000), ('detector', 'UV detector'), ('waveunit', 'angstrom')]) From these header MetaDict's that are generated, we can now create a custom map:: >>> my_map = sunpy.map.Map(data, header) # doctest: +SKIP >>> my_map.peek() # doctest: +SKIP Inspecting maps =============== A map contains a number of data-associated attributes. To get a quick look at your map simply type:: >>> my_map = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) # doctest: +REMOTE_DATA >>> my_map # doctest: +REMOTE_DATA 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: [511.5 511.5] pix Reference Coord: [3.22309951 1.38578135] arcsec array([[ -95.92475 , 7.076416 , -1.9656711, ..., -127.96519 , -127.96519 , -127.96519 ], [ -96.97533 , -5.1167884, 0. , ..., -98.924576 , -104.04137 , -127.919716 ], [ -93.99607 , 1.0189276, -4.0757103, ..., -5.094638 , -37.95505 , -127.87541 ], ..., [-128.01454 , -128.01454 , -128.01454 , ..., -128.01454 , -128.01454 , -128.01454 ], [-127.899666 , -127.899666 , -127.899666 , ..., -127.899666 , -127.899666 , -127.899666 ], [-128.03072 , -128.03072 , -128.03072 , ..., -128.03072 , -128.03072 , -128.03072 ]], dtype=float32) This will show a representation of the data as well as some of its associated attributes. A number of other attributes are also available, for example the `~sunpy.map.GenericMap.date`, `~sunpy.map.GenericMap.exposure_time`, `~sunpy.map.GenericMap.center` and others (see `~sunpy.map.GenericMap`):: >>> map_date = my_map.date # doctest: +REMOTE_DATA >>> map_exptime = my_map.exposure_time # doctest: +REMOTE_DATA >>> map_center = my_map.center # doctest: +REMOTE_DATA To get a list of all of the attributes check the documentation by typing:: >>> help(my_map) # doctest: +SKIP Many attributes and functions of the map classes accept and return `~astropy.units.quantity.Quantity` or `~astropy.coordinates.SkyCoord` objects, please refer to :ref:`units-coordinates-sunpy` for more details. The meta data for the map is accessed by :: >>> header = my_map.meta # doctest: +REMOTE_DATA This references the meta data dictionary with the header information as read from the source file. Getting at the data =================== The data in a sunpy Map object is accessible through the `~sunpy.map.GenericMap.data` attribute. The data is implemented as a NumPy `~numpy.ndarray`, so for example, to get the 0th element in the array :: >>> my_map.data[0, 0] # doctest: +REMOTE_DATA -95.92475 >>> my_map.data[0][0] # doctest: +REMOTE_DATA -95.92475 One important fact to remember is that the first index is for the y direction while the second index is for the x direction. For more information about indexing please refer to the `Numpy documentation `_. Data attributes like `~numpy.ndarray.dtype` and `~sunpy.map.GenericMap.dimensions` are accessible through the SunPyGenericMap object :: >>> my_map.dimensions # doctest: +REMOTE_DATA PixelPair(x=, y=) >>> my_map.dtype # doctest: +REMOTE_DATA dtype('float32') Here the dimensions attribute is similar to the `~numpy.ndarray.shape` attribute, however returning an `~astropy.units.quantity.Quantity`. If you'd like to use the data in a sunpy `~sunpy.map.GenericMap` object elsewhere, you can use either of the following:: >>> var = my_map.data # doctest: +REMOTE_DATA >>> var = my_map.data.copy() # doctest: +REMOTE_DATA Python makes use of pointers so if you want to alter the data and keep the original data in the map intact make sure to copy it. To create a complete copy of a Map object that is entirely independent of the original, use the built-in `copy.deepcopy` method, like so:: >>> import copy # doctest: +REMOTE_DATA >>> my_map_deepcopy = copy.deepcopy(my_map) # doctest: +REMOTE_DATA A deepcopy ensures that any changes in the original Map object are not reflected in the copied object and vice versa. Note that this is different from simply copying the data of the Map object - this copies all of the other attributes and methods as well. Some basic statistical functions on the data array are also passed through to Map objects:: >>> my_map.min() # doctest: +REMOTE_DATA -129.78036 >>> my_map.max() # doctest: +REMOTE_DATA 192130.17 >>> my_map.mean() # doctest: +REMOTE_DATA 427.02252 but you can also access all the other `~numpy.ndarray` functions and attributes by accessing the data array directly. For example:: >>> my_map.data.std() # doctest: +REMOTE_DATA 826.41016 Plotting ======== As is true of all of the sunpy data objects, the sunpy `~sunpy.map.GenericMap` object (and all of its instrument-specific sub-classes) has its own built-in plot methods so that it is easy to quickly view your map. To create a plot just type:: >>> my_map.peek() # doctest: +SKIP This will open a matplotlib plot on your screen. In addition, to enable users to modify the plot it is possible to grab the matplotlib axes object by using the `~sunpy.map.GenericMap.plot()` command. This makes it possible to use the sunpy plot as the foundation for a more complicated figure. For a bit more information about this and some examples see :ref:`plotting`. .. note:: If the `astropy.visualization.wcsaxes` package is not used (it is used by default) the `~sunpy.map.GenericMap.plot()` and `~sunpy.map.GenericMap.peek()` methods assume that the data is not rotated, i.e. the solar y axis is oriented with the columns of the array. If this condition is not met (in the metadata), when the map is plotted a warning will be issued. You can create an oriented map by using `~sunpy.map.GenericMap.rotate()` before you plot the Map. Plotting Keywords ----------------- For Map `~matplotlib.pyplot.imshow` does most of the heavy lifting in the background while sunpy makes a number of choices for you so that you don't have to (e.g. colortable, plot title). Changing these defaults is made possible through two simple interfaces. You can pass any `~matplotlib.pyplot.imshow` keyword into the plot command to override the defaults for that particular plot. The following plot changes the default AIA color table to use an inverse Grey color table. .. plot:: :include-source: import sunpy.map import sunpy.data.sample import matplotlib.pyplot as plt smap = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) fig = plt.figure() smap.plot(cmap=plt.cm.Greys_r) plt.colorbar() plt.show() You can view or make changes to the default settings through the ``sunpy.map.GenericMap.plot_settings`` dictionary. In the following example we change the title of the plot by changing the ``sunpy.map.GenericMap.plot_settings`` property. .. plot:: :include-source: import sunpy.map import sunpy.data.sample import matplotlib.pyplot as plt smap = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) smap.plot_settings['title'] = "My Second sunpy Plot" smap.plot_settings['cmap'] = plt.cm.Blues_r fig = plt.figure() smap.plot() plt.colorbar() plt.show() Colormaps and Normalization --------------------------- Image data is generally shown in false color in order to better identify it or to better visualize structures in the image. Matplotlib handles this colormapping process through the `~matplotlib.colors` module. This process involves two steps: the data array is first mapped onto the range 0-1 using an instance of `~matplotlib.colors.Normalize` or a subclass; then this number is mapped to a color using an instance of a subclass of a `~matplotlib.colors.Colormap`. sunpy provides the colormaps for each mission as defined by the mission teams. The Map object chooses the appropriate colormap for you when it is created as long as it recognizes the instrument. To see what colormaps are available:: >>> import sunpy.visualization.colormaps as cm >>> cm.cmlist.keys() dict_keys(['goes-rsuvi94', 'goes-rsuvi131', 'goes-rsuvi171', 'goes-rsuvi195', 'goes-rsuvi284', 'goes-rsuvi304', 'sdoaia94', 'sdoaia131', 'sdoaia171', ... The sunpy colormaps are registered with matplotlib so you can grab them like you would any other colormap:: >>> import matplotlib.pyplot as plt >>> import sunpy.visualization.colormaps You need to import `sunpy.visualization.colormaps` or `sunpy.map` for this to work:: >>> cmap = plt.get_cmap('sdoaia171') The following plot shows off all of the colormaps. .. plot:: import matplotlib.pyplot as plt import sunpy.visualization.colormaps as cm cm.show_colormaps() These can be used with the standard commands to change the colormap. So for example if you wanted to plot an AIA image but use an EIT colormap, you would do so as follows. .. plot:: :include-source: import sunpy.map import sunpy.data.sample import matplotlib.pyplot as plt smap = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) cmap = plt.get_cmap('sohoeit171') fig = plt.figure() smap.plot(cmap=cmap) plt.colorbar() plt.show() or you can just change the colormap for the map itself as follows:: >>> smap.plot_settings['cmap'] = plt.get_cmap('sohoeit171') # doctest: +SKIP The normalization is also set automatically and is chosen so that all the data from minimum to maximum is displayed as best as possible for most cases. This means that it is never necessary to touch the data such as applying a function such sqrt or log to the data to make your plot look good. There are many normalizations available from matplotlib such as `~matplotlib.colors.LogNorm`. Other `more exotic normalizations `_ are also made available from Astropy. Just like the colormap the default normalization can be changed through the plot_settings dictionary or directly for the individual plot by passing a keyword argument. The following example shows the difference between a linear and logarithmic normalization on an AIA image. .. plot:: :include-source: import sunpy.map import sunpy.data.sample import matplotlib.pyplot as plt import matplotlib.colors as colors smap = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) fig = plt.figure(figsize=(4, 9)) ax1 = fig.add_subplot(2, 1, 1, projection=smap) smap.plot(norm=colors.Normalize(), title='Linear normalization') plt.colorbar() ax2 = fig.add_subplot(2, 1, 2, projection=smap) smap.plot(norm=colors.LogNorm(), title='Logarithmic normalization') plt.colorbar() plt.show() Note how the color in the colorbar does not change since these two maps share the same colormap while the data values associated with each color do because the normalization is different. Masking and Clipping Data ========================= It is often necessary for the purposes of display or otherwise to ignore certain data in an image. For example, a large data value could be due to cosmic ray hits and should be ignored. The most straightforward way to ignore this kind of data in plots without altering the data is to clip it. This can be achieved very easily by using the ``clip_interval`` keyword. For example:: >>> import astropy.units as u >>> smap.plot(clip_interval=(1, 99.5)*u.percent) #doctest: +SKIP This clips out the dimmest 1% of pixels and the brightest 0.5% of pixels. With those outlier pixels clipped, the resulting image makes better use of the full range of colors. If you'd like to see what areas of your images got clipped, you can modify the colormap:: >>> cmap = map.cmap # doctest: +SKIP >>> cmap.set_over('blue') # doctest: +SKIP >>> cmap.set_under('green') # doctest: +SKIP This will color the areas above and below in red and green respectively (similar to this `example `_). You can use the following colorbar command to display these choices:: >>> plt.colorbar(extend='both') # doctest: +SKIP Here is an example of this put to use on an AIA image. .. plot:: :include-source: import astropy.units as u import matplotlib.pyplot as plt import sunpy.map import sunpy.data.sample smap = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) cmap = smap.cmap.copy() cmap.set_over('blue') cmap.set_under('green') fig = plt.figure(figsize=(12, 4)) ax1 = fig.add_subplot(1, 2, 1, projection=smap) smap.plot(title='Without clipping') plt.colorbar() ax2 = fig.add_subplot(1, 2, 2, projection=smap) smap.plot(clip_interval=(1, 99.5)*u.percent, title='With clipping') plt.colorbar(extend='both') plt.show() Another approach to clipping data is to specify explicit values for the minimum and maximum pixel values using the plotting keywords ``vmin`` and ``vmax``. Clipping excludes data that has extreme values, but there can be other forms of bad data. A mask is a boolean array and so can give you much more fine-grained control over what is not being displayed. A `~numpy.ma.MaskedArray` is a subclass of a numpy array so it has all of the same properties with the addition of an associated boolean array which holds the mask. See `this example `_ in our gallery. .. the following is a good example which could be fixed and added later .. The following plot achieves the same goal as above but using a mask instead of clipping. .. import sunpy.map import matplotlib.pyplot as plt import matplotlib.colors as colors cmap = smap.plot_settings['cmap'] cmap.set_bad('blue', 1.0) smap = sunpy.map.Map('/Users/schriste/Downloads/old downloads/foxsi_ar_data/ssw_cutout_20121030_153001_AIA_94_.fts') smap.mask = smap.plot() plt.colorbar(extend='both') plt.show() .. Hinode XRT image. By inspecting the maximum versus the mean and standard deviation, it is clear that there are some overly bright pixels. This is likely due to cosmic ray hits which is throwing off the default plot making it too dark to see the solar emission. .. .. plot:: .. import sunpy.map import matplotlib.pyplot as plt smap = sunpy.map.Map('/Users/schriste/Desktop/sunpy_test_img/XRT20141211_184221.9.fits') fig = plt.figure() smap.plot() txt = r"min={min}, max={max}, $\mu$={mean}, $\sigma$={std}".format(min=int(smap.min()), max=int(smap.max()), mean=int(smap.mean()), std=int(smap.std())) plt.text(-600, 1500, txt, color='white') plt.colorbar() plt.show() .. Let's address this by clipping the largest values (in this case everything above 3 sigma). The following plot shows the result of this operation. .. .. plot:: .. import sunpy.map import matplotlib.pyplot as plt import matplotlib.colors as colors cmap = smap.plot_settings['cmap'] cmap.set_over('green', 1.0) cmap.set_under('purple', 1.0) norm = colors.Normalize(vmin=smap.min(), vmax=smap.mean() + 3 *smap.std()) smap = sunpy.map.Map('/Users/schriste/Desktop/sunpy_test_img/XRT20141211_184221.9.fits') smap.plot(norm=norm) plt.colorbar(extend='both') plt.show() .. This makes it very visible that there are a number of hot pixels mostly concentrated in the upper half of this image. Now let's address this problem with masking instead of clipping. .. .. plot:: .. import sunpy.map import matplotlib.pyplot as plt import matplotlib.colors as colors import numpy.ma smap = sunpy.map.Map('/Users/schriste/Desktop/sunpy_test_img/XRT20141211_184221.9.fits') cmap = smap.plot_settings['cmap'] cmap.set_bad('blue', 1.0) smap.data = numpy.ma.masked_greater(smap.data, smap.mean() + 3 *smap.std()) txt = r"min={min}, max={max}, $\mu$={mean}, $\sigma$={std}".format(min=int(smap.min()), max=int(smap.max()), mean=int(smap.mean()), std=int(smap.std())) plt.text(-600, 1500, txt, color='white') norm = colors.Normalize() smap.plot(norm = norm) plt.colorbar(extend='both') .. This plot shows a very similar effect to clipping but note that the array properties such as max and min have changed. That's because numpy is now ignoring those masked values. With a masked array .. (compared to clipping) we can go ahead and make more detailed masking operations so that we are not masking the emission from the bright solar sources. The next plot masks only those bright pixels in the upper area of the plot leaving the bright solar sources which are concentrated in the lower part of the plot intact. .. .. plot:: .. import sunpy.map import matplotlib.pyplot as plt import matplotlib.colors as colors import numpy.ma file = '/Users/schriste/Downloads/old downloads/foxsi_ar_data/sXRT20141211_184221.9.fits' smap = sunpy.map.Map(file) cmap = smap.plot_settings['cmap'] cmap.set_bad('blue', 1.0) smap.data = numpy.ma.masked_greater(smap.data, smap.mean() + 3 *smap.std()) smap.data.mask[0:250,:] = False txt = r"min={min}, max={max}, $\mu$={mean}, $\sigma$={std}".format(min=int(smap.min()), max=int(smap.max()), mean=int(smap.mean()), std=int(smap.std())) plt.text(-600, 1500, txt, color='white') norm = colors.Normalize() smap.plot(norm = norm) plt.colorbar(extend='both') Composite Maps and Overlaying Maps ================================== The `~sunpy.map.Map` method described above can also handle a list of maps. If a series of maps are supplied as inputs, `~sunpy.map.Map` will return a list of maps as the output. However, if the 'composite' keyword is set to True, then a `~sunpy.map.CompositeMap` object is returned. This is useful if the maps are of a different type (e.g. different instruments). For example, to create a simple composite map:: >>> my_maps = sunpy.map.Map(sunpy.data.sample.EIT_195_IMAGE, sunpy.data.sample.RHESSI_IMAGE, composite=True) # doctest: +REMOTE_DATA A `~sunpy.map.CompositeMap` is different from a regular sunpy `~sunpy.map.GenericMap` object and therefore different associated methods. To list which maps are part of your composite map use:: >>> my_maps.list_maps() # doctest: +REMOTE_DATA [, ] The following code adds a new map (which must be instantiated first), sets its transparency to 25%, turns on contours from 50% to 90% for the second map, and then plots the result. .. plot:: :include-source: import sunpy.data.sample import sunpy.map import matplotlib.pyplot as plt my_maps = sunpy.map.Map(sunpy.data.sample.EIT_195_IMAGE, sunpy.data.sample.RHESSI_IMAGE, composite=True) my_maps.add_map(sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE)) my_maps.set_alpha(2, 0.5) my_maps.set_levels(1, [50, 60, 70, 80, 90], percent = True) my_maps.plot() plt.show() This is not a particularly pretty plot but it shows what sunpy can do! Working with your map ===================== Part of the philosophy of the map object is to provide most of the basic functionality that a scientist would want therefore a map also contains a number of map-specific methods such as resizing a map or grabbing a subview. To get a list of the methods available for a map type:: >>> help(my_map) # doctest: +SKIP and check out the methods section! MapSequences ============ A `~sunpy.map.MapSequence` is an ordered list of maps. By default, the maps are ordered by their observation date, from earlier maps to later maps. A `~sunpy.map.MapSequence` can be created by supplying multiple existing maps:: >>> map1 = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) # doctest: +REMOTE_DATA >>> map2 = sunpy.map.Map(sunpy.data.sample.EIT_195_IMAGE) # doctest: +REMOTE_DATA >>> mc = sunpy.map.Map([map1, map2], sequence=True) # doctest: +REMOTE_DATA or by providing a directory full of image files:: >>> mc = sunpy.map.Map('path/to/my/files/*.fits', sequence=True) # doctest: +SKIP The earliest map in the MapSequence can be accessed by simply indexing the maps list:: >>> mc.maps[0] # doctest: +SKIP MapSequences can hold maps that have different shapes. To test if all the maps in a `~sunpy.map.MapSequence` have the same shape:: >>> mc.all_maps_same_shape() # doctest: +REMOTE_DATA True It is often useful to return the image data in a `~sunpy.map.MapSequence` as a single three dimensional Numpy `~numpy.ndarray`:: >>> mc.as_array() # doctest: +SKIP Note that an array is returned only if all the maps have the same shape. If this is not true, an error (ValueError) is returned. If all the maps have nx pixels in the x-direction, and ny pixels in the y-direction, and there are n maps in the MapSequence, the `~numpy.ndarray` array that is returned has shape (ny, nx, n). The data of the first map in the `~sunpy.map.MapSequence` appears in the `~numpy.ndarray` in position ``[:, :, 0]``, the data of second map in position ``[:, :, 1]``, and so on. The order of maps in the `~sunpy.map.MapSequence` is reproduced in the returned `~numpy.ndarray`. The meta data from each map can be obtained using:: >>> mc.all_meta() # doctest: +SKIP This returns a list of map meta objects that have the same order as the maps in the `~sunpy.map.MapSequence`. Coalignment of MapSequences =========================== A typical data preparation step when dealing with time series of images is to coalign images taken at different times so that features in different images remain in the same place. A common approach to this problem is to take a representative template that contains the features you are interested in, and match that to your images. The location of the best match tells you where the template is in your image. The images are then shifted to the location of the best match. This aligns your images to the position of the features in your representative template. sunpy provides a function to coalign the maps inside the `~sunpy.map.MapSequence`. The implementation of this functionality requires the installation of the scikit-image library, a commonly used image processing library. To coalign a `~sunpy.map.MapSequence`, simply import the function and apply it to your `~sunpy.map.MapSequence`:: >>> from sunpy.image.coalignment import mapsequence_coalign_by_match_template >>> coaligned = mapsequence_coalign_by_match_template(mc) # doctest: +REMOTE_DATA This will return a new `~sunpy.map.MapSequence`, coaligned to a template extracted from the center of the first map in the `~sunpy.map.MapSequence`, with the map dimensions clipped as required. The coalignment algorithm provides many more options for handling the coalignment of `~sunpy.map.MapSequence` type:: >>> help(mapsequence_coalign_by_match_template) # doctest: +SKIP for a full list of options and functionality. If you just want to calculate the shifts required to compensate for solar rotation relative to the first map in the `~sunpy.map.MapSequence` without applying them, use:: >>> from sunpy.image.coalignment import calculate_match_template_shift >>> shifts = calculate_match_template_shift(mc) # doctest: +REMOTE_DATA This is the function used to calculate the shifts in `~sunpy.map.MapSequence` coalignment function above. Please see `~sunpy.image.coalignment.calculate_match_template_shift` to learn more about its features. Shifts calculated using calculate_match_template_shift can be passed directly to the coalignment function. Compensating for solar rotation in MapSequences =============================================== Often a set of solar image data consists of fixing the pointing of a field of view for some time and observing. Features on the Sun will rotate according to the Sun's rotation. A typical data preparation step when dealing with time series of these types of images is to shift the images so that features do not appear to move across the field of view. This requires taking in to account the rotation of the Sun. The Sun rotates differentially, depending on latitude, with features at the equator moving faster than features at the poles. sunpy provides a function to shift images in `~sunpy.map.MapSequence` following solar rotation. This function shifts an image according to the solar differential rotation calculated at the latitude of the center of the field of view. The image is not *differentially* rotated. This function is useful for de-rotating images when the effects of differential rotation in the `~sunpy.map.MapSequence` can be ignored (for example, if the spatial extent of the image is small, or when the duration of the `~sunpy.map.MapSequence` is small; deciding on what 'small' means depends on your application). To apply this form of solar derotation to a `~sunpy.map.MapSequence`, simply import the function and apply it to your `~sunpy.map.MapSequence`:: >>> from sunpy.physics.solar_rotation import mapsequence_solar_derotate >>> derotated = mapsequence_solar_derotate(mc) # doctest: +SKIP For more info see `~sunpy.physics.solar_rotation.mapsequence_solar_derotate`. If you just want to calculate the shifts required to compensate for solar rotation relative to the first map in the `~sunpy.map.MapSequence` without applying them, use:: >>> from sunpy.physics.solar_rotation import calculate_solar_rotate_shift >>> shifts = calculate_solar_rotate_shift(mc) # doctest: +SKIP Please consult the docstring of the `~sunpy.image.coalignment.mapsequence_coalign_by_match_template` function in order to learn about the features of this function. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/data_types/timeseries.rst0000644000175100001710000006604600000000000021025 0ustar00vstsdocker*********** TimeSeries *********** Time series data are a fundamental part of many data analysis projects in heliophysics as well as other areas. sunpy therefore provides a TimeSeries object to handle this type of data. This new object supersedes the now deprecated Lightcurve datatype. Once you've read through this guide check out the :doc:`/code_ref/timeseries` for a more thorough look at sunpy TimeSeries and to see what data sources it currently supports. Sections 1 and 2 below describe how to create TimeSeries objects. Section 3 describes how to inspect the TimeSeries object to examine the data itself and the metadata. Section 4 describes how to plot a TimeSeries object, Section 5 describes how a TimeSeries object can be manipulated, and Section 6 describes in detail the TimeSeries metadata. .. warning:: The TimeSeries supersedes the previous LightCurve object but does not implement data download methods. To download TimeSeries data files use `sunpy.net`. 1. Creating a TimeSeries from an observational data source ========================================================== A TimeSeries object can be created from local files. For convenience, sunpy can download several example timeseries of observational data. These files have names like ``sunpy.data.sample.EVE_TIMESERIES`` and ``sunpy.data.sample.GOES_XRS_TIMESERIES``. To create the sample `sunpy.timeseries.sources.goes.XRSTimeSeries` type the following into your interactive Python shell: :: >>> import sunpy.timeseries as ts >>> import sunpy.data.sample # doctest: +REMOTE_DATA >>> my_timeseries = ts.TimeSeries(sunpy.data.sample.GOES_XRS_TIMESERIES, source='XRS') # doctest: +REMOTE_DATA .. doctest-skip-all This is calling the `~sunpy.timeseries.TimeSeries` factory to create a time series from a GOES XRS FITS file. The TimeSeries factory uses `sunpy.io.fits` to read the FITS file. Note that if you have not downloaded the data already you should get an error and some instruction on how to download the sample data. The variable ``my_timeseries`` is a :ref:`timeseries` object. To create one from a local GOES/XRS FITS file try the following: :: >>> my_timeseries = ts.TimeSeries('/mydirectory/myts.fits', source='XRS') # doctest: +SKIP sunpy will attempt to detect automatically the instrument source for most FITS files. However timeseries data are stored in a variety of file types (FITS, txt, csv) and formats, and so it is not always possible to detect the source. For this reason, it is good practice to explicitly state the source for the file. sunpy ships with a number of known instrumental sources. If you would like sunpy to include another instrumental source please follow the `sunpy contribution guide `__. The `~sunpy.timeseries.TimeSeries` factory has the ability to make a list of TimeSeries objects using a list of filepaths, a folder or a glob, for example: :: >>> my_ts_list = ts.TimeSeries('filepath1', 'filepath2', source='XRS') # doctest: +SKIP >>> my_ts_list = ts.TimeSeries('/goesdirectory/', source='XRS') # doctest: +SKIP >>> my_ts_list = ts.TimeSeries(glob, source='XRS') # doctest: +SKIP Note that this functionality will only work with files from the same single source, generating a source specific child of the `~sunpy.timeseries.GenericTimeSeries` class such as the `~sunpy.timeseries.sources.goes.XRSTimeSeries` above. For this reason, all the files should be from that same source for the `~sunpy.timeseries.TimeSeries` factory to work as intended. 1.1 Creating a Single TimeSeries from Multiple Files ==================================================== You can create a single time series from multiple files for a given source using the keyword argument ``concatenate=True``, such as: >>> my_timeseries = ts.TimeSeries('/mydirectory/myts1.fits', '/mydirectory/myts2.fits', source='XRS', concatenate=True) # doctest: +SKIP Note these must all be from the same source if using `~sunpy.timeseries.GenericTimeSeries.concatenate` from within the TimeSeries factory. However, if time series `~sunpy.timeseries.GenericTimeSeries.concatenate` method can be used to make a single time series from multiple TimeSeries from different sources once they are already in the form of TimeSeries objects. 2. Creating Custom TimeSeries ============================= Sometimes you will have data that you want to create into a TimeSeries. You can use the factory to create a `~sunpy.timeseries.GenericTimeSeries` from a variety of data sources currently including `pandas.DataFrame` and `astropy.table.Table`. 2.1 Creating a TimeSeries from a Pandas DataFrame ================================================= A TimeSeries object must be supplied with some data when it is created. The data can either be in your current Python session, in a local file, or in a remote file. Let's create some data and pass it into a TimeSeries object: :: >>> import numpy as np >>> intensity = np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24*60)))) The first line imports the numpy module used to create and store the data. The second line creates a basic numpy array of values representing a sine wave. We can use this array along with a suitable time storing object (such as Astropy `~astropy.time` or a list of `datetime` objects) to make a Pandas `~pandas.DataFrame`. A suitable list of times must contain the same number of values as the data, this can be created using: :: >>> import datetime >>> base = datetime.datetime.today() >>> times = [base - datetime.timedelta(minutes=x) for x in range(24*60, 0, -1)] The Pandas `~pandas.DataFrame` will use the dates list as the index: :: >>> from pandas import DataFrame >>> data = DataFrame(intensity, index=times, columns=['intensity']) This `~pandas.DataFrame` can then be used to construct a TimeSeries: :: >>> import sunpy.timeseries as ts >>> ts_custom = ts.TimeSeries(data) Furthermore we could specify the metadata/header and units of this time series by sending them as arguments to the factory: :: >>> from collections import OrderedDict >>> import astropy.units as u >>> meta = OrderedDict({'key':'value'}) >>> units = OrderedDict([('intensity', u.W/u.m**2)]) >>> ts_custom = ts.TimeSeries(data, meta, units) 2.2 Creating Custom TimeSeries from an Astropy Table ==================================================== A Pandas `~pandas.DataFrame` is the underlying object used to store the data within a TimeSeries, so the above example is the most lightweight to create a custom TimeSeries, but being scientific data it will often be more convenient to use an Astropy `~astropy.table.Table` and let the factory convert this. An advantage of this method is it allows you to include metadata and Astropy `~astropy.units.quantity.Quantity` values, which are both supported in tables, without additional arguments. For example: :: >>> import datetime >>> from astropy.time import Time >>> import astropy.units as u >>> from astropy.table import Table >>> base = datetime.datetime.today() >>> times = [base - datetime.timedelta(minutes=x) for x in range(24*60, 0, -1)] >>> intensity = u.Quantity(np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24*60)))), u.W/u.m**2) >>> tbl_meta = {'t_key':'t_value'} >>> table = Table([times, intensity], names=['time', 'intensity'], meta=tbl_meta) >>> table.add_index('time') >>> ts_table = ts.TimeSeries(table) Note that due to the properties of the `~astropy.time.Time` object, this will be a mixin column which since it is a single object, limits the versatility of the `~astropy.table.Table` a little. For more on mixin columns see the `Astropy docs `_. The units will be taken from the table quantities for each column, the metadata will simply be the table.meta dictionary. You can also explicitly add metadata and units, these will be added to the relevant dictionaries using the dictionary update method, with the explicit user-given values taking precedence. >>> from sunpy.util.metadata import MetaDict >>> from collections import OrderedDict >>> import astropy.units as u >>> meta = MetaDict({'key':'value'}) >>> units = OrderedDict([('intensity', u.W/u.m**2)]) >>> ts_table = ts.TimeSeries(table, meta, units) 3. Inspecting TimeSeries & Getting at the Data =============================================== A time series holds both data as well as meta data and units data. The meta data for the time series is accessed by: :: >>> header = my_timeseries.meta This references the `~sunpy.timeseries.TimeSeriesMetaData` object with the header information as read from the source files. A word of caution: many data sources provide little to no meta data so this variable might be empty. The meta data is described in more detail later in this guide. Similarly there are properties for getting `~sunpy.timeseries.GenericTimeSeries.columns` as a list of strings, `~sunpy.timeseries.GenericTimeSeries.index` values and `~sunpy.timeseries.GenericTimeSeries.time_range` of the data. The actual data in a sunpy TimeSeries object is accessible through the `~sunpy.timeseries.GenericTimeSeries.data` attribute. The data is implemented as a Pandas `~pandas.DataFrame`, so to get a look at what data you have available use: :: >>> my_timeseries.data # doctest: +SKIP You can also get a quick overview of that data using: :: >>> my_timeseries.data.info() DatetimeIndex: 42177 entries, 2011-06-06 23:59:59.961999 to 2011-06-07 23:59:57.631999 Data columns (total 2 columns): xrsa 42177 non-null float32 xrsb 42177 non-null float32 dtypes: float32(2) memory usage: 659.0 KB Time series are columnar data so to get at a particular datum you need to first index the column, then the element you want. To get the names of the available columns: :: >>> my_timeseries.data.columns Index(['xrsa', 'xrsb'], dtype='object') You can access the 0th element in the column ``xrsa`` with: :: >>> my_timeseries.data['xrsa'][0] 1e-09 You can also grab all of the data at a particular time: :: >>> my_timeseries.data['xrsa']['2011-06-07 00:00:02.008999'] 1e-09 This will return a list of entries with times that match the accuracy of the time you provide. You can consider the data as x or y values: :: >>> x = my_timeseries.data.index >>> y = my_timeseries.data.values You can read more about indexing at the `pandas documentation website `_. A TimeSeries can also return an Astropy `~astropy.units.quantity.Quantity` for a given column using the `~sunpy.timeseries.GenericTimeSeries.quantity` method, this uses the values stored in the data and units stored in the units dictionary to determine the `~astropy.units.quantity.Quantity`: :: >>> quantity = my_timeseries.quantity('xrsa') 4. Plotting =========== The sunpy TimeSeries object has its own built-in plot methods so that it is easy to quickly view your time series. To create a plot just type: .. plot:: :include-source: import sunpy.timeseries as ts import sunpy.data.sample ts = ts.TimeSeries(sunpy.data.sample.GOES_XRS_TIMESERIES, source='XRS') ts.peek() This will open a Matplotlib plot on your screen. If you want to save this to a PNG file you can do so from the Matplotlib GUI. In addition, to enable users to modify the plot it is possible to use the `~sunpy.timeseries.GenericTimeSeries.plot` command. This makes it possible to use the sunpy plot as the foundation for a more complicated figure: .. plot:: :include-source: import matplotlib.pyplot as plt import sunpy.timeseries as ts import sunpy.data.sample ts = ts.TimeSeries(sunpy.data.sample.GOES_XRS_TIMESERIES, source='XRS') fig, ax = plt.subplots() ts.plot(axes=ax) # Modify the figure here fig.savefig('figure.png') 5 Manipulating TimeSeries ========================= 5.1 Modifying the Data ====================== Since the timeseries data is stored as a Pandas `~pandas.DataFrame` you can easily modify the data directly using all of the usual Pandas methods: for example, you can modify a single cells value using: :: >>> my_timeseries.data['xrsa'][0] = 0.1 Or similarly using a datetime values (as string or datetime object): :: >>> my_timeseries.data['xrsa']['2012-06-01 23:59:45.061999'] = 1 You can even change all the values for a given time: :: >>> my_timeseries.data['xrsa']['2012-06-01 00:00'] = 1 Note, you will need to be careful to consider units when modifying the TimeSeries data directly. For further details about editing Pandas DataFames you can read the `pandas documentation website `_. Additionally the TimeSeries provides the `~sunpy.timeseries.GenericTimeSeries.add_column` method which will either add a new column or update a current column if the colname is already present. This can take numpy array or preferably an Astropy `~astropy.units.quantity.Quantity` value. For example: :: >>> values = u.Quantity(my_timeseries.data['xrsa'].values[:-2], my_timeseries.units['xrsa']) * 20.5 >>> my_timeseries.add_column('new col', values) Note that the values will be converted into the column units if an Astropy `~astropy.units.quantity.Quantity` is given. Caution should be taken when adding a new column because this column won't have any associated MetaData entry, similarly if you use an array of values it won't add an entry into the units `~collections.OrderedDict`. 5.2 Truncating a TimeSeries =========================== It is often useful to truncate an existing TimeSeries object to retain a specific time range. This is easily achieved by using the `~sunpy.timeseries.GenericTimeSeries.truncate` method. For example, to trim our GOES data into a period of interest use: :: >>> from sunpy.time import TimeRange >>> tr = TimeRange('2012-06-01 05:00','2012-06-01 06:30') >>> my_timeseries_trunc = my_timeseries.truncate(tr) This takes a number of different arguments, such as the start and end dates (as datetime or string objects) or a `~sunpy.time.TimeRange` as used above. Note that the truncated TimeSeries will have a truncated `~sunpy.timeseries.TimeSeriesMetaData` object, which may include dropping metadata entries for data totally cut out from the TimeSeries. If you want to truncate using slice-like values you can, for example taking every 2nd value from 0 to 10000 can be done using: :: >>> my_timeseries_trunc = my_timeseries.truncate(0,100000,2) Caution should be used when removing values from the data manually, the TimeSeries can't guarantee Astropy units are correctly preserved when you interact with the data directly. 5.3 Down and Up Sampling a TimeSeries Using Pandas ================================================== Because the data is stored in a Pandas `~pandas.DataFrame` object you can manipulate it using normal Pandas methods, such as the `~pandas.DataFrame.resample` method. To downsample you can use: :: >>> downsampled_dataframe = my_timeseries_trunc.data.resample('10T').mean() Note, here ``10T`` means sample every 10 minutes and 'mean' is the method used to combine the data. Alternatively the sum method is often used. You can also upsample, such as: :: >>> upsampled_data = my_timeseries_trunc.data.resample('30S').ffill() Note, here we upsample to 30 second intervals using ``30S`` and use the pandas fill-forward method. Alternatively the back-fill method could be used. Caution should be used when resampling the data, the TimeSeries can't guarantee Astropy Units are correctly preserved when you interact with the data directly. 5.4 Concatenating TimeSeries ============================ It's common to want to combine a number of TimeSeries together into a single TimeSeries. In the simplest scenario this is to combine data from a single source over several time ranges, for example if you wanted to combine the daily GOES data to get a week or more of constant data in one TimeSeries. This can be performed using the TimeSeries factory with the ``concatenate=True`` keyword argument: :: >>> concatenated_timeseries = sunpy.timeseries.TimeSeries(filepath1, filepath2, source='XRS', concatenate=True) # doctest: +SKIP Note, you can list any number of files, or a folder or use a glob to select the input files to be concatenated. It is possible to concatenate two TimeSeries after creating them with the factory using the `~sunpy.timeseries.GenericTimeSeries.concatenate` method. For example: :: >>> concatenated_timeseries = goes_timeseries_1.concatenate(goes_timeseries_2) # doctest: +SKIP This will result in a TimeSeries identical to if you used the factory to create it in one step. A limitation of the TimeSeries class is that often it is not easy to determine the source observatory/instrument of a file, generally because the file formats used vary depending on the scientific working groups, thus some sources need to be explicitly stated (as a keyword argument) and so it is not possible to concatenate files from multiple sources with the factory. To do this you can still use the `~sunpy.timeseries.GenericTimeSeries.concatenate` method, which will create a new TimeSeries with all the rows and columns of the source and concatenated TimeSeries in one: :: >>> concatenated_timeseries = goes_timeseries.concatenate(eve_timeseries) # doctest: +SKIP Note that the more complex `~sunpy.timeseries.TimeSeriesMetaData` object now has 2 entries and shows details on both: :: >>> concatenated_timeseries.meta # doctest: +SKIP The metadata object is described in more detail in the next section. 5.5 Creating an Astropy Table from a TimeSeries =============================================== If you want to take the data from your TimeSeries and use it as a `~astropy.table.Table` this can be done using the `~sunpy.timeseries.GenericTimeSeries.to_table` method. For example: :: >>> table = my_timeseries_trunc.to_table() Note that this `~astropy.table.Table` will contain a mixin column for containing the Astropy `~astropy.time.Time` object representing the index, it will also add the relevant units to the columns. One of the most useful reasons for doing this is that Astropy `~sunpy.timeseries.GenericTimeSeries.to_table` objects have some very nice options for viewing the data, including the basic console view: :: >>> table date xrsa xrsb W / m2 W / m2 datetime64[ns] float32 float32 ----------------------------- ------- ---------- 2011-06-06T23:59:59.961999000 0.1 1.8871e-07 2011-06-07T00:00:04.058999000 1e-09 1.8609e-07 2011-06-07T00:00:08.151999000 1e-09 1.8609e-07 2011-06-07T00:00:12.248999000 1e-09 1.8609e-07 2011-06-07T00:00:16.344999000 1e-09 1.8084e-07 2011-06-07T00:00:20.441999000 1e-09 1.8084e-07 2011-06-07T00:00:24.534999000 1e-09 1.8084e-07 2011-06-07T00:00:28.631999000 1e-09 1.8346e-07 2011-06-07T00:00:32.728999000 1e-09 1.8346e-07 ... ... ... 2011-06-07T23:59:20.768999000 1e-09 1.651e-07 2011-06-07T23:59:24.864999000 1e-09 1.5985e-07 2011-06-07T23:59:28.961999000 1e-09 1.5985e-07 2011-06-07T23:59:33.058999000 1e-09 1.6248e-07 2011-06-07T23:59:37.151999000 1e-09 1.6248e-07 2011-06-07T23:59:41.248999000 1e-09 1.5985e-07 2011-06-07T23:59:45.344999000 1e-09 1.5723e-07 2011-06-07T23:59:49.441999000 1e-09 1.6248e-07 2011-06-07T23:59:53.538999000 1e-09 1.5985e-07 2011-06-07T23:59:57.631999000 1e-09 1.5985e-07 and the more sophisticated browser view using the `~astropy.table.Table.show_in_browser` method: :: >>> table.show_in_browser(jsviewer=True) # doctest: +SKIP For further details about editing Astropy tables you can read the `astropy documentation website `_. 6. A Detailed Look at the Metadata ================================== TimeSeries store metadata in a `~sunpy.timeseries.TimeSeriesMetaData` object, this object is designed to be able to store multiple basic `~sunpy.util.metadata.MetaDict` (case-insensitive ordered dictionary) objects and able to identify the relevant metadata for a given cell in the data. This enables a single TimeSeries to be created by combining/concatenating multiple TimeSeries source files together into one and to keep a reliable track of all the metadata relevant to each cell, column or row. The metadata can be accessed by: :: >>> meta = my_timeseries.meta You can easily get an overview of the metadata, this will show you a basic representation of the metadata entries that are relevant to this TimeSeries. :: >>> meta |-------------------------------------------------------------------------------------------------| |TimeRange | Columns | Meta | |-------------------------------------------------------------------------------------------------| |2011-06-06 23:59:59.961999 | xrsa | simple: True | | to | xrsb | bitpix: 8 | |2011-06-07 23:59:57.631999 | | naxis: 0 | | | | extend: True | | | | date: 26/06/2012 | | | | numext: 3 | | | | telescop: GOES 15 | | | | instrume: X-ray Detector | | | | object: Sun | | | | origin: SDAC/GSFC | | | | ... | |-------------------------------------------------------------------------------------------------| The data within a `~sunpy.timeseries.TimeSeriesMetaData` object is stored as a list of tuples, each tuple representing the metadata from a source file or timeseries. The tuple will contain a `~sunpy.time.TimeRange` telling us which rows the metadata applies to, a list of column name strings for which the metadata applies to and finally a `~sunpy.util.metadata.MetaDict` object for storing the key/value pairs of the metadata itself. Each time a TimeSeries is concatenated to the original a new set of rows and/or columns will be added to the `~pandas.DataFrame` and a new entry will be added into the metadata. Note that entries are ordered chronologically based on `~sunpy.time.timerange.TimeRange.start` and generally it's expected that no two TimeSeries will overlap on both columns and time range. For example it is not good practice for alternate row values in a single column to be relevant to different metadata entries as this would make it impossible to uniquely identify the metadata relevant to each cell. If you want the string that's printed then you can use the `~sunpy.timeseries.TimeSeriesMetaData.to_string` method. This has the advantage of having optional keyword arguments that allows you to set the depth (number of rows for each entry) and width (total number of characters wide) to better fit your output. For example: :: >>> meta_str = meta.to_string(depth = 20, width=99) Similar to the TimeSeries, the metadata has some properties for convenient access to the global metadata details, including `~sunpy.timeseries.TimeSeriesMetaData.columns` as a list of strings, and `~sunpy.timeseries.TimeSeriesMetaData.time_range` of the data. Beyond this, there are properties to get lists of details for all the entries in the `~sunpy.timeseries.TimeSeriesMetaData` object, including `~sunpy.timeseries.TimeSeriesMetaData.timeranges`, `~sunpy.timeseries.TimeSeriesMetaData.columns` (as a list of string column names) and `~sunpy.timeseries.TimeSeriesMetaData.metas`. Similar to TimeSeries objects you can `~sunpy.timeseries.TimeSeriesMetaData.concatenate` `~sunpy.timeseries.TimeSeriesMetaData` objects, but generally you won't need to do this as it is done automatically when actioned on the TimeSeries. Note that when truncating a `~sunpy.timeseries.TimeSeriesMetaData` object you will remove any entries outside of the given `~sunpy.time.TimeRange`. You can also `~sunpy.timeseries.TimeSeriesMetaData.append` a new entry (as a tuple or list), which will add the entry in the correct chronological position. It is frequently necessary to locate the metadata for a given column, row or cell which can be uniquely identified by both, to do this you can use the `~sunpy.timeseries.TimeSeriesMetaData.find` method, by adding colname and/or time/row keyword arguments you get a `~sunpy.timeseries.TimeSeriesMetaData` object returned which contains only the relevant entries. You can then use the `~sunpy.timeseries.TimeSeriesMetaData.metas` property to get a list of just the relevant `~sunpy.util.metadata.MetaDict` objects. For example: :: >>> tsmd_return = my_timeseries.meta.find(colname='xrsa', time='2012-06-01 00:00:33.904999') >>> tsmd_return.metas [] Note, the colname and time filters are optional, but omitting both filters just returns an identical `~sunpy.timeseries.TimeSeriesMetaData` object to the TimeSeries original. A common use case for the metadata is to find out the instrument/s that gathered the data and in this case you can use the `~sunpy.timeseries.TimeSeriesMetaData.get` method. This method takes a single key string or list of key strings with the optional filters and will search for any matching values. This method returns another `~sunpy.timeseries.TimeSeriesMetaData` object, but removes all unwanted key/value pairs. The result can be converted into a simple list of strings using the `~sunpy.timeseries.TimeSeriesMetaData.values` method: :: >>> tsmd_return = my_timeseries.meta.get('telescop', colname='xrsa') >>> tsmd_return.values() ['GOES 15'] Note `~sunpy.timeseries.TimeSeriesMetaData.values` removes duplicate strings and sorts the returned list. You can update the values for these entries efficiently using the `~sunpy.timeseries.TimeSeriesMetaData.update` method which takes a dictionary argument and updates the values to each of the dictionaries that match the given colname and time filters, for example: :: >>> my_timeseries.meta.update({'telescop': 'G15'}, colname='xrsa', overwrite=True) Here we have to specify the overwrite=False keyword parameter to allow us to overwrite values for keys already present in the `~sunpy.util.metadata.MetaDict` objects, this helps protect the integrity of the original metadata and without this set (or with it set to False) you can still add new key/value pairs. Note that the `~sunpy.util.metadata.MetaDict` objects are both case-insensitive for key strings and have ordered entries, where possible the order is preserved when updating values. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/index.rst0000644000175100001710000000122600000000000015613 0ustar00vstsdocker.. _guide: ************ User's Guide ************ Welcome to the user guide for the sunpy core package. sunpy is a community- developed, free and open-source solar data analysis environment. It is meant to provide the core functionality and tools to analyze solar data with Python. This guide provides a walkthrough of the major features in sunpy. For more details checkout the :ref:`reference`. .. toctree:: :maxdepth: 2 Brief Tour Data Acquisition Data Types Plotting Units and Coordinates Time
id observation_time_start observation_time_end ... download_time size str1 str19 str19 ... str19 str7 ---- ---------------------- -------------------- ... ------------------- ------- 1 2011-09-20 01:00:00 2011-09-20 01:00:01 ... 2020-11-21 14:15:30 66200.0 2 2011-09-20 01:00:00 2011-09-20 01:00:01 ... 2020-11-21 14:15:30 66200.0 3 2011-09-20 01:45:00 2011-09-20 01:45:01 ... 2020-11-21 14:15:30 66200.0 4 2011-09-20 01:45:00 2011-09-20 01:45:01 ... 2020-11-21 14:15:30 66200.0 If you then do a second query:: >>> db.fetch(a.Time("2011-09-20T01:00:00", "2011-09-20T02:45:00"), ... a.Instrument.aia, a.Sample(45*u.min)) # doctest: +REMOTE_DATA >>> db.commit() # doctest: +REMOTE_DATA >>> db # doctest: +SKIP
id observation_time_start observation_time_end ... download_time size str1 str19 str19 ... str19 str7 ---- ---------------------- -------------------- ... ------------------- ------- 1 2011-09-20 01:00:00 2011-09-20 01:00:01 ... 2020-11-21 14:15:30 66200.0 2 2011-09-20 01:00:00 2011-09-20 01:00:01 ... 2020-11-21 14:15:30 66200.0 3 2011-09-20 01:45:00 2011-09-20 01:45:01 ... 2020-11-21 14:15:30 66200.0 4 2011-09-20 01:45:00 2011-09-20 01:45:01 ... 2020-11-21 14:15:30 66200.0 5 2011-09-20 02:30:00 2011-09-20 02:30:01 ... 2020-11-21 14:17:51 66200.0 6 2011-09-20 02:30:00 2011-09-20 02:30:01 ... 2020-11-21 14:17:51 66200. A query can then be performed against the database to get the records:: >>> entries = db.search(a.Time("2011-09-20T01:45:00", "2011-09-20T02:15:00"), a.Instrument.aia) # doctest: +REMOTE_DATA >>> len(entries) # doctest: +SKIP 4 You can see that only two extra records were added to the database. For more information check out the :ref:`database_guide`. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/troubleshooting.rst0000644000175100001710000000674600000000000017747 0ustar00vstsdocker.. _troubleshooting-faq: ************************ Troubleshooting and Bugs ************************ .. _sunpy-version: Obtaining sunpy version ======================= To find out your sunpy version number, import it and print the ``__version__`` attribute:: >>> import sunpy # doctest: +SKIP >>> sunpy.__version__ # doctest: +SKIP .. _locating-sunpy-install: System Info =========== To quickly collect information on your system, you can use our convenience function ``system_info`` which you can run through: :: >>> import sunpy # doctest: +SKIP >>> sunpy.util.system_info() # doctest: +SKIP The output should look something like: :: ========================================================== sunpy Installation Information Sunday, 18. November 2012 11:06PM UT ========================================================== ########### General ########### OS: Mac OS X 10.8.2 (i386) Python: 2.7.3 (64bit) #################### Required libraries #################### sunpy: 0.1 NumPy: 1.6.2 SciPy: 0.10.1 Matplotlib: 1.2.x PyFITS: 3.0.8 pandas: 0.8.1 ####################### Recommended libraries ####################### beautifulsoup4: 4.1.1 PyQt: 4.9.4 SUDS: 0.4' This information is especially useful if you are running into a bug and need help. :file:`sunpy` install location =================================== You can find what directory sunpy is installed in by importing it and printing the ``__file__`` attribute:: >>> import sunpy # doctest: +SKIP >>> sunpy.__file__ # doctest: +SKIP .. _locating-matplotlib-config-dir: :file:`.sunpy` directory location ================================= Each user should have a :file:`.sunpy/` directory which should contain a :ref:`sunpyrc ` file. To locate your :file:`.sunpy/` directory, use :func:`sunpy.print_config`:: >>> import sunpy as sun # doctest: +SKIP >>> sun.print_config() # doctest: +SKIP We use `appdirs `__ to work out the location depending on your operating system. If you would like to use a different configuration directory, you can do so by specifying the location in your ``SUNPY_CONFIGDIR`` environment variable. .. _reporting-problems: Reporting Bugs ============== If you are having a problem with sunpy, search the `mailing list`_ or the github `issue tracker`_. It is possible that someone else has already run into your problem. If not, please provide the following information in your e-mail to the `mailing list`_ or to the github `issue tracker`_: * your operating system; (Linux/UNIX users: post the output of ``uname -a``) * sunpy version:: >>> import sunpy # doctest: +SKIP >>> sunpy.util.system_info() # doctest: +SKIP * how you obtained sunpy. * any customizations to your ``sunpyrc`` file (see :ref:`customizing-sunpy`). * Please try to provide a **minimal**, standalone Python script that demonstrates the problem. This is **the** critical step. If you can't post a piece of code that we can run and reproduce your error, the chances of getting help are significantly diminished. Very often, the mere act of trying to minimize your code to the smallest bit that produces the error will help you find a bug in **your** code that is causing the problem. .. _`mailing list`: https://groups.google.com/forum/#!forum/sunpy .. _`issue tracker`: https://github.com/sunpy/sunpy/issues ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/guide/units-coordinates.rst0000644000175100001710000002263200000000000020162 0ustar00vstsdocker.. _units-coordinates-sunpy: Units and Coordinates in sunpy ****************************** This section of the guide will talk about representing physical units and physical coordinates in sunpy. sunpy makes use of :ref:`Astropy ` for both these tasks. Units in sunpy ============== All functions in sunpy that accept or return numbers associated with physcial quantities accept and return `~astropy.units.Quantity` objects. These objects represent a number (or an array of numbers) and a unit. This means sunpy is always explicit about the units associated with a value. Quantities and units are powerful tools for keeping track of variables with a physical meaning and make it straightforward to convert the same physical quantity into different units. In this section of the guide we will give a quick introduction to `astropy.units` and then demostrate how to use units with sunpy. To use units we must first import them from Astropy. To save on typing we usually import units as ``u``:: >>> import astropy.units as u Once we have imported units we can create a quantity by multiplying a number by a unit:: >>> length = 10 * u.meter >>> length A `~astropy.units.Quantity` has both a ``.unit`` and a ``.value`` attribute:: >>> length.value 10.0 >>> length.unit Unit("m") These `~astropy.units.Quantity` objects can also be converted to other units, or unit systems:: >>> length.to(u.km) >>> length.cgs Probably most usefully, `~astropy.units.Quantity` objects will propagate units through arithmetic operations when appropriate:: >>> distance_start = 10 * u.mm >>> distance_end = 23 * u.km >>> length = distance_end - distance_start >>> length >>> time = 15 * u.minute >>> speed = length / time >>> speed However, operations which do not make physical sense for the units specified will cause an error:: >>> length + time Traceback (most recent call last): ... astropy.units.core.UnitConversionError: Can only apply 'add' function to quantities with compatible dimensions Quantities as function arguments ================================ An extremely useful addition to the base functionality of Quanitities is the ``@u.quantity_input`` decorator. This allows you to specify required units for function arguments to ensure that the calculation within that function always make physical sense. For instance, if we defined a function to calculate speed as above, we might want the distance and time as inputs:: >>> def speed(length, time): ... return length / time However, this requires that length and time both have the appropriate units. We therefore want to use `~astropy.units.quantity_input` to enforce this, here we use `function annotations `__ to specify the units. >>> @u.quantity_input ... def speed(length: u.m, time: u.s): ... return length / time Now, when this function is called, if the units of length and time are not convertible to the units specified, an error will be raised stating that the units are incorrect or missing:: >>> speed(1*u.m, 10*u.m) Traceback (most recent call last): ... astropy.units.core.UnitsError: Argument 'time' to function 'speed' must be in units convertible to 's'. >>> speed(1*u.m, 10) ... Traceback (most recent call last): ... TypeError: Argument 'time' to function 'speed' has no 'unit' attribute. ... pass in an astropy Quantity instead. Note that the units of the inputs do not have to be exactly the same as those in the function definition, as long as they can be converted to those units. So for instance, passing in a time in minutes still works even though we specified ``time: u.s``:: >>> speed(1*u.m, 1*u.minute) This may still not be quite as we want it, since we wanted the input time in seconds but the output is in m/min. We can correct this by defining the function with an additional annotation:: >>> @u.quantity_input ... def speed(length: u.m, time: u.s) -> u.m/u.s: ... return length / time This will force the output of the function to be converted to m/s before returning, so that you will always have the same units on the output from this function:: >>> speed(1*u.m, 1*u.minute) Physical Coordinates in sunpy ============================= In much the same way as `~astropy.units` are used for representing physical quantities, sunpy uses `astropy.coordinates` to represent points in physical space. This applies to both points in 3D space and projected coordinates in images. The astropy coordinates module is primarily used through the `~astropy.coordinates.SkyCoord` class:: >>> from astropy.coordinates import SkyCoord To enable the use of the solar physics specific frames defined in sunpy we also need to import them:: >>> from sunpy.coordinates import frames A SkyCoord object to represent a point on the Sun can then be created:: >>> c = SkyCoord(70*u.deg, -30*u.deg, obstime="2017-08-01", ... frame=frames.HeliographicStonyhurst) >>> c This `~astropy.coordinates.SkyCoord` object can then be transformed to any other coordinate frame defined either in Astropy or sunpy, for example:: >>> c.transform_to(frames.Helioprojective(observer="earth")) ): (Tx, Ty, distance) in (arcsec, arcsec, km) (769.96270814, -498.89715922, 1.51668773e+08)> It is also possible to convert three dimensional positions to astrophysical frames defined in Astropy, for example `~astropy.coordinates.ICRS`. >>> c.transform_to('icrs') Observer Location ----------------- Both `~sunpy.coordinates.frames.Helioprojective` and `~sunpy.coordinates.frames.Heliocentric` frames are defined based on the position of the observer. Therefore to transform either of these frames to a different frame the location of the observer must be known. The observer can be specified for a coordinate object using the ``observer`` argument to `~astropy.coordinates.SkyCoord`. For sunpy to calculate the location of Earth or another solar-system body, it must know the time for which the coordinate is valid; this is specified with the ``obstime`` argument. Using the observer location it is possible to convert a coordinate as seen by one observer to a coordinate seen by another:: >>> hpc1 = SkyCoord(0*u.arcsec, 0*u.arcsec, observer="earth", ... obstime="2017-07-26", ... frame=frames.Helioprojective) >>> hpc1.transform_to(frames.Helioprojective(observer="venus", ... obstime="2017-07-26")) ): (Tx, Ty, distance) in (arcsec, arcsec, AU) (-1285.47497992, 106.20918654, 0.72405937)> Using Coordinates with sunpy Map -------------------------------- .. plot:: :include-source: sunpy Map uses coordinates to specify locations on the image, and to plot overlays on plots of maps. When a Map is created, a coordinate frame is constructed from the header information. This can be accessed using ``.coordinate_frame``: >>> import sunpy.map >>> from sunpy.data.sample import AIA_171_IMAGE # doctest: +REMOTE_DATA >>> m = sunpy.map.Map(AIA_171_IMAGE) # doctest: +REMOTE_DATA >>> m.coordinate_frame # doctest: +REMOTE_DATA )> This can be used when creating a `~astropy.coordinates.SkyCoord` object to set the coordinate system to that image: >>> from astropy.coordinates import SkyCoord >>> import astropy.units as u >>> c = SkyCoord(100 * u.arcsec, 10*u.arcsec, frame=m.coordinate_frame) # doctest: +REMOTE_DATA >>> c # doctest: +REMOTE_DATA ): (Tx, Ty) in arcsec (100., 10.)> The `~astropy.coordinates.SkyCoord` object can be converted to a PixelPair object using `~sunpy.map.GenericMap.world_to_pixel`: >>> pixel_obj = m.world_to_pixel(c) # doctest: +REMOTE_DATA >>> pixel_obj # doctest: +REMOTE_DATA PixelPair(x=, y=) This `~astropy.coordinates.SkyCoord` object could also be used to plot a point on top of the map: >>> import matplotlib.pyplot as plt >>> ax = plt.subplot(projection=m) # doctest: +SKIP >>> m.plot() # doctest: +SKIP >>> _ = ax.plot_coord(c, 'o') # doctest: +SKIP For more information on coordinates see :ref:`sunpy-coordinates` section of the :ref:`reference`. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/index.rst0000644000175100001710000000105200000000000014513 0ustar00vstsdocker************************ sunpy core Documentation ************************ The sunpy core package is a community-developed, free and open-source solar data analysis environment for Python. .. panels:: Getting started ^^^^^^^^^^^^^^^ .. toctree:: :maxdepth: 1 installation guide/index generated/gallery/index code_ref/index whatsnew/index --- Other info ^^^^^^^^^^ .. toctree:: :maxdepth: 1 about code_ref/known_issues code_ref/stability dev_guide/index ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/installation.rst0000644000175100001710000001341200000000000016110 0ustar00vstsdocker.. _installing: ************ Installation ************ Requirements ============ sunpy requires Python 3.7 or higher. Installing Scientific Python and sunpy ====================================== sunpy is part of the wider ecosystem of scientific Python packages for solar physics. Therefore a working sunpy installation is more about installing the scientific Python ecosystem than sunpy itself. If you do not currently have a working scientific Python distribution this guide will set you up with the Miniconda, which makes it easy to install and manage your scientific Python packages. To install the Miniconda Python distribution follow the instructions at `here `__. Although Miniconda makes it simple to switch between Python versions, we recommend that new users install the latest Python 3.x version of Miniconda. The reason we choose Miniconda over Anaconda, is mainly due to the size as Anaconda comes with a full install of packages you probably do not need and this way you have more direct control over what has been installed into your Python virtual environment. Furthermore, you bypass the need for the conda resolver to sort out your root environment which should make conda faster to use. Installing sunpy using Miniconda -------------------------------- To install sunpy launch a system command prompt or the 'Anaconda Prompt' (under Windows). First configure conda for to add the `conda-forge channel `__:: conda config --add channels conda-forge conda config --set channel_priority strict and now to install sunpy within the default conda virtual environment:: $ conda install sunpy This will install sunpy and every package it needs to function. .. note:: We strongly recommend using a `Python virtual environment `__ or a `conda virtual environment. `__ Updating sunpy -------------- You can update to the latest version by running:: conda update sunpy Installing sunpy on top of an existing scientific Python environment -------------------------------------------------------------------- This section assumes you already have everything setup, whether that be conda or a Python virtual environment. These commands are to be executed within these environments. Conda ^^^^^ If you want to install sunpy within a pre-existing conda environment, you will want to activate the virtual environment and run:: $ conda activate $ conda install sunpy This assumes you have the conda-forge channel added (as above). Pip ^^^ This is for installing sunpy within a scientific Python distribution or environment, where ``pip`` has been used to install packages. To acquire a fully working sunpy installation, simply run:: pip install "sunpy[all]" .. note:: If this does not work, it could be due to a missing C compiler (e.g., ``gcc`` or ``clang``) that is required to build sunpy at install. Getting the compiler either from your system package manager, XCode or Anaconda should address this. If you have a reason to want a more minimal installation, you can install sunpy with no optional dependencies, however this means a lot of submodules will not import:: pip install "sunpy" It is possible to select which "extra" dependencies you want to install, if you know you only need certain submodules:: pip install "sunpy[map,timeseries]" The available options are: ``[asdf]``, ``[dask]``, ``[database]``, ``[image]``, ``[jpeg2000]``, ``[map]``, ``[net]``, ``[timeseries]``, ``[visualization]``. If you want to develop sunpy we would strongly recommend reading the `Newcomers' Guide `__. .. note:: If you get a ``PermissionError`` this means that you do not have the required administrative access to install new packages to your Python installation. Do **not** install sunpy or other third-party packages using ``sudo``. This error implies you have an incorrectly configured virtual environment or it is not activated. If you really do not want to use any virtual environment, you can always do ``pip install --user sunpy``. Testing sunpy ============= sunpy provides a method to run the basic test suite that will check that the install has worked correctly. To run the basic test suite and ensure that your sunpy install is working correctly, use the :func:`sunpy.self_test`:: import sunpy sunpy.self_test() You will see something like the following in your terminal:: Starting sunpy self test... Checking for packages needed to run sunpy: All required and optional sunpy dependencies are installed. Starting the sunpy test suite: ... The tests will run and will report any fails. You can report these through the `sunpy issue tracker `__ and we will strive to help. It is possible to run this command in a situation where not all packages are installed. If this is the case, you will see the following when you run the test suite:: Starting sunpy self test... Checking for packages needed to run sunpy: The following packages are not installed for the sunpy[database] requirement: * sqlalchemy ... You do not have all the required dependencies installed to run the sunpy test suite. If you want to run the sunpy tests install the 'tests' extra with `pip install "sunpy[all,tests]"` This does not mean sunpy is broken, but you will need to install the extra packages to ensure a "complete" installation of sunpy and run the entire test suite. It is quite likely that you will run into not having the tests dependencies installed. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/make.bat0000644000175100001710000000142400000000000014262 0ustar00vstsdocker@ECHO OFF pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set SOURCEDIR=. set BUILDDIR=_build if "%1" == "" goto help %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.https://sphinx-doc.org/ exit /b 1 ) %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% :end popd ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/nitpick-exceptions0000644000175100001710000000443100000000000016421 0ustar00vstsdocker# Prevents sphinx nitpicky mode picking up on optional # (see https://github.com/sphinx-doc/sphinx/issues/6861) # Even if it was "fixed", still broken py:class optional # See https://github.com/numpy/numpy/issues/10039 py:obj numpy.datetime64 # There's no specific file or function classes to link to py:class (Unit('deg'), Unit('pix')) py:class (Unit('Mm'), None) py:class any type py:class array-like py:class file object py:class function py:class path-like py:class str-like py:class time-like py:class Unit('%') py:class Unit('Angstrom') py:class Unit('arcsec / pix') py:class Unit('arcsec') py:class Unit('deg') py:class Unit('pix') py:class Unit('s') py:class Unit('W / m2') py:obj function py:obj iterable py:obj parfive py:mod parfive py:obj astropy.io.fits.hdu.base.ExtensionHDU # This comes from Map.wcs py:class prop # These come from astropy.coordinates.baseframe.represent_as py:class data py:class keyword only py:class keyword-only py:class string py:class subclass of BaseRepresentation # These come from astropy QTable py:class list of lists py:class list of list py:class numpy ndarray py:class numpy ndarray py:class Table py:class table-like object # numpy inherited docstrings py:obj a py:obj a.size == 1 py:obj args py:obj dtype py:obj n py:obj ndarray # other classes and functions that cannot be linked to py:class astropy.table.column.BaseColumn py:class docutils.parsers.rst.Directive py:class numpy.core.records.recarray py:class numpy.ma.core.MaskedArray py:class numpy.ma.mvoid py:class numpy.void py:class pandas.DataFrame py:class sqlalchemy.orm.decl_api.Base py:class xmlrpc.client.Error py:class xmlrpc.client.Fault py:class xmlrpclib.Error py:class xmlrpclib.Fault py:obj aiohttp.ClientResponse py:obj astropy.visualization.wcsaxes.coordinates_map.CoordinatesMap.grid py:obj data py:obj numpy.ma.core.MaskedArray py:obj pkg_resources.parse_version py:obj sunpy.extern.parse.parse # Pending on python docs links issue #11975 py:class classmethod py:class list py:meth list.pop py:obj Artist py:obj AttributeError py:obj BboxBase py:obj int py:obj list.append py:obj list.append py:obj list.count py:obj list.extend py:obj list.index py:obj list.insert py:obj list.remove py:obj NotImplementedError py:obj NotImplementedError py:obj RendererBase py:obj RuntimeError py:obj text py:obj Text ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/robots.txt0000644000175100001710000000032000000000000014720 0ustar00vstsdockerUser-agent: * Allow: /*/latest/ Allow: /en/latest/ # Fallback for bots that don't understand wildcards Allow: /*/stable/ Allow: /en/stable/ # Fallback for bots that don't understand wildcards Disallow: / ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.5572743 sunpy-3.1.5/docs/whatsnew/0000755000175100001710000000000000000000000014514 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/whatsnew/0.8.rst0000644000175100001710000002516400000000000015563 0ustar00vstsdocker.. doctest-skip-all .. _whatsnew-0.8: ************************ What's New in SunPy 0.8? ************************ Overview ======== SunPy 0.8 is a major release that adds significant new functionality since the 0.7.x series of releases. On this page, you can read about some of the big changes in this release: * :ref:`whatsnew-0.8-python` * :ref:`whatsnew-0.8-fido` * :ref:`whatsnew-0.8-coordinates` * :ref:`whatsnew-0.8-timeseries` * :ref:`whatsnew-0.8-differential_rotation` * :ref:`whatsnew-0.8-renamed-removed` In addition to these major changes, SunPy 0.8 includes a large number of smaller improvements and bug fixes, which are described in the :ref:`changelog`. By the numbers: * 1442 commits have been added since 0.7 * 163 issues have been closed since 0.7 * 200 pull requests have been merged since 0.7 * 35 distinct people have contributed code * 17 new contributors .. _whatsnew-0.8-python: Supported versions of Python ============================ SunPy is tested against Python 2.7, 3.5 and 3.6. SunPy no longer supports Python 3.4. .. _whatsnew-0.8-fido: New data downloading interface ============================== The new package Fido is the primary interface to search for and download observational data. Fido is a unified interface for searching and fetching solar physics data irrespective of the underlying client or webservice through which the data is obtained, e.g. VSO, JSOC, etc. It therefore supplies a single, easy and consistent way to obtain most forms of solar physics data. It unifies data search and download from multiple sources such as the VSO and non-VSO sources:: >>> from sunpy.net import Fido, attrs as a >>> attrs_time = a.Time('2005/01/01 00:10', '2005/01/01 00:15') >>> result = Fido.search(attrs_time, a.Instrument.eit) >>> result Results from 1 Provider: 1 Results from the VSOClient: Start Time [1] End Time [1] Source Instrument Type Wavelength [2] Angstrom str19 str19 str4 str3 str8 float64 ------------------- ------------------- ------ ---------- -------- -------------- 2005-01-01 00:12:10 2005-01-01 00:12:22 SOHO EIT FULLDISK 195.0 .. 195.0 >>> attrs_time = a.Time('2016/10/22 00:00', '2016/10/25 23:59') >>> result = Fido.search(attrs_time, a.Instrument.lyra) >>> result Results from 1 Provider: 4 Results from the LYRAClient: Start Time End Time Source Instrument Wavelength str19 str19 str6 str4 str3 ------------------- ------------------- ------ ---------- ---------- 2016-10-22 00:00:00 2016-10-25 23:59:00 Proba2 lyra nan 2016-10-22 00:00:00 2016-10-25 23:59:00 Proba2 lyra nan 2016-10-22 00:00:00 2016-10-25 23:59:00 Proba2 lyra nan 2016-10-22 00:00:00 2016-10-25 23:59:00 Proba2 lyra nan Data is downloaded using:: >>> files = Fido.fetch(result) which returns a set of filepaths to the data. .. _whatsnew-0.8-coordinates: New coordinate package ====================== The SunPy coordinates package describes locations in physical space, and coordinate frames. It provides a way to transform coordinates from one frame like helioprojective to another such as heliographic. Coordinates can be defined very simply:: >>> import astropy.units as u >>> from astropy.coordinates import SkyCoord >>> from sunpy.coordinates import frames >>> a = SkyCoord(200*u.arcsec, 300*u.arcsec, frame=frames.Helioprojective) >>> a >>> b = SkyCoord(-20*u.degree, -56*u.degree, frame=frames.HeliographicStonyhurst) >>> b The coordinate ``a`` is in the helioprojective coordinate system, and the coordinate ``b`` is in the heliographic Stonyhurst system. Maps can also be used to define coordinate frames:: >>> import sunpy.map >>> import sunpy.data.sample >>> aia_map = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) >>> c = SkyCoord(-45*u.arcsec, 600*u.arcsec, frame=aia_map.coordinate_frame) >>> c ): (Tx, Ty) in arcsec (-45., 600.)> The coordinate ``c`` is now defined with respect to the coordinate frame derived from the map. The observer attribute:: >>> c.observer defines the location from which the coordinate was observed. Transformation between solar physics coordinate systems ------------------------------------------------------- Transformation between solar physics coordinate frames is simple:: >>> c.transform_to(frames.HeliographicStonyhurst) Transformation to astropy coordinate systems -------------------------------------------- Solar physics coordinates can also be transformed into astrophysical coordinates. For example, to convert to the International Celestial Reference System (ICRS):: >>> c.transform_to('icrs') Specification of observer at any major solar system body -------------------------------------------------------- Major solar system bodies can be used to specify observer locations in SkyCoord:: >>> d = SkyCoord(-45*u.arcsec, 600*u.arcsec, observer='Mars', obstime='2011-06-07 06:33:02', frame=frames.Helioprojective) >>> d ): (Tx, Ty) in arcsec (-45., 600.)> .. _whatsnew-0.8-timeseries: New timeseries data object ========================== The TimeSeries object is used to represent columns of time-ordered scalar values, and is source-aware, just like the Map object. This object supersedes the LightCurve object, which is now deprecated in 0.8. The TimeSeries object can be instantiated by passing in a file:: >>> import sunpy.timeseries >>> import sunpy.data.sample >>> goes = sunpy.timeseries.TimeSeries(sunpy.data.sample.GOES_XRS_TIMESERIES) TimeSeries objects can have more than one column:: >>> goes.columns ['xrsa', 'xrsb'] and have convenient plotting methods. .. plot:: :include-source: import sunpy.timeseries import sunpy.data.sample goes = sunpy.timeseries.TimeSeries(sunpy.data.sample.GOES_XRS_TIMESERIES) goes.peek() TimeSeries objects have a 'meta' property that stores the metadata of the timeseries:: >>> goes.meta |-------------------------------------------------------------------------------------------------| |TimeRange | Columns | Meta | |-------------------------------------------------------------------------------------------------| |2011-06-06 23:59:59.961999 | xrsa | simple: True | | to | xrsb | bitpix: 8 | |2011-06-07 23:59:57.631999 | | naxis: 0 | | | | extend: True | | | | date: 26/06/2012 | | | | numext: 3 | | | | telescop: GOES 15 | | | | instrume: X-ray Detector | | | | object: Sun | | | | origin: SDAC/GSFC | | | | ... | |-------------------------------------------------------------------------------------------------| and the data can be accessed as a pandas dataframe using:: >>> goes.data xrsa xrsb 2011-06-06 23:59:59.961999 1.000000e-09 1.887100e-07 2011-06-07 00:00:02.008999 1.000000e-09 1.834600e-07 2011-06-07 00:00:04.058999 1.000000e-09 1.860900e-07 ... 2011-06-07 23:59:55.584999 1.000000e-09 1.624800e-07 2011-06-07 23:59:57.631999 1.000000e-09 1.598500e-07 Data sources that do not provide FITS files need to have a ``source`` keyword to help with the identification and interpretation of the data:: >>> eve = sunpy.timeseries.TimeSeries(sunpy.data.sample.EVE_TIMESERIES, source='EVE') .. _whatsnew-0.8-differential_rotation: Differential rotation of maps ============================= Maps can now be transformed using solar differential rates using ``from sunpy.physics.differential_rotation import diffrot_map``. .. _whatsnew-0.8-renamed-removed: Renamed/removed functionality ============================= Several sub-packages have been moved or removed, and these are described in the following sections. sunpy.lightcurve ---------------- The package ``sunpy.lightcurve`` has been deprecated in favor of `~sunpy.timeseries`, and will be removed in a future version of SunPy. sunpy.physics.transforms ------------------------ The modules in ``sunpy.physics.transforms`` have been moved to `~sunpy.physics`. sunpy.net --------- ``HelioviewerClient`` has been removed from the ``sunpy.net`` namespace. It should now be imported with ``from sunpy.net.helioviewer import HelioviewerClient``. Full change log =============== To see a detailed list of all changes in version v0.8, including changes in API, please see the :ref:`changelog`. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/whatsnew/0.9.rst0000644000175100001710000001363500000000000015564 0ustar00vstsdocker.. doctest-skip-all .. _whatsnew-0.9: ************************ What's New in SunPy 0.9? ************************ Overview ======== SunPy 0.9 brings improved support for downloading data from the JSOC and bugfixes compared to the 0.8.x series of releases. The 0.9.x series will be the last series of SunPy releases to support Python 2. This is because Python 2 `will not be maintained after 2019 `_. The 0.9.x series will receive bugfixs only up until the and of life of Python 2 (around 18 months). No new functionality will be added to the 0.9.x series, which will also be the last version to include ``sunpy.spectra``, ``sunpy.lightcurve`` and ``sunpy.wcs``, all of which were deprecated in 0.8. SunPy 1.0 and higher will support Python 3 only. All new functionality will be available only in SunPy 1.0 and higher. On this page, you can read about some of the big changes in this release: * :ref:`whatsnew-0.9-python` * :ref:`whatsnew-0.9-jsoc` * :ref:`whatsnew-0.9-renamed-removed` SunPy 0.9 includes a large number of smaller improvements and bug fixes, which are described in the :ref:`changelog`. By the numbers: * 807 commits have been added since 0.8 * 310 issues have been closed since 0.8 * 147 pull requests have been merged since 0.8 * 34 people have contributed since 0.8 * 19 new contributors There have been numerous improvements to large parts of SunPy, notably in the content of SunPy's documentation, and the continuous integration testing of SunPy. In addition, SunPy co-ordinate system functionality has been improved, and the transformation between SunPy specific co-ordinate systems and those implemented by Astropy is now tested. The `sunpy.map.CompositeMap` object has received numerous bugfixes, improving its functionality. Bugfixes for various animation functionality have also been implemented. .. _whatsnew-0.9-python: Supported versions of Python ============================ SunPy is tested against Python 2.7, 3.5 and 3.6. .. _whatsnew-0.9-jsoc: Improvements to JSOC functionality ================================== JSOC search capabilities have been improved. It is now possible to search using any JSOC prime key, to search the metadata only, or to search by any series. SunPy's JSOC functionality uses the DRMS library, which is now a SunPy affiliated package. We would like to thank Kolja Glogowski for the DRMS package and for his help with the JSOC project. When using a JSOC query in Fido, you must provide a JSOC series and at least one PrimeKey (for example a start time and end time):: >>> from sunpy.net import Fido, attrs as a >>> result = Fido.search(a.jsoc.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), a.jsoc.Series('hmi.v_45s'), a.jsoc.Notify('me@email.org'))) >>> result Results from 1 Provider: 81 Results from the JSOCClient: T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT str23 str7 str10 float64 int64 ----------------------- -------- ---------- -------- ------- 2014.01.01_00:00:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:01:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:02:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:03:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:03:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:04:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 ... ... ... ... ... 2014.01.01_00:56:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:57:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:57:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:58:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:59:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_01:00:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_01:00:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 >>> result = Fido.search(a.jsoc.Time('2014-01-01T00:00:00', '2014-01-01T01:00:00'), a.jsoc.Series('aia.lev1_euv_12s'), a.jsoc.Notify('me@email.org'), a.jsoc.PrimeKey('WAVELNTH', '171')) >>> result Results from 1 Provider: 301 Results from the JSOCClient: T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT str20 str7 str5 int64 int64 -------------------- -------- -------- -------- ------- 2014-01-01T00:00:01Z SDO/AIA AIA_3 171 2145 2014-01-01T00:00:13Z SDO/AIA AIA_3 171 2145 2014-01-01T00:00:25Z SDO/AIA AIA_3 171 2145 2014-01-01T00:00:37Z SDO/AIA AIA_3 171 2145 2014-01-01T00:00:49Z SDO/AIA AIA_3 171 2145 2014-01-01T00:01:01Z SDO/AIA AIA_3 171 2145 ... ... ... ... ... 2014-01-01T00:58:49Z SDO/AIA AIA_3 171 2145 2014-01-01T00:59:01Z SDO/AIA AIA_3 171 2145 2014-01-01T00:59:13Z SDO/AIA AIA_3 171 2145 2014-01-01T00:59:25Z SDO/AIA AIA_3 171 2145 2014-01-01T00:59:37Z SDO/AIA AIA_3 171 2145 2014-01-01T00:59:49Z SDO/AIA AIA_3 171 2145 2014-01-01T01:00:01Z SDO/AIA AIA_3 171 2145 Data is downloaded using:: >>> files = Fido.fetch(result) which returns a set of filepaths to the downloaded data. For more information on accessing JSOC data using SunPy please `consult the documentation `_. .. _whatsnew-0.9-renamed-removed: Renamed/removed functionality ============================= sunpy.coordinates.representations --------------------------------- The package ``sunpy.coordinates.representations`` has been removed. Full change log =============== To see a detailed list of all changes in version v0.9, including changes in API, please see the :ref:`changelog`. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/docs/whatsnew/1.0.rst0000644000175100001710000004640300000000000015553 0ustar00vstsdocker.. doctest-skip-all .. _whatsnew-1.0: ************************ What's New in SunPy 1.0? ************************ Overview ======== The SunPy project is pleased to announce the 1.0 release of the sunpy package. This release is the result of over 14 months of work and marks a shift in the core library with the removal of a lot of legacy code and a focus on usability and stability. The headline changes in 1.0 are: * A complete transition of the whole code base to use `astropy.time.Time`, which was implemented by Vishnunarayan K I as part of Google Summer of Code 2018. * A rewrite of how all the clients in `sunpy.net` download files from the internet. This means vastly improved progress bars, skipping downloads if files are present, and better visibility and retrying of failed downloads. * A rewrite of the differential rotation and image warping code to correctly account for observer location using the Astropy coordinate functionality. * Removal of many deprecated functions and submodules; we have used the 1.0 release as a chance to clean out SunPy, reducing the number of lines of Python code in the package by almost 3,000! * The first release of SunPy to be Python 3 only, requiring Python 3.6+. This is because Python 2 `will not be maintained after 2019 `__. On this page, you can read about some of the big changes in this release: * :ref:`whatsnew-1.0-python` * :ref:`whatsnew-1.0-time` * :ref:`whatsnew-1.0-download` * :ref:`whatsnew-1.0-logging` * :ref:`whatsnew-1.0-coordinates` * :ref:`whatsnew-1.0-diffrot` * :ref:`whatsnew-1.0-maputils` * :ref:`whatsnew-1.0-moved-config` * :ref:`whatsnew-1.0-renamed-removed` There have been numerous improvements to large parts of SunPy, notably in the content of the documentation, continuous integration and testing. SunPy 1.0 also includes a large number of smaller improvements and bug fixes, which are described in the :ref:`changelog`. By the numbers: * 1913 commits have been added since 0.9 * 582 issues have been closed since 0.9 * 332 pull requests have been merged since 0.9 * 46 people have contributed since 0.9 * 25 new contributors .. _whatsnew-1.0-python: Supported versions of Python ============================ SunPy 1.0 has dropped Python 2 support as Python 2 is nearing the end of its support cycle. To port your code to Python 3, there is some good advice `here `__ and a breakdown of the relevant changes in Python 3 on the `Python 3 for Scientists `__ page. If you still need Python 2 support, SunPy 0.9.X will see bug fixes until the end of 2019, but no new features. As a result, SunPy's minimum Python version has been raised to Python 3.6 and is routinely tested against Python 3.6 and 3.7. .. _whatsnew-1.0-time: Astropy Time is used everywhere =============================== SunPy now uses Astropy's `~astropy.time.Time` object everywhere to represent time. This comes with numerous benefits: - **Support for non-UTC time scales.** UTC as well as non-UTC time scales like TAI, TT, UT1 etc. can be used with `astropy.time.Time`. .. code:: python >>> t = Time('2012-06-18T02:00:05.453', scale='tai') >>> t
')\ .replace(':\t', '') text_to_table = textwrap.dedent(f"""\
{partial_html}
""").replace('\n', '') # Handle bad values (infinite and NaN) in the data array finite_data = self.data[np.isfinite(self.data)] count_nan = np.isnan(self.data).sum() count_inf = np.isinf(self.data).sum() # Assemble an informational string with the counts of bad pixels bad_pixel_text = "" if count_nan + count_inf > 0: bad_pixel_text = "Bad pixels are shown in red: " text_list = [] if count_nan > 0: text_list.append(f"{count_nan} NaN") if count_inf > 0: text_list.append(f"{count_inf} infinite") bad_pixel_text += ", ".join(text_list) # Use a grayscale colormap with histogram equalization (and red for bad values) # Make a copy of the colormap to avoid modifying the matplotlib instance when # doing set_bad() cmap = copy.copy(cm.get_cmap('gray')) cmap.set_bad(color='red') norm = ImageNormalize(stretch=HistEqStretch(finite_data)) # Plot the image in pixel space fig = Figure(figsize=(5.2, 4.8)) # Figure instances in matplotlib<3.1 do not create a canvas by default if fig.canvas is None: FigureCanvasBase(fig) ax = fig.subplots() ax.imshow(self.data, origin='lower', interpolation='nearest', cmap=cmap, norm=norm) ax.set_xlabel('X pixel') ax.set_ylabel('Y pixel') ax.set_title('In pixel space') pixel_src = _figure_to_base64(fig) bounds = ax.get_position().bounds # save these axes bounds for later use # Plot the image using WCS information, with the same axes bounds as above fig = Figure(figsize=(5.2, 4.8)) # Figure instances in matplotlib<3.1 do not create a canvas by default if fig.canvas is None: FigureCanvasBase(fig) # Create the WCSAxes manually because we need to avoid using pyplot ax = WCSAxes(fig, bounds, aspect='equal', wcs=self.wcs) fig.add_axes(ax) self.plot(axes=ax, cmap=cmap, norm=norm) ax.set_title('In coordinate space using WCS information') wcs_src = _figure_to_base64(fig) # Plot the histogram of pixel values fig = Figure(figsize=(4.8, 2.4), constrained_layout=True) # Figure instances in matplotlib<3.1 do not create a canvas by default if fig.canvas is None: FigureCanvasBase(fig) ax = fig.subplots() values, bins, patches = ax.hist(finite_data.ravel(), bins=100) norm_centers = norm(0.5 * (bins[:-1] + bins[1:])).data for c, p in zip(norm_centers, patches): plt.setp(p, "facecolor", cmap(c)) ax.plot(np.array([bins[:-1], bins[1:]]).T.ravel(), np.array([values, values]).T.ravel()) ax.set_facecolor('white') ax.semilogy() # Explicitly set the power limits for the X axis formatter to avoid text overlaps ax.xaxis.get_major_formatter().set_powerlimits((-3, 4)) ax.set_xlabel('Pixel value in linear bins') ax.set_ylabel('# of pixels') ax.set_title('Distribution of pixel values [click for cumulative]') hist_src = _figure_to_base64(fig) # Plot the CDF of the pixel values using a symmetric-log horizontal scale fig = Figure(figsize=(4.8, 2.4), constrained_layout=True) # TODO: Figure instances in matplotlib<3.1 do not create a canvas by default if fig.canvas is None: FigureCanvasBase(fig) ax = fig.subplots() n_bins = 256 bins = norm.inverse(np.arange(n_bins + 1) / n_bins) values, _, patches = ax.hist(finite_data.ravel(), bins=bins, cumulative=True) for i, p in enumerate(patches): plt.setp(p, "facecolor", cmap((i + 0.5) / n_bins)) ax.plot(np.array([bins[:-1], bins[1:]]).T.ravel(), np.array([values, values]).T.ravel()) ax.set_facecolor('white') ax.set_xscale('symlog') ax.set_yscale('log') ax.set_xlabel('Pixel value in equalized bins') ax.set_ylabel('Cumulative # of pixels') ax.set_title('Cumulative distribution of pixel values') cdf_src = _figure_to_base64(fig) return textwrap.dedent(f"""\
{html.escape(object.__repr__(self))}
{text_to_table}
Image colormap uses histogram equalization
Click on the image to toggle between units
{bad_pixel_text}
""") def quicklook(self): """ Display a quicklook summary of the Map instance using the default web browser. Notes ----- The image colormap uses `histogram equalization `__. Clicking on the image to switch between pixel space and coordinate space requires Javascript support to be enabled in the web browser. Examples -------- >>> from sunpy.map import Map >>> import sunpy.data.sample # doctest: +REMOTE_DATA >>> smap = Map(sunpy.data.sample.AIA_171_IMAGE) # doctest: +REMOTE_DATA >>> smap.quicklook() # doctest: +SKIP (which will open the following content in the default web browser) .. generate:: html :html_border: from sunpy.map import Map import sunpy.data.sample smap = Map(sunpy.data.sample.AIA_171_IMAGE) print(smap._repr_html_()) """ with NamedTemporaryFile('w', delete=False, prefix='sunpy.map.', suffix='.html') as f: url = 'file://' + f.name f.write(textwrap.dedent(f"""\ Quicklook summary for {html.escape(object.__repr__(self))} {self._repr_html_()} """)) webbrowser.open_new_tab(url) @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)``. """ new_map = cls(data, meta, **kwargs) # plot_settings are set explicitly here as some map sources # explicitly set some of the plot_settings in the constructor # and we want to preserve the plot_settings of the previous # instance. if plot_settings is not None: new_map.plot_settings.update(plot_settings) return new_map def _get_lon_lat(self, frame): """ Given a coordinate frame, extract the lon and lat by casting to SphericalRepresentation first. """ r = frame.represent_as(UnitSphericalRepresentation) return r.lon.to(self.spatial_units[0]), r.lat.to(self.spatial_units[1]) @property def quantity(self): """Unitful representation of the map data.""" return u.Quantity(self.data, self.unit, copy=False) def _new_instance_from_op(self, new_data): """ Helper function for creating new map instances after arithmetic operations. """ new_meta = copy.deepcopy(self.meta) new_meta['bunit'] = new_data.unit.to_string('fits') return self._new_instance(new_data.value, new_meta, plot_settings=self.plot_settings) def __neg__(self): return self._new_instance(-self.data, self.meta, plot_settings=self.plot_settings) @check_arithmetic_compatibility def __pow__(self, value): new_data = self.quantity ** value return self._new_instance_from_op(new_data) @check_arithmetic_compatibility def __add__(self, value): new_data = self.quantity + value return self._new_instance_from_op(new_data) def __radd__(self, value): return self.__add__(value) def __sub__(self, value): return self.__add__(-value) def __rsub__(self, value): return self.__neg__().__add__(value) @check_arithmetic_compatibility def __mul__(self, value): new_data = self.quantity * value return self._new_instance_from_op(new_data) def __rmul__(self, value): return self.__mul__(value) def __truediv__(self, value): return self.__mul__(1/value) @check_arithmetic_compatibility def __rtruediv__(self, value): new_data = value / self.quantity return self._new_instance_from_op(new_data) @property def _meta_hash(self): return self.meta.item_hash() @property @cached_property_based_on('_meta_hash') def wcs(self): """ The `~astropy.wcs.WCS` property of the map. """ w2 = astropy.wcs.WCS(naxis=2) # Add one to go from zero-based to one-based indexing w2.wcs.crpix = u.Quantity(self.reference_pixel) + 1 * u.pix # Make these a quantity array to prevent the numpy setting element of # array with sequence error. # Explicityly call ``.to()`` to check that scale is in the correct units w2.wcs.cdelt = u.Quantity([self.scale[0].to(self.spatial_units[0] / u.pix), self.scale[1].to(self.spatial_units[1] / u.pix)]) 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.set_pv(self._pv_values) # FITS standard doesn't allow both PC_ij *and* CROTA keywords w2.wcs.crota = (0, 0) w2.wcs.cunit = self.spatial_units w2.wcs.dateobs = self.date.isot w2.wcs.aux.rsun_ref = self.rsun_meters.to_value(u.m) # Set observer coordinate information except when we know it is not appropriate (e.g., HGS) sunpy_frame = sunpy.coordinates.wcs_utils._sunpy_frame_class_from_ctypes(w2.wcs.ctype) if sunpy_frame is None or hasattr(sunpy_frame, 'observer'): # Clear all the aux information that was set earlier. This is to avoid # issues with maps that store multiple observer coordinate keywords. # Note that we have to create a new WCS as it's not possible to modify # wcs.wcs.aux in place. header = w2.to_header() for kw in ['crln_obs', 'dsun_obs', 'hgln_obs', 'hglt_obs']: header.pop(kw, None) w2 = astropy.wcs.WCS(header) # Get observer coord, and set the aux information obs_coord = self.observer_coordinate sunpy.coordinates.wcs_utils._set_wcs_aux_obs_coord(w2, obs_coord) # Set the shape of the data array w2.array_shape = self.data.shape # Validate the WCS here. w2.wcs.set() return w2 @property def coordinate_frame(self): """ An `astropy.coordinates.BaseCoordinateFrame` instance created from the coordinate information for this Map, or None if the frame cannot be determined. """ try: return astropy.wcs.utils.wcs_to_celestial_frame(self.wcs) except ValueError as e: warn_user(f'Could not determine coordinate frame from map metadata.\n{e}') return None @property def _coordinate_frame_name(self): if self.coordinate_frame is None: return 'Unknown' return self.coordinate_frame.name 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 https://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 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) @staticmethod def _parse_fits_unit(unit_str): replacements = {'gauss': 'G', 'dn': 'ct', 'dn/s': 'ct/s'} if unit_str.lower() in replacements: unit_str = replacements[unit_str.lower()] unit = u.Unit(unit_str, format='fits', parse_strict='silent') if isinstance(unit, u.UnrecognizedUnit): warn_metadata(f'Could not parse unit string "{unit_str}" as a valid FITS unit.\n' f'See {_META_FIX_URL} for how to fix metadata before loading it ' 'with sunpy.map.Map.\n' 'See https://fits.gsfc.nasa.gov/fits_standard.html for' 'the FITS unit standards.') unit = None return unit @property def unit(self): """ Unit of the map data. This is taken from the 'BUNIT' FITS keyword. If no 'BUNIT' entry is present in the metadata then this returns `None`. If the 'BUNIT' value cannot be parsed into a unit a warning is raised, and `None` returned. """ unit_str = self.meta.get('bunit', None) if unit_str is None: return return self._parse_fits_unit(unit_str) # #### Keyword attribute and other attribute definitions #### # def _base_name(self): """Abstract the shared bit between name and latex_name""" if self.measurement is None: format_str = "{nickname} {date}" else: format_str = "{nickname} {{measurement}} {date}" return format_str.format(nickname=self.nickname, date=parse_time(self.date).strftime(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 def _get_date(self, key): time = self.meta.get(key, None) if time is None: return # Get the time scale if 'TAI' in time: # SDO specifies the 'TAI' scale in their time string, which is parsed # by parse_time(). If a different timescale is also present, warn the # user that it will be ignored. timesys = 'TAI' timesys_meta = self.meta.get('timesys', '').upper() if timesys_meta not in ('', 'TAI'): warn_metadata('Found "TAI" in time string, ignoring TIMESYS keyword ' f'which is set to "{timesys_meta}".') else: timesys = self._timesys return parse_time(time, scale=timesys.lower()) @property def _timesys(self): """ Time system. """ # UTC is the FITS standard default return self.meta.get('timesys', 'UTC') @property def date_start(self): """ Time of the beginning of the image acquisition. Taken from the DATE-BEG FITS keyword. """ return self._get_date('date-beg') @property def date_end(self): """ Time of the end of the image acquisition. Taken from the DATE-END FITS keyword. """ return self._get_date('date-end') @property def date_average(self): """ Average time of the image acquisition. Taken from the DATE-AVG FITS keyword if present, otherwise halfway between `date_start` and `date_end` if both peices of metadata are present. """ avg = self._get_date('date-avg') if avg is None: start, end = self.date_start, self.date_end if start is not None and end is not None: avg = start + (end - start) / 2 return avg @property def _date_obs(self): # Get observation date from date-obs, falling back to date_obs time = self._get_date('date-obs') if is_time(self.meta.get('date_obs', None)): time = time or self._get_date('date_obs') return time @property def date(self): """ Image observation time. For different combinations of map metadata this can return either the start time, end time, or a time between these. It is recommended to use `~sunpy.map.GenericMap.date_average`, `~sunpy.map.GenericMap.date_start`, or `~sunpy.map.GenericMap.date_end` instead if you need one of these specific times. Taken from, in order of preference: 1. The DATE-OBS FITS keyword 2. `~sunpy.map.GenericMap.date_average` 3. `~sunpy.map.GenericMap.date_start` 4. `~sunpy.map.GenericMap.date_end` 5. The current time """ time = self._date_obs time = time or self.date_average time = time or self.date_start time = time or self.date_end if time is None: if self._default_time is None: warn_metadata("Missing metadata for observation time, " "setting observation time to current time. " "Set the 'DATE-AVG' FITS keyword to prevent this warning.") self._default_time = parse_time('now') time = self._default_time return time @property def detector(self): """ Detector name. This is taken from the 'DETECTOR' FITS keyword. """ return self.meta.get('detector', "") @property def timeunit(self): """ The `~astropy.units.Unit` of the exposure time of this observation. Taken from the "TIMEUNIT" FITS keyword, and defaults to seconds (as per) the FITS standard). """ return u.Unit(self.meta.get('timeunit', 's')) @property def exposure_time(self): """ Exposure time of the image. This is taken from the 'EXPTIME' FITS keyword. """ if 'exptime' in self.meta: return self.meta['exptime'] * self.timeunit @property def instrument(self): """Instrument name.""" return self.meta.get('instrume', "").replace("_", " ") @property def measurement(self): """ Measurement wavelength. This is taken from the 'WAVELNTH' FITS keywords. If the keyword is not present, defaults to `None`. If 'WAVEUNIT' keyword isn't present, defaults to dimensionless units. """ return self.wavelength @property def waveunit(self): """ The `~astropy.units.Unit` of the wavelength of this observation. This is taken from the 'WAVEUNIT' FITS keyword. If the keyword is not present, defaults to `None` """ if 'waveunit' in self.meta: return u.Unit(self.meta['waveunit']) else: wunit = sunpy.io.fits.extract_waveunit(self.meta) if wunit is not None: return u.Unit(wunit) @property def wavelength(self): """ Wavelength of the observation. This is taken from the 'WAVELNTH' FITS keywords. If the keyword is not present, defaults to `None`. If 'WAVEUNIT' keyword isn't present, defaults to dimensionless units. """ if 'wavelnth' in self.meta: return u.Quantity(self.meta['wavelnth'], self.waveunit) @property def observatory(self): """ Observatory or Telescope name. This is taken from the 'OBSRVTRY' FITS keyword. """ return self.meta.get('obsrvtry', self.meta.get('telescop', "")).replace("_", " ") @property def processing_level(self): """ Returns the FITS processing level if present. This is taken from the 'LVL_NUM' FITS keyword. """ return self.meta.get('lvl_num', None) @property def bottom_left_coord(self): """ The physical coordinate at the center of 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 at the center of the the top right ([-1, -1]) pixel. """ top_right = u.Quantity(self.dimensions) - 1 * u.pix return self.pixel_to_world(*top_right) @property def center(self): """ Return a coordinate object for the center pixel of the array. If the array has an even number of pixels in a given dimension, the coordinate returned lies on the edge between the two central pixels. """ center = (u.Quantity(self.dimensions) - 1 * u.pix) / 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 def shift(self, axis1: u.deg, axis2: u.deg): """ 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._reference_longitude + axis1).to(self.spatial_units[0])).value new_meta['crval2'] = ((self._reference_latitude + 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 def _rsun_meters(self, dsun=None): """ This property exists to avoid circular logic in constructing the observer coordinate, by allowing a custom 'dsun' to be specified, instead of one extracted from the `.observer_coordinate` property. """ rsun = self.meta.get('rsun_ref', None) if rsun is not None: return rsun * u.m elif self._rsun_obs_no_default is not None: if dsun is None: dsun = self.dsun return sun._radius_from_angular_radius(self.rsun_obs, dsun) else: log.info("Missing metadata for solar radius: assuming " "the standard radius of the photosphere.") return constants.radius @property def rsun_meters(self): """ Assumed radius of observed emission from the Sun center. This is taken from the RSUN_REF FITS keyword, if present. If not, and angular radius metadata is present, it is calculated from `~sunpy.map.GenericMap.rsun_obs` and `~sunpy.map.GenericMap.dsun`. If neither pieces of metadata are present, defaults to the standard photospheric radius. """ return self._rsun_meters() @property def _rsun_obs_no_default(self): """ Get the angular radius value from FITS keywords without defaulting. Exists to avoid circular logic in `rsun_meters()` above. """ return self.meta.get('rsun_obs', self.meta.get('solar_r', self.meta.get('radius', None))) @property def rsun_obs(self): """ Angular radius of the observation from Sun center. This value is taken (in order of preference) from the 'RSUN_OBS', 'SOLAR_R', or 'RADIUS' FITS keywords. If none of these keys are present, the angular radius is calculated from `~sunpy.map.GenericMap.rsun_meters` and `~sunpy.map.GenericMap.dsun`. """ rsun_arcseconds = self._rsun_obs_no_default if rsun_arcseconds is not None: return rsun_arcseconds * u.arcsec else: return sun._angular_radius(self.rsun_meters, self.dsun) @property def coordinate_system(self): """ Coordinate system used for x and y axes (ctype1/2). If not present, defaults to (HPLN-TAN, HPLT-TAN), and emits a warning. """ ctype1 = self.meta.get('ctype1', None) if ctype1 is None: warn_metadata("Missing CTYPE1 from metadata, assuming CTYPE1 is HPLN-TAN") ctype1 = 'HPLN-TAN' ctype2 = self.meta.get('ctype2', None) if ctype2 is None: warn_metadata("Missing CTYPE2 from metadata, assuming CTYPE2 is HPLT-TAN") ctype2 = 'HPLT-TAN' # 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 ctype1.lower() in ("solar-x", "solar_x"): ctype1 = 'HPLN-TAN' if ctype2.lower() in ("solar-y", "solar_y"): ctype2 = 'HPLT-TAN' return SpatialPair(ctype1, ctype2) @property def _supported_observer_coordinates(self): """ A list of supported coordinate systems. This is a list so it can easily maintain a strict order. The list of two element tuples, the first item in the tuple is the keys that need to be in the header to use this coordinate system and the second is the kwargs to SkyCoord. """ return [(('hgln_obs', 'hglt_obs', 'dsun_obs'), {'lon': self.meta.get('hgln_obs'), 'lat': self.meta.get('hglt_obs'), 'radius': self.meta.get('dsun_obs'), 'unit': (u.deg, u.deg, u.m), 'frame': "heliographic_stonyhurst"}), (('crln_obs', 'crlt_obs', 'dsun_obs'), {'lon': self.meta.get('crln_obs'), 'lat': self.meta.get('crlt_obs'), 'radius': self.meta.get('dsun_obs'), 'unit': (u.deg, u.deg, u.m), 'frame': "heliographic_carrington"}), ] @property def _default_observer_coordinate(self): """ The default obsever coordinate. This can be overriden by map sources to provide a preferred observer coordinate. """ def _remove_existing_observer_location(self): """ Remove all keys that this map might use for observer location. """ all_keys = expand_list([e[0] for e in self._supported_observer_coordinates]) for key in all_keys: self.meta.pop(key) @property @cached_property_based_on('_meta_hash') def observer_coordinate(self): """ The Heliographic Stonyhurst Coordinate of the observer. """ default = self._default_observer_coordinate if default is not None: return default missing_meta = {} for keys, kwargs in self._supported_observer_coordinates: meta_list = [k in self.meta for k in keys] if all(meta_list): sc = SkyCoord(obstime=self.date, **kwargs) # If the observer location is supplied in Carrington coordinates, # the coordinate's `observer` attribute should be set to "self" if isinstance(sc.frame, HeliographicCarrington): sc.frame._observer = "self" sc = sc.heliographic_stonyhurst # We set rsun after constructing the coordinate, as we need # the observer-Sun distance (sc.radius) to calculate this, which # may not be provided directly in metadata (if e.g. the # observer coordinate is specified in a cartesian # representation) return SkyCoord(sc.replicate(rsun=self._rsun_meters(sc.radius))) elif any(meta_list) and not set(keys).isdisjoint(self.meta.keys()): if not isinstance(kwargs['frame'], str): kwargs['frame'] = kwargs['frame'].name missing_meta[kwargs['frame']] = set(keys).difference(self.meta.keys()) warning_message = "".join( [f"For frame '{frame}' the following metadata is missing: {','.join(keys)}\n" for frame, keys in missing_meta.items()]) warning_message = "Missing metadata for observer: assuming Earth-based observer.\n" + warning_message warn_metadata(warning_message, stacklevel=3) return get_earth(self.date) @property def heliographic_latitude(self): """Observer heliographic latitude.""" return self.observer_coordinate.lat @property def heliographic_longitude(self): """Observer heliographic longitude.""" return self.observer_coordinate.lon @property def carrington_latitude(self): """Observer Carrington latitude.""" hgc_frame = HeliographicCarrington(observer=self.observer_coordinate, obstime=self.date, rsun=self.rsun_meters) return self.observer_coordinate.transform_to(hgc_frame).lat @property def carrington_longitude(self): """Observer Carrington longitude.""" hgc_frame = HeliographicCarrington(observer=self.observer_coordinate, obstime=self.date, rsun=self.rsun_meters) return self.observer_coordinate.transform_to(hgc_frame).lon @property def dsun(self): """Observer distance from the center of the Sun.""" return self.observer_coordinate.radius.to('m') @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): """ Pixel of reference coordinate. The pixel returned uses zero-based indexing, so will be 1 pixel less than the FITS CRPIX values. """ naxis1 = self.meta.get('naxis1', self.data.shape[1]) naxis2 = self.meta.get('naxis2', self.data.shape[0]) return PixelPair((self.meta.get('crpix1', (naxis1 + 1) / 2.) - 1) * u.pixel, (self.meta.get('crpix2', (naxis2 + 1) / 2.) - 1) * 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). """ units = self.meta.get('cunit1', None), self.meta.get('cunit2', None) units = [None if unit is None else u.Unit(unit.lower()) for unit in units] return SpatialPair(units[0], units[1]) @property def rotation_matrix(self): r""" Matrix describing the transformation needed to align the reference pixel with the coordinate axes. The order or precendence of FITS keywords which this is taken from is: - PC\*_\* - CD\*_\* - CROTA\* Notes ----- In many cases this is a simple rotation matrix, hence the property name. It general it does not have to be a pure rotation matrix, and can encode other transformations e.g., skews for non-orthgonal coordinate systems. """ if 'PC1_1' in self.meta: return np.array([[self.meta['PC1_1'], self.meta['PC1_2']], [self.meta['PC2_1'], self.meta['PC2_2']]]) elif 'CD1_1' in self.meta: cd = np.array([[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() @staticmethod def _pc_matrix(lam, angle): """ Returns PC matrix from the scale ration (lam) and rotation angle in radians (angle). """ return np.array([[np.cos(angle), -1 * lam * np.sin(angle)], [1/lam * np.sin(angle), np.cos(angle)]]) def _rotation_matrix_from_crota(self, crota_key='CROTA2'): """ This method converts the deprecated CROTA FITS kwargs to the new PC rotation matrix. This method can be overridden if an instruments header does not use this conversion. Parameters ---------- crota_key : str, optional The key to use for CROTA2. Defaults to 'CROTA2'. Notes ----- If the specified key isn't present in the metadata, a default rotation of 0deg is returned. """ lam = self.scale[1] / self.scale[0] p = np.deg2rad(self.meta.get(crota_key, 0)) return self._pc_matrix(lam, p) @property def _pv_values(self): """ Return any PV values in the metadata. """ pattern = re.compile('pv[0-9]_[0-9]a', re.IGNORECASE) pv_keys = [k for k in self.meta.keys() if pattern.match(k)] pv_values = [] for k in pv_keys: i, m = int(k[2]), int(k[4]) pv_values.append((i, m, self.meta[k])) return pv_values @property def fits_header(self): """ A `~astropy.io.fits.Header` representation of the ``meta`` attribute. """ return sunpy.io.fits.header_to_fits(self.meta) # #### Miscellaneous #### # def _get_cmap_name(self): """Build the default color map name.""" cmap_string = (self.observatory + self.detector + str(int(self.wavelength.to('angstrom').value))) return cmap_string.lower() def _validate_meta(self): """ Validates some 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. """ msg = ('Image coordinate units for axis {} not present in metadata.') err_message = [] for i in [0, 1]: if self.spatial_units[i] is None: err_message.append(msg.format(i+1, i+1)) if err_message: err_message.append( f'See {_META_FIX_URL} for instructions on how to add missing metadata.') raise MapMetaValidationError('\n'.join(err_message)) for meta_property in ('waveunit', ): if (self.meta.get(meta_property) and u.Unit(self.meta.get(meta_property), parse_strict='silent').physical_type == 'unknown'): warn_metadata(f"Unknown value for {meta_property.upper()}.") if (self.coordinate_system[0].startswith(('SOLX', 'SOLY')) or self.coordinate_system[1].startswith(('SOLX', 'SOLY'))): warn_user("sunpy Map does not support three dimensional data " "and therefore cannot represent heliocentric coordinates. Proceed at your own risk.") if not all(su.is_equivalent(u.arcsec) for su in self.spatial_units): units = [su.to_string() for su in self.spatial_units] raise MapMetaValidationError( 'Map only supports spherical coordinate systems with angular units ' f'(ie. equivalent to arcsec), but this map has units {units}') # #### Data conversion routines #### # def world_to_pixel(self, coordinate): """ Convert a world (data) coordinate to a pixel coordinate. Parameters ---------- coordinate : `~astropy.coordinates.SkyCoord` or `~astropy.coordinates.BaseCoordinateFrame` The coordinate object to convert to pixel coordinates. Returns ------- x : `~astropy.units.Quantity` Pixel coordinate on the CTYPE1 axis. y : `~astropy.units.Quantity` Pixel coordinate on the CTYPE2 axis. """ x, y = self.wcs.world_to_pixel(coordinate) return PixelPair(x * u.pixel, y * u.pixel) @u.quantity_input def pixel_to_world(self, x: u.pixel, y: u.pixel): """ Convert a pixel coordinate to a data (world) coordinate. 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). Returns ------- coord : `astropy.coordinates.SkyCoord` A coordinate object representing the output coordinate. """ return self.wcs.pixel_to_world(x, y) # #### 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, optional Any supported file extension, defaults to ``auto"``. hdu_type : `~astropy.io.fits.hdu.base.ExtensionHDU` instance or class, optional By default, a FITS file is written with the map in its primary HDU. If a type is given, a new HDU of this type will be created. If a HDU instance is given, its data and header will be updated from the map. Then that HDU instance will be written to the file. kwargs : Any additional keyword arguments are passed to `~sunpy.io.write_file`. """ io.write_file(filepath, self.data, self.meta, filetype=filetype, **kwargs) # #### Image processing routines #### # @u.quantity_input def resample(self, dimensions: u.pixel, method='linear'): """ Resample 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` Output pixel dimensions. The first argument corresponds to the 'x' axis and the second argument corresponds to the 'y' axis. method : str Method to use for resampling interpolation. * ``'neighbor'`` - Take closest value from original data. * ``'nearest'`` and ``'linear'`` - Use n x 1-D interpolations using `scipy.interpolate.interp1d`. * ``'spline'`` - Uses piecewise polynomials (splines) for mapping the input array to new coordinates by interpolation using `scipy.ndimage.map_coordinates`. Returns ------- out : `~sunpy.map.GenericMap` or subclass Resampled map References ---------- `Rebinning `_ """ # 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 if 'pc1_1' in self.meta: new_meta['pc1_1'] *= scale_factor_x new_meta['pc2_1'] *= scale_factor_x new_meta['pc1_2'] *= scale_factor_y new_meta['pc2_2'] *= scale_factor_y if 'cd1_1' in self.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 if 'cd1_1' not in self.meta and 'pc1_1' not in self.meta: # Using the CROTA2 and CDELT formalism new_meta['cdelt1'] *= scale_factor_x new_meta['cdelt2'] *= scale_factor_y new_meta['crpix1'] = (self.reference_pixel.x.to_value(u.pix) + 0.5) / scale_factor_x + 0.5 new_meta['crpix2'] = (self.reference_pixel.y.to_value(u.pix) + 0.5) / scale_factor_y + 0.5 new_meta['naxis1'] = new_data.shape[1] new_meta['naxis2'] = new_data.shape[0] # Create new map instance new_map = self._new_instance(new_data, new_meta, self.plot_settings) return new_map @u.quantity_input def rotate(self, angle: u.deg = 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 : array-like 2x2 linear transformation rotation matrix. order : int Interpolation order to be used. Must be in the range 0-5. 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.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.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(). """ # Put the import here to reduce sunpy.map import time from sunpy.image.transform import affine_transform if angle is not None and rmatrix is not None: raise ValueError("You cannot specify both an angle and a rotation matrix.") elif angle is None and rmatrix is None: rmatrix = self.rotation_matrix 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.array([[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))) if issubclass(self.data.dtype.type, numbers.Integral) and (missing % 1 != 0): warn_user("The specified `missing` value is not an integer, but the data " "array is of integer type, so the output may be strange.") new_data = np.pad(self.data, ((pad_y, pad_y), (pad_x, pad_x)), mode='constant', constant_values=(missing, missing)) # All of the following pixel calculations use a pixel origin of 0 pixel_array_center = (np.flipud(new_data.shape) - 1) / 2.0 pixel_rotation_center = u.Quantity(self.reference_pixel).value + [pad_x, pad_y] 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, np.linalg.inv(rmatrix)) 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 @u.quantity_input def submap(self, bottom_left, *, top_right=None, width: (u.deg, u.pix) = None, height: (u.deg, u.pix) = None): """ Returns a submap defined by a rectangle. Any pixels which have at least part of their area inside the rectangle are returned. If the rectangle is defined in world coordinates, the smallest array which contains all four corners of the rectangle as defined in world coordinates is returned. Parameters ---------- bottom_left : `astropy.units.Quantity` or `~astropy.coordinates.SkyCoord` The bottom-left coordinate of the rectangle. If a `~astropy.coordinates.SkyCoord` it can have shape ``(2,)`` and simultaneously define ``top_right``. If specifying pixel coordinates it must be given as an `~astropy.units.Quantity` object with units of pixels. top_right : `astropy.units.Quantity` or `~astropy.coordinates.SkyCoord`, optional The top-right coordinate of the rectangle. If ``top_right`` is specified ``width`` and ``height`` must be omitted. width : `astropy.units.Quantity`, optional The width of the rectangle. Required if ``top_right`` is omitted. height : `astropy.units.Quantity` The height of the rectangle. Required if ``top_right`` is omitted. Returns ------- out : `~sunpy.map.GenericMap` or subclass A new map instance is returned representing to specified sub-region. Notes ----- When specifying pixel coordinates, they are specified in Cartesian order not in numpy order. So, for example, the ``bottom_left=`` argument should be ``[left, bottom]``. Examples -------- >>> import astropy.units as u >>> from astropy.coordinates import SkyCoord >>> import sunpy.map >>> import sunpy.data.sample # doctest: +REMOTE_DATA >>> aia = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) # doctest: +REMOTE_DATA >>> bl = SkyCoord(-300*u.arcsec, -300*u.arcsec, frame=aia.coordinate_frame) # doctest: +REMOTE_DATA >>> tr = SkyCoord(500*u.arcsec, 500*u.arcsec, frame=aia.coordinate_frame) # doctest: +REMOTE_DATA >>> aia.submap(bl, top_right=tr) # doctest: +REMOTE_DATA 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: [335. 335.] pix Coordinate System: helioprojective Scale: [2.402792 2.402792] arcsec / pix Reference Pixel: [126.5 125.5] pix Reference Coord: [3.22309951 1.38578135] arcsec ... >>> aia.submap([0,0]*u.pixel, top_right=[5,5]*u.pixel) # doctest: +REMOTE_DATA 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: [6. 6.] pix Coordinate System: helioprojective Scale: [2.402792 2.402792] arcsec / pix Reference Pixel: [511.5 511.5] pix Reference Coord: [3.22309951 1.38578135] arcsec ... >>> width = 10 * u.arcsec >>> height = 10 * u.arcsec >>> aia.submap(bl, width=width, height=height) # doctest: +REMOTE_DATA 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: [125.5 125.5] pix Reference Coord: [3.22309951 1.38578135] arcsec ... >>> bottom_left_vector = SkyCoord([0, 10] * u.deg, [0, 10] * u.deg, frame='heliographic_stonyhurst') >>> aia.submap(bottom_left_vector) # doctest: +REMOTE_DATA 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: [70. 69.] pix Coordinate System: helioprojective Scale: [2.402792 2.402792] arcsec / pix Reference Pixel: [1.5 0.5] pix Reference Coord: [3.22309951 1.38578135] arcsec ... """ # Check that we have been given a valid combination of inputs # [False, False, False] is valid if bottom_left contains the two corner coords if ([arg is not None for arg in (top_right, width, height)] not in [[True, False, False], [False, False, False], [False, True, True]]): raise ValueError("Either top_right alone or both width and height must be specified.") # parse input arguments pixel_corners = u.Quantity(self._parse_submap_input( bottom_left, top_right, width, height)).T # The pixel corners result is in Cartesian order, so the first index is # columns and the second is rows. bottom = np.min(pixel_corners[1]).to_value(u.pix) top = np.max(pixel_corners[1]).to_value(u.pix) left = np.min(pixel_corners[0]).to_value(u.pix) right = np.max(pixel_corners[0]).to_value(u.pix) # Round the lower left pixel to the nearest integer # We want 0.5 to be rounded up to 1, so use floor(x + 0.5) bottom = np.floor(bottom + 0.5) left = np.floor(left + 0.5) # Round the top right pixel to the nearest integer, then add 1 for array indexing # We want e.g. 2.5 to be rounded down to 2, so use ceil(x - 0.5) top = np.ceil(top - 0.5) + 1 right = np.ceil(right - 0.5) + 1 # Clip pixel values to max of array, prevents negative # indexing bottom = int(np.clip(bottom, 0, self.data.shape[0])) top = int(np.clip(top, 0, self.data.shape[0])) left = int(np.clip(left, 0, self.data.shape[1])) right = int(np.clip(right, 0, self.data.shape[1])) arr_slice = np.s_[bottom:top, left:right] # Get ndarray representation of submap new_data = self.data[arr_slice].copy() # Make a copy of the header with updated centering information new_meta = self.meta.copy() # Add one to go from zero-based to one-based indexing new_meta['crpix1'] = self.reference_pixel.x.to_value(u.pix) + 1 - left new_meta['crpix2'] = self.reference_pixel.y.to_value(u.pix) + 1 - bottom 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[arr_slice].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 @seconddispatch def _parse_submap_input(self, bottom_left, top_right, width, height): """ Should take any valid input to submap() and return bottom_left and top_right in pixel coordinates. """ @_parse_submap_input.register(u.Quantity) def _parse_submap_quantity_input(self, bottom_left, top_right, width, height): if top_right is None and width is None: raise ValueError('Either top_right alone or both width and height must be specified ' 'when bottom_left is a Quantity') if bottom_left.shape != (2, ): raise ValueError('bottom_left must have shape (2, ) when specified as a Quantity') if top_right is not None: if top_right.shape != (2, ): raise ValueError('top_right must have shape (2, ) when specified as a Quantity') if not top_right.unit.is_equivalent(u.pix): raise TypeError("When bottom_left is a Quantity, top_right " "must be a Quantity in units of pixels.") # Have bottom_left and top_right in pixels already, so no need to do # anything else else: if not (width.unit.is_equivalent(u.pix) and height.unit.is_equivalent(u.pix)): raise TypeError("When bottom_left is a Quantity, width and height " "must be a Quantity in units of pixels.") # Add width and height to get top_right top_right = u.Quantity([bottom_left[0] + width, bottom_left[1] + height]) top_left = u.Quantity([top_right[0], bottom_left[1]]) bottom_right = u.Quantity([bottom_left[0], top_right[1]]) return bottom_left, top_left, top_right, bottom_right @_parse_submap_input.register(SkyCoord) def _parse_submap_coord_input(self, bottom_left, top_right, width, height): # Use helper function to get top_right as a SkyCoord bottom_left, top_right = get_rectangle_coordinates(bottom_left, top_right=top_right, width=width, height=height) frame = bottom_left.frame left_lon, bottom_lat = self._get_lon_lat(bottom_left) right_lon, top_lat = self._get_lon_lat(top_right) corners = SkyCoord([left_lon, left_lon, right_lon, right_lon], [bottom_lat, top_lat, top_lat, bottom_lat], frame=frame) return tuple(u.Quantity(self.wcs.world_to_pixel(corners), u.pix).T) @u.quantity_input def superpixel(self, dimensions: u.pixel, offset: u.pixel = (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. The first argument corresponds to the 'x' axis and the second argument corresponds to the 'y' axis. If non-integer values are provided, they are rounded using `int`. offset : tuple Offset from (0,0) in original map pixels used to calculate where the data used to make the resulting superpixel map starts. If non-integer value are provided, they are rounded using `int`. 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.") # These are rounded by int() in reshape_image_to_4d_superpixel, # so round here too for use in constructing metadata later. dimensions = [int(dim) for dim in dimensions.to_value(u.pix)] offset = [int(off) for off in offset.to_value(u.pix)] # Make a copy of the original data, perform reshaping, and apply the # function. if self.mask is not None: data = np.ma.array(self.data.copy(), mask=self.mask) else: data = self.data.copy() reshaped = reshape_image_to_4d_superpixel(data, [dimensions[1], dimensions[0]], [offset[1], offset[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() # Update metadata if 'pc1_1' in self.meta: new_meta['pc1_1'] *= dimensions[0] new_meta['pc2_1'] *= dimensions[0] new_meta['pc1_2'] *= dimensions[1] new_meta['pc2_2'] *= dimensions[1] if 'cd1_1' in self.meta: new_meta['cd1_1'] *= dimensions[0] new_meta['cd2_1'] *= dimensions[0] new_meta['cd1_2'] *= dimensions[1] new_meta['cd2_2'] *= dimensions[1] if 'cd1_1' not in self.meta and 'pc1_1' not in self.meta: # Using the CROTA2 and CDELT formalism new_meta['cdelt1'] *= dimensions[0] new_meta['cdelt2'] *= dimensions[1] new_meta['crpix1'] = ((self.reference_pixel.x.to_value(u.pix) + 0.5 - offset[0]) / dimensions[0]) + 0.5 new_meta['crpix2'] = ((self.reference_pixel.y.to_value(u.pix) + 0.5 - offset[1]) / dimensions[1]) + 0.5 # 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 #### # @property def cmap(self): """ Return the `matplotlib.colors.Colormap` instance this map uses. """ cmap = self.plot_settings['cmap'] if isinstance(cmap, str): cmap = plt.get_cmap(cmap) # Set the colormap to be this specific instance so we are not # returning a copy self.plot_settings['cmap'] = cmap return cmap @u.quantity_input def draw_grid(self, axes=None, grid_spacing: u.deg = 15*u.deg, annotate=True, **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. annotate : `bool` Passing `False` disables the axes labels and the ticks on the top and right axes. Returns ------- overlay: `~astropy.visualization.wcsaxes.CoordinatesMap` The wcsaxes coordinate overlay instance. Notes ----- Keyword arguments are passed onto the `sunpy.visualization.wcsaxes_compat.wcsaxes_heliographic_overlay` function. """ axes = self._check_axes(axes) return wcsaxes_compat.wcsaxes_heliographic_overlay(axes, grid_spacing=grid_spacing, annotate=annotate, obstime=self.date, rsun=self.rsun_meters, **kwargs) def draw_limb(self, axes=None, *, resolution=1000, **kwargs): """ Draws the solar limb as seen by the map's observer. The limb is a circle for only the simplest plots. If the coordinate frame of the limb is different from the coordinate frame of the plot axes, not only may the limb not be a true circle, a portion of the limb may be hidden from the observer. In that case, the circle is divided into visible and hidden segments, represented by solid and dotted lines, respectively. Parameters ---------- axes : `~matplotlib.axes` or ``None`` Axes to plot limb on or ``None`` to use current axes. resolution : `int` The number of points to use to represent the limb. Returns ------- visible : `~matplotlib.patches.Polygon` or `~matplotlib.patches.Circle` The patch added to the axes for the visible part of the limb (i.e., the "near" side of the Sun). hidden : `~matplotlib.patches.Polygon` or None The patch added to the axes for the hidden part of the limb (i.e., the "far" side of the Sun). Notes ----- Keyword arguments are passed onto the patches. If the limb is a true circle, ``visible`` will instead be `~matplotlib.patches.Circle` and ``hidden`` will be ``None``. If there are no visible points (e.g., on a synoptic map any limb is fully) visible ``hidden`` will be ``None``. To avoid triggering Matplotlib auto-scaling, these patches are added as artists instead of patches. One consequence is that the plot legend is not populated automatically when the limb is specified with a text label. See :ref:`sphx_glr_gallery_text_labels_and_annotations_custom_legends.py` in the Matplotlib documentation for examples of creating a custom legend. """ # Put imports here to reduce sunpy.map import time from matplotlib import patches import sunpy.visualization.limb # Don't use _check_axes() here, as drawing the limb works fine on none-WCSAxes, # even if the image is rotated relative to the axes if not axes: axes = wcsaxes_compat.gca_wcs(self.wcs) is_wcsaxes = wcsaxes_compat.is_wcsaxes(axes) if is_wcsaxes: # TODO: supply custom limb radius return sunpy.visualization.limb.draw_limb( axes, self.observer_coordinate, resolution=resolution, rsun=self.rsun_meters, **kwargs) else: # If not WCSAxes use a Circle c_kw.setdefault('radius', self.rsun_obs.value) circ = patches.Circle([0, 0], **c_kw) axes.add_artist(circ) return circ, None @u.quantity_input def draw_quadrangle(self, bottom_left, *, width: (u.deg, u.pix) = None, height: (u.deg, u.pix) = None, axes=None, top_right=None, **kwargs): """ Draw a quadrangle defined in world coordinates on the plot using Astropy's `~astropy.visualization.wcsaxes.Quadrangle`. This draws a quadrangle that has corners at ``(bottom_left, top_right)``, and has sides aligned with the coordinate axes of the frame of ``bottom_left``, which may be different from the coordinate axes of the map. If ``width`` and ``height`` are specified, they are respectively added to the longitude and latitude of the ``bottom_left`` coordinate to calculate a ``top_right`` coordinate. Parameters ---------- bottom_left : `~astropy.coordinates.SkyCoord` or `~astropy.units.Quantity` The bottom-left coordinate of the rectangle. If a `~astropy.coordinates.SkyCoord` it can have shape ``(2,)`` and simultaneously define ``top_right``. If specifying pixel coordinates it must be given as an `~astropy.units.Quantity` object with pixel units (e.g., ``pix``). top_right : `~astropy.coordinates.SkyCoord` or `~astropy.units.Quantity`, optional The top-right coordinate of the quadrangle. If ``top_right`` is specified ``width`` and ``height`` must be omitted. width : `astropy.units.Quantity`, optional The width of the quadrangle. Required if ``top_right`` is omitted. height : `astropy.units.Quantity` The height of the quadrangle. Required if ``top_right`` is omitted. axes : `matplotlib.axes.Axes` The axes on which to plot the quadrangle. Defaults to the current axes. Returns ------- quad : `~astropy.visualization.wcsaxes.Quadrangle` The added patch. Notes ----- Extra keyword arguments to this function are passed through to the `~astropy.visualization.wcsaxes.Quadrangle` instance. Examples -------- .. minigallery:: sunpy.map.GenericMap.draw_quadrangle """ axes = self._check_axes(axes) if isinstance(bottom_left, u.Quantity): anchor, _, top_right, _ = self._parse_submap_quantity_input(bottom_left, top_right, width, height) width, height = top_right - anchor transform = axes.get_transform(self.wcs if self.wcs is not axes.wcs else 'pixel') kwargs.update({"vertex_unit": u.pix}) else: bottom_left, top_right = get_rectangle_coordinates( bottom_left, top_right=top_right, width=width, height=height) width = Longitude(top_right.spherical.lon - bottom_left.spherical.lon) height = top_right.spherical.lat - bottom_left.spherical.lat anchor = self._get_lon_lat(bottom_left) transform = axes.get_transform(bottom_left.frame.replicate_without_data()) kwergs = { "transform": transform, "edgecolor": "white", "fill": False, } kwergs.update(kwargs) quad = Quadrangle(anchor, width, height, **kwergs) axes.add_patch(quad) return quad def _process_levels_arg(self, levels): """ Accept a percentage or dimensionless or map unit input for contours. """ levels = np.atleast_1d(levels) if not hasattr(levels, 'unit'): if self.unit is None: # No map units, so allow non-quantity through return levels else: raise TypeError("The levels argument has no unit attribute, " "it should be an Astropy Quantity object.") if levels.unit == u.percent: return 0.01 * levels.to_value('percent') * np.nanmax(self.data) elif self.unit is not None: return levels.to_value(self.unit) elif levels.unit.is_equivalent(u.dimensionless_unscaled): # Handle case where map data has no units return levels.to_value(u.dimensionless_unscaled) else: # Map data has no units, but levels doesn't have dimensionless units raise u.UnitsError("This map has no unit, so levels can only be specified in percent " "or in u.dimensionless_unscaled units.") 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 contours to draw. These are given as a percentage of the maximum value of the map data, or in units equivalent to the `~sunpy.map.GenericMap.unit` attribute. axes : `matplotlib.axes.Axes` The axes on which to plot the contours. Defaults to the current axes. Returns ------- cs : `list` The `~matplotlib.contour.QuadContourSet` object, after it has been added to ``axes``. Notes ----- Extra keyword arguments to this function are passed through to the `~matplotlib.axes.Axes.contour` function. """ axes = self._check_axes(axes) levels = self._process_levels_arg(levels) # Pixel indices y, x = np.indices(self.data.shape) # Prepare a local variable in case we need to mask values data = self.data # Transform the indices if plotting to a different WCS # We do this instead of using the `transform` keyword argument so that Matplotlib does not # get confused about the bounds of the contours if wcsaxes_compat.is_wcsaxes(axes) and self.wcs is not axes.wcs: transform = axes.get_transform(self.wcs) - axes.transData # pixel->pixel transform x_1d, y_1d = transform.transform(np.stack([x.ravel(), y.ravel()]).T).T x, y = np.reshape(x_1d, x.shape), np.reshape(y_1d, y.shape) # Mask out the data array anywhere the coordinate arrays are not finite data = np.ma.array(data, mask=~np.logical_and(np.isfinite(x), np.isfinite(y))) cs = axes.contour(x, y, data, levels, **contour_args) return cs @peek_show def peek(self, draw_limb=False, draw_grid=False, colorbar=True, **matplot_args): """ Displays a graphical overview of the data in this object for user evaluation. For the creation of plots, users should instead use the `~sunpy.map.GenericMap.plot` method and Matplotlib's pyplot framework. 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. colorbar : bool Whether to display a colorbar next to the plot. **matplot_args : dict Matplotlib Any additional imshow arguments that should be used when plotting. """ figure = plt.figure() axes = wcsaxes_compat.gca_wcs(self.wcs) im = self.plot(axes=axes, **matplot_args) grid_spacing = None # Handle case where draw_grid is actually the grid sapcing if isinstance(draw_grid, u.Quantity): grid_spacing = draw_grid draw_grid = True elif not isinstance(draw_grid, bool): raise TypeError("draw_grid should be a bool or an astropy Quantity.") if colorbar: if draw_grid: pad = 0.12 # Pad to compensate for ticks and axes labels else: pad = 0.05 # Default value for vertical colorbar colorbar_label = str(self.unit) if self.unit is not None else "" figure.colorbar(im, pad=pad).set_label(colorbar_label, rotation=0, labelpad=-50, y=-0.02, size=12) if draw_limb: self.draw_limb(axes=axes) if draw_grid: if grid_spacing is None: self.draw_grid(axes=axes) else: self.draw_grid(axes=axes, grid_spacing=grid_spacing) return figure @u.quantity_input def plot(self, annotate=True, axes=None, title=True, autoalign=False, clip_interval: u.percent = None, **imshow_kwargs): """ Plots the map object using matplotlib, in a method equivalent to :meth:`~matplotlib.axes.Axes.imshow` using nearest neighbor interpolation. Parameters ---------- annotate : `bool`, optional If `True`, the data is plotted at its natural scale; with title and axis labels. 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. title : `str`, `bool`, optional The plot title. If `True`, uses the default title for this map. clip_interval : two-element `~astropy.units.Quantity`, optional If provided, the data will be clipped to the percentile interval bounded by the two numbers. autoalign : `bool` or `str`, optional If other than `False`, the plotting accounts for any difference between the WCS of the map and the WCS of the `~astropy.visualization.wcsaxes.WCSAxes` axes (e.g., a difference in rotation angle). If ``pcolormesh``, this method will use :meth:`~matplotlib.axes.Axes.pcolormesh` instead of the default :meth:`~matplotlib.axes.Axes.imshow`. Specifying `True` is equivalent to specifying ``pcolormesh``. **imshow_kwargs : `dict` Any additional imshow arguments are passed to :meth:`~matplotlib.axes.Axes.imshow`. 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 Notes ----- The ``autoalign`` functionality is computationally intensive. If the plot will be interactive, the alternative approach of preprocessing the map (e.g., de-rotating it) to match the desired axes will result in better performance. When combining ``autoalign`` functionality with `~sunpy.coordinates.Helioprojective` coordinates, portions of the map that are beyond the solar disk may not appear, which may also inhibit Matplotlib's autoscaling of the plot limits. The plot limits can be set manually. To preserve the off-disk parts of the map, using the :meth:`~sunpy.coordinates.Helioprojective.assume_spherical_screen` context manager may be appropriate. """ # Set the default approach to autoalignment if autoalign not in [False, True, 'pcolormesh']: raise ValueError("The value for `autoalign` must be False, True, or 'pcolormesh'.") if autoalign is True: autoalign = 'pcolormesh' axes = self._check_axes(axes, warn_different_wcs=autoalign is False) # Normal plot plot_settings = copy.deepcopy(self.plot_settings) if 'title' in plot_settings: plot_settings_title = plot_settings.pop('title') else: plot_settings_title = self.latex_name # Anything left in plot_settings is given to imshow imshow_args = plot_settings if annotate: if title is True: title = plot_settings_title if title: axes.set_title(title) if wcsaxes_compat.is_wcsaxes(axes): # WCSAxes has unit identifiers on the tick labels, so no need # to add unit information to the label spatial_units = [None, None] ctype = axes.wcs.wcs.ctype else: spatial_units = self.spatial_units ctype = self.coordinate_system axes.set_xlabel(axis_labels_from_ctype(ctype[0], spatial_units[0])) axes.set_ylabel(axis_labels_from_ctype(ctype[1], 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}) # Take a deep copy here so that a norm in imshow_kwargs doesn't get modified # by setting it's vmin and vmax imshow_args.update(copy.deepcopy(imshow_kwargs)) if clip_interval is not None: if len(clip_interval) == 2: clip_percentages = clip_interval.to('%').value vmin, vmax = AsymmetricPercentileInterval(*clip_percentages).get_limits(self.data) else: raise ValueError("Clip percentile interval must be specified as two numbers.") imshow_args['vmin'] = vmin imshow_args['vmax'] = vmax msg = ('Cannot manually specify {0}, as the norm ' 'already has {0} set. To prevent this error set {0} on ' '`m.plot_settings["norm"]` or the norm passed to `m.plot`.') if 'norm' in imshow_args: norm = imshow_args['norm'] if 'vmin' in imshow_args: if norm.vmin is not None: raise ValueError(msg.format('vmin')) norm.vmin = imshow_args.pop('vmin') if 'vmax' in imshow_args: if norm.vmax is not None: raise ValueError(msg.format('vmax')) norm.vmax = imshow_args.pop('vmax') if self.mask is None: data = self.data else: data = np.ma.array(np.asarray(self.data), mask=self.mask) if autoalign == 'pcolormesh': # We have to handle an `aspect` keyword separately axes.set_aspect(imshow_args.get('aspect', 1)) # pcolormesh does not do interpolation if imshow_args.get('interpolation', None) not in [None, 'none', 'nearest']: warn_user("The interpolation keyword argument is ignored when using autoalign " "functionality.") # Remove imshow keyword arguments that are not accepted by pcolormesh for item in ['aspect', 'extent', 'interpolation', 'origin']: if item in imshow_args: del imshow_args[item] if wcsaxes_compat.is_wcsaxes(axes): imshow_args.setdefault('transform', axes.get_transform(self.wcs)) # The quadrilaterals of pcolormesh can slightly overlap, which creates the appearance # of a grid pattern when alpha is not 1. These settings minimize the overlap. if imshow_args.get('alpha', 1) != 1: imshow_args.setdefault('antialiased', True) imshow_args.setdefault('linewidth', 0) ret = axes.pcolormesh(data, **imshow_args) else: ret = axes.imshow(data, **imshow_args) if wcsaxes_compat.is_wcsaxes(axes): wcsaxes_compat.default_wcs_grid(axes) # Set current axes/image if pyplot is being used (makes colorbar work) for i in plt.get_fignums(): if axes in plt.figure(i).axes: plt.sca(axes) plt.sci(ret) return ret def contour(self, level, **kwargs): """ Returns coordinates of the contours for a given level value. For details of the contouring algorithm see `skimage.measure.find_contours`. Parameters ---------- level : float, astropy.units.Quantity Value along which to find contours in the array. If the map unit attribute is not `None`, this must be a `~astropy.units.Quantity` with units equivalent to the map data units. kwargs : Additional keyword arguments are passed to `skimage.measure.find_contours`. Returns ------- contours: list of (n,2) `~astropy.coordinates.SkyCoord` Coordinates of each contour. Examples -------- >>> import astropy.units as u >>> import sunpy.map >>> import sunpy.data.sample # doctest: +REMOTE_DATA >>> aia = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) # doctest: +REMOTE_DATA >>> contours = aia.contour(50000 * u.ct) # doctest: +REMOTE_DATA >>> print(contours[0]) # doctest: +REMOTE_DATA ): (Tx, Ty) in arcsec [(719.59798458, -352.60839064), (717.19243987, -353.75348121), ... See Also -------- skimage.measure.find_contours """ from skimage import measure level = self._process_levels_arg(level) contours = measure.find_contours(self.data, level=level, **kwargs) contours = [self.wcs.array_index_to_world(c[:, 0], c[:, 1]) for c in contours] return contours def _check_axes(self, axes, warn_different_wcs=False): """ - If axes is None, get the current Axes object. - Error if not a WCSAxes. - Return axes. Parameters ---------- axes : matplotlib.axes.Axes Axes to validate. warn_different_wcs : bool If `True`, warn if the Axes WCS is different from the Map WCS. This is only used for `.plot()`, and can be removed once support is added for plotting a map on a different WCSAxes. """ if not axes: axes = wcsaxes_compat.gca_wcs(self.wcs) if not wcsaxes_compat.is_wcsaxes(axes): raise TypeError("The axes need to be an instance of WCSAxes. " "To fix this pass set the `projection` keyword " "to this map when creating the axes.") elif warn_different_wcs and not axes.wcs.wcs.compare(self.wcs.wcs, tolerance=0.01): warn_user('The map world coordinate system (WCS) is different from the axes WCS. ' 'The map data axes may not correctly align with the coordinate axes. ' 'To automatically transform the data to the coordinate axes, specify ' '`autoalign=True`.') return axes def reproject_to(self, target_wcs, algorithm='interpolation', return_footprint=False, **reproject_args): """ Reproject the map to a different world coordinate system (WCS) .. note:: This method requires the optional package `reproject` to be installed. Additional keyword arguments are passed through to the reprojection function. Parameters ---------- target_wcs : `dict` or `~astropy.wcs.WCS` The destination FITS WCS header or WCS instance algorithm : `str` One of the supported `reproject` algorithms (see below) return_footprint : `bool` If ``True``, the footprint is returned in addition to the new map. Defaults to ``False``. Returns ------- outmap : `~sunpy.map.GenericMap` The reprojected map footprint : `~numpy.ndarray` Footprint of the input arary in the output array. Values of 0 indicate no coverage or valid values in the input image, while values of 1 indicate valid values. Intermediate values indicate partial coverage. Only returned if ``return_footprint`` is ``True``. Notes ----- The reprojected map does not preserve any metadata beyond the WCS-associated metadata. The supported `reproject` algorithms are: * 'interpolation' for :func:`~reproject.reproject_interp` * 'adaptive' for :func:`~reproject.reproject_adaptive` * 'exact' for :func:`~reproject.reproject_exact` See the respective documentation for these functions for additional keyword arguments that are allowed. .. minigallery:: sunpy.map.GenericMap.reproject_to """ try: import reproject except ImportError as exc: raise ImportError("This method requires the optional package `reproject`.") from exc if not isinstance(target_wcs, astropy.wcs.WCS): target_wcs = astropy.wcs.WCS(target_wcs) # Select the desired reprojection algorithm functions = {'interpolation': reproject.reproject_interp, 'adaptive': reproject.reproject_adaptive, 'exact': reproject.reproject_exact} if algorithm not in functions: raise ValueError(f"The specified algorithm must be one of: {list(functions.keys())}") func = functions[algorithm] # reproject does not automatically grab the array shape from the WCS instance if target_wcs.array_shape is not None: reproject_args.setdefault('shape_out', target_wcs.array_shape) # Reproject the array output_array = func(self, target_wcs, return_footprint=return_footprint, **reproject_args) if return_footprint: output_array, footprint = output_array # Create and return a new GenericMap outmap = GenericMap(output_array, target_wcs.to_header(), plot_settings=self.plot_settings) if return_footprint: return outmap, footprint return outmap GenericMap.__doc__ += textwrap.indent(_notes_doc, " ") class InvalidHeaderInformation(ValueError): """Exception to raise when an invalid header tag value is encountered for a FITS/JPEG 2000 file.""" def _figure_to_base64(fig): # Converts a matplotlib Figure to a base64 UTF-8 string buf = BytesIO() fig.savefig(buf, format='png', facecolor='none') # works better than transparent=True return b64encode(buf.getvalue()).decode('utf-8') def _modify_polygon_visibility(polygon, keep): # Put import here to reduce sunpy.map import time from matplotlib.path import Path polygon_codes = polygon.get_path().codes polygon_codes[:-1][~keep] = Path.MOVETO polygon_codes[-1] = Path.MOVETO if not keep[0] else Path.LINETO ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/mapsequence.py0000644000175100001710000005133200000000000016543 0ustar00vstsdocker"""A Python MapSequence Object""" import html import textwrap import webbrowser from copy import deepcopy from tempfile import NamedTemporaryFile import matplotlib.animation import numpy as np import numpy.ma as ma import astropy.units as u from sunpy.map import GenericMap from sunpy.util import expand_list from sunpy.util.exceptions import warn_user from sunpy.visualization import axis_labels_from_ctype, wcsaxes_compat __all__ = ['MapSequence'] class MapSequence: """ MapSequence A series of Maps in a single object. Parameters ---------- args : `list` A list of Map instances sortby : { "date" | `None`} Method by which the MapSequence should be sorted along the z-axis. Defaults to sorting by: "date" and is the only supported sorting strategy. Passing `None` will disable sorting. derotate : `bool` Apply a derotation to the data. Default to False. Attributes ---------- maps : `list` This attribute holds the list of Map instances obtained from parameter args. Notes ----- To coalign a mapsequence so that solar features remain on the same pixels, please see the "Coalignment of MapSequences" note below. Examples -------- >>> import sunpy.map >>> mapsequence = sunpy.map.Map('images/*.fits', sequence=True) # doctest: +SKIP MapSequences can be co-aligned using the routines in sunpy.image.coalignment. """ def __init__(self, *args, sortby='date', derotate=False, **kwargs): """Creates a new Map instance""" self.maps = expand_list(args) for m in self.maps: if not isinstance(m, GenericMap): raise ValueError('MapSequence expects pre-constructed map objects.') # Optionally sort data if sortby is not None: if sortby == '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 mapsequence is returned.""" if isinstance(self.maps[key], GenericMap): return self.maps[key] else: return MapSequence(self.maps[key]) def __len__(self): """Return the number of maps in a mapsequence.""" return len(self.maps) def __repr__(self): names = set([m.__class__.__name__ for m in self.maps]) return (object.__repr__(self) + "\n" + f'MapSequence of {len(self.maps)} elements, with maps from {", ".join(names)}') def _repr_html_(self): nmaps = len(self) # Output a warning about rendering time if there are more than 9 Maps if nmaps > 9: warn_user(f"Rendering the summary for a MapSequence of {nmaps} Maps " "may take a while.") # Assemble the individual HTML repr from each Map, all hidden initally repr_list = [f"
{m._repr_html_()}
" for i, m in enumerate(self.maps)] # Unhide the first Map repr_list_html = "\n".join(repr_list).replace('display: none', 'display: ', 1) # Return HTML with Javascript-powered buttons # To avoid potential conflicts, the Javascript code does not use any user-defined functions return textwrap.dedent(f"""\
{html.escape(self.__repr__())}
1 else "disabled"} onClick=' var form = this.parentElement; // Increment index if allowed var cur_index = Math.min( parseInt(form.getAttribute("cur_index")) + 1, form.getAttribute("max_index") ); form.setAttribute("cur_index", cur_index); // Always enable the decrement button (because we just incremented) form.children[0].disabled = false; // Enable the increment button if and only if this is not the last Map form.children[1].disabled = (cur_index == form.getAttribute("max_index")); // Update string (which is children[2] of the form) form.children[2].innerHTML = "Map at index " + cur_index; // Update visibilities to show only the current index // This avoids for...of syntax to retain support for ES5 browsers (e.g., IE11) var array = Array.prototype.slice.call(form.lastElementChild.children); array.forEach(function (elem) {{ var form = elem.parentElement.parentElement; elem.style.display = (elem.getAttribute("index") == form.getAttribute("cur_index") ? "" : "none" ); }} ); '/> Map at index 0
{repr_list_html}
""") def quicklook(self): """ Display a quicklook summary of the MapSequence instance using the default web browser. Click on the |larr| and |rarr| buttons to step through the individual maps. .. |larr| unicode:: U+02190 .. LEFTWARDS ARROW .. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROW Notes ----- The image colormap uses `histogram equalization `__. Interactive elements require Javascript support to be enabled in the web browser. Examples -------- >>> from sunpy.map import Map >>> import sunpy.data.sample # doctest: +REMOTE_DATA >>> seq = Map(sunpy.data.sample.HMI_LOS_IMAGE, ... sunpy.data.sample.AIA_1600_IMAGE, ... sunpy.data.sample.EIT_195_IMAGE, ... sequence=True) # doctest: +REMOTE_DATA >>> seq.quicklook() # doctest: +SKIP (which will open the following content in the default web browser) .. generate:: html :html_border: from sunpy.map import Map import sunpy.data.sample seq = Map(sunpy.data.sample.HMI_LOS_IMAGE, sunpy.data.sample.AIA_1600_IMAGE, sunpy.data.sample.EIT_195_IMAGE, sequence=True) print(seq._repr_html_()) """ with NamedTemporaryFile('w', delete=False, prefix='sunpy.map.', suffix='.html') as f: url = 'file://' + f.name f.write(textwrap.dedent(f"""\ Quicklook summary for {html.escape(object.__repr__(self))} {self._repr_html_()} """)) webbrowser.open_new_tab(url) # 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 MapSequence""" raise NotImplementedError("This functionality has not yet been implemented.") 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 MapSequence Parameters ---------- axes : matplotlib.axes.Axes axes to plot the animation on, if none uses current axes resample : list 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. For more information see `sunpy.visualization.animator.MapSequenceAnimator`. Returns ------- `matplotlib.animation.FuncAnimation` A FuncAnimation instance. See Also -------- `sunpy.visualization.animator.MapSequenceAnimator` Examples -------- >>> import matplotlib.pyplot as plt >>> import matplotlib.animation as animation >>> from sunpy.map import Map >>> sequence = Map(files, sequence=True) # doctest: +SKIP >>> ani = sequence.plot(colorbar=True) # doctest: +SKIP >>> plt.show() # doctest: +SKIP Plot the map at 1/2 original resolution >>> sequence = Map(files, sequence=True) # doctest: +SKIP >>> ani = sequence.plot(resample=[0.5, 0.5], colorbar=True) # doctest: +SKIP >>> plt.show() # doctest: +SKIP Save an animation of the MapSequence >>> sequence = Map(res, sequence=True) # doctest: +SKIP >>> ani = sequence.plot() # doctest: +SKIP >>> Writer = animation.writers['ffmpeg'] # doctest: +SKIP >>> writer = Writer(fps=10, metadata=dict(artist='SunPy'), bitrate=1800) # doctest: +SKIP >>> ani.save('mapsequence_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 >>> sequence = Map(files, sequence=True) # doctest: +SKIP >>> ani = sequence.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: def plot_function(fig, ax, smap): return [] 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 mapsequence 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(kwargs.get('cmap', ani_data[i].plot_settings['cmap'])) norm = deepcopy(kwargs.get('norm', 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: bl = ani_data[i]._get_lon_lat(ani_data[i].bottom_left_coord) tr = ani_data[i]._get_lon_lat(ani_data[i].top_right_coord) x_range = list(u.Quantity([bl[0], tr[0]]).to(ani_data[i].spatial_units[0]).value) y_range = list(u.Quantity([bl[1], tr[1]]).to(ani_data[i].spatial_units[1]).value) im.set_extent(np.concatenate((x_range.value, y_range.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 MapSequence Parameters ---------- fig : matplotlib.figure.Figure Figure to use to create the explorer resample : list 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.animator.MapSequenceAnimator`. Returns ------- mapsequenceanim : `sunpy.visualization.animator.MapSequenceAnimator` See Also -------- sunpy.visualization.animator.MapSequenceAnimator Examples -------- >>> import matplotlib.pyplot as plt >>> from sunpy.map import Map >>> sequence = Map(files, sequence=True) # doctest: +SKIP >>> ani = sequence.peek(colorbar=True) # doctest: +SKIP >>> plt.show() # doctest: +SKIP Plot the map at 1/2 original resolution >>> sequence = Map(files, sequence=True) # doctest: +SKIP >>> ani = sequence.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 >>> sequence = Map(files, sequence=True) # doctest: +SKIP >>> ani = sequence.peek(plot_function=myplot) # doctest: +SKIP >>> plt.show() # doctest: +SKIP Decide you want an animation: >>> sequence = Map(files, sequence=True) # doctest: +SKIP >>> ani = sequence.peek(resample=[0.5, 0.5], colorbar=True) # doctest: +SKIP >>> mplani = ani.get_animation() # doctest: +SKIP """ # Move the import for speed reasons from sunpy.visualization.animator.mapsequenceanimator import MapSequenceAnimator # noqa if resample: if self.all_maps_same_shape(): plot_sequence = MapSequence() resample = u.Quantity(self.maps[0].dimensions) * np.array(resample) for amap in self.maps: plot_sequence.maps.append(amap.resample(resample)) else: raise ValueError('Maps in mapsequence do not all have the same shape.') else: plot_sequence = self return MapSequenceAnimator(plot_sequence, **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_sequence = np.zeros_like(data, dtype=bool) for im, m in enumerate(self.maps): if m.mask is not None: mask_sequence[:, :, im] = m.mask return ma.masked_array(data, mask=mask_sequence) 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] def save(self, filepath, filetype='auto', **kwargs): """ Saves the sequence, with one file per map. Currently SunPy can save files only in the FITS format. Parameters ---------- filepath : str Location to save the file(s) to. The string must contain ``"{index}"``, which will be populated with the corresponding index number for each map. Format specifiers (e.g., ``"{index:03}"``) can be used. filetype : str 'auto' or any supported file extension. kwargs : Any additional keyword arguments are passed to `~sunpy.io.write_file`. Examples -------- >>> from sunpy.map import Map >>> import sunpy.data.sample # doctest: +REMOTE_DATA >>> smap = Map(sunpy.data.sample.HMI_LOS_IMAGE, ... sunpy.data.sample.AIA_1600_IMAGE, ... sequence=True) # doctest: +REMOTE_DATA >>> smap.save('map_{index:03}.fits') # doctest: +SKIP """ if filepath.format(index=0) == filepath: raise ValueError("'{index}' must be appear in the string") for index, map_seq in enumerate(self.maps): map_seq.save(filepath.format(index=index), filetype, **kwargs) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/maputils.py0000644000175100001710000003365700000000000016105 0ustar00vstsdocker""" This submodule provides utility functions to act on `sunpy.map.GenericMap` instances. """ from itertools import product import numpy as np import astropy.units as u from astropy.coordinates import SkyCoord from sunpy.coordinates import Helioprojective, sun __all__ = ['all_pixel_indices_from_map', 'all_coordinates_from_map', 'all_corner_coords_from_map', 'map_edges', 'solar_angular_radius', 'sample_at_coords', 'contains_full_disk', 'is_all_off_disk', 'is_all_on_disk', 'contains_limb', 'coordinate_is_on_solar_disk', 'on_disk_bounding_coordinates', 'contains_coordinate', 'contains_solar_center'] def all_pixel_indices_from_map(smap): """ Returns pixel pair indices of every pixel in a map. Parameters ---------- smap : `~sunpy.map.GenericMap` A SunPy map. Returns ------- `~numpy.array` A `numpy.array` with the all the pixel indices built from the dimensions of the map. """ y, x = np.indices(smap.data.shape) return [x, y] * u.pix def all_coordinates_from_map(smap): """ Returns the coordinates of the center of every pixel in a map. Parameters ---------- smap : `~sunpy.map.GenericMap` A SunPy map. Returns ------- `~astropy.coordinates.SkyCoord` An two-dimensional array of sky coordinates in the coordinate system "coordinate_system". """ x, y = all_pixel_indices_from_map(smap) return smap.pixel_to_world(x, y) def all_corner_coords_from_map(smap): """ Returns the coordinates of the pixel corners in a map. """ ny, nx = smap.data.shape y, x = np.indices((ny + 1, nx + 1)) return smap.pixel_to_world((x - 0.5) * u.pix, (y - 0.5) * u.pix) def map_edges(smap): """ Returns the pixel locations of the edges of an input map. Parameters ---------- smap : `~sunpy.map.GenericMap` A SunPy map. Returns ------- top, bottom, left_hand_side, right_hand_side : `~astropy.units.Quantity` Returns the pixel locations at the edge of the map; the zeroth, first, second and third tuple values return the top, bottom, left hand side and right hand side pixel locations respectively of the input map. """ # Calculate all the edge pixels nx, ny = smap.dimensions.x.value, smap.dimensions.y.value top = list(product(np.arange(nx), [ny - 1])) * u.pix bottom = list(product(np.arange(nx), [0])) * u.pix left_hand_side = list(product([0], np.arange(ny))) * u.pix right_hand_side = list(product([nx - 1], np.arange(ny))) * u.pix return top, bottom, left_hand_side, right_hand_side def _verify_coordinate_helioprojective(coordinates): """ Raises an error if the coordinate is not in the `~sunpy.coordinates.frames.Helioprojective` frame. Parameters ---------- coordinates : `~astropy.coordinates.SkyCoord`, `~astropy.coordinates.BaseCoordinateFrame` """ frame = coordinates.frame if hasattr(coordinates, 'frame') else coordinates if not isinstance(frame, Helioprojective): raise ValueError(f"The input coordinate(s) is of type {type(frame).__name__}, " "but must be in the Helioprojective frame.") def solar_angular_radius(coordinates): """ Calculates the solar angular radius as seen by the observer. The tangent vector from the observer to the edge of the Sun forms a right-angle triangle with the radius of the Sun as the far side and the Sun-observer distance as the hypotenuse. Thus, the sine of the angular radius of the Sun is ratio of these two distances. Parameters ---------- coordinates : `~astropy.coordinates.SkyCoord`, `~sunpy.coordinates.frames.Helioprojective` The input coordinate. The coordinate frame must be `~sunpy.coordinates.Helioprojective`. Returns ------- angle : `~astropy.units.Quantity` The solar angular radius. """ _verify_coordinate_helioprojective(coordinates) return sun._angular_radius(coordinates.rsun, coordinates.observer.radius) def sample_at_coords(smap, coordinates): """ Samples the data in a map at given series of coordinates. Uses nearest-neighbor interpolation of coordinates in map, as it effectively uses array indexing. Parameters ---------- smap : `~sunpy.map.GenericMap` A SunPy map. coordinates : `~astropy.coordinates.SkyCoord` Input coordinates. Returns ------- `numpy.array` A `numpy.array` corresponding to the data obtained from the map, at the input coordinates. """ return smap.data[smap.wcs.world_to_array_index(coordinates)] def _edge_coordinates(smap): # Calculate all the edge pixels edges = map_edges(smap) # We need to strip the units from edges before handing it to np.concatenate, # as the .unit attribute is not propagated in np.concatenate for numpy<1.17 # When sunpy depends on numpy>=1.17 this unit replacing code can be removed edge_pixels = u.Quantity(np.concatenate(edges).value, unit=u.pix, copy=False) # Calculate the edge of the world return smap.pixel_to_world(edge_pixels[:, 0], edge_pixels[:, 1]) def contains_full_disk(smap): """ Checks if a map contains the full disk of the Sun. A map contains the full disk of the Sun if the following two conditions are met: (1) all the coordinates at the edge of the map are more than solar angular radius from the center of the Sun and, (2) the map is not all off disk. If both these conditions are met, the function returns `True`. Otherwise, the function returns `False`. Parameters ---------- smap : `~sunpy.map.GenericMap` A map in helioprojective Cartesian coordinates. Returns ------- `~bool` Returns `False` if any of the coordinates at the edge of the map are less than one solar radius away from the center of the Sun. Notes ----- This function checks if the image coordinates include the solar disk. Therefore this function would return `True` for a coronagraph image such as from LASCO/C3 or STEREO/SECCHI COR1 since the solar disk is within the field of the view of the instrument (although no emission from the disk itself is present in the data.) """ _verify_coordinate_helioprojective(smap.coordinate_frame) edge_of_world = _edge_coordinates(smap) # Calculate the distance of the edge of the world in solar radii coordinate_angles = np.sqrt(edge_of_world.Tx ** 2 + edge_of_world.Ty ** 2) # Test if all the edge pixels are more than one solar radius distant # and that the whole map is not all off disk. return np.all(coordinate_angles > solar_angular_radius(edge_of_world)) and contains_solar_center(smap) def contains_solar_center(smap): """ Returns `True` if smap contains the solar center. This is the case if and only if the solar center is inside or on the edges of the map. Parameters ---------- smap : `~sunpy.map.GenericMap` A map in helioprojective Cartesian coordinates. Returns ------- bool True if the map contains the solar center. """ _verify_coordinate_helioprojective(smap.coordinate_frame) return contains_coordinate(smap, SkyCoord(0*u.arcsec, 0*u.arcsec, frame=smap.coordinate_frame)) @u.quantity_input def coordinate_is_on_solar_disk(coordinates): """ Checks if the helioprojective Cartesian coordinates are on the solar disk. The check is performed by comparing the coordinate's angular distance to the angular size of the solar radius. The solar disk is assumed to be a circle i.e., solar oblateness and other effects that cause the solar disk to be non-circular are not taken in to account. Parameters ---------- coordinates : `~astropy.coordinates.SkyCoord`, `~sunpy.coordinates.frames.Helioprojective` The input coordinate. The coordinate frame must be `~sunpy.coordinates.Helioprojective`. Returns ------- `~bool` Returns `True` if the coordinate is on disk, `False` otherwise. """ _verify_coordinate_helioprojective(coordinates) # Calculate the angle of every pixel from the center of the Sun and compare it the angular # radius of the Sun. return np.sqrt(coordinates.Tx ** 2 + coordinates.Ty ** 2) < solar_angular_radius(coordinates) def is_all_off_disk(smap): """ Checks if none of the coordinates in the `~sunpy.map.GenericMap` are on the solar disk. This is done by checking if the edges of the map do not contain the solar limb, and checking that the solar center is not in the map. Parameters ---------- smap : `~sunpy.map.GenericMap` A map in helioprojective Cartesian coordinates. Returns ------- `~bool` Returns `True` if all map pixels have an angular radius greater than the angular radius of the Sun. Notes ----- For coronagraph images such as those from LASCO C2 and C3 the full disk is within the field of view of the instrument, but the solar disk itself is not imaged. For such images this function will return `False`. """ _verify_coordinate_helioprojective(smap.coordinate_frame) edge_of_world = _edge_coordinates(smap) # Calculate the distance of the edge of the world in solar radii coordinate_angles = np.sqrt(edge_of_world.Tx ** 2 + edge_of_world.Ty ** 2) # Test if all the edge pixels are more than one solar radius distant # and that the solar center is return np.all(coordinate_angles > solar_angular_radius(edge_of_world)) and ~contains_solar_center(smap) def is_all_on_disk(smap): """ Checks if all of the coordinates in the `~sunpy.map.GenericMap` are on the solar disk. The check is performed by calculating the angle of the edges of the map from the center of the Sun. If they are all less than the angular radius of the Sun, then the function returns `True`. Otherwise, the function returns `False`. Parameters ---------- smap : `~sunpy.map.GenericMap` A map in helioprojective Cartesian coordinates. Returns ------- `~bool` Returns `True` if all map coordinates have an angular radius less than the angular radius of the Sun. """ _verify_coordinate_helioprojective(smap.coordinate_frame) edge_of_world = _edge_coordinates(smap) return np.all(coordinate_is_on_solar_disk(edge_of_world)) def contains_limb(smap): """ Checks if a map contains any part of the solar limb or equivalently whether the map contains both on-disk and off-disk pixels. The check is performed by calculating the angular distance of the edge pixels from the center of the Sun. If at least one edge pixel is on disk (less than the solar angular radius) and at least one edge pixel is off disk (greater than the solar angular distance), or the map contains the full disk, the function returns `True`. Otherwise, the function returns `False`. Parameters ---------- smap : `~sunpy.map.GenericMap` A map in helioprojective Cartesian coordinates. Returns ------- `~bool` Returns `True` If at least one coordinate of the map is on disk and at least one coordinate of the map is off disk. Notes ----- For coronagraph images such as those from LASCO C2 and C3 the full disk is within the field of view of the instrument, but the solar disk itself is not imaged. For such images this function will return `True`. """ _verify_coordinate_helioprojective(smap.coordinate_frame) if contains_full_disk(smap): return True on_disk = coordinate_is_on_solar_disk(_edge_coordinates(smap)) return np.logical_and(np.any(on_disk), np.any(~on_disk)) def on_disk_bounding_coordinates(smap): """ Returns the the bottom left and top right coordinates of the smallest rectangular region that contains all the on disk coordinates of the input map. Parameters ---------- smap : `~sunpy.map.GenericMap` A map in helioprojective Cartesian coordinates. Returns ------- `~astropy.coordinates.SkyCoord` A `~astropy.coordinates.SkyCoord` of length 2 such that the first entry is the bottom left coordinate and the second entry is the top right coordinate of the smallest rectangular region that contains all the on-disk pixels in the input map. """ _verify_coordinate_helioprojective(smap.coordinate_frame) # Check that the input map is not all off disk. if is_all_off_disk(smap): raise ValueError("The entire map is off disk.") # Get all the coordinates from the input map coordinates = all_coordinates_from_map(smap) # Find which coordinates are on the disk on_disk = coordinate_is_on_solar_disk(coordinates) on_disk_coordinates = coordinates[on_disk] # The bottom left and top right coordinates that contain # the on disk coordinates. tx = on_disk_coordinates.Tx.value ty = on_disk_coordinates.Ty.value return SkyCoord([np.nanmin(tx), np.nanmax(tx)] * u.arcsec, [np.nanmin(ty), np.nanmax(ty)] * u.arcsec, frame=smap.coordinate_frame) def contains_coordinate(smap, coordinates): """ Checks whether a coordinate falls within the bounds of a map. Parameters ---------- smap : `~sunpy.map.GenericMap` The input map. coordinates : `~astropy.coordinates.SkyCoord` The input coordinate. Returns ------- bool `True` if ``coordinates`` falls within the bounds of ``smap``. This includes the edges of the map. If multiple coordinates are input, returns a boolean arrary. """ # Dimensions of smap xs, ys = smap.dimensions # Converting coordinates to pixels xc, yc = smap.world_to_pixel(coordinates) point5pix = 0.5 * u.pix return ((xc >= -point5pix) & (xc <= xs - point5pix) & (yc >= -point5pix) & (yc <= ys - point5pix)) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6252751 sunpy-3.1.5/sunpy/map/sources/0000755000175100001710000000000000000000000015342 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/__init__.py0000644000175100001710000000107200000000000017453 0ustar00vstsdocker""" 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 ..map_factory import Map from .hinode import * from .iris import * from .mlso import * from .proba2 import * from .psp import * from .rhessi import * from .sdo import * from .soho import * from .solo import * from .source_type import * from .stereo import * from .suvi import * from .trace import * from .yohkoh import * ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/hinode.py0000644000175100001710000001234400000000000017166 0ustar00vstsdocker"""Hinode XRT and SOT Map subclass definitions""" from sunpy.map import GenericMap __author__ = ["Jack Ireland, Jose Ivan Campos-Rozo, David Perez-Suarez"] __email__ = "jack.ireland@nasa.gov" __all__ = ['XRTMap', 'SOTMap'] 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): super().__init__(data, header, **kwargs) fw1 = header.get('EC_FW1_') if fw1.lower() not in _lower_list(self.filter_wheel1_measurements): raise ValueError('Unpexpected filter wheel 1 in header.') fw2 = header.get('EC_FW2_') if fw2.lower() not in _lower_list(self.filter_wheel2_measurements): raise ValueError('Unpexpected filter wheel 2 in header.') self.plot_settings['cmap'] = 'hinodexrt' @property def _timesys(self): if self.meta.get('timesys', '').upper() == 'UTC (TBR)': return 'UTC' else: return super()._timesys @property def detector(self): return "XRT" @property def observatory(self): return "Hinode" @property def measurement(self): fw1 = self.meta.get('EC_FW1_').replace("_", " ") fw2 = self.meta.get('EC_FW2_').replace("_", " ") return f"{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): super().__init__(data, header, **kwargs) 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'] = 'hinodesot' + color[self.instrument] @property def detector(self): return "XRT" @property def observatory(self): return "Hinode" @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an SOT image.""" return header.get('instrume') in cls.Instruments ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/iris.py0000644000175100001710000000514100000000000016663 0ustar00vstsdocker import astropy.units as u from sunpy.map.mapbase import GenericMap, SpatialPair __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. References ---------- * `IRIS Mission Page `_ * `IRIS Analysis Guide `_ * `IRIS Instrument Paper `_ """ @property def detector(self): return "SJI" @property def spatial_units(self): """ If not present in CUNIT{1,2} keywords, defaults to arcsec. """ return SpatialPair(u.Unit(self.meta.get('cunit1', 'arcsec')), u.Unit(self.meta.get('cunit2', 'arcsec'))) @property def waveunit(self): """ Taken from WAVEUNIT, or if not present defaults to Angstrom. """ return u.Unit(self.meta.get('waveunit', "Angstrom")) @property def wavelength(self): """ Taken from WAVELNTH, or if not present TWAVE1. """ return self.meta.get('wavelnth', self.meta.get('twave1')) * self.waveunit @property def unit(self): unit_str = self.meta.get('bunit', None) if unit_str is None: return # Remove "corrected" so that the unit can be parsed unit_str = unit_str.lower().replace('corrected', '').strip() return self._parse_fits_unit(unit_str) @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an IRIS SJI image""" tele = str(header.get('TELESCOP', '')).startswith('IRIS') obs = str(header.get('INSTRUME', '')).startswith('SJI') return tele and obs ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/mlso.py0000644000175100001710000000566500000000000016702 0ustar00vstsdockerimport astropy.units as u from astropy.coordinates import SkyCoord from astropy.visualization import PowerStretch from astropy.visualization.mpl_normalize import ImageNormalize from sunpy.coordinates import sun from sunpy.map import GenericMap from sunpy.map.sources.source_type import source_stretch __all__ = ['KCorMap'] class KCorMap(GenericMap): """ K-Cor Image Map. The COronal Solar Magnetism Observatory (COSMO) K-coronagraph (K-Cor) is one of three proposed instruments in the COSMO facility suite. It is specifically designed to study the formation and dynamics of coronal mass ejections and the evolution of the density structure of the low corona. The K-Cor records the polarization brightness (pB) formed by Thomson scattering of photospheric light by coronal free electrons. The National Center for Atmospheric Research (NCAR), via the National Science Foundation (NSF), provided full funding for the COSMO K-Cor, which was deployed to the Mauna Loa Solar Observatory (MLSO) in Hawaii in September 2013, replacing the aging MLSO Mk4 K-coronameter. References ---------- * `COSMO Mission Page `_ * `KCOR Instrument Page `_ """ def __init__(self, data, header, **kwargs): super().__init__(data, header, **kwargs) self._nickname = self.detector self.plot_settings['cmap'] = self._get_cmap_name() self.plot_settings['norm'] = ImageNormalize( stretch=source_stretch(self.meta, PowerStretch(0.25)), clip=False) # Negative value pixels can appear that lead to ugly looking images. # This can be fixed by setting the lower limit of the normalization. self.plot_settings['norm'].vmin = 0.0 def _get_cmap_name(self): """Build the default color map name.""" cmap_string = self.meta['detector'] return cmap_string.lower() @property def observatory(self): return "MLSO" @property def detector(self): return "KCor" @property def waveunit(self): """ If the WAVEUNIT FITS keyword is not present, defaults to nanometers. """ unit = self.meta.get("waveunit", "nm") return u.Unit(unit) @property def _default_observer_coordinate(self): # Override missing metadata in the observer coordinate dsun_obs = self.meta.get('dsun_obs', sun.earth_distance(self.date).to_value(u.m)) return SkyCoord(self.meta.get('hgln_obs', 0.0) * u.deg, self.meta.get('hglt_obs', 0.0) * u.deg, self.meta.get('dsun_obs', dsun_obs) * u.m, frame="heliographic_stonyhurst") @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to a COSMO image""" return header.get('instrume') == 'COSMO K-Coronagraph' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/proba2.py0000644000175100001710000000245200000000000017104 0ustar00vstsdocker"""PROBA2 Map subclass definitions""" __author__ = "Keith Hughitt" __email__ = "keith.hughitt@nasa.gov" from sunpy.map import GenericMap __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): super().__init__(data, header, **kwargs) self._nickname = self.detector self.plot_settings['cmap'] = 'sdoaia171' @property def observatory(self): return "PROBA2" @property def detector(self): return "SWAP" @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an SWAP image""" return header.get('instrume') == 'SWAP' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/psp.py0000644000175100001710000000225700000000000016524 0ustar00vstsdocker""" Parker Solar Probe subclass definitions. """ from sunpy.map import GenericMap __all__ = ['WISPRMap'] class WISPRMap(GenericMap): """ WISPR Map The The Wide-field Imager for Parker Solar Probe (WISPR) is a white light telescope onboard the Parker Solar Probe (PSP) spacecraft. References ---------- * `PSP science gateway `__ * `WISPR Instrument Page `__ * `Instrument Paper `__ """ @property def processing_level(self): lvl = self.meta.get('level', None) if lvl is None: return return int(lvl[1]) @property def exposure_time(self): return self.meta.get('xposure', 0.0) * self.timeunit @property def name(self): return 'WISPR ' + super().name @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an WISPR image""" is_psp = 'parker solar probe' in str(header.get('obsrvtry', '')).lower() is_wispr = str(header.get('instrume', '')).startswith('WISPR') return is_psp and is_wispr ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/rhessi.py0000644000175100001710000000671300000000000017220 0ustar00vstsdocker"""RHESSI Map subclass definitions""" __author__ = "Steven Christe" __email__ = "steven.d.christe@nasa.gov" import astropy.units as u from sunpy.map.mapbase import GenericMap, SpatialPair __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): super().__init__(data, header, **kwargs) self._nickname = self.detector self.plot_settings['cmap'] = 'rhessi' @property def _timesys(self): """ RHESSI maps can incorrectly use the TIMESYS keyword for the reference time. If this is the case, returns the FITS default UTC. """ if ('TIMESYS' in self.meta and self.meta['keycomments']['TIMESYS'] == 'Reference Time'): return 'UTC' else: return super()._timesys def _rotation_matrix_from_crota(self): """ RHESSI maps can have their rotation in CROTA. """ return super()._rotation_matrix_from_crota(crota_key='CROTA') @property def spatial_units(self): """ If CTYPE{1 or 2} are equal to 'arcsec', assumes that CTYPE{1 or 2} respectively are intended to be 'arcsec'. """ units = [self.meta.get('cunit1', None), self.meta.get('cunit2', None)] if self.meta['ctype1'] == 'arcsec': units[0] = 'arcsec' if self.meta['ctype2'] == 'arcsec': units[1] = 'arcsec' units = [None if unit is None else u.Unit(unit.lower()) for unit in units] return SpatialPair(units[0], units[1]) @property def coordinate_system(self): """ If CTYPE{1 or 2} are equal to 'arcsec', assumes that CTYPE{1 or 2} respectively are intended to be 'HPLN-TAN' or 'HPLT-TAN'. """ ctype1, ctype2 = self.meta['ctype1'], self.meta['ctype2'] if ctype1 == 'arcsec': ctype1 = 'HPLN-TAN' if ctype2 == 'arcsec': ctype2 = 'HPLT-TAN' return SpatialPair(ctype1, ctype2) @property def waveunit(self): """ If the WAVEUNIT FITS keyword is not present, defaults to keV. """ unit = self.meta.get("waveunit", 'keV') return u.Unit(unit) @property def wavelength(self): return u.Quantity([self.meta['energy_l'], self.meta['energy_h']], unit=self.waveunit) @property def detector(self): 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' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/sdo.py0000644000175100001710000001717000000000000016507 0ustar00vstsdocker"""SDO Map subclass definitions""" import numpy as np import astropy.units as u from astropy.coordinates import CartesianRepresentation, HeliocentricMeanEcliptic from astropy.visualization import AsinhStretch from astropy.visualization.mpl_normalize import ImageNormalize from sunpy.map.mapbase import GenericMap, SpatialPair from sunpy.map.sources.source_type import source_stretch __all__ = ['AIAMap', 'HMIMap', 'HMISynopticMap'] 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 continuum (1700 A). Notes ----- Observer location: The standard AIA FITS header provides the spacecraft location in multiple coordinate systems, including Heliocentric Aries Ecliptic (HAE) and Heliographic Stonyhurst (HGS). SunPy uses the provided HAE coordinates due to accuracy concerns with the provided HGS coordinates, but other software packages may make different choices. References ---------- * `SDO Mission Page `_ * `Instrument Page `_ * `Fits Header keywords `_ * `Analysis Guide `_ * `Instrument Paper `_ * `wavelengths and temperature response reference `_ """ def __init__(self, data, header, **kwargs): super().__init__(data, header, **kwargs) # Fill in some missing info self._nickname = self.detector self.plot_settings['cmap'] = self._get_cmap_name() self.plot_settings['norm'] = ImageNormalize( stretch=source_stretch(self.meta, AsinhStretch(0.01)), clip=False) @property def _supported_observer_coordinates(self): return [(('haex_obs', 'haey_obs', 'haez_obs'), {'x': self.meta.get('haex_obs'), 'y': self.meta.get('haey_obs'), 'z': self.meta.get('haez_obs'), 'unit': u.m, 'representation_type': CartesianRepresentation, 'frame': HeliocentricMeanEcliptic}) ] + super()._supported_observer_coordinates @property def observatory(self): """ Returns the observatory. """ return self.meta.get('telescop', '').split('/')[0] @property def detector(self): return self.meta.get("detector", "AIA") @property def unit(self): unit_str = self.meta.get('bunit', self.meta.get('pixlunit')) if unit_str is None: return return self._parse_fits_unit(unit_str) @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an AIA image""" return str(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): super().__init__(data, header, **kwargs) self._nickname = self.detector @property def measurement(self): """ Returns the measurement type. """ return self.meta.get('content', '').split(" ")[0].lower() @property def observatory(self): """ Returns the observatory. """ return self.meta.get('telescop', '').split('/')[0] @property def detector(self): return self.meta.get("detector", "HMI") @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an HMI image""" return (str(header.get('INSTRUME', '')).startswith('HMI') and not HMISynopticMap.is_datasource_for(data, header)) class HMISynopticMap(HMIMap): """ SDO/HMI Synoptic Map. Synoptic maps are constructed from HMI 720s line-of-sight magnetograms collected over a 27-day solar rotation. See `~sunpy.map.sources.sdo.HMIMap` for information on the HMI instrument. References ---------- * `SDO Mission Page `__ * `JSOC's HMI Synoptic Charts `__ """ def __init__(self, data, header, **kwargs): super().__init__(data, header, **kwargs) self.plot_settings['cmap'] = 'hmimag' self.plot_settings['norm'] = ImageNormalize(vmin=-1.5e3, vmax=1.5e3) @property def spatial_units(self): cunit1 = self.meta['cunit1'] if cunit1 == 'Degree': cunit1 = 'deg' cunit2 = self.meta['cunit2'] if cunit2 == 'Sine Latitude': cunit2 = 'deg' return SpatialPair(u.Unit(cunit1), u.Unit(cunit2)) @property def scale(self): if self.meta['cunit2'] == 'Sine Latitude': # Since, this map uses the cylindrical equal-area (CEA) projection, # the spacing should be modified to 180/pi times the original value # Reference: Section 5.5, Thompson 2006 return SpatialPair(np.abs(self.meta['cdelt1']) * self.spatial_units[0] / u.pixel, 180 / np.pi * self.meta['cdelt2'] * u.deg / u.pixel) return super().scale @property def date(self): """ Image observation time. This is taken from the 'DATE-OBS' or 'T_OBS' keywords. """ date = self._get_date('DATE-OBS') if date is None: return self._get_date('T_OBS') else: return date @property def unit(self): unit_str = self.meta.get('bunit', None) if unit_str == 'Mx/cm^2': # Maxwells aren't in the IAU unit sytle manual, so replace with Gauss return u.Unit('G') else: return super().unit @classmethod def is_datasource_for(cls, data, header, **kwargs): """ Determines if header corresponds to an HMI synoptic map. """ return (str(header.get('TELESCOP', '')).endswith('HMI') and str(header.get('CONTENT', '')) == 'Carrington Synoptic Chart Of Br Field') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/soho.py0000644000175100001710000002420600000000000016670 0ustar00vstsdocker"""SOHO Map subclass definitions""" import numpy as np from matplotlib import colors import astropy.units as u from astropy.coordinates import CartesianRepresentation, HeliocentricMeanEcliptic from astropy.visualization import PowerStretch from astropy.visualization.mpl_normalize import ImageNormalize from sunpy import log from sunpy.map.mapbase import GenericMap, SpatialPair from sunpy.map.sources.source_type import source_stretch from sunpy.time import parse_time __all__ = ['EITMap', 'LASCOMap', 'MDIMap', 'MDISynopticMap'] 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): super().__init__(data, header, **kwargs) self._nickname = self.detector self.plot_settings['cmap'] = self._get_cmap_name() self.plot_settings['norm'] = ImageNormalize( stretch=source_stretch(self.meta, PowerStretch(0.5)), clip=False) @property def spatial_units(self): """ If not present in CUNIT{1,2} keywords, defaults to arcsec. """ return SpatialPair(u.Unit(self.meta.get('cunit1', 'arcsec')), u.Unit(self.meta.get('cunit2', 'arcsec'))) @property def waveunit(self): """ If WAVEUNIT FITS keyword isn't present, deafults to Angstrom. """ unit = self.meta.get("waveunit", "Angstrom") or "Angstrom" return u.Unit(unit) @property def detector(self): return "EIT" @property def rsun_obs(self): return u.Quantity(self.meta['solar_r'] * self.meta['cdelt1'], 'arcsec') @property def _supported_observer_coordinates(self): return [(('hec_x', 'hec_y', 'hec_z'), {'x': self.meta.get('hec_x'), 'y': self.meta.get('hec_y'), 'z': self.meta.get('hec_z'), 'unit': u.km, 'representation_type': CartesianRepresentation, 'frame': HeliocentricMeanEcliptic}) ] + super()._supported_observer_coordinates @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 `_ """ def __init__(self, data, header, **kwargs): super().__init__(data, header, **kwargs) self.plot_settings['cmap'] = 'soholasco{det!s}'.format(det=self.detector[1]) self.plot_settings['norm'] = ImageNormalize( stretch=source_stretch(self.meta, PowerStretch(0.5)), clip=False) @property def spatial_units(self): return SpatialPair(u.Unit(self.meta.get('cunit1').lower()), u.Unit(self.meta.get('cunit2').lower())) @property def rotation_matrix(self): # For Helioviewer images, clear rotation metadata, as these have already been rotated. # Also check that all CROTAn keywords exist to make sure that it's an untouched # Helioviewer file. if ('helioviewer' in self.meta and 'crota' in self.meta and 'crota1' in self.meta and 'crota2' in self.meta): log.debug("LASCOMap: Ignoring CROTAn keywords " "because the map has already been rotated by Helioviewer") return np.identity(2) else: return super().rotation_matrix @property def date(self): date = self.meta.get('date-obs', self.meta.get('date_obs')) # Incase someone fixes the header if 'T' in date: return parse_time(date) time = self.meta.get('time-obs', self.meta.get('time_obs')) return parse_time(f"{date}T{time}") @property def nickname(self): filter = self.meta.get('filter', '') return f'{self.instrument}-{self.detector} {filter}' @property def measurement(self): # 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): super().__init__(data, header, **kwargs) vmin = np.nanmin(self.data) vmax = np.nanmax(self.data) threshold = max([abs(vmin), abs(vmax)]) self.plot_settings['norm'] = colors.Normalize(-threshold, threshold) @property def _date_obs(self): if 'T' in self.meta['date-obs']: # Helioviewer MDI files have the full date in DATE_OBS, but we stil # want to let normal FITS files use DATE-OBS return parse_time(self.meta['date-obs']) else: return parse_time(self.meta['date_obs']) @property def spatial_units(self): """ If not present in CUNIT{1,2} keywords, defaults to arcsec. """ return SpatialPair(u.Unit(self.meta.get('cunit1', 'arcsec')), u.Unit(self.meta.get('cunit2', 'arcsec'))) @staticmethod def _is_mdi_map(header): return header.get('instrume') == 'MDI' or header.get('camera') == 'MDI' @staticmethod def _is_synoptic_map(header): return 'Synoptic Chart' in header.get('CONTENT', '') @property def _supported_observer_coordinates(self): return [(('obs_l0', 'obs_b0', 'obs_dist'), {'lon': self.meta.get('obs_l0'), 'lat': self.meta.get('obs_b0'), 'radius': self.meta.get('obs_dist'), 'unit': (u.deg, u.deg, u.AU), 'frame': "heliographic_carrington"}), ] + super()._supported_observer_coordinates @property def instrument(self): return "MDI" @property def waveunit(self): """ Always assumed to be Angstrom. """ return "Angstrom" @property def measurement(self): """ Returns the measurement type. """ return self.meta.get('CONTENT', '') @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an MDI image""" return cls._is_mdi_map(header) and not cls._is_synoptic_map(header) class MDISynopticMap(MDIMap): """ SOHO MDI synoptic magnetogram Map. See the docstring of `MDIMap` for information on the MDI instrument. """ @property def date(self): """ Image observation time. This is taken from the 'DATE-OBS' or 'T_OBS' keywords. """ time = self._get_date('date-obs') if time is None: return self._get_date('t_obs') @property def spatial_units(self): cunit1 = self.meta['cunit1'] if cunit1 == 'Degree': cunit1 = 'deg' cunit2 = self.meta['cunit2'] if cunit2 == 'Sine Latitude': cunit2 = 'deg' return SpatialPair(u.Unit(cunit1), u.Unit(cunit2)) @property def scale(self): if self.meta['cunit2'] == 'Sine Latitude': # Since, this map uses the cylindrical equal-area (CEA) projection, # the spacing should be modified to 180/pi times the original value # Reference: Section 5.5, Thompson 2006 return SpatialPair(np.abs(self.meta['cdelt1']) * self.spatial_units[0] / u.pixel, 180 / np.pi * self.meta['cdelt2'] * u.deg / u.pixel) @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an MDI image""" return cls._is_mdi_map(header) and cls._is_synoptic_map(header) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/solo.py0000644000175100001710000000551600000000000016677 0ustar00vstsdocker""" Solar Orbiter Map subclass definitions. """ import astropy.units as u from astropy.coordinates import CartesianRepresentation from astropy.visualization import ImageNormalize, LinearStretch from sunpy.coordinates import HeliocentricInertial from sunpy.map import GenericMap from sunpy.map.sources.source_type import source_stretch from sunpy.time import parse_time __all__ = ['EUIMap'] class EUIMap(GenericMap): """ EUI Image Map The Extreme Ultraviolet Imager (EUI) is a remote sensing instrument onboard the Solar Orbiter (SolO) spacecraft. EUI has three telescopes that image the Sun in Lyman-alpha (1216 Å) and the EUV (174 Å and 304 Å). The three telescopes are the Full Sun Imager (FSI) and two High Resolution Imagers (HRI). The FSI images the whole Sun in both 174 Å and 304 Å. The EUV and Lyman-alpha HRI telescopes image a 1000"-by-1000" patch in 174 Å and 1216 Å, respectively. References ---------- * `Solar Orbiter Mission Page `__ * `EUI Instrument Page `__ * `Instrument Paper `__ """ def __init__(self, data, header, **kwargs): super().__init__(data, header, **kwargs) self._nickname = self.detector self.plot_settings['cmap'] = self._get_cmap_name() self.plot_settings['norm'] = ImageNormalize( stretch=source_stretch(self.meta, LinearStretch()), clip=False) @property def _rotation_matrix_from_crota(self): return super()._rotation_matrix_from_crota(crota_key='CROTA') @property def processing_level(self): if self.meta.get('level'): # The level number is prepended by the letter L return int(self.meta.get('level')[1:]) @property def exposure_time(self): return self.meta.get('xposure', 0.0) * self.timeunit @property def date(self): t = self.meta.get('date-avg') timesys = self.meta.get('timesys') return parse_time(t, scale=timesys.lower()) @property def _supported_observer_coordinates(self): return [(('hcix_obs', 'hciy_obs', 'hciz_obs'), {'x': self.meta.get('hcix_obs'), 'y': self.meta.get('hciy_obs'), 'z': self.meta.get('hciz_obs'), 'unit': u.m, 'representation_type': CartesianRepresentation, 'frame': HeliocentricInertial})] + super()._supported_observer_coordinates @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an EUI image""" is_solo = 'solar orbiter' in str(header.get('obsrvtry', '')).lower() is_eui = str(header.get('instrume', '')).startswith('EUI') return is_solo and is_eui ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/source_type.py0000644000175100001710000000307000000000000020255 0ustar00vstsdocker""" Source type-dependencies. Helioviewer JPEG2000 files have stretched images compared to the FITS data. """ from astropy.visualization import LinearStretch __author__ = "Jack Ireland" __email__ = "jack.ireland@nasa.gov" __all__ = ['from_helioviewer_project', 'source_stretch'] def from_helioviewer_project(meta): """ Test determining if the given metadata contains Helioviewer Project sourced data. Parameters ---------- meta : `~astropy.utils.metadata.MetaData` The metadata to parse. 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 : `~astropy.utils.metadata.MetaData` The metadata to parse. 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 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/stereo.py0000644000175100001710000001144000000000000017215 0ustar00vstsdocker"""STEREO Map subclass definitions""" __author__ = "Keith Hughitt" __email__ = "keith.hughitt@nasa.gov" import astropy.units as u from astropy.visualization import PowerStretch from astropy.visualization.mpl_normalize import ImageNormalize from sunpy.map import GenericMap 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): super().__init__(data, header, **kwargs) self._nickname = "{}-{}".format(self.detector, self.observatory[-1]) self.plot_settings['cmap'] = 'euvi{wl:d}'.format(wl=int(self.wavelength.value)) self.plot_settings['norm'] = ImageNormalize( stretch=source_stretch(self.meta, PowerStretch(0.25)), clip=False) def _rotation_matrix_from_crota(self): return super()._rotation_matrix_from_crota('CROTA') @property def waveunit(self): unit = self.meta.get("waveunit", "Angstrom") return u.Unit(unit) @property def rsun_arcseconds(self): return self.meta.get('rsun', None) @property def rsun_obs(self): rsun_arcseconds = self.rsun_arcseconds if rsun_arcseconds is None: rsun_arcseconds = super().rsun_obs return u.Quantity(rsun_arcseconds, 'arcsec') @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): super().__init__(data, header, **kwargs) self._nickname = "{}-{}".format(self.detector, self.observatory[-1]) self.plot_settings['cmap'] = 'stereocor{det!s}'.format(det=self.detector[-1]) self.plot_settings['norm'] = ImageNormalize( stretch=source_stretch(self.meta, PowerStretch(0.5)), clip=False) @property def measurement(self): # 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 str(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): super().__init__(data, header, **kwargs) self._nickname = "{}-{}".format(self.detector, self.observatory[-1]) self.plot_settings['cmap'] = 'stereohi{det!s}'.format(det=self.detector[-1]) self.plot_settings['norm'] = ImageNormalize( stretch=source_stretch(self.meta, PowerStretch(0.25)), clip=False) @property def measurement(self): # 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 str(header.get('detector', '')).startswith('HI') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/suvi.py0000644000175100001710000001105600000000000016705 0ustar00vstsdocker"""SUVI Map subclass definitions""" import astropy.units as u from astropy.coordinates import CartesianRepresentation from astropy.visualization import AsinhStretch from astropy.visualization.mpl_normalize import ImageNormalize from sunpy.map import GenericMap from sunpy.map.sources.source_type import source_stretch __author__ = "Jack Ireland" __email__ = "jack.ireland@nasa.gov" __all__ = ["SUVIMap"] class SUVIMap(GenericMap): """ SUVI Image Map. The Solar Ultraviolet Imager (SUVI) is a normal-incidence Cassegrain EUV telescope on board the latest of the Geostationary Operational Environmental Satellite (GOES) missions (GOES-16, formerly known as GOES-R). It is similar to Atmospheric Imaging Assembly (AIA). It operates in geostationary orbit above the Americas at 75.2 degree W. It's primary purpose is to support NOAA's goal to characterize solar features and detect events that lead to space weather. It uses a filter wheel to image the Sun in six EUV wavelength corresponding to known coronal emission lines: - 9.4 nm (FeXVIII) - 13.1 nm (FeXXI) - 17.1 nm (FeIX/X) - 19.5 nm (FeXII) - 28.4 nm (FeXV) - 30.4 nm (HeII) The focal plane consists of a CCD detector with 1280 x 1280 pixels. The plate scale is 2.5 arcsec per pixel. The field of view is therefore almost twice the size of the Sun (53 arcmin) and extends out to 1.6 solar radii in the horizontal direction and 2.3 solar radii in the diagonal. It provides observations in each wavelength at multiple exposure times every 4 minutes. GOES-16 was launched on November 16, 2016, and became operational as NOAA's GOES East on December 18, 2017, replacing GOES-13. Notes ----- SUVI uses the same color tables as AIA for the matching wavelengths. SUVI 195 and 284 images use the AIA 193 & 335 color tables respectively. Observer location: We use the ECEF coordinates provided in the FITS header for the spacecraft location even when coordinates in other frames are provided due to accuracy concerns over the coordinate transformations used in the SUVI data pipeline. There could still be a small discrepancy because the definition of the ECEF frame used by SUVI may not exactly match the definition of the ITRS frame used by SunPy to interpret the header values. Note that some Level 1b files cannot be loaded due to errors in the header. References ---------- * `GOES-R Mission `_ * `SUVI Instrument Page `_ * `GOES-16 on Wikipedia `_ * `Recommended instrument description article `_ * `User's Guide `_ * `Level 1b Readme `_ * `Data archive `_ * `Level 1b data `_ * `Level 2 data `_ """ def __init__(self, data, header, **kwargs): super().__init__(data, header, **kwargs) self._nickname = self.detector self.plot_settings["cmap"] = self._get_cmap_name() self.plot_settings["norm"] = ImageNormalize( stretch=source_stretch(self.meta, AsinhStretch(0.01)), clip=False ) @property def _supported_observer_coordinates(self): return [(('obsgeo-x', 'obsgeo-y', 'obsgeo-z'), {'x': self.meta.get('obsgeo-x'), 'y': self.meta.get('obsgeo-y'), 'z': self.meta.get('obsgeo-z'), 'unit': u.m, 'representation_type': CartesianRepresentation, 'frame': "itrs"}) ] + super()._supported_observer_coordinates @property def observatory(self): return "GOES-R" @property def detector(self): return "SUVI" @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an AIA image""" return str(header.get("instrume", "")).startswith( "GOES-R Series Solar Ultraviolet Imager" ) ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1647479066.629275 sunpy-3.1.5/sunpy/map/sources/tests/0000755000175100001710000000000000000000000016504 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/__init__.py0000644000175100001710000000000000000000000020603 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_aia_source.py0000644000175100001710000000637200000000000022237 0ustar00vstsdocker"""Test cases for SDO Map subclasses. This particular test file pertains to AIAMap. @Author: Pritish C. (VaticanCameos) """ import os import glob import pytest import astropy.units as u from astropy.visualization.mpl_normalize import ImageNormalize import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.sdo import AIAMap from sunpy.tests.helpers import SKIP_GLYMUR 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")) 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. def test_norm_clip(createAIAMap): # Tests that the default normalizer has clipping disabled assert not createAIAMap.plot_settings['norm'].clip def test_new_instance_preserves_plot_settings(createAIAMap): # Tests that the _new_instance method preserves the plot_settings # of the old instance. This is done on the AIA source as the AIAMap # constructor explicitly sets the cmap and norm and we want to test # that _new_instance persists the old custom plot_settings createAIAMap.plot_settings['norm'] = ImageNormalize(vmin=0.1, vmax=42) createAIAMap.plot_settings['cmap'] = 'inferno' new_aia_map = createAIAMap._new_instance(createAIAMap.data, createAIAMap.meta, plot_settings=createAIAMap.plot_settings) assert new_aia_map.plot_settings['norm'].vmin == createAIAMap.plot_settings['norm'].vmin assert new_aia_map.plot_settings['norm'].vmax == createAIAMap.plot_settings['norm'].vmax assert new_aia_map.plot_settings['cmap'] == createAIAMap.plot_settings['cmap'] # If no plot settings are explicitly passed, the plot_settings should fall back to those # in the constructor new_aia_map = createAIAMap._new_instance(createAIAMap.data, createAIAMap.meta) assert new_aia_map.plot_settings['norm'].vmin is None assert new_aia_map.plot_settings['norm'].vmax is None assert new_aia_map.plot_settings['cmap'] == new_aia_map._get_cmap_name() def test_wcs(createAIAMap): # Smoke test that WCS is valid and can transform from pixels to world coordinates createAIAMap.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_cor_source.py0000644000175100001710000000240700000000000022263 0ustar00vstsdocker"""Test cases for STEREO Map subclasses. This particular test file pertains to CORMap. @Author: Pritish C. (VaticanCameos) """ import os import glob import astropy.units as u import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.stereo import CORMap path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path, "cor1_20090615_000500_s4c1A.fts")) cor = Map(fitspath) # COR Tests def test_fitstoCOR(): """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" def test_norm_clip(): # Tests that the default normalizer has clipping disabled assert not cor.plot_settings['norm'].clip def test_wcs(): # Smoke test that WCS is valid and can transform from pixels to world coordinates cor.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_eit_source.py0000644000175100001710000000317300000000000022262 0ustar00vstsdocker"""Test cases for SOHO Map subclasses. This particular test file pertains to EITMap. @Author: Pritish C. (VaticanCameos) """ import os import glob import pytest import astropy.units as u import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.soho import EITMap 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] def test_rsun(createEIT): """Tests the measurement property of the EITMap object.""" assert u.allclose(createEIT.rsun_obs, 979.0701*u.arcsec) def test_norm_clip(createEIT): # Tests that the default normalizer has clipping disabled assert not createEIT.plot_settings['norm'].clip def test_wcs(createEIT): # Smoke test that WCS is valid and can transform from pixels to world coordinates createEIT.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_eui_source.py0000644000175100001710000004220000000000000022255 0ustar00vstsdocker"""Tests for EUI Solar Orbiter Map""" from textwrap import dedent import numpy as np import pytest import astropy.units as u from astropy.coordinates import SkyCoord from astropy.io import fits from sunpy.map import Map from sunpy.map.sources import EUIMap @pytest.fixture def eui_fsi_map(scope="module"): # Please do not edit this header, it is a 1:1 copy of a SOLO EUI FSI 304 map raw_header = dedent("""\ SIMPLE = T / conforms to FITS standard BITPIX = 16 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 768 NAXIS2 = 768 LONGSTRN= 'OGIP 1.0' / The OGIP long string convention may be used FILENAME= 'solo_L1_eui-fsi304-image_20201021T145510206_V01.fits' / FITS filename DATE = '2020-11-23T16:40:54.714' / [UTC] FITS file creation date FILE_RAW= 'BatchRequest.PktTmRaw.SOL.0.2020.295.15.15.01.857.eJeU@2020.295.15.&' CONTINUE '15.03.463.1.xml&' CONTINUE '' / raw filename PARENT = 'solo_L0_eui-fsi###-image_0656607273e84f_V00.fits' / source file curre APID = 924 / APID number of associated TM DATE-OBS= '2020-10-21T14:55:10.206' / [UTC] deprecated, same as DATE-BEG. DATE-BEG= '2020-10-21T14:55:10.206' / [UTC] start time of observation DATE-AVG= '2020-10-21T14:55:13.206' / [UTC] average time of observation TIMESYS = 'UTC ' / system used for time keywords OBT_BEG = 656607273.9074554 / start acquisition time in OBT LEVEL = 'L1 ' / data processing level ORIGIN = 'Royal Observatory of Belgium' / file generation location VERS_SW = '807 ' / version of SW that provided FITS file VERSION = '01 ' / incremental version number IMGTYPE = 'solar image' / type of image; solar, calib., engineering JOBID = '20201123T163957.998Z_01f' / unique pipeline job ID COMPLETE= 'C ' / C or I for complete/incomplete OBSRVTRY= 'Solar Orbiter' / satellite name TELESCOP= 'SOLO/EUI/FSI' / telescope/Sensor name INSTRUME= 'EUI ' / instrument name DETECTOR= 'FSI ' / instrument subunit or sensor DOORINT = 'open ' / internal door position DOOREXT = 'open ' / external HS Door 2 FSI @-76.08 s XPOSURE = 6.0 / [s] total effective exposure time FILTER = 'Magnesium_304_2' / filter position WAVELNTH= 304 / [Angstrom] characteristic wavelength observatio WAVEMIN = 250 / [Angstrom] min wavelength resp. > 0.05 of max WAVEMAX = 350 / [Angstrom] max wavelength resp. > 0.05 of max SOOPNAME= 'not defined' / name of the SOOP Campaign that the data belong SOOPTYPE= '000 ' / campaign ID(s) that the data belong to OBS_MODE= 'GENERIC_CALIB' / observation mode OBS_TYPE= '2ZpG ' / encoded version of OBS_MODE OBS_ID = 'SEUI_021A_000_000_2ZpG_11K' / unique ID of the individual observation TARGET = 'not defined' / type of target from planning BTYPE = 'Intensity' / type of data BUNIT = 'DN ' / units of physical value, after BSCALE, BZERO UCD = 'phot.count;em.UV.10-50nm' / Unified Content Descriptor BLANK = 32767 / value undefined pixels before BSCALE,BZERO PXBEG1 = 1 / first read-out pixel in dimension 1 PXEND1 = 3072 / last read-out pixel in dimension 1 PXBEG2 = 1 / first read-out pixel in dimension 2 PXEND2 = 3072 / last read-out pixel in dimension 2 NBIN1 = 4 / on-board binning factor in dim 1 NBIN2 = 4 / on-board binning factor in dim 1 NBIN = 16 / total binning factor WCSNAME = 'Helioprojective-cartesian' / name of coordinate system CTYPE1 = 'HPLN-TAN' / helioprojective longitude (Solar X) CTYPE2 = 'HPLT-TAN' / helioprojective latitude (Solar Y) CUNIT1 = 'arcsec ' / units along axis 1 CUNIT2 = 'arcsec ' / units along axis 2 PC1_1 = 0.9999102177627085 / WCS coordinate transformation matrix PC1_2 = -0.01342635032202125 / WCS coordinate transformation matrix PC2_1 = 0.01337343428604044 / WCS coordinate transformation matrix PC2_2 = 0.9999102177627085 / WCS coordinate transformation matrix CDELT1 = 17.74456 / [arcsec] pixel scale along axis 1 CDELT2 = 17.7796312 / [arcsec] pixel scale along axis 2 CROTA = 0.7677787561176675 / [deg] rotation angle CRVAL1 = 111.3320447860757 / [arcsec] value of reference pixel along axis 1 CRVAL2 = 112.4105857957075 / [arcsec] value of reference pixel along axis 2 CRPIX1 = 384.5 / [pixel] reference pixel location along axis 1 CRPIX2 = 384.5 / [pixel] reference pixel location along axis 2 LONPOLE = 180.0 / [deg] native longitude of the celestial pole ATT_SKD = 'v106_20201120_002+flown' / attitude SKD version, +flown/+predicted DETGAINL= 0.875 / commanded low gain value DETGAINH= 3.0 / commanded high-gain value GAINCOMB= 'combined' / commanded low/high gain combination READOUTM= 4 / commanded FEE readout mode DOWNLOAM= 0 / commanded FEE download mode GAINTHRE= 15600 / commanded threshold value for H/L gain LEDSTATE= 'all off ' / LED control for current telescope TEMPINT = 211.159425070688 / [K] internal APS detector temperature TEMP1DET= 211.3479264844486 / [K] last measured APS det. T before date-avg TEMP2DET= 211.159425070688 / [K] earliest measured APS det. T after date-avg TTEMP1 = '2020-10-21T14:55:00.902583' / [UTC] time TEMP1DET measurement TTEMP2 = '2020-10-21T14:56:00.901291' / [UTC] time TEMP2DET measurement ALU = 21131 / CEB ALU register ALU2 = 1 / CEB ALU2 register DETREG20= 85 / REG20_VDAC_CLIPP DETREG21= 87 / REG21_VDAC_OFFSETP DETREG22= 63 / REG22_VDAC_CMREF DETREG23= 39 / REG23_VDAC_OFFSETN DETREG24= 41 / REG24_VDAC_CLIPN DETREG25= 35 / REG25_VDAC_CMREF_LV DETREG26= 137 / REG26_IDAC_CDSSTAGE2_3 DETREG27= 136 / REG27_IDAC_CDSSTAGE1_COMPA DETREG28= 136 / REG28_IDAC_INVBUFFER_REFBU DETREG29= 136 / REG29_IDAC_COLBUFFER_COLBU DETREG2A= 8 / REG2A_IDAC_COLPC_COLGAINST DETREG2B= 136 / REG2B_IDAC_OUTPUTDRIVER_CO DETREG2C= 0 / REG2C_VDAC_BLACKSUN_EVEN DETREG2D= 136 / REG2D_IDAC_ABS_REBUFF_TEMP DETREG2E= 255 / REG2E_COLGAIN_EVEN_FF_MID DETREG2F= 240 / REG2F_COLGAIN_EVEN_FF_LOW DETREG30= 0 / REG30_COLGAIN_EVEN_FB_MID DETREG31= 15 / REG31_COLGAIN_EVEN_FB_LOW DETREG32= 0 / REG32_COLGAIN_EVEN_FB_HIGH DETREG33= 127 / REG33_COLGAIN_ODD_FF_MID DETREG34= 0 / REG34_COLGAIN_ODD_FF_LOW DETREG35= 0 / REG35_COLGAIN_ODD_FB_MID DETREG36= 255 / REG36_COLGAIN_ODD_FB_LOW DETREG37= 0 / REG37_COLGAIN_VDAC_SIGCLAM DETREG38= 61 / REG38_CDS_EN_SAMPLE_CLOCK_ DETREG39= 0 / REG39_MBS_PIXCOL_ADDR_LOW DETREG3A= 0 / REG3A_MBS_PIXCOL_ADDR_HIGH DETREG3B= 0 / REG3B_MBS_MUXBUS_SR_EOSX_S DETREG3C= 0 / REG3C_VDAC_SIGC_LAMP_BLACK DETREG3D= 0 / REG3D_XWIN_ADDRESS DETREG3E= 65 / REG3E_VDAC_BUSCLAMPHIGH DETREG3F= 65 / REG3F_VDAC_BUSCLAMPLOW DOORPOS = 34 / Door position (raw) = open FILTPOS = 0 / filter wheel position estimated from tm5(raw) GAOFSTAT= 'none ' / status of the CEB gain and offset correction BADPXREM= 'off ' / commanded bad pixel removal on or off BADPXDEF= 4000 / commanded bad pixel default @-8.30 s CRREM = 'off ' / cosmic ray removal on or off CRREMLIM= 1024 / [1 G. sigma DN] cosmic ray limit @-8.30 s GAINHG = 256 / global gain corr. high gain @-8.30 s GAINLG = 256 / global gain corr. how gain @-8.30 s OFFSETHG= 0 / [DN] global offset corr. high gain @-8.30 s OFFSETLG= 0 / [DN] global offset corr. low gain @-8.30 s PRIORITY= 0 / priority # of image/histogram when downloaded SCITABID= 28 / exposure identifier in sec. science table SCITABNR= 2 / sequential number of SCITABID RECSTATE= 'on ' / recoding on or off RECNRBIT= 8 / bit depth recoding output (sqrt) RECLOW = 0 / rec. threshold low (clipped 0) RECHIGH = 32767 / rec. threshold high(clipped 2^RECNRBIT-1) COMBITPP= 3 / WICOM compression bpp ( COMBITPP*0.04=bpp) COMSPLMD= 'provided by user' / WICOM compression splitb3 mode COMSPLVL= 5 / WICOM compression splitb3 value COMWEIMD= 'off ' / WICOM compression weighting mode COMWEIVL= '128,128,128,128,128,128,128,128,128,128' / WICOM sub-band coefficient COMSIZE = 8944 / number of bytes onboard compressed image COMSTRIP= 'off ' / compression type: off=whole image; on=strip COMPRESS= 'Lossy-extreme' / data compression quality (None/Lossless/Lossy) COMP_RAT= 1582.71198568873 / compression ratio: uncompressed/compressed size EUXCEN = 378.1416927369173 / [pixel] axis 1 location of solar center in L1 EUYCEN = 378.2622041177966 / [pixel] axis 2 location of solar center in L1 DATAMIN = 0 / minimum valid physical value DATAMAX = 3486 / maximum valid physical value DATAMEAN= 70.92212422688802 / [DN] average pixel value across the image RSUN_ARC= 973.9929284938777 / [arcsec] apparent photospheric solar radius RSUN_OBS= 973.9929284938777 / [arcsec] apparent photospheric solar radius RSUN_REF= 695700000 / [m] assumed physical solar radius SOLAR_B0= -6.677145021348451 / [deg] s/c tilt of solar North pole SOLAR_P0= 24.49493954200726 / [deg] s/c celestial North to solar North angle SOLAR_EP= 6.020922523528366 / [deg] s/c ecliptic North to solar North angle CAR_ROT = 2236.260991931539 / carrington rotation number HGLT_OBS= -6.677145021348451 / [deg] s/c Heliographic latitude (B0 angle) HGLN_OBS= 125.2577856554425 / [deg] s/c Heliographic longitude CRLT_OBS= -6.677145021348451 / [deg] s/c Carrington latitude (B0 angle) CRLN_OBS= 266.0429046459254 / [deg] s/c Carrington longitude (L0 angle) DSUN_OBS= 147330596344.022 / [m] s/c distance from Sun DSUN_AU = 0.9848442070373797 / [AU] s/c distance from Sun HEEX_OBS= -85696377695.41205 / [m] s/c Heliocentric Earth Ecliptic X HEEY_OBS= 111586055474.3987 / [m] s/c Heliocentric Earth Ecliptic Y HEEZ_OBS= 43714845220.3008 / [m] s/c Heliocentric Earth Ecliptic Z HCIX_OBS= 30146038635.19564 / [m] s/c Heliocentric Inertial X HCIY_OBS= 143192376435.2006 / [m] s/c Heliocentric Inertial Y HCIZ_OBS= -17130799880.04794 / [m] s/c Heliocentric Inertial Z HCIX_VOB= -24672.58385959416 / [m/s] s/c Heliocentric Inertial X Velocity HCIY_VOB= 3682.865033100267 / [m/s] s/c Heliocentric Inertial Y Velocity HCIZ_VOB= 290.6051210903948 / [m/s] s/c Heliocentric Inertial Z Velocity HAEX_OBS= -132369527358.7171 / [m] s/c Heliocentric Aries Ecliptic X HAEY_OBS= 64679546764.96254 / [m] s/c Heliocentric Aries Ecliptic Y HAEZ_OBS= 1081238268.853039 / [m] s/c Heliocentric Aries Ecliptic Z HEQX_OBS= -84470625652.15648 / [m] s/c Heliocentric Earth Equatorial X HEQY_OBS= 119488717946.4578 / [m] s/c Heliocentric Earth Equatorial Y HEQZ_OBS= -17130799880.04794 / [m] s/c Heliocentric Earth Equatorial Z GSEX_OBS= 234594796125.3331 / [m] s/c Geocentric Solar Ecliptic X GSEY_OBS= -111586055474.3987 / [m] s/c Geocentric Solar Ecliptic Y GSEZ_OBS= 43714845220.30079 / [m] s/c Geocentric Solar Ecliptic Z OBS_VR = 24947.57547527891 / [m/s] Radial velocity of S/C relative to Sun EAR_TDEL= 5.229691555145962 / [s] Time(Sun to Earth) - Time(Sun to S/C) SUN_TIME= 491.4419706449787 / [s] Time(Sun to S/C) DATE_EAR= '2020-10-21T14:55:18.436' / [UTC] start time of observation Earth DATE_SUN= '2020-10-21T14:47:01.764' / [UTC] start time of observation Sun INFO_URL= 'http://sidc.be/EUI/data' / Link to additional information CHECKSUM= 'Zoh7Zog4Zog4Zog4' / HDU checksum updated 2020-11-23T16:40:54 DATASUM = '4177122843' / data unit checksum updated 2020-11-23T16:40:54 WAVEUNIT= 'Angstrom' BSCALE = 1 BZERO = 32768 COMMENT --------- General Description: ----------------------------------------- COMMENT --------- Instrument and Observation Configuration: -------------------- COMMENT --------- Description of Data Content: --------------------------------- COMMENT --------- Image Relative to Detector and Electronics: ------------------ COMMENT --------- World Coordinate System Attitude: ---------------------------- COMMENT --------- Front End Electronics: --------------------------------------- COMMENT --------- Temperature: ------------------------------------------------- COMMENT --------- Telemetry Header: -------------------------------------------- COMMENT --------- CEB Pixel Preprocessing: ------------------------------------- COMMENT --------- Data Routing: ------------------------------------------------ COMMENT --------- Onboard Processing: ------------------------------------------ COMMENT --------- Derived Image Properties: ------------------------------------ COMMENT --------- Solar Ephemeris: --------------------------------------------- COMMENT --------- Parameters Closing Metadata: --------------------------------- HISTORY created by /home/eui/pipeline/telemetry_parser.py --databaseExternal --w HISTORY orkingDirectory /tmp/telemetry_parser --configFile /home/eui/config/conf HISTORY ig.ini --outputDirectory /data/solo-eui/internal/L0/ --atROBcreated by / HISTORY home/eui/pipeline/level0_to_level1.py -i /data/solo-eui/internal/L0/2020 HISTORY /10/21 --outputDirectory /data/solo-eui/internal/test/L1/ --configFile / HISTORY home/eui/config/config.ini --estimatefilter --reprocess """) header = fits.Header.fromstring(raw_header, sep='\n') data = np.random.rand(header['naxis1'], header['naxis2']) return Map(data, header) def test_EUIMap(eui_fsi_map): assert isinstance(eui_fsi_map, EUIMap) def test_is_datasource_for(eui_fsi_map): assert eui_fsi_map.is_datasource_for(eui_fsi_map.data, eui_fsi_map.meta) def test_observer_coordinate(eui_fsi_map): obs_coord = eui_fsi_map.observer_coordinate assert isinstance(obs_coord, SkyCoord) assert obs_coord.obstime.isot == eui_fsi_map.meta['date-avg'] def test_observatory(eui_fsi_map): assert eui_fsi_map.observatory == "Solar Orbiter" def test_measurement(eui_fsi_map): assert eui_fsi_map.measurement == u.Quantity(304, 'angstrom') def test_exposure_time(eui_fsi_map): assert eui_fsi_map.exposure_time == u.Quantity(6, 's') def test_level_number(eui_fsi_map): assert eui_fsi_map.processing_level == 1 def test_unit(eui_fsi_map): assert eui_fsi_map.unit == u.Unit('ct') def test_norm_clip(eui_fsi_map): # Tests that the default normalizer has clipping disabled assert not eui_fsi_map.plot_settings['norm'].clip def test_wcs(eui_fsi_map): # Smoke test that WCS is valid and can transform from pixels to world coordinates eui_fsi_map.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_euvi_source.py0000644000175100001710000000332600000000000022451 0ustar00vstsdocker"""Test cases for STEREO Map subclasses. This particular test file pertains to EUVIMap. @Author: Pritish C. (VaticanCameos) """ import os import glob import astropy.units as u import sunpy.data.test from sunpy.coordinates import sun from sunpy.map import Map from sunpy.map.sources.stereo import EUVIMap from sunpy.sun import constants 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_fitstoEUVI(): """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" def test_rsun_obs(): """Tests the rsun_obs property""" assert euvi.rsun_obs.value == euvi.meta['rsun'] def test_rsun_missing(): """Tests output if 'rsun' is missing""" euvi_no_rsun = Map(fitspath) euvi_no_rsun.meta.pop('rsun', None) r = euvi_no_rsun.observer_coordinate.radius assert euvi_no_rsun.rsun_obs == sun._angular_radius(constants.radius, r) def test_norm_clip(): # Tests that the default normalizer has clipping disabled assert not euvi.plot_settings['norm'].clip def test_wcs(): # Smoke test that WCS is valid and can transform from pixels to world coordinates euvi.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_hi_source.py0000644000175100001710000000230000000000000022070 0ustar00vstsdocker"""Test cases for STEREO Map subclasses. This particular test file pertains to HIMap. """ import os import glob import astropy.units as u import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.stereo import HIMap 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" def test_norm_clip(): # Tests that the default normalizer has clipping disabled assert not hi.plot_settings['norm'].clip def test_wcs(): # Smoke test that WCS is valid and can transform from pixels to world coordinates hi.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_hmi_source.py0000644000175100001710000000221600000000000022253 0ustar00vstsdocker"""Test cases for SDO Map subclasses. This particular test file pertains to HMIMap. @Author: Pritish C. (VaticanCameos) """ import os import glob import astropy.units as u import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.sdo import HMIMap 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" def test_wcs(): # Smoke test that WCS is valid and can transform from pixels to world coordinates hmi.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_hmi_synoptic_source.py0000644000175100001710000001210000000000000024174 0ustar00vstsdockerfrom textwrap import dedent import numpy as np import pytest import astropy.units as u from astropy.io import fits from sunpy.map import Map from sunpy.map.sources.sdo import HMISynopticMap from sunpy.util.exceptions import SunpyMetadataWarning @pytest.fixture def hmi_synoptic(): # sample HMI synoptic map # Please do not edit this header, it is a 1:1 copy of a HMI synoptic map header raw_header = dedent("""\ SIMPLE = T / file does conform to FITS standard BITPIX = -32 / number of bits per data pixel NAXIS = 2 / number of data axes NAXIS1 = 720 / length of data axis 1 NAXIS2 = 360 / length of data axis 2 EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'Astronomy COMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H DATE = '2018-11-29T00:00:00' TELESCOP= 'SDO/HMI' INSTRUME= 'HMI_SIDE1' WAVELNTH= 6173.000000 BUNIT = 'Mx/cm^2' CONTENT = 'Carrington Synoptic Chart Of Br Field' HISTORY Carrington-Time conversion corrected; o2helio.c bug corrected -- July 20 HISTORY 13 BLD_VERS= -2147483648 CTYPE1 = 'CRLN-CEA' CTYPE2 = 'CRLT-CEA' CRPIX1 = 360.400000 CRPIX2 = 180.500000 CRVAL1 = 795420.000000 CRVAL2 = 0.000000 CDELT1 = -0.500000 CDELT2 = 0.005556 CUNIT1 = 'Degree' CUNIT2 = 'Sine Latitude' CRDER1 = 'nan ' CRDER2 = 'nan ' CSYSER1 = 'nan ' CSYSER2 = 'nan ' WCSNAME = 'Carrington Heliographic' CADENCE = 360.000000 DATASIGN= 1 T_OBS = '2018.11.09_12:30:52_TAI' T_START = '2018.10.26_20:53:36_TAI' T_STOP = '2018.11.23_04:13:10_TAI' T_ROT = '2018.11.09_12:30:52_TAI' T_EARTH = '' CAR_ROT = 2210 CARRTIME= 795420.000000 B0_ROT = 3.504195 B0_FRST = 4.903270 B0_LAST = 1.897488 EARTH_B0= 'nan ' LON_FRST= 795240.200000 LON_LAST= 795599.700000 LON_STEP= -0.500000 W_OFFSET= 0.000000 W_WEIGHT= 'Even' IMG_NUM = 3276 IMG_FRST= '2018.10.26_00:00:00_TAI' IMG_LAST= '2018.11.23_23:00:00_TAI' IMG_ROT = '2018.11.09_12:36:00_TAI' HWNWIDTH= 15.000000 EQPOINTS= 20.000000 NSIGMA = 3.000000 CARSTRCH= 1 DIFROT_A= 13.562000 DIFROT_B= -2.040000 DIFROT_C= -1.487500 TOTVALS = 259200 DATAVALS= 258152 MISSVALS= 1048 DATAMIN = -275.919403 DATAMAX = 352.637482 DATAMEDN= 0.006980 DATAMEAN= 0.024495 DATARMS = 8.102401 DATASKEW= 0.331222 DATAKURT= 70.596480 CALVER64= 270610 CODEVER = '' QUALITY = 0 RECNUM = 232 CHECKSUM= 'cjHPdiENciENciEN' / HDU checksum updated 2020-04-22T21:01:56 DATASUM = '2978664836' / data unit checksum updated 2020-04-22T21:01:56 """) header = fits.Header.fromstring(raw_header, sep='\n') data = np.random.rand(header['naxis1'], header['naxis2']) return Map(data, header) def test_fitstoHMISynoptic(hmi_synoptic): """Tests the creation of HMISynopticMap using FITS.""" assert isinstance(hmi_synoptic, HMISynopticMap) def test_is_datasource_for(hmi_synoptic): """Test the is_datasource_for method of HMISynopticMap. Note that header data to be provided as an argument can be a MetaDict object, which in this case is hmi.meta.""" assert hmi_synoptic.is_datasource_for(hmi_synoptic.data, hmi_synoptic.meta) def test_observatory(hmi_synoptic): """Tests the observatory property of the HMISynopticMap object.""" assert hmi_synoptic.observatory == "SDO" def test_measurement(hmi_synoptic): """Tests the measurement property of the HMISynopticMap object.""" assert hmi_synoptic.measurement == "carrington" def test_date(hmi_synoptic): """Check that accessing the date doesn't raise a warning.""" hmi_synoptic.date def test_date_uses_date_obs(hmi_synoptic): """Check that the date uses the date-obs key as well.""" hmi_synoptic.meta['date-obs'] = hmi_synoptic.meta.pop('t_obs') assert hmi_synoptic.date is not None def test_unit(hmi_synoptic): # Check that the default unit of Mx/cm**2 is correctly replaced with a # FITS standard unit assert hmi_synoptic.unit == u.G hmi_synoptic.meta['bunit'] = 'm' assert hmi_synoptic.unit == u.m def test_wcs(hmi_synoptic): # Smoke test that WCS is valid and can transform from pixels to world coordinates with pytest.warns(SunpyMetadataWarning, match='Missing metadata for observer'): hmi_synoptic.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_iris_source.py0000644000175100001710000000343400000000000022447 0ustar00vstsdocker"""Test cases for SJIMap. This particular test file pertains to SJIMap. @Author: Pritish C. (VaticanCameos) """ import os import glob import pytest import astropy.units as u import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.iris import SJIMap from sunpy.util.exceptions import SunpyMetadataWarning, SunpyUserWarning @pytest.fixture def irismap(): path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join( path, "iris_l2_20130801_074720_4040000014_SJI_1400_t000.fits")) with pytest.warns(SunpyUserWarning, match='This file contains more than 2 dimensions'): return Map(fitspath, silence_errors=True) # IRIS Tests def test_fitstoIRIS(irismap): """Tests the creation of SJIMap using FITS.""" assert (isinstance(irismap, SJIMap)) def test_is_datasource_for(irismap): """Test the is_datasource_for method of SJIMap. Note that header data to be provided as an argument can be a MetaDict object.""" assert irismap.is_datasource_for(irismap.data, irismap.meta) def test_observatory(irismap): """Tests the observatory property of SJIMap.""" assert irismap.observatory == "IRIS" def test_wavelength(irismap): """Tests the wavelength and waveunit property of the SJIMap""" assert irismap.wavelength == u.Quantity(1400, 'Angstrom') def test_level_number(irismap): """Tests the processing_level property of the SJIMap""" assert irismap.processing_level == 2.0 def test_units(irismap): """Tests the unit property of the SJIMap""" assert irismap.unit == u.ct def test_wcs(irismap): # Smoke test that WCS is valid and can transform from pixels to world coordinates with pytest.warns(SunpyMetadataWarning, match='Missing metadata for observer'): irismap.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_kcor_source.py0000644000175100001710000000250200000000000022432 0ustar00vstsdocker""" Test cases for KCor Map subclass. """ import os import glob import pytest import astropy.units as u import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.mlso import KCorMap path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path, "20181209_180305_kcor_l1.5_rebinned.fits")) @pytest.fixture() def kcor(): """Creates an KCorMap from a FITS file.""" return Map(fitspath) # KCor Tests def test_kcormap_creation(kcor): """Tests the creation of KCorMap using FITS.""" assert isinstance(kcor, KCorMap) def test_is_datasource_for(kcor): """Test the is_datasource_for method of KCorMap. Note that header data to be provided as an argument can be a MetaDict object.""" assert kcor.is_datasource_for(kcor.data, kcor.meta) def test_measurement(kcor): """Tests the measurement property of the KCorMap object.""" assert kcor.measurement == 735 * u.nm def test_observatory(kcor): """Tests the observatory property of the KCorMap object.""" assert kcor.observatory == "MLSO" def test_norm_clip(kcor): # Tests that the default normalizer has clipping disabled assert not kcor.plot_settings['norm'].clip def test_wcs(kcor): # Smoke test that WCS is valid and can transform from pixels to world coordinates kcor.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_lasco_source.py0000644000175100001710000001467600000000000022614 0ustar00vstsdocker"""Test cases for SOHO Map subclasses. This particular test file pertains to LASCOMap. @Author: Pritish C. (VaticanCameos) """ import os import glob from textwrap import dedent import numpy as np import pytest import astropy.units as u from astropy.io import fits import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.soho import LASCOMap from sunpy.tests.helpers import skip_glymur from sunpy.time import parse_time from sunpy.util.exceptions import SunpyMetadataWarning path = sunpy.data.test.rootdir def lascoc3(): # Please do not edit this header, it is a 1:1 copy of a LASCO C3 header raw_header = dedent("""\ SIMPLE = T / Written by IDL: Thu Jun 6 19:03:59 2002 BITPIX = 16 / NAXIS = 2 / NAXIS1 = 1024 / NAXIS2 = 1024 / FILENAME= '32088304.fts' / FILEORIG= '020521_001853.img' / DATE = '2002/06/06 23:03:55.204' / DATE-OBS= '2002/05/21' / TIME-OBS= '00:18:06.516' / P1COL = 20 / P1ROW = 1 / P2COL = 1043 / P2ROW = 1024 / VERSION = 2 / EXPTIME = 19.0996 / EXP0 = 17.0000 / EXPCMD = 17.0000 / EXP1 = 1.88135 / EXP2 = 3.17676 / EXP3 = 2.09961 / TELESCOP= 'SOHO ' / INSTRUME= 'LASCO ' / DETECTOR= 'C3 ' / READPORT= 'C ' / SUMROW = 0 / SUMCOL = 0 / LEBXSUM = 1 / LEBYSUM = 1 / SHUTTR = 0 / LAMP = 0 / FILTER = 'Clear ' / POLAR = 'Clear ' / LP_NUM = 'Normal ' / OS_NUM = 3390 / IMGCTR = 717 / IMGSEQ = 0 / COMPRSSN= 'X# ' / HCOMP_SF= 32 / MID_DATE= 52415 / MID_TIME= 1096.07 / PLATESCL= 56.0000 / OFFSET = 378.876 / IMAGE_CT= 717 / SEQ_NUM = 0 / OBT_TIME= 1.4006315E+09 / R1COL = 20 / R1ROW = 1 / R2COL = 1043 / R2ROW = 1024 / EFFPORT = 'C ' / RECTIFY = 'TRUE ' / DATAMIN = 376.000 / DATAMAX = 11183.0 / DATAZER = 101375 / DATASAT = 0 / DATAAVG = 1886.68 / DATASIG = 1630.27 / DATAP01 = 396 / DATAP10 = 780 / DATAP25 = 968 / DATAP75 = 2029 / DATAP90 = 4213 / DATAP95 = 5959 / DATAP98 = 7190 / DATAP99 = 8023 / CRPIX1 = 517.95599 / CRPIX2 = 532.63202 / CRVAL1 = 0.00000 / CRVAL2 = 0.00000 / CROTA1 = 0.00000 / CROTA2 = 0.00000 / CTYPE1 = 'SOLAR-X ' / CTYPE2 = 'SOLAR-Y ' / CUNIT1 = 'ARCSEC ' / CUNIT2 = 'ARCSEC ' / CDELT1 = 56.000000 / CDELT2 = 56.000000 / HISTORY offset_bias.pro 1.24 12/13/01, 378.876 HISTORY V15 18 Jun 1997 MAKE_FITS_HDR HISTORY 2 """) header = fits.Header.fromstring(raw_header, sep='\n') data = np.random.rand(header['naxis1'], header['naxis2']) return Map(data, header) def lasco(): fitspath = glob.glob(os.path.join(path, "lasco_c2_25299383_s.fts")) return Map(fitspath) @pytest.fixture(params=[lasco, lascoc3], ids=['C2', 'C3']) def lasco_map(request): return request.param() @pytest.fixture def lasco_helioviewer(): jp2path = glob.glob(os.path.join( path, "2013_05_13__16_54_06_137__SOHO_LASCO_C3_white-light.jp2")) return Map(jp2path) def test_fitstoLASCO(lasco_map): """Tests the creation of LASCOMap using FITS.""" assert isinstance(lasco_map, LASCOMap) def test_is_datasource_for(lasco_map): """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_map.is_datasource_for(lasco_map.data, lasco_map.meta) def test_measurement(lasco_map): """Tests the measurement property of the LASCOMap object.""" assert lasco_map.measurement == "white-light" def test_wavelength(lasco_map): """Tests wavelength property.""" assert lasco_map.wavelength is None def test_date(lasco_map): assert lasco_map.date == parse_time( {'C2': '2009-02-28T00:05:33.380', 'C3': '2002-05-21T00:18:06.516'}[lasco_map.detector]) def test_nickname(lasco_map): assert lasco_map.nickname == {'C2': 'LASCO-C2 Orange', 'C3': 'LASCO-C3 Clear'}[lasco_map.detector] def test_observatory(lasco_map): """Tests the observatory property of the LASCOMap object.""" assert lasco_map.observatory == "SOHO" def test_norm_clip(lasco_map): # Tests that the default normalizer has clipping disabled assert not lasco_map.plot_settings['norm'].clip @skip_glymur def test_helioviewer_rotation(lasco_map, lasco_helioviewer): """Tests that rotation metadata is correctly removed for JPEG2000 images provided by Helioviewer.org.""" rmatrix = {'C2': [[0.999966, -0.008296], [0.008296, 0.999966]], 'C3': [[1, 0], [0, 1]]}[lasco_map.detector] np.testing.assert_allclose(lasco_map.rotation_matrix, rmatrix, rtol=1e-6) np.testing.assert_array_equal(lasco_helioviewer.rotation_matrix, [[1., 0.], [0., 1.]]) def test_wcs(lasco_map): # Smoke test that WCS is valid and can transform from pixels to world coordinates with pytest.warns(SunpyMetadataWarning, match='Missing metadata for observer'): lasco_map.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_mdi_source.py0000644000175100001710000001302400000000000022246 0ustar00vstsdocker"""Test cases for SOHO Map subclasses. This particular test file pertains to MDIMap. @Author: Pritish C. (VaticanCameos) """ import os import glob from textwrap import dedent import numpy as np import pytest import astropy.units as u from astropy.coordinates import Angle from astropy.io import fits import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.soho import MDIMap, MDISynopticMap from sunpy.util.exceptions import SunpyMetadataWarning @pytest.fixture def mdi(): path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path, "mdi.fd_Ic.20101015_230100_TAI.data.fits")) return Map(fitspath) @pytest.fixture def mdi_synoptic(): # sample MDI map # Please do not edit this header, it is a 1:1 copy of a MDI map header header = dedent(""" SIMPLE = T / file does conform to FITS standard BITPIX = -32 / number of bits per data pixel NAXIS = 2 / number of data axes NAXIS1 = 720 / length of data axis 1 NAXIS2 = 360 / length of data axis 2 EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'Astronomy COMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H DATE = '2017-05-17T00:00:00' TELESCOP= 'SOHO' INSTRUME= 'MDI' WAVELNTH= 6768.000000 BUNIT = 'Mx/cm^2' CONTENT = 'Carrington Synoptic Chart Of Mr Field' HISTORY Carrington-Time conversion corrected; o2helio.c bug corrected -- July 20 HISTORY 13 BLD_VERS= -2147483648 CTYPE1 = 'CRLN-CEA' CTYPE2 = 'CRLT-CEA' CRPIX1 = 360.40 CRPIX2 = 180.50 CRVAL1 = 755460.00 CRVAL2 = 0.00 CDELT1 = -0.500000 CDELT2 = 0.006944 CUNIT1 = 'Degree' CUNIT2 = 'Sine Latitude' CRDER1 = 'nan ' CRDER2 = 'nan ' CSYSER1 = 'nan ' CSYSER2 = 'nan ' WCSNAME = 'Carrington Heliographic' T_REC = '-4712.01.01_11:59:28_TAI' TRECEPOC= '1977.01.01_00:00:00_TAI' TRECSTEP= 2356586.000000 TRECUNIT= 'secs' CADENCE = 360.000000 DATASIGN= 1 T_OBS = '2010.07.27_00:09:05_TAI' T_START = '2010.07.13_09:38:38_TAI' T_STOP = '2010.08.09_14:48:26_TAI' T_ROT = '2010.07.27_00:09:05_TAI' CAR_ROT = 2099 CARRTIME= 755460.00 B0_ROT = 5.379462 B0_FRST = 4.150289 B0_LAST = 6.337214 LON_FRST= 755280.20 LON_LAST= 755639.70 LON_STEP= -0.500000 W_OFFSET= 0.000000 W_WEIGHT= 'Even' IMG_NUM = 338 IMG_FRST= '2010.07.12_00:00:00_TAI' IMG_LAST= '2010.08.10_00:00:00_TAI' IMG_ROT = '2010.07.24_06:24:00_TAI' HWNWIDTH= 20.000000 EQPOINTS= 20.000000 NSIGMA = 3.000000 CARSTRCH= 1 DIFROT_A= 13.562000 DIFROT_B= -2.040000 DIFROT_C= -1.487500 TOTVALS = 259200 DATAVALS= 257588 MISSVALS= 1612 DATAMIN = -1880.387695 DATAMAX = 1857.843750 DATAMEDN= 0.072514 DATAMEAN= 0.025515 DATARMS = 26.509175 DATASKEW= -10.533994 DATAKURT= 1172.076612 CALVER64= 0 RECNUM = 188 CHECKSUM= '8MHfAK9d2KGd8K9d' / HDU checksum updated 2020-04-23T08:48:07 DATASUM = '3044927737' / data unit checksum updated 2020-04-23T08:48:07""") header = fits.Header.fromstring(header, sep='\n') data = np.random.rand(header['naxis1'], header['naxis2']) return Map(data, header) # MDI Tests def test_fitstoMDI(mdi): """Tests the creation of MDIMap using FITS.""" assert isinstance(mdi, MDIMap) def test_is_datasource_for(mdi): """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(mdi): """Tests the observatory property of the MDIMap object.""" assert mdi.observatory == "SOHO" def test_instrument(mdi): """Tests the instrument property of the MDIMap object.""" assert mdi.instrument == "MDI" def test_waveunit(mdi): assert mdi.waveunit == "Angstrom" def test_observer(mdi): assert mdi.observer_coordinate.frame.name == 'heliographic_stonyhurst' assert u.allclose(mdi.observer_coordinate.lat, Angle(mdi.meta['CRLT_OBS']*u.degree)) assert u.allclose(mdi.observer_coordinate.radius, mdi.meta['DSUN_OBS']*u.m) def test_carrington(mdi): assert u.allclose(mdi.carrington_longitude, Angle(mdi.meta['CRLN_OBS']*u.deg)) assert u.allclose(mdi.carrington_latitude, Angle(mdi.meta['CRLT_OBS']*u.deg)) @pytest.mark.filterwarnings("error") def test_synoptic_source(mdi_synoptic): assert isinstance(mdi_synoptic, MDISynopticMap) # Check that the WCS is valid with pytest.warns(SunpyMetadataWarning, match='Missing metadata for observer'): mdi_synoptic.wcs def test_wcs(mdi, mdi_synoptic): # Smoke test that WCS is valid and can transform from pixels to world coordinates mdi.pixel_to_world(0*u.pix, 0*u.pix) with pytest.warns(SunpyMetadataWarning, match='Missing metadata for observer'): mdi_synoptic.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_sot_source.py0000644000175100001710000002040000000000000022276 0ustar00vstsdockerfrom textwrap import dedent import numpy as np import pytest import astropy.units as u from astropy.io import fits from sunpy.map import Map from sunpy.map.sources.hinode import SOTMap from sunpy.util.exceptions import SunpyMetadataWarning @pytest.fixture def sot(): raw_header = dedent("""\ SIMPLE = T / created Wed Oct 21 17:17:46 2015 BITPIX = 16 NAXIS = 2 NAXIS1 = 2048 NAXIS2 = 1024 EXTEND = T DATE = '2015-10-21T17:17:46.000' /creation date DATE_RF0= '2015-10-21T17:17:46.000' /creation date TELESCOP= 'HINODE' MDP_CLK = 361702812 FILEORIG= '2015_1021_171239.sci' MDPCTREF= 361701639 CTREF = 1801875595 CTRATE = 584.000 TIMEERR = 0 EXP0 = 0.123088 OBT_TIME= 361701866 OBT_END = 361701929 DATE_OBS= '2015-10-13T23:13:44.601' TIME-OBS= '23:13:44.601' CTIME = 'Tue Oct 13 23:13:44 2015' DATE_END= '2015-10-13T23:13:44.724' TIMESPAN= 0.123088 TIMESYS = 'UTC' INSTRUME= 'SOT/WB' ORIGIN = 'JAXA/ISAS, SIRIUS' DATA_LEV= 0 ORIG_RF0= 'JAXA/ISAS, SIRIUS' VER_RF0 = '1.66' PROG_VER= 609 SEQN_VER= 919 PARM_VER= 628 PROG_NO = 17 SUBR_NO = 1 SEQN_NO = 27 MAIN_CNT= 1 MAIN_RPT= 1 MAIN_POS= 1 SUBR_CNT= 1 SUBR_RPT= 2 SUBR_POS= 1 SEQN_CNT= 1 SEQN_RPT= 1 SEQN_POS= 5 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 = 1 GEN_ID = 1 FRM_ID = 2 WAVEID = 2 OBS_TYPE= 'FG (simple)' MACROID = 13348 XSCALE = 0.108960 YSCALE = 0.108960 FGXOFF = 0 FGYOFF = 0 FGCCDIX0= 0 FGCCDIX1= 4095 FGCCDIY0= 0 FGCCDIY1= 2047 CRPIX1 = 1024.50 CRPIX2 = 512.500 SC_ATTX = -15.8358 SC_ATTY = 19.2347 CRVAL1 = -15.8358 CRVAL2 = 19.2347 CDELT1 = 0.108960 CDELT2 = 0.108960 CUNIT1 = 'arcsec' CUNIT2 = 'arcsec' CTYPE1 = 'Solar-X' CTYPE2 = 'Solar-Y' SAT_ROT = 0.00000 INST_ROT= 0.412000 CROTA1 = 0.412000 CROTA2 = 0.412000 XCEN = -15.8358 YCEN = 19.2347 FOVX = 223.150 FOVY = 111.575 TR_MODE = 'FIX' FGBINX = 1 FGBINY = 1 EXPTIME = 0.122880 WAVE = 'Ca II H line' DARKFLAG= 0 BITCOMP1= 6 IMGCOMP1= 7 QTABLE1 = 2 BITCOMP2= 1 IMGCOMP2= 7 QTABLE2 = 1 PCK_SN0 = 42477799 PCK_SN1 = 42477831 NUM_PCKS= 33 FGMODE = 'shuttered' FGNINT = 1 ROILOOP = 0 NROILOOP= 0 CTSERVO = 1 CTMESTAT= 36864 CTMEX = -801 CTMEY = 329 CTMODE = 35 T_SPCCD = -43.4724 T_FGCCD = -32.2096 T_CTCCD = 26.6964 T_SPCEB = -6.63403 T_FGCEB = 1.65425 T_CTCEB = 2.92207 MASK = 22 WBFW = 118 WEDGE = 21 NBFW = 118 TF1 = 132 TF2 = 133 TF3 = 137 TF4 = 129 TF5 = 106 TF6 = 54 TF7 = 17 TF8 = 154 SLITENC = 1991 FOCUS = 2035 WBEXP = 50 NBEXP = 199 WAVEOFF = 0 ROISTART= 0 ROISTOP = 1025 DOPVUSED= -110 CAMGAIN = 2 CAMDACA = 8 CAMDACB = 8 CAMPSUM = 2 CAMSSUM = 2 CAMAMP = 0 CAMSCLK = 0 PMUDELAY= 128 BITCVER1= 45094 ACHFVER1= 40961 DCHFVER1= 53249 QTABVER1= 57365 BYTECNTI= 401402 PIXCNTI = 2097152 BITSPPI = 1.53123 BYTECNTQ= 0 PIXCNTQ = 0 BITSPPQ = 0.00000 PERCENTD= 100.000 """) header = fits.Header.fromstring(raw_header, sep='\n') data = np.random.rand(header['naxis1'], header['naxis2']) return Map(data, header) # SOT Tests def test_fitstoSOT(sot): """Tests the creation of SOTMap using FITS.""" assert isinstance(sot, SOTMap) def test_is_datasource_for(sot): """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(sot): """Tests the observatory property of the SOTMap object.""" assert sot.observatory == "Hinode" def test_measurement(sot): """Tests the measurement property of the SOTMap object.""" assert sot.measurement is None def test_instruments(sot): """Tests the Instruments object of SOTMap.""" assert (sot.Instruments == ['SOT/WB', 'SOT/NB', 'SOT/SP', 'SOT/CT']) def test_waves(sot): """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(sot): """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']) def test_wcs(sot): # Smoke test that WCS is valid and can transform from pixels to world coordinates with pytest.warns(SunpyMetadataWarning, match='assuming Earth-based observer'): sot.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_source_type.py0000644000175100001710000000215400000000000022460 0ustar00vstsdocker""" Test cases distinguishing the source types. """ import os import glob from astropy.visualization import LinearStretch import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.source_type import from_helioviewer_project, source_stretch 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) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_suvi_source.py0000644000175100001710000000314400000000000022465 0ustar00vstsdocker""" Test cases for SUVI Map subclass. """ import os import glob import pytest import astropy.units as u import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.suvi import SUVIMap @pytest.fixture() def suvi(): """Creates an SUVIMap from a FITS file.""" path = sunpy.data.test.rootdir fitspath = glob.glob( os.path.join(path, "dr_suvi-l2-ci195_g16_s20190403T093200Z_e20190403T093600Z_v1-0-0_rebinned.fits")) return Map(fitspath) # SUVI Tests def test_suvimap_creation(suvi): """Tests the creation of SUVIMap using FITS.""" assert isinstance(suvi, SUVIMap) def test_is_datasource_for(suvi): """Test the is_datasource_for method of SUVIMap. Note that header data to be provided as an argument can be a MetaDict object.""" assert suvi.is_datasource_for(suvi.data, suvi.meta) def test_observatory(suvi): """Tests the observatory property of the SUVIMap object.""" assert suvi.observatory == "GOES-R" def test_detector(suvi): """Tests the detector property of the SUVIMap object.""" assert suvi.detector == "SUVI" def test_norm_clip(suvi): # Tests that the default normalizer has clipping disabled assert not suvi.plot_settings['norm'].clip # SUVI provides observer coordinate information in an OBSGEO system, so this test # needs remote data to access the latest IERS table to do a coordiante transformation from # OBSGEO to heliographic Stonyhurst coordiantes. @pytest.mark.remote_data def test_wcs(suvi): # Smoke test that WCS is valid and can transform from pixels to world coordinates suvi.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_swap_source.py0000644000175100001710000000255000000000000022451 0ustar00vstsdocker"""Test cases for PROBA2 Map subclasses. This particular test file pertains to SWAPMap. @Author: Pritish C. (VaticanCameos) """ import os import glob import pytest import astropy.units as u import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.proba2 import SWAPMap 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 def test_wcs(createSWAP): # Smoke test that WCS is valid and can transform from pixels to world coordinates createSWAP.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_trace_source.py0000644000175100001710000000277300000000000022604 0ustar00vstsdockerimport os import pytest import astropy.units as u import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.trace import TRACEMap from sunpy.util.exceptions import SunpyMetadataWarning path = sunpy.data.test.rootdir fitspath = os.path.join(path, "tsi20010130_025823_a2.fits") @pytest.fixture(scope="module") def createTRACE(): """Creates a TRACEMap from a FITS file.""" return Map(fitspath) # TRACE Tests def test_fitstoTRACE(createTRACE): """Tests the creation of TRACEMap using FITS.""" assert isinstance(createTRACE, TRACEMap) def test_is_datasource_for(createTRACE): """Test the is_datasource_for method of TRACEMap. Note that header data to be provided as an argument can be a MetaDict object.""" assert createTRACE.is_datasource_for(createTRACE.data, createTRACE.meta) def test_measurement(createTRACE): """Tests the measurement property of the TRACEMap object.""" assert int(createTRACE.measurement) == 171 def test_observatory(createTRACE): """Tests the observatory property of the TRACEMap object.""" assert createTRACE.observatory == "TRACE" def test_norm_clip(createTRACE): # Tests that the default normalizer has clipping disabled assert not createTRACE.plot_settings['norm'].clip def test_wcs(createTRACE): # Smoke test that WCS is valid and can transform from pixels to world coordinates with pytest.warns(SunpyMetadataWarning, match='Missing metadata for observer'): createTRACE.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_wispr_source.py0000644000175100001710000002627200000000000022652 0ustar00vstsdocker"""Tests for PSP/WISPR""" from textwrap import dedent import numpy as np import pytest import astropy.units as u from astropy.coordinates import SkyCoord from astropy.io import fits from sunpy.map import Map from sunpy.map.sources import WISPRMap @pytest.fixture def wispr_map(scope="module"): # Please do not edit this header, it is a 1:1 copy of a SOLO EUI FSI 304 map raw_header = dedent("""\ SIMPLE = T / Written by IDL: Wed Sep 9 14:48:00 2020 BITPIX = 32 / 32-bit twos complement binary integer NAXIS = 2 / NAXIS1 = 960 / NAXIS2 = 1024 / FILENAME= 'psp_L1_wispr_20200125T000229_V1_2302.fits' / FILE_RAW= 'CmpB.12EE4DE3' / APID = '41b ' / DATE = '2020-09-09T18:47:59.761' / DATE-OBS= '2020-01-25T00:02:29.618' / DATE-BEG= '2020-01-25T00:02:29.618' / DATE-AVG= '2020-01-25T00:08:20.842' / DATE-END= '2020-01-25T00:14:12.067' / OBT_BEG = 317606692.959 / OBT_END = 317607252.950 / NSUMEXP = 5 / NSUMBAD = 0 / XPOSURE = 700.000 / IP_TIMET= 139 / READTIME= 2.45760 / TELAPSE = 702.449 / TIMESYS = 'UTC ' / LEVEL = 'L1 ' / CREATOR = 'wispr_reduce.pro,v 1.63' / ORIGIN = 'NRL ' / DETECTOR= 2 / REGION = 2 / READOUT0= 3 / CAMERA = 'FMCFMD ' / CICUCODE= '129 ' / DRBUCODE= '130 ' / DRB1UCOD= '130 ' / DRB2UCOD= '130 ' / OBJECT = 'OuterFFV' / OBS_MODE= 'SYNOPTIC' / TARGET = 'VexpOuterL.os' / TIMELINE= '584,0x1a050' / STUDY_ID= 742 / STUDYCNT= 1 / VERS_CAL= '5; 57 ' / PRIORITY= 1 / VERSION = 1 / FINAL = T / BSCALE = 1.00000 / BZERO = 0.00000 / BUNIT = 'DN ' / DATAMIN = 856.000 / Minimum Value Not Equal to Zero before BSCALE DATAMAX = 249069. / Maximum Value before BSCALE BLANK = 61166 / PXBEG1 = 1 / PXEND1 = 2048 / PXBEG2 = 1 / PXEND2 = 1920 / R1COL = 1 / R2COL = 1920 / R1ROW = 1 / R2ROW = 2048 / RECTIFY = T / RECTROTA= 6 / NBIN1 = 2 / NBIN2 = 2 / NBIN = 4.00000 / COMPRESS= 'Lossless' / COMP_RAT= 0.675516 / COSMICR = T / DSTART1 = 1 / DSTOP1 = 955 / DSTART2 = 1 / DSTOP2 = 1019 / IMGCTR = 8151 / CCIMGSEQ= 2505 / CCEXPCTL= 999 / CCIMGCTR= 15 / COSMICS = 35210 / CAMSATPX= 0 / CAMSTRVX= 18638 / IP_INIT = 2 / IPIMBUFF= 30840 / IPCMBUFF= 320 / IPSATPX = 16000 / IPSTRVPX= 300 / IPMINPX = 0 / IPMAXPX = 16383 / IPTRUNC = 0 / IPBIAS = 2 / IPCRSMUL= 4.00000 / IPBITSPP= 19 / IPMASK = 0 / IPMASKCR= '144,879,0,959' / LEDSTATE= 'Off ' / LEDDAC = 0 / OFFSET = 2256 / GAINCMD = 12 / GAINMODE= 'HIGH ' / IP_FUNC = 16584 / IPCMPCTL= 305 / XFBYTES = 1577140 / SCFLAGS = '0x0015ff3e' / CIE_T = -39.9500 / DRB1_T = -39.3083 / DET1_T = -70.9754 / DRB2_T = -39.0940 / DET2_T = -70.9950 / ISPREG0 = 28 / ISPREG1 = 61166 / ISPREG2 = 61166 / ISPREG3 = 61166 / ISPREG4 = 61166 / ISPREG5 = 61166 / ISPREG6 = 825 / ISPREG7 = 742 / UCODREG0= 61166 / UCODREG1= 128 / UCODREG2= 0 / UCODREG3= 0 / UCODREG4= 1920 / UCODREG5= 61166 / UCODREG6= 61166 / UCODREG7= 61166 / DSUN_OBS= 31678123000.0 / SC_YAW = 0.0127380 / SC_PITCH= -0.000853018 / SC_ROLL = -3.83791 / DATAZER = 0 / Number of Zero Pixels DATASAT = 0 / Number of Saturated Pixels DSATVAL = 524287 / Value used as saturated DATAAVG = 107440. / Between 0 and DSATVAL DATAMDN = 96257.0 / Between 0 and DSATVAL DATASIG = 43882.8 / Between 0 and DSATVAL DATAP01 = 5409 / DATAP10 = 63754 / DATAP25 = 77544 / DATAP50 = 96257 / DATAP75 = 128137 / DATAP90 = 171321 / DATAP95 = 200730 / DATAP98 = 230366 / DATAP99 = 237914 / OBSRVTRY= 'Parker Solar Probe' / INSTRUME= 'WISPR ' / WCSNAME = 'Helioprojective Zenith Polynomial' / CTYPE1 = 'HPLN-ZPN' / CTYPE2 = 'HPLT-ZPN' / CUNIT1 = 'deg ' / CUNIT2 = 'deg ' / CRPIX1 = 492.333 / CRPIX2 = 513.174 / PC1_1 = 0.998328091852 / PC1_2 = 0.0578015658869 / PC2_1 = -0.0578015658869 / PC2_2 = 0.998328091852 / CDELT1 = 0.0570821 / CDELT2 = 0.0570821 / CRVAL1 = 76.6509814623 / CRVAL2 = -13.2570275339 / ATT_FILE= 'spp_2020_025_02.ah.bc' / PV1_1 = 0.00000000000 / PV1_2 = 90.0000000000 / PV1_3 = 180.000000000 / PV2_0 = -0.000429731007898 / PV2_1 = 1.01042997837 / PV2_2 = -0.0547256991267 / PV2_3 = 0.0849808976054 / PV2_4 = -0.175265997648 / PV2_5 = 0.0547404997051 / LONPOLE = 180.000000000 / LATPOLE = 0.00000000000 / CTYPE1A = 'RA---ZPN' / CTYPE2A = 'DEC--ZPN' / CUNIT1A = 'deg ' / CUNIT2A = 'deg ' / PC1_1A = 0.932533562542 / PC1_2A = -0.361083307193 / PC2_1A = 0.361083307193 / PC2_2A = 0.932533562542 / CRPIX1A = 492.333 / CRPIX2A = 513.174 / CRVAL1A = 170.519696093 / CRVAL2A = -2.59678257890 / CDELT1A = -0.0570821 / CDELT2A = 0.0570821 / PV1_1A = 0.00000000000 / PV1_2A = 90.0000000000 / PV1_3A = 180.000000000 / PV2_0A = -0.000429731007898 / PV2_1A = 1.01042997837 / PV2_2A = -0.0547256991267 / PV2_3A = 0.0849808976054 / PV2_4A = -0.175265997648 / PV2_5A = 0.0547404997051 / LONPOLEA= 180.000000000 / LATPOLEA= 0.00000000000 / RSUN_ARC= 4524.67854698 / RSUN_REF= 695507968.000 / SOLAR_EP= 15.9285776205 / CAR_ROT = 2226 / HGLT_OBS= 0.390715276104 / HGLN_OBS= -54.7633009507 / CRLT_OBS= 0.390715276104 / CRLN_OBS= 59.8905844055 / HEEX_OBS= 18187298676.0 / HEEY_OBS= -25963488915.7 / HEEZ_OBS= -241652330.942 / HCIX_OBS= 31492170156.9 / HCIY_OBS= -3624289322.90 / HCIZ_OBS= 216174389.143 / HCIX_VOB= -38361.9314129 / HCIY_VOB= 71493.5202110 / HCIZ_VOB= -4786.08742968 / HAEX_OBS= 11254842547.2 / HAEY_OBS= 29634581727.6 / HAEZ_OBS= -243044691.612 / HEQX_OBS= 18289512873.5 / HEQY_OBS= -25891812859.2 / HEQZ_OBS= 216174389.143 / EAR_TIME= 383.108719220 / SUN_TIME= 105.742395411 / HISTORY make_wispr_hdr.pro,v 1.57 HISTORY wincs-gse.nrl.navy.mil HISTORY FSW version 932 HISTORY wispr_reduce.pro,v 1.63 HISTORY wispr_readrawsci.pro,v 1.17 HISTORY Id: get_wispr_pointing.pro,v 1.29 2020/06/02 19:29:24 nathan Exp """) header = fits.Header.fromstring(raw_header, sep='\n') data = np.random.rand(header['naxis1'], header['naxis2']) return Map(data, header) def test_WISPRMap(wispr_map): assert isinstance(wispr_map, WISPRMap) def test_is_datasource_for(wispr_map): assert wispr_map.is_datasource_for(wispr_map.data, wispr_map.meta) def test_observer_coordinate(wispr_map): obs_coord = wispr_map.observer_coordinate assert isinstance(obs_coord, SkyCoord) assert obs_coord.obstime.isot == wispr_map.meta['date-obs'] def test_observatory(wispr_map): assert wispr_map.observatory == "Parker Solar Probe" def test_measurement(wispr_map): assert wispr_map.measurement is None def test_wavelength(wispr_map): assert wispr_map.wavelength is None def test_exposure_time(wispr_map): assert wispr_map.exposure_time == u.Quantity(700, 's') def test_level_number(wispr_map): assert wispr_map.processing_level == 1 def test_detector(wispr_map): assert wispr_map.detector == 2 def test_unit(wispr_map): assert wispr_map.unit == u.Unit('ct') def test_norm_clip(wispr_map): # Tests that the default normalizer has clipping disabled assert not wispr_map.plot_settings['norm'].clip def test_name(wispr_map): assert wispr_map.name == 'WISPR 2 2020-01-25 00:02:29' def test_wcs(wispr_map): # Smoke test that WCS is valid and can transform from pixels to world coordinates wispr_map.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/tests/test_xrt_source.py0000644000175100001710000000372300000000000022317 0ustar00vstsdocker"""Test cases for HINODE Map subclasses. This particular test file pertains to XRTMap. @Author: Pritish C. (VaticanCameos) """ import os import glob import pytest import astropy.units as u from astropy.utils.exceptions import AstropyUserWarning import sunpy.data.test from sunpy.map import Map from sunpy.map.sources.hinode import XRTMap from sunpy.util.exceptions import SunpyMetadataWarning @pytest.fixture def xrt(): path = sunpy.data.test.rootdir fitspath = glob.glob(os.path.join(path, "HinodeXRT.fits")) with pytest.warns(AstropyUserWarning, match='File may have been truncated'): return Map(fitspath) # XRT Tests def test_fitstoXRT(xrt): """Tests the creation of XRTMap using FITS.""" assert isinstance(xrt, XRTMap) def test_is_datasource_for(xrt): """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(xrt): """Tests the observatory property of the XRTMap object.""" assert xrt.observatory == "Hinode" def test_measurement(xrt): """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(xrt): """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"]) def test_wcs(xrt): # Smoke test that WCS is valid and can transform from pixels to world coordinates with pytest.warns(SunpyMetadataWarning, match='Missing metadata for observer'): xrt.pixel_to_world(0*u.pix, 0*u.pix) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/trace.py0000644000175100001710000000604200000000000017014 0ustar00vstsdocker"""TRACE Map subclass definitions""" __author__ = "Jack Ireland" __email__ = "jack.ireland@nasa.gov" import astropy.units as u from astropy.visualization import LogStretch from astropy.visualization.mpl_normalize import ImageNormalize from sunpy.map.mapbase import GenericMap, SpatialPair 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): super().__init__(data, header, **kwargs) self._nickname = self.detector # Colour maps self.plot_settings['cmap'] = 'trace' + str(self.meta['WAVE_LEN']) self.plot_settings['norm'] = ImageNormalize( stretch=source_stretch(self.meta, LogStretch()), clip=False) @property def spatial_units(self): """ If not present in CUNIT{1,2} keywords, defaults to arcsec. """ return SpatialPair(u.Unit(self.meta.get('cunit1', 'arcsec')), u.Unit(self.meta.get('cunit2', 'arcsec'))) @property def observatory(self): return "TRACE" @property def detector(self): return "TRACE" @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): s = self.meta['WAVE_LEN'] if s == 'WL': s = 'white-light' return s ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/sources/yohkoh.py0000644000175100001710000000642600000000000017225 0ustar00vstsdocker"""Yohkoh SXT Map subclass definitions""" __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.map.sources.source_type import source_stretch from sunpy.sun import constants __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): super().__init__(data, header, **kwargs) self.plot_settings['cmap'] = 'yohkohsxt' + self.measurement[0:2].lower() self.plot_settings['norm'] = ImageNormalize( stretch=source_stretch(self.meta, PowerStretch(0.5)), clip=False) @property def observatory(self): return "Yohkoh" @property def detector(self): return "SXT" @property def dsun(self): """ For Yohkoh Maps, DSUN_OBS is not always defined. In this case the SOLAR_R keyword is used to calculate dsun. """ # 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. if 'solar_r' in self.meta: dsun = constants.radius / (np.deg2rad(self.meta['solar_r'] / 3600.0)) else: dsun = constants.au return self.meta.get('dsun_obs', dsun) @property def measurement(self): s = self.meta.get('wavelnth', '') if s == 'Al.1': s = 'Al01' elif s.lower() == 'open': s = 'white-light' return s @property def wavelength(self): """ Returns `None`, as SXT is a broadband imager. """ @classmethod def is_datasource_for(cls, data, header, **kwargs): """Determines if header corresponds to an SXT image""" return header.get('instrume') == 'SXT' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6332753 sunpy-3.1.5/sunpy/map/tests/0000755000175100001710000000000000000000000015021 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/tests/__init__.py0000644000175100001710000000000000000000000017120 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/tests/conftest.py0000644000175100001710000001037400000000000017225 0ustar00vstsdockerimport numpy as np import pytest import astropy.units as u from astropy.coordinates import SkyCoord from astropy.time import Time import sunpy.coordinates import sunpy.data.test import sunpy.io import sunpy.map import sunpy.sun from sunpy.coordinates import sun testpath = sunpy.data.test.rootdir @pytest.fixture def test_map(request): return request.getfixturevalue(request.param) @pytest.fixture def hmi_test_map(): (data, header), = sunpy.io.read_file(testpath / 'resampled_hmi.fits') # Get rid of the blank keyword to prevent some astropy fits fixing warnings header.pop('BLANK') header.pop('CRDER2') header.pop('CRDER1') return sunpy.map.Map((data, header)) @pytest.fixture def aia171_test_map(): (data, header), = sunpy.io.read_file(testpath / 'aia_171_level1.fits') # Get rid of the blank keyword to prevent some astropy fits fixing warnings header.pop('BLANK') return sunpy.map.Map((data, header)) @pytest.fixture def aia171_roll_map(aia171_test_map): return aia171_test_map.rotate(-45*u.deg) @pytest.fixture def heliographic_test_map(): (data, header), = sunpy.io.read_file(testpath / 'heliographic_phase_map.fits.gz') # Fix unit strings to prevent some astropy fits fixing warnings header['CUNIT1'] = 'deg' header['CUNIT2'] = 'deg' # Set observer location to avoid warnings later header['HGLN_OBS'] = 0.0 return sunpy.map.Map((data, header)) @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) dobs = Time('1970-01-01T00:00:00') l0 = sun.L0(dobs).to_value(u.deg) b0 = sun.B0(dobs).to_value(u.deg) dsun = sun.earth_distance(dobs).to_value(u.m) header = { 'CRVAL1': 0, 'CRVAL2': 0, 'CRPIX1': 5, 'CRPIX2': 5, 'CDELT1': 10, 'CDELT2': 10, 'CUNIT1': 'arcsec', 'CUNIT2': 'arcsec', 'CTYPE1': 'HPLN-TAN', 'CTYPE2': 'HPLT-TAN', 'PC1_1': 0, 'PC1_2': -1, 'PC2_1': 1, 'PC2_2': 0, 'NAXIS1': 6, 'NAXIS2': 6, 'date-obs': dobs.isot, 'crln_obs': l0, 'crlt_obs': b0, "dsun_obs": dsun, 'mjd-obs': 40587.0, 'obsrvtry': 'Foo', 'detector': 'bar', 'wavelnth': 10, 'waveunit': 'm', 'bunit': 'ct/s', } return sunpy.map.Map((data, header)) def make_simple_map(): # A 3x3 map, with it's center at (0, 0), and scaled differently in # each direction data = np.arange(9).reshape((3, 3)) ref_coord = SkyCoord(0.0, 0.0, frame='helioprojective', obstime='now', unit='deg', observer=SkyCoord(0 * u.deg, 0 * u.deg, 1 * u.AU, frame='heliographic_stonyhurst')) ref_pix = [1, 1] * u.pix scale = [2, 1] * u.arcsec / u.pix header = sunpy.map.make_fitswcs_header(data, ref_coord, reference_pixel=ref_pix, scale=scale) return sunpy.map.Map(data, header) simple_map = pytest.fixture(make_simple_map) @pytest.fixture def carrington_map(): # This is a 20 x 20 map in a Carrington frame, with the reference pixel *not* at the # equator. This results in a non-linear transformation between pixel and world # coordinates, so is ideal for testing situations where the non-linearity matters data = np.arange(20**2).reshape((20, 20)) obstime = '2020-01-01' observer = SkyCoord(0*u.deg, 0*u.deg, frame='heliographic_stonyhurst', obstime=obstime) ref_coord = SkyCoord(120*u.deg, -70*u.deg, frame='heliographic_carrington', obstime=obstime, observer=observer) ref_pix = [0, 0] * u.pix scale = [2, 1] * u.deg / u.pix header = sunpy.map.make_fitswcs_header(data, ref_coord, reference_pixel=ref_pix, scale=scale) return sunpy.map.Map(data, header) @pytest.fixture def eit_test_map(): """ Load SunPy's test EIT image. """ eit_file = testpath / "EIT" / "efz20040301.020010_s.fits" return sunpy.map.Map(eit_file) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/tests/strategies.py0000644000175100001710000000123300000000000017544 0ustar00vstsdockerimport hypothesis.strategies as st import numpy as np from hypothesis import assume from hypothesis.extra.numpy import arrays @st.composite def matrix_meta(draw, key): """ Create an arbitrary but valid (ie non-singular) PCi_j or CDi_j matrix. Parameters ---------- key : {'pc', 'cd'} """ arr = draw(arrays( float, (2, 2), elements=st.floats(min_value=-1, max_value=1, allow_nan=False)) ) # Make sure matrix isn't singular assume(np.abs(np.linalg.det(arr)) > 1e-8) return {f'{key}1_1': arr[0, 0], f'{key}1_2': arr[0, 1], f'{key}2_1': arr[1, 0], f'{key}2_2': arr[1, 1]} ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/tests/test_compositemap.py0000644000175100001710000001121100000000000021126 0ustar00vstsdocker""" Test Composite Map """ import numpy as np import pytest import astropy.units as u from astropy.tests.helper import assert_quantity_allclose import sunpy.data.test import sunpy.map from sunpy.tests.helpers import figure_test # Ignore missing metadata warnings pytestmark = [pytest.mark.filterwarnings('ignore:Missing metadata for observer'), pytest.mark.filterwarnings(r'ignore:Unable to treat `\.meta` as a FITS header')] @pytest.fixture def composite_test_map(aia171_test_map, hmi_test_map): # The test maps have wildly different observation times, which throws off compositing hmi_test_map.meta['date-obs'] = aia171_test_map.meta['date-obs'] # Also set the HMI observer location to be the same as the AIA observer location del hmi_test_map.meta['crln_obs'] del hmi_test_map.meta['crlt_obs'] hmi_test_map.meta['hgln_obs'] = aia171_test_map.observer_coordinate.lon.to_value('deg') hmi_test_map.meta['hglt_obs'] = aia171_test_map.observer_coordinate.lat.to_value('deg') return sunpy.map.Map(aia171_test_map, hmi_test_map, composite=True) def test_type_of_arguments_composite_map(composite_test_map): with pytest.raises(ValueError) as excinfo: sunpy.map.CompositeMap(23, composite=True) assert str(excinfo.value) == 'CompositeMap expects pre-constructed map objects.' @figure_test def test_plot_composite_map(composite_test_map): composite_test_map.plot() @figure_test def test_plot_composite_map_contours(composite_test_map): composite_test_map.set_levels(1, np.arange(-75, 76, 25) << u.percent) composite_test_map.plot() @figure_test def test_plot_composite_map_linewidths(composite_test_map): composite_test_map.set_levels(1, np.arange(-75, 76, 25) << u.percent) composite_test_map.plot(linewidths=0.5) @figure_test def test_plot_composite_map_linestyles(composite_test_map): composite_test_map.set_levels(1, np.arange(-75, 76, 25) << u.percent) composite_test_map.plot(linestyles='--') @figure_test def test_plot_composite_map_colors(composite_test_map): composite_test_map.set_levels(1, np.arange(-75, 76, 25) << u.percent) composite_test_map.plot(colors='red') def test_plot_composite_map_mplkwargs(composite_test_map): composite_test_map.set_levels(1, np.arange(-75, 76, 25) << u.percent) with pytest.raises(TypeError) as e: composite_test_map.plot(linestyles='--', unused_a=1, unused_b=2) assert 'plot() got unexpected keyword arguments' in str(e.value) assert 'unused_a' in str(e.value) assert 'unused_b' in str(e.value) assert 'linestyles' not in str(e.value) def test_remove_composite_map(composite_test_map): composite_test_map.remove_map(0) with pytest.raises(IndexError): composite_test_map.get_map(1) def test_get_composite_map(composite_test_map, aia171_test_map, hmi_test_map): assert composite_test_map.get_map(0) == aia171_test_map assert composite_test_map.get_map(1) == hmi_test_map def test_get_alpha_composite_map(composite_test_map, aia171_test_map, hmi_test_map): assert composite_test_map.get_alpha() == [aia171_test_map.alpha, hmi_test_map.alpha] def test_get_alpha_with_index_composite_map(composite_test_map, aia171_test_map, hmi_test_map): assert composite_test_map.get_alpha(0) == aia171_test_map.alpha assert composite_test_map.get_alpha(1) == hmi_test_map.alpha def test_get_levels_composite_map(composite_test_map, aia171_test_map, hmi_test_map): assert composite_test_map.get_levels() == [aia171_test_map.levels, hmi_test_map.levels] def test_get_levels_with_index_composite_map(composite_test_map, aia171_test_map, hmi_test_map): assert composite_test_map.get_levels(0) == aia171_test_map.levels assert composite_test_map.get_levels(1) == hmi_test_map.levels @figure_test def test_set_alpha_composite_map(composite_test_map): composite_test_map.set_alpha(1, 0.5) composite_test_map.plot() def test_set_alpha_out_of_range_composite_map(composite_test_map): with pytest.raises(Exception) as excinfo: composite_test_map.set_alpha(0, 5.0) composite_test_map.set_alpha(1, -3.0) assert str(excinfo.value) == 'Alpha value must be between 0 and 1.' def test_set_levels_percent(composite_test_map): numbers = np.arange(10, 100, 10) composite_test_map.set_levels(0, numbers) np.testing.assert_allclose(composite_test_map.get_levels(0), numbers) implicit_percentage = np.arange(10, 100, 10) composite_test_map.set_levels(0, implicit_percentage, percent=True) assert_quantity_allclose(composite_test_map.get_levels(0), implicit_percentage << u.percent) @figure_test def test_peek_composite_map(composite_test_map): composite_test_map.peek() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/tests/test_header.py0000644000175100001710000000211400000000000017660 0ustar00vstsdocker 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 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/tests/test_header_helper.py0000644000175100001710000001542100000000000021224 0ustar00vstsdockerimport numpy as np import pytest import astropy.units as u from astropy.coordinates import SkyCoord from astropy.wcs import WCS import sunpy.map from sunpy.coordinates import frames, sun from sunpy.map import make_fitswcs_header from sunpy.util.metadata import MetaDict @pytest.fixture def map_data(): return np.random.rand(20, 10) @pytest.fixture def hpc_coord(): return SkyCoord(0*u.arcsec, 100*u.arcsec, observer='earth', rsun=7.1e8*u.m, obstime='2013-10-28 00:00', frame=frames.Helioprojective) @pytest.fixture def hgc_coord(): return SkyCoord(70*u.deg, -30*u.deg, 1.5*u.AU, observer='self', rsun=7.2e8*u.m, obstime='2013-10-28 00:00', frame=frames.HeliographicCarrington) @pytest.fixture def hgs_coord(): return SkyCoord(-50*u.deg, 50*u.deg, rsun=7.3e8*u.m, obstime='2013-10-28 00:00', frame=frames.HeliographicStonyhurst) @pytest.fixture def hcc_coord(): return SkyCoord(-72241*u.km, 361206.1*u.km, 589951.4*u.km, observer='earth', obstime='2013-10-28 00:00', frame=frames.Heliocentric) @pytest.fixture def hpc_header(map_data, hpc_coord): return make_fitswcs_header(map_data, hpc_coord) @pytest.fixture def hgc_header(map_data, hgc_coord): return make_fitswcs_header(map_data, hgc_coord, projection_code='CAR') @pytest.fixture def hgs_header(map_data, hgs_coord): return make_fitswcs_header(map_data, hgs_coord, projection_code='CAR') @pytest.fixture def hpc_coord_notime(): return SkyCoord(0*u.arcsec, 0*u.arcsec, frame=frames.Helioprojective) def test_metakeywords(): meta = sunpy.map.meta_keywords() assert isinstance(meta, dict) def test_deafult_rotation(map_data, hpc_coord): header = make_fitswcs_header(map_data, hpc_coord) wcs = WCS(header) np.testing.assert_allclose(wcs.wcs.pc, [[1, 0], [0, 1]], atol=1e-5) def test_rotation_angle(map_data, hpc_coord): header = make_fitswcs_header(map_data, hpc_coord, rotation_angle=90*u.deg) wcs = WCS(header) np.testing.assert_allclose(wcs.wcs.pc, [[0, -1], [1, 0]], atol=1e-5) def test_rotation_matrix(map_data, hpc_coord): header = make_fitswcs_header(map_data, hpc_coord, rotation_matrix=np.array([[1, 0], [0, 1]])) wcs = WCS(header) np.testing.assert_allclose(wcs.wcs.pc, [[1, 0], [0, 1]], atol=1e-5) def test_hpc_header(hpc_header, hpc_coord): assert isinstance(hpc_header, MetaDict) assert hpc_header['naxis1'] == 10 assert hpc_header['naxis2'] == 20 assert hpc_header['crval1'] == 0 assert hpc_header['crpix1'] == 5.5 assert hpc_header['ctype1'] == 'HPLN-TAN' assert hpc_header['crval2'] == 100. assert hpc_header['crpix2'] == 10.5 assert hpc_header['ctype2'] == 'HPLT-TAN' assert hpc_header['lonpole'] == 180. assert u.allclose(hpc_header['rsun_ref'] * u.m, hpc_coord.rsun) # Check for observer info for HPC assert u.allclose(hpc_header['hgln_obs'] * u.deg, hpc_coord.observer.lon) assert u.allclose(hpc_header['hglt_obs'] * u.deg, hpc_coord.observer.lat) assert u.allclose(hpc_header['dsun_obs'] * u.m, hpc_coord.observer.radius) assert u.allclose(hpc_header['rsun_obs'] * u.arcsec, sun._angular_radius(hpc_coord.rsun, hpc_coord.observer.radius)) assert isinstance(WCS(hpc_header), WCS) def test_hgc_header(hgc_header, hgc_coord): assert isinstance(hgc_header, MetaDict) assert hgc_header['naxis1'] == 10 assert hgc_header['naxis2'] == 20 assert hgc_header['crval1'] == 70 assert hgc_header['crpix1'] == 5.5 assert hgc_header['ctype1'] == "CRLN-CAR" assert hgc_header['crval2'] == -30 assert hgc_header['crpix2'] == 10.5 assert hgc_header['ctype2'] == "CRLT-CAR" assert hgc_header['cunit1'] == "deg" assert hgc_header['cunit2'] == "deg" assert hgc_header['lonpole'] == 180. # for negative reference latitude in a CAR projection assert u.allclose(hgc_header['rsun_ref'] * u.m, hgc_coord.rsun) # Check for observer info for HGC (which is set to "self") assert u.allclose(hgc_header['crln_obs'] * u.deg, hgc_coord.lon) assert u.allclose(hgc_header['crlt_obs'] * u.deg, hgc_coord.lat) assert u.allclose(hgc_header['dsun_obs'] * u.m, hgc_coord.radius) assert u.allclose(hgc_header['rsun_obs'] * u.arcsec, sun._angular_radius(hgc_coord.rsun, hgc_coord.radius)) assert isinstance(WCS(hgc_header), WCS) def test_hgs_header(hgs_header, hgs_coord): assert isinstance(hgs_header, MetaDict) assert hgs_header['naxis1'] == 10 assert hgs_header['naxis2'] == 20 assert hgs_header['crval1'] == -50 assert hgs_header['crpix1'] == 5.5 assert hgs_header['ctype1'] == "HGLN-CAR" assert hgs_header['crval2'] == 50 assert hgs_header['crpix2'] == 10.5 assert hgs_header['ctype2'] == "HGLT-CAR" assert hgs_header['cunit1'] == "deg" assert hgs_header['cunit2'] == "deg" assert hgs_header['lonpole'] == 0. # for positive reference latitude in a CAR projection assert u.allclose(hgs_header['rsun_ref'] * u.m, hgs_coord.rsun) # Check no observer info for HGS assert "hgln_obs" not in hgs_header assert "hglt_obs" not in hgs_header assert 'dsun_obs' not in hgs_header assert 'rsun_obs' not in hgs_header assert isinstance(WCS(hgs_header), WCS) def test_instrument_keyword(map_data, hpc_coord): header = make_fitswcs_header(map_data, hpc_coord, instrument='test name') assert header['instrume'] == 'test name' # Check returned MetaDict will make a `sunpy.map.Map` map_test = sunpy.map.Map(map_data, header) assert isinstance(map_test, sunpy.map.mapbase.GenericMap) def test_invalid_inputs(map_data, hcc_coord, hpc_coord_notime, hpc_coord): # Raise the HCC error with pytest.raises(ValueError): make_fitswcs_header(map_data, hcc_coord) # Check for when coordinate argument isn't given as an `astropy.coordinate.SkyCoord` with pytest.raises(ValueError): make_fitswcs_header(map_data, map_data) # Check for when an observation time isn't given with pytest.raises(ValueError): make_fitswcs_header(map_data, hpc_coord_notime) # Check arguments not given as astropy Quantities with pytest.raises(TypeError): header = make_fitswcs_header(map_data, hpc_coord, reference_pixel=[0, 0]) header = make_fitswcs_header(map_data, hpc_coord, scale=[0, 0]) # Check arguments of reference_pixel and scale have to be given in astropy units of pix, and arcsec/pix with pytest.raises(u.UnitsError): header = make_fitswcs_header(map_data, hpc_coord, reference_pixel=u.Quantity([0, 0])) header = make_fitswcs_header(map_data, hpc_coord, scale=u.Quantity([0, 0])) header = make_fitswcs_header(map_data, hpc_coord, scale=u.Quantity([0, 0]*u.arcsec)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/tests/test_map_factory.py0000644000175100001710000002753300000000000020750 0ustar00vstsdocker""" Created on Fri Jun 21 15:05:09 2013 @author: stuart """ import os import pathlib import tempfile import numpy as np import pytest from astropy.io import fits from astropy.wcs import WCS import sunpy import sunpy.data.test import sunpy.map from sunpy.util.exceptions import NoMapsInFileError, SunpyMetadataWarning, SunpyUserWarning filepath = pathlib.Path(sunpy.data.test.rootdir) a_list_of_many = [os.fspath(f) for f in pathlib.Path(filepath, "EIT").glob("*")] 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') amap = sunpy.map.Map(AIA_171_IMAGE) valid_map_inputs = [(a_fname, ), (pathlib.Path(a_fname), ), (filepath / "EIT", ), (os.fspath(filepath / "EIT"), ), (filepath / "EIT" / "*", ), (amap, ), (amap.data, amap.meta), ((amap.data, amap.meta), ), ] @pytest.mark.parametrize('args1', valid_map_inputs) @pytest.mark.parametrize('args2', valid_map_inputs) def test_two_map_inputs(args1, args2): out = sunpy.map.Map(*args1, *args2) if isinstance(out, list): for m in out: assert isinstance(m, sunpy.map.GenericMap) else: assert isinstance(out, sunpy.map.GenericMap) # ============================================================================== # Map Factory Tests # ============================================================================== class TestMap: def test_mapsequence(self): # Test making a MapSequence sequence = sunpy.map.Map(a_list_of_many, sequence=True) assert isinstance(sequence, sunpy.map.MapSequence) def test_mapsequence_sortby(self): # Test making a MapSequence with sortby kwarg sequence = sunpy.map.Map(a_list_of_many, sequence=True, sortby=None) assert isinstance(sequence, sunpy.map.MapSequence) 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) # Want to check that patterns work, so ignore this warning that comes from # the AIA test data @pytest.mark.filterwarnings("ignore:Invalid 'BLANK' keyword in header") def test_patterns(self): # Test different Map pattern matching # File name eitmap = sunpy.map.Map(a_fname) assert isinstance(eitmap, sunpy.map.GenericMap) # Directory directory = pathlib.Path(filepath, "EIT") maps = sunpy.map.Map(os.fspath(directory)) assert isinstance(maps, list) assert ([isinstance(amap, sunpy.map.GenericMap) for amap in maps]) # Test that returned maps are sorted files_sorted = sorted(list(directory.glob('*'))) maps_sorted = [sunpy.map.Map(os.fspath(f)) for f in files_sorted] assert all([m.date == m_s.date for m, m_s in zip(maps, maps_sorted)]) # Pathlib path = pathlib.Path(a_fname) eitmap = sunpy.map.Map(path) assert isinstance(eitmap, sunpy.map.GenericMap) maps = sunpy.map.Map(directory) assert isinstance(maps, list) assert ([isinstance(amap, sunpy.map.GenericMap) for amap in maps]) # Glob pattern = os.path.join(filepath, "EIT", "*") maps = sunpy.map.Map(pattern) assert isinstance(maps, list) assert ([isinstance(amap, sunpy.map.GenericMap) for amap in maps]) # Test that returned maps are sorted files_sorted = sorted(list(pathlib.Path(pattern).parent.glob('*'))) maps_sorted = [sunpy.map.Map(os.fspath(f)) for f in files_sorted] assert all([m.date == m_s.date for m, m_s in zip(maps, maps_sorted)]) # Single character wildcard (?) pattern = os.path.join(filepath, "EIT", "efz20040301.0?0010_s.fits") maps = sunpy.map.Map(pattern) assert isinstance(maps, list) assert len(maps) == 7 assert ([isinstance(amap, sunpy.map.GenericMap) for amap in maps]) # Character ranges pattern = os.path.join(filepath, "EIT", "efz20040301.0[2-6]0010_s.fits") maps = sunpy.map.Map(pattern) assert isinstance(maps, list) assert len(maps) == 4 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-wcs object pair in tuple pair_map = sunpy.map.Map((amap.data, WCS(AIA_171_IMAGE))) assert isinstance(pair_map, sunpy.map.GenericMap) # Data-wcs object pair not in a tuple pair_map = sunpy.map.Map(amap.data, WCS(AIA_171_IMAGE)) 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, pair_map = sunpy.map.Map(((data, header), (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', 'cunit1': 'arcsec', 'cunit2': 'arcsec'} with pytest.warns(SunpyMetadataWarning, match='Missing CTYPE1 from metadata, assuming CTYPE1 is HPLN-TAN'): pair_map = sunpy.map.Map(data, header) assert isinstance(pair_map, sunpy.map.GenericMap) # Common keys not strings data = np.arange(0, 100).reshape(10, 10) header = {'cdelt1': 10, 'cdelt2': 10, 'telescop': 100, 'detector': 1, 'instrume': 50, 'cunit1': 'arcsec', 'cunit2': 'arcsec'} with pytest.warns(SunpyMetadataWarning, match='Missing CTYPE1 from metadata, assuming CTYPE1 is HPLN-TAN'): pair_map = sunpy.map.Map(data, header) assert isinstance(pair_map, sunpy.map.GenericMap) def test_errors(self, tmpdir): # If directory doesn't exist, make sure it's listed in the error msg nonexist_dir = 'nonexist' directory = pathlib.Path(filepath, nonexist_dir) with pytest.raises(ValueError, match=nonexist_dir): sunpy.map.Map(os.fspath(directory)) with pytest.raises(ValueError, match='Invalid input: 78'): # Check a random unsupported type (int) fails sunpy.map.Map(78) # If one file failed to load, make sure it's raised as an expection. p = tmpdir.mkdir("sub").join("hello.fits") p.write("content") files = [AIA_171_IMAGE, p.strpath] with pytest.raises(OSError, match=(fr"Failed to read *")): sunpy.map.Map(files) # We want to check errors, so ignore warnings that are thrown @pytest.mark.filterwarnings("ignore:One of the data, header pairs failed to validate") @pytest.mark.parametrize('silence,error,match', [(True, RuntimeError, 'No maps loaded'), (False, sunpy.map.mapbase.MapMetaValidationError, 'Image coordinate units for axis 1 not present in metadata.')]) def test_silence_errors(self, silence, error, match): # Check that the correct errors are raised depending on silence_errors value data = np.arange(0, 100).reshape(10, 10) header = {} with pytest.raises(error, match=match): pair_map = sunpy.map.Map(data, header, silence_errors=silence) # requires dask array to run properly def test_dask_array(self): dask_array = pytest.importorskip('dask.array') amap = sunpy.map.Map(AIA_171_IMAGE) da = dask_array.from_array(amap.data, chunks=(1, 1)) pair_map = sunpy.map.Map(da, amap.meta) assert isinstance(pair_map, sunpy.map.GenericMap) # requires sqlalchemy to run properly def test_databaseentry(self): pytest.importorskip('sqlalchemy') sunpy_database = pytest.importorskip('sunpy.database') 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 with pytest.warns(SunpyMetadataWarning, match='The meta key is not valid ascii'): eitmap.save(afilename, filetype='fits', overwrite=True) backin = sunpy.map.Map(afilename) assert isinstance(backin, sunpy.map.sources.EITMap) @pytest.mark.remote_data def test_map_list_urls_cache(): """ Test for https://github.com/sunpy/sunpy/issues/4006 """ urls = ['http://jsoc.stanford.edu/SUM80/D136597189/S00000/image_lev1.fits', 'http://jsoc.stanford.edu/SUM79/D136597240/S00000/image_lev1.fits'] sunpy.map.Map(urls) # TODO: Test HMIMap, SXTMap # # Catch Hinode/XRT warning @pytest.mark.filterwarnings('ignore:File may have been truncated') @pytest.mark.parametrize('file, mapcls', [[filepath / 'EIT' / "efz20040301.000010_s.fits", sunpy.map.sources.EITMap], [filepath / "lasco_c2_25299383_s.fts", sunpy.map.sources.LASCOMap], [filepath / "mdi.fd_Ic.20101015_230100_TAI.data.fits", sunpy.map.sources.MDIMap], [filepath / "mdi.fd_M_96m_lev182.20101015_191200_TAI.data.fits", sunpy.map.sources.MDIMap], [filepath / "euvi_20090615_000900_n4euA_s.fts", sunpy.map.sources.EUVIMap], [filepath / "cor1_20090615_000500_s4c1A.fts", sunpy.map.sources.CORMap], [filepath / "hi_20110910_114721_s7h2A.fts", sunpy.map.sources.HIMap], [AIA_171_IMAGE, sunpy.map.sources.AIAMap], [RHESSI_IMAGE, sunpy.map.sources.RHESSIMap], [filepath / "FGMG4_20110214_030443.7.fits", sunpy.map.sources.SOTMap], [filepath / "swap_lv1_20140606_000113.fits", sunpy.map.sources.SWAPMap], [filepath / "HinodeXRT.fits", sunpy.map.sources.XRTMap] ] ) def test_sources(file, mapcls): m = sunpy.map.Map(file) assert isinstance(m, mapcls) def test_no_2d_hdus(tmpdir): # Create a fake FITS file with a valid header but 1D data tmp_fpath = str(tmpdir / 'data.fits') with fits.open(AIA_171_IMAGE, ignore_blank=True) as hdul: fits.writeto(tmp_fpath, np.arange(100), hdul[0].header) with pytest.raises(NoMapsInFileError, match='Found no HDUs with >= 2D data'): sunpy.map.Map(tmp_fpath) with pytest.warns(SunpyUserWarning, match='One of the arguments failed to parse'): sunpy.map.Map([tmp_fpath, AIA_171_IMAGE], silence_errors=True) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/tests/test_mapbase.py0000644000175100001710000016537700000000000020065 0ustar00vstsdocker""" Test Generic Map """ import re import tempfile import contextlib from unittest import mock import matplotlib.pyplot as plt import numpy as np import pytest from hypothesis import given, settings from packaging import version import astropy.units as u import astropy.wcs from astropy.coordinates import Latitude, SkyCoord from astropy.io import fits from astropy.io.fits.verify import VerifyWarning from astropy.tests.helper import assert_quantity_allclose from astropy.visualization import wcsaxes import sunpy import sunpy.coordinates import sunpy.data.test import sunpy.map import sunpy.sun from sunpy.coordinates import HeliographicCarrington, HeliographicStonyhurst, sun from sunpy.map.mapbase import GenericMap from sunpy.map.sources import AIAMap from sunpy.tests.helpers import figure_test from sunpy.time import parse_time from sunpy.util import SunpyUserWarning from sunpy.util.exceptions import SunpyDeprecationWarning, SunpyMetadataWarning from sunpy.util.metadata import ModifiedItem from .conftest import make_simple_map from .strategies import matrix_meta testpath = sunpy.data.test.rootdir def test_fits_data_comparison(aia171_test_map): """Make sure the data is the same when read with astropy.io.fits and sunpy""" with pytest.warns(VerifyWarning, match="Invalid 'BLANK' keyword in header."): data = fits.open(testpath / 'aia_171_level1.fits')[0].data np.testing.assert_allclose(aia171_test_map.data, data) def test_header_fits_io(): with pytest.warns(VerifyWarning, match="Invalid 'BLANK' keyword in header."): with fits.open(testpath / 'aia_171_level1.fits') as hdu: AIAMap(hdu[0].data, hdu[0].header) 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 wcs.array_shape == aia171_test_map.data.shape assert all(wcs.wcs.crpix - 1 == [aia171_test_map.reference_pixel.x.value, aia171_test_map.reference_pixel.y.value]) assert u.allclose(wcs.wcs.cdelt * (u.Unit(wcs.wcs.cunit[0])/u.pix), u.Quantity(aia171_test_map.scale)) assert u.allclose(wcs.wcs.crval * u.Unit(wcs.wcs.cunit[0]), u.Quantity([aia171_test_map._reference_longitude, aia171_test_map._reference_latitude])) assert set(wcs.wcs.ctype) == { aia171_test_map.coordinate_system.axis1, aia171_test_map.coordinate_system.axis2} np.testing.assert_allclose(wcs.wcs.pc, aia171_test_map.rotation_matrix) def test_wcs_cache(aia171_test_map): wcs1 = aia171_test_map.wcs wcs2 = aia171_test_map.wcs # Check that without any changes to the header, retreiving the wcs twice # returns the same object instead of recomputing the wcs assert wcs1 is wcs2 # Change the header and make sure the wcs is re-computed new_crpix = 20 assert new_crpix != wcs2.wcs.crpix[0] aia171_test_map.meta['crpix1'] = new_crpix new_wcs = aia171_test_map.wcs assert new_wcs.wcs.crpix[0] == new_crpix def test_obs_coord_cache(aia171_test_map): coord1 = aia171_test_map.observer_coordinate coord2 = aia171_test_map.observer_coordinate assert coord1 is coord2 # Change metadata, and check that the coordinate changes aia171_test_map.meta['haex_obs'] += 10 new_coord = aia171_test_map.observer_coordinate assert new_coord.lon != coord2.lon assert new_coord.lat != coord2.lat assert new_coord.radius != coord2.radius def test_header_immutability(aia171_test_map): # Check that accessing the wcs of a map doesn't modify the meta data assert 'KEYCOMMENTS' in aia171_test_map.meta aia171_test_map.wcs assert 'KEYCOMMENTS' in aia171_test_map.meta def test_dtype(generic_map): assert generic_map.dtype == np.float64 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 def test_unit(generic_map): assert generic_map.unit == u.ct / u.s generic_map.meta['bunit'] = 'not a unit' with pytest.warns(SunpyMetadataWarning, match='Could not parse unit string "not a unit"'): assert generic_map.unit is None # ============================================================================== # 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, str) 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' date_dict = {'DATE-AVG': parse_time('2020-01-01'), 'DATE-OBS': parse_time('2020-02-01'), 'DATE-BEG': parse_time('2020-03-01'), 'DATE-END': parse_time('2020-03-03')} date_begend = date_dict['DATE-BEG'] + (date_dict['DATE-END'] - date_dict['DATE-BEG']) / 2 @pytest.mark.parametrize('keys, expected_date', ([['DATE-AVG', 'DATE-OBS', 'DATE-BEG', 'DATE-END'], date_dict['DATE-OBS']], [['DATE-AVG', 'DATE-BEG', 'DATE-END'], date_dict['DATE-AVG']], [['DATE-BEG', 'DATE-END'], date_begend], [['DATE-BEG'], date_dict['DATE-BEG']], [['DATE-END'], date_dict['DATE-END']], [[], 'now'] )) def test_date(generic_map, keys, expected_date): # Remove pre-existing date keys for key in date_dict: generic_map.meta.pop(key, None) # Add new date keys for key in keys: generic_map.meta[key] = date_dict[key].isot # Check date is the correct value if expected_date == 'now': expected_date = parse_time('now') # Check equal to within a tolerance as parse_time('now') is run # at slightly different times in .date and the line above with pytest.warns(SunpyMetadataWarning, match='Missing metadata for observation time'): assert generic_map.date - expected_date < 1*u.s else: assert generic_map.date == expected_date def test_date_scale(generic_map): # Check that default time scale is UTC assert 'timesys' not in generic_map.meta assert generic_map.date.scale == 'utc' generic_map.meta['timesys'] = 'tai' assert generic_map.date.scale == 'tai' 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_timeunit(generic_map): assert generic_map.timeunit == u.Unit('s') generic_map.meta['timeunit'] = 'h' assert generic_map.timeunit == u.Unit('h') def test_dsun(generic_map): assert_quantity_allclose(generic_map.dsun, sun.earth_distance(generic_map.date)) def test_rsun_meters(generic_map): assert generic_map.rsun_meters == sunpy.sun.constants.radius def test_rsun_obs_without_rsun_ref(generic_map): assert_quantity_allclose(generic_map.rsun_obs, sun.angular_radius(generic_map.date)) def test_rsun_obs_with_rsun_ref(generic_map): generic_map.meta['rsun_ref'] = sunpy.sun.constants.radius.to_value(u.m) # The following should not raise a warning because we can calculate it exactly assert_quantity_allclose(generic_map.rsun_obs, sun.angular_radius(generic_map.date)) def test_coordinate_system(generic_map): assert generic_map.coordinate_system == ('HPLN-TAN', 'HPLT-TAN') def test_default_coordinate_system(generic_map): generic_map.meta.pop('ctype1') with pytest.warns(SunpyMetadataWarning, match='Missing CTYPE1 from metadata'): assert generic_map.coordinate_system == ('HPLN-TAN', 'HPLT-TAN') generic_map.meta.pop('ctype2') generic_map.meta['ctype1'] = 'HPLN-TAN' with pytest.warns(SunpyMetadataWarning, match='Missing CTYPE2 from metadata'): assert generic_map.coordinate_system == ('HPLN-TAN', 'HPLT-TAN') def test_carrington_longitude(generic_map): assert u.allclose(generic_map.carrington_longitude, sun.L0(generic_map.date)) def test_heliographic_latitude(generic_map): assert u.allclose(generic_map.heliographic_latitude, Latitude(sun.B0(generic_map.date))) def test_heliographic_longitude(generic_map): # Needs a small tolerance to account for 32bit rounding errors assert u.allclose(generic_map.heliographic_longitude, 0 * u.deg, atol=1e-15*u.deg) def test_units(generic_map): generic_map.spatial_units == ('arcsec', 'arcsec') def test_cmap(generic_map): assert generic_map.cmap == plt.get_cmap('gray') 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 def test_heliographic_longitude_crln(hmi_test_map): assert_quantity_allclose(hmi_test_map.heliographic_longitude, hmi_test_map.carrington_longitude - sun.L0(hmi_test_map.date), rtol=1e-3) # A tolerance is needed because L0 is for Earth, not SDO def test_remove_observers(aia171_test_map): aia171_test_map._remove_existing_observer_location() with pytest.warns(SunpyMetadataWarning, match='Missing metadata for observer: assuming Earth-based observer.*'): aia171_test_map.observer_coordinate def test_partially_missing_observers(generic_map): generic_map.meta['hglt_obs'] = 0 generic_map.meta['hgln_obs'] = 0 generic_map.meta['crlt_obs'] = 0 generic_map.meta['crln_obs'] = 0 generic_map.meta.pop('dsun_obs') with pytest.warns(SunpyMetadataWarning, match="Missing metadata for observer: assuming Earth-based observer.\n" + "For frame 'heliographic_stonyhurst' the following metadata is missing: dsun_obs\n" + "For frame 'heliographic_carrington' the following metadata is missing: dsun_obs\n"): generic_map.observer_coordinate # ============================================================================== # Test Rotation WCS conversion # ============================================================================== def test_rotation_matrix_pci_j(generic_map): np.testing.assert_allclose(generic_map.rotation_matrix, np.array([[0., -1.], [1., 0.]])) def test_rotation_matrix_crota(aia171_test_map): np.testing.assert_allclose(aia171_test_map.rotation_matrix, np.array([[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, 'CUNIT1': 'arcsec', 'CUNIT2': 'arcsec', 'CTYPE1': 'HPLN-TAN', 'CTYPE2': 'HPLT-TAN', } cd_map = sunpy.map.Map((data, header)) np.testing.assert_allclose(cd_map.rotation_matrix, np.array([[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, 'CUNIT1': 'arcsec', 'CUNIT2': 'arcsec', 'CTYPE1': 'HPLN-TAN', 'CTYPE2': 'HPLT-TAN', } cd_map = sunpy.map.Map((data, header)) np.testing.assert_allclose(cd_map.rotation_matrix, np.array([[0., -1], [1., 0]])) def test_swap_cd(): amap = sunpy.map.Map(testpath / 'swap_lv1_20140606_000113.fits') np.testing.assert_allclose(amap.rotation_matrix, np.array([[1., 0], [0, 1.]])) @pytest.mark.filterwarnings('ignore:Missing metadata for observer') def test_crota_scale(): # Test non-zero crota and unequal CDELT{1,2} n = 6 data = np.ones([n, n], dtype=np.float64) header = { 'CRVAL1': 0, 'CRVAL2': 0, 'CRPIX1': (n + 1) / 2, 'CRPIX2': (n + 1) / 2, 'NAXIS1': n, 'NAXIS2': n, 'CUNIT1': 'arcsec', 'CUNIT2': 'arcsec', 'CTYPE1': 'HPLN-TAN', 'CTYPE2': 'HPLT-TAN', 'DATE-OBS': '2020-01-01 00:00:00' } header.update({'CROTA2': 0, 'CDELT1': 1, 'CDELT2': 2}) map1 = sunpy.map.Map(data, header) header.update({'CROTA2': 90, 'CDELT1': 2, 'CDELT2': 1}) map2 = sunpy.map.Map(data, header) # Lower left coord coord1 = map1.pixel_to_world(*(-0.5, -0.5) * u.pix) # After rotating by 90 deg about the center of the map (CRPIX), # this should map to the lower right coordinate coord2 = map2.pixel_to_world(*(-0.5, n - 0.5) * u.pix) assert coord1.separation(coord2) < 1e-6 * u.arcsec def test_world_to_pixel(generic_map): """Make sure conversion from data units to pixels is internally consistent""" test_pixel = generic_map.world_to_pixel(generic_map.reference_coordinate) assert_quantity_allclose(test_pixel, generic_map.reference_pixel) def test_world_to_pixel_error(generic_map): strerr = 'Expected the following order of world arguments: SkyCoord' with pytest.raises(ValueError, match=strerr): generic_map.world_to_pixel(1) def test_world_pixel_roundtrip(simple_map): pix = 1 * u.pix, 1 * u.pix coord = simple_map.pixel_to_world(*pix) pix_roundtrip = simple_map.world_to_pixel(coord) assert u.allclose(pix_roundtrip.x, pix[0], atol=1e-10 * u.pix) assert u.allclose(pix_roundtrip.y, pix[1], atol=1e-10 * u.pix) def test_swapped_ctypes(simple_map): # Check that CTYPES different from normal work fine simple_map.meta['ctype1'] = 'HPLT-TAN' # Usually HPLN simple_map.meta['ctype2'] = 'HPLN-TAN' # Usually HPLT assert u.allclose(simple_map.bottom_left_coord.Tx, -1 * u.arcsec) assert u.allclose(simple_map.bottom_left_coord.Ty, -2 * u.arcsec) assert u.allclose(simple_map.top_right_coord.Tx, 1 * u.arcsec) assert u.allclose(simple_map.top_right_coord.Ty, 2 * u.arcsec) # Put them back simple_map.meta['ctype1'] = 'HPLN-TAN' # Usually HPLN simple_map.meta['ctype2'] = 'HPLT-TAN' # Usually HPLT assert u.allclose(simple_map.bottom_left_coord.Tx, -2 * u.arcsec) assert u.allclose(simple_map.bottom_left_coord.Ty, -1 * u.arcsec) assert u.allclose(simple_map.top_right_coord.Tx, 2 * u.arcsec) assert u.allclose(simple_map.top_right_coord.Ty, 1 * u.arcsec) def test_save(aia171_test_map): """Tests the map save function""" aiamap = aia171_test_map afilename = tempfile.NamedTemporaryFile(suffix='fits').name aiamap.save(afilename, filetype='fits', overwrite=True) loaded_save = sunpy.map.Map(afilename) assert isinstance(loaded_save, sunpy.map.sources.AIAMap) # Compare metadata without considering ordering of keys assert loaded_save.meta.keys() == aiamap.meta.keys() for k in aiamap.meta: assert loaded_save.meta[k] == aiamap.meta[k] assert_quantity_allclose(loaded_save.data, aiamap.data) def test_save_compressed(aia171_test_map): """Tests the map save function""" aiamap = aia171_test_map afilename = tempfile.NamedTemporaryFile(suffix='fits').name aiamap.save(afilename, filetype='fits', hdu_type=fits.CompImageHDU, overwrite=True) loaded_save = sunpy.map.Map(afilename) # We expect that round tripping to CompImageHDU will change the header and # the data a little. assert isinstance(loaded_save, sunpy.map.sources.AIAMap) 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, 'CUNIT1': 'arcsec', 'CUNIT2': 'arcsec', 'CTYPE1': 'HPLN-TAN', 'CTYPE2': 'HPLT-TAN', } 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_corners(simple_map): # These are the centers of the corner pixels assert u.allclose(simple_map.top_right_coord.Tx, 2 * u.arcsec) assert u.allclose(simple_map.top_right_coord.Ty, 1 * u.arcsec) assert u.allclose(simple_map.bottom_left_coord.Tx, -2 * u.arcsec) assert u.allclose(simple_map.bottom_left_coord.Ty, -1 * u.arcsec) def test_center(simple_map): assert u.allclose(simple_map.center.Tx, 0 * u.arcsec, atol=1e-26 * u.arcsec) assert u.allclose(simple_map.center.Ty, 0 * u.arcsec) def test_dimensions(simple_map): assert simple_map.dimensions[0] == 3 * u.pix assert simple_map.dimensions[1] == 3 * u.pix pixel_corners = [ [([0, 0] * u.pix, [0, 0] * u.pix), np.array([[0]])], [([-1, -1] * u.pix, [0, 0] * u.pix), np.array([[0]])], # 0.5, 0.5 is the edge of the first pixel, so make sure # we don't include any other pixels [([0, 0] * u.pix, [0.5, 0.5] * u.pix), np.array([[0]])], [([0, 0] * u.pix, [0, 0.51] * u.pix), np.array([[0], [3]])], [([0, 0] * u.pix, [0.51, 0] * u.pix), np.array([[0, 1]])], [([0, 0] * u.pix, [0.51, 0.51] * u.pix), np.array([[0, 1], [3, 4]])], [([0.1, 0.1] * u.pix, [1.6, 1.4] * u.pix), np.array([[0, 1, 2], [3, 4, 5]])], [([0, 0] * u.pix, [20, 20] * u.pix), np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])], ] @pytest.mark.parametrize('rect, submap_out', pixel_corners) def test_submap_pixel(simple_map, rect, submap_out): # Check that result is the same specifying corners either way round for r in [dict(bottom_left=rect[0], top_right=rect[1]), dict(bottom_left=rect[1], top_right=rect[0])]: submap = simple_map.submap(**r) np.testing.assert_equal(submap.data, submap_out) # The (0.5, 0.5) case is skipped as boundary points cannot reliably tested when # converting to world coordinates due to round-off error when round-tripping # through pixel_to_world -> world_to_pixel @pytest.mark.parametrize('rect, submap_out', pixel_corners[:2] + pixel_corners[3:]) def test_submap_world(simple_map, rect, submap_out): # Check that coordinates behave the same way corner1 = simple_map.pixel_to_world(*rect[0]) corner2 = simple_map.pixel_to_world(*rect[1]) corners = simple_map.pixel_to_world(u.Quantity([rect[0][0], rect[1][0]]), u.Quantity([rect[0][1], rect[1][1]])) for r in [dict(bottom_left=corner1, top_right=corner2), dict(bottom_left=corner2, top_right=corner1), dict(bottom_left=corners, ), ]: submap = simple_map.submap(**r) np.testing.assert_equal(submap.data, submap_out) @pytest.mark.parametrize('test_map', ("aia171_roll_map", "aia171_test_map", "hmi_test_map", "aia171_test_map_with_mask"), indirect=['test_map']) def test_submap_world_corners(test_map): """ This test checks that when an unaligned map is cropped with submap that the resulting map contains all four corners of the input world coordinate bounding box. """ corners = SkyCoord(Tx=[300, 300, 800, 800], Ty=[0, 500, 500, 0], unit=u.arcsec, frame=test_map.coordinate_frame) submap = test_map.submap(corners[0], top_right=corners[2]) pix_corners = np.array(submap.wcs.world_to_pixel(corners)).T for pix_corner in pix_corners: assert ((-0.5, -0.5) <= pix_corner).all() assert (pix_corner <= submap.data.shape[::-1]).all() if test_map.mask is not None: assert submap.mask.shape == submap.data.shape @pytest.mark.parametrize('test_map', ("aia171_test_map", "heliographic_test_map"), indirect=['test_map']) def test_submap_hgs_corners(test_map): """ This test checks that when an unaligned map is cropped with submap that the resulting map contains all four corners of the input world coordinate bounding box. """ corners = SkyCoord([10, 10, 40, 40], [-10, 30, 30, -10], unit=u.deg, frame="heliographic_stonyhurst", obstime=test_map.date) submap = test_map.submap(corners[0], top_right=corners[2]) pix_corners = np.array(submap.wcs.world_to_pixel(corners)).T for pix_corner in pix_corners: assert ((-0.5, -0.5) <= pix_corner).all() assert (pix_corner <= submap.data.shape[::-1]).all() # Check that submap works with units convertible to pix but that aren't pix @pytest.mark.parametrize('unit', [u.pix, u.mpix * 1e3]) def test_submap_data_header(generic_map, unit): """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.] * unit, top_right=[width, height] * unit) # Check to see if submap properties were updated properly assert submap.reference_pixel.x.value == generic_map.meta['crpix1'] - 1 - width / 2. assert submap.reference_pixel.y.value == generic_map.meta['crpix2'] - 1 - 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() def test_reference_coordinate(simple_map): assert simple_map.reference_pixel.x == 1 * u.pix assert simple_map.reference_pixel.y == 1 * u.pix @pytest.mark.parametrize('shape', [[1, 1], [6, 6]]) def test_resample(simple_map, shape): # Test resampling a 2x2 map resampled = simple_map.resample(shape * u.pix, method='linear') assert np.mean(resampled.data) == np.mean(simple_map.data) # Should be the mean of [0,1,2,3,4,5,6,7,8,9] if shape == [1, 1]: assert resampled.data == np.array([[4]]) # Check that the corner coordinates of the input and output are the same resampled_lower_left = resampled.pixel_to_world(-0.5 * u.pix, -0.5 * u.pix) original_lower_left = simple_map.pixel_to_world(-0.5 * u.pix, -0.5 * u.pix) assert u.allclose(resampled_lower_left.Tx, original_lower_left.Tx) assert u.allclose(resampled_lower_left.Ty, original_lower_left.Ty) resampled_upper_left = resampled.pixel_to_world((shape[0] - 0.5) * u.pix, (shape[1] - 0.5) * u.pix) original_upper_left = simple_map.pixel_to_world(2.5 * u.pix, 2.5 * u.pix) assert u.allclose(resampled_upper_left.Tx, original_upper_left.Tx) assert u.allclose(resampled_upper_left.Ty, original_upper_left.Ty) resample_test_data = [('linear', (100, 200) * u.pixel, contextlib.nullcontext()), ('neighbor', (128, 256) * u.pixel, pytest.warns(SunpyDeprecationWarning)), ('nearest', (512, 128) * u.pixel, contextlib.nullcontext()), ('spline', (200, 200) * u.pixel, contextlib.nullcontext())] @pytest.mark.parametrize('sample_method, new_dimensions, cm', resample_test_data) def test_resample_dimensions(generic_map, sample_method, new_dimensions, cm): """Check that resampled map has expected dimensions.""" with cm: 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, cm', resample_test_data) def test_resample_metadata(generic_map, sample_method, new_dimensions, cm): """ Check that the resampled map has correctly adjusted metadata. """ with cm: resampled_map = generic_map.resample(new_dimensions, method=sample_method) assert resampled_map.meta['cdelt1'] == generic_map.meta['cdelt1'] assert resampled_map.meta['cdelt2'] == generic_map.meta['cdelt2'] # TODO: we should really test the numbers here, not just that the correct # header values have been modified. However, I am lazy and we have figure # tests. assert resampled_map.meta['crpix1'] != generic_map.meta['crpix1'] assert resampled_map.meta['crpix2'] != generic_map.meta['crpix2'] assert u.allclose(resampled_map.meta['crval1'], generic_map.meta['crval1']) assert u.allclose(resampled_map.meta['crval2'], generic_map.meta['crval2']) assert resampled_map.meta['naxis1'] == new_dimensions[0].value assert resampled_map.meta['naxis2'] == new_dimensions[1].value for key in generic_map.meta: if key not in ('crpix1', 'crpix2', 'crval1', 'crval2', 'naxis1', 'naxis2') and not key.startswith('pc'): assert resampled_map.meta[key] == generic_map.meta[key] @pytest.mark.parametrize('sample_method, new_dimensions, cm', resample_test_data) def test_resample_simple_map(simple_map, sample_method, new_dimensions, cm): # Put the reference pixel at the top-right of the bottom-left pixel simple_map.meta['crpix1'] = 1.5 simple_map.meta['crpix2'] = 1.5 assert list(simple_map.reference_pixel) == [0.5 * u.pix, 0.5 * u.pix] # Make the superpixel map new_dims = (9, 6) * u.pix with cm: resamp_map = simple_map.resample(new_dims, method=sample_method) # Reference pixel should change, but reference coordinate should not assert list(resamp_map.reference_pixel) == [2.5 * u.pix, 1.5 * u.pix] assert resamp_map.reference_coordinate == simple_map.reference_coordinate def test_superpixel_simple_map(simple_map): # Put the reference pixel at the top-right of the bottom-left pixel simple_map.meta['crpix1'] = 1.5 simple_map.meta['crpix2'] = 1.5 assert list(simple_map.reference_pixel) == [0.5 * u.pix, 0.5 * u.pix] # Make the superpixel map new_dims = (2, 2) * u.pix superpix_map = simple_map.superpixel(new_dims) # Reference pixel should change, but referenc coordinate should not assert list(superpix_map.reference_pixel) == [0 * u.pix, 0 * u.pix] assert superpix_map.reference_coordinate == simple_map.reference_coordinate # Check that offset works superpix_map = simple_map.superpixel(new_dims, offset=[1, 2] * u.pix) # Reference pixel should change, but referenc coordinate should not assert u.allclose(list(superpix_map.reference_pixel), [-0.5 * u.pix, -1 * u.pix]) assert superpix_map.reference_coordinate == simple_map.reference_coordinate 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], int((aia171_test_map.dimensions[0] / dimensions[0]).value) * u.pix - 1 * u.pix) assert_quantity_allclose( superpixel_map_sum.dimensions[1], int((aia171_test_map.dimensions[1] / dimensions[1]).value) * u.pix - 1 * u.pix) def test_superpixel_units(generic_map): new_dims = (2, 2) * u.pix super1 = generic_map.superpixel(new_dims) super2 = generic_map.superpixel(new_dims.to(u.kpix)) assert super1.meta == super2.meta offset = (1, 2) * u.pix super1 = generic_map.superpixel(new_dims, offset=offset) super2 = generic_map.superpixel(new_dims, offset=offset.to(u.kpix)) assert super1.meta == super2.meta def test_superpixel_fractional_inputs(generic_map): super1 = generic_map.superpixel((2, 3) * u.pix) super2 = generic_map.superpixel((2.2, 3.2) * u.pix) assert np.all(super1.data == super2.data) assert super1.meta == super2.meta @pytest.mark.parametrize('method', ['resample', 'superpixel']) @settings(max_examples=10, deadline=1000) @given(pc=matrix_meta('pc')) def test_resample_rotated_map_pc(pc, method): smap = make_simple_map() smap.meta.update(pc) # Check superpixel with a rotated map with unequal resampling new_dims = (1, 2) * u.pix new_map = getattr(smap, method)(new_dims) # Coordinate of the lower left corner should not change ll_pix = [-0.5, -0.5]*u.pix assert smap.pixel_to_world(*ll_pix).separation( new_map.pixel_to_world(*ll_pix)).to(u.arcsec) < 1e-8 * u.arcsec @pytest.mark.parametrize('method', ['resample', 'superpixel']) @settings(max_examples=10, deadline=1000) @given(cd=matrix_meta('cd')) def test_resample_rotated_map_cd(cd, method): smap = make_simple_map() smap.meta.update(cd) # Check superpixel with a rotated map with unequal resampling new_dims = (1, 2) * u.pix new_map = getattr(smap, method)(new_dims) # Coordinate of the lower left corner should not change ll_pix = [-0.5, -0.5]*u.pix assert smap.pixel_to_world(*ll_pix).separation( new_map.pixel_to_world(*ll_pix)).to(u.arcsec) < 1e-8 * u.arcsec def test_superpixel_err(generic_map): with pytest.raises(ValueError, match="Offset is strictly non-negative."): generic_map.superpixel((2, 2) * u.pix, offset=(-2, 2) * u.pix) def calc_new_matrix(angle): c = np.cos(np.deg2rad(angle)) s = np.sin(np.deg2rad(angle)) return np.array([[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] @pytest.mark.xfail(version.parse(np.__version__) >= version.parse("1.2.0"), reason="Numpy >= 1.20.0 doesn't allow NaN to int conversion") def test_rotate_with_incompatible_missing_dtype(): data = np.arange(0, 100).reshape(10, 10) coord = SkyCoord(0 * u.arcsec, 0 * u.arcsec, obstime='2013-10-28', observer='earth', frame=sunpy.coordinates.Helioprojective) header = sunpy.map.make_fitswcs_header(data, coord) test_map = sunpy.map.Map(data, header) with pytest.warns(SunpyUserWarning, match="The specified `missing` value is not an integer, but the data " "array is of integer type, so the output may be strange."): test_map.rotate(order=3, missing=np.nan) def test_rotate_crpix_zero_degrees(generic_map): # Rotating a map by zero degrees should not change the location of the reference pixel at all rotated_map = generic_map.rotate(0*u.deg) assert rotated_map.reference_pixel.x == generic_map.reference_pixel.x assert rotated_map.reference_pixel.y == generic_map.reference_pixel.y 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((5.04903811, 6.54903811), 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 * u.pix, 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.array([[0, 1], [-1, 0]])) np.testing.assert_allclose(rot_map.rotation_matrix, np.array([[-1, 0], [0, -1]])) def test_rotate_rmatrix_angle(generic_map): with pytest.raises(ValueError, match="You cannot specify both an angle and a rotation matrix."): generic_map.rotate(angle=5*u.deg, rmatrix=np.array([[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_rotate_assumed_obstime(): # Create an HPC map that is missing the observing time and has an off-disk reference coordinate header = { 'crval1': -2000, 'crval2': 0, 'cdelt1': 1, 'cdelt2': 1, 'ctype1': 'HPLN-TAN', 'ctype2': 'HPLT-TAN', 'naxis': 2, 'naxis1': 10, 'naxis2': 10, 'cunit1': 'arcsec', 'cunit2': 'arcsec', 'crpix1': 4.5, 'crpix2': 6.5, 'hglt_obs': 0, 'hgln_obs': 0, 'dsun_obs': 150000000000, 'rsun_ref': 700000000, } original = sunpy.map.Map(np.zeros((10, 10)), header) # Accessing the date makes the assumption of "now" for obstime with pytest.warns(SunpyMetadataWarning, match="Missing metadata for observation time"): original.date # The assumption has already been made, so no further warning should be emitted by rotate() rotated = original.rotate(0*u.deg) # The reference coordinate should be unchanged by this 0-degree rotation # Since the reference coordinate is off-disk, a non-identity transformation would result in NaNs assert_quantity_allclose(rotated.reference_pixel.x, original.reference_pixel.x) assert_quantity_allclose(rotated.reference_pixel.y, original.reference_pixel.y) # The returned map should also be missing observing time with pytest.warns(SunpyMetadataWarning, match="Missing metadata for observation time"): rotated.date def test_as_mpl_axes_aia171(aia171_test_map): ax = plt.subplot(projection=aia171_test_map) assert isinstance(ax, wcsaxes.WCSAxes) assert all([ct1 == ct2 for ct1, ct2 in zip(ax.wcs.wcs.ctype, aia171_test_map.wcs.wcs.ctype)]) def test_validate_meta(generic_map): """Check to see if_validate_meta displays an appropriate error""" with pytest.warns(SunpyMetadataWarning) 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' } sunpy.map.Map((generic_map.data, bad_header)) assert 'waveunit'.upper() in str(w[0].message) def test_validate_non_spatial(generic_map): generic_map.meta['cunit2'] = 'Angstrom' err_msg = ("Map only supports spherical coordinate systems with angular units " "(ie. equivalent to arcsec), but this map has units ['arcsec', 'Angstrom']") with pytest.raises(sunpy.map.MapMetaValidationError, match=re.escape(err_msg)): sunpy.map.Map(generic_map.data, generic_map.meta) # 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) # 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 represents 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' hdr['cunit1'] = 'arcsec' hdr['cunit2'] = 'arcsec' with pytest.warns(SunpyUserWarning, match='This file contains more than 2 dimensions.'): 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 == 2 assert_quantity_allclose(bad_map.dimensions, (5, 3) * u.pix) def test_missing_metadata_warnings(): # Checks that warnings for missing metadata are only raised once with pytest.warns(Warning) as record: header = {} header['cunit1'] = 'arcsec' header['cunit2'] = 'arcsec' header['ctype1'] = 'HPLN-TAN' header['ctype2'] = 'HPLT-TAN' array_map = sunpy.map.Map(np.random.rand(20, 15), header) array_map.peek() # There should be 2 warnings for missing metadata (obstime and observer location) assert len([w for w in record if w.category in (SunpyMetadataWarning, SunpyUserWarning)]) == 2 def test_fits_header(aia171_test_map): assert isinstance(aia171_test_map.fits_header, fits.Header) def test_bad_coordframe_repr(generic_map): generic_map.meta['CTYPE1'] = "STUART1" generic_map.meta['CTYPE2'] = "STUART2" with pytest.warns(UserWarning, match="Could not determine coordinate frame from map metadata"): assert 'Unknown' in generic_map.__repr__() def test_non_str_key(): header = {'cunit1': 'arcsec', 'cunit2': 'arcsec', None: None, # Cannot parse this into WCS } with pytest.raises(ValueError, match='All MetaDict keys must be strings'): sunpy.map.GenericMap(np.zeros((10, 10)), header) def test_wcs_isot(aia171_test_map): # Check that a Map WCS returns the time as isot format assert aia171_test_map.wcs.to_header()['DATE-OBS'] == '2011-02-15T00:00:00.340' def test_repr_html(aia171_test_map): html_string = aia171_test_map._repr_html_() assert isinstance(html_string, str) # Add a NaN value and check aia171_test_map.data[0, 0] = np.nan html_string = aia171_test_map._repr_html_() assert "Bad pixels are shown in red: 1 NaN" in html_string # Add a infinite value and check aia171_test_map.data[0, 0] = np.inf html_string = aia171_test_map._repr_html_() assert "Bad pixels are shown in red: 1 infinite" in html_string def test_quicklook(aia171_test_map): with mock.patch('webbrowser.open_new_tab') as mockwbopen: aia171_test_map.quicklook() # Check that the mock web browser was opened with a file URL mockwbopen.assert_called_once() file_url = mockwbopen.call_args[0][0] assert file_url.startswith('file://') # Open the file specified in the URL and confirm that it contains the HTML with open(file_url[7:], 'r') as f: html_string = f.read() assert aia171_test_map._repr_html_() in html_string @pytest.fixture def generic_map2(generic_map): generic_map.meta["CTYPE1"] = "HPLN-TAN" generic_map.meta["CTYPE2"] = "HPLT-TAN" return generic_map @pytest.fixture def coords(generic_map2): bl_coord = SkyCoord(20, -10, unit=u.arcsec, frame=generic_map2.coordinate_frame) tr_coord = SkyCoord(0, 10, unit=u.arcsec, frame=generic_map2.coordinate_frame) bl_tr_coord = SkyCoord([20, 0], [-10, 10], unit=u.arcsec, frame=generic_map2.coordinate_frame) return bl_coord, tr_coord, bl_tr_coord bl_pix = [3, 2] * u.pix tr_pix = [5, 4] * u.pix width_pix = 2 * u.pix height_pix = 2 * u.pix width_deg = 20 * u.arcsec height_deg = 20 * u.arcsec def test_submap_kwarg_only_input_errors(generic_map2, coords): """ This test replaces the one above when the deprecation period is over. """ bl_coord, tr_coord, bl_tr_coord = coords inputs = ( ((bl_coord, tr_coord), {}), ((bl_pix, tr_pix), {}), ((bl_coord, width_deg, height_deg), {}), ((bl_pix, width_pix, height_pix), {}), ((bl_coord, width_deg), {'height_deg': height_deg}), ((bl_pix, width_pix), {'height_pix': height_pix}), ) for args, kwargs in inputs: with pytest.raises(TypeError, match="too many positional arguments"): generic_map2.submap(*args, **kwargs) def test_submap_inputs(generic_map2, coords): bl_coord, tr_coord, bl_tr_coord = coords inputs = ( ((bl_coord,), dict(top_right=tr_coord)), ((bl_coord,), dict(width=width_deg, height=height_deg)), ((bl_tr_coord,), {}), ((bl_pix,), dict(top_right=tr_pix)), ((bl_pix,), dict(width=width_pix, height=height_pix)), ) for args, kwargs in inputs: smap = generic_map2.submap(*args, **kwargs) assert u.allclose(smap.dimensions, (3, 3) * u.pix) def test_contour(simple_map): data = np.ones((3, 3)) data[1, 1] = 2 simple_map = sunpy.map.Map(data, simple_map.meta) # 2 is the central pixel of the map, so contour half way between 1 and 2 contours = simple_map.contour(1.5) assert len(contours) == 1 contour = contours[0] assert contour.observer.lat == simple_map.observer_coordinate.frame.lat assert contour.observer.lon == simple_map.observer_coordinate.frame.lon assert contour.obstime == simple_map.date assert u.allclose(contour.Tx, [0, -1, 0, 1, 0] * u.arcsec, atol=1e-10 * u.arcsec) assert u.allclose(contour.Ty, [0.5, 0, -0.5, 0, 0.5] * u.arcsec, atol=1e-10 * u.arcsec) def test_contour_units(simple_map): # Check that contouring with units works as intended simple_map.meta['bunit'] = 'm' # Same units contours = simple_map.contour(1.5 * u.m) assert len(contours) == 1 # Different units, but convertible contours_cm = simple_map.contour(150 * u.cm) for c1, c2 in zip(contours, contours_cm): assert np.all(c1 == c2) # Percentage contours_percent = simple_map.contour(100 * u.percent) contours_ref = simple_map.contour(np.max(simple_map.data) * simple_map.unit) for c1, c2 in zip(contours_percent, contours_ref): assert np.all(c1 == c2) def test_contour_input(simple_map): simple_map.meta['bunit'] = 'm' with pytest.raises(TypeError, match='The levels argument has no unit attribute'): simple_map.draw_contours(1.5) with pytest.raises(TypeError, match='The levels argument has no unit attribute'): simple_map.contour(1.5) with pytest.raises(u.UnitsError, match=re.escape("'s' (time) and 'm' (length) are not convertible")): simple_map.draw_contours(1.5 * u.s) with pytest.raises(u.UnitsError, match=re.escape("'s' (time) and 'm' (length) are not convertible")): simple_map.contour(1.5 * u.s) # With no units, check that dimensionless works simple_map.meta.pop('bunit') simple_map.draw_contours(1.5 * u.dimensionless_unscaled) simple_map.contour(1.5 * u.dimensionless_unscaled) with pytest.raises(u.UnitsError, match='This map has no unit'): simple_map.draw_contours(1.5 * u.m) with pytest.raises(u.UnitsError, match='This map has no unit'): simple_map.contour(1.5 * u.m) def test_print_map(generic_map): out_repr = generic_map.__repr__() assert isinstance(out_repr, str) assert object.__repr__(generic_map) in out_repr out_str = generic_map.__str__() assert isinstance(out_str, str) assert out_str in out_repr def test_parse_submap_quantity_inputs(aia171_test_map): bottom_left = (0, 0)*u.arcsec top_right = (200, 200)*u.arcsec width = 200*u.arcsec height = 300*u.arcsec with pytest.raises(ValueError, match=re.escape("Either top_right alone or both width and height " "must be specified when bottom_left is a Quantity")): aia171_test_map.submap(bottom_left=bottom_left[0], top_right=None, width=None, height=None) with pytest.raises(ValueError, match=re.escape("bottom_left must have shape (2, ) " "when specified as a Quantity")): aia171_test_map.submap(bottom_left=bottom_left[0], top_right=top_right, width=None, height=None) with pytest.raises(ValueError, match=re.escape("top_right must have shape (2, ) when specified as " "a Quantity")): aia171_test_map.submap(bottom_left=bottom_left, top_right=top_right[0], width=None, height=None) with pytest.raises(TypeError, match=re.escape("When bottom_left is a Quantity, top_right " "must be a Quantity in units of pixels.")): aia171_test_map.submap(bottom_left=bottom_left, top_right=top_right, width=None, height=None) with pytest.raises(TypeError, match=re.escape("When bottom_left is a Quantity, width and height " "must be a Quantity in units of pixels.")): aia171_test_map.submap(bottom_left=bottom_left, top_right=None, width=width, height=height) def test_wavelength_properties(simple_map): simple_map.meta.pop('waveunit', None) simple_map.meta['wavelnth'] = 1 assert simple_map.measurement == 1 * u.one assert simple_map.wavelength == 1 * u.one simple_map.meta['waveunit'] = '' assert simple_map.measurement == 1 * u.one assert simple_map.wavelength == 1 * u.one simple_map.meta['waveunit'] = 'm' assert simple_map.measurement == 1 * u.m assert simple_map.wavelength == 1 * u.m def test_meta_modifications(aia171_test_map): aiamap = aia171_test_map old_cdelt1 = aiamap.meta['cdelt1'] aiamap.meta['cdelt1'] = 20 assert aiamap.meta.original_meta != aiamap.meta assert aiamap.meta.added_items == {} assert aiamap.meta.removed_items == {} assert aiamap.meta.modified_items == {'cdelt1': ModifiedItem(old_cdelt1, 20)} # Check that rotate doesn't modify the original metadata aiamap_rot = aiamap.rotate(30 * u.deg) assert aiamap_rot.meta.original_meta == aiamap.meta.original_meta assert set(aiamap_rot.meta.added_items.keys()) == set(['pc1_1', 'pc1_2', 'pc2_1', 'pc2_2']) assert set(aiamap_rot.meta.removed_items.keys()) == set(['crota2']) assert set(aiamap_rot.meta.modified_items) == set(['cdelt1', 'crpix1', 'crpix2', 'crval1']) def test_no_wcs_observer_info(heliographic_test_map): # Check that HeliographicCarrington WCS has observer info set assert isinstance(heliographic_test_map.coordinate_frame, HeliographicCarrington) wcs_aux = heliographic_test_map.wcs.wcs.aux assert wcs_aux.hgln_obs is not None assert wcs_aux.hglt_obs is not None assert wcs_aux.dsun_obs is not None # Remove observer information, and change coordinate system to HeliographicStonyhurst heliographic_test_map.meta.pop('HGLN_OBS') heliographic_test_map.meta.pop('HGLT_OBS') heliographic_test_map.meta.pop('DSUN_OBS') heliographic_test_map.meta['CTYPE1'] = 'HGLN-CAR' heliographic_test_map.meta['CTYPE2'] = 'HGLT-CAR' assert isinstance(heliographic_test_map.coordinate_frame, HeliographicStonyhurst) # Check that GenericMap.wcs doesn't set an observer wcs_aux = heliographic_test_map.wcs.wcs.aux assert wcs_aux.hgln_obs is None assert wcs_aux.hglt_obs is None assert wcs_aux.dsun_obs is None def test_rsun_meters_no_warning_for_hgs(heliographic_test_map): # Make sure that Stonyhurst heliographic maps do not emit a warning about assuming an # Earth-based observer when returning the physical radius of the Sun, because such an # assumption is not necessary # Convert the heliographic test map to Stonyhurst heliographic coordinates heliographic_test_map.meta.pop('HGLN_OBS') heliographic_test_map.meta.pop('HGLT_OBS') heliographic_test_map.meta.pop('DSUN_OBS') heliographic_test_map.meta['CTYPE1'] = 'HGLN-CAR' heliographic_test_map.meta['CTYPE2'] = 'HGLT-CAR' # Add a custom physical radius for the Sun heliographic_test_map.meta['rsun_ref'] = 1.1 * sunpy.sun.constants.radius.to_value(u.m) assert_quantity_allclose(heliographic_test_map.rsun_meters, heliographic_test_map.meta['rsun_ref'] << u.m) @figure_test def test_rotation_rect_pixelated_data(aia171_test_map): aia_map = sunpy.map.Map(aia171_test_map) rect_map = aia_map.superpixel([2, 1] * u.pix, func=np.mean) rect_rot_map = rect_map.rotate(30 * u.deg) rect_rot_map.peek() # This function is used in the arithmetic tests below def check_arithmetic_value_and_units(map_new, data_expected): assert u.allclose(map_new.quantity, data_expected) assert map_new.unit.is_equivalent(data_expected.unit) @pytest.mark.parametrize('value', [ 10 * u.ct, 10 * u.mct, u.Quantity([10], u.ct), u.Quantity(np.random.rand(128), u.ct), u.Quantity(np.random.rand(128, 128), u.ct), u.Quantity(np.random.rand(128, 128), u.mct), ]) def test_map_arithmetic_addition_subtraction(aia171_test_map, value): new_map = aia171_test_map + value check_arithmetic_value_and_units(new_map, aia171_test_map.quantity + value) new_map = value + aia171_test_map check_arithmetic_value_and_units(new_map, value + aia171_test_map.quantity) new_map = aia171_test_map - value check_arithmetic_value_and_units(new_map, aia171_test_map.quantity - value) new_map = value - aia171_test_map check_arithmetic_value_and_units(new_map, value - aia171_test_map.quantity) @pytest.mark.parametrize('value', [ 10 * u.ct, u.Quantity([10], u.ct), u.Quantity(np.random.rand(128), u.ct), u.Quantity(np.random.rand(128, 128), u.ct), 10.0, np.random.rand(128), np.random.rand(128, 128), ]) def test_map_arithmetic_multiplication_division(aia171_test_map, value): new_map = aia171_test_map * value check_arithmetic_value_and_units(new_map, aia171_test_map.quantity * value) new_map = value * aia171_test_map check_arithmetic_value_and_units(new_map, value * aia171_test_map.quantity) new_map = aia171_test_map / value check_arithmetic_value_and_units(new_map, aia171_test_map.quantity / value) with pytest.warns(RuntimeWarning, match='divide by zero encountered in true_divide'): new_map = value / aia171_test_map check_arithmetic_value_and_units(new_map, value / aia171_test_map.quantity) def test_map_arithmetic_pow(aia171_test_map): new_map = aia171_test_map ** 2 check_arithmetic_value_and_units(new_map, aia171_test_map.quantity ** 2) def test_map_arithmetic_neg(aia171_test_map): new_map = -aia171_test_map check_arithmetic_value_and_units(new_map, -aia171_test_map.quantity) @pytest.mark.parametrize('value,warn_context', [ ('map', pytest.warns(RuntimeWarning)), ('foobar', contextlib.nullcontext()), (None, contextlib.nullcontext()), (['foo', 'bar'], contextlib.nullcontext()), ]) def test_map_arithmetic_operations_raise_exceptions(aia171_test_map, value, warn_context): value = aia171_test_map if value == 'map' else value with pytest.raises(TypeError): _ = aia171_test_map + value with pytest.raises(TypeError): _ = aia171_test_map * value with pytest.raises(TypeError): # A runtime warning is thrown when dividing by zero in the case of # the map test with warn_context: _ = value / aia171_test_map def test_parse_fits_units(): # Check that we parse a BUNIT of G correctly. out_unit = GenericMap._parse_fits_unit("Gauss") assert out_unit == u.G out_unit = GenericMap._parse_fits_unit("G") assert out_unit == u.G ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/tests/test_mapsequence.py0000644000175100001710000002154000000000000020742 0ustar00vstsdocker""" Test mapsequence functionality """ from unittest import mock import numpy as np import pytest import astropy.units as u from astropy.tests.helper import assert_quantity_allclose from astropy.visualization import ImageNormalize import sunpy import sunpy.data.test import sunpy.map from sunpy.tests.helpers import figure_test from sunpy.util.metadata import MetaDict @pytest.fixture def mapsequence_all_the_same(aia171_test_map): """ Simple `sunpy.map.mapsequence` for testing.""" return sunpy.map.Map([aia171_test_map, aia171_test_map], sequence=True) @pytest.fixture def mapsequence_different_maps(aia171_test_map, eit_test_map): """ Simple `sunpy.map.mapsequence` for testing, in which there are different maps """ return sunpy.map.Map([aia171_test_map, eit_test_map], sequence=True) @pytest.fixture def mapsequence_all_the_same_all_have_masks(aia171_test_map_with_mask): """ Simple `sunpy.map.mapsequence` for testing, in which all the maps have masks.""" return sunpy.map.Map([aia171_test_map_with_mask, aia171_test_map_with_mask], sequence=True) @pytest.fixture def mapsequence_all_the_same_some_have_masks(aia171_test_map, aia171_test_map_with_mask): """ Simple `sunpy.map.mapsequence` for testing, in which at least some of the maps have masks.""" return sunpy.map.Map([aia171_test_map_with_mask, aia171_test_map_with_mask, aia171_test_map], sequence=True) @pytest.fixture() def mapsequence_different(aia171_test_map): """ Mapsequence allows that the size of the image data in each map be different. This mapsequence contains such maps.""" return sunpy.map.Map([aia171_test_map, aia171_test_map.superpixel((4, 4) * u.pix)], sequence=True) def test_all_maps_same_shape(mapsequence_all_the_same, mapsequence_different): """Make sure that Mapsequence knows if all the maps have the same shape""" assert mapsequence_all_the_same.all_maps_same_shape() assert not mapsequence_different.all_maps_same_shape() def test_at_least_one_map_has_mask(mapsequence_all_the_same, mapsequence_all_the_same_all_have_masks, mapsequence_all_the_same_some_have_masks ): """ Test that we can detect the presence of at least one masked map.""" assert not mapsequence_all_the_same.at_least_one_map_has_mask() assert mapsequence_all_the_same_all_have_masks.at_least_one_map_has_mask() assert mapsequence_all_the_same_some_have_masks.at_least_one_map_has_mask() def test_as_array(mapsequence_all_the_same, mapsequence_different, mapsequence_all_the_same_all_have_masks, mapsequence_all_the_same_some_have_masks): """Make sure the data in the mapsequence 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 mapsequence has differently shaped maps in # it. with pytest.raises(ValueError): mapsequence_different.as_array() # Test the case when none of the maps have a mask returned_array = mapsequence_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 = mapsequence_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 = mapsequence_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(mapsequence_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(mapsequence_all_the_same): """Tests that the correct number of map meta objects are returned, and that they are all map meta objects.""" meta = mapsequence_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] == mapsequence_all_the_same[i].meta for i in range(0, len(meta))])) def test_repr(mapsequence_all_the_same, mapsequence_different_maps): """ Tests that overidden __repr__ functionality works as expected. Test for mapsequence of same maps as well that of different maps. """ # Test the case of MapSequence having same maps expected_out = f'MapSequence of 2 elements, with maps from AIAMap' obtained_out = repr(mapsequence_all_the_same) assert obtained_out.startswith(object.__repr__(mapsequence_all_the_same)) assert len(mapsequence_all_the_same) == 2 assert expected_out in obtained_out # Test the case of MapSequence having different maps expected_out1 = f'MapSequence of 2 elements, with maps from AIAMap, EITMap' expected_out2 = f'MapSequence of 2 elements, with maps from EITMap, AIAMap' obtained_out = repr(mapsequence_different_maps) assert obtained_out.startswith(object.__repr__(mapsequence_different_maps)) assert len(mapsequence_different_maps) == 2 assert expected_out1 in obtained_out or expected_out2 in obtained_out def test_derotate(): with pytest.raises(NotImplementedError): sunpy.map.MapSequence(derotate=True) def test_repr_html(mapsequence_all_the_same): html_string = mapsequence_all_the_same._repr_html_() for m in mapsequence_all_the_same.maps: assert m._repr_html_() in html_string def test_quicklook(mapsequence_all_the_same): with mock.patch('webbrowser.open_new_tab') as mockwbopen: mapsequence_all_the_same.quicklook() # Check that the mock web browser was opened with a file URL mockwbopen.assert_called_once() file_url = mockwbopen.call_args[0][0] assert file_url.startswith('file://') # Open the file specified in the URL and confirm that it contains the HTML with open(file_url[7:], 'r') as f: html_string = f.read() for m in mapsequence_all_the_same.maps: assert m._repr_html_() in html_string @figure_test def test_norm_animator(hmi_test_map): seq = sunpy.map.Map([hmi_test_map, hmi_test_map], sequence=True) ani = seq.peek() ani._slider_changed(1, ani.sliders[ani.active_slider]._slider) return ani.fig @figure_test def test_map_sequence_plot(aia171_test_map, hmi_test_map): seq = sunpy.map.Map([aia171_test_map, hmi_test_map], sequence=True) seq.plot() @figure_test def test_map_sequence_plot_custom_cmap_norm(aia171_test_map, hmi_test_map): seq = sunpy.map.Map([aia171_test_map, hmi_test_map], sequence=True) animation = seq.plot(cmap='Greys', norm=ImageNormalize(vmin=0, vmax=100)) animation._step() def test_save(aia171_test_map, hmi_test_map, tmp_path): """ Tests the MapSequence save function """ seq = sunpy.map.Map([aia171_test_map, hmi_test_map], sequence=True) with pytest.raises(ValueError, match="'{index}' must be appear in the string"): seq.save("index", filetype='fits', overwrite=True) base_str = (tmp_path / "map").as_posix() seq.save(f"{base_str}_{{index:03}}.fits", filetype='auto', overwrite=True) test_seq = sunpy.map.Map(f"{base_str}_000.fits", f"{base_str}_001.fits", sequence=True) assert isinstance(test_seq.maps[0], sunpy.map.sources.sdo.AIAMap) assert isinstance(test_seq.maps[1], sunpy.map.sources.sdo.HMIMap) assert test_seq.maps[0].meta.keys() == seq.maps[0].meta.keys() for k in seq.maps[0].meta: assert test_seq.maps[0].meta[k] == seq.maps[0].meta[k] assert_quantity_allclose(test_seq.maps[0].data, seq.maps[0].data) assert test_seq.maps[1].meta.keys() == seq.maps[1].meta.keys() for k in seq.maps[1].meta: assert test_seq.maps[1].meta[k] == seq.maps[1].meta[k] assert_quantity_allclose(test_seq.maps[1].data, seq.maps[1].data) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/tests/test_maputils.py0000644000175100001710000002662700000000000020305 0ustar00vstsdockerimport numpy as np import pytest import astropy.units as u from astropy.coordinates import BaseCoordinateFrame, SkyCoord from astropy.tests.helper import assert_quantity_allclose import sunpy.map from sunpy.coordinates import HeliographicStonyhurst from sunpy.coordinates.frames import HeliographicCarrington from sunpy.coordinates.utils import GreatArc from sunpy.map.maputils import ( _verify_coordinate_helioprojective, all_coordinates_from_map, all_corner_coords_from_map, all_pixel_indices_from_map, contains_coordinate, contains_full_disk, contains_limb, contains_solar_center, coordinate_is_on_solar_disk, is_all_off_disk, is_all_on_disk, map_edges, on_disk_bounding_coordinates, sample_at_coords, solar_angular_radius, ) @pytest.fixture def all_off_disk_map(aia171_test_map): return aia171_test_map.submap((1, 1)*u.pix, top_right=(11, 12)*u.pix) @pytest.fixture def all_on_disk_map(aia171_test_map): return aia171_test_map.submap((30, 60)*u.pix, top_right=(50, 85)*u.pix) @pytest.fixture def straddles_limb_map(aia171_test_map): return aia171_test_map.submap((64, 80)*u.pix, top_right=(120, 127)*u.pix) @pytest.fixture def sub_smap(aia171_test_map): return aia171_test_map.submap((0, 0)*u.pix, top_right=(50, 60)*u.pix) @pytest.fixture def non_helioprojective_map(): data = np.arange(0, 100).reshape(10, 10) coord = SkyCoord(0*u.arcsec, 0*u.arcsec, obstime='2013-10-28 08:24', observer='earth', frame=HeliographicCarrington) header = sunpy.map.header_helper.make_fitswcs_header(data, coord, reference_pixel=[0, 0]*u.pixel, scale=[2, 2]*u.arcsec/u.pixel, telescope='Fake Telescope', instrument='UV detector', wavelength=1000*u.angstrom) return sunpy.map.Map(data, header) @pytest.fixture def non_helioprojective_skycoord(): return SkyCoord(0 * u.rad, 0 * u.rad, frame="icrs") @pytest.fixture def aia_test_arc(aia171_test_map): start = SkyCoord(735 * u.arcsec, -471 * u.arcsec, frame=aia171_test_map.coordinate_frame) end = SkyCoord(-100 * u.arcsec, 800 * u.arcsec, frame=aia171_test_map.coordinate_frame) return GreatArc(start, end) def test_all_pixel_indices_from_map(sub_smap): pixel_indices = all_pixel_indices_from_map(sub_smap) shape = sub_smap.data.shape ny = shape[0] nx = shape[1] assert np.all(pixel_indices.shape == (2, ny, nx)) assert np.all(pixel_indices.unit == u.pix) assert np.all(pixel_indices[:, 0, 0] == [0., 0.] * u.pix) assert np.all(pixel_indices[:, 0, nx-1] == [nx-1, 0.] * u.pix) assert np.all(pixel_indices[:, ny-1, 0] == [0., ny-1] * u.pix) assert np.all(pixel_indices[:, ny-1, nx-1] == [nx-1, ny-1] * u.pix) def test_all_coordinates_from_map(sub_smap): coordinates = all_coordinates_from_map(sub_smap) shape = sub_smap.data.shape assert coordinates.shape == (shape[0], shape[1]) assert isinstance(coordinates, SkyCoord) assert isinstance(coordinates.frame, BaseCoordinateFrame) assert coordinates.frame.name == sub_smap.coordinate_frame.name xpix, ypix = sub_smap.world_to_pixel(coordinates[0, 0]) assert_quantity_allclose(xpix, 0*u.pix, atol=1e-7*u.pix) assert_quantity_allclose(ypix, 0*u.pix, atol=1e-7*u.pix) xpix, ypix = sub_smap.world_to_pixel(coordinates[-1, -1]) assert_quantity_allclose(xpix, sub_smap.dimensions[0] - 1*u.pix) assert_quantity_allclose(ypix, sub_smap.dimensions[1] - 1*u.pix) def test_all_corner_coordinates_from_map(sub_smap): coordinates = all_corner_coords_from_map(sub_smap) shape = sub_smap.data.shape assert coordinates.shape == (shape[0] + 1, shape[1] + 1) assert isinstance(coordinates, SkyCoord) assert isinstance(coordinates.frame, BaseCoordinateFrame) assert coordinates.frame.name == sub_smap.coordinate_frame.name xpix, ypix = sub_smap.world_to_pixel(coordinates[0, 0]) assert_quantity_allclose(xpix, -0.5*u.pix) assert_quantity_allclose(ypix, -0.5*u.pix) xpix, ypix = sub_smap.world_to_pixel(coordinates[-1, -1]) assert_quantity_allclose(xpix, sub_smap.dimensions[0] - 0.5*u.pix) assert_quantity_allclose(ypix, sub_smap.dimensions[1] - 0.5*u.pix) def test_map_edges(all_off_disk_map): edges = map_edges(all_off_disk_map) assert type(edges) is tuple assert len(edges[2]) == 12 assert np.all(edges[2][0] == [0, 0] * u.pix) assert np.all(edges[2][11] == [0, 11] * u.pix) assert len(edges[3]) == 12 assert np.all(edges[3][0] == [10, 0] * u.pix) assert np.all(edges[3][11] == [10, 11] * u.pix) assert len(edges[1]) == 11 assert np.all(edges[1][0] == [0, 0] * u.pix) assert np.all(edges[1][10] == [10, 0] * u.pix) assert len(edges[0]) == 11 assert np.all(edges[0][0] == [0, 11] * u.pix) assert np.all(edges[0][10] == [10, 11] * u.pix) def test_solar_angular_radius(aia171_test_map): on_disk = aia171_test_map.center sar = solar_angular_radius(on_disk) assert isinstance(sar, u.Quantity) np.testing.assert_almost_equal(sar.to(u.arcsec).value, 971.80181131, decimal=1) def test_contains_full_disk(aia171_test_map, all_off_disk_map, all_on_disk_map, straddles_limb_map): assert contains_full_disk(aia171_test_map) assert ~contains_full_disk(all_off_disk_map) assert ~contains_full_disk(all_on_disk_map) assert ~contains_full_disk(straddles_limb_map) def test_is_all_off_disk(aia171_test_map, all_off_disk_map, all_on_disk_map, straddles_limb_map): assert ~is_all_off_disk(aia171_test_map) assert is_all_off_disk(all_off_disk_map) assert ~is_all_off_disk(all_on_disk_map) assert ~is_all_off_disk(straddles_limb_map) def test_is_all_on_disk(aia171_test_map, all_off_disk_map, all_on_disk_map, straddles_limb_map): assert ~is_all_on_disk(aia171_test_map) assert ~is_all_on_disk(all_off_disk_map) assert is_all_on_disk(all_on_disk_map) assert ~is_all_on_disk(straddles_limb_map) def test_contains_limb(aia171_test_map, all_off_disk_map, all_on_disk_map, straddles_limb_map): assert contains_limb(aia171_test_map) assert ~contains_limb(all_off_disk_map) assert ~contains_limb(all_on_disk_map) assert contains_limb(straddles_limb_map) def test_coordinate_is_on_solar_disk(aia171_test_map, all_off_disk_map, all_on_disk_map, straddles_limb_map): off_disk = aia171_test_map.bottom_left_coord on_disk = aia171_test_map.center # Check for individual coordinates assert coordinate_is_on_solar_disk(on_disk) assert ~coordinate_is_on_solar_disk(off_disk) # Raise the error with pytest.raises(ValueError): coordinate_is_on_solar_disk(on_disk.transform_to(HeliographicStonyhurst)) # Check for sets of coordinates assert np.any(coordinate_is_on_solar_disk(all_coordinates_from_map(aia171_test_map))) assert np.any(~coordinate_is_on_solar_disk(all_coordinates_from_map(aia171_test_map))) assert np.all(~coordinate_is_on_solar_disk(all_coordinates_from_map(all_off_disk_map))) assert np.all(coordinate_is_on_solar_disk(all_coordinates_from_map(all_on_disk_map))) assert np.any(coordinate_is_on_solar_disk(all_coordinates_from_map(straddles_limb_map))) assert np.any(~coordinate_is_on_solar_disk(all_coordinates_from_map(straddles_limb_map))) # Testing values are derived from running the code, not from external sources def test_on_disk_bounding_coordinates(aia171_test_map): bl, tr = on_disk_bounding_coordinates(aia171_test_map) np.testing.assert_almost_equal(bl.Tx.to(u.arcsec).value, -954.17124289, decimal=1) np.testing.assert_almost_equal(bl.Ty.to(u.arcsec).value, -965.93063472, decimal=1) np.testing.assert_almost_equal(tr.Tx.to(u.arcsec).value, 964.27061417, decimal=1) np.testing.assert_almost_equal(tr.Ty.to(u.arcsec).value, 971.63586861, decimal=1) def test_data_at_coordinates(aia171_test_map, aia_test_arc): data = sample_at_coords(aia171_test_map, aia_test_arc.coordinates()) pixels = np.asarray(np.rint( aia171_test_map.world_to_pixel(aia_test_arc.coordinates())), dtype=int) x = pixels[0, :] y = pixels[1, :] intensity_along_arc = aia171_test_map.data[y, x] np.testing.assert_almost_equal(data[0], intensity_along_arc[0], decimal=1) np.testing.assert_almost_equal(data[-1], intensity_along_arc[-1], decimal=1) def test_contains_solar_center(aia171_test_map, all_off_disk_map, all_on_disk_map, straddles_limb_map, sub_smap): assert contains_solar_center(aia171_test_map) assert not contains_solar_center(all_off_disk_map) assert not contains_solar_center(all_on_disk_map) assert not contains_solar_center(straddles_limb_map) assert not contains_solar_center(sub_smap) def test_verify_coordinate_helioprojective(aia171_test_map, all_off_disk_map, all_on_disk_map, straddles_limb_map, sub_smap, non_helioprojective_map, non_helioprojective_skycoord): # These should be helioprojective. _verify_coordinate_helioprojective(aia171_test_map.coordinate_frame) _verify_coordinate_helioprojective(all_off_disk_map.coordinate_frame) _verify_coordinate_helioprojective(all_on_disk_map.coordinate_frame) _verify_coordinate_helioprojective(straddles_limb_map.coordinate_frame) _verify_coordinate_helioprojective(sub_smap.coordinate_frame) # These are not. with pytest.raises(ValueError, match=r"HeliographicCarrington, .* Helioprojective"): _verify_coordinate_helioprojective(non_helioprojective_map.coordinate_frame) with pytest.raises(ValueError, match=r"ICRS, .* Helioprojective"): _verify_coordinate_helioprojective(non_helioprojective_skycoord) def test_functions_raise_non_frame_coords(non_helioprojective_skycoord): with pytest.raises(ValueError, match=r"ICRS, .* Helioprojective"): solar_angular_radius(non_helioprojective_skycoord) with pytest.raises(ValueError, match=r"ICRS, .* Helioprojective"): coordinate_is_on_solar_disk(non_helioprojective_skycoord) def test_functions_raise_non_frame_map(non_helioprojective_map): with pytest.raises(ValueError, match=r"HeliographicCarrington, .* Helioprojective"): contains_full_disk(non_helioprojective_map) with pytest.raises(ValueError, match=r"HeliographicCarrington, .* Helioprojective"): contains_solar_center(non_helioprojective_map) with pytest.raises(ValueError, match=r"HeliographicCarrington, .* Helioprojective"): is_all_off_disk(non_helioprojective_map) with pytest.raises(ValueError, match=r"HeliographicCarrington, .* Helioprojective"): contains_limb(non_helioprojective_map) with pytest.raises(ValueError, match=r"HeliographicCarrington, .* Helioprojective"): on_disk_bounding_coordinates(non_helioprojective_map) def test_contains_coord(aia171_test_map): smap = aia171_test_map for coord in [smap.bottom_left_coord, smap.top_right_coord, SkyCoord(0*u.deg, 0*u.deg, frame=smap.coordinate_frame)]: assert contains_coordinate(smap, coord) assert not contains_coordinate(smap, SkyCoord(2000*u.arcsec, 2000*u.arcsec, frame=smap.coordinate_frame)) multi_coord = SkyCoord([0, 2000]*u.arcsec, [0, 2000]*u.arcsec, frame=smap.coordinate_frame) assert (contains_coordinate(smap, multi_coord) == [True, False]).all() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/tests/test_plotting.py0000644000175100001710000002603300000000000020276 0ustar00vstsdocker""" Test Generic Map """ import copy import matplotlib.colors as mcolor import matplotlib.pyplot as plt import numpy as np import pytest from matplotlib.figure import Figure import astropy.units as u from astropy.coordinates import SkyCoord from astropy.wcs import WCS import sunpy import sunpy.coordinates import sunpy.data.test import sunpy.map from sunpy.coordinates import HeliographicStonyhurst from sunpy.tests.helpers import figure_test, fix_map_wcs from sunpy.util.exceptions import SunpyUserWarning testpath = sunpy.data.test.rootdir pytestmark = pytest.mark.filterwarnings('ignore:Missing metadata') @pytest.fixture def aia171_test_map(): return sunpy.map.Map(testpath / 'aia_171_level1.fits') @pytest.fixture def heliographic_test_map(): m = sunpy.map.Map(testpath / 'heliographic_phase_map.fits.gz') return fix_map_wcs(m) @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_plot_rotated_aia171(aia171_test_map): # Check that plotting a rotated map and a rectangle works as expected # Set rotation metadata aia171_test_map.meta['CROTA2'] = 45 # Plot map aia171_test_map.plot() # Plot rectangle bottom_left = SkyCoord( 0 * u.arcsec, 0 * u.arcsec, frame=aia171_test_map.coordinate_frame) w = 100 * u.arcsec h = 200 * u.arcsec aia171_test_map.draw_quadrangle(bottom_left, width=w, height=h) @figure_test def test_plot_aia171_clip(aia171_test_map): aia171_test_map.plot(clip_interval=(5., 99.)*u.percent) @figure_test def test_peek_aia171(aia171_test_map): aia171_test_map.peek() @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_rectangle_aia171_width_height(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_quadrangle(bottom_left, width=w, height=h) @figure_test def test_rectangle_aia171_top_right(aia171_test_map): aia171_test_map.plot() bottom_left = SkyCoord( 0 * u.arcsec, 0 * u.arcsec, frame=aia171_test_map.coordinate_frame) top_right = SkyCoord( 100 * u.arcsec, 100 * u.arcsec, frame=aia171_test_map.coordinate_frame) aia171_test_map.draw_quadrangle(bottom_left, top_right=top_right, label='Rectangle') plt.legend() # Check that the 'Rectangle' label shows up in the legend @figure_test def test_quadrangle_aia17_width_height(aia171_test_map): aia171_test_map.plot() bottom_left = SkyCoord( 50 * u.deg, -10 * u.deg, frame=HeliographicStonyhurst, obstime=aia171_test_map.date) w = 30 * u.deg h = 90 * u.deg aia171_test_map.draw_quadrangle(bottom_left=bottom_left, width=w, height=h) @figure_test def test_quadrangle_aia17_pix_width_height(aia171_test_map): aia171_test_map.plot() aia171_test_map.draw_quadrangle(bottom_left=(50, 50)*u.pix, width=30*u.pix, height=50*u.pix, edgecolor="cyan") @figure_test def test_quadrangle_aia17_top_right(aia171_test_map): aia171_test_map.plot() bottom_left = SkyCoord( 50 * u.deg, -10 * u.deg, frame=HeliographicStonyhurst, obstime=aia171_test_map.date) top_right = SkyCoord( 65 * u.deg, 50 * u.deg, frame=HeliographicStonyhurst, obstime=aia171_test_map.date) aia171_test_map.draw_quadrangle(bottom_left, top_right=top_right, label='Quadrangle') plt.legend() # Check that the 'Quadrangle' label shows up in the legend @figure_test def test_quadrangle_aia17_pix_top_right(aia171_test_map): aia171_test_map.plot() aia171_test_map.draw_quadrangle(bottom_left=(50, 50)*u.pix, top_right=(80, 90)*u.pix, edgecolor='cyan') @figure_test def test_quadrangle_aia17_pix_top_right_different_axes(aia171_test_map): # Plot the map rotated by 30 degrees aia171_test_map.rotate(30*u.deg).plot() # Plot a rectangle in the pixel space of the original map aia171_test_map.draw_quadrangle(bottom_left=(50, 50)*u.pix, top_right=(80, 90)*u.pix, edgecolor='cyan') @figure_test def test_quadrangle_aia17_pix_top_right_different_axes(aia171_test_map): aia171_test_map.rotate(30*u.deg).plot() aia171_test_map.draw_quadrangle(bottom_left=(50, 50)*u.pix, top_right=(80, 90)*u.pix, edgecolor='cyan') @figure_test def test_plot_masked_aia171(aia171_test_map_with_mask): aia171_test_map_with_mask.plot() @figure_test def test_plot_aia171_superpixel(aia171_test_map): aia171_test_map.superpixel((3, 2) * u.pix, offset=(4, 4) * u.pix).plot() @figure_test def test_plot_resample(carrington_map): # Test that super-pixelling a map preserves the coordinate system correctly. # The two plots should have identical coordinate grids resamp = carrington_map.resample([10, 5] * u.pix) plt.figure() ax1 = plt.subplot(121, projection=carrington_map) ax2 = plt.subplot(122, projection=resamp) carrington_map.plot(axes=ax1) resamp.plot(axes=ax2) for ax in [ax1, ax2]: ax.coords.grid(True, color='tab:red', ls='solid', lw=2, alpha=1) @figure_test def test_plot_superpixel(carrington_map): # Test that super-pixelling a map preserves the coordinate system correctly. # The two plots should have identical coordinate grids superpix = carrington_map.superpixel([2, 2] * u.pix) plt.figure() ax1 = plt.subplot(121, projection=carrington_map) ax2 = plt.subplot(122, projection=superpix) carrington_map.plot(axes=ax1) superpix.plot(axes=ax2) for ax in [ax1, ax2]: ax.coords.grid(True, color='tab:red', ls='solid', lw=2, alpha=1) @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_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_draw_contours_different_wcs(aia171_test_map): aia171_test_map._data = aia171_test_map.data.astype('float32') rotated_map = aia171_test_map.rotate(30*u.deg, order=3) rotated_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_quadrangle_width_height(heliographic_test_map): heliographic_test_map.plot() bottom_left = 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_quadrangle(bottom_left, width=w, height=h, edgecolor='cyan') @figure_test def test_heliographic_quadrangle_top_right(heliographic_test_map): heliographic_test_map.plot() bottom_left = SkyCoord( 60 * u.deg, 50 * u.deg, frame=heliographic_test_map.coordinate_frame) top_right = SkyCoord( 80 * u.deg, 90 * u.deg, frame=heliographic_test_map.coordinate_frame) heliographic_test_map.draw_quadrangle(bottom_left, top_right=top_right, edgecolor='cyan') # See https://github.com/sunpy/sunpy/issues/4294 to track this warning. Ideally # it should not be filtered, and the cause of it fixed. @pytest.mark.filterwarnings(r'ignore:Numpy has detected that you \(may be\) writing to an array with\noverlapping memory') @figure_test def test_heliographic_grid_annotations(heliographic_test_map): heliographic_test_map.plot() heliographic_test_map.draw_grid(annotate=False) def test_plot_norm_error(aia171_test_map): # Check that duplicating vmin, vmax raises an error norm = mcolor.Normalize(vmin=0, vmax=1) with pytest.raises(ValueError, match='Cannot manually specify vmin'): aia171_test_map.plot(norm=norm, vmin=0) with pytest.raises(ValueError, match='Cannot manually specify vmax'): aia171_test_map.plot(norm=norm, vmax=0) def test_quadrangle_no_wcsaxes(aia171_test_map): ax = Figure().add_subplot(projection=None) # create a non-WCSAxes plot bottom_left = SkyCoord( [0, 1] * u.arcsec, [0, 1] * u.arcsec, frame=aia171_test_map.coordinate_frame) with pytest.raises(TypeError, match='WCSAxes'): aia171_test_map.draw_quadrangle(bottom_left, axes=ax) def test_different_wcs_plot_warning(aia171_test_map, hmi_test_map): aia171_test_map.plot() with pytest.warns(SunpyUserWarning, match=(r'The map world coordinate system \(WCS\) is different ' 'from the axes WCS')): hmi_test_map.plot(axes=plt.gca()) @figure_test def test_draw_limb_different_observer(aia171_test_map): # Create a new map from the test map with a different observer location new_map = copy.deepcopy(aia171_test_map) del new_map.meta['haex_obs'] del new_map.meta['haey_obs'] del new_map.meta['haez_obs'] new_map.meta['hgln_obs'] = 45 new_map.meta['hglt_obs'] = 10 aia171_test_map.plot() new_map.draw_limb(color='red') @figure_test def test_draw_limb_heliographic_stonyhurst(aia171_test_map): # Create the WCS header for HGS axes header = { 'date-obs': aia171_test_map.date.utc.isot, 'naxis': 2, 'naxis1': 360, 'naxis2': 180, 'ctype1': 'HGLN-CAR', 'ctype2': 'HGLT-CAR', 'cdelt1': 1, 'cdelt2': 1, 'cunit1': 'deg', 'cunit2': 'deg', 'crpix1': 180.5, 'crpix2': 90.5, 'crval1': 0, 'crval2': 0, 'lonpole': 0, } fig = Figure() ax = fig.add_subplot(projection=WCS(header)) aia171_test_map.draw_limb(axes=ax, color='red') ax.set_xlim(0, 360) ax.set_ylim(0, 180) return fig @figure_test def test_plot_autoalign(aia171_test_map): aia171_test_map._data = aia171_test_map.data.astype('float32') rotated_map = aia171_test_map.rotate(30*u.deg, order=3) # Plotting the rotated map on the original projection should appear de-rotated fig = Figure() ax = fig.add_subplot(projection=aia171_test_map) rotated_map.plot(axes=ax, autoalign=True) return fig def test_plot_autoalign_bad_inputs(aia171_test_map): with pytest.raises(ValueError): aia171_test_map.plot(autoalign='bad') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/map/tests/test_reproject_to.py0000644000175100001710000001056600000000000021141 0ustar00vstsdocker""" Test the `GenericMap.reproject_to()` method """ import warnings import numpy as np import pytest from matplotlib.testing.decorators import check_figures_equal import astropy.units as u from astropy.coordinates import SkyCoord from astropy.wcs import WCS import sunpy.map from sunpy.tests.helpers import figure_test @pytest.fixture def hgs_header(aia171_test_map): return sunpy.map.make_fitswcs_header( (180, 360), SkyCoord(0*u.deg, 0*u.deg, frame='heliographic_stonyhurst', obstime=aia171_test_map.date, rsun=aia171_test_map.coordinate_frame.rsun), scale=(1, 1)*u.deg/u.pix, projection_code='CAR' ) @pytest.fixture def hpc_header(aia171_test_map): new_observer = SkyCoord(45*u.deg, 0*u.deg, 1*u.AU, frame='heliographic_stonyhurst', obstime=aia171_test_map.date) return sunpy.map.make_fitswcs_header( aia171_test_map.data.shape, SkyCoord(0*u.arcsec, 0*u.arcsec, frame='helioprojective', obstime=aia171_test_map.date, observer=new_observer, rsun=aia171_test_map.coordinate_frame.rsun), scale=u.Quantity(aia171_test_map.scale), projection_code='TAN' ) @figure_test def test_reproject_to_hgs(aia171_test_map, hgs_header): aia171_test_map.reproject_to(hgs_header).plot() @check_figures_equal(extensions=["png"]) def test_reproject_to_hgs_wcs(fig_test, fig_ref, aia171_test_map, hgs_header): with warnings.catch_warnings(): # NumPy <1.19 emits a RuntimeWarning because of comparison against NaNs warnings.filterwarnings("ignore", message='invalid value encountered', category=RuntimeWarning) # Tests whether reprojecting to a WCS instance gives the same answer as to a header header_map = aia171_test_map.reproject_to(hgs_header) wcs_map = aia171_test_map.reproject_to(WCS(hgs_header)) ax_ref = fig_ref.add_subplot(projection=header_map) header_map.plot(axes=ax_ref) ax_test = fig_test.add_subplot(projection=wcs_map) wcs_map.plot(axes=ax_test) @check_figures_equal(extensions=["png"]) def test_reproject_to_hpc_default(fig_test, fig_ref, aia171_test_map, hpc_header): with warnings.catch_warnings(): # NumPy <1.19 emits a RuntimeWarning because of comparison against NaNs warnings.filterwarnings("ignore", message='invalid value encountered', category=RuntimeWarning) # Tests whether the default reprojection is "interpolation" default_map = aia171_test_map.reproject_to(hpc_header) interpolation_map = aia171_test_map.reproject_to(hpc_header, algorithm='interpolation') ax_ref = fig_ref.add_subplot(projection=interpolation_map) interpolation_map.plot(axes=ax_ref) ax_test = fig_test.add_subplot(projection=default_map) default_map.plot(axes=ax_test) @figure_test def test_reproject_to_hpc_interpolation(aia171_test_map, hpc_header): aia171_test_map.reproject_to(hpc_header, algorithm='interpolation').plot() @figure_test def test_reproject_to_hpc_exact(aia171_test_map, hpc_header): aia171_test_map.reproject_to(hpc_header, algorithm='exact').plot() @figure_test def test_reproject_to_hpc_adaptive(aia171_test_map, hpc_header): aia171_test_map.reproject_to(hpc_header, algorithm='adaptive').plot() def test_return_footprint(aia171_test_map, hpc_header): with warnings.catch_warnings(): # NumPy <1.19 emits a RuntimeWarning because of comparison against NaNs warnings.filterwarnings("ignore", message='invalid value encountered', category=RuntimeWarning) return_without_footprint = aia171_test_map.reproject_to(hpc_header) assert isinstance(return_without_footprint, sunpy.map.GenericMap) return_with_footprint = aia171_test_map.reproject_to(hpc_header, return_footprint=True) assert len(return_with_footprint) == 2 assert isinstance(return_with_footprint[0], sunpy.map.GenericMap) assert isinstance(return_with_footprint[1], np.ndarray) def test_invalid_inputs(aia171_test_map, hpc_header): with pytest.raises(ValueError, match="The specified algorithm must be one of"): aia171_test_map.reproject_to(hpc_header, algorithm='something') ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6332753 sunpy-3.1.5/sunpy/net/0000755000175100001710000000000000000000000013670 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/__init__.py0000644000175100001710000000067700000000000016013 0ustar00vstsdocker # Import and register the clients but we do not want them in the namespace, we import them as _ from sunpy.net import base_client as _ from sunpy.net import cdaweb as _ from sunpy.net import dataretriever as _ from sunpy.net import hek as _ from sunpy.net import helio as _ from sunpy.net import jsoc as _ from sunpy.net import vso as _ from sunpy.net.fido_factory import Fido from sunpy.net.scraper import Scraper __all__ = ["Fido", "Scraper"] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/_attrs.py0000644000175100001710000002130000000000000015532 0ustar00vstsdocker""" Implementation of global attrs. These are defined in here to keep the `sunpy.net.attrs` namespace clean, and to prevent circular imports. """ import collections.abc import astropy.units as u from sunpy.time import TimeRange, parse_time from sunpy.time.time import _variables_for_parse_time_docstring from sunpy.util.decorators import add_common_docstring from .attr import Range, SimpleAttr __all__ = ['Physobs', 'Resolution', 'Detector', 'Sample', 'Level', 'Instrument', 'Wavelength', 'Time', 'Source', 'Provider'] @add_common_docstring(**_variables_for_parse_time_docstring()) class Time(Range): """ Specify the time range of the query. Parameters ---------- start : {parse_time_types} The start time in a format parseable by `~sunpy.time.parse_time` or a `sunpy.time.TimeRange` object. end : {parse_time_types} The end time of the range. near : {parse_time_types} 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. """ type_name = "time" 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, self.end = start.start, start.end else: self.start, self.end = parse_time(start), parse_time(end) if self.start > self.end: raise ValueError("End time must be after start time.") self.near = parse_time(near) if near else None super().__init__(self.start, self.end) def __hash__(self): if not isinstance(self.start, collections.abc.Hashable) or \ not isinstance(self.end, collections.abc.Hashable): # The hash is the hash of the start and end time return hash((self.start.jd1, self.start.jd2, self.start.scale, self.end.jd1, self.end.jd2, self.end.scale)) else: return super().__hash__() def collides(self, other): # Use exact type checking here, because otherwise it collides with all # subclasses of itself which can have completely different search # meanings. return type(other) is type(self) 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 super().__xor__(other) def pad(self, timedelta): return type(self)(self.start - timedelta, self.start + timedelta) def __repr__(self): start = self.start.iso end = self.end.iso iso = self.near.iso if self.near else None str_repr = ", ".join(str(param) for param in [start, end, iso] if param) return f'' class Wavelength(Range): type_name = 'wave' 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 wavemax is None: 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: raise u.UnitsError(f"This unit is not convertable to any of {supported_units}") wavemin, wavemax = sorted([wavemin.to(unit), wavemax.to(unit)]) self.unit = unit super().__init__(wavemin, wavemax) def collides(self, other): return isinstance(other, self.__class__) def __repr__(self): return f"" class Instrument(SimpleAttr): """ Specifies the Instrument name for the search. Parameters ---------- value : `str` Notes ----- More information about each instrument supported by the VSO may be found within the VSO Registry. For a list of instruments see https://sdac.virtualsolar.org/cgi/show_details?keyword=INSTRUMENT. """ def __init__(self, value): if not isinstance(value, str): raise ValueError("Instrument names must be strings") super().__init__(value) class Level(SimpleAttr): """ 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 `str` 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 < > <= >= """ class Sample(SimpleAttr): """ Time interval for data sampling. Parameters ---------- value : `astropy.units.Quantity` A sampling rate convertible to seconds. """ @u.quantity_input def __init__(self, value: u.s): super().__init__(value) self.value = value.to_value(u.s) class Detector(SimpleAttr): """ The detector from which the data comes from. Parameters ---------- value : `str` """ class Resolution(SimpleAttr): """ Resolution level of the data. Parameters ---------- value : `float` or `str` 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. """ class Physobs(SimpleAttr): """ Specifies the physical observable the VSO can search for. Parameters ---------- value : `str` A keyword describing the observable in the data. Notes ----- More information about the values of physobs used by the VSO registry can be found at https://sdac.virtualsolar.org/cgi/show_details?keyword=PHYSOBS. """ class Provider(SimpleAttr): """ Specifies the data provider to search for data using Fido. Parameters ---------- value : str A keyword describing the Provider for the data. Notes ----- For VSO, more information about each provider may be found within in the VSO Registry. See `VSO providers `__. """ class Source(SimpleAttr): """ Data sources that Fido can search with. Parameters ---------- value : str A keyword describing the Data Source. Notes ----- For VSO, more information about each source may be found within in the VSO Registry. See `VSO sources `__. Please note that 'Source' is used internally by VSO to represent what the VSO Data Model refers to as 'Observatory'. """ class ExtentType(SimpleAttr): """ The type of Extent; for example, "FULLDISK", "SYNOPTIC", "LIMB", etc. """ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/attr.py0000644000175100001710000005721500000000000015226 0ustar00vstsdocker""" 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 `functools.singledispatch` modified to dispatch on the second argument to the function. Please note that & is evaluated first, so A & B | C is equivalent to (A & B) | C. """ import re import string import inspect import keyword import textwrap from textwrap import dedent from collections import namedtuple, defaultdict from astropy.table import Table from astropy.utils.misc import isiterable from sunpy.extern import inflect from sunpy.util.functools import seconddispatch from sunpy.util.util import get_width _ATTR_TUPLE = namedtuple("attr", "name client name_long desc") # Matches any number. NUMBER_REGEX = re.compile(r"^(\d+$|\d(?:\.\d+)?)") __all__ = ['Attr', 'DataAttr', 'DummyAttr', 'SimpleAttr', 'Range', 'AttrAnd', 'AttrOr', 'ValueAttr', 'and_', 'or_', 'AttrWalker', 'AttrComparison', 'ComparisonParamAttrWrapper'] def make_tuple(): return _ATTR_TUPLE([], [], [], []) def _print_attrs(attr, html=False): """ Given a Attr class will print out each registered attribute. Parameters ---------- attr : `sunpy.net.attr.Attr` The attr class/type to print for. html : bool Will return a html table instead. Returns ------- `str` String with the registered attributes. """ attrs = attr._attr_registry[attr] # Only sort the attrs if any have been registered sorted_attrs = _ATTR_TUPLE(*zip(*sorted(zip(*attrs)))) if attrs.name else make_tuple() *other_row_data, descs = sorted_attrs descs = [(dsc[:77] + '...') if len(dsc) > 80 else dsc for dsc in descs] table = Table(names=["Attribute Name", "Client", "Full Name", "Description"], dtype=["U80", "U80", "U80", "U80"], data=[*other_row_data, descs]) class_name = f"{(attr.__module__ + '.') or ''}{attr.__name__}" lines = [class_name] # If the attr lacks a __doc__ this will error and prevent this from returning anything. try: lines.append(dedent(attr.__doc__.partition("\n\n")[0]) + "\n") except AttributeError: pass format_line = "

{}

" if html else "{}" width = -1 if html else get_width() lines = [*[format_line.format(line) for line in lines], *table.pformat_all(show_dtype=False, max_width=width, align="<", html=html)] return '\n'.join(lines) class AttrMeta(type): """ We want to enable discovery, by tab completion, of values for all subclasses of Attr. So have to create a metaclass that overloads the methods that Python uses, so that they work on the classes. This would allow that `attrs.Instrument` to be able to tab complete to `attrs.Instrument.aia`. """ # The aim is to register Attrs as a namedtuple of lists # So we define the namedtuple outside of AttrMeta, see above. _attr_registry = defaultdict(make_tuple) def __getattr__(self, item): """ Our method for Attrs is to register using the attribute type (i.e. Instrument) as keys in a dictionary. ``_attr_registry`` is a dictionary with the keys being subclasses of Attr and the value being the namedtuple of lists. As a result we index `_attr_registry` with `[self]` which will be the `type` of the `Attr` class to access the dictionary. This will return the namedtuple that has three attributes: `name`, `name_long` and `desc`. Each of which are a list. `name` will be the attribute name, `name_long` is the original name passed in and `desc` the description of the object. """ # Get the revelant entries. registry = self._attr_registry[self] # All the attribute names under that type(Attr) names = registry.name try: # We return Attr(name_long) to create the Attr requested. return self(registry.name_long[names.index(item)]) except ValueError: raise AttributeError(f'This attribute, {item} is not defined, please register it.') def __dir__(self): """ To tab complete in Python we need to add to the `__dir__()` return. So we add all the registered values for this subclass of Attr to the output. """ custom_attrs = set(self._attr_registry[self].name) # "all" can be registered as a documentation helper, but isn't a valid attr custom_attrs.discard("all") return super().__dir__() + list(custom_attrs) def __repr__(self): """ Returns the normal repr plus the pretty attr __str__. """ return f"{type.__repr__(self)}\n{str(self)}" def __str__(self): """ This enables the "pretty" printing of Attrs. """ return _print_attrs(self) def _repr_html_(self): """ This enables the "pretty" printing of Attrs with html. """ return _print_attrs(self, html=True) class Attr(metaclass=AttrMeta): """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, *other.attrs]) return AttrAnd([self, other]) def __hash__(self): return hash(frozenset(vars(self).items())) def __or__(self, other): # Optimization. if self == other: return self if isinstance(other, AttrOr): return AttrOr([self, *other.attrs]) return AttrOr([self, other]) def collides(self, other): raise NotImplementedError def __eq__(self, other): if not isinstance(other, Attr): return False return vars(self) == vars(other) @classmethod def update_values(cls, adict): """ Clients will use this method to register their values for subclasses of `~sunpy.net.attr.Attr`. The input has to be a dictionary, with each key being an instance of a client. The value for each client has to be a dictionary with each key being a subclass of Attr. The value for each Attr key should be a list of tuples with each tuple of the form ``(Name, Description)``. If you do not want to add a description, you can put `None` or an empty string. We sanitize the name you provide by removing all special characters and making it all lower case. If it still invalid we will append to the start of the name to make it a valid attribute name. This is an ugly workaround, so please try to pick a valid attribute name. **It is recommended that clients register values for all attrs used by their `_can_handle_query` method.** Parameters ---------- adict : `dict` The keys for this dictionary have to be an instance of a downloader client. The values for each client are a dictionary that has keys of `~sunpy.net.attr.Attr`. Each key should have a list of tuples as it value. Each tuple should be a pair of strings. First string is the attribute name you want to register Second string is the description of the attribute. Examples -------- # The first import is to make this example work, it should not be used otherwise >>> from sunpy.net.dataretriever import GenericClient >>> from sunpy.net import attr, attrs >>> attr.Attr.update_values({GenericClient : { ... attrs.Instrument: [('AIA', 'AIA is in Space.'), ... ('HMI', 'HMI is next to AIA.')]}}) # doctest: +SKIP >>> attr.Attr._attr_registry[attrs.Instrument] # doctest: +SKIP attr(name=['aia', 'hmi'], client=['Generic', 'Generic'], name_long=['AIA', 'HMI'], desc=['AIA is in Space.', 'HMI is next to AIA.']) >>> attr.Attr._attr_registry[attrs.Instrument].name # doctest: +SKIP ['aia', 'hmi'] >>> attr.Attr._attr_registry[attrs.Instrument].name_long # doctest: +SKIP ['AIA', 'HMI'] >>> attr.Attr._attr_registry[attrs.Instrument].desc # doctest: +SKIP ['AIA is in Space.', 'HMI is next to AIA.'] >>> attrs.Instrument.aia, attrs.Instrument.hmi # doctest: +SKIP (, ) """ for client, attr_dict in adict.items(): for attr, attr_values in attr_dict.items(): if not isiterable(attr_values) or isinstance(attr_values, str): raise ValueError(f"Invalid input value: {attr_values} for key: {repr(attr)}. " "The value is not iterable or just a string.") attr_tuple = cls._attr_registry[attr] for pair in attr_values: if len(pair) > 2: raise ValueError(f'Invalid length (!=2) for values: {attr_values}.') elif len(pair) == 1: if pair[0] != "*": raise ValueError( f'Invalid value given for * registration: {attr_values}.') # Special case handling for * aka all values allowed. pair = ["all", "All values of this type are supported."] # Sanitize part one: Check if the name has a number in it number_match = NUMBER_REGEX.match(pair[0]) p = inflect.engine() try: number_str = number_match.group(1) name = p.number_to_words(number_str) if number_str != number_match.string: name = name + "_" + number_match.string[number_match.end(1):] except AttributeError: name = pair[0] # Sanitize part two: remove punctuation and replace it with _ name = re.sub('[%s]' % re.escape(string.punctuation), '_', name) # Sanitize name, we remove all special characters name = ''.join(char for char in name if char.isidentifier() or char.isnumeric()) # Make name lower case name = name.lower() if keyword.iskeyword(name): # Attribute name has been appended with `_` # to make it a valid identifier since its a python keyword. name = name + '_' attr_tuple[0].append(name) attr_tuple[1].append(client.__name__.replace("Client", "")) attr_tuple[2].append(pair[0]) attr_tuple[3].append(pair[1]) class DataAttr(Attr): """ A base class for attributes classes which contain data. This is to differentiate them from classes like `sunpy.net.attr.AttrAnd` or the base `sunpy.net.attr.Attr` class which do not. The motivation for this distinction is to make it easier for walkers to match all classes which are not user specified Attrs. """ def __new__(cls, *args, **kwargs): if cls is DataAttr: raise TypeError("You should not directly instantiate DataAttr, only it's subclasses.") return super().__new__(cls) def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) # Because __new__() is defined, this will block natural introspection of the arguments for # __init__() in all subclasses because the signature of __new__() takes precedence over the # signature of __init__(). We add a __new__() to all subclasses that do not explicitly # define it with a signature that matches __init__(). if '__new__' not in cls.__dict__: unsigned_new = cls.__new__ # the inherited __new__() def signed_new(cls, *args, **kwargs): return unsigned_new(cls, *args, **kwargs) signed_new.__signature__ = inspect.signature(cls.__init__) cls.__new__ = signed_new 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. .. code-block:: python 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 SimpleAttr(DataAttr): """ An attribute that only has a single value. This type of attribute is not a composite and has a single value such as ``Instrument('EIT')``. Parameters ---------- value : `object` The value for the attribute to hold. """ def __init__(self, value): super().__init__() self.value = value def collides(self, other): return isinstance(other, self.__class__) def __repr__(self): obj_placeholder = " object " attr_reg = AttrMeta._attr_registry[self.__class__] new_repr = object.__repr__(self).split(obj_placeholder) # If somehow the idx isn't in the attr reg, # we still want it to print it repr without error. try: idx = attr_reg.name_long.index(self.value) obj_value_repr = f"({self.value}: {attr_reg.desc[idx]})" except ValueError: obj_value_repr = f": {self.value}" new_repr = [new_repr[0], obj_value_repr, obj_placeholder, new_repr[1]] return textwrap.fill("".join(new_repr), 100) @property def type_name(self): return self.__class__.__name__.lower() class AttrComparison(DataAttr): """ Allows a Attr to have a value and a comparison operator. """ def __init__(self, name, operator, value): super().__init__() self.name = name self.operator = operator self.value = value def collides(self, other): if not isinstance(other, self.__class__): return False return self.operator == other.operator and self.name == other.name class ComparisonParamAttrWrapper: def __init__(self, name): self.name = name def __lt__(self, other): return AttrComparison(self.name, '<', other) def __le__(self, other): return AttrComparison(self.name, '<=', other) def __gt__(self, other): return AttrComparison(self.name, '>', other) def __ge__(self, other): return AttrComparison(self.name, '>=', other) def __eq__(self, other): return AttrComparison(self.name, '=', other) def __ne__(self, other): return AttrComparison(self.name, '!=', other) def collides(self, other): return isinstance(other, ComparisonParamAttrWrapper) class Range(DataAttr): """ An attribute that represents a range of a value. This type of attribute would be applicable for types like Wavelength or Time. The range is inclusive of both the min and max. Parameters ---------- min_ : `object` The lower bound of the range. max_ : `object` The upper bound of the range. """ def __init__(self, min_, max_): self.min = min_ self.max = max_ super().__init__() def __xor__(self, other): if not isinstance(other, type(self)): return NotImplemented new = DummyAttr() if self.min < other.min: new |= type(self)(self.min, min(other.min, self.max)) if other.max < self.max: new |= type(self)(other.max, self.max) return new def __contains__(self, other): if isinstance(other, Range): return self.min <= other.min and self.max >= other.max else: return self.min <= other <= self.max class AttrAnd(Attr): """ Attribute representing attributes ANDed together. """ def __init__(self, attrs): super().__init__() 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 f"" 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): super().__init__() 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 f"" 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) # This appears to only be used as a base type for the Walker, i.e. a common # denominator for the walker to convert to whatever the output of the walker is # going to be. class ValueAttr(DataAttr): def __init__(self, attrs): super().__init__() self.attrs = attrs def __repr__(self): return f"" def __hash__(self): return hash(frozenset(self.attrs.items())) 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: """ Traverse the Attr tree and convert it to a different representation. The ``AttrWalker`` can walk a complex tree of attrs and represent that tree in a way that is useful to the client using the attrs. For the VSO client it generates a ``VSOQueryResponseTable`` object, for the database module it performs database queries and returns results from the database. The walker has three core operations that can be applied to the tree, all of these are functions which are applied to one or more `~sunpy.net.attr.Attr` types, using conditional dispatch based on type. * creators: Creators when given an `~sunpy.net.attr.Attr` return a new object. * appliers: Appliers process an `~sunpy.net.attr.Attr` type and modify any arguments passed. * converters: Converters convert types unknown to any other creator or appliers to types known by them. They take in an `~sunpy.net.attr.Attr` type and return a different one. """ def __repr__(self): creators = list(self.createmm.registry.keys()) appliers = list(self.applymm.registry.keys()) return f"""{super().__repr__()} Registered creators:\n {creators}\n Registered appliers:\n {appliers}""" @staticmethod def _unknown_type_apply(*args, **kwargs): raise TypeError( f"{args[1]} or any of its parents have not been registered using " "add_applier() with the AttrWalker") @staticmethod def _unknown_type_create(*args, **kwargs): raise TypeError( f"{args[1]} or any of its parents have not been registered using " "add_creator() with the AttrWalker") def __init__(self): self.applymm = seconddispatch(self._unknown_type_apply) self.createmm = seconddispatch(self._unknown_type_create) def create(self, *args, **kwargs): """ Call the create function(s) matching the arguments to this method. """ return self.createmm(self, *args, **kwargs) def apply(self, *args, **kwargs): """ Call the apply function(s) matching the arguments to this method. """ return self.applymm(self, *args, **kwargs) def add_creator(self, *types): """ Register all specified types with this function for the ``.create`` method. """ def _dec(fun): for type_ in types: self.createmm.register(type_, fun) return fun return _dec def add_applier(self, *types): """ Register all specified types with this function for the ``.apply`` method. """ def _dec(fun): for type_ in types: self.applymm.register(type_, fun) return fun return _dec def add_converter(self, *types): """ Register a function to convert the specified type into a known type for create and apply. After a converter is run, create or apply will be called again with the new types. """ def _dec(fun): for type_ in types: self.applymm.register(type_, self._cv_apply(fun)) self.createmm.register(type_, self._cv_create(fun)) return fun return _dec def _cv_apply(self, fun): """ Call the converter and then re-call apply. """ def _fun(*args, **kwargs): args = list(args) args[1] = fun(args[1]) return self.applymm(*args, **kwargs) return _fun def _cv_create(self, fun): """ Call the converter and then re-call convert. """ def _fun(*args, **kwargs): args = list(args) args[1] = fun(args[1]) return self.createmm(*args, **kwargs) return _fun 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 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/attrs.py0000644000175100001710000000254000000000000015400 0ustar00vstsdocker """ 'attrs' are parameters which can be composed together to specify searches to `sunpy.net.Fido`. They can be combined by using logical and (``&``) and logical or (``|``) operations to construct very complex queries. For example you could combine two instruments using or (``|``) with a time specification and a sample cadence using:: >>> import astropy.units as u >>> from sunpy.net import Fido, attrs as a >>> a.Time("2011/01/01", "2011/01/02") & (a.Instrument.aia | a.Instrument.hmi) & a.Sample(1*u.day)) # doctest: +SKIP In addition to the core attrs defined here, other sunpy clients also provide attrs specific to them, under: * `a.vso ` * `a.jsoc ` * `a.goes ` * `a.hek ` * `a.helio ` """ from ._attrs import ( Detector, ExtentType, Instrument, Level, Physobs, Provider, Resolution, Sample, Source, Time, Wavelength, ) # Trick the docs into thinking these attrs are defined in here. for _a in (Time, Instrument, Wavelength, Level, Sample, Detector, Resolution, Physobs, Source, Provider, ExtentType): _a.__module__ = __name__ __all__ = ['Time', 'Instrument', 'Wavelength', 'Level', 'ExtentType', 'Sample', 'Detector', 'Resolution', 'Physobs', 'Source', 'Provider'] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/base_client.py0000644000175100001710000003721600000000000016523 0ustar00vstsdockerimport re import string import importlib from abc import ABC, abstractmethod from textwrap import dedent from functools import wraps from collections.abc import Sequence from astropy.table import Column, QTable, Row, Table, TableAttribute from sunpy.util.util import get_width __all__ = ['QueryResponseColumn', 'BaseQueryResponse', 'QueryResponseRow', 'QueryResponseTable', 'BaseClient', 'convert_row_to_table'] class BaseQueryResponse(Sequence): """ An Abstract Base Class for results returned from BaseClient. Notes ----- * A QueryResponse object must be able to be instantiated with only one iterable argument. (i.e. the ``__init__`` must only have one required argument). * The `client` property must be settable. * The base class does not prescribe how you store the results from your client, only that it must be possible to represent them as an astropy table in the ``build_table`` method. * ``__getitem__`` **must** return an instance of the type it was called on. I.e. it must always return an object of ``type(self)``. """ @abstractmethod def build_table(self): """ Return an `astropy.table.Table` representation of the query response. """ @property @abstractmethod def client(self): """ An instance of `BaseClient` used to generate the results. Generally this is used to fetch the results later. .. note:: In general, this doesn't have to be the same instance of ``BaseClient``, this is left to the client developer. If there is a significant connection overhead in creating an instance of a client you might want it to be the same instance as used for the search. """ @client.setter @abstractmethod def client(self, value): pass @property @abstractmethod def blocks(self): """ A `collections.abc.Sequence` object which contains the records contained within the Query Response. """ def response_block_properties(self): """ Returns a set of class attributes on all the response blocks. Returns ------- s : `set` List of strings, containing attribute names in the response blocks. """ return set() def __str__(self): """Print out human-readable summary of records retrieved""" return '\n'.join(self.build_table().pformat(show_dtype=False)) def __repr__(self): """Print out human-readable summary of records retrieved""" return object.__repr__(self) + "\n" + str(self) def _repr_html_(self): return self.build_table()._repr_html_() def show(self, *cols): """ Returns response tables with desired columns for the Query. Parameters ---------- \\*cols : `tuple` Name of columns to be shown. Returns ------- `astropy.table.Table` A table showing values for specified columns. """ table = self.build_table() if len(cols) == 0: return table tablecols = table.columns valid_cols = [col for col in cols if col in tablecols] return table[valid_cols] class QueryResponseRow(Row): """ A row subclass which knows about the client of the parent table. """ def as_table(self): """ Return this Row as a length one Table """ return self.table[self.index:self.index + 1] def get(self, key, default=None): """ Extract a value from the row if the key is present otherwise return the value of ``default`` """ if key in self.colnames: return self[key] return default @property def response_block_map(self): """ A dictionary designed to be used to format a filename. This takes all the columns in this Row and lower cases them and replaces spaces with underscores. Also removes any characters not allowed in Python identifiers. """ def key_clean(key): key = re.sub('[%s]' % re.escape(string.punctuation), '_', key) key = key.replace(' ', '_') key = ''.join(char for char in key if char.isidentifier() or char.isnumeric()) return key.lower() return {key_clean(key): value for key, value in zip(self.colnames, self)} class QueryResponseColumn(Column): """ A column subclass which knows about the client of the parent table. """ def as_table(self): """ Return this Row as a length one Table """ return self.parent_table[(self.name,)] class QueryResponseTable(QTable): __doc__ = QTable.__doc__ Row = QueryResponseRow Column = QueryResponseColumn client = TableAttribute() display_keys = TableAttribute(default=slice(None)) hide_keys = TableAttribute() # This is a work around for https://github.com/astropy/astropy/pull/11217 # TODO Remove when min astropy version is > 4.2.1 def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for attr in list(kwargs): descr = getattr(self.__class__, attr, None) if isinstance(descr, TableAttribute): setattr(self, attr, kwargs.pop(attr)) def unhide_columns(self): """ Modify this table so that all columns are displayed. """ self.display_keys = slice(None) self.hide_keys = None return self def _reorder_columns(self, first_columns, remove_empty=True): """ Generate a new version of this table with ``first_columns`` at the start. Parameters ---------- first_columns : list The column names to put at the start of the table. remove_empty : bool, optional Remove columns where all values are `None`. Defaults to ``True``. Returns ------- new_table : QueryResponseTable A sliced version of this table instance so that the columns are reordered. """ all_cols = list(self.colnames) first_names = [n for n in first_columns if n in all_cols] extra_cols = [col for col in all_cols if col not in first_names] all_cols = first_names + extra_cols new_table = self[[col for col in all_cols if self[col] is not None]] if remove_empty: empty_cols = [col.info.name for col in self.itercols() if col.info.dtype.kind == 'O' and all(val is None for val in col)] new_table.remove_columns(empty_cols) return new_table @property def _display_table(self): """ Apply the display_keys and hide_keys attributes to the table. This removes any keys in hide keys and then slices by any keys in display_keys to return the correct table. """ keys = list(self.colnames) if self.hide_keys: # Index only the keys not in hide keys in order [keys.remove(key) for key in self.hide_keys if key in keys] if self.display_keys != slice(None): keys = [dk for dk in self.display_keys if dk in keys] table = self[keys] # The slicing operation resets display and hide keys to default, but we # have already applied it table.unhide_columns() return table def __str__(self): """Print out human-readable summary of records retrieved""" return '\n'.join(self._display_table.pformat(show_dtype=False)) def __repr__(self): """Print out human-readable summary of records retrieved""" return object.__repr__(self) + "\n" + str(self._display_table) def _repr_html_(self): return QTable._repr_html_(self._display_table) def show(self, *cols): """ Return a table with only ``cols`` present. If no ``cols`` are specified, all columns will be shown, including any hidden by default. This differs slightly from ``QueryResponseTable[cols]`` as it allows keys which are not in the table to be requested. """ table = self.copy() table.unhide_columns() if len(cols) == 0: return table valid_cols = [col for col in cols if col in table.colnames] table = table[valid_cols] # The slicing operation resets display and hide keys to default, but we # want to bypass it here. table.unhide_columns() return table def path_format_keys(self): """ Returns all the names that can be used to format filenames. Each one corresponds to a single column in the table, and the format syntax should match the dtype of that column, i.e. for a ``Time`` object or a ``Quantity``. """ rbp = set(self[0].response_block_map.keys()) for row in self[1:]: rbp.intersection(row.response_block_map.keys()) return rbp BaseQueryResponse.register(QueryResponseTable) def convert_row_to_table(func): """ A wrapper to convert any `~.QueryResponseRow` objects to `~.QueryResponseTable` objects. """ @wraps(func) def wrapper(self, query_results, **kwargs): if isinstance(query_results, QueryResponseRow): query_results = query_results.as_table() return func(self, query_results, **kwargs) return wrapper def _print_client(client, html=False, visible_entries=None): """ Given a BaseClient instance will print out each registered attribute. Parameters ---------- client : BaseClient The instance class to print for. html : bool Will return a html table instead. Returns ------- `str` String with the client. """ width = -1 if html else get_width() class_name = f"{client.__module__+'.' or ''}{client.__class__.__name__}" attrs = client.register_values() lines = [] t = Table(names=["Attr Type", "Name", "Description"], dtype=["U80", "U80", "U80"]) for client_key in attrs.keys(): # Work around for * attrs having one length. if len(attrs[client_key]) == 1 and attrs[client_key][0] == "*": t.add_row((client_key.__name__, "All", "All valid values")) continue for name, desc in attrs[client_key]: t.add_row((client_key.__name__, name, desc)) lines = [class_name, dedent(client.__doc__.partition("\n\n")[0])] if html: lines = [f"

{line}

" for line in lines] lines.extend(t.pformat_all(max_lines=visible_entries, show_dtype=False, max_width=width, align="<", html=html)) return '\n'.join(lines) class BaseClient(ABC): """ This defines the Abstract Base Class for each download client. The BaseClient has several abstract methods that ensure that any subclass enforces the bare minimum API. These are `search`, `fetch` and `_can_handle_query`. The last one ensures that each download client can be registered with Fido. Most download clients should subclass `~sunpy.net.dataretriever.GenericClient`. If the structure of `~sunpy.net.dataretriever.GenericClient` is not useful you should use `BaseClient`. `~sunpy.net.vso.VSOClient` and `~sunpy.net.jsoc.JSOCClient` are examples of download clients that subclass ``BaseClient``. """ _registry = dict() def __init_subclass__(cls, *args, **kwargs): """ An __init_subclass__ hook initializes all of the subclasses of a given class. So for each subclass, it will call this block of code on import. This replicates some metaclass magic without the need to be aware of metaclasses. Here we use this to register each subclass in a dict that has the `_can_handle_query` attribute. This is then passed into the UnifiedDownloaderFactory so we can register them. This means that Fido can use the clients internally. """ super().__init_subclass__(**kwargs) # We do not want to register GenericClient since its a dummy client. if cls.__name__ in ('GenericClient'): return cls._registry[cls] = cls._can_handle_query if hasattr(cls, "_attrs_module"): from sunpy.net import attrs name, module = cls._attrs_module() module_obj = importlib.import_module(module) existing_mod = getattr(attrs, name, None) if existing_mod and existing_mod is not module_obj: raise NameError(f"{name} has already been registered as an attrs name.") setattr(attrs, name, module_obj) if name not in attrs.__all__: attrs.__all__.append(name) # Register client attrs after it has regsitered its own attrs from sunpy.net import attr values = cls.register_values() # If the client has no support, we won't try to register attrs if values: attr.Attr.update_values({cls: values}) def __repr__(self): """ Returns the normal repr plus the pretty client __str__. """ return object.__repr__(self) + "\n" + _print_client(visible_entries=15, client=self) def __str__(self): """ This enables the "pretty" printing of BaseClient. """ return _print_client(client=self) def _repr_html_(self): """ This enables the "pretty" printing of the BaseClient with html. """ return _print_client(visible_entries=15, client=self, html=True) @abstractmethod def search(self, *args, **kwargs): """ This enables the user to search for data using the client. Must return a subclass of `BaseQueryResponse`. """ @abstractmethod def fetch(self, query_results, *, path, downloader, **kwargs): """ This enables the user to fetch the data using the client, after a search. Parameters ---------- query_results: Results to download. path : `str` or `pathlib.Path`, optional Path to the download directory downloader : `parfive.Downloader` The download manager to use. Returns ------- `parfive.Results` The results object, can be `None` if ``wait`` is `False` and ``downloader`` is not None. """ @classmethod @abstractmethod def _can_handle_query(cls, *query): """ This enables the client to register what kind of searches it can handle, to prevent Fido using the incorrect client. """ @property def info_url(self): """ This should return a string that is a URL to the data server or documentation on the data being served. """ @staticmethod def check_attr_types_in_query(query, required_attrs={}, optional_attrs={}): """ Check a query againsted required and optional attributes. Returns `True` if *query* contains all the attrs in *required_attrs*, and if *query* contains only attrs in both *required_attrs* and *optional_attrs*. """ query_attrs = {type(x) for x in query} all_attrs = required_attrs.union(optional_attrs) return required_attrs.issubset(query_attrs) and query_attrs.issubset(all_attrs) @classmethod def register_values(cls, *query): """ This enables the client to register what kind of Attrs it can use directly. Returns ------- `dict` A dictionary with key values of Attrs and the values are a tuple of ("Attr Type", "Name", "Description"). """ return {} ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6332753 sunpy-3.1.5/sunpy/net/cdaweb/0000755000175100001710000000000000000000000015115 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/cdaweb/__init__.py0000644000175100001710000000016200000000000017225 0ustar00vstsdockerfrom sunpy.net.cdaweb.attrs import * from sunpy.net.cdaweb.cdaweb import * from sunpy.net.cdaweb.helpers import * ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/cdaweb/attrs.py0000644000175100001710000000017200000000000016624 0ustar00vstsdockerfrom sunpy.net.attr import SimpleAttr __all__ = ['Dataset'] class Dataset(SimpleAttr): """ Dataset ID. """ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/cdaweb/cdaweb.py0000644000175100001710000001435400000000000016723 0ustar00vstsdockerimport json import pathlib import requests import astropy.table from astropy.time import Time import sunpy.net.attrs as a from sunpy.net.attr import and_ from sunpy.net.base_client import BaseClient, QueryResponseTable from sunpy.net.cdaweb.attrs import Dataset from .walker import walker __all__ = ['CDAWEBClient'] _CDAS_BASEURL = 'https://cdaweb.gsfc.nasa.gov/WS/cdasr/1' _CDAS_HEADERS = {'Accept': 'application/json'} _CDAS_TIME_FMT = '%Y%m%dT%H%M%SZ' _DATAVIEW = 'sp_phys' class CDAWEBClient(BaseClient): """ Provides access to query and download from the Coordinated Data Analysis Web (CDAWeb). Examples -------- >>> from sunpy.net import Fido, attrs as a >>> print(a.cdaweb.Dataset) sunpy.net.cdaweb.attrs.Dataset Dataset ID. Attribute Name Client ... Description ----------------------------------------------------- ------ ... -------------------------------------------------------------------------------- a1_k0_mpa CDAWEB ... LANL 2001 Magnetospheric Plasma Analyzer Key Parameters - Mike Henderson (LANL) a2_k0_mpa CDAWEB ... LANL 2002 Magnetospheric Plasma Analyzer Key Parameters - Mike Henderson (LANL) ac_at_def CDAWEB ... ACE Hourly RTN, GSE and J2000 GCI Attitude direction cosines - E. C. Stone (C... ... wi_strahl0_swe CDAWEB ... Wind Solar Wind Experiment (SWE) strahl detector, ~1/2 sec solar wind electro... wi_sw_ion_dist_swe_faraday CDAWEB ... Faraday Cup orientation and charge flux - Keith Ogilvie (NASA GSFC) wild2_helio1day_position CDAWEB ... Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvil... >>> >>> res = Fido.search(a.Time('2021/07/01', '2021/07/08'), ... a.cdaweb.Dataset('SOLO_L2_MAG-RTN-NORMAL-1-MINUTE')) #doctest: +REMOTE_DATA >>> res #doctest: +REMOTE_DATA Results from 1 Provider: 7 Results from the CDAWEBClient: Source: https://cdaweb.gsfc.nasa.gov/index.html Dataset Start time End time ------------------------------- ----------------------- ----------------------- SOLO_L2_MAG-RTN-NORMAL-1-MINUTE 2021-07-01 00:00:29.000 2021-07-01 23:59:30.000 SOLO_L2_MAG-RTN-NORMAL-1-MINUTE 2021-07-02 00:00:29.000 2021-07-02 23:59:30.000 SOLO_L2_MAG-RTN-NORMAL-1-MINUTE 2021-07-03 00:00:29.000 2021-07-03 23:59:30.000 SOLO_L2_MAG-RTN-NORMAL-1-MINUTE 2021-07-04 00:00:29.000 2021-07-04 23:59:30.000 SOLO_L2_MAG-RTN-NORMAL-1-MINUTE 2021-07-05 00:00:29.000 2021-07-05 23:59:30.000 SOLO_L2_MAG-RTN-NORMAL-1-MINUTE 2021-07-06 00:00:29.000 2021-07-06 23:59:30.000 SOLO_L2_MAG-RTN-NORMAL-1-MINUTE 2021-07-07 00:00:29.000 2021-07-07 23:59:30.000 See Also -------- sunpy.net.cdaweb.get_datasets : Find dataset IDs for a given observatory sunpy.net.cdaweb.get_observatory_groups : Get all observatories avaiable from CDAWeb """ @property def info_url(self): return 'https://cdaweb.gsfc.nasa.gov/index.html' def search(self, *query, **kwargs): """ Search for datasets provided by the Space Physics Data Facility. """ query = and_(*query) queries = walker.create(query) results = [] for query_parameters in queries: results.append(self._do_search(query_parameters)) table = astropy.table.vstack(results) qrt = QueryResponseTable(table, client=self) qrt.hide_keys = ['URL'] return qrt def _do_search(self, query): response = (self._get_remote_files(query['dataset'], query['begin_time'], query['end_time'])) if 'FileDescription' not in response: raise RuntimeError stimes = [f['StartTime'] for f in response['FileDescription']] etimes = [f['EndTime'] for f in response['FileDescription']] urls = [f['Name'] for f in response['FileDescription']] return astropy.table.QTable( {'Dataset': [query['dataset']] * len(stimes), 'Start time': Time.strptime(stimes, '%Y-%m-%dT%H:%M:%S.%fZ').iso, 'End time': Time.strptime(etimes, '%Y-%m-%dT%H:%M:%S.%fZ').iso, 'URL': urls}) @staticmethod def _get_remote_files(dataset, start, end): # Get a list of files for a given dataset between start and end times start = start.strftime(_CDAS_TIME_FMT) end = end.strftime(_CDAS_TIME_FMT) url = '/'.join([ _CDAS_BASEURL, 'dataviews', _DATAVIEW, 'datasets', dataset, 'orig_data', f'{start},{end}' ]) response = requests.get(url, headers=_CDAS_HEADERS) return response.json() def fetch(self, query_results, *, path, downloader, **kwargs): for row in query_results: fname = row['URL'].split('/')[-1] filepath = str(path).format(file=fname) # Manually cap max_splits at 3 to make CDAWeb happy downloader.enqueue_file(row['URL'], filename=filepath, max_splits=3) @classmethod def _can_handle_query(cls, *query): required = {Dataset, a.Time} query_attrs = {type(x) for x in query} return required == query_attrs @classmethod def _attrs_module(cls): return 'cdaweb', 'sunpy.net.cdaweb.attrs' @classmethod def register_values(cls): return cls.load_dataset_values() @staticmethod def load_dataset_values(): from sunpy.net import attrs as a attrs_path = pathlib.Path(__file__).parent / 'data' / 'attrs.json' with open(attrs_path, 'r') as attrs_file: all_datasets = json.load(attrs_file) # Convert from dict to list of tuples all_datasets = [(id, desc) for id, desc in all_datasets.items()] return {a.cdaweb.Dataset: all_datasets} ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6332753 sunpy-3.1.5/sunpy/net/cdaweb/data/0000755000175100001710000000000000000000000016026 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/cdaweb/data/attrs.json0000644000175100001710000111347600000000000020073 0ustar00vstsdocker{ "A1_K0_MPA": "LANL 2001 Magnetospheric Plasma Analyzer Key Parameters - Mike Henderson (LANL)", "A2_K0_MPA": "LANL 2002 Magnetospheric Plasma Analyzer Key Parameters - Mike Henderson (LANL)", "AC_AT_DEF": "ACE Hourly RTN, GSE and J2000 GCI Attitude direction cosines - E. C. Stone (California Institute of Technology)", "AC_H0_MFI": "H0 - ACE Magnetic Field 16-Second Level 2 Data - N. Ness (Bartol Research Institute)", "AC_H0_SWE": "ACE/SWEPAM Solar Wind Experiment 64-Second Level 2 Data - D. J. McComas (SWRI)", "AC_H1_EPM": "ACE/EPAM Solar Energetic Particle 5-Minute Level 2 Data - R. Gold (JHU/APL)", "AC_H1_MFI": "H1 - ACE Magnetic Field 4-Minute Level 2 Data - N. Ness (Bartol Research Institute)", "AC_H1_SIS": "ACE/SIS Solar Isotope Spectrometer 256-sec Level 2 Data - E. C. Stone (California Institute of Technology)", "AC_H2_CRIS": "ACE/CRIS Cosmic Ray Isotope Spectrometer 1-Hour Level 2 Data - E. C. Stone (California Institute of Technology)", "AC_H2_EPM": "ACE/EPAM Solar Energetic Particle 1-Hour Level 2 Data - R. Gold (JHU/APL)", "AC_H2_MFI": "H2 - ACE Magnetic Field 1-Hour Level 2 Data - N. Ness (Bartol Research Institute)", "AC_H2_SEP": "ACE/SEPICA Solar Energetic Particle 1-Hour Level 2 Data - Eberhard Moebius (University of New Hampshire)", "AC_H2_SIS": "ACE/SIS Solar Isotope Spectrometer 1-Hour Level 2 Data - E. C. Stone (California Institute of Technology)", "AC_H2_SWE": "ACE/SWEPAM Solar Wind Experiment 1-Hour Level 2 Data - D. J. McComas (SWRI)", "AC_H2_SWI": "ACE/SWICS 1.1 Solar Wind 1-Hour Level 2 Data - G. Gloeckler (University of Maryland)", "AC_H2_ULE": "ACE/ULEIS Solar Suprathermal and Energetic Particle Intensities 1-Hour Level 2 Data - G. Mason (University of Maryland)", "AC_H3_CRIS": "ACE/CRIS Cosmic Ray Isotope Spectrometer Daily-averaged Level 2 Data - E. C. Stone (California Institute of Technology)", "AC_H3_EPM": "ACE/EPAM Solar Energetic Particle 12-second Level 2 Data - R. Gold (JHU/APL)", "AC_H3_MFI": "H3 - ACE Magnetic Field 1-Second Level 2 Data - N. Ness (Bartol Research Institute)", "AC_H3_SW2": "ACE/SWICS 2.0 Solar Wind 2-Hour Level 2 Data - G. Gloeckler (University of Maryland)", "AC_H3_SWI": "ACE/SWICS 1.1 Solar Wind 2-Hour Level 2 Data - G. Gloeckler (University of Maryland)", "AC_H4_SWI": "ACE/SWICS 1.1 Solar Wind 1-Day Level 2 Data - G. Gloeckler (University of Maryland)", "AC_H5_SWI": "ACE/SWICS 1.1 Solar Wind 2-Hour Level 2 Q-state distributions - G. Gloeckler (University of Maryland)", "AC_H6_SWI": "ACE/SWICS Solar Wind Protons 12-min Level 2 Data - G. Gloeckler (University of Maryland)", "AC_K0_EPM": "K0 - ACE EPAM 5-Minute Key Parameters - R. Gold (JHU Applied Physics Laboratory)", "AC_K0_GIFWALK": "Links to ACE KP pre-generated survey and other plots - Polar-Wind-Geotail Ground System (NASA GSFC)", "AC_K0_MFI": "ACE Magnetic Field 5-Minute Key Parameters [PRELIM] - N. Ness (Bartol Research Institute)", "AC_K0_SIS": "K0 - ACE SIS 1-Hour Key Parameters - E. C. Stone (California Institute of Technology)", "AC_K0_SWE": "K0 - ACE Solar Wind Experiment 5-Minute Key Parameters [PRELIM] - D. J. McComas (Southwest Research Institute)", "AC_K1_EPM": "K1 - ACE EPAM 1-Hour Key Parameters - R. Gold (JHU Applied Physics Laboratory)", "AC_K1_MFI": "ACE Magnetic Field 16-Second Key Parameters [PRELIM] - N. Ness (Bartol Research Institute)", "AC_K1_SWE": "K1 - ACE Solar Wind Experiment 1-Hour Key Parameters [PRELIM] - D. J. McComas (Southwest Research Institute)", "AC_K2_MFI": "K2 - ACE Magnetic Field 1-Hour Key Parameters [PRELIM] - N. Ness (Bartol Research Institute)", "AC_OR_DEF": "ACE Daily GSE and J2000 GCI Position Data - E. C. Stone (California Institute of Technology)", "AC_OR_SSC": "ACE GSE Positions @ 12 min resolution - SSC/SSCWeb ( NASA's GSFC)", "ALOUETTE2_AV_LIM": "Alouette-2 Topside Sounder Ionograms over Lima, Peru (Lat=-12, Long=283) - R.F. Benson (NASA GSFC)", "ALOUETTE2_AV_QUI": "Alouette-2 Topside Sounder Ionogram over Quito, Equador (lat/lon=-1/281) - R.F. Benson (NASA GSFC)", "ALOUETTE2_AV_SNT": "Alouette-2 Topside Sounder Ionogram over Santiago, Chile (lat/lon=-33/298) - R.F. Benson (NASA GSFC)", "ALOUETTE2_AV_SOL": "Alouette-2 Topside Sounder Ionogram over Falkland Is., U.K. (lat/lon=-52/302) - R.F. Benson (NASA GSFC)", "ALOUETTE2_AV_ULA": "Alouette-2 Topside Sounder Ionogram over Fairbanks, Alaska (lat/long=65/212) - R.F. Benson (NASA GSFC)", "ALOUETTE2_AV_WNK": "Alouette-2 Topside Sounder Ionogram over Winkfield, U.K. (lat/lon=51/359) - R.F. Benson (NASA GSFC)", "ALOUETTE2_NEPROF_TOPS": "Alouette-2 CRC Electron Density Profiles - J. E. Jackson (Communication Research Centre (CRC), Ottawa)", "AMPTECCE_H0_MEPA": "AMPTE CCE MEPA High Time Resolution Energetic Particles - D. McEntire (JHU/APL)", "APOLLO12_SWS_1HR": "Apollo 12 Solar Wind measurements at the lunar surface - Conway W. Snyder (Jet Propulsion Laboratory )", "APOLLO12_SWS_28S": "Apollo 12 Solar Wind measurements at the lunar surface - Conway W. Snyder (Jet Propulsion Laboratory )", "APOLLO15_SWS_1HR": "Apollo 15 Solar Wind measurements at the lunar surface - Conway W. Snyder (Jet Propulsion Laboratory )", "APOLLO15_SWS_28S": "Apollo 15 Solar Wind measurements at the lunar surface - Conway W. Snyder (Jet Propulsion Laboratory )", "BAR_1A_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1A_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1A_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1A_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1A_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1A_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1A_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1B_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1B_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1B_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1B_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1B_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1B_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1B_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1C_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1C_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1C_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1C_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1C_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1C_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1C_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1D_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1D_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1D_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1D_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1D_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1D_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1D_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1G_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1G_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1G_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1G_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1G_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1G_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1G_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1H_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1H_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1H_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1H_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1H_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1H_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1H_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1I_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1I_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1I_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1I_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1I_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1I_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1I_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1J_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1J_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1J_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1J_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1J_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1J_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1J_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1K_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1K_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1K_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1K_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1K_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1K_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1K_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1M_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1M_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1M_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1M_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1M_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1M_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1M_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1N_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1N_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1N_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1N_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1N_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1N_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1N_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1O_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1O_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1O_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1O_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1O_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1O_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1O_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1Q_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1Q_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1Q_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1Q_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1Q_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1Q_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1Q_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1R_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1R_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1R_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1R_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1R_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1R_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1R_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1S_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1S_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1S_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1S_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1S_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1S_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1S_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1T_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1T_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1T_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1T_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1T_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1T_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1T_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1U_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1U_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1U_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1U_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1U_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1U_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1U_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1V_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_1V_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_1V_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_1V_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_1V_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_1V_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_1V_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2A_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2A_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2A_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2A_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2A_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2A_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2A_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2B_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2B_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2B_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2B_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2B_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2B_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2B_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2C_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2C_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2C_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2C_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2C_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2C_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2C_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2D_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2D_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2D_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2D_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2D_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2D_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2D_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2E_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2E_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2E_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2E_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2E_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2E_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2E_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2F_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2F_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2F_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2F_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2F_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2F_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2F_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2I_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2I_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2I_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2I_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2I_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2I_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2I_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2K_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2K_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2K_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2K_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2K_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2K_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2K_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2L_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2L_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2L_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2L_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2L_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2L_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2L_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2M_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2M_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2M_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2M_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2M_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2M_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2M_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2N_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2N_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2N_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2N_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2N_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2N_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2N_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2O_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2O_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2O_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2O_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2O_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2O_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2O_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2P_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2P_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2P_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2P_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2P_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2P_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2P_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2Q_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2Q_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2Q_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2Q_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2Q_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2Q_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2Q_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2T_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2T_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2T_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2T_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2T_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2T_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2T_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2W_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2W_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2W_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2W_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2W_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2W_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2W_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2X_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2X_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2X_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2X_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2X_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2X_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2X_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2Y_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_2Y_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_2Y_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_2Y_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_2Y_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_2Y_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_2Y_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3A_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_3A_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_3A_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_3A_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_3A_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3A_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_3A_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3B_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_3B_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_3B_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_3B_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_3B_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3B_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_3B_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3C_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_3C_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_3C_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_3C_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_3C_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3C_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_3C_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3D_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_3D_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_3D_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_3D_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_3D_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3D_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_3D_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3E_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_3E_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_3E_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_3E_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_3E_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3E_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_3E_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3F_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_3F_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_3F_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_3F_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_3F_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3F_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_3F_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3G_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_3G_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_3G_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_3G_L2_MAGN": "MAG X, Y, and Z - Robyn Millan (Dartmouth College)", "BAR_3G_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_3G_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_3G_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4A_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_4A_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_4A_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_4A_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4A_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_4A_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4A_L2_USPC": "10ms resolution x-ray spectra - Robyn Millan (Dartmouth College)", "BAR_4A_L2_XSPC": "50ms resolution, 30-channel X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4B_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_4B_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_4B_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_4B_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4B_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_4B_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4B_L2_USPC": "10ms resolution x-ray spectra - Robyn Millan (Dartmouth College)", "BAR_4B_L2_XSPC": "50ms resolution, 30-channel X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4C_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_4C_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_4C_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_4C_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4C_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_4C_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4C_L2_USPC": "10ms resolution x-ray spectra - Robyn Millan (Dartmouth College)", "BAR_4C_L2_XSPC": "50ms resolution, 30-channel X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4D_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_4D_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_4D_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_4D_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4D_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_4D_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4D_L2_USPC": "10ms resolution x-ray spectra - Robyn Millan (Dartmouth College)", "BAR_4D_L2_XSPC": "50ms resolution, 30-channel X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4E_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_4E_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_4E_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_4E_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4E_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_4E_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4E_L2_USPC": "10ms resolution x-ray spectra - Robyn Millan (Dartmouth College)", "BAR_4E_L2_XSPC": "50ms resolution, 30-channel X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4F_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_4F_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_4F_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_4F_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4F_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_4F_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4F_L2_USPC": "10ms resolution x-ray spectra - Robyn Millan (Dartmouth College)", "BAR_4F_L2_XSPC": "50ms resolution, 30-channel X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4G_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_4G_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_4G_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_4G_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4G_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_4G_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4G_L2_USPC": "10ms resolution x-ray spectra - Robyn Millan (Dartmouth College)", "BAR_4G_L2_XSPC": "50ms resolution, 30-channel X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4H_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_4H_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_4H_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_4H_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4H_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_4H_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_4H_L2_USPC": "10ms resolution x-ray spectra - Robyn Millan (Dartmouth College)", "BAR_4H_L2_XSPC": "50ms resolution, 30-channel X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_5A_L2_EPHM": "Coordinates - Robyn Millan (Dartmouth College)", "BAR_5A_L2_FSPC": "Fast time resolution (50ms) Bremsstrahlung X-ray spectrum. - Robyn Millan (Dartmouth College)", "BAR_5A_L2_HKPG": "Analog Housekeeping Data - Robyn Millan (Dartmouth College)", "BAR_5A_L2_MSPC": "Medium time resolution (4s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_5A_L2_RCNT": "Rate counters for scintillator diagnostics. - Robyn Millan (Dartmouth College)", "BAR_5A_L2_SSPC": "Slow time resolution (32s) X-ray spectrum - Robyn Millan (Dartmouth College)", "BAR_5A_L2_USPC": "10ms resolution x-ray spectra - Robyn Millan (Dartmouth College)", "BAR_5A_L2_XSPC": "50ms resolution, 30-channel X-ray spectrum - Robyn Millan (Dartmouth College)", "BEPICOLOMBO_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "BORRELLY_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "C1_CP_FGM_SPIN": "Cluster Spacecraft 1 FluxGate Magnetometer (FGM) Spin-Resolution Parameters - Andre Balogh>a.balogh@imperial.ac.uk & Elizabeth Lucek>e.lucek@imperial.ac.uk & ESA CAA (Imperial College)", "C1_JP_PMP": "Cluster Spacecraft 1, JSOC Predicted Magnetic Positions - M. Hapgood (RAL)", "C1_JP_PSE": "Cluster Spacecraft 1, JSOC Predicted Scientific Events - M. Hapgood (RAL)", "C1_PP_ASP": "Cluster Spacecraft 1, ASPOC Prime Parameters - W. Riedler (IWF-OAW)", "C1_PP_CIS": "Cluster Spacecraft 1, CIS Prime Parameters - H. Reme (CESR)", "C1_PP_DWP": "Cluster Spacecraft 1, DWP Prime Parameters - H. Alleyne (Univ-Sheff)", "C1_PP_EDI": "Cluster Spacecraft 1, EDI Prime Parameters - G. Paschmann (MPE)", "C1_PP_EFW": "Cluster Spacecraft 1, EFW Prime Parameters - G. Gustafsson (IRFU)", "C1_PP_PEA": "Cluster Spacecraft 1, PEACE Prime Parameters - A. Fazakerley (MSSL)", "C1_PP_RAP": "Cluster Spacecraft 1, RAPID Prime Parameters - B. Wilken and P. Daly (MPAe)", "C1_PP_STA": "Cluster Spacecraft 1, STAFF Prime Parameters - N. Cornilleau-Wehrlin (CETP)", "C1_PP_WHI": "Cluster Spacecraft 1, WHISPER Prime Parameters - P.M.E. Decreau (LPCE)", "C1_UP_FGM": "Cluster Spacecraft 1, FluxGate Magnetometer (FGM) Unvalidated Prime Parameters - A. Balogh (ICSTM)", "C1_WAVEFORM_WBD": "Cluster Wideband Data Plasma Wave Receiver/High Time Resolution Waveform Data - 2006 - Current: J. S. Pickett; 1988 - 2006: D. A. Gurnett (The University of Iowa)", "C1_WAVEFORM_WBD_BM2": "Cluster Wideband Data Plasma Wave Receiver/High Time Resolution Waveform Data - 2006 - Current: J. S. Pickett; 1988 - 2006: D. A. Gurnett (The University of Iowa)", "C2_CP_FGM_SPIN": "Cluster Spacecraft 2 FluxGate Magnetometer (FGM) Spin-Resolution Parameters - Andre Balogh>a.balogh@imperial.ac.uk & Elizabeth Lucek>e.lucek@imperial.ac.uk & ESA CAA (Imperial College)", "C2_JP_PMP": "Cluster Spacecraft 2, JSOC Predicted Magnetic Positions - M. Hapgood (RAL)", "C2_JP_PSE": "Cluster Spacecraft 2, JSOC Predicted Scientific Events - M. Hapgood (RAL)", "C2_PP_ASP": "Cluster Spacecraft 2, ASPOC Prime Parameters - W. Riedler (IWF-OAW)", "C2_PP_DWP": "Cluster Spacecraft 2, DWP Prime Parameters - H. Alleyne (Univ-Sheff)", "C2_PP_EDI": "Cluster Spacecraft 2, EDI Prime Parameters - G. Paschmann (MPE)", "C2_PP_EFW": "Cluster Spacecraft 2, EFW Prime Parameters - G. Gustafsson (IRFU)", "C2_PP_PEA": "Cluster Spacecraft 2, PEACE Prime Parameters - A. Fazakerley (MSSL)", "C2_PP_RAP": "Cluster Spacecraft 2, RAPID Prime Parameters - B. Wilken and P. Daly (MPAe)", "C2_PP_STA": "Cluster Spacecraft 2, STAFF Prime Parameters - N. Cornilleau-Wehrlin (CETP)", "C2_PP_WHI": "Cluster Spacecraft 2, WHISPER Prime Parameters - P.M.E. Decreau (LPCE)", "C2_UP_FGM": "Cluster Spacecraft 2, FluxGate Magnetometer (FGM) Unvalidated Prime Parameters - A. Balogh (ICSTM)", "C2_WAVEFORM_WBD": "Cluster Wideband Data Plasma Wave Receiver/High Time Resolution Waveform Data - 2006 - Current: J. S. Pickett; 1988 - 2006: D. A. Gurnett (The University of Iowa)", "C2_WAVEFORM_WBD_BM2": "Cluster Wideband Data Plasma Wave Receiver/High Time Resolution Waveform Data - 2006 - Current: J. S. Pickett; 1988 - 2006: D. A. Gurnett (The University of Iowa)", "C3_CP_FGM_SPIN": "Cluster Spacecraft 3 FluxGate Magnetometer (FGM) Spin-Resolution Parameters - Andre Balogh>a.balogh@imperial.ac.uk & Elizabeth Lucek>e.lucek@imperial.ac.uk & ESA CAA (Imperial College)", "C3_JP_PMP": "Cluster Spacecraft 3, JSOC Predicted Magnetic Positions - M. Hapgood (RAL)", "C3_JP_PSE": "Cluster Spacecraft 3, JSOC Predicted Scientific Events - M. Hapgood (RAL)", "C3_PP_ASP": "Cluster Spacecraft 3, ASPOC Prime Parameters - W. Riedler (IWF-OAW)", "C3_PP_CIS": "Cluster Spacecraft 3, CIS Prime Parameters - H. Reme (CESR)", "C3_PP_EDI": "Cluster Spacecraft 3, EDI Prime Parameters - G. Paschmann (MPE)", "C3_PP_EFW": "Cluster Spacecraft 3, EFW Prime Parameters - G. Gustafsson (IRFU)", "C3_PP_PEA": "Cluster Spacecraft 3, PEACE Prime Parameters - A. Fazakerley (MSSL)", "C3_PP_RAP": "Cluster Spacecraft 3, RAPID Prime Parameters - B. Wilken and P. Daly (MPAe)", "C3_PP_STA": "Cluster Spacecraft 3, STAFF Prime Parameters - N. Cornilleau-Wehrlin (CETP)", "C3_PP_WHI": "Cluster Spacecraft 3, WHISPER Prime Parameters - P.M.E. Decreau (LPCE)", "C3_UP_FGM": "Cluster Spacecraft 3, FluxGate Magnetometer (FGM) Unvalidated Prime Parameters - A. Balogh (ICSTM)", "C3_WAVEFORM_WBD": "Cluster Wideband Data Plasma Wave Receiver/High Time Resolution Waveform Data - 2006 - Current: J. S. Pickett; 1988 - 2006: D. A. Gurnett (The University of Iowa)", "C3_WAVEFORM_WBD_BM2": "Cluster Wideband Data Plasma Wave Receiver/High Time Resolution Waveform Data - 2006 - Current: J. S. Pickett; 1988 - 2006: D. A. Gurnett (The University of Iowa)", "C4_CP_FGM_SPIN": "Cluster Spacecraft 4 FluxGate Magnetometer (FGM) Spin-Resolution Parameters - Andre Balogh>a.balogh@imperial.ac.uk & Elizabeth Lucek>e.lucek@imperial.ac.uk & ESA CAA (Imperial College)", "C4_JP_PMP": "Cluster Spacecraft 4, JSOC Predicted Magnetic Positions - M. Hapgood (RAL)", "C4_JP_PSE": "Cluster Spacecraft 4, JSOC Predicted Scientific Events - M. Hapgood (RAL)", "C4_PP_ASP": "Cluster Spacecraft 4, ASPOC Prime Parameters - W. Riedler (IWF-OAW)", "C4_PP_CIS": "Cluster Spacecraft 4, CIS Prime Parameters - H. Reme (CESR)", "C4_PP_DWP": "Cluster Spacecraft 4, DWP Prime Parameters - H. Alleyne (Univ-Sheff)", "C4_PP_EDI": "Cluster Spacecraft 4, EDI Prime Parameters - G. Paschmann (MPE)", "C4_PP_EFW": "Cluster Spacecraft 4, EFW Prime Parameters - G. Gustafsson (IRFU)", "C4_PP_PEA": "Cluster Spacecraft 4, PEACE Prime Parameters - A. Fazakerley (MSSL)", "C4_PP_RAP": "Cluster Spacecraft 4, RAPID Prime Parameters - B. Wilken and P. Daly (MPAe)", "C4_PP_STA": "Cluster Spacecraft 4, STAFF Prime Parameters - N. Cornilleau-Wehrlin (CETP)", "C4_PP_WHI": "Cluster Spacecraft 4, WHISPER Prime Parameters - P.M.E. Decreau (LPCE)", "C4_UP_FGM": "Cluster Spacecraft 4, FluxGate Magnetometer (FGM) Unvalidated Prime Parameters - A. Balogh (ICSTM)", "C4_WAVEFORM_WBD": "Cluster Wideband Data Plasma Wave Receiver/High Time Resolution Waveform Data - 2006 - Current: J. S. Pickett; 1988 - 2006: D. A. Gurnett (The University of Iowa)", "C4_WAVEFORM_WBD_BM2": "Cluster Wideband Data Plasma Wave Receiver/High Time Resolution Waveform Data - 2006 - Current: J. S. Pickett; 1988 - 2006: D. A. Gurnett (The University of Iowa)", "CASSINI_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "CASSINI_MAG_1MIN_MAGNETIC_FIELD": "1 min averaged magnetic field - Michele Dougherty (Imperial College, London)", "CL_JP_PCY": "Cluster, Monthly JSOC Predicted Solar Cycle Trends - M. Hapgood (RAL)", "CL_JP_PGP": "Cluster, JSOC Predicted Geometric Positions - M. Hapgood (RAL)", "CL_OR_GIFWALK": "Link to Cluster orbit plots - Polar-Wind-Geotail Ground System (NASA GSFC)", "CL_SP_AUX": "Cluster, Auxiliary Parameters - Hungarian Data Centre/M. Tatrallyay (KFKI)", "CNOFS_CINDI_IVM_500MS": "CNOFS CINDI IVM ion density, composition, temperature, and drift (0.5-sec) - Dr. Roderick A. Heelis (University of Texas, Dallas)", "CNOFS_PLP_PLASMA_1SEC": "Planar Langmuir Probe 1-sec average Key Parameters (Ni, Ne, Te). The data are PRELIMINARY, and as such, are intended for BROWSE PURPOSES ONLY - D. E. Hunton (Air Force Research Laboratory, Space Vehicles Directorate)", "CNOFS_VEFI_BFIELD_1SEC": "Magnetic field solution (at 1 sample per sec) produced by VEFI on the Communication Navigation Outage Forecast System satellite. The data are PRELIMINARY, and as such, are intended for BROWSE PURPOSES ONLY. - Robert F. Pfaff (NASA GSFC)", "CNOFS_VEFI_EFIELD_1SEC": "Electric Field solution (at 1 sample/sec) produced by VEFI on the Communication Navigation Outage Forecast System satellite. The data are PRELIMINARY, and as such, are intended for BROWSE PURPOSES ONLY. - Robert F. Pfaff (GSFC)", "CNOFS_VEFI_LD_500MS": "CNOFS VEFI Lightning Detector, low rate data (eclipse portion of CNOFS orbit) - Robert H. Holzworth (University of Washington)", "CN_K0_ASI": "CANOPUS All Sky Imager, Key Parameters - J. Samson (U. Alberta)", "CN_K0_BARS": "CANOPUS Bistatic Auroral Radar System, Key Parameters - John Samson (University of Alberta)", "CN_K0_MARI": "CANOPUS MARI Magnetometer Key Parameters - J. Samson (U. Alberta)", "CN_K0_MPA": "CANOPUS Meridian Photometer Array, Key Parameters - J. Samson (U. Alberta)", "CN_K1_MARI": "CANOPUS MARI Riometer Key Parameters - J. Samson (U. Alberta)", "COMETGS_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "COMETHMP_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "CRRES_H0_MEA": "CRRES-MEA Data Archive - A. L. Vampola (Space Environment Effects, Vista, CA)", "CSSWE_REPTILE_6SEC-COUNTS-L1": "CSSWE REPTile level1 6sec Counts and Position - Xinlin Li (University of Colorado at Boulder)", "CSSWE_REPTILE_6SEC-FLUX-L2": "CSSWE REPTile level2 6sec flux and Position - Xinlin Li (University of Colorado at Boulder)", "CT_JP_PSE": "Cluster centroid, JSOC Predicted Scientific Events - M. Hapgood (RAL)", "DAWN_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "DE1_1MIN_RIMS": "DE-1 Retarding Ion Mass Spectrometer 1-min temperature and density data (low channel used for H+, He++, high channel for He+, O+, O++) - Dr. Charles R. Chappell (NASA/MSFC)", "DE1_6SEC_MAGAGMS": "DE-1 Magnetometer (MAG-A) 6 second GMS Data - Dr. Masahisa Sugiura (NASA/GSFC)", "DE1_PWI_LFC-SPECTRA": "DE-1 Plasma Wave Instrument (PWI) Low Frequency Correlator (LFC) Electric and Magnetic Field Spectral Density - Donald Gurnett (University Iowa)", "DE1_PWI_OR-AT": "DE-1 PWI: Ephemeris and Attitude Parameters - Donald Gurnett (University Iowa)", "DE1_PWI_SFC-SPECTRA": "DE-1 Plasma Wave Instrument (PWI) Step Frequency Correlator (SFC) Electric and Magnetic Field Spectral Density - Donald Gurnett (University Iowa)", "DE2_62MS_VEFIMAGB": "16-msec merged magnetic and electric field data - Jim Slavin (NASA/GSFC)", "DE2_AC500MS_VEFI": "500-msec AC data from each channel for each of the 3 spectrometers of the vector electric field instrument - N.C. Maynard/R. Pfaff (NASA/GSFC)", "DE2_DCA500MS_VEFI": "500-msec DC electric field x- and y-components from the vector electric field instrument - Dr. Nelson C. Maynard (NASA/GSFC)", "DE2_DUCT16MS_RPA": "16-msec total ion densities - Rod Heelis (University of Texas, Dallas)", "DE2_ION2S_RPA": "2-sec ion temperature, velocity, and densities (O+, H+, He+, molecular) - Rod Heelis (University of Texas, Dallas)", "DE2_NEUTRAL1S_NACS": "1-sec ambient densities and error rates - Nelson W. Spencer (NASA/GSFC)", "DE2_NEUTRAL8S_FPI": "8-sec neutral wind and temperature data from FPI plus WATS - Dr. R. Niciejewski (University of Michigan)", "DE2_PLASMA500MS_LANG": ".5 sec electron temperature, plasma density, and satellite potential - Larry H. Brace (NASA/GSFC)", "DE2_UA16S_ALL": "16-sec combined neutral and plasma unified abstract (UA) data - Mr. Larry H. Brace (NASA/GSFC)", "DE2_VION250MS_IDM": "250-msec cross track ion drift velocities - Rod Heelis (University of Texas, Dallas)", "DE2_WIND2S_WATS": "2-sec neutral densities, temperature, and horizontal (zonal) wind velocity - Nelson W. Spencer (NASA/GSFC)", "DE_UV_SAI": "DE-1 Spin-scan Auroral Imager (SAI) Ultraviolet Images - Louis A. Frank (The Univ. of Iowa)", "DE_VS_EICS": "DE-1 Energetic Ion Composition Spectrometer (EICS), Validated Summary Data - E. G. Shelley (Lockheed Martin)", "DMSP-F16_SSIES-3_THERMAL-PLASMA": "DMSP thermal plasma data (University of Texas Dallas, Center for Space Sciences)", "DMSP-F16_SSJ_PRECIPITATING-ELECTRONS-IONS": "Precipitating electrons and ions observed at nominally 850km. - Staff (AFRL, NGDC, CU)", "DMSP-F16_SSM_MAGNETOMETER": "Defense Meteorolgy Satellite Program F16 Vector Magnetometer Measurements (850km Altitude) - Staff (AFRL, NGDC, CU)", "DMSP-F17_SSIES-3_THERMAL-PLASMA": "DMSP thermal plasma data (University of Texas Dallas, Center for Space Sciences)", "DMSP-F17_SSJ_PRECIPITATING-ELECTRONS-IONS": "Precipitating electrons and ions observed at nominally 850km. - Staff (AFRL, NGDC, CU)", "DMSP-F17_SSM_MAGNETOMETER": "Defense Meteorolgy Satellite Program F17 Vector Magnetometer Measurements (850km Altitude) - Staff (AFRL, NGDC, CU)", "DMSP-F18_SSIES-3_THERMAL-PLASMA": "DMSP thermal plasma data (University of Texas Dallas, Center for Space Sciences)", "DMSP-F18_SSJ_PRECIPITATING-ELECTRONS-IONS": "Precipitating electrons and ions observed at nominally 850km. - Staff (AFRL, NGDC, CU)", "DMSP-F18_SSM_MAGNETOMETER": "Defense Meteorolgy Satellite Program F18 Vector Magnetometer Measurements (850km Altitude) - Staff (AFRL, NGDC, CU)", "DMSPF16_R0_SSUSI": "Links to DMSP F16 SSUSI NetCDF data, KZM image files and other sources. - Larry Paxton (JHUAPL)", "DMSPF17_R0_SSUSI": "Links to DMSP F17 SSUSI NetCDF data, KZM image files and other sources. - Larry Paxton (JHUAPL)", "DMSPF18_R0_SSUSI": "Links to DMSP F18 SSUSI NetCDF data, KMZ image files and other sources. - Larry Paxton (JHUAPL)", "DMSP_R0_SSIES": "Link to DMSP thermal plasma data from the Center for Space Sciences, University of Texas at Dallas. - Center for Space Sciences (UTD)", "DMSP_R0_SSJ4": "Link to DMSP low energy electron/ion plots and data at JHU/APL - Hardy (AFGL)", "DN_K0_GBAY": "DARN Goose Bay, Key Parameters - R. Greenwald (JHU/APL)", "DN_K0_HANK": "DARN Hankasalmi, Key Parameters - R. Greenwald (JHU/APL)", "DN_K0_ICEW": "DARN Iceland West (Stokkseyri),Key Parameters - R. Greenwald (JHU/APL)", "DN_K0_KAPU": "DARN Kapuskasing,Key Parameters - R. Greenwald (JHU/APL)", "DN_K0_PACE": "DARN PACE, Key Parameters - R. Greenwald (JHU/APL)", "DN_K0_PYKK": "DARN Pykkvibaer, Key Parameters - R. Greenwald (JHU/APL)", "DN_K0_SASK": "DARN Saskatoon, Key Parameters - R. Greenwald (JHU/APL)", "DSCOVR_AT_DEF": "DSCOVR Definitive Attitude - A. Szabo (NASA Goddard Space Flight Center)", "DSCOVR_AT_PRE": "DSCOVR Preliminary Attitude - A. Szabo (NASA Goddard Space Flight Center)", "DSCOVR_H0_MAG": "DSCOVR Fluxgate Magnetometer 1-sec Definitive Data - A. Koval (UMBC, NASA/GSFC)", "DSCOVR_H1_FC": "Isotropic Maxwellian parameters for solar wind protons. - Justin C. Kasper (Smithonian Astrophysical Observatory)", "DSCOVR_ORBIT_PRE": "DSCOVR Predicted Orbit - A. Szabo (NASA Goddard Space Flight Center)", "EARTH_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "ELA_L1_STATE_DEFN": "Probe state file, contains definitive position, attitude and orbit events - V. Angelopoulos (UCLA, IGPP/EPSS)", "ELA_L1_STATE_PRED": "Probe state file, contains predictive position, velocity, and attitude - V. Angelopoulos (UCLA, IGPP/EPSS)", "ELB_L1_STATE_DEFN": "Probe state file, contains definitive position, attitude and orbit events - V. Angelopoulos (UCLA, IGPP/EPSS)", "ELB_L1_STATE_PRED": "Probe state file, contains predictive position, velocity, and attitude - V. Angelopoulos (UCLA, IGPP/EPSS)", "EQ_PP_AUX": "Equator-S Auxiliary Data Prime Parameters - EDC (MPE)", "EQ_PP_EDI": "Equator-S Electron Drift Instrument Prime Parameters - G. Paschmann (MPE)", "EQ_PP_EPI": "Equator-S Energetic Particle Instrument Prime Parameters - T. Sanderson (ESTEC)", "EQ_PP_ICI": "Equator-S Ion Composition Instrument Prime Parameters.(The raw moments calculated onboard should only be used qualitatively for identifying regions and temporal variations. Quantitative analysis should be done with the final moments generated from telemetered 3D distributions.) - L. Kistler (UNH)", "EQ_PP_MAM": "Equator-S Fluxgate Magnetometer Prime Parameters - W. Baumjohann (MPE)", "EQ_PP_PCD": "Equator-S Potential Control Device Prime Parameters - K. Torkar (IWF)", "EQ_SP_SFD": "Equator-S Scintillating Fibre Detector Summary Parameters - L. Adams (ESTEC)", "ERG_HEP_L2_OMNIFLUX": "High-energy electron experiments (HEP) Level-2 omni flux data, ARASE/ERG) - Takefumi Mitani (ISAS, JAXA)", "ERG_LEPE_L2_OMNIFLUX": "Low-Energy Particle experiments - electron analyzer (LEP-e) Level 2 omni electron flux data, ARASE/ERG - Shiang-Yu Wang (Academia Sinica, Taiwan)", "ERG_LEPI_L2_OMNIFLUX": "Exploration of Low Energy Particle Ion (LEPi) Experiment 3D ion flux data, ARASE/ERG - Kazushi Asamura (ISAS, Jaxa)", "ERG_MEPE_L2_3DFLUX": "Exploration of Energization and Radiation in Geospace (ERG) Medium-Energy Particle experiments - electron analyzer (MEP-e) Level 2 3D electron flux data - Satoshi Kasahara (The University of Tokyo)", "ERG_MEPE_L2_OMNIFLUX": "Medium Energy Particle experiments - electron analyzer (MEP-e) electron omni flux data, ARASE/ERG - Satoshi Kasahara (The University of Tokyo)", "ERG_MEPI_L2_3DFLUX": "Exploration of Energization and Radiation in Geospace (ERG) Medium Energy Particle experiments - ion mass analyzer (MEP-i) Level-2 3D flux data - Shoichiro Yokota (Osaka University)", "ERG_MEPI_L2_OMNIFLUX": "Medium Energy Particle experiments - ion mass analyzer (MEP-i) 3D ion omni flux data, ARASE/ERG - Shoichiro Yokota (Osaka University)", "ERG_MGF_L2_8SEC": "Magnetic Field Experiment (MGF) Level 2 spin-averaged magnetic field data, ARASE/ERG - Ayako Matsuoka (Institute of Space and Astronautical Science, Japan Aerospace Exploration Agency, 3-1-1 Yoshinodai, Chuo-ku, Sagamihara, Kanagawa 252-5210, Japan)", "ERG_ORB_L2": "Exploration of Energization and Radiation in Geospace (ERG) Level-2 orbit data (JAXA/ISAS)", "ERG_ORB_L3": "Exploration of Energization and Radiation in Geospace (ERG) Level-3 orbit data (JAXA/ISAS)", "ERG_ORB_LPRE_L2": "Exploration of Energization and Radiation in Geospace (ERG) Level-2 long-term predicted orbit data (JAXA/ISAS)", "ERG_ORB_MPRE_L2": "Exploration of Energization and Radiation in Geospace (ERG) Level-2 medium-term predicted orbit data (JAXA/ISAS)", "ERG_ORB_PRE_L2": "Exploration of Energization and Radiation in Geospace (ERG) Level-2 predicted orbit data (JAXA/ISAS)", "ERG_ORB_SPRE_L2": "Exploration of Energization and Radiation in Geospace (ERG) Level-2 short-term predicted orbit data (JAXA/ISAS)", "ERG_PWE_EFD_L2_E_SPIN": "Plasma Wave Experiment (PWE) Electric Field Detector (EFD) Level 2 spectrum data, ARASE/ERG - Yoshiya Kasahara (Kanazawa University)", "ERG_PWE_EFD_L2_POT": "Plasma Wave Experiment (PWE) Electric Field Detector (EFD) Level 2 potential data, ARASE/ERG - Yoshiya Kasahara (Kanazawa University)", "ERG_PWE_HFA_L2_SPEC_HIGH": "Exploration of Energization and Radiation in Geospace (ERG) Plasma Wave Experiment (PWE) Electric Field Data (HFA) Level 2 spectrum data - Yoshiya Kasahara (Kanazawa University)", "ERG_PWE_HFA_L2_SPEC_LOW": "Exploration of Energization and Radiation in Geospace (ERG) Plasma Wave Experiment (PWE) Electric Field Data (HFA) Level 2 spectrum low data - Yoshiya Kasahara (Kanazawa University)", "ERG_PWE_HFA_L2_SPEC_MONIT": "Exploration of Energization and Radiation in Geospace (ERG) Plasma Wave Experiment (PWE) Electric Field Data (HFA) Level 2 spectrum data - Yoshiya Kasahara (Kanazawa University)", "ERG_PWE_OFA_L2_SPEC": "Plasma Wave Experiment (PWE) Onboard Frequency Analyzer (OFA) Level 2 spectrum data, ARASE/ERG - Yoshiya Kasahara (Kanazawa University)", "ERG_XEP_L2_OMNIFLUX": "Exploration of Energization and Radiation in Geospace (ERG) Extremely High-Energy Electron Experiment (XEP) Level 2 extremely high energy electron data - Nana Higashio (Space Environment Group, Aerospace Research and Development Directorate, Tsukuba Space Center, Japan Aerospace Exploration Agency, 2-1-1 Sengen, Tsukuba, Ibaraki 305-8505, Japan)", "FAST_HR_DCB": "High-resolution Fluxgate Magnetometer data for the FAST Mission - Robert Strangeway (UCLA)", "FAST_OR_SSC": "Orbit parameters from SSCWeb - SSCWeb (SPDF/Goddard)", "FAST_TEAMS_PA_L2": "FAST TEAMS Energy-Pitch Angle Distributions - Lynn Kistler (University of New Hampshire)", "FA_ESA_L2_EEB": "FAST Electron Burst Distributions - J. P. McFadden (U.C. Berkeley Space Sciences Laboratory)", "FA_ESA_L2_EES": "FAST Electron Survey Distributions - J. P. McFadden (U.C. Berkeley Space Sciences Laboratory)", "FA_ESA_L2_IEB": "FAST Ion Burst Distributions - J. P. McFadden (U.C. Berkeley Space Sciences Laboratory)", "FA_ESA_L2_IES": "FAST Ion Survey Distributions - J. P. McFadden (U.C. Berkeley Space Sciences Laboratory)", "FA_K0_ACF": "FAST AC Fields - Key Parameters - C. Carlson (U.C. Berkeley)", "FA_K0_TMS": "FAST Energy Angle Mass Spectrograph - 5-s Survey/Key Parameters - E. Lund (UNH)", "FM_K0_KILP": "FMI Kilpisjarvi: All-Sky Camera Key Parameters - K. Kauristie (Finnish Meteorological Institute)", "FORMOSAT5_AIP_IDN": "FORMOSAT-5, Advanced Ionospheric Probe, Ion Density - C.K. Chao (NCU)", "G0_K0_EP8": "GOES 10 Energetic Particle Sensor, Key Parameters - T. Onsager (NOAA SEC)", "G0_K0_GIFWALK": "Links to GEOSYNC KP pre-generated survey and other plots - Polar-Wind-Geotail Ground System (NASA GSFC)", "G0_K0_MAG": "GOES 10 Magnetometer Key Parameters - H. Singer (NOAA SEC)", "G10_L2_MAG": "GOES-10 High Resolution Magnetometer data vectors (at 512 ms, ephem at 60 sec) - Howard J. Singer (NOAA Space Weather Prediction Center)", "G11_L2_MAG": "GOES-11 High Resolution Magnetometer data vectors (at 512 ms, ephem at 60 sec) - Howard J. Singer (NOAA Space Weather Prediction Center)", "G12_L2_MAG": "GOES-12 High Resolution Magnetometer data vectors (at 512 ms, ephem at 60 sec) - Howard J. Singer (NOAA Space Weather Prediction Center)", "G6_K0_EPS": "GOES 6 Energetic Particle Sensor, Key Parameters - H. Sauer (NOAA)", "G6_K0_MAG": "GOES-6 Magnetometer Key Parameters - R. Zwickl (NOAA SEL)", "G7_K0_EPS": "GOES 7 Energetic Particle Sensor, Key Parameters - H. Sauer (NOAA)", "G7_K0_MAG": "GOES-7 Magnetometer Key Parameters - R. Zwickl (NOAA SEL)", "G7_K1_MAG": "GOES-7 Magnetometer Calculated PSD for Hn - R. Zwickl (NOAA SEL)", "G8_K0_EP8": "GOES 8 Energetic Particle Sensor, Key Parameters - T. Onsager (NOAA SEC)", "G8_K0_MAG": "GOES 8 Magnetometer Key Parameters - H. Singer (NOAA SEC)", "G9_K0_EP8": "GOES 9 Energetic Particle Sensor, Key Parameters - T. Onsager (NOAA SEC)", "G9_K0_MAG": "GOES 9 Magnetometer Key Parameters - H. Singer (NOAA SEC)", "GALILEO_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "GENESIS_3DL2_GIM": "Genesis Ion Monitor Experiment - Roger C. Wiens (LANL)", "GE_1MIN_MAG_PLASMA_SW_ONLY": "Geotail Combined, Definitive, Minute IMF, Plasma - J.H. King, N. Papatashvilli (Perot Sys, NASA GSFC)", "GE_AT_DEF": "Geotail Definitive Attitude", "GE_AT_PRE": "Geotail Predicted Attitude", "GE_EDA12SEC_LEP": "Editor-A 12 second, Low-Energy Particles, Geotail - T. Mukai (ISAS)", "GE_EDA3SEC_MGF": "Editor-A 3 second data, Magnetic Field Instrument, Geotail - S. Kokubun (STELAB Nagoya Univ., Japan)", "GE_EDB12SEC_LEP": "Editor-B 12 second, Low-Energy Particles, Geotail - T. Mukai (ISAS)", "GE_EDB3SEC_MGF": "Editor-B 3 second data, Magnetic Field Instrument, Geotail - S. Kokubun (STELAB Nagoya Univ., Japan)", "GE_H0_CPI": "Plasma Moments, Definitive Geotail CPI/SWA (Comprehensive Plasma Instrument / Solar Wind Analyzer) - L. Frank, W. Patterson and K. Ackerson (U. Iowa)", "GE_HPAMOM_CPI": "Geotail Comprehensive Plasma Inst., 1min HPA Bulk Parameters - L. Frank (U. Iowa)", "GE_K0_CPI": "Plasma Moments, Key Parameters, Geotail CPI (Comprehensive Plasma Instrument) - L. Frank (U. Iowa)", "GE_K0_EFD": "Geotail Electric Field Detector, Key Parameters - K. Tsuruda (ISAS)", "GE_K0_EPI": "Geotail Energetic Particles & Ion Composition (EPIC), Key Parameters - D. Williams (APL/JHU)", "GE_K0_GIFWALK": "Links to Geotial pre-generated survey and other plots - Polar-Wind-Geotail Ground System (NASA GSFC)", "GE_K0_LEP": "Geotail Low-Energy Particles, Key Parameters - T. Mukai (ISAS)", "GE_K0_MGF": "Geotail Magnetic Field Instrument - S. Kokubun (STELAB Nagoya Univ., Japan)", "GE_K0_PWI": "Geotail Plasma Wave Instrument, Key Parameters - H. Matsumoto (Kyoto Univ.)", "GE_K0_SPHA": "Geotail Spin Phase", "GE_OR_DEF": "Geotail Definitive Orbit", "GE_OR_GIFWALK": "Links to Geotail and multi-mission orbit plots - Polar-Wind-Geotail Ground System (NASA GSFC)", "GE_OR_PRE": "Geotail Predicted Orbit", "GE_SW_CPI": "Distributions and Plasma Moments, Definitive, Geotail CPI/SWA (Comprehensive Plasma Instrument / Solar Wind Analyzer) - L. Frank, W. Patterson and K. Ackerson (U. Iowa)", "GIACOBINI_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "GIOTTO_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "GOES10_EPHEMERIS_SSC": "GOES10 Ephemeris data from the SSCWeb system - SPDF (Goddard Space Flight Center)", "GOES11_EPHEMERIS_SSC": "GOES11 Ephemeris data from the SSCWeb system - SPDF (Goddard Space Flight Center)", "GOES11_K0_EP8": "GOES 11 Energetic Particle Sensor, Key Parameters - T. Onsager (NOAA SEC)", "GOES11_K0_MAG": "GOES 11 Magnetometer Key Parameters - H. Singer (NOAA SEC)", "GOES12_EPHEMERIS_SSC": "GOES12 Ephemeris data from the SSCWeb system - SPDF (Goddard Space Flight Center)", "GOES12_K0_MAG": "GOES 12 Magnetometer Key Parameters - H. Singer (NOAA SEC)", "GOES13_EPEAD-SCIENCE-ELECTRONS-E13EW_1MIN": "GOES Energetic Proton Electron and Alpha Detector Electron Fluxes reprocessed for scientific use - NOAA NGDC and SWPC (sem.goes@noaa.gov)", "GOES13_EPHEMERIS_SSC": "GOES13 Ephemeris data from the SSCWeb system - SPDF (Goddard Space Flight Center)", "GOES13_EPS-MAGED_1MIN": "GOES-13 EPS (Energetic Particle Sensor) MagED (Magnetospheric Electron Detector) 1 minute electron fluxes 40-475 keV - NOAA NGDC and SWPC (sem.goes@noaa.gov)", "GOES13_EPS-MAGED_5MIN": "GOES-13 EPS (Energetic Particle Sensor) MagED (Magnetospheric Electron Detector) 5 minute electron fluxes 40-475 keV - NOAA NGDC and SWPC (sem.goes@noaa.gov)", "GOES13_EPS-PITCH-ANGLES_1MIN": "GOES-13 EPS (Energetic Particle Sensor) MagED (Magnetospheric Electron Detector) 1 minute electron fluxes 40-475 keV - NOAA NGDC and SWPC (sem.goes@noaa.gov)", "GOES14_EPEAD-SCIENCE-ELECTRONS-E13EW_1MIN": "GOES Energetic Proton Electron and Alpha Detector Electron Fluxes reprocessed for scientific use - NOAA NGDC and SWPC (sem.goes@noaa.gov)", "GOES14_EPHEMERIS_SSC": "GOES14 Ephemeris data from the SSCWeb system - SPDF (Goddard Space Flight Center)", "GOES14_EPS-MAGED_1MIN": "GOES-14 EPS (Energetic Particle Sensor) MagED (Magnetospheric Electron Detector) 1 minute electron fluxes 40-475 keV - NOAA NGDC and SWPC (sem.goes@noaa.gov)", "GOES14_EPS-MAGED_5MIN": "GOES-14 EPS (Energetic Particle Sensor) MagED (Magnetospheric Electron Detector) 5 minute electron fluxes 40-475 keV - NOAA NGDC and SWPC (sem.goes@noaa.gov)", "GOES14_EPS-PITCH-ANGLES_1MIN": "GOES-14 EPS (Energetic Particle Sensor) MagED (Magnetospheric Electron Detector) 1 minute electron fluxes 40-475 keV - NOAA NGDC and SWPC (sem.goes@noaa.gov)", "GOES15_EPEAD-SCIENCE-ELECTRONS-E13EW_1MIN": "GOES Energetic Proton Electron and Alpha Detector Electron Fluxes reprocessed for scientific use - NOAA NGDC and SWPC (sem.goes@noaa.gov)", "GOES15_EPHEMERIS_SSC": "GOES-15 Ephemeris data from the SSCWeb system - SPDF (Goddard Space Flight Center)", "GOES15_EPS-MAGED_1MIN": "GOES-15 EPS (Energetic Particle Sensor) MagED (Magnetospheric Electron Detector) 1 minute electron fluxes 40-475 keV - NOAA NGDC and SWPC (sem.goes@noaa.gov)", "GOES15_EPS-MAGED_5MIN": "GOES-15 EPS (Energetic Particle Sensor) MagED (Magnetospheric Electron Detector) 5 minute electron fluxes 40-475 keV - NOAA NGDC and SWPC (sem.goes@noaa.gov)", "GOES15_EPS-PITCH-ANGLES_1MIN": "GOES-15 EPS (Energetic Particle Sensor) MagED (Magnetospheric Electron Detector) 1 minute electron fluxes 40-475 keV - NOAA NGDC and SWPC (sem.goes@noaa.gov)", "GOES16_EPHEMERIS_SSC": "GOES16 Ephemeris data from the SSCWeb system - SPDF (Goddard Space Flight Center)", "GOES17_EPHEMERIS_SSC": "GOES17 Ephemeris data from the SSCWeb system - SPDF (Goddard Space Flight Center)", "GOES8_EPHEMERIS_SSC": "GOES8 Ephemeris data from the SSCWeb system - SPDF (Goddard Space Flight Center)", "GOES9_EPHEMERIS_SSC": "GOES9 Ephemeris data from the SSCWeb system - SPDF (Goddard Space Flight Center)", "GOLD_L2_NMAX": "GOLD Peak Electron density NMAX L2 Daily Files - Richard Eastes (University of Colorado/LASP)", "GOLD_L2_ON2": "GOLD: O to N2 column ratio - Richard Eastes (University of Colorado/LASP)", "GOLD_L2_TDISK": "GOLD TDISK Neutral Temperatures - Richard Eastes (University of Colorado/LASP)", "GPS_ROTI15MIN_JPL": "GPS-deduced ROTI index: standard deviation of rate of change of Total Electron Content (TEC) in a 5 min interval every 15 min; world maps and movies - Xiaoqing Pi (Jet Propulsion Laboratory)", "GPS_TEC15MIN_IGS": "GPS-deduced 15-minute Total Electron Content (TEC) global maps and movies, UPC= U Politec. Catalonia Barcelona Spain - International Global Navigation Satellite Systems (GNSS) Service Iono Working Group", "GPS_TEC1HR_IGS": "GPS-deduced 1-hour Total Electron Content (TEC) global maps and movies, UPC= U Politec. Catalonia Barcelona Spain, ESA= ESOC Darmstadt Germany (starting 20 Feb 2011) - International Global Navigation Satellite Systems (GNSS) Service Ionosphere Working Group", "GPS_TEC2HR_IGS": "GPS-deduced 2-hour Total Electron Content (TEC) maps and movies, IGS= Average of 4 methods, incl. CODE= U Bern Switzerland, ESA= ESOC Darmstadt Germany, JPL= Jet Propulsion Lab. Pasadena USA, UPC= U Politec. Catalonia Barcelona Spain - International Global Navigation Satellite Systems (GNSS) Service Ionosphere Working Group", "HALEBOPP_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "HALLEY_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "HEL1_6SEC_NESSMAG": "HEL1_6SEC_NESSMAG - Mariani/Ness (University of Rome, CNR/Istituto Fisica Interplanetario, and NASA/GSFC)", "HEL2_6SEC_NESSMAG": "HEL2_6SEC_NESSMAG - Mariani/Ness (University of Rome, CNR/Istituto Fisica Interplanetario, and NASA/GSFC)", "HELIOS1_40SEC_MAG-PLASMA": "Merged 40.5 s magnetic field, plasma data, ephemeris - R. Schwenn, F. M. Neubauer (Max Planck Institute for Solar System Research, University of Cologne)", "HELIOS1_COHO1HR_MERGED_MAG_PLASMA": "Helios-1 merged hourly magnetic field, plasma, proton fluxes, and ephermis data - N. Ness, F. Neubauer, F. Mariani (magnetic field), H. Rosenbauer, R. Schwenn (plasma) and J. Freeman (all affiliated with ESA or NASA)", "HELIOS1_E6_1HOUR_PARTICLE_FLUX": "hourly averaged fluxes of e, H and He - H. Kunow (University of Kiel)", "HELIOS1_E6_KUNOW_1HOUR_PARTICLE-FLUX": "Hourly averaged fluxes of e, H and He from Helios-1/E6(Kunow) - H. Kunow (University of Kiel)", "HELIOS1_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "HELIOS2_40SEC_MAG-PLASMA": "Merged 40.5 s magnetic field, plasma data, ephemeris - R. Schwenn, F. M. Neubauer (Max Planck Institute for Solar System Research, University of Cologne)", "HELIOS2_COHO1HR_MERGED_MAG_PLASMA": "Helios-2 merged hourly magnetic field, plasma, proton fluxes, and ephermis data - N. Ness, F. Neubauer, F. Mariani (magnetic field), H. Rosenbauer, R. Schwenn (plasma) and J. Freeman (all affiliated with ESA or NASA)", "HELIOS2_E6_1HOUR_PARTICLE_FLUX": "hourly averaged fluxes of e, H and He - H. Kunow (University of Kiel)", "HELIOS2_E6_KUNOW_1HOUR_PARTICLE-FLUX": "Hourly averaged fluxes of e, H and He from Helios-1/E6(Kunow) - H. Kunow (University of Kiel)", "HELIOS2_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "HK_H0_MAG": "Hawkeye Magnetic Field Instrument - J. Van Allen (University of Iowa)", "HK_H0_VLF": "Hk Electric and Magnetic Field Radio Frequency Spectrum Analyzer High Time Resolution - D. Gurnett (University of Iowa)", "HYAKUTAKE_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "I1_AV2_OTT": "ISIS Topside Sounder Ionogram - R.F. Benson (NASA GSFC)", "I1_AV2_QUI": "ISIS Topside Sounder Ionogram - R.F. Benson (NASA GSFC)", "I1_AV2_ULA": "ISIS Topside Sounder Ionogram - R.F. Benson (NASA GSFC)", "I1_AV_ALL": "ISIS-1 Topside sounder ionograms, all stations merged into a single dataset - R.F. Benson (NASA GSFC)", "I1_AV_KER": "ISIS-1 Topside Sounder Ionograms over Kerguelen Island, France (Lat=-49, Long=70) - R.F. Benson (NASA GSFC)", "I1_AV_KSH": "ISIS-1 Topside Sounder Ionogram over Kashima, Japan (lat/lon=36/141) - R.F. Benson (NASA GSFC)", "I1_AV_KWA": "ISIS-1 Topside Sounder Ionogram over Kwajalein, Marshall Is. (lat/lon=9/168) - R.F. Benson (NASA GSFC)", "I1_AV_ODG": "ISIS-1 Topside Sounder Ionogram over Ouagadougou, Burkina Faso (lat/lon=14/359) - R.F. Benson (NASA GSFC)", "I1_AV_ORR": "ISIS-1 Topside Sounder Ionogram over Orroral, Australia (lat/lon=-36/149) - R.F. Benson (NASA GSFC)", "I1_AV_OTT": "ISIS-1 Topside Sounder Ionogram over Ottawa, Canada (lat/lon=45/284) - R.F. Benson (NASA GSFC)", "I1_AV_QUI": "ISIS-1 Topside Sounder Ionogram over Quito, Equador (lat/lon=-1/281) - R.F. Benson (NASA GSFC)", "I1_AV_RES": "ISIS-1 Topside Sounder Ionogram over Resolute Bay, Canada (lat/lon=75/265) - R.F. Benson (NASA GSFC)", "I1_AV_SNT": "ISIS-1 Topside Sounder Ionogram over Santiago, Chile (lat/lon=-33/298) - R.F. Benson (NASA GSFC)", "I1_AV_SOD": "ISIS-1 Topside Sounder Ionogram over Sodankyla, Finland (lat/lon=67/27) - R.F. Benson (NASA GSFC)", "I1_AV_TRO": "ISIS-1 Topside Sounder Ionogram over Tromso, Norway (lat/lon=70/19) - R.F. Benson (NASA GSFC)", "I1_AV_ULA": "ISIS-1 Topside Sounder Ionogram over Fairbanks, Alaska (lat/lon=65/212) - R.F. Benson (NASA GSFC)", "I1_AV_WNK": "ISIS-1 Topside Sounder Ionogram over Winkfield, U.K. (lat/lon=51/359) - R.F. Benson (NASA GSFC)", "I1_NEPROF_TOPS": "ISIS-1 Topside Electron Density Profiles, manually scaled at CRC - J. E. Jackson (Communication Research Centre (CRC), Ottawa)", "I2_AV_ACN": "ISIS-2 Topside Sounder Ionogram over Ascension Is., U.K. (lat/lon= -8/346) - R.F. Benson (NASA GSFC)", "I2_AV_ADL": "ISIS-2 Topside Sounder Ionogram over Terre Adelie, Antarctica (lat/lon=-67/140) - R.F. Benson (NASA GSFC)", "I2_AV_AME": "ISIS-2 Topside Sounder Ionogram over Ahmedabad, India (lat/lon=23/73) - R.F. Benson (NASA GSFC)", "I2_AV_BRZ": "ISIS-2 Topside Sounder Ionogram over Brazzavillle, Congo (lat/lon=-4/15) - R.F. Benson (NASA GSFC)", "I2_AV_BUR": "ISIS-2 Topside Sounder Ionogram over Johannesburg, South Africa (lat/lon=-26/28) - R.F. Benson (NASA GSFC)", "I2_AV_CNA": "ISIS-2 Topside Sounder Ionogram over Las Palmas, Canary Is., Spain (lat/lon=28/345) - R.F. Benson (NASA GSFC)", "I2_AV_KER": "ISIS-2 Topside Sounder Ionogram over Kerguelen Is., France (lat/lon=-49/70) - R.F. Benson (NASA GSFC)", "I2_AV_KRU": "ISIS-2 Topside Sounder Ionogram over Kourou, French Guyana (lat/lon=5/307) - R.F. Benson (NASA GSFC)", "I2_AV_KSH": "ISIS-2 Topside Sounder Ionogram over Kashima, Japan (lat/lon=36/141) - R.F. Benson (NASA GSFC)", "I2_AV_KWA": "ISIS-2 Topside Sounder Ionogram over Kwajalein, Marshall Is. (lat/lon=9/168) - R.F. Benson (NASA GSFC)", "I2_AV_LAU": "ISIS-2 Topside Sounder Ionogram over Lauder, New Zealand (lat/lon=-45/170) - R.F. Benson (NASA GSFC)", "I2_AV_ODG": "ISIS-2 Topside Sounder Ionogram over Ouagadougou, Burkina Faso (lat/lon=14/359) - R.F. Benson (NASA GSFC)", "I2_AV_ORR": "ISIS-2 Topside Sounder Ionogram over Orroral Australia (lat/lon=-36/149) - R.F. Benson (NASA GSFC)", "I2_AV_OTT": "ISIS-2 Topside Sounder Ionogram over Ottawa, Canada (lat/lon=45/284) - R.F. Benson (NASA GSFC)", "I2_AV_QUI": "ISIS-2 Topside Sounder Ionogram over Quito, Equador (lat/lon=-1/281) - R.F. Benson (NASA GSFC)", "I2_AV_RES": "ISIS-2 Topside Sounder Ionogram over Resolute Bay, Canada (lat/lon=75/265) - R.F. Benson (NASA GSFC)", "I2_AV_SNT": "ISIS-2 Topside Sounder Ionogram over Santiago, Chile (lat/lon=-33/298) - R.F. Benson (NASA GSFC)", "I2_AV_SOD": "ISIS-2 Topside Sounder Ionogram over Sodankyla, Finland (lat/lon=67/27) - R.F. Benson (NASA GSFC)", "I2_AV_SOL": "ISIS-2 Topside Sounder Ionogram over Falkland Is., U.K. (lat/lon=-52/302) - R.F. Benson (NASA GSFC)", "I2_AV_SYO": "ISIS-2 Topside Sounder Ionogram over Syowa Base, Antartica (lat/lon=-69/40) - R.F. Benson (NASA GSFC)", "I2_AV_TRO": "ISIS-2 Topside Sounder Ionogram over Tromso, Norway (lat/lon=70/19) - R.F. Benson (NASA GSFC)", "I2_AV_ULA": "ISIS-2 Topside Sounder Ionogram over Fairbanks, Alaska (lat/lon=65/212) - R.F. Benson (NASA GSFC)", "I2_AV_WNK": "ISIS-2 Topside Sounder Ionogram over Winkfield, U.K. (lat/lon=51/359) - R.F. Benson (NASA GSFC)", "I2_NEPROF_TOPIST": "ISIS-2 TOPIST produced electron density profiles, of highest quality (quality flag = 2 and 3 - X. Huang and B. Reinisch (University of MassachusettsLowell)", "I2_NEPROF_TOPS": "ISIS-2 Topside Electron Density Profiles, manually scaled at CRC - J. E. Jackson (Communication Research Centre (CRC), Ottawa)", "I7_R0_LEPEDEA": "Link to IMP7 LEPEDEA Energy-Time Spectrograms in GIF format at the University of Iowa. - L. A. Frank (University of Iowa)", "I8_15SEC_MAG": "IMP-8 Fluxgate Magnetometer, 15.36-Second Resolution Data - A. Szabo / R.P. Lepping (NASA GSFC)", "I8_320MSEC_MAG": "IMP-8 Fluxgate Magnetometer, 320 msec Resolution Data - Adam Szabo, Joe King and Natalia Papitashvili (NASA GSFC)", "I8_H0_GME": "IMP-8 GME 30-min Fluxes (SEP optimal bands) - R.E. McGuire (SPDF/Code 612.4, NASA's GSFC)", "I8_H0_MITPLASMA": "IMP-8 MIT Plasma Investigation, High Resolution Definitive Data - A. Lazarus (MIT)", "I8_OR_GIFWALK": "Links to IMP-8 and multi-mission orbit plots - Polar-Wind-Geotail Ground System (NASA GSFC)", "I8_OR_SSC": " IMP-8 orbital position (multiple coordinate systems, from April 2003 updated I8 orbit model) - SSC ( SPDF/GSFC)", "I8_R0_LEPEDEA": "Link to IMP8 LEPEDEA Energy-Time Spectrograms in GIF format at the University of Iowa. - L. A. Frank (University of Iowa)", "IA_K0_ENF": "Interball Auroral Probemeasurements of spectra and anisotropy of electrons SKA-3, Key Parameters - Yu. Galperin, R. Kovrazhkin, A. Kuzmin, F. Shuiskaya (IKI RAN, Russia)", "IA_K0_EPI": "Interball Auroral Energetic Particle Instruments, KeyParameters - DOK-2: K.Kudela (DOK-2: Institute of experimental physics Slovak Acad. Sci., Kosize, Slovakia )", "IA_K0_ICD": "Interball Auroral Probe Ion Composition Experiment PROMICS, Key Parameters - I.Sandahl (IRF, Kiruna, Sweden)", "IA_K0_MFI": "Interball Auroral probe Magnetic Field, Key Parameters - V.Petrov (IMAP:IZMIRAN,Troitsk, Russia. )", "IA_OR_DEF": "Interball Auroral Probe Orbital Data, Key Parameters - V.Prokhorenko (Space Research Inst., Russian Acad. Sci., Moscow, Russia. )", "IBEX_H3_ENA_HI_R10_CG_NOSP_ANTIRAM_1YR": "IBEX-Hi Release-10; Compton-Getting, no Survival-Probability, antiram-direction 1-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_CG_NOSP_ANTIRAM_7YR": "IBEX-Hi Release-10; Compton-Getting, no Survival-Probability, antiram-direction 7-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_CG_NOSP_OMNI_6MO": "IBEX-Hi Release-10; Compton-Getting, no Survival-Probability, Omnidirectional 6-month-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_CG_NOSP_OMNI_7YR": "IBEX-Hi Release-10; Compton-Getting, no Survival-Probability, omni-direction 7-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_CG_NOSP_RAM_1YR": "IBEX-Hi Release-10; Compton-Getting, no Survival-Probability, ram-direction 1-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_CG_NOSP_RAM_7YR": "IBEX-Hi Release-10; Compton-Getting, no Survival-Probability, ram-direction 7-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_CG_SP_ANTIRAM_1YR": "IBEX-Hi Release-10; Compton-Getting, Survival-Probability, AntiRAMdirectional 1-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_CG_SP_ANTIRAM_7YR": "IBEX-Hi Release-10; Compton-Getting, Survival-Probability, antiram-direction 7-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_CG_SP_OMNI_6MO": "IBEX-Hi Release-10; Compton-Getting, Survival-Probability, Omnidirectional 6-month-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_CG_SP_OMNI_7YR": "IBEX-Hi Release-10; Compton-Getting, Survival-Probability, omni-direction 7-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_CG_SP_RAM_1YR": "IBEX-Hi Release-10; Compton-Getting, Survival-Probability, RAMdirectional 1-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_CG_SP_RAM_7YR": "IBEX-Hi Release-10; Compton-Getting, Survival-Probability, ram-direction 7-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_NOCG_NOSP_ANTIRAM_1YR": "IBEX-Hi Release-10; no Compton-Getting, no Survival-Probability, antiram-direction 1-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_NOCG_NOSP_ANTIRAM_7YR": "IBEX-Hi Release-10; no Compton-Getting, no Survival-Probability, antiram-direction 7-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_NOCG_NOSP_OMNI_6MO": "IBEX-Hi Release-10; no Compton-Getting, no Survival-Probability, Omnidirectional 6-month-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_NOCG_NOSP_OMNI_7YR": "IBEX-Hi Release-10; no Compton-Getting, no Survival-Probability, omni-direction 7-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_NOCG_NOSP_RAM_1YR": "IBEX-Hi Release-10; no Compton-Getting, no Survival-Probability, ram-direction 1-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_NOCG_SP_ANTIRAM_1YR": "IBEX-Hi Release-10; no Compton-Getting, Survival-Probability, antiram-direction 1-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_NOCG_SP_ANTIRAM_7YR": "IBEX-Hi Release-10; no Compton-Getting, Survival-Probability, antiram-direction 7-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_NOCG_SP_OMNI_6MO": "IBEX-Hi Release-10; no Compton-Getting, Survival-Probability, Omnidirectional 6-month-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_NOCG_SP_OMNI_7YR": "IBEX-Hi Release-10; no Compton-Getting, Survival-Probability, omni-direction 7-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R10_NOCG_SP_RAM_1YR": "IBEX-Hi Release-10; no Compton-Getting, Survival-Probability, ram-direction 1-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R12_MAGNETOSPHERE_24MIN": "IBEX-Hi Release-12; Count Data for Magnetospheric Imaging. - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R13_CG_NOSP_ANTIRAM_1YR": "IBEX-Hi Release-13; Compton-Getting, no Survival-Probability, antiram-direction 1-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R13_CG_NOSP_RAM_1YR": "IBEX-Hi Release-13; Compton-Getting, no Survival-Probability, ram-direction 1-year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_HI_R14_PRESS-SLOPE_CG_NOSP_RAM_3YR": "IBEX-Hi Release-14; Compton-Getting, no Survival-Probability, ram-direction 3-year-Average West Ecliptic Pressure andFlux Power-Law Slope Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_LO_R09_PARK_OMAP_3YR": "IBEX-Lo Release-09; Park et al. 2015) 3-year combined heavy neutral maps: m1-to-m6 (map1 + map2 + map3 + map4 + map5 + map6) West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_LO_R09_PARK_OMAP_3YR-EVEN-MAPS": "IBEX-Lo Release-09; Park et al. 2015) 3-year combined heavy neutral even maps: m2m4m6 (map2 + map4 + map6) West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_LO_R09_PARK_OMAP_3YR-ODD-MAPS": "IBEX-Lo Release-09; Park et al. 2015) 3-year combined heavy neutral odd maps: m1m3m5 (map1 + map3 + map5) West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_LO_R09_PARK_OMAP_6MO": "IBEX-Lo Release-09; Park Oxygen Map Counting Rate 6-month-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_LO_R09_PARK_OMAP_STAT_3YR": "IBEX-Lo Release-09; Park et al. 2015) 3-year combined heavy neutral maps: m1-to-m6 (map1 + map2 + map3 + map4 + map5 + map6) with statistical filtering - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_LO_R10_NOCG_NOSP_OMNI_6MO": "IBEX-Lo Release-10; no Compton-Getting, no Survival-Probability, Omnidirectional 6-month-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_LO_R10_NOCG_NOSP_OMNI_7YR": "IBEX-Lo Release-10; no Compton-Getting, no Survival-Probability, Omnidirectional 7-Year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_LO_R10_NOCG_SP_OMNI_6MO": "IBEX-Lo Release-10; no Compton-Getting, Survival-Probability, Omnidirectional 6-month-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "IBEX_H3_ENA_LO_R10_NOCG_SP_OMNI_7YR": "IBEX-Lo Release-10; no Compton-Getting, Survival-Probability, Omnidirectional 7-Year-Average West Ecliptic Maps - Dr. David J. McComas (Princeton University)", "ICON_L2-7_IVM-A": "ICON Ion Velocity Meter (IVM) Thermal Plasma Measurements - T. J. Immel (UC Berkeley > SSL)", "IG_K0_PCI": "Interball Polar Cap Activity Index, Key Parameters - V.Sergeev (Institute of physics Univ. of St.-Peterburg St.-Peterburg, Russia )", "IMAGE_M2_EUV": "Imager for Magnetospause-to-Aurora Global Extreme Ultraviolet Imager Modified Data 2 - R. M. Katus (Eastern Michigan University)", "IM_ELECTRON_DENSITY_RPI": "IMAGE RPI electron density along the spacecraft orbit, IMAGE Radio Plasma Imager (RPI) - R. E. Denton & B.W. Reinisch (Dartmouth, UMLCAR)", "IM_HK_ADS": "Image Attitude Determination System Housekeeping - Dr. Jim Burch (Southwest Research Institute)", "IM_HK_AST": "Image Autonomous Star Tracker Housekeeping - Dr. Jim Burch (Southwest Research Institute)", "IM_HK_COM": "Image Communication Systems Housekeeping - Dr. Jim Burch (Southwest Research Institute)", "IM_HK_FSW": "Image Flight Software Housekeeping - Dr. Jim Burch (Southwest Research Institute)", "IM_HK_PWR": "Image Power Systems Housekeeping - Dr. Jim Burch (Southwest Research Institute)", "IM_HK_TML": "Image Thermal Housekeeping - Dr. Jim Burch (Southwest Research Institute)", "IM_K0_EUV": "Ion Images, Key Parameters, IMAGE Extreme UltraViolet (EUV) experiment - Bill Sandel (U/Arizona)", "IM_K0_HENA": "High Energy Neutral Atom (HENA) H Images, Key Parameters, IMAGE - Dr. Don Mitchell (APL)", "IM_K0_LENA": "IMAGE Low Energy Neutral Atom (LENA) Imager Key Parameters - Dr. Tom Moore (GSFC)", "IM_K0_MENA": "Medium Energy Neutral Atom (MENA) H Images, Key Parameters, IMAGE - Dr. Craig Pollock (SwRI)", "IM_K0_RPI": "RPI Plasmagram/Echomap, Key Parameters, IMAGE Radio Plasma Imager (RPI) - B.W. Reinisch (UMLCAR)", "IM_K0_SIE": "Electron Auroral Images @ 1356A, Key Parameters, IMAGE Far UltraViolet (FUV) Spectrographic Imaging camera Electrons (SIE) - S. Mende (UC/Berkeley/SSL)", "IM_K0_SIP": "Proton Auroral Images @ 1218A, Key Parameters, IMAGE Far UltraViolet (FUV) Spectrographic Imaging camera Protons (SIP) - S. Mende (UC/Berkeley/SSL)", "IM_K0_WIC": "Auroral Images, Key Parameters, IMAGE Far UltraViolet (FUV) Wide-band Imaging Camera (WIC) - S. Mende (UC/Berkeley/SSL)", "IM_K1_RPI": "RPI Dynamic Spectrogram, Key Parameters, IMAGE Radio Plasma Imager (RPI) - B.W. Reinisch (UMLCAR)", "IM_OR_DEF": "Image Definitive Data Orbit - Dr. Jim Burch (Southwest Research Institute)", "IM_OR_GIFWALK": "Link to IMAGE orbit plots - Polar-Wind-Geotail Ground System (NASA GSFC)", "IM_OR_PRE": "IMAGE Predicted Orbit - Dr. Jim Burch (Southwest Research Institute)", "ISEE-3_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "ISEE-3_MAGPLASMA_2MIN_MAGNETIC_FIELD_PLASMA": "2 min averaged magnetic field and plasma - Edward Smith (JPL NASA)", "ISEE-3_MAG_1MIN_MAGNETIC_FIELD": "1 min averaged magnetic field - Edward Smith (JPL NASA)", "ISEE1_4SEC_MFI": "12-sec avg vector magnetic field at 4-sec intervals - C. T. Russell (UCLA)", "ISEE1_60SEC_MFI": "60-sec vector magnetic field - C. T. Russell (UCLA)", "ISEE1_H0_FE": "ISEE1_Fast Electrons - K. Ogilvie, R. Fitzenreiter, & A. Vinas (GSFC Code 690)", "ISEE1_H1_FPE": "ISEE 1_H1_FPE / Proton Fluid Parameters 6 RE - Bow Shock - S. Bame & J. Gosling (LANL)", "ISEE1_H2_FPE": "ISEE1_H2_FPE / Solar Wind 24-sec Ion Moments - S. Bame & J. Gosling (LANL)", "ISEE1_PWI_SA": "ISEE-1 PWI: Spectrum Analyzer (SA) - Donald Gurnett (University Iowa)", "ISEE1_PWI_SA-RAPID-E": "ISEE-1 PWI: Spectrum Analyzer (SA) rapid samples - Donald Gurnett (University Iowa)", "ISEE1_PWI_SFR-E": "ISEE-1 PWI: Sweep Frequency Receiver (SFR) - Donald Gurnett (University Iowa)", "ISEE2_4SEC_MFI": "12-sec avg vector magnetic field at 4-sec intervals - C. T. Russell (UCLA)", "ISEE2_60SEC_MFI": "60-sec vector magnetic field - C. T. Russell (UCLA)", "ISEE2_H1_FPE": "ISEE 2_H1_FPE / Proton Fluid Parameters 6 RE - Bow Shock - S. Bame & J. Gosling (LANL)", "ISS_27DAY-AVERAGES_AMS-02": "AMS-02 proton flux (p), helium flux (He), p/He flux ratio, electron flux (e-), positron flux (e+) and e+/e- flux ratio at Bartels rotation time resolution - Prof. V. Bindi (University of Hawaii at Manoa)", "ISS_DOSANL_TEPC": "Experiment Data, ISS TEPC (from ASCII DOS.TXT file) - Edward Semones (NASA Space Radiation Analysis Group/Johnson Space Center)", "ISS_SP_FPMU": "ISS FPMU Summary Plasma Densities and Temperatures [Contact Rob.Suggs@nasa.gov for support and use.] - R. Suggs (NASA Marshall Space Flight Center)", "IT_H0_MFI": "Interball-Tail 6 sec vector magnetic field data - M.Nozdrachev (IKI, Moscow, Russia)", "IT_K0_AKR": "Interball Tail Probe AKR Radioemission flux, Key Parameters - V.Kurilchik (Sternberg Astronomical Inst.,Moscow State University, 119899, Universitetsky pr., 13 Moscow, Russia)", "IT_K0_COR": "Interball Tail Probe CORALL ion moments, Key Parameters - Yu.Yermolaev (Space Research Inst., Russian Acad. Sci., Moscow, Russia)", "IT_K0_ELE": "Interball Tail probe ELECTRON instrument, Key Parameters - J.-A. Sauvaud (CESR, BP 4346, 31029, Toulouse, France )", "IT_K0_EPI": "Interball Tail Energetic Particle Instruments, Key Parameters - DOK-2: K.Kudela (DOK-2: Institute of experimental physics Slovak Acad. Sci., Kosize, Slovakia )", "IT_K0_ICD": "Interball Tail Probe Ion Composition Experiment PROMICS, Key Parameters - I.Sandahl (IRF, Kiruna, Sweden)", "IT_K0_MFI": "Interball Tail probe Magnetic Field, Key Parameters - S.Romanov (Space Research Inst., Russian Acad. Sci., Moscow, Russia. )", "IT_K0_VDP": "Interball Tail probe VDP instrument, Key Parameters - J.Safrankova (Charles University, Prague, Czech Republic )", "IT_K0_WAV": "Interball Tail probe Magnetic Field, Key Parameters - S.Romanov (Space Research Inst., Russian Acad. Sci., Moscow, Russia. )", "IT_OR_DEF": "Interball Tail Orbital Data, Key Parameters - V.Prokhorenko (Space Research Inst., Russian Acad. Sci., Moscow, Russia. )", "IT_OR_GIFWALK": "Links to Interball-Tail and multi-mission orbit plots - Polar-Wind-Geotail Ground System (NASA GSFC)", "JUNO_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "JUPITER_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "L0_K0_MPA": "LANL 1990 Magnetospheric Plasma Analyzer Key Parameters - Mike Henderson (LANL)", "L0_K0_SPA": "LANL 1990 Synchronous Orbit Particle Analyzer Key Parameters - Reiner Friedel (LANL)", "L1_K0_GIFWALK": "Links to GEOSYNC KP pre-generated survey and other plots - Polar-Wind-Geotail Ground System (NASA GSFC)", "L1_K0_MPA": "LANL 1991 Magnetospheric Plasma Analyzer Key Parameters - Mike Henderson (LANL)", "L1_K0_SPA": "LANL 1991 Synchronous Orbit Particle Analyzer Key Parameters - Reiner Friedel (LANL)", "L4_K0_MPA": "LANL 1994 Magnetospheric Plasma Analyzer Key Parameters - Mike Henderson (LANL)", "L4_K0_SPA": "LANL 1994 Synchronous Orbit Particle Analyzer Key Parameters - Reiner Friedel (LANL)", "L7_H0_MPA": "LANL 1997 Magnetospheric Plasma Analyzer High Resolution data - Mike Henderson (LANL)", "L7_K0_MPA": "LANL 1997 Magnetospheric Plasma Analyzer Key Parameters - Mike Henderson (LANL)", "L7_K0_SPA": "LANL 1997 Synchronous Orbit Particle Analyzer Key Parameters - Reiner Friedel (LANL)", "L9_H0_MPA": "LANL 1989-046 Magnetospheric Plasma Analyzer High Resolution data - Mike Henderson (LANL)", "L9_K0_MPA": "LANL 1989 Magnetospheric Plasma Analyzer Key Parameters - Mike Henderson (LANL)", "L9_K0_SPA": "LANL 1989 Synchronous Orbit Particle Analyzer Key Parameters - Reiner Friedel (LANL)", "MARINER2_R0_MAGPLASMA": "Mariner2 merged magnetic field and plasma hourly data from COHOWeb Service", "MARS_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "MAVEN_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "MERCURY_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "MESSENGER_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "MESSENGER_MAG_RTN": "MESSENGER interplanetary magnetic field (1-second/high resolution) in RTN coordinates - Prof. Sean C. Solomon (Carnegie Institution of Washington)", "METOP1_POES-SEM2_FLUXES-2SEC": "POES-SEM2 2-second Particle Precipitation Data, MetOp-B (MetOp-1 before Sept2012 launch) [Important: these data have known contamination problems: please consult Rob Redmon (sem.poes@noaa.gov) for usage recommendations.] - NGDC and SWPC (NOAA)", "METOP2_POES-SEM2_FLUXES-2SEC": "POES-SEM2 2-second Particle Precipitation Data, MetOp-A (MetOp-2 before Oct2006 launch) [Important: these data have known contamination problems: please consult Rob Redmon (sem.poes@noaa.gov) for usage recommendations.] - NGDC and SWPC (NOAA)", "MMS1_ASPOC_SRVY_L2": "Level 2 Active Spacecraft Potential Control Survey Data - K. Torkar, R. Nakamura (IWF)", "MMS1_DSP_FAST_L2_BPSD": "SCM Low frequency Magnetic spectral density from the FIELDS Digital Signal Processor - J. Burch, R. Ergun, O. Le Contel (SWRI, LASP, LPP)", "MMS1_DSP_FAST_L2_EPSD": "Low and medium frequency Electric Field spectral density from the FIELDS Digital Signal Processor - J. Burch, R. Ergun (SWRI, LASP)", "MMS1_DSP_SLOW_L2_BPSD": "search coil magnetometer spectral density - J. Burch, R. Ergun, O. Le Contel (SWRI, LASP, LPP)", "MMS1_DSP_SLOW_L2_EPSD": "electric spectral density - J. Burch, R. Ergun (SWRI, LASP)", "MMS1_EDI_BRST_L2_AMB": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS1_EDI_BRST_L2_AMB-PM2": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS1_EDI_BRST_L2_EFIELD": "Level 2 EDI electric field - Hans Vaith (UNH)", "MMS1_EDI_BRST_L2_Q0": "Level 2 EDI Quality 0 Counts - Roy Torbert, Hans Vaith (UNH)", "MMS1_EDI_SRVY_L2_AMB": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS1_EDI_SRVY_L2_AMB-PM2": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS1_EDI_SRVY_L2_EFIELD": "Level 2 EDI electric field - Hans Vaith (UNH)", "MMS1_EDI_SRVY_L2_Q0": "Level 2 EDI Quality 0 Counts - Roy Torbert, Hans Vaith (UNH)", "MMS1_EDP_BRST_L2_DCE": "MMS1 L2 (Burst Mode), 3D Electric field - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS1_EDP_BRST_L2_HMFE": "MMS1 L2 (brst), 3D HMFE Electric field - Burch, J, Ergun, R., Lindqvist, P. (SwRI, LASP, KTH)", "MMS1_EDP_BRST_L2_SCPOT": "MMS 1 dual probe scpot (brst), Spacecraft potential - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS1_EDP_FAST_L2_DCE": "MMS1 L2 (fast mode), 3D Electric field - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS1_EDP_FAST_L2_SCPOT": "MMS 1 dual probe scpot (fast), Spacecraft potential - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS1_EDP_SLOW_L2_DCE": "MMS1 L2 (slow mode), 3D Electric field - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS1_EDP_SLOW_L2_SCPOT": "MMS 1 dual probe scpot (slow), Spacecraft potential - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS1_EDP_SRVY_L2_HFESP": "MMS1 L2 (srvy), HF ACE Spectra - Burch, J, Ergun, R., Lindqvist, P. (SwRI, LASP, KTH)", "MMS1_EPD-EIS_BRST_L2_EXTOF": "Level 2 Energetic Ion Spectrometer EnergyxTOF Brst - B. Mauk (JHU/APL)", "MMS1_EPD-EIS_BRST_L2_PHXTOF": "Level 2 Energetic Ion Spectrometer PulseHeightxTOF Burst - B. Mauk (JHU/APL)", "MMS1_EPD-EIS_SRVY_L2_ELECTRONENERGY": "Level 2 Energetic Ion Spectrometer Electron Spectra Srvy - B. Mauk (JHU/APL)", "MMS1_EPD-EIS_SRVY_L2_EXTOF": "Level 2 Energetic Ion Spectrometer EnergyxTOF Srvy - B. Mauk (JHU/APL)", "MMS1_EPD-EIS_SRVY_L2_PHXTOF": "Level 2 Energetic Ion Spectrometer PulseHeightxTOF Srvy - B. Mauk (JHU/APL)", "MMS1_FEEPS_BRST_L2_ELECTRON": "Level 2 Flys Eye Energetic Particle Sensor Burst Data - STP (LASP)", "MMS1_FEEPS_BRST_L2_ION": "Level 2 Flys Eye Energetic Particle Sensor Burst Data - STP (LASP)", "MMS1_FEEPS_SRVY_L2_ELECTRON": "Level 2 Flys Eye Energetic Particle Sensor Survey Data - STP (LASP)", "MMS1_FEEPS_SRVY_L2_ION": "Level 2 Flys Eye Energetic Particle Sensor Survey Data - STP (LASP)", "MMS1_FGM_BRST_L2": "Level2 Flux Gate Magnetometer Burst DC Magnetic Field for MMS Satellite Number 1 - J. Burch, C. Russell, W. Magnus (SWRI, UCLA, IWF)", "MMS1_FGM_SRVY_L2": "Level2 Flux Gate Magnetometer Combined Fast/Slow Survey DC Magnetic Field for MMS Satellite Number 1 - J. Burch, C. Russell, W. Magnus (SWRI, UCLA, IWF)", "MMS1_FPI_BRST_L2_DES-DIST": "MMS Satellite Number 1 Dual Electron Spectrometer Burst-resolution instrument distributions - J. Burch, C. Pollock (SwRI, NASA/GSFC)", "MMS1_FPI_BRST_L2_DES-MOMS": "MMS Satellite Number 1 Dual Electron Spectrometer Burst-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS1_FPI_BRST_L2_DES-PARTMOMS": "MMS Satellite Number 1 Dual Electron Spectrometer Burst-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS1_FPI_BRST_L2_DIS-DIST": "MMS Satellite Number 1 Dual Ion Spectrometer Burst-resolution instrument distributions - J. Burch, C. Pollock (SwRI, NASA/GSFC)", "MMS1_FPI_BRST_L2_DIS-MOMS": "MMS Satellite Number 1 Dual Ion Spectrometer Burst-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS1_FPI_BRST_L2_DIS-PARTMOMS": "MMS Satellite Number 1 Dual Ion Spectrometer Burst-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS1_FPI_FAST_L2_DES-DIST": "MMS Satellite Number 1 Dual Electron Spectrometer Fast Survey-resolution instrument distributions - J. Burch; C. Pollock and B. Giles (SwRI; NASA/GSFC)", "MMS1_FPI_FAST_L2_DES-MOMS": "MMS Satellite Number 1 Dual Electron Spectrometer Survey-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS1_FPI_FAST_L2_DES-PARTMOMS": "MMS Satellite Number 1 Dual Electron Spectrometer FastSurvey-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS1_FPI_FAST_L2_DIS-DIST": "MMS Satellite Number 1 Dual Ion Spectrometer Fast Survey-resolution instrument distributions - J. Burch; C. Pollock and B. Giles (SwRI; NASA/GSFC)", "MMS1_FPI_FAST_L2_DIS-MOMS": "MMS Satellite Number 1 Dual Ion Spectrometer Survey-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS1_FPI_FAST_L2_DIS-PARTMOMS": "MMS Satellite Number 1 Dual Ion Spectrometer FastSurvey-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS1_HPCA_BRST_L2_ION": "Level 2> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS1_HPCA_BRST_L2_MOMENTS": "Level 2 Moments> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS1_HPCA_SRVY_L2_ION": "Level 2> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS1_HPCA_SRVY_L2_MOMENTS": "Level 2 Moments> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS1_HPCA_SRVY_L2_TOF-COUNTS": "MMS Level L2> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS1_MEC_BRST_L2_EPHT89D": "Magnetic ephemeris and support data for MMS satellite number 1 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS1_MEC_BRST_L2_EPHT89Q": "Magnetic ephemeris and support data for MMS satellite number 1 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS1_MEC_BRST_L2_EPHTS04D": "Magnetic ephemeris and support data for MMS satellite number 1 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS1_MEC_SRVY_L2_EPHT89D": "Magnetic ephemeris and support data for MMS satellite number 1 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS1_MEC_SRVY_L2_EPHT89Q": "Magnetic ephemeris and support data for MMS satellite number 1 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS1_MEC_SRVY_L2_EPHTS04D": "Magnetic ephemeris and support data for MMS satellite number 1 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS1_SCM_BRST_L2_SCB": "Level 2 Search Coil Magnetometer AC Magnetic Field Burst (8192S/s) Data - J. Burch, O. Le Contel (SWRI, LPP)", "MMS1_SCM_BRST_L2_SCHB": "Level 2 Search Coil Magnetometer AC Magnetic Field High Burst (16384S/s) Data - J. Burch, O. Le Contel (SWRI, LPP)", "MMS1_SCM_SRVY_L2_SCSRVY": "Level 2 Search Coil Magnetometer AC Magnetic Field Survey (32S/s) Data - J. Burch, O. Le Contel (SWRI, LPP)", "MMS2_ASPOC_SRVY_L2": "Level 2 Active Spacecraft Potential Control Survey Data - K. Torkar, R. Nakamura (IWF)", "MMS2_DSP_FAST_L2_BPSD": "SCM Low frequency Magnetic spectral density from the FIELDS Digital Signal Processor - J. Burch, R. Ergun, O. Le Contel (SWRI, LASP, LPP)", "MMS2_DSP_FAST_L2_EPSD": "Low and medium frequency Electric Field spectral density from the FIELDS Digital Signal Processor - J. Burch, R. Ergun (SWRI, LASP)", "MMS2_DSP_SLOW_L2_BPSD": "search coil magnetometer spectral density - J. Burch, R. Ergun, O. Le Contel (SWRI, LASP, LPP)", "MMS2_DSP_SLOW_L2_EPSD": "electric spectral density - J. Burch, R. Ergun (SWRI, LASP)", "MMS2_EDI_BRST_L2_AMB": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS2_EDI_BRST_L2_AMB-PM2": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS2_EDI_BRST_L2_EFIELD": "Level 2 EDI electric field - Hans Vaith (UNH)", "MMS2_EDI_BRST_L2_Q0": "Level 2 EDI Quality 0 Counts - Roy Torbert, Hans Vaith (UNH)", "MMS2_EDI_SRVY_L2_AMB": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS2_EDI_SRVY_L2_AMB-PM2": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS2_EDI_SRVY_L2_EFIELD": "Level 2 EDI electric field - Hans Vaith (UNH)", "MMS2_EDI_SRVY_L2_Q0": "Level 2 EDI Quality 0 Counts - Roy Torbert, Hans Vaith (UNH)", "MMS2_EDP_BRST_L2_DCE": "MMS2 L2 (Burst Mode), 3D Electric field - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS2_EDP_BRST_L2_HMFE": "MMS2 L2 (brst), 3D HMFE Electric field - Burch, J, Ergun, R., Lindqvist, P. (SwRI, LASP, KTH)", "MMS2_EDP_BRST_L2_SCPOT": "MMS 2 dual probe scpot (brst), Spacecraft potential - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS2_EDP_FAST_L2_DCE": "MMS2 L2 (fast mode), 3D Electric field - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS2_EDP_FAST_L2_SCPOT": "MMS 2 dual probe scpot (fast), Spacecraft potential - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS2_EDP_SLOW_L2_DCE": "MMS2 L2 (slow mode), 3D Electric field - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS2_EDP_SLOW_L2_SCPOT": "MMS 2 dual probe scpot (slow), Spacecraft potential - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS2_EDP_SRVY_L2_HFESP": "MMS2 L2 (srvy), HF ACE Spectra - Burch, J, Ergun, R., Lindqvist, P. (SwRI, LASP, KTH)", "MMS2_EPD-EIS_BRST_L2_EXTOF": "Level 2 Energetic Ion Spectrometer EnergyxTOF Brst - B. Mauk (JHU/APL)", "MMS2_EPD-EIS_BRST_L2_PHXTOF": "Level 2 Energetic Ion Spectrometer PulseHeightxTOF Burst - B. Mauk (JHU/APL)", "MMS2_EPD-EIS_SRVY_L2_ELECTRONENERGY": "Level 2 Energetic Ion Spectrometer Electron Spectra Srvy - B. Mauk (JHU/APL)", "MMS2_EPD-EIS_SRVY_L2_EXTOF": "Level 2 Energetic Ion Spectrometer EnergyxTOF Srvy - B. Mauk (JHU/APL)", "MMS2_EPD-EIS_SRVY_L2_PHXTOF": "Level 2 Energetic Ion Spectrometer PulseHeightxTOF Srvy - B. Mauk (JHU/APL)", "MMS2_FEEPS_BRST_L2_ELECTRON": "Level 2 Flys Eye Energetic Particle Sensor Burst Data - STP (LASP)", "MMS2_FEEPS_BRST_L2_ION": "Level 2 Flys Eye Energetic Particle Sensor Burst Data - STP (LASP)", "MMS2_FEEPS_SRVY_L2_ELECTRON": "Level 2 Flys Eye Energetic Particle Sensor Survey Data - STP (LASP)", "MMS2_FEEPS_SRVY_L2_ION": "Level 2 Flys Eye Energetic Particle Sensor Survey Data - STP (LASP)", "MMS2_FGM_BRST_L2": "Level2 Flux Gate Magnetometer Burst DC Magnetic Field for MMS Satellite Number 2 - J. Burch, C. Russell, W. Magnus (SWRI, UCLA, IWF)", "MMS2_FGM_SRVY_L2": "Level2 Flux Gate Magnetometer Combined Fast/Slow Survey DC Magnetic Field for MMS Satellite Number 2 - J. Burch, C. Russell, W. Magnus (SWRI, UCLA, IWF)", "MMS2_FPI_BRST_L2_DES-DIST": "MMS Satellite Number 2 Dual Electron Spectrometer Burst-resolution instrument distributions - J. Burch, C. Pollock (SwRI, NASA/GSFC)", "MMS2_FPI_BRST_L2_DES-MOMS": "MMS Satellite Number 2 Dual Electron Spectrometer Burst-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS2_FPI_BRST_L2_DES-PARTMOMS": "MMS Satellite Number 2 Dual Electron Spectrometer Burst-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS2_FPI_BRST_L2_DIS-DIST": "MMS Satellite Number 2 Dual Ion Spectrometer Burst-resolution instrument distributions - J. Burch, C. Pollock (SwRI, NASA/GSFC)", "MMS2_FPI_BRST_L2_DIS-MOMS": "MMS Satellite Number 2 Dual Ion Spectrometer Burst-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS2_FPI_BRST_L2_DIS-PARTMOMS": "MMS Satellite Number 2 Dual Ion Spectrometer Burst-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS2_FPI_FAST_L2_DES-DIST": "MMS Satellite Number 2 Dual Electron Spectrometer Fast Survey-resolution instrument distributions - J. Burch; C. Pollock and B. Giles (SwRI; NASA/GSFC)", "MMS2_FPI_FAST_L2_DES-MOMS": "MMS Satellite Number 2 Dual Electron Spectrometer Survey-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS2_FPI_FAST_L2_DES-PARTMOMS": "MMS Satellite Number 2 Dual Electron Spectrometer FastSurvey-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS2_FPI_FAST_L2_DIS-DIST": "MMS Satellite Number 2 Dual Ion Spectrometer Fast Survey-resolution instrument distributions - J. Burch; C. Pollock and B. Giles (SwRI; NASA/GSFC)", "MMS2_FPI_FAST_L2_DIS-MOMS": "MMS Satellite Number 2 Dual Ion Spectrometer Survey-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS2_FPI_FAST_L2_DIS-PARTMOMS": "MMS Satellite Number 2 Dual Ion Spectrometer FastSurvey-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS2_HPCA_BRST_L2_ION": "Level 2> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS2_HPCA_BRST_L2_MOMENTS": "Level 2 Moments> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS2_HPCA_SRVY_L2_ION": "Level 2> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS2_HPCA_SRVY_L2_MOMENTS": "Level 2 Moments> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS2_HPCA_SRVY_L2_TOF-COUNTS": "MMS Level L2> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS2_MEC_BRST_L2_EPHT89D": "Magnetic ephemeris and support data for MMS satellite number 2 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS2_MEC_BRST_L2_EPHT89Q": "Magnetic ephemeris and support data for MMS satellite number 2 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS2_MEC_BRST_L2_EPHTS04D": "Magnetic ephemeris and support data for MMS satellite number 2 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS2_MEC_SRVY_L2_EPHT89D": "Magnetic ephemeris and support data for MMS satellite number 2 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS2_MEC_SRVY_L2_EPHT89Q": "Magnetic ephemeris and support data for MMS satellite number 2 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS2_MEC_SRVY_L2_EPHTS04D": "Magnetic ephemeris and support data for MMS satellite number 2 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS2_SCM_BRST_L2_SCB": "Level 2 Search Coil Magnetometer AC Magnetic Field Burst (8192S/s) Data - J. Burch, O. Le Contel (SWRI, LPP)", "MMS2_SCM_BRST_L2_SCHB": "Level 2 Search Coil Magnetometer AC Magnetic Field High Burst (16384S/s) Data - J. Burch, O. Le Contel (SWRI, LPP)", "MMS2_SCM_SRVY_L2_SCSRVY": "Level 2 Search Coil Magnetometer AC Magnetic Field Survey (32S/s) Data - J. Burch, O. Le Contel (SWRI, LPP)", "MMS3_ASPOC_SRVY_L2": "Level 2 Active Spacecraft Potential Control Survey Data - K. Torkar, R. Nakamura (IWF)", "MMS3_DSP_FAST_L2_BPSD": "SCM Low frequency Magnetic spectral density from the FIELDS Digital Signal Processor - J. Burch, R. Ergun, O. Le Contel (SWRI, LASP, LPP)", "MMS3_DSP_FAST_L2_EPSD": "Low and medium frequency Electric Field spectral density from the FIELDS Digital Signal Processor - J. Burch, R. Ergun (SWRI, LASP)", "MMS3_DSP_SLOW_L2_BPSD": "search coil magnetometer spectral density - J. Burch, R. Ergun, O. Le Contel (SWRI, LASP, LPP)", "MMS3_DSP_SLOW_L2_EPSD": "electric spectral density - J. Burch, R. Ergun (SWRI, LASP)", "MMS3_EDI_BRST_L2_AMB": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS3_EDI_BRST_L2_AMB-PM2": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS3_EDI_BRST_L2_EFIELD": "Level 2 EDI electric field - Hans Vaith (UNH)", "MMS3_EDI_BRST_L2_Q0": "Level 2 EDI Quality 0 Counts - Roy Torbert, Hans Vaith (UNH)", "MMS3_EDI_SRVY_L2_AMB": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS3_EDI_SRVY_L2_AMB-PM2": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS3_EDI_SRVY_L2_EFIELD": "Level 2 EDI electric field - Hans Vaith (UNH)", "MMS3_EDI_SRVY_L2_Q0": "Level 2 EDI Quality 0 Counts - Roy Torbert, Hans Vaith (UNH)", "MMS3_EDP_BRST_L2_DCE": "MMS3 L2 (Burst Mode), 3D Electric field - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS3_EDP_BRST_L2_HMFE": "MMS3 L2 (brst), 3D HMFE Electric field - Burch, J, Ergun, R., Lindqvist, P. (SwRI, LASP, KTH)", "MMS3_EDP_BRST_L2_SCPOT": "MMS 3 dual probe scpot (brst), Spacecraft potential - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS3_EDP_FAST_L2_DCE": "MMS3 L2 (fast mode), 3D Electric field - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS3_EDP_FAST_L2_SCPOT": "MMS 3 dual probe scpot (fast), Spacecraft potential - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS3_EDP_SLOW_L2_DCE": "MMS3 L2 (slow mode), 3D Electric field - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS3_EDP_SLOW_L2_SCPOT": "MMS 3 dual probe scpot (slow), Spacecraft potential - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS3_EDP_SRVY_L2_HFESP": "MMS3 L2 (srvy), HF ACE Spectra - Burch, J, Ergun, R., Lindqvist, P. (SwRI, LASP, KTH)", "MMS3_EPD-EIS_BRST_L2_EXTOF": "Level 2 Energetic Ion Spectrometer EnergyxTOF Brst - B. Mauk (JHU/APL)", "MMS3_EPD-EIS_BRST_L2_PHXTOF": "Level 2 Energetic Ion Spectrometer PulseHeightxTOF Burst - B. Mauk (JHU/APL)", "MMS3_EPD-EIS_SRVY_L2_ELECTRONENERGY": "Level 2 Energetic Ion Spectrometer Electron Spectra Srvy - B. Mauk (JHU/APL)", "MMS3_EPD-EIS_SRVY_L2_EXTOF": "Level 2 Energetic Ion Spectrometer EnergyxTOF Srvy - B. Mauk (JHU/APL)", "MMS3_EPD-EIS_SRVY_L2_PHXTOF": "Level 2 Energetic Ion Spectrometer PulseHeightxTOF Srvy - B. Mauk (JHU/APL)", "MMS3_FEEPS_BRST_L2_ELECTRON": "Level 2 Flys Eye Energetic Particle Sensor Burst Data - STP (LASP)", "MMS3_FEEPS_BRST_L2_ION": "Level 2 Flys Eye Energetic Particle Sensor Burst Data - STP (LASP)", "MMS3_FEEPS_SRVY_L2_ELECTRON": "Level 2 Flys Eye Energetic Particle Sensor Survey Data - STP (LASP)", "MMS3_FEEPS_SRVY_L2_ION": "Level 2 Flys Eye Energetic Particle Sensor Survey Data - STP (LASP)", "MMS3_FGM_BRST_L2": "Level2 Flux Gate Magnetometer Burst DC Magnetic Field for MMS Satellite Number 3 - J. Burch, C. Russell, W. Magnus (SWRI, UCLA, IWF)", "MMS3_FGM_SRVY_L2": "Level2 Flux Gate Magnetometer Combined Fast/Slow Survey DC Magnetic Field for MMS Satellite Number 3 - J. Burch, C. Russell, W. Magnus (SWRI, UCLA, IWF)", "MMS3_FPI_BRST_L2_DES-DIST": "MMS Satellite Number 3 Dual Electron Spectrometer Burst-resolution instrument distributions - J. Burch, C. Pollock (SwRI, NASA/GSFC)", "MMS3_FPI_BRST_L2_DES-MOMS": "MMS Satellite Number 3 Dual Electron Spectrometer Burst-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS3_FPI_BRST_L2_DES-PARTMOMS": "MMS Satellite Number 3 Dual Electron Spectrometer Burst-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS3_FPI_BRST_L2_DIS-DIST": "MMS Satellite Number 3 Dual Ion Spectrometer Burst-resolution instrument distributions - J. Burch, C. Pollock (SwRI, NASA/GSFC)", "MMS3_FPI_BRST_L2_DIS-MOMS": "MMS Satellite Number 3 Dual Ion Spectrometer Burst-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS3_FPI_BRST_L2_DIS-PARTMOMS": "MMS Satellite Number 3 Dual Ion Spectrometer Burst-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS3_FPI_FAST_L2_DES-DIST": "MMS Satellite Number 3 Dual Electron Spectrometer Fast Survey-resolution instrument distributions - J. Burch; C. Pollock and B. Giles (SwRI; NASA/GSFC)", "MMS3_FPI_FAST_L2_DES-MOMS": "MMS Satellite Number 3 Dual Electron Spectrometer Survey-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS3_FPI_FAST_L2_DES-PARTMOMS": "MMS Satellite Number 3 Dual Electron Spectrometer FastSurvey-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS3_FPI_FAST_L2_DIS-DIST": "MMS Satellite Number 3 Dual Ion Spectrometer Fast Survey-resolution instrument distributions - J. Burch; C. Pollock and B. Giles (SwRI; NASA/GSFC)", "MMS3_FPI_FAST_L2_DIS-MOMS": "MMS Satellite Number 3 Dual Ion Spectrometer Survey-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS3_FPI_FAST_L2_DIS-PARTMOMS": "MMS Satellite Number 3 Dual Ion Spectrometer FastSurvey-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS3_HPCA_BRST_L2_ION": "Level 2> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS3_HPCA_BRST_L2_MOMENTS": "Level 2 Moments> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS3_HPCA_SRVY_L2_ION": "Level 2> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS3_HPCA_SRVY_L2_MOMENTS": "Level 2 Moments> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS3_HPCA_SRVY_L2_TOF-COUNTS": "MMS Level L2> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS3_MEC_BRST_L2_EPHT89D": "Magnetic ephemeris and support data for MMS satellite number 3 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS3_MEC_BRST_L2_EPHT89Q": "Magnetic ephemeris and support data for MMS satellite number 3 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS3_MEC_BRST_L2_EPHTS04D": "Magnetic ephemeris and support data for MMS satellite number 3 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS3_MEC_SRVY_L2_EPHT89D": "Magnetic ephemeris and support data for MMS satellite number 3 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS3_MEC_SRVY_L2_EPHT89Q": "Magnetic ephemeris and support data for MMS satellite number 3 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS3_MEC_SRVY_L2_EPHTS04D": "Magnetic ephemeris and support data for MMS satellite number 3 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS3_SCM_BRST_L2_SCB": "Level 2 Search Coil Magnetometer AC Magnetic Field Burst (8192S/s) Data - J. Burch, O. Le Contel (SWRI, LPP)", "MMS3_SCM_BRST_L2_SCHB": "Level 2 Search Coil Magnetometer AC Magnetic Field High Burst (16384S/s) Data - J. Burch, O. Le Contel (SWRI, LPP)", "MMS3_SCM_SRVY_L2_SCSRVY": "Level 2 Search Coil Magnetometer AC Magnetic Field Survey (32S/s) Data - J. Burch, O. Le Contel (SWRI, LPP)", "MMS4_ASPOC_SRVY_L2": "Level 2 Active Spacecraft Potential Control Survey Data - K. Torkar, R. Nakamura (IWF)", "MMS4_DSP_FAST_L2_BPSD": "SCM Low frequency Magnetic spectral density from the FIELDS Digital Signal Processor - J. Burch, R. Ergun, O. Le Contel (SWRI, LASP, LPP)", "MMS4_DSP_FAST_L2_EPSD": "Low and medium frequency Electric Field spectral density from the FIELDS Digital Signal Processor - J. Burch, R. Ergun (SWRI, LASP)", "MMS4_DSP_SLOW_L2_BPSD": "search coil magnetometer spectral density - J. Burch, R. Ergun, O. Le Contel (SWRI, LASP, LPP)", "MMS4_DSP_SLOW_L2_EPSD": "electric spectral density - J. Burch, R. Ergun (SWRI, LASP)", "MMS4_EDI_BRST_L2_AMB": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS4_EDI_BRST_L2_AMB-PM2": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS4_EDI_BRST_L2_EFIELD": "Level 2 EDI electric field - Hans Vaith (UNH)", "MMS4_EDI_BRST_L2_Q0": "Level 2 EDI Quality 0 Counts - Roy Torbert, Hans Vaith (UNH)", "MMS4_EDI_SRVY_L2_AMB": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS4_EDI_SRVY_L2_AMB-PM2": "Level 2 EDI Ambient electron flux - Roy Torbert, Hans Vaith (UNH)", "MMS4_EDI_SRVY_L2_EFIELD": "Level 2 EDI electric field - Hans Vaith (UNH)", "MMS4_EDI_SRVY_L2_Q0": "Level 2 EDI Quality 0 Counts - Roy Torbert, Hans Vaith (UNH)", "MMS4_EDP_BRST_L2_DCE": "MMS4 L2 (Burst Mode), 3D Electric field - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS4_EDP_BRST_L2_HMFE": "MMS4 L2 (brst), 3D HMFE Electric field - Burch, J, Ergun, R., Lindqvist, P. (SwRI, LASP, KTH)", "MMS4_EDP_BRST_L2_SCPOT": "MMS 4 dual probe scpot (brst), Spacecraft potential - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS4_EDP_FAST_L2_DCE": "MMS4 L2 (fast mode), 3D Electric field - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS4_EDP_FAST_L2_SCPOT": "MMS 4 dual probe scpot (fast), Spacecraft potential - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS4_EDP_SLOW_L2_DCE": "MMS4 L2 (slow mode), 3D Electric field - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS4_EDP_SLOW_L2_SCPOT": "MMS 4 dual probe scpot (slow), Spacecraft potential - J.Burch, R.Ergun, P.Lindqvist. (SWRI, LASP, KTH)", "MMS4_EDP_SRVY_L2_HFESP": "MMS4 L2 (srvy), HF ACE Spectra - Burch, J, Ergun, R., Lindqvist, P. (SwRI, LASP, KTH)", "MMS4_EPD-EIS_BRST_L2_EXTOF": "Level 2 Energetic Ion Spectrometer EnergyxTOF Brst - B. Mauk (JHU/APL)", "MMS4_EPD-EIS_BRST_L2_PHXTOF": "Level 2 Energetic Ion Spectrometer PulseHeightxTOF Burst - B. Mauk (JHU/APL)", "MMS4_EPD-EIS_SRVY_L2_ELECTRONENERGY": "Level 2 Energetic Ion Spectrometer Electron Spectra Srvy - B. Mauk (JHU/APL)", "MMS4_EPD-EIS_SRVY_L2_EXTOF": "Level 2 Energetic Ion Spectrometer EnergyxTOF Srvy - B. Mauk (JHU/APL)", "MMS4_EPD-EIS_SRVY_L2_PHXTOF": "Level 2 Energetic Ion Spectrometer PulseHeightxTOF Srvy - B. Mauk (JHU/APL)", "MMS4_FEEPS_BRST_L2_ELECTRON": "Level 2 Flys Eye Energetic Particle Sensor Burst Data - STP (LASP)", "MMS4_FEEPS_BRST_L2_ION": "Level 2 Flys Eye Energetic Particle Sensor Burst Data - STP (LASP)", "MMS4_FEEPS_SRVY_L2_ELECTRON": "Level 2 Flys Eye Energetic Particle Sensor Survey Data - STP (LASP)", "MMS4_FEEPS_SRVY_L2_ION": "Level 2 Flys Eye Energetic Particle Sensor Survey Data - STP (LASP)", "MMS4_FGM_BRST_L2": "Level2 Flux Gate Magnetometer Burst DC Magnetic Field for MMS Satellite Number 4 - J. Burch, C. Russell, W. Magnus (SWRI, UCLA, IWF)", "MMS4_FGM_SRVY_L2": "Level2 Flux Gate Magnetometer Combined Fast/Slow Survey DC Magnetic Field for MMS Satellite Number 4 - J. Burch, C. Russell, W. Magnus (SWRI, UCLA, IWF)", "MMS4_FPI_BRST_L2_DES-DIST": "MMS Satellite Number 4 Dual Electron Spectrometer Burst-resolution instrument distributions - J. Burch, C. Pollock (SwRI, NASA/GSFC)", "MMS4_FPI_BRST_L2_DES-MOMS": "MMS Satellite Number 4 Dual Electron Spectrometer Burst-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS4_FPI_BRST_L2_DES-PARTMOMS": "MMS Satellite Number 4 Dual Electron Spectrometer Burst-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS4_FPI_BRST_L2_DIS-DIST": "MMS Satellite Number 4 Dual Ion Spectrometer Burst-resolution instrument distributions - J. Burch, C. Pollock (SwRI, NASA/GSFC)", "MMS4_FPI_BRST_L2_DIS-MOMS": "MMS Satellite Number 4 Dual Ion Spectrometer Burst-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS4_FPI_BRST_L2_DIS-PARTMOMS": "MMS Satellite Number 4 Dual Ion Spectrometer Burst-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS4_FPI_FAST_L2_DES-DIST": "MMS Satellite Number 4 Dual Electron Spectrometer Fast Survey-resolution instrument distributions - J. Burch; C. Pollock and B. Giles (SwRI; NASA/GSFC)", "MMS4_FPI_FAST_L2_DES-MOMS": "MMS Satellite Number 4 Dual Electron Spectrometer Survey-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS4_FPI_FAST_L2_DES-PARTMOMS": "MMS Satellite Number 4 Dual Electron Spectrometer FastSurvey-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS4_FPI_FAST_L2_DIS-DIST": "MMS Satellite Number 4 Dual Ion Spectrometer Fast Survey-resolution instrument distributions - J. Burch; C. Pollock and B. Giles (SwRI; NASA/GSFC)", "MMS4_FPI_FAST_L2_DIS-MOMS": "MMS Satellite Number 4 Dual Ion Spectrometer Survey-resolution distribution moments - J.Burch; C.Pollock, B.Giles (SwRI, NASA/GSFC)", "MMS4_FPI_FAST_L2_DIS-PARTMOMS": "MMS Satellite Number 4 Dual Ion Spectrometer FastSurvey-resolution partial moments - J. Burch, B. Giles (SwRI, GSFC)", "MMS4_HPCA_BRST_L2_ION": "Level 2> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS4_HPCA_BRST_L2_MOMENTS": "Level 2 Moments> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS4_HPCA_SRVY_L2_ION": "Level 2> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS4_HPCA_SRVY_L2_MOMENTS": "Level 2 Moments> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS4_HPCA_SRVY_L2_TOF-COUNTS": "MMS Level L2> Hot Plasma Composition Analyzer - J. Burch, S. Fuselier (SWRI)", "MMS4_MEC_BRST_L2_EPHT89D": "Magnetic ephemeris and support data for MMS satellite number 4 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS4_MEC_BRST_L2_EPHT89Q": "Magnetic ephemeris and support data for MMS satellite number 4 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS4_MEC_BRST_L2_EPHTS04D": "Magnetic ephemeris and support data for MMS satellite number 4 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS4_MEC_SRVY_L2_EPHT89D": "Magnetic ephemeris and support data for MMS satellite number 4 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS4_MEC_SRVY_L2_EPHT89Q": "Magnetic ephemeris and support data for MMS satellite number 4 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS4_MEC_SRVY_L2_EPHTS04D": "Magnetic ephemeris and support data for MMS satellite number 4 - M. G. Henderson, S. K. Morley (Los Alamos National Laboratory (LANL))", "MMS4_SCM_BRST_L2_SCB": "Level 2 Search Coil Magnetometer AC Magnetic Field Burst (8192S/s) Data - J. Burch, O. Le Contel (SWRI, LPP)", "MMS4_SCM_BRST_L2_SCHB": "Level 2 Search Coil Magnetometer AC Magnetic Field High Burst (16384S/s) Data - J. Burch, O. Le Contel (SWRI, LPP)", "MMS4_SCM_SRVY_L2_SCSRVY": "Level 2 Search Coil Magnetometer AC Magnetic Field Survey (32S/s) Data - J. Burch, O. Le Contel (SWRI, LPP)", "MSL_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "MUNIN_M1_MDSE": "Electron Fluxes 6eV to 20 keV, from the MEDUSA instrument on the Munin nanosat - David Winningham (Southwest Research Institute)", "MUNIN_M1_MDSI": "Ion Fluxes 1eV to 12 keV, from the MEDUSA instrument on the MUNIN nanosat - David Winningham (Southwest Research Institute)", "MUNIN_M1_OA": "Munin: Orbit and Attitude Data - Rymd Plasma Gruppen (Swedish Institute of Space Physics)", "MVN_INSITU_KP-4SEC": "MAVEN In-situ Key Parameters - B.M. Jakosky (LASP/U. Colorado)", "MVN_MAG_L2-SUNSTATE-1SEC": "MAVEN mag sunstate - J. Connerney (NASA GSFC)", "NEPTUNE_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "NEW_HORIZONS_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "NEW_HORIZONS_SWAP_PICKUP-IONS": "Data from New Horizons SWAP instrument - David J. McComas (Princeton)", "NEW_HORIZONS_SWAP_PICKUP-IONS-HISTOGRAM": "Data from New Horizons SWAP instrument - David J. McComas (Princeton)", "NEW_HORIZONS_SWAP_VALIDSUM": "Validated Summary (VS) data from New Horizons SWAP instrument - David J. McComas (Princeton)", "NOAA05_MEPED1MIN_SEM": "1 minute re-processed particle count rates, fluxes, and model fields, SEM-1 MEPED, NOAA-05/TIROS-N - Shing F. Fung (SPDF, GSFC/NASA)", "NOAA06_MEPED1MIN_SEM": "1 minute re-processed particle count rates, fluxes, and model fields, SEM-1 MEPED, NOAA-06 - Shing F. Fung (SPDF, GSFC/NASA)", "NOAA07_MEPED1MIN_SEM": "1 minute re-processed particle count rates, fluxes, and model fields, SEM-1 MEPED, NOAA-07 - Shing F. Fung (SPDF, GSFC/NASA)", "NOAA08_MEPED1MIN_SEM": "1 minute re-processed particle count rates, fluxes, and model fields, SEM-1 MEPED, NOAA-08 - Shing F. Fung (SPDF, GSFC/NASA)", "NOAA10_MEPED1MIN_SEM": "1 minute re-processed particle count rates, fluxes, and model fields, SEM-1 MEPED, NOAA-10 - Shing F. Fung (SPDF, GSFC/NASA)", "NOAA12_MEPED1MIN_SEM": "1 minute re-processed particle count rates, fluxes, and model fields, SEM-1 MEPED, NOAA-12 - Shing F. Fung (SPDF, GSFC/NASA)", "NOAA14_MEPED1MIN_SEM": "1 minute re-processed particle count rates, fluxes, and model fields, SEM-1 MEPED, NOAA-14 - Shing F. Fung (SPDF, GSFC/NASA)", "NOAA15_POES-SEM2_FLUXES-2SEC": "NOAA15 POES-SEM2 2-second Particle Precipitation Data [Important: these data have known contamination problems: please consult Rob Redmon (sem.poes@noaa.gov) for usage recommendations.] - NGDC and SWPC (NOAA)", "NOAA16_POES-SEM2_FLUXES-2SEC": "NOAA16 POES-SEM2 2-second Particle Precipitation Data [Important: these data have known contamination problems: please consult Rob Redmon (sem.poes@noaa.gov) for usage recommendations.] - NGDC and SWPC (NOAA)", "NOAA18_POES-SEM2_FLUXES-2SEC": "NOAA18 POES-SEM2 2-second Particle Precipitation Data [Important: these data have known contamination problems: please consult Rob Redmon (sem.poes@noaa.gov) for usage recommendations.] - NGDC and SWPC (NOAA)", "NOAA19_POES-SEM2_FLUXES-2SEC": "NOAA19 POES-SEM2 2-second Particle Precipitation Data [Important: these data have known contamination problems: please consult Rob Redmon (sem.poes@noaa.gov) for usage recommendations.] - NGDC and SWPC (NOAA)", "OMNI2_H0_MRG1HR": "OMNI Combined, Definitive, Hourly IMF and Plasma Data, and Energetic Proton Fluxes, Time-Shifted to the Nose of the Earth's Bow Shock, plus Solar and Magnetic Indices - J.H. King, N. Papitashvili (ADNET, NASA GSFC)", "OMNI_COHO1HR_MERGED_MAG_PLASMA": "OMNI Combined merged hourly magnetic field, plasma and ephermis data - J.H. King, N. Papatashvilli (AdnetSystems, NASA GSFC)", "OMNI_HRO2_1MIN": "OMNI Combined, Definitive 1-minute IMF and Definitive Plasma Data Time-Shifted to the Nose of the Earth's Bow Shock, plus Magnetic Indices - J.H. King, N. Papatashvilli (AdnetSystems, NASA GSFC)", "OMNI_HRO2_5MIN": "OMNI Combined, Definitive 5-minute IMF and Definitive Plasma, and Energetic Proton Fluxes, Time-Shifted to the Nose of the Earth's Bow Shock, plus Magnetic Indices - J.H. King, N. Papatashvilli (AdnetSystems, NASA GSFC)", "OMNI_HRO_1MIN": "OMNI Combined, Definitive, 1-minute IMF and Plasma Data Time-Shifted to the Nose of the Earth's Bow Shock, plus Magnetic Indices - J.H. King, N. Papatashvilli (AdnetSystems, NASA GSFC)", "OMNI_HRO_5MIN": "OMNI Combined, Definitive, 5-minute IMF and Plasma, and Energetic Proton Fluxes, Time-Shifted to the Nose of the Earth's Bow Shock, plus Magnetic Indices - J.H. King, N. Papatashvilli (AdnetSystems, NASA GSFC)", "PHOBOS2_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "PIONEER10_COHO1HR_MERGED_MAG_PLASMA": "Pioneer-10 merged hourly magnetic field, plasma, proton fluxes, and ephermis data - E.J. Smith (HVM) and A. Barnes (PLS) (NASA JPL/AMES)", "PIONEER10_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "PIONEER10_MAG_1MIN_MAGNETIC_FIELD": "1 min averaged magnetic field - Edward Smith (JPL NASA)", "PIONEER11_COHO1HR_MERGED_MAG_PLASMA": "Pioner-11 merged hourly magnetic field, plasma, proton fluxes, and ephermis data - E.J. Smith (HVM) and A. Barnes (PLS) (NASA JPL/AMES)", "PIONEER11_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "PIONEER6_R0_MAGPLASMA": "Pioneer6 merged magnetic field and plasma hourly data from COHOWeb Service", "PIONEER7_R0_MAGPLASMA": "Pioneer7 merged magnetic field and plasma hourly data from COHOWeb Service", "PIONEERVENUS_COHO1HR_MERGED_MAG_PLASMA": "PioneerVenus merged hourly magnetic field, plasma and ephermis data - Dr. T. C. Russell (magnetic field), Dr. Aaron Barnes (plasma) (UCLA, NASA/Ames)", "PIONEERVENUS_MERGED_SOLAR-WIND_10M": "Pioneer Venus Orbiter 10-minute merged solar wind data - Dr. C.T. Russell (magnetic field), Dr. Aaron Barnes (plasma) (UCLA, NASA/Ames)", "PLUTO_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "PMC-TURBO_L1_BOLIDE_VBC": "PMC-Turbo/BOLIDE Rayleigh lidar PMC data 20m 10s resolution - Bernd Kaifler, bernd.kaifler@dlr.de (DLR, IPA)", "POLAR_HYDRA_MOMENTS-14SEC": "Polar Fast Plasma Analyzer 13.8 second Resolution Moments - J. Scudder (U of Iowa)", "PO_10MINATT_EFI": "Polar Spacecraft Attitude in GSE Coordinates - Mozer (UC Berkeley)", "PO_6SECEDSC_EFI": "Polar Electric Field (x,y) in Despun Spacecraft Coordinates - Mozer (UC Berkeley)", "PO_6SECPOTLDENS_EFI": "Polar Spacecraft Potential and Inferred Plasma Density - Mozer (UC Berkeley)", "PO_AT_DEF": "Polar Definitive Attitude Data", "PO_AT_PRE": "Polar Predicted Attitude Data", "PO_EJ_VIS": "Polar Visible Imaging System, Earth Camera Images, processed - Louis A. Frank (The University of Iowa)", "PO_H0_CAM": "Ion Fluxes 1-200 keV/q @ 3-minute resolution, Polar CAMMICE - R. Friedel (Lanl)", "PO_H0_HYD": "Polar Fast Plasma Analyzer 13.8 second Resolution Parameters - J. Scudder (U of Iowa)", "PO_H0_PWI": "Polar Plasma Wave Instrument, MCA, ~1.3 sec fields - D. Gurnett (U. Iowa)", "PO_H0_TID": "Polar TIDE H+,O+,He+ High Time Resolution Data (before 10/01/96) - Thomas E. Moore (Goddard Space Flight Center)", "PO_H0_TIM": "Polar Toroidal Imaging Mass-Angle Spectrograph, High Time Resolution data - W.K. Peterson (Lockheed Martin)", "PO_H0_UVI": "Polar Ultraviolet Imager, High Res. - G. Parks (U. Washington)", "PO_H1_PWI": "Polar Plasma Wave Instrument, Step Frequency Receivers A & B, ~2 sec resolution fields - D. Gurnett (U. Iowa)", "PO_H1_TID": "Polar TIDE Total Ion High Time Resolution Data (after 12/7/96) - Thomas E. Moore (Goddard Space Flight Center)", "PO_H1_UVI": "Polar Ultraviolet Imager, High Res. - G. Parks (U. Washington)", "PO_H2_PWI": "Polar Plasma Wave Instrument, Low Frequency Waveform Receiver, ~0.01 sec resolution fields - D. Gurnett (U. Iowa)", "PO_H2_TIM": "H+, O+, He+ and He++ upflowing fluxes, from Polar TIMAS - W.K. Peterson (LASP/University of Colorado)", "PO_H3_PWI": "Polar Plasma Wave Instrument, Low-rate High Frequency Waveform Receiver, 16K (6-channel, ~0.00003 sec resolution) fields - D. Gurnett (U. Iowa)", "PO_H4_PWI": "Polar Plasma Wave Instrument, High Frequency Waveform Receiver, 2 kHz (6-channel, ~0.0002 sec resolution) fields - D. Gurnett (U. Iowa)", "PO_H5_PWI": "Polar Plasma Wave Instrument, High Frequency Waveform Receiver, 16 kHz/30 usec (interferometry) fields - D. Gurnett (U. Iowa)", "PO_H7_PWI": "Polar Plasma Wave Instrument, High Frequency Waveform Receiver, 6-channel (~1.5 usec resolution) fields - D. Gurnett (U. Iowa)", "PO_H8_PWI": "Polar Plasma Wave Instrument, High Frequency Waveform Receiver - D. Gurnett (U. Iowa)", "PO_H9_PWI": "Polar Plasma Wave Instrument, High Frequency Waveform Receiver - D. Gurnett (U. Iowa)", "PO_HYD_ENERGY_FLUX": "Polar Fast Plasma Analyzer 13.8 second Resolution Moments - J. Scudder (U of Iowa)", "PO_K0_CAM": "~2.3-minute Key Parameters, CAMMICE/Polar Charge And Mass Magnetospheric Ion Composition Experiment - T. A. Fritz (Boston University)", "PO_K0_CEP": "CEPPAD Energetic particles & angular distribution, Key parameters - J. B.Blake (Aerospace Corp. )", "PO_K0_EFI": "Polar Electric Field Instrument, Key Parameters - F. Mozer (UC Berkeley)", "PO_K0_GIFWALK": "Links to Polar KP pre-generated survey and other plots - Polar-Wind-Geotail Ground System (NASA GSFC)", "PO_K0_HYD": "Polar Fast Plasma Analyzer Key Parameter - J. Scudder (U of Iowa)", "PO_K0_MFE": "Polar Magnetic Field,Key Parameters - C.T. Russell (UCLA)", "PO_K0_PIX": "Polar Ionospheric X-ray Imaging Experiment Key Parameters - D. Chenette (Lockheed)", "PO_K0_PWI": "Polar Plasma Wave Instrument Key Parameter - D. Gurnett (U. Iowa)", "PO_K0_SPHA": "Polar Spin Phase Key Parameters", "PO_K0_UVI": "Polar Ultraviolet Imager, Key Parameters - G. Parks (U. Washington)", "PO_K0_VIS": "Polar Visible Imaging System Key Parameters - Louis A. Frank (The University of Iowa)", "PO_K1_TIM": "Polar Toroidal Imaging Mass-Angle Spectrograph, Supplemental Key Parameters - W.K. Peterson (LASP/University of Colorado)", "PO_K1_VIS": "Polar Visible Imaging System Earth Camera Key Parameter - Louis A. Frank (The University of Iowa)", "PO_LEVEL1_UVI": "Polar UVI Level-1 Full Resolution Imager Data - G. Parks (U. Washington)", "PO_OR_DEF": "Polar Definitive Orbit Data", "PO_OR_PRE": "Polar Predicted Orbit Data", "PO_PA_DEF": "Polar Platform Attitude Definitive data", "PO_VIS_EARTH-CAMERA-CALIBRATED": "Polar Visible Imaging System (VIS) Earth Camera Images at ~4 minute cadence - Louis A. Frank (The University of Iowa)", "PO_VIS_VISIBLE-IMAGER-CALIBRATED": "Polar Visible Imaging System (VIS) Low Res. Camera - Louis A. Frank (The University of Iowa)", "PSP_COHO1HR_MERGED_MAG_PLASMA": "Merged hourly magnetic field, plasma, proton fluxes, and ephermis data of PSP - Natalia Papitashvili (NASA/GSFC)", "PSP_FLD_L2_DFB_AC_BPF_DV12HG": "PSP FIELDS Level 2 DFB AC Bandpass Filter (BPF) dV12hg - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_BPF_DV34HG": "PSP FIELDS Level 2 DFB AC Bandpass Filter (BPF) dV34hg - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_BPF_SCMULFHG": "PSP FIELDS Level 2 DFB AC Bandpass Filter SCMulfhg - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_BPF_SCMUMFHG": "PSP FIELDS Level 2 DFB AC Bandpass Filter SCMumfhg - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_SPEC_DV12HG": "PSP FIELDS Level 2 DFB AC Spectra of dV12hg Channel - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_SPEC_DV34HG": "PSP FIELDS Level 2 DFB AC Spectra of dV34 High Gain (HG) Channel (DV34HG) - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_SPEC_SCMDLFHG": "PSP FIELDS Level 2 DFB AC Spectra of Search Coil Magnetometer (SCM) D Low Frequency (LF) High Gain (HG) Channel (SCMDLFHG) - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_SPEC_SCMELFHG": "PSP FIELDS Level 2 DFB AC Spectra of Search Coil Magnetometer (SCM) E Low Frequency (LF) High Gain (HG) Channel (SCMELFHG) - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_SPEC_SCMFLFHG": "PSP FIELDS Level 2 DFB AC Spectra of Search Coil Magnetometer (SCM) F Low Frequency (LF) High Gain (HG) Channel (SCMFLFHG) - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_SPEC_SCMMF": "PSP FIELDS Level 2 DFB AC Spectra of SCMmf Channel - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_SPEC_SCMULFLG": "PSP FIELDS Level 2 DFB AC Spectra of Search Coil Magnetometer (SCM) U Low Frequency (LF) Low Gain (LG) Channel (SCMULFLG) - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_SPEC_SCMVLFHG": "PSP FIELDS Level 2 DFB AC Spectra of Search Coil Magnetometer (SCM) V Low Frequency (LF) High Gain (HG) Channel (SCMVLFHG) - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_SPEC_V5HG": "PSP FIELDS Level 2 DFB AC Spectra of V5 High Gain (HG) Channel (V5HG) - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_XSPEC_DV12HG_DV34HG": "PSP FIELDS Level 2 DFB AC Cross Spectra (XSPEC) between DV12HG and DV34HG Channels - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_XSPEC_SCMDLFHG_SCMELFHG": "PSP FIELDS Level 2 DFB AC Cross Spectra (XSPEC) between Search Coil Magnetometer (SCM) D and E Low Frequency (LF) High Gain (HG) Channels - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_XSPEC_SCMDLFHG_SCMFLFHG": "PSP FIELDS Level 2 DFB AC Cross Spectra (XSPEC) between Search Coil Magnetometer (SCM) D and F Low Frequency (LF) High Gain (HG) Channels - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_AC_XSPEC_SCMELFHG_SCMFLFHG": "PSP FIELDS Level 2 DFB AC Cross Spectra (XSPEC) between Search Coil Magnetometer (SCM) E and F Low Frequency (LF) High Gain (HG) Channels - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DBM_DVAC": "PSP FIELDS Level 2 DFB AC Differential Voltage (DV) Burst Waveform (DBM) Data - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DBM_DVDC": "PSP FIELDS Level 2 DFB DC Burst Differential Voltage Waveform Data - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DBM_SCM": "PSP FIELDS Level 2 DFB Search Coil Burst Waveform Data - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DBM_VAC": "PSP FIELDS Level 2 DFB AC Burst Single Ended Voltage Waveform Data - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DBM_VDC": "PSP FIELDS Level 2 DFB DC Burst Single Ended Voltage Waveform Data - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_BPF_DV12HG": "PSP FIELDS Level 2 DFB DC Bandpass Filter (BPF) of dV12hg Channel - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_BPF_DV34HG": "PSP FIELDS Level 2 DFB DC Bandpass Filter (BPF) of dV34 High Gain (HG) Channel (DV34HG) - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_BPF_SCMULFHG": "PSP FIELDS Level 2 DFB DC Bandpass Filter SCMulfhg - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_BPF_SCMVLFHG": "PSP FIELDS Level 2 DFB DC Bandpass Filter SCMvlfhg - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_SPEC_DV12HG": "PSP FIELDS Level 2 DFB DC Spectra of dV12hg Channel - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_SPEC_SCMDLFHG": "PSP FIELDS Level 2 DFB DC Spectra SCMdlfhg - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_SPEC_SCMELFHG": "PSP FIELDS Level 2 DFB DC Spectra SCMelfhg - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_SPEC_SCMFLFHG": "PSP FIELDS Level 2 DFB DC Spectra SCMflfhg - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_SPEC_SCMULFHG": "PSP FIELDS Level 2 DFB DC Spectra of SCMulfhg Channel - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_SPEC_SCMVLFHG": "PSP FIELDS Level 2 DFB DC Spectra of SCMvlfhg Channel - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_SPEC_SCMWLFHG": "PSP FIELDS Level 2 DFB DC Spectra of SCMwlfhg Channel - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_XSPEC_SCMDLFHG_SCMELFHG": "PSP FIELDS Level 2 DFB DC Cross Spectra (XSPEC) between Search Coil Magnetometer (SCM) D and E Low Frequency (LF) High Gain (HG) Channels - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_XSPEC_SCMDLFHG_SCMFLFHG": "PSP FIELDS Level 2 DFB DC Cross Spectra (XSPEC) between Search Coil Magnetometer (SCM) D and F Low Frequency (LF) High Gain (HG) Channels - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_XSPEC_SCMELFHG_SCMFLFHG": "PSP FIELDS Level 2 DFB DC Cross Spectra (XSPEC) between Search Coil Magnetometer (SCM) E and F Low Frequency (LF) High Gain (HG) Channels - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_DC_XSPEC_SCMVLFHG_SCMWLFHG": "PSP FIELDS Level 2 Digital Fields Board (DFB) DC Cross Spectra (XSPEC) between Search Coil Magnetometer (SCM) V and W Low Frequency (LH) High Gain (HG) Sensors - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_WF_DVDC": "PSP FIELDS Level 2 DFB Differential Voltage Waveform - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_WF_SCM": "PSP FIELDS Level 2 DFB Search Coil Magnetometer (SCM) Waveform - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_DFB_WF_VDC": "PSP FIELDS Level 2 DFB Single Ended Antenna Voltage Waveform - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_F2_100BPS": "PSP FIELDS F2-100bps Summary Telemetry - Stuart D. Bale (bale@berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_MAG_RTN": "PSP FIELDS full cadence Fluxgate Magnetometer (MAG) data in RTN coordinates - Stuart D. Bale (bale@berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_MAG_RTN_1MIN": "PSP FIELDS 1 minute cadence Fluxgate Magnetometer (MAG) data in RTN coordinates - Stuart D. Bale (bale@berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_MAG_RTN_4_SA_PER_CYC": "PSP FIELDS 4 samples per cycle cadence Fluxgate Magnetometer (MAG) data in RTN coordinates - Stuart D. Bale (bale@berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_MAG_SC": "PSP FIELDS full cadence Fluxgate Magnetometer (MAG) data in SC coordinates - Stuart D. Bale (bale@berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_MAG_SC_1MIN": "PSP FIELDS 1 minute cadence Fluxgate Magnetometer (MAG) data in SC coordinates - Stuart D. Bale (bale@berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_MAG_SC_4_SA_PER_CYC": "PSP FIELDS 4 samples per cycle cadence Fluxgate Magnetometer (MAG) data in SC coordinates - Stuart D. Bale (bale@berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_MAG_VSO": "PSP FIELDS full cadence Fluxgate Magnetometer (MAG) data in VSO coordinates - Stuart D. Bale (bale@berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_RFS_BURST": "PSP FIELDS L2 Radio Frequency Spectrometer (RFS) Burst Data - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_RFS_HFR": "PSP FIELDS Level 2 Radio Frequency Spectrometer (RFS) High Frequency Receiver (HFR) Data - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L2_RFS_LFR": "PSP FIELDS Level 2 Radio Frequency Spectrometer (RFS) Low Frequency Receiver (LFR) Data - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_FLD_L3_MERGED_SCAM_WF": "PSP FIELDS Level 3 Merged Search Coil and Fluxgate Magnetic Field Waveform - Stuart D. Bale (bale@ssl.berkeley.edu) (UC Berkeley Space Sciences Laboratory)", "PSP_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "PSP_ISOIS-EPIHI_L2-HET-RATES10": "Parker Solar Probe ISOIS EPI-Hi Level 2 HET 10-second Rates - David McComas (Princeton University)", "PSP_ISOIS-EPIHI_L2-HET-RATES300": "Parker Solar Probe ISOIS EPI-Hi Level 2 HET 5-minute Rates - David McComas (Princeton University)", "PSP_ISOIS-EPIHI_L2-HET-RATES3600": "Parker Solar Probe ISOIS EPI-Hi Level 2 HET Hourly Rates - David McComas (Princeton University)", "PSP_ISOIS-EPIHI_L2-HET-RATES60": "Parker Solar Probe ISOIS EPI-Hi Level 2 HET 1-minute Rates - David McComas (Princeton University)", "PSP_ISOIS-EPIHI_L2-LET1-RATES10": "Parker Solar Probe ISOIS EPI-Hi Level 2 LET1 10-second Rates - David McComas (Princeton University)", "PSP_ISOIS-EPIHI_L2-LET1-RATES300": "Parker Solar Probe ISOIS EPI-Hi Level 2 LET1 5-minute Rates - David McComas (Princeton University)", "PSP_ISOIS-EPIHI_L2-LET1-RATES3600": "Parker Solar Probe ISOIS EPI-Hi Level 2 LET1 Hourly Rates - David McComas (Princeton University)", "PSP_ISOIS-EPIHI_L2-LET1-RATES60": "Parker Solar Probe ISOIS EPI-Hi Level 2 LET1 1-minute Rates - David McComas (Princeton University)", "PSP_ISOIS-EPIHI_L2-LET2-RATES10": "Parker Solar Probe ISOIS EPI-Hi Level 2 LET2 10-second Rates - David McComas (Princeton University)", "PSP_ISOIS-EPIHI_L2-LET2-RATES300": "Parker Solar Probe ISOIS EPI-Hi Level 2 LET2 5-minute Rates - David McComas (Princeton University)", "PSP_ISOIS-EPIHI_L2-LET2-RATES3600": "Parker Solar Probe ISOIS EPI-Hi Level 2 LET2 Hourly Rates - David McComas (Princeton University)", "PSP_ISOIS-EPIHI_L2-LET2-RATES60": "Parker Solar Probe ISOIS EPI-Hi Level 2 LET2 1-minute Rates - David McComas (Princeton University)", "PSP_ISOIS-EPIHI_L2-SECOND-RATES": "Parker Solar Probe ISOIS EPI-Hi Level 2 one-second Rates - David McComas (Princeton University)", "PSP_ISOIS-EPILO_L2-IC": "Parker Solar Probe ISOIS EPI-Lo Level 2 Ion Composition - David McComas (Princeton University)", "PSP_ISOIS-EPILO_L2-PE": "Parker Solar Probe ISOIS EPI-Lo Level 2 Particle Energy - David McComas (Princeton University)", "PSP_ISOIS_L2-EPHEM": "Parker Solar Probe ISOIS Level 2 ephem - David McComas (Princeton University)", "PSP_ISOIS_L2-SUMMARY": "Parker Solar Probe ISOIS level 2 summary - David McComas (Princeton University)", "PSP_SWP_SPA_SF0_L2_16AX8DX32E": "Differential Electron Energy Flux for the SPAN-A Electron Instrument - J. Kasper (Univ. of Michigan)", "PSP_SWP_SPA_SF0_L3_PAD": "Electron Pitch Angle Distribution for the SPAN-Electron instrument - J. Kasper (Univ. of Michigan)", "PSP_SWP_SPA_SF1_L2_32E": "Differential Electron Energy Flux for the SPAN-A Electron Instrument - J. Kasper (Univ. of Michigan)", "PSP_SWP_SPB_SF0_L2_16AX8DX32E": "Electron Differential Energy Flux at each measured energy/deflector step and anode of the SPAN-Electron instrument - J. Kasper (Univ. of Michigan)", "PSP_SWP_SPB_SF0_L3_PAD": "Electron Pitch Angle Distribution for the SPAN-B Electron Instrument - J. Kasper (Univ. of Michigan)", "PSP_SWP_SPB_SF1_L2_32E": "Electron Differential Energy Flux at each measured energy step, and averaged over all deflection steps and anodes of the SPAN-Electron instrument - J. Kasper (Univ. of Michigan)", "PSP_SWP_SPC_L2I": "Parker Solar Probe/SWEAP/SPC Level 2 charge flux distributions - Justin C. Kasper (University of Michigan)", "PSP_SWP_SPC_L3I": "Parker Solar Probe/SWEAP/SPC level 3 ion data - Justin C. Kasper (University of Michigan)", "PSP_SWP_SPE_SF0_L3_PAD": "Electron Pitch Angle Distribution for the SPAN-Electron instrument - J. Kasper (Univ. of Michigan)", "PSP_SWP_SPI_SF00_L2_8DX32EX8A": "Proton Differential Energy Flux at each measured energy/deflector step and anode of the SPAN-Ion instrument - J. Kasper (Univ. of Michigan)", "PSP_SWP_SPI_SF00_L3_MOM_INST": "Partial moments of the Proton distribution function in the instrument frame of reference. User should be aware that the full ion distribution is typically NOT in the FOV of the instrument. - J. Kasper (Univ. of Michigan)", "PSP_SWP_SPI_SF01_L2_8DX32EX8A": "Proton-Contaminated Alpha Differential Energy Flux at Each Measured Deflector Step, Energy, and Anode from the SPAN-Ion Instrument - J. Kasper (Univ. of Michigan)", "PSP_SWP_SPI_SF0A_L3_MOM_INST": "Partial moments of the Alpha distribution function in the instrument frame of reference. User should be aware that the full ion distribution is typically NOT in the FOV of the instrument. - J. Kasper (Univ. of Michigan)", "RBSP-A-RBSPICE_LEV-2_ESRHELT": "High-energy low-time resolution electron fluxes ~0.02-1.0 MeV (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-2_ESRLEHT": "Low-energy high-time resolution electron fluxes ~0.02-1.0 MeV (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-2_ISRHELT": "Diagnostic Data Use only - DO NOT USE FOR SCIENTIFIC PURPOSES. High-energy low-time resolution RBSPICE Ion Energy mode measurement of all particle fluxes (electron/ion) ~0.05-1.0 MeV (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-2_TOFXEH": "TOF x Energy Hydrogen Rates (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-2_TOFXEION": "TOF x Energy Ion Fluxes 0.02-1 MeV measured at high energy resolution and low time resolution (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-2_TOFXENONH": "TOF x E non Hydrogen (Helium and Oxygen) Rates ~0.02-1.0 MeV measured at high energy and low time resolution (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-2_TOFXPHHHELT": "High-energy low-time resolution proton and oxygen fluxes from TOF x PH Hydrogen Rates (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-2_TOFXPHHLEHT": "TOF x Pulse Height Hydrogen and Oxygen Fluxes ~0.01-0.2 MeV measured at low energy resolution and high time resolution (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3-PAP_ESRHELT": "High Energy Low Time resolution electron intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3-PAP_ESRLEHT": "Low Energy High Time resolution electron intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3-PAP_TOFXEH": "TOF x Energy High Energy Low Time resolution proton intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3-PAP_TOFXEHE": "TOF x Energy High Energy Low Time resolution Helium intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3-PAP_TOFXEHE-0": "TOF x Energy High Energy Low Time resolution Helium intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3-PAP_TOFXEION": "TOF x Energy High Energy Low Time resolution ion intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3-PAP_TOFXEO": "TOF x Energy High Energy Low Time resolution Oxygen intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3-PAP_TOFXEO-0": "TOF x Energy High Energy Low Time resolution Oxygen intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3-PAP_TOFXPHHHELT": "TOF x Pulse Height Energies High Energy Low Time resolution proton intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3-PAP_TOFXPHHLEHT": "TOF x Pulse Height Energies High Energy Low Time resolution proton intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3-PAP_TOFXPHOHELT": "TOF x Pulse Height Energies High Energy Low Time resolution Oxygen intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3-PAP_TOFXPHOLEHT": "TOF x Pulse Height Energies Low Energy High Time resolution Oxygen intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3_ESRHELT": "High-energy low-time resolution electron fluxes ~0.02-1.0 MeV (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3_ESRLEHT": "Low-energy high-time resolution electron fluxes ~0.02-1.0 MeV (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3_ISRHELT": "Diagnostic Data Use only - DO NOT USE FOR SCIENTIFIC PURPOSES. High-energy low-time resolution RBSPICE Ion Energy mode measurement with pitch angles of all particle fluxes (electron/ion) ~0.05-1.0 MeV (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3_TOFXEH": "TOF x Energy Hydrogen Rates (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3_TOFXEION": "TOF x Energy Ion Fluxes 0.02-1 MeV measured at high energy resolution and low time resolution (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3_TOFXENONH": "TOF x E non Hydrogen (Helium and Oxygen) Rates ~0.02-1.0 MeV measured at high energy and low time resolution (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3_TOFXPHHHELT": "High-energy low-time resolution proton and oxygen fluxes from TOF x PH Hydrogen Rates (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A-RBSPICE_LEV-3_TOFXPHHLEHT": "TOF x Pulse Height Hydrogen and Oxygen Fluxes ~0.01-0.2 MeV measured at low energy resolution and high time resolution (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-A_DENSITY_EMFISIS-L4": "1-second density and other parameters inferred by digitizing the trace on the spectrograms. - Craig Kletzing (University of Iowa)", "RBSP-A_HFR-SPECTRA-BURST_EMFISIS-L2": "Single Axis AC Electric Field Spectra ~5-10,000 Hz - Craig Kletzing (University of Iowa)", "RBSP-A_HFR-SPECTRA-MERGED_EMFISIS-L2": "Single Axis AC Electric Field Spectra ~5-10,000 Hz - Craig Kletzing (University of Iowa)", "RBSP-A_HFR-SPECTRA_EMFISIS-L2": "Single Axis AC Electric Field Spectra ~5-10,000 Hz - Craig Kletzing (University of Iowa)", "RBSP-A_HFR-WAVEFORM_EMFISIS-L2": "High Frequency Receiver (HFR) Field Waveform Samples in V/m (Selectable between the U, V and W Axes) - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_1SEC-GEI_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_1SEC-GEO_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_1SEC-GSE_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_1SEC-GSM_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_1SEC-SM_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_4SEC-GEI_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_4SEC-GEO_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_4SEC-GSE_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_4SEC-GSM_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_4SEC-SM_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_HIRES-GEI_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_HIRES-GEO_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_HIRES-GSE_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_HIRES-GSM_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_HIRES-SM_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_MAGNETOMETER_UVW_EMFISIS-L2": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-A_WFR-SPECTRAL-MATRIX-DIAGONAL-MERGED_EMFISIS-L2": "WaveForm Receiver (WFR) Spectral Matrix ~5-10,000 Hz (Merged, Diagonal Elements Only) - Craig Kletzing (University of Iowa)", "RBSP-A_WFR-SPECTRAL-MATRIX-DIAGONAL_EMFISIS-L2": "WaveForm Receiver (WFR) Spectral Matrix ~5-10000 Hz (Diagonal Elements Only) - Craig Kletzing (University of Iowa)", "RBSP-A_WFR-SPECTRAL-MATRIX_EMFISIS-L2": "WFR Spectral Matrix - Craig Kletzing (University of Iowa)", "RBSP-A_WFR-WAVEFORM-CONTINUOUS-BURST_EMFISIS-L2": "WaveForm Receiver (WFR) Three Axis Electric Field (EU, EV, EW) and Three Axis Magnetic field (BU, BV, BW) continuous burst waveforms @ 35 kS/sec - Craig Kletzing (University of Iowa)", "RBSP-A_WFR-WAVEFORM_EMFISIS-L2": "WFR Three Axis Electric Field (EU, EV, EW) and Three Axis Magnetic field (BU, BV, BW) waveforms as 16384 samples @ 35 kS/sec - Craig Kletzing (University of Iowa)", "RBSP-B-RBSPICE_LEV-2_ESRHELT": "High-energy low-time resolution electron fluxes ~0.02-1.0 MeV (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-2_ESRLEHT": "Low-energy high-time resolution electron fluxes ~0.02-1.0 MeV (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-2_ISRHELT": "Diagnostic Data Use only - DO NOT USE FOR SCIENTIFIC PURPOSES. High-energy low-time resolution RBSPICE Ion Energy mode measurement of all particle fluxes (electron/ion) ~0.05-1.0 MeV (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-2_TOFXEH": "TOF x Energy Hydrogen Rates (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-2_TOFXEION": "TOF x Energy Ion Fluxes 0.02-1 MeV measured at high energy resolution and low time resolution (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-2_TOFXENONH": "TOF x E non Hydrogen (Helium and Oxygen) Rates ~0.02-1.0 MeV measured at high energy and low time resolution (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-2_TOFXPHHHELT": "High-energy low-time resolution proton and oxygen fluxes from TOF x PH Hydrogen Rates (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-2_TOFXPHHLEHT": "TOF x Pulse Height Hydrogen and Oxygen Fluxes ~0.01-0.2 MeV measured at low energy resolution and high time resolution (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3-PAP_ESRHELT": "High Energy Low Time resolution electron intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3-PAP_ESRLEHT": "Low Energy High Time resolution electron intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3-PAP_TOFXEH": "TOF x Energy High Energy Low Time resolution proton intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3-PAP_TOFXEHE": "TOF x Energy High Energy Low Time resolution Helium intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3-PAP_TOFXEHE-0": "TOF x Energy High Energy Low Time resolution Helium intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3-PAP_TOFXEION": "TOF x Energy High Energy Low Time resolution ion intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3-PAP_TOFXEO": "TOF x Energy High Energy Low Time resolution Oxygen intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3-PAP_TOFXEO-0": "TOF x Energy High Energy Low Time resolution Oxygen intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3-PAP_TOFXPHHHELT": "TOF x Pulse Height Energies High Energy Low Time resolution proton intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3-PAP_TOFXPHHLEHT": "TOF x Pulse Height Energies High Energy Low Time resolution proton intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3-PAP_TOFXPHOHELT": "TOF x Pulse Height Energies High Energy Low Time resolution Oxygen intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3-PAP_TOFXPHOLEHT": "TOF x Pulse Height Energies Low Energy High Time resolution Oxygen intensities and pressures sorted by pitch angles - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3_ESRHELT": "High-energy low-time resolution electron fluxes ~0.02-1.0 MeV (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3_ESRLEHT": "Low-energy high-time resolution electron fluxes ~0.02-1.0 MeV (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3_ISRHELT": "Diagnostic Data Use only - DO NOT USE FOR SCIENTIFIC PURPOSES. High-energy low-time resolution RBSPICE Ion Energy mode measurement with pitch angles of all particle fluxes (electron/ion) ~0.05-1.0 MeV (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3_TOFXEH": "TOF x Energy Hydrogen Rates (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3_TOFXEION": "TOF x Energy Ion Fluxes 0.02-1 MeV measured at high energy resolution and low time resolution (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3_TOFXENONH": "TOF x E non Hydrogen (Helium and Oxygen) Rates ~0.02-1.0 MeV measured at high energy and low time resolution (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3_TOFXPHHHELT": "High-energy low-time resolution proton and oxygen fluxes from TOF x PH Hydrogen Rates (with multi-spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B-RBSPICE_LEV-3_TOFXPHHLEHT": "TOF x Pulse Height Hydrogen and Oxygen Fluxes ~0.01-0.2 MeV measured at low energy resolution and high time resolution (with spin accumulations plotted at end of accumulation in sector order) - Lou Lanzerotti (New Jersey Institute of Technology)", "RBSP-B_DENSITY_EMFISIS-L4": "1-second density and other parameters inferred by digitizing the trace on the spectrograms. - Craig Kletzing (University of Iowa)", "RBSP-B_HFR-SPECTRA-BURST_EMFISIS-L2": "Single Axis AC Electric Field Spectra ~5-10,000 Hz - Craig Kletzing (University of Iowa)", "RBSP-B_HFR-SPECTRA-MERGED_EMFISIS-L2": "Single Axis AC Electric Field Spectra ~5-10,000 Hz - Craig Kletzing (University of Iowa)", "RBSP-B_HFR-SPECTRA_EMFISIS-L2": "Single Axis AC Electric Field Spectra ~5-10,000 Hz - Craig Kletzing (University of Iowa)", "RBSP-B_HFR-WAVEFORM_EMFISIS-L2": "High Frequency Receiver (HFR) Field Waveform Samples in V/m (Selectable between the U, V and W Axes) - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_1SEC-GEI_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_1SEC-GEO_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_1SEC-GSE_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_1SEC-GSM_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_1SEC-SM_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_4SEC-GEI_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_4SEC-GEO_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_4SEC-GSE_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_4SEC-GSM_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_4SEC-SM_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_HIRES-GEI_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_HIRES-GEO_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_HIRES-GSE_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_HIRES-GSM_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_HIRES-SM_EMFISIS-L3": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_MAGNETOMETER_UVW_EMFISIS-L2": "Fluxgate magnetometer data - Craig Kletzing (University of Iowa)", "RBSP-B_WFR-SPECTRAL-MATRIX-DIAGONAL-MERGED_EMFISIS-L2": "WaveForm Receiver (WFR) Spectral Matrix ~5-10,000 Hz (Merged, Diagonal Elements Only) - Craig Kletzing (University of Iowa)", "RBSP-B_WFR-SPECTRAL-MATRIX-DIAGONAL_EMFISIS-L2": "WaveForm Receiver (WFR) Spectral Matrix ~5-10000 Hz (Diagonal Elements Only) - Craig Kletzing (University of Iowa)", "RBSP-B_WFR-SPECTRAL-MATRIX_EMFISIS-L2": "WFR Spectral Matrix - Craig Kletzing (University of Iowa)", "RBSP-B_WFR-WAVEFORM-CONTINUOUS-BURST_EMFISIS-L2": "WaveForm Receiver (WFR) Three Axis Electric Field (EU, EV, EW) and Three Axis Magnetic field (BU, BV, BW) continuous burst waveforms @ 35 kS/sec - Craig Kletzing (University of Iowa)", "RBSP-B_WFR-WAVEFORM_EMFISIS-L2": "WFR Three Axis Electric Field (EU, EV, EW) and Three Axis Magnetic field (BU, BV, BW) waveforms as 16384 samples @ 35 kS/sec - Craig Kletzing (University of Iowa)", "RBSPA_EFW-L2_E-HIRES-UVW": "Reference for Spin Axis Vector in GSE - J. R. Wygant (University of Minnesota)", "RBSPA_EFW-L2_E-SPINFIT-MGSE": "Spinfit (10.9 sec resolution) DC Electric Field estimates in M-GSE coordinates. - J. R. Wygant (University of Minnesota)", "RBSPA_EFW-L2_ESVY_DESPUN": "Despun (32 Samples/sec) E-Field estimates in M-GSE coords - J. R. Wygant (University of Minnesota)", "RBSPA_EFW-L2_FBK": "Filterbank peak and average values 1-7000 Hz from RBSP-EFW (with peak and average values returned for 2 of 20 possible sources at any one time) - J. R. Wygant (University of Minnesota)", "RBSPA_EFW-L2_SPEC": "On-Board Spin-Fit 4-8000 Hz electric and magnetic field spectral data from RBSP-EFW (with 7 of 75 possible sources returned at any one time) - J. R. Wygant (University of Minnesota)", "RBSPA_EFW-L2_VSVY-HIRES": "DERIVED FROM: Spinfit DC Electric Field estimates in M-GSE coordinates - J. R. Wygant (University of Minnesota)", "RBSPA_EFW-L3": "L3 Spin-fit Electric field in modified-GSE (MGSE) coordinates, density from EFW S/C Potential, and other products - J. R. Wygant (University of Minnesota)", "RBSPA_EFW_BURST-WAVEFORM-UVW-L1": "Burst Mode 1 (512 samples/sec) Electric and Magnetic Fields - J. R. Wygant", "RBSPA_L2-1MIN_PSBR-RPS": "Van Allen Probes/RPS Level 2 1-Minute Data - J. Mazur (The Aerospace Corporation)", "RBSPA_L2_PSBR-RPS": "Van Allen Probes/RPS Level 2 Data - J. Mazur (The Aerospace Corporation)", "RBSPA_REL03_ECT-MAGEIS-L2": "Electron fluxes ~20-4000 keV and proton fluxes ~50-1500 keV from ECT/MAGEIS - J. Bernard Blake / JBernard.Blake@aero.org (The Aerospace Corporation)", "RBSPA_REL03_ECT-REPT-SCI-L2": "Electron fluxes 2-20 MeV and proton fluxes 20-120 MeV from ECT/REPT - D. Baker (University of Colorado at Boulder)", "RBSPA_REL03_ECT-REPT-SCI-L3": "RBSP/ECT REPT Pitch Angle Resolved Electron and Proton Fluxes. Electron energies: 2 - 59.45 MeV. Proton energies: 21.25 - 0 MeV - D. Baker (University of Colorado at Boulder)", "RBSPA_REL04_ECT-HOPE-MOM-L3": "Spin resolved HOPE science data. Plasma moments from electrons >200 eV and ions >30 eV measured at apogee in alternate spin cadence. - Herbert Funsten (Los Alamos National Laboratory)", "RBSPA_REL04_ECT-HOPE-PA-L3": "Pitch angle resolved ECT-HOPE science data. Electron fluxes ~15-50,000 eV, ion fluxes ~1-50,000 eV. Electrons and ions measured in alternate spin cadence. - Herbert Funsten (Los Alamos National Laboratory)", "RBSPA_REL04_ECT-HOPE-SCI-L2": "Spin resolved ECT-HOPE science data. Electron fluxes ~15-50,000 eV, ion fluxes ~1-50,000 eV. Electrons and ions measured in alternate spin cadence. - Herbert Funsten (Los Alamos National Laboratory)", "RBSPA_REL04_ECT-HOPE-SCI-L2SA": "Spin averaged ECT-HOPE science data. Electron fluxes ~15-50,000 eV, ion fluxes ~1-50,000 eV. Electrons and ions measured in alternate spin cadence. - Herbert Funsten (Los Alamos National Laboratory)", "RBSPA_REL04_ECT-MAGEIS-L3": "Electron fluxes ~20-4000keV and proton fluxes ~60-1500 keV from ECT/MagEIS - J. Bernard Blake (JBernard.Blake@aero.org) (The Aerospace Corporation)", "RBSPB_EFW-L2_E-HIRES-UVW": "Reference for Spin Axis Vector in GSE - J. R. Wygant (University of Minnesota)", "RBSPB_EFW-L2_E-SPINFIT-MGSE": "Spinfit (10.9 sec resolution) DC Electric Field estimates in M-GSE coordinates. - J. R. Wygant (University of Minnesota)", "RBSPB_EFW-L2_ESVY_DESPUN": "Despun (32 Samples/sec) E-Field estimates in M-GSE coords - J. R. Wygant (University of Minnesota)", "RBSPB_EFW-L2_FBK": "Filterbank peak and average values 1-7000 Hz from RBSP-EFW (with peak and average values returned for 2 of 20 possible sources at any one time) - J. R. Wygant (University of Minnesota)", "RBSPB_EFW-L2_SPEC": "On-Board Spin-Fit 4-8000 Hz electric and magnetic field spectral data from RBSP-EFW (with 7 of 75 possible sources returned at any one time) - J. R. Wygant (University of Minnesota)", "RBSPB_EFW-L2_VSVY-HIRES": "DERIVED FROM: Spinfit DC Electric Field estimates in M-GSE coordinates - J. R. Wygant (University of Minnesota)", "RBSPB_EFW-L3": "L3 Spin-fit Electric field in modified-GSE (MGSE) coordinates, density from EFW S/C Potential, and other products - J. R. Wygant (University of Minnesota)", "RBSPB_EFW_BURST-WAVEFORM-UVW-L1": "Burst Mode 1 (512 samples/sec) Electric and Magnetic Fields - J. R. Wygant", "RBSPB_L2-1MIN_PSBR-RPS": "Van Allen Probes/RPS Level 2 1-Minute Data - J. Mazur (The Aerospace Corporation)", "RBSPB_L2_PSBR-RPS": "Van Allen Probes/RPS Level 2 Data - J. Mazur (The Aerospace Corporation)", "RBSPB_REL03_ECT-MAGEIS-L2": "Electron fluxes ~20-4000 keV and proton fluxes ~50-1500 keV from ECT/MAGEIS - J. Bernard Blake / JBernard.Blake@aero.org (The Aerospace Corporation)", "RBSPB_REL03_ECT-REPT-SCI-L2": "Electron fluxes 2-20 MeV and proton fluxes 20-120 MeV from ECT/REPT - D. Baker (University of Colorado at Boulder)", "RBSPB_REL03_ECT-REPT-SCI-L3": "RBSP/ECT REPT Pitch Angle Resolved Electron and Proton Fluxes. Electron energies: 2 - 59.45 MeV. Proton energies: 21.25 - 0 MeV - D. Baker (University of Colorado at Boulder)", "RBSPB_REL04_ECT-HOPE-MOM-L3": "Spin resolved HOPE science data. Plasma moments from electrons >200 eV and ions >30 eV measured at apogee in alternate spin cadence. - Herbert Funsten (Los Alamos National Laboratory)", "RBSPB_REL04_ECT-HOPE-PA-L3": "Pitch angle resolved ECT-HOPE science data. Electron fluxes ~15-50,000 eV, ion fluxes ~1-50,000 eV. Electrons and ions measured in alternate spin cadence. - Herbert Funsten (Los Alamos National Laboratory)", "RBSPB_REL04_ECT-HOPE-SCI-L2": "Spin resolved ECT-HOPE science data. Electron fluxes ~15-50,000 eV, ion fluxes ~1-50,000 eV. Electrons and ions measured in alternate spin cadence. - Herbert Funsten (Los Alamos National Laboratory)", "RBSPB_REL04_ECT-HOPE-SCI-L2SA": "Spin averaged ECT-HOPE science data. Electron fluxes ~15-50,000 eV, ion fluxes ~1-50,000 eV. Electrons and ions measured in alternate spin cadence. - Herbert Funsten (Los Alamos National Laboratory)", "RBSPB_REL04_ECT-MAGEIS-L3": "Electron fluxes ~20-4000keV and proton fluxes ~60-1500 keV from ECT/MagEIS - J. Bernard Blake (JBernard.Blake@aero.org) (The Aerospace Corporation)", "RBSP_ECT-REPT-SCI-L3-SELESNICK-MODEL": "RBSP/ECT REPT Monthly Intensities as a function of Energy, Pitch Angle and L-shell from the Selesnick model - D. Baker (University of Colorado at Boulder)", "RENU2_H0_EFIELD": "H0 - RENU2 COrnell Wire BOom Yo-yo (COWBOY) Electric Field. - Marc Lessard, David Hysell (University of New Hampshire, Cornell University)", "RENU2_H0_EPLAS": "H0 - RENU2 EPLAS Electron Flux. - Marc Lessard (University of New Hampshire)", "RENU2_H0_ERPAMAIN": "H0 - RENU2 ERPA Thermal Electrons. - Marc Lessard (University of New Hampshire)", "RENU2_H0_ERPASUB": "H0 - RENU2 ERPA Thermal Electrons. - Marc Lessard (University of New Hampshire)", "RENU2_H0_FGM": "H0 - RENU2 Magnetic Field. - Marc Lessard (University of New Hampshire, Cornell University)", "RENU2_H0_IG2": "H0 - RENU2 ionization gauge - James Clemmons (University of New Hampshire)", "RENU2_H0_PMT": "H0 - RENU2 PMT Rayleighs. - Jim Hecht (University of New HampshireAerospace Corporation)", "RENU2_H0_UVPMT": "H0 - RENU2 UV PMT Counts. - Marc Lessard (University of New Hampshire)", "RENU2_H0_VLF": "H0 - RENU2 COrnell Wire BOom Yo-yo (COWBOY) Electric Field. - Marc Lessard, David Hysell (University of New Hampshire, Cornell University)", "ROSETTA_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "RS_K0_IPEI": "ROCSAT-1(FORMOSAT-1)/IPEI, Key Parameters - Shin-Yi Su (Institute of Space Science, National Central University, Taiwan, R.O.C.)", "SAKIGAKE_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "SATURN_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "SE_K0_AIS": "SESAME Advanced Ionospheric Sounder, Key Parameters - J. Dudeney (British Antarctic Survey)", "SE_K0_FPI": "SESAME Fabry-Perot Interferometer, Key Parameters - J.R. Dudeney (British Antarctic Survey)", "SE_K0_MAG": "SESAME Fluxgate Magnetometer Key Parameters - J. Dudeney (British Antarctic Survey)", "SE_K0_RIO": "SESAME 30MHz Riometer Array, Key Parameters - J. Dudeney (British Antarctic Survey)", "SE_K0_VLF": "SESAME VLF/ELF Logger Experiment (VELOX)Key Parameters - J. Dudeney (British Antarctic Survey)", "SNOE_L3_GEO": "NO density, 100 - 150 km, geographic coordinates - Charles A. Barth (LASP/CU)", "SNOE_L3_MAG": "NO density, 100 - 150 km, geomagnetic coordinates - Charles A. Barth (LASP/CU)", "SOHO_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "SOLO_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "SOLO_L2_EPD-EPT-ASUN-BURST-ELE-CLOSE": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, Anti-Sun direction, Burst, Electrons, Close mode - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-ASUN-BURST-ION": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, Anti-Sun direction, Burst, Ions - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-ASUN-HCAD": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, Anti-Sun direction, High Cadence - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-ASUN-RATES": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, Anti-Sun Direction, Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-NORTH-BURST-ELE-CLOSE": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, North direction, Burst, Electrons, Close mode - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-NORTH-BURST-ION": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, North direction, Burst, Ions - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-NORTH-HCAD": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, North Direction, High Cadence - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-NORTH-RATES": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, North Direction, Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-SOUTH-BURST-ELE-CLOSE": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, South direction, Burst, Electrons, Close mode - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-SOUTH-BURST-ION": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, South direction, Burst, Ions - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-SOUTH-HCAD": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, South direction, High Cadence - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-SOUTH-RATES": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, South Direction, Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-SUN-BURST-ELE-CLOSE": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, Sun direction, Burst, Electrons, Close mode - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-SUN-BURST-ION": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, Sun direction, Burst, Ions - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-SUN-HCAD": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, Sun direction, High Cadence - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-EPT-SUN-RATES": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Electron Proton Telescope, Sun Direction, Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-HET-ASUN-BURST": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, High Energy Telescope, Anti-Sun direction, Burst - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-HET-ASUN-RATES": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, High Energy Telescope, Anti-Sun direction, Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-HET-NORTH-BURST": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, High Energy Telescope, North direction, Burst - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-HET-NORTH-RATES": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, High Energy Telescope, North direction, Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-HET-SOUTH-BURST": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, High Energy Telescope, South direction, Burst - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-HET-SOUTH-RATES": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, High Energy Telescope, South direction, Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-HET-SUN-BURST": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, High Energy Telescope, Sun direction, Burst - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-HET-SUN-RATES": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, High Energy Telescope, Sun direction, Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-SIS-A-HEHIST": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Suprathermal Ion Spectrograph, A Telescope, Helium histogram - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-SIS-A-RATES-FAST": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Suprathermal Ion Spectrograph, A Telescope, Particle rates, fast cadence - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-SIS-A-RATES-MEDIUM": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Suprathermal Ion Spectrograph, A Telescope, Particle rates, medium cadence - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-SIS-A-RATES-SLOW": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Suprathermal Ion Spectrograph, A Telescope, Particle rates, slow cadence - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-SIS-B-HEHIST": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Suprathermal Ion Spectrograph, B Telescope, Helium histogram - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-SIS-B-RATES-FAST": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Suprathermal Ion Spectrograph, B Telescope, Particle rates, fast cadence - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-SIS-B-RATES-MEDIUM": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Suprathermal Ion Spectrograph, B Telescope, Particle rates, medium cadence - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-SIS-B-RATES-SLOW": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, Suprathermal Ion Spectrograph, B Telescope, Particle rates, slow cadence - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-STEP-BURST": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, SupraThermal Electrons and Protons, Burst - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-STEP-HCAD": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, SupraThermal Electrons and Protons, High Cadence - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_EPD-STEP-RATES": "Solar Orbiter, Level 2 Data, Energetic Particle Detector, SupraThermal Electrons and Protons, Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_L2_MAG-RTN-BURST": "Solar Orbiter Level 2 Magnetometer Data in RTN Coordinates in Burst Mode - T. Horbury (The Blackett Laboratory, Imperial College London)", "SOLO_L2_MAG-RTN-NORMAL": "Solar Orbiter Level 2 Magnetometer Data in RTN Coordinates in Normal Mode - T. Horbury (The Blackett Laboratory, Imperial College London)", "SOLO_L2_MAG-RTN-NORMAL-1-MINUTE": "Solar Orbiter Magnetometer L2 Data - T. Horbury (The Blackett Laboratory, Imperial College London)", "SOLO_L2_MAG-SRF-BURST": "Solar Orbiter Level 2 Magnetometer Data in Spacecraft Reference Frame in Burst Mode - T. Horbury (The Blackett Laboratory, Imperial College London)", "SOLO_L2_MAG-SRF-NORMAL": "Solar Orbiter Level 2 Magnetometer Data in Spacecraft Reference Frame in Normal Mode - T. Horbury (The Blackett Laboratory, Imperial College London)", "SOLO_L2_RPW-HFR-SURV": "Solar Orbiter Radio and Plasma Waves, Level 2 High Frequency Receiver (HFR) Data in Survey Mode - M.Maksimovic (LESIA, Observatoire de Paris-CNRS)", "SOLO_L2_RPW-LFR-SURV-BP1": "Solar Orbiter Radio and Plasma Wave, Level 2 Low Frequency Receiver (LFR) Basic Parameters Set 1 (BP1) Data in Survey Mode - M.Maksimovic (LESIA, Observatoire de Paris-CNRS)", "SOLO_L2_RPW-LFR-SURV-BP2": "Solar Orbiter Radio and Plasma Wave, Level 2 Low Frequency Receiver (LFR) Basic Parameter Set 2 (BP2) Data in Survey Mode - M.Maksimovic (LESIA, Observatoire de Paris-CNRS)", "SOLO_L2_RPW-LFR-SURV-CWF-B": "Solar Orbiter Radio and Plasma Waves, Level 2 Low Frequency Receiver (LFR) Continuous Magnetic Waveform (CWF-B) in Survey Mode - M.Maksimovic (LESIA, Observatoire de Paris-CNRS)", "SOLO_L2_RPW-LFR-SURV-CWF-E": "Solar Orbiter Radio and Plasma Waves, Level 2 Low Frequency Reciver (LFR) Continuous Electric Waveform (CWF-E) in Survey Mode - M.Maksimovic (LESIA, Observatoire de Paris-CNRS)", "SOLO_L2_RPW-TDS-SURV-HIST1D": "Solar Orbiter Radio/Plasma Wave, TDS L2 parameters - M.Maksimovic (LESIA, Observatoire de Paris-CNRS)", "SOLO_L2_RPW-TDS-SURV-HIST2D": "Solar Orbiter Radio/Plasma Wave, TDS L2 parameters - M.Maksimovic (LESIA, Observatoire de Paris-CNRS)", "SOLO_L2_RPW-TDS-SURV-STAT": "Solar Orbiter Radio/Plasma Wave, TDS L2R parameters - M.Maksimovic (LESIA, Observatoire de Paris-CNRS)", "SOLO_LL02_EPD-EPT-ASUN-RATES": "Solar Orbiter Level 2 Low Latency Data from Energetic Particle Detector (EPD), Electron Proton Telescope (EPT), Anti-Sunward Direction Particle Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_LL02_EPD-EPT-NORTH-RATES": "Solar Orbiter Level 2 Low Latency Data from Energetic Particle Detector (EPD) Electron Proton Telescope (EPT), North Direction Particle Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_LL02_EPD-EPT-SOUTH-RATES": "Solar Orbiter Level 2 Low Latency Data from Energetic Particle Detector (EPD) Electron Proton Telescope (EPT), South Direction Particle Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_LL02_EPD-EPT-SUN-RATES": "Solar Orbiter Level 2 Low Latency Data from Energetic Particle Detector (EPD) Electron Proton Telescope (EPT) Sunward Direction Particle Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_LL02_EPD-HET-ASUN-RATES": "Solar Orbiter Level 2 Low Latency Data of Energetic Particle Detector (EPD) High Energy Telescope (HET) Anti-Sunward Direction Particle Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_LL02_EPD-HET-NORTH-RATES": "Solar Orbiter Level 2 Low Latency Data of Energetic Particle Detector (EPD) High Energy Telescope (HET) North Direction Particle Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_LL02_EPD-HET-SOUTH-RATES": "Solar Orbiter Level 2 Low Latency Data of Energetic Particle Detector (EPD) High Energy Telescope (HET) South Direction Particle Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_LL02_EPD-HET-SUN-RATES": "Solar Orbiter Level 2 Low Latency Data of Energetic Particle Detector (EPD) High Energy Telescope (HET) Sunward Direction Particle Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_LL02_EPD-SIS-A-RATES": "Solar Orbiter Level 2 Low Latency data of Energetic Particle Detector (EPD) Suprathermal Ion Spectrograph (SIS) A Telescope, Particle Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_LL02_EPD-SIS-B-RATES": "Solar Orbiter Level 2 Low Latency Data of Energetic Particle Detector (EPD) Suprathermal Ion Spectrograph (SIS) B Telescope Particle Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_LL02_EPD-STEP-RATES": "Solar Orbiter Level 2 Low Latency Data from Energetic Particle Detector (EPD) SupraThermal Electrons and Protons (STEP) Particle Rates - J. Rodriguez-Pacheco (Space Research Group, Universidad de Alcala)", "SOLO_LL02_MAG": "Solar Orbiter Level 2 Low Latency Magnetometer Data - T. Horbury (The Blackett Laboratory, Imperial College London)", "SOLO_LL02_RPW-SBM1": "Solar Orbiter Level 2 Low Latency Data from Radio and Plasma Wave (RPW) Selected Burst Mode 1 (SBM1) (for Shock Crossing) - M. Maksimovic (LESIA, Observatoire de Paris-CNRS)", "SOLO_LL02_RPW-SBM2": "Solar Orbiter Level 2 Low Latency Data from Radio and Plasma Wave (RPW) Selected Burst Mode 2 (SBM2) (for In Situ Type III) - M. Maksimovic (LESIA, Observatoire de Paris-CNRS)", "SOLO_LL02_RPW-TNR": "Solar Orbiter Level 2 Low Latency Data from Radio and Plasma Wave (RPW) Thermal Noise Receiver (TNR) - M. Maksimovic (LESIA, Observatoire de Paris-CNRS)", "SOLO_LL02_SWA-EAS-SS": "Solar Orbiter Level 2 Low Latency Single Strahl (SS) Data from Solar Wind Analyzer (SWA) Electron Analyzer System (EAS) - C. J. Owen (MSSL-UCL, University College London, UK)", "SOLO_LL02_SWA-PAS-MOM": "Solar Orbiter Level 2 Low Latency Data from Solar Wind Analyser (SWA) Proton and Alpha Sensor (PAS) Quick Look Moments - C. J. Owen (MSSL-UCL, University College London, UK)", "SO_AT_DEF": "SOHO Definitive Attitude Data", "SO_K0_CEL": "SOHO Charge, Element and Isotope Analysis System, Key Parameters - Peter Bochsler (Physikalisches Institut, )", "SO_K0_CST": "SOHO ComprehensiveSuprathermal and EnergeticParticle Analyser - Horst Kunow (University of Kiel, Germany)", "SO_K0_ERN": "SOHO Energetic and Relativistic Nuclei and Electron experiment, Key Parameters - J Torsti (University of Turku)", "SO_OR_DEF": "SOHO Definitive Orbit Data", "SO_OR_PRE": "Soho Predicted Data Orbit", "ST5-094_1SEC_MAG": "3 component magnetic field from miniature tri-axial magnetometer on ST5/spacecraft 094 (middle position in string-of-pearls constellation) - Delores Knipp (University of Colorado, Boulder)", "ST5-155_1SEC_MAG": "3 component magnetic field from miniature tri-axial magnetometer on ST5/spacecraft 155 (leading position in string-of-pearls constellation) - Delores Knipp (University of Colorado, Boulder)", "ST5-224_1SEC_MAG": "3 component magnetic field from miniature tri-axial magnetometer on ST5/spacecraft 224 (trailing position in string-of-pearls constellation) - Delores Knipp (University of Colorado, Boulder)", "STA_COHO1HR_MERGED_MAG_PLASMA": "Merged hourly magnetic field, plasma, proton fluxes, and ephermis data - Natasha Papitashvili (NASA/GSFC)", "STA_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "STA_L1_HET": "STEREO Ahead IMPACT/HET Level 1 Data. - J. Luhmann (UCB/SSL)", "STA_L1_IMPACT_BURST": "STEREO Ahead IMPACT Burst Criteria. - J. Luhmann (UCB/SSL)", "STA_L1_IMPACT_HKP": "STEREO Ahead IMPACT State of Health\t - J. Luhmann (UCB/SSL)", "STA_L1_LET": "STEREO Ahead IMPACT/LET Level 1 Data. - J. Luhmann (UCB/SSL)", "STA_L1_MAGB_RTN": "STEREO Ahead IMPACT/MAG Burst Mode (~0.03 sec) Magnetic Field Vectors (RTN) - J. Luhmann (UCB/SSL)", "STA_L1_MAGB_SC": "STEREO Ahead IMPACT/MAG Burst Mode (~0.03 sec) Magnetic Field Vectors (SC) - J. Luhmann (UCB/SSL)", "STA_L1_MAG_RTN": "STEREO Ahead IMPACT/MAG Magnetic Field Vectors (RTN) - J. Luhmann (UCB/SSL)", "STA_L1_MAG_SC": "STEREO Ahead IMPACT/MAG Magnetic Field Vectors (SC) - J. Luhmann (UCB/SSL)", "STA_L1_SEPT": "STEREO Ahead IMPACT/SEPT Level 1 Data. - J. Luhmann (UCB/SSL)", "STA_L1_SIT": "STEREO Ahead IMPACT/SIT Level 1 Data. - J. Luhmann (UCB/SSL)", "STA_L1_STE": "STEREO Ahead IMPACT/STE Spectra - J. Luhmann (UCB/SSL)", "STA_L1_SWEA_DISB": "STEREO Ahead IMPACT/SWEA 3D Burst Mode Distributions. - J. Luhmann (UCB/SSL)", "STA_L1_SWEA_DIST": "STEREO Ahead IMPACT/SWEA 3D Distributions. - J. Luhmann (UCB/SSL)", "STA_L1_SWEA_SPEC": "STEREO Ahead IMPACT/SWEA Spectra - J. Luhmann (UCB/SSL)", "STA_L2_MAGPLASMA_1M": "STEREO Ahead IMPACT/MAG Magnetic Field and PLASTIC Solar Wind Plasma Data - J. Luhmann (UCB/SSL)", "STA_L2_PLA_1DMAX_10MIN": "STEREO Ahead PLASTIC Level 2 - Dr. Antoinette Galvin (University of New Hampshire)", "STA_L2_PLA_1DMAX_1HR": "STEREO Ahead PLASTIC Level 2 - Dr. Antoinette Galvin (University of New Hampshire)", "STA_L2_PLA_1DMAX_1MIN": "STEREO Ahead PLASTIC Level 2 - Dr. Antoinette Galvin (University of New Hampshire)", "STA_L2_PLA_IRON_Q_2HR": "STEREO Ahead PLASTIC Level 2 - Dr. Antoinette Galvin (University of New Hampshire)", "STA_L3_PLA_HE2PL_F_VSW_01HR": "He++ Phase Space Density (PSD) Binned by V/Vsw. - Dr. Antoinette Galvin (University of New Hampshire)", "STA_L3_PLA_HEPLUS_24HR": "STEREO Ahead PLASTIC Level 3 He+ Fluxes Binned by V/Vsw, - Dr. Antoinette Galvin (University of New Hampshire)", "STA_L3_PLA_HEPLUS_F_VSW_01HR": "STEREO Ahead PLASTIC Level 3 He+ Phase Space Density (PSD) Binned by V/Vsw, Hourly Resolution. - Dr. Antoinette Galvin (University of New Hampshire)", "STA_L3_PLA_HEPLUS_F_VSW_10MIN": "He+ Phase Space Density (PSD) Binned by V/Vsw. - Dr. Antoinette Galvin (University of New Hampshire)", "STA_L3_PLA_HEPLUS_F_VSW_24HR": "STEREO Ahead PLASTIC Level 3 He+ Phase Space Density (PSD) Binned by V/Vsw - Dr. Antoinette Galvin (University of New Hampshire)", "STA_L3_PLA_HEPLUS_SW_VELCTDIST_5MIN": "He+ SW Frame Velocity Count Distributions. - Dr. Antoinette Galvin (University of New Hampshire)", "STA_LB_IMPACT": "STEREO Ahead IMPACT Beacon Data - J. Luhmann (UCB/SSL)", "STA_LB_MAG_RTN": "STEREO Ahead IMPACT Reprocessed Beacon MAG Magnetic Field Vectors around 2015 Solar Conjunction - J. Luhmann (UCB/SSL)", "STA_LB_PLA_BROWSE": "STEREO Ahead PLASTIC Beacon Proton Parameters [PRELIM] - Dr. Antoinette Galvin (University of New Hampshire)", "STB_COHO1HR_MERGED_MAG_PLASMA": "Merged hourly magnetic field, plasma, proton fluxes, and ephermis data - Natasha Papitashvili (NASA/GSFC)", "STB_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "STB_L1_HET": "STEREO Behind IMPACT/HET Level 1 Data. - J. Luhmann (UCB/SSL)", "STB_L1_IMPACT_BURST": "STEREO Behind IMPACT Burst Criteria. - J. Luhmann (UCB/SSL)", "STB_L1_IMPACT_HKP": "STEREO Behind IMPACT State of Health\t - J. Luhmann (UCB/SSL)", "STB_L1_LET": "STEREO Behind IMPACT/LET Level 1 Data. - J. Luhmann (UCB/SSL)", "STB_L1_MAGB_RTN": "STEREO Behind IMPACT/MAG Burst Mode (~0.03 sec) Magnetic Field Vectors - J. Luhmann (UCB/SSL)", "STB_L1_MAGB_SC": "STEREO Behind IMPACT/MAG Burst Mode (~0.03 sec) Magnetic Field Vectors (SC) - J. Luhmann (UCB/SSL)", "STB_L1_MAG_RTN": "STEREO Behind IMPACT/MAG Magnetic Field Vectors (RTN) - J. Luhmann (UCB/SSL)", "STB_L1_MAG_SC": "STEREO Behind IMPACT/MAG Magnetic Field Vectors - J. Luhmann (UCB/SSL)", "STB_L1_SEPT": "STEREO Behind IMPACT/SEPT Level 1 Data. - J. Luhmann (UCB/SSL)", "STB_L1_SIT": "STEREO Behind IMPACT/SIT Level 1 Data. - J. Luhmann (UCB/SSL)", "STB_L1_STE": "STEREO Behind IMPACT/STE Spectra - J. Luhmann (UCB/SSL)", "STB_L1_SWEA_DISB": "STEREO Behind IMPACT/SWEA 3D Burst Mode Distributions. - J. Luhmann (UCB/SSL)", "STB_L1_SWEA_DIST": "STEREO Behind IMPACT/SWEA 3D Distributions. - J. Luhmann (UCB/SSL)", "STB_L1_SWEA_SPEC": "STEREO Behind IMPACT/SWEA Spectra - J. Luhmann (UCB/SSL)", "STB_L2_MAGPLASMA_1M": "STEREO Behind IMPACT/MAG Magnetic Field and PLASTIC Solar Wind Plasma Data - J. Luhmann (UCB/SSL)", "STB_L2_PLA_1DMAX_10MIN": "STEREO Behind PLASTIC Level 2 - Dr. Antoinette Galvin (University of New Hampshire)", "STB_L2_PLA_1DMAX_1HR": "STEREO Behind PLASTIC Level 2 - Dr. Antoinette Galvin (University of New Hampshire)", "STB_L2_PLA_1DMAX_1MIN": "STEREO Behind PLASTIC Level 2 - Dr. Antoinette Galvin (University of New Hampshire)", "STB_L2_PLA_IRON_Q_2HR": "STEREO Behind PLASTIC Level 2 - Dr. Antoinette Galvin (University of New Hampshire)", "STB_LB_IMPACT": "STEREO Behind IMPACT Beacon Data - J. Luhmann (UCB/SSL)", "STB_LB_PLA_BROWSE": "STEREO Behind PLASTIC Beacon Proton Parameters [PRELIM] - Dr. Antoinette Galvin (University of New Hampshire)", "STEREO_LEVEL2_SWAVES": "STEREO WAVES (SWAVES) Radio Intensity Spectra, both Ahead and Behind s/c - M. Kaiser (NASA/GSFC)", "SUISEI_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "SX_K0_30F": "30-s averaged fluxes: 4 Instruments - Glenn Mason (JHU/APL )", "SX_K0_POF": "SAMPEX POLARCAP Averages: 4 Instruments - G.MASON (JHU/APL )", "THA_L1_STATE": "Probe state file, contains position, attitude, sun pulse data - V. Angelopoulos (UCB, NASA NAS5-02099)", "THA_L2_EFI": "Spacecraft-collected (EFI) Electric field - V. Angelopoulos, J. Bonnell & F. Mozer (UCB, NASA NAS5-02099)", "THA_L2_ESA": "THEMIS-A (P5): Electrostatic Analyzer (ESA): Electron/Ion Ground-Calculated Energy Fluxes (ions: 5 eV to 25 keV) electrons: 6 eV to 30 keV) and Moments (density, velocity, pressure, and temperature). Includes FULL, REDUCED and BURST modes. FULL: high angular resolution, low (few min) time resolution. REDUCED: degraded angular resolution, high (approx. 3 sec) time resolution. BURST: high angular resolution, high time resolution; only short bursts of data. Note that angular resolution affects moments since they are obtained integrating over the mode-specific angular distribution. - V. Angelopoulos, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THA_L2_FBK": "Probe Electric Field Instrument and Search Coil Magnetometer Instrument, Digital Fields Board- digitally computed Filter Bank spectra and E12 peak and average in HF band. - V. Angelopoulos, J. W. Bonnell & F. S. Mozer; A. Roux and R. E. Ergun (UCB; CETP and LASP respectively, NASA NAS5-02099)", "THA_L2_FFT": "THEMIS-A: On Board Fast Fourier Transform (FFT) power spectra of Electric (EFI) and Magnetic (SCM) field, for particle and wave burst survey modes. - V. Angelopoulos (UCB, NASA NAS5-02099)", "THA_L2_FGM": "Spacecraft-collected fluxgate magnetometer, Decimated TeleMetry High, DSL, GSE and GSM coordinates - V. Angelopoulos, U. Auster & K.H. Glassmeier and W. Baumjohann (UCB, TUBS and IWF respectively, NASA NAS5-02099)", "THA_L2_FIT": "THEMIS-A: On Board spin fits of Electric (EFI) and Magnetic (FGM) field. - V. Angelopoulos (UCB, NASA NAS5-02099)", "THA_L2_GMOM": "THEMIS-A: Solid State Telescope (ESA+SST): Energy Flux spectrogram: Data includes: Electron/Ion Ground-Calculated Fluxes (ions: 5 eV - 4 MeV,electrons: 6 eV - 700 keV) - V. Angelopoulos, D. Larson & R.P. Lin, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THA_L2_MOM": "THEMIS-A (P5): On Board moments: Electron/Ion moments density, flux, velocity, pressure and temperature. - V. Angelopoulos, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THA_L2_SCM": "Spacecraft-collected search-coil magnetometer (SCM) Magnetic field - V. Angelopoulos, A. Roux and O. LeContel (UCB, LPP NASA NAS5-02099)", "THA_L2_SST": "THEMIS-A: Solid State Telescope (SST): Energy Flux spectrogram: Data includes: Electron/Ion Ground-Calculated Fluxes (30 keV - 300 keV). - V. Angelopoulos, D. Larson & R.P. Lin (UCB, NASA NAS5-02099)", "THA_OR_SSC": "Orbit parameters from SSCWeb - SSCWeb (SPDF/Goddard)", "THB_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "THB_L1_STATE": "Probe state file, contains position, attitude, sun pulse data - V. Angelopoulos (UCB, NASA NAS5-02099)", "THB_L2_EFI": "Spacecraft-collected (EFI) Electric field - V. Angelopoulos, J. Bonnell & F. Mozer (UCB, NASA NAS5-02099)", "THB_L2_ESA": "THEMIS-B (P1/ARTEMIS-P1): Electrostatic Analyzer (ESA): Electron/Ion Ground-Calculated Energy Fluxes (ions: 5 eV to 25 keV) electrons: 6 eV to 30 keV) and Moments (density, velocity, pressure, and temperature). Includes FULL, REDUCED and BURST modes. FULL: high angular resolution, low (few min) time resolution. REDUCED: degraded angular resolution, high (approx. 3 sec) time resolution. BURST: high angular resolution, high time resolution; only short bursts of data. Note that angular resolution affects moments since they are obtained integrating over the mode-specific angular distribution. - V. Angelopoulos, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THB_L2_FBK": "Probe Electric Field Instrument and Search Coil Magnetometer Instrument, Digital Fields Board- digitally computed Filter Bank spectra and E12 peak and average in HF band. - V. Angelopoulos, J. W. Bonnell & F. S. Mozer; A. Roux and R. E. Ergun (UCB; CETP and LASP respectively, NASA NAS5-02099)", "THB_L2_FFT": "THEMIS-B: On Board Fast Fourier Transform (FFT) power spectra of Electric (EFI) and Magnetic (SCM) field, for particle and wave burst survey modes. - V. Angelopoulos (UCB, NASA NAS5-02099)", "THB_L2_FGM": "Spacecraft-collected fluxgate magnetometer, Decimated TeleMetry High, DSL, GSE and GSM coordinates - V. Angelopoulos, U. Auster & K.H. Glassmeier and W. Baumjohann (UCB, TUBS and IWF respectively, NASA NAS5-02099)", "THB_L2_FIT": "THEMIS-B (P1/ARTEMIS-P1): On Board spin fits of Electric (EFI) and Magnetic (FGM) field. - V. Angelopoulos (UCB, NASA NAS5-02099)", "THB_L2_GMOM": "THEMIS-B: Solid State Telescope (ESA+SST): Energy Flux spectrogram: Data includes: Electron/Ion Ground-Calculated Fluxes (ions: 5 eV - 4 MeV,electrons: 6 eV - 700 keV) - V. Angelopoulos, D. Larson & R.P. Lin, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THB_L2_MERGED": "This data set contains ARTEMIS P1(THEMIS B) plasma parameters from the Electrostatic Analyzer (ESA), magnetic field data from the FGM instrument, and geocentric and selenocentric spacecraft position data. The data are at 96s or 384s resolution. For more details see - N. Papatashvilli, J.H. King (SPDF, NASA/GSFC)", "THB_L2_MOM": "THEMIS-B (P1/ARTEMIS-P1_): On Board moments: Electron/Ion moments density, flux, velocity, pressure and temperature. - V. Angelopoulos, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THB_L2_SCM": "Spacecraft-collected search-coil magnetometer (SCM) Magnetic field - V. Angelopoulos, A. Roux and O. LeContel (UCB, LPP NASA NAS5-02099)", "THB_L2_SST": "THEMIS-B: Solid State Telescope (SST): Energy Flux spectrogram: Data includes: Electron/Ion Ground-Calculated Fluxes (30 keV - 300 keV). - V. Angelopoulos, D. Larson & R.P. Lin (UCB, NASA NAS5-02099)", "THB_OR_SSC": "Orbit parameters from SSCWeb - SSCWeb (SPDF/Goddard)", "THC_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "THC_L1_STATE": "Probe state file, contains position, attitude, sun pulse data - V. Angelopoulos (UCB, NASA NAS5-02099)", "THC_L2_EFI": "Spacecraft-collected (EFI) Electric field - V. Angelopoulos, J. Bonnell & F. Mozer (UCB, NASA NAS5-02099)", "THC_L2_ESA": "THEMIS-C (P2/ARTEMIS-P2): Electrostatic Analyzer (ESA): Electron/Ion Ground-Calculated Energy Fluxes (ions: 5 eV to 25 keV) electrons: 6 eV to 30 keV) and Moments (density, velocity, pressure, and temperature). Includes FULL, REDUCED and BURST modes. FULL: high angular resolution, low (few min) time resolution. REDUCED: degraded angular resolution, high (approx. 3 sec) time resolution. BURST: high angular resolution, high time resolution; only short bursts of data. Note that angular resolution affects moments since they are obtained integrating over the mode-specific angular distribution. - V. Angelopoulos, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THC_L2_FBK": "Probe Electric Field Instrument and Search Coil Magnetometer Instrument, Digital Fields Board- digitally computed Filter Bank spectra and E12 peak and average in HF band. - V. Angelopoulos, J. W. Bonnell & F. S. Mozer; A. Roux and R. E. Ergun (UCB; CETP and LASP respectively, NASA NAS5-02099)", "THC_L2_FFT": "THEMIS-C: On Board Fast Fourier Transform (FFT) power spectra of Electric (EFI) and Magnetic (SCM) field, for particle and wave burst survey modes. - V. Angelopoulos (UCB, NASA NAS5-02099)", "THC_L2_FGM": "Spacecraft-collected fluxgate magnetometer, Decimated TeleMetry High, DSL, GSE and GSM coordinates - V. Angelopoulos, U. Auster & K.H. Glassmeier and W. Baumjohann (UCB, TUBS and IWF respectively, NASA NAS5-02099)", "THC_L2_FIT": "THEMIS-C (P2/ARTEMIS-P2): On Board spin fits of Electric (EFI) and Magnetic (FGM) field. - V. Angelopoulos (UCB, NASA NAS5-02099)", "THC_L2_GMOM": "THEMIS-C: Solid State Telescope (ESA+SST): Energy Flux spectrogram: Data includes: Electron/Ion Ground-Calculated Fluxes (ions: 5 eV - 4 MeV,electrons: 6 eV - 700 keV) - V. Angelopoulos, D. Larson & R.P. Lin, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THC_L2_MERGED": "This data set contains ARTEMIS P2(THEMIS C) plasma parameters from the Electrostatic Analyzer (ESA), magnetic field data from the FGM instrument, and geocentric and selenocentric spacecraft position data. The data are at 96s or 384s resolution. For more details see - N. Papatashvilli, J.H. King (SPDF, NASA/GSFC)", "THC_L2_MOM": "THEMIS-C (P2/ARTEMIS-P2): On Board moments: Electron/Ion moments density, flux, velocity, pressure and temperature. - V. Angelopoulos, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THC_L2_SCM": "Spacecraft-collected search-coil magnetometer (SCM) Magnetic field - V. Angelopoulos, A. Roux and O. LeContel (UCB, LPP NASA NAS5-02099)", "THC_L2_SST": "THEMIS-C: Solid State Telescope (SST): Energy Flux spectrogram: Data includes: Electron/Ion Ground-Calculated Fluxes (30 keV - 300 keV). - V. Angelopoulos, D. Larson & R.P. Lin (UCB, NASA NAS5-02099)", "THC_OR_SSC": "Orbit parameters from SSCWeb - SSCWeb (SPDF/Goddard)", "THD_L1_STATE": "Probe state file, contains position, attitude, sun pulse data - V. Angelopoulos (UCB, NASA NAS5-02099)", "THD_L2_EFI": "Spacecraft-collected (EFI) Electric field - V. Angelopoulos, J. Bonnell & F. Mozer (UCB, NASA NAS5-02099)", "THD_L2_ESA": "THEMIS-D (P3): Electrostatic Analyzer (ESA): Electron/Ion Ground-Calculated Energy Fluxes (ions: 5 eV to 25 keV) electrons: 6 eV to 30 keV) and Moments (density, velocity, pressure, and temperature). Includes FULL, REDUCED and BURST modes. FULL: high angular resolution, low (few min) time resolution. REDUCED: degraded angular resolution, high (approx. 3 sec) time resolution. BURST: high angular resolution, high time resolution; only short bursts of data. Note that angular resolution affects moments since they are obtained integrating over the mode-specific angular distribution. - V. Angelopoulos, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THD_L2_FBK": "Probe Electric Field Instrument and Search Coil Magnetometer Instrument, Digital Fields Board- digitally computed Filter Bank spectra and E12 peak and average in HF band. - V. Angelopoulos, J. W. Bonnell & F. S. Mozer; A. Roux and R. E. Ergun (UCB; CETP and LASP respectively, NASA NAS5-02099)", "THD_L2_FFT": "THEMIS-D: On Board Fast Fourier Transform (FFT) power spectra of Electric (EFI) and Magnetic (SCM) field, for particle and wave burst survey modes. - V. Angelopoulos (UCB, NASA NAS5-02099)", "THD_L2_FGM": "Spacecraft-collected fluxgate magnetometer, Decimated TeleMetry High, DSL, GSE and GSM coordinates - V. Angelopoulos, U. Auster & K.H. Glassmeier and W. Baumjohann (UCB, TUBS and IWF respectively, NASA NAS5-02099)", "THD_L2_FIT": "THEMIS-D: On Board spin fits of Electric (EFI) and Magnetic (FGM) field. - V. Angelopoulos (UCB, NASA NAS5-02099)", "THD_L2_GMOM": "THEMIS-D: Solid State Telescope (ESA+SST): Energy Flux spectrogram: Data includes: Electron/Ion Ground-Calculated Fluxes (ions: 5 eV - 4 MeV,electrons: 6 eV - 700 keV) - V. Angelopoulos, D. Larson & R.P. Lin, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THD_L2_MOM": "THEMIS-D (P3): On Board moments: Electron/Ion moments density, flux, velocity, pressure and temperature. - V. Angelopoulos, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THD_L2_SCM": "Spacecraft-collected search-coil magnetometer (SCM) Magnetic field - V. Angelopoulos, A. Roux and O. LeContel (UCB, LPP NASA NAS5-02099)", "THD_L2_SST": "THEMIS-D: Solid State Telescope (SST): Energy Flux spectrogram: Data includes: Electron/Ion Ground-Calculated Fluxes (30 keV - 300 keV). - V. Angelopoulos, D. Larson & R.P. Lin (UCB, NASA NAS5-02099)", "THD_OR_SSC": "Orbit parameters from SSCWeb - SSCWeb (SPDF/Goddard)", "THEMIS_R0_EFI": "THEMIS A/B/C/D/E Electric Field Instrument (EFI) Waveform Level-1 Products - V. Angelopoulos (UCB, NASA NAS5-02099)", "THEMIS_R0_GIFWALK": "Links to THEMIS pre-generated MP Crossing Survey plots - David Sibeck (NASA GSFC)", "THEMIS_R0_GMAG": "THEMIS GMAG Reprocesses https://cdaweb.gsfc.nasa.gov/THEMIS_GMAG_Processing_History.doc - V. Angelopoulos (UCB, NASA NAS5-02099)", "THE_L1_STATE": "Probe state file, contains position, attitude, sun pulse data - V. Angelopoulos (UCB, NASA NAS5-02099)", "THE_L2_EFI": "Spacecraft-collected (EFI) Electric field - V. Angelopoulos, J. Bonnell & F. Mozer (UCB, NASA NAS5-02099)", "THE_L2_ESA": "THEMIS-E (P4): Electrostatic Analyzer (ESA): Electron/Ion Ground-Calculated Energy Fluxes (ions: 5 eV to 25 keV) electrons: 6 eV to 30 keV) and Moments (density, velocity, pressure, and temperature). Includes FULL, REDUCED and BURST modes. FULL: high angular resolution, low (few min) time resolution. REDUCED: degraded angular resolution, high (approx. 3 sec) time resolution. BURST: high angular resolution, high time resolution; only short bursts of data. Note that angular resolution affects moments since they are obtained integrating over the mode-specific angular distribution. - V. Angelopoulos, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THE_L2_FBK": "Probe Electric Field Instrument and Search Coil Magnetometer Instrument, Digital Fields Board- digitally computed Filter Bank spectra and E12 peak and average in HF band. - V. Angelopoulos, J. W. Bonnell & F. S. Mozer; A. Roux and R. E. Ergun (UCB; CETP and LASP respectively, NASA NAS5-02099)", "THE_L2_FFT": "THEMIS-E: On Board Fast Fourier Transform (FFT) power spectra of Electric (EFI) and Magnetic (SCM) field, for particle and wave burst survey modes. - V. Angelopoulos (UCB, NASA NAS5-02099)", "THE_L2_FGM": "Spacecraft-collected fluxgate magnetometer, Decimated TeleMetry High, DSL, GSE and GSM coordinates - V. Angelopoulos, U. Auster & K.H. Glassmeier and W. Baumjohann (UCB, TUBS and IWF respectively, NASA NAS5-02099)", "THE_L2_FIT": "THEMIS-E: On Board spin fits of Electric (EFI) and Magnetic (FGM) field. - V. Angelopoulos (UCB, NASA NAS5-02099)", "THE_L2_GMOM": "THEMIS-E: Solid State Telescope (ESA+SST): Energy Flux spectrogram: Data includes: Electron/Ion Ground-Calculated Fluxes (ions: 5 eV - 4 MeV,electrons: 6 eV - 700 keV) - V. Angelopoulos, D. Larson & R.P. Lin, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THE_L2_MOM": "THEMIS-E (P4): On Board moments: Electron/Ion moments density, flux, velocity, pressure and temperature. - V. Angelopoulos, C.W. Carlson & J. McFadden (UCB, NASA NAS5-02099)", "THE_L2_SCM": "Spacecraft-collected search-coil magnetometer (SCM) Magnetic field - V. Angelopoulos, A. Roux and O. LeContel (UCB, LPP NASA NAS5-02099)", "THE_L2_SST": "THEMIS-E: Solid State Telescope (SST): Energy Flux spectrogram: Data includes: Electron/Ion Ground-Calculated Fluxes (30 keV - 300 keV). - V. Angelopoulos, D. Larson & R.P. Lin (UCB, NASA NAS5-02099)", "THE_OR_SSC": "Orbit parameters from SSCWeb - SSCWeb (SPDF/Goddard)", "THG_L1_ASK": "Ground-based All Sky Imager (ASI), 3-sec N-S Keograms ordered by longitude, THEMIS GBO network - V. Angelopoulos, S. Mende & E. Donovan (UCB & Univ of Calgary respectively, NASA NAS5-02099)", "THG_L2_MAG_AKUL": "Higher latitude chain (Lat 60.8, Long 281.9), Ground-based Vector Magnetic Field at Akulivik, Quebec, Canada, 0.5 sec, AUTUMNX network, Canadian Space Agency GO program and Athabasca University - M. Connors and I. Schofield (Athabasca U)", "THG_L2_MAG_AMD": "Higher latitude chain (Lat 69.6, Long 60.2), Ground-based Vector Magnetic Field at Amderma, Russia, 1 min, AARI network - Oleg Troshichev (Department of Geophysics, Arctic and Antarctic Research Institute)", "THG_L2_MAG_AMER": "Lower latitude chain (Lat 38.5, Long 263.7), Ground-based Vector Magnetic Field at Americus, KS, 0.5 sec, McMaC network, supported under NSF grant ATM-0245139 - Peter Chi (UCLA)", "THG_L2_MAG_AMK": "Higher latitude chain (Lat 65.6, Long 322.4), Ground-based Vector Magnetic Field at Tasiilaq, Greenland, 60 sec, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_AND": "Higher latitude chain (Lat 69.3, Long 16.0), Ground-based Vector Magnetic Field at Andenes, Norway, 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_ARCT": "Higher latitude chain (Lat 68.1, Long 214.4), Ground-based Vector Magnetic Field at Arctic Village, AK, 1.0 sec, GIMA network - D. Hampton (Geophysical Institute, University of Alaska Fairbanks)", "THG_L2_MAG_ATHA": "Higher latitude chain (Lat 54.7, Long 246.7), Ground-based Vector Magnetic Field at Athabasca, Canada, 0.5 sec, CARISMA network - I. Mann (U Alberta)", "THG_L2_MAG_ATU": "Higher latitude chain (Lat 67.9, Long 306.4), Ground-based Vector Magnetic Field at Attu, Greenland, 20 >sec, DMI network - Hans Gleisner (DMI, Denmark)", "THG_L2_MAG_BBG": "Higher latitude chain (Lat 78.1, Long 14.2), Ground-based Vector Magnetic Field at Barentsburg, Russia. 1 min, AARI network - Oleg Troshichev (Department of Geophysics, Arctic and Antarctic Research Institute)", "THG_L2_MAG_BENN": "Lower latitude chain (Lat 41.4, Long 263.8), Ground-based Vector Magnetic Field at Bennington, NE, 0.5 sec, McMaC network, supported under NSF grant ATM-0245139 - Peter Chi (UCLA)", "THG_L2_MAG_BETT": "Higher latitude chain (Lat 66.9, Long 208.5), Ground-based Vector Magnetic Field at Bettles, AK, 1.0 sec, GIMA network - D. Hamptom (Geophysical Institute, University of Alaska Fairbanks)", "THG_L2_MAG_BFE": "Higher latitude chain (Lat 55.6, Long 11.7), Ground-based Vector Magnetic Field at Brofelde, Denmark, 1 min, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_BJN": "Higher latitude chain (Lat 74.5, Long 19.0), Ground-based Vector Magnetic Field at Bjornoya, Norway, 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_BLC": "Higher latitude chain (Lat 64.3, Long 264.0), Ground-based Vector Magnetic Field at Baker Lake, Canada, 1.0 sec, NRCan Network - David Calp (Geological Survey of Canada)", "THG_L2_MAG_BMLS": "Lower latitude chain (Lat 46.2, Long 275.7), Ground-based Vector Magnetic Field at Bay Mills, MI, 0.5 sec, THEMIS GEONS network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_BOU": "Lower latitude chain (Lat 40.1, Long 254.8), Ground-based Vector Magnetic Field at Boulder, Colorado, 1 sec, USGS Network - Carol A. Finn (United States Geological Survey, Golden, CO )", "THG_L2_MAG_BRN": "Lower latitude chain (Lat 47.8, Long 132.4), Ground-based Vector Magnetic Field at Baranov, Russia, 1 min, AARI network - Oleg Troshichev (Department of Geophysics, Arctic and Antarctic Research Institute)", "THG_L2_MAG_BRW": "Higher latitude chain (Lat 71.3, Long 203.4), Ground-based Vector Magnetic Field at Barrow, Alaska, 1.0 sec, USGS network - Carol A. Finn (United States Geological Survey, Golden, CO)", "THG_L2_MAG_BSL": "Lower latitude chain (Lat 30.4, Long 270.4), Ground-based Vector Magnetic Field at NASA , Stennis Space Center, 1 sec, USGS Network - Carol A. Finn (United States Geological Survey, Golden, CO)", "THG_L2_MAG_CBB": "Higher latitude chain (Lat 69.1, Long 255.0), Ground-based Vector Magnetic Field at Cambridge Bay, Canada, 1.0 sec, NRCan Network - David Calp (Geological Survey of Canada)", "THG_L2_MAG_CCNV": "Lower latitude chain (Lat 39.2, Long 240.2), Ground-based Vector Magnetic Field at Carson City, NV, 0.5 sec, THEMIS GEONS network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_CDRT": "Higher latitude chain (Lat 64.2, Long 283.4), Ground-based Vector Magnetic Field at Dorset, Canada, 0.5 sec, Magnetometer Array for Cusp and Cleft Studies (MACCS) - Erik S. Steinmetz (Augsburg College, steinmee@augsburg.edu)", "THG_L2_MAG_CHBG": "Higher latitude chain (Lat 49.8, Long 285.6), Ground-based Vector Magnetic Field at Chibougamau, Canada, 0.5 sec, THEMIS GBO network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_CHBR": "Higher latitude chain (Lat 64.2, Long 276.7), Ground-based Vector Magnetic Field at Coral Harbour, Canada, 0.5 sec, Magnetometer Array for Cusp and Cleft Studies (MACCS); NOTE: no data from 2013 to 2018 - Erik S. Steinmetz ((Augsburg College,steinmee@augsburg.edu))", "THG_L2_MAG_CIGO": "Higher latitude chain (Lat 64.9, Long 212.1), Ground-based Vector Magnetic Field at College, AK, 0.5 sec, GIMA network - D. Hampton (Geophysical Institute, University of Alaska Fairbanks)", "THG_L2_MAG_CMO": "Higher latitude chain (Lat 64.9, Long 212.1), Ground-based Vector Magnetic Field at Fairbanks, College, Alaska, 1.0 sec, USGS network - Carol A. Finn (United States Geological Survey, Golden, CO)", "THG_L2_MAG_CRVR": "Higher latitude chain (Lat 70.5, Long 291.4), Ground-based Vector Magnetic Field at Clyde River, Nunavut, Canada, 0.5 sec, Magnetometer Array for Cusp and Cleft Studies (MACCS) - Erik S. Steinmetz (Augsburg College)", "THG_L2_MAG_DED": "Higher latitude chain (Lat 70.4, Long 211.2), Ground-based Vector Magnetic Field at Dead Horse, Alaska, 1.0 sec, USGS network - Carol A. Finn (United States Geological Survey, Golden, CO)", "THG_L2_MAG_DIK": "Higher latitude chain (Lat 73.5, Long 80.7), Ground-based Vector Magnetic Field at Dikson, Russia, 1 min, AARI network - Oleg Troshichev (Department of Geophysics, Arctic and Antarctic Research Institute)", "THG_L2_MAG_DMH": "Higher latitude chain (Lat 76.8, Long 341.4), Ground-based Vector Magnetic Field at Danmarkshavn, Greenland, 20 sec, DMI network - Hans Gleisner (DMI, Denmark)", "THG_L2_MAG_DNB": "Higher latitude chain (Lat 74.3, Long 339.8), Ground-based Vector Magnetic Field at Daneborg, Greenland, 20 sec, DMI network - Hans Gleisner (DMI, Denmark)", "THG_L2_MAG_DOB": "Higher latitude chain (Lat 62.1, Long 9.1), Ground-based Vector Magnetic Field at Dombas, Norway, 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_DON": "Higher latitude chain (Lat 66.1, Long 12.5), Ground-based Vector Magnetic Field at Donna, Norway, 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_DRBY": "Lower latitude chain (Lat 45.0, Long 287.9), Ground-based Vector Magnetic Field at Derby, VT, 0.5 sec, THEMIS GEONS network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_EAGL": "Higher latitude chain (Lat 64.8, Long 218.8), Ground-based Vector Magnetic Field at Eagle, AK, 0.5 sec, GIMA network - D. Hampton (Geophysical Institute, University of Alaska Fairbanks)", "THG_L2_MAG_EKAT": "Higher latitude chain (Lat 64.7, Long 249.3), Ground-based Vector Magnetic Field at Ekati, Canada, 0.5 sec, THEMIS GBO network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_FCC": "Higher latitude chain (Lat 58.8, Long 265.9), Ground-based Vector Magnetic Field at Fort Churchill, Canada, 1.0 sec, NRCan Network - David Calp (Geological Survey of Canada)", "THG_L2_MAG_FHB": "Higher latitude chain (Lat 62.0, Long 310.3), Ground-based Vector Magnetic Field at Paamiut(Frederikshap), Greenland, 1 min, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_FRD": "Lower latitude chain (Lat 38.2, Long 282.6), Ground-based Vector Magnetic Field at Corbin, VA, 1 sec, USGS Network - Carol A. Finn (United States Geological Survey, Golden, CO)", "THG_L2_MAG_FRN": "Lower latitude chain (Lat 37.1, Long 240.3), Ground-based Vector Magnetic Field at Fresno, Californaia, 1 sec, USGS Network - Carol A. Finn (United States Geological Survey, Golden, CO)", "THG_L2_MAG_FSIM": "Higher latitude chain (Lat 61.8, Long 238.8), Ground-based Vector Magnetic Field at Fort Simpson, Canada, 0.5 sec, CARISMA network - I. Mann (U Alberta)", "THG_L2_MAG_FSJ": "Higher latitude chain (Lat 56.3, Long 239.2), Ground-based Vector Magnetic Field at Fort St., John, BC, Canada, 1.0 sec STEP Polar Network, available through AUTUMN network - Kanji Hayashi (U Tokyo, Japan)", "THG_L2_MAG_FSMI": "Higher latitude chain (Lat 60.0, Long 248.2), Ground-based Vector Magnetic Field at Fort Smith, Canada, 0.5 sec, CARISMA network - I. Mann (U Alberta )", "THG_L2_MAG_FTN": "Higher latitude chain (Lat 58.9, Long 237.2), Ground-based Vector Magnetic Field at Fort Nelson, BC, Canada, 1.0 sec, STEP Polar Network - Kanji Hayashi (U Tokyo, Japan)", "THG_L2_MAG_FYKN": "Higher latitude chain (Lat 66.6, Long 214.8), Ground-based Vector Magnetic Field at Fort Yukon, AK, 0.5 sec, GIMA network - D. Hampton (Geophysical Institute, University of Alaska Fairbanks)", "THG_L2_MAG_FYTS": "Lower latitude chain (Lat 46.1, Long 259.4), Ground-based Vector Magnetic Field at Fort Yates, ND, 0.5 sec, THEMIS GEONS network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_GAKO": "Higher latitude chain (Lat 62.4, Long 214.8), Ground-based Vector Magnetic Field at Gakona, AK, 1.0 sec, GIMA network - D. Hampton (Geophysical Institute, University of Alaska Fairbanks)", "THG_L2_MAG_GBAY": "Higher latitude chain (Lat 53.3, Long 299.5), Ground-based Vector Magnetic Field at Goose Bay, Canada, 0.5 sec, THEMIS GBO network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_GDH": "Higher latitude chain (Lat 69.3, Long 306.5), Ground-based Vector Magnetic Field at Qeqertarsuaq, Greenland, 1 min, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_GHB": "Higher latitude chain (Lat 64.2, Long 308.3), Ground-based Vector Magnetic Field at Nuuk(Godthap), Greenland 1 min, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_GILL": "Higher latitude chain (Lat 56.4, Long 265.3), Ground-based Vector Magnetic Field at Gillam, Canada, 0.5 sec Level-2, CARISMA network - I. Mann (U Alberta )", "THG_L2_MAG_GJOA": "Higher latitude chain (Lat 68.6, Long 264.1), Ground-based Vector Magnetic Field at Gjoa Haven, Nunavut, Canada, 0.5 sec, Magnetometer Array for Cusp and Cleft Studies (MACCS) - Erik S. Steinmetz (Augsburg College)", "THG_L2_MAG_GLYN": "Lower latitude chain (Lat 46.9, Long 263.5), Ground-based Vector Magnetic Field at Glyndon, MN, 0.5 sec, McMaC network, supported under NSF grant ATM-0245139 - Peter Chi (UCLA)", "THG_L2_MAG_GUA": "Lower latitude chain (Lat 13.6, Long 144.9), Ground-based Vector Magnetic Field at Dededo, Guam, 1 sec, USGS Network - Carol A. Finn (United States Geological Survey, Golden, CO)", "THG_L2_MAG_HAN": "Higher latitude chain (Lat 62.3, Long 26.6), Ground-based Vector Magnetic Field at Hankasalmi, Finland, 10 sec, IMAGE network - Liisa Juusola (Finnish Meteorological Institute, Helsinki, Finland)", "THG_L2_MAG_HLMS": "Higher latitude chain (Lat 61.2, Long 210.1), Ground-based Vector Magnetic Field at Anchorage, AK, 0.5 sec, GIMA network - D. Hampton (Geophysical Institute, University of Alaska Fairbanks)", "THG_L2_MAG_HOMR": "Higher latitude chain (Lat 59.7, Long 209.5), Ground-based Vector Magnetic Field at Homer, AK, 0.5 sec, GIMA network - D. Hampton (Geophysical Institute, University of Alaska Fairbanks)", "THG_L2_MAG_HON": "Lower latitude chain (Lat 21.3, Long 202.0), Ground-based Vector Magnetic Field at Ewa Beach, HI, 1 sec, USGS Network - Carol A. Finn (United States Geological Survey, Golden, CO)", "THG_L2_MAG_HOP": "Higher latitude chain (Lat 76.5, Long 25.0), Ground-based Vector Magnetic Field at Hopen, Norway 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_HOTS": "Lower latitude chain (Lat 47.6, Long 245.3), Ground-based Vector Magnetic Field at Hot Springs, MT, 0.5 sec, THEMIS GEONS network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_HOV": "Higher latitude chain (Lat 61.5, Long 353.2), Ground-based Vector Magnetic Field at Hov, Faroe Islands, Denmark, 1 min - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_HRIS": "Lower latitude chain (Lat 45.6, Long 267.0), Ground-based Vector Magnetic Field at Hrisis, Minnesota, 0.5 sec, Falcon network - Peter Chi (UCLA, USAF Academy)", "THG_L2_MAG_HRP": "Higher latitude chain (Lat 49.2, Long 275.3), Ground-based Vector Magnetic Field at Hornepayne, Ont, Canada, 1.0 sec, STEP Polar Network - Kanji Hayashi (U Tokyo, Japan)", "THG_L2_MAG_IGLO": "Higher latitude chain (Lat 69.3, Long 278.2), Ground-based Vector Magnetic Field at Igloolik, Nunavut, Canada, 0.5 sec, Magnetometer Array for Cusp and Cleft Studies (MACCS) - Erik S. Steinmetz (Augsburg College)", "THG_L2_MAG_INUK": "Higher latitude chain (Lat 58.5, Long 281.9), Ground-based Vector Magnetic Field at Inukjuak, Quebec, Canada, 0.5 sec, AUTUMNX network, Canadian Space Agency GO program and Athabasca University - M. Connors and I. Schofield (Athabasca U)", "THG_L2_MAG_INUV": "Higher latitude chain (Lat 68.4, Long 226.2), Ground-based Vector Magnetic Field at Inuvik, Canada, 0.5 sec, THEMIS GBO network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_IQA": "Higher latitude chain (Lat 63.8, Long 291.5), Ground-based Vector Magnetic Field at Iqaluit, Canada, 1.0 sec, NRCan Network - David Calp (Geological Survey of Canada)", "THG_L2_MAG_IVA": "Higher latitude chain (Lat 68.6, Long 27.3), Ground-based Vector Magnetic Field at Ivalo, Finland, 10 sec, IMAGE network - Liisa Juusola (Finnish Meteorological Institute, Helsinki, Finland)", "THG_L2_MAG_JAN": "Higher latitude chain (Lat 70.9, Long 351.3), Ground-based Vector Magnetic Field at Jan Mayen, Norway,1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_JCK": "Higher latitude chain (Lat 66.4, Long 17.0), Ground-based Vector Magnetic Field at Jackvik, Sweden, 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_KAKO": "Higher latitude chain (Lat 70.1, Long 217.4), Ground-based Vector Magnetic Field at Kaktovik, AK, 0.5 sec, GIMA network - D. Hampton (Geophysical Institute, University of Alaska Fairbanks)", "THG_L2_MAG_KAPU": "Higher latitude chain (lat 49.4, long 277.7), ground-based vector Magnetic field at Kapuskasing, Canada, 0.5 sec, THEMIS GBO network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_KAR": "Higher latitude chain (Lat 59.2, Long 5.2), Ground-based Vector Magnetic Field at Karmoy, Norway 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_KENA": "Higher latitude chain (Lat 60.6, Long 208.7), Ground-based Vector Magnetic Field at Kaktovik, AK, 1.0 sec, GIMA network - D. Hampton (Geophysical Institute, University of Alaska Fairbanks)", "THG_L2_MAG_KEV": "Higher latitude chain (Lat 69.8, Long 27.0), Ground-based Vector Magnetic Field at Kevo, Finland, 10 sec, IMAGE network - Liisa Juusola (Finnish Meteorological Institute, Helsinki, Finland)", "THG_L2_MAG_KIAN": "Higher latitude chain (Lat 67.0, Long 199.6), Ground-based Vector Magnetic Field at Kiana, AK, 0.5 sec, THEMIS GBO network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_KIL": "Higher latitude chain (Lat 69.1, Long 20.8), Ground-based Vector Magnetic Field at Kilpisjarvi, Finland, 10 sec, IMAGE network - Liisa Juusola (Finnish Meteorological Institute, Finland)", "THG_L2_MAG_KJPK": "Higher latitude chain (Lat 55.3, Long 282.2), Ground-based Vector Magnetic Field at Kuujjuarapik, Quebec, Canada, 0.5 sec, AUTUMNX network, Canadian Space Agency GO program and Athabasca University - M. Connors and I. Schofield (Athabasca U)", "THG_L2_MAG_KODK": "Higher latitude chain (Lat 57.8, Long 207.6), Ground-based Vector Magnetic Field at Kodkak, Alaska, 0.5 sec, Falcon network - Peter Chi (UCLA, USAF Academy)", "THG_L2_MAG_KUUJ": "Higher latitude chain (Lat 58.3, Long 291.8), Ground-based Vector Magnetic Field at Kuujjuaq, Canada, 0.5 sec, THEMIS GBO network - V. Angelopoulos & C.T. Russell (UCB & UCLA Respectively, NASA NAS5-02099)", "THG_L2_MAG_KUV": "Higher latitude chain (Lat 74.6, Long 302.8), Ground-based Vector Magnetic Field at Kullorsuaq, Greenland, 1 min, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_LARG": "Higher latitude chain (Lat 55.2, Long 254.7), Ground-based Vector Magnetic Field at La Ronge, Saskatchewan, Canada, 0.5 sec, AUTUMN network - V. Angelopoulos, C. T. Russell, and M. Connors (UCB, UCLA, and U Athabasca respectively, NASA NAS5-02099)", "THG_L2_MAG_LCL": "Higher latitude chain (Lat 51.0, Long 252.9), Ground-based Vector Magnetic Field at Lucky Lake, Sask, Canada, 1.0 sec, STEP Polar Network - Kanji Hayashi (U Tokyo, Japan)", "THG_L2_MAG_LETH": "Higher latitude chain (Lat 49.6, Long 247.1), Ground-based Vector Magnetic Field at Lethbridge, Alberta, Canada, 0.5 sec, AUTUMN network - V. Angelopoulos, C. T. Russell, and M. Connors (UCB, UCLA, and U Athabasca respectively, NASA NAS5-02099)", "THG_L2_MAG_LOYS": "Lower latitude chain (Lat 40.2, Long 281.6), Ground-based Vector Magnetic Field at Loysburg PA, 0.5 sec, THEMIS GEONS network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_LOZ": "Higher latitude chain (Lat 68.0, Long 35.0), Ground-based Vector Magnetic Field at Lovozero, Russia, 1 min, AARI network - Oleg Troshichev (Department of Geophysics, Arctic and Antarctic Research Institute)", "THG_L2_MAG_LREL": "Lower latitude chain (Lat 39.1, Long 283.2), Ground-based Vector Magnetic Field at Lrelel, Maryland, 0.5 sec, Falcon network - Peter Chi (UCLA, USAF Academy)", "THG_L2_MAG_LRES": "Lower latitude chain (Lat 24.8, Long 260.4), Ground-based Vector Magnetic Field at Linares, Mexico, 0.5 sec, McMac network, supported under NSF grant ATM-0245139 - Peter Chi (UCLA)", "THG_L2_MAG_LRG": "Higher latitude chain (Lat 55.2, Long 254.7), Ground-based Vector Magnetic Field at LaRonge Sask, Canada, 1.0 sec, STEP Polar Network - Kanji Hayashi (U Tokyo, Japan)", "THG_L2_MAG_LRV": "Higher latitude chain (Lat 64.2, Long 338.3), Ground-based Vector Magnetic Field at Leirvogur, Iceland, 10 second resolution data. - Gunnlaugur Bjornsson (Science Institute, University of Iceland, Reykjavik, Iceland)", "THG_L2_MAG_LYFD": "Lower latitude chain (Lat 26.4, Long 262.2), Ground-based Vector Magnetic Field at Lyford, TX, 0.5 sec, McMaC network, supported under NSF grant ATM-024513 - Peter Chi (UCLA)", "THG_L2_MAG_LYR": "Higher latitude chain (Lat 78.2, Long 15.8), Ground-based Vector Magnetic Field at Longyearbyen, Norway, 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_MAS": "Higher latitude chain (Lat 69.5, Long 23.7), Ground-based Vector Magnetic Field at Masi, Finland, 10 sec, IMAGE network - Liisa Juusola (Finnish Meteorological Institute, Helsinki, Finland)", "THG_L2_MAG_MCGR": "Higher latitude chain (Lat 63.0, Long 204.4), Ground-based Vector Magnetic Field at McGrath, AK, 0.5 sec, THEMIS GBO network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_MEA": "Higher latitude chain (Lat 54.6, Long 246.7), Ground-based Vector Magnetic Field at Meanook, Canada, 1.0 sec, NRCan Network - David Calp (Geological Survey of Canada)", "THG_L2_MAG_MEK": "Higher latitude chain (Lat 62.8, Long 31.0), Ground-based Vector Magnetic Field at Mekrijarvi, Finland, 10 sec, IMAGE network - Liisa Juusola (Finnish Meteorological Institute, Helsinki, Finland)", "THG_L2_MAG_MUO": "Higher latitude chain (Lat 68.0, Long 23.5), Ground-based Vector Magnetic Field at Muono, Finland, 10 sec, IMAGE network - Liisa Juusola (Finnish Meteorological Institute, Helsinki, Finland)", "THG_L2_MAG_NAIN": "Higher latitude chain (Lat 56.4, Long 298.3 ), Ground-based Vector Magnetic Field at Nain, Canada, 0.5 sec, Magnetometer Array for Cusp and Cleft Studies (MACCS) - Erik S. Steinmetz (Augsburg College, steinmee@augsburg.edu)", "THG_L2_MAG_NAL": "Higher latitude chain (Lat 79.0, Long 11.9), Ground-based Vector Magnetic Field at Ny Alesund, Norway, 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_NAQ": "Higher latitude chain (Lat 61.2, Long 314.6), Ground-based Vector Magnetic Field at Narsarsuaq, Greenland, 1 min, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_NEW": "Lower latitude chain (Lat 48.3, Long 242.9), Ground-based Vector Magnetic Field at Colville, National Forest, WA, 1 sec, USGS Network - Carol A. Finn (United States Geological Survey, Golden, CO)", "THG_L2_MAG_NOR": "Higher latitude chain (Lat 71.1, Long 25.8), Ground-based Vector Magnetic Field at Nordkapp, Norway, 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_NRD": "Higher latitude chain (Lat 81.6, Long 343.3), Ground-based Vector Magnetic Field at Nord, Greenland, 20 sec, DMI network - Hans Gleisner (DMI, Denmark)", "THG_L2_MAG_NRSQ": "Higher latitude chain (Lat 61.2, Long 314.6), Ground-based Vector Magnetic Field at Narsarsuaq, Greenland, 20 sec, THEMIS GBO network - Hans Gleisner (DMI, Denmark)", "THG_L2_MAG_NUR": "Higher latitude chain (Lat 60.5, Long 24.7), Ground-based Vector Magnetic Field at Nurmijarvi, Finland, 10 sec, IMAGE network - Liisa Juusola (Finnish Meteorological Institute, Helsinki, Finland)", "THG_L2_MAG_OTT": "Higher latitude chain (Lat 45.4, Long 284.4), Ground-based Vector Magnetic Field at Ottawa, Canada, 1.0 sec, NRCan Network - David Calp (Geological Survey of Canada)", "THG_L2_MAG_OUJ": "Higher latitude chain (Lat 64.5, Long 27.2), Ground-based Vector Magnetic Field at Oulujarvi, Finland, 10 sec, IMAGE network - Liisa Juusola (Finnish Meteorological Institute, Helsinki, Finland)", "THG_L2_MAG_PANG": "Higher latitude chain (Lat 66.1, Long 294.2), Ground-based Vector Magnetic Field at Pangnirtung, Nunavut, Canada, 0.5 sec, Magnetometer Array for Cusp and Cleft Studies (MACCS) - Erik S. Steinmetz (Augsburg College)", "THG_L2_MAG_PBK": "Higher latitude chain (Lat 70.1, Long 170.9), Ground-based Vector Magnetic Field at Pevek, Russia, 1 min, AARI network - Oleg Troshichev (Department of Geophysics, Arctic and Antarctic Research Institute)", "THG_L2_MAG_PBLO": "Lower latitude chain (Lat 38.3, Long 255.4), Ground-based Vector Magnetic Field at Pblolo, Colorado, 0.5 sec, Falcon network - Peter Chi (UCLA, USAF Academy)", "THG_L2_MAG_PCEL": "Lower latitude chain (Lat 35.0, Long 262.8), Ground-based Vector Magnetic Field at Purcell, OK, 0.5 sec McMaC network, supported under NSF grant ATM-0245139 - Peter Chi (UCLA)", "THG_L2_MAG_PEL": "Higher latitude chain (Lat 66.9, Long 24.1), Ground-based Vector Magnetic Field at Pello, Finland, 10 sec, IMAGE network - Liisa Juusola (Finnish Meteorological Institute, Helsinki, Finland)", "THG_L2_MAG_PG0": "Higher latitude chain (Lat -83.7, Long 88.7), Ground-based Vector Magnetic Field in Antarctica, 1-sec, raw data. Instrument deployed in Dec 2014 under NSF awards ANT0839858, ATM922979 - C. R. Clauer (Virginia Tech.)", "THG_L2_MAG_PG1": "Higher latitude chain (Lat -84.5, Long 77.2), Ground-based Vector Magnetic Field in Antarctica, 1-sec raw data. Station deployed Jan 2008 under NSF award ATM-922979 - C. R. Clauer (Virginia Tech.)", "THG_L2_MAG_PG2": "Higher latitude chain (Lat -84.4, Long 58.0), Ground-based Vector Magnetic Field in Antarctica, 1-sec raw data. Station deployed Jan 2009, redeployed Dec 2012 under NSF award PLR-1243390 and ATM-922979 - C. R. Clauer (Virginia Tech.)", "THG_L2_MAG_PG3": "Higher latitude chain (Lat -84.8, Long 37.6), Ground-based Vector Magnetic Field in Antarctica, 1-sec raw data. Station deployed Jan 2013 under NSF awards PLR-1243390 and ATM-922979 - C. R. Clauer (Virginia Tech.)", "THG_L2_MAG_PG4": "Higher latitude chain (Lat -83.3, Long 12.3), Ground-based Vector Magnetic Field in Antarctica, 1-sec raw data. Station deployed Jan 2014 under NSF awards PLR-1243390 and ATM-922979 - C. R. Clauer (Virginia Tech.)", "THG_L2_MAG_PG5": "Higher latitude chain (Lat -83.7, Long 88.7), Ground-based Vector Magnetic Field at PG5 site in Antarctica, 1-sec raw data. Instrument deployed in Jan 2016 under NSF awards ANT0839858, ATM922979 - C. R. Clauer (Virginia Tech.)", "THG_L2_MAG_PGEO": "Higher latitude chain (Lat 53.8, Long 237.2), Ground-based Vector Magnetic Field at Prince George Canada, 0.5 sec, THEMIS GBO network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_PINA": "Higher latitude chain (Lat 50.2, Long 263.9), Ground-based Vector Magnetic Field at Pinawa, Canada, 0.5 sec, CARISMA network - I. Mann (U Alberta)", "THG_L2_MAG_PINE": "Lower latitude chain (Lat 43.1, Long 257.4), Ground-based Vector Magnetic Field at Pine Ridge, SD, 0.5 sec, THEMIS GEONS network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_PKS": "Higher latitude chain (Lat 52.5, Long 252.8), Ground-based Vector Magnetic Field at Parksite Sask, Canada, 1.0 sec, STEP Polar Network - Kanji Hayashi (U Tokyo, Japan)", "THG_L2_MAG_POKR": "Higher latitude chain (Lat 65.1, Long 212.6), Ground-based Vector Magnetic Field at Poker Flat, AK, 0.5 sec, GIMA network - D. Hampton (Geophysical Institute, University of Alaska Fairbanks)", "THG_L2_MAG_PTRS": "Higher latitude chain (Lat 56.8, Long 226.8), Ground-based Vector Magnetic Field at Petersburg, AK, 0.5 sec, THEMIS GEONS network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_PUVR": "Higher latitude chain (Lat 60.1, Long 282.7), Ground-based Vector Magnetic Field at Puvirnituq, Quebec, Canada, 0.5 sec, AUTUMNX network, Canadian Space Agency GO program and Athabasca University - M. Connors and I. Schofield (Athabasca U)", "THG_L2_MAG_RADI": "Higher latitude chain (Lat 53.8, Long 282.4), Ground-based Vector Magnetic Field at Radisson, Quebec, Canada, 0.5 sec, AUTUMNX network, Canadian Space Agency GO program and Athabasca University - M. Connors and I. Schofield (Athabasca U)", "THG_L2_MAG_RAN": "Higher latitude chain (Lat 65.9, Long 26.4), Ground-based Vector Magnetic Field at Ranua, Finland, 10 sec, IMAGE network - Liisa Juusola (Finnish Meteorological Institute, Helsinki, Finland)", "THG_L2_MAG_RANK": "Higher latitude chain (Lat 62.8, Long 267.9), Ground-based Vector Magnetic Field at Rankin Inlet, Canada, 0.5 sec, CARISMA network - I. Mann (U Alberta )", "THG_L2_MAG_RBAY": "Higher latitude chain (Lat 66.5, Long 273.8), Ground-based Vector Magnetic Field at Repulse Bay, Canada, 0.5 sec, Magnetometer Array for Cusp and Cleft Studies (MACCS) - Erik S. Steinmetz (Augsburg College)", "THG_L2_MAG_REDR": "Higher latitude chain (Lat 52.1, Long 246.2), Ground-based Vector Magnetic Field at Red Deer, Alberta, Canada, 0.5 sec, AUTUMN network - V. Angelopoulos, C. T. Russell, and M. Connors (UCB, UCLA, and U Athabasca respectively, NASA NAS5-02099)", "THG_L2_MAG_RICH": "Lower latitude chain (Lat 33.0, Long 263.2), Ground-based Vector Magnetic Field at Richardson, TX, 0.5 sec, McMac network, supported under NSF grant ATM-0245139 - Peter Chi (UCLA)", "THG_L2_MAG_RMUS": "Lower latitude chain (Lat 43.6, Long 274.8), Ground-based Vector Magnetic Field at Remus, MI, 0.5 sec, THEMIS GEONS network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_ROE": "Higher latitude chain (Lat 55.2, Long 8.6), Ground-based Vector Magnetic Field at Roemoe, Denmark, 1 min, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_ROTH": "Higher latitude chain (Lat 50.9, Long 245.7), Ground-based Vector Magnetic Field at Priddis, Alberta, Canada, 0.5 sec, AUTUMN network - V. Angelopoulos, C. T. Russell, and M. Connors (UCB, UCLA, and U Athabasca respectively, NASA NAS5-02099)", "THG_L2_MAG_RVK": "Higher latitude chain (Lat 64.9, Long 11.0), Ground-based Vector Magnetic Field at Rorvik, Norway, 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_SALU": "Higher latitude chain (Lat 62.2, Long 284.3), Ground-based Vector Magnetic Field at Salluit, Quebec, Canada, 0.5 sec, AUTUMNX network, Canadian Space Agency GO program and Athabasca University - M. Connors and I. Schofield (Athabasca U)", "THG_L2_MAG_SATX": "Lower latitude chain (Lat 29.4, Long 261.4), Ground-based Vector Magnetic Field at SanAntonio, TX, 0.5 sec, McMaC network, supported under NSF grant ATM-0245139 - Peter Chi (UCLA)", "THG_L2_MAG_SCHF": "Higher latitude chain (Lat 54.8, Long 293.2), Ground-based Vector Magnetic at Schefferville, Canada, 0.5 sec, AUTUMNX network, Canadian Space Agency GO program and Athabasca University - M. Connors and I. Schofield (Athabasca U)", "THG_L2_MAG_SCO": "Higher latitude chain (Lat 70.4, Long 338.0), Ground-based Vector Magnetic Field at Ittoqqortoormiit, Greenland, 60 sec, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_SEPT": "Higher latitude chain (Lat 50.2, Long 293.7), Ground-based Vector Magnetic Field at Sept Iles, Quebec, Canada, 0.5 sec, AUTUMNX network, Canadian Space Agency GO program and Athabasca University - M. Connors and I. Schofield (Athabasca U)", "THG_L2_MAG_SHU": "Higher latitude chain (Lat 55.4, Long 199.5), Ground-based Vector Magnetic Field at Sand Point, Alaska, 1.0 sec, USGS network - Carol A. Finn (United States Geological Survey, Golden, CO)", "THG_L2_MAG_SIT": "Higher latitude chain (Lat 57.1, Long 224.7), Ground-based Vector Magnetic Field at Sitka, Alaska, 1.0 sec, USGS network - Carol A. Finn (United States Geological, Golden, CO)", "THG_L2_MAG_SJG": "Lower latitude chain (Lat 18.1, Long 293.8), Ground-based Vector Magnetic Field at Cayey, Puerto Rico, 1 sec, USGS Network - Carol A. Finn (United States Geological Survey, Golden, CO)", "THG_L2_MAG_SKT": "Higher latitude chain (Lat 65.4, Long 307.1), Ground-based Vector Magnetic Field at Maniitsoq, Greenland, 1, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_SNAP": "Higher latitude chain (Lat 63.6, Long 249.1), Ground-based Vector Magnetic Field at Snap Lake, Canada, 0.5 sec, THEMIS GBO network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_SNKQ": "Higher latitude chain (Lat 56.5, Long 280.8), Ground-based Vector Magnetic Field at Sanikiluaq, Canada, 0.5 sec, CARISMA network - I. Mann (U Alberta )", "THG_L2_MAG_SOL": "Higher latitude chain (Lat 61.1, Long 4.8), Ground-based Vector Magnetic Field at Solund, Norway 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_SOR": "Higher latitude chain (Lat 70.5, Long 22.2), Ground-based Vector Magnetic Field at Soroya Norway, 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_STF": "Higher latitude chain (Lat 67.0, Long 309.3), Ground-based Vector Magnetic Field at Kangerlussuaq, Greenland, 1 min, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_STFD": "Lower latitude chain (Lat 37.4, Long 237.8), Magnetic Field at Stanford, California, 0.5 sec, Falcon network - Peter Chi (UCLA, USAF Academy)", "THG_L2_MAG_STFL": "Higher latitude chain (Lat 48.7, Long 287.6), Ground-based Vector Magnetic Field at Saint-Felicien, Quebec, Canada, 0.5 sec, AUTUMNX network, Canadian Space Agency GO program and Athabasca University - M. Connors and I. Schofield (Athabasca U)", "THG_L2_MAG_STJ": "Higher latitude chain (Lat 47.6, Long 307.3), Ground-based Vector Magnetic Field at St.John Newfoundland, 1.0 sec, NRCan Network - David Calp (Geological Survey of Canada)", "THG_L2_MAG_SUM": "Higher latitude chain (Lat 72.3, Long 321.7), Ground-based Vector Magnetic Field at Summit, Greenland, Ice Cap, 1 min, DTU network (Previously operated by Virginia Tech) - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_SVS": "Higher latitude chain (Lat 76.0, Long 294.9), Ground-based Vector Magnetic Field at Savissivik, Greenland, 20 sec, DMI network - Hans Gleisner (DMI, Denmark)", "THG_L2_MAG_SWNO": "Lower latitude chain (Lat 44.8, Long 271.4), Ground-based Vector Magnetic Field at Shawano, WI, 0.5 sec, THEMIS GEONS network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_TAB": "Higher latitude chain (Lat 76.5, Long 291.2), Ground-based Vector Magnetic Field at Thule Air Base, Greenland, 1 min, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_TAR": "Higher latitude chain (Lat 58.3, Long 26.5), Ground-based Vector Magnetic Field at Tartu, Estonia, 10 sec, IMAGE network - Liisa Juusola (Finnish Meteorological Institute, Helsinki, Finland)", "THG_L2_MAG_TDC": "Lower latitude chain (Lat -37.1, Long 347.7), Ground-based Vector Magnetic Field at Tristan Da Cunha, 1 min, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_THL": "Higher latitude chain (Lat 77.5, Long 290.8), Ground-based Vector Magnetic Field at Qaanaaq, Greenland, 1 min, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_TIK": "Higher latitude chain (Lat 71.6, Long 128.9), Ground-based Vector Magnetic Field at Tiksi, Russia, 1 min, AARI network - Oleg Troshichev (Department of Geophysics, Arctic and Antarctic Research Institute)", "THG_L2_MAG_TOOL": "Higher latitude chain (Lat 66.6, Long 210.4), Ground-based Vector Magnetic Field at Toolik Lake, AK, 1.0 sec, GIMA network - D. Hampton (Geophysical Institute, University of Alaska Fairbanks)", "THG_L2_MAG_TPAS": "Higher latitude chain (Lat 54.0, Long 259.1), Ground-based Vector Magnetic Field at Flin Flon/The Pas, Canada, 0.5 sec, THEMIS GBO network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_TRAP": "Higher latitude chain (Lat 62.3, Long 209.8), Ground-based Vector Magnetic Field at Trapper Creek, AK, 0.5 sec, GIMA network - D. Hampton (Geophysical Institute, University of Alaska Fairbanks)", "THG_L2_MAG_TRO": "Higher latitude chain (Lat 69.7, Long 18.9), Ground-based Vector Magnetic Field at Tromso, Norway, 1 min, Norwegian auroral zone magnetometer network - Truls Lynne Hansen (Tromso Geophysical Observatory, UiT the Arctic University of Norway)", "THG_L2_MAG_TUC": "Lower latitude chain (Lat 32.2, Long 249.3), Ground-based Vector Magnetic Field at Tucson, Arizona, 1 sec, USGS Network - Carol A. Finn (United States Geological Survey, Golden, CO)", "THG_L2_MAG_UKIA": "Lower latitude chain (Lat 45.1, Long 241.1), Ground-based Vector Magnetic Field at Ukiah, OR, 0.5 sec, THEMIS GEONS network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_UMQ": "Higher latitude chain (Lat 70.7, Long 307.9), Ground-based Vector Magnetic Field at Uummannaq, Greenland, 1 min, DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_UPN": "Higher latitude chain (Lat 72.8, Long 303.8), Ground-based Vector Magnetic Field at Upernavik, Greenland, 1 min., DTU network - R. Behlke & A.N. Willer (DTU Space, Denmark)", "THG_L2_MAG_VIC": "Higher latitude chain (Lat 48.5, Long 236.6), Ground-based Vector Magnetic Field at Victoria, Canada, 1.0 sec, NRCan Network - David Calp (Geological Survey of Canada)", "THG_L2_MAG_VIZ": "Higher latitude chain (Lat 79.3, Long 76.5), Ground-based Vector Magnetic Field at Vize Island, Russia, 1 min, AARI network - Oleg Troshichev (Department of Geophysics, Arctic and Antarctic Research Institute)", "THG_L2_MAG_VLDR": "Higher latitude chain (Lat 48.2, Long 282.2), Ground-based Vector Magnetic Field at Val-d'Or, Quebec, Canada, 0.5 sec, AUTUMN network. - V. Angelopoulos, C. T. Russell, and M. Connors (UCB, UCLA, and U Athabasca respectively, NASA NAS5-02099)", "THG_L2_MAG_WHIT": "Higher latitude chain (Lat 61.0, Long 224.8), Ground-based Vector Magnetic Field at White Horse, Canada, 0.5 sec, THEMIS GBO network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_L2_MAG_WHS": "Higher latitude chain (Lat 60.7, Long 224.9), Ground-based Vector Magnetic Field at WhiteHorse YT, Canada, 1.0 sec time Resolution. - Dr. Kanji Hayashi (Step Polar Network)", "THG_L2_MAG_WLPS": "Lower latitude chain (Lat 37.9, Long 284.6), Ground-based Vector Magnetic Field at Wlpsops Island, Virginia, 0.5 sec,Falcon network - Peter Chi (UCLA, USAF Academy)", "THG_L2_MAG_WRTH": "Lower latitude chain (Lat 43.6, Long 264.4), Ground-based Vector Magnetic Field at Worthington, MN, 0.5 sec, McMaC network, supported under NSF grant ATM-0245139 - Peter Chi (UCLA)", "THG_L2_MAG_YKC": "Higher latitude chain (Lat 62.5, Long 245.5), Ground-based Vector Magnetic Field at Yellowknife, Canada, 1.0 sec, NRCan Network - David Calp (Geological Survey of Canada)", "THG_L2_MAG_YKNF": "Higher latitude chain (Lat 62.5, Long 245.7), Ground-based Vector Magnetic Field at Yellowknife, Canada, 0.5 sec, THEMIS GBO network - V. Angelopoulos & C. T. Russell (UCB & UCLA respectively, NASA NAS5-02099)", "THG_R0_ASI": "THEMIS Ground-Based All Sky Imager (ASI) Level-0 Image Data links - V. Angelopoulos (UCB, NASA NAS5-02099)", "TIMED_EDP_GUVI": "Electron Density Profiles - Andrew Christensen (Aerospace)", "TIMED_L1BV20_SABER": "IR Radiances in 10 channels (1.27 to 17ym) from 0 to 150 km, Version 1.07, - James Russell III (Hampton University)", "TIMED_L1CDISK_GUVI": "Airglow fluxes at 5 wavelengths bands - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_1216A_MERC_MOVIES": "Airglow flux 14 day movies, at wavelength 1216A in Mercator Projection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_1216A_NP_MOVIES": "Airglow flux 14 day movies, at wavelength 1216 A in North Polar Projection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_1216A_SP_MOVIES": "Airglow flux 14 day movies, at wavelength 1216 A in South Polar Projection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_1304A_MERC_MOVIES": "Airglow flux 14 day movies, at wavelength 1304A in Mercator Projection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_1304A_NP_MOVIES": "Airglow flux 14 day movies, at wavelength 1304A in North Polar Projection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_1304A_SP_MOVIES": "Airglow flux 14 day movies, at wavelength 1304A in South Polar Projection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_1356A_MERC_MOVIES": "Airglow flux 14 day movies, at wavelength 1356A in Mercator Projection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_1356A_NP_MOVIES": "Airglow flux 14 day movies, at wavelength 1356A in North Polar Pojection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_1356A_SP_MOVIES": "Airglow flux 14 day movies, at wavelength 1356A in South Polar Pojection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_LBH1_MERC_MOVIES": "Airglow flux 14 day movies, at wavelength LBH1 in Mercator Projection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_LBH1_NP_MOVIES": "Airglow flux 14 day movies, at wavelength LBH1 in North Polar Projection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_LBH1_SP_MOVIES": "Airglow flux 14 day movies, at wavelength LBH1 in South Polar Projection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_LBH2_MERC_MOVIES": "Airglow flux 14 day movies, at wavelength LBH2 in Mercator Projection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_LBH2_NP_MOVIES": "Airglow flux 14 day movies, at wavelength LBH2 in North Polar Projection - Andrew Christensen (Aerospace)", "TIMED_L1CDISK_GUVI_LBH2_SP_MOVIES": "Airglow flux 14 day movies, at wavelength LBH2 in South Polar Projection - Andrew Christensen (Aerospace)", "TIMED_L2AV207_SABER": "O3, CO2, H2O Mixing Ratios and O, O2, OH, NO Volume Emission Rates, also NMC Neutral Temp., Density, and Pressure, Version 2.0, - James Russell III (Hampton University)", "TIMED_L3A_SEE": "Solar irradiances 0.1 - 194 nm, Version 11 - Tom Woods (LASP/CU)", "TIMED_WINDVECTORSNCAR_TIDI": "Zonal and meridional winds at 60 to 180 km, version 0307, - Timothy Killeen (NCAR)", "TOOWINDY_E_NE": "Electron density and electric field measurements during the rocket flight. - D. Hysell (Cornell University)", "TSS-1R_M1_CSAA": "TSS-1R, Shuttle Attitude Data IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_CSAB": "TSS-1R, Orbiter and Target State Vectors IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_CSCA": "TSS-1R, Computed OA Data Values IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_CSCB": "TSS-1R, Special Computation Events IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_CSEA": "TSS-1R, Temperature, Voltage, and Current Measurements IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_CSEB": "TSS-1R, Supply and Waste Water Quantities IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_CSMA": "TSS-1R, KU-Band Communications/RADAR Roll and Pitch Monitors IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_CSMB": "TSS-1R, KU-Band Communications/RADAR Power and Range Monitors IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_CSSA": "TSS-1R, FCP, Water and Waste Dump, FES, and Power Status IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_CSSB": "TSS-1R, KU-BAND Communications/RADAR and Recorder Operation Status IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_CSSC": "TSS-1R, RCS/Vernier Jets-Impulse/Exhaust Gases Status IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_CSTA": "TSS-1R, GMT and MET Data IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_DBPO": "TSS-1R, Boom Tip Position (DBPO) IDFS format - Jean Sabbagh (ASI)", "TSS-1R_M1_DBSA": "TSS-1R, Boom, DPY/RTR, and JTS Status Data (DBSA) IDFS format - Jean Sabbagh (ASI)", "TSS-1R_M1_DBSB": "TSS-1R, Boom Stowed Status, DPY/RTR Status, and JTR Fire Status IDFS format - Jean Sabbagh (ASI)", "TSS-1R_M1_DBSC": "TSS-1R, DPY/RTR and JTR Power Status IDFS format - Jean Sabbagh (ASI)", "TSS-1R_M1_DBTA": "TSS-1R, Boom Temperature Monitors (DBTA) IDFS format - Jean Sabbagh (ASI)", "TSS-1R_M1_DCDV": "TSS-1R, DV Voltage and DVG Pressure Measurements IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_DCGA": "TSS-1R, Electron Gun Current Monitors (DCGA) IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_DCGB": "TSS-1R, Electron Gun Tether Current Offset Measurements IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_DCGC": "TSS-1R, Electron Filament Voltage And Acceleration Potentials IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_DCMA": "TSS-1R, General Monitor Measurements IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_DCMB": "TSS-1R, Memory Dump Data IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_DCMC": "TSS-1R, EGA Filament and Tether Current Cycle Data IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_DCMD": "TSS-1R, DCORE Format Counter and Dump Data IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_DCME": "TSS-1R, Applicative Programs Data IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_DCSA": "TSS-1R, General High Rate Status Measurements IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_DCSB": "TSS-1R, General Status Measurements IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_DCTA": "TSS-1R, Temperature Measurements IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_DPHA": "TSS-1R, 16/major Frame Miscellaneous Housekeeping Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPHB": "TSS-1R, SFMSD Command Word Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPHC": "TSS-1R, Rotating Memeory Dump Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPHD": "TSS-1R, Segment Information IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPHE": "TSS-1R, Time Stamp Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPMA": "TSS-1R, CP Tether Tensions IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPMB": "TSS-1R, Low Rate Tether Information IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPMC": "TSS-1R, 16 bit Measured Tether Lengths and Rates IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPMD": "TSS-1R, Tether Rate Raw Timer Counts IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPME": "TSS-1R, Miscellaneous Tether Measurements IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPMF": "TSS-1R, Voltage, Current, and Tether Tension Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPMG": "TSS-1R, Tether Length IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPMH": "TSS-1R, Tether Velocity IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPMI": "TSS-1R, Tether Length Raw Encoder Counts IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPMJ": "TSS-1R, DEL-L Measurements IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPMK": "TSS-1R, Reel Motor Command Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPSA": "TSS-1R, Boom Status Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPSC": "TSS-1R, Power and ADC Voltage Status Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPSD": "TSS-1R, Latch Status Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPSE": "TSS-1R, U1 and U2 Status Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPSF": "TSS-1R, L-DOT, DEL-L, and Talkback Status Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPSG": "TSS-1R, 1/major Frame Miscellaneous Status Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPSH": "TSS-1R, 16/major Frame Miscellaneous Status Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPSI": "TSS-1R, Maneuver Status Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPSJ": "TSS-1R, Miscellaneous Relay Status Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPTA": "TSS-1R, Reel And Boom Temperature Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_DPTB": "TSS-1R, Temperature Data IDFS format - Ron Geiger (Martin Marietta Astronautics)", "TSS-1R_M1_EPMA": "TSS-1R, Temperature, Voltage, Current, and Freon Data IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_EPMB": "TSS-1R, Output Command Block and Variable Data Block IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_EPMC": "TSS-1R, SFMDM Last Command Accepted Buffer IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_EPMF": "TSS-1R, Timeline Data IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_EPMG": "TSS-1R, DDCS and SFMDM Miscellaneous Data IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_EPMH": "TSS-1R, SFMDM RS-422 And IO Transfer Data IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_EPSA": "TSS-1R, EMP Satellite and Deployer Status Data IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_EPSB": "TSS-1R, EMP SFMDM General Status Data IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_EPSC": "TSS-1R, EMP SFMDM D05 and D28 LEV and PUL Status Data IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_EPSD": "TSS-1R, SDIO Channel Status Data IDFS format - Tony Lavoie (Marshall Space Flight Center)", "TSS-1R_M1_RPBB": "TSS-1R, Boom Biasing Current and Voltage IDFS format - Dr. J. David Winningham (Southwest Research Institute)", "TSS-1R_M1_RPDM": "TSS-1R, DIFP Peak Monitor Data (RPDM) IDFS format - Dr. Nobie Stone (Marshall Space Flight Center)", "TSS-1R_M1_RPDP": "TSS-1R, DIFP Deflection and Retard Data (RPDP) IDFS format - Dr. Nobie Stone (Marshall Space Flight Center)", "TSS-1R_M1_RPEA": "TSS-1R, Satellite Mounted Electron Sensors (RPEA) IDFS format - Dr. J. David Winningham (Southwest Research Institute)", "TSS-1R_M1_RPEB": "TSS-1R, Boom Mounted Electron Sensors IDFS format - Dr. J. David Winningham (Southwest Research Institute)", "TSS-1R_M1_RPEM": "TSS-1R, DIFP Electrometer Data IDFS format - Dr. Nobie Stone (Marshall Space Flight Center)", "TSS-1R_M1_RPHA": "TSS-1R, DIFP Miscellaneous Housekeeping (RPHA) IDFS format - Dr. Nobie Stone (Marshall Space Flight Center)", "TSS-1R_M1_RPHB": "TSS-1R, DIFP A/D Voltage And Current Monitors IDFS format - Dr. Nobie Stone (Marshall Space Flight Center)", "TSS-1R_M1_RPHC": "TSS-1R, SPES Voltage And Current Monitors (RPHC) IDFS format - Dr. J. David Winningham (Southwest Research Institute)", "TSS-1R_M1_RPHD": "TSS-1R, SPES Grid Voltages (RPHD) IDFS format - Dr. J. David Winningham (Southwest Research Institute)", "TSS-1R_M1_RPHE": "TSS-1R, ROPE CEP and FS Voltage And Temperature Monitors (RPHE) IDFS format - Dr. J. David Winningham (Southwest Research Institute)", "TSS-1R_M1_RPHF": "TSS-1R, Satellite Programmable Power Supply Monitors (RPHF) IDFS format - Dr. J. David Winningham (Southwest Research Institute)", "TSS-1R_M1_RPHG": "TSS-1R, Floating Power Supply Current (RPHG) IDFS format - Dr. Nobie Stone (Marshall Space Flight Center)", "TSS-1R_M1_RPIA": "TSS-1R, Satellite Mounted Ion Sensor IDFS format - Dr. J. David Winningham (Southwest Research Institute)", "TSS-1R_M1_RPIB": "TSS-1R, Boom Mounted Ion Sensors (RPIB) IDFS format - Dr. J. David Winningham (Southwest Research Institute)", "TSS-1R_M1_RPSA": "TSS-1R, SPES Grid Bias And HVU 1/2 Status (RPSA) IDFS format - Dr. J. David Winningham (Southwest Research Institute)", "TSS-1R_M1_RPSB": "TSS-1R, ROPE Command Status Words (RPSB) IDFS format - Dr. Nobie Stone (Marshall Space Flight Center)", "TSS-1R_M1_RPSC": "TSS-1R, Floating Supply Discrete Status Values (RPSC) IDFS format - Dr. Nobie Stone (Marshall Space Flight Center)", "TSS-1R_M1_RPSD": "TSS-1R, DIFP RAM Test Data (RPSD) IDFS format - Dr. Nobie Stone (Marshall Space Flight Center)", "TSS-1R_M1_RTEF": "TSS-1R, Langmuir Probe DC Electric Field Data IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTHF": "TSS-1R, High Frequency Electromagnetic Wave Data IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTIP": "TSS-1R, Ion Probe Data IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTKA": "TSS-1R, AC Housekeeping measurements IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTKC": "TSS-1R, Error table measurements IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTKD": "TSS-1R, Telecommand Echo IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTKE": "TSS-1R, Pentode Current And DCBP Voltage IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTKF": "TSS-1R, RETE Format Data IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTKG": "TSS-1R, LF RETE Format Data IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTKH": "TSS-1R, MF RETE Format Data IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTKI": "TSS-1R, HF RETE Format Data IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTLA": "TSS-1R, Low Frequency Electromagnetic Wave Data (Band A) IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTLB": "TSS-1R, Low Frequency Electromagnetic Wave Data (Band B) IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTMC": "TSS-1R, Medium Frequency Electromagnetic Wave Data (Band C) IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTMD": "TSS-1R, Medium Frequency Electromagnetic Wave Data (Band D) IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTME": "TSS-1R, Medium Frequency Electromagnetic Wave Data (Band E) IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTMF": "TSS-1R, Medium Frequency Electromagnetic Wave Data (Band F) IDFS format - Dr. Marino Dobrowolny (Instituto Di Fisica Dello Spazio Interplanetario)", "TSS-1R_M1_RTRLP": "TSS-1R, Reduced Langmuir Probe Data IDFS format - J-P. Lebreton (ESA/ESTEC, Solar System Division)", "TSS-1R_M1_SCAC": "TSS-1R, SLA vector coarse acceleration (SCAC) IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_SCAF": "TSS-1R, SLA High Res Vector Acceleration Measurements (SCAF) IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_SCMA": "TSS-1R, SLA Temperature and Voltage Monitors IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_SCMB": "TSS-1R, SA Temperature and Overtemperature Monitors (SCMB) IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_SCMC": "TSS-1R, Satellite Ampmeter Current Monitors (SCMC) IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_SCSA": "TSS-1R, Low time resolution experiment status flags (SCSA) IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_SCSB": "TSS-1R, High time resolution experiment status flags (SCSB) IDFS format - Carlo Bonifazi (ASI)", "TSS-1R_M1_SHAA": "TSS-1R, Yaw, Roll and Pitch Data IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHAB": "TSS-1R, Scaled Roll, Yaw and Pitch Data (SHAB) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHAC": "TSS-1R, Gyro Rate and Sun Presence IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHAD": "TSS-1R, Gyro Angular Data (SHAD) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHAE": "TSS-1R, Gyro and Attitude Data IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHAF": "TSS-1R, Satellite Spin Rate (SAHF) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHAG": "TSS-1R, Gyro and Attitude Angular Data IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHHA": "TSS-1R, Miscellaneous Housekeeping Data IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHHB": "TSS-1R, 24 Bit Battery Current and Power Moniters (SHHB) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHHC": "TSS-1R, Miscellaneous Timing Data (SHHC) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHHD": "TSS-1R, Various 64/major frame 8 bit Housekeeping Data (SHHD) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHHE": "TSS-1R, Low time resolution 3 bit satellite monitors (SHHE) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHHF": "TSS-1R, Satellite RX Coherent AGC and Loop Stress Data IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHMA": "TSS-1R, Onboard Data Handling RSMN Data (SHMA) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHMB": "TSS-1R, Onboard Data Handling ASMN Data IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHMC": "TSS-1R, Memory Dump And TLC Data (SHMC) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHMD": "TSS-1R, OBDH And AMCS Status Flags IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHME": "TSS-1R, OBDH and AMCS Data IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHPA": "TSS-1R, Satellite miscellaneous power monitors IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHSA": "TSS-1R, Low resolution gyro status flags (SHSA) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHSB": "TSS-1R, Gyro converter, heating and wheel status data (SHSB) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHSC": "TSS-1R, Low resolution FDS3/FDS4 status flags (SHSC) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHSD": "TSS-1R, Satellite Program Status Flags IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHSE": "TSS-1R, Medium resolution miscellaneous status flags (SHSE) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHSF": "TSS-1R, Satellite medium resolution status data (SHSF) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHSG": "TSS-1R, Satellite slow status data IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHSH": "TSS-1R, Satellite high time resolution status data (SHSH) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHSI": "TSS-1R, Satellite miscellaneous power status data IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHSJ": "TSS-1R, Alpha, Beta, and FDS1/FDS2 status data (SHSJ) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHSK": "TSS-1R, Satellite Thruster Status Data IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHTA": "TSS-1R, Gyro and Earth Sensor Temperatures IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHTB": "TSS-1R, Satellite temperatures IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SHTC": "TSS-1R, Satellite temperatures and pressures (SHTC) IDFS format - G. Oelker (Alenia Spazio S.p.A.)", "TSS-1R_M1_SPBA": "TSS-1R, Space Beam Data IDFS format - Dr Dave Hardy (GL/PHE)", "TSS-1R_M1_SPEA": "TSS-1R, Selected Electron Spectra From Spectrometer A IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPEB": "TSS-1R, Selected Electron Spectra From Spectrometer B IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPEC": "TSS-1R, Electron Spectra From Spectrometer A IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPED": "TSS-1R, Electron Spectra From Spectrometer B IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPFA": "TSS-1R, ESA A, High Frequency Electron Auto-Corellation Spectra IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPFB": "TSS-1R, ESA B, High Frequency Electron Auto-Corellation Spectra IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPHA": "TSS-1R, Subcommutated Housekeeping Measureents IDFS format - Dr Dave Hardy (GL/PHE)", "TSS-1R_M1_SPHB": "TSS-1R, FDR Housekeeping Measurements IDFS format - Dr Dave Hardy (GL/PHE)", "TSS-1R_M1_SPHC": "TSS-1R, FDR Tape Counters IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPHD": "TSS-1R, Space Counter Data IDFS format - Dr Dave Hardy (GL/PHE)", "TSS-1R_M1_SPHE": "TSS-1R, Uplink Command Echo IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPIA": "TSS-1R, Zone Summed Ion Spectra From Spectrometer A IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPIB": "TSS-1R, Zone Summed Ion Spectra From Spectrometer B IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPIC": "TSS-1R, Selected Ion Spectra From Spectrometer A IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPID": "TSS-1R, Selected Ion Spectra From Spectrometer B IDFS format - Capt. Marilyn R. Oberhardt (GL/PHE)", "TSS-1R_M1_SPIE": "TSS-1R, Ion Spectra From Spectrometer A IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPIF": "TSS-1R, Ion Spectra From Spectrometer B IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPLA": "TSS-1R, Spectrometer A, Low Frequency Ion Auto-Corellation Spectra IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPLB": "TSS-1R, ESA A, Low Frequency Electron Auto-Corellation Spectra IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPLC": "TSS-1R, Spectrometer B, Low Frequency Ion Auto-Corellation Spectra IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPLD": "TSS-1R, ESA B, Low Frequency Electron Auto-Corellation Spectra IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPMF": "TSS-1R, Magnetic Field Data IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPOP": "TSS-1R, Orbiter Potential Data IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPSA": "TSS-1R, SPACE Status And Flow Monitor Data IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPSB": "TSS-1R, DPU and FDR Sense Key Status Data IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPSC": "TSS-1R, FDR Tape Status IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_SPSD": "TSS-1R, DCORE and SETS Gun Status IDFS format - Dr. Dave Hardy (GL/PHE)", "TSS-1R_M1_STAA": "TSS-1R, Magnetic Field IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STCA": "TSS-1R, Current and Charge Probe, Peak Monitors IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STCB": "TSS-1R, Direct Current and Charge Probe Monitors IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STCC": "TSS-1R, CCP Status Data IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STCD": "TSS-1R, SETS CCP Monitor Data IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STDA": "TSS-1R, DEP and Timing Information IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STDB": "TSS-1R, DEP Operation Timing Information IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STDC": "TSS-1R, DEP: CPU, GMT and Multibus Time IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STFA": "TSS-1R, SETS FPEG Monitors IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STFB": "TSS-1R, FPEG Status Data IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STMA": "TSS-1R, SRPA, SPIB and AMAG Power Status Data IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STMB": "TSS-1R, SETS AMAG And SPIB Monitors IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STSA": "TSS-1R, Langmuir Probe IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STSB": "TSS-1R, Spherical Retarding Potential Analyzer IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STSC": "TSS-1R, SETS SRPA Monitors IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STTA": "TSS-1R, TCVM Tether Current Monitor IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STTB": "TSS-1R, Tether Voltage Monitor IDFS format - Brian Gilchrist (Unversity of Michigan)", "TSS-1R_M1_STTC": "TSS-1R, SETS TCVM Monitor Data IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_STTD": "TSS-1R, TCVM Relay Status Data IDFS format - Ivan Linscott (Stanford University)", "TSS-1R_M1_TMHA": "TSS-1R, Housekeeping Data (TMHA) IDFS format - Dr. Franco Mariani (University of Vergata, Departmento Fisica)", "TSS-1R_M1_TMHB": "TSS-1R, Telecommand Echo And Checksum (TMHB) IDFS format - Dr. Franco Mariani (University of Vergata, Departmento Fisica)", "TSS-1R_M1_TMMI": "TSS-1R, Satellite Inboard Magnetometer Data (TMMI) IDFS format - Dr. Franco Mariani (University of Vergata, Departmento Fisica)", "TSS-1R_M1_TMMO": "TSS-1R, Satellite Outboard Magnetometer Data (TMMO) IDFS format - Dr. Franco Mariani (University of Vergata, Departmento Fisica)", "TSS-1R_M1_TMTA": "TSS-1R, Tether Current (TMTA) IDFS format - Dr. Franco Mariani (University of Vergata, Departmento Fisica)", "TSS-1R_R0_CAS": "CAS (Shuttle Ancillary System) Data Sets Follow: ", "TSS-1R_R0_DCORE": "DCORE (Deployer Core Equipment) Data Sets Follow: ", "TSS-1R_R0_DPLY": "DPLY (Deployer Miscellaneous Housekeeping) Data Sets Follow: ", "TSS-1R_R0_DRB": "DRB (Deployable-Retrievable Boom) Data Sets Follow: ", "TSS-1R_R0_EMP": "EMP (End Mass Payload) Data Sets Follow: ", "TSS-1R_R0_RETE": "RETE ( Research on Electrodynamic Tether Effects) Data Sets Follow: ", "TSS-1R_R0_ROPE": "ROPE (Research on Orbital Plasma Electrodynamics) Data Sets Follow:", "TSS-1R_R0_SAHK": "SAHK (Spacecraft Housekeeping) Data Sets Follow: ", "TSS-1R_R0_SCORE": "SCORE (Satellite Core Equipment) Data Sets Follow: ", "TSS-1R_R0_SETS": "SETS (Shuttle Electrodynamic Tether System) Data Sets Follow: ", "TSS-1R_R0_SPREE": "SPREE (Shuttle Potential and Return Electron Experiment) Data Sets Follow: ", "TSS-1R_R0_TEMAG": "TEMAG (Magnetic Field Experiment to TSS Mission) Data Sets Follow: ", "TWINS1_AT_DEF": "TWINS1 - Spacecraft Attitude - D. McComas (Southwest Research Institute)", "TWINS1_HK_1SEC": "TWINS Spacecraft 1 - housekeeping - D. McComas & H. Fahr (SwRI & U. Bonn, respectively.)", "TWINS1_L1_IMAGER": "TWINS Spacecraft 1 - Neutral-atom Spectrometer Level-1 Magnetospheric Images and Image Movies at Full (9 Energy Steps and 15 minute) Resolution - D. McComas (Southwest Research Institute)", "TWINS1_L1_LAD": "TWINS Spacecraft 1 - Lyman Alpha Detector Level-1 Geocorona Data - D. McComas & H. Fahr (SwRI & U. Bonn, respectively.)", "TWINS1_OR_DEF": "TWINS1 - Spacecraft Ephemeris - D. McComas (Southwest Research Institute)", "TWINS1_TISTORM_IMAGER": "Images of plasma sheet ion temperature during storms calculated from ENA measurements - Amy Keesee (West Virginia University)", "TWINS2_AT_DEF": "TWINS2 - Spacecraft Attitude - D. McComas (Southwest Research Institute)", "TWINS2_HK_1SEC": "TWINS Spacecraft 2 - housekeeping - D. McComas & H. Fahr (SwRI & U. Bonn, respectively.)", "TWINS2_L1_IMAGER": "TWINS Spacecraft 2 - Neutral-atom Spectrometer Level-1 Magnetospheric Images and Image Movies at Full (9 Energy Steps and 15 minute) Resolution - D. McComas (Southwest Research Institute)", "TWINS2_L1_LAD": "TWINS Spacecraft 2 - Lyman Alpha Detector Level-1 Geocorona Data - D. McComas & H. Fahr (SwRI & U. Bonn, respectively)", "TWINS2_OR_DEF": "TWINS2 - Spacecraft Ephemeris - D. McComas (Southwest Research Institute)", "TWINS2_TISTORM_IMAGER": "Images of plasma sheet ion temperature during storms calculated from ENA measurements - Amy Keesee (West Virginia University)", "TWINS_M2_ENA": "Images of plasma sheet ion temperature during storms calculated from ENA measurements - R. M. Katus (Eastern Michigan University)", "ULYSSES_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "URANUS_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "UY_1MIN_VHM": "Ulysses VHM 1 minute. - A. Balogh (Imperial College, London, UK)", "UY_1SEC_VHM": "Ulysses VHM 1 second. - A. Balogh (Imperial College, London, UK)", "UY_ALPHA-DISTRIBUTIONS_SWOOPS": "Distribution function of alpha particles - David. J. McComas (Princeton/PPPL)", "UY_ALPHA-FIT-PARAMETERS_SWOOPS": "Fitting parameters to the distribution function of alphas. - David. J. McComas (Princeton/PPPL)", "UY_ALPHA-MOMENTS_SWOOPS": "Moments of the distribution function of alpha particles - David. J. McComas (Princeton/PPPL)", "UY_COHO1HR_MERGED_MAG_PLASMA": "Ulysses merged hourly magnetic field, plasma, proton fluxes, and ephermis data - Dr. A. Balogh (magnetic field), Dr. John L. Phillips (plasma) (Imperial College, London, UK, )", "UY_H0_GLG": "Ulysses/SWICS full resolution matrix rate data - G. Gloeckler, J. Geiss (Department of Physics, University of Maryland, College Park, Maryland, USA; )", "UY_M0_AT1": "Ulysses AT Tel 1 10 minute average. - R. McKibben (University of Chicago, USA)", "UY_M0_AT2": "Ulysses AT Tel 2 10 minute average. - R. McKibben (University of Chicago, USA)", "UY_M0_BAE": "Ulysses BAE 3-22 minute resolution. - D McComas (Southwest Research Institute, USA)", "UY_M0_BAI": "Ulysses BAI 4-8 minute average. - D McComas (Southwest Research Institute, USA)", "UY_M0_GRB": "Ulysses GRB 5 minute average. - K Hurley (University of California, Berkeley, USA)", "UY_M0_HET": "Ulysses HET 10 minute average. - R. McKibben (University of Chicago, USA)", "UY_M0_HFT": "Ulysses HFT 10 minute average. - R. McKibben (University of Chicago, USA)", "UY_M0_KET": "Ulysses KET 10 minute average. - R. McKibben (University of Chicago, USA)", "UY_M0_LET": "Ulysses LET 10 minute average. - R. McKibben (University of Chicago, USA)", "UY_M0_PFRA": "Ulysses PFRA 10 minute average data. - R MacDowall (NASA Goddard Spaceflight Center)", "UY_M0_PFRP": "Ulysses PFRP 10 minute peak data. - R MacDowall (NASA Goddard Spaceflight Center)", "UY_M0_R144": "Ulysses R144 144 second resolution. - R MacDowall (NASA Goddard Spaceflight Center)", "UY_M0_RARA": "Ulysses RARA 10 minute average. - R MacDowall (NASA Goddard Spaceflight Center)", "UY_M0_RARP": "Ulysses RARP 10 minute average. - R MacDowall (NASA Goddard Spaceflight Center)", "UY_M0_WFBA": "Ulysses WFBA 10 minute average. - R MacDowall (NASA Goddard Spaceflight Center)", "UY_M0_WFBP": "Ulysses WFBP 10 minute average. - R MacDowall (NASA Goddard Spaceflight Center)", "UY_M0_WFEA": "Ulysses WFEA 10 minute average. - R MacDowall (NASA Goddard Spaceflight Center)", "UY_M0_WFEP": "Ulysses WFEP 10 minute average. - R MacDowall (NASA Goddard Spaceflight Center)", "UY_M1_BAI": "Ulysses BAI 1 hour average. - D McComas (Southwest Research Institute, USA)", "UY_M1_EPA": "Ulysses EPAC 1 hour average. - E Keppler (Max Planck Institut fur Aeronomie, )", "UY_M1_LF15": "Ulysses HI-SCALE LEFS150 (LF15) 1 hour average. - L. Lanzerotti (Bell Laboratories, USA)", "UY_M1_LF60": "Ulysses HI-SCALE LEFS60 (LF60) 1 hour average. - L. Lanzerotti (Bell Laboratories, USA)", "UY_M1_LM12": "Ulysses HI-SCALE LEMS120 (LM12) 1 hour average. - L. Lanzerotti (Bell Laboratories, USA)", "UY_M1_LM30": "Ulysses HI-SCALE LEMS30 (LM30) 1 hour average. - L. Lanzerotti (Bell Laboratories, USA)", "UY_M1_LMDE": "Ulysses HI-SCALE LEMSDE (LMDE) 1 hour average. - L. Lanzerotti (Bell Laboratories, USA)", "UY_M1_SCS": "Ulysses SWI 3.5 hour average. - J Geiss, G Gloeckler (International Space Science Institute, )", "UY_M1_SWI": "Ulysses SWI 3.5 hour average. - J Geiss, G Gloeckler (International Space Science Institute, )", "UY_M1_VHM": "Ulysses VHM 1 hour average. - A. Balogh (Imperial College, London, UK)", "UY_M1_WART": "Ulysses HI-SCALE WART 1 hour average. - L. Lanzerotti (Bell Laboratories, USA)", "UY_M1_WRTD": "Ulysses HI-SCALE WARTD (WRTD) 1 hour average. - L. Lanzerotti (Bell Laboratories, USA)", "UY_PROTON-DISTRIBUTIONS_SWOOPS": "Distribution function of protons - David. J. McComas (Princeton/PPPL)", "UY_PROTON-FIT-PARAMETERS_SWOOPS": "Fitting parameters of the distribution function of protons. - David. J. McComas (Princeton/PPPL)", "UY_PROTON-MOMENTS_SWOOPS": "Moments of the distribution function of protons - David. J. McComas (Princeton/PPPL)", "VENUS_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "VG1_PWS_LR": "Lowrate Plasma Waves Instrument - Bill Kurth (University of Iowa)", "VG1_PWS_WF": "Voyager 1, Plasma Waves Science, Wideband Electric Waveforms - W. Kurth (University Iowa)", "VG2_PWS_LR": "Lowrate Plasma Waves Instrument - Bill Kurth (University of Iowa)", "VG2_PWS_WF": "Voyager 2, Plasma Waves Science, Wideband Electric Waveforms - W. Kurth (University Iowa)", "VOYAGER1_10S_MAG": "9.6 Second Averaged Interplanetary Magnetic Field - Norman F. Ness (Bartol Research Institute)", "VOYAGER1_2S_MAG": "1.92 Second Averaged Interplanetary Magnetic Field - Norman F. Ness (Bartol Research Institute)", "VOYAGER1_48S_MAG": "48 Second Averaged Interplanetary Magnetic Field - Norman F. Ness (Bartol Research Institute)", "VOYAGER1_48S_MAG-VIM": "Voyager1 Magnetic field VIM - Len Burlaga (NASA/GSFC)", "VOYAGER1_COHO1HR_MERGED_MAG_PLASMA": "Merged hourly magnetic field, plasma, proton fluxes, and ephemeris data - Norman F. Ness (Bartol Research Institute)", "VOYAGER1_CRS_DAILY_FLUX": "Voyager-1 CRS Daily Averaged Flux - E. C. Stone (California Institute of Technology)", "VOYAGER1_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "VOYAGER1_PLS_COMPOSITION": "Voyager-1, VIPER-Fit Plasma Ion Composition near Jupiter - Dr. John D. Richardson (MIT Kavli Institute)", "VOYAGER1_PLS_ELECTRONS_E1": "Voyager-1, Jupiter Low-Energy Electron Current Spectra - Dr. John D. Richardson (MIT Kavli Institute)", "VOYAGER1_PLS_ELECTRONS_E2": "Voyager-1, Jupiter High-Energy Electron Current Spectra - Dr. John D. Richardson (MIT Kavli Institute)", "VOYAGER1_PLS_HIRES_PLASMA_DATA": "HiRes plasma data - John D. Richardson (Kavli Institute for Astrophysics and Space Research, Massachusetts Institute of Technology.)", "VOYAGER1_PLS_IONS_L": "Voyager-1, Jupiter Low-Resolution Ion Current Spectra - Dr. John D. Richardson (MIT Kavli Institute)", "VOYAGER1_PLS_IONS_M": "Voyager-1, Jupiter High-Resolution Ion Current Spectra - Dr. John D. Richardson (MIT Kavli Institute)", "VOYAGER2_10S_MAG": "9.6 Second Averaged Interplanetary Magnetic Field - Norman F. Ness (Bartol Research Institute)", "VOYAGER2_2S_MAG": "1.92 Second Averaged Interplanetary Magnetic Field - Norman F. Ness (Bartol Research Institute)", "VOYAGER2_48S_MAG": "48 Second Averaged Interplanetary Magnetic Field - Norman F. Ness (Bartol Research Institute)", "VOYAGER2_48S_MAG-VIM": "Voyager2 Magnetic field VIM - Len Burlaga (NASA/GSFC)", "VOYAGER2_COHO1HR_MERGED_MAG_PLASMA": "Voyager-2 merged hourly magnetic field, plasma, proton fluxes, and ephemeris data - N. Ness (MAG) and J. Richardson (PLS) (Bartol, MIT)", "VOYAGER2_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "VOYAGER2_PLS_COMPOSITION": "Voyager-2, VIPER-Fit Plasma Ion Composition near Jupiter - Dr. John D. Richardson (MIT Kavli Institute)", "VOYAGER2_PLS_ELECTRONS_E1": "Voyager-2, Jupiter Low-Energy Electron Current Spectra - Dr. John D. Richardson (MIT Kavli Institute)", "VOYAGER2_PLS_ELECTRONS_E2": "Voyager-2, Jupiter High-Energy Electron Current Spectra - Dr. John D. Richardson (MIT Kavli Institute)", "VOYAGER2_PLS_HIRES_PLASMA_DATA": "HiRes plasma data - John D. Richardson (Kavli Institute for Astrophysics and Space Research, Massachusetts Institute of Technology.)", "VOYAGER2_PLS_IONS_L": "Voyager-2, Jupiter Low-Resolution Ion Current Spectra - Dr. John D. Richardson (MIT Kavli Institute)", "VOYAGER2_PLS_IONS_M": "Voyager-2, Jupiter High-Resolution Ion Current Spectra - Dr. John D. Richardson (MIT Kavli Institute)", "WILD2_HELIO1DAY_POSITION": "Position in heliocentric coordinates from SPDF Helioweb - Natalia Papitashvili (NASA/GSFC/SPDF)", "WI_AT_DEF": "Wind Definitive Attitude", "WI_AT_PRE": "Wind Predicted Attitude", "WI_EHPD_3DP": "Electron energy-angle distributions 100 eV - 30 keV, often at 24 sec, EESA High, Wind 3DP - R. Lin/S. Bale (UC Berkeley)", "WI_EHSP_3DP": "Electron omnidirectional fluxes 100 eV-30 keV, often at 24 sec, EESA High, Wind 3DP - R. Lin/S. Bale (UC Berkeley)", "WI_ELM2_3DP": "Electron Moments (ground-computed), EESA Low, Wind 3DP - R. Lin/S. Bale (UC Berkeley)", "WI_ELPD_3DP": "Electron energy-angle distributions 5-1100 eV, often at 24 sec, EESA Low, Wind 3DP - R. Lin/S. Bale (UC Berkeley)", "WI_ELSP_3DP": "Electron omnidirectional fluxes 5-1100 eV, often at 24 sec, EESA Low, Wind 3DP - R. Lin/S. Bale (UC Berkeley)", "WI_EMFITS_E0_3DP": "Wind spacecraft, 3DP electron moments - Stuart D. Bale (University of California, Berkeley)", "WI_EM_3DP": "Electron Plasma moments (computed on-board) (NOT CORRECTED FOR S/C POTENTIAL) @ 3 second (spin) resolution (version 3), EESA LOW, Wind 3DP - R. Lin/S. Bale (UC Berkeley)", "WI_EPACT_STEP-DIFFERENTIAL-ION-FLUX-1HR": "Wind EPACT-STEP - Mihir Desai (University of Texas, San Antonio)", "WI_EPACT_STEP-DIRECTIONAL-DIFF-CNO-FLUX-10MIN": "Wind EPACT-STEP CNO - Mihir Desai (University of Texas, San Antonio)", "WI_EPACT_STEP-DIRECTIONAL-DIFF-FE-FLUX-10MIN": "Wind EPACT-STEP FE - Mihir Desai (University of Texas, San Antonio)", "WI_EPACT_STEP-DIRECTIONAL-DIFF-H-FLUX-10MIN": "Wind EPACT-STEP H - Mihir Desai (University of Texas, San Antonio)", "WI_EPACT_STEP-DIRECTIONAL-DIFF-HE-FLUX-10MIN": "Wind EPACT-STEP HE - Mihir Desai (University of Texas, San Antonio)", "WI_H0_MFI": "Wind Magnetic Fields Investigation: 3 sec, 1 min, and hourly Definitive Data. - A. Koval (UMBC, NASA/GSFC)", "WI_H0_SWE": "Wind SWE (Solar Wind Experiment), 6 - 12 sec Solar Wind Electron Moments - K. Ogilvie (GSFC Code 692)", "WI_H0_WAV": "Wind Radio/Plasma Wave, (WAVES) High Res. Plasma Density - M. L. Kaiser (GSFC)", "WI_H1_SWE": "Wind Solar Wind Experiment, 92-sec Solar Wind Alpha and Proton Anisotropy Analysis - K. Ogilvie (NASA GSFC)", "WI_H1_WAV": "Wind Radio/Plasma Wave, (WAVES) Hi-Res Parameters - M. L. Kaiser (GSFC)", "WI_H2_MFI": "Wind Magnetic Fields Investigation, High-resolution Definitive Data - A. Koval (UMBC, NASA/GSFC)", "WI_H3_SWE": "Wind Solar Wind Experiment (SWE), 9 sec solar wind electron pitch-angle distributions at 12 sec cadence - K. Ogilvie (NASA/GSFC)", "WI_H4_SWE": "Wind Solar Wind Experiment (SWE), 3 sec solar wind electron pitch-angle distributions at 6-12 sec cadence - K. Ogilvie (NASA/GSFC)", "WI_H5_SWE": "Wind Solar Wind Experiment (SWE), 9 sec solar wind electron moments at 12 sec cadence - K. Ogilvie (NASA/GSFC)", "WI_K0_3DP": "Wind 3-D Plasma Analyzer, Key Parameters - R. Lin/S. Bale (UC Berkeley)", "WI_K0_EPA": "Wind Energetic Particle Acceleration Composition Transport, Key Parameters - T. Von Roseavinge (NASA/GSFC)", "WI_K0_GIFWALK": "Links to Wind KP pre-generated survey and other plots - Polar-Wind-Geotail Ground System (NASA GSFC)", "WI_K0_MFI": "Wind Magnetic Fields Investigation, Key Parameters - R. Lepping (NASA/GSFC)", "WI_K0_SMS": "Solar Wind and Suprathermal Ion Composition Instrument, Key Parameters - G. Gloeckler (U of Maryland)", "WI_K0_SPHA": "Wind Spin Phase", "WI_K0_SWE": "Wind SWE (Solar Wind Experiment), Key Parameters - K. Ogilvie (NASA GSFC)", "WI_K0_WAV": "Wind Radio/Plasma Wave, (WAVES) Key Parameters - M. L. Kaiser (GSFC)", "WI_L2-1HOUR-SEP_EPACT-APE_B": "Wind EPACT-APE_B H 18.90 -21.90 MeV Solar Energetic Particle Intensities, 1-Hour Level 2 Data - T. Von Rosenvinge & D. Reames (NASA GSFC)", "WI_L2-1HOUR-SEP_EPACT-LEMT": "Wind EPACT-LEMT He/C/O/Ne/Si/Fe 2-11 MeV/Nuc Solar Energetic Particle Intensities, 1-Hour Level 2 Data - T. Von Rosenvinge & D. Reames (NASA GSFC)", "WI_L2-5MIN-SEP_EPACT-LEMT": "Wind EPACT-LEMT He/C/O/Ne/Si/Fe 2-11 MeV/Nuc Solar Energetic Particle Intensities, 5min Level 2 Data - T. Von Rosenvinge & D. Reames (NASA GSFC)", "WI_L3-DUSTIMPACT_WAVES": "The Radio and Plasma Wave Investigation on the Wind Spacecraft - D.M. Malaspina (U. Colorado at Boulder, LASP)", "WI_M0_SWE": "Wind Solar Wind Experiment (SWE), 9 sec solar wind electron pitch-angle distribution averages - K. Ogilvie (NASA/GSFC)", "WI_M2_SWE": "Wind Solar Wind Experiment (SWE), 3 sec solar wind electron pitch-angle distribution averages - K. Ogilvie (NASA/GSFC)", "WI_OR_DEF": "Wind Definitive Orbit", "WI_OR_GIFWALK": "Links to Wind and multi-mission orbit plots - Polar-Wind-Geotail Ground System (NASA GSFC)", "WI_OR_PRE": "Wind Predicted Orbit", "WI_PLSP_3DP": "Ion omnidirectional fluxes 0.4-3 keV and moments, often at ~24 second resolution, PESA Low, Wind 3DP - R. Lin/S. Bale (UC Berkeley)", "WI_PM_3DP": " Ion moments (computed on-board) @ 3 second (spin) resolution, PESA LOW, Wind 3DP - R. Lin/S. Bale (UC Berkeley)", "WI_SFPD_3DP": "Electron energy-angle distributions 27 keV to 520 keV, often at 24 sec, SST Foil, Wind 3DP - R. Lin/S. Bale (UC Berkeley)", "WI_SFSP_3DP": "Electron omnidirectional fluxes 27 keV - 520 keV, often at 24 sec, SST Foil, Wind 3DP - R. Lin/S. Bale (UC Berkeley)", "WI_SOPD_3DP": "Proton energy-angle distributions 70 keV - 6.8 MeV, often at 24 sec, SST Open, Wind 3DP - R. Lin/S. Bale (UC Berkeley)", "WI_SOSP_3DP": "Proton omnidirectional fluxes 70 keV - 6.8 MeV, often at 24 sec, SST Open, Wind 3DP - R. Lin/S. Bale (UC Berkeley)", "WI_STRAHL0_SWE": "Wind Solar Wind Experiment (SWE) strahl detector, ~1/2 sec solar wind electron pitch-angle distributions at ~12 sec cadence - K. Ogilvie (NASA/GSFC)", "WI_SW-ION-DIST_SWE-FARADAY": "Faraday Cup orientation and charge flux - Keith Ogilvie (NASA GSFC)" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/cdaweb/helpers.py0000644000175100001710000001073600000000000017140 0ustar00vstsdockerimport json import pathlib import requests from astropy.table import Table from .cdaweb import _CDAS_BASEURL, _CDAS_HEADERS, _DATAVIEW __all__ = ['get_observatory_groups', 'get_datasets'] def get_observatory_groups(): """ Get a list of observatory IDs for each observatory in CDAWeb. An observatory group is typically a single mission, which can contain multiple observatories, e.g. for the STEREO observatory group there are two observatories, STEREO-A and STEREO-B. Returns ------- `astropy.table.Table` Examples -------- >>> from sunpy.net.cdaweb import get_observatory_groups >>> >>> groups = get_observatory_groups() #doctest: +REMOTE_DATA >>> groups['Group'] #doctest: +REMOTE_DATA ACE AMPTE ... Voyager Wind >>> groups.loc['STEREO'] #doctest: +REMOTE_DATA Group Observatories str55 str... ------ ----------------------------------------------------------------------------- STEREO 'Ahead', 'Behind', 'STA', 'STB', 'STEREO', 'STEREOA', 'STEREOB', 'sta', 'stb' """ # Get a list of files for a given dataset between start and end times url = '/'.join([ _CDAS_BASEURL, 'dataviews', _DATAVIEW, 'observatoryGroups' ]) response = requests.get(url, headers=_CDAS_HEADERS) obs_groups = response.json() names = [obs['Name'] for obs in obs_groups['ObservatoryGroupDescription']] obs_ids = [obs['ObservatoryId'] for obs in obs_groups['ObservatoryGroupDescription']] # Join all IDs into a single string obs_ids = ["'" + "', '".join(id) + "'" for id in obs_ids] t = Table([names, obs_ids], names=['Group', 'Observatories']) t.add_index('Group') return t def get_datasets(observatory): """ Get a list of datasets for a given observatory. Parameters ---------- observatory : `str` Observatory name. Returns ------- `astropy.table.Table` Examples -------- >>> from sunpy.net.cdaweb import get_datasets >>> >>> datasets = get_datasets('STEREOB') #doctest: +REMOTE_DATA >>> datasets['Id'] #doctest: +REMOTE_DATA STB_LB_IMPACT STB_L1_IMPACT_HKP STB_L1_HET STB_L1_SWEA_SPEC >>> datasets.loc['STB_L1_SWEA_SPEC']['Label'] #doctest: +REMOTE_DATA 'STEREO Behind IMPACT/SWEA Spectra - J. Luhmann (UCB/SSL)' >>> datasets.loc['STB_L1_SWEA_SPEC'][['Start', 'End']] #doctest: +REMOTE_DATA Start End str24 str24 ------------------------ ------------------------ 2012-12-01T00:00:03.000Z 2013-12-31T23:59:41.000Z """ # Get a list of files for a given dataset between start and end times url = '/'.join([ _CDAS_BASEURL, 'dataviews', _DATAVIEW, 'datasets' ]) url = f'{url}?observatory={observatory}' response = requests.get(url, headers=_CDAS_HEADERS) datasets = response.json()['DatasetDescription'] ids = [dataset['Id'] for dataset in datasets] instruments = [', '.join(dataset['Instrument']) for dataset in datasets] labels = [dataset['Label'] for dataset in datasets] stimes = [dataset['TimeInterval']['Start'] for dataset in datasets] etimes = [dataset['TimeInterval']['End'] for dataset in datasets] t = Table([ids, instruments, labels, stimes, etimes], names=['Id', 'Instruments', 'Label', 'Start', 'End']) t.add_index('Id') return t def _update_cdaweb_dataset_data(): all_obs = get_observatory_groups() url = '/'.join([ _CDAS_BASEURL, 'dataviews', _DATAVIEW, 'datasets' ]) # Mapping from dataset ID to description all_datasets = {} for group in all_obs['Group']: print(f'🛰 Getting datasets for {group}') group_url = url + f'?observatoryGroup={group}' response = requests.get(group_url, headers=_CDAS_HEADERS) datasets = response.json()['DatasetDescription'] dataset_ids = {ds['Id']: ds['Label'] for ds in datasets} all_datasets.update(dataset_ids) attr_file = pathlib.Path(__file__).parent / 'data' / 'attrs.json' with open(attr_file, 'w') as attrs_file: json.dump(dict(sorted(all_datasets.items())), attrs_file, indent=2) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6372752 sunpy-3.1.5/sunpy/net/cdaweb/test/0000755000175100001710000000000000000000000016074 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/cdaweb/test/__init__.py0000644000175100001710000000000000000000000020173 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/cdaweb/test/test_cdaweb.py0000644000175100001710000000150400000000000020732 0ustar00vstsdockerimport pytest import sunpy.net.attrs as a from sunpy.net import Fido from sunpy.net.cdaweb.attrs import Dataset @pytest.mark.remote_data def test_query(): res = Fido.search(a.Time('2018-11-01', '2018-11-01 01:00:00'), Dataset('WI_H1_SWE') | Dataset('WI_H5_SWE')) assert len(res) == 2 assert len(res[0]) == 1 assert len(res[1]) == 2 files = Fido.fetch(res) assert len(files) == 3 @pytest.mark.remote_data def test_download(): # Check that clipping the max splits at 3 reliably works for CDAWeb # This query has 4 small files trange = a.Time('2021/07/01', '2021/07/05') dataset = a.cdaweb.Dataset('SOLO_L2_MAG-RTN-NORMAL-1-MINUTE') result = Fido.search(trange, dataset) assert len(result[0]) == 4 files = Fido.fetch(result) assert len(files.errors) == 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/cdaweb/walker.py0000644000175100001710000000153100000000000016754 0ustar00vstsdockerfrom sunpy.net.attr import AttrAnd, AttrOr, AttrWalker from sunpy.net.attrs import Time from sunpy.net.cdaweb.attrs import Dataset walker = AttrWalker() @walker.add_creator(AttrOr) def create_or(wlk, tree): results = [] for sub in tree.attrs: results.append(wlk.create(sub)) return results @walker.add_creator(AttrAnd) def create_and(wlk, tree): param_dict = {} wlk.apply(tree, param_dict) return [param_dict] @walker.add_applier(AttrAnd) def apply_and(wlk, and_attr, param_dict): for iattr in and_attr.attrs: wlk.apply(iattr, param_dict) @walker.add_applier(Time) def apply_timerange(wlk, time_attr, param_dict): param_dict['begin_time'] = time_attr.start param_dict['end_time'] = time_attr.end @walker.add_applier(Dataset) def _(wlk, attr, param_dict): param_dict['dataset'] = attr.value ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6372752 sunpy-3.1.5/sunpy/net/dataretriever/0000755000175100001710000000000000000000000016531 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/__init__.py0000644000175100001710000000136300000000000020645 0ustar00vstsdocker""" 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 `sunpy.net.Fido` factory class, so do not need to be called individually. """ from .client import * from .sources.eve import * from .sources.fermi_gbm import * from .sources.goes import * from .sources.gong import * from .sources.lyra import * from .sources.noaa import * from .sources.norh import * from .sources.rhessi import * ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6372752 sunpy-3.1.5/sunpy/net/dataretriever/attrs/0000755000175100001710000000000000000000000017666 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/attrs/__init__.py0000644000175100001710000000004700000000000022000 0ustar00vstsdockerfrom . import goes __all__ = ['goes'] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/attrs/goes.py0000644000175100001710000000037400000000000021201 0ustar00vstsdockerfrom sunpy.net.attr import SimpleAttr __all__ = ["SatelliteNumber"] # Define a custom __dir__ to restrict tab-completion to __all__ def __dir__(): return __all__ class SatelliteNumber(SimpleAttr): """ The GOES Satellite Number """ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/client.py0000644000175100001710000002613100000000000020364 0ustar00vstsdockerfrom pathlib import Path from collections import OrderedDict import numpy as np import sunpy from sunpy import config from sunpy.net import attrs as a from sunpy.net.attr import SimpleAttr from sunpy.net.base_client import BaseClient, QueryResponseRow, QueryResponseTable from sunpy.net.scraper import Scraper, get_timerange_from_exdict from sunpy.time import TimeRange from sunpy.util.parfive_helpers import Downloader TIME_FORMAT = config.get("general", "time_format") __all__ = ['QueryResponse', 'GenericClient'] class QueryResponse(QueryResponseTable): hide_keys = ['url'] def time_range(self): """ Returns the time-span for which records are available. """ if 'Start Time' in self.colnames and 'End Time' in self.colnames: return TimeRange(np.min(self['Start Time']), np.max(self['End Time'])) 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 class GenericClient(BaseClient): """ 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.search` and `~sunpy.net.dataretriever.client.GenericClient.fetch` the former generates a set of results for files available through the service the client is querying and the latter downloads that data. Search uses two hooks as helper functions; these are :meth:`~sunpy.net.dataretriever.GenericClient.pre_search_hook` and :meth:`~sunpy.net.dataretriever.GenericClient.post_search_hook`. They help to translate the attrs for scraper before and after the search respectively. """ baseurl = None # A regex string that can match all urls supported by the client. # A string which is used to extract the desired metadata from urls correctly, # using ``sunpy.extern.parse.parse``. pattern = None # Set of required 'attrs' for client to handle the query. required = {a.Time, a.Instrument} @classmethod def _get_match_dict(cls, *args, **kwargs): """ Constructs a dictionary using the query and registered Attrs that represents all possible values of the extracted metadata for files that matches the query. The returned dictionary is used to validate the metadata of searched files in :func:`~sunpy.net.scraper.Scraper._extract_files_meta`. Parameters ---------- \\*args: `tuple` `sunpy.net.attrs` objects representing the query. \\*\\*kwargs: `dict` Any extra keywords to refine the search. Returns ------- matchdict: `dict` A dictionary having a `list` of all possible Attr values corresponding to an Attr. """ regattrs_dict = cls.register_values() matchdict = {} for i in regattrs_dict.keys(): attrname = i.__name__ # only Attr values that are subclas of Simple Attr are stored as list in matchdict # since complex attrs like Range can't be compared with string matching. if issubclass(i, SimpleAttr): matchdict[attrname] = [] for val, _ in regattrs_dict[i]: matchdict[attrname].append(val) for elem in args: if isinstance(elem, a.Time): matchdict['Start Time'] = elem.start matchdict['End Time'] = elem.end elif hasattr(elem, 'value'): matchdict[elem.__class__.__name__] = [str(elem.value).lower()] elif isinstance(elem, a.Wavelength): matchdict['Wavelength'] = elem else: raise ValueError( "GenericClient can not add {} to the rowdict dictionary to" "pass to the Client.".format(elem.__class__.__name__)) return matchdict @classmethod def pre_search_hook(cls, *args, **kwargs): """ Helper function to return the baseurl, pattern and matchdict for the client required by :func:`~sunpy.net.dataretriever.GenericClient.search` before using the scraper. """ matchdict = cls._get_match_dict(*args, **kwargs) return cls.baseurl, cls.pattern, matchdict @classmethod def _can_handle_query(cls, *query): """ Method the `sunpy.net.fido_factory.UnifiedDownloaderFactory` class uses to dispatch queries to this Client. """ regattrs_dict = cls.register_values() optional = {k for k in regattrs_dict.keys()} - cls.required if not cls.check_attr_types_in_query(query, cls.required, optional): return False for key in regattrs_dict: all_vals = [i[0].lower() for i in regattrs_dict[key]] for x in query: if isinstance(x, key) and issubclass(key, SimpleAttr) and str(x.value).lower() not in all_vals: return False return True def post_search_hook(self, exdict, matchdict): """ Helper function used after :func:`~sunpy.net.dataretriever.GenericClient.search` which makes the extracted metadata representable in a query response table. Parameters ---------- exdict : `dict` Represents metadata extracted from files. matchdict : `dict` Contains attr values accessed from ``register_values()`` and the search query itself. Returns ------- rowdict: `~collections.OrderedDict` An Ordered Dictionary which is used by `QueryResponse` to show results. """ rowdict = OrderedDict() tr = get_timerange_from_exdict(exdict) start = tr.start start.format = 'iso' end = tr.end end.format = 'iso' rowdict['Start Time'] = start rowdict['End Time'] = end for k in matchdict: if k not in ('Start Time', 'End Time', 'Wavelength'): if k == 'Physobs': # not changing case for Phsyobs rowdict[k] = matchdict[k][0] else: rowdict[k] = matchdict[k][0].upper() for k in exdict: if k not in ['year', 'month', 'day', 'hour', 'minute', 'second']: rowdict[k] = exdict[k] return rowdict def _get_full_filenames(self, qres, filenames, path): """ Returns full pathnames for each file in the result. Parameters ---------- qres : `~sunpy.net.dataretriever.QueryResponse` Results to download. filenames : list List of base filenames (ex - "xyz.txt") path : str 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 = Path(sunpy.config.get("downloads", "download_dir")) paths = [] for i, filename in enumerate(filenames): fname = Path(filename) if path is None: fname = default_dir / '{file}' elif '{file}' not in str(path): fname = path / '{file}' else: fname = path temp_dict = qres[i].response_block_map temp_dict['file'] = str(filename) fname = fname.expanduser() fname = Path(str(fname).format(**temp_dict)) 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. \\*\\*kwargs: `dict` Any extra keywords to refine the search. Returns ------- A `QueryResponse` instance containing the query result. """ baseurl, pattern, matchdict = self.pre_search_hook(*args, **kwargs) scraper = Scraper(baseurl, regex=True) tr = TimeRange(matchdict['Start Time'], matchdict['End Time']) filesmeta = scraper._extract_files_meta(tr, extractor=pattern, matcher=matchdict) filesmeta = sorted(filesmeta, key=lambda k: k['url']) metalist = [] for i in filesmeta: rowdict = self.post_search_hook(i, matchdict) metalist.append(rowdict) return QueryResponse(metalist, client=self) def fetch(self, qres, path=None, overwrite=False, progress=True, downloader=None, wait=True, **kwargs): """ Download a set of results. Parameters ---------- qres : `~sunpy.net.dataretriever.QueryResponse` Results to download. path : `str` or `pathlib.Path`, optional Path to the download directory, or file template including the ``{file}`` string which will be replaced with the filename. overwrite : `bool` or `str`, optional Determine how to handle downloading if a file already exists with the same name. If `False` the file download will be skipped and the path returned to the existing file, if `True` the file will be downloaded and the existing file will be overwritten, if ``'unique'`` the filename will be modified to be unique. progress : `bool`, optional If `True` show a progress bar showing how many of the total files have been downloaded. If `False`, no progress bar will be shown. downloader : `parfive.Downloader`, optional The download manager to use. wait : `bool`, optional If `False` ``downloader.download()`` will not be called. Only has any effect if ``downloader`` is not `None`. **kwargs : dict, optional Passed to `parfive.Downloader.enqueue_file`. Returns ------- results: `parfive.Results` """ if path is not None: path = Path(path) if isinstance(qres, QueryResponseRow): qres = qres.as_table() urls = [] if len(qres): urls = list(qres['url']) filenames = [url.split('/')[-1] for url in urls] paths = self._get_full_filenames(qres, filenames, path) dl_set = True if not downloader: dl_set = False downloader = Downloader(progress=progress, overwrite=overwrite) for url, filename in zip(urls, paths): downloader.enqueue_file(url, filename=filename, **kwargs) if dl_set and not wait: return return downloader.download() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6372752 sunpy-3.1.5/sunpy/net/dataretriever/sources/0000755000175100001710000000000000000000000020214 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/__init__.py0000644000175100001710000000000000000000000022313 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/eve.py0000644000175100001710000000450400000000000021350 0ustar00vstsdocker# Author: Rishabh Sharma # This module was developed under funding by # Google Summer of Code 2014 from sunpy.net.dataretriever import GenericClient __all__ = ['EVEClient'] class EVEClient(GenericClient): """ Provides access to Level 0C Extreme ultraviolet Variability Experiment (EVE) data. To use this client you must request Level 0 data. It is hosted by `LASP `__. 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.zero) #doctest: +REMOTE_DATA >>> results #doctest: +REMOTE_DATA Results from 1 Provider: 2 Results from the EVEClient: Source: https://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/L0CS/SpWx/ Start Time End Time Instrument ... Provider Level ----------------------- ----------------------- ---------- ... -------- ----- 2016-01-01 00:00:00.000 2016-01-01 23:59:59.999 EVE ... LASP 0 2016-01-02 00:00:00.000 2016-01-02 23:59:59.999 EVE ... LASP 0 """ baseurl = (r'http://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/' r'L0CS/SpWx/%Y/%Y%m%d_EVE_L0CS_DIODES_1m.txt') pattern = '{}/SpWx/{:4d}/{year:4d}{month:2d}{day:2d}_EVE_L{Level:1d}{}' @property def info_url(self): return 'https://lasp.colorado.edu/eve/data_access/evewebdata/quicklook/L0CS/SpWx/' @classmethod def register_values(cls): from sunpy.net import attrs adict = {attrs.Instrument: [('EVE', 'Extreme ultraviolet Variability Experiment, which is part of the NASA Solar Dynamics Observatory mission.')], attrs.Physobs: [('irradiance', 'the flux of radiant energy per unit area.')], attrs.Source: [('SDO', 'The Solar Dynamics Observatory.')], attrs.Provider: [('LASP', 'The Laboratory for Atmospheric and Space Physics.')], attrs.Level: [('0', 'EVE: The specific EVE client can only return Level 0C data. Any other number will use the VSO Client.')]} return adict ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/fermi_gbm.py0000644000175100001710000000633500000000000022524 0ustar00vstsdockerfrom sunpy.net.dataretriever import GenericClient __all__ = ['GBMClient'] class GBMClient(GenericClient): """ Provides access to data from the Gamma-Ray Burst Monitor (GBM) instrument on board the Fermi satellite. Although GBMs primary objective is to detect gamma-ray bursts, it provides high quality high energy solar flare observations. The instrument consists of 12 Sodium Iodide (NaI) scintillation detectors, which are sensitive to an energy range of 4keV to 1MeV. At any one time, 6 of the NaI detectors are Sunward facing. The detectors are numbered 'n1' to 'n11'. This client supports the user to choose which detector to use through the `a.Detector ` attribute. The default detector is 'n5'. The GBM data comes in daily version files in two formats: * CSPEC - counts accumulated every 4.096 seconds in 128 energy channels for each detector. * CTIME - counts accumulated every 0.256 seconds in 8 energy channels Both of which can be accessed through the attrs `a.Resolution `. The default data type is CSPEC unless the user defines. Examples -------- >>> from sunpy.net import Fido, attrs as a >>> res = Fido.search(a.Time('2015-06-21 00:00', '2015-06-23 23:59'), ... a.Instrument.gbm, a.Detector.n3, ... a.Resolution.ctime) #doctest: +REMOTE_DATA >>> res #doctest: +REMOTE_DATA Results from 1 Provider: 3 Results from the GBMClient: Source: https://heasarc.gsfc.nasa.gov/FTP/fermi/data/gbm/daily Start Time End Time ... Resolution Detector ----------------------- ----------------------- ... ---------- -------- 2015-06-21 00:00:00.000 2015-06-21 23:59:59.999 ... ctime n3 2015-06-22 00:00:00.000 2015-06-22 23:59:59.999 ... ctime n3 2015-06-23 00:00:00.000 2015-06-23 23:59:59.999 ... ctime n3 """ baseurl = r'https://heasarc.gsfc.nasa.gov/FTP/fermi/data/gbm/daily/%Y/%m/%d/current/glg_(\w){5}_(\w){2}_%y%m%d_v00.pha' pattern = '{}/daily/{year:4d}/{month:2d}/{day:2d}/current/glg_{Resolution:5}_{Detector:2}_{:6d}{}' @property def info_url(self): return 'https://heasarc.gsfc.nasa.gov/FTP/fermi/data/gbm/daily' @classmethod def register_values(cls): from sunpy.net import attrs adict = {attrs.Instrument: [('GBM', 'Gamma-Ray Burst Monitor on board the Fermi satellite.')], attrs.Physobs: [('flux', 'a measure of the amount of radiation received by an object from a given source.')], attrs.Source: [('FERMI', 'The Fermi Gamma-ray Space Telescope.')], attrs.Provider: [('NASA', 'The National Aeronautics and Space Administration.')], attrs.Resolution: [ ("cspec", "CSPEC 128 channel spectra every 4.096 seconds."), ("ctime", "CTIME provides 8 channel spectra every 0.256 seconds.")], attrs.Detector: [(f"n{x}", f"GBM Detector short name for the detector NAI_{x:02}") for x in range(12)]} return adict ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/goes.py0000644000175100001710000003575500000000000021542 0ustar00vstsdocker# Author: Rishabh Sharma # This module was developed under funding provided by # Google Summer of Code 2014 from datetime import datetime from collections import OrderedDict import astropy.units as u from astropy.time import Time from sunpy import config from sunpy.net import attrs as a from sunpy.net.dataretriever import GenericClient, QueryResponse from sunpy.net.scraper import Scraper, get_timerange_from_exdict from sunpy.time import TimeRange, parse_time TIME_FORMAT = config.get("general", "time_format") __all__ = ["XRSClient", "SUVIClient"] class XRSClient(GenericClient): """ Provides access to the GOES XRS fits files archive. Searches for GOES XRS data both on NASA servers prior to re-processed GOES 13, 14 and 15 and on the NOAA archive for > GOES 13. For satellite numbers > 13 the XRSClient searches the NOAA archive, and returns the re-processed science-quality data for GOES 13, 14 and 15, and also the new GOES-R series 16 and 17. Note - the new science quality data have scaling factors removed for 13, 14 and 15 and they are not added to GOES 16 AND 17. This means the peak flux will be different to the older version of the data, such as those collected from the NASA servers. See the following readmes about the data * Reprocessed 13, 14, 15 : https://satdat.ngdc.noaa.gov/sem/goes/data/science/xrs/GOES_13-15_XRS_Science-Quality_Data_Readme.pdf * GOES-R 16, 17 : https://data.ngdc.noaa.gov/platforms/solar-space-observing-satellites/goes/goes16/l1b/docs/GOES-R_XRS_L1b_Science-Quality_Data_Readme.pdf Examples -------- >>> from sunpy.net import Fido, attrs as a >>> results = Fido.search(a.Time("2016/1/1", "2016/1/2"), ... a.Instrument.xrs) #doctest: +REMOTE_DATA >>> results #doctest: +REMOTE_DATA Results from 1 Provider: 4 Results from the XRSClient: Source: https://umbra.nascom.nasa.gov/goes/fits Start Time End Time Instrument ... Source Provider ----------------------- ----------------------- ---------- ... ------ -------- 2016-01-01 00:00:00.000 2016-01-01 23:59:59.999 XRS ... GOES NOAA 2016-01-02 00:00:00.000 2016-01-02 23:59:59.999 XRS ... GOES NOAA 2016-01-01 00:00:00.000 2016-01-01 23:59:59.999 XRS ... GOES NOAA 2016-01-02 00:00:00.000 2016-01-02 23:59:59.999 XRS ... GOES NOAA """ # GOES XRS data from NASA servers upto GOES 15. The reprocessed 13, 14, 15 data should be taken from NOAA server. baseurl_old = r'https://umbra.nascom.nasa.gov/goes/fits/%Y/go(\d){2}(\d){6,8}\.fits' pattern_old = '{}/fits/{year:4d}/go{SatelliteNumber:02d}{}{month:2d}{day:2d}.fits' # GOES XRS 13, 14, 15 from NOAA (re-processed data) baseurl_new = (r"https://satdat.ngdc.noaa.gov/sem/goes/data/science/xrs/" r"goes{SatelliteNumber}/gxrs-l2-irrad_science/%Y/%m/sci_gxrs-l2-irrad_g{SatelliteNumber}_d%Y%m%d_.*\.nc") pattern_new = ("{}/goes{SatelliteNumber:02d}/gxrs-l2-irrad_science/{year:4d}/" "{month:2d}/sci_gxrs-l2-irrad_g{SatelliteNumber:02d}_d{year:4d}{month:2d}{day:2d}_{}.nc") # GOES XRS data for GOES-R Series - 16, 17 baseurl_r = (r"https://data.ngdc.noaa.gov/platforms/solar-space-observing-satellites/goes/goes{SatelliteNumber}" r"/l2/data/xrsf-l2-flx1s_science/%Y/%m/sci_xrsf-l2-flx1s_g{SatelliteNumber}_d%Y%m%d_.*\.nc") pattern_r = ("{}/goes/goes{SatelliteNumber:02d}/l2/data/xrsf-l2-flx1s_science/{year:4d}/" "{month:2d}/sci_xrsf-l2-flx1s_g{SatelliteNumber:02d}_d{year:4d}{month:2d}{day:2d}_{}.nc") @property def info_url(self): return 'https://umbra.nascom.nasa.gov/goes/fits' def post_search_hook(self, i, matchdict): tr = get_timerange_from_exdict(i) rowdict = OrderedDict() rowdict['Start Time'] = tr.start rowdict['Start Time'].format = 'iso' rowdict['End Time'] = tr.end rowdict['End Time'].format = 'iso' rowdict["Instrument"] = matchdict["Instrument"][0].upper() rowdict["SatelliteNumber"] = i["SatelliteNumber"] rowdict["Physobs"] = matchdict["Physobs"][0] rowdict["url"] = i["url"] rowdict["Source"] = matchdict["Source"][0] if i["url"].endswith(".fits"): rowdict["Provider"] = matchdict["Provider"][0] else: rowdict["Provider"] = matchdict["Provider"][1] return rowdict def search(self, *args, **kwargs): matchdict = self._get_match_dict(*args, **kwargs) # this is for the case when the timerange overlaps with the provider change. if matchdict["Start Time"] < "2009-09-01" and matchdict["End Time"] >= "2009-09-01": matchdict_before, matchdict_after = matchdict.copy(), matchdict.copy() matchdict_after["Start Time"] = parse_time('2009-09-01') matchdict_before["End Time"] = parse_time('2009-08-31') metalist_before = self._get_metalist(matchdict_before) metalist_after = self._get_metalist(matchdict_after) metalist = metalist_before + metalist_after else: metalist = self._get_metalist(matchdict) return QueryResponse(metalist, client=self) def _get_metalist_fn(self, matchdict, baseurl, pattern): """ Function to help get list of OrderedDicts. """ metalist = [] scraper = Scraper(baseurl, regex=True) tr = TimeRange(matchdict["Start Time"], matchdict["End Time"]) filemeta = scraper._extract_files_meta(tr, extractor=pattern, matcher=matchdict) for i in filemeta: rowdict = self.post_search_hook(i, matchdict) metalist.append(rowdict) return metalist def _get_metalist(self, matchdict): """ Function to get the list of OrderDicts. This makes it easier for when searching for overlapping providers. """ metalist = [] # the data before the re-processed GOES 13, 14, 15 data. if (matchdict["End Time"] < "2009-09-01") or (matchdict["End Time"] >= "2009-09-01" and matchdict["Provider"] == ["sdac"]): metalist += self._get_metalist_fn(matchdict, self.baseurl_old, self.pattern_old) # new data from NOAA. else: if matchdict["End Time"] >= "2017-02-07": for sat in [16, 17]: metalist += self._get_metalist_fn(matchdict, self.baseurl_r.format(SatelliteNumber=sat), self.pattern_r) if matchdict["End Time"] <= "2020-03-04": for sat in [13, 14, 15]: metalist += self._get_metalist_fn(matchdict, self.baseurl_new.format(SatelliteNumber=sat), self.pattern_new) return metalist @classmethod def _attrs_module(cls): return 'goes', 'sunpy.net.dataretriever.attrs.goes' @classmethod def register_values(cls): from sunpy.net import attrs goes_number = [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17] adict = {attrs.Instrument: [ ("GOES", "The Geostationary Operational Environmental Satellite Program."), ("XRS", "GOES X-ray Sensor")], attrs.Physobs: [('irradiance', 'the flux of radiant energy per unit area.')], attrs.Source: [("GOES", "The Geostationary Operational Environmental Satellite Program.")], attrs.Provider: [('SDAC', 'The Solar Data Analysis Center.'), ('NOAA', 'The National Oceanic and Atmospheric Administration.')], attrs.goes.SatelliteNumber: [(str(x), f"GOES Satellite Number {x}") for x in goes_number]} return adict class SUVIClient(GenericClient): """ Provides access to data from the GOES Solar Ultraviolet Imager (SUVI). SUVI data are provided by NOAA at the following url https://data.ngdc.noaa.gov/platforms/solar-space-observing-satellites/ The SUVI instrument was first included on GOES-16. It produces level-1b as well as level-2 data products. Level-2 data products are a weighted average of level-1b product files and therefore provide higher imaging dynamic range than individual images. The exposure time of level 1b images range from 1 s to 0.005 s. SUVI supports the following wavelengths; 94, 131, 171, 195, 284, 304 angstrom. If no wavelength is specified, images from all wavelengths are returned. Note ---- GOES-16 began providing regular level-1b data on 2018-06-01. At the time of writing, SUVI on GOES-17 is operational but currently does not provide Level-2 data. Examples -------- >>> from sunpy.net import Fido, attrs as a >>> import astropy.units as u >>> results = Fido.search(a.Time("2020/7/10", "2020/7/10 00:10"), a.Instrument('suvi'),a.Level.two, ... a.goes.SatelliteNumber(16), a.Wavelength(304*u.Angstrom)) #doctest: +REMOTE_DATA >>> results #doctest: +REMOTE_DATA Results from 1 Provider: 3 Results from the SUVIClient: Source: https://data.ngdc.noaa.gov/platforms/solar-space-observing-satellites/goes Start Time End Time Instrument ... Level Wavelength ... Angstrom ----------------------- ----------------------- ---------- ... ----- ---------- 2020-07-10 00:00:00.000 2020-07-10 00:04:00.000 SUVI ... 2 304.0 2020-07-10 00:04:00.000 2020-07-10 00:08:00.000 SUVI ... 2 304.0 2020-07-10 00:08:00.000 2020-07-10 00:12:00.000 SUVI ... 2 304.0 """ baseurl1b = (r'https://data.ngdc.noaa.gov/platforms/solar-space-observing-satellites/goes/goes' r'{SatelliteNumber}/l1b/suvi-l1b-{elem:2}{wave:03}/%Y/%m/%d/OR_SUVI-L1b.*\.fits.gz') pattern1b = ('{}/goes/goes{SatelliteNumber:2d}/l{Level:2w}/suvi-l1b-{}{Wavelength:03d}/' '{year:4d}/{month:2d}/{day:2d}/{}_s{:7d}{hour:2d}{minute:2d}{second:2d}' '{:1d}_e{:7d}{ehour:2d}{eminute:2d}{esecond:2d}{:1d}_{}') baseurl2 = (r'https://data.ngdc.noaa.gov/platforms/solar-space-observing-satellites/goes/goes{SatelliteNumber}/' r'l2/data/suvi-l2-ci{wave:03}/%Y/%m/%d/dr_suvi-l2-ci{wave:03}_g{SatelliteNumber}_s%Y%m%dT%H%M%SZ_.*\.fits') pattern2 = ('{}/goes/goes{SatelliteNumber:2d}/{}/dr_suvi-l{Level}-ci{Wavelength:03d}_g{SatelliteNumber:2d}_s' '{year:4d}{month:2d}{day:2d}T{hour:2d}{minute:2d}{second:2d}Z_e' '{eyear:4d}{emonth:2d}{eday:2d}T{ehour:2d}{eminute:2d}{esecond:2d}Z_{}') @property def info_url(self): return 'https://data.ngdc.noaa.gov/platforms/solar-space-observing-satellites/goes' def post_search_hook(self, i, matchdict): # extracting start times and end times start = Time(datetime(i['year'], i['month'], i['day'], i['hour'], i['minute'], i['second'])) start.format = 'iso' end = Time(datetime(i['year'], i['month'], i['day'], i['ehour'], i['eminute'], i['esecond'])) end.format = 'iso' rowdict = OrderedDict() rowdict['Start Time'] = start rowdict['End Time'] = end rowdict['Instrument'] = matchdict['Instrument'][0].upper() rowdict['Physobs'] = matchdict['Physobs'][0] rowdict['Source'] = matchdict['Source'][0] rowdict['Provider'] = matchdict['Provider'][0] rowdict['SatelliteNumber'] = i['SatelliteNumber'] rowdict['Level'] = i['Level'] rowdict['Wavelength'] = i['Wavelength']*u.Angstrom rowdict['url'] = i['url'] return rowdict def search(self, *args, **kwargs): supported_waves = [94, 131, 171, 195, 284, 304]*u.Angstrom all_waves = [] matchdict = self._get_match_dict(*args, **kwargs) req_wave = matchdict.get('Wavelength', None) if req_wave is not None: wmin = req_wave.min.to(u.Angstrom, equivalencies=u.spectral()) wmax = req_wave.max.to(u.Angstrom, equivalencies=u.spectral()) req_wave = a.Wavelength(wmin, wmax) for wave in supported_waves: if wave in req_wave: all_waves.append(int(wave.value)) else: all_waves = [int(i.value) for i in supported_waves] all_satnos = matchdict.get('SatelliteNumber') all_levels = matchdict.get('Level') metalist = [] # iterating over all possible Attr values through loops for satno in all_satnos: for level in all_levels: for wave in all_waves: formdict = {'wave': wave, 'SatelliteNumber': satno} if str(level) == '1b': formdict['elem'] = 'fe' if wave == 304: formdict['elem'] = 'he' baseurl = self.baseurl1b pattern = self.pattern1b elif str(level) == '2': baseurl = self.baseurl2 pattern = self.pattern2 else: raise ValueError(f"Level {level} is not supported.") # formatting baseurl using Level, SatelliteNumber and Wavelength urlpattern = baseurl.format(**formdict) scraper = Scraper(urlpattern) tr = TimeRange(matchdict['Start Time'], matchdict['End Time']) filesmeta = scraper._extract_files_meta(tr, extractor=pattern) for i in filesmeta: rowdict = self.post_search_hook(i, matchdict) metalist.append(rowdict) return QueryResponse(metalist, client=self) @classmethod def _attrs_module(cls): return 'goes', 'sunpy.net.dataretriever.attrs.goes' @classmethod def register_values(cls): from sunpy.net import attrs goes_number = [16, 17] adict = {attrs.Instrument: [ ("SUVI", "GOES Solar Ultraviolet Imager.")], attrs.goes.SatelliteNumber: [(str(x), f"GOES Satellite Number {x}") for x in goes_number], attrs.Source: [('GOES', 'The Geostationary Operational Environmental Satellite Program.')], attrs.Physobs: [('flux', 'a measure of the amount of radiation received by an object from a given source.')], attrs.Provider: [('NOAA', 'The National Oceanic and Atmospheric Administration.')], attrs.Level: [('1b', 'Solar images at six wavelengths with image exposures 10 msec or 1 sec.'), ('2', 'Weighted average of level-1b product files of SUVI.')], attrs.Wavelength: [('*')]} return adict ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/gong.py0000644000175100001710000000406000000000000021520 0ustar00vstsdockerfrom sunpy.net.dataretriever import GenericClient __all__ = ['GONGClient'] class GONGClient(GenericClient): """ Provides access to the Magnetogram products of NSO-GONG synoptic Maps. Searches data hosted by the `National Solar Observatory `__ Examples -------- >>> from sunpy.net import Fido, attrs as a >>> results = Fido.search(a.Time("2019/12/31 22:00", "2020/1/1 02:00"), ... a.Instrument('GONG')) #doctest: +REMOTE_DATA >>> results #doctest: +REMOTE_DATA Results from 1 Provider: 5 Results from the GONGClient: Source: https://gong2.nso.edu/oQR/zqs Start Time End Time ... Provider ExtentType ----------------------- ----------------------- ... -------- ---------- 2019-12-31 22:14:00.000 2019-12-31 22:14:59.999 ... NSO SYNOPTIC 2019-12-31 23:04:00.000 2019-12-31 23:04:59.999 ... NSO SYNOPTIC 2019-12-31 23:54:00.000 2019-12-31 23:54:59.999 ... NSO SYNOPTIC 2020-01-01 00:14:00.000 2020-01-01 00:14:59.999 ... NSO SYNOPTIC 2020-01-01 01:14:00.000 2020-01-01 01:14:59.999 ... NSO SYNOPTIC """ baseurl = (r'https://gong2.nso.edu/oQR/zqs/%Y%m/mrzqs%y%m%d/mrzqs%y%m%dt%H%Mc' r'(\d){4}_(\d){3}\.fits.gz') pattern = '{}/zqs/{year:4d}{month:2d}/mrzqs{:4d}{day:2d}/mrzqs{:6d}t{hour:2d}{minute:2d}c{}' @property def info_url(self): return 'https://gong2.nso.edu/oQR/zqs' @classmethod def register_values(cls): from sunpy.net import attrs adict = {attrs.Instrument: [("GONG", "Global Oscillation Network Group.")], attrs.Physobs: [("LOS_MAGNETIC_FIELD", "Line of sight magnetic field")], attrs.Provider: [('NSO', 'National Solar Observatory.')], attrs.ExtentType: [("SYNOPTIC", "Coverage of a complete solar rotation synthesized over time")]} return adict ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/lyra.py0000644000175100001710000000464700000000000021550 0ustar00vstsdocker# Author: Rishabh Sharma # This module was developed under funding provided by # Google Summer of Code 2014 from sunpy.net.dataretriever.client import GenericClient __all__ = ['LYRAClient'] class LYRAClient(GenericClient): """ Provides access to the LYRA/Proba2 data archive. Hosted by the `PROBA2 Science Center `__. Examples -------- >>> from sunpy.net import Fido, attrs as a >>> results = Fido.search(a.Time("2016/1/1", "2016/1/2"), ... a.Instrument.lyra) #doctest: +REMOTE_DATA >>> results #doctest: +REMOTE_DATA Results from 1 Provider: 4 Results from the LYRAClient: Source: http://proba2.oma.be/lyra/data/bsd Start Time End Time Instrument ... Provider Level ----------------------- ----------------------- ---------- ... -------- ----- 2016-01-01 00:00:00.000 2016-01-01 23:59:59.999 LYRA ... ESA 2 2016-01-01 00:00:00.000 2016-01-01 23:59:59.999 LYRA ... ESA 3 2016-01-02 00:00:00.000 2016-01-02 23:59:59.999 LYRA ... ESA 2 2016-01-02 00:00:00.000 2016-01-02 23:59:59.999 LYRA ... ESA 3 """ baseurl = (r'http://proba2.oma.be/lyra/data/bsd/%Y/%m/%d/' r'lyra_(\d){8}-000000_lev(\d){1}_std.fits') pattern = '{}/bsd/{year:4d}/{month:2d}/{day:2d}/{}_lev{Level:1d}_std.fits' @property def info_url(self): return 'http://proba2.oma.be/lyra/data/bsd' @classmethod def register_values(cls): from sunpy.net import attrs adict = {attrs.Instrument: [('LYRA', 'Lyman Alpha Radiometer is the solar UV radiometer on board Proba-2.')], attrs.Physobs: [('irradiance', 'the flux of radiant energy per unit area.')], attrs.Source: [('PROBA2', 'The PROBA-2 Satellite')], attrs.Provider: [('ESA', 'The European Space Agency.')], attrs.Level: [('1', 'LYRA: Metadata and uncalibrated data daily fits.'), ('2', 'LYRA: Calibrated data, provided as daily fits.'), ('3', 'LYRA: Same as level 2 but the calibrated data is averaged over 1 min.')]} return adict ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/noaa.py0000644000175100001710000001637500000000000021520 0ustar00vstsdocker# Author: Rishabh Sharma # This module was developed under funding provided by # Google Summer of Code 2014 from sunpy.net import attrs as a from sunpy.net.dataretriever import GenericClient, QueryResponse __all__ = ['NOAAIndicesClient', 'NOAAPredictClient', 'SRSClient'] class NOAAIndicesClient(GenericClient): """ Provides access to the NOAA solar cycle indices. Uses the `SWPC NOAA archive `__. This is a fixed dataset so the result is independent of the time range. Examples -------- >>> from sunpy.net import Fido, attrs as a >>> results = Fido.search(a.Time("2016/1/1", "2016/1/2"), ... a.Instrument.noaa_indices) #doctest: +REMOTE_DATA >>> results #doctest: +REMOTE_DATA Results from 1 Provider: 1 Results from the NOAAIndicesClient: Source: https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json Instrument Physobs Source Provider ------------ -------------- ------ -------- NOAA-Indices sunspot number SIDC SWPC """ required = {a.Instrument} @property def info_url(self): return 'https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json' def search(self, *args, **kwargs): rowdict = self._get_match_dict(*args, **kwargs) for key in rowdict: if isinstance(rowdict[key], list): # uses first value among the list of possible values corresponding to an Attr # returned by `get_match_dict()` to be shown in query response table. rowdict[key] = rowdict[key][0] rowdict['url'] = 'https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json' rowdict['Instrument'] = 'NOAA-Indices' # These results are not dependant on time, but we allow time as a # parameter for easy searching, so remove time from the results table # injected by GenericClient. rowdict.pop('Start Time', None) rowdict.pop('End Time', None) return QueryResponse([rowdict], client=self) @classmethod def register_values(cls): from sunpy.net import attrs adict = {attrs.Instrument: [ ('NOAA-Indices', 'Recent Solar Indices of Observed Monthly Mean Values')], attrs.Physobs: [('sunspot number', 'Sunspot Number.')], attrs.Source: [('SIDC', 'The Solar Influence Data Analysis Center')], attrs.Provider: [('SWPC', 'The Space Weather Prediction Center.')], attrs.Time: [('*')]} return adict class NOAAPredictClient(GenericClient): """ Provides access to the NOAA SWPC predicted sunspot Number and 10.7 cm radio flux values. Uses the `SWPC NOAA archive `__. This is a fixed prediction so the result is independent of the time range. Examples -------- >>> from sunpy.net import Fido, attrs as a >>> results = Fido.search(a.Time("2016/1/1", "2016/1/2"), ... a.Instrument.noaa_predict) #doctest: +REMOTE_DATA >>> results #doctest: +REMOTE_DATA Results from 1 Provider: 1 Results from the NOAAPredictClient: Source: https://services.swpc.noaa.gov/json/solar-cycle/predicted-solar-cycle.json Instrument Physobs Source Provider ------------ -------------- ------ -------- NOAA-Predict sunspot number ISES SWPC """ required = {a.Instrument} @property def info_url(self): return 'https://services.swpc.noaa.gov/json/solar-cycle/predicted-solar-cycle.json' def search(self, *args, **kwargs): rowdict = self._get_match_dict(*args, **kwargs) for key in rowdict: if isinstance(rowdict[key], list): # uses first value among the list of possible values corresponding to an Attr # returned by `get_match_dict()` to be shown in query response table. rowdict[key] = rowdict[key][0] rowdict['url'] = 'https://services.swpc.noaa.gov/json/solar-cycle/predicted-solar-cycle.json' rowdict['Instrument'] = 'NOAA-Predict' # These results are not dependant on time, but we allow time as a # parameter for easy searching, so remove time from the results table # injected by GenericClient. rowdict.pop('Start Time', None) rowdict.pop('End Time', None) return QueryResponse([rowdict], client=self) @classmethod def register_values(cls): from sunpy.net import attrs adict = {attrs.Instrument: [ ('NOAA-Predict', 'Predicted Sunspot Number And Radio Flux Values With Expected Ranges.')], attrs.Physobs: [('sunspot number', 'Sunspot Number.')], attrs.Source: [('ISES', 'The International Space Environmental Services.')], attrs.Provider: [('SWPC', 'The Space Weather Prediction Center.')], attrs.Time: [('*')]} return adict class SRSClient(GenericClient): """ Provides access to the NOAA SWPC solar region summary data. Uses the `ftp archive `__. Notes ----- Data pre-1996 is in free-form text, which cannot be parsed by sunpy, and therefore only results from 1996 onwards are returned by this client. Examples -------- >>> from sunpy.net import Fido, attrs as a >>> results = Fido.search(a.Time("2016/1/1", "2016/1/2"), ... a.Instrument.soon) #doctest: +REMOTE_DATA >>> results #doctest: +REMOTE_DATA Results from 1 Provider: 2 Results from the SRSClient: Start Time End Time Instrument ... Source Provider ----------------------- ----------------------- ---------- ... ------ -------- 2016-01-01 00:00:00.000 2016-01-01 23:59:59.999 SOON ... SWPC NOAA 2016-01-02 00:00:00.000 2016-01-02 23:59:59.999 SOON ... SWPC NOAA """ baseurl = r'ftp://ftp.ngdc.noaa.gov/STP/swpc_products/daily_reports/solar_region_summaries/%Y/%m/%Y%m%dSRS.txt' pattern = '{}/{year:4d}/{month:2d}/{year:4d}{month:2d}{day:2d}SRS.txt' def fetch(self, *args, **kwargs): """ Download a set of results. """ # Server does not support the normal aioftp passive command. kwargs["passive_commands"] = ["pasv"] super().fetch(*args, **kwargs) @classmethod def register_values(cls): from sunpy.net import attrs adict = {attrs.Instrument: [("SOON", "Solar Region Summary."), ("SRS-Table", "Solar Region Summary.")], attrs.Physobs: [('SRS', 'Solar Region Summary.')], attrs.Source: [('SWPC', 'The Space Weather Prediction Center.')], attrs.Provider: [('NOAA', 'The National Oceanic and Atmospheric Administration.')]} return adict ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/norh.py0000644000175100001710000000717300000000000021544 0ustar00vstsdocker# Author: Rishabh Sharma # This Module was developed under funding provided by # Google Summer of Code 2014 import astropy.units as u from sunpy.net import attrs as a from sunpy.net.dataretriever import GenericClient __all__ = ['NoRHClient'] class NoRHClient(GenericClient): """ Provides access to the Nobeyama RadioHeliograph (NoRH) averaged correlation time series data. Uses this `ftp archive `__ hosted by the `NoRH Science Center `__. Queries to NoRH should specify either 17GHz or 34GHz as a Wavelength. Examples -------- >>> import astropy.units as u >>> from sunpy.net import Fido, attrs as a >>> results = Fido.search(a.Time("2016/1/1", "2016/1/2"), ... a.Instrument.norh, a.Wavelength(17*u.GHz)) #doctest: +REMOTE_DATA >>> results #doctest: +REMOTE_DATA Results from 1 Provider: 2 Results from the NoRHClient: Source: https://solar.nro.nao.ac.jp/norh/doc/manuale/node1.html Start Time End Time ... Provider Wavelength ... GHz ----------------------- ----------------------- ... -------- ---------- 2016-01-01 00:00:00.000 2016-01-01 23:59:59.999 ... NRO 17.0 2016-01-02 00:00:00.000 2016-01-02 23:59:59.999 ... NRO 17.0 """ baseurl = r'ftp://solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/%Y/%m/(\w){3}%y%m%d' pattern = '{}/tcx/{year:4d}/{month:2d}/{Wavelength:3l}{:4d}{day:2d}' @property def info_url(self): return 'https://solar.nro.nao.ac.jp/norh/doc/manuale/node1.html' @classmethod def pre_search_hook(cls, *args, **kwargs): """ Converts the wavelength specified in the query to its representation in the url which can be used by the scraper. """ d = cls._get_match_dict(*args, **kwargs) waverange = a.Wavelength(34*u.GHz, 17*u.GHz) req_wave = d.get('Wavelength', waverange) wmin = req_wave.min.to(u.GHz, equivalencies=u.spectral()) wmax = req_wave.max.to(u.GHz, equivalencies=u.spectral()) req_wave = a.Wavelength(wmin, wmax) d['Wavelength'] = [] if 17*u.GHz in req_wave: d['Wavelength'].append('tca') if 34*u.GHz in req_wave: d['Wavelength'].append('tcz') return cls.baseurl, cls.pattern, d def post_search_hook(self, exdict, matchdict): """ This method converts 'tca' and 'tcz' in the url's metadata to a frequency of '17 GHz' and '34 GHz' respectively. """ rowdict = super().post_search_hook(exdict, matchdict) if rowdict['Wavelength'] == 'tca': rowdict['Wavelength'] = 17*u.GHz elif rowdict['Wavelength'] == 'tcz': rowdict['Wavelength'] = 34*u.GHz return rowdict @classmethod def register_values(cls): from sunpy.net import attrs adict = {attrs.Instrument: [('NORH', ('Nobeyama Radio Heliograph is an imaging radio telescope at 17 ' 'or 34GHz located at the Nobeyama Solar Radio Observatory.'))], attrs.Source: [('NAOJ', 'The National Astronomical Observatory of Japan')], attrs.Provider: [('NRO', 'Nobeyama Radio Observatory')], attrs.Wavelength: [('*')]} return adict ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/rhessi.py0000644000175100001710000002153500000000000022071 0ustar00vstsdocker# Author: Rishabh Sharma # This module was developed under funding provided by # Google Summer of Code 2014 import csv import socket from datetime import datetime from urllib.error import URLError from urllib.request import urlopen, urlretrieve from dateutil.rrule import MONTHLY, rrule from astropy.time import Time from sunpy.extern.parse import parse from sunpy.net.dataretriever import GenericClient, QueryResponse from sunpy.time import TimeRange, parse_time __all__ = ['RHESSIClient'] 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 parse_observing_summary_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 ------- `dict` Return a `dict` containing the parsed data in the dbase file. References ---------- https://hesperia.gsfc.nasa.gov/ssw/hessi/doc/guides/hessi_data_access.htm#Observing%20Summary%20Data """ # An example dbase file can be found at: # https://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(Time.strptime(row[3], "%d-%b-%y")) # skip time end_time.append(Time.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_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 OSError(f'Unable to find an online HESSI server from {data_servers}') class RHESSIClient(GenericClient): """ Provides access to the RHESSI observing summary time series data. Uses this `archive `__ or its mirrors. Examples -------- >>> from sunpy.net import Fido, attrs as a >>> results = Fido.search(a.Time("2016/1/1", "2016/1/2"), ... a.Instrument.rhessi, a.Physobs.summary_lightcurve) #doctest: +REMOTE_DATA >>> results #doctest: +REMOTE_DATA Results from 1 Provider: 2 Results from the RHESSIClient: Source: https://hesperia.gsfc.nasa.gov/hessidata Start Time End Time Instrument ... Source Provider ----------------------- ----------------------- ---------- ... ------ -------- 2016-01-01 00:00:00.000 2016-01-01 23:59:59.999 RHESSI ... RHESSI NASA 2016-01-02 00:00:00.000 2016-01-02 23:59:59.999 RHESSI ... RHESSI NASA """ pattern = '{}/catalog/hsi_obssumm_{year:4d}{month:2d}{day:2d}_{}' @property def info_url(self): return 'https://hesperia.gsfc.nasa.gov/hessidata' def get_observing_summary_filename(self, time_range): """ Download the RHESSI observing summary data from one of the RHESSI servers, parses it, and returns the name of the observing summary files relevant for the time range. Parameters ---------- time_range : str, `sunpy.time.TimeRange` A `sunpy.time.TimeRange` or time range compatible string. Returns ------- out : list Returns the urls of the observation summary file Examples -------- >>> from sunpy.net.dataretriever.sources.rhessi import RHESSIClient >>> RHESSIClient().get_observing_summary_filename(('2011/04/04', '2011/04/04')) # doctest: +REMOTE_DATA ['https://.../hessidata/metadata/catalog/hsi_obssumm_20110404_058.fits'] """ dt = TimeRange(time_range) # remove time from dates dt = TimeRange(dt.start.strftime('%Y-%m-%d'), dt.end.strftime('%Y-%m-%d')) filenames = [] diff_months = (dt.end.datetime.year - dt.start.datetime.year) * \ 12 + dt.end.datetime.month - dt.start.datetime.month first_month = datetime(dt.start.datetime.year, dt.start.datetime.month, 1) month_list = rrule(MONTHLY, dtstart=first_month, count=diff_months+1) # need to download and inspect the dbase file to determine the filename # for the observing summary data # the dbase files are monthly but contain the daily filenames for this_month in month_list: dbase_file_name, hdrs = self.get_observing_summary_dbase_file(this_month) dbase_dat = parse_observing_summary_dbase_file(dbase_file_name) this_month_obssumm_filenames = dbase_dat.get('filename') daily_filenames_dates = [datetime.strptime( d[0:20], 'hsi_obssumm_%Y%m%d') for d in this_month_obssumm_filenames] for i, this_date in enumerate(daily_filenames_dates): if dt.start <= this_date <= dt.end: filenames.append( get_base_url()+f'metadata/catalog/{this_month_obssumm_filenames[i]}s') return filenames @staticmethod def get_observing_summary_dbase_file(time): """ Download the RHESSI observing summary database file for the time given. One file covers an entire month. This file lists the name of observing summary files for specific times. Parameters ---------- time : `str`, datetime 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 -------- >>> from sunpy.net.dataretriever.sources.rhessi import RHESSIClient >>> fname, headers = RHESSIClient.get_observing_summary_dbase_file('2011/04/04') # doctest: +REMOTE_DATA 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 = parse_time(time) if _time < parse_time("2002/02/01"): raise ValueError("RHESSI summary files are not available before 2002-02-01") url = get_base_url() + f'dbase/{_time.strftime("hsi_obssumm_filedb_%Y%m.txt")}' return urlretrieve(url) def search(self, *args, **kwargs): _, pattern, matchdict = self.pre_search_hook(*args, **kwargs) timerange = TimeRange(matchdict['Start Time'], matchdict['End Time']) metalist = [] for url in self.get_observing_summary_filename(timerange): exdict = parse(pattern, url).named exdict['url'] = url rowdict = super().post_search_hook(exdict, matchdict) metalist.append(rowdict) return QueryResponse(metalist, client=self) @classmethod def register_values(cls): from sunpy.net import attrs adict = {attrs.Instrument: [('RHESSI', 'Reuven Ramaty High Energy Solar Spectroscopic Imager.')], attrs.Physobs: [("summary_lightcurve", "A summary lightcurve.")], attrs.Source: [('RHESSI', 'Reuven Ramaty High Energy Solar Spectroscopic Imager.')], attrs.Provider: [('NASA', 'The National Aeronautics and Space Administration.')]} return adict ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6412754 sunpy-3.1.5/sunpy/net/dataretriever/sources/tests/0000755000175100001710000000000000000000000021356 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/tests/__init__.py0000644000175100001710000000000000000000000023455 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/tests/test_eve.py0000644000175100001710000001301600000000000023547 0ustar00vstsdockerimport pytest import sunpy.net.dataretriever.sources.eve as eve from sunpy.net import Fido from sunpy.net import attrs as a from sunpy.net._attrs import Instrument, Level, Time from sunpy.net.dataretriever.client import QueryResponse from sunpy.net.fido_factory import UnifiedResponse from sunpy.net.vso import VSOClient from sunpy.time import parse_time @pytest.fixture def LCClient(): return eve.EVEClient() @pytest.mark.remote_data @pytest.mark.parametrize("timerange,url_start,url_end", [ (Time('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' ), (Time('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', ), (Time('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(LCClient, timerange, url_start, url_end): qresponse = LCClient.search(timerange) urls = [i['url'] for i in qresponse] assert isinstance(urls, list) assert urls[0] == url_start assert urls[-1] == url_end def test_can_handle_query(LCClient): ans1 = LCClient._can_handle_query( Time('2012/8/9', '2012/8/10'), Instrument('eve'), Level(0)) assert ans1 is True ans2 = LCClient._can_handle_query(Time('2012/7/7', '2012/7/7')) assert ans2 is False ans3 = LCClient._can_handle_query( Time('2012/8/9', '2012/8/10'), Instrument('eve'), a.Source('sdo')) assert ans3 is True ans4 = LCClient._can_handle_query( Time('2012/8/9', '2012/8/10'), Instrument('eve'), Level('0CS')) assert ans4 is False ans5 = LCClient._can_handle_query( Time('2012/8/9', '2012/8/10'), Instrument('eve'), Level('wibble')) assert ans5 is False ans6 = LCClient._can_handle_query( Time('2012/8/9', '2012/8/10'), Instrument('eve'), Level(0.5)) assert ans6 is False @pytest.mark.remote_data def test_query(LCClient): qr1 = LCClient.search(Time('2012/8/9', '2012/8/10'), Instrument('eve')) assert isinstance(qr1, QueryResponse) assert len(qr1) == 2 assert qr1['Start Time'][0].datetime == parse_time('2012/08/09').datetime assert qr1['End Time'][1].datetime == parse_time('2012/08/10 23:59:59.999').datetime @pytest.mark.remote_data @pytest.mark.parametrize("time,instrument", [ (Time('2012/11/27', '2012/11/27'), Instrument('eve')), ]) def test_get(LCClient, time, instrument): qr1 = LCClient.search(time, instrument) res = LCClient.fetch(qr1) assert len(res) == len(qr1) res2 = LCClient.fetch(qr1[0]) assert len(res2) == 1 @pytest.mark.remote_data @pytest.mark.parametrize( 'query', [(a.Time('2012/10/4', '2012/10/5') & a.Instrument.eve & a.Level.zero)]) def test_fido(LCClient, query): qr = Fido.search(query) client = qr[0].client assert isinstance(qr, UnifiedResponse) assert isinstance(client, eve.EVEClient) response = Fido.fetch(qr) assert len(response) == qr._numfile @pytest.mark.remote_data @pytest.mark.parametrize( 'time', [(a.Time('2012/10/4', '2012/10/6'))]) def test_levels(time): """ Test the correct handling of level Level 0 comes from EVEClient, other levels from EVE. """ eve_a = a.Instrument.eve qr = Fido.search(time, eve_a, a.Level.one) clients = {type(a.client) for a in qr} assert clients == {VSOClient} qr = Fido.search(time, eve_a, a.Level.zero) clients = {type(a.client) for a in qr} assert clients == {eve.EVEClient} # This is broken because the VSO Eve client doesn't provide a way of allowing Level. # qr = Fido.search(time, eve_a, a.Level.zero | a.Level.one) # clients = {type(a.client) for a in qr} # assert clients == {eve.EVEClient} def test_attr_reg(): assert a.Instrument.eve == a.Instrument('EVE') assert a.Level.zero == a.Level('0') def test_client_repr(LCClient): """ Repr check """ output = str(LCClient) assert output[:50] == 'sunpy.net.dataretriever.sources.eve.EVEClient\n\nPro' def mock_query_object(LCClient): """ Creating a Query Response object and prefilling it with some information """ # Creating a Query Response Object start = '2016/1/1' end = '2016/1/1 23:59:59' obj = { 'Start Time': parse_time(start), 'End Time': parse_time(end), 'Instrument': 'EVE', 'Physobs': 'irradiance', 'Source': 'SDO', 'Provider': 'LASP', 'Level': '0', 'url': ('http://lasp.colorado.edu/eve/data_access/evewebdata/' 'quicklook/L0CS/SpWx/2016/20160101_EVE_L0CS_DIODES_1m.txt') } results = QueryResponse([obj], client=LCClient) return results def test_show(LCClient): mock_qr = mock_query_object(LCClient) qrshow0 = mock_qr.show() qrshow1 = mock_qr.show('Start Time', 'Instrument') allcols = {'Start Time', 'End Time', 'Instrument', 'Physobs', 'Source', 'Provider', 'Level', 'url'} assert not allcols.difference(qrshow0.colnames) assert qrshow1.colnames == ['Start Time', 'Instrument'] assert qrshow0['Instrument'][0] == 'EVE' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/tests/test_fermi_gbm.py0000644000175100001710000001050100000000000024713 0ustar00vstsdockerimport pytest from hypothesis import given import astropy.units as u from astropy.time import TimeDelta import sunpy.net.dataretriever.sources.fermi_gbm as fermi_gbm from sunpy.net import Fido from sunpy.net import attrs as a from sunpy.net.dataretriever.client import QueryResponse from sunpy.net.fido_factory import UnifiedResponse from sunpy.net.tests.strategies import time_attr from sunpy.time import parse_time @pytest.fixture def LCClient(): return fermi_gbm.GBMClient() @pytest.mark.remote_data @pytest.mark.parametrize("timerange,url_start,url_end", [(a.Time('2011/06/07', '2011/06/09'), 'https://heasarc.gsfc.nasa.gov/FTP/fermi/data/gbm/daily/2011/06/07/' 'current/glg_cspec_n5_110607_v00.pha', 'https://heasarc.gsfc.nasa.gov/FTP/fermi/data/gbm/daily/2011/06/09/' 'current/glg_cspec_n5_110609_v00.pha')]) def test_get_url_for_time_range(LCClient, timerange, url_start, url_end): qresponse = LCClient.search(timerange, a.Detector.n5, a.Resolution.cspec) urls = [i['url'] for i in qresponse] assert isinstance(urls, list) assert urls[0] == url_start assert urls[-1] == url_end @given(time_attr()) def test_can_handle_query(time): LCClient = fermi_gbm.GBMClient() ans1 = LCClient._can_handle_query(time, a.Instrument.gbm) assert ans1 is True ans2 = LCClient._can_handle_query(time, a.Instrument.gbm, a.Detector.n5) assert ans2 is True ans3 = LCClient._can_handle_query(time, a.Instrument.gbm, a.Detector.n5, a.Resolution.ctime) assert ans3 is True ans4 = LCClient._can_handle_query(time) assert ans4 is False @pytest.mark.remote_data @pytest.mark.parametrize("time,instrument", [ (a.Time('2012/8/9', '2012/8/9'), a.Instrument.gbm), ]) def test_query(LCClient, time, instrument): qr1 = LCClient.search(time, instrument, a.Detector.n5, a.Resolution.ctime) assert isinstance(qr1, QueryResponse) assert len(qr1) == 1 almost_day = TimeDelta(1 * u.day - 1 * u.millisecond) assert qr1.time_range().start == time.start.to_datetime() assert qr1.time_range().end == (time.end + almost_day).to_datetime() @pytest.mark.remote_data @pytest.mark.parametrize("time,instrument", [ (a.Time('2012/11/27', '2012/11/27'), a.Instrument.gbm), ]) def test_get(LCClient, time, instrument): qr1 = LCClient.search(time, instrument, a.Detector.n5, a.Resolution.ctime) download_list = LCClient.fetch(qr1) assert len(download_list) == len(qr1) @pytest.mark.remote_data @pytest.mark.parametrize( 'query', [(a.Time('2012/10/4', '2012/10/5') & a.Instrument.gbm & a.Detector.n5)]) def test_fido(LCClient, query): qr = Fido.search(query) client = qr[0].client assert isinstance(qr, UnifiedResponse) assert type(client) == type(LCClient) response = Fido.fetch(qr) assert len(response) == qr._numfile def test_attr_reg(): assert a.Instrument.gbm == a.Instrument('GBM') def test_client_repr(LCClient): """ Repr check """ output = str(LCClient) assert output[:50] == 'sunpy.net.dataretriever.sources.fermi_gbm.GBMClien' def mock_query_object(LCClient): """ Creating a Query Response object and prefilling it with some information """ # Creating a Query Response Object start = '2016/1/1' end = '2016/1/1 23:59:59' obj = { 'Start Time': parse_time(start), 'End Time': parse_time(end), 'Instrument': 'GBM', 'Physobs': 'flux', 'Source': 'FERMI', 'Provider': 'NASA', 'Resolution': 'cspec', 'Detector': 'n5', 'url': ('https://heasarc.gsfc.nasa.gov/FTP/fermi/data/gbm/daily/' '2016/01/01/current/glg_cspec_n5_160101_v00.pha') } results = QueryResponse([obj], client=LCClient) return results def test_show(LCClient): mock_qr = mock_query_object(LCClient) qrshow0 = mock_qr.show() qrshow1 = mock_qr.show('Start Time', 'Instrument') allcols = {'Start Time', 'End Time', 'Instrument', 'Physobs', 'Source', 'Provider', 'Resolution', 'Detector', 'url'} assert not allcols.difference(qrshow0.colnames) assert qrshow1.colnames == ['Start Time', 'Instrument'] assert qrshow0['Instrument'][0] == 'GBM' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/tests/test_goes_suvi.py0000644000175100001710000002143600000000000025000 0ustar00vstsdockerimport tempfile import pytest from hypothesis import given import astropy.units as u from astropy.time import Time import sunpy.net.dataretriever.sources.goes as goes from sunpy.net import Fido from sunpy.net import attrs as a from sunpy.net.dataretriever.client import QueryResponse from sunpy.net.tests.strategies import time_attr from sunpy.time import parse_time @pytest.fixture def suvi_client(): return goes.SUVIClient() @given(time_attr()) def test_can_handle_query(time): # Don't use the fixture, as hypothesis complains suvi_client = goes.SUVIClient() ans1 = suvi_client._can_handle_query(time, a.Instrument.suvi) assert ans1 is True ans2 = suvi_client._can_handle_query(time, a.Instrument.suvi, a.Wavelength(131 * u.Angstrom)) assert ans2 is True ans3 = suvi_client._can_handle_query(time, a.Instrument.suvi, a.Wavelength(131 * u.Angstrom), a.Level.two) assert ans3 is True ans4 = suvi_client._can_handle_query(time) assert ans4 is False ans5 = suvi_client._can_handle_query(time, a.Instrument.aia) assert ans5 is False ans6 = suvi_client._can_handle_query(time, a.Instrument.suvi, a.goes.SatelliteNumber(16)) assert ans6 is True def mock_query_object(suvi_client): """ Creating a Query Response object and prefilling it with some information """ # Creating a Query Response Object start = '2019/05/25 00:50' end = '2019/05/25 00:52' wave = 94 * u.Angstrom obj = { 'Start Time': parse_time(start), 'End Time': parse_time(end), 'Instrument': 'SUVI', 'Physobs': 'flux', 'Source': 'GOES', 'Provider': 'NOAA', 'Level': '2', 'Wavelength': wave, 'url': ('https://data.ngdc.noaa.gov/platforms/solar-space-observing-satellites' '/goes/goes16/l2/data/suvi-l2-ci094/2019/05/25/' 'dr_suvi-l2-ci094_g16_s20190525T005200Z_e20190525T005600Z_v1-0-0.fits') } results = QueryResponse([obj], client=suvi_client) return results def test_attr_reg(): a.Instrument.suvi = a.Instrument("SUVI") a.goes.SatelliteNumber.A16 = a.goes.SatelliteNumber("16") @pytest.mark.remote_data def test_fetch_working(suvi_client): """ Tests if the online server for goes_suvi is working. This also checks if the mock is working well. """ start = '2019/05/25 00:50' end = '2019/05/25 00:52' wave = 94 * u.Angstrom goes_sat = a.goes.SatelliteNumber.sixteen tr = a.Time(start, end) qr1 = suvi_client.search(tr, a.Instrument.suvi, a.Wavelength(wave), goes_sat, a.Level(2)) # Mock QueryResponse object mock_qr = mock_query_object(suvi_client) # Compare if two objects have the same attribute mock_qr = mock_qr[0] qr = qr1[0] assert mock_qr['Source'] == qr['Source'] assert mock_qr['Provider'] == qr['Provider'] assert mock_qr['Physobs'] == qr['Physobs'] assert mock_qr['Instrument'] == qr['Instrument'] assert mock_qr['url'] == qr['url'] assert qr1['Start Time'] == Time("2019-05-25T00:52:00.000") assert qr1['End Time'] == Time("2019-05-25T00:56:00.000") with tempfile.TemporaryDirectory() as tmpdirname: download_list = suvi_client.fetch(qr1, path=tmpdirname) assert len(download_list) == len(qr1) @pytest.mark.remote_data @pytest.mark.parametrize("start, end, wave, expected_num_files", [('2019/05/25 00:50', '2019/05/25 00:52', 94, 1), ('2019/05/25 00:50', '2019/05/25 00:52', 131, 1), ('2019/05/25 00:50', '2019/05/25 00:52', 171, 1), ('2019/05/25 00:50', '2019/05/25 00:52', 195, 1), ('2019/05/25 00:50', '2019/05/25 00:52', 284, 1), ('2019/05/25 00:50', '2019/05/25 00:52', 304, 1)] ) def test_get_url_for_time_range_level2(suvi_client, start, end, wave, expected_num_files): goes_sat = a.goes.SatelliteNumber.sixteen qresponse = suvi_client.search(a.Time(start, end), a.Wavelength(wave * u.Angstrom), goes_sat, a.Level(2)) urls = [i['url'] for i in qresponse] assert isinstance(urls, list) assert len(urls) == expected_num_files @pytest.mark.remote_data @pytest.mark.parametrize("start, end, expected_num_files", [('2019/05/25 00:50', '2019/05/25 00:52', 6)] ) def test_get_url_for_time_range_level2_allwave(suvi_client, start, end, expected_num_files): """check that we get all wavelengths if no wavelength is given""" goes_sat = a.goes.SatelliteNumber.sixteen qresponse = suvi_client.search(a.Time(start, end), goes_sat, a.Level(2)) urls = [i['url'] for i in qresponse] assert isinstance(urls, list) assert len(urls) == expected_num_files @pytest.mark.remote_data @pytest.mark.parametrize("start, end ,wave, expected_num_files", [('2019/05/25 00:50', '2019/05/25 00:54', 94, 6), ('2019/05/25 00:50', '2019/05/25 00:54', 131, 3), ('2019/05/25 00:50', '2019/05/25 00:54', 171, 2), ('2019/05/25 00:50', '2019/05/25 00:54', 195, 7), ('2019/05/25 00:50', '2019/05/25 00:54', 284, 2), ('2019/05/25 00:50', '2019/05/25 00:54', 304, 4)] ) def test_get_url_for_time_range_level1b(suvi_client, start, end, wave, expected_num_files): """check that we get all wavelengths if no wavelength is given""" goes_sat = a.goes.SatelliteNumber.sixteen qresponse = suvi_client.search(a.Time(start, end), a.Wavelength( wave * u.Angstrom), goes_sat, a.Level('1b')) urls = [i['url'] for i in qresponse] assert isinstance(urls, list) assert len(urls) == expected_num_files @pytest.mark.remote_data @pytest.mark.parametrize("start, end ,wave, expected_num_files", [('2019/05/25 00:50', '2019/05/25 00:54', 94, 6), ('2019/05/25 00:50', '2019/05/25 00:54', 131, 3), ('2019/05/25 00:50', '2019/05/25 00:54', 171, 2), ('2019/05/25 00:50', '2019/05/25 00:54', 195, 7), ('2019/05/25 00:50', '2019/05/25 00:54', 284, 2), ('2019/05/25 00:50', '2019/05/25 00:54', 304, 4)] ) def test_fido_onewave_level1b(start, end, wave, expected_num_files): goes_sat = a.goes.SatelliteNumber.sixteen result = Fido.search(a.Time(start, end), a.Instrument.suvi, goes_sat, a.Wavelength(wave * u.Angstrom), a.Level('1b')) assert result.file_num == expected_num_files @pytest.mark.remote_data @pytest.mark.parametrize("start, end, wave1, wave2, expected_num_files", [('2019/05/25 00:50', '2019/05/25 00:54', 1, 100, 6), ('2019/05/25 00:50', '2019/05/25 00:54', 1, 150, 9), ('2019/05/25 00:50', '2019/05/25 00:54', 1, 180, 11), ('2019/05/25 00:50', '2019/05/25 00:54', 1, 200, 18), ('2019/05/25 00:50', '2019/05/25 00:54', 1, 300, 20), ('2019/05/25 00:50', '2019/05/25 00:54', 1, 310, 24)] ) def test_fido_waverange_level1b(start, end, wave1, wave2, expected_num_files): """check that we get all wavelengths if no wavelength is given""" goes_sat = a.goes.SatelliteNumber.sixteen result = Fido.search(a.Time(start, end), a.Instrument.suvi, goes_sat, a.Wavelength(wave1 * u.Angstrom, wave2 * u.Angstrom), a.Level('1b')) assert result.file_num == expected_num_files @pytest.mark.remote_data @pytest.mark.parametrize("start, end, expected_num_files", [('2019/05/25 00:50', '2019/05/25 00:52', 6)] ) def test_query(suvi_client, start, end, expected_num_files): goes_sat = a.goes.SatelliteNumber.sixteen qr1 = suvi_client.search(a.Time(start, end), a.Instrument.suvi, goes_sat, a.Level.two) assert isinstance(qr1, QueryResponse) assert len(qr1) == expected_num_files assert qr1['Start Time'][0] == parse_time('2019/05/25 00:52') assert qr1['End Time'][1] == parse_time('2019/05/25 00:56') def test_show(suvi_client): mock_qr = mock_query_object(suvi_client) qrshow0 = mock_qr.show() qrshow1 = mock_qr.show('Start Time', 'Instrument') allcols = {'Start Time', 'End Time', 'Instrument', 'Physobs', 'Source', 'Provider', 'Level', 'Wavelength', 'url'} assert not allcols.difference(qrshow0.colnames) assert qrshow1.colnames == ['Start Time', 'Instrument'] assert qrshow0['Instrument'][0] == 'SUVI' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/tests/test_goes_ud.py0000644000175100001710000001747400000000000024431 0ustar00vstsdockerimport pytest from hypothesis import given import astropy.units as u from astropy.time import TimeDelta import sunpy.net.dataretriever.sources.goes as goes from sunpy.net import Fido from sunpy.net import attrs as a from sunpy.net._attrs import Instrument, Time from sunpy.net.dataretriever.client import QueryResponse from sunpy.net.fido_factory import UnifiedResponse from sunpy.net.tests.strategies import goes_time from sunpy.time import is_time_equal, parse_time @pytest.fixture def LCClient(): return goes.XRSClient() @pytest.mark.remote_data @pytest.mark.parametrize( "timerange,url_start,url_end", [(Time('1995/06/03 1:00', '1995/06/05'), 'https://umbra.nascom.nasa.gov/goes/fits/1995/go07950603.fits', 'https://umbra.nascom.nasa.gov/goes/fits/1995/go07950605.fits'), (Time('2008/06/02 12:00', '2008/06/04'), 'https://umbra.nascom.nasa.gov/goes/fits/2008/go1020080602.fits', 'https://umbra.nascom.nasa.gov/goes/fits/2008/go1020080604.fits'), (Time('2020/08/02', '2020/08/04'), 'https://data.ngdc.noaa.gov/platforms/solar-space-observing-satellites/goes/' 'goes16/l2/data/xrsf-l2-flx1s_science/2020/08/sci_xrsf-l2-flx1s_g16_d20200802_v2-1-0.nc', 'https://data.ngdc.noaa.gov/platforms/solar-space-observing-satellites/goes/' 'goes17/l2/data/xrsf-l2-flx1s_science/2020/08/sci_xrsf-l2-flx1s_g17_d20200804_v2-1-0.nc')]) def test_get_url_for_time_range(LCClient, timerange, url_start, url_end): qresponse = LCClient.search(timerange) urls = [i['url'] for i in qresponse] assert isinstance(urls, list) assert urls[0] == url_start assert urls[-1] == url_end @pytest.mark.remote_data @pytest.mark.parametrize("timerange, url_start, url_end", [(a.Time('1999/01/10 00:10', '1999/01/20'), 'https://umbra.nascom.nasa.gov/goes/fits/1999/go10990110.fits', 'https://umbra.nascom.nasa.gov/goes/fits/1999/go1019990120.fits')]) def test_get_overlap_urls(LCClient, timerange, url_start, url_end): qresponse = LCClient.search(timerange, a.goes.SatelliteNumber.ten) urls = [i['url'] for i in qresponse] assert len(urls) == 14 assert urls[0] == url_start assert urls[-1] == url_end @pytest.mark.remote_data @pytest.mark.parametrize("timerange, url_start, url_end", [(a.Time("2009/08/30 00:10", "2009/09/02"), "https://umbra.nascom.nasa.gov/goes/fits/2009/go1020090830.fits", "https://satdat.ngdc.noaa.gov/sem/goes/data/science/xrs/goes14/gxrs-l2-irrad_science/" "2009/09/sci_gxrs-l2-irrad_g14_d20090902_v0-0-0.nc")]) def test_get_overlap_providers(LCClient, timerange, url_start, url_end): qresponse = LCClient.search(timerange) urls = [i['url'] for i in qresponse] assert len(urls) == 4 assert urls[0] == url_start assert urls[-1] == url_end @pytest.mark.remote_data @pytest.mark.parametrize("timerange, url_old, url_new", [(a.Time('2013/10/28', '2013/10/29'), "https://umbra.nascom.nasa.gov/goes/fits/2013/go1520131028.fits", "https://satdat.ngdc.noaa.gov/sem/goes/data/science/xrs/goes13/gxrs-l2-irrad_science/" "2013/10/sci_gxrs-l2-irrad_g13_d20131028_v0-0-0.nc")]) def test_old_data_access(timerange, url_old, url_new): # test first for old data qr = Fido.search(timerange, a.Instrument("XRS"), a.Provider("SDAC")) urls = qr[0]['url'] assert urls[0] == url_old # now test for new data qr = Fido.search(timerange, a.Instrument("XRS")) urls = qr[0]['url'] assert urls[0] == url_new @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 @pytest.mark.filterwarnings('ignore:ERFA function.*dubious year') @pytest.mark.remote_data def test_fixed_satellite(LCClient): ans1 = LCClient.search(a.Time("2017/01/01 2:00", "2017/01/02 2:10"), a.Instrument.xrs, a.goes.SatelliteNumber.fifteen) for resp in ans1: assert "g15" in resp['url'] ans1 = LCClient.search(a.Time("2017/01/01", "2017/01/02 23:00"), a.Instrument.xrs, a.goes.SatelliteNumber(13)) for resp in ans1: assert "g13" in resp['url'] ans1 = LCClient.search(a.Time("1999/1/13", "1999/1/16"), a.Instrument.xrs, a.goes.SatelliteNumber(8)) for resp in ans1: assert "go08" in resp['url'] @pytest.mark.parametrize("time", [ Time('2005/4/27', '2005/4/27 12:00'), Time('2016/2/4', '2016/2/10')]) @pytest.mark.remote_data def test_query(LCClient, 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[0]['Start Time'].strftime('%Y-%m-%d') == time.start.strftime('%Y-%m-%d') almost_day = TimeDelta(1*u.day - 1*u.millisecond) end = parse_time(time.end.strftime('%Y-%m-%d')) + almost_day assert is_time_equal(qr1[-1]['End Time'], end) @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(LCClient, time, instrument): qr1 = LCClient.search(time, instrument) download_list = LCClient.fetch(qr1) assert len(download_list) == len(qr1) @pytest.mark.remote_data def test_new_logic(LCClient): qr = LCClient.search(Time('2012/10/4 20:20', '2012/10/6'), Instrument('XRS')) download_list = LCClient.fetch(qr) assert len(download_list) == len(qr) @pytest.mark.remote_data @pytest.mark.parametrize( "time, instrument, expected_num_files", [(a.Time("2012/10/4", "2012/10/5"), a.Instrument.goes, 4), (a.Time('2013-10-28 01:00', '2013-10-28 03:00'), a.Instrument('XRS'), 2)]) def test_fido(time, instrument, expected_num_files): qr = Fido.search(time, instrument) assert isinstance(qr, UnifiedResponse) response = Fido.fetch(qr) assert len(response) == qr._numfile assert len(response) == expected_num_files def test_attr_reg(): assert a.Instrument.goes == a.Instrument("GOES") assert a.Instrument.xrs == a.Instrument("XRS") assert a.goes.SatelliteNumber.two == a.goes.SatelliteNumber("2") def test_client_repr(LCClient): """ Repr check """ output = str(LCClient) assert output[:50] == 'sunpy.net.dataretriever.sources.goes.XRSClient\n\nPr' def mock_query_object(LCClient): """ Creating a Query Response object and prefilling it with some information """ # Creating a Query Response Object start = '2016/1/1' end = '2016/1/1 23:59:59' obj = { 'Start Time': parse_time(start), 'End Time': parse_time(end), 'Instrument': 'GOES', 'Physobs': 'irradiance', 'Source': 'GOES', 'Provider': 'NOAA', 'SatelliteNumber': '15', 'url': 'https://umbra.nascom.nasa.gov/goes/fits/2016/go1520160101.fits' } results = QueryResponse([obj], client=LCClient) return results def test_show(LCClient): mock_qr = mock_query_object(LCClient) qrshow0 = mock_qr.show() qrshow1 = mock_qr.show('Start Time', 'Instrument') allcols = {'Start Time', 'End Time', 'Instrument', 'Physobs', 'Source', 'Provider', 'SatelliteNumber', 'url'} assert not allcols.difference(qrshow0.colnames) assert qrshow1.colnames == ['Start Time', 'Instrument'] assert qrshow0['Instrument'][0] == 'GOES' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/tests/test_gong_synoptic.py0000644000175100001710000000617100000000000025656 0ustar00vstsdockerimport pytest import sunpy.net.dataretriever.sources.gong as gong from sunpy.net import Fido from sunpy.net import attrs as a from sunpy.net._attrs import Instrument, Time from sunpy.net.dataretriever.client import QueryResponse from sunpy.net.fido_factory import UnifiedResponse @pytest.fixture def GSClient(): return gong.GONGClient() @pytest.mark.remote_data @pytest.mark.parametrize("timerange,url_start,url_end", [ (a.Time('2020/1/30', '2020/2/1'), 'https://gong2.nso.edu/oQR/zqs/202001/mrzqs200130/mrzqs200130t0004c2227_349.fits.gz', 'https://gong2.nso.edu/oQR/zqs/202001/mrzqs200131/mrzqs200131t2314c2227_323.fits.gz' ), (a.Time('2020/4/21', '2020/4/22'), 'https://gong2.nso.edu/oQR/zqs/202004/mrzqs200421/mrzqs200421t0004c2230_348.fits.gz', 'https://gong2.nso.edu/oQR/zqs/202004/mrzqs200421/mrzqs200421t2314c2230_335.fits.gz' ), (a.Time('2006/9/19', '2006/9/19 22:00'), 'https://gong2.nso.edu/oQR/zqs/200609/mrzqs060919/mrzqs060919t1154c2048_323.fits.gz', 'https://gong2.nso.edu/oQR/zqs/200609/mrzqs060919/mrzqs060919t1754c2048_320.fits.gz' ) ]) def test_get_url_for_time_range(GSClient, timerange, url_start, url_end): qresponse = GSClient.search(timerange) urls = [i['url'] for i in qresponse] assert isinstance(urls, list) assert urls[0] == url_start assert urls[-1] == url_end @pytest.mark.parametrize( "query, result", [((a.Time('2020/1/1', '2020/1/2'), a.Instrument('gong')), True), ((a.Time('2020/1/1', '2020/1/2'), a.Instrument('goes')), False), ((a.Time('2020/1/1', '2020/1/2'), a.Instrument('gong'), a.Physobs('LOS_MAGNETIC_FIELD'), a.ExtentType('synoptic')), True), ((a.Time('2020/1/1', '2020/1/2'), a.Instrument('gong'), a.ExtentType('synoptic')), True), ((a.Time('2020/1/1', '2020/1/2'), a.Instrument('gong'), a.ExtentType('FULL_DISK')), False)]) def test_can_handle_query(query, result): assert gong.GONGClient._can_handle_query(*query) == result @pytest.mark.remote_data @pytest.mark.parametrize("time,instrument", [ (Time('2013/8/27', '2013/8/27'), Instrument('gong')), (Time('2020/4/23 17:00', '2020/4/23 21:00'), Instrument('gong')), ]) def test_get(GSClient, time, instrument): qr1 = GSClient.search(time, instrument) assert isinstance(qr1, QueryResponse) download_list = GSClient.fetch(qr1) assert len(download_list) == len(qr1) @pytest.mark.remote_data @pytest.mark.parametrize( "time, instrument", [(a.Time('2019/10/4', '2019/10/4 2:00'), a.Instrument('gong')), (a.Time('2019/12/31 21:00', '2020/1/1'), a.Instrument('gong'))]) def test_fido(time, instrument): qr = Fido.search(time, instrument) assert isinstance(qr, UnifiedResponse) response = Fido.fetch(qr) assert len(response) == qr._numfile assert all(map(lambda x: x.endswith('.gz'), response)) def test_attr_reg(): assert a.Instrument.gong == a.Instrument("GONG") assert a.ExtentType.synoptic == a.ExtentType("SYNOPTIC") def test_client_repr(GSClient): """ Repr check """ output = str(GSClient) assert output[:50] == 'sunpy.net.dataretriever.sources.gong.GONGClient\n\nP' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/tests/test_lyra_ud.py0000644000175100001710000001030200000000000024422 0ustar00vstsdockerimport pytest from hypothesis import given import astropy.units as u from astropy.time import TimeDelta import sunpy.net.dataretriever.sources.lyra as lyra from sunpy.net import Fido from sunpy.net import attrs as a from sunpy.net._attrs import Instrument, Time from sunpy.net.dataretriever.client import QueryResponse from sunpy.net.fido_factory import UnifiedResponse from sunpy.net.tests.strategies import range_time from sunpy.time import parse_time @pytest.fixture def LCClient(): return lyra.LYRAClient() @pytest.mark.remote_data @pytest.mark.parametrize("timerange,url_start,url_end", [ (Time('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' ), (Time('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' ), (Time('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(LCClient, timerange, url_start, url_end): qresponse = LCClient.search(timerange, a.Level.two) urls = [i['url'] for i in qresponse] assert isinstance(urls, list) assert urls[0] == url_start assert urls[-1] == url_end @given(range_time('2010-01-06')) def test_can_handle_query(time): LCClient = lyra.LYRAClient() ans1 = LCClient._can_handle_query( time, Instrument('lyra')) assert ans1 is True ans2 = LCClient._can_handle_query(time) assert ans2 is False @pytest.mark.parametrize("time", [ Time('2015/8/27', '2015/8/27'), Time('2016/2/4', '2016/2/6')]) @pytest.mark.remote_data def test_query(LCClient, time): qr1 = LCClient.search(time, Instrument('lyra')) assert isinstance(qr1, QueryResponse) assert qr1[0]['Start Time'] == time.start almost_day = TimeDelta(1 * u.day - 1 * u.millisecond) assert qr1[-1]['End Time'] == time.end + almost_day @pytest.mark.remote_data @pytest.mark.parametrize("time,instrument", [ (Time('2013/8/27', '2013/8/27'), Instrument('lyra'))]) def test_get(LCClient, time, instrument): qr1 = LCClient.search(time, instrument) download_list = LCClient.fetch(qr1) 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)]) def test_fido(time, instrument): qr = Fido.search(time, instrument) assert isinstance(qr, UnifiedResponse) response = Fido.fetch(qr) assert len(response) == qr._numfile def test_attr_reg(): assert a.Instrument.lyra == a.Instrument('LYRA') assert a.Level.one == a.Level('1') assert a.Level.two == a.Level('2') assert a.Level.three == a.Level('3') def test_client_repr(LCClient): """ Repr check """ output = str(LCClient) assert output[:50] == 'sunpy.net.dataretriever.sources.lyra.LYRAClient\n\nP' def mock_query_object(LCClient): """ Creating a Query Response object and prefilling it with some information """ # Creating a Query Response Object start = '2016/1/1' end = '2016/1/1 23:59:59' obj = { 'Start Time': parse_time(start), 'End Time': parse_time(end), 'Instrument': 'LYRA', 'Physobs': 'irradiance', 'Source': 'PROBA2', 'Provider': 'ESA', 'Level': '2', 'url': ('http://proba2.oma.be/lyra/data/bsd/2016/01/01/' 'lyra_20160101-000000_lev2_std.fits') } results = QueryResponse([obj], client=LCClient) return results def test_show(LCClient): mock_qr = mock_query_object(LCClient) qrshow0 = mock_qr.show() qrshow1 = mock_qr.show('Start Time', 'Instrument') allcols = {'Start Time', 'End Time', 'Instrument', 'Physobs', 'Source', 'Provider', 'Level', 'url'} assert not allcols.difference(qrshow0.colnames) assert qrshow1.colnames == ['Start Time', 'Instrument'] assert qrshow0['Instrument'][0] == 'LYRA' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/tests/test_noaa.py0000644000175100001710000002224300000000000023710 0ustar00vstsdockerimport datetime from unittest import mock import pytest from sunpy.net import Fido from sunpy.net import attrs as a from sunpy.net._attrs import Instrument, Time from sunpy.net.dataretriever.client import QueryResponse from sunpy.net.dataretriever.sources import noaa from sunpy.tests.helpers import no_vso from sunpy.time import parse_time @pytest.fixture def indices_client(): return noaa.NOAAIndicesClient() @pytest.fixture def predict_client(): return noaa.NOAAPredictClient() @pytest.fixture def srs_client(): return noaa.SRSClient() def mock_query_object(start_date, end_date): """ Creation of a QueryResponse object, and prefill some downloaded data from noaa.NOAAIndicesClient().fetch(Time('20 ..) """ # Create a mock Query Response object start = parse_time(start_date) end = parse_time(end_date) obj = { 'Start Time': parse_time(start), 'End Time': parse_time(end), 'Instrument': 'NOAA-Indices', 'Physobs': 'sunspot number', 'Source': 'SIDC', 'Provider': 'SWPC', 'url': 'https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json' } results = QueryResponse([obj], client=noaa.NOAAIndicesClient()) return results @pytest.mark.remote_data def test_fetch_working(indices_client, tmpdir): """ Tests if the online server for noaa is working. Uses the url : https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json """ qr1 = indices_client.search(Time('2012/10/4', '2012/10/6'), Instrument('noaa-indices')) # Mock QueryResponse object mock_qr = mock_query_object('2012/10/4', '2012/10/6') # Compare if two objects have the same attribute mock_qr = mock_qr[0] qr = qr1[0] assert mock_qr['Source'] == qr['Source'] assert mock_qr['Provider'] == qr['Provider'] assert mock_qr['Physobs'] == qr['Physobs'] assert mock_qr['Instrument'] == qr['Instrument'] assert mock_qr['url'] == qr['url'] target_dir = tmpdir.mkdir("down") download_list = indices_client.fetch(qr1, path=target_dir) assert len(download_list) == len(qr1) assert download_list[0].split('/')[-1] == 'observed-solar-cycle-indices.json' @pytest.mark.parametrize( "timerange,url_start,url_end", [(Time('1995/06/03', '1995/06/04'), 'https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json', 'https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json'), (Time('2008/06/01', '2008/06/02'), 'https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json', 'https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json')]) def test_get_url_for_time_range(indices_client, timerange, url_start, url_end): resp = indices_client.search(timerange) urls = [i['url'] for i in resp] 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 ans2 = noaa.NOAAIndicesClient._can_handle_query( Time('2012/7/7', '2012/7/7')) assert not ans2 ans3 = noaa.NOAAIndicesClient._can_handle_query( Time('2012/8/9', '2012/8/10'), Instrument('eve')) assert not ans3 @mock.patch('sunpy.net.dataretriever.sources.noaa.NOAAIndicesClient.search', return_value=mock_query_object('2012/8/9', '2012/8/10')) def test_query(mock_search, indices_client): qr1 = indices_client.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') @mock.patch('sunpy.net.dataretriever.sources.noaa.NOAAIndicesClient.search', return_value=mock_query_object('2012/10/4', '2012/10/6')) # The return value of download is irrelevant @mock.patch('parfive.Downloader.download', return_value=None) @mock.patch('parfive.Downloader.enqueue_file') def test_fetch(mock_wait, mock_search, mock_enqueue, tmp_path, indices_client): path = tmp_path / "sub" path.mkdir() qr1 = indices_client.search(Time('2012/10/4', '2012/10/6'), Instrument('noaa-indices')) indices_client.fetch(qr1, path=path / "{file}") # Here we assert that the `fetch` function has called the parfive # Downloader.enqueue_file method with the correct arguments. Everything # that happens after this point should either be tested in the # GenericClient tests or in parfive itself. assert mock_enqueue.called_once_with(("https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json", path / "observed-solar-cycle-indices.json")) @mock.patch('sunpy.net.dataretriever.sources.noaa.NOAAIndicesClient.search', return_value=mock_query_object('2012/10/4', '2012/10/6')) # The return value of download is irrelevant @mock.patch('parfive.Downloader.download', return_value=None) @mock.patch('parfive.Downloader.enqueue_file') @no_vso def test_fido(mock_wait, mock_search, mock_enqueue, tmp_path, indices_client): path = tmp_path / "sub" path.mkdir() qr1 = Fido.search(Time('2012/10/4', '2012/10/6'), Instrument('noaa-indices')) Fido.fetch(qr1, path=path) # Here we assert that the `fetch` function has called the parfive # Downloader.enqueue_file method with the correct arguments. Everything # that happens after this point should either be tested in the # GenericClient tests or in parfive itself. assert mock_enqueue.called_once_with(("https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json", path / "observed-solar-cycle-indices.json")) @no_vso @pytest.mark.remote_data def test_srs_unpack(): qr = Fido.search(a.Instrument("soon") & a.Time("2015/01/01", "2015/01/01T23:59:29")) res = Fido.fetch(qr) assert len(res) == 1 assert res.data[0].endswith("20150101SRS.txt") @no_vso @pytest.mark.remote_data def test_srs_midyear(): qr = Fido.search(a.Instrument("soon") & a.Time("2011/06/07", "2011/06/08T23:59:29")) res = sorted(Fido.fetch(qr)) assert len(res) == 2 assert res[0].endswith("20110607SRS.txt") assert res[-1].endswith("20110608SRS.txt") @no_vso @pytest.mark.remote_data def test_srs_current_year(): # Current year is nothing but text files, all older years should be tar files. year = datetime.date.today().year qr = Fido.search(a.Instrument("soon") & a.Time(f"{year}/01/01", f"{year}/01/01T23:59:29")) res = Fido.fetch(qr) assert len(res) <= 1 if len(res): assert res.data[0].endswith(f"{year}0101SRS.txt") @no_vso @pytest.mark.remote_data def test_srs_save_path(tmpdir): qr = Fido.search(a.Instrument.srs_table, a.Time("2016/10/01", "2016/10/02")) files = sorted(Fido.fetch(qr, path=str(tmpdir))) assert len(files) == 2 assert files[0].endswith("20161001SRS.txt") assert files[1].endswith("20161002SRS.txt") @pytest.mark.remote_data @pytest.mark.filterwarnings('ignore:ERFA function') def test_srs_out_of_range(srs_client): res = srs_client.search(a.Time('1995/01/01', '1995/02/01')) assert len(res) == 0 res = srs_client.search(a.Time('2995/01/01', '2995/02/01')) assert len(res) == 0 @pytest.mark.remote_data @pytest.mark.filterwarnings('ignore:ERFA function') def test_srs_start_or_end_out_of_range(srs_client): res = srs_client.search(a.Time('1995/12/30', '1996/01/02')) assert len(res) == 1 cur_year = datetime.date.today().year res = srs_client.search(a.Time(f'{cur_year}/01/01', f'{cur_year+2}/01/01')) assert len(res) > 0 @pytest.mark.remote_data def test_tar_file_broken(): # 2010 extracts out to 2010_SRS while other years do SRS only. results = Fido.search(a.Time("2010/5/1", "2010/5/2"), a.Instrument.soon) results = Fido.fetch(results) assert len(results) == 2 def test_no_time(predict_client, indices_client): res = indices_client.search(a.Instrument.noaa_indices) assert len(res) == 1 res = predict_client.search(a.Instrument.noaa_predict) assert len(res) == 1 def test_attr_reg(): assert a.Instrument.noaa_indices == a.Instrument("NOAA-Indices") assert a.Instrument.noaa_predict == a.Instrument("NOAA-Predict") assert a.Instrument.srs_table == a.Instrument("SRS-Table") assert a.Instrument.soon == a.Instrument("SOON") def test_client_repr(indices_client): """ Repr check """ output = str(indices_client) assert output[:50] == 'sunpy.net.dataretriever.sources.noaa.NOAAIndicesCl' def test_show(): mock_qr = mock_query_object('2012/10/4', '2012/10/6') qrshow0 = mock_qr.show() qrshow1 = mock_qr.show('Source', 'Instrument') allcols = {'Start Time', 'End Time', 'Instrument', 'Physobs', 'Source', 'Provider', 'url'} assert not allcols.difference(qrshow0.colnames) assert qrshow1.colnames == ['Source', 'Instrument'] assert qrshow0['Instrument'][0] == 'NOAA-Indices' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/tests/test_norh.py0000644000175100001710000001432600000000000023743 0ustar00vstsdockerfrom datetime import timedelta from unittest import mock import pytest from hypothesis import given, settings import astropy.units as u from astropy.time import Time, TimeDelta import sunpy.net.dataretriever.sources.norh as norh from sunpy.net import Fido from sunpy.net import attrs as a from sunpy.net.dataretriever.client import QueryResponse from sunpy.net.fido_factory import UnifiedResponse from sunpy.net.tests.strategies import range_time, time_attr from sunpy.time import parse_time @pytest.fixture def LCClient(): return norh.NoRHClient() def create_url(date, wavelength): year = date.strftime("%Y") month = date.strftime("%m") day = date.strftime("%d") if wavelength == 34 * u.GHz: freq = 'tcz' elif wavelength == 17 * u.GHz: freq = 'tca' value_ = year[-2:] + month + day base = f"ftp://solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/{year}/{month}/{freq}{value_}" return (base) def mock_query_object(timerange): """ Creating a Query Response object and prefilling it with some information """ # Creating a Query Response Object start = timerange.start end = timerange.end wave = 17*u.GHz delta = end-start resp = [] for i in range(delta.datetime.days + 1): start_time = start.datetime + timedelta(days=i) end_time = start_time + timedelta(days=1) - timedelta(milliseconds=1) obj = { 'Start Time': parse_time(start_time), 'End Time': parse_time(end_time), 'Instrument': 'NORH', 'Source': 'NAOJ', 'Provider': 'NRO', 'Wavelength': wave, 'url': create_url(start_time, wave) } resp.append(obj) results = QueryResponse(resp, client=norh.NoRHClient()) return results @pytest.mark.parametrize("timerange,url_start,url_end", [ (a.Time('2012/4/21', '2012/4/21'), 'ftp://solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/2012/04/tca120421', 'ftp://solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/2012/04/tca120421' ), (a.Time('2012/12/1', '2012/12/2'), 'ftp://solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/2012/12/tca121201', 'ftp://solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/2012/12/tca121202' ), (a.Time('2012/3/7', '2012/3/14'), 'ftp://solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/2012/03/tca120307', 'ftp://solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/2012/03/tca120314' ) ]) def test_get_url_for_time_range(LCClient, timerange, url_start, url_end): with mock.patch('sunpy.net.dataretriever.sources.norh.NoRHClient.search', return_value=mock_query_object(timerange)): qresponse = LCClient.search(timerange, a.Wavelength(17*u.GHz)) assert isinstance(qresponse, QueryResponse) urls = [i['url'] for i in qresponse] assert urls[0] == url_start @given(time_attr()) def test_can_handle_query(time): LCClient = norh.NoRHClient() ans1 = LCClient._can_handle_query(time, a.Instrument.norh) assert ans1 is True ans1 = LCClient._can_handle_query(time, a.Instrument.norh, a.Wavelength(10*u.GHz)) assert ans1 is True ans2 = LCClient._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(Time('1992-6-1'))) @settings(max_examples=2, deadline=50000) def test_query(time, wave): LCClient = norh.NoRHClient() qr1 = LCClient.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[0]['Start Time'].strftime('%Y-%m-%d') >= time.start.strftime('%Y-%m-%d') # 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[-1]['End Time'] <= time.end + TimeDelta(1*u.day) @pytest.mark.parametrize("time,instrument,wave", [ (a.Time('2012/10/4', '2012/10/4'), a.Instrument.norh, a.Wavelength(17*u.GHz)), (a.Time('2012/10/4', '2012/10/4'), a.Instrument.norh, a.Wavelength(34*u.GHz))]) def test_get(LCClient, time, instrument, wave): with mock.patch('sunpy.net.dataretriever.sources.norh.NoRHClient.search', return_value=mock_query_object(time)): qr1 = LCClient.search(time, instrument, wave) with mock.patch('sunpy.net.dataretriever.sources.norh.NoRHClient.fetch', return_value=mock_query_object(time)): download_list = LCClient.fetch(qr1) assert len(download_list) == len(qr1) @pytest.mark.parametrize( "time, instrument, wave", [(a.Time('2012/10/4', '2012/10/4'), a.Instrument.norh, a.Wavelength(17*u.GHz) | a.Wavelength(34*u.GHz))]) def test_fido(tmp_path, time, instrument, wave): with mock.patch('sunpy.net.Fido.search', return_value=UnifiedResponse(mock_query_object(time))): path = tmp_path / "sub" qr = Fido.search(time, instrument, wave) assert isinstance(qr, UnifiedResponse) with mock.patch('sunpy.net.Fido.fetch', return_value=UnifiedResponse(mock_query_object(time))): response = Fido.fetch(qr, path=path) assert len(response) == len(qr) def test_attr_reg(): assert a.Instrument.norh == a.Instrument('NORH') def test_client_repr(LCClient): """ Repr check """ output = str(LCClient) assert output[:50] == 'sunpy.net.dataretriever.sources.norh.NoRHClient\n\nP' def test_show(): mock_qr = mock_query_object(a.Time('2016/1/1', '2016/1/1 23:59:59')) qrshow0 = mock_qr.show() qrshow1 = mock_qr.show('Wavelength', 'Instrument') allcols = {'Start Time', 'End Time', 'Instrument', 'Source', 'Provider', 'Wavelength', 'url'} assert not allcols.difference(qrshow0.colnames) assert qrshow1.colnames == ['Wavelength', 'Instrument'] assert qrshow0['Instrument'][0] == 'NORH' assert qrshow1['Wavelength'][0] == 17*u.GHz ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/sources/tests/test_rhessi.py0000644000175100001710000002126000000000000024265 0ustar00vstsdockerimport socket from unittest import mock from urllib.error import URLError import pytest import sunpy.net.dataretriever.sources.rhessi as rhessi from sunpy.net import Fido from sunpy.net import attrs as a from sunpy.net.dataretriever.client import QueryResponse from sunpy.net.fido_factory import UnifiedResponse from sunpy.tests.helpers import no_vso from sunpy.time import TimeRange, parse_time @pytest.fixture def LCClient(): return rhessi.RHESSIClient() @pytest.fixture def one_day_timerange(): return TimeRange(("2016/01/15", "2016/01/16")) @pytest.fixture def two_days_timerange(): return TimeRange(("2016/01/15", "2016/01/17")) def test_get_observing_summary_dbase_file_with_unsupported_start_time(LCClient): """ RHESSI summary files are not available for before 2002-02-01, ensure `ValueError` is raised. """ with pytest.raises(ValueError): LCClient.get_observing_summary_dbase_file("2002/01/21") @mock.patch('sunpy.net.dataretriever.sources.rhessi.urlretrieve', return_value=None) @mock.patch('sunpy.net.dataretriever.sources.rhessi.get_base_url', return_value='http://www.example.com/') def test_get_observing_summary_dbase_file_build_correct_url(mock_get_base_url, mock_urlretrieve, one_day_timerange, LCClient): """ This test ensures that we build the correct url which is then used to get the database file. """ LCClient.get_observing_summary_dbase_file(one_day_timerange.start) mock_urlretrieve.assert_called_with( 'http://www.example.com/dbase/hsi_obssumm_filedb_201601.txt') @mock.patch('sunpy.net.dataretriever.sources.rhessi.urlopen', return_value=None) def test_get_base_url(mock_urlopen): """ Success case, can successfully 'ping' first data_server """ assert rhessi.get_base_url() == rhessi.data_servers[0] @mock.patch('sunpy.net.dataretriever.sources.rhessi.urlopen', side_effect=URLError('')) def test_get_base_url_on_urlerror(mock_urlopen): """ If all tested URLs raise `URLError`, then raise an `IOError` """ with pytest.raises(OSError): rhessi.get_base_url() @mock.patch('sunpy.net.dataretriever.sources.rhessi.urlopen', side_effect=socket.timeout) def test_get_base_url_on_timeout(mock_urlopen): """ If all tested data servers timeout, then raise an `IOError` """ with pytest.raises(OSError): rhessi.get_base_url() def parsed_dbase(): """ The result of calling `parse_observing_summary_dbase_file(...)` on https://hesperia.gsfc.nasa.gov/hessidata/dbase/hsi_obssumm_filedb_200311.txt but only using the first two rows of data. """ return {'filename': ['hsi_obssumm_20031101_157.fit', 'hsi_obssumm_20031102_161.fit', 'hsi_obssumm_20031103_165.fit', 'hsi_obssumm_20031104_168.fit', 'hsi_obssumm_20031105_156.fit'], 'orb_st': [65536, 65536, 65536, 65536, 65536], 'orb_end': [65536, 65536, 65536, 65536, 65536], 'start_time': [parse_time('2003-11-01T00:00:00.000'), parse_time('2003-11-02T00:00:00.000'), parse_time('2003-11-03T00:00:00.000'), parse_time('2003-11-04T00:00:00.000'), parse_time('2003-11-05T00:00:00.000')], 'end_time': [parse_time('2003-11-02T00:00:00.000'), parse_time('2003-11-03T00:00:00.000'), parse_time('2003-11-04T00:00:00.000'), parse_time('2003-11-05T00:00:00.000'), parse_time('2003-11-06T00:00:00.000')], 'status_flag': [0, 0, 0, 0, 0], 'npackets': [0, 0, 0, 0, 0]} @mock.patch('sunpy.net.dataretriever.sources.rhessi.get_base_url', return_value='http://www.example.com/') @mock.patch('sunpy.net.dataretriever.sources.rhessi.parse_observing_summary_dbase_file', return_value=parsed_dbase()) @mock.patch('sunpy.net.dataretriever.sources.rhessi.RHESSIClient.get_observing_summary_dbase_file', return_value=('', {})) def test_get_observing_summary_filename_one_day(mock_get_observing_summary_dbase_file, mock_parse_observing_summary_dbase_file, mock_get_base_url, LCClient): """ Given a time range of one day, make sure we get one days data back, i.e. one file. """ filename = LCClient.get_observing_summary_filename(('2003-11-01', '2003-11-01T23:59:59')) assert len(filename) == 1 assert filename[0] == 'http://www.example.com/metadata/catalog/hsi_obssumm_20031101_157.fits' @mock.patch('sunpy.net.dataretriever.sources.rhessi.get_base_url', return_value='http://www.example.com/') @mock.patch('sunpy.net.dataretriever.sources.rhessi.parse_observing_summary_dbase_file', return_value=parsed_dbase()) @mock.patch('sunpy.net.dataretriever.sources.rhessi.RHESSIClient.get_observing_summary_dbase_file', return_value=('', {})) def test_get_observing_summary_filename_two_days(mock_get_observing_summary_dbase_file, mock_parse_observing_summary_dbase_file, mock_get_base_url, LCClient): """ Given a time range of two days, make sure we get two files back, one for each day. """ filenames = LCClient.get_observing_summary_filename(('2003-11-01', '2003-11-02T23:59:59')) assert len(filenames) == 2 assert filenames[0] == 'http://www.example.com/metadata/catalog/hsi_obssumm_20031101_157.fits' assert filenames[1] == 'http://www.example.com/metadata/catalog/hsi_obssumm_20031102_161.fits' def test_can_handle_query(LCClient): ans1 = LCClient._can_handle_query( a.Time('2012/8/9', '2012/8/9'), a.Instrument.rhessi) assert ans1 is True ans2 = LCClient._can_handle_query(a.Time('2013/2/7', '2013/2/7')) assert ans2 is False @mock.patch('sunpy.net.dataretriever.sources.rhessi.get_base_url', return_value='http://www.example.com/') @mock.patch('sunpy.net.dataretriever.sources.rhessi.parse_observing_summary_dbase_file', return_value=parsed_dbase()) @mock.patch('sunpy.net.dataretriever.sources.rhessi.RHESSIClient.get_observing_summary_dbase_file', return_value=('', {})) def test_query(mock_get_observing_summary_dbase_file, mock_parse_observing_summary_dbase_file, mock_get_base_url, LCClient): qr1 = LCClient.search(a.Time('2003-11-01', '2003-11-03'), a.Instrument.rhessi) assert isinstance(qr1, QueryResponse) assert len(qr1) == 3 assert qr1.time_range().start.datetime == parse_time('2003/11/01').datetime assert qr1.time_range().end.datetime == parse_time('2003/11/03T23:59:59.999').datetime @no_vso @mock.patch('sunpy.net.dataretriever.sources.rhessi.get_base_url', return_value='http://www.example.com/') @mock.patch('sunpy.net.dataretriever.sources.rhessi.parse_observing_summary_dbase_file', return_value=parsed_dbase()) @mock.patch('sunpy.net.dataretriever.sources.rhessi.RHESSIClient.get_observing_summary_dbase_file', return_value=('', {})) def test_fido_mock(mock_get_observing_summary_dbase_file, mock_parse_observing_summary_dbase_file, mock_get_base_url): qr = Fido.search(a.Time('2003-11-01', '2003-11-03'), a.Instrument.rhessi) assert isinstance(qr, UnifiedResponse) assert qr._numfile == 3 def test_attr_reg(): assert a.Instrument.rhessi == a.Instrument('RHESSI') assert a.Physobs.summary_lightcurve == a.Physobs("summary_lightcurve") def test_client_repr(LCClient): """ Repr check """ output = str(LCClient) assert output[:50] == 'sunpy.net.dataretriever.sources.rhessi.RHESSIClien' def mock_query_object(LCClient): """ Creating a Query Response object and prefilling it with some information """ start = '2016/1/1' end = '2016/1/1 23:59:59' obj = { 'Start Time': parse_time(start), 'End Time': parse_time(end), 'Instrument': 'RHESSI', 'Physobs': 'irradiance', 'Source': 'RHESSI', 'Provider': 'NASA', 'url': ('https://hesperia.gsfc.nasa.gov/hessidata/metadata/' 'catalog/hsi_obssumm_20160101_078.fits') } results = QueryResponse([obj], client=LCClient) return results def test_show(LCClient): mock_qr = mock_query_object(LCClient) qrshow0 = mock_qr.show() qrshow1 = mock_qr.show('Start Time', 'Instrument') allcols = {'Start Time', 'End Time', 'Instrument', 'Physobs', 'Source', 'Provider', 'url'} assert not allcols.difference(qrshow0.colnames) assert qrshow1.colnames == ['Start Time', 'Instrument'] assert qrshow0['Instrument'][0] == 'RHESSI' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6412754 sunpy-3.1.5/sunpy/net/dataretriever/tests/0000755000175100001710000000000000000000000017673 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/tests/__init__.py0000644000175100001710000000000000000000000021772 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/dataretriever/tests/test_client.py0000644000175100001710000000167600000000000022574 0ustar00vstsdockerfrom sunpy.net.dataretriever.client import QueryResponse from sunpy.time import parse_time def test_reprs(): rowdict = {} rowdict['Start Time'] = parse_time("2012/1/1") rowdict['End Time'] = parse_time("2012/1/2") resp = QueryResponse([rowdict]) assert isinstance(resp, QueryResponse) strs = ["2012-01-01T00:00:00.000", "2012-01-02T00:00:00.000"] assert all(s in str(resp) for s in strs) assert all(s in repr(resp) for s in strs) def test_time_range(): rows = [{'Start Time': parse_time("2020/01/01"), 'End Time': parse_time("2020/01/02")}, {'Start Time': parse_time("2019/01/01"), 'End Time': parse_time("2019/01/02")}] resp = QueryResponse(rows) assert resp.time_range().start == parse_time("2019/01/01") assert resp.time_range().end == parse_time("2020/01/02") def test_missing_time_range(): rows = [{'wibble': 1}] resp = QueryResponse(rows) assert resp.time_range() is None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/fido_factory.py0000644000175100001710000004673600000000000016732 0ustar00vstsdocker""" 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 `parfive.Results` class that is returned by `Fido.fetch `. """ import os from pathlib import Path from textwrap import dedent from collections.abc import Sequence import parfive from astropy.table import Table from sunpy import config from sunpy.net import attr, vso from sunpy.net.base_client import BaseClient, QueryResponseColumn, QueryResponseRow, QueryResponseTable from sunpy.util.datatype_factory_base import BasicRegistrationFactory, NoMatchError from sunpy.util.parfive_helpers import Downloader, Results from sunpy.util.util import get_width __all__ = ['Fido', 'UnifiedResponse', 'UnifiedDownloaderFactory'] class UnifiedResponse(Sequence): """ The object used to store results from `~sunpy.net.fido_factory.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, *results): """ Parameters ---------- *results : `sunpy.net.base_client.QueryResponseTable` One or more QueryResponse objects. """ self._list = [] self._numfile = 0 for result in results: if isinstance(result, QueryResponseRow): result = result.as_table() if isinstance(result, QueryResponseColumn): result = result.as_table() if not isinstance(result, QueryResponseTable): raise TypeError( f"{type(result)} is not derived from sunpy.net.base_client.QueryResponseTable") self._list.append(result) self._numfile += len(result) def __len__(self): return len(self._list) def _getitem_string(self, aslice): ret = [] for res in self._list: clientname = res.client.__class__.__name__ if aslice.lower() == clientname.lower().split('client')[0]: ret.append(res) if len(ret) == 1: ret = ret[0] elif len(ret) == 0: raise IndexError(f"{aslice} is not a valid key, valid keys are: {','.join(self.keys())}") 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. """ if isinstance(aslice, (int, slice)): ret = self._list[aslice] # using the client's name for indexing the responses. elif isinstance(aslice, str): ret = self._getitem_string(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], str): intermediate = self._getitem_string(aslice[0]) else: intermediate = self._list[aslice[0]] if isinstance(intermediate, list): ret = [] for client_resp in intermediate: ret.append(client_resp[aslice[1]]) else: ret = intermediate[aslice[1]] else: raise IndexError("UnifiedResponse objects must be sliced with integers or strings.") if isinstance(ret, (QueryResponseTable, QueryResponseColumn, QueryResponseRow)): return ret return UnifiedResponse(*ret) def path_format_keys(self): """ Returns all the names that can be used to format filenames. Only the keys which can be used to format all results from all responses contained in this `~.UnifiedResponse` are returned. Each individual response might have more keys available. Each one corresponds to a single column in the table, and the format syntax should match the dtype of that column, i.e. for a ``Time`` object or a ``Quantity``. """ s = self[0].path_format_keys() for table in self[1:]: s = s.intersection(table.path_format_keys()) return s def keys(self): """ Names of the contained responses. One name may map to more than one response. """ ret = [] for res in self._list: clientname = res.client.__class__.__name__.lower().split('client')[0] if clientname not in ret: ret.append(clientname) return ret @property def file_num(self): """ The number of records returned in all responses. """ 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: ret += "{} Results from the {}:
".format(len(block), block.client.__class__.__name__) ret += block._repr_html_() ret += '
' return ret def __repr__(self): return object.__repr__(self) + "\n" + str(self) 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: ret += f"{len(block)} Results from the {block.client.__class__.__name__}:\n" if block.client.info_url is not None: ret += f'Source: {block.client.info_url}\n\n' lines = repr(block).split('\n') ret += '\n'.join(lines[1:]) ret += '\n\n' return ret def show(self, *cols): """ Displays response tables with desired columns for the Query. Parameters ---------- \\*cols : `tuple` Name of columns to be shown. Returns ------- `list` of `astropy.table.Table` A list of tables showing values for specified columns. """ return type(self)(*[i.show(*cols) for i in self._list]) @property def all_colnames(self): """ Returns all the colnames in any of the tables in this response. Any column names in this list are valid inputs to :meth:`.UnifiedResponse.show`. """ colnames = set(self[0].colnames) for resp in self[1:]: colnames.union(resp.colnames) return sorted(list(colnames)) query_walker = attr.AttrWalker() """ We construct an `AttrWalker` which calls `_make_query_to_client` for each logical component of the query, i.e. any block which are ANDed together. """ @query_walker.add_creator(attr.DataAttr) def _create_data(walker, query, factory): return factory._make_query_to_client(query) @query_walker.add_creator(attr.AttrAnd) def _create_and(walker, query, factory): 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 += walker.create(attrblock, factory) return qblocks class UnifiedDownloaderFactory(BasicRegistrationFactory): """ Fido is a unified data search and retrieval tool. It provides simultaneous access to a variety of online data sources, some cover multiple instruments and data products like the Virtual Solar Observatory and some are specific to a single source. For details of using `~sunpy.net.Fido` see :ref:`fido_guide`. """ def search(self, *query): """ Query for data in form of multiple parameters. Examples -------- Query for LYRA timeseries 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) # doctest: +REMOTE_DATA 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.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) results = query_walker.create(query, self) # If we have searched the VSO but no results were returned, but another # client generated results, we drop the empty VSO results for tidiness. # This is because the VSO _can_handle_query is very broad because we # don't know the full list of supported values we can search for (yet). if len(results) > 1: vso_results = list(filter(lambda r: isinstance(r, vso.VSOQueryResponseTable), results)) for vres in vso_results: if len(vres) == 0: results.remove(vres) return UnifiedResponse(*results) def fetch(self, *query_results, path=None, max_conn=5, progress=True, overwrite=False, downloader=None, **kwargs): """ Download the records represented by `~sunpy.net.base_client.QueryResponseTable` or `~sunpy.net.fido_factory.UnifiedResponse` objects. Parameters ---------- *query_results : `sunpy.net.fido_factory.UnifiedResponse` or `~sunpy.net.base_client.QueryResponseTable` Container returned by query method, or multiple. path : `str` The directory to retrieve the files into. Can refer to any fields in `~sunpy.net.base_client.BaseQueryResponse.response_block_properties` via string formatting, moreover the file-name of the file downloaded can be referred to as file, e.g. "{source}/{instrument}/{time.start}/{file}". max_conn : `int`, optional The number of parallel download slots. progress : `bool`, optional If `True` show a progress bar showing how many of the total files have been downloaded. If `False`, no progress bars will be shown at all. overwrite : `bool` or `str`, optional Determine how to handle downloading if a file already exists with the same name. If `False` the file download will be skipped and the path returned to the existing file, if `True` the file will be downloaded and the existing file will be overwritten, if ``'unique'`` the filename will be modified to be unique. downloader : `parfive.Downloader`, optional The download manager to use. If specified the ``max_conn``, ``progress`` and ``overwrite`` arguments are ignored. Returns ------- `parfive.Results` Examples -------- >>> from sunpy.net.attrs import Time, Instrument >>> unifresp = Fido.search(Time('2012/3/4','2012/3/5'), Instrument('EIT')) # doctest: +REMOTE_DATA >>> filepaths = Fido.fetch(unifresp) # doctest: +SKIP If any downloads fail, they can be retried by passing the `parfive.Results` object back into ``fetch``. >>> filepaths = Fido.fetch(filepaths) # doctest: +SKIP """ if path is None: path = Path(config.get('downloads', 'download_dir')) / '{file}' elif isinstance(path, (str, os.PathLike)) and '{file}' not in str(path): path = Path(path) / '{file}' else: path = Path(path) path = path.expanduser() # Ensure we have write permissions to the path exists = list(filter(lambda p: p.exists(), Path(path).resolve().parents)) if not os.access(exists[0], os.W_OK): raise PermissionError('You do not have permission to write' f' to the directory {exists[0]}.') if "wait" in kwargs: raise ValueError("wait is not a valid keyword argument to Fido.fetch.") # TODO: Remove when parfive allows us to special case URLS. # Avoid more than one connection for JSOC only requests. from sunpy.net.jsoc import JSOCClient is_jsoc_only = False for query_result in query_results: if isinstance(query_result, UnifiedResponse): is_jsoc_only = all([isinstance(result.client, JSOCClient) for result in query_result]) elif isinstance(query_result, QueryResponseTable): is_jsoc_only = all([isinstance(result.table.client, JSOCClient) for result in query_result]) if downloader is None: if is_jsoc_only: max_conn = 1 kwargs['max_splits'] = 1 downloader = Downloader(max_conn=max_conn, progress=progress, overwrite=overwrite) elif not isinstance(downloader, parfive.Downloader): raise TypeError("The downloader argument must be a parfive.Downloader instance.") # Handle retrying failed downloads retries = [isinstance(arg, Results) for arg in query_results] if all(retries): results = Results() for retry in query_results: dr = downloader.retry(retry) results.data += dr.data results._errors += dr._errors return results elif any(retries): raise TypeError("If any arguments to fetch are `parfive.Results` objects, all arguments must be.") reslist = [] for query_result in query_results: if isinstance(query_result, QueryResponseRow): responses = [query_result.as_table()] elif isinstance(query_result, QueryResponseTable): responses = [query_result] elif isinstance(query_result, UnifiedResponse): responses = query_result else: raise ValueError(f"Query result has an unrecognized type: {type(query_result)} " "Allowed types are QueryResponseRow, QueryResponseTable or UnifiedResponse.") for block in responses: result = block.client.fetch(block, path=path, downloader=downloader, wait=False, **kwargs) if result not in (NotImplemented, None): reslist.append(result) results = downloader.download() # Combine the results objects from all the clients into one Results # object. for result in reslist: if not isinstance(result, Results): raise TypeError( "If wait is False a client must return a parfive.Downloader and either None" " or a parfive.Results object.") results.data += result.data results._errors += result.errors return results def __call__(self, *args, **kwargs): raise TypeError(f"'{self.__class__.__name__}' object is not callable") 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?") 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 ------- results : `list` client : `object` Instance of client class """ candidate_widget_types = self._check_registered_widgets(*query) results = [] for client in candidate_widget_types: tmpclient = client() kwargs = dict() # Handle the change in response format in the VSO if isinstance(tmpclient, vso.VSOClient): kwargs = dict(response_format="table") results.append(tmpclient.search(*query, **kwargs)) # This method is called by `search` and the results are fed into a # UnifiedResponse object. return results def __repr__(self): return object.__repr__(self) + "\n" + self._print_clients(visible_entries=15) def __str__(self): """ This enables the "pretty" printing of the Fido Clients. """ return self._print_clients() def _repr_html_(self): """ This enables the "pretty" printing of the Fido Clients with html. """ return self._print_clients(visible_entries=15, html=True) def _print_clients(self, html=False, visible_entries=None): width = -1 if html else get_width() t = Table(names=["Client", "Description"], dtype=["U80", "U120"]) lines = ["sunpy.net.Fido", dedent(self.__doc__)] if html: lines = [f"

{line}

" for line in lines] for key in BaseClient._registry.keys(): t.add_row((key.__name__, dedent( key.__doc__.partition("\n\n")[0].replace("\n ", " ")))) lines.extend(t.pformat_all(max_lines=visible_entries, show_dtype=False, max_width=width, align="<", html=html)) return '\n'.join(lines) Fido = UnifiedDownloaderFactory( registry=BaseClient._registry, additional_validation_functions=['_can_handle_query']) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6412754 sunpy-3.1.5/sunpy/net/hek/0000755000175100001710000000000000000000000014437 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/hek/__init__.py0000644000175100001710000000004000000000000016542 0ustar00vstsdockerfrom sunpy.net.hek.hek import * ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/hek/attrs.py0000644000175100001710000004275600000000000016164 0ustar00vstsdocker# THIS FILE IS AUTOGENERATED # 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 sunpy.net import attr as _attr from sunpy.net import attrs as _attrs from sunpy.time import parse_time as _parse_time # Due to the fact this file is autogenereted it doesn't have an __all__, so all # not _ prefixed variables must be parseable by automodapi def _makeinstance(f): """ A decorator which converts a class object to a class instance. """ return f() class HEKAttr(_attr.AttrComparison): """ This ensures the attr inspect magic works for registering in the client. """ class HEKComparisonParamAttrWrapper(_attr.ComparisonParamAttrWrapper): def __init__(self, name): self.name = name def __lt__(self, other): return HEKAttr(self.name, '<', other) def __le__(self, other): return HEKAttr(self.name, '<=', other) def __gt__(self, other): return HEKAttr(self.name, '>', other) def __ge__(self, other): return HEKAttr(self.name, '>=', other) def __eq__(self, other): return HEKAttr(self.name, '=', other) def __ne__(self, other): return HEKAttr(self.name, '!=', other) def collides(self, other): return isinstance(other, HEKComparisonParamAttrWrapper) class EventType(_attr.Attr): def __init__(self, item): super().__init__() 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().__or__(other) class SpatialRegion(_attr.Attr): def __init__(self, x1=-5000, y1=-5000, x2=5000, y2=5000, sys='helioprojective'): super().__init__() 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(vars(self).items())) class Contains(_attr.Attr): def __init__(self, *types): super().__init__() 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(vars(self).items())) class _StringParamAttrWrapper(HEKComparisonParamAttrWrapper): def like(self, other): return HEKAttr(self.name, 'like', other) # 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) def _a(wlk, root, state, dct): dct['type'] = 'contains' if Contains not in state: state[Contains] = 1 nid = state[Contains] n = 0 for n, type_ in enumerate(root.types): dct[f'event_type{nid + n:d}'] = type_ state[Contains] += n return dct @walker.add_creator( _attrs.Time, SpatialRegion, EventType, HEKAttr, _attr.AttrAnd, Contains) def _c(wlk, root, state): value = {} wlk.apply(root, state, value) return [value] @walker.add_applier(_attrs.Time) 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) 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) def _a(wlk, root, state, dct): if dct.get('type', None) == 'contains': raise ValueError dct['event_type'] = root.item return dct @walker.add_applier(HEKAttr) def _a(wlk, root, state, dct): if HEKAttr not in state: state[HEKAttr] = 0 nid = state[HEKAttr] dct[f'param{nid:d}'] = root.name dct[f'operator{nid:d}'] = root.operator dct[f'value{nid:d}'] = root.value state[HEKAttr] += 1 return dct @walker.add_applier(_attr.AttrAnd) def _a(wlk, root, state, dct): for attribute in root.attrs: wlk.apply(attribute, state, dct) @walker.add_creator(_attr.AttrOr) def _c(wlk, root, state): blocks = [] for attribute in root.attrs: blocks.extend(wlk.create(attribute, state)) return blocks @_makeinstance 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): super().__init__('ar') @_makeinstance 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): super().__init__('ce') @_makeinstance 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): super().__init__('cd') CH = EventType('ch') CW = EventType('cw') @_makeinstance 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): super().__init__('fi') FE = EventType('fe') FA = EventType('fa') @_makeinstance 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): super().__init__('fl') LP = EventType('lp') OS = EventType('os') @_makeinstance class SS(EventType): SpinRate = _StringParamAttrWrapper('SS_SpinRate') SpinRateUnit = _StringParamAttrWrapper('SS_SpinRateUnit') def __init__(self): super().__init__('ss') @_makeinstance 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): super().__init__('ef') CJ = EventType('cj') PG = EventType('pg') OT = EventType('ot') NR = EventType('nr') @_makeinstance 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): super().__init__('sg') SP = EventType('sp') CR = EventType('cr') @_makeinstance 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): super().__init__('cc') ER = EventType('er') @_makeinstance class TO(EventType): Shape = _StringParamAttrWrapper('TO_Shape') def __init__(self): super().__init__('to') @_makeinstance class Wave: DisplMaxAmpl = _StringParamAttrWrapper('WaveDisplMaxAmpl') DisplMinAmpl = _StringParamAttrWrapper('WaveDisplMinAmpl') DisplUnit = _StringParamAttrWrapper('WaveDisplUnit') lMaxPower = _StringParamAttrWrapper('WavelMaxPower') lMaxPowerUncert = _StringParamAttrWrapper('WavelMaxPowerUncert') lMaxRange = _StringParamAttrWrapper('WavelMaxRange') lMinRange = _StringParamAttrWrapper('WavelMinRange') lUnit = _StringParamAttrWrapper('WavelUnit') @_makeinstance class Veloc: MaxAmpl = _StringParamAttrWrapper('VelocMaxAmpl') MaxPower = _StringParamAttrWrapper('VelocMaxPower') MaxPowerUncert = _StringParamAttrWrapper('VelocMaxPowerUncert') MinAmpl = _StringParamAttrWrapper('VelocMinAmpl') Unit = _StringParamAttrWrapper('VelocUnit') @_makeinstance class Freq: MaxRange = _StringParamAttrWrapper('FreqMaxRange') MinRange = _StringParamAttrWrapper('FreqMinRange') PeakPower = _StringParamAttrWrapper('FreqPeakPower') Unit = _StringParamAttrWrapper('FreqUnit') @_makeinstance class Intens: MaxAmpl = _StringParamAttrWrapper('IntensMaxAmpl') MinAmpl = _StringParamAttrWrapper('IntensMinAmpl') Unit = _StringParamAttrWrapper('IntensUnit') @_makeinstance class Area: AtDiskCenter = _StringParamAttrWrapper('Area_AtDiskCenter') AtDiskCenterUncert = _StringParamAttrWrapper('Area_AtDiskCenterUncert') Raw = _StringParamAttrWrapper('Area_Raw') Uncert = _StringParamAttrWrapper('Area_Uncert') Unit = _StringParamAttrWrapper('Area_Unit') @_makeinstance class BoundBox: C1LL = _StringParamAttrWrapper('BoundBox_C1LL') C1UR = _StringParamAttrWrapper('BoundBox_C1UR') C2LL = _StringParamAttrWrapper('BoundBox_C2LL') C2UR = _StringParamAttrWrapper('BoundBox_C2UR') @_makeinstance class Bound: 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') @_makeinstance class OBS: 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') @_makeinstance class Skel: Curvature = _StringParamAttrWrapper('Skel_Curvature') Nsteps = _StringParamAttrWrapper('Skel_Nsteps') StartC1 = _StringParamAttrWrapper('Skel_StartC1') StartC2 = _StringParamAttrWrapper('Skel_StartC2') @_makeinstance class FRM: 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') @_makeinstance class Event: 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') @_makeinstance class Outflow: 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') @_makeinstance class Misc: 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') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/hek/hek.py0000644000175100001710000001522300000000000015563 0ustar00vstsdocker""" Facilities to interface with the Heliophysics Events Knowledgebase. """ import json import codecs import urllib import inspect from itertools import chain import astropy.table from astropy.table import Row from astropy.time import Time import sunpy.net._attrs as core_attrs from sunpy import log from sunpy.net import attr from sunpy.net.base_client import BaseClient, QueryResponseTable from sunpy.net.hek import attrs from sunpy.util import dict_keys_same, unique from sunpy.util.xml import xml_to_dict __all__ = ['HEKClient', 'HEKTable', 'HEKRow'] DEFAULT_URL = 'https://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 obj.items()) if isinstance(obj, list): return tuple(_freeze(elem) for elem in obj) return obj class HEKClient(BaseClient): """ Provides access to 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 = [] new_data = data.copy() # Override the default name of the operatorX, where X is a number. for key in data.keys(): if "operator" in key: new_data[f"op{key.split('operator')[-1]}"] = new_data.pop(key) while True: new_data['page'] = page url = self.url + urllib.parse.urlencode(new_data) log.debug(f'Opening {url}') fd = urllib.request.urlopen(url) try: result = codecs.decode(fd.read(), encoding='utf-8', errors='replace') result = json.loads(result) except Exception as e: raise IOError("Failed to load return from the HEKClient.") from e finally: fd.close() results.extend(result['result']) if not result['overmax']: if len(results) > 0: return astropy.table.Table(dict_keys_same(results)) else: return astropy.table.Table() page += 1 def search(self, *args, **kwargs): """ 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. Examples ------- >>> from sunpy.net import attrs as a, Fido >>> timerange = a.Time('2011/08/09 07:23:56', '2011/08/09 12:40:29') >>> res = Fido.search(timerange, a.hek.FL, a.hek.FRM.Name == "SWPC") # doctest: +REMOTE_DATA >>> res #doctest: +SKIP Results from 1 Provider: 2 Results from the HEKClient: SOL_standard active ... skel_startc2 sum_overlap_scores ------------------------------ ------ ... ------------ ------------------ SOL2011-08-09T07:19:00L227C090 true ... None 0 SOL2011-08-09T07:48:00L296C073 true ... None 0 """ query = attr.and_(*args) 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 HEKTable(self._download(ndata[0]), client=self) else: return HEKTable(self._merge(self._download(data) for data in ndata), client=self) def _merge(self, responses): """ Merge responses, removing duplicates. """ return list(unique(chain.from_iterable(responses), _freeze)) def fetch(self, *args, **kwargs): """ This is a no operation function as this client does not download data. """ return NotImplemented @classmethod def _attrs_module(cls): return 'hek', 'sunpy.net.hek.attrs' @classmethod def _can_handle_query(cls, *query): required = {core_attrs.Time} optional = {i[1] for i in inspect.getmembers(attrs, inspect.isclass)} - required qr = tuple(x for x in query if not isinstance(x, attrs.EventType)) return cls.check_attr_types_in_query(qr, required, optional) class HEKRow(Row): """ Handles the response from the HEK. Each HEKRow object is a subclass of `~astropy.table.Row`. The column-row key-value pairs correspond to the HEK feature/event properties and their values, for that record from the HEK. Each HEKRow object also has extra properties that relate HEK concepts to VSO concepts. """ @property def vso_time(self): return core_attrs.Time( Time.strptime(self['event_starttime'], "%Y-%m-%dT%H:%M:%S"), Time.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 core_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 def get(self, key, default=None): try: return self[key] except KeyError: return default class HEKTable(QueryResponseTable): """ A container for data returned from HEK searches. """ Row = HEKRow ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6412754 sunpy-3.1.5/sunpy/net/hek/tests/0000755000175100001710000000000000000000000015601 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/hek/tests/__init__.py0000644000175100001710000000000000000000000017700 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/hek/tests/test_hek.py0000644000175100001710000001375300000000000017772 0ustar00vstsdockerimport pytest from sunpy.net import attr, attrs, hek @pytest.fixture def foostrwrap(request): return hek.attrs._StringParamAttrWrapper("foo") @pytest.fixture @pytest.mark.remote_data def hek_client(): startTime = '2011/08/09 07:23:56' endTime = '2011/08/09 12:40:29' eventType = 'FL' hekTime = attrs.Time(startTime, endTime) hekEvent = attrs.hek.EventType(eventType) h = hek.HEKClient() hek_query = h.search(hekTime, hekEvent) return hek_query def test_eventtype_collide(): with pytest.raises(TypeError): attrs.hek.AR & attrs.hek.CE with pytest.raises(TypeError): (attrs.hek.AR & attrs.Time((2011, 1, 1), (2011, 1, 2))) & attrs.hek.CE with pytest.raises(TypeError): (attrs.hek.AR | attrs.Time((2011, 1, 1), (2011, 1, 2))) & attrs.hek.CE def test_eventtype_or(): assert (attrs.hek.AR | attrs.hek.CE).item == "ar,ce" def test_HEKAttr(): res = hek.attrs.walker.create(hek.attrs.HEKAttr("foo", "=", "bar"), {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'operator0': '=', 'param0': 'foo'} def test_stringwrapper_eq(foostrwrap): res = hek.attrs.walker.create(foostrwrap == "bar", {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'operator0': '=', 'param0': 'foo'} def test_stringwrapper_lt(foostrwrap): res = hek.attrs.walker.create(foostrwrap < "bar", {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'operator0': '<', 'param0': 'foo'} def test_stringwrapper_gt(foostrwrap): res = hek.attrs.walker.create(foostrwrap > "bar", {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'operator0': '>', 'param0': 'foo'} def test_stringwrapper_le(foostrwrap): res = hek.attrs.walker.create(foostrwrap <= "bar", {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'operator0': '<=', 'param0': 'foo'} def test_stringwrapper_ge(foostrwrap): res = hek.attrs.walker.create(foostrwrap >= "bar", {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'operator0': '>=', 'param0': 'foo'} def test_stringwrapper_ne(foostrwrap): res = hek.attrs.walker.create(foostrwrap != "bar", {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'operator0': '!=', 'param0': 'foo'} def test_stringwrapper_like(foostrwrap): res = hek.attrs.walker.create(foostrwrap.like("bar"), {}) assert len(res) == 1 assert res[0] == {'value0': 'bar', 'operator0': '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(), {}) @pytest.mark.remote_data def test_hek_client(): startTime = '2011/08/09 07:23:56' endTime = '2011/08/09 12:40:29' eventType = 'FL' hekTime = attrs.Time(startTime, endTime) hekEvent = attrs.hek.EventType(eventType) h = hek.HEKClient() hek_query = h.search(hekTime, hekEvent) assert type(hek_query) == hek.hek.HEKTable @pytest.mark.remote_data def test_hek_empty_search_result(): startTime = '1985-05-04 00:00:00' endTime = '1985-05-04 00:00:00' eventType = 'FL' hekTime = attrs.Time(startTime, endTime) hekEvent = attrs.hek.EventType(eventType) h = hek.HEKClient() hek_query = h.search(hekTime, hekEvent) assert type(hek_query) == hek.hek.HEKTable assert len(hek_query) == 0 @pytest.mark.remote_data def test_getitem(hek_client): assert hek_client.__getitem__(0) == hek_client[0] @pytest.mark.remote_data def test_get_voevent(hek_client): ve = hek_client[0].get_voevent() assert len(ve['voe:VOEvent']) == 7 @pytest.mark.remote_data def test_vso_time(hek_client): ve = hek_client[0].vso_time assert type(ve) == attrs.Time @pytest.mark.remote_data def test_vso_instrument(hek_client): vc = hek_client[1].vso_instrument assert type(vc) == attrs.Instrument @pytest.mark.remote_data def test_HEKRow_get(hek_client): assert hek_client[0]['event_peaktime'] == hek_client[0].get('event_peaktime') assert hek_client[0].get('') is None @pytest.mark.remote_data def test_mixed_results_get(): # To check that the following bug is fixed: # https://github.com/sunpy/sunpy/issues/3238 client = hek.HEKClient() result = client.search(attrs.Time('2013/02/01 00:00:00', '2013/02/01 23:30:00'), attrs.hek.FRM.Name == 'SPoCA') assert isinstance(result, hek.hek.HEKTable) assert len(result) == 89 assert result[0]["SOL_standard"] == 'SOL2013-01-31T20:13:31L219C160' @pytest.mark.remote_data def test_mixed_results_get_2(): # To check that the following bug is fixed: # # https://github.com/sunpy/sunpy/issues/3898 client = hek.HEKClient() result = client.search(attrs.Time('2011/08/09 07:23:56', '2011/08/09 12:40:29'), attrs.hek.EventType("FL")) assert isinstance(result, hek.hek.HEKTable) assert len(result) == 19 assert result[0]["SOL_standard"] == 'SOL2011-08-08T01:30:04L247C075' @pytest.mark.remote_data def test_mixed_results_get_angstrom(): # To check that the following bug is fixed: # https://github.com/sunpy/sunpy/issues/4087 client = hek.HEKClient() tstart = '2014/10/24 20:50' tend = '2014/10/25 00:14' event_type = 'FL' result = client.search(attrs.Time(tstart, tend), attrs.hek.EventType(event_type)) assert len(result) == 13 assert result[0]["SOL_standard"] == 'SOL2014-10-24T20:53:46L247C106' @pytest.mark.remote_data def test_query_multiple_operators(): event_type = "FL" tstart = "2013/10/28" tend = "2013/10/29" client = hek.HEKClient() results = client.search(attrs.Time(tstart, tend), attrs.hek.EventType(event_type), attrs.hek.FL.GOESCls > "M1.0", attrs.hek.OBS.Observatory == "GOES") assert len(results) == 7 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6452754 sunpy-3.1.5/sunpy/net/hek2vso/0000755000175100001710000000000000000000000015251 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/hek2vso/__init__.py0000644000175100001710000000044500000000000017365 0ustar00vstsdocker""" 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 sunpy.net.hek2vso.hek2vso import * ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/hek2vso/hek2vso.py0000644000175100001710000001712700000000000017214 0ustar00vstsdocker# Author: Michael Malocha # Last Edit: August 10th, 2013 # # This module was developed with funding from the GSOC 2013 summer of code """ This module translates the results of a HEK query into a VSO query and returns the results from the VSO query to the user. """ import sys from tqdm import tqdm from astropy import units from sunpy.net import attrs as a from sunpy.net import hek, vso from sunpy.net.hek import HEKTable __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.HEKRow` or `sunpy.net.hek.hek.HEKTable` The HEK results from a HEK query to be translated. Examples -------- >>> from sunpy.net import attrs as a >>> 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(a.Time('2011/08/09 07:23:56', ... '2011/08/09 12:40:29'), a.hek.EventType('FL')) # doctest: +REMOTE_DATA >>> len(q) # doctest: +REMOTE_DATA 19 >>> hek2vso.translate_results_to_query(q[0]) # doctest: +REMOTE_DATA [[, , , ]] """ queries = [] if isinstance(results, HEKTable): 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 : `sunpy.net.hek.hek.HEKRow`. The single HEK result to be parsed for VSO attribute data. Examples -------- >>> from sunpy.net import attrs as a >>> 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(a.Time('2011/08/09 07:23:56', '2011/08/09 12:40:29'), a.hek.EventType('FL')) # doctest: +REMOTE_DATA >>> len(q) # doctest: +REMOTE_DATA 19 >>> hek2vso.vso_attribute_parse(q[9]) # doctest: +REMOTE_DATA [, , , ] """ try: query = [a.Time(phrase['event_starttime'], phrase['event_endtime']), a.Source(phrase['obs_observatory']), a.Instrument(phrase['obs_instrument'])] avg_wave_len = phrase['obs_meanwavel'] * units.Unit(phrase['obs_wavelunit']) query.append(a.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: """ 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 attrs as a, hek, hek2vso >>> h2v = hek2vso.H2VClient() # doctest: +REMOTE_DATA >>> q = h2v.full_query((a.Time('2011/08/09 07:23:56', '2011/08/09 12:40:29'), a.hek.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, vso_response_format="table"): """ 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.HEKRow` or `sunpy.net.hek.hek.HEKTable` 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 : bool 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(a.Time(tstart, tend), a.hek.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) for query in tqdm(vso_query, unit="records"): temp = self.vso_client.search(*query, response_format=vso_response_format) self.vso_results.append(temp) self.num_of_records += len(temp) if limit is not None: if self.num_of_records >= limit: break 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 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6452754 sunpy-3.1.5/sunpy/net/hek2vso/tests/0000755000175100001710000000000000000000000016413 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/hek2vso/tests/__init__.py0000644000175100001710000000000000000000000020512 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/hek2vso/tests/test_hek2vso.py0000644000175100001710000001044200000000000021406 0ustar00vstsdocker# 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 numpy as np import pytest import astropy.units as u from sunpy.net import attrs as a from sunpy.net import hek, hek2vso, vso from sunpy.time import parse_time startTime = "2011/08/09 07:23:56" endTime = "2011/08/09 12:40:29" eventType = "FL" instrument = "eit" hekTime = a.Time(startTime, endTime) hekEvent = a.hek.EventType(eventType) @pytest.fixture(scope="function") @pytest.mark.remote_data def h2v_client(): return hek2vso.H2VClient() @pytest.fixture(scope="function") @pytest.mark.remote_data def hek_client(): return hek.HEKClient() @pytest.fixture @pytest.mark.remote_data def vso_client(): vso.VSOClient() @pytest.mark.remote_data def test_translate_results_to_query(hek_client): """Make sure that conversion of HEK results to VSO queries is accurate""" h = hek_client hek_query = h.search(hekTime, hekEvent, a.hek.FL.PeakFlux > 1000) vso_query = hek2vso.translate_results_to_query(hek_query) # Comparing length of two lists assert len(hek_query) == len(vso_query) # Comparing types of both queries # Not sure this test makes any sense now assert isinstance(hek_query, hek.HEKTable) assert isinstance(vso_query, list) @pytest.mark.remote_data def test_vso_attribute_parse(hek_client): """Make sure that Parsing of VSO attributes from HEK queries is accurate""" h = hek_client hek_query = h.search(hekTime, hekEvent) vso_query = hek2vso.vso_attribute_parse(hek_query[0]) # Checking Time assert vso_query[0].start == parse_time(hek_query[0]["event_starttime"]) assert vso_query[0].end == parse_time(hek_query[0]["event_endtime"]) # 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") @pytest.mark.remote_data def test_members(h2v_client): client = h2v_client assert isinstance(client.hek_client, hek.HEKClient) assert isinstance(client.vso_client, vso.VSOClient) assert client.hek_results == "" assert client.vso_results == [] assert client.num_of_records == 0 @pytest.mark.remote_data def test_translate_and_query(h2v_client, hek_client): h = hek_client h2v = h2v_client q = h.search(a.Time(startTime, endTime), a.hek.EventType(eventType), a.hek.FL.PeakFlux > 1000) h2v_q = h2v.translate_and_query(q) assert len(q) == len(h2v_q) assert isinstance(h2v_q, list) assert isinstance(h2v_q[0], vso.VSOQueryResponseTable) @pytest.mark.remote_data def test_full_query(h2v_client, hek_client): h2v = h2v_client h = hek_client h2v_q_1 = h2v.full_query( (a.Time(startTime, "2011/08/09 07:35"), a.hek.EventType(eventType), a.hek.FL.PeakFlux > 1000) ) assert h2v.num_of_records > 1 assert len(h2v.vso_results) > 1 assert len(h2v.hek_results) > 1 h2v._quick_clean() q = h.search(a.Time(startTime, "2011/08/09 07:35"), a.hek.EventType(eventType), a.hek.FL.PeakFlux > 1000) h2v_q_2 = h2v.translate_and_query(q) assert len(h2v_q_1) == len(h2v_q_2) assert len(h2v.hek_results) == len(q) assert h2v.hek_results[0].get_voevent() == q[0].get_voevent() for i in range(len(h2v_q_1)): assert len(h2v_q_1[i]) == len(h2v_q_2[i]) if i != 2: assert np.nan_to_num(h2v_q_1[i].total_size()) == np.nan_to_num(h2v_q_2[i].total_size()) @pytest.mark.remote_data def test_quick_clean(h2v_client, hek_client): h2v = h2v_client h2v_q = h2v.full_query( (a.Time(startTime, endTime), a.hek.EventType(eventType), a.hek.FL.PeakFlux > 1000) ) assert h2v.num_of_records != 0 assert len(h2v.vso_results) != 0 h2v._quick_clean() assert h2v.vso_results == [] assert h2v.num_of_records == 0 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6452754 sunpy-3.1.5/sunpy/net/helio/0000755000175100001710000000000000000000000014770 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/helio/__init__.py0000644000175100001710000000025500000000000017103 0ustar00vstsdocker""" A Module for accessing the HELIO web service """ from .chaincode import * from .hec import * from .parser import * __all__ = ['HECClient', 'HECResponse', 'Chaincode'] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/helio/attrs.py0000644000175100001710000000052700000000000016503 0ustar00vstsdockerfrom sunpy.net.attr import SimpleAttr __all__ = ['MaxRecords', 'TableName'] # Define a custom __dir__ to restrict tab-completion to __all__ def __dir__(): return __all__ class MaxRecords(SimpleAttr): """ The maximum number of desired records. """ class TableName(SimpleAttr): """ The table to query from """ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/helio/chaincode.py0000644000175100001710000000741400000000000017265 0ustar00vstsdocker""" This module implements a function to understand chaincodes from HELIO. """ import numpy as np __all__ = ["Chaincode"] class Chaincode(np.ndarray): """ 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 : `str` 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`, optional The scale to convert between pixels and flat coordinates. Defaults to 1.0. ydelta : `float`, optional The scale to convert between pixels and flat coordinates. Defaults to 1.0 Returns ------- `numpy.ndarray` An array containing all the x and y coordinates of the chaincode e.g., ``[[x0, x1, x2, ..., xn], [y0 ,y1, y2, ..., yn]]``. Examples -------- >>> from sunpy.net.helio.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, **kwargs): if isinstance(origin, list): obj = np.asarray(origin).view(cls) elif isinstance(origin, np.ndarray): obj = 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): return np.alltrue(np.equal(self.coordinates[:, -1], np.asarray(end))) def matchany(self, coordinates, index): return np.alltrue(np.allclose(self.coordinates[:, index], np.asarray(coordinates))) def boundingbox(self): """ Extract the coordinates of the chaincode. Returns in the form of ``[[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): raise NotImplementedError def length(self): raise NotImplementedError def sub_boundingbox(self, xedge=None, yedge=None): """ Extract the x or y boundaries of the chaincode from a defined limits ``xedge`` or ``yedge``. Parameters ---------- xedge : list, optional A list of two values to check. yedge : list, optional A list of two values to check. """ if xedge is not None: edge = xedge IndexMask = 0 IndexValue = 1 elif yedge is not None: edge = yedge IndexMask = 1 IndexValue = 0 else: raise ValueError("Please input either `xedge` or `yedge`") mask = (self.coordinates[IndexMask, :] >= edge[0]) & (self.coordinates[IndexMask, :] <= edge[1]) mx = np.ma.masked_array(self.coordinates[IndexValue, :], mask=(~mask)) return [mx.min(), mx.max()] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/helio/hec.py0000644000175100001710000002207200000000000016104 0ustar00vstsdocker""" Access the Helio Event Catalogue """ import io import os from lxml import etree from requests import Session from zeep import Client from zeep.transports import Transport from astropy.io.votable.table import parse_single_table from sunpy.net import attrs as a from sunpy.net.base_client import BaseClient, QueryResponseTable from sunpy.net.helio import attrs as ha from sunpy.net.helio import parser from sunpy.time import parse_time from sunpy.util.exceptions import warn_deprecated, warn_user __all__ = ['HECClient', 'HECResponse'] def votable_handler(xml_table): """ Returns a VOtable object from a VOtable style xml string In order to get a VOtable object, it has to be parsed from an xml file or file-like object. This function creates a file-like object via the StringIO module, writes the xml data to it, then passes the file-like object to parse_single_table() from the astropy.io.votable.table module and thereby creates a VOtable object. Parameters ---------- xml_table : `bytes` Contains the VOtable style xml data Returns ------- votable : `astropy.io.votable.tree.Table` A properly formatted VOtable object """ fake_file = io.BytesIO() fake_file.write(xml_table) votable = parse_single_table(fake_file) for i in range(len(votable.array)): item = votable.array[i][0] if isinstance(item, bytes): votable.array[i] = (votable.array[i][0].decode(),) fake_file.close() return votable class HECResponse(QueryResponseTable): """ A container for data returned from HEC searches. """ class HECClient(BaseClient): """ Provides access to the 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() session = Session() # This is for use in our test suite. session.verify = not(bool(os.environ.get("NO_VERIFY_HELIO_SSL", 0))) transport = Transport(session=session) self.hec_client = Client(link, transport=transport) @classmethod def _can_handle_query(cls, *query): required = {a.Time} optional = {ha.MaxRecords, ha.TableName} return cls.check_attr_types_in_query(query, required, optional) @classmethod def _attrs_module(cls): return 'helio', 'sunpy.net.helio.attrs' def search(self, *args, **kwargs): """ 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. .. note:: By default the maximum records returned by the service are limited to 500. To obtain more results ``a.helio.MaxRecords`` must be set to a higher value. Examples -------- >>> from sunpy.net.helio import attrs as ha >>> from sunpy.net import attrs as a, Fido >>> timerange = a.Time('2005/01/03', '2005/12/03') >>> res = Fido.search(timerange, ha.MaxRecords(10), ... ha.TableName('rhessi_hxr_flare')) # doctest: +REMOTE_DATA >>> res #doctest: +REMOTE_DATA Results from 1 Provider: 10 Results from the HECClient: hec_id time_start time_peak ... energy_kev flare_number ------ ------------------- ------------------- ... ---------- ------------ 31463 2005-01-03T01:37:36 2005-01-03T01:37:54 ... 6 5010320 31464 2005-01-03T01:51:36 2005-01-03T01:59:18 ... 12 5010301 31465 2005-01-03T03:26:28 2005-01-03T03:42:50 ... 6 5010332 31466 2005-01-03T03:46:04 2005-01-03T04:07:10 ... 12 5010302 31467 2005-01-03T05:00:24 2005-01-03T05:00:30 ... 6 5010313 31468 2005-01-03T06:40:48 2005-01-03T06:42:46 ... 6 5010314 31469 2005-01-03T08:27:56 2005-01-03T08:28:26 ... 6 5010334 31470 2005-01-03T09:31:00 2005-01-03T09:33:34 ... 6 5010322 31471 2005-01-03T09:34:52 2005-01-03T09:59:46 ... 6 5010336 31472 2005-01-03T11:06:48 2005-01-03T11:07:18 ... 12 5010304 """ qrdict = {} for elem in args: if isinstance(elem, a.Time): qrdict['Time'] = elem elif isinstance(elem, ha.MaxRecords): qrdict['max_records'] = elem.value elif isinstance(elem, ha.TableName): qrdict['table_name'] = elem.value else: raise ValueError( f"{elem.__class__.__name__} should be a ``attrs.Time``, ``attrs.hek.MaxRecords`` or ``attrs.hek.TableName`` attribute.") qrdict.update(kwargs) table = qrdict.get('table_name', None) if table: if isinstance(table, bytes): warn_deprecated('type `bytes` for table_name is deprecated, use `str` instead.') table = str.encode(table) start_time = qrdict['Time'].start end_time = qrdict['Time'].end max_records = qrdict.get('max_records', 500) while table is None: table = self.select_table() start_time = parse_time(start_time) end_time = parse_time(end_time) results = self.hec_client.service.TimeQuery(STARTTIME=start_time.isot, ENDTIME=end_time.isot, FROM=table, MAXRECORDS=max_records) results = votable_handler(etree.tostring(results)) table = HECResponse(results.to_table(), client=self) if len(table) == max_records == 500: warn_user("Number of results is the same as the default `max_records` of 500. " "It is possible your query has been truncated. " "If you want to change this, set `a.helio.MaxRecords` to a higher value.") return table 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: +REMOTE_DATA [('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',)] """ results = self.hec_client.service.getTableNames() tables = votable_handler(etree.tostring(results)) return tables.array def select_table(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 ------- `str` Contains the name of the table that the user picked. Examples -------- >>> from sunpy.net.helio import hec # doctest: +SKIP >>> hc = hec.HECClient() # doctest: +SKIP >>> hc.select_table() # doctest: +SKIP """ tables = self.get_table_names() table_list = [t[0] for t in tables if len(t[0]) > 0] table_list.sort() for index, table in enumerate(table_list): print(f'{index + 1} - {table}') while True: user_input = input(f"\nPlease enter a table number between 1 and {len(table_list)} " "('e' to exit): ") if user_input.lower() == "e" or user_input.lower() == "exit": return None if user_input.isdigit() and 1 <= int(user_input) <= len(table_list): table_no = int(user_input) return table_list[table_no - 1] else: print(f"Input must be an integer between 1 and {len(table_list)}") def fetch(self, *args, **kwargs): """ This is a no operation function as this client does not download data. """ return NotImplemented ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/helio/parser.py0000644000175100001710000001701300000000000016640 0ustar00vstsdocker""" This module is meant to parse the HELIO registry and return WSDL endpoints to facilitate the interfacing between further modules and HELIO. """ import xml.etree.ElementTree as EL from contextlib import closing from urllib.request import urlopen from bs4 import BeautifulSoup from sunpy import log __all__ = ['webservice_parser', 'endpoint_parser', 'wsdl_retriever'] LINK_TIMEOUT = 10 REG_LINKS = [ 'http://registry.helio-vo.eu/helio_registry/viewResourceEntry_body.jsp?XML=true&IVORN=ivo://helio-vo.eu/', 'https://helio.ukssdc.ac.uk/helio_registry/viewResourceEntry_body.jsp?XML=true&IVORN=ivo://helio-vo.eu/' ] def webservice_parser(service='HEC'): """ Quickly parses important contents from HELIO registry. Uses the link 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: +REMOTE_DATA ['http://helio.mssl.ucl.ac.uk/helio-hec/HelioService', 'http://msslkk.mssl.ucl.ac.uk/helio-hec/HelioService', 'http://voparis-helio.obspm.fr/helio-hec/HelioService', 'http://hec.helio-vo.eu/helio-hec/HelioService', 'http://helio.mssl.ucl.ac.uk/helio-hec/HelioLongQueryService', 'http://msslkk.mssl.ucl.ac.uk/helio-hec/HelioLongQueryService', 'http://voparis-helio.obspm.fr/helio-hec/HelioLongQueryService', 'http://hec.helio-vo.eu/helio-hec/HelioLongQueryService'] """ xml = None for REG_LINK in REG_LINKS: link = REG_LINK + service.lower() xml = link_test(link) if xml: break 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 ['http://helio.mssl.ucl.ac.uk/helio-hec/HelioService?wsdl', 'http://helio.mssl.ucl.ac.uk/helio-hec/HelioService1_0?wsdl', 'http://helio.mssl.ucl.ac.uk/helio-hec/HelioService1_0b?wsdl', 'http://helio.mssl.ucl.ac.uk/helio-hec/HelioLongQueryService?wsdl', 'http://helio.mssl.ucl.ac.uk/helio-hec/HelioLongQueryService1_0?wsdl', 'http://helio.mssl.ucl.ac.uk/helio-hec/HelioLongQueryService1_1?wsdl', 'http://helio.mssl.ucl.ac.uk/helio-hec/HelioLongQueryService1_0b?wsdl', 'http://helio.mssl.ucl.ac.uk/helio-hec/HelioTavernaService?wsdl'] """ endpoint_page = link_test(link) if endpoint_page is None: return None soup = BeautifulSoup(endpoint_page, 'html.parser') endpoints = [] for web_link in soup.find_all('a'): url = web_link.get('href') if url not in endpoints: endpoints.append(url.replace(":80", "", 1)) 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/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(urlopen(link, timeout=LINK_TIMEOUT)) as fd: return fd.read() except Exception as e: log.debug(f"Failed to get {link} with {e}") 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/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) if service_links: for link in service_links: wsdl_links = taverna_parser(link) if wsdl_links: for end_point in wsdl_links: if end_point and link_test(end_point): return end_point raise ValueError("No online HELIO servers can be found.") ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6452754 sunpy-3.1.5/sunpy/net/helio/tests/0000755000175100001710000000000000000000000016132 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/helio/tests/__init__.py0000644000175100001710000000000000000000000020231 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/helio/tests/test_chaincode.py0000644000175100001710000000305000000000000021456 0ustar00vstsdockerimport numpy as np from sunpy.net.helio.chaincode import Chaincode def test_ends(): cc = Chaincode([0, 0], "2460") end = [0, 0] assert cc.matchend(end) def test_endsfalse(): cc = Chaincode([0, 0], "24460") end = [0, 0] assert not cc.matchend(end) def test_secondcoordinate(): cc = Chaincode([0, 0], "0023") second = [-2, 0] assert cc.matchany(second, 2) def test_secondcoordinatefails(): cc = Chaincode([1, 0], "0023") second = [-2, 0] assert not cc.matchany(second, 2) def test_scalesecond(): cc = Chaincode([0, 0], "0723", xdelta=0.5, ydelta=0.5) second = [-1, 0.5] assert cc.matchany(second, 2) def test_scaleend(): cc = Chaincode([1.2, 3], "0723", xdelta=2.629, ydelta=2.629) end = [-1.429, 0.371] assert cc.matchany(end, -1) def test_array(): cc = Chaincode(np.array([0, 0]), "2460") shape = (2, 5) assert cc.coordinates.shape == shape def test_boundingbox(): cc = Chaincode([0, 0], "00033344") boundingbox = [[-3, 2], [-3, 0]] # [[x0,x1],[y0,y1]] (like cc) assert np.all(cc.boundingbox() == np.array(boundingbox)) def test_boundingboxfalse(): cc = Chaincode([0, 0], "002") boundingbox = [[-1, 0], [-1, 0]] assert not np.all(cc.boundingbox() != np.array(boundingbox)) def test_subboundingboxx(): cc = Chaincode([0, 0], "44464660012075602223") assert cc.sub_boundingbox(xedge=[0.1, 2]) == [0, 3] def test_subboundingboxy(): cc = Chaincode([0, 0], "44464660012075602223") assert cc.sub_boundingbox(yedge=[-1, 0.5]) == [0, 3] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/helio/tests/test_helio.py0000644000175100001710000002450600000000000020652 0ustar00vstsdockerimport urllib from unittest import mock import pytest from sunpy.net import attrs as a from sunpy.net.helio.hec import HECClient from sunpy.net.helio.parser import ( endpoint_parser, link_test, taverna_parser, webservice_parser, wsdl_retriever, ) # Currently helio makes unverified requests - this filter should be removed when # https://github.com/sunpy/sunpy/issues/4401 is fixed pytestmark = pytest.mark.filterwarnings('ignore:Unverified HTTPS request is being made') 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 ''' @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/helio-hec/HelioTavernaService?wsdl', 'http://helio.mssl.ucl.ac.uk/helio-hec/HelioLongQueryService?wsdl', 'http://helio.mssl.ucl.ac.uk/helio-hec/HelioLongQueryService1_1?wsdl', 'http://helio.ucl.ac.uk/helio-hec/HelioLongQueryService1_0b?wsdl') @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 @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 @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 @mock.patch('sunpy.net.helio.parser.webservice_parser', return_value=None) def test_wsdl_retriever_no_content(mock_endpoint_parser): """ No links found? Raise ValueError """ with pytest.raises(ValueError): wsdl_retriever() @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? Raise ValueError """ with pytest.raises(ValueError): wsdl_retriever() @mock.patch('sunpy.net.helio.parser.link_test', return_value=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()) def test_wsdl_retriever_wsdl(mock_taverna_parser, mock_webservice_parser, mock_link_test): """ Unable to find any valid Taverna URLs? Raise ValueError """ with pytest.raises(ValueError): wsdl_retriever() @pytest.mark.remote_data def test_link_test(): assert b"# SunPy Sample Data" in link_test('http://data.sunpy.org/sunpy/README.md') # 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 @pytest.mark.remote_data @pytest.fixture(scope="session") def client(): try: client = HECClient() return client # If no links are found, the client should raise a ValueError except ValueError: pytest.xfail("No HELIO working links found.") @pytest.mark.remote_data def test_get_table_names(client): tables = client.get_table_names() assert len(tables) == 126 table = tables[0][0] assert isinstance(table, str) assert table == 'timed_see_flare' @pytest.mark.remote_data def test_select_table(client, monkeypatch): monkeypatch.setattr('builtins.input', lambda x: "11") assert isinstance(client.select_table(), str) monkeypatch.setattr('builtins.input', lambda x: "e") assert client.select_table() is None @pytest.mark.remote_data def test_client_search(client): start = '2005/01/03' end = '2005/12/03' table_name = 'rhessi_hxr_flare' res = client.search(a.Time(start, end), a.helio.TableName(table_name), a.helio.MaxRecords(10)) assert len(res) == 10 @pytest.mark.remote_data def test_HECResponse_iter(client): start = '2005/01/03' end = '2005/12/03' table_name = 'rhessi_hxr_flare' res = client.search(a.Time(start, end), a.helio.TableName(table_name), a.helio.MaxRecords(10)) for i in res: # Just to make sure iter still works, check number of columns assert len(i) == 13 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/helioviewer.py0000644000175100001710000004633600000000000016600 0ustar00vstsdocker""" This module provides a wrapper around the Helioviewer API. """ import json import codecs import urllib from pathlib import Path from collections import OrderedDict from urllib.parse import urljoin from urllib.request import urlopen from astropy.utils.decorators import lazyproperty import sunpy import sunpy.util.parfive_helpers as parfive from sunpy import log from sunpy.time import parse_time from sunpy.util.util import partial_key_match from sunpy.util.xml import xml_to_dict __all__ = ['HelioviewerClient'] HELIOVIEWER_API_URLS = [ "https://helioviewer-api.ias.u-psud.fr/", "https://api.helioviewer.org/", ] def check_connection(url): try: resp = urlopen(urljoin(url, "/v2/getDataSources/")) assert resp.getcode() == 200 assert isinstance(json.loads(resp.read()), dict) return url except Exception as e: log.debug(f"Unable to connect to {url}:\n {e}") log.info(f"Connection to {url} failed. Retrying with different url.") return None class HelioviewerClient: """Helioviewer.org Client""" def __init__(self, url=None): """ Parameters ---------- url : `str` Default URL points to the Helioviewer API. """ if url is None: for url in HELIOVIEWER_API_URLS: if check_connection(url): break if url is None: raise ValueError("No online helioviewer API can be found.") self._api = url @lazyproperty def data_sources(self): """ We trawl through the return from ``getDataSources`` to create a clean dictionary for all available sourceIDs. Here is a list of all of them: https://api.helioviewer.org/docs/v2/#appendix_datasources """ data_sources_dict = dict() datasources = self.get_data_sources() for name, observ in datasources.items(): # TRACE only has measurements and is thus nested once if name == "TRACE": for instr, params in observ.items(): data_sources_dict[(name, None, None, instr)] = params['sourceId'] else: for inst, detect in observ.items(): for wavelength, params in detect.items(): if 'sourceId' in params: data_sources_dict[(name, inst, None, wavelength)] = params['sourceId'] else: for wave, adict in params.items(): data_sources_dict[(name, inst, wavelength, wave) ] = adict['sourceId'] # Sort the output for printing purposes return OrderedDict(sorted(data_sources_dict.items(), key=lambda x: x[1])) def get_data_sources(self): """ Return a hierarchical dictionary of the available datasources on helioviewer.org. This uses ``getDataSources`` from the Helioviewer API. Returns ------- out : `dict` A dictionary containing meta-information for each data source that Helioviewer supports. """ params = {"action": "getDataSources"} return self._get_json(params) def get_closest_image(self, date, observatory=None, instrument=None, detector=None, measurement=None, source_id=None): """ Finds the closest image available for the specified source and date. **This does not download any file.** This uses `getClosestImage `_ from the Helioviewer API. .. note:: We can use ``observatory`` and ``measurement`` or ``instrument`` and ``measurement`` to get the value for source ID which can then be used to get required information. Parameters ---------- date : `astropy.time.Time`, `str` A `~sunpy.time.parse_time` parsable string or `~astropy.time.Time` object for the desired date of the image observatory : `str` Observatory name instrument : `str` Instrument name detector : `str` Detector name measurement : `str` Measurement name source_id : `int` ID number for the required instrument/measurement. This can be used directly instead of using the previous parameters. 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', source_id=11) # doctest: +REMOTE_DATA >>> print(metadata['date']) # doctest: +REMOTE_DATA 2012-01-01T00:00:07.000 """ if source_id is None: source_id = self._get_source_id((observatory, instrument, detector, measurement)) params = { "action": "getClosestImage", "date": self._format_date(date), "sourceId": source_id } response = self._get_json(params) # Cast date string to Time response['date'] = parse_time(response['date']) return response def download_jp2(self, date, progress=True, observatory=None, instrument=None, detector=None, measurement=None, source_id=None, directory=None, overwrite=False): """ Downloads the JPEG 2000 that most closely matches the specified time and data source. This uses `getJP2Image `_ from the Helioviewer API. .. note:: We can use ``observatory`` and ``measurement`` or ``instrument`` and ``measurement`` to get the value for source ID which can then be used to get required information. Parameters ---------- date : `astropy.time.Time`, `str` A string or `~astropy.time.Time` object for the desired date of the image progress : `bool` Defaults to True. If set to False, disables progress bars seen on terminal when downloading files. observatory : `str` Observatory name instrument : `str` Instrument name measurement : `str` Measurement name detector : `str` Detector name source_id : `int` ID number for the required instrument/measurement. This can be used directly instead of using the previous parameters. directory : `str` Directory to download JPEG 2000 image to. overwrite : `bool` Defaults to False. If set to True, will overwrite any files with the same name. Returns ------- out : `str` Returns a filepath to the downloaded JPEG 2000 image. 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='HMI', detector=None, measurement='continuum') # doctest: +REMOTE_DATA >>> filepath = hv.download_jp2('2012/07/03 14:30:00', observatory='SDO', measurement='continuum') # doctest: +REMOTE_DATA >>> filepath = hv.download_jp2('2012/07/03 14:30:00', instrument='HMI', measurement='continuum') # doctest: +REMOTE_DATA >>> aia = sunpy.map.Map(filepath) # doctest: +REMOTE_DATA >>> aia.peek() # doctest: +SKIP """ if source_id is None: source_id = self._get_source_id((observatory, instrument, detector, measurement)) params = { "action": "getJP2Image", "date": self._format_date(date), "sourceId": source_id, } return self._get_file(params, progress=progress, directory=directory, overwrite=overwrite) def get_jp2_header(self, date, observatory=None, instrument=None, detector=None, measurement=None, jp2_id=None): """ Get the XML header embedded in a JPEG2000 image. Includes the FITS header as well as a section of Helioviewer-specific metadata. This uses `getJP2Header `_ from the Helioviewer API. .. note:: We can use ``observatory`` and ``measurement`` or ``instrument`` and ``measurement`` to get the value for source ID which can then be used to get required information. Parameters ---------- date : `astropy.time.Time`, `str` A `~sunpy.time.parse_time` parsable string or `~astropy.time.Time` object for the desired date of the image observatory : `str` Observatory name instrument : `str` Instrument name measurement : `str` Measurement name detector : `str` Detector name jp2_id : `int` Unique JP2 image identifier. This can be used directly instead of using the previous parameters. Returns ------- out : `dict` Returns a dictionary containing the header information of JPEG 2000 image. The returned dictionary may have either one or two keys: *fits* and *helioviewer*. Examples -------- >>> from sunpy.net import helioviewer >>> hv = helioviewer.HelioviewerClient() # doctest: +REMOTE_DATA >>> header = hv.get_jp2_header('2012/07/03', observatory='SDO', ... instrument='HMI', detector=None, measurement='continuum') # doctest: +REMOTE_DATA >>> # The key 'fits' can be used to get the fits header information >>> fits_header = header['fits'] # doctest: +REMOTE_DATA >>> # The keys 'helioviewer' can be used to extract the helioviewer specific metadata. >>> helioviewer_meta_data = header['helioviewer'] # doctest: +REMOTE_DATA """ if jp2_id is None: jp2_id = self.get_closest_image( date, observatory, instrument, detector, measurement)['id'] params = { "action": "getJP2Header", "id": jp2_id, } responses = self._request(params) # Reads the output from HTTPResponse object and decodes it. responses = responses.read().decode('utf-8') return xml_to_dict(responses)['meta'] def download_png(self, date, image_scale, layers, progress=True, directory=None, overwrite=False, watermark=False, events="", event_labels=False, scale=False, scale_type="earth", scale_x=0, scale_y=0, width=4096, height=4096, x0=0, y0=0, x1=None, y1=None, x2=None, y2=None): """ Downloads the PNG that most closely matches the specified time and data source. This function is different to `~sunpy.net.helioviewer.HelioviewerClient.download_jp2`. Here you get PNG images and return more complex images. For example you can return an image that has multiple layers composited together from different sources. Also mark solar features/events with an associated text label. The image can also be cropped to a smaller field of view. These parameters are not pre-validated before they are passed to Helioviewer API. See https://api.helioviewer.org/docs/v2/#appendix_coordinates for more information about what coordinates values you can pass into this function. This uses `takeScreenshot `_ from the Helioviewer API. .. note:: Parameters ``x1``, ``y1``, ``x2`` and ``y2`` are set to `None`. If all 4 are set to values, then keywords: ``width``, ``height``, ``x0``, ``y0`` will be ignored. Parameters ---------- date : `astropy.time.Time`, `str` A `~sunpy.time.parse_time` parsable string or `~astropy.time.Time` object for the desired date of the image image_scale : `float` The zoom scale of the image in arcseconds per pixel. For example, the scale of an AIA image is 0.6. layers : `str` Image datasource layer/layers to include in the screeshot. Each layer string is comma-separated with either: "[sourceId,visible,opacity]" or "[obs,inst,det,meas,visible,opacity]". Multiple layers are: "[layer1],[layer2],[layer3]". progress : `bool`, optional Defaults to True. If set to False, disables progress bars seen on terminal when downloading files. events : `str`, optional Defaults to an empty string to indicate no feature/event annotations. List feature/event types and FRMs to use to annoate the image. Example could be "[AR,HMI_HARP;SPoCA,1]" or "[CH,all,1]" event_labels : `bool`, optional Defaults to False. Annotate each event marker with a text label. watermark : `bool`, optional Defaults to False. Overlay a watermark consisting of a Helioviewer logo and the datasource abbreviation(s) and timestamp(s) in the screenshot. directory : `str`, optional Directory to download JPEG 2000 image to. overwrite : bool, optional Defaults to False. If set to True, will overwrite any files with the same name. scale : `bool`, optional Defaults to False. Overlay an image scale indicator. scale_type : `str`, optional Defaults to Earth. What is the image scale indicator will be. scale_x : `int`, optional Defaults to 0 (i.e, in the middle) Horizontal offset of the image scale indicator in arcseconds with respect to the center of the Sun. scale_y : `int`, optional Defaults to 0 (i.e, in the middle) Vertical offset of the image scale indicator in arcseconds with respect to the center of the Sun. 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 Defaults to 4096. Width of the image in pixels. height : `int`, optional Defaults to 4096. Height of the image in pixels. x1 : `float`, optional Defaults to None The offset of the image's left boundary from the center of the sun, in arcseconds. y1 : `float`, optional Defaults to None The offset of the image's top boundary from the center of the sun, in arcseconds. x2 : `float`, optional Defaults to None The offset of the image's right boundary from the center of the sun, in arcseconds. y2 : `float`, optional Defaults to None The offset of the image's bottom boundary from the center of the sun, in arcseconds. Returns ------- out : `str` Returns a filepath to the downloaded PNG image. Examples -------- >>> from sunpy.net.helioviewer import HelioviewerClient >>> hv = HelioviewerClient() # doctest: +REMOTE_DATA >>> file = 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: +REMOTE_DATA >>> file = 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) # doctest: +REMOTE_DATA """ params = { "action": "takeScreenshot", "date": self._format_date(date), "imageScale": image_scale, "layers": layers, "eventLabels": event_labels, "events": events, "watermark": watermark, "scale": scale, "scaleType": scale_type, "scaleX": scale_x, "scaleY": scale_y, # Returns the image which we do not want a user to change. "display": True } # We want to enforce that all values of x1, x2, y1, y2 are not None. # You can not use both scaling parameters so we try to exclude that here. if any(i is None for i in [x1, x2, y1, y2]): adict = {"x0": x0, "y0": y0, "width": width, "height": height} else: adict = {"x1": x1, "x2": x2, "y1": y1, "y2": y2} params.update(adict) return self._get_file(params, progress=progress, directory=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, progress=True, directory=None, overwrite=False): """Downloads a file and return the filepath to that file.""" if directory is None: directory = Path(sunpy.config.get('downloads', 'download_dir')) else: directory = Path(directory).expanduser().absolute() downloader = parfive.Downloader(progress=progress, overwrite=overwrite) url = urllib.parse.urljoin(self._api, "?" + urllib.parse.urlencode(params)) downloader.enqueue_file(url, path=directory) res = downloader.download() if len(res) == 1: return res[0] else: return res def _request(self, params): """ Sends an API request and returns the result. Parameters ---------- params : `dict` Parameters to send Returns ------- out : result of the 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).isot + "Z" def _get_source_id(self, key): """ Returns source_id based on the key. """ source_id_list = list(partial_key_match(key, self.data_sources)) if len(source_id_list) != 1: raise KeyError(f"The values used: {key} do not correspond to one source_id " f"but {len(source_id_list)} source_id(s)." " Please check the list using HelioviewerClient.data_sources.") return source_id_list[0] ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6452754 sunpy-3.1.5/sunpy/net/jsoc/0000755000175100001710000000000000000000000014626 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/jsoc/__init__.py0000644000175100001710000000010500000000000016733 0ustar00vstsdockerfrom sunpy.net.jsoc.attrs import * from sunpy.net.jsoc.jsoc import * ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/jsoc/attrs.py0000644000175100001710000001577000000000000016347 0ustar00vstsdockerimport astropy.units as u from sunpy.coordinates.utils import get_rectangle_coordinates from sunpy.net._attrs import Time, Wavelength from sunpy.net.attr import AttrAnd, AttrComparison, AttrOr, AttrWalker, DataAttr, SimpleAttr __all__ = ['Series', 'Protocol', 'Notify', 'Segment', 'PrimeKey', 'Cutout', "Keyword"] # Define a custom __dir__ to restrict tab-completion to __all__ def __dir__(): return __all__ class Series(SimpleAttr): """ The JSOC Series to Download. This is the list of `Series `__. """ class PrimeKey(DataAttr): """ Prime Keys Parameters ---------- label : str value : str """ def __init__(self, label, value): super().__init__() self.label = label self.value = value def __repr__(self): return f"{object.__repr__(self)}" + "\n" + f"{self.label, self.value}" def collides(self, other): return False class KeywordComparison(AttrComparison): """ Allows comparison filtering of the JSOC Keywords with the ability to specify the comparison operator. Parameters ---------- name : str operator : str value : Numeric """ class Keyword(SimpleAttr): """ Allows comparison filtering of the JSOC Keywords. Parameters ---------- value : str """ def __lt__(self, other): return KeywordComparison(self.value, '<', other) def __le__(self, other): return KeywordComparison(self.value, '<=', other) def __gt__(self, other): return KeywordComparison(self.value, '>', other) def __ge__(self, other): return KeywordComparison(self.value, '>=', other) def __eq__(self, other): return KeywordComparison(self.value, '=', other) def __ne__(self, other): return KeywordComparison(self.value, '!=', other) def collides(self, other): return isinstance(other, Keyword) class Segment(SimpleAttr): """ Segments choose which files to download when there are more than one present for each record e.g. 'image'. """ def collides(self, other): return False class Protocol(SimpleAttr): """ 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. """ class Notify(SimpleAttr): """ An email address to get a notification to when JSOC has staged your request. """ def __init__(self, value): super().__init__(value) if value.find('@') == -1: raise ValueError("Notify attribute must contain an '@' symbol " "to be a valid email address") self.value = value class Cutout(DataAttr): """ Select a cutout region. The JSOC allows for users to request cutouts. This process is performed server side so as to allow users to download only the portions of the full-disk images they are interested in. For a detailed explanation of the routine used to perform these cutouts on the JSOC server, see http://jsoc.stanford.edu/doxygen_html/group__im__patch.html. Parameters ---------- bottom_left : `~astropy.coordinates.SkyCoord` Coordinate for the bottom left corner of the cutout. top_right : `~astropy.coordinates.SkyCoord`, optional Coordinate for the top right corner of the cutout. If this is not specified, both ``width`` and ``height`` must both be specified. width : `~astropy.units.Quantity`, optional Width of the cutout. If this parameter, along with ``height``, is not specified, ``top_right`` must be specified. height : `~astropy.units.Quantity`, optional Height of the cutout. If this parameter, along with ``width``, is not specified, ``top_right`` must be specified. tracking : `bool`, optional If True, the field of view follows the rotation of the Sun register : `bool`, optional If True, use sub-pixel registration when cropping to the target location. nan_off_limb : `bool`, optional If True, all off-limb pixels are set to NaN See Also -------- sunpy.coordinates.utils.get_rectangle_coordinates """ @u.quantity_input def __init__(self, bottom_left, top_right=None, width: u.arcsec = None, height: u.arcsec = None, tracking=False, register=False, nan_off_limb=False): super().__init__() bl, tr = get_rectangle_coordinates(bottom_left, top_right=top_right, width=width, height=height) self.value = { 't_ref': bl.obstime.isot, # JSOC input is disable tracking so take the negative 't': int(not tracking), 'r': int(register), 'c': int(nan_off_limb), 'locunits': 'arcsec', 'boxunits': 'arcsec', 'x': ((bl.Tx + tr.Tx) / 2).to('arcsec').value, 'y': ((bl.Ty + tr.Ty) / 2).to('arcsec').value, 'width': (tr.Tx - bl.Tx).to('arcsec').value, 'height': (tr.Ty - bl.Ty).to('arcsec').value, } def collides(self, other): return isinstance(other, self.__class__) walker = AttrWalker() @walker.add_creator(AttrOr) def _create1(wlk, query): qblocks = [] for iattr in query.attrs: qblocks.extend(wlk.create(iattr)) return qblocks @walker.add_creator(AttrAnd, DataAttr) 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(SimpleAttr) def _apply1(wlk, query, imap): imap[query.__class__.__name__.lower()] = query.value @walker.add_applier(PrimeKey) def _apply1(wlk, query, imap): key = 'primekey' if key in imap: imap[key][query.label] = query.value else: imap[key] = {query.label: query.value} @walker.add_applier(Keyword) def _apply1(wlk, query, imap): raise ValueError(f"Keyword '{query.value}' needs to have a comparison to a value.") @walker.add_applier(KeywordComparison) def _apply1(wlk, query, imap): key = 'keyword' if key in imap: imap[key][query.name] = {"operator": query.operator, "value": query.value} else: imap[key] = {f"{query.name}": {"operator": query.operator, "value": query.value}} @walker.add_applier(Segment) def _apply1(wlk, query, imap): key = 'segment' if key in imap: imap[key].append(query.value) else: imap[key] = [query.value] @walker.add_applier(Cutout) def _apply1(wlk, query, imap): imap[query.__class__.__name__.lower()] = query.value @walker.add_applier(Time) def _apply1(wlk, query, imap): imap['start_time'] = query.start imap['end_time'] = query.end @walker.add_applier(Wavelength) def _apply1(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 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6452754 sunpy-3.1.5/sunpy/net/jsoc/data/0000755000175100001710000000000000000000000015537 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/jsoc/data/__init__.py0000644000175100001710000000000000000000000017636 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/jsoc/data/attrs.json0000644000175100001710000012425500000000000017600 0ustar00vstsdocker{ "series_store": [ [ "aia.flatfield", "AIA flatfield" ], [ "aia.lev1", "AIA Level 1" ], [ "aia.lev1_euv_12s", "AIA Level 1, 12 second cadence" ], [ "aia.lev1_uv_24s", "AIA Level 1, 24 second cadence" ], [ "aia.lev1_vis_1h", "AIA Level 1, 3600 second cadence" ], [ "aia.master_pointing3h", "Master Pointing Parameters" ], [ "aia.response", "AIA instrument response table" ], [ "aia.temperature_summary_300s", "Temperature Statistics from AIA Housekeeping - Thermal Packet" ], [ "hmi.b_135s", "Full-disk Milne-Eddington inversion with the azimuth disambiguation information contained in DISAMBIG to be applied to AZIMUTH" ], [ "hmi.b_5760s", "96-min full-disk Milne-Eddington inversion with the azimuth disambiguation information contained in DISAMBIG to be applied to AZIMUTH as described in http://jsoc.stanford.edu/jsocwiki/FullDiskDisamb" ], [ "hmi.b_720s", "Full-disk Milne-Eddigton inversion with the magnetic field azimuthal ambiguity resolution applied" ], [ "hmi.b_720s_dcon", "Deconvoluted full-disk Milne-Eddington inversion with the azimuth disambiguation information contained in DISAMBIG to be applied to AZIMUTH as described in http://jsoc.stanford.edu/jsocwiki/FullDiskDisamb" ], [ "hmi.b_720s_dcons", "Deconvoluted full-disk Milne-Eddington inversion with the azimuth disambiguation information contained in DISAMBIG to be applied to AZIMUTH as described in http://jsoc.stanford.edu/jsocwiki/FullDiskDisamb" ], [ "hmi.b_720s_e15w1332_cea", "Cylindrical equal area projected HMI vector patch" ], [ "hmi.b_720s_e15w1332_cutout", "HMI vector patch cutout" ], [ "hmi.b_90s", "Full-disk Milne-Eddington inversion with the azimuth disambiguation information contained in DISAMBIG to be applied to AZIMUTH" ], [ "hmi.b_synoptic", "HMI synoptic chart of vector B field. Disambiguation for weak field pixels uses random method." ], [ "hmi.b_synoptic_small", "HMI synoptic chart of vector B field (small size). Disambiguation for weak field pixels uses random method." ], [ "hmi.bharp_720s", "Disambiguated HARP for Milne-Eddington inversion" ], [ "hmi.bharp_720s_nrt", "Disambiguated HARP for Milne-Eddigton inversion" ], [ "hmi.bmap_lowres_latlon_720s", "HMI vector B Magnetograms remapped to grid in longitude, latitude" ], [ "hmi.c_avg120", "Temporal averages of HMI continuum photograms over 1/3 CR" ], [ "hmi.coefficients", "This series contains the 4 polynomial coefficients for the 3rd-order polynomial Doppler velocity correction with the MDI-like algorithm" ], [ "hmi.eigenfunctions", "eigenfuctions for performing inversions" ], [ "hmi.flatfield", "HMI flat field" ], [ "hmi.fsi_phase_lon_lat", "Farside lon/lat phase maps" ], [ "hmi.fsi_phase_lon_lat_5d", "5 day cumulative farside lon/lat phase maps" ], [ "hmi.fsvbinned_nrt", "Binned HMI NRT Dopplergrams for GONG far-side processing" ], [ "hmi.gcvbinned_nrt", "Binned HMI Dopplergrams for GONG copipe processing" ], [ "hmi.hskernels", "mode kernels for helioseismic inversions" ], [ "hmi.ic_45s", "continuum intensities with a cadence of 45 seconds." ], [ "hmi.ic_45s_dcon", "continuum intensities with a cadence of 45 seconds, constructed with hmi.lev1_dcon" ], [ "hmi.ic_720s", "continuum intensities with a cadence of 720 seconds." ], [ "hmi.ic_720s_dcon", "continuum intensities with a cadence of 720 seconds, constructed with hmi.lev1_dcon." ], [ "hmi.ic_720s_dcons", "continuum intensities with a cadence of 720 seconds, scattered light corrected." ], [ "hmi.ic_nolimbdark_720s", "Continuum intensities with limb darkening removed" ], [ "hmi.ic_nolimbdark_720s_nrt", "Continuum intensities with limb darkening removed" ], [ "hmi.ld_45s", "linedepths with a cadence of 45 seconds." ], [ "hmi.ld_45s_dcon", "linedepths with a cadence of 45 seconds, constructed with hmi.lev1_dcon" ], [ "hmi.ld_720s", "linedepths with a cadence of 720 seconds." ], [ "hmi.ld_720s_dcon", "linedepths with a cadence of 720 seconds, constructed with hmi.lev1_dcon." ], [ "hmi.ld_720s_dcons", "linedepths with a cadence of 720 seconds, scattered light corrected." ], [ "hmi.leakage", "leakage matrices" ], [ "hmi.lev1_cal", "HMI Level 1 Calibration Series" ], [ "hmi.lev1_dcon", "HMI Level 1" ], [ "hmi.lookup_chebycoef_bnoise", "Btotal noise mask" ], [ "hmi.lookup_corrected_expanded", "This series contains lookup tables for MDI-like algorithm." ], [ "hmi.lookup_expanded", "This series contains lookup tables for MDI-like algorithm." ], [ "hmi.lw_45s", "linewidths with a cadence of 45 seconds." ], [ "hmi.lw_45s_dcon", "linewidths with a cadence of 45 seconds, constructed with hmi.lev1_dcon" ], [ "hmi.lw_720s", "linewidths with a cadence of 720 seconds." ], [ "hmi.lw_720s_dcon", "linewidths with a cadence of 720 seconds, constructed with hmi.lev1_dcon." ], [ "hmi.lw_720s_dcons", "linewidths with a cadence of 720 seconds, scattered light corrected." ], [ "hmi.m_45s", "magnetograms with a cadence of 45 seconds." ], [ "hmi.m_45s_dcon", "magnetograms with a cadence of 45 seconds, constructed with hmi.lev1_dcon" ], [ "hmi.m_720s", "magnetograms with a cadence of 720 seconds." ], [ "hmi.m_720s_dcon", "magnetograms with a cadence of 720 seconds, constructed with hmi.lev1_dcon." ], [ "hmi.m_720s_dcons", "magnetograms with a cadence of 720 seconds, scatter light corrected." ], [ "hmi.m_720s_mod", "magnetograms with a cadence of 720 seconds." ], [ "hmi.m_720s_nrt", "Quick-look magnetograms with a cadence of 720 seconds." ], [ "hmi.marmask_720s", "Full disk active region mask (char)" ], [ "hmi.marmask_720s_nrt", "Full disk active region mask (char)" ], [ "hmi.me_135s", "Milne-Eddigton inversion" ], [ "hmi.me_5760s", "96-minute Milne-Eddigton inversion" ], [ "hmi.me_720s_e15w1332", "Full-disk Milne-Eddigton inversion" ], [ "hmi.me_720s_e15w1332_harp", "Milne-Eddigton inversion for selected region(s)" ], [ "hmi.me_720s_fd10", "Milne-Eddigton inversion" ], [ "hmi.me_720s_fd10_dcon", "Milne-Eddigton inversion, constructed with hmi.S_720s_dcon" ], [ "hmi.me_720s_fd10_harp", "Milne-Eddigton inversion for selected region(s)" ], [ "hmi.me_720s_fd10_harp_nrt", "Near Real Time Milne-Eddigton inversion for selected region(s)" ], [ "hmi.me_720s_fd10_nrt", "Milne-Eddigton inversion (Near Real Time)" ], [ "hmi.me_90s", "Milne-Eddigton inversion" ], [ "hmi.meanpf_720s", "Mean polar field and AR field with a cadence of 720 seconds." ], [ "hmi.meharp_720s", "HARP for Milne-Eddington inversion" ], [ "hmi.meharp_720s_nrt", "HARP for Milne-Eddigton inversion" ], [ "hmi.mharp_720s", "HARP = HMI Active Region Patch" ], [ "hmi.mharp_720s_nrt", "Quicklook HARP = HMI Active Region Patch" ], [ "hmi.mhdcorona", "Three-dimensional MHD simulation data with definitive HMI magnetic field map" ], [ "hmi.mhdcorona_daily", "Three-dimensional MHD simulation data with daily updated HMI magnetic field map" ], [ "hmi.mhdcorona_daily_nrt", "Three-dimensional MHD simulation data with daily updated HMI magnetic field map" ], [ "hmi.mldailysynframe_720s", "HMI daily update synoptic frame -- line-of-sight field" ], [ "hmi.mldailysynframe_720s_nrt", "HMI NRT daily update synoptic frame -- line-of-sight field" ], [ "hmi.mldailysynframe_small_720s", "HMI daily update synoptic frame -- line-of-sight field" ], [ "hmi.mldailysynframe_small_720s_nrt", "HMI NRT daily update synoptic frame -- line-of-sight field" ], [ "hmi.mlsynop_small_720s", "HMI synoptic chart of line-of-sight magnetic field - small size map" ], [ "hmi.mrdailysynframe_720s", "HMI daily update synoptic frame -- Mr field converted from Mlos" ], [ "hmi.mrdailysynframe_720s_nrt", "HMI NRT daily update synoptic frame -- Mr field converted from Mlos" ], [ "hmi.mrdailysynframe_polfil_720s", "HMI daily update Mr synoptic frames, constructed from Blos, with polar field corrected" ], [ "hmi.mrdailysynframe_small_720s", "HMI daily update synoptic frame -- Mr field converted from Mlos" ], [ "hmi.mrdailysynframe_small_720s_nrt", "HMI NRT daily update synoptic frame -- Mr field converted from Mlos" ], [ "hmi.mrmap_latlon_720s", "HMI Magnetograms (Radial field converted from LoS) remapped to grid in longitude, latitude." ], [ "hmi.mrmap_latlon_720s_nrt", "Quicklook HMI Magnetograms (Radial field converted from LoS) remapped to grid in longitude, latitude." ], [ "hmi.mrmap_lowres_latlon_720s", "HMI Magnetograms (Radial field converted from LoS) remapped to grid in longitude, latitude." ], [ "hmi.mrsynop_small_720s", "HMI synoptic chart of Mr field - small size map" ], [ "hmi.offpoint_flatfield", "HMI flat field" ], [ "hmi.pfss_synframe", "PFSS cubes from daily updated synchronic frames for Q-map computation, higher resolution Br computed at radius of Q-maps, and smoothed Br used as input" ], [ "hmi.pfss_synop", "PFSS cubes from full CR synoptic maps for Q-map computation, higher resolution Br computed at radius of Q-maps, and smoothed Br used as input" ], [ "hmi.polar_db", "HMI polar field database" ], [ "hmi.q_synframe", "Qmap computed from PFSS model using daily updated synchronic frame" ], [ "hmi.q_synop", "Qmap computed from PFSS model using full CR synoptic maps" ], [ "hmi.rdmai_fd05", "Magnetic Activity Index series for 5-deg tiles" ], [ "hmi.rdmai_fd15", "Magnetic Activity Index series for 15-deg tiles" ], [ "hmi.rdmai_fd30", "Magnetic Activity Index series for 30-deg tiles" ], [ "hmi.rdvavgpspec_fd15", "Averages of power spectra of 15-deg cubes on ring-diagram synoptic grid over full CR" ], [ "hmi.rdvavgpspec_fd30", "Averages of power spectra of 30-deg cubes on ring-diagram synoptic grid over full CR" ], [ "hmi.rdvfitsc_fd05", "ring fits to power spectra of 5-deg HMI Doppler cubes on ring-diagram synoptic grid tracked 1/72 CR" ], [ "hmi.rdvfitsc_fd15", "ring fits to power spectra of 15-deg HMI Doppler cubes on ring-diagram synoptic grid tracked 1/24 CR" ], [ "hmi.rdvfitsc_fd30", "ring fits to power spectra of 30-deg HMI Doppler cubes on ring-diagram synoptic grid tracked 1/12 CR" ], [ "hmi.rdvfitsf_fd05", "ring fits to power spectra of 5-deg HMI Doppler cubes on ring-diagram synoptic grid tracked 1/72 CR" ], [ "hmi.rdvfitsf_fd15", "ring fits to power spectra of 15-deg HMI Doppler cubes on ring-diagram synoptic grid tracked 1/24 CR" ], [ "hmi.rdvfitsf_fd30", "ring fits to power spectra of 30-deg HMI Doppler cubes on ring-diagram synoptic grid tracked 1/12 CR" ], [ "hmi.rdvflows_fd15_frame", "flow inversions of fits to ring-diagram power spectra of 15-deg HMI Doppler cubes on ring-diagram synoptic grid tracked 1/24 CR" ], [ "hmi.rdvflows_fd30_frame", "flow inversions of fits to ring-diagram power spectra of 30-deg HMI Doppler cubes on ring-diagram synoptic grid tracked 1/12 CR" ], [ "hmi.rdvpspec_fd05", "Power spectra of 5-deg HMI Doppler cubes on ring-diagram synoptic grid tracked 1/72 CR" ], [ "hmi.rdvpspec_fd15", "Power spectra of 15-deg HMI Doppler cubes on ring-diagram synoptic grid tracked 1/24 CR" ], [ "hmi.rdvpspec_fd30", "Power spectra of 30-deg HMI Doppler cubes on ring-diagram synoptic grid tracked 1/12 CR" ], [ "hmi.rdvtrack_fd05", "5-deg Doppler cubes on ring-diagram synoptic grid tracked 1/72 CR" ], [ "hmi.rdvtrack_fd15", "15-deg Doppler cubes on ring-diagram synoptic grid tracked 1/24 CR" ], [ "hmi.rdvtrack_fd30", "30-deg Doppler cubes on ring-diagram synoptic grid tracked for 1/12 CR" ], [ "hmi.s_135s", "level 1p IQUV data averaged at a cadence of 135 seconds" ], [ "hmi.s_5760s", "level 1p IQUV data averaged at a cadence of 96 minutes" ], [ "hmi.s_720s", "level 1p IQUV data averaged at a cadence of 12 minutes" ], [ "hmi.s_720s_dcon", "level 1p IQUV data averaged at a cadence of 12 minutes, constructed with hmi.lev1_dcon" ], [ "hmi.s_720s_dcons", "level 1p IQUV data averaged at a cadence of 12 minutes, scattered light corrected" ], [ "hmi.s_90s", "level 1p IQUV data averaged at a cadence of 90 seconds" ], [ "hmi.sharp_720s", "Spaceweather HMI Active Region Patch (SHARP): CCD coordinates" ], [ "hmi.sharp_720s_nrt", "nrt Spaceweather HMI Active Region Patch (SHARP): CCD coordinates" ], [ "hmi.sharp_cea_720s", "Spaceweather HMI Active Region Patch (SHARP): CEA coordinates" ], [ "hmi.sharp_cea_720s_nrt", "nrt Spaceweather HMI Active Region Patch (SHARP): CEA coordinates" ], [ "hmi.synoptic_ml_720s", "HMI synoptic chart of line-of-sight magnetic field" ], [ "hmi.synoptic_ml_720s_nrt", "HMI NRT synoptic chart of line-of-sight magnetic field" ], [ "hmi.synoptic_ml_small_720s_nrt", "HMI NRT synoptic chart of line-of-sight magnetic field - small size map" ], [ "hmi.synoptic_mr_720s", "HMI synoptic chart of Mr field. Mr is converted from Mlos" ], [ "hmi.synoptic_mr_720s_nrt", "HMI NRT synoptic chart of Mr field. Mr is converted from Mlos" ], [ "hmi.synoptic_mr_polfil_720s", "HMI synoptic chart of radial (Mr) with polar field correction" ], [ "hmi.synoptic_mr_small_720s_nrt", "HMI NRT synoptic chart of Mr field - small size map" ], [ "hmi.td_fsi_12h", "Time-Distance Far Side delta time maps, 12hr cadence" ], [ "hmi.tdkernels", "time-distance inversion kernels" ], [ "hmi.tdpixlist", "Target pixel lists for time-distance calculations" ], [ "hmi.tdvinvrt_synophc", "velocity and sound-speed inferred from time-distance helioseismology" ], [ "hmi.tdvtimes_synophc", "time-distance helioseismology travel times" ], [ "hmi.tdvtrack_synophc", "Tracked mapped Doppler cubes at synoptic locations" ], [ "hmi.temperature_summary_300s", "Temperature Statistics from HMI Housekeeping - Thermal/PS voltage packet" ], [ "hmi.v_45s", "Dopplergrams with a cadence of 45 seconds" ], [ "hmi.v_45s_dcon", "Dopplergrams with a cadence of 45 seconds, constructed with hmi.lev1_dcon" ], [ "hmi.v_720s", "Dopplergrams with a cadence of 720 seconds" ], [ "hmi.v_720s_dcon", "Dopplergrams with a cadence of 720 seconds, constructed with hmi.lev1_dcon." ], [ "hmi.v_720s_dcons", "Dopplergrams with a cadence of 720 seconds, scattered light corrected." ], [ "hmi.v_avg120", "Temporal averages of HMI Vgrams over 1/3 CR" ], [ "hmi.v_sht_2drls", "2d rls inversions for rotation" ], [ "hmi.v_sht_2drls_asym", "2d rls inversions for rotation" ], [ "hmi.v_sht_72d", "raw spherical harmonic timeseries" ], [ "hmi.v_sht_gaps_72d", "window functions for raw timeseries" ], [ "hmi.v_sht_gf_72d", "detrended and gapfilled spherical harmonic timeseries" ], [ "hmi.v_sht_gf_gaps_72d", "window functions for gapfilled timeseries" ], [ "hmi.v_sht_gf_gaps_retile", "window functions for gapfilled timeseries" ], [ "hmi.v_sht_gf_retile", "retiled detrended and gapfilled spherical harmonic timeseries" ], [ "hmi.v_sht_modes", "mode parameters from jpkbgn" ], [ "hmi.v_sht_modes_archive", "full results from jpkbgn" ], [ "hmi.v_sht_modes_asym", "mode parameters from jpkbgn" ], [ "hmi.v_sht_modes_asym_archive", "full results from jpkbgn" ], [ "hmi.v_sht_pow", "power spectra computed after gapfilling" ], [ "hmi.v_sht_secs_72d", "sections of data, discontinuities in between" ], [ "hmi.vw_v_45s", "vw_V proxy (binned by a factor of 4, convolved with a gaussian with sigma=2.83, subsampled by a factor of 5)" ], [ "hmi.vw_v_sht_2drls", "2d rls inversions for rotation" ], [ "hmi.vw_v_sht_72d", "raw spherical harmonic timeseries" ], [ "hmi.vw_v_sht_gaps_72d", "window functions for raw timeseries" ], [ "hmi.vw_v_sht_gf_72d", "detrended and gapfilled spherical harmonic timeseries" ], [ "hmi.vw_v_sht_gf_gaps_72d", "window functions for gapfilled timeseries" ], [ "hmi.vw_v_sht_modes", "mode parameters from jpkbgn" ], [ "hmi.vw_v_sht_modes_archive", "full results from jpkbgn" ], [ "hmi.vw_v_sht_pow", "power spectra computed after gapfilling" ], [ "mdi.caltables_doppler", "MDI calibration tables for dopplergrams" ], [ "mdi.caltables_doppler_orig", "MDI calibration tables for [orig] dopplergrams" ], [ "mdi.caltables_intensity", "MDI calibration tables for intensitygrams" ], [ "mdi.detune", "MDI Calibration data" ], [ "mdi.eigenfunctions", "eigenfuctions for performing inversions" ], [ "mdi.fd_i0", "MDI Full Disk Continuum Filtergram" ], [ "mdi.fd_i0_extract", "MDI High Resolution Continuum Filtergram Extract" ], [ "mdi.fd_ic", "MDI Full Disk Intensity Continuum" ], [ "mdi.fd_ic_06h", "MDI Full Disk Intensity Continuum, 6-hour cadence" ], [ "mdi.fd_ic_interp", "MDI Full Disk 96m Interpolated Ic (flat)" ], [ "mdi.fd_ld", "MDI Full Disk Line Depth" ], [ "mdi.fd_m_96m_lev182", "MDI Full Disk 96m Magnetogram" ], [ "mdi.fd_m_extract", "MDI Extracts of Full Disk Magnetograms" ], [ "mdi.fd_m_lev182", "MDI Full Disk 01-m Magnetogram" ], [ "mdi.fd_marmask", "MDI Full Disk 96m Activity Mask" ], [ "mdi.fd_spotmask", "MDI Full Disk 96m Activity Mask" ], [ "mdi.fd_v", "MDI Full Disk Dopplergram" ], [ "mdi.fd_v_bin2x2", "MDI Full Disk 2x2 binned Dopplergram" ], [ "mdi.fd_v_extract", "Extracts of MDI Full Disk Dopplergram" ], [ "mdi.fd_v_sht", "raw spherical harmonic timeseries" ], [ "mdi.fd_v_sht_2drls", "2d rls inversions for rotation" ], [ "mdi.fd_v_sht_2drls_asym", "2d rls inversions for rotation" ], [ "mdi.fd_v_sht_gaps", "window functions for raw timeseries" ], [ "mdi.fd_v_sht_gf", "detrended and gapfilled spherical harmonic timeseries" ], [ "mdi.fd_v_sht_gf_gaps", "window functions for gapfilled timeseries" ], [ "mdi.fd_v_sht_modes", "mode parameters from jpkbgn" ], [ "mdi.fd_v_sht_modes_archive", "full results from jpkbgn" ], [ "mdi.fd_v_sht_modes_asym", "mode parameters from jpkbgn with asymmetric fits" ], [ "mdi.fd_v_sht_modes_asym_archive", "full results from jpkbgn with asymmetric fits" ], [ "mdi.fd_v_sht_pow", "power spectra computed after gapfilling" ], [ "mdi.fd_v_sht_secs", "sections of data, discontinuities in between" ], [ "mdi.fdv_avg120", "Temporal averages of MDI full-disc Vgrams over 1/3 CR" ], [ "mdi.focus", "MDI Calibration data: Focus sweeps" ], [ "mdi.hr_i0", "MDI High Resolution Continuum Filtergram" ], [ "mdi.hr_ic", "MDI High Resolution Intensity Continuum" ], [ "mdi.hr_ld", "MDI High Resolution Line Depth" ], [ "mdi.hr_ld_bin2x2", "MDI High Resolution Line Depth Binned 2x2" ], [ "mdi.hr_m", "MDI High Resolution Magnetogram" ], [ "mdi.hr_m_bin2x2", "MDI High Resolution Binned Magnetogram" ], [ "mdi.hr_v", "MDI High Resolution Dopplergram" ], [ "mdi.hr_v_12s", "MDI High Resolution High Cadence Dopplergram" ], [ "mdi.hr_v_bin2x2", "MDI High Resolution 2x2 binned Dopplergram" ], [ "mdi.ice", "MDI Calibration data: CCD quality" ], [ "mdi.leakage", "leakage matrices" ], [ "mdi.limb_figure", "MDI limb figure" ], [ "mdi.lostarp_96m", "TARP for MDI data" ], [ "mdi.meanpf_96m", "Mean polar field and AR field with a cadence of 96 minutes." ], [ "mdi.mtarp", "TARP = MDI Tracked Active Region Patch" ], [ "mdi.pfss_synop", "PFSS cubes from full CR synoptic maps for Q-map computation, higher resolution Br computed at radius of Q-maps, and smoothed Br used as input" ], [ "mdi.polar_db", "MDI polar field database" ], [ "mdi.q_synop", "Qmap computed from PFSS model using full CR synoptic maps" ], [ "mdi.rdvfitsc_dp", "ring fits to power spectra of 16-deg Doppler cubes at MDI fd-res tracked at Snodgrass rate for 1664 min" ], [ "mdi.rdvfitsf_dp", "ring fits to power spectra of 16-deg Doppler cubes at MDI fd-res tracked at Snodgrass rates for 1664 min" ], [ "mdi.rdvflows_dp", "flow inversions of fits to ring diagram power spectra of 16-deg Doppler cubes at MDI fd-res on MDI densepack grid tracked at Snodgrass rate for 1/24 CR" ], [ "mdi.rdvpspec_dp", "Power spectra of 16-deg Doppler cubes at MDI fd-res tracked at Snodgrass rates for 1664 min" ], [ "mdi.rdvtrack_dp", "16-deg Doppler cubes on dense-pack grid at MDI fd-res tracked for 1664 min at the Snodgrass rate" ], [ "mdi.roll_table", "MDI Roll Table" ], [ "mdi.rwbin_ic", "MDI Binned 8x8 Full Disk Intensity Continuum" ], [ "mdi.rwbin_ld", "MDI Binned 8x8 Full Disk Line Depth" ], [ "mdi.scale_corrections", "MDI Scale Corrections Table" ], [ "mdi.sinrho_table", "MDI sinrho fits file" ], [ "mdi.smarp_96m", "Spaceweather MDI Active Region Patch (SMARP) in CCD coordinates" ], [ "mdi.smarp_cea_96m", "Spaceweather MDI Active Region Patch (SMARP) in CEA coordinates" ], [ "mdi.synoptic_ml_96m", "MDI synoptic chart of Mlos field." ], [ "mdi.synoptic_ml_small_96m", "Small-size MDI synoptic chart of Mlos field." ], [ "mdi.synoptic_mr_96m", "MDI synoptic chart of Mr field. Mr is converted from Mlos" ], [ "mdi.synoptic_mr_polfil_96m", "MDI synoptic chart of radial (Br) with polar field correction" ], [ "mdi.synoptic_mr_small_96m", "Small size MDI synoptic chart of Mr field. Mr is converted from Mlos." ], [ "mdi.vw_v", "MDI Vector-Weighted Dopplergram" ], [ "mdi.vw_v_sht_2drls", "2d rls inversions for rotation" ], [ "mdi.vw_v_sht_2drls_asym", "2d rls inversions for rotation" ], [ "mdi.vw_v_sht_72d", "raw spherical harmonic timeseries" ], [ "mdi.vw_v_sht_gaps_72d", "window functions for raw timeseries" ], [ "mdi.vw_v_sht_gf_72d", "detrended and gapfilled spherical harmonic timeseries" ], [ "mdi.vw_v_sht_gf_gaps_72d", "window functions for gapfilled timeseries" ], [ "mdi.vw_v_sht_gf_gaps_retile", "window functions for gapfilled timeseries concatenated from mdi.vw_V_sht_gf_gaps_72d" ], [ "mdi.vw_v_sht_gf_retile", "detrended and gapfilled spherical harmonic timeseries retiled from mdi.vw_V_sht_gf_72d" ], [ "mdi.vw_v_sht_modes", "mode parameters from jpkbgn" ], [ "mdi.vw_v_sht_modes_archive", "full results from jpkbgn" ], [ "mdi.vw_v_sht_modes_asym", "mode parameters from jpkbgn with asymmetric fits" ], [ "mdi.vw_v_sht_modes_asym_archive", "full results from jpkbgn with asymmetric fits" ], [ "mdi.vw_v_sht_pow", "power spectra computed after gapfilling" ], [ "mdi.vw_v_sht_secs_72d", "sections of data, discontinuities in between" ] ], "segments": [ [ "BAD_PIXEL", "AIA permanently bad pixel list" ], [ "BAD_PIXEL", "bad pixel array" ], [ "B_error", "Error of B Strength" ], [ "Bp", "0.0" ], [ "Bp", "B_phi, positive westward" ], [ "Bp", "PFSS cube for B_phi" ], [ "Bp", "Remapped Bp component" ], [ "Bp_err", "Standard deviation of B_phi" ], [ "Br", "0.0" ], [ "Br", "B_r, positive up" ], [ "Br", "PFSS cube for B_r" ], [ "Br", "Remapped Br component" ], [ "Br0", "Input smoothed Br map at photosphere" ], [ "Br_err", "Standard deviation of B_r" ], [ "Br_polfil", "Br synoptic map with polar field correction" ], [ "Brq", "PFSS cube at Q-map heights for B_r" ], [ "Bt", "0.0" ], [ "Bt", "B_theta, positive southward" ], [ "Bt", "PFSS cube for B_theta" ], [ "Bt", "Remapped Bt component" ], [ "Bt_err", "Standard deviation of B_theta" ], [ "DARK", "AIA dark frame image" ], [ "DARK", "bias /dark" ], [ "Dopplergram", "Dopplergram" ], [ "Dopplergram", "Dopplergram in CEA projection" ], [ "GB", "Gizon-Birch travel times" ], [ "I0", "level 1p data; Stokes I @ WL 0" ], [ "I1", "level 1p data; Stokes I @ WL 1" ], [ "I2", "level 1p data; Stokes I @ WL 2" ], [ "I3", "level 1p data; Stokes I @ WL 3" ], [ "I4", "level 1p data; Stokes I @ WL 4" ], [ "I5", "level 1p data; Stokes I @ WL 5" ], [ "Log", "Tracking log" ], [ "Log", "run log" ], [ "Mr_polfil", "Mr synoptic map with polar field correction" ], [ "N", "0.0" ], [ "OFFPOINT_FLAT", "offpoint flatfield" ], [ "Q0", "level 1p data; Stokes Q @ WL 0" ], [ "Q1", "level 1p data; Stokes Q @ WL 1" ], [ "Q2", "level 1p data; Stokes Q @ WL 2" ], [ "Q3", "level 1p data; Stokes Q @ WL 3" ], [ "Q4", "level 1p data; Stokes Q @ WL 4" ], [ "Q5", "level 1p data; Stokes Q @ WL 5" ], [ "T", "0.0" ], [ "U0", "level 1p data; Stokes U @ WL 0" ], [ "U1", "level 1p data; Stokes U @ WL 1" ], [ "U2", "level 1p data; Stokes U @ WL 2" ], [ "U3", "level 1p data; Stokes U @ WL 3" ], [ "U4", "level 1p data; Stokes U @ WL 4" ], [ "U5", "level 1p data; Stokes U @ WL 5" ], [ "Ux", "Zonal velocity inversions" ], [ "Uy", "Meridional velocity inversions" ], [ "V", "Binned HMI Dopplergram" ], [ "V", "Tracked Data Cube" ], [ "V", "Tracked data cube" ], [ "V0", "level 1p data; Stokes V @ WL 0" ], [ "V1", "level 1p data; Stokes V @ WL 1" ], [ "V2", "level 1p data; Stokes V @ WL 2" ], [ "V3", "level 1p data; Stokes V @ WL 3" ], [ "V4", "level 1p data; Stokes V @ WL 4" ], [ "V5", "level 1p data; Stokes V @ WL 5" ], [ "Vp", "0.0" ], [ "Vr", "0.0" ], [ "Vt", "0.0" ], [ "alpha_err", " Alpha_Err" ], [ "alpha_err", "std of Alpha_Err" ], [ "alpha_mag", "Filling Factor with Field" ], [ "archive", "tar file containing the full results from all iterations" ], [ "azimuth", "Azimuth" ], [ "azimuth", "Azimuth before disambiguation" ], [ "azimuth", "Azimuth, 0 to 360, 0 up in image, increasing CCW" ], [ "azimuth_alpha_err", "Azimuth_Alpha_Err" ], [ "azimuth_alpha_err", "cor.coef of Azimuth_Alpha_Err" ], [ "azimuth_err", "Azimuth_Err" ], [ "azimuth_err", "Standard deviation of azimuth" ], [ "azimuth_err", "std of Azimuth_Err" ], [ "bad_pixel", "bad pixel list" ], [ "bad_pixel_list", "HMI permanently bad pixel list" ], [ "bitmap", "Bitmap for the patch" ], [ "bitmap", "Mask for the patch" ], [ "bitmap", "Mask for the patch in CCD coordinates" ], [ "bitmap", "Mask for the patch in CEA coordinates" ], [ "chisq", "Chi square" ], [ "chisq", "Chisq" ], [ "chmap", "Coronal hole map at lowest layer" ], [ "conf_disambig", "Confidence index for disambiguation result" ], [ "conf_disambig", "Confidence of disambiguation result" ], [ "conf_disambig", "confidence of disambiguation result" ], [ "confid_map", "Confidence index" ], [ "confid_map", "Updated confidence index" ], [ "confid_map", "confidence index" ], [ "confid_map", "updated confidence index" ], [ "continuum", "Intensitygram in CEA projection" ], [ "continuum", "MDI Intensitygram" ], [ "continuum", "MDI Intensitygram in CCD projection" ], [ "continuum", "MDI Intensitygram in CEA projection" ], [ "continuum", "Original continuum intensity" ], [ "continuum", "Original intensity" ], [ "continuum", "continuum intensity" ], [ "continuum1", "Continuum intensity (prior)" ], [ "continuum2", "Continuum intensity (later)" ], [ "conv_flag", "Convergence flag and index" ], [ "conv_flag", "convergence flag and index" ], [ "conv_flag", "flag and index of ME-inversion convergence process" ], [ "cs", "0.0" ], [ "cs", "sound speed" ], [ "damping", "Damping" ], [ "data", "0" ], [ "data", "0.0" ], [ "data", "0.000000" ], [ "data", "Camera value" ], [ "data", "Extracts of Full Disk MDI Dopplergram " ], [ "data", "MDI Binned 8x8 Full Disk Intensity Continuum" ], [ "data", "MDI Binned 8x8 Full Disk Line Depth" ], [ "data", "MDI Dopplergram" ], [ "data", "MDI Extracts of Full Disk Magnetograms" ], [ "data", "MDI Full Disk 2x2 binned Dopplergram" ], [ "data", "MDI Full Disk Continuum Filtergram" ], [ "data", "MDI Full Disk Intensity Continuum" ], [ "data", "MDI Full Disk Line Depth" ], [ "data", "MDI High Resolution 2x2 binned Dopplergram" ], [ "data", "MDI High Resolution Binned Magnetogram" ], [ "data", "MDI High Resolution Continuum Filtergram" ], [ "data", "MDI High Resolution Continuum Filtergram Extract" ], [ "data", "MDI High Resolution Dopplergram" ], [ "data", "MDI High Resolution High Cadence Dopplergram" ], [ "data", "MDI High Resolution Intensity Continuum" ], [ "data", "MDI High Resolution Line Depth" ], [ "data", "MDI High Resolution Line Depth Binned 2x2" ], [ "data", "MDI High Resolution Magnetogram" ], [ "data", "MDI Magnetogram" ], [ "data", "MDI Roll Table" ], [ "data", "MDI Scale Corrections Table" ], [ "data", "MDI limb figure" ], [ "data", "MDI sinrho fits file" ], [ "data", "Remapped Mr converted from Mlos" ], [ "data", "Smoothed synoptic map of polar region" ], [ "data", "Time-Distance travel time residual" ], [ "data", "spherical harmonic timeseries" ], [ "data0", "MDI calibration tables for [orig] dopplergrams" ], [ "data0", "MDI calibration tables for dopplergrams" ], [ "data0", "MDI calibration tables for intensitygrams" ], [ "data1", "MDI calibration tables for [orig] dopplergrams" ], [ "data1", "MDI calibration tables for dopplergrams" ], [ "data1", "MDI calibration tables for intensitygrams" ], [ "data2", "MDI calibration tables for [orig] dopplergrams" ], [ "data2", "MDI calibration tables for dopplergrams" ], [ "data2", "MDI calibration tables for intensitygrams" ], [ "data3", "MDI calibration tables for [orig] dopplergrams" ], [ "data3", "MDI calibration tables for dopplergrams" ], [ "data3", "MDI calibration tables for intensitygrams" ], [ "data4", "MDI calibration tables for [orig] dopplergrams" ], [ "data4", "MDI calibration tables for dopplergrams" ], [ "data4", "MDI calibration tables for intensitygrams" ], [ "data5", "MDI calibration tables for [orig] dopplergrams" ], [ "data5", "MDI calibration tables for dopplergrams" ], [ "data5", "MDI calibration tables for intensitygrams" ], [ "data_raw", "Original synoptic map of polar region" ], [ "dir", "directory containing 4 fits files: leakhi1.fits leakhr1.fits leakri1.fits leakrr1.fits" ], [ "disambig", "Flag for 180 degree change in azimuth" ], [ "dop_width", "Doppler Width" ], [ "dopplergram", "vector-weighted dopplergram" ], [ "efunc", " " ], [ "epts", "0.0" ], [ "err", "errors" ], [ "eta_0", "Eta_0" ], [ "field", "Field Strength" ], [ "field", "Total field strength" ], [ "field_alpha_err", "Field_Alpha_Err" ], [ "field_alpha_err", "cor.coef of Field_Alpha_Err" ], [ "field_az_err", "Correlation coefficient between field and azimuth" ], [ "field_az_err", "Field_azimuth_Err" ], [ "field_az_err", "cor.coef of Field_azimuth_Err" ], [ "field_err", "Field_Err" ], [ "field_err", "Standard deviation of total field strength" ], [ "field_err", "std of Field_Err" ], [ "field_inclination_err", "Correlation coefficient between field and inclination" ], [ "field_inclination_err", "Field_Inclination_Err" ], [ "field_inclination_err", "cor.coef of Field_Inclination_Err" ], [ "fit.out", "fit parameters" ], [ "flatfield", "0.000000" ], [ "flatfield", "AIA flatfield correction image" ], [ "gabor", "Gabor wavelet travel times" ], [ "gaps", "zero for bad data, nonzero for good" ], [ "gh", "Coefficients for spherical harmonics, see http://wso.stanford.edu/words/pfss.pdf" ], [ "image", "AIA level 1 image" ], [ "image", "Stereographic view of smoothed polar data" ], [ "image_lev1", "lev1 image fits file" ], [ "image_raw", "Stereographic view of original polar data" ], [ "inclin_azimuth_err", "Correlation coefficient between inclination and azimuth" ], [ "inclin_azimuth_err", "Inclination_Azimuth_Err" ], [ "inclin_azimuth_err", "cor.coef of Inclination_Azimuth_Err" ], [ "inclination", "Inclination" ], [ "inclination", "Inclination angle, 0 to 180, 0 out from plane of sky" ], [ "inclination_alpha_err", "Inclination_Alpha_Err" ], [ "inclination_alpha_err", "cor.coef of Inclination_Alpha_Err" ], [ "inclination_err", "Inclination_Err" ], [ "inclination_err", "Standard deviation of inclination" ], [ "inclination_err", "std of Inclination_Err" ], [ "info_map", "Quality map" ], [ "info_map", "Updated quality map" ], [ "info_map", "updated quality map" ], [ "kernel", "inversion kernel file" ], [ "lat", "Carrington latitude" ], [ "linedepth", "linedepth" ], [ "linewidth", "linewidth" ], [ "log", "standard output" ], [ "logP", "Mean power spectral density" ], [ "logP", "Power spectral density" ], [ "lon", "Carrington longitude" ], [ "lookup", "0" ], [ "m18", "18 a-coeffient fits" ], [ "m36", "36 a-coeffient fits" ], [ "m6", "6 a-coeffient fits" ], [ "magnetogram", "Line-of-sight magnetogram in CCD projection" ], [ "magnetogram", "Line-of-sight magnetogram in CEA projection" ], [ "magnetogram", "Original magnetogram" ], [ "magnetogram", "Reference magnetogram" ], [ "magnetogram", "magnetogram" ], [ "mask", "Activity mask" ], [ "mask", "Full disk AR mask" ], [ "mask", "Full disk magnetic activity mask" ], [ "mask", "MDI Activity Mask" ], [ "mean", "Continuum intensity mean" ], [ "mean", "Doppler mean" ], [ "mesh", "radial grid points" ], [ "mf_bl", "Mean Bl in 1 deg latitude bins, numerical average" ], [ "mf_br", "Mean Br in 1 deg latitude bins, weighted average (1/mu)" ], [ "num", "Total pixel number in 1 deg latitude bins" ], [ "offpoint_flatfield", "0" ], [ "parms", "input parameters" ], [ "phase", "0" ], [ "power", "Continuum intensity power" ], [ "power", "Doppler power" ], [ "pxloc.ascii", "point-to-point pixel pairs (ASCII)" ], [ "pxloc.binary", "point-to-point pixel pairs (binary)" ], [ "pxloc.fortran", "point-to-point pixel pairs (FORTRAN unformatted)" ], [ "qual_map", "quality map" ], [ "rot", "rotation profile" ], [ "slogQ", "Signed log of Q at different heights" ], [ "spikes", "Cosmic ray information" ], [ "spikes", "spiked pixel list" ], [ "split", "calculated splittings" ], [ "spot", "Full disk sunspot mask" ], [ "src_continuum", "Continuum" ], [ "src_grad", "Gradient" ], [ "synopMl", "0.0" ], [ "synopMr", "0.0" ], [ "targets", "target locations" ], [ "times", "sub-annulus travel times" ], [ "valid", "valid pixel count" ], [ "vlos_err", "VLos_Err" ], [ "vlos_err", "std of VLos_Err" ], [ "vlos_mag", "LOS Velocity with Field" ], [ "vx", "0.0" ], [ "vx", "zonal velocity component" ], [ "vy", "0.0" ], [ "vy", "meridional velocity component" ], [ "vz", "0.0" ], [ "vz", "radial velocity component" ], [ "w", "Total of 1/mu in 1 deg latitude bins" ] ] } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/jsoc/jsoc.py0000644000175100001710000011214400000000000016141 0ustar00vstsdockerimport os import copy import json import time import urllib from pathlib import Path import drms import numpy as np import astropy.table import astropy.time import astropy.units as u from astropy.utils.misc import isiterable from sunpy import config, log from sunpy.net.attr import and_ from sunpy.net.base_client import BaseClient, QueryResponseTable, convert_row_to_table from sunpy.net.jsoc.attrs import walker from sunpy.util.exceptions import warn_user from sunpy.util.parfive_helpers import Downloader, Results __all__ = ['JSOCClient', 'JSOCResponse'] PRIMEKEY_LIST_TIME = {'T_START', 'T_REC', 'T_OBS', 'MidTime', 'OBS_DATE', 'obsdate', 'DATE_OBS', 'starttime', 'stoptime', 'UTC_StartTime'} class NotExportedError(Exception): pass class JSOCResponse(QueryResponseTable): query_args = astropy.table.TableAttribute() requests = astropy.table.TableAttribute() display_keys = ['T_REC', 'TELESCOP', 'INSTRUME', 'WAVELNTH', 'CAR_ROT'] # This variable is used to detect if the result has been sliced before it is passed # to fetch and issue a warning to the user about not being able to post-filter JSOC searches. _original_num_rows = astropy.table.TableAttribute(default=None) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._original_num_rows = len(self) class JSOCClient(BaseClient): """ Provides access 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 `fetch()` method, but they can be separated if you are performing a large or complex query. .. warning:: JSOC requires you to register your email address before requesting data. `See this on how to register `__. Notes ----- The full list of ``Series`` is available through this `site `_. JSOC 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 beforehand `here `_. The backend of SunPy's JSOC Client uses `drms package `_. The tutorials can be `found here `_. This can be used to build complex queries, by directly inputting the query string. 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() >>> response = client.search(a.Time('2014-01-01T00:00:00', '2014-01-01T00:10: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: +REMOTE_DATA T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT ----------------------- -------- ---------- -------- ------- 2014.01.01_00:00:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:01:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:02:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:03:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:03:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:04:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:05:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:06:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:06:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:07:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:08:15_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:09:00_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:09:45_TAI SDO/HMI HMI_FRONT2 6173.0 2145 2014.01.01_00:10:30_TAI SDO/HMI HMI_FRONT2 6173.0 2145 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. Note ---- A registered email address is not required if you only need to query for data, it is used only if you need to make an export request. For example,:: >>> client = jsoc.JSOCClient() # doctest: +REMOTE_DATA >>> response = client.search(a.Time('2014-01-01T00:00:00', '2014-01-01T00:10:00'), ... a.jsoc.Series('hmi.m_45s')) # doctest: +REMOTE_DATA The above is a successful query operation, and will return query responses as before. But, this response object cannot be used to make an export request and will throw an error if done so:: >>> res = client.fetch(response) # doctest: +SKIP ValueError: Email address is invalid or not registered *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.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 T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT -------------------- -------- -------- -------- ------- 2014-01-01T00:00:01Z SDO/AIA AIA_3 171 2145 2014-01-01T00:00:13Z SDO/AIA AIA_3 171 2145 2014-01-01T00:00:25Z SDO/AIA AIA_3 171 2145 2014-01-01T00:00:37Z SDO/AIA AIA_3 171 2145 You can then make the request:: >>> requests = client.request_data(response) # doctest: +SKIP This returns a list of all the ExportRequest objects for your query. You can get the ExportRequest ID :: >>> requests.id # doctest: +SKIP 'JSOC_20171205_372' You can also 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:: >>> requests.status # doctest: +SKIP 0 Once the status code is 0 you can download the data using the `get_request` method:: >>> res = client.get_request(requests) # doctest: +SKIP This returns a Results instance which can be used to watch the progress of the download:: >>> res.wait(progress=True) # doctest: +SKIP """ # Default number of max connections that the Downloader opens default_max_conn = 1 @property def info_url(self): return 'http://jsoc.stanford.edu' def search(self, *query, **kwargs): """ Build a JSOC query and submit it to JSOC for processing. Takes a variable number of `~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. Parameters ---------- *query : a variable number of `~sunpy.net.jsoc.attrs` as parameters, which are chained together using the ``AND`` (``&``) operator. Returns ------- response : `~sunpy.net.jsoc.jsoc.JSOCResponse` object A collection of records that the query returns. Examples -------- *Example 1* Request all AIA 304 image data between 2014-01-01T00:00 and 2014-01-01T01:00:: >>> 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('2017-09-06T12:00:00', '2017-09-06T12:02:00'), ... a.jsoc.Series('aia.lev1_euv_12s'), a.Wavelength(304*u.AA), ... a.jsoc.Segment('image')) # doctest: +REMOTE_DATA >>> print(response) # doctest: +REMOTE_DATA T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT -------------------- -------- -------- -------- ------- 2017-09-06T11:59:59Z SDO/AIA AIA_4 304 2194 2017-09-06T12:00:11Z SDO/AIA AIA_4 304 2194 2017-09-06T12:00:23Z SDO/AIA AIA_4 304 2194 2017-09-06T12:00:35Z SDO/AIA AIA_4 304 2194 2017-09-06T12:00:47Z SDO/AIA AIA_4 304 2194 2017-09-06T12:00:59Z SDO/AIA AIA_4 304 2194 2017-09-06T12:01:11Z SDO/AIA AIA_4 304 2194 2017-09-06T12:01:23Z SDO/AIA AIA_4 304 2194 2017-09-06T12:01:35Z SDO/AIA AIA_4 304 2194 2017-09-06T12:01:47Z SDO/AIA AIA_4 304 2194 2017-09-06T12:01:59Z SDO/AIA AIA_4 304 2194 *Example 2* Request keyword data of ``hmi.v_45s`` and show specific columns only:: >>> 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-01-01T00:00:00', '2014-01-01T00:10:00'), ... a.jsoc.Series('hmi.v_45s')) # doctest: +REMOTE_DATA >>> print(response.show('T_REC', 'WAVELNTH', 'CAR_ROT')) # doctest: +REMOTE_DATA T_REC WAVELNTH CAR_ROT ----------------------- -------- ------- 2014.01.01_00:00:45_TAI 6173.0 2145 2014.01.01_00:01:30_TAI 6173.0 2145 2014.01.01_00:02:15_TAI 6173.0 2145 2014.01.01_00:03:00_TAI 6173.0 2145 2014.01.01_00:03:45_TAI 6173.0 2145 2014.01.01_00:04:30_TAI 6173.0 2145 2014.01.01_00:05:15_TAI 6173.0 2145 2014.01.01_00:06:00_TAI 6173.0 2145 2014.01.01_00:06:45_TAI 6173.0 2145 2014.01.01_00:07:30_TAI 6173.0 2145 2014.01.01_00:08:15_TAI 6173.0 2145 2014.01.01_00:09:00_TAI 6173.0 2145 2014.01.01_00:09:45_TAI 6173.0 2145 2014.01.01_00:10:30_TAI 6173.0 2145 *Example 3* Request data of ``aia.lev1_euv_12s`` on the basis of PrimeKeys other than ``T_REC``:: >>> 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-01-01T00:00:00', '2014-01-01T00:01:00'), ... a.jsoc.Series('aia.lev1_euv_12s'), ... a.jsoc.PrimeKey('WAVELNTH','171')) # doctest: +REMOTE_DATA >>> print(response) # doctest: +REMOTE_DATA T_REC TELESCOP INSTRUME WAVELNTH CAR_ROT -------------------- -------- -------- -------- ------- 2014-01-01T00:00:01Z SDO/AIA AIA_3 171 2145 2014-01-01T00:00:13Z SDO/AIA AIA_3 171 2145 2014-01-01T00:00:25Z SDO/AIA AIA_3 171 2145 2014-01-01T00:00:37Z SDO/AIA AIA_3 171 2145 2014-01-01T00:00:49Z SDO/AIA AIA_3 171 2145 2014-01-01T00:01:01Z SDO/AIA AIA_3 171 2145 """ return_results = JSOCResponse(client=self) query = and_(*query) blocks = [] for block in walker.create(query): iargs = kwargs.copy() iargs.update(block) # Update blocks with deep copy of iargs because in _make_recordset we use .pop() on element from iargs blocks.append(copy.deepcopy(iargs)) return_results = astropy.table.vstack([return_results, self._lookup_records(iargs)]) return_results.query_args = blocks return_results._original_num_rows = len(return_results) return return_results def request_data(self, jsoc_response, method='url', **kwargs): """ Request that JSOC stages the data for download. This method will not wait for the request to be staged. Parameters ---------- jsoc_response : `~sunpy.net.jsoc.jsoc.JSOCResponse` object The results of a query method : {``"url"``, ``"url-tar"``, ``"url-quick"``} Method for requesting JSOC data, can be 'url-tar', 'url' (the default) and 'url-quick' If 'url-tar' it will request JSOC to provide single .tar file which contains all data If 'url' it will request JSOC to provide all data as separate .fits files If 'url-quick' (only with protocol 'as-is') provide all data as separate files, but only if data is online. Returns ------- requests : `~drms.client.ExportRequest` object or a list of `~drms.client.ExportRequest` objects Request Id can be accessed by requests.id Request status can be accessed by requests.status """ requests = [] self.query_args = jsoc_response.query_args supported_protocols = {'fits', 'as-is'} supported_methods = {'url-tar', 'url', 'url-quick'} for block in jsoc_response.query_args: ds = self._make_recordset(**block) cd = drms.Client(email=block.get('notify', '')) protocol = block.get('protocol', 'fits') cutout = block.get('cutout') if protocol not in supported_protocols: error_message = f"Protocols other than {','.join(supported_protocols)} "\ "are not supported." raise TypeError(error_message) if method not in supported_methods: error_message = f"Methods other than {','.join(supported_methods)} "\ "are not supported." raise TypeError(error_message) process = {'im_patch': cutout} if cutout is not None else None if method != 'url-tar': method = 'url' if protocol == 'fits' else 'url_quick' r = cd.export(ds, method=method, protocol=protocol, process=process) requests.append(r) if len(requests) == 1: return requests[0] return requests @convert_row_to_table def fetch(self, jsoc_response, path=None, progress=True, overwrite=False, downloader=None, wait=True, sleep=10, max_conn=default_max_conn, **kwargs): """ Make the request for the data in a JSOC response and wait for it to be staged and then download the data. .. note:: **Only complete searches can be downloaded from JSOC**, this means that no slicing operations performed on the results object will affect the number of files downloaded. Parameters ---------- jsoc_response : `~sunpy.net.jsoc.jsoc.JSOCResponse` object A response object path : `str` Path to save data to, defaults to SunPy download dir progress : `bool`, optional If `True` show a progress bar showing how many of the total files have been downloaded. If `False`, no progress bar will be shown. overwrite : `bool` or `str`, optional Determine how to handle downloading if a file already exists with the same name. If `False` the file download will be skipped and the path returned to the existing file, if `True` the file will be downloaded and the existing file will be overwritten, if ``'unique'`` the filename will be modified to be unique. max_conn : `int` Maximum number of download connections. downloader : `parfive.Downloader`, optional The download manager to use. wait : `bool`, optional If `False` ``downloader.download()`` will not be called. Only has any effect if ``downloader`` is not `None`. sleep : `int` The number of seconds to wait between calls to JSOC to check the status of the request. Returns ------- results : a `parfive.Results` instance A `parfive.Results` object. """ for resp in jsoc_response.query_args: if 'notify' not in resp: raise ValueError('A registered email is required to get data from JSOC. ' 'Please supply an email with attrs.jsoc.Notify to Fido.search. ' 'Then pass those new results back into Fido.fetch') if len(jsoc_response) != jsoc_response._original_num_rows: warn_user("Downloading of sliced JSOC results is not supported. " "All the files present in the original response will " "be downloaded when passed to fetch().") # Make staging request to JSOC responses = self.request_data(jsoc_response) defaults = {'max_splits': 1} defaults.update(kwargs) # Make response iterable if not isiterable(responses): responses = [responses] # Add them to the response for good measure jsoc_response.requests = [r for r in responses] time.sleep(sleep/2.) for response in responses: response.wait(verbose=progress) return self.get_request(responses, path=path, overwrite=overwrite, progress=progress, downloader=downloader, wait=wait, max_conn=max_conn, **defaults) def get_request(self, requests, path=None, overwrite=False, progress=True, downloader=None, wait=True, max_conn=default_max_conn, **kwargs): """ Query JSOC to see if the request(s) is ready for download. If the request is ready for download, it will then download it. Parameters ---------- requests : `~drms.client.ExportRequest`, `str`, `list` `~drms.client.ExportRequest` objects or `str` request IDs or lists returned by `~sunpy.net.jsoc.jsoc.JSOCClient.request_data`. path : `str` Path to save data to, defaults to SunPy download dir. progress : `bool`, optional If `True` show a progress bar showing how many of the total files have been downloaded. If `False`, no progress bar will be shown. overwrite : `bool` or `str`, optional Determine how to handle downloading if a file already exists with the same name. If `False` the file download will be skipped and the path returned to the existing file, if `True` the file will be downloaded and the existing file will be overwritten, if ``'unique'`` the filename will be modified to be unique. downloader : `parfive.Downloader`, optional The download manager to use. wait : `bool`, optional If `False` ``downloader.download()`` will not be called. Only has any effect if ``downloader`` is not `None`. Returns ------- res: `parfive.Results` A `parfive.Results` instance or `None` if no URLs to download """ c = drms.Client() # Private communication from JSOC say we should not use more than one connection. if kwargs.get('max_splits'): log.info(f"max_splits keyword was passed and set to 1.") kwargs['max_splits'] = 1 # Convert Responses to a list if not already if isinstance(requests, str) or not isiterable(requests): requests = [requests] # Ensure all the requests are drms ExportRequest objects for i, request in enumerate(requests): if isinstance(request, str): r = c.export_from_id(request) requests[i] = r # We only download if all are finished if not all([r.has_succeeded() for r in requests]): raise NotExportedError("Can not download as not all the requests " "have been exported for download yet.") # Ensure path has a {file} in it if path is None: default_dir = config.get("downloads", "download_dir") path = os.path.join(default_dir, '{file}') elif isinstance(path, Path): path = str(path) if isinstance(path, str) and '{file}' not in path: path = os.path.join(path, '{file}') paths = [] for request in requests: if request.method == 'url-tar': fname = path.format(file=Path(request.tarfile).name) paths.append(os.path.expanduser(fname)) else: for filename in request.data['filename']: # Ensure we don't duplicate the file extension ext = os.path.splitext(filename)[1] if path.endswith(ext): fname = path.strip(ext) else: fname = path fname = fname.format(file=filename) fname = os.path.expanduser(fname) paths.append(fname) dl_set = True if not downloader: dl_set = False # Private communication from JSOC say we should not use more than one connection. if max_conn != self.default_max_conn: log.info(f"Setting max parallel downloads to 1 for the JSOC client.") downloader = Downloader(progress=progress, overwrite=overwrite, max_conn=1) urls = [] for request in requests: if request.status == 0: if request.protocol == 'as-is' or request.method == 'url-tar': urls.extend(list(request.urls.url)) else: for index, data in request.data.iterrows(): url_dir = request.request_url + '/' urls.append(urllib.parse.urljoin(url_dir, data['filename'])) if urls: if progress: print_message = "{0} URLs found for download. Full request totalling {1}MB" print(print_message.format(len(urls), request._d['size'])) for aurl, fname in zip(urls, paths): downloader.enqueue_file(aurl, filename=fname, **kwargs) if dl_set and not wait: return Results() results = downloader.download() return results def _make_recordset(self, series, start_time='', end_time='', wavelength='', segment='', primekey={}, keyword={}, **kwargs): """ Take the query arguments and build a record string. All the primekeys are now stored in primekey dict, including Time and Wavelength which were passed through pre-defined attributes. The following piece of code, extracts the passed prime-keys and arranges it in the order as it appears in the JSOC database. `primekeys_istime` is a Pandas DataFrame, whose index values are the Prime-key names and the column stores a boolean value, identifying whether the prime-key is a Time-type prime-key or not. Since, time-type prime-keys exist by different names, we made it uniform in the above piece of code, by storing the time-type primekey with a single name `TIME`. Considering an example, if the primekeys that exist for a given series are ['HARPNUM', 'T_OBS', 'WAVELNTH'], we will consider three different cases of the passed primekeys. primekeys_istime.index.values = ['HARPNUM', 'T_OBS', 'WAVELNTH'] Case 1: primekey = {'T_OBS' : , '2014.01.01_00:00:45_TAI', 'HARPNUM' : '4864', 'WAVELNTH': '605'} If the primekey dict is as above, then pkstr should be as: pkstr = '{4864}{2014.01.01_00:00:45_TAI}{605}' Case 2: primekey = {'T_OBS' : , '2014.01.01_00:00:45_TAI', 'WAVELNTH': '605'} If the primekey dict is as above, then pkstr should be as: pkstr = '{}{2014.01.01_00:00:45_TAI}{605}' Case 3: primekey = {'T_OBS' : , '2014.01.01_00:00:45_TAI'} If the primekey dict is as above, then pkstr should be as: pkstr = '{}{2014.01.01_00:00:45_TAI}' The idea behind this should be clear. We build up the `pkstr` string containing the values of the prime-keys passed in the same order as it occurs in the list `primekeys_istime.index.values`, i.e. how it is stored in the online database. Any missing prime-keys should be compensated by an empty {}, if it occurs before any passed prime-key. Any empty curly braces that is present at last of the pkstr, can be skipped. """ # Extract and format segment # Convert list of segments into a comma-separated string if segment: if isinstance(segment, list): segment = str(segment)[1:-1].replace(' ', '').replace("'", '') segment = f'{{{segment}}}' # Extract and format sample sample = kwargs.get('sample', '') if sample: sample = f'@{sample}s' # Populate primekeys dict with Time and Wavelength values if start_time and end_time: # Check whether any primekey listed in PRIMEKEY_LIST_TIME has been passed through # PrimeKey() attribute. If yes, raise an error, since Time can only be passed # either through PrimeKey() attribute or Time() attribute. if not any(x in PRIMEKEY_LIST_TIME for x in primekey): timestr = '{start}-{end}{sample}'.format( start=start_time.tai.strftime("%Y.%m.%d_%H:%M:%S_TAI"), end=end_time.tai.strftime("%Y.%m.%d_%H:%M:%S_TAI"), sample=sample) else: error_message = ("Time attribute has been passed both as a Time()" " and PrimeKey(). Please provide any one of them" " or separate them by OR operator." ) raise ValueError(error_message) else: # This is executed when Time has not been passed through Time() attribute. # `match` stores all the time-type prime-keys that has been passed through # PrimeKey() attribute. The length of `match` won't ever be greater than 1, # but it is a good idea to keep a check. match = set(primekey.keys()) & PRIMEKEY_LIST_TIME if len(match) > 1: error_message = ("Querying of series, having more than 1 Time-type " "prime-keys is not yet supported. Alternative is to " "use only one of the primekey to query for series data.") raise ValueError(error_message) if match: timestr = '{}'.format(primekey.pop(list(match)[0], '')) else: timestr = '' if wavelength != '': if not primekey.get('WAVELNTH', ''): if isinstance(wavelength, list): wavelength = [int(np.ceil(wave.to(u.AA).value)) for wave in wavelength] wavelength = str(wavelength) else: wavelength = '{}'.format(int(np.ceil(wavelength.to(u.AA).value))) else: # This is executed when wavelength has been passed both through PrimeKey() # and Wavelength(). error_message = ("Wavelength attribute has been passed both as a Wavelength()" " and PrimeKey(). Please provide any one of them" " or separate them by OR operator.") raise ValueError(error_message) else: # This is executed when wavelength has been passed through PrimeKey(). wavelength = '{}'.format(primekey.pop('WAVELNTH', '')) # Populate primekey dict with formatted Time and Wavlength. if timestr: primekey['TIME'] = timestr if wavelength != '': primekey['WAVELNTH'] = wavelength # Extract and format primekeys primekey_string = '' c = drms.Client() si = c.info(series) primekeys_istime = si.keywords.loc[si.primekeys].is_time for pkey in primekeys_istime.index.values: # The loop is iterating over the list of prime-keys existing for the given series. if len(primekey) > 0: if primekeys_istime[pkey]: primekey_string += '[{}]'.format(primekey.pop('TIME', '')) else: primekey_string += '[{}]'.format(primekey.pop(pkey, '')) else: break # break because we can skip adding {} at the end of primekey_string, if the primekey # dict is empty. if not primekey_string: # primekey_string cannot be totally empty # # Note that whilst it is technically possible to just search by series, # this is not allowed here, because some of these would be very large # searches that would make JSOC sad raise ValueError("Time, Wavelength or an explicit PrimeKey must be specified.") keys = [] keyword_info = c.keys(series) for key, value in keyword.items(): if key in keyword_info: keys.append(f"{key}{value['operator']}{value['value']}") else: raise ValueError(f"Keyword: '{key}' is not supported by series: {series}") keyword_string = f"[? {' AND '.join(keys)} ?]" if keys else "" return f"{series}{primekey_string}{keyword_string}{segment}" def _lookup_records(self, iargs): """ Do a LookData request to JSOC to workout what results the query returns. """ isMeta = iargs.get('meta', False) keywords = iargs.get('keys', '**ALL**') client = drms.Client() if 'series' not in iargs: error_message = "Series must be specified for a JSOC Query" raise ValueError(error_message) if not isinstance(keywords, list) and not isinstance(keywords, str): error_message = "Keywords can only be passed as a list or comma-separated strings." raise TypeError(error_message) # Get a set of the PrimeKeys that exist for the given series, and check # whether the passed PrimeKeys is a subset of that. primekeys = client.pkeys(iargs['series']) primekeys_passed = iargs.get('primekey', None) # primekeys_passes is a dict, with key-value pairs. if primekeys_passed is not None: if not set(list(primekeys_passed.keys())) <= set(primekeys): error_message = f"Unexpected PrimeKeys were passed. The series {iargs['series']} supports the following Keywords: {primekeys}" raise ValueError(error_message.format(series=iargs['series'], primekeys=primekeys)) # Raise special error for wavelength (even though the code would ignore it anyway) wavelength = iargs.get('wavelength', '') if wavelength != '': if 'WAVELNTH' not in primekeys: error_message = (f"The series {iargs['series']} does not support wavelength attribute. " f"The following primekeys are supported {primekeys}") raise TypeError(error_message.format(series=iargs['series'], pkeys=primekeys)) # Raise errors for segments # Get a set of the segments that exist for the given series, and check # whether the passed segments is a subset of that. series = client.info(iargs['series']) # Fetches all valid segment names segments = list(series.segments.index.values) segments_passed = iargs.get('segment', None) if segments_passed is not None: if not isinstance(segments_passed, list) and not isinstance(segments_passed, str): error_message = "Segments can only be passed as a comma-separated string or a list of strings." raise TypeError(error_message) elif isinstance(segments_passed, str): segments_passed = segments_passed.replace(' ', '').split(',') if not set(segments_passed) <= set(segments): error_message = f"Unexpected Segments were passed. The series {iargs['series']} contains the following Segments {segments}" raise ValueError(error_message.format(series=iargs['series'], segs=segments)) iargs['segment'] = segments_passed # If Time has been passed as a PrimeKey, convert the Time object into TAI time scale, # and then, convert it to datetime object. ds = self._make_recordset(**iargs) # Convert the list of keywords into comma-separated string. if isinstance(keywords, list): key = str(keywords)[1:-1].replace(' ', '').replace("'", '') else: key = keywords log.debug(f"Running following query: {ds}") log.debug(f"Requesting following keywords: {key}") result = client.query(ds, key=key, rec_index=isMeta) if result is None or result.empty: return astropy.table.Table() else: return astropy.table.Table.from_pandas(result) @classmethod def _can_handle_query(cls, *query): # Import here to prevent circular imports from sunpy.net import attrs as a required = {a.jsoc.Series} optional = { a.jsoc.Protocol, a.jsoc.Notify, a.Wavelength, a.Time, a.jsoc.Segment, a.jsoc.PrimeKey, a.Sample, a.jsoc.Cutout, a.jsoc.Keyword, a.jsoc.KeywordComparison, } return cls.check_attr_types_in_query(query, required, optional) @classmethod def _attrs_module(cls): return 'jsoc', 'sunpy.net.jsoc.attrs' @classmethod def register_values(cls): # We always use the local file for now. return cls.load_jsoc_values() @staticmethod def create_parse_jsoc_values(): """ Makes a network call to the VSO API that returns what keywords they support. We take this list and register all the keywords as corresponding Attrs. """ here = os.path.dirname(os.path.realpath(__file__)) client = drms.Client() # Series we are after data_sources = ["hmi", "mdi", "aia"] # Now get all the information we want. series_store = [] segments = [] for series in data_sources: info = client.series(rf'{series}\.') for item in info: data = client.info(item) series_store.append((data.name, data.note)) if not data.segments.empty: for row in data.segments.iterrows(): segments.append((row[0], row[1][-1])) series_store = list(set(series_store)) segments = list(set(segments)) with open(os.path.join(here, 'data', 'attrs.json'), 'w') as attrs_file: keyword_info = {} keyword_info["series_store"] = sorted(series_store) keyword_info["segments"] = sorted(segments) json.dump(keyword_info, attrs_file, indent=2) @staticmethod def load_jsoc_values(): """ We take this list and register all the keywords as corresponding Attrs. Returns ------- dict The constructed Attrs dictionary ready to be passed into Attr registry. """ # Import here to prevent circular imports from sunpy.net import attrs as a here = os.path.dirname(os.path.realpath(__file__)) with open(os.path.join(here, 'data', 'attrs.json'), 'r') as attrs_file: keyword_info = json.load(attrs_file) # Create attrs out of them. series_dict = {a.jsoc.Series: keyword_info["series_store"]} segments_dict = {a.jsoc.Segment: keyword_info["segments"]} attrs = {**series_dict, **segments_dict} return attrs ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6452754 sunpy-3.1.5/sunpy/net/jsoc/tests/0000755000175100001710000000000000000000000015770 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/jsoc/tests/__init__.py0000644000175100001710000000000000000000000020067 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/jsoc/tests/test_attr.py0000644000175100001710000000410500000000000020353 0ustar00vstsdockerimport pytest import astropy.units as u import sunpy.net.jsoc as jsoc import sunpy.net.jsoc.attrs as attrs from sunpy.net import _attrs as core_attrs from sunpy.net.attr import AttrAnd, AttrOr @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'))]) def test_and(attr1, attr2): pytest.raises(TypeError, lambda: attr1 & attr2) def test_basicquery(): a1 = attrs.Series('foo') t1 = core_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 = core_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 = core_attrs.Time('2012/01/01', '2013/1/2') t2 = core_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): attrs.Wavelength('wobble') with pytest.raises(TypeError): attrs.Wavelength(3.24) with pytest.raises(TypeError): 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]) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/jsoc/tests/test_jsoc.py0000644000175100001710000003752200000000000020350 0ustar00vstsdockerimport os import tempfile import pytest from parfive import Results import astropy.table import astropy.time import astropy.units as u from astropy.coordinates import SkyCoord import sunpy.data.test import sunpy.map import sunpy.net.attrs as a from sunpy.net.jsoc import JSOCClient, JSOCResponse from sunpy.util.exceptions import SunpyUserWarning @pytest.fixture def client(): return JSOCClient() @pytest.fixture def jsoc_response_double(): resp = JSOCResponse([{'T_REC': '2011/01/01T00:00', 'INSTRUME': 'AIA'}, {'T_REC': '2011/01/02T00:00', 'INSTRUME': 'AIA'}]) resp.query_args = [{'start_time': astropy.time.Time("2020-01-01T01:00:36.000"), 'end_time': astropy.time.Time("2020-01-01T01:00:38.000"), 'series': 'hmi.M_45s', 'notify': 'jsoc@cadair.com'}] return resp def test_jsocresponse_single(): j1 = JSOCResponse(data=[[1, 2, 3, 4]]) assert all(j1 == astropy.table.Table(data=[[1, 2, 3, 4]])) assert len(j1) == 4 def test_empty_jsoc_response(): Jresp = JSOCResponse() assert len(Jresp) == 0 assert Jresp.query_args is None assert Jresp.requests is None assert len(Jresp) == 0 @pytest.mark.remote_data def test_return_query_args(client): res = client.search(a.jsoc.PrimeKey('HARPNUM', 3604), a.jsoc.Series('hmi.sharp_cea_720s'), a.jsoc.Segment('Bp') & a.jsoc.Segment('magnetogram')) # Because res.query_args is list that contains dict assert 'primekey' in res.query_args[0] @pytest.mark.remote_data def test_query(client): Jresp = client.search( a.Time('2020/1/1T00:00:00', '2020/1/1T00:01:30'), a.jsoc.Series('hmi.M_45s'), a.Sample(90 * u.second)) assert isinstance(Jresp, JSOCResponse) assert len(Jresp) == 2 @pytest.mark.remote_data def test_post_pass(client): responses = client.search( a.Time('2020/1/1T00:00:00', '2020/1/1T00:00:45'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com')) aa = client.request_data(responses) tmpresp = aa._d assert tmpresp['protocol'] == 'fits' assert tmpresp['method'] == 'url' def test_show(client): jdict = {'TELESCOP': ['SDO/HMI', 'SDO/AIA'], 'CAR_ROT': [2145, 2145]} responses = JSOCResponse(astropy.table.Table(jdict)) showtable = responses.show('TELESCOP') assert isinstance(showtable, astropy.table.Table) assert showtable.colnames == ['TELESCOP'] assert showtable['TELESCOP'][0] == 'SDO/HMI' @pytest.mark.remote_data def test_post_wavelength(client): responses = client.search( a.Time('2020/07/30T13:30:00', '2020/07/30T14:00:00'), a.jsoc.Series('aia.lev1_euv_12s'), a.Wavelength(193 * u.AA) | a.Wavelength(335 * u.AA), a.jsoc.Notify('jsoc@cadair.com')) aa = client.request_data(responses) [r.wait() for r in aa] tmpresp = aa[0]._d assert tmpresp['protocol'] == 'fits' assert tmpresp['method'] == 'url' assert tmpresp['count'] == '302' tmpresp = aa[1]._d assert tmpresp['protocol'] == 'fits' assert tmpresp['method'] == 'url' assert tmpresp['count'] == '302' @pytest.mark.remote_data def test_post_notify_fail(client): responses = client.search( a.Time('2020/1/1T00:00:00', '2020/1/1T00:00:45'), a.jsoc.Series('hmi.M_45s')) with pytest.raises(ValueError): client.request_data(responses) @pytest.mark.remote_data() def test_post_wave_series(client): with pytest.raises(TypeError, match="The series hmi.M_45s does not support wavelength attribute."): client.search( a.Time('2020/1/1T00:00:00', '2020/1/1T00:00:45'), a.jsoc.Series('hmi.M_45s') | a.jsoc.Series('aia.lev1_euv_12s'), a.Wavelength(193 * u.AA) | a.Wavelength(335 * u.AA)) @pytest.mark.remote_data def test_wait_get(client): responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com')) path = tempfile.mkdtemp() res = client.fetch(responses, path=path) assert isinstance(res, Results) assert len(res) == 1 @pytest.mark.remote_data def test_get_request(client): responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.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_get_request_tar(client): responses = client.search( a.Time('2012/1/1T1:00:36', '2012/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com')) bb = client.request_data(responses, method='url-tar') bb.wait() path = tempfile.mkdtemp() aa = client.get_request(bb, path=path) assert isinstance(aa, Results) responses = client.search( a.Time('2012/1/1T1:00:36', '2012/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com'), a.jsoc.Protocol('as-is')) bb = client.request_data(responses, method='url-tar') bb.wait() path = tempfile.mkdtemp() aa = client.get_request(bb, path=path) assert isinstance(aa, Results) @pytest.mark.remote_data def test_invalid_query(client): with pytest.raises(ValueError): client.search(a.Time('2020/1/1T01:00:00', '2020/1/1T01:00:45')) @pytest.mark.remote_data def test_lookup_records_errors(client): d1 = {'end_time': astropy.time.Time('2020-01-01 01:00:35'), 'start_time': astropy.time.Time('2020-01-01 00:00:35')} # Series must be specified for a JSOC Query with pytest.raises(ValueError): client._lookup_records(d1) d1.update({'series': 'aia.lev1_euv_12s'}) d1.update({'keys': 123}) # Keywords can only be passed as a list or comma-separated strings. with pytest.raises(TypeError): client._lookup_records(d1) d1['keys'] = 'T_OBS' d1.update({'primekey': {'foo': 'bar'}}) # Unexpected PrimeKeys were passed. with pytest.raises(ValueError): client._lookup_records(d1) del d1['primekey'] d1.update({'segment': 123}) d1.update({'wavelength': 304*u.AA}) # Segments can only be passed as a comma-separated string or a list of strings. with pytest.raises(TypeError): client._lookup_records(d1) # Unexpected Segments were passed. d1.update({'segment': 'foo'}) with pytest.raises(ValueError): client._lookup_records(d1) del d1['segment'] d1.update({'series': 'hmi.m_45s'}) # The series does not support wavelength attribute. with pytest.raises(TypeError): client._lookup_records(d1) @pytest.mark.remote_data def test_make_recordset_errors(client): d1 = {'series': 'aia.lev1_euv_12s'} with pytest.raises(ValueError): client._make_recordset(**d1) d1.update({ 'end_time': astropy.time.Time('2020-01-01 01:00:35', scale='tai'), 'start_time': astropy.time.Time('2020-01-01 00:00:35', scale='tai'), 'primekey': {'T_REC': '2020.01.01_00:00:35_TAI-2020.01.01_01:00:35_TAI'} }) with pytest.raises(ValueError): client._make_recordset(**d1) d1.update({ 'end_time': astropy.time.Time('2020-01-01 01:00:35', scale='tai'), 'start_time': astropy.time.Time('2020-01-01 00:00:35', scale='tai'), 'wavelength': 604*u.AA, 'primekey': {'WAVELNTH': '604'} }) with pytest.raises(ValueError): client._make_recordset(**d1) @pytest.mark.remote_data def test_make_recordset(client): d1 = {'series': 'aia.lev1_euv_12s', 'end_time': astropy.time.Time('2020-01-01 01:00:35', scale='tai'), 'start_time': astropy.time.Time('2020-01-01 00:00:35', scale='tai') } exp = 'aia.lev1_euv_12s[2020.01.01_00:00:35_TAI-2020.01.01_01:00:35_TAI]' assert client._make_recordset(**d1) == exp d1.update({'wavelength': 604*u.AA}) exp = 'aia.lev1_euv_12s[2020.01.01_00:00:35_TAI-2020.01.01_01:00:35_TAI][604]' assert client._make_recordset(**d1) == exp del d1['wavelength'] d1.update({'primekey': {'WAVELNTH': '604'}}) assert client._make_recordset(**d1) == exp del d1['start_time'], d1['end_time'] d1['primekey'].update({'T_REC': '2020.01.01_00:00:35_TAI-2020.01.01_01:00:35_TAI'}) exp = 'aia.lev1_euv_12s[2020.01.01_00:00:35_TAI-2020.01.01_01:00:35_TAI]' assert client._make_recordset(**d1) == exp d1 = {'series': 'hmi.v_45s', 'end_time': astropy.time.Time('2020-01-01 01:00:35', scale='tai'), 'start_time': astropy.time.Time('2020-01-01 00:00:35', scale='tai'), 'segment': 'foo,bar' } exp = 'hmi.v_45s[2020.01.01_00:00:35_TAI-2020.01.01_01:00:35_TAI]{foo,bar}' assert client._make_recordset(**d1) == exp d1['segment'] = ['foo', 'bar'] assert client._make_recordset(**d1) == exp d1 = {'series': 'hmi.sharp_720s', 'end_time': astropy.time.Time('2020-01-01 01:00:35', scale='tai'), 'start_time': astropy.time.Time('2020-01-01 00:00:35', scale='tai'), 'segment': ['continuum', 'magnetogram'], 'primekey': {'HARPNUM': '4864'} } exp = 'hmi.sharp_720s[4864][2020.01.01_00:00:35_TAI-2020.01.01_01:00:35_TAI]'\ '{continuum,magnetogram}' assert client._make_recordset(**d1) == exp d1.update({'sample': 300.0}) exp = 'hmi.sharp_720s[][2020.01.01_00:00:35_TAI-2020.01.01_01:00:35_TAI@300.0s]'\ '{continuum,magnetogram}' assert client._make_recordset(**d1) == exp @pytest.mark.remote_data def test_request_data_error(client): responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com'), a.jsoc.Protocol('foo')) with pytest.raises(TypeError): client.request_data(responses) @pytest.mark.remote_data def test_request_data_protocol(client): responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com')) req = client.request_data(responses) req.wait() assert req._d['method'] == 'url' assert req._d['protocol'] == 'fits' responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com'), a.jsoc.Protocol('fits')) req = client.request_data(responses) req.wait() assert req._d['method'] == 'url' assert req._d['protocol'] == 'fits' responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com'), a.jsoc.Protocol('as-is')) req = client.request_data(responses) req.wait() assert req._d['method'] == 'url_quick' assert req._d['protocol'] == 'as-is' @pytest.mark.remote_data def test_request_data_method(client): responses = client.search( a.Time('2012/1/1T1:00:36', '2012/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com')) req = client.request_data(responses, method='url-tar') req.wait() assert req._d['method'] == 'url-tar' assert req._d['protocol'] == 'fits' responses = client.search( a.Time('2012/1/1T1:00:36', '2012/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com'), a.jsoc.Protocol('as-is')) req = client.request_data(responses, method='url-tar') req.wait() assert req._d['method'] == 'url-tar' assert req._d['protocol'] == 'as-is' @pytest.mark.remote_data def test_check_request(client): responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com')) req = client.request_data(responses) req.wait() assert req.status == 0 @pytest.mark.flaky(reruns_delay=30) @pytest.mark.remote_data def test_results_filenames(client): responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:01:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com')) path = tempfile.mkdtemp() files = client.fetch(responses, path=path) assert isinstance(files, Results) assert len(files) == len(responses) for hmiurl in files: assert os.path.isfile(hmiurl) @pytest.mark.flaky(reruns_delay=30) @pytest.mark.remote_data def test_results_filenames_as_is(tmp_path, client): responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:01:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com'), a.jsoc.Protocol('as-is')) assert len(responses) == 2 files = client.fetch(responses, path=tmp_path) assert isinstance(files, Results) assert len(files) == len(responses) for hmiurl in files: assert os.path.isfile(hmiurl) def test_can_handle_query_no_series(client): assert not client._can_handle_query(a.Time("2020/01/02", "2020/01/03")) assert not client._can_handle_query(a.Wavelength(17.1*u.nm)) assert client._can_handle_query(a.jsoc.Series("hmi.M_45s")) def test_jsoc_attrs(client): attrs = client.load_jsoc_values() assert a.jsoc.Series in attrs.keys() assert a.jsoc.Segment in attrs.keys() assert len(attrs[a.jsoc.Series]) != 0 assert len(attrs[a.jsoc.Segment]) != 0 @pytest.mark.flaky(reruns_delay=30) @pytest.mark.remote_data def test_jsoc_cutout_attrs(client): m_ref = sunpy.map.Map(sunpy.data.test.get_test_filepath('aia_171_level1.fits')) cutout = a.jsoc.Cutout( SkyCoord(-500*u.arcsec, -275*u.arcsec, frame=m_ref.coordinate_frame), top_right=SkyCoord(150*u.arcsec, 375*u.arcsec, frame=m_ref.coordinate_frame), tracking=True ) q = client.search( a.Time(m_ref.date, m_ref.date + 1 * u.min), a.Wavelength(171*u.angstrom), a.jsoc.Series.aia_lev1_euv_12s, a.jsoc.Notify('jsoc@cadair.com'), # Put your email here a.jsoc.Segment.image, cutout, ) req = client.request_data(q, method='url', protocol='fits') req.wait() assert req.status == 0 files = client.get_request(req) assert len(files) == 6 m = sunpy.map.Map(files, sequence=True) assert m.all_maps_same_shape() assert m.as_array().shape == (1085, 1085, 6) def test_row_and_warning(mocker, client, jsoc_response_double): mocker.patch("sunpy.net.jsoc.jsoc.JSOCClient.get_request") request_data = mocker.patch("sunpy.net.jsoc.jsoc.JSOCClient.request_data") with pytest.warns(SunpyUserWarning): client.fetch(jsoc_response_double[0], sleep=0) assert request_data.called_once_with(jsoc_response_double[0].as_table()) @pytest.mark.remote_data def test_check_request_keywords(client): responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Keyword("QUALITY") == 1) assert len(responses) == 0 responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Keyword("QUALITY") == 0) assert len(responses) == 1 responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Keyword("QUALITY") < 2) assert len(responses) == 1 with pytest.raises(ValueError, match="Keyword: 'EXPTIME' is not supported by series:"): client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:00:38'), a.jsoc.Series('hmi.M_45s'), a.jsoc.Keyword("EXPTIME") < 2) responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:00:38'), a.jsoc.Series('aia.lev1_euv_12s'), a.jsoc.Keyword("QUALITY") < 2, a.jsoc.Keyword("EXPTIME") < 2) assert len(responses) == 0 responses = client.search( a.Time('2020/1/1T1:00:36', '2020/1/1T01:00:38'), a.jsoc.Series('aia.lev1_euv_12s'), a.jsoc.Keyword("QUALITY") < 2, a.jsoc.Keyword("EXPTIME") > 2) assert len(responses) == 7 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/scraper.py0000644000175100001710000004531400000000000015710 0ustar00vstsdocker""" This module provides a web scraper. """ import os import re import calendar from time import sleep from ftplib import FTP from datetime import datetime from urllib.error import HTTPError from urllib.parse import urlsplit from urllib.request import urlopen from bs4 import BeautifulSoup from dateutil.relativedelta import relativedelta import astropy.units as u from astropy.time import Time, TimeDelta from sunpy import log from sunpy.extern.parse import parse from sunpy.time import TimeRange from sunpy.util.exceptions import warn_user __all__ = ['Scraper'] # regular expressions to convert datetime format # added `%e` as for milliseconds `%f/1000` TIME_CONVERSIONS = {'%Y': r'\d{4}', '%y': r'\d{2}', '%b': '[A-Z][a-z]{2}', '%B': r'\W', '%m': r'\d{2}', '%d': r'\d{2}', '%j': r'\d{3}', '%H': r'\d{2}', '%I': r'\d{2}', '%M': r'\d{2}', '%S': r'\d{2}', '%e': r'\d{3}', '%f': r'\d{6}'} class Scraper: """ A Scraper to scrap web data archives based on dates. Parameters ---------- pattern : `str` A string containing the url with the date encoded as datetime formats, and any other parameter as ``kwargs`` as a string format. regex : `bool` Set to `True` if parts of the pattern uses regexp symbols. Be careful that periods ``.`` matches any character and therefore it's better to escape them. If regexp is used, other ``kwargs`` are ignored and string replacement is not possible. Default is `False`. Attributes ---------- pattern : `str` A converted string with the kwargs. now : `datetime.datetime` The pattern with the actual date. Examples -------- >>> # Downloading data from SolarMonitor.org >>> from sunpy.net 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, regex=False, **kwargs): if regex: self.pattern = pattern if kwargs: warn_user('regexp being used, the extra arguments passed are being ignored') else: self.pattern = pattern.format(**kwargs) self.domain = "{0.scheme}://{0.netloc}/".format(urlsplit(self.pattern)) milliseconds = re.search(r'\%e', self.pattern) if not milliseconds: self.now = datetime.now().strftime(self.pattern) else: now = datetime.now() milliseconds_ = int(now.microsecond / 1000.) self.now = now.strftime('{start}{milli:03d}{end}'.format( start=self.pattern[0:milliseconds.start()], milli=milliseconds_, end=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. Parameters ---------- timerange : `~sunpy.time.timerange.TimeRange` Time interval where to find the directories for a given pattern. Returns ------- `list` of `str` 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 if '/' in self.pattern: directorypattern = '/'.join(self.pattern.split('/')[:-1]) + '/' timestep = self._smallerPattern(directorypattern) if timestep is None: return [directorypattern] else: directories = [] cur = self._date_floor(timerange.start, timestep) end = self._date_floor(timerange.end, timestep) + timestep while cur < end: directories.append(cur.strftime(directorypattern)) cur = cur + timestep return directories @staticmethod def _date_floor(date, timestep): """ Return the "floor" of the given date and time step. Parameters ---------- datetime : `datetime.datetime` or `astropy.time.Time` The date to floor timestep : `dateutil.relativedelta.relativedelta` The smallest time step to floor Returns ------- `datetime.datetime` The time floored at the given time step """ date_parts = [int(p) for p in date.strftime('%Y,%m,%d,%H,%M,%S').split(',')] date_parts[-1] = date_parts[-1] % 60 date = datetime(*date_parts) orig_time_tup = date.timetuple() time_tup = [orig_time_tup.tm_year, orig_time_tup.tm_mon, orig_time_tup.tm_mday, orig_time_tup.tm_hour, orig_time_tup.tm_min, orig_time_tup.tm_sec] if timestep == relativedelta(minutes=1): time_tup[-1] = 0 elif timestep == relativedelta(hours=1): time_tup[-2:] = [0, 0] elif timestep == relativedelta(days=1): time_tup[-3:] = [0, 0, 0] elif timestep == relativedelta(months=1): time_tup[-4:] = [1, 0, 0, 0] elif timestep == relativedelta(years=1): time_tup[-5:] = [1, 1, 0, 0, 0] return datetime(*time_tup) def _URL_followsPattern(self, url): """ Check whether the url provided follows the pattern. """ pattern = self.pattern for k, v in TIME_CONVERSIONS.items(): pattern = pattern.replace(k, v) matches = re.match(pattern, url) if matches: return matches.end() == matches.endpos 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@", "") def url_to_list(txt): # Substitutes '.' and '_' for '/'. return re.sub(r'\.|_', '/', txt).split('/') # create a list of all the blocks in times - assuming they are all # separated with either '.', '_' or '/'. 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 TIME_CONVERSIONS.items(): 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 = fr'\{r}' if not r.startswith('[') else r pattern = f'%{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(f'%{p}') final_date.append(date_part.group()) return Time.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 `str` List of all the files found between the time range given. Examples -------- >>> from sunpy.net 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'] Notes ----- 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 time. """ directories = self.range(timerange) filesurls = [] if urlsplit(directories[0]).scheme == "ftp": return self._ftpfileslist(timerange) if urlsplit(directories[0]).scheme == "file": return self._localfilelist(timerange) while directories: directory = directories.pop(0) try: opn = urlopen(directory) try: soup = BeautifulSoup(opn, "html.parser") for link in soup.find_all("a"): href = link.get("href") if href is not None and href.endswith(self.pattern.split('.')[-1]): if href[0] == '/': fullpath = self.domain + href[1:] else: fullpath = directory + href if self._URL_followsPattern(fullpath): if self._check_timerange(fullpath, timerange): filesurls.append(fullpath) finally: opn.close() except HTTPError as http_err: # Ignore missing directories (issue #2684). if http_err.code == 404: continue if http_err.code == 429: # See if the server has told us how long to back off for retry_after = http_err.hdrs.get('Retry-After', 2) try: # Ensure that we can parse the header as an int in sec retry_after = int(retry_after) except Exception as e: log.debug(f"Converting retry_after failed: {e}") retry_after = 2 log.debug( f"Got 429 while scraping {directory}, waiting for {retry_after} seconds before retrying." ) sleep(retry_after) # Put this dir back on the queue directories.insert(0, directory) continue raise except Exception: raise return filesurls def _ftpfileslist(self, timerange): directories = self.range(timerange) filesurls = list() ftpurl = urlsplit(directories[0]).netloc with FTP(ftpurl, user="anonymous", passwd="data@sunpy.org") as ftp: for directory in directories: try: ftp.cwd(urlsplit(directory).path) except Exception as e: log.debug(f"FTP CWD: {e}") continue for file_i in ftp.nlst(): fullpath = directory + file_i if self._URL_followsPattern(fullpath): if self._check_timerange(fullpath, timerange): filesurls.append(fullpath) filesurls = [f'ftp://' + "{0.netloc}{0.path}".format(urlsplit(url)) for url in filesurls] return filesurls def _localfilelist(self, timerange): pattern = self.pattern pattern_temp = pattern.replace('file://', '') if os.name == 'nt': pattern_temp = pattern_temp.replace('\\', '/') prefix = 'file:///' else: prefix = 'file://' self.pattern = pattern_temp directories = self.range(timerange) filepaths = list() for directory in directories: for file_i in os.listdir(directory): fullpath = directory + file_i if self._URL_followsPattern(fullpath): if self._check_timerange(fullpath, timerange): filepaths.append(fullpath) filepaths = [prefix + path for path in filepaths] self.pattern = pattern return filepaths def _check_timerange(self, url, timerange): """ Checks whether the time extracted from the URL is valid according to the given time range. Parameters ---------- url : `str` URL of the file. timerange : `~sunpy.time.TimeRange` Time interval for which files were searched. Returns ------- `bool` `True` if URL's time overlaps the given timerange, else `False`. """ if hasattr(self, 'extractor'): exdict = parse(self.extractor, url).named tr = get_timerange_from_exdict(exdict) return (tr.end >= timerange.start and tr.start <= timerange.end) else: datehref = self._extractDateURL(url).to_datetime() return (timerange.start.to_datetime() <= datehref <= timerange.end.to_datetime()) def _smallerPattern(self, directoryPattern): """ Obtain the smaller time step for the given pattern. """ try: if "%S" in directoryPattern: return relativedelta(seconds=1) elif "%M" in directoryPattern: return relativedelta(minutes=1) elif any(hour in directoryPattern for hour in ["%H", "%I"]): return relativedelta(hours=1) elif any(day in directoryPattern for day in ["%d", "%j"]): return relativedelta(days=1) elif any(month in directoryPattern for month in ["%b", "%B", "%m"]): return relativedelta(months=1) elif any(year in directoryPattern for year in ["%Y", "%y"]): return relativedelta(years=1) else: return None except Exception: raise def _extract_files_meta(self, timerange, extractor, matcher=None): """ Returns metadata information contained in URLs. Parameters ---------- timerange : `~sunpy.time.TimeRange` Time interval where to find the directories for a given pattern. extractor : `str` Pattern to extract metadata by parsing the URL. matcher : `dict` Dictionary to check if extracted metadata is valid. Returns ------- `list` of `dict` List of metadata info for all URLs. """ self.extractor = extractor urls = self.filelist(timerange) metalist = [] for url in urls: metadict = parse(extractor, url) if metadict is not None: append = True metadict = metadict.named metadict['url'] = url if matcher is not None: for k in metadict: if k in matcher and str(metadict[k]) not in matcher[k]: append = False break if append: metalist.append(metadict) return metalist def get_timerange_from_exdict(exdict): """ Function to get URL's timerange using extracted metadata. It computes start and end times first using the given dictionary and then returns a timerange. Parameters ---------- exdict : `dict` Metadata extracted from the file's url. Returns ------- `~sunpy.time.TimeRange` The time range of the file. """ datetypes = ['year', 'month', 'day'] timetypes = ['hour', 'minute', 'second', 'millisecond'] dtlist = [int(exdict.get(d, 1)) for d in datetypes] dtlist.extend([int(exdict.get(t, 0)) for t in timetypes]) startTime = Time(datetime(*dtlist)) tdelta = 1*u.millisecond if "year" in exdict: if calendar.isleap(int(exdict['year'])): tdelta = 366*u.day else: tdelta = 365*u.day if "month" in exdict: days_in_month = calendar.monthrange(int(exdict['year']), int(exdict['month']))[1] tdelta = days_in_month*u.day if "day" in exdict: tdelta = 1*u.day if "hour" in exdict: tdelta = 1*u.hour if "minute" in exdict: tdelta = 1*u.minute if "second" in exdict: tdelta = 1*u.second endTime = startTime + TimeDelta(tdelta) - TimeDelta(1*u.millisecond) file_timerange = TimeRange(startTime, endTime) return file_timerange ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6452754 sunpy-3.1.5/sunpy/net/tests/0000755000175100001710000000000000000000000015032 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/tests/__init__.py0000644000175100001710000000000000000000000017131 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/tests/strategies.py0000644000175100001710000000744500000000000017570 0ustar00vstsdocker""" Provide a set of Hypothesis Strategies for various Fido related tests. """ import datetime import hypothesis.strategies as st import numpy as np from hypothesis import assume from hypothesis.strategies import datetimes, one_of, sampled_from import astropy.time import astropy.units as u from astropy.time import Time from sunpy.net import attrs as a from sunpy.time import TimeRange, parse_time TimesLeapsecond = sampled_from((Time('2015-06-30T23:59:60'), Time('2012-06-30T23:59:60'))) @st.composite def Times(draw, max_value, min_value): time = one_of(datetimes(max_value=max_value, min_value=min_value), TimesLeapsecond) time = Time(draw(time)) return time @st.composite def TimeDelta(draw): """ Timedelta strategy that limits the maximum timedelta to being positive and abs max is about 10 weeks + 10 days + 10 hours + 10 minutes + a bit """ st.sampled_from(['weeks', 'days', 'hours', 'minutes', 'seconds']) time_dict = {'days': st.floats(min_value=1, max_value=8), 'hours': st.floats(min_value=1, max_value=12), 'minutes': st.floats(min_value=1, max_value=30), 'seconds': st.floats(min_value=1, max_value=60)} delta = datetime.timedelta(**draw(st.fixed_dictionaries(time_dict))) delta = astropy.time.TimeDelta(delta, format='datetime') # We don't want a 0 timedelta assume(delta.sec > 0) return delta def offline_instruments(): """ Returns a strategy for any instrument that does not need the internet to do a query. """ offline_instr = ['noaa-indices', 'noaa-predict'] 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 need the internet to do a query. """ online_instr = ['lyra', 'goes', 'eve', 'rhessi', 'norh', 'soon'] online_instr = st.builds(a.Instrument, st.sampled_from(online_instr)) return online_instr @st.composite def time_attr(draw, time=Times( max_value=datetime.datetime(datetime.datetime.utcnow().year, 1, 1, 0, 0), min_value=datetime.datetime(1981, 1, 1, 0, 0)), delta=TimeDelta()): """ Create an a.Time where it's always positive. """ t1 = draw(time) t2 = t1 + draw(delta) # We can't download data from the future. assume(t2 < Time.now()) return a.Time(t1, t2) @st.composite def goes_time(draw, time=Times( max_value=datetime.datetime(datetime.datetime.utcnow().year, 1, 1, 0, 0), min_value=datetime.datetime(1981, 1, 1, 0, 0)), delta=TimeDelta()): """ Create an a.Time where it's always positive. """ t1 = draw(time) delta = draw(delta) t2 = t1 + delta # We can't download data from the future. assume(t2 < Time.now()) # There is no GOES data for this date. assume(not (t1 <= Time('1983-05-01') <= t2)) assume(not (t1 <= (Time('1983-05-01') + delta) <= t2)) # This checks if the range start and stops on that day. assume((np.abs(Time('1983-05-01') - t1)) > astropy.time.TimeDelta(0.01*u.s)) assume((np.abs(Time('1983-05-01') - t2)) > astropy.time.TimeDelta(0.01*u.s)) tr = TimeRange(t1, t2) return a.Time(tr) @st.composite def srs_time(draw, time=Times( max_value=datetime.datetime.now(), min_value=datetime.datetime(1996, 1, 1)), delta=TimeDelta()): t1 = draw(time) t2 = t1 + draw(delta) assume(t1 < t2) return a.Time(TimeRange(t1, t2)) def range_time(min_date, max_date=Time.now()): time = Times( min_value=parse_time(min_date).datetime, max_value=parse_time(max_date).datetime ) return time_attr(time=time) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/tests/test_attr.py0000644000175100001710000002557000000000000017426 0ustar00vstsdockerfrom collections import defaultdict import pytest from sunpy.net import attr from sunpy.net.attr import AttrMeta, make_tuple from sunpy.net.dataretriever import GenericClient class Instrument(attr.SimpleAttr): """ Dummy Instrument Class. """ class Time(attr.Range): """ Dummy Time Class. """ def EmptyAttr(): AttrMeta._attr_registry = defaultdict(make_tuple) @pytest.fixture def ALL(): return Instrument('all') @pytest.fixture def AIA(): return Instrument('AIA') @pytest.fixture def NUM(): return Instrument('1') @pytest.fixture def NUMBER(): return Instrument('1AIA') @pytest.fixture def POINTNUMBER(): return Instrument('1.5') @pytest.fixture def NUMBERS(): return Instrument('12AIAs') @pytest.fixture def HMI(): return Instrument('HMI') @pytest.fixture def SPEC(): return Instrument('_!£!THIS_NAME!"!ISSPECIAL~~##') @pytest.fixture def KEYWORD(): return Instrument('class') class SA1(attr.SimpleAttr): pass class SA2(attr.SimpleAttr): pass class SA3(attr.SimpleAttr): pass class SA4(attr.SimpleAttr): pass def test_empty(): class TestAttr(attr.Attr): pass assert repr(TestAttr) @pytest.mark.parametrize("different_type", [ int, str, float, list, set, tuple, dict, object ]) def test_empty(different_type): attr_ = attr.Attr() assert attr_ != different_type() def test_attr_and(): a1 = SA1(1) a2 = SA2(2) an = a1 & a2 assert isinstance(an, attr.AttrAnd) assert a1 in an.attrs assert a2 in an.attrs assert len(an.attrs) == 2 def test_attr_and_AttrAnd(): a1 = SA1(1) a2 = SA2(2) a3 = SA3(3) an = a1 & (a2 & a3) assert isinstance(an, attr.AttrAnd) assert a1 in an.attrs assert a2 in an.attrs assert a3 in an.attrs assert len(an.attrs) == 3 def test_attr_multi_and_AttrAnd(): a1 = SA1(1) a2 = SA2(2) a3 = SA3(3) a4 = SA4(4) a_and1 = (a2 & a3) a_and2 = (a1 & a4) an = a_and1 & a_and2 assert isinstance(a_and1, attr.AttrAnd) assert isinstance(a_and2, attr.AttrAnd) assert isinstance(an, attr.AttrAnd) assert a1 in an.attrs assert a2 in an.attrs assert a3 in an.attrs assert a4 in an.attrs assert len(an.attrs) == 4 def test_attr_and_AttrOr(): a1 = SA1(1) a2 = SA2(2) a3 = SA3(3) an = a1 & (a2 | a3) assert isinstance(an, attr.AttrOr) for a in an.attrs: assert isinstance(a, attr.AttrAnd) assert len(an.attrs) == 2 def test_attr_hash(): a1 = SA1(1) a2 = SA1(1) a3 = SA1(3) assert hash(a1) == hash(a2) assert hash(a3) != hash(a1) def test_attr_collies(): a1 = attr.Attr() with pytest.raises(NotImplementedError): a1.collides(1) def test_attr_or(): a1 = SA1(1) a2 = SA2(2) an = a1 | a2 assert isinstance(an, attr.AttrOr) assert a1 in an.attrs assert a2 in an.attrs assert len(an.attrs) == 2 a1 = SA1(1) a2 = SA2(1) an = a1 | a2 assert an is a1 def test_simpleattr_collides(): a1 = SA1(1) with pytest.raises(TypeError): a1 & a1 def test_simple_attr_repr(): a1 = SA1("test string") assert "test string" in repr(a1) assert "SA1" in repr(a1) def test_dummyattr(): one = attr.DummyAttr() other = attr.ValueAttr({'a': 'b'}) assert (one | other) is other assert (one & other) is other def test_dummyattr_hash(): one = attr.DummyAttr() assert hash(one) == hash(None) def test_dummyattr_collides(): one = attr.DummyAttr() two = attr.DummyAttr() assert one.collides(two) is False def test_dummyattr_eq(): one = attr.DummyAttr() two = attr.DummyAttr() other = attr.ValueAttr({'a': 'b'}) assert one == two assert one != other def test_and_nesting(): a1 = SA1(1) a2 = SA2(2) a3 = SA3(3) a = attr.and_(a1, attr.AttrAnd((a2, a3))) # Test that the nesting has been removed. assert len(a.attrs) == 3 def test_or_nesting(): a1 = SA1(1) a2 = SA2(2) a3 = SA3(3) a = attr.or_(a1, attr.AttrOr((a2, a3))) # Test that the nesting has been removed. assert len(a.attrs) == 3 def test_attr_metamagic(AIA, HMI): # {cls: cls.register_values()} attr.Attr.update_values({GenericClient: {Instrument: [('AIA', 'This is AIA, it takes data')]}}) # .name is the attribute name return assert attr.Attr._attr_registry[Instrument].name == [AIA.value.lower()] # .name_long is the original name assert attr.Attr._attr_registry[Instrument].name_long == [AIA.value] # .des is the description of the item. assert attr.Attr._attr_registry[Instrument].desc == ['This is AIA, it takes data'] # The _value_registry on the Attr object does not get cleaned. # So by adding it again to the same type, in this case Instrument the list is appended. attr.Attr.update_values( {GenericClient: {Instrument: [('HMI', 'This is HMI, it lives next to AIA')]}}) assert attr.Attr._attr_registry[Instrument].name == [AIA.value.lower(), HMI.value.lower()] assert attr.Attr._attr_registry[Instrument].name_long == [AIA.value, HMI.value] assert attr.Attr._attr_registry[Instrument].desc == [ 'This is AIA, it takes data', 'This is HMI, it lives next to AIA'] # Tests the print out for the first two inputs only output = 'sunpy.net.tests.test_attr.Instrument\n\nDummy Instrument Class.\n\n\nAttribute Name Client Full Name Description \n-------------- ------- --------- ---------------------------------\naia Generic AIA This is AIA, it takes data \nhmi Generic HMI This is HMI, it lives next to AIA' assert str(Instrument) == output def test_attr_dynamic(AIA, HMI): # This checks the dynamic attribute creation. attr.Attr.update_values({GenericClient: {Instrument: [('AIA', 'This is AIA, it takes data')]}}) attr.Attr.update_values( {GenericClient: {Instrument: [('HMI', 'This is HMI, it lives next to AIA')]}}) assert Instrument.aia == AIA assert Instrument.hmi == HMI def test_attr_dir(): # Test for __dir__ attr.Attr.update_values({GenericClient: {Instrument: [('AIA', 'This is AIA, it takes data')]}}) attr.Attr.update_values( {GenericClient: {Instrument: [('HMI', 'This is HMI, it lives next to AIA')]}}) assert 'aia' in dir(Instrument) assert 'hmi' in dir(Instrument) def test_attr_sanity(): attr.Attr.update_values( {GenericClient: {Instrument: [('_!£!THIS_NAME!"!ISSPECIAL~~##', 'To test the attribute cleaning.')]}}) # This checks for sanitization of names. assert '___this_name___isspecial____' in attr.Attr._attr_registry[Instrument].name assert '_!£!THIS_NAME!"!ISSPECIAL~~##' in attr.Attr._attr_registry[Instrument].name_long assert 'To test the attribute cleaning.' in attr.Attr._attr_registry[Instrument].desc def test_attr_keyword(): attr.Attr.update_values({GenericClient: {Instrument: [('class', 'Keyword checking.')]}}) # This checks for sanitization of names. assert 'class_' in attr.Attr._attr_registry[Instrument].name assert 'class' in attr.Attr._attr_registry[Instrument].name_long assert 'Keyword checking.' in attr.Attr._attr_registry[Instrument].desc def test_attr_num(NUM): attr.Attr.update_values({GenericClient: {Instrument: [('1', 'One')]}}) # This checks for sanitization of names. assert 'one' in attr.Attr._attr_registry[Instrument].name assert '1' in attr.Attr._attr_registry[Instrument].name_long assert 'One' in attr.Attr._attr_registry[Instrument].desc assert Instrument.one == NUM def test_attr_number(NUMBER): attr.Attr.update_values({GenericClient: {Instrument: [('1AIA', 'One Number first.')]}}) # This checks for sanitization of names. assert 'one_aia' in attr.Attr._attr_registry[Instrument].name assert '1AIA' in attr.Attr._attr_registry[Instrument].name_long assert 'One Number first.' in attr.Attr._attr_registry[Instrument].desc assert Instrument.one_aia == NUMBER def test_attr_number_point(POINTNUMBER): attr.Attr.update_values({GenericClient: {Instrument: [('1.5', 'One Point Five.')]}}) # This checks for sanitization of names. assert 'onepointfive' in attr.Attr._attr_registry[Instrument].name assert '1.5' in attr.Attr._attr_registry[Instrument].name_long assert 'One Point Five.' in attr.Attr._attr_registry[Instrument].desc assert Instrument.onepointfive == POINTNUMBER def test_attr_numbes(): attr.Attr.update_values({GenericClient: {Instrument: [('12AIAs', 'That is too many AIAs')]}}) # This checks for sanitization of names. assert 'one_2aias' in attr.Attr._attr_registry[Instrument].name assert '12AIAs' in attr.Attr._attr_registry[Instrument].name_long assert 'That is too many AIAs' in attr.Attr._attr_registry[Instrument].desc assert 'one_2aias' in dir(Instrument) def test_attr_iterable_length(): # not iterable with pytest.raises(ValueError): attr.Attr.update_values({GenericClient: {Instrument: 'AIA'}}) # too many items with pytest.raises(ValueError): attr.Attr.update_values( {GenericClient: {Instrument: [('AIA', 'AIA is Nice', 'Error now')]}}) def test_asterisk_attrs(ALL): # This checks we can submit * to mean all attrs. attr.Attr.update_values({GenericClient: {Instrument: [('*')]}}) assert Instrument.all == ALL assert "Instrument(all: All values of this type are supported.)" in repr(Instrument.all) @pytest.mark.parametrize("wrong_name", [ ("not star",), ("*whoops",) ]) def test_single_pair_argument_attrs(wrong_name): # This checks that other single string entries fail. with pytest.raises(ValueError): attr.Attr.update_values({GenericClient: {Instrument: [wrong_name]}}) def test_asterisk_attrs_time(): # This checks we can submit * for time/wavelength (both are ranges) attr.Attr.update_values({GenericClient: {Time: [('*')]}}) assert "all All values of this type are supported." in repr(Time) def test_AttrComparison(): attr_comp = attr.AttrComparison("foo", "<", "bar") attr_wrapper = attr.ComparisonParamAttrWrapper("foo") < "bar" assert attr_comp == attr_wrapper attr_comp = attr.AttrComparison("foo", "<=", "bar") attr_wrapper = attr.ComparisonParamAttrWrapper("foo") <= "bar" assert attr_comp == attr_wrapper attr_comp = attr.AttrComparison("foo", ">", "bar") attr_wrapper = attr.ComparisonParamAttrWrapper("foo") > "bar" assert attr_comp == attr_wrapper attr_comp = attr.AttrComparison("foo", ">=", "bar") attr_wrapper = attr.ComparisonParamAttrWrapper("foo") >= "bar" assert attr_comp == attr_wrapper attr_comp = attr.AttrComparison("foo", "=", "bar") attr_wrapper = attr.ComparisonParamAttrWrapper("foo") == "bar" assert attr_comp == attr_wrapper attr_comp = attr.AttrComparison("foo", "!=", "bar") attr_wrapper = attr.ComparisonParamAttrWrapper("foo") != "bar" assert attr_comp == attr_wrapper ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/tests/test_attr_walker.py0000644000175100001710000000351600000000000020767 0ustar00vstsdockerimport pytest from sunpy.net import attr class SA1(attr.SimpleAttr): pass class SA2(attr.SimpleAttr): pass class SA3(SA2): pass class RA1(attr.Range): pass @pytest.fixture def walker(): return attr.AttrWalker() def test_creator(walker): CALLED = False @walker.add_creator(SA2) def new_creator(wlk, tree): nonlocal CALLED assert wlk is walker CALLED = True walker.create(SA2("Hello")) assert CALLED # Test that dispatch also works with subclasses CALLED = False walker.create(SA3("Hello")) assert CALLED def test_applier(walker): CALLED = False @walker.add_applier(SA2) def new_applier(wlk, tree): nonlocal CALLED assert wlk is walker CALLED = True walker.apply(SA2("Hello")) assert CALLED CALLED = False # Test that dispatch also works with subclasses walker.apply(SA3("Hello")) assert CALLED def test_creator_converter(walker): CALLED = False @walker.add_creator(SA1) def new_creator(wlk, tree): nonlocal CALLED assert wlk is walker CALLED = True with pytest.raises(TypeError): walker.create(RA1("Hello", "World")) assert not CALLED @walker.add_converter(RA1) def new_converter(arange): return SA1("CONVERTED") walker.create(RA1("Hello", "World")) assert CALLED def test_applier_converter(walker): CALLED = False @walker.add_applier(SA1) def new_applier(wlk, tree): nonlocal CALLED assert wlk is walker CALLED = True with pytest.raises(TypeError): walker.apply(RA1("Hello", "World")) assert not CALLED @walker.add_converter(RA1) def new_converter(arange): return SA1("CONVERTED") walker.apply(RA1("Hello", "World")) assert CALLED ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/tests/test_attrs.py0000644000175100001710000000073500000000000017605 0ustar00vstsdockerfrom sunpy.net import attr from sunpy.net import attrs as a from sunpy.time import parse_time def test_time_subclass(): class NewTime(a.Time): pass assert isinstance(NewTime("2020/01/01", "2020/01/02") & a.Time("2020/02/02", "2020/02/03"), attr.AttrAnd) def test_attrs_time(): times = a.Time("2020/10/01T00:00", "2020/10/01T00:00") times.start == parse_time("2020/10/01T00:00") times.end == parse_time("2020/10/01T00:00") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/tests/test_baseclient.py0000644000175100001710000000331300000000000020554 0ustar00vstsdockerimport re import pytest from sunpy.net import base_client, dataretriever, jsoc, vso from sunpy.net.base_client import QueryResponseTable, convert_row_to_table from sunpy.net.dataretriever.sources.norh import NoRHClient _REGEX = re.compile(r"Client") CLIENT_LIST = [] for a_import in [vso, jsoc, dataretriever]: for item in dir(a_import): if _REGEX.search(item): CLIENT_LIST.append(getattr(a_import, item)) CLIENT_LIST.remove(dataretriever.client.GenericClient) # We can access the registry directly CLIENT_NAMES = base_client.BaseClient._registry.keys() CLIENTS_REG = base_client.BaseClient._registry.items() @pytest.mark.parametrize("client", CLIENT_LIST) def test_registry(client): """ Check if each client has been registered. """ assert client in CLIENT_NAMES assert (client, client._can_handle_query) in CLIENTS_REG @pytest.fixture def dummy_response(): return QueryResponseTable([{'hello': 1}], client=NoRHClient()) def test_slice(dummy_response): assert len(dummy_response) == 1 row = dummy_response[0] table = row.as_table() assert len(table) == 1 assert isinstance(table.client, NoRHClient) col = dummy_response['hello'] table = col.as_table() assert len(table) == 1 assert isinstance(table.client, NoRHClient) def test_path_format_keys(dummy_response): assert dummy_response.path_format_keys() == {'hello'} def test_convert_row_to_table(dummy_response): @convert_row_to_table def example(self, query_results, **kwargs): return query_results assert example(None, dummy_response) is dummy_response # This is a single row table anyway assert example(None, dummy_response[0]) == dummy_response ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/tests/test_fido.py0000644000175100001710000003642200000000000017373 0ustar00vstsdockerimport os import pathlib from stat import S_IREAD, S_IRGRP, S_IROTH from unittest import mock import hypothesis.strategies as st import pytest from drms import DrmsQueryError from hypothesis import assume, given, settings from parfive import Results from parfive.utils import FailedDownload import astropy.units as u from sunpy import config from sunpy.net import Fido, attr from sunpy.net import attrs as a from sunpy.net import jsoc from sunpy.net.base_client import QueryResponseColumn, QueryResponseRow, QueryResponseTable from sunpy.net.dataretriever.client import QueryResponse from sunpy.net.dataretriever.sources.goes import XRSClient from sunpy.net.fido_factory import UnifiedResponse from sunpy.net.tests.strategies import goes_time, offline_instruments, online_instruments, srs_time, time_attr from sunpy.net.vso import VSOQueryResponseTable from sunpy.net.vso.vso import DownloadFailed from sunpy.tests.helpers import no_vso, skip_windows from sunpy.time import TimeRange, parse_time from sunpy.util.exceptions import SunpyUserWarning 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 == 'goes': query &= draw(goes_time()) else: query = attr.and_(query, draw(time_attr())) return query @st.composite def online_query(draw, instrument=online_instruments()): query = draw(instrument) if isinstance(query, a.Instrument) and query.value == 'eve': query &= a.Level.zero if isinstance(query, a.Instrument) and query.value == 'norh': query &= a.Wavelength(17*u.GHz) if isinstance(query, a.Instrument) and query.value == 'soon': query &= draw(srs_time()) return query @no_vso @settings(deadline=50000, max_examples=10) @given(offline_query()) def test_offline_fido(query): unifiedresp = Fido.search(query) check_response(query, unifiedresp) @pytest.mark.remote_data # Until we get more mocked, we can't really do this to online clients. # TODO: Hypothesis this again @pytest.mark.parametrize("query", [ (a.Instrument.eve & a.Time('2014/7/7', '2014/7/14') & a.Level.zero), (a.Instrument.rhessi & a.Time('2014/7/7', '2014/7/14')), (a.Instrument.norh & a.Time('2014/7/7', '2014/7/14') & a.Wavelength(17*u.GHz)), ]) 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: for res in block: assert query_instr.lower() == res['Instrument'].lower() @pytest.mark.remote_data def test_save_path(tmpdir): qr = Fido.search(a.Instrument.eve, a.Time("2016/10/01", "2016/10/02"), a.Level.zero) # Test when path is str files = Fido.fetch(qr, path=str(tmpdir / "{instrument}" / "{level}")) for f in files: assert str(tmpdir) in f assert f"EVE{os.path.sep}0" in f @pytest.mark.remote_data def test_save_path_pathlib(tmpdir): qr = Fido.search(a.Instrument.eve, a.Time("2016/10/01", "2016/10/02"), a.Level.zero) # Test when path is pathlib.Path target_dir = tmpdir.mkdir("down") path = pathlib.Path(target_dir, "{instrument}", "{level}") files = Fido.fetch(qr, path=path) for f in files: assert target_dir.strpath in f assert f"EVE{os.path.sep}0" in f @pytest.mark.remote_data def test_save_path_cwd(tmpdir): qr = Fido.search(a.Instrument.eve, a.Time("2016/10/01", "2016/10/02"), a.Level.zero) # Test when path is ./ for current working directory os.chdir(tmpdir) # move into temp directory files = Fido.fetch(qr, path="./") for f in files: assert pathlib.Path.cwd().joinpath(f).exists() """ 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.zero, 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) @pytest.mark.remote_data def test_no_match(): with pytest.raises(DrmsQueryError): Fido.search(a.Time("2016/10/01", "2016/10/02"), a.jsoc.Series("bob"), a.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) @pytest.mark.remote_data def test_fetch(): qr = Fido.search(a.Instrument.eve, a.Time("2016/10/01", "2016/10/02"), a.Level.zero) res = Fido.fetch(qr) assert isinstance(res, Results) """ UnifiedResponse Tests """ @pytest.mark.remote_data 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], QueryResponseTable) @pytest.mark.remote_data 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[::1]) assert isinstance(results[0, ::-1], QueryResponseTable) assert all(results[0][::-1] == results[0, ::-1]) @mock.patch("sunpy.net.vso.vso.build_client", return_value=True) def test_vso_unifiedresponse(mock_build_client): vrep = VSOQueryResponseTable() vrep.client = True uresp = UnifiedResponse(vrep) assert isinstance(uresp, UnifiedResponse) @pytest.mark.remote_data def test_responses(): results = Fido.search( a.Time("2012/1/1", "2012/1/5"), a.Instrument.lyra) for i, resp in enumerate(results): assert isinstance(resp, QueryResponse) assert i + 1 == len(results) @pytest.mark.remote_data def test_repr(): results = Fido.search( a.Time("2012/1/1", "2012/1/5"), a.Instrument.lyra) rep = repr(results) rep = rep.split('\n') # 8 header lines, the results table and two blank lines at the end assert len(rep) == 8 + len(list(results)[0]) + 2 def filter_queries(queries): return attr.and_(queries) not in queries @pytest.mark.remote_data def test_path(): results = Fido.search( a.Time("2012/1/1", "2012/1/5"), a.Instrument.lyra) Fido.fetch(results, path="notapath/{file}") @pytest.mark.remote_data @skip_windows def test_path_read_only(tmp_path): results = Fido.search( a.Time("2012/1/1", "2012/1/5"), a.Instrument.lyra) # chmod dosen't seem to work correctly on the windows CI os.chmod(tmp_path, S_IREAD | S_IRGRP | S_IROTH) # Check to see if it's actually read only before running the test if not os.access(tmp_path, os.W_OK): with pytest.raises(PermissionError): Fido.fetch(results, path=tmp_path / "{file}") @no_vso @settings(deadline=50000, max_examples=10) @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 isinstance(res[1:], UnifiedResponse) assert len(res[1:]) == 1 assert isinstance(res[0:1], UnifiedResponse) assert len(res[0:1]) == 1 assert isinstance(res[1:, 0], UnifiedResponse) assert len(res[1:, 0]) == 1 assert isinstance(res[0:1, 0], UnifiedResponse) assert len(res[0:1, 0]) == 1 assert isinstance(res[0][0], QueryResponseRow) assert isinstance(res[1][0], QueryResponseRow) assert isinstance(res[1, 0:1], QueryResponseTable) aa = res[0, 0] assert isinstance(aa, QueryResponseRow) aa = res[0, 'Instrument'] assert isinstance(aa, QueryResponseColumn) aa = res[:, 'Instrument'] assert isinstance(aa, UnifiedResponse) for table in aa: assert len(table.columns) == 1 aa = res[0, ('Instrument',)] assert isinstance(aa, QueryResponseTable) for table in aa: assert len(table.columns) == 1 aa = res[:, 0] assert isinstance(aa, UnifiedResponse) assert len(aa) == 2 assert len(aa[0]) == 1 aa = res[0, :] assert isinstance(aa, QueryResponseTable) aa = res[0, 1:] assert isinstance(aa, QueryResponseTable) if len(res.keys()) == len(res): aa = res[res.keys()[0], 1:] assert isinstance(aa, QueryResponseTable) aa = res[res.keys()[0], 'Instrument'] assert isinstance(aa, QueryResponseColumn) with pytest.raises(IndexError): res[0, 0, 0] with pytest.raises(IndexError): res["saldkal"] with pytest.raises(IndexError): res[1.0132] if isinstance(res, UnifiedResponse): assert len(res) != 1 @no_vso @settings(deadline=50000, max_examples=10) @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) @no_vso @settings(deadline=50000, max_examples=10) @given(offline_query()) def test_repr2(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() @mock.patch("parfive.Downloader.download", return_value=Results(["/tmp/test"])) def test_retry(mock_retry): """ Test that you can use Fido.fetch to retry failed downloads. """ res = Results() res.data.append("/this/worked.fits") err1 = FailedDownload("This is not a filename", "http://not.url/test", None) err2 = FailedDownload("This is not a filename2", "http://not.url/test2", None) res.errors.append(err1) res.errors.append(err2) mock_retry.return_value._errors += [err2] res2 = Fido.fetch(res, Results(["/this/also/worked.fits"])) assert res2 is not res # Assert that the result of retry ends up in the returned Results() object assert res2.data == ["/this/worked.fits", "/tmp/test", "/this/also/worked.fits", "/tmp/test"] assert res2.errors == [err2, err2] def results_generator(dl): http = dl.http_queue ftp = dl.ftp_queue # Handle compatibility with parfive 1.0 if not isinstance(dl.http_queue, list): http = list(dl.http_queue._queue) ftp = list(dl.ftp_queue._queue) outputs = [] for url in http + ftp: outputs.append(pathlib.Path(url.keywords['url'].split("/")[-1])) return Results(outputs) @pytest.mark.remote_data @mock.patch("sunpy.net.vso.VSOClient.download_all", return_value=Results([], errors=[DownloadFailed(None)])) @mock.patch("parfive.Downloader.download", new=results_generator) def test_vso_errors_with_second_client(mock_download_all): query = a.Time("2011/01/01", "2011/01/02") & (a.Instrument.goes | a.Instrument.eit) qr = Fido.search(query) res = Fido.fetch(qr) assert len(res.errors) == 1 assert len(res) != qr.file_num # Assert that all the XRSClient records are in the output. for resp in qr: if isinstance(resp, XRSClient): assert len(resp) == len(res) def test_downloader_type_error(): with pytest.raises(TypeError): Fido.fetch([], downloader=Results()) def test_mixed_retry_error(): with pytest.raises(TypeError): Fido.fetch([], Results()) @pytest.mark.remote_data @mock.patch("sunpy.net.dataretriever.sources.goes.XRSClient.fetch", return_value=["hello"]) def test_client_fetch_wrong_type(mock_fetch): query = a.Time("2011/01/01", "2011/01/02") & a.Instrument.goes qr = Fido.search(query) with pytest.raises(TypeError): Fido.fetch(qr) @pytest.mark.remote_data def test_vso_fetch_hmi(tmpdir): start_time = "2017-01-25" end_time = "2017-01-25T23:59:59" results = Fido.search(a.Time(start_time, end_time), a.Instrument.hmi & a.Physobs.los_magnetic_field, a.Sample(1 * u.minute)) files = Fido.fetch(results[0, 0], path=tmpdir) assert len(files) == 1 def test_fido_no_time(mocker): jsoc_mock = mocker.patch("sunpy.net.jsoc.JSOCClient.search") jsoc_mock.return_value = jsoc.JSOCResponse() Fido.search(a.jsoc.Series("test")) jsoc_mock.assert_called_once() @pytest.mark.remote_data def test_jsoc_missing_email(): res = Fido.search(a.Time("2011/01/01", "2011/01/01 00:01"), a.jsoc.Series.aia_lev1_euv_12s) with pytest.raises(ValueError, match=r"A registered email is required to get data from JSOC.*"): Fido.fetch(res) @pytest.mark.remote_data def test_slice_jsoc(): tstart = '2011/06/07 06:32:45' tend = '2011/06/07 06:33:15' res = Fido.search(a.Time(tstart, tend), a.jsoc.Series('hmi.M_45s'), a.jsoc.Notify('jsoc@cadair.com')) with pytest.warns(SunpyUserWarning, match="Downloading of sliced JSOC results is not supported."): Fido.fetch(res[0, 0]) def test_fido_repr(): output = repr(Fido) assert output[:50] == ' 1000) | a.jsoc.Series('hmi.m_45s') & a.jsoc.Notify("jsoc@cadair.com")) assert len(results['hek']) == 2 assert isinstance(results['hek'], UnifiedResponse) assert isinstance(results['hek'][0], QueryResponseTable) assert len(results['hek'][1]) == 2 assert results[::-1][0] is results['jsoc'] assert isinstance(results['jsoc'], QueryResponseTable) # Checks we can download the files form JSOC from this response. files = Fido.fetch(results) assert len(files) == len(results['jsoc']) assert results.keys() == ['hek', 'jsoc'] def test_path_format_keys(): t1 = QueryResponseTable({'Start Time': ['2011/01/01', '2011/01/02'], '!excite!': ['cat', 'rabbit'], '01 wibble': ['parsnip', 'door']}) assert t1.path_format_keys() == {'start_time', '_excite_', '01_wibble'} t2 = QueryResponseTable({'End Time': ['2011/01/01', '2011/01/02'], '!excite!': ['cat', 'rabbit']}) assert t2.path_format_keys() == {'_excite_', 'end_time'} unif = UnifiedResponse(t1, t2) assert unif.path_format_keys() == {'_excite_'} ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/tests/test_helioviewer.py0000644000175100001710000001346200000000000020773 0ustar00vstsdocker""" Helioviewer Client tests """ import os import urllib from collections import OrderedDict import pytest import sunpy import sunpy.map from sunpy.net.helioviewer import HelioviewerClient from sunpy.tests.helpers import figure_test, skip_glymur @pytest.fixture(scope="function") @pytest.mark.remote_data 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: pytest.skip("There was a HTTP error {} {} for " "HelioViewer.".format(e.code, e.args)) @pytest.mark.remote_data def test_get_datasources(client): """ Tests get_data_sources and data_sources and that they match. """ assert isinstance(client.data_sources, OrderedDict) assert isinstance(client.sources, dict) # Rough check that the ordered dict is ordered assert list(client.data_sources.values())[0:3] == [0, 1, 2] aia_4500_id = client.data_sources['SDO', 'AIA', None, '4500'] aia_4500_id_copy = client.sources['SDO']['AIA']['4500']['sourceId'] assert isinstance(aia_4500_id, int) assert isinstance(aia_4500_id_copy, int) assert aia_4500_id == aia_4500_id_copy @pytest.mark.remote_data def test_keyvalue_all(client): """ Checks that we raise the correct error for these functions. """ with pytest.raises(KeyError): client.get_closest_image("2012/01/01") with pytest.raises(KeyError): client.download_jp2("2012/01/01") @pytest.mark.remote_data def test_get_closest_image(client): """Tests getClosestImage API method""" if client._api != "https://api.helioviewer.org": pytest.skip("Only works with helioviewer.org") image_meta = client.get_closest_image('1994/01/01', observatory='SOHO', instrument='EIT', measurement='304') assert isinstance(image_meta, dict) assert image_meta['id'] == "1795504" assert image_meta['width'] == image_meta['height'] == 1024 assert image_meta['height'] == image_meta['height'] == 1024 assert image_meta['name'] == 'EIT 304' source_id = client.data_sources['SOHO', 'EIT', None, '304'] image_meta_id = client.get_closest_image('1994/01/01', source_id=source_id) assert image_meta == image_meta_id @pytest.mark.remote_data def test_download_jp2(client): """ Tests getJP2Image API method. """ filepath = client.download_jp2('2012/01/01', observatory='SOHO', instrument='MDI', measurement='continuum') assert "2011_01_11__22_39_00_000__SOHO_MDI_MDI_continuum.jp2" in filepath os.remove(filepath) @pytest.mark.remote_data def test_get_jp2_header(client): """ Tests getJP2Header API method """ if client._api != "https://api.helioviewer.org": pytest.skip("Only works with helioviewer.org") header1 = client.get_jp2_header('1994/01/01', observatory='SOHO', instrument='EIT', measurement='304') header2 = client.get_jp2_header('1994/01/01', jp2_id=1795504) assert header1 == header2 assert len(header1) == len(header2) == 1 assert ('fits' in header1.keys()) and ('fits' in header2.keys()) @skip_glymur @figure_test @pytest.mark.remote_data @pytest.mark.filterwarnings("ignore::sunpy.util.SunpyMetadataWarning") def test_download_jp2_map(client, tmp_path): """ Tests getJP2Image API method with Map with a figure test. """ filepath = client.download_jp2('2012/01/01', observatory='SOHO', instrument='MDI', measurement='continuum', directory=tmp_path) sunpy.map.Map(filepath).plot() @pytest.mark.remote_data def test_download_directory_not_exist_all(client, tmpdir): """ Tests for missing directory. """ fake_dir = os.path.join(str(tmpdir), 'directorynotexist') filepath = client.download_jp2('2020/01/01', observatory='SOHO', instrument='MDI', measurement='continuum', directory=fake_dir) assert 'directorynotexist' in filepath os.remove(filepath) fake_dir = os.path.join(str(tmpdir), 'directorynotexist_2') filepath = client.download_png('2020/01/01', 2.4, "[SOHO,MDI,continuum,1,100]", directory=fake_dir) assert 'directorynotexist_2' in filepath os.remove(filepath) @pytest.mark.remote_data def test_overwrite_jp2(client): """ Tests for that overwrites, overwrites jp2 edition. """ filepath = client.download_jp2('2020/01/01', observatory='SOHO', instrument='MDI', measurement='continuum', overwrite=False) filepath_2 = client.download_jp2('2020/01/01', observatory='SOHO', instrument='MDI', measurement='continuum', overwrite=False) assert filepath_2 == filepath filepath_3 = client.download_jp2('2020/01/01', observatory='SOHO', instrument='MDI', measurement='continuum', overwrite=True) assert filepath_3 == filepath @pytest.mark.remote_data def test_overwrite_png(client): """ Tests for that overwrites, overwrites png edition. """ filepath = client.download_png('2020/01/01', 2.4, "[SOHO,MDI,continuum,1,100]", overwrite=False) filepath_2 = client.download_png('2020/01/01', 2.4, "[SOHO,MDI,continuum,1,100]", overwrite=False) assert filepath_2 is not filepath filepath_3 = client.download_png('2020/01/01', 2.4, "[SOHO,MDI,continuum,1,100]", overwrite=True) assert filepath_3 == filepath ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/tests/test_scraper.py0000644000175100001710000002657000000000000020114 0ustar00vstsdockerimport datetime from unittest.mock import Mock, patch import pytest from dateutil.relativedelta import relativedelta from sunpy.data.test import rootdir from sunpy.net.scraper import Scraper, get_timerange_from_exdict from sunpy.time import TimeRange, parse_time PATTERN_EXAMPLES = [ ('%b%y', relativedelta(months=1)), ('%m%y', relativedelta(months=1)), ('%H%d', relativedelta(hours=1)), ('%y%b', relativedelta(months=1)), ] 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 = parse_time((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 = parse_time((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 = parse_time((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 testDirectoryRegex(): # Test for Windows where '\' is a path separator and not part of the regex s = Scraper('scheme://a.url.with/a/few/forward/slashes/andbacklash\\inthename.ext', regex=True) timerange = TimeRange('2019-02-01', '2019-02-03') directory = s.range(timerange) assert directory == ['scheme://a.url.with/a/few/forward/slashes/'] 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 = parse_time((2010, 10, 10, 5, 0)) enddate = parse_time((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 = parse_time((2008, 2, 20, 10)) enddate = parse_time((2008, 3, 2, 5)) timerange = TimeRange(startdate, enddate) assert len(s.range(timerange)) == 12 startdate = parse_time((2009, 2, 20, 10)) enddate = parse_time((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 = parse_time((2010, 1, 10, 20, 30)) enddate = parse_time((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 = parse_time((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 = parse_time((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 = parse_time((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 = parse_time((2014, 6, 14, 20, 1, 35)) assert s._extractDateURL(testURL) == timeURL testURL = 'data/2014/JunMay14_200135' timeURL = parse_time((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 = parse_time((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') def testURL_patternMillisecondsGeneric(): s = Scraper('fd_%Y%m%d_%H%M%S_%e.fts') 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') def testURL_patternMillisecondsZeroPadded(): # Asserts solution to ticket #1954. # Milliseconds must be zero-padded in order to match URL lengths. now_mock = Mock(return_value=datetime.datetime(2019, 4, 19, 0, 0, 0, 4009)) with patch('sunpy.net.scraper.datetime', now=now_mock): s = Scraper('fd_%Y%m%d_%H%M%S_%e.fts') now_mock.assert_called_once() assert s.now == 'fd_20190419_000000_004.fts' def testFilesRange_sameDirectory_local(): s = Scraper('/'.join(['file:/', str(rootdir), 'EIT', 'efz%Y%m%d.%H%M%S_s.fits'])) startdate = parse_time((2004, 3, 1, 4, 0)) enddate = parse_time((2004, 3, 1, 6, 30)) assert len(s.filelist(TimeRange(startdate, enddate))) == 3 startdate = parse_time((2010, 1, 10, 20, 30)) enddate = parse_time((2010, 1, 20, 20, 30)) assert len(s.filelist(TimeRange(startdate, enddate))) == 0 @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 = parse_time((2014, 5, 14, 0, 0)) enddate = parse_time((2014, 5, 14, 6, 30)) timerange = TimeRange(startdate, enddate) assert len(s.filelist(timerange)) == 2 startdate = parse_time((2014, 5, 14, 21, 0)) enddate = parse_time((2014, 5, 14, 23, 30)) timerange = TimeRange(startdate, enddate) assert len(s.filelist(timerange)) == 0 @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 = parse_time((2007, 8, 1)) enddate = parse_time((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') urls = s.filelist(timerange) assert urls[0] == ('ftp://solar-pub.nao.ac.jp' '/pub/nsro/norh/data/tcx/2016/05/tca160519') assert len(urls) == 2 @pytest.mark.remote_data def test_filelist_url_missing_directory(): # Asserts solution to ticket #2684. # Attempting to access data for the year 1960 results in a 404, so no files are returned. pattern = 'http://lasp.colorado.edu/eve/data_access/evewebdataproducts/level2/%Y/%j/' s = Scraper(pattern) timerange = TimeRange('1960/01/01 00:00:00', '1960/01/02 00:00:00') assert len(s.filelist(timerange)) == 0 @pytest.mark.remote_data def test_filelist_relative_hrefs(): # the url opened by the scraper from below pattern contains some links which don't have hrefs pattern = 'http://www.bbso.njit.edu/pub/archive/%Y/%m/%d/bbso_halph_fr_%Y%m%d_%H%M%S.fts' s = Scraper(pattern) timerange = TimeRange('2016/5/18 15:28:00', '2016/5/18 16:30:00') assert s.domain == 'http://www.bbso.njit.edu/' # hrefs are relative to domain here, not to the directory they are present in # this checks that `scraper.filelist` returns fileurls relative to the domain fileurls = s.filelist(timerange) assert fileurls[1] == s.domain + 'pub/archive/2016/05/18/bbso_halph_fr_20160518_160033.fts' @pytest.mark.parametrize('pattern, check_file', [ (r'MyFile_%Y_%M_%e\.(\D){2}\.fits', 'MyFile_2020_55_234.aa.fits'), (r'(\d){5}_(\d){2}\.fts', '01122_25.fts'), (r'_%Y%m%d__%ec(\d){5}_(\d){2}\s.fts', '_20201535__012c12345_33 .fts')]) def test_regex(pattern, check_file): s = Scraper(pattern, regex=True) assert s._URL_followsPattern(check_file) @pytest.mark.remote_data def test_regex_data(): prefix = r'https://gong2.nso.edu/oQR/zqs/' pattern = prefix + r'%Y%m/mrzqs%y%m%d/mrzqs%y%m%dt%H%Mc(\d){4}_(\d){3}\.fits.gz' s = Scraper(pattern, regex=True) timerange = TimeRange('2020-01-05', '2020-01-06T16:00:00') assert s._URL_followsPattern(prefix + '202001/mrzqs200106/mrzqs200106t1514c2226_297.fits.gz') assert len(s.filelist(timerange)) == 37 @pytest.mark.remote_data def test_extract_files_meta(): baseurl0 = r'ftp://solar-pub.nao.ac.jp/pub/nsro/norh/data/tcx/%Y/%m/(\w){3}%y%m%d' extractpattern0 = '{}/tcx/{year:4d}/{month:2d}/{wave}{:4d}{day:2d}' s0 = Scraper(baseurl0, regex=True) timerange0 = TimeRange('2020/1/1 4:00', '2020/1/2') matchdict = {'wave': ['tca', 'tcz']} metalist0 = s0._extract_files_meta(timerange0, extractpattern0, matcher=matchdict) assert metalist0[0]['wave'] == 'tca' assert metalist0[3]['wave'] == 'tcz' assert metalist0[1]['day'] == 2 prefix = r'https://gong2.nso.edu/oQR/zqs/' baseurl1 = prefix + r'%Y%m/mrzqs%y%m%d/mrzqs%y%m%dt%H%Mc(\d){4}_(\d){3}\.fits.gz' extractpattern1 = ('{}/zqs/{year:4d}{month:2d}/mrzqs{:4d}{day:2d}/mrzqs{:6d}t' '{hour:2d}{minute:2d}c{CAR_ROT:4d}_{:3d}.fits.gz') s1 = Scraper(baseurl1, regex=True) timerange1 = TimeRange('2020-01-05', '2020-01-05T16:00:00') metalist1 = s1._extract_files_meta(timerange1, extractpattern1) urls = s1.filelist(timerange1) assert metalist1[3]['CAR_ROT'] == 2226 assert metalist1[-1]['url'] == urls[-1] @pytest.mark.parametrize('exdict, start, end', [ ({"year": 2000}, '2000-01-01 00:00:00', '2000-12-31 23:59:59.999000'), ({"year": 2016, "month": 2}, '2016-02-01 00:00:00', '2016-02-29 23:59:59.999000'), ({'year': 2019, 'month': 2, 'day': 28}, '2019-02-28 00:00:00', '2019-02-28 23:59:59.999000'), ({'year': 2020, 'month': 7, 'day': 31, 'hour': 23, 'minute': 59, 'second': 59}, '2020-07-31 23:59:59', '2020-07-31 23:59:59.999000')]) def test_get_timerange_with_extractor(exdict, start, end): tr = TimeRange(start, end) file_timerange = get_timerange_from_exdict(exdict) assert file_timerange == tr ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6492753 sunpy-3.1.5/sunpy/net/vso/0000755000175100001710000000000000000000000014477 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/vso/__init__.py0000644000175100001710000000030700000000000016610 0ustar00vstsdocker# for exposure to from sunpy.net.vso import * from sunpy.net.vso.table_response import VSOQueryResponseTable from sunpy.net.vso.vso import VSOClient __all__ = ['VSOClient', 'VSOQueryResponseTable'] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/vso/attrs.py0000644000175100001710000001403500000000000016211 0ustar00vstsdocker# Author: Florian Mayer # # This module was developed with funding provided by # the ESA Summer of Code (2011). # """ 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 sunpy.net import _attrs from sunpy.net import attr as _attr __all__ = ['Extent', 'Field', 'Pixels', 'Filter', 'Quicklook', 'PScale'] # Define a custom __dir__ to restrict tab-completion to __all__ def __dir__(): return __all__ _TIMEFORMAT = '%Y%m%d%H%M%S' class Field(_attr.ValueAttr): """ A subclass of the value attribute. Used in defining a decorator for the dummy attribute. """ def __init__(self, fielditem): _attr.ValueAttr.__init__(self, { ('field', 'fielditem'): fielditem }) class Extent(_attr.DataAttr): """ Specify the spatial field-of-view of the query. Due to a bug in the VSO, the Extent attribute is not used. """ def __init__(self, x, y, width, length, atype): super().__init__() 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 Pixels(_attr.SimpleAttr): """ 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. """ class PScale(_attr.SimpleAttr): """ Pixel Scale (PSCALE) is in arc seconds. Parameters ---------- value : float or str 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. """ class Quicklook(_attr.SimpleAttr): """ Retrieve 'quicklook' data if available. Parameters ---------- value : bool 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().__init__(value) if self.value: self.value = 1 else: self.value = 0 class Filter(_attr.SimpleAttr): """ This attribute is a placeholder for the future. Parameters ---------- value : str """ # The walker specifies how the Attr-tree is converted to a query the # server can handle. _walker = _attr.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(_attr.ValueAttr, _attr.AttrAnd) def _create(wlk, root, api): """ Implementation detail. """ api.set_ns_prefix('VSO', 'http://virtualsolar.org/VSO/VSOi') value = api.get_type('VSO:QueryRequestBlock')() wlk.apply(root, api, value) return [value] @_walker.add_applier(_attr.ValueAttr) def _apply(wlk, root, api, block): """ Implementation detail. """ for k, v in root.attrs.items(): name = k[0] subkey = k[1:] if subkey: if len(subkey) != 1: raise ValueError("Can't parse double nested ValueAttr") subkey = subkey[0] if block[name]: block[name].update({subkey: v}) else: block[name] = {subkey: v} else: block[name] = v @_walker.add_applier(_attr.AttrAnd) def _apply(wlk, root, api, queryblock): """ Implementation detail. """ for attr in root.attrs: wlk.apply(attr, api, queryblock) @_walker.add_creator(_attr.AttrOr) 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: _attr.ValueAttr( {('extent', k): v for k, v in vars(x).items()} ) ) _walker.add_converter(_attrs.Time)( lambda x: _attr.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(_attr.SimpleAttr)( lambda x: _attr.ValueAttr({(x.__class__.__name__.lower(), ): x.value}) ) _walker.add_converter(_attrs.Wavelength)( lambda x: _attr.ValueAttr({ ('wave', 'wavemin'): x.min.value, ('wave', 'wavemax'): x.max.value, ('wave', 'waveunit'): x.unit.name, }) ) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6492753 sunpy-3.1.5/sunpy/net/vso/data/0000755000175100001710000000000000000000000015410 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/vso/data/__init__.py0000644000175100001710000000000000000000000017507 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/vso/data/attrs.json0000644000175100001710000004537500000000000017456 0ustar00vstsdocker{ "detector": [ [ "BFI", "None" ], [ "CTOF", "Charge Time Of Flight mass spectrometer" ], [ "HI1", "Heliospheric Imager 1" ], [ "+Z-Z", "" ], [ "FSI-174", "None" ], [ "SHORTWAVE-LOBE", "None" ], [ "RSC", "" ], [ "Paper", "Daily Sunspot Drawings" ], [ "TM-1010", "None" ], [ "TM4200-2", "None" ], [ "MODULE2", "7-shell Si detector (flight #1), 7-shell Si detector with collimator (flight #3)" ], [ "Hi-C21", "High Resolution Coronal Imager 2.1" ], [ "L1", "Coronado solar telescope L1" ], [ "C1", "Coronograph 1" ], [ "INNER", "None" ], [ "HI2", "Heliospheric Imager 2" ], [ "WAP", "Wide Angle Partition" ], [ "SPM", "" ], [ "NFI", "None" ], [ "C2", "Coronograph 2" ], [ "MEGS-P", "Multiple EUV Grating Spectrograph-Photometer" ], [ "VAULT-2002", "None" ], [ "DIARAD", "Differential Absolute Radiometer" ], [ "MODULE6", "7-shell Si detector (flight #1), 10-shell Si detector (flights #2 & 3)" ], [ "MODULE1", "7-shell Si detector (flights #1 & 2)" ], [ "OVI", "" ], [ "LONGWAVE-SLIT", "None" ], [ "PMOD", "Physikalisch-Meteorologisches Observatorium Davos" ], [ "MEGS-A", "Multiple EUV Grating Spectrograph-A" ], [ "NUV", "None" ], [ "HED", "High Energy Detector" ], [ "COR2", "Coronograph 2" ], [ "VAULT-1999", "None" ], [ "Kodak_KAF-09000", "INAF-OACT H\u03b1 and Continuum Detector" ], [ "LOI", "" ], [ "L2", "Coronado solar telescope L2" ], [ "VAULT-2014", "None" ], [ "MEGS-B", "Multiple EUV Grating Spectrograph-B" ], [ "NB", "None" ], [ "LONGWAVE-LOBE", "None" ], [ "MEES", "None" ], [ "HET", "High Energy Telescope" ], [ "MODULE3", "7-shell Si detector (flight 1), 7-shell CdTe detector (flights 2 & 3)" ], [ "X123", "None" ], [ "SIT", "Suprathermal Ion Telescope" ], [ "FG", "None" ], [ "LFR", "None" ], [ "SWS", "Solar Wind Sector" ], [ "Fsmain", "" ], [ "LED", "Low Energy Detector" ], [ "WB", "None" ], [ "MODULE0", "7-shell Si detector (flights #1 & 2), 10-shell Si detector (flight #3)" ], [ "FILM", "None" ], [ "MDI", "Michelson Doppler Imager" ], [ "GIS", "Grazing Incidence Spectrometer" ], [ "Fairchild 2020 scientific CMOS sensor", "None" ], [ "SEM", "None" ], [ "LVA", "None" ], [ "TM4200-6", "None" ], [ "MODULE5", "7-shell Si detector (flights #1 & 2), 10-shell CdTe detector (flight #3)" ], [ "+Z", "" ], [ "VLD", "" ], [ "HFR", "High Freqency Receiver" ], [ "ESP", "EUV SpectroPhotometers" ], [ "B", "" ], [ "EIT", "Extreme ultraviolet Imaging Telescope" ], [ "EUVI", "Extreme Ultraviolet Imager" ], [ "TM-1001", "None" ], [ "RHESSI", "None" ], [ "HRI_EUV", "None" ], [ "SP", "None" ], [ "HSTOF", "" ], [ "SEPT", "Solar Electron Proton Telescope" ], [ "FSI-304", "None" ], [ "TM4200-5", "None" ], [ "KODALITH Ortho 3 Graphical Film", "None" ], [ "MTOF", "Mass Time of Flight instrument" ], [ "MODULE4", "7-shell Si detector (flights #1 & 2), 10-shell Si detector (flight #3)" ], [ "LET", "Low Energy Telescope" ], [ "EIS", "None" ], [ "STE", "Suprathermal Electron Telescope" ], [ "Hi-C", "High Resolution Coronal Imager" ], [ "SHORTWAVE-SLIT", "None" ], [ "MAG", "Magnetometer" ], [ "LION", "Low Energy Ion and Electron Instrument" ], [ "FUV", "None" ], [ "SWEA", "Solar Wind Electron Analyzer" ], [ "A", "" ], [ "SWAP", "None" ], [ "EPHIN", "Electron Proton Helium Instrument" ], [ "-Z", "" ], [ "OUTER", "None" ], [ "SJI", "Slit-Jaw Imager" ], [ "STOF", "Suprathermal Time Of Flight" ], [ "PM", "MTOF Proton Monitor" ], [ "PHOENIX", "7-shell detector with collimator" ], [ "C3", "Coronograph 3" ], [ "HRI_LYA", "None" ], [ "COR1", "Coronograph 1" ] ], "instrument": [ [ "WISPR", "Wide-Field Imager for Solar Probe Plus" ], [ "BCS", "Bragg Crystal Spectrometer" ], [ "512-channel magnetograph", "512-channel Magnetograph" ], [ "TM-1010", "Kanzelh\u00f6he H\u03b1 Pulnix TM-1010 Camera" ], [ "Cerro Tololo", "Cerro Tololo, Chile GONG+ site" ], [ "Hi-C21", "High Resolution Coronal Imager 2.1 (172 A)" ], [ "CAII", "Kanzelh\u00f6he Ca II k Instrument" ], [ "ISS", "None" ], [ "PHOKA", "Kanzelh\u00f6he Photoheliograph" ], [ "ChroTel", "Chromospheric Telescope" ], [ "SWAN", "Solar Wind Anisotropies" ], [ "SHORTWAVE-LOBE-06", "Shortwave EUV observation of Sun with EUNIS (2006 flight)" ], [ "LASCO", "Large Angle and Spectrometric Coronagraph" ], [ "VAULT-2002", "Very High Angular Resolution Ultraviolet Telescope (2002 flight)" ], [ "solar fts spectrometer", "Solar FTS Spectrometer" ], [ "LONGWAVE-LOBE-07", "Full longwave EUV observation of Sun with EUNIS (2007 flight)" ], [ "ISOON", "Improved Solar Observing Optical Network" ], [ "60-ft SHG", "60-foot Tower Spectroheliograph" ], [ "HMI", "Helioseismic and Magnetic Imager" ], [ "Cooke", "None" ], [ "PTMC", "None" ], [ "SHORTWAVE-LOBE-07", "Shortwave EUV observation of Sun with EUNIS (2007 flight)" ], [ "LONGWAVE-SLIT-07", "Full longwave EUV observation of Sun with EUNIS (trimmed/2007 flight)" ], [ "VIRGO", "Variability of Solar Irradiance and Gravity Oscillations" ], [ "VAULT-1999", "Very High Angular Resolution Ultraviolet Telescope (1999 flight)" ], [ "HXT", "Hard X-Ray Telescope" ], [ "EVE", "Extreme Ultraviolet Variability Experiment" ], [ "spectromagnetograph", "SpectroMagnetograph" ], [ "VAULT-2014", "Very High Angular Resolution Ultraviolet Telescope (2014 flight)" ], [ "IVM", "None" ], [ "vsm", "Vector SpecroMagnetograph" ], [ "SECCHI", "Sun Earth Connection Coronal and Heliospheric Investigation" ], [ "EUI", "Extreme Ultravoilet Imager" ], [ "CLIMSO", "Christian Latouche IMageur SOlaire" ], [ "MERGED GONG", "None" ], [ "LONGWAVE-SLIT-06", "Full longwave EUV observation of Sun with EUNIS (trimmed/2006 flight)" ], [ "MEES", "Mees Solar Observatory Imaging Spectrograph on Haleakala, Maui" ], [ "X123", "X123 SXR Spectometer" ], [ "SHORTWAVE-SLIT-07", "Shortwave EUV observation of Sun with EUNIS (trimmed/2007 flight)" ], [ "Udaipur", "Indian GONG+ site" ], [ "SUVI", "GOES-R Series Solar Ultraviolet Imager " ], [ "LONGWAVE-LOBE-06", "Full longwave EUV observation of Sun with EUNIS (2006 flight)" ], [ "AIA", "Atmospheric Imaging Assembly" ], [ "ERNE", "Energetic and Relativistic Nuclei and Electron experiment" ], [ "PLASTIC", "PLasma And SupraThermal Ion Composition" ], [ "FILM", "Kanzelh\u00f6he H\u03b1 Film Camera" ], [ "MDI", "Michelson Doppler Imager" ], [ "IRIS", "Interface Region Imaging Spectrograph" ], [ "GOLF", "Global Oscillations at Low Frequencies" ], [ "SJ", "Slit-Jaw" ], [ "HXECLIPSE", "UCAR HAO Historical Eclipse Archive" ], [ "Meudon Spectroheliograph", "None" ], [ "TRACE", "Transition Region And Coronal Explorer" ], [ "BE-Halpha", "INAF-OACT Barra Equatoriale H\u03b1 Instrument" ], [ "UVCS", "Ultraviolet Coronagraph Spectrometer" ], [ "SXT", "Soft X-Ray Telescope" ], [ "Big Bear", "Big Bear Solar Observatory, California TON and GONG+ sites" ], [ "EIT", "Extreme ultraviolet Imaging Telescope" ], [ "TM-1001", "Kanzelh\u00f6he H\u03b1 Pulnix TM-1001 Camera" ], [ "SP1", "Spectropolarimeter1" ], [ "RHESSI", "Reuven Ramaty High Energy Solar Spectroscopic Imager" ], [ "BE-Continuum", "INAF-OACT Barra Equatoriale Continuum Instrument" ], [ "SOT", "Solar Optical Telescope" ], [ "El Teide", "Canary Islands GONG+ site" ], [ "SUMER", "Solar Ultraviolet Measurements of Emitted Radiation" ], [ "IMPACT", "In-situ Measurements of Particles and CME Transients" ], [ "Mauna Loa", "Hawai'ian GONG+ site" ], [ "SHORTWAVE-SLIT-06", "Shortwave EUV observation of Sun with EUNIS (trimmed/2006 flight)" ], [ "EIS", "EUV Imaging Spectrometer" ], [ "CDS", "Coronal Diagnostic Spectrometer" ], [ "SWAVES", "STEREO/WAVES" ], [ "Hi-C", "High Resolution Coronal Imager (193 A)" ], [ "CELIAS", "Charge, Element, and Isotope Analysis System" ], [ "FOXSI", "Focusing Optics X-ray Solar Imager" ], [ "SWAP", "Sun Watcher using Active pixel system detector and image Processing" ], [ "HA2", "Kanzelh\u00f6he H\u03b1 Patrol Instrument" ], [ "SP2", "Spectropolarimeter2" ], [ "cp", " Coronagraph/Polarimeter" ], [ "PHOENIX", "PHOENIX detector on flight #3 of FOXSI" ], [ "spectroheliograph", "SpectroHeliograph" ], [ "COSTEP", "Comprehensive Suprathermal and Energetic Particle Analyzer" ], [ "KPDC", "Kanzelh\u00f6he Photosphere Digital Camera" ], [ "WBS", "Wide Band Spectrometer" ], [ "Learmonth", "Australian GONG+ site" ] ], "level": [ [ "3", "3" ], [ "0C", "0C" ], [ "2", "2" ], [ "1b", "1b" ], [ "1", "1" ], [ "1.5", "1.5" ], [ "1.0", "1.0" ], [ "0D", "0D" ] ], "physobs": [ [ "number_density", "the number of particles per unit volume" ], [ "LOS_velocity", "the displacement of line center from rest wavelength/frequency in an arbitrary polarization state" ], [ "wave_power", "solar internal or atmospheric acoustic-gravity wave measurements. The mode parameters could include frequencies, splittings, amplitudes, widths, etc." ], [ "LOS_magnetic_field", "Line of sight magnetic field; may be in situ or inferred from the frequency/wavelength Zeeman splitting between opposite circular polarizations of a magnetically-sensitive line" ], [ "composition", "a notion of relative abundance, such as relative number densities of solar wind particles as a ratio" ], [ "equivalent_width", "differences between intensities measured at nearby wavelengths, typically in line cores, wings, and nearby continuum, whether measured as an intensity difference or an equivalent width" ], [ "VECTOR_magnetic_field", "Vector magnetic field; may be in situ or inferred from Stokes polarimetry" ], [ "polarization_vector", "the net linear polarization" ], [ "spectrum", "None" ], [ "particle_velocity", "the average velocity or velocity distribution of a group of particles" ], [ "Stokes_parameters", "I, Q, U, V - equivalent to observables of total intensity, linear polarization, and circular polarization" ], [ "vector_magnetic_field", "Vector magnetic field; may be in situ or inferred from Stokes polarimetry" ], [ "thermal_velocity", "a characterization of the relationship between the temperature and mass of a distribution of particles" ], [ "irradiance", "intensity per unit area." ], [ "particle_flux", "the number of particles passing through a unit area per unit time per unit energy" ], [ "intensity", "the direct intensity, either integrated over the spectral observing range or as a function of wavelength (spectral density)" ], [ "Intensity", "the direct intensity, either integrated over the spectral observing range or as a function of wavelength (spectral density)" ] ], "provider": [ [ "NSO", "National Solar Observatory" ], [ "KIS", "Kiepenheuer-Institut f\u00fcr Sonnenphysik" ], [ "ROB", "Royal Observatory of Belgium Solar Influences Data Center" ], [ "SSC", "STEREO Science Center, NASA/Goddard" ], [ "SDAC", "Solar Data Analysis Center, NASA/Goddard" ], [ "JSOC", "SDO Joint Science Operations Center" ], [ "MSFC", "Marshall Space Flight Center" ], [ "HAO", "High Altitude Observatory, NCAR" ], [ "SHA", "Stanford Helioseismology Archive, Stanford U." ], [ "OMP", "Observatoire Midi-Pyr\u00e9n\u00e9es" ], [ "LASP", "Laboratory for Atmospheric and Space Physics (University of Colorado at Boulder)" ], [ "LSSP", "Laboratory for Space and Solar Physics, NASA/Goddard" ], [ "KSO", "Kanzelh\u00f6he Solar Observatory" ], [ "NRL", "U.S. Naval Research Laboratory" ], [ "MWSPADP", "Mount Wilson Solar Archive Digitization Project" ], [ "INAF-OACT", "Istituto Nazionale di Astrofisica, Osservatorio Astrofisico di Catania" ], [ "OBSPM", "D\u00e9partement d'Astronomie Solaire de l'Observatoire de Paris" ], [ "NOAA", "None" ], [ "MSU", "Montana State University" ], [ "LMSAL", "Lockheed-Martin Solar and Astrophysics Laboratory" ], [ "NWRA", "Northwest Research Associates" ] ], "source": [ [ "GOES16", "Geostationary Operational Environmental Satellite (GOES-R) Series 16" ], [ "VAULT", "Upgraded Very High Angular Resolution Ultraviolet Telescope (VAULT2.0)" ], [ "GOES17", "Geostationary Operational Environmental Satellite (GOES-R) Series 17 " ], [ "MINXSS1", "Miniature X-Ray Solar Spectrometer Cubesat #1" ], [ "STEREO", "None" ], [ "SMM", "Solar Maximum Mission" ], [ "Hi-C21", "High Resolution Coronal Imager Experimental Rocket 3rd Flight" ], [ "SOHO", "Solar and Heliospheric Observatory" ], [ "Hinode", "Hinode Satellite, Japan" ], [ "HXECLIPSE", "UCAR HAO Historical Eclipse Archive" ], [ "GONG", "Global Oscillations Network Group" ], [ "Evans", "Evans Solar Telescope, Sacramento Peak" ], [ "ChroTel", "Chromospheric Telescope, Observatorio del Teide, Tenerife, Canary Islands" ], [ "McMath", "McMath Solar Telescope, Kitt Peak" ], [ "TRACE", "Transition Region And Coronal Explorer" ], [ "FOXSI1", "Focusing Optics X-ray Solar Imager (flight #1: 11/02/12)" ], [ "EUNIS2", "None" ], [ "EUNIS", "Extreme Ultraviolet Normal-incidence Spectrograph" ], [ "KSO", "Kanzelh\u00f6he Solar Observatory, Karl-Franzens-Universit\u00e4t, Graz, Austria" ], [ "SOLIS", "Synoptic Optical Long-term Investigations of the Sun" ], [ "RHESSI", "Reuven Ramaty High Energy Solar Spectroscopic Imager" ], [ "ISOON", "Improved Solar Observing Optical Network" ], [ "PSP", "Parker Solar Probe" ], [ "KPVT", "Kitt Peak Vacuum Tower Telescope" ], [ "PTMC", "None" ], [ "FOXSI2", "Focusing Optics X-ray Solar Imager (flight #2: 12/11/14)" ], [ "OACT", "Osservatorio Astrofisico di Catania, Via S.Sofia 78, 95123 Catania ITALY" ], [ "Hi-C", "High Resolution Coronal Imager Experimental Rocket" ], [ "IVM", "None" ], [ "FOXSI3", "Focusing Optics X-ray Solar Imager (flight #3: 09/07/18)" ], [ "CLASP2", "Chromospheric LAyer SpectroPolarimeter 2" ], [ "OMP", "Pic-du-Midi, France" ], [ "MCCD", "Mees CCD Imaging Spectrograph" ], [ "SDO", "Solar Dynamics Observatory" ], [ "OBSPM", "D\u00e9partement d'Astronomie Solaire de l'Observatoire de Paris, Paris, France" ], [ "YOHKOH", "Yohkoh Satellite, Japan" ], [ "SO", "Solar Orbiter" ], [ "MtWilson", "Mt Wilson Solar Observatory" ], [ "IRIS", "Interface Region Imaging Spectrograph" ], [ "PROBA2", "PRoject for Onboard Autonomy" ] ] } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/vso/exceptions.py0000644000175100001710000000062000000000000017230 0ustar00vstsdockerclass NoData(Exception): """ Risen for callbacks of VSOClient that are unable to supply information for the request. """ class DownloadFailed(Exception): pass class MissingInformation(Exception): pass class UnknownMethod(Exception): pass class MultipleChoices(Exception): pass class UnknownVersion(Exception): pass class UnknownStatus(Exception): pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/vso/legacy_response.py0000644000175100001710000001225100000000000020234 0ustar00vstsdockerimport astropy.units as u from astropy.table import Table from sunpy import config from sunpy.net.base_client import BaseQueryResponse from sunpy.time import TimeRange, parse_time from .table_response import iter_sort_response __all__ = ['QueryResponse'] TIME_FORMAT = config.get("general", "time_format") class QueryResponse(BaseQueryResponse): """ A container for VSO Records returned from VSO Searches. """ def __init__(self, lst, queryresult=None): super().__init__() self._data = lst self.queryresult = queryresult self.errors = [] # import here to prevent circular import from .vso import VSOClient self._client = VSOClient() def __getitem__(self, item): # Always index so a list comes back if isinstance(item, int): item = slice(item, item + 1) return type(self)(self._data[item], queryresult=self.queryresult) def __len__(self): return len(self._data) def __iter__(self): for block in self._data: yield block @property def blocks(self): return self._data @property def client(self): return self._client @client.setter def client(self, client): self._client = client @classmethod def create(cls, queryresult): res = list(iter_sort_response(queryresult)) return cls(res, 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 TimeRange(min(record.time.start for record in self if record.time.start is not None), max(record.time.end for record in self if record.time.end is not None)) def build_table(self): """ Create a human readable table. Returns ------- `astropy.table.QTable` """ 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 [parse_time(time).strftime(TIME_FORMAT)] else: return ['N/A'] for record in self: record_items['Start Time'] += validate_time(record.time.start) record_items['End Time'] += validate_time(record.time.end) record_items['Source'].append(str(record.source)) record_items['Instrument'].append(str(record.instrument)) if hasattr(record, 'extent') and record.extent is not None: record_items['Type'].append(str(record.extent.type) if record.extent.type is not None else ['N/A']) else: record_items['Type'].append('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: unit = record.wave.waveunit # Convert this so astropy units parses it correctly if unit == "kev": unit = "keV" record_items['Wavelength'].append(u.Quantity([float(record.wave.wavemin), float(record.wave.wavemax)], unit=unit)) # 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. Returns ------- s : `set` List of strings, containing attribute names in the response blocks. """ s = {a if not a.startswith('_') else None for a in dir(self[0])} for resp in self[1:]: if len(s) == 0: break s = s.intersection({a if not a.startswith('_') else None for a in dir(resp)}) if None in s: s.remove(None) return s ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/vso/table_response.py0000644000175100001710000001027600000000000020064 0ustar00vstsdocker""" Classes and helper functions for VSO responses. """ from collections import defaultdict from collections.abc import Mapping import numpy as np from zeep.helpers import serialize_object import astropy.units as u from astropy.table import TableAttribute from sunpy.net.base_client import QueryResponseTable from sunpy.time import parse_time __all__ = ['VSOQueryResponseTable'] def iter_sort_response(response): """ Sorts the VSO query results by their start time. Parameters ---------- response : `zeep.objects.QueryResponse` A SOAP Object of a VSO query result Returns ------- `list` Sorted record items w.r.t. their start time. """ has_time_recs = list() has_notime_recs = list() for prov_item in response.provideritem: if not hasattr(prov_item, 'record') or not prov_item.record: continue if not hasattr(prov_item.record, 'recorditem') or not prov_item.record.recorditem: continue rec_item = prov_item.record.recorditem for rec in rec_item: if hasattr(rec, 'time') and hasattr(rec.time, 'start') and rec.time.start is not None: has_time_recs.append(rec) else: has_notime_recs.append(rec) has_time_recs = sorted(has_time_recs, key=lambda x: x.time.start) all_recs = has_time_recs + has_notime_recs return all_recs class VSOQueryResponseTable(QueryResponseTable): hide_keys = ['fileid', 'fileurl'] errors = TableAttribute(default=[]) @classmethod def from_zeep_response(cls, response, *, client, _sort=True): """ Construct a table response from the zeep response. """ # _sort is a hack to be able to convert from a legacy QueryResponse to # a table response. if _sort: records = iter_sort_response(response) else: records = response data = [] for record in records: row = defaultdict(lambda: None) for key, value in serialize_object(record).items(): if not isinstance(value, Mapping): if key == "size": # size is in bytes with a very high degree of precision. value = (value * u.Kibyte).to(u.Mibyte).round(5) key = key.capitalize() if key not in cls.hide_keys else key row[key] = value else: if key == "wave": # Some records in the VSO have 'kev' which astropy # doesn't recognise as a unit, so fix it. waveunit = value['waveunit'] waveunit = 'keV' if waveunit == 'kev' else waveunit row["Wavelength"] = None if value['wavemin'] is not None and value['wavemax'] is not None: row["Wavelength"] = u.Quantity( [float(value['wavemin']), float(value['wavemax'])], unit=waveunit) row["Wavetype"] = value['wavetype'] continue for subkey, subvalue in value.items(): key_template = f"{key.capitalize()} {subkey.capitalize()}" if key == "time" and subvalue is not None: key_template = f"{subkey.capitalize()} {key.capitalize()}" subvalue = parse_time(subvalue) # Change the display to the 'T'-less version subvalue.format = 'iso' row[key_template] = subvalue data.append(row) # Reorder the columns to put the most useful ones first. data = cls(data, client=client) return data._reorder_columns(['Start Time', 'End Time', 'Source', 'Instrument', 'Type', 'Wavelength'], remove_empty=True) def total_size(self): if 'size' not in self.colnames: return np.nan return np.nansum(self['size']) def add_error(self, exception): self.errors.append(exception) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6492753 sunpy-3.1.5/sunpy/net/vso/tests/0000755000175100001710000000000000000000000015641 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/vso/tests/__init__.py0000644000175100001710000000000000000000000017740 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/vso/tests/conftest.py0000644000175100001710000000014400000000000020037 0ustar00vstsdockerimport pytest from sunpy.net import vso @pytest.fixture def client(): return vso.VSOClient() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/vso/tests/test_attrs.py0000644000175100001710000001504600000000000020415 0ustar00vstsdockerimport pytest import astropy.units as u from sunpy.net import _attrs as core_attrs from sunpy.net import attr from sunpy.net import attrs as a from sunpy.net.vso import attrs as va from sunpy.time import TimeRange, parse_time 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 = core_attrs.Time(TimeRange('2012/1/1', '2012/1/2')) assert isinstance(t, core_attrs.Time) assert t.min == parse_time((2012, 1, 1)) assert t.max == parse_time((2012, 1, 2)) def test_input_error(): with pytest.raises(ValueError): core_attrs.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 = core_attrs.Instrument('foo') pytest.raises(TypeError, lambda: attr & core_attrs.Instrument('bar')) attr |= a.Source('foo') pytest.raises(TypeError, lambda: attr & core_attrs.Instrument('bar')) otherattr = core_attrs.Instrument('foo') | a.Source('foo') pytest.raises(TypeError, lambda: attr & otherattr) pytest.raises(TypeError, lambda: (attr | otherattr) & core_attrs.Instrument('bar')) tst = core_attrs.Instrument('foo') & a.Source('foo') pytest.raises(TypeError, lambda: tst & tst) def test_simpleattr_or_eq(): attr = core_attrs.Instrument('eit') assert attr | attr == attr assert attr | core_attrs.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 = core_attrs.Time((2011, 1, 1), (2011, 1, 1, 1)) pytest.raises(TypeError, lambda: attr & core_attrs.Time((2011, 2, 1), (2011, 2, 1, 1))) attr |= a.Source('foo') pytest.raises(TypeError, lambda: attr & core_attrs.Time((2011, 2, 1), (2011, 2, 1, 1))) def test_complexattr_or_eq(): attr = core_attrs.Time((2011, 1, 1), (2011, 1, 1, 1)) assert attr | attr == attr assert attr | core_attrs.Time((2011, 1, 1), (2011, 1, 1, 1)) == attr def test_attror_and(): attr = core_attrs.Instrument('foo') | core_attrs.Instrument('bar') one = attr & a.Source('bar') other = ((core_attrs.Instrument('foo') & a.Source('bar')) | (core_attrs.Instrument('bar') & a.Source('bar'))) assert one == other def test_wave_inputQuantity(): wrong_type_mesage = "Wave inputs must be astropy Quantities" with pytest.raises(TypeError) as excinfo: core_attrs.Wavelength(10, 23) assert excinfo.value.message == wrong_type_mesage with pytest.raises(TypeError) as excinfo: core_attrs.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 = core_attrs.Wavelength((62 / factor) * unit, (62 / factor) * unit) assert int(w.min.to(u.AA, u.equivalencies.spectral()).value) == 199 w = core_attrs.Wavelength(62 * u.eV, 62 * u.eV) assert int(w.min.to(u.AA, u.equivalencies.spectral()).value) == 199 w = core_attrs.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 = core_attrs.Wavelength((1.506e16 / factor) * unit, (1.506e16 / factor) * unit) assert int(w.min.to(u.AA, u.equivalencies.spectral()).value) == 199 w = core_attrs.Wavelength(1.506e16 * u.Hz, 1.506e16 * u.Hz) assert int(w.min.to(u.AA, u.equivalencies.spectral()).value) == 199 w = core_attrs.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: core_attrs.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.value)) def test_time_xor(): one = core_attrs.Time((2010, 1, 1), (2010, 1, 2)) a = one ^ core_attrs.Time((2010, 1, 1, 1), (2010, 1, 1, 2)) assert a == attr.AttrOr( [core_attrs.Time((2010, 1, 1), (2010, 1, 1, 1)), core_attrs.Time((2010, 1, 1, 2), (2010, 1, 2))]) a ^= core_attrs.Time((2010, 1, 1, 4), (2010, 1, 1, 5)) assert a == attr.AttrOr([ core_attrs.Time((2010, 1, 1), (2010, 1, 1, 1)), core_attrs.Time((2010, 1, 1, 2), (2010, 1, 1, 4)), core_attrs.Time((2010, 1, 1, 5), (2010, 1, 2)) ]) def test_wave_xor(): one = core_attrs.Wavelength(0 * u.AA, 1000 * u.AA) a = one ^ core_attrs.Wavelength(200 * u.AA, 400 * u.AA) assert a == attr.AttrOr([core_attrs.Wavelength(0 * u.AA, 200 * u.AA), core_attrs.Wavelength(400 * u.AA, 1000 * u.AA)]) a ^= core_attrs.Wavelength(600 * u.AA, 800 * u.AA) assert a == attr.AttrOr( [core_attrs.Wavelength(0 * u.AA, 200 * u.AA), core_attrs.Wavelength(400 * u.AA, 600 * u.AA), core_attrs.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 = core_attrs.Wavelength(12 * u.AA, 16 * u.AA) moarwav = core_attrs.Wavelength(15 * u.AA, 12 * u.AA) assert repr(wav) == "" assert repr(moarwav) == "" def test_construct_extent(): # yes this is coverage bingo ext = va.Extent(10, 20, 30, 40, 'FULLDISK') assert ext.x == 10 assert ext.y == 20 assert ext.width == 30 assert ext.length == 40 assert ext.type == 'FULLDISK' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/vso/tests/test_vso.py0000644000175100001710000002771100000000000020071 0ustar00vstsdockerimport pytest from parfive import Results import astropy.units as u from sunpy.net import _attrs as core_attrs from sunpy.net import attr from sunpy.net import attrs as a from sunpy.net.vso import attrs as va from sunpy.net.vso.legacy_response import QueryResponse from sunpy.net.vso.table_response import VSOQueryResponseTable, iter_sort_response from sunpy.net.vso.vso import VSOClient, build_client, get_online_vso_url from sunpy.tests.mocks import MockObject from sunpy.time import parse_time class MockQRRecord: """ Used to test sunpy.net.vso.QueryResponse.build_table(...) """ def __new__(cls, start_time=None, end_time=None, size=0, source='SOHO', instrument='aia', extent=None, fileid="spam"): return MockObject(size=size, time=MockObject(start=start_time, end=end_time), source=source, instrument=instrument, provider="SunPy", extent=extent, fileid=fileid) 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=list(records)))] if errors is not None: self.provideritem.extend([MockObject(error=err) for err in errors]) @pytest.fixture def mock_response(): # defining unsorted queryresult to mock test `iter_sort_response()`. # Incorporated cases with no None start time and without time attribute too. recs = [ MockQRRecord(start_time="2021/01/01T00:00:04", fileid='t4'), MockQRRecord(start_time="2021/01/01T00:00:01", fileid='t1'), MockQRRecord(start_time="2021/01/01T00:00:02", fileid='t2'), MockQRRecord(start_time=None, fileid='f1'), MockQRRecord(start_time=None, end_time=None, fileid='f2'), MockQRRecord(start_time="2021/01/01T00:00:03", fileid='t3'), ] return MockQRResponse(records=recs, errors=['FAILED']) @pytest.fixture def mock_table_response(mock_response): return VSOQueryResponseTable.from_zeep_response(mock_response, client=False) @pytest.fixture def eit(): return core_attrs.Instrument('eit') @pytest.fixture def mock_build_client(mocker): return mocker.patch("sunpy.net.vso.vso.build_client", return_value=True) def test_str(mock_build_client): qr = VSOQueryResponseTable() assert str(qr) == '' def test_repr(mock_build_client): qr = VSOQueryResponseTable() assert '' in repr(qr) def test_show(mock_build_client): qr = VSOQueryResponseTable() qrshow = qr.show('Start Time', 'Source', 'Type') assert str(qrshow) == '' @pytest.mark.remote_data def test_path(client, tmpdir): """ Test that '{file}' is automatically appended to the end of a custom path if it is not specified. """ qr = client.search( core_attrs.Time('2020-06-07 06:33', '2020-06-07 06:33:13'), core_attrs.Instrument('aia'), core_attrs.Wavelength(171 * u.AA), response_format="table") tmp_dir = tmpdir / "{file}" files = client.fetch(qr, path=tmp_dir) 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_2020_06_07t06_33_09_35z_image_lev1.fits" in files[0] @pytest.mark.filterwarnings('ignore:ERFA function.*dubious year') @pytest.mark.remote_data def test_no_download(client): """ Test for https://github.com/sunpy/sunpy/issues/3292 """ class MockDownloader: download_called = False def __init__(self): pass def download(self, *args, **kwargs): self.download_called = True # this should fail stereo = (core_attrs.Detector('STEREO_B') & core_attrs.Instrument('EUVI') & core_attrs.Time('1900-01-01', '1900-01-01T00:10:00')) qr = client.search(stereo, response_format="table") downloader = MockDownloader() res = client.fetch(qr, wait=False, downloader=downloader) assert downloader.download_called is False assert res == Results() def test_non_str_instrument(): # Sanity Check assert isinstance(core_attrs.Instrument("lyra"), core_attrs.Instrument) with pytest.raises(ValueError): core_attrs.Instrument(1234) def test_iter_sort_response(mock_response): fileids = [i.fileid for i in iter_sort_response(mock_response)] # the function would have sorted records w.r.t. start time, # those without start time appended at last of final response. assert fileids == ['t1', 't2', 't3', 't4', 'f1', 'f2'] def test_from_zeep_response(mocker): mocker.patch("sunpy.net.vso.vso.build_client", return_value=True) records = (MockQRRecord(),) table = VSOQueryResponseTable.from_zeep_response(MockQRResponse(records), client=None) # These are the only None values in the table. source_ = table['Source'] assert len(source_) == 1 assert source_[0] == 'SOHO' instrument_ = table['Instrument'] assert len(instrument_) == 1 assert instrument_[0] == 'aia' size_ = table['Size'] assert len(size_) == 1 assert size_[0] == 0.0 def test_QueryResponse_build_table_with_extent_type(mocker): """ When explicitly suppling an 'Extent' only the 'type' is stored in the built table. """ mocker.patch("sunpy.net.vso.vso.build_client", return_value=True) e_type = MockObject(x=1.0, y=2.5, width=37, length=129.2, type='CORONA') table = VSOQueryResponseTable.from_zeep_response(MockQRResponse((MockQRRecord(extent=e_type),)), client=None) extent = table['Extent Type'].data assert len(extent) == 1 assert extent[0] == e_type.type def test_QueryResponse_build_table_with_no_start_time(mocker): """ Only the 'end' time set, no 'start' time """ mocker.patch("sunpy.net.vso.vso.build_client", return_value=True) a_st = parse_time((2016, 2, 14, 8, 8, 12)) records = (MockQRRecord(end_time=a_st.strftime(va._TIMEFORMAT)),) table = VSOQueryResponseTable.from_zeep_response(MockQRResponse(records), client=None) # 'End Time' is valid, there is no 'Start Time' in the table assert 'Start Time' not in table.columns end_time_ = table['End Time'] assert len(end_time_) == 1 assert end_time_[0].value == '2016-02-14 08:08:12.000' def test_QueryResponse_build_table_with_no_end_time(mocker): """ Only the 'start' time is set, no 'end' time """ mocker.patch("sunpy.net.vso.vso.build_client", return_value=True) a_st = parse_time((2016, 2, 14, 8, 8, 12)) records = (MockQRRecord(start_time=a_st.strftime(va._TIMEFORMAT)),) table = VSOQueryResponseTable.from_zeep_response(MockQRResponse(records), client=None) start_time_ = table['Start Time'] assert len(start_time_) == 1 assert start_time_[0].value == '2016-02-14 08:08:12.000' @pytest.mark.remote_data def test_vso_hmi(client, tmpdir): """ This is a regression test for https://github.com/sunpy/sunpy/issues/2284 """ res = client.search(core_attrs.Time('2020-01-02 23:52:00', '2020-01-02 23:54:00'), core_attrs.Instrument('HMI') | core_attrs.Instrument('AIA'), response_format="table") dr = client.make_getdatarequest(res) # Extract the DRIs from the request dris = dr.request.datacontainer.datarequestitem # 3 HMI series and one AIA assert len(dris) == 4 # For each DataRequestItem assert that there is only one series in it. for dri in dris: fileids = dri.fileiditem.fileid series = list(map(lambda x: x.split(':')[0], fileids)) assert all([s == series[0] for s in series]) def test_get_online_vso_url(mocker): """ No wsdl links returned valid HTTP response? Return None """ mocker.patch('sunpy.net.vso.vso.check_connection', return_value=None) assert get_online_vso_url() is None def test_VSOClient(mocker): """ Unable to find any valid VSO mirror? Raise ConnectionError """ mocker.patch('sunpy.net.vso.vso.get_online_vso_url', return_value=None) with pytest.raises(ConnectionError): VSOClient() def test_build_client(mocker): mocker.patch('sunpy.net.vso.vso.check_connection', return_value=None) with pytest.raises(ConnectionError): build_client(url="http://notathing.com/", port_name="spam") def test_build_client_params(): with pytest.raises(ValueError): build_client(url="http://notathing.com/") @pytest.mark.remote_data def test_incorrect_content_disposition(client): results = client.search( core_attrs.Time('2011/1/1 01:00', '2011/1/1 01:02'), core_attrs.Instrument('mdi'), response_format="table") files = client.fetch(results[0:1]) assert len(files) == 1 assert files[0].endswith("mdi_vw_v_9466622_9466622.tar") assert "Content" not in files[0] @pytest.mark.parametrize("query, handle", [ ((a.Time("2011/01/01", "2011/01/02"),), True), ((a.Physobs.los_magnetic_field,), False), ((a.Time("2011/01/01", "2011/01/02"), a.Provider("SDAC"),), True), ((a.jsoc.Series("wibble"), a.Physobs.los_magnetic_field,), False), ]) def test_can_handle_query(query, handle): assert VSOClient._can_handle_query(*query) is handle @pytest.mark.remote_data def test_vso_attrs(client): """ Check that the dict is correctly filled. """ adict = client.load_vso_values() assert isinstance(adict, dict) assert len(adict.keys()) == 6 for key, value in adict.items(): assert isinstance(key, attr.AttrMeta) assert isinstance(adict[key], list) assert isinstance(value, list) for val in value: assert isinstance(val, list) assert len(val) == 2 @pytest.mark.remote_data def test_vso_repr(client): """ Repr check (it is really long) """ output = str(client) assert output[:50] == 'sunpy.net.vso.vso.VSOClient\n\nProvides access to qu' @pytest.mark.remote_data def test_response_block_properties(client): res = client.search(a.Time('2020/3/4', '2020/3/6'), a.Instrument('aia'), a.Wavelength(171 * u.angstrom), a.Sample(10 * u.minute), response_format="legacy") properties = res.response_block_properties() assert len(properties) == 0 def test_response_block_properties_table(mocker, mock_response): mocker.patch("sunpy.net.vso.vso.build_client", return_value=True) legacy_response = QueryResponse.create(mock_response) table_response = VSOQueryResponseTable.from_zeep_response(mock_response, client=False) print(legacy_response) print(table_response) def test_row_to_table(mocker, mock_build_client, client, mock_table_response): mock_table_response.client = client # we want to assert that as_table is being called, but if it returns an # empty list the rest of the fetch method (which does network stuff) is # skipped. as_table = mocker.patch("sunpy.net.base_client.QueryResponseRow.as_table", return_value=[]) client.fetch(mock_table_response[0]) assert as_table.called @pytest.mark.remote_data def test_iris_filename(client): pattern = "/home/yolo/sunpy/data/{file}" url = "https://www.lmsal.com/solarsoft/irisa/data/level2_compressed/2018/01/02/20180102_153155_3610108077/iris_l2_20180102_153155_3610108077_SJI_1330_t000.fits.gz" search_results = client.search(a.Time("2018-01-02 15:31:55", "2018-01-02 15:31:55"), a.Instrument.iris) filename = client.mk_filename(pattern, search_results[0], None, url) assert filename.endswith("iris_l2_20180102_153155_3610108077_sji_1330_t000_fits.gz") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/vso/vso.py0000644000175100001710000006244200000000000015670 0ustar00vstsdocker""" This module provides a wrapper around the VSO API. """ import os import cgi import copy import json import socket import inspect import datetime import itertools from pathlib import Path from functools import partial from urllib.error import URLError, HTTPError from urllib.parse import urlencode from urllib.request import Request, urlopen import zeep from sunpy import config, log from sunpy.net.attr import and_ from sunpy.net.base_client import BaseClient, QueryResponseRow from sunpy.net.vso import attrs from sunpy.net.vso.attrs import _walker as walker from sunpy.util.exceptions import warn_user from sunpy.util.net import slugify from sunpy.util.parfive_helpers import Downloader, Results from .. import _attrs as core_attrs from .exceptions import ( DownloadFailed, MissingInformation, MultipleChoices, NoData, UnknownMethod, UnknownStatus, UnknownVersion, ) from .legacy_response import QueryResponse from .table_response import VSOQueryResponseTable from .zeep_plugins import SunPyLoggingZeepPlugin DEFAULT_URL_PORT = [{'url': 'http://docs.virtualsolar.org/WSDL/VSOi_rpc_literal.wsdl', 'port': 'nsoVSOi'}, {'url': 'https://sdac.virtualsolar.org/API/VSOi_rpc_literal.wsdl', 'port': 'sdacVSOi'}] class _Str(str): """ Subclass of string that contains a meta attribute for the record_item associated with the file. """ meta = None # ---------------------------------------- def check_connection(url): try: return urlopen(url).getcode() == 200 except (socket.error, socket.timeout, HTTPError, URLError) as e: warn_user(f"Connection to {url} failed with error {e}. Retrying with different url and port.") return None def get_online_vso_url(): """ Return the first VSO url and port combination that is online. """ for mirror in DEFAULT_URL_PORT: if check_connection(mirror['url']): return mirror def build_client(url=None, port_name=None, **kwargs): """ Construct a `zeep.Client` object to connect to VSO. Parameters ---------- url : `str` The URL to connect to. port_name : `str` The "port" to use. **kwargs : `dict` All extra keyword arguments are passed to `zeep.Client`. Returns ------- `zeep.Client` """ if url is None and port_name is None: mirror = get_online_vso_url() if mirror is None: raise ConnectionError("No online VSO mirrors could be found.") url = mirror['url'] port_name = mirror['port'] elif url and port_name: if not check_connection(url): raise ConnectionError(f"Can't connect to url {url}") else: raise ValueError("Both url and port_name must be specified if either is.") if "plugins" not in kwargs: kwargs["plugins"] = [SunPyLoggingZeepPlugin()] client = zeep.Client(url, port_name=port_name, **kwargs) client.set_ns_prefix('VSO', 'http://virtualsolar.org/VSO/VSOi') return client class VSOClient(BaseClient): """ Provides access to query and download from Virtual Solar Observatory (VSO). Parameters ---------- url : `str`, optional The VSO url to use. If not specified will use the first online known URL. port : `str`, optional The VSO port name to use. If not specified will use the first online known URL. api : `zeep.Client`, optional The `zeep.Client` instance to use for interacting with the VSO. If not specified one will be created. """ method_order = [ 'URL-FILE_Rice', 'URL-FILE', 'URL-packaged', 'URL-TAR_GZ', 'URL-ZIP', 'URL-TAR', ] def __init__(self, url=None, port=None, api=None): if not isinstance(api, zeep.Client): api = build_client(url, port) if api is None: raise ConnectionError("Cannot find an online VSO mirror.") self.api = api def __deepcopy__(self, memo): """ Copy the client but don't copy the API object. """ memo[id(self.api)] = self.api deepcopy_method = self.__deepcopy__ self.__deepcopy__ = None cp = copy.deepcopy(self, memo) self.__deepcopy__ = deepcopy_method cp.__deepcopy__ = deepcopy_method return cp def make(self, atype, **kwargs): """ Create a new SOAP object. """ obj = self.api.get_type(f"VSO:{atype}") return obj(**kwargs) def search(self, *query, response_format=None): """ Query data from the VSO with the new API. Takes a variable number of attributes as parameter, which are chained together using AND. Parameters ---------- response_format : {``"legacy"``, ``"table"``}, optional The response format from the search, this can be either ``"legacy"`` to return a list-like object of the zeep responses, or ``"table"`` to return the responses in a subclass of `~astropy.table.QTable`. 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, attrs as a >>> client = vso.VSOClient() # doctest: +REMOTE_DATA >>> client.search( ... a.Time(datetime(2010, 1, 1), datetime(2010, 1, 1, 1)), ... a.Instrument.eit | a.Instrument.aia, ... response_format="table") # doctest: +REMOTE_DATA Start Time End Time Source ... Extent Type Size ... Mibyte ----------------------- ----------------------- ------ ... ----------- ------- 2010-01-01 00:00:08.000 2010-01-01 00:00:20.000 SOHO ... FULLDISK 2.01074 2010-01-01 00:12:08.000 2010-01-01 00:12:20.000 SOHO ... FULLDISK 2.01074 2010-01-01 00:24:10.000 2010-01-01 00:24:22.000 SOHO ... FULLDISK 2.01074 2010-01-01 00:36:08.000 2010-01-01 00:36:20.000 SOHO ... FULLDISK 2.01074 2010-01-01 00:48:09.000 2010-01-01 00:48:21.000 SOHO ... FULLDISK 2.01074 Returns ------- out : `~sunpy.net.vso.table_response.VSOQueryResponseTable` Matched items. Return value is of same type as the one of :meth:`VSOClient.search`. """ if response_format is None: response_format = "table" query = and_(*query) QueryRequest = self.api.get_type('VSO:QueryRequest') VSOQueryResponse = self.api.get_type('VSO:QueryResponse') responses = [] exceptions = [] for block in walker.create(query, self.api): try: query_response = self.api.service.Query( QueryRequest(block=block) ) for resp in query_response: if resp["error"]: warn_user(resp["error"]) responses.append( VSOQueryResponse(query_response) ) except Exception as ex: exceptions.append(ex) responses = self.merge(responses) if response_format == "legacy": response = QueryResponse.create(responses) else: response = VSOQueryResponseTable.from_zeep_response(responses, client=self) for ex in exceptions: response.add_error(ex) return response 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 |= { 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, queryresponserow, resp, url): """ Generate the best possible (or least-worse) filename for a VSO download. * Use the ``content-disposition`` header. * Use ``fileid`` to generate a file name if content-disposition fails * If everything else fails use the last segment of the URL and hope. """ name = None if resp: cdheader = resp.headers.get("Content-Disposition", None) if cdheader: _, params = cgi.parse_header(cdheader) name = params.get('filename', "") # Work around https://github.com/sunpy/sunpy/issues/3372 if name.count('"') >= 2: name = name.split('"')[1] # This is a hack to to prevent IRIS data from being labelled as XML files if name is None and "VOEvent_IRIS" not in queryresponserow['fileid']: # Advice from the VSO is to fallback to providerid + fileid for a filename # As it's possible multiple providers give the same fileid. # However, I haven't implemented this yet as it would be a breaking # change to the filenames we expect. fileid = queryresponserow['fileid'] # Some providers make fileid a path # Some also don't specify a file extension, but not a lot we can do # about that. name = fileid.split("/")[-1] # If somehow we have got this far with an empty string, fallback to url segment if not name: name = url.split('/')[-1] # Remove any not-filename appropriate characters name = slugify(name) # If absolutely everything else fails make a filename based on download time if not name: name = f"vso_file_{datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')}" fname = pattern.format(file=name, **queryresponserow.response_block_map) return fname def fetch(self, query_response, path=None, methods=None, site=None, progress=True, overwrite=False, downloader=None, wait=True): """ Download data specified in the query_response. Parameters ---------- query_response : sunpy.net.vso.VSOQueryResponseTable 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. 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) =============== ======================================================== progress : `bool`, optional If `True` show a progress bar showing how many of the total files have been downloaded. If `False`, no progress bars will be shown at all. overwrite : `bool` or `str`, optional Determine how to handle downloading if a file already exists with the same name. If `False` the file download will be skipped and the path returned to the existing file, if `True` the file will be downloaded and the existing file will be overwritten, if ``'unique'`` the filename will be modified to be unique. downloader : `parfive.Downloader`, optional The download manager to use. wait : `bool`, optional If `False` ``downloader.download()`` will not be called. Only has any effect if ``downloader`` is not `None`. Returns ------- out : `parfive.Results` Object that supplies a list of filenames and any errors. Examples -------- >>> files = fetch(qr) # doctest:+SKIP """ if path is None: path = Path(config.get('downloads', 'download_dir')) / '{file}' elif isinstance(path, (str, os.PathLike)) and '{file}' not in str(path): path = Path(path) / '{file}' else: path = Path(path) path = path.expanduser() dl_set = True if not downloader: dl_set = False downloader = Downloader(progress=progress, overwrite=overwrite) if isinstance(query_response, (QueryResponse, list)): query_response = VSOQueryResponseTable.from_zeep_response(query_response, client=self, _sort=False) if isinstance(query_response, QueryResponseRow): query_response = query_response.as_table() if not len(query_response): return downloader.download() if wait else Results() # Adding the site parameter to the info info = {} if site is not None: info['site'] = site VSOGetDataResponse = self.api.get_type("VSO:VSOGetDataResponse") data_request = self.make_getdatarequest(query_response, methods, info) data_response = VSOGetDataResponse(self.api.service.GetData(data_request)) err_results = self.download_all(data_response, methods, downloader, str(path), self.by_fileid(query_response)) if dl_set and not wait: return err_results results = downloader.download() results += err_results results._errors += err_results.errors return results 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( {g[0]['Provider']: list(g['fileid']) for g in response.group_by('Provider').groups}, 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 = {} if 'email' not in info: info['email'] = 'sunpy' # For the JSOC provider we need to make a DataRequestItem for each # series, not just one for the whole provider. # Remove JSOC provider items from the map jsoc = maps.pop('JSOC', []) # Make DRIs for everything that's not JSOC one per provider dris = [self.make('DataRequestItem', provider=k, fileiditem={'fileid': v}) for k, v in maps.items()] def series_func(x): """ Extract the series from the fileid. """ return x.split(':')[0] # Sort the JSOC fileids by series # This is a precursor to groupby as recommended by the groupby docs series_sorted = sorted(jsoc, key=series_func) # Iterate over the series and make a DRI for each. # groupby creates an iterator based on a key function, in this case # based on the series (the part before the first ':') for series, fileids in itertools.groupby(series_sorted, key=series_func): dris.append(self.make('DataRequestItem', provider='JSOC', fileiditem={'fileid': list(fileids)})) request = {'method': {'methodtype': methods}, 'info': info, 'datacontainer': {'datarequestitem': dris} } return self.make('VSOGetDataRequest', request=request) def download_all(self, response, methods, downloader, path, qr, info=None): results = Results() 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: results.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. code = ( dresponse.status[from_:to] if getattr(dresponse, 'status', None) else '200' ) if code == '200': for dataitem in dresponse.getdataitem.dataitem: try: self.download( dresponse.method.methodtype[0], dataitem.url, downloader, path, qr[dataitem.fileiditem.fileid[0]] ) except NoData: results.add_error('', '', DownloadFailed(dresponse)) continue elif code == '300' or code == '412' or code == '405': if code == '300': try: methods = self.multiple_choices( dresponse.method.methodtype, dresponse ) except NoData: results.add_error('', '', MultipleChoices(dresponse)) continue elif code == '412': try: info = self.missing_information( info, dresponse.info ) except NoData: results.add_error('', '', MissingInformation(dresponse)) continue elif code == '405': try: methods = self.unknown_method(dresponse) except NoData: results.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, downloader, path, qr, info ) else: results.add_error('', '', UnknownStatus(dresponse)) return results def download(self, method, url, downloader, *args): """ Enqueue a file to be downloaded, extra args are passed to ``mk_filename``""" if method.startswith('URL'): return downloader.enqueue_file(url, filename=partial(self.mk_filename, *args)) raise NoData @staticmethod def by_fileid(response): """ Returns a dictionary of fileids corresponding to records in the response. """ return { record['fileid']: record for record in response } 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 def missing_information(self, info, field): """ Override to provide missing information. """ raise NoData 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): required = {core_attrs.Time} # Get all classes in core_attrs and attrs optional = {value for (name, value) in inspect.getmembers(core_attrs) if name in core_attrs.__all__} optional.update(value for (name, value) in inspect.getmembers(attrs) if name in attrs.__all__) return cls.check_attr_types_in_query(query, required, optional) @classmethod def _attrs_module(cls): return 'vso', 'sunpy.net.vso.attrs' def __del__(self): """ Attempt to close the connection, but if it fails, continue. """ try: self.api.transport.session.close() except Exception as e: log.debug(f"Failed to close VSO API connection with: {e}") @classmethod def register_values(cls): # We always use the local file for now. return cls.load_vso_values() @staticmethod def load_vso_values(): """ We take this list and register all the keywords as corresponding Attrs. Returns ------- dict The constructed Attrs dictionary ready to be passed into Attr registry. """ from sunpy.net import attrs as a here = os.path.dirname(os.path.realpath(__file__)) with open(os.path.join(here, 'data', 'attrs.json'), 'r') as attrs_file: keyword_info = json.load(attrs_file) # Now to traverse the saved dict and give them attr keys. attrs = {} for key, value in keyword_info.items(): attr = getattr(a, key.capitalize(), None) if attr is None: attr = getattr(a.vso, key.capitalize()) attrs[attr] = value return attrs @staticmethod def create_parse_vso_values(): """ Makes a network call to the VSO API that returns what keywords they support. We take this list and register all the keywords as corresponding Attrs. """ here = os.path.dirname(os.path.realpath(__file__)) # Keywords we are after keywords = ["+detector", "+instrument", "+source", "+provider", "+physobs", "+level"] # Construct and format the request keyword_info = {} url = "https://vso1.nascom.nasa.gov/cgi-bin/registry_json.cgi" headers = {"Content-Type": "application/x-www-form-urlencoded"} for keyword in keywords: data = urlencode({'fields': f"['{keyword}']".replace("'", '"')}).encode('ascii') req = Request(url=url, data=data, headers=headers) response = urlopen(req) keyword_info[keyword.replace("+", "")] = json.loads(response.read()) # Now to traverse the return and create attrs out of them. attrs = {} for key, value in keyword_info.items(): attrs[key] = [] for item in value: if item: if key == "level": attrs[key].append((str(item[key]), str(item[key]))) else: attrs[key].append((str(item[key]), str(item[key+"_long"]))) with open(os.path.join(here, 'data', 'attrs.json'), 'w') as attrs_file: json.dump(dict(sorted(attrs.items())), attrs_file, indent=2) @property def info_url(self): return 'http://vso.stanford.edu/cgi-bin/search' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/net/vso/zeep_plugins.py0000644000175100001710000000105400000000000017555 0ustar00vstsdockerfrom lxml import etree from zeep import Plugin from sunpy import log __all__ = ['SunPyLoggingZeepPlugin'] class SunPyLoggingZeepPlugin(Plugin): def ingress(self, envelope, http_headers, operation): log.debug("VSO Response:\n " + etree.tostring(envelope, pretty_print=True).decode("utf-8")) return envelope, http_headers def egress(self, envelope, http_headers, operation, binding_options): log.debug("VSO Request:\n " + etree.tostring(envelope, pretty_print=True).decode("utf-8")) return envelope, http_headers ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6492753 sunpy-3.1.5/sunpy/physics/0000755000175100001710000000000000000000000014564 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/physics/__init__.py0000644000175100001710000000000000000000000016663 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/physics/differential_rotation.py0000644000175100001710000007272600000000000021527 0ustar00vstsdockerfrom copy import deepcopy import numpy as np import astropy.units as u from astropy.coordinates import BaseCoordinateFrame, Longitude, SkyCoord from astropy.time import TimeDelta from sunpy.coordinates import Heliocentric, HeliographicStonyhurst, Helioprojective, get_earth from sunpy.coordinates.transformations import transform_with_sun_center from sunpy.map import ( contains_full_disk, coordinate_is_on_solar_disk, is_all_off_disk, is_all_on_disk, map_edges, on_disk_bounding_coordinates, ) from sunpy.map.header_helper import get_observer_meta from sunpy.sun.constants import sidereal_rotation_rate from sunpy.time import parse_time from sunpy.util import expand_list from sunpy.util.exceptions import warn_user __all__ = ['diff_rot', 'solar_rotate_coordinate', 'differential_rotate'] @u.quantity_input def diff_rot(duration: u.s, latitude: u.deg, rot_type='howard', frame_time='sidereal'): r""" 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 from Howard et al. (1990) | ``snodgrass`` : Use values from Snodgrass et. al. (1983) | ``allen`` : Use values from Allen's Astrophysical Quantities, and simpler equation. | ``rigid`` : Use values from `~sunpy.sun.constants.sidereal_rotation_rate`. 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) Notes ----- The rotation rate at a heliographic latitude :math:`\theta` is given by .. math:: A + B \sin^{2} \left (\theta \right ) + C \sin^{4} \left ( \theta \right ) where :math:`A, B, C` are constants that depend on the model: ========= ======= ====== ====== ========== Model A B C Unit ========= ======= ====== ====== ========== howard 2.894 -0.428 -0.370 microrad/s snodgrass 2.851 -0.343 -0.474 microrad/s allen 14.44 -3.0 0 deg/day rigid 14.1844 0 0 deg/day ========= ======= ====== ====== ========== 1 microrad/s is approximately 4.95 deg/day. References ---------- * `Solar surface velocity fields determined from small magnetic features (Howard et al. 1990) `__ * `A comparison of differential rotation measurements (Beck 2000, includes Snodgrass values) `__ Examples -------- .. minigallery:: sunpy.physics.differential_rotation.diff_rot 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 >>> diff_rot(2 * u.day, 30 * u.deg) Default rotation over two days for a number of latitudes: >>> diff_rot(2 * u.day, np.linspace(-70, 70, 20) * u.deg) With rotation type 'allen': >>> 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, 'rigid': sidereal_rotation_rate * [1, 0, 0] } if rot_type not in ['howard', 'allen', 'snodgrass', 'rigid']: raise ValueError("rot_type must equal one of " "{{ {} }}".format(" , ".join(rot_params.keys()))) A, B, C = rot_params[rot_type] # This calculation of the rotation assumes a sidereal frame time. rotation = (A + B * sin2l + C * sin4l) * duration # Applying this correction assumes that the observer is on the Earth, # and that the Earth is at the same distance from the Sun at all times # during the year. if frame_time == 'synodic': rotation -= 0.9856 * u.deg / u.day * duration return Longitude(rotation.to(u.deg)) def _validate_observer_args(initial_obstime, observer, time): if (observer is not None) and (time is not None): raise ValueError( "Either the 'observer' or the 'time' keyword must be specified, " "but not both simultaneously.") elif observer is not None: # Check that the new_observer is specified correctly. if not (isinstance(observer, (BaseCoordinateFrame, SkyCoord))): raise ValueError( "The 'observer' must be an astropy.coordinates.BaseCoordinateFrame or an astropy.coordinates.SkyCoord.") if observer.obstime is None: raise ValueError("The observer 'obstime' property must not be None.") elif observer is None and time is None: raise ValueError("Either the 'observer' or the 'time' keyword must not be None.") def _get_new_observer(initial_obstime, observer, time): """ Helper function that interprets the possible ways of specifying the input to the solar coordinate rotation function. If the "observer" argument is not `None`, it is used to specify the location of the new observer in space and time. If the "time" argument is not `None`, it is used to calculate the duration over which to the amount of solar rotation is calculated. Note that using the "time" keyword assumes that the new observer is on the Earth. This may be a reasonable assumption depending on the application. Either the "observer" or "time" argument must be specified, but both cannot be specified at the same time and both cannot be None. Parameters ---------- initial_obstime : `~astropy.time.Time` The initial time before solar rotation has been applied. observer : `~astropy.coordinates.BaseCoordinateFrame`, `~astropy.coordinates.SkyCoord`, None The location of the new observer in space and time (the observer must have an interpretable obstime property). time : `~astropy.time.Time`, `~astropy.time.TimeDelta`, `~astropy.units.Quantity`, None Used to define the duration over which the amount of solar rotation is calculated. If 'time' is an `~astropy.time.Time` then the time interval is "time - initial_obstime"; if 'time' is `~astropy.time.TimeDelta` or `~astropy.units.Quantity` then the calculation is "initial_obstime + time". Returns ------- new_observer : `~astropy.coordinates.SkyCoord`, `~astropy.coordinates.BaseCoordinateFrame` The position of the observer in space and time. If the "time" keyword is used the output is an `~astropy.coordinates.SkyCoord`. If the "observer" keyword is not None the output has the same type as the "observer" keyword. In all cases the output is specified in the heliographic Stonyhurst coordinate system. """ _validate_observer_args(initial_obstime, observer, time) # Check the input and create the new observer if observer is not None: new_observer = observer elif time is not None: warn_user("Using 'time' assumes an Earth-based observer.") if isinstance(time, TimeDelta) or isinstance(time, u.Quantity): new_observer_time = initial_obstime + time else: new_observer_time = parse_time(time) new_observer = get_earth(new_observer_time) return new_observer def solar_rotate_coordinate(coordinate, observer=None, time=None, **diff_rot_kwargs): """ Given a coordinate on the Sun, calculate where that coordinate maps to as seen by a new observer at some later or earlier time, given that the input coordinate rotates according to the solar rotation profile. The amount of solar rotation is based on the amount of time between the observation time of the input coordinate and the observation time of the new observer. The new observer is specified in one of two ways, either using the "observer" or "time" keywords. If the "observer" keyword is set, it is used to specify the location of the new observer in space and time. The difference between the coordinate time and the new observer time is used to calculate the amount of solar rotation applied, and the location of the new observer in space is used to calculate where the rotated coordinate is as seen from the new observer. If the "time" keyword is set, it is used to specify the number of seconds to rotate the coordinate by. Note that using the "time" keyword assumes that the new observer is on the Earth. This may be a reasonable assumption depending on the application. Either the "observer" or "time" keyword must be specified, but both cannot be specified at the same time. Parameters ---------- coordinate : `~astropy.coordinates.SkyCoord` Any valid coordinate which is transformable to Heliographic Stonyhurst. observer : `~astropy.coordinates.BaseCoordinateFrame`, `~astropy.coordinates.SkyCoord`, None The location of the new observer in space and time (the observer must have an interpretable obstime property). time : `~astropy.time.Time`, `~astropy.time.TimeDelta`, `~astropy.units.Quantity`, None **diff_rot_kwargs : `dict` Keyword arguments are passed on as keyword arguments to `~sunpy.physics.differential_rotation.diff_rot`. Note that the keyword "frame_time" is automatically set to the value "sidereal". Returns ------- coordinate : `~astropy.coordinates.SkyCoord` The locations of the input coordinates after the application of solar rotation as seen from the point-of-view of the new observer. Notes ----- The translational motion of the Sun over the time interval will be ignored. See :func:`~sunpy.coordinates.transform_with_sun_center`. Examples -------- >>> import astropy.units as u >>> from astropy.coordinates import SkyCoord >>> from sunpy.coordinates import Helioprojective, get_body_heliographic_stonyhurst >>> from sunpy.physics.differential_rotation import solar_rotate_coordinate >>> from sunpy.time import parse_time >>> start_time = parse_time('2010-09-10 12:34:56') >>> c = SkyCoord(-570*u.arcsec, 120*u.arcsec, obstime=start_time, ... observer="earth", frame=Helioprojective) >>> solar_rotate_coordinate(c, time=start_time + 25*u.hr) # doctest: +SKIP ): (Tx, Ty, distance) in (arcsec, arcsec, AU) (-378.27830452, 105.70767875, 1.00245134)> >>> new_observer = get_body_heliographic_stonyhurst("earth", start_time + 6*u.day) >>> solar_rotate_coordinate(c, observer=new_observer) ): (Tx, Ty, distance) in (arcsec, arcsec, AU) (620.42567049, 126.13662663, 1.00185786)> """ # Check the input and create the new observer new_observer = _get_new_observer(coordinate.obstime, observer, time) # The keyword "frame_time" must be explicitly set to "sidereal" # when using this function. diff_rot_kwargs.update({"frame_time": "sidereal"}) # Calculate the interval between the start and end time interval = (new_observer.obstime - coordinate.obstime).to(u.s) # Ignore some invalid NaN comparisons within astropy # (fixed in astropy 4.0.1 https://github.com/astropy/astropy/pull/9843) with np.errstate(invalid='ignore'): # Compute Stonyhurst Heliographic co-ordinates - returns (longitude, # latitude). Points off the limb are returned as nan. heliographic_coordinate = coordinate.transform_to(HeliographicStonyhurst) # Compute the differential rotation drot = diff_rot(interval, heliographic_coordinate.lat.to(u.degree), **diff_rot_kwargs) # Rotate the input co-ordinate as seen by the original observer heliographic_rotated = SkyCoord(heliographic_coordinate.lon + drot, heliographic_coordinate.lat, heliographic_coordinate.radius, obstime=coordinate.obstime, frame=HeliographicStonyhurst) # Calculate where the rotated co-ordinate appears as seen by new observer # for the co-ordinate system of the input co-ordinate. The translational # motion of the Sun will be ignored for the transformation. frame_newobs = coordinate.frame.replicate_without_data(observer=new_observer, obstime=new_observer.obstime) with transform_with_sun_center(): return heliographic_rotated.transform_to(frame_newobs) def _rotate_submap_edge(smap, pixels, observer, **diff_rot_kwargs): """ Helper function that is used to calculate where the edge of a rectangular map move to on rotation. If all the pixels passed in are not on disk and therefore subject to solar differential rotation, the coordinates corresponding to the input pixels are returned. Parameters ---------- smap : `~sunpy.map.Map` The input map from which the pixel coordinates are calculated. pixels : `~astropy.units.Quantity` A Quantity array of shape (M, 2) in pixel units. Values (:, 0) are the x values of the pixel indices, and values ``[:, 1]`` are the "y" values of the pixel indices. observer : `~astropy.coordinates.SkyCoord` The location of the observer. **diff_rot_kwargs : None, `~dict` Keyword arguments accepted by `~sunpy.physics.differential_rotation.diff_rot`. Returns ------- coordinates : `~astropy.coordinates.SkyCoord` The coordinates of a rotated edge. """ # Coordinates c = smap.pixel_to_world(pixels[:, 0], pixels[:, 1]) # Only apply solar rotation if all coordinates are on the disk. if np.all(~coordinate_is_on_solar_disk(c)): coordinates = deepcopy(c) else: coordinates = solar_rotate_coordinate(c, observer=observer, **diff_rot_kwargs) return coordinates def _get_extreme_position(coords, axis, operator=np.nanmax): """ Helper function that calculates an extreme position from a list of coordinates. Parameters ---------- coords : `~list` Each member of the list is a `~astropy.coordinates.SkyCoord`. axis : 'Tx', 'Ty' Which helioprojective axis to examine. operator : numpy function A numpy function that finds an extreme value in an array of helioprojective coordinate values. Defaults to `numpy.nanmax`. Returns ------- `float` An extreme position in units of arcseconds. """ extreme_values = [] for coord in coords: if axis == 'Tx': extreme_value = operator(coord.Tx.value) elif axis == 'Ty': extreme_value = operator(coord.Ty.value) else: raise ValueError('The "axis" argument must be either "Tx" or "Ty".') extreme_values.append(extreme_value) return operator(extreme_values) def _get_bounding_coordinates(coords): """ Helper function that returns the bottom left and top right coordinates that define a bounding box enclosing the passed in coordinates. Parameters ---------- coords : `list` Each member of the list is a `~astropy.coordinates.SkyCoord`. Returns ------- `~astropy.coordinates.SkyCoord` A `~astropy.coordinates.SkyCoord` of length 2 that specifies the bottom left hand (first entry) and top right hand (second entry) corner of a bounding box that minimally encloses all the input coordinates. """ rotated_x_min = _get_extreme_position(coords, "Tx", operator=np.nanmin) rotated_x_max = _get_extreme_position(coords, "Tx", operator=np.nanmax) rotated_y_min = _get_extreme_position(coords, "Ty", operator=np.nanmin) rotated_y_max = _get_extreme_position(coords, "Ty", operator=np.nanmax) return SkyCoord([rotated_x_min, rotated_x_max] * u.arcsec, [rotated_y_min, rotated_y_max] * u.arcsec, frame=coords[0].frame) def _warp_sun_coordinates(xy, smap, new_observer, **diff_rot_kwargs): """ This function takes pixel coordinates in the warped image (`xy`) and calculates the pixel locations of those pixels in the map. To do this it converts the input pixel coordinates to helioprojective coordinates as seen by new_observer, then transforms them to heliographic Stonyhurst, adds the differential rotation correction and then transforms them back to helioprojective coordinates as seen by the map observer and then calculates their corresponding pixel coordinates in the input map. This is an inverse function needed by `skimage.transform.warp`. Parameters ---------- xy : `numpy.ndarray` Pixel coordinates in the warped image. smap : `~sunpy.map.GenericMap` Original map that we want to transform. Returns ------- xy2 : `numpy.ndarray` Pixel coordinates in the map corresponding to the input pixels in the warped image. Notes ----- The translational motion of the Sun over the time interval will be ignored. See :func:`~sunpy.coordinates.transform_with_sun_center`. """ # Suppress NaN warnings in coordinate transforms import warnings with warnings.catch_warnings(): warnings.simplefilter('ignore') # The time interval between the new observer time and the map observation time. interval = (parse_time(new_observer.obstime) - parse_time(smap.date)).to(u.s) # We need to get the input pixel coordinates into the OUTPUT HPC frame. # To save us having to construct a WCS etc, we do the transformation # using the output map, and then replace the observer in place before # transforming to HGS. This is acceptable because the pixel -> world # transformation is independent of the observer. input_pixels = xy.T * u.pix map_coord = smap.pixel_to_world(*input_pixels) output_hpc_coords = SkyCoord(map_coord.Tx, map_coord.Ty, map_coord.distance, obstime=new_observer.obstime, observer=new_observer, frame=Helioprojective) heliographic_coordinate = output_hpc_coords.transform_to(HeliographicStonyhurst) # Compute the differential rotation. drot = diff_rot(interval, heliographic_coordinate.lat.to(u.degree), **diff_rot_kwargs) # The change in longitude is negative because we are mapping from the # new coordinates to the old. rotated_coord = SkyCoord(heliographic_coordinate.lon - drot, heliographic_coordinate.lat, heliographic_coordinate.radius, obstime=heliographic_coordinate.obstime, frame=HeliographicStonyhurst) with transform_with_sun_center(): # As seen from the map observer, which coordinates are behind the Sun. where_off_disk_from_map_observer = rotated_coord.transform_to( Heliocentric(observer=smap.observer_coordinate)).z.value < 0 # Re-project the pixels which are on disk back to location of the original observer coordinates_at_map_observer = rotated_coord.transform_to(smap.coordinate_frame) # Go back to pixel co-ordinates x2, y2 = smap.world_to_pixel(coordinates_at_map_observer) # Re-stack the data to make it correct output form xy2 = np.dstack([x2.T.value.flat, y2.T.value.flat])[0] # Set the off disk coordinates to NaN so they are not included in the output image. xy2[where_off_disk_from_map_observer.flat] = np.nan return xy2 def differential_rotate(smap, observer=None, time=None, **diff_rot_kwargs): """ Warp a `~sunpy.map.GenericMap` to take into account both solar differential rotation and the changing location of the observer. .. warning:: This function, while greatly improved in 1.0, is still experimental. Please validate that it gives you results you expect and report any discrepancies on the SunPy issue tracker. The function transforms the input map data pixels by first rotating each pixel according to solar differential rotation. The amount of solar differential applied is calculated by the time difference between the observation time of map and the new observation time, as specified by either the "time" keyword or the "obstime" property of the "observer" keyword. The location of the rotated pixels are then transformed to locations on the Sun as seen from the new observer position. This is desirable since in most cases the observer does not remain at a fixed position in space. If the "time" keyword is used then the new observer position is assumed to be based on the location of the Earth. If the "observer" keyword is used then this defines the new observer position. The function works with full disk maps and maps that contain portions of the solar disk (maps that are entirely off-disk will raise an error). When the input map contains the full disk, the output map has the same dimensions as the input map. When the input map images only part of the solar disk, only the on-disk pixels are differentially rotated and the output map can have a different dimensions compared to the input map. In this case any off-disk emission shown in the input map is not included in the output map. Parameters ---------- smap : `~sunpy.map.GenericMap` Original map that we want to transform. observer : `~astropy.coordinates.BaseCoordinateFrame`, `~astropy.coordinates.SkyCoord`, `None`, optional The location of the new observer. Instruments in Earth orbit can be approximated by using the position of the Earth at the observation time of the new observer. time : sunpy-compatible time, `~astropy.time.TimeDelta`, `~astropy.units.Quantity`, `None`, optional Used to define the duration over which the amount of solar rotation is calculated. If 'time' is an `~astropy.time.Time` then the time interval is difference between 'time' and the map observation time. If 'time' is `~astropy.time.TimeDelta` or `~astropy.units.Quantity` then the calculation is "initial_obstime + time". Returns ------- `~sunpy.map.GenericMap` A map with the result of applying solar differential rotation to the input map. Notes ----- The translational motion of the Sun over the time interval will be ignored. See :func:`~sunpy.coordinates.transform_with_sun_center`. """ # If the entire map is off-disk, return an error so the user is aware. if is_all_off_disk(smap): raise ValueError("The entire map is off disk. No data to differentially rotate.") # Get the new observer new_observer = _get_new_observer(smap.date, observer, time) # Only this function needs scikit image from skimage import transform # Check whether the input contains the full disk of the Sun is_sub_full_disk = not contains_full_disk(smap) if is_sub_full_disk: # Find the minimal submap of the input map that includes all the # on disk pixels. This is required in order to calculate how # much to pad the output (solar-differentially rotated) data array by # compared to the input map. # The amount of padding is dependent on the amount of solar differential # rotation and where the on-disk pixels are (since these pixels are the only ones # subject to solar differential rotation). if not is_all_on_disk(smap): # Get the bottom left and top right coordinates that are the # vertices that define a box that encloses the on disk pixels bottom_left, top_right = on_disk_bounding_coordinates(smap) # Create a submap that excludes the off disk emission that does # not need to be rotated. smap = smap.submap(bottom_left, top_right=top_right) bottom_left = smap.bottom_left_coord top_right = smap.top_right_coord # Get the edges of the minimal submap that contains all the on-disk pixels. edges = map_edges(smap) # Calculate where the output array moves to. # Rotate the top and bottom edges rotated_top = _rotate_submap_edge(smap, edges[0], observer=new_observer, **diff_rot_kwargs) rotated_bottom = _rotate_submap_edge( smap, edges[1], observer=new_observer, **diff_rot_kwargs) # Rotate the left and right hand edges rotated_lhs = _rotate_submap_edge(smap, edges[2], observer=new_observer, **diff_rot_kwargs) rotated_rhs = _rotate_submap_edge(smap, edges[3], observer=new_observer, **diff_rot_kwargs) # Calculate the bounding box of the rotated map rotated_bl, rotated_tr = _get_bounding_coordinates( [rotated_top, rotated_bottom, rotated_lhs, rotated_rhs]) # Calculate the maximum distance in pixels the map has moved by comparing # how far the original and rotated bounding boxes have moved. diff_x = [(np.abs(rotated_bl.Tx - bottom_left.Tx)).value, (np.abs(rotated_tr.Tx - top_right.Tx)).value] deltax = int(np.ceil(np.max(diff_x) / smap.scale.axis1).value) diff_y = [(np.abs(rotated_bl.Ty - bottom_left.Ty)).value, (np.abs(rotated_tr.Ty - top_right.Ty)).value] deltay = int(np.ceil(np.max(diff_y) / smap.scale.axis2).value) # Create a new `smap` with the padding around it padded_data = np.pad(smap.data, ((deltay, deltay), (deltax, deltax)), 'constant', constant_values=0) padded_meta = deepcopy(smap.meta) padded_meta['naxis2'], padded_meta['naxis1'] = smap.data.shape padded_meta['crpix1'] += deltax padded_meta['crpix2'] += deltay # Create the padded map that will be used to create the rotated map. smap = smap._new_instance(padded_data, padded_meta, smap.plot_settings) # 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 # Create the arguments for the warp function. warp_args = {'smap': smap, 'new_observer': new_observer} warp_args.update(diff_rot_kwargs) # Apply solar differential rotation as a scikit-image warp out_data = transform.warp(smap_data, inverse_map=_warp_sun_coordinates, map_args=warp_args, preserve_range=True, cval=np.nan) # Update the meta information with the new date and time. out_meta = deepcopy(smap.meta) if out_meta.get('date_obs', False): del out_meta['date_obs'] out_meta['date-obs'] = new_observer.obstime.isot # Need to update the observer location for the output map. # Remove all the possible observer keys all_keys = expand_list([e[0] for e in smap._supported_observer_coordinates]) for key in all_keys: out_meta.pop(key) # Add a new HGS observer out_meta.update(get_observer_meta(new_observer, out_meta['rsun_ref']*u.m)) if is_sub_full_disk: # Define a new reference pixel and the value at the reference pixel. # Note that according to the FITS convention the first pixel in the # image is at (1.0, 1.0). center_rotated = solar_rotate_coordinate( smap.center, observer=new_observer, **diff_rot_kwargs) out_meta['crval1'] = center_rotated.Tx.value out_meta['crval2'] = center_rotated.Ty.value out_meta['crpix1'] = 1 + smap.data.shape[1]/2.0 + \ ((center_rotated.Tx - smap.center.Tx)/smap.scale.axis1).value out_meta['crpix2'] = 1 + smap.data.shape[0]/2.0 + \ ((center_rotated.Ty - smap.center.Ty)/smap.scale.axis2).value return smap._new_instance(out_data, out_meta, smap.plot_settings).submap(rotated_bl, top_right=rotated_tr) else: return smap._new_instance(out_data, out_meta, smap.plot_settings) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/physics/solar_rotation.py0000644000175100001710000001374500000000000020207 0ustar00vstsdocker""" This module provides routines for applying solar rotation functions to map sequences. """ import numpy as np import astropy.units as u from sunpy.image.coalignment import apply_shifts from sunpy.physics.differential_rotation import solar_rotate_coordinate __author__ = 'J. Ireland' __all__ = ['calculate_solar_rotate_shift', 'mapsequence_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 mapsequence in order to compensate for solar rotation. The center of the map is used to calculate the position of each mapsequence layer. Shifts are calculated relative to a specified layer in the mapsequence. 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 mapsequence, animate the derotated mapsequence, 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.MapSequence` The input mapsequence. 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 mapsequence 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): # Skip the reference layer if i == layer_index: continue # 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, observer=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 mapsequence_solar_derotate(mc, layer_index=0, clip=True, shift=None, **kwargs): """ Move the layers in a mapsequence 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 mapsequence, animate the derotated mapsequence, and compare the differences you see to the calculated shifts. Parameters ---------- mc : `sunpy.map.MapSequence` A mapsequence of shape (ny, nx, nt), where nt is the number of layers in the mapsequence. layer_index : int Solar derotation shifts of all maps in the mapsequence are assumed to be relative to the layer in the mapsequence indexed by layer_index. clip : bool If True, then clip off x, y edges in the datasequence 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.MapSequence` The results of the shifts applied to the input mapsequence. Examples -------- >>> import sunpy.data.sample # doctest: +REMOTE_DATA >>> from sunpy.physics.solar_rotation import mapsequence_solar_derotate >>> map1 = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) # doctest: +REMOTE_DATA >>> map2 = sunpy.map.Map(sunpy.data.sample.EIT_195_IMAGE) # doctest: +REMOTE_DATA >>> mc = sunpy.map.Map([map1, map2], sequence=True) # doctest: +REMOTE_DATA >>> derotated_mc = mapsequence_solar_derotate(mc) # doctest: +SKIP >>> derotated_mc = mapsequence_solar_derotate(mc, layer_index=-1) # doctest: +SKIP >>> derotated_mc = mapsequence_solar_derotate(mc, clip=False) # doctest: +SKIP """ # 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 mapsequence return apply_shifts(mc, yshift_keep, xshift_keep, clip=clip) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6492753 sunpy-3.1.5/sunpy/physics/tests/0000755000175100001710000000000000000000000015726 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/physics/tests/__init__.py0000644000175100001710000000000000000000000020025 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6492753 sunpy-3.1.5/sunpy/physics/tests/reference/0000755000175100001710000000000000000000000017664 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/physics/tests/reference/test_differential_rotation.txt0000644000175100001710000027216700000000000026056 0ustar00vstsdockernan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 340.892 352.453 359.536 345 306.66 280.963 270.42 293.644 343.901 315.947 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 343.587 325.825 286.917 288.147 322.876 391.867 296.876 238.107 257.676 331.671 332.689 210.962 262.44 289.05 242.882 228.115 222.629 237.405 277.308 310.789 283.449 232.677 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 374.658 341.025 331.881 326.152 340.277 353.494 352.616 247.604 203.935 246.376 285.137 228.146 210.008 282.77 214.872 152.962 150.292 180.734 145.534 208.686 206.717 237.731 245.544 248.489 239.231 141.46 199.796 232.305 242.039 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 591.309 577.839 496.929 369.316 323.611 328.183 284.078 251.475 238.99 293.823 316.877 246.54 166.642 163.928 224.053 203.049 235.894 193.047 175.707 194.978 141.389 120.034 136.485 199.134 212.282 243.107 246.738 207.26 142.131 139.095 195.418 211.532 175.876 176.425 254.696 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 738.348 657.092 527.883 491.151 477.309 550.408 549.535 401.215 350.57 310.568 271.285 231.065 212.41 209.912 174.712 183.989 264.243 128.971 162.504 341.045 281.551 209.084 141.166 112.405 129.656 156.582 159.837 187.479 188.122 220.887 184.67 135.335 198.492 215.282 245.47 223.171 168.434 220.751 360.577 542.504 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 625.331 595.202 545.01 512.9 537.261 511.221 424.578 361.255 331.151 373.855 408.772 397.877 358.449 305.213 270.206 171.919 144.879 139.946 154.219 163.858 120.243 137.076 207.977 167.446 136.922 197.461 121.573 162.899 186.888 159.535 191.86 140.043 117.049 138.964 163.699 225.337 213.587 275.115 255.352 213.469 222.701 228.8 390.129 374.837 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 647.695 630.588 593.548 551.053 557.049 556.835 518.021 473.222 423.155 398.43 337.23 263.718 312.763 337.876 374.819 383.57 307.49 204.701 153.13 135.214 152.1 178.589 178.664 166.983 162.226 124.882 126.479 119.443 132.249 169.918 208.146 261.882 197.685 169.978 116.449 116.916 253.054 206.292 156.987 235.971 299.41 274.303 271.84 315.771 276.82 258.01 392.046 319.628 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 720.738 713.01 694.447 657.831 619.264 554.051 497.167 487.8 458.26 422.175 390.864 376.293 361.586 338.162 247.974 265.824 285.275 264.29 208.502 164.859 175.809 184.747 172.006 193.326 203.274 181.214 171.742 153.789 146.39 194.017 212.22 227.904 250.668 269.99 263.601 190.119 114.305 113.067 285.211 170.132 174.196 240.225 255.225 278.531 345.809 346.922 275.647 242.729 351.17 387.137 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 696.001 666.119 640.827 622.321 609.926 620.168 621.676 600.843 522.838 396.686 378.772 380.623 397.369 387.262 345.056 323.299 317.477 258.861 246.563 213.75 168.702 143.051 152.101 162.323 181.899 205.375 283.71 263.491 266.189 264.048 214.684 224.758 264.783 255.743 245.019 308.313 288.779 271.93 211.04 147.884 144.694 172.089 195.402 164.38 217.32 325.157 341.381 359.528 257.773 244.209 270.371 337.529 394.266 334.535 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 723.407 721.177 720.204 658.858 529.285 456.872 543.206 496.364 295.208 280.583 312.579 377.226 363.807 360.827 361.232 327.783 296.747 278.229 271.203 265.129 234.602 178.273 142.923 138.814 138.704 160.713 213.447 251.09 318.299 317.549 375.313 294.57 304.72 375.864 242.863 266.398 215.782 224.339 223.377 236.933 214.217 185.318 203.342 200.832 195.762 203.857 346.927 360.315 341.215 285.396 298.924 291.368 239.119 326.959 374.44 320.095 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 740.176 687.658 616.628 537.183 489.784 451.28 450.5 484.616 378.301 265.898 239.682 261.437 309.332 380.765 427.125 403.501 349.731 324.374 327.069 316.766 314.836 287.37 198.876 172.316 150.519 177.921 168.987 222.791 271.745 314.024 355.186 362.142 418.874 458.128 284.184 222.133 269.451 287.57 284.382 298.095 279.46 210.428 174.173 178.957 182.242 209.753 270.171 430.72 344.264 321.435 406.328 299.008 406.777 338.179 464.766 304.255 387.323 354.328 451.569 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 621.83 603.653 558.387 493.136 424.631 418.507 412.026 364.032 331.335 325.731 327.57 322.738 260.684 275.071 322.807 388.813 345.887 323.981 326.133 332.481 319.027 332.213 350.666 264.316 225.684 251.228 228.454 241.041 218.517 218.224 275.028 282.252 295.215 247.576 262.305 354.93 307.784 254.464 241.97 248.516 303.936 367.163 335.51 193.098 181.395 141.463 177.033 259.299 309.748 357.727 263.351 277.042 278.57 311.326 350.115 267.429 298.955 347.72 320.187 310.974 405.903 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 660.122 604.5 521.865 493.614 464.018 439.931 425.412 407.208 380.452 324.68 265.818 209.225 224.038 252.485 261.037 236.622 275.054 316.181 246.884 299.595 325.07 342.438 349.195 339.568 290.937 222.684 287.42 298.122 277.015 235.74 203.989 258.567 301.181 301.554 299.758 202.811 155.391 225.309 264.035 224.749 239.749 256.954 240.004 262.737 238.081 192.954 160.997 186.493 276.563 323.461 276.18 291.193 284.24 213.644 281.848 323.599 329.084 338.862 274.431 251.098 248.044 277.876 406.193 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 724.902 692.349 650.542 600.082 541.925 486.194 445.901 410.739 410.536 367.193 269.705 288.632 291.942 212.58 226.986 244.148 256.258 301.084 338.93 269.721 181.874 293.92 371.625 367.434 335.747 310.727 282.542 223.68 285.638 294.208 209.37 161.601 180.471 236.785 243.882 254.77 220.522 141.336 160.342 214.801 225.108 231.728 287.55 292.02 218.2 188.754 215.588 187.856 194.412 285.682 321.944 292.14 292.116 285.259 225.334 259.598 259.529 272.624 448.882 225.609 241.14 209.643 208.24 256.092 361.434 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 808.167 740.534 647.943 551.021 546.523 541.197 496.71 432.701 424.34 431.04 406.702 370.419 327.352 313.968 272.368 211.039 220.692 206.815 202.362 222.212 209.662 175.145 225.474 314.243 333.839 367.364 317.759 286.406 318.096 322.246 271.44 229.264 173.6 225.154 181.822 169.302 155.862 164.174 114.021 100.573 129.88 197.427 177.104 183.563 268.001 263.041 205.173 211.829 177.95 183.559 279.157 302.246 269 280.142 317.746 305.231 160.79 253.854 324.254 336.99 263.063 223.477 238.262 158.511 164.643 248.042 251.058 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 844.72 781.026 688.696 581.843 544.21 522.26 505.778 500.916 483.018 456.687 415.577 364.489 345.994 338.953 335.687 286.167 276.867 277.093 244.814 233.959 200.481 176.311 179.832 136.276 236.919 253.441 271.32 312.782 300.622 301.181 361.908 304.604 263.375 229.984 222.647 232.941 203.064 142.649 129.671 130.703 118.595 101.683 131.483 160.562 162.619 198.169 260.105 249.87 251.944 208.772 179.177 188.668 317.483 303.724 233.022 262.69 330.302 179.166 172.361 245.563 248.593 275.995 297.757 173.91 151.169 135.087 171.456 181.727 273.461 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 788.017 731.776 637.19 515.998 469.734 489.394 506.099 496.005 484.759 452.253 422.919 399.323 379.73 355.249 292.918 285.913 303.449 341.244 262.346 255.185 280.7 238.802 216.231 248.49 231.172 166.175 167.497 139.886 228.043 253.399 259.947 267.025 257.707 246.359 277.384 257.863 312.11 262.196 147.424 112.116 151.495 252.506 144.639 126.211 150.044 222.39 246.254 251.894 329.793 241.975 270.396 277.828 269.12 232.179 265.398 275.321 240.484 269.229 229.792 174.694 172.353 243.11 292.303 289.375 177.22 146.362 133.701 157.096 167.458 255.466 397.775 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 746.629 713.821 650.975 567.806 486.557 416.25 350.644 382.505 409.617 397.915 387.315 406.004 381.442 312.539 308.434 309.056 322.174 316.405 313.567 318.67 355.943 303.187 305.457 287.703 171.811 172.093 176.86 176.95 161.536 148.698 170.872 175.716 208.509 235.497 212.728 239.949 267.034 261.376 219.843 182.094 190.893 164.701 191.868 321.545 320.02 238 271.291 275.357 316.563 258.998 262.536 328.009 334.069 505.211 239.616 235.144 211.775 286.04 243.441 273.262 210.756 237.194 199.704 218.86 295.711 216.008 137.377 128.499 181.206 183.174 223.567 330.156 353.863 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 976.924 929.137 805.171 632.633 511.729 458.542 400.984 396.256 396.877 365.192 323.73 299.799 303.8 355.057 362.07 364.128 377.859 348.646 314.711 321.425 294.978 270.622 269.233 334.409 301.512 209.037 153.594 163.985 183.614 202.429 180.177 147.548 141.392 160.634 188.195 197.065 181.272 188.946 188.886 171.262 183.307 212.233 190.837 182.889 197.342 422.224 335.198 309.999 187.854 261 279.662 214.918 348.552 326.369 363.601 366.746 272.842 236.971 284.334 282.399 207.098 244.358 256.234 261.567 175.398 157.366 194.94 189.928 159.746 209.939 210.58 250.957 253.166 216.09 279.866 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 821.498 748.928 636.7 562.454 508.411 446.465 407.025 368.256 354.054 342.342 327.684 319.563 297.628 273.083 242.855 308.952 350.536 356.733 329.844 311.692 298.226 295.744 325.086 352.441 348.647 303.772 260.737 257.655 207.4 188.558 202.367 159.062 171.923 143.114 145.185 154.649 169.445 157.18 149.269 163.833 166.278 186.665 241.46 229.817 180.024 227.546 214.089 278.326 246.135 185.506 159.63 215.07 282.813 281.098 304.165 334.55 275.957 230.27 266.226 372.432 251.239 409.642 255.262 244.668 199.42 193.852 189.483 223.404 156.51 181.71 201.798 269.832 237.817 218.791 184.85 312.354 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 693.111 654.62 583.619 573.858 560.571 543.545 497.953 456.032 415.612 368.948 332.963 303.475 349.209 357.762 299.539 233.815 202.967 276.32 294.678 282.11 239.587 212.809 224.656 254.276 278.082 320.982 326.105 284.9 234.151 219.624 185.587 292.869 242.442 218.289 195.672 153.524 165.741 181.177 211.567 142.568 162.599 150.038 206.015 241.372 146.895 149.981 179.958 275.322 216.978 177.732 170.219 128.139 127.388 219.491 265.982 243.078 298.089 264.925 231.378 209.295 301.77 336.994 253.54 220.897 287.031 247.704 259.542 235.307 185.712 132.119 202.06 164.756 158.509 241.156 244.73 170.367 233.767 509.832 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 626.234 611.929 599.416 581.3 559.39 533.769 496.501 455.835 464.306 485.67 446.01 389.388 347.444 315.751 336.368 333.032 314.485 227.464 240.712 301.998 242.689 199.072 183.223 203.63 261.884 248.049 254.285 293.531 284.699 224.329 242.121 276.915 297.644 280.367 228.329 264.626 212.673 199.195 238.043 287.454 258.324 182.319 151.976 168.864 168.099 162.762 123.843 116.333 194.683 166.284 143.505 157.323 181.183 154.202 185.521 213.471 192.356 214.476 175.285 192.25 203.345 262.111 322.701 250.466 245.045 211.732 157.157 215.357 349.605 252.52 133.139 141.12 125.417 143.145 227.622 206.929 180.728 237.158 258.966 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 815.172 779.755 715.806 631.717 571.997 564.063 555.651 521.498 481.367 456.932 440.13 416.977 383.429 324.118 302.442 315.189 322.463 298.77 240.413 288.308 294.44 284.152 332.535 235.247 183.447 198.41 180.76 288.552 263.575 203.331 191.778 256.993 310.433 246.098 218.16 237.451 267.462 286.926 316.226 342.642 376.409 260.227 195.125 154.385 93.8559 100.87 113.405 111.894 75.109 102.921 88.3726 229.586 166.518 117.289 222.585 170.504 165.215 175.606 126.587 131.085 182.733 239.603 281.777 234.35 216.49 225.003 163.794 266.068 165.864 281.247 197.3 128.159 135.339 144.122 217.4 219.106 208.484 230.401 261.72 287.263 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 878.493 862.987 816.465 745.546 687.236 621.709 552.011 543.357 529.438 507.406 486.293 490.088 491.056 455.801 417.554 364.723 323.25 297.72 319.918 297.977 258.114 199.496 322.57 317.514 226.532 174.68 159.987 169.193 221.441 278.279 226.86 174.085 181.307 260.059 281.654 213.734 211.268 256.766 287.171 325.979 368.332 350.105 330.1 277.055 227.265 185.08 133.76 124.797 204.649 224.935 113.193 97.54 114.111 126.164 103.789 185.753 150.485 136.584 196.334 139.49 191.196 107.89 156.834 166.966 187.095 211.453 149.015 124.867 300.734 254.575 203.996 119.485 137.817 133.924 142.546 194.636 280.268 263.512 228.877 266.932 281.165 274.873 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 938.799 913.119 888.786 862.482 832.239 786.471 714.915 637.858 574.364 510.567 516.243 525.86 540.892 562.264 583.837 516.066 415.038 313.828 319.298 349.072 280.755 236.894 234.865 256.202 220.76 216.398 218.761 220.857 233.353 277.763 266.812 257.805 270.201 281.599 310.065 252.761 246.759 265.797 296.987 302.371 307.782 340.745 319.429 308.883 251.81 276.074 238.633 110.743 95.7335 148.685 138.81 109.804 123.166 114.494 121.291 116.374 147.879 150.755 187.282 178.122 223.225 186.756 149.67 165.068 142.34 164.052 237.199 220.956 301.137 541.603 303.853 186.191 159.146 178.402 170.129 220.126 313.242 307.911 281.341 266.181 252.755 280.615 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 971.704 949.689 895.574 815.801 714.496 697.601 698.919 682.575 617.684 559.874 541.428 528.074 522.14 532.216 568.917 608.324 636.525 516.598 414.126 340.973 363.528 352.269 333.131 314.342 293.474 258.817 219.458 199.398 251.15 352.536 373.69 309.856 291.701 328.293 284.765 284.282 286.975 282.978 316.229 354.255 330.793 329.848 291.478 292.175 333.606 271.279 220.67 192.938 193.038 142.906 112.003 170.871 172 176.862 187.546 146.522 145.181 153.676 182.173 259.23 255.528 168.774 212.747 208.407 198.014 225.172 225.569 269.086 350.833 365.174 567.404 686.758 338.839 259.91 418.723 307.197 253.952 345.063 434.479 435.9 308.32 204.925 237.001 280.52 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 920.541 882.699 810.583 748.638 698.571 646.87 601.373 559.93 540.253 571.191 597.265 607.438 586.42 535.02 485.583 448.051 534.889 526.283 440.91 393.328 388.87 414.134 397.414 375.93 359.141 347.812 305.941 292.707 376.753 476.617 342.135 318.133 277.501 286.042 289.907 273.305 296.993 264.606 309.985 394.337 383.528 379.895 392.01 352.18 399.772 490.167 253.37 332.325 249.525 227.358 147.711 164.105 217.738 223.573 237.808 247.157 222.522 233.42 222.19 315.117 257.948 197.914 214.858 251.156 278.892 313.82 302.714 236.147 488.729 1174.57 585.459 775.681 714.868 489.044 866.667 632.444 277.269 381.275 645.162 698.887 448.083 287.585 244.31 278.847 404.381 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 898.377 880.914 847.491 804.749 757.546 709.021 653.596 591.888 566.15 566.367 572.055 581.002 562.652 528.666 531.333 537.597 483.755 483.914 530.167 441.524 416.491 468.09 419.297 391.98 378.769 349.28 336.913 363.395 405.43 416.48 375.105 336.005 324.962 321.211 294.943 220.693 290.654 282.399 267.792 268.026 304.769 352.906 370.841 402.969 415.554 329.323 415.88 257.385 283.793 255.186 254.785 216.815 207.95 175.319 263.176 212.866 282.766 232.016 288.122 223.784 224.248 207.601 212.781 274.079 336.896 323.115 429.647 427.48 551.353 280.695 1056.06 389.406 423.349 403.859 640.076 1243.16 878.318 456.281 336.93 1031.93 1201.09 771.561 408.179 264.761 294.171 265.114 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 840.953 796.978 712.635 594.177 611.386 638.719 670.454 595.841 514.915 500.015 502.856 485.445 465.894 474.737 487.373 518.426 518.566 500.753 521.782 480.516 367.926 416.375 397.982 360.28 391.2 356.76 363.448 425.253 423.223 462.713 452.232 411.104 376.826 382.244 347.42 269.199 262.457 289.356 297.238 281.609 300.863 282.75 339.676 366.712 379.024 352.852 331.249 310.553 307.411 302.509 256.965 242.273 242.609 197.024 232.271 237.999 234.162 247.073 240.548 189.078 161.293 126.244 210.969 342.12 345.158 484.807 551.655 399.453 454.408 469.994 322.238 228.173 250.311 299.609 494.232 949.084 1121.23 410.349 511.944 902.788 1966.89 834.23 401.752 297.505 351.324 351.735 608.417 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 844.206 805.464 750.45 685.514 615.396 599.165 607.66 605.736 559.733 511.25 473.074 446.308 484.454 501.734 467.192 442.227 420.57 425.189 437.721 466.096 423.383 410.802 421.343 395.706 418.228 427.002 388.706 466.014 450.984 462.294 492.433 346.813 320.485 297.982 306.423 332.375 323.995 273.918 357.087 351.423 387.725 367.684 343.716 339.061 340.366 341.833 316.232 321.414 281.311 380.617 309.564 356.617 327.219 281.205 265.655 238.296 242.33 231.01 204.805 176.759 187.72 164.941 146.951 400.907 375.671 543.426 657.919 672.543 591.715 371.173 313.119 177.672 146.631 273.949 406.862 429.915 884.241 503.959 269.841 553.71 2305.45 642.208 508.831 295.165 252.758 432.356 885.063 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 903.91 889.446 856.528 810.166 761.48 709.082 649.615 612.775 585.091 534.984 448.464 406.822 450.276 491.063 519.761 488.458 442.123 407.154 375.896 344.277 367.324 390.395 416.375 435.243 440.511 456.679 496.715 473.476 480.532 468.089 407.436 557.125 471.125 309.282 200.151 219.363 342.642 326.341 288.724 277.803 314.824 364.879 387.426 368.836 238.501 264.953 285.247 300.81 220.94 217.515 321.423 388.829 377.169 283.746 292.549 295.65 287.842 266.298 222.095 227.159 175.33 192.317 238.996 157.252 347.563 547.673 767.988 894.237 955.467 701.963 538.901 258.238 163.247 124.311 240.297 347.691 280.878 356.299 428.428 301.466 279.678 711.274 434.189 511.372 353.882 222.143 478.571 1088.04 855.129 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1100.89 1070.1 1006.39 913.306 792.989 688.763 632.664 572.669 544.817 523.204 484.733 437.434 460.776 513.747 439.381 374.507 376.518 381.24 376.262 381.359 383.507 380.747 378.013 371.49 386.444 469.217 498.09 467.83 418.172 447.566 359.367 306.077 248.691 210.676 260.872 275.723 271.836 275.352 261.293 236.344 232.83 304.78 339.319 360.689 214.713 208.349 256.197 247.917 273.755 326.656 331.95 294.22 259.916 229.359 218.383 260.73 290.039 228.209 198.476 178.325 150.115 158.6 208.944 160.723 250.648 592.257 727.18 1183.85 728.684 294.632 246.501 256.472 212.676 209.605 195.97 267.655 179.033 217.913 296.096 283.169 288.036 285.702 468.841 314.041 270.148 197.164 349.252 1164.1 1775.94 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1041.84 980.101 877.398 781.811 710.877 641.446 601.44 592.305 580.727 519.831 453.161 402.702 379.023 458.178 480.587 433.412 440.988 442.849 355.793 357.47 413.757 439.385 422.191 391.3 398.848 474.551 498.591 453.864 393.143 328.567 275.939 255.554 269.982 323.442 240.452 196.439 212.948 251.523 255.473 265.401 213.034 300.529 390.393 343.632 244.004 198.096 193.174 212.721 246.34 229.838 231.166 367.409 301.224 252.294 223.211 192.287 273.769 209.253 126.831 117.07 132.464 140.926 134.064 142.381 196.793 644.948 985.813 1178.68 746.011 584.173 306.689 243.23 335.459 137.671 242.677 305.676 163.861 268.223 168.545 179.468 212.13 268.958 283.495 339.475 261.474 272.623 507.953 918.086 2500.45 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1002.02 957.86 871.785 755.318 616.852 529.045 548.714 576.06 549.796 490.612 437.451 399.24 396.181 430.936 447.377 455.925 493.932 501.45 441.297 394.039 366.165 409.855 431.512 429.915 399.817 379.882 376.165 391.968 445.664 419.532 337.303 247.416 246.217 272.428 314.096 315.036 263.411 201.247 232.928 275.531 237.255 255.294 277.641 335.23 392.464 287.12 221.984 228.732 226.118 322.982 208.288 173.54 236.409 179.638 216.035 186.431 175.237 216.577 128.608 132.053 71.7382 125.361 142.207 138.078 156.96 221.278 395.626 1172.6 2041.91 1757.44 903.169 414.616 237.854 432.341 205.337 369.115 183.978 159.058 260.738 244.16 227.947 173.414 217.273 334.441 350.907 786.03 902.994 705.847 784.393 3040.93 1103.6 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 837.457 798.348 723.708 665.664 603.795 537.476 490.729 460.331 420.444 425.026 437.727 400.43 354.137 372.864 397.228 423.611 428.527 412.155 402.71 383.201 343.362 371.528 388.319 320.195 319.796 315.672 299.351 280.967 314.894 329.753 308.397 255.255 299.401 316.392 279.37 207.835 189.549 170.78 203.941 266.236 273.874 237.418 222.253 252.097 398.944 281.007 258.952 242.109 210.966 267.991 261.274 284.962 364.949 290.849 176.384 143.507 189.352 228.915 187.25 189.082 139.432 118.78 133.177 141.197 159.648 241.837 373.745 841.72 1842.72 1704.34 1088.51 459.865 492.922 621.789 253.155 332.857 256.375 205.873 202.65 257.592 279.047 162.597 253.347 254.316 714.755 800.483 2141.49 1702.88 1138.62 2368.59 1501.95 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 952.217 896.143 803.576 681.746 608.485 571.229 530.435 508.973 498.402 489.782 476.309 444.361 385.677 377.378 426.393 440.938 442.003 423.461 398.81 378.355 355.69 372.053 440.742 370.796 323.91 291.936 282.063 263.94 261.888 282.294 309.128 323.226 356.108 393.291 397.703 233.301 237.563 255.842 273.763 272.448 241.33 275.095 226.49 205.06 239.799 200.074 190.615 211.684 209.93 202.067 227.793 286.997 312.331 215.291 274.339 293.132 207.721 220.349 238.168 232.512 244.184 218.612 183.99 183.423 191.976 250.013 398.665 887.115 1507.98 1765.74 1384.62 1416.99 926.396 627.928 575.646 808.752 355.111 271.769 232.159 250.017 189.054 208.558 206.138 260.244 397.242 517.573 1183.44 2394.14 1860.89 1238.76 1179.26 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 892.696 871.85 829.608 774.741 713.195 649.692 582.526 504.012 423.174 446.934 475.403 494.977 517.605 489.45 457.848 473.691 480.487 466.844 407.393 343.466 395.166 405.036 374.585 406.219 425.311 427.726 406.156 371.942 344.452 337.31 351.314 390.813 423.932 434.073 413.507 500.048 552.884 540.419 454.685 270.307 247.788 195.595 332.672 285.173 224.701 178.464 158.498 165.004 178.636 219.399 203.485 298.11 306.294 379.318 241.63 247.349 232.146 283.9 215.438 251.844 190.482 188.619 208.046 224.587 171.608 218.881 280.363 417.128 827.155 1842.62 3477.76 1938.65 1297.26 2107.61 506.248 1253.43 671.975 479.567 420.87 316.446 237.367 245.919 390.17 299.175 309.505 228.024 294.475 1257.14 1866.44 1413 1281.28 1419.92 802.168 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 751.204 720.93 652.215 582.335 574.266 566.178 558.356 481.171 397.01 372.518 411.25 445.938 471.837 490.019 500.723 500.594 490.551 412.894 362.52 375.954 428.27 463.928 410.198 473.971 535.423 442.245 445.441 453.288 467.832 514.094 513.072 526.581 567.746 628.708 704.151 556.594 590.864 976.568 1281.99 289.698 195.348 231.802 354.063 343.244 239.629 190.219 180.656 228.59 265.113 263.34 168.755 206.971 193.458 211.712 224.381 185.514 172.367 204.142 260.267 375.518 241.451 174.359 223.883 257.084 180.203 211.948 255.956 393.26 775.207 1206.13 2188.68 2325.62 2042.53 2139.42 872.377 835.214 967.643 1032.44 674.795 551.203 516.123 438.143 577.079 533.265 330.541 238.941 225.869 418.264 1692.79 1100.1 981.746 1110.18 724.521 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 844.036 808.856 744.159 658.048 581.688 570.135 554.637 530.42 496.139 463.613 429.76 385.622 394.366 406.253 394.94 386.811 394.38 395.335 396.605 393.527 381.05 343.997 381.735 462.79 571.451 439.136 406.224 439.722 473.802 526.597 605.157 714.251 827.928 1033.98 1140.82 1253 1353.14 1222.46 1083.09 598.518 381.554 311.673 282.088 271.763 238.777 180.209 151.744 225.961 276.103 276.716 212.544 195.757 192.101 221.486 209.429 179.251 178.312 211.618 219.888 271.73 261.691 206.833 205.179 272.961 204.716 210.797 308.804 308.604 424.644 557.268 604.771 1144.36 1333.43 1722.33 1417.98 1644.41 2256.61 1650.07 1054.6 850.345 722.742 567.708 547.53 552.31 421.204 348.261 262.806 324.685 597.912 800.261 913.098 1054.47 925.678 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 815.349 796.864 768.394 733.375 694.477 657.421 620.538 578.99 551.195 526.678 502.304 481.343 446.719 390.601 384.336 410.229 365.516 334.687 370.23 408.957 436.461 359.842 361.72 406.252 364.467 372.378 403.015 430.225 472.988 480.776 505.527 648.305 837.631 1108.67 1443.14 1834.27 2222.45 2001.07 1421.3 974.503 754.1 559.212 315.019 163.399 181.907 224.238 153.514 199.086 221.624 225.378 216.101 196.188 228.171 255.75 251.566 276.166 253.632 292.911 298.864 327.217 275.459 240.856 184.436 230.417 225.84 175.392 287.067 215.415 199.578 220.976 292.25 359.799 781.844 347.862 1298.44 1824.74 1052.3 725.561 1251.82 911.12 639.501 546.098 543.694 500.561 417.825 365.78 290.129 496.685 443.102 502.796 729.221 944.876 988.034 449.076 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 773.936 726.673 687.172 679.181 671.251 663.86 626.197 579.177 545.823 555.485 563.918 524.994 483.656 454.621 427.941 397.658 373.975 365.932 396.377 416.385 415.603 384.291 372.495 417.58 397.913 395.96 431.744 455.115 515.936 533.379 451.777 581.418 755.353 1002.32 1331.37 1710.52 1536.49 2110.27 1970.23 1598.56 1446.02 668.035 347.734 215.274 231.72 236.335 176.851 175.575 204.515 237.902 280.826 213.306 241.02 303.895 342.675 305.494 216.436 309.327 339.071 299.79 280.23 250.691 229.941 199.182 230.444 225.567 213.618 180.391 118.189 134.509 164.79 151.358 231.156 275.782 470.035 665.878 903.296 621.838 731.607 704.837 631.597 589.389 530.838 532.002 468.645 388.713 318.631 415.286 375.754 488.397 498.624 871.366 712.859 411.603 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 881.176 867.126 819.669 747.309 697.416 685.724 668.949 648.219 630.01 613.348 596.268 572.967 543.263 513.417 469.605 418.624 402.006 418.938 518.273 543.591 526.187 505.592 481.581 461.061 476.903 488.535 500.343 482.055 507.316 534.799 535.399 469.516 503.726 611.619 804.214 1097.43 1695.32 1964.04 2164.08 2163.23 2063.02 1947.99 621.574 468.106 347.185 284.821 262.831 225.888 187.386 219.807 281.302 308.905 236.79 263.984 267.098 248.693 249.577 249.728 388.923 427.063 279.278 244.2 270.82 238.63 206.088 216.58 215.557 203.036 172.227 86.8236 105.591 150.363 121.766 165.968 341.936 467.955 408.245 396.266 499.736 257.679 353.102 427.74 532.277 515.862 523.572 503.064 505.514 409.914 472.664 430.471 366.052 350.653 650.44 555.596 462.452 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 924.479 907.369 867.841 810.03 736.83 691.126 655.75 618.192 611.896 614.63 614.482 612.477 593.005 536.931 499.193 487.866 505.548 538.219 586.86 605.923 567.231 505.319 462.111 477.289 521.947 580.017 639.868 550.001 537.58 551.656 418.873 409.108 416.369 428.837 462.668 730.601 1223.2 1705.91 1739.76 1391.98 2357.5 2314.09 950.958 458.07 400.522 347.505 321.753 282.522 225.788 292.065 349.036 299.411 254.222 262.166 227.899 254.389 255.532 370.714 390.006 536.061 256.383 227.668 300.618 220.616 199.442 204.977 243.795 191.992 132.42 79.0318 117.607 95.4423 83.3412 108.439 194.918 197.252 172.252 190.875 278.487 204.641 155.285 265.006 344.906 478.081 420.965 513.068 462.998 558.966 603.022 537.954 542.021 417.48 430.351 580.955 383.269 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 945.895 929.053 885.864 820.191 734.63 644.806 621.812 596.587 576.885 565.718 552.71 549.778 545.962 552.316 560.819 547.454 543.322 551.708 590.693 619.481 524.049 477.316 474.673 524.589 559.709 577.725 582.182 525.551 496.136 537.239 390.426 389.3 432.347 454.513 519.673 558.191 647.076 843.291 1063.85 874.191 976.021 1192.37 760.448 415.565 421.527 434.662 379.71 278.12 264.317 355.126 338.772 350.982 294.425 239.171 200.934 233.204 289.259 412.534 628.924 609.769 368.501 246.615 239.617 229.555 288.768 150.039 250.974 179.213 94.0569 81.6373 90.4035 131.138 97.9599 82.122 220.644 222.232 169.507 158.03 146.687 163.621 147.894 172.464 244.723 378.406 375.262 407.016 414.125 410.221 528.059 601.418 561.018 391.87 496.093 460.694 293.758 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 958.022 938.538 893.932 836.109 772.207 706.381 676.307 663.343 649.047 591.238 524.949 495.637 474.458 514.922 576.387 547.893 517.465 518.383 510.453 496.603 466.735 464.954 509.185 486.46 446.448 409.448 459.843 473.653 453.218 433.754 402.119 417.544 476.466 562.314 455.89 355.989 308.408 308.237 299.66 395.536 548.322 432.89 332.108 368.76 399.769 411.063 347.545 341.859 319.918 343.491 336.923 374.417 369.772 291.665 249.428 299.166 363.882 417.294 607.417 543.319 291.75 194.971 182.202 226.042 317.746 178.603 173.047 135.134 91.2709 101.297 119.272 95.8877 134.865 89.5342 105.306 118.543 163.135 149.087 149.783 149.108 154.677 131.662 213.021 263.274 406.235 305.649 322.104 371.317 423.546 469.403 410.285 404.67 464.66 337.488 235.622 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 823.325 790.57 724.503 708.623 702.637 694.847 679.968 646.098 606.557 572.656 547.837 524.211 495.61 494.669 515.041 489.809 444.864 457.378 475.656 495.378 517.958 538.934 537.263 478.887 404.871 423.632 461.793 488.523 496.926 447.948 437.094 433.692 407.148 493.935 416.506 320.112 267.992 264.659 211.418 218.768 252.488 290.948 318.234 326.519 339.479 346.741 340.253 362.307 347.751 354.197 368.385 380.067 369.009 326.143 288.247 253.8 282.228 337.51 373.023 338.456 163.908 153.177 160.668 181.8 214.222 201.467 126.504 119.065 139.102 114.896 156.56 127.048 110.214 117.149 215.685 210.041 238.822 192.138 126.502 136.239 178.155 93.2782 225.478 231.543 330.152 313.369 283.287 334.07 385.642 378.364 321.974 395.362 426.274 372.812 239.358 440.337 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 914.262 869.356 786.492 697.924 688.164 677.242 665.451 634.932 602.25 577.791 561.059 537.97 507.804 480.116 456.616 419.04 368.702 399.504 455.942 456.441 472.203 501.174 539.272 517.539 434.53 471.131 491.902 517.478 577.588 610.934 581.063 487.07 467.943 452.296 403.808 347.761 300.961 260.955 254.21 242.877 234.788 247.24 271.227 273.051 261.547 304.42 343.351 368.742 362.637 401.71 447.232 407.563 355.623 333.484 302.22 297.283 300.386 274.202 315.077 262.591 134.713 147.424 147.299 180.894 231.819 243.546 152.806 136.762 194.761 107.795 111.61 85.8234 75.5628 115.063 159.045 180.473 164.433 166.649 144.071 132.655 193.816 139.66 211.956 226.971 268.047 363.419 287.794 276.662 399.071 396.542 298.239 396.106 441.04 359.006 258.91 522.962 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 965.292 921.245 840.281 728.42 684.071 666.67 645.675 637.713 642.797 646.073 624.071 600.4 548.059 494.851 472.464 457.606 463.844 476.081 485.636 483.421 485.722 478.641 484.866 480.366 449.117 439.546 468.684 538.072 570.396 622.731 625.768 526.147 440.468 368.462 331.153 324.752 312.885 270.76 266.262 284.755 327.744 360.624 329.632 261.974 264.855 274.297 372.96 426.671 401.007 412.685 457.367 447.249 345.092 362.77 350.025 310.709 296.7 349.507 220.157 240.134 147.887 154.246 131.821 153.296 218.251 270.866 201.801 168.585 168.311 108.27 106.865 153.475 224.898 137.395 222.887 158.511 170.387 214.167 188.241 117.512 183.752 199.547 140.815 238.963 307.66 301.791 242.544 252.165 281.632 433.912 356.888 346.481 432.795 308.095 262.141 477.788 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 991.115 944.597 867.72 767.944 688.738 670.396 651.291 652.75 694.754 741.303 692.274 633.085 557.466 475.844 437.773 414.263 485.83 511.069 457.064 520.582 585.6 524.506 491.624 473.434 433.197 441.639 480.975 550.939 541.25 547.177 543.727 465.217 410.508 365.861 328.224 302.635 304.443 264.131 257.157 319.788 386.642 331.732 371.301 313.322 323.332 336.882 423.187 478.905 467.383 457.435 485.119 506.261 430.44 397.158 373.823 317.134 296.408 267.018 213.212 223.691 189.987 119.363 114.555 160.281 203.143 214.891 206.635 203.088 160.615 196.776 204.427 298.966 227.458 198.341 298.923 361.467 213.576 314.798 265.6 190.095 171.72 187.872 204.362 254.31 394.782 299.537 306.928 297.057 272.241 431.649 350.306 277.673 322.858 267.568 244.314 414.07 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 898.356 870.819 821.412 753.208 673.589 661.11 646.888 637.253 663.451 688.63 689.06 691.599 619.213 506.119 489.734 505.61 443.948 391.984 409.254 436.496 458.808 451.302 472.783 517.012 476.247 463.565 476.121 522.139 523.759 509.374 487.632 413.997 402.457 374.295 335.08 369.79 340.578 341.054 332.649 331.679 364.924 302.527 383.001 394.849 364.725 397.192 429.035 449.416 505.008 500.828 512.258 536.726 500.815 494.713 389.868 367.001 345.567 242.999 294.532 239.104 184.246 116.462 132.854 154.102 218.176 196.626 175.791 191.804 200.141 236.643 243.401 226.991 461.641 564.536 194.108 297.148 398.151 395.174 375.196 308.29 252.114 212.764 288.806 269.523 348.748 320.77 335.019 281.384 316.291 351.441 371.437 393.16 305.279 257.977 268.574 372.215 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 889.652 857.054 804.724 737.568 659.345 646.667 650.917 658.478 646.501 628.685 603.454 568.286 520.476 474.405 455.667 445.942 414.408 398.163 464.143 483.699 467.067 444.97 446.05 482.198 483.139 482.197 483.599 515.654 519.936 506.315 470.138 483.924 446.495 369.58 295.648 303.371 315.106 305.31 300.189 331.128 374.821 318.404 371.419 441.566 452.053 413.787 411.258 462.168 413.117 424.642 433.944 441.505 452.621 456.568 450.237 338.467 343.36 308.325 258.651 250.507 219.102 124.363 95.978 132.25 244.654 203.041 176.986 182.119 281.678 315.4 314.22 377.594 705.784 704.741 235.591 158.778 322.639 414.471 415.503 318.56 263.436 276.991 305.017 277.604 274.377 366.21 329.633 252.129 272.104 307.738 326.691 475.238 353.614 282.172 346.778 406.343 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 777.626 759.654 728.444 685.969 633.62 631.966 664.553 702.271 699.866 691.885 663.655 612.751 580.215 570.678 539.899 487.426 455.236 433.363 464.723 515.168 593.35 559.79 526.058 517.589 499.013 481.344 468.434 534.986 554.376 533.738 522.929 548.469 494.231 397.923 320.599 283.502 322.53 331.963 334.095 377.126 388.43 370.473 414.382 433.995 416.288 370.416 343.769 377.62 309.36 313.475 362.134 375.878 396.451 433.027 394.767 357.152 337.951 360.812 244.623 194.194 170.255 105.266 110.643 86.3849 105.386 113.465 150.212 202.429 261.767 300.497 392.992 488.456 542.672 361.414 277.308 249.779 266.289 244.976 279.189 267.117 244.875 275.074 264.001 277.652 218.224 322.272 340.125 397.091 338.233 341.994 307.699 413.719 400.783 296.258 347.649 448.065 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 759.816 742.184 711.754 671.263 622.762 612.748 641.626 670.209 689.861 708.623 704.008 665.063 635.031 619.876 592.902 553.733 523.896 497.245 495.581 519.631 584.435 600.807 584.189 518.002 489.537 481.117 494.564 551.243 550.495 517.86 530.901 517.891 459.232 389.359 384.233 391.767 430.271 438.878 409.438 371.691 371.605 345.874 370.088 347.995 324.835 327.304 305.667 274.966 287.099 271.89 321.089 384.719 413.453 410.621 409.923 392.353 383.349 347.742 232.759 172.3 148.289 110.232 100.812 85.4053 81.0274 84.8815 200.241 174.618 228.664 277.756 344.342 320.578 292.331 273.364 306.589 216.941 196.837 236.49 313.564 300.445 228.487 248.567 216.608 271.907 182.622 298.091 325.579 399.812 348.834 531.824 268.757 343.271 368.477 284.222 305.725 496.668 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 758.597 752.022 741.262 728.615 715.947 705.812 693.497 675.19 679.15 696.156 693.172 653.969 616.789 587.772 556.026 522.685 523.216 549.358 598.938 627.687 600.781 573.386 551.308 550.524 536.072 519.618 518.902 515.667 507.313 493.272 508.9 504.307 472.735 441.104 495.711 511.137 487.083 435.327 377.362 327.775 306.319 273.178 229.581 207.484 228.725 266.063 284.846 265.766 256.66 247.427 283.04 292.149 347.958 362.117 360.912 420.194 440.582 380.004 230.993 152.429 145.937 120.31 120.529 105.913 66.6 72.6449 206.596 170.289 233.183 213.138 288.896 250.886 259.594 331.726 371.503 314.083 237.247 310.316 282.107 216.975 155.388 226.958 187.72 218.312 189.604 247.028 279.199 276.683 429.194 347.51 271.038 355.952 368.006 306.404 308.411 471.533 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 783.866 789.685 799.719 813.293 829.928 817.966 758.794 691.594 667.155 670.595 659.082 615.789 575.977 549.757 519.735 482.197 490.539 534.775 562.853 577.144 563.34 553.993 554.109 615.67 604.644 556.959 506.274 529.859 528.925 473.272 501.446 505.769 497.433 499.756 571.06 537.919 469.784 403.953 348.003 255.167 228.162 266.13 213.711 188.041 227.584 270.718 311.622 351.996 358.463 345.854 303.448 241.549 285.896 266.295 290.193 302.157 373.074 406.74 262.958 171.579 152.552 112.272 141.607 105.954 90.5294 103.501 108.61 189.874 188.497 164.144 254.156 299.159 304.838 274.905 324.326 355.311 325.253 308.303 238.398 199.731 191.909 228.268 163.845 185.615 232.056 228.612 296.932 224.125 375.38 303.811 360.894 361.623 373.809 272.809 323.607 550.056 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 802.729 803.384 804.453 804.796 803.448 775.245 713.561 648.9 640.535 669.764 673.34 608.508 549.177 520.381 481.383 423.795 390.009 371.937 446.174 525.763 539.886 523.767 514.675 571.872 574.878 553.426 503.615 538.183 536.924 467.125 514.158 531.149 534.776 543.904 603.858 537.601 445.668 375.167 333.932 248.546 212.477 231.388 224.943 232.178 276.598 317.127 367.06 426.771 503.293 447.544 383.434 291.688 268.299 205.555 195.699 251.461 255.34 378.175 346.586 236.775 199.885 126.279 117.655 70.8177 114.035 135.797 120.27 318.535 342.408 216.309 215.68 288.62 289.052 161.742 135.478 306.556 272.553 243.031 156.025 150.575 231.092 228.086 212.867 202.399 255.838 249.961 402.078 374.911 252.786 315.651 353.719 380.742 576.252 289.964 349.102 664.326 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 764.016 758.031 747.143 732.393 714.55 690.527 661.163 630.418 615.989 603.129 580.501 557.258 536.175 504.016 488.682 510.963 509.313 482.926 514.118 530.252 488.433 530.303 577.938 481.062 465.701 480.731 459.416 466.479 463.221 451.06 495.75 529.042 567.441 605.849 549.096 553.804 473.604 353.287 293.994 331.091 233.08 228.846 240.049 303.914 380.728 410.258 489.417 397.525 508.163 388.473 361.451 344.288 336.049 257.515 184.961 152.758 179.483 190.351 329.154 307.739 194.189 139.786 143.646 82.5757 106.554 104.359 159.51 464.646 607.757 311.658 183.295 150.65 221.459 191.46 128.566 467.749 320.528 216.032 152.841 140.704 210.472 231.197 247.497 196.724 260 218.601 385.584 352.923 240.77 365.222 365.64 349.496 1069.92 310.86 371.71 539.745 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 755.953 750.953 735.607 710.1 674.318 653.899 645.943 639.295 607.101 564.204 554.664 602.502 609.268 505.231 456.743 512.07 491.499 412.498 484.769 589.57 700.142 665.781 561.627 469.989 429.272 423.058 449.955 447.597 444.289 438.051 462.861 495.572 528.144 545.8 510.958 469.681 415.461 359.419 295.576 240.586 279.333 245.506 328.869 481.424 554.625 508.419 501.909 357.822 469.74 349.33 339.184 273.667 272.159 225.456 149.68 136.205 187.485 192.204 147.478 364.023 284.749 187.211 139.888 108.89 112.691 87.23 229.284 456.354 586.394 219.079 125.111 148.171 192.182 165.817 150.083 224.351 237.854 133.645 153.692 192.303 244.664 258.179 208.401 148.53 237.483 191.691 284.238 233.439 229.53 263.073 302.909 445.31 572.398 324.053 394.712 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 860.547 846.879 803.031 732.191 636.251 618.161 614.2 608.199 596.931 587.862 590.966 600.399 575.898 506.289 466.266 452.161 438.312 433.473 568.887 662.221 618.856 528.288 445.086 441.126 440.706 435.586 388.86 426.677 458.814 464.13 490.63 474.311 453.661 457.897 487.302 439.668 395.59 385.395 382.629 215.053 264.533 276.074 427.708 584.751 571.484 417.204 359.425 380.777 359.467 268.808 241.72 175.082 172.979 142.867 153.752 186.42 157.703 119.16 137.43 134.929 270.192 221.313 169.216 158.361 158.514 108.099 224.383 305.223 306.69 135.542 109.806 124.13 180.561 162.331 158.329 148.079 191.776 136.124 154.601 221.175 255.459 265.086 180.486 163.4 231.414 224.37 233.877 302.203 271.641 261.354 272.423 281.863 421.616 346.836 482.812 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 951.448 931.663 870.975 778.773 677.592 672.326 666.199 659.204 633.633 599.818 581.14 578.105 552.513 498.119 487.027 521.76 520.524 500.308 522.06 522.873 485.242 498.029 505.253 415.175 412.085 422.445 398.81 437.648 474.127 497.348 505.448 477.977 436.593 391.989 396.142 358.649 381.586 414.126 384.608 286.474 277.082 297.972 319.208 330.363 352.723 371.914 340.568 355.935 198.002 204.261 173.191 130.456 129.349 118.298 133.075 118.656 109.961 114.78 151.876 150.188 152.025 175.491 240.077 300.637 236.241 177.546 175.416 259.822 235.744 154.429 137.865 154.614 256.598 161.6 162.923 137.398 156.323 163.007 183.315 227.721 227.22 246.509 201.433 200.959 261.136 217.823 245.168 188.776 211.771 242.687 287.57 304.598 344.009 373.727 506.257 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 911.331 866.827 794.214 747.927 744.724 741.931 730.315 684.551 637.822 603.105 566.758 553.793 566.101 560.564 535.129 599.456 688.331 657.736 574.472 424.59 462.059 496.622 442.22 430.672 445.106 486.472 477.264 503.134 552.977 468.274 486.66 427.935 298.012 280.255 316.676 321.057 386.313 472.191 343.116 303.562 311.581 280.628 297.939 352.398 371.379 344.894 269.566 129.685 178.474 246.187 184.48 119.782 119.438 123.815 110.636 128.439 158.285 154.041 156.197 163.92 208.956 336.485 544.162 312.23 240.441 257.68 300.654 389.97 326.197 178.593 243.974 378.645 412.679 248.465 178.643 170.934 148.465 169.946 246.648 193.298 179.042 175.284 177.041 256.542 233.691 175.857 117.126 124.598 180.968 282.51 233.177 352.958 363.362 483.836 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 860.616 829.756 781.5 787.201 793.32 799.727 794.2 774.852 754.982 764.298 783.446 815.011 848.558 808.152 740.309 752.869 760.19 750.496 676.566 555.837 539.107 515.933 484.012 459.701 457.162 503.851 474.558 511.35 545.836 485.998 498.955 408.33 282.692 239.396 298.434 304.016 448.982 579.722 413.274 344.069 305.378 287.194 269.298 236.104 239.178 301.829 310.941 116.975 135.718 234.243 170.719 118.607 170.861 158.562 143.466 138.59 163.861 232.924 203.241 169.017 298.487 619.294 1234.54 393.645 320.821 328.447 382.871 465.261 339.205 233.062 384.948 467.19 543.731 254.644 182.992 192.872 202.353 238.412 203.077 199.497 174.503 119.539 126.219 178.759 202.156 150.125 130.347 191.208 189.334 268.935 283.027 332.736 351.466 608.6 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 889.033 884.383 883.935 882.887 880.518 876.685 852.322 818.485 797.074 866.519 944.19 1006.57 1075.15 1121.3 1175.02 1180.74 1088.52 763.105 673.154 718.078 628.286 592.077 601.442 485.488 436.204 431.465 486.119 510.143 529.442 567.377 585.825 493.483 366.316 287.721 294.724 338.873 455.194 552.186 546.503 366.731 355.483 323.264 266.651 242.903 236.674 239.409 272.835 111.032 128.999 338.078 196.963 112.098 166.509 327.47 149.809 110.772 222.552 380.463 275.375 276.037 432.876 915.606 1738.07 467.225 568.47 442.574 571.317 410.545 263.587 523.787 689.951 501.981 318.38 232.449 347.751 252.473 236.318 228.418 163.462 204.104 188.168 99.3712 133.315 166.338 221.592 97.6612 154.046 270.742 208.281 291.297 406.539 157.336 392.367 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 892.773 886.631 875.879 861.065 842.533 821.787 806.355 794.156 802.94 830.524 862.101 944.991 1071.76 1495.75 1774.42 1426.87 1056.42 690.829 609.826 617.747 664.666 680.93 686.19 703.62 604.645 484.508 566.013 593.942 609.235 628.806 690.115 597.587 447.643 319.181 361.634 363.681 436.77 575.571 664.968 518.582 397.276 449.341 339.532 291.198 266.309 217.359 179.333 138.491 168.91 302.434 336.701 107.145 113.052 161.68 101.481 107.775 131.719 176.331 269.332 318.866 307.328 477.262 660.062 410.944 587.979 509.916 580.647 318.439 323.089 649.014 362.199 267.945 269.28 251.454 177.663 271.954 246.162 206.031 168.239 210.523 151.897 137.579 125.932 158.58 175.377 97.1468 190.524 204.187 355.761 379.01 184.558 199.151 385.694 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 883.932 883.45 872.124 850.981 820.559 818.105 830.084 842.113 869.829 907.864 918.094 871.053 899.346 1080.42 1331.76 1763.68 1518.83 842.587 874.566 919.23 1031.22 1031.29 938.148 937.651 769.208 627.277 668.554 717.885 747.865 758.823 778.439 780.598 659.096 460.021 307.408 351.562 473.022 667.924 739.354 562.001 456.459 541.304 377.42 309.282 277.295 235.988 199.901 180.724 173.283 219.665 227.73 84.7568 66.6623 126.222 202.417 229.095 152.165 162.868 250.21 312.181 204.668 314.463 777.756 447.584 414.243 389.38 506.442 569.402 763.07 476.012 326.187 286.826 206.705 262.493 256.676 301.26 269.065 224.605 195.836 206.638 115.299 135.696 91.7532 124.066 156.424 147.308 306.142 232.419 334.177 186.193 126.393 193.49 330.545 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 953.014 931.765 897.565 875.109 888.941 906.337 927.123 946.632 963.381 923.485 865.133 894.638 978.323 1013.25 982.585 1685.18 2444.7 1927.98 1991.13 2564.55 1725.77 1225.44 1421.99 1063.69 804.442 746.359 866.819 905.084 914.317 949.977 890.156 833.673 710.711 487.035 369.122 529.06 693.686 662.494 511.66 495.334 391.872 283.044 258.586 306.694 305.684 262.155 208.032 152.272 198.145 203.319 86.5583 106.776 271.886 191.88 149.259 176.852 199.447 221.803 220.392 202.789 586.252 949.874 584.142 404.576 318.427 403.626 989.271 2686.9 606.811 514.172 340.794 637.822 1437.09 440.988 375.062 280.973 262.894 197.538 144.885 117.929 118.05 100.521 179.47 239.971 146.001 173.889 180.071 263.212 161.005 131.267 285.085 343.102 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 937.366 932.939 944.189 998.678 1069.68 1157.22 1171.19 1130.81 1080.77 1028.77 971.363 1177.76 1436.17 1266.67 1106.19 1468.13 1717.57 1870.77 2025.63 2043.46 1493.71 1418.39 1466.91 1080.3 882.375 812.608 939.8 937.754 946.055 973.393 916.881 905.858 857.346 753.588 572.591 636.036 884.527 685.999 384.541 347.743 405.784 333.648 425.341 442.997 312.167 260.172 220.482 163.271 179.958 181.469 97.9231 141.088 230.874 145.351 201.123 303.613 321.015 264.312 172.66 316.319 372.465 452.502 478.046 383.574 308.082 384.698 874.696 2087.07 826.071 400.755 602.199 476.983 343.022 310.895 277.72 246.104 310.961 181.713 116.38 119.638 165.108 93.5725 199.902 180.92 163.745 153.375 192.618 197.436 160.66 334.799 286.295 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1051.57 1068.99 1104.27 1151.66 1206.76 1243.11 1205.37 1169.71 1177.26 1236.18 1351.57 1594.55 1783.22 1788.61 1878.41 2075.2 2237.19 2346.66 1897.19 1703.17 1902.69 1191.56 632.076 830.898 791.731 790.417 887.578 899.88 955.314 1014.75 1034.93 969.658 966.984 969.913 905.822 619.858 1180.25 775.354 415.838 437.512 653.912 590.417 548.887 310.251 244.731 220.111 177.71 152.135 154.503 140.857 107.877 109.141 136.505 145.866 144.541 232.585 285.073 262.728 329.219 323.865 248.989 233.667 259.643 259.94 238.756 386.758 680.05 1036.69 759.541 498.716 511.275 334.007 342.054 265.526 198.552 258.566 229.319 220.08 131.213 120.032 141.339 101.74 134.831 205.149 233.562 170.748 416.974 313.812 322.482 1203.77 501.79 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1130.33 1121.39 1103.83 1076.37 1131.13 1203.77 1294.16 1466.68 1659.35 1974.15 2377.04 2609.45 2700.38 2221.41 1364.96 1294.55 1374.81 1625.97 1329.34 723.502 645.169 608.975 624.245 641.952 722.893 840.863 900.07 1016.76 1141.57 1270.59 1419.49 1488.24 1463.67 1396.07 1361.41 1250.76 947.328 509.09 577.219 785.735 584.27 206.817 164.617 254.489 148.681 142.98 116.184 115.883 158.581 130.671 71.0195 67.9125 115.863 143.874 102.672 124.172 158.126 149.434 192.465 229.152 196.301 160.092 159.9 193.562 325.079 527.7 569.779 576.987 315.3 382.235 441.164 251.406 537.996 260.007 270.694 186.088 170.909 145.477 86.5758 112.397 88.5681 100.183 137.685 147.673 249.403 336.008 415.594 1007.84 1048.78 542.208 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1129.66 1125.86 1124.03 1184.49 1252.88 1326.09 1475.99 1694.75 1938.63 2246.98 2563.17 2718.45 2874.02 2265.96 1703.16 1267.05 865.684 521.084 541.451 573.699 491.443 553.81 647.111 690.233 793.763 864.394 897.444 967.707 1025.88 1155.24 1427.11 1805.66 2238.26 2412.4 2095.52 1311.62 1030.06 494.254 266.708 191.668 160.998 162.853 209.806 132.222 112.579 146.154 97.0245 98.4381 138.262 149.306 98.7077 103.791 112.131 99.5533 133.843 294.887 279.307 191.499 300.294 227.21 212.365 150.537 137.826 188.223 281.796 394.093 408.452 601.125 446.546 316.036 461.495 444.893 748.666 308.909 197.816 250.16 152.059 124.698 73.3064 142.472 106.578 106.559 82.9572 286.618 314.492 379.648 1379.83 2711.02 569.648 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1272.24 1281.48 1299.31 1323.74 1353.35 1423.15 1581.95 1751.16 1889.91 2001.03 2013.34 1859.53 1536.11 982.59 654.274 558.114 471.453 396.031 388.94 399.615 425.827 604.826 756.419 859.812 767.138 793.268 857.72 821.975 925.362 1185.46 1461.37 1549.07 1724.98 1417.21 1098.41 1012.23 1030.31 713.734 398.072 288.682 229.114 205.806 178.006 98.4912 104.695 152.317 117.066 134.297 136.541 132.842 129.353 122.758 90.6572 172.207 243.016 236.551 218.069 223.6 267.627 271.595 340.369 145.506 129.776 173.033 248.641 303.074 394.694 634.348 501.575 519.133 543.625 504.608 1504.85 321.785 262.291 399.417 262.367 152.176 121.887 176.807 99.3546 215.477 140.627 360.281 335.532 844.862 1154.56 1284.76 575.393 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1274.88 1272.12 1268.21 1286.4 1378.22 1481.7 1554.03 1491.93 1413.07 1214.51 989.563 737.538 493.287 420.031 361.419 295.194 299.151 384.111 474.681 583.006 690.994 748.846 729.775 586.846 681.783 775.732 866.222 868.269 978.808 997.563 887.675 609.527 446.13 590.746 801.51 808.21 505.822 229.993 242.394 181.195 133.274 98.6697 104.671 144.373 150.993 176.88 205.83 250.383 100.729 113.891 103.605 95.8475 146.734 288.092 254.436 132.791 140.073 190.028 387.166 372.97 169.205 203.838 234.53 285.245 354.775 505.682 659.587 538.899 950.069 660.615 2374.51 871.85 433.64 449.547 507.736 277.436 191.521 264.75 133.622 91.7999 165.163 142.429 199.032 1779.95 1932.17 1160.45 1020.58 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1188.38 1190.12 1210.93 1239.21 1269.27 1298.53 1202.85 1096.93 957.55 780.256 601.944 433.553 311.251 283.495 265.959 256.354 346.877 468.938 648.683 726.401 762.298 756.935 695.699 616.296 539.622 670.777 812.918 895.538 643.782 465.853 385.729 422.72 510.031 591.302 724.95 755.028 548.42 247.588 265.112 191.09 115.398 102.81 144.815 159.731 181.286 224.158 228.345 147.26 113.975 138.817 148.638 135.617 158.891 156.318 112.088 131.866 114.068 158.76 233.295 245.983 472.784 522.441 594.131 733.095 451.473 646.132 907.505 1598.76 2213.19 2213.38 890.746 300.771 261.694 324.823 460.906 179.077 200.768 351.389 144.368 142.832 226.141 244.973 907.343 1224.09 1133.35 1098.75 939.28 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1147.77 1136.15 1108.17 1064.57 1005.39 892.227 760.63 628.863 605.031 593.824 572.379 556.98 468.578 356.048 356.016 355.92 394.614 462.431 545.487 694.594 739.018 685.402 781.279 711.334 503.965 770.739 830.875 717.389 520.779 355.758 370.388 415.916 520.972 843.447 711.086 532.9 486.78 410.744 281.5 139.252 156.797 168.143 162.087 171.657 184.533 198.658 189.397 170.806 164.471 165.681 141.86 142.517 135.874 104.471 170.436 225.941 177.08 162.263 240.251 442.368 1070.08 867.729 715.089 1310.51 600.817 1014.36 1162.98 1497.36 1326.38 590.228 274.127 369.757 274.789 217.512 199.007 220.968 235.204 239.58 235.372 306.011 283.681 428.4 610.041 1183.46 824.148 927.239 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 828.229 807.714 763.594 686.613 596.227 495.27 494.763 501.305 503.978 503.632 508.751 529.195 468.406 308.908 308.321 380.561 433.374 507.151 628.351 722.645 794.534 822.292 954.294 1129.18 1169.83 728.299 624.577 614.45 508.886 838.53 619.126 686.948 1053.38 1256.44 1643.7 772.956 401.722 261.175 173.116 213.518 205.149 188.508 120.559 267.348 369.289 353.398 346.704 228.084 211.852 182.876 117.915 106.299 141.905 238.82 266.486 266.302 265.721 326.459 542.752 1089.05 737.677 704.654 1042.6 753.547 788.379 605.417 871.768 907.974 362.255 301.686 163.041 207.368 229.163 307.567 309.378 218.917 242.531 308.73 293.215 349.334 365.467 401.653 674.344 863.087 701.888 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 802.127 781.875 728.65 647.881 542.99 513.152 477.987 441.786 424.377 404.203 471.761 545.388 500.178 481.749 504.956 554.7 590.541 841.6 1108 1236.98 1073.34 909.618 1203.81 1193.32 1189.41 1338 1032.57 880.851 807.207 717.226 1065.92 1890.13 1934.18 1471.86 1075.7 622.796 715.876 333.624 157.768 142.444 142.505 117.041 133.403 247.324 441.883 319.436 395.288 218.546 227.896 256.959 173.883 175.556 153.387 224.713 169.582 348.35 416.255 391.66 475.073 680.742 497.767 509.075 779.126 591.29 335.325 367.527 579.381 603.672 196.804 127.466 152.333 148.633 303.488 253.964 281.182 211.814 291.881 334.26 325.892 246.097 470.168 315.992 324.235 622.7 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 621.205 580.047 541.046 509.305 471.271 429.911 399.238 364.622 341.726 318.824 451.387 685.181 849.445 983.46 707.923 518.415 610.752 905.912 1254.78 1038.45 889.349 803.397 762.037 1141.77 1363.31 1141.5 789.501 642.018 1044.01 1912.46 1989.65 2993.64 2503.73 1523.44 763.362 277.47 328.115 249.914 165.421 113.176 101.562 101.472 192.005 274.036 207.103 270.872 242.545 267.083 191.406 259.266 158.765 156.275 132.769 185.494 281.062 432.582 410.783 432.029 586.887 688.311 500.364 409.813 293.434 189.047 351.355 393.936 331.495 220.554 139.234 172.51 173.638 192.418 250.395 264.331 185.587 276.221 432.719 306.396 396.527 335.111 225.996 429.514 555.666 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 781.593 759.683 697.327 599.491 507.178 488.026 466.709 443.253 416.797 399.184 413.136 450.262 547.763 662.792 797.255 710.66 584.663 833.009 859.786 708.034 804.516 882.812 969.431 1066.3 1279.99 1248.1 803.145 914.886 1509.97 1571.51 1419.53 2378.43 1949.33 1189.78 640.643 363.814 280.913 345.917 194.304 149.628 102.315 113.27 145.463 116.667 134.215 184.775 182.081 224.595 342.336 361.319 283.73 176.433 159.798 175.485 296.644 384.503 361.439 331.142 800.718 682.37 346.189 242.416 171.745 140.473 191.613 179.057 180.832 497.098 228.872 201.5 128.453 189.395 237.668 233.906 280.947 456.949 285.068 186.942 235.52 154.517 346.242 293.082 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 779.822 769.573 743.915 705.887 656.42 637.695 653.235 672.913 698.263 726.324 837.433 929.275 1051.94 1083.77 938.275 923.405 954.31 868.796 945.332 1170.15 1578.54 1571.52 1385.07 1966.78 1359.3 1020.9 1288.61 1285.89 1089.58 1176.96 1402.19 1504.51 928.374 667.692 427.373 345.466 287.009 199.648 166.304 148.156 154.394 87.7061 111.861 114.178 126.655 116.828 172.475 160.866 202.668 228.763 165.713 161.442 187.78 242.617 235.48 291.3 352.857 456.387 292.353 259.375 219.62 166.12 189.827 172.035 132.768 144.077 136.52 181.474 198.185 144.576 201.311 287.445 291.052 413.965 323.381 186.941 103.327 192.338 986.71 245.064 429.915 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 888.067 876.267 840.2 786.411 816.749 853.115 895.164 933.122 957.076 805.781 602.73 600.406 686.323 782.403 831.519 827.551 898.353 1006.54 1183.03 1429 1702.75 1401.7 1335.57 1608.57 2889.2 1777.03 933.852 709.61 766.206 864.241 996.43 981.694 788.931 524.819 373.081 309.672 242.476 182.251 165.463 176.172 164.398 143.436 150.036 135.63 159.802 227.474 150.348 139.15 147.891 203.185 148.941 204.865 246.142 241.866 223.393 214.705 191.832 155.999 279.492 225.016 188.016 198.431 230.132 137.602 154.068 194.26 179.405 348.933 157.998 176.98 253.165 280.816 395.01 277.859 205.059 124.468 132.257 235.45 262.171 189.89 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 841.297 823 787.049 734.376 676.279 633.144 594.572 589.521 607.953 741.391 971.316 931.593 723.48 792.41 909.71 1034.67 1382.31 1949.91 1281.31 917.081 948.547 1121.61 1345.44 1235.81 944.046 673.349 571.963 605.668 724.811 761.529 662.921 531.915 417.524 340.056 289.274 238.01 164.875 157.377 150.595 164.697 174.847 160.253 195.529 215.217 187.188 248.617 289.683 260.906 234.835 218.416 224.576 263.413 243.904 286.524 159.236 161.652 198.896 304.27 167.161 178.163 329.44 247.047 310.792 198.022 157.132 163.633 117.185 132.57 277.292 255.833 290.095 237.13 265.488 147.106 242.05 337.04 369.238 273.866 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 871.868 845.399 779.295 689.752 586.605 620.567 684.77 728.556 733.19 725.845 723.542 776.61 899.178 988.686 1136.14 1973.54 1651.55 605.828 583.265 652.95 700.09 501.292 686.063 771.336 659.349 442.798 506.968 530.022 503.075 461.801 396.262 327.726 273.281 245.387 215.249 174.158 151.319 144.975 168.64 222.781 205.728 372.94 220.639 182.487 165.694 233.735 268.326 198.814 140.596 189.736 297.692 132.11 162.772 176.018 181.882 237.425 179.098 119.844 186.328 222.543 258.688 279.415 192.24 112.314 145.247 153.88 160.504 294.397 202.483 165.889 248.839 175.825 247.299 351.761 394.622 314.674 304.252 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 925.674 915.072 885.824 885.527 905.788 913.037 836.381 694.559 612.353 704.846 959.291 1631.36 1662.62 860.043 1019.28 1228.03 741.026 506.748 404.092 352.612 398.651 582.054 947.273 784.058 567.089 421.879 435.593 435.784 388.583 350.66 306.187 245.421 209.612 211.67 176.536 149.064 157.711 166.647 201.651 255.592 299.853 366.861 246.274 176.713 142.956 179.542 226.282 228.615 213.128 168.463 126.819 126.529 209.896 202.887 199.459 171.603 132.726 129.846 218.801 268.178 324.444 183.842 163.662 120.132 254.929 301.489 193.158 227.116 157.02 151.575 243.878 278.356 265.534 317.595 303.341 220.25 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1008.64 945.484 833.17 698.322 624.974 530.426 547.142 803.184 1277.85 2382.3 2724.65 1286.24 620.242 636.474 543.697 471.448 473.639 396.858 333.237 348.676 787.02 879.875 603.903 374.182 314.17 317.721 334.995 312.502 265.389 231.822 200.233 183.7 171.169 142.014 139.724 192.189 161.626 263.524 256.392 416.375 351.322 201.466 130.867 200.022 274.547 237.436 147.23 120.871 106.854 127.452 232.044 271.657 218.321 169.145 218.891 379.578 271.4 268.416 229.886 302.395 529.341 273.25 352.199 347.374 346.926 185.625 230.587 177.628 176.84 227.007 158.341 202.978 197.303 227.161 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1010.64 925.47 797.652 642.492 983.568 1442.48 1903.05 2322.93 2450.75 1519.88 837.878 558.005 429.539 414.12 471.722 462.454 368.407 295.757 473.208 829.552 602.798 417.32 292.619 243.685 303.146 357.807 294.395 208.796 189.648 185.737 184.067 151.414 146.23 160.597 168.409 207.576 275.245 250.376 333.07 465.044 316.611 130.725 133.326 193.032 92.5538 149.327 165.517 178.147 198.564 249.202 257.129 196.044 231.482 394.821 548.741 275.636 214.073 285.283 370.485 402.013 318.189 194.884 366.234 239.36 155.644 226.383 161.552 150.136 194.287 180.677 172.078 257.368 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1019.26 1150.39 1338.06 1565.76 1796.9 2031.86 2074.97 1748.35 1382.53 886.889 593.624 523.175 465.219 406.089 389.254 340.513 336.801 688.538 624.755 431.037 287.177 237.026 348.282 384.283 224.638 218.351 178.095 159.851 141.778 129.31 148.831 138.477 150.151 173.435 244.057 270.278 263.13 295.26 287.151 255.063 214.365 156.653 129.736 137.126 158.08 169.395 138.568 143.404 174.815 182.156 234.426 295.577 396.727 342.257 285.249 309.752 350.597 477.164 389.667 219.042 305.915 271.382 209.559 107.98 269.263 110.85 219.956 166.663 157.14 259.441 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1518.29 1521.23 1529.4 1538.29 1544.53 1547.51 1554.89 1443.69 1184.47 968.338 784.032 573.689 337.129 370.393 390.233 375.714 529.953 585.048 486.613 304.68 215.597 225.446 327.368 240.4 229.422 228.249 212.941 211.318 130.536 156.737 158.658 163.61 177.98 211.514 279.249 333.617 271.549 240.044 261.311 228.462 177.967 193.826 193.971 112.531 166.215 132.114 149.969 209.102 259.849 220.9 256.099 323.056 335.378 245.059 301.525 460.086 385.141 471.591 329.173 215.37 332.286 302.085 160.309 183.653 140.136 275.987 143.405 163.181 295.751 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1253.74 1259.49 1267.46 1273.32 1273.7 1239.25 1203.95 1131.37 1047.88 847.748 572.708 545.642 546.164 550.894 550.998 526.811 442.751 313.618 210.259 199.072 181.616 236.546 306.473 316.145 286.637 307.495 231.421 162.707 168.188 189.228 205.231 211.259 274.485 337.895 328.839 298.232 308.252 302.866 264.381 204.307 154.978 174.192 186.023 185.831 170.41 272.907 413.607 305.342 214.527 341.933 319.782 258.469 227.86 311.506 405.827 370.292 429.148 380.459 275.572 201.042 259.593 203.255 160.054 216.127 151.254 171.982 341.065 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1121.45 1115.48 1099.26 1072.31 1047.75 1071.25 1094.19 1004.55 918.214 768.623 626.64 636.271 616.89 570.338 449.866 322.443 200.871 194.143 194.916 225.517 303.227 303.173 286.684 249.452 220.715 228.258 235.624 196.218 227.76 245.804 275.853 317.483 273.488 283.19 259.335 304.461 477.205 286.321 210.581 255.032 277.106 268.425 320.904 225.496 329.138 346.447 268.234 299.411 302.626 238.939 281.432 310.399 402.691 372.201 481.365 518.037 290.211 308.581 395.838 221.377 260.95 239.216 188.67 218.735 365.664 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1024 1015.16 992.344 956.009 952.235 978.402 977.784 904.164 824.615 682.809 580.617 527.859 474.159 395.461 257.388 235.937 269.742 349.46 348.475 311.096 245.374 181.213 240.301 235.496 255.516 241.573 219.268 220.587 200.037 260.118 277.283 243.747 241.393 251.343 341.694 356.454 314.726 259.149 246.028 302.658 249.368 232.957 290.386 303.35 268.617 255.05 269.841 227.933 232.11 328.384 373.448 351.801 351.917 484.63 413.926 285.01 297.907 244.336 307.529 348.419 257.229 322.42 495.572 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 956.804 947.126 923.614 892.919 894.253 892.703 821.52 726.317 640.205 547.413 553.75 514.021 357.656 286.911 292.465 425.79 426.721 389.481 318.581 200.522 223.819 226.452 204.264 197.223 244.024 192.611 185.229 183.635 236.162 242.674 193.604 208.729 264.172 301.939 240.091 185.256 217.022 258.767 244.07 231.178 269.664 275.586 238.891 238.95 277.989 248.132 230.598 266.285 307.947 285.206 280.012 321.769 254.626 277.6 309.216 364.836 401.031 341.9 380.079 408.258 561.306 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 852.989 837.401 798.159 766.376 728.782 680.227 616.711 577.218 620.412 699.906 841.002 829.29 770.151 682.607 561.916 433.821 316.626 289.838 311.963 299.547 231.368 216.297 255.78 260.126 247.953 216.361 180.397 198.117 155.772 189.437 244.532 254.131 368.977 264.706 201.048 135.985 274.849 234.281 236.087 281.857 225.842 236.939 269.334 243.608 214.742 234.452 272.189 304.319 263.892 238.922 207.558 298.022 396.093 448.714 471.464 399.769 474.817 425.697 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 909.295 861.43 784.017 681.346 704.496 729.221 815.794 910.238 966.302 972.153 875.407 695.227 530.58 438.423 479.937 480.241 442.838 401.878 393.338 402.989 369.268 309.766 281.517 245.193 198.047 193.136 187.662 254.927 301.656 299.311 231.235 175.406 188.011 215.928 269.447 259.792 244.015 251.861 238.279 283.029 210.499 189.798 259.147 248.664 233.221 318.661 306.434 250.81 306.34 326.57 330.652 418.614 397.392 384.979 402.309 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 899.509 882.986 851.19 846.048 834.209 860.803 916.156 880.521 807.768 704.337 602.491 501.938 486.991 447.669 400.656 393.792 400.455 393.956 372.549 347.364 335.834 289.823 255.058 237.889 230.466 241.839 247.773 236.008 227.561 266.31 281.63 231.496 302.055 185.12 226.685 199.23 198.65 194.675 203.837 201.253 325.6 248.609 232.692 276.945 273.926 344.005 285.882 355.388 325.569 406.651 471.783 405.917 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 948.084 945.39 934.111 914.47 970.769 1093.65 985.466 654.581 522.895 468.289 489.54 494.033 481.412 444.582 436.272 417.184 397.107 404.225 403.129 345.494 381.529 375.655 307.358 321.373 321.323 268.333 200.29 246.08 216.161 261.977 216.499 220.326 236.304 202.776 166.141 177.796 210.867 263.526 292.528 242.574 249.481 317.97 296.536 281.405 270.328 260.837 311.486 393.612 370.682 469.749 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 703.487 664.229 634.751 611.81 611.279 618.235 596.08 563.112 518.543 465.617 408.191 431.213 430.051 445.314 519.588 485.432 443.902 455.727 445.932 406.943 436.685 328.341 300.864 353.791 320.383 261.548 298.145 271.055 284.526 228.127 197.754 203.451 204.91 245.753 319.741 311.407 279.032 282.957 283.864 317.677 250.657 235.971 211.253 247.314 322.708 448.33 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 628.275 590.899 571.401 552.459 526.775 501.941 452.842 426.9 428.421 432.428 484.92 534.26 445.734 425.613 397.515 380.566 398.98 429.881 377.143 374.317 399.3 370.291 391.442 442.584 316.076 282.186 250.862 229.943 229.362 230.371 228.134 333.494 369.006 319.883 325.687 335.044 279.046 282.177 278.53 236.187 258.747 386.216 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 583.543 577.432 578.799 553.29 477.24 483.425 539.265 483.248 430.91 395.086 369.105 404.103 420.509 384.942 323.418 369.967 336.508 364.19 357.551 362.671 317.242 313.164 324.621 279.109 207.495 221.677 235.851 226.94 288.556 349.059 380.429 413.918 399.113 343.726 391.415 382.35 397.284 367.212 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 618.989 665.976 652.504 566.79 508.569 471.978 465.976 456.642 403.922 389.138 314.631 304.89 372.956 378.036 348.993 270.468 306.572 297.857 289.356 313.174 282.525 335.017 292.014 294.827 314.21 385.881 372.784 453.401 489.151 424.867 424.91 476.625 495.615 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 738.351 772.692 603.537 418.988 415.034 375.821 320.267 385.222 382.553 401.357 425.575 401.585 408.324 386.226 578.565 447.192 451.199 344.814 426.824 422.922 359.686 376.213 404.257 385.14 406.678 363.859 519.142 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 707.175 646.844 534.538 513.754 501.448 488.714 490.033 582.558 473.724 370.531 365.905 351.815 324.968 363.602 323.122 446.489 388.559 323.693 286.358 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/physics/tests/test_differential_rotation.py0000644000175100001710000005025100000000000023715 0ustar00vstsdockerimport os import numpy as np import pytest import astropy.units as u from astropy.coordinates import Longitude, SkyCoord from astropy.tests.helper import assert_quantity_allclose from astropy.time import TimeDelta import sunpy.data.test import sunpy.map from sunpy.coordinates import frames from sunpy.coordinates.ephemeris import get_earth from sunpy.coordinates.metaframes import RotatedSunFrame from sunpy.coordinates.transformations import transform_with_sun_center from sunpy.map.maputils import map_edges from sunpy.physics.differential_rotation import ( _get_bounding_coordinates, _get_extreme_position, _get_new_observer, _rotate_submap_edge, _warp_sun_coordinates, diff_rot, differential_rotate, solar_rotate_coordinate, ) # 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 all_off_disk_map(aia171_test_map): return aia171_test_map.submap((1, 1)*u.pix, top_right=(11, 12)*u.pix) @pytest.fixture def all_on_disk_map(aia171_test_map): return aia171_test_map.submap((30, 60)*u.pix, top_right=(50, 85)*u.pix) @pytest.fixture def straddles_limb_map(aia171_test_map): return aia171_test_map.submap((64, 80)*u.pix, top_right=(120, 127)*u.pix) @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, top_right=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_rigid(seconds_per_day): rot = diff_rot(10 * seconds_per_day, [0, 30, 60] * u.deg, rot_type='rigid') assert_quantity_allclose(rot, [141.844 * u.deg] * 3, 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 obs_time = '2010-09-10 12:34:56' observer = get_earth(obs_time) c = SkyCoord(-570*u.arcsec, 120*u.arcsec, obstime=obs_time, observer=observer, frame=frames.Helioprojective) new_time = '2010-09-11 12:34:56' new_observer = get_earth(new_time) # Test that when both the observer and the time are specified, an error is raised. with pytest.raises(ValueError): d = solar_rotate_coordinate(c, observer=observer, time=new_time) # Test that the code properly filters the observer keyword with pytest.raises(ValueError): d = solar_rotate_coordinate(c, observer='earth') # Test that the code properly filters the time keyword with pytest.raises(ValueError): with pytest.warns(UserWarning, match="Using 'time' assumes an Earth-based observer"): d = solar_rotate_coordinate(c, time='noon') # Test that the code gives the same output for multiple different inputs # that define the same observer location and time. for i, definition in enumerate((1 * u.day, TimeDelta(1*u.day), new_time, new_observer)): if i in (0, 1, 2): with pytest.warns(UserWarning, match="Using 'time' assumes an Earth-based observer"): d = solar_rotate_coordinate(c, time=definition) else: d = solar_rotate_coordinate(c, observer=definition) # Test that a SkyCoordinate is created assert isinstance(d, SkyCoord) # Test the coordinate np.testing.assert_almost_equal(d.Tx.to(u.arcsec).value, -386.4519332773052, decimal=1) np.testing.assert_almost_equal(d.Ty.to(u.arcsec).value, 106.1647811048218, decimal=1) np.testing.assert_allclose(d.distance.to(u.km).value, 1.499689e+08, rtol=1e-5) # Test that the SkyCoordinate is Helioprojective assert isinstance(d.frame, frames.Helioprojective) def test_consistency_with_rotatedsunframe(): old_observer = frames.HeliographicStonyhurst(10*u.deg, 20*u.deg, 1*u.AU, obstime='2001-01-01') new_observer = frames.HeliographicStonyhurst(30*u.deg, 40*u.deg, 2*u.AU, obstime='2001-01-08') hpc_coord = SkyCoord(100*u.arcsec, 200*u.arcsec, frame='helioprojective', observer=old_observer, obstime=old_observer.obstime) # Perform the differential rotation using solar_rotate_coordinate() result1 = solar_rotate_coordinate(hpc_coord, observer=new_observer) # Perform the differential rotation using RotatedSunFrame, with translational motion of the Sun # ignored using transform_with_sun_center() rsf_coord = RotatedSunFrame(base=hpc_coord, rotated_time=new_observer.obstime) with transform_with_sun_center(): result2 = rsf_coord.transform_to(result1.replicate_without_data()) assert_quantity_allclose(result1.Tx, result2.Tx) assert_quantity_allclose(result1.Ty, result2.Ty) assert_quantity_allclose(result1.distance, result2.distance) # Testing using observer inputs def test_differential_rotate_observer_all_off_disk(all_off_disk_map): # Test a map that is entirely off the disk of the Sun # Should report an error with pytest.raises(ValueError): differential_rotate(all_off_disk_map) def test_differential_rotate_observer_full_disk(aia171_test_map): # Test a full disk map new_observer = get_earth(aia171_test_map.date + 6*u.hr) dmap = differential_rotate(aia171_test_map, observer=new_observer) assert dmap.data.shape == aia171_test_map.data.shape assert dmap.date.isot == new_observer.obstime.isot assert dmap.heliographic_latitude == new_observer.lat assert dmap.heliographic_longitude == new_observer.lon def test_differential_rotate_observer_all_on_disk(all_on_disk_map): # Test a map that is entirely on disk - triggers sub full disk branches # Rotated map should have a smaller extent in the x - direction new_observer = get_earth(all_on_disk_map.date - 48*u.hr) dmap = differential_rotate(all_on_disk_map, observer=new_observer) assert dmap.data.shape[1] < all_on_disk_map.data.shape[1] # This rotated map should have a larger extent in the x direction new_observer = get_earth(all_on_disk_map.date + 48*u.hr) dmap = differential_rotate(all_on_disk_map, observer=new_observer) assert dmap.data.shape[1] > all_on_disk_map.data.shape[1] assert dmap.date.isot == new_observer.obstime.isot assert dmap.heliographic_latitude == new_observer.lat assert dmap.heliographic_longitude == new_observer.lon def test_differential_rotate_observer_straddles_limb(straddles_limb_map): # Test a map that straddles the limb - triggers sub full disk branches # Rotated map should have a smaller extent in the x - direction new_observer = get_earth(straddles_limb_map.date + 48*u.hr) # Ignore some invalid NaN comparisons within astropy # (fixed in astropy 4.0.1 https://github.com/astropy/astropy/pull/9843) with np.errstate(invalid='ignore'): dmap = differential_rotate(straddles_limb_map, observer=new_observer) assert dmap.data.shape[1] < straddles_limb_map.data.shape[1] # The output map should have the positional properties of the observer assert dmap.date.isot == new_observer.obstime.isot assert dmap.heliographic_latitude == new_observer.lat assert dmap.heliographic_longitude == new_observer.lon # ----- Testing with time input ----- def test_differential_rotate_time_full_disk(aia171_test_map): # Test a full disk map new_time = aia171_test_map.date + 6*u.hr with pytest.warns(UserWarning, match="Using 'time' assumes an Earth-based observer"): dmap = differential_rotate(aia171_test_map, time=new_time) assert dmap.data.shape == aia171_test_map.data.shape # The output map should have the same time as the new time now. assert dmap.date.isot == new_time.isot def test_differential_rotate_time_all_on_disk(all_on_disk_map): # Test a map that is entirely on disk - triggers sub full disk branches # Rotated map should have a smaller extent in the x - direction new_time = all_on_disk_map.date - 48*u.hr with pytest.warns(UserWarning, match="Using 'time' assumes an Earth-based observer"): dmap = differential_rotate(all_on_disk_map, time=new_time) assert dmap.data.shape[1] < all_on_disk_map.data.shape[1] # This rotated map should have a larger extent in the x direction new_time = all_on_disk_map.date + 48*u.hr with pytest.warns(UserWarning, match="Using 'time' assumes an Earth-based observer"): dmap = differential_rotate(all_on_disk_map, time=new_time) assert dmap.data.shape[1] > all_on_disk_map.data.shape[1] # The output map should have the same time as the new time now. assert dmap.date.isot == new_time.isot def test_differential_rotate_time_straddles_limb(straddles_limb_map): # Test a map that straddles the limb - triggers sub full disk branches # Rotated map should have a smaller extent in the x - direction new_time = straddles_limb_map.date + 48*u.hr # Ignore some invalid NaN comparisons within astropy # (fixed in astropy 4.0.1 https://github.com/astropy/astropy/pull/9843) with np.errstate(invalid='ignore'): with pytest.warns(UserWarning, match="Using 'time' assumes an Earth-based observer"): dmap = differential_rotate(straddles_limb_map, time=new_time) assert dmap.data.shape[1] < straddles_limb_map.data.shape[1] # The output map should have the same time as the new time now. assert dmap.date.isot == new_time.isot def test_differential_rotate_time_off_disk(all_off_disk_map): # Test a map that is entirely off the disk of the Sun # Should report an error new_time = all_off_disk_map.date + 48*u.hr with pytest.raises(ValueError): differential_rotate(all_off_disk_map, time=new_time) # Tests of the helper functions def test_get_new_observer(aia171_test_map): initial_obstime = aia171_test_map.date rotation_interval = 2 * u.day new_time = initial_obstime + rotation_interval time_delta = new_time - initial_obstime observer = get_earth(initial_obstime + rotation_interval) # The observer time is set along with other definitions of time for time in (rotation_interval, new_time, time_delta): with pytest.raises(ValueError): new_observer = _get_new_observer(initial_obstime, observer, time) # Obstime property is present but the value is None observer_obstime_is_none = SkyCoord(12*u.deg, 46*u.deg, frame=frames.HeliographicStonyhurst) with pytest.raises(ValueError): new_observer = _get_new_observer(None, observer_obstime_is_none, None) # When the observer is set, it gets passed back out new_observer = _get_new_observer(initial_obstime, observer, None) assert isinstance(new_observer, SkyCoord) np.testing.assert_almost_equal(new_observer.transform_to(frames.HeliographicStonyhurst).lon.to(u.deg).value, observer.transform_to(frames.HeliographicStonyhurst).lon.to(u.deg).value, decimal=3) np.testing.assert_almost_equal(new_observer.transform_to(frames.HeliographicStonyhurst).lat.to(u.deg).value, observer.transform_to(frames.HeliographicStonyhurst).lat.to(u.deg).value, decimal=3) np.testing.assert_almost_equal(new_observer.transform_to(frames.HeliographicStonyhurst).radius.to(u.au).value, observer.transform_to(frames.HeliographicStonyhurst).radius.to(u.au).value, decimal=3) # When the time is set, a coordinate for Earth comes back out for time in (rotation_interval, new_time, time_delta): with pytest.warns(UserWarning, match="Using 'time' assumes an Earth-based observer"): new_observer = _get_new_observer(initial_obstime, None, time) assert isinstance(new_observer, SkyCoord) np.testing.assert_almost_equal(new_observer.transform_to(frames.HeliographicStonyhurst).lon.to(u.deg).value, observer.transform_to(frames.HeliographicStonyhurst).lon.to(u.deg).value, decimal=3) np.testing.assert_almost_equal(new_observer.transform_to(frames.HeliographicStonyhurst).lat.to(u.deg).value, observer.transform_to(frames.HeliographicStonyhurst).lat.to(u.deg).value, decimal=3) np.testing.assert_almost_equal(new_observer.transform_to(frames.HeliographicStonyhurst).radius.to(u.au).value, observer.transform_to(frames.HeliographicStonyhurst).radius.to(u.au).value, decimal=3) # The observer and the time cannot both be None with pytest.raises(ValueError): new_observer = _get_new_observer(initial_obstime, None, None) def test_rotate_submap_edge(aia171_test_map, all_off_disk_map, all_on_disk_map, straddles_limb_map): observer = get_earth(aia171_test_map.date + 2*u.day) # For a map that has all the edges off disk, the function should # return just the edges of the map - no solar rotation applied. for this_map in (aia171_test_map, all_off_disk_map): edges = map_edges(this_map) for this_edge in range(0, 4): pixels = edges[this_edge] res = _rotate_submap_edge(this_map, pixels, observer) assert all(res.Tx == (this_map.pixel_to_world(pixels[:, 0], pixels[:, 1])).Tx) assert all(res.Ty == (this_map.pixel_to_world(pixels[:, 0], pixels[:, 1])).Ty) # For an on disk map, all the edges should change edges = map_edges(all_on_disk_map) for this_edge in range(0, 4): pixels = edges[this_edge] res = _rotate_submap_edge(all_on_disk_map, pixels, observer) assert all(res.Tx != (all_on_disk_map.pixel_to_world(pixels[:, 0], pixels[:, 1])).Tx) assert all(res.Ty != (all_on_disk_map.pixel_to_world(pixels[:, 0], pixels[:, 1])).Ty) # For the limb map, two of the edges move and two do not edges = map_edges(straddles_limb_map) for this_edge in (0, 3): # Top and right edges do not move pixels = edges[this_edge] res = _rotate_submap_edge(straddles_limb_map, pixels, observer) assert all(res.Tx == (straddles_limb_map.pixel_to_world(pixels[:, 0], pixels[:, 1])).Tx) assert all(res.Ty == (straddles_limb_map.pixel_to_world(pixels[:, 0], pixels[:, 1])).Ty) for this_edge in (1, 2): # Bottom and left edges do move pixels = edges[this_edge] res = _rotate_submap_edge(straddles_limb_map, pixels, observer) # Ignore some invalid NaN comparisons within astropy # (fixed in astropy 4.0.1 https://github.com/astropy/astropy/pull/9843) with np.errstate(invalid='ignore'): assert all(res.Tx != (straddles_limb_map.pixel_to_world(pixels[:, 0], pixels[:, 1])).Tx) assert all(res.Ty != (straddles_limb_map.pixel_to_world(pixels[:, 0], pixels[:, 1])).Ty) def test_get_extreme_position(): # Ignore some invalid NaN comparisons within astropy # (fixed in astropy 4.0.1 https://github.com/astropy/astropy/pull/9843) with np.errstate(invalid='ignore'): coords = SkyCoord([-1, 0, 1, np.nan]*u.arcsec, [-2, 0, 2, -np.nan] * u.arcsec, frame=frames.Helioprojective) with pytest.warns(RuntimeWarning, match='All-NaN axis encountered'): assert _get_extreme_position(coords, 'Tx', operator=np.nanmin) == -1 assert _get_extreme_position(coords, 'Ty', operator=np.nanmin) == -2 assert _get_extreme_position(coords, 'Tx', operator=np.nanmax) == 1 assert _get_extreme_position(coords, 'Ty', operator=np.nanmax) == 2 with pytest.raises(ValueError): _get_extreme_position(coords, 'lon', operator=np.nanmax) def test_get_bounding_coordinates(): coords = SkyCoord([-1, 0, 1] * u.arcsec, [-2, 0, 2] * u.arcsec, frame=frames.Helioprojective, observer=get_earth("1999-09-13 00:00:00")) bl, tr = _get_bounding_coordinates(coords) assert bl.Tx == -1*u.arcsec assert bl.Ty == -2*u.arcsec assert bl.observer == coords[0].observer assert tr.Tx == 1*u.arcsec assert tr.Ty == 2*u.arcsec assert tr.observer == coords[0].observer def test_warp_sun_coordinates(all_on_disk_map): # Define an observer new_observer = get_earth(all_on_disk_map.date + 6*u.hr) dummy_array = np.zeros((500, 2)) # Call the warp xy2 = _warp_sun_coordinates(dummy_array, all_on_disk_map, new_observer) # Test the properties of the output assert xy2.shape == dummy_array.shape assert isinstance(xy2, np.ndarray) # Test the values - values are not independently found # We are passing in 500 pairs of (0,0) so all the output pixels should be the same np.testing.assert_almost_equal(xy2[:, 0], -2.08384686, decimal=2) np.testing.assert_almost_equal(xy2[:, 1], -0.23927568, decimal=2) @pytest.mark.array_compare def test_differential_rotation(aia171_test_map): with pytest.warns(UserWarning, match="Using 'time' assumes an Earth-based observer"): rot_map = differential_rotate(aia171_test_map, time=2*u.day) return rot_map.data ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/physics/tests/test_solar_rotation.py0000644000175100001710000001052600000000000022402 0ustar00vstsdocker# # Testing functions for a mapsequence solar derotation functionality. # import os from copy import deepcopy import numpy as np import pytest from numpy.testing import assert_allclose import astropy.units as u from astropy.coordinates import SkyCoord 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, mapsequence_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_mapsequence(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], sequence=True) # Known displacements for these mapsequence layers when the layer index is set to 0 @pytest.fixture def known_displacements_layer_index0(): return {'x': np.asarray([0., -9.827465, -19.676442]), 'y': np.asarray([0., 0.251137, 0.490014])} # Known displacements for these mapsequence layers when the layer index is set to 1 @pytest.fixture def known_displacements_layer_index1(): return {'x': np.asarray([9.804878, 0., -9.827465]), 'y': np.asarray([-0.263369, 0., 0.251137])} def test_calculate_solar_rotate_shift(aia171_test_mapsequence, known_displacements_layer_index0, known_displacements_layer_index1): # Test that the default works test_output = calculate_solar_rotate_shift(aia171_test_mapsequence) 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_mapsequence, layer_index=1) print(test_output['x'].to('arcsec').value) print(test_output['y'].to('arcsec').value) 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_mapsequence_solar_derotate(aia171_test_mapsequence, aia171_test_submap): # Test that a mapsequence is returned when the clipping is False. tmc = mapsequence_solar_derotate(aia171_test_mapsequence, clip=False) assert(isinstance(tmc, sunpy.map.MapSequence)) # 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 mapsequence is returned on default clipping (clipping is True) tmc = mapsequence_solar_derotate(aia171_test_mapsequence) assert(isinstance(tmc, sunpy.map.MapSequence)) # Test that the shape of data is correct when clipped clipped_shape = (26, 20) for m in tmc: assert(m.data.shape == clipped_shape) # Test that the returned reference pixels are correctly displaced. layer_index = 0 derotated = mapsequence_solar_derotate( aia171_test_mapsequence, clip=True, layer_index=layer_index) tshift = calculate_solar_rotate_shift(aia171_test_mapsequence, 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) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6492753 sunpy-3.1.5/sunpy/sun/0000755000175100001710000000000000000000000013707 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/sun/__init__.py0000644000175100001710000000004300000000000016015 0ustar00vstsdockerfrom sunpy.sun._constants import * ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/sun/_constants.py0000644000175100001710000002316500000000000016443 0ustar00vstsdocker""" This module provies a non-comprehensive collection of solar physical constants. """ # TODO: Need better sources for some constants as well as error values. import astropy.constants.astropyconst20 as astrocon import astropy.units as u from astropy.constants import Constant from astropy.time import Time __all__ = ['physical_constants'] physical_constants = {} # references gsfc_fact = "https://nssdc.gsfc.nasa.gov/planetary/factsheet/sunfact.html" allen = "Allen's Astrophysical Quantities 4th Ed." archinal = 'Archinal et al. 2018' asplund = "Asplund et al. 2006" fivian = "Fivian et al. 2008" meeus = "Meeus 1998 Astronomical Algorithms 2nd Ed." 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') # longitude of the prime meridian (without light travel time to Earth # and aberration effects) is 84.176 degrees eastward at J2000 physical_constants['W_0'] = Constant('W_0', 'longitude of the prime meridian (epoch J2000.0)', 84.176, 'deg', 0, archinal, system='si') # the definitional (fixed) rotation rate of the Sun relative to the stars (i.e., sidereal rotation rate) physical_constants['sidereal rotation rate'] = Constant('', 'sidereal rotation rate', 14.1844, 'deg day**-1', 0, archinal, system='si') # time in Julian Days (TT) of the start of the first Carrington rotation first_carrington_rotation = Time(2398167.4, format='jd', scale='tt') physical_constants['first Carrington rotation (JD TT)'] = Constant('', 'first Carrington ' 'rotation (JD TT)', first_carrington_rotation.tt.jd, 'day', 0.1, meeus, system='si') # length of the mean Carrington rotation as seen from Earth # the rotation rate of the Sun appears to be slower by the rate at which the Earth orbits the Sun period = 1 / (physical_constants['sidereal rotation rate'] / (360*u.deg) - 1 / u.yr) physical_constants['mean synodic period'] = Constant('', 'mean synodic period', period.to_value('day'), 'day', 0, archinal, system='si') # Sun's north pole is oriented RA=286.13 deg, Dec=63.87 deg in ICRS and HCRS physical_constants['alpha_0'] \ = Constant('alpha_0', 'right ascension (RA) of the north pole (epoch J2000.0)', 286.13, 'deg', 0, archinal, system='si') physical_constants['delta_0'] \ = Constant('delta_0', 'declination of the north pole (epoch J2000.0)', 63.87, 'deg', 0, archinal, system='si') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/sun/constants.py0000644000175100001710000001032700000000000016300 0ustar00vstsdocker""" This module provides fundamental solar physical constants. """ import io from astropy.table import Table from astropy.time import Time from sunpy.sun import _constants as _con __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', 'sidereal_rotation_rate', 'first_carrington_rotation', 'mean_synodic_period' ] constants = _con.physical_constants def get(key): """ Retrieve a constant by key. This is just a short cut into a dictionary. Parameters ---------- key : `str` Key in dictionary in ``constants``. Returns ------- constant : `~astropy.constants.Constant` See Also -------- `~sunpy.sun.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.9884754153381438e+30 uncertainty=9.236140093538353e+25 unit='kg' reference='IAU 2015 Resolution B 3 + CODATA 2014'> """ ret = constants[key] ret.__doc__ = ret.name return ret def find(sub=None): """ Return list of constants keys containing a given string. Parameters ---------- sub : `str`, optional Sub-string to search keys for. By default set to `None` and returns all keys. Returns ------- `None`, `list` The matching keys. See Also -------- `~sunpy.sun.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(): """ Provides a table of the complete list of constants. Returns ------- `astropy.table.Table` """ data_rows = [] for key, this_constant in constants.items(): 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 def _build_docstring(): """Build docstring containing RST-formatted table of constants.""" lines = ['The following constants are available:\n'] rows = [] for key, const in constants.items(): rows.append([key, const.value, const._unit_string, const.name]) table = Table(rows=rows, names=('Name', 'Value', 'Unit', 'Description')) table['Value'].info.format = '14.9g' f = io.StringIO() table.write(f, format='ascii.rst') lines.append(f.getvalue()) return '\n'.join(lines) # Add a table of constants to the docs if __doc__ is not None: __doc__ += _build_docstring() # Spectral class is not included in physical constants since it is not a number #: Spectral classification 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') sidereal_rotation_rate = get('sidereal rotation rate') #: Time of the start of the first Carrington rotation first_carrington_rotation = Time(get('first Carrington rotation (JD TT)'), format='jd', scale='tt') mean_synodic_period = get('mean synodic period') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/sun/models.py0000644000175100001710000000546200000000000015553 0ustar00vstsdocker""" Solar Physical Models --------------------- This module contains standard models of the Sun from various sources. All data is saved in `astropy.table.QTable` with an added attribute: * source : names the source of the data Object ------ interior : `astropy.table.QTable` The standard model of the solar interior. evolution : `astropy.table.QTable` The evolution as a function of time of the Sun. References ---------- * Adapted from Turck-Chieze et al. (1988) with composition: X = 0.7046, Y = 0.2757, Z = 0.0197 """ import astropy.units as u from astropy.table import QTable __all__ = ["interior", "evolution"] # 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] * u.Rsun # 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] * u.Msun # 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] * u.Lsun # 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] * u.MK # 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] * u.g*u.cm**-3 _d = {'radius': _radius, 'mass': _mass, 'luminosity': _luminosity, 'temperature': _temperature, 'density': _density} interior = QTable(_d) interior.source = 'Turck-Chieze et al. (1988)' interior.add_index('radius') # 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] * u.Gyr # 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] * u.Lsun # 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] * u.Rsun # 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] * u.MK _t = {'time': _time, 'luminosity': _tluminosity, 'radius': _tradius, 'central temperature': _tcentral_temperature} evolution = QTable(_t) evolution.source = 'Unknown' evolution.add_index('time') ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6492753 sunpy-3.1.5/sunpy/sun/tests/0000755000175100001710000000000000000000000015051 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/sun/tests/__init__.py0000644000175100001710000000000000000000000017150 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/sun/tests/test_constants.py0000644000175100001710000000442400000000000020502 0ustar00vstsdockerimport pytest from astropy.constants import Constant from astropy.table import Table from sunpy.sun import constants as con def test_find_all(): assert isinstance(con.find(), list) assert len(con.find()) == 34 def test_print_all(): table = con.print_all() assert isinstance(table, Table) assert len(table) == 34 @pytest.mark.parametrize('this_constant', [value for key, value in con.constants.items()]) 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 con.constants.items()]) 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 con.constants.items()]) 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 con.constants.items()]) def test_find_function2(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_function3(test_input): """ Test that the find function fails as expected. """ assert len(con.find(test_input)) == 0 def test_docstring(): """ Test that the docstring RST table has the correct number of constants. """ lines = con.__doc__.split('\n') description = 'The following constants are available:' assert description in lines # After the description line, there are five lines before the actual table # data begins (including a newline, RST headers, and column names). Count # the number of rows in the table until the RST column footer is reached. data_start_idx = lines.index(description) + 5 data_end_idx = data_start_idx for idx, line in enumerate(lines[data_start_idx:], data_start_idx): if line.startswith('='): data_end_idx = idx break num_rows = data_end_idx - data_start_idx assert num_rows == 34 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6532755 sunpy-3.1.5/sunpy/tests/0000755000175100001710000000000000000000000014244 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/tests/__init__.py0000644000175100001710000000000000000000000016343 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/tests/figure_hashes_mpl_332_ft_261_astropy_42_animators_100.json0000644000175100001710000002367500000000000027033 0ustar00vstsdocker{ "sunpy.map.tests.test_compositemap.test_plot_composite_map": "8160a5896607f62b7e7fa316236f565f54bd7a08f511808e98c9ad329678d21a", "sunpy.map.tests.test_compositemap.test_plot_composite_map_contours": "909ac12088dde3c15d0c7908f08b4b3c0da23e2a4966ed1ef8e705adb8727d2a", "sunpy.map.tests.test_compositemap.test_plot_composite_map_linewidths": "27aa1ac78d4e49f731bf1e43f4d2b398fe8a84d53ed9234794c7954fda54c45a", "sunpy.map.tests.test_compositemap.test_plot_composite_map_linestyles": "aa77398390f40d90f791a3fd45ff8d92b7fe98cc8332d9828acc31e7eddc5e88", "sunpy.map.tests.test_compositemap.test_plot_composite_map_colors": "ca7af0e1ee21df8b76bac76f27ac934c452f7906d4bc9000f1faa1dde742aa62", "sunpy.map.tests.test_compositemap.test_set_alpha_composite_map": "b9d729ff67b0307c037ac62f97c69bb80d22ad6679a0e56352075845d4ef732b", "sunpy.map.tests.test_compositemap.test_peek_composite_map": "bd1df27446d420f3e8cb6fa07daff88b77dd0f0441e4acf83ee48341a9e3218f", "sunpy.map.tests.test_mapbase.test_rotation_rect_pixelated_data": "3835ea8f163f8b843088524fb6f1ea7b1357ee00224bd9ea625c641d974f17b7", "sunpy.map.tests.test_mapsequence.test_norm_animator": "a400eef26fdd915ccf12769031bd8dadedbf8f6a93e31cd5982bffe2484702ee", "sunpy.map.tests.test_mapsequence.test_map_sequence_plot": "15c8aee7d3a6ff3d39856dc37e02afa983e1ebc1582f810699defd14b3f6cec7", "sunpy.map.tests.test_mapsequence.test_map_sequence_plot_custom_cmap_norm": "7f115dedaf88653dff71f784b0d8173d66638e429f92239a7a6f7d6f10fd05f5", "sunpy.map.tests.test_plotting.test_plot_aia171": "15c8aee7d3a6ff3d39856dc37e02afa983e1ebc1582f810699defd14b3f6cec7", "sunpy.map.tests.test_plotting.test_plot_rotated_aia171": "dc20869be4f5d68ac01078412320b93060fcac86330126362627567e48f089ef", "sunpy.map.tests.test_plotting.test_plot_aia171_clip": "a99f0072685b693410bccee49f4733d312f1c397067fb85388ef5b14160b6497", "sunpy.map.tests.test_plotting.test_peek_aia171": "d002901bbe0321ad102f7963c7e75d787e25eeb8cc65bb4ccb4dc44cff0a386f", "sunpy.map.tests.test_plotting.test_peek_grid_aia171": "6222504fa827eb97cf06c46fffb29403ed7dd786bf7af05e2c0b17706a37f762", "sunpy.map.tests.test_plotting.test_peek_grid_spacing_aia171": "214c84564ecb25123612458b43bded7b20a37549b57b3e176f42f1f0b4c3c4a8", "sunpy.map.tests.test_plotting.test_peek_limb_aia171": "c51604158092b3b908c2c6e6b1ef5cb0ed0729bb2e29ef0a7cf58d970cd62993", "sunpy.map.tests.test_plotting.test_draw_grid_aia171": "e4c0efdadad345ab88ca1d47d688e00c4549da08ab9077a0f1dd9f9328ce53b0", "sunpy.map.tests.test_plotting.test_peek_grid_limb_aia171": "eadac6fa50a7569bbdb0296db1f74478658b4b013d49e522973e54fb2a2c1711", "sunpy.map.tests.test_plotting.test_rectangle_aia171_width_height": "1482565c28677b034869429a5b86ed8a39cbde8736e25167883101c98f7dd1aa", "sunpy.map.tests.test_plotting.test_rectangle_aia171_top_right": "7a28181fcb13a3133b2855d0d86c55e66be332faed7402b3f3b0f83eed730bd7", "sunpy.map.tests.test_plotting.test_quadrangle_aia17_width_height": "09bb6bff2e66f918ab5b4ac4f655ce131e3f6606226b52709355c961bd5f5c71", "sunpy.map.tests.test_plotting.test_quadrangle_aia17_pix_width_height": "1bdfaf7549d925388c4df0844f04c741e14e8bad878632d6146e2de6fb511c8d", "sunpy.map.tests.test_plotting.test_quadrangle_aia17_top_right": "228c654dcd66ce068c60db0126048cbf9abdf852cc6396ced0244123df1c3675", "sunpy.map.tests.test_plotting.test_quadrangle_aia17_pix_top_right": "46f7461ed4b911c9954be24022bff5b252267edd451bad675fa95923012bd699", "sunpy.map.tests.test_plotting.test_quadrangle_aia17_pix_top_right_different_axes": "c867dadf6ad99e29801e5d08bfaf5bd0696edc6166453a4452ac674d5d8e7d21", "sunpy.map.tests.test_plotting.test_plot_masked_aia171": "5dd66ed4c720a87a9c26b4bc9beea13404970392172ccd0b3b5bb5d9b01e0c68", "sunpy.map.tests.test_plotting.test_plot_aia171_superpixel": "a1cb8c10a7df2b529ccce3edec22bbd9dab806e0d1f4322b9e32cc61977ac752", "sunpy.map.tests.test_plotting.test_plot_resample": "6cc2589a5ed59d8e597cdfe00d310e211efe6547a578baa3a873036c41db859a", "sunpy.map.tests.test_plotting.test_plot_superpixel": "ca2d632584c78b3a549b2d260daa35efcaaca0229176482efb0f526a4389dde5", "sunpy.map.tests.test_plotting.test_plot_masked_aia171_superpixel": "ea477b45bfc4b1e375b031be80b7c7e2f9a7c678a03c11f08276756d998de4dc", "sunpy.map.tests.test_plotting.test_draw_contours_aia": "97e412f902cf9e968680a8dd51e5a7ff20ae8ec04ff11551520f1d5bef37c363", "sunpy.map.tests.test_plotting.test_draw_contours_different_wcs": "09bbcef2066ace76ec18fbba59fde5395811ffed5d5d08b74cb06e81c3b4fbe1", "sunpy.map.tests.test_plotting.test_heliographic_peek": "4c092580a65c5f9f9138853d8c797ad8bc998a1d6a54073995d5bd3d26817909", "sunpy.map.tests.test_plotting.test_heliographic_quadrangle_width_height": "a52dca9100f3f96644e924f283c7ba9bd26db115be3a8e19b91898406d06f9ba", "sunpy.map.tests.test_plotting.test_heliographic_quadrangle_top_right": "40591e49e6b32ec3a27b6fc50b9e2fdfcaa9665eca70b6a515dfb9dc7c0b1724", "sunpy.map.tests.test_plotting.test_heliographic_grid_annotations": "c7c08b2b6dae1b96c303345b04682060da97a1b304e7f25bcfd40b2154751465", "sunpy.map.tests.test_plotting.test_draw_limb_different_observer": "c90abae8026a71528f3afaf5abab676253f29b828f6674dbcbae57d985ef2546", "sunpy.map.tests.test_plotting.test_draw_limb_heliographic_stonyhurst": "2f7cf5251db91da34a86b3a72610acc9b257e4c586f2dcf6f10381bd7c3ea186", "sunpy.map.tests.test_plotting.test_plot_autoalign": "698fd24a2922b4631fadf262db384deba3872a4cfa96c773ebc3e8d5a00926bc", "sunpy.map.tests.test_reproject_to.test_reproject_to_hgs": "c1dc26bedf3d24690364637e1a7d6fde165445049e633e8407ad2ccf42416fcb", "sunpy.map.tests.test_reproject_to.test_reproject_to_hpc_interpolation": "b82e6462d4ccb8c188b5f6deac3258326ba6840ef624c18f044a9d4cadce3cf2", "sunpy.map.tests.test_reproject_to.test_reproject_to_hpc_exact": "93171456dfac771f53bc0465922cf5811048df0b56100d329a55f71b36bdc8f5", "sunpy.map.tests.test_reproject_to.test_reproject_to_hpc_adaptive": "91b046ff2805fd47840c128b8b510f290cdd3cafd04b3dd283c2478a61a6a244", "sunpy.net.tests.test_helioviewer.test_download_jp2_map": "1645045e36a72cb2a92e03a9d9757e6d95fbc6aab6c2d85dbd4cf34ffd4769df", "sunpy.timeseries.tests.test_timeseriesbase.test_eve_peek": "2a22f93af44971411800e4fcd0d93d2128fe2b9e6b97e576e8372c2cd12d7d78", "sunpy.timeseries.tests.test_timeseriesbase.test_esp_peek": "795e73a848228b2dab4ce21623c4b81b59aa817ae82f537e4f0b49447812d838", "sunpy.timeseries.tests.test_timeseriesbase.test_fermi_gbm_peek": "a0addeae9ec0eda509c976e9058b2d90fa748b2c3d4a64df43b3a064d85f34d9", "sunpy.timeseries.tests.test_timeseriesbase.test_norh_peek": "0732b7b16f8edcc7d7a52241827b79380810a70b1b8a12b9b8dd1dbe1515c6fd", "sunpy.timeseries.tests.test_timeseriesbase.test_goes_peek": "fe27add6ae15b3c21228ff6e575982b92ba2574cf0b4accb3e4e40b025b9247a", "sunpy.timeseries.tests.test_timeseriesbase.test_lyra_peek": "afae6fdd0e3943d3496ad948229606e6c36a992571d86a74235def100e255a5b", "sunpy.timeseries.tests.test_timeseriesbase.test_rhessi_peek": "0d4cc06897e0e058fc8b049d3502f6fc842755ad393f0b311de69e6c52a902b3", "sunpy.timeseries.tests.test_timeseriesbase.test_noaa_json_ind_peek": "1bea3a56178db101abca168bc51e127b7b96f9eed58d74e3d19b6ffc14643e80", "sunpy.timeseries.tests.test_timeseriesbase.test_noaa_json_pre_peek": "135ad8db1fa70a7bbbe7b174dec0d4d5d0af03dfaddd10ee1fc23e5afcc2a0e8", "sunpy.timeseries.tests.test_timeseriesbase.test_generic_ts_peek": "ba0469ba921c3367384c04de4e64d16cacd1499277a14f1809c087d8f21ee041", "sunpy.timeseries.tests.test_timeseriesbase.test_column_subset_peek": "0c1ac6714d9bc505db3ee449fa9a8ba6842b0d756a8c8f02a2133547123c2a92", "sunpy.visualization.animator.tests.test_basefuncanimator.test_lineanimator_figure": "dbf47ab983a844621f912b2f5a2d9ee657d3f661678c16a07afc7217f50e3fd4", "sunpy.visualization.animator.tests.test_mapsequenceanimator.test_map_sequence_animator_wcs_simple_plot": "8399e8f0c46655b2d5e868cbf81603abf9f2f56157d94f2be4056ee9ababb237", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_simple_plot": "03ab823148c6071a81c9edad2bc58e0c0b401a3dcf5108d749a80ac0f24a07b7", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_clip_interval": "18e3b9433d7115d3f05d5fbc771774e6908d00e20b6d390bcc3d525b5af48632", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_celestial_sliders": "460980d5e2d2b06e1b7ce07613f2169078edc759515ca1c1cff242f72cca1158", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_update_plot": "377a48ea45516d91bd483e0044868d2a2da0bb45569ed15ead305987ad18dc00", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_transpose_update_plot": "1676a6fd6ba95e3ac725a9ef37f4dd1e1acb09886b8781f32d3d29e7c50794c4", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_colorbar_buttons": "89557041abcb08e3b0c22a1a2679d0874c396162c438ff587579215a826bac3b", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_colorbar_buttons_default_labels": "b0c1889ee9c2da5e47e4903229b4633c49cca78735513449698143ac015fb16a", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_extra_sliders": "f079c64d4c5f0dd82fe748deb22e481bddb1ef1523d202c139d4717403d778de", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_1d_update_plot": "58e799859b877fd8a5f73377eeab2686f0567241093c244779143797d4cef778", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_1d_update_plot_masked": "157c52fdcf235e09ebb5389f1d9c0957795e73f695fa1a839b077259f9fb8240", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_coord_params": "e1678a7b513917e177547b8ee0a93ee2f29a6d3dacff5fa213355ff414e706b1", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_coord_params_no_ticks": "ce35b25eb2c4eb6d2ce56d6a78c8a33b1bfdf8ef00b098c7c2c08feae2a82356", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_coord_params_grid": "4bb5930ec573f8399470df023d4686601728d35a70527c397f7eed39d07ba0e3", "sunpy.visualization.colormaps.tests.test_cm.test_cmap_visual": "447ce9805f832cfe82a1c7c701acc59496febf97343428b004576cdc822d5274" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/tests/figure_hashes_mpl_dev_ft_261_astropy_dev_animators_dev.json0000644000175100001710000002367500000000000030111 0ustar00vstsdocker{ "sunpy.map.tests.test_compositemap.test_plot_composite_map": "9cdfb6c45bc5a95fa3d08fe1b8fc77a2d4f05ef8218f5bf4c7f50f11c6262f81", "sunpy.map.tests.test_compositemap.test_plot_composite_map_contours": "30c14e6f4ef00263494b07c600155e7698bbecdfc1925bd4cda9bc824ead1eec", "sunpy.map.tests.test_compositemap.test_plot_composite_map_linewidths": "89d0f1b75b833e48f7cd6a6776929af440764c2e615947270701afaca0e766d4", "sunpy.map.tests.test_compositemap.test_plot_composite_map_linestyles": "9cef7e320ddb45e6fc8022acfe2d9c304e07e094474b0bd9e486de1ad2d77f4a", "sunpy.map.tests.test_compositemap.test_plot_composite_map_colors": "20b5cb743ee52a34f7977d538f9dbc8d0266ffed7bcfba00fdc393c660f15ef5", "sunpy.map.tests.test_compositemap.test_set_alpha_composite_map": "f811cf6be8abfcd1b3a7f4bae7781806b37b1b2b0cb77ac34c4ed4491a1d633a", "sunpy.map.tests.test_compositemap.test_peek_composite_map": "d459182443472330df9b0dde3bde647479c100f56f45b6321619fbf67810c174", "sunpy.map.tests.test_mapbase.test_rotation_rect_pixelated_data": "817ef0de8c17246fc4e728d55d119b08c803b6a6906d4b0923f3969eaab0177f", "sunpy.map.tests.test_mapsequence.test_norm_animator": "5a7217dd55ab3a593a27741fecfe0851208fd1d31baeca4cbd018d65aaf3f483", "sunpy.map.tests.test_mapsequence.test_map_sequence_plot": "3cdc53f41914028a4e9f23112d7e616ce8a423ef5670c8365fdadbc0e59780ca", "sunpy.map.tests.test_mapsequence.test_map_sequence_plot_custom_cmap_norm": "c1276702147f4debaa14c17f6b0b2ab7f9e0b1ace309c72e767b2af071c4405e", "sunpy.map.tests.test_plotting.test_plot_aia171": "3cdc53f41914028a4e9f23112d7e616ce8a423ef5670c8365fdadbc0e59780ca", "sunpy.map.tests.test_plotting.test_plot_rotated_aia171": "9df0409afa257ebe481aa5170321072ddca349fe596f3d662208e127f39a938e", "sunpy.map.tests.test_plotting.test_plot_aia171_clip": "920852d09b1b0af6ed406312e8e54ce2b327d38061a0652d95df03b41e1c552d", "sunpy.map.tests.test_plotting.test_peek_aia171": "4448f1b15f721ba8a63cdbed738d11fb8fc90b3d517ad62742db9adb184d1fb2", "sunpy.map.tests.test_plotting.test_peek_grid_aia171": "d27ca38c6f529a415a14624dd43ff6a9436b6972d1d82faa4a9884fd601eb106", "sunpy.map.tests.test_plotting.test_peek_grid_spacing_aia171": "e2629577592c46e2baa1658fcf1f92ac1e5e6985a08c7aa6d2df3869f4654924", "sunpy.map.tests.test_plotting.test_peek_limb_aia171": "2d5a36e6b8873ded8a6141b60caddd9aa697344c8df59852e80c4dcda7fd67be", "sunpy.map.tests.test_plotting.test_draw_grid_aia171": "1bd9df069e19cd4f731a0f19638f9d00eb790495c9307c64392589c561199cae", "sunpy.map.tests.test_plotting.test_peek_grid_limb_aia171": "6abc117f65bd55acceaed9ddeddaef34e4f1bf920f86cc4f701f9c87d7bb1845", "sunpy.map.tests.test_plotting.test_rectangle_aia171_width_height": "d6afbac82891ed231d8bcbe5a66fe0098856dba4aca684073ddee2ec3b10a289", "sunpy.map.tests.test_plotting.test_rectangle_aia171_top_right": "643d623d94d9390a94266e1088dacb03bd62668815a3b04e1bda51afa701d8a4", "sunpy.map.tests.test_plotting.test_quadrangle_aia17_width_height": "89f18bf54f0ebeb6ce36522620f6551457bfd1dd1da1634edb50cbea5adc2939", "sunpy.map.tests.test_plotting.test_quadrangle_aia17_pix_width_height": "68f0ac032a79416bd0287e393ea98ed5ac54a22a068db08131885046c39b8cbc", "sunpy.map.tests.test_plotting.test_quadrangle_aia17_top_right": "9a2d796c365b5280464ecfdb01f62d27ddeee127e6aee4f243a98ec98f923df7", "sunpy.map.tests.test_plotting.test_quadrangle_aia17_pix_top_right": "e55f63d480032009779aa5c1742aff30694587f8bee2f8201c7c64192880cecb", "sunpy.map.tests.test_plotting.test_quadrangle_aia17_pix_top_right_different_axes": "9ff2b308a2fe6f3b78e9173b7f8eff229db3f9776c3379e62c13390d3d78bb8a", "sunpy.map.tests.test_plotting.test_plot_masked_aia171": "8acfaf714eca9295e1d4ecd17e6eec62c8fc991cba45eeb0ba6d2efaa492d29b", "sunpy.map.tests.test_plotting.test_plot_aia171_superpixel": "1c133f41c740f4974b8dd27477a247a64c7f8e387d1d8d8c9b4f42ca0387b2ac", "sunpy.map.tests.test_plotting.test_plot_resample": "351baa39339b9f7d206232b9c2fb777d7edf965e1554040171ac40e3a1f5ec62", "sunpy.map.tests.test_plotting.test_plot_superpixel": "4fcd7af5690bbb5a1ae65ab2bf80db31aa41f240456cddaf49c6132fd459b973", "sunpy.map.tests.test_plotting.test_plot_masked_aia171_superpixel": "ffabe0ca544b93c8084af36edb5b293cdce613d13b73ddeaa906ddf2617da34b", "sunpy.map.tests.test_plotting.test_draw_contours_aia": "2ff44dd84d067bf65d541422c62d2152057d170a41dbb44b1ffb8d8d4113c6c8", "sunpy.map.tests.test_plotting.test_draw_contours_different_wcs": "8f3623a5417a0ccb2be6feb83211470a7dd1b93b3eaf6d0db55d700f787d5a22", "sunpy.map.tests.test_plotting.test_heliographic_peek": "662a24f525b30ce89ba15b7668518f31d439fa8b0c5ba84da2a71bbda31edb9a", "sunpy.map.tests.test_plotting.test_heliographic_quadrangle_width_height": "a52dca9100f3f96644e924f283c7ba9bd26db115be3a8e19b91898406d06f9ba", "sunpy.map.tests.test_plotting.test_heliographic_quadrangle_top_right": "40591e49e6b32ec3a27b6fc50b9e2fdfcaa9665eca70b6a515dfb9dc7c0b1724", "sunpy.map.tests.test_plotting.test_heliographic_grid_annotations": "c7c08b2b6dae1b96c303345b04682060da97a1b304e7f25bcfd40b2154751465", "sunpy.map.tests.test_plotting.test_draw_limb_different_observer": "8802a9b36bb9679067b5c45d752f5cb9e6757a51c41d9809e0b3e131786ada02", "sunpy.map.tests.test_plotting.test_draw_limb_heliographic_stonyhurst": "8fb7ab6239ddae9fb06c45b32a37cc14ef0c6d281bf6cd5ae567e8ad8cfd6ff5", "sunpy.map.tests.test_plotting.test_plot_autoalign": "a45cba78f9bcdebd70f3852ca672fa0140400c805ad61450f710ad80f9af0884", "sunpy.map.tests.test_reproject_to.test_reproject_to_hgs": "c1dc26bedf3d24690364637e1a7d6fde165445049e633e8407ad2ccf42416fcb", "sunpy.map.tests.test_reproject_to.test_reproject_to_hpc_interpolation": "b82e6462d4ccb8c188b5f6deac3258326ba6840ef624c18f044a9d4cadce3cf2", "sunpy.map.tests.test_reproject_to.test_reproject_to_hpc_exact": "93171456dfac771f53bc0465922cf5811048df0b56100d329a55f71b36bdc8f5", "sunpy.map.tests.test_reproject_to.test_reproject_to_hpc_adaptive": "91b046ff2805fd47840c128b8b510f290cdd3cafd04b3dd283c2478a61a6a244", "sunpy.net.tests.test_helioviewer.test_download_jp2_map": "1645045e36a72cb2a92e03a9d9757e6d95fbc6aab6c2d85dbd4cf34ffd4769df", "sunpy.timeseries.tests.test_timeseriesbase.test_eve_peek": "2a22f93af44971411800e4fcd0d93d2128fe2b9e6b97e576e8372c2cd12d7d78", "sunpy.timeseries.tests.test_timeseriesbase.test_esp_peek": "795e73a848228b2dab4ce21623c4b81b59aa817ae82f537e4f0b49447812d838", "sunpy.timeseries.tests.test_timeseriesbase.test_fermi_gbm_peek": "a0addeae9ec0eda509c976e9058b2d90fa748b2c3d4a64df43b3a064d85f34d9", "sunpy.timeseries.tests.test_timeseriesbase.test_norh_peek": "0732b7b16f8edcc7d7a52241827b79380810a70b1b8a12b9b8dd1dbe1515c6fd", "sunpy.timeseries.tests.test_timeseriesbase.test_goes_peek": "fe27add6ae15b3c21228ff6e575982b92ba2574cf0b4accb3e4e40b025b9247a", "sunpy.timeseries.tests.test_timeseriesbase.test_lyra_peek": "afae6fdd0e3943d3496ad948229606e6c36a992571d86a74235def100e255a5b", "sunpy.timeseries.tests.test_timeseriesbase.test_rhessi_peek": "0d4cc06897e0e058fc8b049d3502f6fc842755ad393f0b311de69e6c52a902b3", "sunpy.timeseries.tests.test_timeseriesbase.test_noaa_json_ind_peek": "1bea3a56178db101abca168bc51e127b7b96f9eed58d74e3d19b6ffc14643e80", "sunpy.timeseries.tests.test_timeseriesbase.test_noaa_json_pre_peek": "135ad8db1fa70a7bbbe7b174dec0d4d5d0af03dfaddd10ee1fc23e5afcc2a0e8", "sunpy.timeseries.tests.test_timeseriesbase.test_generic_ts_peek": "ba0469ba921c3367384c04de4e64d16cacd1499277a14f1809c087d8f21ee041", "sunpy.timeseries.tests.test_timeseriesbase.test_column_subset_peek": "0c1ac6714d9bc505db3ee449fa9a8ba6842b0d756a8c8f02a2133547123c2a92", "sunpy.visualization.animator.tests.test_basefuncanimator.test_lineanimator_figure": "6865a446680cb7088d71becd653e3c9e9e8e982d71956c95f690d52365bfe106", "sunpy.visualization.animator.tests.test_mapsequenceanimator.test_map_sequence_animator_wcs_simple_plot": "62de3f4c9e9720381a43f97d227afdf11ea9fb4107c04b068e211ff5d7acd182", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_simple_plot": "1d0b9c13e72d288e09d1ab85fe3b4df38d6b349eae661c54cf32c18f0af451c6", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_clip_interval": "a78d4ca84423abcde116efeef4631cdf36d98033c71ad038363a033857743776", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_celestial_sliders": "14fc82e6778a7725092a691f210f05420e5669099fe8cb21260fd44336e57f8e", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_update_plot": "0c4a39742b55c4c9eb1336de59891c1e1459e656992505528f245783e4c7cf12", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_transpose_update_plot": "fca79fbb72e9650df3e64beb383b68a7816cfdfd95fa632386f65b5e6d32b5e4", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_colorbar_buttons": "dc5d08188e888fb6b93843b38a1604b8847aec38dc1ba53fa8ef108da6e790d6", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_colorbar_buttons_default_labels": "3026f941a8cf87347e6793b6002dda370eae6036e13961ae7323c3a4fe60d1d1", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_2d_extra_sliders": "fd94e25c0b6a813818c8ab1b42c6d8828e546acf30ea9bc73164e50b22f456ba", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_1d_update_plot": "0618fba2b4285904d3594b4b3d76ebd56337cf2ad4c00aa568ac111f6d3e52aa", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_1d_update_plot_masked": "ae635463aaa2da4d494e9e90f040d39adf452eda92ad5f1c988b5be0bf437185", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_coord_params": "6535c5d4c7cfb9699bf99c4ad1919e9854626c5633eaa4d9aa97d5003408634a", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_coord_params_no_ticks": "536034d8e761ef5d2fdfbf8911c4ab9bbc96308328594befb44d0837eccd671e", "sunpy.visualization.animator.tests.test_wcs.test_array_animator_wcs_coord_params_grid": "5b81acf2215c9b8c1a700e2e7371f43be3177363abfe9729b6746eedd7d16686", "sunpy.visualization.colormaps.tests.test_cm.test_cmap_visual": "447ce9805f832cfe82a1c7c701acc59496febf97343428b004576cdc822d5274" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/tests/helpers.py0000644000175100001710000000754100000000000016267 0ustar00vstsdockerimport sys import platform import warnings from pathlib import Path from functools import wraps import matplotlib as mpl import matplotlib.pyplot as plt import pkg_resources import pytest import astropy from astropy.wcs.wcs import FITSFixedWarning import sunpy.map __all__ = ['skip_windows', 'skip_glymur', 'skip_ana', 'warnings_as_errors', 'asdf_entry_points'] # 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 glymur.lib.openjp2.OPENJP2: SKIP_GLYMUR = False else: SKIP_GLYMUR = True try: from sunpy.io import _pyana # NOQA except ImportError: SKIP_ANA = True else: SKIP_ANA = False if sys.maxsize > 2**32: SKIP_32 = False else: SKIP_32 = True 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.") # Skip if the SunPy ASDF entry points are missing. asdf_entry_points = pytest.mark.skipif(not list(pkg_resources.iter_entry_points('asdf_extensions', 'sunpy')), reason="No SunPy ASDF entry points.") @pytest.fixture def warnings_as_errors(request): warnings.simplefilter('error') request.addfinalizer(lambda *args: warnings.resetwarnings()) new_hash_library = {} def get_hash_library_name(): """ Generate the hash library name for this env. """ import mpl_animators version = mpl_animators.__version__ animators_version = "dev" if "+" in version else version.replace('.', '') ft2_version = f"{mpl.ft2font.__freetype_version__.replace('.', '')}" mpl_version = "dev" if "+" in mpl.__version__ else mpl.__version__.replace('.', '') astropy_version = "dev" if "dev" in astropy.__version__ else astropy.__version__.replace('.', '') return f"figure_hashes_mpl_{mpl_version}_ft_{ft2_version}_astropy_{astropy_version}_animators_{animators_version}.json" 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 in the 'result_image' directory, which is created on the current path. All such decorated tests are marked with `pytest.mark.mpl_image` for convenient filtering. Examples -------- @figure_test def test_simple_plot(): plt.plot([0,1]) """ hash_library_name = get_hash_library_name() hash_library_file = Path(__file__).parent / hash_library_name @pytest.mark.remote_data @pytest.mark.mpl_image_compare(hash_library=hash_library_file, savefig_kwargs={'metadata': {'Software': None}}, style='default') @wraps(test_function) def test_wrapper(*args, **kwargs): ret = test_function(*args, **kwargs) if ret is None: ret = plt.gcf() return ret return test_wrapper def no_vso(f): """ Disable the VSO client from returning results via Fido during this test. """ from sunpy.net import Fido from sunpy.net.vso import VSOClient @wraps(f) def wrapper(*args, **kwargs): Fido.registry[VSOClient] = lambda *args: False res = f(*args, **kwargs) Fido.registry[VSOClient] = VSOClient._can_handle_query return res return wrapper def fix_map_wcs(smap): # Helper function to fix a WCS and silence the warnings with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=FITSFixedWarning) wcs = smap.wcs wcs.fix() return sunpy.map.Map(smap.data, wcs) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/tests/mocks.py0000644000175100001710000001625300000000000015741 0ustar00vstsdocker""" Provides classes for creating mocked objects. """ import io from collections import defaultdict from collections.abc import MutableMapping __all__ = ["MockObject", "MockHTTPResponse", "MockOpenTextFile"] class MockObject(MutableMapping): """ Object from which we can construct other "mocked" objects. Limitations ----------- On initiation a `ValueError` will be raised if any of the ``kwargs`` have the same name as an existing attribute/method of the `~sunpy.tests.mock.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 `~sunpy.tests.mock.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 {} " "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 `~urllib.request.urlopen`. For this implementation we are only interested in querying the "headers" attribute, which is a http.client.HTTPMessage object. Parameters ---------- url : `str` optional The url of the connection. Defaults to ''. headers : `dict` of `str` optional HTTP header fields of the response message. Defaults to ``{}``. 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().__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/writing text files. Binary files are **not** supported. Parameters ---------- file : `str`, optional The name of the file. Default to "N/A". mode : `str`, optional, default:'r' The way in which the file is to be used. Defaults to "r", i.e., read. data : `str`, optional The initial data which can be read from the file. Defaults to ''. 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 keyword 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().__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 [f'{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)))) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/tests/self_test.py0000644000175100001710000000463600000000000016617 0ustar00vstsdockerimport importlib from sunpy.util.sysinfo import missing_dependencies_by_extra def print_missing_dependencies_report(missing, package="sunpy"): printed = False required_missing = missing.pop("required") if required_missing: printed = True print(f"The following packages are not installed but are required by {package}:") for dep in required_missing: print(f"* {dep}") for extra_name, dependencies in missing.items(): if not dependencies: continue printed = True print( f"The following packages are not installed for the {package}[{extra_name}] requirement:") for dep in dependencies: print(f" * {dep}") return printed def _self_test_args(*, package=None, online=False, online_only=False, figure_only=False): args = ["-W", "ignore"] if online: args.append("--remote-data=any") if online_only: args.append("--remote-data=any -m remote_data") if package: try: importlib.import_module(f"sunpy.{package}") except ModuleNotFoundError: raise ModuleNotFoundError(f"sunpy.{package} was not found.") args.extend(["--pyargs", f"sunpy.{package}"]) else: args.extend(["--pyargs", "sunpy"]) if figure_only: args.extend(["-m", "mpl_image_compare"]) return args def self_test(*, package=None, online=False, online_only=False, figure_only=False): print("\n\n") print("Starting sunpy self test...") print("Checking for packages needed to run sunpy:") missing = missing_dependencies_by_extra(exclude_extras=("asdf", "dask", "dev", "all", "docs")) test_missing = missing.pop("tests") printed = print_missing_dependencies_report(missing) if not printed: print("All required and optional sunpy dependencies are installed.") if test_missing: print("You do not have all the required dependencies installed to run the sunpy test suite.") print(list(test_missing.keys())) print("If are using conda, you will want to run `conda install `") print('Otherwise you will want run `pip install "sunpy[all,tests]"`') return import pytest print("Starting the sunpy test suite:") print() args = _self_test_args(package=package, online=online, online_only=online_only, figure_only=figure_only) return pytest.main(args) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6532755 sunpy-3.1.5/sunpy/tests/tests/0000755000175100001710000000000000000000000015406 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/tests/tests/__init__.py0000644000175100001710000000000000000000000017505 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/tests/tests/test_mocks.py0000644000175100001710000001321000000000000020130 0ustar00vstsdockerimport io import re import pytest from sunpy.tests.mocks import MockHTTPResponse, MockObject, MockOpenTextFile @pytest.fixture def mocked_mockobject(): return MockObject(records=12) def test_MockObject_illegal_kwargs(mocked_mockobject): """ Any attempt to use a kwarg which has the same name as an attribute/method of the underlying object or datastore will raise a ValueError. """ with pytest.raises(ValueError): MockObject(records=[], values=1) with pytest.raises(ValueError): MockObject(items=('a', 'b', 'c')) with pytest.raises(ValueError): MockObject(__hash__=0x23424) # adding a new 'prohibited' attribute will be prevented with pytest.raises(ValueError): mocked_mockobject['keys'] = [3, 4] def test_MockObject_attr(mocked_mockobject): """ builtin hasattr & getattr functions, these don't work on dictionaries but they do on classes. """ assert hasattr(mocked_mockobject, 'records') is True assert hasattr(mocked_mockobject, 'cost') is False assert getattr(mocked_mockobject, 'records') == 12 with pytest.raises(AttributeError): getattr(mocked_mockobject, 'jobs') def test_MockObject_get(mocked_mockobject): """ Getting attributes from `MockObject` using dot and bracket notation. """ assert mocked_mockobject['records'] == 12 assert mocked_mockobject.records == 12 with pytest.raises(AttributeError): mocked_mockobject.no_key with pytest.raises(KeyError): mocked_mockobject['not-here'] def test_MockObject_set_get(mocked_mockobject): """ Setting attributes in `MockObject` using bracket notation *not* dot notation. """ # Only change the value of existing & new items using 'bracket' notation mocked_mockobject['records'] = 45 assert mocked_mockobject.records == 45 assert mocked_mockobject['records'] == 45 # Using 'dot' notation will set a new attribute on 'MockObject' not on the datastore # DO NOT DO THIS! mocked_mockobject.records = -344 # This is equivalent to seattr(mocked_mockobject, 'records', -344). Again, don't do this! assert mocked_mockobject.records == -344 # The 'real' value remains unchanged. assert mocked_mockobject['records'] == 45 def test_MockObject_len(): """ Testing ``MockObject.__len__``. """ assert len(MockObject(responses=['a', 'b', 'c', 'd'], requests=(1, 2, 3))) == 2 def test_MockObject_del(mocked_mockobject): """ Ensure ``MockObject.__delitem__`` is **not** implemented. """ with pytest.raises(NotImplementedError): del mocked_mockobject['records'] def test_MockObject_iter(mocked_mockobject): """ Test ``MockObject.__iter__``. """ assert list(iter(mocked_mockobject)) == ['records'] def test_repr_MockObject(): """ Test ``MockObject.__repr__``. """ empty = MockObject() mo_p = re.compile(r"^(?P<_><)sunpy\.tests\.mocks\.MockObject \{\} " "at 0x[0-9A-Fa-f]+L?(?(_)>|)$") assert mo_p.match(repr(empty)) is not None def test_read_only_mode_MockOpenTextFile(): """ Reading from a read only file, writing should be prohibited. """ new_line = '\n' content = r'a{0}bc{0}nd{0}{0}'.format(new_line) read_only = MockOpenTextFile('rom.txt', data=content) assert read_only.readable() is True assert read_only.writable() is False with pytest.raises(io.UnsupportedOperation): read_only.write('') assert read_only.read() == content assert read_only.readlines() == [f'{line}{new_line}' for line in content.split(new_line)] read_only.close() with pytest.raises(ValueError): read_only.readable() with pytest.raises(ValueError): read_only.writable() with pytest.raises(ValueError): read_only.read() with pytest.raises(ValueError): read_only.readlines() def test_write_only_mode_MockOpenTextFile(): """ Writing to to write-only file, reading should be prohibited. """ write_only = MockOpenTextFile('write.txt', 'w') assert write_only.readable() is False assert write_only.writable() is True with pytest.raises(io.UnsupportedOperation): write_only.read() data = '0123456789' num_chars = write_only.write(data) assert num_chars == len(data) def test_read_and_write_MockOpenTextFile(): """ Reading & writing to a file with read/write access. """ rd_wr = MockOpenTextFile(mode='r+') assert rd_wr.name == 'N/A' assert rd_wr.readable() is True assert rd_wr.writable() is True # Initailly empty assert rd_wr.read() == '' data = '0123456789' num_chars = rd_wr.write(data) assert num_chars == len(data) assert rd_wr.read() == data rd_wr.close() def test_repr_MockOpenTextFile(): """ Test ``MockOpenTextFile.__repr__``. """ mo_p = re.compile(r"^(?P<_><)sunpy\.tests\.mocks\.MockOpenTextFile file \'a\' " "mode \'r\' at 0x[0-9A-Fa-f]+L?(?(_)>|)$") assert mo_p.match(repr(MockOpenTextFile('a', 'r'))) is not None def test_MockHTTPResponse(): """ Simple tests querying the headers attribute. """ headers = {'Content-Type': 'text/html', 'Content-Disposition': 'attachment; filename="filename.jpg"'} response = MockHTTPResponse(url='http://abc.com', headers=headers) assert response.url == 'http://abc.com' assert response.headers.get('Content-Disposition') == 'attachment; filename="filename.jpg"' assert response.headers.get('Content-Length') is None # Key *not* case insensitive assert response.headers.get('content-type') is None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/tests/tests/test_self_test.py0000644000175100001710000000347700000000000021022 0ustar00vstsdocker import pytest import sunpy from sunpy.tests.self_test import _self_test_args from sunpy.util.exceptions import SunpyDeprecationWarning, warn_deprecated def test_main_nonexisting_module(): with pytest.raises(ModuleNotFoundError): sunpy.self_test(package='doesnotexist') def test_main_stdlib_module(): """ This test makes sure that the module is really searched within the sunpy package. """ with pytest.raises(ModuleNotFoundError): sunpy.self_test(package='random') def test_main_noargs(monkeypatch): test_args = _self_test_args() assert test_args == ['-W', 'ignore', '--pyargs', 'sunpy'] def test_main_submodule_map(monkeypatch): args = _self_test_args(package='map') assert args == ['-W', 'ignore', '--pyargs', 'sunpy.map'] def test_main_submodule_jsoc(monkeypatch): args = _self_test_args(package='net.jsoc') assert args == ['-W', 'ignore', '--pyargs', 'sunpy.net.jsoc'] def test_main_exclude_remote_data(monkeypatch): args = _self_test_args(package='map', online=False) assert args == ['-W', 'ignore', '--pyargs', 'sunpy.map'] def test_main_include_remote_data(monkeypatch): args = _self_test_args(package='map', online=True) assert args == ['-W', 'ignore', '--remote-data=any', '--pyargs', 'sunpy.map'] def test_main_only_remote_data(monkeypatch): args = _self_test_args(package='map', online_only=True) assert args == ['-W', 'ignore', '--remote-data=any -m remote_data', '--pyargs', 'sunpy.map'] def test_main_figure_only(monkeypatch): args = _self_test_args(figure_only=True) assert args == ['-W', 'ignore', '--pyargs', 'sunpy', '-m', 'mpl_image_compare'] def test_warnings(): # Ensure that our warning trickery dosen't stop pytest.warns working with pytest.warns(SunpyDeprecationWarning): warn_deprecated("Hello") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/tests/tests/test_sunpy_data_filenames.py0000644000175100001710000000122700000000000023213 0ustar00vstsdocker# This test lives here because we have to exclude sunpy/data from pytest. import os from pathlib import Path import sunpy.data.test def mockreturn(path): paths = [ (os.path.join('test', 'data', ''), (), ('code.py', 'test_file', 'code.pyc', '__init__.py')) ] return paths def test_test_data_filenames(monkeypatch): monkeypatch.setattr(os, 'walk', mockreturn) monkeypatch.setattr(os.path, 'isfile', mockreturn) output = sunpy.data.test.test_data_filenames() assert isinstance(output, list) # Only the test file and not the py/pyc files should be in the return. assert output == [Path('test') / 'data' / 'test_file'] ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6532755 sunpy-3.1.5/sunpy/time/0000755000175100001710000000000000000000000014040 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/time/__init__.py0000644000175100001710000000014600000000000016152 0ustar00vstsdockerfrom sunpy.time.time import * from sunpy.time.timeformats import * from sunpy.time.timerange import * ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1647479066.6532755 sunpy-3.1.5/sunpy/time/tests/0000755000175100001710000000000000000000000015202 5ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/time/tests/__init__.py0000644000175100001710000000000000000000000017301 0ustar00vstsdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/time/tests/test_taiseconds.py0000644000175100001710000000237000000000000020751 0ustar00vstsdockerimport pytest from astropy.time import Time from astropy.time.formats import erfa # This registers the TimeTaiSeconds format with astropy from sunpy.time import * # NOQA def test_time_t0(): """ Test that the offset at the epoch is zero. Note that the offset will be zero in both TAI and UTC """ t = Time('1958-01-01 00:00:00', format='iso', scale='tai') assert t.tai.tai_seconds == 0.0 with pytest.warns(erfa.ErfaWarning, match='dubious year'): assert t.utc.tai_seconds == 0.0 def test_tai_utc_offset(): """ Test that the offset between TAI and UTC is 10 s in 1972-01-01, when UTC was defined """ t1 = Time('1972-01-01 00:00:00', scale='tai', format='iso') t2 = Time('1972-01-01 00:00:00', scale='utc', format='iso') assert t2.tai_seconds - t1.tai_seconds == 10.0 @pytest.mark.parametrize('time', [ Time('1958-01-01T00:00:00', format='isot', scale='tai'), Time('1972-01-01T00:00:00', format='isot', scale='tai'), Time('2015-10-25T05:24:08', format='isot', scale='tai'), Time('2018-09-17T19:46:25', format='isot', scale='tai'), ]) def test_roundtrip(time): time_from_tai_seconds = Time(time.tai_seconds, scale='tai', format='tai_seconds') assert time_from_tai_seconds == time ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/time/tests/test_time.py0000644000175100001710000002352100000000000017554 0ustar00vstsdockerfrom datetime import date, datetime import numpy as np import pandas import pytest import astropy.time from astropy.time import Time import sunpy.time as time from sunpy.time import is_time_equal, parse_time LANDING = Time('1966-02-03', format='isot') def test_parse_time_24(): dt = parse_time("2010-10-10T24:00:00") assert dt == Time('2010-10-11') assert dt.format == 'isot' assert dt.scale == 'utc' def test_parse_time_24_2(): dt = parse_time("2010-10-10T24:00:00.000000") assert dt == Time('2010-10-11') assert dt.format == 'isot' assert dt.scale == 'utc' def test_parse_time_trailing_zeros(): # see issue #289 at https://github.com/sunpy/sunpy/issues/289 dt = parse_time('2010-10-10T00:00:00.00000000') assert dt == Time('2010-10-10') assert dt.format == 'isot' assert dt.scale == 'utc' def test_parse_time_tuple(): dt = parse_time((1966, 2, 3)) assert dt == LANDING assert dt.format == 'isot' assert dt.scale == 'utc' dt = parse_time((1966, 2, 3, 12, 2, 3)) assert dt == Time('1966-2-3T12:2:3') assert dt.format == 'isot' assert dt.scale == 'utc' dt = parse_time((1966, 2, 3, 12, 2, 3, 8266)) assert dt == Time('1966-2-3T12:2:3.008266') assert dt.format == 'isot' assert dt.scale == 'utc' def test_parse_time_int(): # Once https://github.com/astropy/astropy/issues/6970 is fixed, # remove .jd from equality check dt1 = parse_time(765548612.0, format='utime') assert dt1.jd == Time('2003-4-5T12:23:32').jd assert dt1.format == 'utime' dt2 = parse_time(1009685652.0, format='utime') assert dt2.jd == Time('2010-12-30T4:14:12').jd assert dt2.format == 'utime' def test_parse_time_pandas_timestamp(): ts = pandas.Timestamp(LANDING.datetime) dt = parse_time(ts) assert isinstance(dt, astropy.time.Time) assert dt == LANDING def test_parse_time_nanoseconds(): # Check that nanosecon precision is retained when parsing pandas timestamps ts = pandas.Timestamp('2020-07-31 00:00:26.166196864') dt = parse_time(ts) assert dt.jd1 == 2459062.0 # If nanoseconds are not retained, this value is slightly too low assert dt.jd2 == -0.4996971504992593 def test_parse_time_pandas_series(): inputs = [datetime(2012, 1, i) for i in range(1, 13)] ind = pandas.Series(inputs) as_inps = Time(inputs) dts = parse_time(ind) assert isinstance(dts, astropy.time.Time) assert np.all(dts == as_inps) def test_parse_time_pandas_series_2(): inputs = [[datetime(2012, 1, 1, 0, 0), datetime(2012, 1, 2, 0, 0)], [datetime(2012, 1, 3, 0, 0), datetime(2012, 1, 4, 0, 0)]] ind = pandas.Series(inputs) as_inps = Time(inputs) apts = parse_time(ind) assert isinstance(apts, astropy.time.Time) assert np.all(apts == as_inps) assert apts.shape == as_inps.shape def test_parse_time_pandas_index(): inputs = [datetime(2012, 1, i) for i in range(1, 13)] ind = pandas.DatetimeIndex(inputs) as_inps = Time(inputs) dts = parse_time(ind) assert isinstance(dts, astropy.time.Time) assert np.all(dts == as_inps) def test_parse_time_numpy_date(): inputs = np.arange('2005-02', '2005-03', dtype='datetime64[D]') dts = parse_time(inputs) assert isinstance(dts, astropy.time.Time) assert np.all(dts == Time([str(dt.astype('M8[ns]')) for dt in inputs])) def test_parse_time_numpy_datetime(): inputs = np.arange('2005-02-01T00', '2005-02-01T10', dtype='datetime64') dts = parse_time(inputs) assert isinstance(dts, astropy.time.Time) assert np.all(dts == Time([str(dt.astype('M8[ns]')) for dt in inputs])) def test_parse_time_individual_numpy_datetime(): dt64 = np.datetime64('2005-02-01T00') dt = parse_time(dt64) assert isinstance(dt, astropy.time.Time) assert dt == Time('2005-02-01', format='isot') def test_parse_time_numpy_datetime_timezone(): with pytest.warns(DeprecationWarning, match='parsing timezone aware datetimes is deprecated'): dt64 = np.datetime64('2014-02-07T16:47:51-0500') dt = parse_time(dt64) assert dt == Time('2014-02-07T21:47:51', format='isot') def test_parse_time_numpy_datetime_ns(): dt64 = np.datetime64('2014-02-07T16:47:51.008288000') dt = parse_time(dt64) assert dt == Time('2014-02-07T16:47:51.008288000', format='isot') dt64 = np.datetime64('2014-02-07T16:47:51.008288123') dt = parse_time(dt64) assert dt == Time('2014-02-07T16:47:51.008288123', format='isot') dt64 = np.datetime64('2014-02-07T16:47:51.234565999') dt = parse_time(dt64) assert dt == Time('2014-02-07T16:47:51.234565999') def test_parse_time_astropy(): ip = astropy.time.Time(['2016-01-02T23:00:01']) astropy_time = parse_time(ip) assert astropy_time == ip assert astropy_time.format == 'isot' def test_parse_time_datetime(): dt = datetime(2014, 2, 7, 16, 47, 51, 8288) assert parse_time(dt) == Time('2014-02-07 16:47:51.008288') assert parse_time(dt).format == 'datetime' def test_parse_time_date(): dt = parse_time(date(1966, 2, 3)) assert dt == Time('1966-2-3') assert dt.format == 'iso' def test_parse_time_now(): now = parse_time('now') assert isinstance(now, astropy.time.Time) assert now.format == 'datetime' assert now.scale == 'utc' def test_parse_time_ISO(): dt1 = Time('1966-02-03T20:17:40') assert parse_time('1966-02-03').jd == LANDING.jd assert ( parse_time('1966-02-03T20:17:40') == dt1 ) assert ( parse_time('19660203T201740') == dt1 ) dt2 = Time('2007-05-04T21:08:12.999999') dt3 = Time('2007-05-04T21:08:12') dt4 = Time('2007-05-04T21:08:00') dt5 = Time('2007-05-04') lst = [ ('2007-05-04T21:08:12.999999', dt2), ('20070504T210812.999999', dt2), ('2007/05/04 21:08:12.999999', dt2), ('2007-05-04 21:08:12.999999', dt2), ('2007/05/04 21:08:12', dt3), ('2007-05-04 21:08:12', dt3), ('2007-05-04 21:08', dt4), ('2007-05-04T21:08:12', dt3), ('20070504T210812', dt3), ('2007-May-04 21:08:12', dt3), ('2007-May-04 21:08', dt4), ('2007-May-04', dt5), ('2007-05-04', dt5), ('2007/05/04', dt5), ('04-May-2007', dt5), ('04-May-2007 21:08:12.999999', dt2), ('20070504_210812', dt3), ('2007/05/04T21:08', dt4), ] for k, v in lst: dt = parse_time(k) assert is_time_equal(dt, v) assert dt.format == 'isot' def test_parse_time_tai(): dt = Time('2007-05-04T21:08:12', scale='tai') dt2 = parse_time('2007.05.04_21:08:12_TAI') assert dt == dt2 assert dt.scale == dt2.scale def test_parse_time_leap_second(): dt1 = parse_time('1995-12-31 23:59:60') dt2 = Time('1995-12-31T23:59:60') assert dt1.jd == dt2.jd dt3 = parse_time('1995-Dec-31 23:59:60') assert dt2.jd == dt3.jd # This warning shouldn't really be ignored; see https://github.com/astropy/astropy/issues/10564 # for the issue that will help decide how to handle this @pytest.mark.filterwarnings('ignore:FITS time strings should no longer have embedded time scale') @pytest.mark.parametrize("ts,fmt", [ (1950.0, 'byear'), ('B1950.0', 'byear_str'), (63072064.184, 'cxcsec'), (datetime(2000, 1, 2, 12, 0, 0), 'datetime'), (2000.45, 'decimalyear'), ('2000-01-01T00:00:00.000(TAI)', 'fits'), (630720013.0, 'gps'), ('2000-01-01 00:00:00.000', 'iso'), ('2000-01-01T00:00:00.000', 'isot'), (2451544.5, 'jd'), (2000.0, 'jyear'), ('J2000.0', 'jyear_str'), (51544.0, 'mjd'), (730120.0003703703, 'plot_date'), (946684800.0, 'unix'), ('2000:001:00:00:00.000', 'yday') ]) def test_parse_time_astropy_formats(ts, fmt): dt = parse_time(ts, format=fmt) assert dt.format == fmt def test_parse_time_int_float(): # int and float values are not unique # The format has to be mentioned with pytest.raises(ValueError): parse_time(100) with pytest.raises(ValueError): parse_time(100.0) @pytest.mark.parametrize("scale", [ 'tai', 'tcb', 'tcg', 'tdb', 'tt', 'ut1', 'utc' ]) def test_parse_time_scale(scale): dt = parse_time('2007-05-04T21:08:12', scale=scale) dt2 = Time('2007-05-04T21:08:12', scale=scale) assert is_time_equal(dt, dt2) assert dt.scale == scale dt = parse_time(np.datetime64('2007-05-04T21:08:12'), scale=scale) dt2 = Time('2007-05-04T21:08:12', scale=scale) assert dt == dt2 assert dt.scale == scale dt = datetime(2014, 2, 7, 16, 47, 51) dt = parse_time(dt, scale=scale) dt2 = Time('2014-02-07T16:47:51', scale=scale) assert dt == dt2 assert dt.scale == scale dt = date(2014, 2, 7) dt = parse_time(dt, scale=scale) dt2 = Time('2014-02-07', scale=scale) assert dt == dt2 assert dt.scale == scale def test_parse_time_list(): tstrings = ['2010-09-03 00:00:00', '2005-09-03 06:00:00', '1995-12-31 23:59:60'] assert np.all(parse_time(tstrings) == Time(tstrings)) def test_parse_time_list_2(): tstrings = [['1998-01-01 00:00:01', '1998-01-01 00:00:02'], ['1998-01-01 00:00:03', '1995-12-31 23:59:60']] assert np.all(parse_time(tstrings) == Time(tstrings)) def test_parse_time_list_3(): tstrings = ['2001-Jan-01', '2001-Jan-02', '2001-Jan-03'] assert np.all(parse_time(tstrings) == Time.strptime(tstrings, '%Y-%b-%d')) def test_is_time(): assert time.is_time(datetime.utcnow()) is True assert time.is_time('2017-02-14 08:08:12.999') is True assert time.is_time(Time.now()) is True assert time.is_time(None) is False assert time.is_time('2016-14-14 19:08') is False def test_is_time_in_given_format(): assert time.is_time_in_given_format('2017-02-14 08:08:12.999', "%Y-%m-%d %H:%M:%S.%f") is True assert time.is_time_in_given_format('2017-02-14 08:08:12.999', "%Y-%m-%dT%H:%M:%S.%f") is False ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/time/tests/test_timerange.py0000644000175100001710000002126100000000000020570 0ustar00vstsdockerfrom datetime import datetime, timedelta import pytest import astropy.units as u from astropy.time import Time, TimeDelta from astropy.utils.exceptions import ErfaWarning import sunpy.time from sunpy.time import is_time_equal 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, TimeDelta(1*u.day)), (tbegin_str, 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(): 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(): 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 = Time('2016-01-04T09:30:00.000') upper_dt = Time('2016-06-04T09:30:00.000') 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(): 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' single_day = sunpy.time.TimeRange((lower, lower)) assert single_day.get_dates() == [Time('2016-1-4')] two_days = sunpy.time.TimeRange((lower, lower_plus_one_day)) assert two_days.get_dates() == [Time('2016-1-4'), Time('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, TimeDelta(1*u.day)), (tbegin_str, 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): 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 is_time_equal(timerange_a.center, Time('2012-1-1T12:00:00')) 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([is_time_equal(wi.start, ex.start) and is_time_equal(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 == ex for wi, ex in zip(window, expect)]) @pytest.mark.parametrize("td1,td2", [ (TimeDelta(12*u.hour), TimeDelta(10*u.second)), (timedelta(hours=12), timedelta(seconds=10)) ]) def test_window_timedelta(timerange_a, td1, td2): timerange = sunpy.time.TimeRange(tbegin_str, tfin_str) window = timerange.window(td1, td2) 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 == ex 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 = Time('1990-1-1') after = Time('2022-1-1') between = Time('2014-5-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 with pytest.warns(ErfaWarning, match='dubious year'): assert '2100/1/1'not in timerange assert '2014/05/03 12:00' in timerange assert '2014/05/05 21:00' in timerange def test_get_dates_daylist_less_24_hours(): starttime = datetime(2020, 1, 1, 12) endtime = datetime(2020, 1, 2, 11) interval = sunpy.time.TimeRange(starttime, endtime) daylist = interval.get_dates() day_one = Time("2020-01-01T00:00:00.000") day_two = Time("2020-01-02T00:00:00.000") assert len(daylist) == 2 assert daylist[0] == day_one assert daylist[1] == day_two def test_intersects(): tr1 = sunpy.time.TimeRange('2020-01-01', '2020-01-02') tr2 = sunpy.time.TimeRange('2020-01-03', '2020-01-04') assert not tr1.intersects(tr2) assert not tr2.intersects(tr1) # Check interval edges intersect tr2 = sunpy.time.TimeRange('2020-01-02', '2020-01-04') assert tr1.intersects(tr2) assert tr2.intersects(tr1) tr2 = sunpy.time.TimeRange('2020-01-01', '2020-01-04') assert tr1.intersects(tr2) assert tr2.intersects(tr1) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/time/tests/test_utime.py0000644000175100001710000000074500000000000017744 0ustar00vstsdockerfrom astropy.time import Time # This registers TimeUTime in astropy.time.Time from sunpy.time import TimeUTime # NOQA def test_utime_t0(): assert Time('1979-01-01T00:00:00').utime == 0.0 def test_utime_random_date(): assert Time('2018-01-13T13:32:56').utime == 1231853576.0 def test_conversion_from_utime(): # This is expected to fail until astropy issue 7092 is resolved. t2 = Time(1231853576.0, format='utime') assert t2.isot == '2018-01-13T13:32:56.000' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1647479033.0 sunpy-3.1.5/sunpy/time/time.py0000644000175100001710000003002300000000000015346 0ustar00vstsdocker""" This module provies a collection of time handing functions. """ import re import textwrap from datetime import date, datetime from functools import singledispatch import numpy as np import astropy.time import astropy.units as u from astropy.time import Time, TimeDelta # This is not called but imported to register time formats from sunpy.time.timeformats import * # NOQA from sunpy.util.decorators import add_common_docstring __all__ = [ 'find_time', 'parse_time', 'is_time', 'is_time_in_given_format', 'is_time_equal', 'julian_centuries' ] # Mapping of time format codes to regular expressions. REGEX = { '%Y': r'(?P\d{4})', '%j': r'(?P\d{3})', '%m': r'(?P\d{1,2})', '%d': r'(?P\d{1,2})', '%H': r'(?P\d{1,2})', '%M': r'(?P\d{1,2})', '%S': r'(?P\d{1,2})', '%f': r'(?P\d+)', '%b': r'(?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 "%Y/%m/%dT%H:%M", # Example 2007/05/04T21:08 ] _ONE_DAY_TIMEDELTA = TimeDelta(1 * u.day) def is_time_equal(t1, t2): """ Work around for https://github.com/astropy/astropy/issues/6970. Remove the usage of this function once the fix is in place. """ if abs(t1 - t2) < 1 * u.nanosecond: return True return False 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 REGEX.items(): 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, False if 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:], True return inp, False 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 REGEX.items(): 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())) @singledispatch def convert_time(time_string, format=None, **kwargs): # default case when no type matches return Time(time_string, format=format, **kwargs) # Only register pandas if we can import pandas try: import pandas @convert_time.register(pandas.Timestamp) def convert_time_pandasTimestamp(time_string, **kwargs): return Time(time_string.asm8) @convert_time.register(pandas.Series) def convert_time_pandasSeries(time_string, **kwargs): return Time(time_string.tolist(), **kwargs) @convert_time.register(pandas.DatetimeIndex) def convert_time_pandasDatetimeIndex(time_string, **kwargs): return Time(time_string.tolist(), **kwargs) except ImportError: pass @convert_time.register(datetime) def convert_time_datetime(time_string, **kwargs): return Time(time_string, **kwargs) @convert_time.register(date) def convert_time_date(time_string, **kwargs): return Time(time_string.isoformat(), **kwargs) @convert_time.register(tuple) def convert_time_tuple(time_string, **kwargs): # Make sure there are enough values to unpack time_string = (time_string + (0, ) * 7)[:7] return Time('{}-{}-{}T{}:{}:{}.{:06}'.format(*time_string), **kwargs) @convert_time.register(np.datetime64) def convert_time_npdatetime64(time_string, **kwargs): return Time(str(time_string.astype('M8[ns]')), **kwargs) @convert_time.register(np.ndarray) def convert_time_npndarray(time_string, **kwargs): if 'datetime64' in str(time_string.dtype): return Time([str(dt.astype('M8[ns]')) for dt in time_string], **kwargs) else: return convert_time.dispatch(object)(time_string, **kwargs) @convert_time.register(astropy.time.Time) def convert_time_astropy(time_string, **kwargs): return time_string @convert_time.register(list) def convert_time_list(time_list, format=None, **kwargs): item = time_list[0] # If we have a list of strings, need to get the correct format from our # list of custom formats. if isinstance(item, str) and format is None: string_format = _get_time_fmt(item) return Time.strptime(time_list, string_format, **kwargs) # Otherwise return the default method return convert_time.dispatch(object)(time_list, format, **kwargs) @convert_time.register(str) def convert_time_str(time_string, **kwargs): # 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(".") if 'TAI' in time_string: kwargs['scale'] = 'tai' for time_format in TIME_FORMAT_LIST: try: try: ts, add_one_day = _regex_parse_time(time_string, time_format) except TypeError: break if ts is None: continue t = Time.strptime(ts, time_format, **kwargs) if add_one_day: t += _ONE_DAY_TIMEDELTA return t except ValueError: pass # when no format matches, call default fucntion return convert_time.dispatch(object)(time_string, **kwargs) def _get_time_fmt(time_string): """ Try all the formats in TIME_FORMAT_LIST to work out which one applies to the time string. """ for time_format in TIME_FORMAT_LIST: ts, _ = _regex_parse_time(time_string, time_format) if ts is not None: return time_format def _variables_for_parse_time_docstring(): ret = {} example_time = datetime(2017, 1, 1, 11, 10, 9) example_parse_time = [example_time.strftime(f) for f in TIME_FORMAT_LIST] example_parse_time = "\n ".join(example_parse_time) ret['parse_time_formats'] = example_parse_time types = list(convert_time.registry.keys()) types.remove(object) # Do Builtins types2 = [t.__qualname__ for t in types if t.__module__ == "builtins"] # # Do all the non-special ones where we take the package name and the class types2 += [t.__module__.split(".")[0] + "." + t.__qualname__ for t in types if not t.__module__.startswith(("builtins", "astropy"))] # Special case astropy.time where we need the subpackage types2 += ["astropy.time." + t.__qualname__ for t in types if t.__module__.startswith("astropy.time")] parse_time_types = str(types2)[1:-1].replace("'", "`") ret['parse_time_types'] = parse_time_types ret['parse_time_desc'] = """ Any time input, will be passed into `~sunpy.time.parse_time`. """ try: # Need to try importing cdflib, as if it is present it will register # extra formats with time import cdflib # NOQA except Exception: pass ret['astropy_time_formats'] = textwrap.fill(str(list(astropy.time.Time.FORMATS.keys())), subsequent_indent=' '*10) return ret @add_common_docstring(**_variables_for_parse_time_docstring()) def parse_time(time_string, *, format=None, **kwargs): """ Takes a time input and will parse and return a `astropy.time.Time`. Parameters ---------- time_string : {parse_time_types} Time to parse. format : `str`, optional Specifies the format user has provided the time_string in. We support the same formats of `astropy.time.Time`. The allowed values for ``format`` can be listed with:: >>> list(astropy.time.Time.FORMATS) {astropy_time_formats} Returns ------- `astropy.time.Time` `~astropy.time.Time` corresponding to input time string. Examples -------- >>> import sunpy.time >>> sunpy.time.parse_time('2012/08/01')