././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1834154 neo-0.14.0/0000755000175100001660000000000014743453656012001 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/AUTHORS0000644000175100001660000000003314743453644013042 0ustar00runnerdockerSee doc/source/authors.rst ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/LICENSE.txt0000644000175100001660000000273514743453644013630 0ustar00runnerdockerCopyright (c) 2010-2025, Neo authors and contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of the copyright holders nor the names of the contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/MANIFEST.in0000644000175100001660000000030714743453644013534 0ustar00runnerdockerinclude README.rst include LICENSE.txt include CITATION.rst prune drafts include examples/*.py recursive-include doc * prune doc/build exclude doc/source/images/*.svg exclude doc/source/images/*.dia ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1834154 neo-0.14.0/PKG-INFO0000644000175100001660000002127514743453656013105 0ustar00runnerdockerMetadata-Version: 2.2 Name: neo Version: 0.14.0 Summary: Neo is a package for representing electrophysiology data in Python, together with support for reading a wide range of neurophysiology file formats Author: Neo authors and contributors License: BSD 3-Clause License Project-URL: homepage, https://neuralensemble.org/neo Project-URL: documentation, http://neo.readthedocs.io/ Project-URL: repository, https://github.com/NeuralEnsemble/python-neo Project-URL: download, http://pypi.python.org/pypi/neo Classifier: Development Status :: 4 - Beta Classifier: Programming Language :: Python :: 3 Classifier: Operating System :: OS Independent Classifier: Intended Audience :: Science/Research Classifier: Natural Language :: English Classifier: Topic :: Scientific/Engineering Classifier: License :: OSI Approved :: BSD License Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: 3 :: Only Requires-Python: >=3.9 Description-Content-Type: text/x-rst License-File: LICENSE.txt License-File: AUTHORS Requires-Dist: packaging Requires-Dist: numpy>=1.22.4 Requires-Dist: quantities>=0.16.1 Provides-Extra: iocache Requires-Dist: joblib>=1.0.0; extra == "iocache" Provides-Extra: test Requires-Dist: pytest; extra == "test" Requires-Dist: pytest-cov; extra == "test" Requires-Dist: scipy>=1.0.0; extra == "test" Requires-Dist: pyedflib; extra == "test" Requires-Dist: h5py; extra == "test" Requires-Dist: igor2; extra == "test" Requires-Dist: klusta; extra == "test" Requires-Dist: tqdm; extra == "test" Requires-Dist: nixio; extra == "test" Requires-Dist: matplotlib; extra == "test" Requires-Dist: ipython; extra == "test" Requires-Dist: joblib>=1.0.0; extra == "test" Requires-Dist: coverage; extra == "test" Requires-Dist: coveralls; extra == "test" Requires-Dist: pillow; extra == "test" Requires-Dist: sonpy; python_version < "3.10" and extra == "test" Requires-Dist: pynwb; extra == "test" Requires-Dist: probeinterface; extra == "test" Requires-Dist: zugbruecke>=0.2; extra == "test" Requires-Dist: wenv; extra == "test" Provides-Extra: docs Requires-Dist: docutils; extra == "docs" Requires-Dist: sphinx; extra == "docs" Requires-Dist: sphinx-inline-tabs; extra == "docs" Requires-Dist: sphinx-gallery; extra == "docs" Requires-Dist: pydata-sphinx-theme; extra == "docs" Requires-Dist: sphinx-design; extra == "docs" Requires-Dist: ipython; extra == "docs" Requires-Dist: matplotlib; extra == "docs" Requires-Dist: nixio; extra == "docs" Requires-Dist: pynwb; extra == "docs" Requires-Dist: igor2; extra == "docs" Requires-Dist: numpy>=2.0; extra == "docs" Provides-Extra: dev Requires-Dist: build; extra == "dev" Requires-Dist: twine; extra == "dev" Requires-Dist: black; extra == "dev" Provides-Extra: igorproio Requires-Dist: igor2; extra == "igorproio" Provides-Extra: kwikio Requires-Dist: klusta; extra == "kwikio" Provides-Extra: neomatlabio Requires-Dist: scipy>=1.0.0; extra == "neomatlabio" Provides-Extra: nixio Requires-Dist: nixio>=1.5.0; extra == "nixio" Provides-Extra: tiffio Requires-Dist: pillow; extra == "tiffio" Provides-Extra: edf Requires-Dist: pyedflib; extra == "edf" Provides-Extra: ced Requires-Dist: sonpy; extra == "ced" Provides-Extra: nwb Requires-Dist: pynwb; extra == "nwb" Provides-Extra: maxwell Requires-Dist: h5py; extra == "maxwell" Provides-Extra: biocam Requires-Dist: h5py; extra == "biocam" Provides-Extra: med Requires-Dist: dhn_med_py<2.0; extra == "med" Provides-Extra: plexon2 Requires-Dist: zugbruecke>=0.2; sys_platform != "win32" and extra == "plexon2" Requires-Dist: wenv; sys_platform != "win32" and extra == "plexon2" Provides-Extra: all Requires-Dist: coverage; extra == "all" Requires-Dist: coveralls; extra == "all" Requires-Dist: h5py; extra == "all" Requires-Dist: igor2; extra == "all" Requires-Dist: ipython; extra == "all" Requires-Dist: joblib>=1.0.0; extra == "all" Requires-Dist: klusta; extra == "all" Requires-Dist: matplotlib; extra == "all" Requires-Dist: nixio>=1.5.0; extra == "all" Requires-Dist: pillow; extra == "all" Requires-Dist: probeinterface; extra == "all" Requires-Dist: pyedflib; extra == "all" Requires-Dist: pynwb; extra == "all" Requires-Dist: pytest; extra == "all" Requires-Dist: pytest-cov; extra == "all" Requires-Dist: scipy>=1.0.0; extra == "all" Requires-Dist: sonpy; extra == "all" Requires-Dist: tqdm; extra == "all" Requires-Dist: wenv; sys_platform != "win32" and extra == "all" Requires-Dist: zugbruecke>=0.2; sys_platform != "win32" and extra == "all" === Neo === Neo is a Python package for working with electrophysiology data in Python, together with support for reading a wide range of neurophysiology file formats, including Spike2, NeuroExplorer, AlphaOmega, Axon, Blackrock, Plexon, Tdt, and support for writing to a subset of these formats plus non-proprietary formats including HDF5. The goal of Neo is to improve interoperability between Python tools for analyzing, visualizing and generating electrophysiology data by providing a common, shared object model. In order to be as lightweight a dependency as possible, Neo is deliberately limited to represention of data, with no functions for data analysis or visualization. Neo is used by a number of other software tools, including SpykeViewer_ (data analysis and visualization), Elephant_ (data analysis), the G-node_ suite (databasing), PyNN_ (simulations), tridesclous_ (spike sorting) and ephyviewer_ (data visualization). OpenElectrophy_ (data analysis and visualization) uses an older version of neo. Neo implements a hierarchical data model well adapted to intracellular and extracellular electrophysiology and EEG data with support for multi-electrodes (for example tetrodes). Neo's data objects build on the quantities package, which in turn builds on NumPy by adding support for physical dimensions. Thus Neo objects behave just like normal NumPy arrays, but with additional metadata, checks for dimensional consistency and automatic unit conversion. A project with similar aims but for neuroimaging file formats is `NiBabel`_. Code status ----------- .. image:: https://img.shields.io/pypi/v/neo.svg :target: https://pypi.python.org/pypi/neo :alt: PyPI Release Version .. image:: https://github.com/NeuralEnsemble/python-neo/actions/workflows/core-test.yml/badge.svg?event=push&branch=master :target: https://github.com/NeuralEnsemble/python-neo/actions?query=event%3Apush+branch%3Amaster :alt: Core Test Status (Github Actions) .. image:: https://github.com/NeuralEnsemble/python-neo/actions/workflows/io-test_trigger.yml/badge.svg?event=push&branch=master :target: https://github.com/NeuralEnsemble/python-neo/actions?query=event%3Apush+branch%3Amaster :alt: IO Test Status (Github Actions) .. image:: https://coveralls.io/repos/NeuralEnsemble/python-neo/badge.png :target: https://coveralls.io/r/NeuralEnsemble/python-neo :alt: Unit Test Coverage More information ---------------- - Home page: http://neuralensemble.org/neo - Mailing list: http://neuralensemble.org/community - Documentation: http://neo.readthedocs.io/ - Bug reports: https://github.com/NeuralEnsemble/python-neo/issues For installation instructions, see doc/source/install.rst To cite Neo in publications, see CITATION.txt :copyright: Copyright 2010-2025 by the Neo team, see doc/source/authors.rst. :license: 3-Clause Revised BSD License, see LICENSE.txt for details. Funding ------- Development of Neo has been partially funded by the European Union Sixth Framework Program (FP6) under grant agreement FETPI-015879 (FACETS), by the European Union Seventh Framework Program (FP7/2007­-2013) under grant agreements no. 269921 (BrainScaleS) and no. 604102 (HBP), and by the European Union’s Horizon 2020 Framework Programme for Research and Innovation under the Specific Grant Agreements No. 720270 (Human Brain Project SGA1), No. 785907 (Human Brain Project SGA2) and No. 945539 (Human Brain Project SGA3), and by the European Union's Research and Innovation Program Horizon Europe Grant Agreement No. 101147319 (EBRAINS 2.0). .. _OpenElectrophy: https://github.com/OpenElectrophy/OpenElectrophy .. _Elephant: http://neuralensemble.org/elephant .. _G-node: http://www.g-node.org/ .. _Neuroshare: http://neuroshare.org/ .. _SpykeViewer: https://spyke-viewer.readthedocs.org/en/latest/ .. _NiBabel: http://nipy.sourceforge.net/nibabel/ .. _PyNN: http://neuralensemble.org/PyNN .. _quantities: http://pypi.python.org/pypi/quantities .. _`NeuralEnsemble mailing list`: http://neuralensemble.org/community .. _`issue tracker`: https://github.c .. _tridesclous: https://github.com/tridesclous/tridesclous .. _ephyviewer: https://github.com/NeuralEnsemble/ephyviewer ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/README.rst0000644000175100001660000001013714743453644013467 0ustar00runnerdocker=== Neo === Neo is a Python package for working with electrophysiology data in Python, together with support for reading a wide range of neurophysiology file formats, including Spike2, NeuroExplorer, AlphaOmega, Axon, Blackrock, Plexon, Tdt, and support for writing to a subset of these formats plus non-proprietary formats including HDF5. The goal of Neo is to improve interoperability between Python tools for analyzing, visualizing and generating electrophysiology data by providing a common, shared object model. In order to be as lightweight a dependency as possible, Neo is deliberately limited to represention of data, with no functions for data analysis or visualization. Neo is used by a number of other software tools, including SpykeViewer_ (data analysis and visualization), Elephant_ (data analysis), the G-node_ suite (databasing), PyNN_ (simulations), tridesclous_ (spike sorting) and ephyviewer_ (data visualization). OpenElectrophy_ (data analysis and visualization) uses an older version of neo. Neo implements a hierarchical data model well adapted to intracellular and extracellular electrophysiology and EEG data with support for multi-electrodes (for example tetrodes). Neo's data objects build on the quantities package, which in turn builds on NumPy by adding support for physical dimensions. Thus Neo objects behave just like normal NumPy arrays, but with additional metadata, checks for dimensional consistency and automatic unit conversion. A project with similar aims but for neuroimaging file formats is `NiBabel`_. Code status ----------- .. image:: https://img.shields.io/pypi/v/neo.svg :target: https://pypi.python.org/pypi/neo :alt: PyPI Release Version .. image:: https://github.com/NeuralEnsemble/python-neo/actions/workflows/core-test.yml/badge.svg?event=push&branch=master :target: https://github.com/NeuralEnsemble/python-neo/actions?query=event%3Apush+branch%3Amaster :alt: Core Test Status (Github Actions) .. image:: https://github.com/NeuralEnsemble/python-neo/actions/workflows/io-test_trigger.yml/badge.svg?event=push&branch=master :target: https://github.com/NeuralEnsemble/python-neo/actions?query=event%3Apush+branch%3Amaster :alt: IO Test Status (Github Actions) .. image:: https://coveralls.io/repos/NeuralEnsemble/python-neo/badge.png :target: https://coveralls.io/r/NeuralEnsemble/python-neo :alt: Unit Test Coverage More information ---------------- - Home page: http://neuralensemble.org/neo - Mailing list: http://neuralensemble.org/community - Documentation: http://neo.readthedocs.io/ - Bug reports: https://github.com/NeuralEnsemble/python-neo/issues For installation instructions, see doc/source/install.rst To cite Neo in publications, see CITATION.txt :copyright: Copyright 2010-2025 by the Neo team, see doc/source/authors.rst. :license: 3-Clause Revised BSD License, see LICENSE.txt for details. Funding ------- Development of Neo has been partially funded by the European Union Sixth Framework Program (FP6) under grant agreement FETPI-015879 (FACETS), by the European Union Seventh Framework Program (FP7/2007­-2013) under grant agreements no. 269921 (BrainScaleS) and no. 604102 (HBP), and by the European Union’s Horizon 2020 Framework Programme for Research and Innovation under the Specific Grant Agreements No. 720270 (Human Brain Project SGA1), No. 785907 (Human Brain Project SGA2) and No. 945539 (Human Brain Project SGA3), and by the European Union's Research and Innovation Program Horizon Europe Grant Agreement No. 101147319 (EBRAINS 2.0). .. _OpenElectrophy: https://github.com/OpenElectrophy/OpenElectrophy .. _Elephant: http://neuralensemble.org/elephant .. _G-node: http://www.g-node.org/ .. _Neuroshare: http://neuroshare.org/ .. _SpykeViewer: https://spyke-viewer.readthedocs.org/en/latest/ .. _NiBabel: http://nipy.sourceforge.net/nibabel/ .. _PyNN: http://neuralensemble.org/PyNN .. _quantities: http://pypi.python.org/pypi/quantities .. _`NeuralEnsemble mailing list`: http://neuralensemble.org/community .. _`issue tracker`: https://github.c .. _tridesclous: https://github.com/tridesclous/tridesclous .. _ephyviewer: https://github.com/NeuralEnsemble/ephyviewer ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1134155 neo-0.14.0/doc/0000755000175100001660000000000014743453656012546 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/Makefile0000644000175100001660000000611514743453644014206 0ustar00runnerdocker# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source .PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* -rm -rf source/examples html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/neo.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/neo.qhc" latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ "run these through (pdf)latex." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/example_data.txt0000644000175100001660000165146014743453644015745 0ustar00runnerdocker-5.8469e+01 -5.2855e+01 -5.8790e+01 -5.8815e+01 -5.9061e+01 -5.0518e+01 -5.2003e+01 -5.7240e+01 -5.9010e+01 -5.0510e+01 -5.1988e+01 -5.7199e+01 -5.8960e+01 -5.0503e+01 -5.1973e+01 -5.7158e+01 -5.8911e+01 -5.0495e+01 -5.1958e+01 -5.7117e+01 -5.8861e+01 -5.0488e+01 -5.1944e+01 -5.7076e+01 -5.8812e+01 -5.0480e+01 -5.1929e+01 -5.7036e+01 -5.8763e+01 -5.0473e+01 -5.1914e+01 -5.6996e+01 -5.8715e+01 -5.0466e+01 -5.1900e+01 -5.6956e+01 -5.8666e+01 -5.0457e+01 -5.1885e+01 -5.6917e+01 -5.8618e+01 -5.0442e+01 -5.1871e+01 -5.6877e+01 -5.8570e+01 -5.0427e+01 -5.1857e+01 -5.6838e+01 -5.8522e+01 -5.0412e+01 -5.1842e+01 -5.6799e+01 -5.8475e+01 -5.0397e+01 -5.1828e+01 -5.6760e+01 -5.8445e+01 -5.0383e+01 -5.1814e+01 -5.6721e+01 -5.8442e+01 -5.0369e+01 -5.1800e+01 -5.6683e+01 -5.8439e+01 -5.0355e+01 -5.1786e+01 -5.6644e+01 -5.8435e+01 -5.0341e+01 -5.1772e+01 -5.6606e+01 -5.8432e+01 -5.0328e+01 -5.1758e+01 -5.6568e+01 -5.8427e+01 -5.0315e+01 -5.1745e+01 -5.6530e+01 -5.8423e+01 -5.0301e+01 -5.1731e+01 -5.6493e+01 -5.8417e+01 -5.0289e+01 -5.1714e+01 -5.6456e+01 -5.8412e+01 -5.0276e+01 -5.1692e+01 -5.6418e+01 -5.8406e+01 -5.0263e+01 -5.1671e+01 -5.6381e+01 -5.8399e+01 -5.0251e+01 -5.1649e+01 -5.6345e+01 -5.8384e+01 -5.0239e+01 -5.1620e+01 -5.6308e+01 -5.8369e+01 -5.0227e+01 -5.1592e+01 -5.6271e+01 -5.8354e+01 -5.0215e+01 -5.1564e+01 -5.6235e+01 -5.8339e+01 -5.0204e+01 -5.1537e+01 -5.6199e+01 -5.8324e+01 -5.0192e+01 -5.1510e+01 -5.6163e+01 -5.8307e+01 -5.0181e+01 -5.1484e+01 -5.6127e+01 -5.8283e+01 -5.0170e+01 -5.1457e+01 -5.6092e+01 -5.8260e+01 -5.0159e+01 -5.1432e+01 -5.6057e+01 -5.8236e+01 -5.0148e+01 -5.1406e+01 -5.6021e+01 -5.8213e+01 -5.0137e+01 -5.1382e+01 -5.5986e+01 -5.8211e+01 -5.0127e+01 -5.1357e+01 -5.5950e+01 -5.8232e+01 -5.0109e+01 -5.1333e+01 -5.5908e+01 -5.8252e+01 -5.0090e+01 -5.1309e+01 -5.5865e+01 -5.8272e+01 -5.0073e+01 -5.1286e+01 -5.5823e+01 -5.8291e+01 -5.0055e+01 -5.1263e+01 -5.5782e+01 -5.8314e+01 -5.0033e+01 -5.1240e+01 -5.5741e+01 -5.8376e+01 -5.0008e+01 -5.1217e+01 -5.5698e+01 -5.8438e+01 -6.0000e+01 -5.1195e+01 -5.5649e+01 -5.8498e+01 -6.0000e+01 -5.1174e+01 -5.5601e+01 -5.8556e+01 -6.0000e+01 -5.1152e+01 -5.5554e+01 -5.8614e+01 -6.0000e+01 -5.1131e+01 -5.5507e+01 -5.8670e+01 -6.0000e+01 -5.1110e+01 -5.5461e+01 -5.8725e+01 -6.0000e+01 -5.1086e+01 -5.5415e+01 -5.8779e+01 -6.0000e+01 -5.1058e+01 -5.5370e+01 -5.8831e+01 -6.0000e+01 -5.1030e+01 -5.5325e+01 -5.8883e+01 -6.0000e+01 -5.0996e+01 -5.5280e+01 -5.8933e+01 -6.0000e+01 -5.0962e+01 -5.5237e+01 -5.8982e+01 -6.0000e+01 -5.0928e+01 -5.5193e+01 -5.9070e+01 -6.0000e+01 -5.0895e+01 -5.5150e+01 -5.9161e+01 -6.0000e+01 -5.0862e+01 -5.5108e+01 -5.9250e+01 -6.0000e+01 -5.0830e+01 -5.5066e+01 -5.9338e+01 -6.0000e+01 -5.0799e+01 -5.5024e+01 -5.9422e+01 -6.0000e+01 -5.0768e+01 -5.4983e+01 -5.9497e+01 -6.0000e+01 -5.0738e+01 -5.4942e+01 -5.9564e+01 -6.0000e+01 -5.0709e+01 -5.4902e+01 -5.9629e+01 -6.0000e+01 -5.0680e+01 -5.4862e+01 -5.9693e+01 -6.0000e+01 -5.0651e+01 -5.4822e+01 -5.9756e+01 -6.0000e+01 -5.0623e+01 -5.4783e+01 -5.9818e+01 -6.0000e+01 -5.0596e+01 -5.4736e+01 -5.9878e+01 -6.0000e+01 -5.0569e+01 -5.4690e+01 -5.9937e+01 -6.0000e+01 -5.0543e+01 -5.4644e+01 -5.9995e+01 -6.0000e+01 -5.0517e+01 -5.4600e+01 -6.0052e+01 -6.0000e+01 -5.0492e+01 -5.4555e+01 -6.0107e+01 -6.0000e+01 -5.0467e+01 -5.4511e+01 -6.0162e+01 -6.0000e+01 -5.0442e+01 -5.4476e+01 -6.0215e+01 -6.0000e+01 -5.0418e+01 -5.4478e+01 -6.0267e+01 -6.0000e+01 -5.0395e+01 -5.4479e+01 -6.0318e+01 -6.0000e+01 -5.0372e+01 -5.4481e+01 -6.0363e+01 -6.0000e+01 -5.0349e+01 -5.4482e+01 -6.0403e+01 -6.0000e+01 -5.0327e+01 -5.4478e+01 -6.0443e+01 -6.0000e+01 -5.0305e+01 -5.4471e+01 -6.0478e+01 -6.0000e+01 -5.0284e+01 -5.4464e+01 -6.0508e+01 -6.0000e+01 -5.0263e+01 -5.4457e+01 -6.0537e+01 -6.0000e+01 -5.0242e+01 -5.4443e+01 -6.0566e+01 -6.0000e+01 -5.0222e+01 -5.4428e+01 -6.0594e+01 -6.0000e+01 -5.0202e+01 -5.4407e+01 -6.0621e+01 -6.0000e+01 -5.0183e+01 -5.4386e+01 -6.0642e+01 -6.0000e+01 -5.0164e+01 -5.4364e+01 -6.0660e+01 -6.0000e+01 -5.0145e+01 -5.4343e+01 -6.0678e+01 -6.0000e+01 -5.0127e+01 -5.4322e+01 -6.0695e+01 -6.0000e+01 -5.0109e+01 -5.4300e+01 -6.0712e+01 -6.0000e+01 -5.0091e+01 -5.4272e+01 -6.0728e+01 -6.0000e+01 -5.0074e+01 -5.4245e+01 -6.0744e+01 -6.0000e+01 -5.0056e+01 -5.4215e+01 -6.0759e+01 -6.0000e+01 -5.0040e+01 -5.4181e+01 -6.0773e+01 -6.0000e+01 -5.0023e+01 -5.4147e+01 -6.0788e+01 -6.0000e+01 -5.0007e+01 -5.4114e+01 -6.0801e+01 -6.0054e+01 -6.0000e+01 -5.4082e+01 -6.0815e+01 -6.0133e+01 -6.0000e+01 -5.4050e+01 -6.0827e+01 -6.0212e+01 -6.0000e+01 -5.4019e+01 -6.0840e+01 -6.0289e+01 -6.0000e+01 -5.3987e+01 -6.0849e+01 -6.0364e+01 -6.0000e+01 -5.3949e+01 -6.0852e+01 -6.0439e+01 -6.0000e+01 -5.3912e+01 -6.0855e+01 -6.0512e+01 -6.0000e+01 -5.3876e+01 -6.0858e+01 -6.0584e+01 -6.0000e+01 -5.3840e+01 -6.0860e+01 -6.0654e+01 -6.0000e+01 -5.3806e+01 -6.0862e+01 -6.0724e+01 -6.0000e+01 -5.3772e+01 -6.0864e+01 -6.0792e+01 -6.0000e+01 -5.3735e+01 -6.0866e+01 -6.0859e+01 -6.0000e+01 -5.3694e+01 -6.0867e+01 -6.0924e+01 -6.0000e+01 -5.3655e+01 -6.0868e+01 -6.0989e+01 -6.0000e+01 -5.3616e+01 -6.0869e+01 -6.1052e+01 -6.0000e+01 -5.3578e+01 -6.0869e+01 -6.1114e+01 -6.0000e+01 -5.3541e+01 -6.0869e+01 -6.1175e+01 -6.0000e+01 -5.3532e+01 -6.0869e+01 -6.1234e+01 -6.0000e+01 -5.3541e+01 -6.0868e+01 -6.1293e+01 -6.0000e+01 -5.3549e+01 -6.0867e+01 -6.1350e+01 -6.0000e+01 -5.3558e+01 -6.0866e+01 -6.1400e+01 -6.0000e+01 -5.3567e+01 -6.0865e+01 -6.1448e+01 -6.0000e+01 -5.3575e+01 -6.0863e+01 -6.1494e+01 -6.0000e+01 -5.3584e+01 -6.0861e+01 -6.1535e+01 -6.0000e+01 -5.3593e+01 -6.0858e+01 -6.1571e+01 -6.0000e+01 -5.3602e+01 -6.0856e+01 -6.1607e+01 -6.0000e+01 -5.3611e+01 -6.0853e+01 -6.1642e+01 -6.0000e+01 -5.3653e+01 -6.0849e+01 -6.1676e+01 -6.0000e+01 -5.3706e+01 -6.0845e+01 -6.1709e+01 -6.0000e+01 -5.3759e+01 -6.0841e+01 -6.1734e+01 -6.0000e+01 -5.3810e+01 -6.0837e+01 -6.1758e+01 -6.0000e+01 -5.3861e+01 -6.0832e+01 -6.1781e+01 -6.0000e+01 -5.3912e+01 -6.0816e+01 -6.1804e+01 -6.0000e+01 -5.3961e+01 -6.0795e+01 -6.1827e+01 -6.0000e+01 -5.4008e+01 -6.0774e+01 -6.1849e+01 -6.0000e+01 -5.4049e+01 -6.0753e+01 -6.1870e+01 -6.0000e+01 -5.4088e+01 -6.0733e+01 -6.1891e+01 -6.0000e+01 -5.4120e+01 -6.0712e+01 -6.1911e+01 -6.0000e+01 -5.4151e+01 -6.0691e+01 -6.1925e+01 -6.0000e+01 -5.4182e+01 -6.0671e+01 -6.1936e+01 -6.0000e+01 -5.4213e+01 -6.0650e+01 -6.1941e+01 -6.0000e+01 -5.4243e+01 -6.0630e+01 -6.1944e+01 -6.0000e+01 -5.4273e+01 -6.0609e+01 -6.1947e+01 -6.0000e+01 -5.4303e+01 -6.0589e+01 -6.1949e+01 -6.0000e+01 -5.4332e+01 -6.0568e+01 -6.1951e+01 -6.0000e+01 -5.4361e+01 -6.0548e+01 -6.1945e+01 -6.0000e+01 -5.4390e+01 -6.0528e+01 -6.1933e+01 -6.0000e+01 -5.4419e+01 -6.0507e+01 -6.1919e+01 -6.0000e+01 -5.4447e+01 -6.0487e+01 -6.1905e+01 -6.0000e+01 -5.4474e+01 -6.0467e+01 -6.1907e+01 -6.0000e+01 -5.4502e+01 -6.0446e+01 -6.1938e+01 -6.0023e+01 -5.4529e+01 -6.0421e+01 -6.1969e+01 -6.0064e+01 -5.4556e+01 -6.0392e+01 -6.1999e+01 -6.0104e+01 -5.4582e+01 -6.0364e+01 -6.2028e+01 -6.0144e+01 -5.4608e+01 -6.0336e+01 -6.2057e+01 -6.0182e+01 -5.4634e+01 -6.0308e+01 -6.2086e+01 -6.0220e+01 -5.4659e+01 -6.0281e+01 -6.2114e+01 -6.0257e+01 -5.4684e+01 -6.0253e+01 -6.2141e+01 -6.0293e+01 -5.4709e+01 -6.0226e+01 -6.2168e+01 -6.0328e+01 -5.4733e+01 -6.0199e+01 -6.2194e+01 -6.0362e+01 -5.4757e+01 -6.0172e+01 -6.2220e+01 -6.0396e+01 -5.4781e+01 -6.0145e+01 -6.2245e+01 -6.0428e+01 -5.4804e+01 -6.0118e+01 -6.2269e+01 -6.0460e+01 -5.4827e+01 -6.0091e+01 -6.2293e+01 -6.0491e+01 -5.4850e+01 -6.0065e+01 -6.2317e+01 -6.0522e+01 -5.4872e+01 -6.0038e+01 -6.2340e+01 -6.0551e+01 -5.4894e+01 -6.0012e+01 -6.2362e+01 -6.0580e+01 -5.4915e+01 -5.9985e+01 -6.2384e+01 -6.0608e+01 -5.4936e+01 -5.9959e+01 -6.2405e+01 -6.0635e+01 -5.4957e+01 -5.9933e+01 -6.2425e+01 -6.0661e+01 -5.4977e+01 -5.9907e+01 -6.2445e+01 -6.0687e+01 -5.4997e+01 -5.9881e+01 -6.2464e+01 -6.0711e+01 -5.5017e+01 -5.9855e+01 -6.2483e+01 -6.0735e+01 -5.5036e+01 -5.9829e+01 -6.2501e+01 -6.0759e+01 -5.5055e+01 -5.9803e+01 -6.2519e+01 -6.0781e+01 -5.5073e+01 -5.9778e+01 -6.2536e+01 -6.0803e+01 -5.5091e+01 -5.9752e+01 -6.2553e+01 -6.0824e+01 -5.5109e+01 -5.9726e+01 -6.2569e+01 -6.0845e+01 -5.5126e+01 -5.9701e+01 -6.2584e+01 -6.0864e+01 -5.5143e+01 -5.9669e+01 -6.2599e+01 -6.0875e+01 -5.5160e+01 -5.9636e+01 -6.2613e+01 -6.0885e+01 -5.5176e+01 -5.9603e+01 -6.2626e+01 -6.0895e+01 -5.5192e+01 -5.9570e+01 -6.2639e+01 -6.0905e+01 -5.5208e+01 -5.9537e+01 -6.2652e+01 -6.0914e+01 -5.5223e+01 -5.9504e+01 -6.2664e+01 -6.0922e+01 -5.5238e+01 -5.9472e+01 -6.2675e+01 -6.0930e+01 -5.5252e+01 -5.9440e+01 -6.2686e+01 -6.0938e+01 -5.5266e+01 -5.9408e+01 -6.2696e+01 -6.0944e+01 -5.5280e+01 -5.9376e+01 -6.2706e+01 -6.0951e+01 -5.5293e+01 -5.9345e+01 -6.2715e+01 -6.0957e+01 -5.5306e+01 -5.9313e+01 -6.2723e+01 -6.0962e+01 -5.5319e+01 -5.9282e+01 -6.2731e+01 -6.0967e+01 -5.5331e+01 -5.9251e+01 -6.2739e+01 -6.0972e+01 -5.5343e+01 -5.9220e+01 -6.2746e+01 -6.0976e+01 -5.5355e+01 -5.9189e+01 -6.2752e+01 -6.0980e+01 -5.5366e+01 -5.9159e+01 -6.2758e+01 -6.0983e+01 -5.5377e+01 -5.9128e+01 -6.2763e+01 -6.0986e+01 -5.5388e+01 -5.9098e+01 -6.2768e+01 -6.0988e+01 -5.5398e+01 -5.9068e+01 -6.2772e+01 -6.0990e+01 -5.5408e+01 -5.9038e+01 -6.2776e+01 -6.0991e+01 -5.5418e+01 -5.9008e+01 -6.2779e+01 -6.0992e+01 -5.5427e+01 -5.8978e+01 -6.2782e+01 -6.0992e+01 -5.5436e+01 -5.8945e+01 -6.2784e+01 -6.0992e+01 -5.5445e+01 -5.8908e+01 -6.2786e+01 -6.0992e+01 -5.5453e+01 -5.8871e+01 -6.2787e+01 -6.0991e+01 -5.5461e+01 -5.8834e+01 -6.2787e+01 -6.0989e+01 -5.5468e+01 -5.8797e+01 -6.2788e+01 -6.0988e+01 -5.5476e+01 -5.8761e+01 -6.2787e+01 -6.0985e+01 -5.5483e+01 -5.8725e+01 -6.2786e+01 -6.0983e+01 -5.5489e+01 -5.8689e+01 -6.2785e+01 -6.0980e+01 -5.5496e+01 -5.8654e+01 -6.2783e+01 -6.0976e+01 -5.5502e+01 -5.8619e+01 -6.2781e+01 -6.0973e+01 -5.5507e+01 -5.8584e+01 -6.2778e+01 -6.0968e+01 -5.5513e+01 -5.8549e+01 -6.2775e+01 -6.0964e+01 -5.5518e+01 -5.8514e+01 -6.2771e+01 -6.0959e+01 -5.5523e+01 -5.8480e+01 -6.2767e+01 -6.0953e+01 -5.5527e+01 -5.8446e+01 -6.2762e+01 -6.0947e+01 -5.5531e+01 -5.8412e+01 -6.2757e+01 -6.0941e+01 -5.5535e+01 -5.8379e+01 -6.2751e+01 -6.0934e+01 -5.5539e+01 -5.8346e+01 -6.2745e+01 -6.0927e+01 -5.5542e+01 -5.8312e+01 -6.2739e+01 -6.0920e+01 -5.5545e+01 -5.8280e+01 -6.2732e+01 -6.0912e+01 -5.5548e+01 -5.8247e+01 -6.2724e+01 -6.0904e+01 -5.5550e+01 -5.8214e+01 -6.2717e+01 -6.0896e+01 -5.5553e+01 -5.8180e+01 -6.2708e+01 -6.0887e+01 -5.5555e+01 -5.8140e+01 -6.2700e+01 -6.0877e+01 -5.5556e+01 -5.8100e+01 -6.2691e+01 -6.0868e+01 -5.5558e+01 -5.8061e+01 -6.2681e+01 -6.0858e+01 -5.5559e+01 -5.8022e+01 -6.2671e+01 -6.0848e+01 -5.5559e+01 -5.7983e+01 -6.2661e+01 -6.0837e+01 -5.5560e+01 -5.7945e+01 -6.2650e+01 -6.0826e+01 -5.5560e+01 -5.7907e+01 -6.2639e+01 -6.0815e+01 -5.5560e+01 -5.7869e+01 -6.2627e+01 -6.0803e+01 -5.5560e+01 -5.7832e+01 -6.2615e+01 -6.0791e+01 -5.5560e+01 -5.7795e+01 -6.2603e+01 -6.0779e+01 -5.5559e+01 -5.7758e+01 -6.2590e+01 -6.0766e+01 -5.5558e+01 -5.7722e+01 -6.2577e+01 -6.0754e+01 -5.5556e+01 -5.7686e+01 -6.2564e+01 -6.0740e+01 -5.5555e+01 -5.7650e+01 -6.2550e+01 -6.0727e+01 -5.5553e+01 -5.7614e+01 -6.2536e+01 -6.0713e+01 -5.5551e+01 -5.7579e+01 -6.2521e+01 -6.0699e+01 -5.5549e+01 -5.7544e+01 -6.2506e+01 -6.0684e+01 -5.5547e+01 -5.7510e+01 -6.2491e+01 -6.0670e+01 -5.5544e+01 -5.7475e+01 -6.2475e+01 -6.0655e+01 -5.5541e+01 -5.7441e+01 -6.2459e+01 -6.0639e+01 -5.5538e+01 -5.7407e+01 -6.2443e+01 -6.0624e+01 -5.5534e+01 -5.7373e+01 -6.2426e+01 -6.0608e+01 -5.5531e+01 -5.7340e+01 -6.2409e+01 -6.0592e+01 -5.5527e+01 -5.7307e+01 -6.2392e+01 -6.0575e+01 -5.5523e+01 -5.7274e+01 -6.2374e+01 -6.0559e+01 -5.5519e+01 -5.7241e+01 -6.2356e+01 -6.0542e+01 -5.5514e+01 -5.7209e+01 -6.2338e+01 -6.0525e+01 -5.5510e+01 -5.7176e+01 -6.2320e+01 -6.0507e+01 -5.5505e+01 -5.7144e+01 -6.2301e+01 -6.0489e+01 -5.5500e+01 -5.7112e+01 -6.2281e+01 -6.0471e+01 -5.5494e+01 -5.7081e+01 -6.2262e+01 -6.0446e+01 -5.5489e+01 -5.7049e+01 -6.2242e+01 -6.0419e+01 -5.5483e+01 -5.7018e+01 -6.2222e+01 -6.0393e+01 -5.5477e+01 -5.6987e+01 -6.2202e+01 -6.0367e+01 -5.5471e+01 -5.6956e+01 -6.2181e+01 -6.0340e+01 -5.5465e+01 -5.6925e+01 -6.2160e+01 -6.0314e+01 -5.5458e+01 -5.6895e+01 -6.2139e+01 -6.0287e+01 -5.5452e+01 -5.6864e+01 -6.2117e+01 -6.0261e+01 -5.5445e+01 -5.6834e+01 -6.2095e+01 -6.0234e+01 -5.5438e+01 -5.6804e+01 -6.2073e+01 -6.0208e+01 -5.5431e+01 -5.6774e+01 -6.2051e+01 -6.0181e+01 -5.5423e+01 -5.6745e+01 -6.2028e+01 -6.0154e+01 -5.5416e+01 -5.6715e+01 -6.2006e+01 -6.0127e+01 -5.5408e+01 -5.6686e+01 -6.1983e+01 -6.0101e+01 -5.5400e+01 -5.6657e+01 -6.1959e+01 -6.0074e+01 -5.5392e+01 -5.6628e+01 -6.1936e+01 -6.0047e+01 -5.5384e+01 -5.6599e+01 -6.1912e+01 -6.0020e+01 -5.5375e+01 -5.6570e+01 -6.1888e+01 -5.9993e+01 -5.5367e+01 -5.6541e+01 -6.1864e+01 -5.9966e+01 -5.5358e+01 -5.6513e+01 -6.1833e+01 -5.9938e+01 -5.5349e+01 -5.6484e+01 -6.1800e+01 -5.9911e+01 -5.5340e+01 -5.6456e+01 -6.1768e+01 -5.9884e+01 -5.5331e+01 -5.6428e+01 -6.1735e+01 -5.9857e+01 -5.5322e+01 -5.6400e+01 -6.1703e+01 -5.9829e+01 -5.5312e+01 -5.6372e+01 -6.1670e+01 -5.9802e+01 -5.5303e+01 -5.6345e+01 -6.1637e+01 -5.9775e+01 -5.5293e+01 -5.6317e+01 -6.1605e+01 -5.9747e+01 -5.5283e+01 -5.6290e+01 -6.1572e+01 -5.9720e+01 -5.5273e+01 -5.6263e+01 -6.1539e+01 -5.9692e+01 -5.5263e+01 -5.6235e+01 -6.1506e+01 -5.9665e+01 -5.5252e+01 -5.6208e+01 -6.1473e+01 -5.9637e+01 -5.5242e+01 -5.6181e+01 -6.1440e+01 -5.9609e+01 -5.5231e+01 -5.6155e+01 -6.1408e+01 -5.9581e+01 -5.5221e+01 -5.6128e+01 -6.1375e+01 -5.9554e+01 -5.5210e+01 -5.6101e+01 -6.1342e+01 -5.9526e+01 -5.5194e+01 -5.6075e+01 -6.1309e+01 -5.9498e+01 -5.5175e+01 -5.6048e+01 -6.1276e+01 -5.9470e+01 -5.5156e+01 -5.6022e+01 -6.1243e+01 -5.9442e+01 -5.5137e+01 -5.5996e+01 -6.1210e+01 -5.9414e+01 -5.5118e+01 -5.5970e+01 -6.1177e+01 -5.9386e+01 -5.5100e+01 -5.5942e+01 -6.1143e+01 -5.9358e+01 -5.5081e+01 -5.5908e+01 -6.1110e+01 -5.9330e+01 -5.5062e+01 -5.5875e+01 -6.1077e+01 -5.9302e+01 -5.5044e+01 -5.5841e+01 -6.1044e+01 -5.9274e+01 -5.5025e+01 -5.5808e+01 -6.1011e+01 -5.9246e+01 -5.5007e+01 -5.5776e+01 -6.0978e+01 -5.9217e+01 -5.4988e+01 -5.5743e+01 -6.0944e+01 -5.9189e+01 -5.4961e+01 -5.5711e+01 -6.0911e+01 -5.9161e+01 -5.4935e+01 -5.5679e+01 -6.0878e+01 -5.9132e+01 -5.4910e+01 -5.5648e+01 -6.0844e+01 -5.9104e+01 -5.4884e+01 -5.5616e+01 -6.0811e+01 -5.9076e+01 -5.4859e+01 -5.5585e+01 -6.0778e+01 -5.9047e+01 -5.4834e+01 -5.5554e+01 -6.0744e+01 -5.9019e+01 -5.4809e+01 -5.5524e+01 -6.0711e+01 -5.8990e+01 -5.4785e+01 -5.5493e+01 -6.0677e+01 -5.8962e+01 -5.4760e+01 -5.5463e+01 -6.0644e+01 -5.8933e+01 -5.4736e+01 -5.5433e+01 -6.0610e+01 -5.8905e+01 -5.4712e+01 -5.5404e+01 -6.0609e+01 -5.8908e+01 -5.4688e+01 -5.5374e+01 -6.0620e+01 -5.8924e+01 -5.4665e+01 -5.5345e+01 -6.0630e+01 -5.8939e+01 -5.4641e+01 -5.5312e+01 -6.0639e+01 -5.8953e+01 -5.4618e+01 -5.5275e+01 -6.0648e+01 -5.8967e+01 -5.4595e+01 -5.5252e+01 -6.0656e+01 -5.8979e+01 -5.4572e+01 -5.5261e+01 -6.0663e+01 -5.8992e+01 -5.4550e+01 -5.5269e+01 -6.0670e+01 -5.9003e+01 -5.4527e+01 -5.5277e+01 -6.0676e+01 -5.9014e+01 -5.4505e+01 -5.5285e+01 -6.0681e+01 -5.9025e+01 -5.4483e+01 -5.5292e+01 -6.0686e+01 -5.9034e+01 -5.4461e+01 -5.5291e+01 -6.0691e+01 -5.9044e+01 -5.4439e+01 -5.5290e+01 -6.0694e+01 -5.9050e+01 -5.4418e+01 -5.5289e+01 -6.0697e+01 -5.9050e+01 -5.4396e+01 -5.5288e+01 -6.0700e+01 -5.9049e+01 -5.4375e+01 -5.5287e+01 -6.0702e+01 -5.9049e+01 -5.4354e+01 -5.5286e+01 -6.0703e+01 -5.9047e+01 -5.4333e+01 -5.5285e+01 -6.0704e+01 -5.9046e+01 -5.4312e+01 -5.5283e+01 -6.0704e+01 -5.9044e+01 -5.4291e+01 -5.5282e+01 -6.0704e+01 -5.9042e+01 -5.4270e+01 -5.5280e+01 -6.0703e+01 -5.9039e+01 -5.4250e+01 -5.5277e+01 -6.0702e+01 -5.9036e+01 -5.4228e+01 -5.5267e+01 -6.0700e+01 -5.9033e+01 -5.4200e+01 -5.5257e+01 -6.0698e+01 -5.9029e+01 -5.4172e+01 -5.5248e+01 -6.0695e+01 -5.9025e+01 -5.4144e+01 -5.5238e+01 -6.0691e+01 -5.9021e+01 -5.4117e+01 -5.5229e+01 -6.0687e+01 -5.9016e+01 -5.4090e+01 -5.5219e+01 -6.0683e+01 -5.9011e+01 -5.4063e+01 -5.5210e+01 -6.0678e+01 -5.9005e+01 -5.4037e+01 -5.5201e+01 -6.0673e+01 -5.9000e+01 -5.4011e+01 -5.5200e+01 -6.0667e+01 -5.8994e+01 -5.3985e+01 -5.5236e+01 -6.0661e+01 -5.8987e+01 -5.3960e+01 -5.5271e+01 -6.0654e+01 -5.8980e+01 -5.3934e+01 -5.5305e+01 -6.0647e+01 -5.8973e+01 -5.3909e+01 -5.5338e+01 -6.0640e+01 -5.8966e+01 -5.3885e+01 -5.5371e+01 -6.0631e+01 -5.8958e+01 -5.3860e+01 -5.5404e+01 -6.0623e+01 -5.8950e+01 -5.3836e+01 -5.5435e+01 -6.0614e+01 -5.8942e+01 -5.3812e+01 -5.5467e+01 -6.0605e+01 -5.8933e+01 -5.3788e+01 -5.5497e+01 -6.0595e+01 -5.8925e+01 -5.3765e+01 -5.5527e+01 -6.0585e+01 -5.8915e+01 -5.3741e+01 -5.5556e+01 -6.0575e+01 -5.8901e+01 -5.3718e+01 -5.5585e+01 -6.0563e+01 -5.8883e+01 -5.3695e+01 -5.5613e+01 -6.0544e+01 -5.8865e+01 -5.3673e+01 -5.5641e+01 -6.0525e+01 -5.8847e+01 -5.3650e+01 -5.5668e+01 -6.0505e+01 -5.8830e+01 -5.3628e+01 -5.5695e+01 -6.0485e+01 -5.8812e+01 -5.3606e+01 -5.5720e+01 -6.0465e+01 -5.8793e+01 -5.3584e+01 -5.5746e+01 -6.0445e+01 -5.8775e+01 -5.3563e+01 -5.5771e+01 -6.0425e+01 -5.8757e+01 -5.3541e+01 -5.5795e+01 -6.0404e+01 -5.8739e+01 -5.3520e+01 -5.5819e+01 -6.0384e+01 -5.8720e+01 -5.3499e+01 -5.5842e+01 -6.0363e+01 -5.8702e+01 -5.3478e+01 -5.5864e+01 -6.0342e+01 -5.8683e+01 -5.3457e+01 -5.5886e+01 -6.0321e+01 -5.8664e+01 -5.3429e+01 -5.5908e+01 -6.0299e+01 -5.8646e+01 -5.3400e+01 -5.5928e+01 -6.0278e+01 -5.8627e+01 -5.3373e+01 -5.5940e+01 -6.0256e+01 -5.8608e+01 -5.3345e+01 -5.5953e+01 -6.0234e+01 -5.8589e+01 -5.3318e+01 -5.5964e+01 -6.0212e+01 -5.8569e+01 -5.3291e+01 -5.5976e+01 -6.0222e+01 -5.8550e+01 -5.3265e+01 -5.5987e+01 -6.0244e+01 -5.8531e+01 -5.3239e+01 -5.5998e+01 -6.0265e+01 -5.8511e+01 -5.3213e+01 -5.6009e+01 -6.0285e+01 -5.8492e+01 -5.3187e+01 -5.6019e+01 -6.0304e+01 -5.8472e+01 -5.3162e+01 -5.6029e+01 -6.0323e+01 -5.8452e+01 -5.3137e+01 -5.6038e+01 -6.0341e+01 -5.8424e+01 -5.3113e+01 -5.6048e+01 -6.0358e+01 -5.8396e+01 -5.3089e+01 -5.6057e+01 -6.0375e+01 -5.8369e+01 -5.3065e+01 -5.6065e+01 -6.0390e+01 -5.8341e+01 -5.3041e+01 -5.6074e+01 -6.0403e+01 -5.8314e+01 -5.3017e+01 -5.6082e+01 -6.0409e+01 -5.8287e+01 -5.2994e+01 -5.6089e+01 -6.0415e+01 -5.8260e+01 -5.2971e+01 -5.6097e+01 -6.0420e+01 -5.8233e+01 -5.2949e+01 -5.6104e+01 -6.0425e+01 -5.8206e+01 -5.2926e+01 -5.6111e+01 -6.0429e+01 -5.8179e+01 -5.2904e+01 -5.6117e+01 -6.0433e+01 -5.8152e+01 -5.2882e+01 -5.6123e+01 -6.0436e+01 -5.8125e+01 -5.2860e+01 -5.6129e+01 -6.0439e+01 -5.8099e+01 -5.2839e+01 -5.6135e+01 -6.0441e+01 -5.8072e+01 -5.2818e+01 -5.6140e+01 -6.0443e+01 -5.8045e+01 -5.2797e+01 -5.6145e+01 -6.0444e+01 -5.8019e+01 -5.2776e+01 -5.6149e+01 -6.0445e+01 -5.7993e+01 -5.2756e+01 -5.6154e+01 -6.0445e+01 -5.7966e+01 -5.2735e+01 -5.6158e+01 -6.0445e+01 -5.7940e+01 -5.2715e+01 -5.6161e+01 -6.0445e+01 -5.7914e+01 -5.2695e+01 -5.6165e+01 -6.0442e+01 -5.7888e+01 -5.2675e+01 -5.6168e+01 -6.0432e+01 -5.7862e+01 -5.2656e+01 -5.6171e+01 -6.0423e+01 -5.7836e+01 -5.2637e+01 -5.6174e+01 -6.0413e+01 -5.7810e+01 -5.2617e+01 -5.6176e+01 -6.0402e+01 -5.7784e+01 -5.2598e+01 -5.6178e+01 -6.0392e+01 -5.7758e+01 -5.2580e+01 -5.6180e+01 -6.0381e+01 -5.7732e+01 -5.2561e+01 -5.6181e+01 -6.0370e+01 -5.7707e+01 -5.2543e+01 -5.6182e+01 -6.0359e+01 -5.7681e+01 -5.2524e+01 -5.6183e+01 -6.0348e+01 -5.7655e+01 -5.2506e+01 -5.6184e+01 -6.0336e+01 -5.7630e+01 -5.2488e+01 -5.6184e+01 -6.0324e+01 -5.7599e+01 -5.2466e+01 -5.6184e+01 -6.0312e+01 -5.7566e+01 -5.2440e+01 -5.6184e+01 -6.0300e+01 -5.7533e+01 -5.2415e+01 -5.6184e+01 -6.0287e+01 -5.7500e+01 -5.2390e+01 -5.6183e+01 -6.0274e+01 -5.7467e+01 -5.2366e+01 -5.6182e+01 -6.0261e+01 -5.7434e+01 -5.2342e+01 -5.6181e+01 -6.0248e+01 -5.7402e+01 -5.2318e+01 -5.6179e+01 -6.0234e+01 -5.7370e+01 -5.2295e+01 -5.6178e+01 -6.0221e+01 -5.7338e+01 -5.2272e+01 -5.6176e+01 -6.0207e+01 -5.7307e+01 -5.2249e+01 -5.6173e+01 -6.0192e+01 -5.7275e+01 -5.2226e+01 -5.6171e+01 -6.0178e+01 -5.7244e+01 -5.2204e+01 -5.6168e+01 -6.0163e+01 -5.7213e+01 -5.2182e+01 -5.6165e+01 -6.0148e+01 -5.7182e+01 -5.2161e+01 -5.6162e+01 -6.0133e+01 -5.7151e+01 -5.2139e+01 -5.6159e+01 -6.0118e+01 -5.7121e+01 -5.2118e+01 -5.6155e+01 -6.0102e+01 -5.7091e+01 -5.2097e+01 -5.6151e+01 -6.0087e+01 -5.7060e+01 -5.2077e+01 -5.6147e+01 -6.0071e+01 -5.7031e+01 -5.2056e+01 -5.6143e+01 -6.0054e+01 -5.7001e+01 -5.2036e+01 -5.6138e+01 -6.0038e+01 -5.6971e+01 -5.2017e+01 -5.6133e+01 -6.0021e+01 -5.6942e+01 -5.1997e+01 -5.6128e+01 -6.0005e+01 -5.6912e+01 -5.1978e+01 -5.6123e+01 -5.9988e+01 -5.6883e+01 -5.1959e+01 -5.6117e+01 -5.9970e+01 -5.6854e+01 -5.1940e+01 -5.6112e+01 -5.9953e+01 -5.6825e+01 -5.1921e+01 -5.6106e+01 -5.9935e+01 -5.6796e+01 -5.1903e+01 -5.6100e+01 -5.9918e+01 -5.6768e+01 -5.1885e+01 -5.6093e+01 -5.9900e+01 -5.6732e+01 -5.1867e+01 -5.6087e+01 -5.9882e+01 -5.6695e+01 -5.1841e+01 -5.6080e+01 -5.9883e+01 -5.6686e+01 -5.1815e+01 -5.6073e+01 -5.9909e+01 -5.6695e+01 -5.1791e+01 -5.6066e+01 -5.9934e+01 -5.6703e+01 -5.1766e+01 -5.6059e+01 -5.9958e+01 -5.6711e+01 -5.1742e+01 -5.6051e+01 -5.9981e+01 -5.6719e+01 -5.1718e+01 -5.6044e+01 -6.0004e+01 -5.6726e+01 -5.1695e+01 -5.6031e+01 -6.0026e+01 -5.6733e+01 -5.1671e+01 -5.6015e+01 -6.0046e+01 -5.6740e+01 -5.1649e+01 -5.5999e+01 -6.0067e+01 -5.6746e+01 -5.1626e+01 -5.5983e+01 -6.0086e+01 -5.6752e+01 -5.1604e+01 -5.5967e+01 -6.0104e+01 -5.6758e+01 -5.1617e+01 -5.5951e+01 -6.0122e+01 -5.6764e+01 -5.1640e+01 -5.5935e+01 -6.0139e+01 -5.6769e+01 -5.1661e+01 -5.5919e+01 -6.0156e+01 -5.6773e+01 -5.1675e+01 -5.5895e+01 -6.0195e+01 -5.6778e+01 -5.1689e+01 -5.5872e+01 -6.0254e+01 -5.6782e+01 -5.1703e+01 -5.5848e+01 -6.0312e+01 -5.6786e+01 -5.1717e+01 -5.5825e+01 -6.0368e+01 -5.6789e+01 -5.1730e+01 -5.5802e+01 -6.0423e+01 -5.6792e+01 -5.1743e+01 -5.5779e+01 -6.0477e+01 -5.6795e+01 -5.1757e+01 -5.5756e+01 -6.0529e+01 -5.6797e+01 -5.1770e+01 -5.5733e+01 -6.0580e+01 -5.6791e+01 -5.1783e+01 -5.5711e+01 -6.0630e+01 -5.6785e+01 -5.1795e+01 -5.5689e+01 -6.0676e+01 -5.6779e+01 -5.1808e+01 -5.5666e+01 -6.0715e+01 -5.6773e+01 -5.1820e+01 -5.5644e+01 -6.0754e+01 -5.6759e+01 -5.1833e+01 -5.5623e+01 -6.0791e+01 -5.6745e+01 -5.1845e+01 -5.5601e+01 -6.0827e+01 -5.6731e+01 -5.1857e+01 -5.5579e+01 -6.0863e+01 -5.6717e+01 -5.1869e+01 -5.5558e+01 -6.0897e+01 -5.6703e+01 -5.1880e+01 -5.5537e+01 -6.0930e+01 -5.6689e+01 -5.1892e+01 -5.5515e+01 -6.0963e+01 -5.6675e+01 -5.1903e+01 -5.5494e+01 -6.0994e+01 -5.6661e+01 -5.1914e+01 -5.5474e+01 -6.1024e+01 -5.6648e+01 -5.1925e+01 -5.5450e+01 -6.1054e+01 -5.6634e+01 -5.1936e+01 -5.5421e+01 -6.1082e+01 -5.6620e+01 -5.1946e+01 -5.5393e+01 -6.1110e+01 -5.6606e+01 -5.1957e+01 -5.5365e+01 -6.1137e+01 -5.6588e+01 -5.1967e+01 -5.5337e+01 -6.1162e+01 -5.6566e+01 -5.1977e+01 -5.5310e+01 -6.1187e+01 -5.6545e+01 -5.1987e+01 -5.5278e+01 -6.1205e+01 -5.6524e+01 -5.1996e+01 -5.5243e+01 -6.1221e+01 -5.6503e+01 -5.2006e+01 -5.5209e+01 -6.1235e+01 -5.6482e+01 -5.2015e+01 -5.5175e+01 -6.1249e+01 -5.6462e+01 -5.2023e+01 -5.5142e+01 -6.1263e+01 -5.6442e+01 -5.2024e+01 -5.5109e+01 -6.1275e+01 -5.6421e+01 -5.2025e+01 -5.5076e+01 -6.1287e+01 -5.6401e+01 -5.2026e+01 -5.5036e+01 -6.1299e+01 -5.6382e+01 -5.2027e+01 -5.4996e+01 -6.1309e+01 -5.6362e+01 -5.2028e+01 -5.4957e+01 -6.1320e+01 -5.6343e+01 -5.2029e+01 -5.4909e+01 -6.1329e+01 -5.6323e+01 -5.2030e+01 -5.4855e+01 -6.1338e+01 -5.6304e+01 -5.2031e+01 -5.4803e+01 -6.1346e+01 -5.6285e+01 -5.2032e+01 -5.4751e+01 -6.1354e+01 -5.6266e+01 -5.2034e+01 -5.4700e+01 -6.1361e+01 -5.6247e+01 -5.2035e+01 -5.4650e+01 -6.1368e+01 -5.6229e+01 -5.2036e+01 -5.4601e+01 -6.1374e+01 -5.6210e+01 -5.2037e+01 -5.4553e+01 -6.1379e+01 -5.6192e+01 -5.2038e+01 -5.4506e+01 -6.1384e+01 -5.6172e+01 -5.2037e+01 -5.4459e+01 -6.1388e+01 -5.6146e+01 -5.2030e+01 -5.4408e+01 -6.1392e+01 -5.6120e+01 -5.2023e+01 -5.4350e+01 -6.1388e+01 -5.6094e+01 -5.2017e+01 -5.4289e+01 -6.1382e+01 -5.6069e+01 -5.2009e+01 -5.4222e+01 -6.1377e+01 -5.6044e+01 -5.2040e+01 -5.4157e+01 -6.1371e+01 -5.6019e+01 -5.2070e+01 -5.4093e+01 -6.1364e+01 -5.5994e+01 -5.2095e+01 -5.4025e+01 -6.1358e+01 -5.5970e+01 -5.2117e+01 -5.3955e+01 -6.1351e+01 -5.5946e+01 -5.2164e+01 -5.3887e+01 -6.1344e+01 -5.5922e+01 -5.2274e+01 -5.3821e+01 -6.1370e+01 -5.5899e+01 -5.2383e+01 -5.3755e+01 -6.1406e+01 -5.5875e+01 -5.2490e+01 -5.3692e+01 -6.1441e+01 -5.5852e+01 -5.2596e+01 -5.3629e+01 -6.1475e+01 -5.5829e+01 -5.2700e+01 -5.3567e+01 -6.1509e+01 -5.5806e+01 -5.2803e+01 -5.3507e+01 -6.1541e+01 -5.5784e+01 -5.2904e+01 -5.3448e+01 -6.1572e+01 -5.5761e+01 -5.3004e+01 -5.3390e+01 -6.1602e+01 -5.5739e+01 -5.3103e+01 -5.3334e+01 -6.1632e+01 -5.5717e+01 -5.3200e+01 -5.3278e+01 -6.1653e+01 -5.5695e+01 -5.3290e+01 -5.3224e+01 -6.1673e+01 -5.5673e+01 -5.3377e+01 -5.3197e+01 -6.1692e+01 -5.5652e+01 -5.3462e+01 -5.3183e+01 -6.1710e+01 -5.5630e+01 -5.3546e+01 -5.3167e+01 -6.1728e+01 -5.5609e+01 -5.3630e+01 -5.3152e+01 -6.1745e+01 -5.5588e+01 -5.3712e+01 -5.3138e+01 -6.1761e+01 -5.5567e+01 -5.3792e+01 -5.3124e+01 -6.1777e+01 -5.5546e+01 -5.3872e+01 -5.3110e+01 -6.1791e+01 -5.5526e+01 -5.3951e+01 -5.3097e+01 -6.1812e+01 -5.5505e+01 -5.4028e+01 -5.3085e+01 -6.1870e+01 -5.5485e+01 -5.4105e+01 -5.3073e+01 -6.1927e+01 -5.5465e+01 -5.4180e+01 -5.3061e+01 -6.1982e+01 -5.5445e+01 -5.4254e+01 -5.3050e+01 -6.2036e+01 -5.5425e+01 -5.4327e+01 -5.3039e+01 -6.2089e+01 -5.5405e+01 -5.4399e+01 -5.3029e+01 -6.2141e+01 -5.5385e+01 -5.4470e+01 -5.3019e+01 -6.2191e+01 -5.5365e+01 -5.4540e+01 -5.3009e+01 -6.2233e+01 -5.5346e+01 -5.4609e+01 -5.3000e+01 -6.2272e+01 -5.5326e+01 -5.4677e+01 -5.2991e+01 -6.2303e+01 -5.5307e+01 -5.4743e+01 -5.2982e+01 -6.2333e+01 -5.5320e+01 -5.4809e+01 -5.2974e+01 -6.2363e+01 -5.5345e+01 -5.4870e+01 -5.2966e+01 -6.2391e+01 -5.5369e+01 -5.4926e+01 -5.2958e+01 -6.2419e+01 -5.5393e+01 -5.4981e+01 -5.2951e+01 -6.2446e+01 -5.5417e+01 -5.5067e+01 -5.2944e+01 -6.2472e+01 -5.5439e+01 -5.5165e+01 -5.2926e+01 -6.2498e+01 -5.5462e+01 -5.5261e+01 -5.2904e+01 -6.2522e+01 -5.5483e+01 -5.5355e+01 -5.2882e+01 -6.2546e+01 -5.5504e+01 -5.5448e+01 -5.2861e+01 -6.2569e+01 -5.5525e+01 -5.5540e+01 -5.2840e+01 -6.2591e+01 -5.5545e+01 -5.5630e+01 -5.2820e+01 -6.2613e+01 -5.5564e+01 -5.5719e+01 -5.2801e+01 -6.2634e+01 -5.5583e+01 -5.5806e+01 -5.2782e+01 -6.2654e+01 -5.5602e+01 -5.5892e+01 -5.2763e+01 -6.2668e+01 -5.5620e+01 -5.5976e+01 -5.2746e+01 -6.2678e+01 -5.5637e+01 -5.6054e+01 -5.2728e+01 -6.2689e+01 -5.5654e+01 -5.6128e+01 -5.2711e+01 -6.2698e+01 -5.5671e+01 -5.6201e+01 -5.2695e+01 -6.2707e+01 -5.5687e+01 -5.6273e+01 -5.2679e+01 -6.2716e+01 -5.5702e+01 -5.6343e+01 -5.2664e+01 -6.2724e+01 -5.5717e+01 -5.6413e+01 -5.2644e+01 -6.2731e+01 -5.5732e+01 -5.6481e+01 -5.2621e+01 -6.2738e+01 -5.5746e+01 -5.6548e+01 -5.2599e+01 -6.2745e+01 -5.5759e+01 -5.6614e+01 -5.2578e+01 -6.2750e+01 -5.5773e+01 -5.6679e+01 -5.2557e+01 -6.2756e+01 -5.5785e+01 -5.6743e+01 -5.2537e+01 -6.2761e+01 -5.5797e+01 -5.6806e+01 -5.2517e+01 -6.2764e+01 -5.5809e+01 -5.6868e+01 -5.2498e+01 -6.2751e+01 -5.5821e+01 -5.6928e+01 -5.2479e+01 -6.2739e+01 -5.5831e+01 -5.6988e+01 -5.2461e+01 -6.2727e+01 -5.5842e+01 -5.7046e+01 -5.2443e+01 -6.2714e+01 -5.5852e+01 -5.7104e+01 -5.2426e+01 -6.2702e+01 -5.5861e+01 -5.7160e+01 -5.2409e+01 -6.2689e+01 -5.5863e+01 -5.7216e+01 -5.2392e+01 -6.2676e+01 -5.5864e+01 -5.7270e+01 -5.2376e+01 -6.2663e+01 -5.5865e+01 -5.7324e+01 -5.2361e+01 -6.2650e+01 -5.5865e+01 -5.7376e+01 -5.2346e+01 -6.2636e+01 -5.5866e+01 -5.7428e+01 -5.2331e+01 -6.2623e+01 -5.5866e+01 -5.7478e+01 -5.2309e+01 -6.2609e+01 -5.5866e+01 -5.7528e+01 -5.2287e+01 -6.2595e+01 -5.5865e+01 -5.7576e+01 -5.2266e+01 -6.2581e+01 -5.5865e+01 -5.7624e+01 -5.2245e+01 -6.2567e+01 -5.5864e+01 -5.7670e+01 -5.2225e+01 -6.2553e+01 -5.5863e+01 -5.7716e+01 -5.2205e+01 -6.2538e+01 -5.5862e+01 -5.7761e+01 -5.2186e+01 -6.2522e+01 -5.5860e+01 -5.7805e+01 -5.2167e+01 -6.2500e+01 -5.5859e+01 -5.7848e+01 -5.2149e+01 -6.2477e+01 -5.5857e+01 -5.7890e+01 -5.2131e+01 -6.2454e+01 -5.5855e+01 -5.7931e+01 -5.2113e+01 -6.2431e+01 -5.5852e+01 -5.7971e+01 -5.2096e+01 -6.2408e+01 -5.5850e+01 -5.8010e+01 -5.2080e+01 -6.2385e+01 -5.5847e+01 -5.8049e+01 -5.2063e+01 -6.2363e+01 -5.5845e+01 -5.8086e+01 -5.2048e+01 -6.2340e+01 -5.5841e+01 -5.8123e+01 -5.2032e+01 -6.2317e+01 -5.5838e+01 -5.8159e+01 -5.2017e+01 -6.2294e+01 -5.5835e+01 -5.8194e+01 -5.2002e+01 -6.2271e+01 -5.5831e+01 -5.8228e+01 -5.1988e+01 -6.2248e+01 -5.5827e+01 -5.8261e+01 -5.1974e+01 -6.2225e+01 -5.5823e+01 -5.8294e+01 -5.1960e+01 -6.2202e+01 -5.5819e+01 -5.8325e+01 -5.1947e+01 -6.2179e+01 -5.5814e+01 -5.8356e+01 -5.1934e+01 -6.2156e+01 -5.5810e+01 -5.8386e+01 -5.1921e+01 -6.2133e+01 -5.5805e+01 -5.8416e+01 -5.1909e+01 -6.2110e+01 -5.5800e+01 -5.8444e+01 -5.1896e+01 -6.2086e+01 -5.5795e+01 -5.8472e+01 -5.1884e+01 -6.2063e+01 -5.5781e+01 -5.8499e+01 -5.1873e+01 -6.2040e+01 -5.5759e+01 -5.8525e+01 -5.1861e+01 -6.2016e+01 -5.5738e+01 -5.8551e+01 -5.1850e+01 -6.1993e+01 -5.5717e+01 -5.8575e+01 -5.1839e+01 -6.1969e+01 -5.5697e+01 -5.8599e+01 -5.1829e+01 -6.1945e+01 -5.5676e+01 -5.8623e+01 -5.1818e+01 -6.1922e+01 -5.5656e+01 -5.8645e+01 -5.1808e+01 -6.1898e+01 -5.5635e+01 -5.8667e+01 -5.1798e+01 -6.1874e+01 -5.5615e+01 -5.8688e+01 -5.1788e+01 -6.1850e+01 -5.5596e+01 -5.8708e+01 -5.1779e+01 -6.1826e+01 -5.5576e+01 -5.8728e+01 -5.1769e+01 -6.1802e+01 -5.5556e+01 -5.8747e+01 -5.1760e+01 -6.1778e+01 -5.5537e+01 -5.8766e+01 -5.1751e+01 -6.1753e+01 -5.5518e+01 -5.8783e+01 -5.1742e+01 -6.1729e+01 -5.5499e+01 -5.8800e+01 -5.1734e+01 -6.1704e+01 -5.5480e+01 -5.8809e+01 -5.1725e+01 -6.1680e+01 -5.5461e+01 -5.8817e+01 -5.1717e+01 -6.1655e+01 -5.5442e+01 -5.8825e+01 -5.1709e+01 -6.1630e+01 -5.5424e+01 -5.8832e+01 -5.1701e+01 -6.1605e+01 -5.5405e+01 -5.8838e+01 -5.1693e+01 -6.1580e+01 -5.5387e+01 -5.8837e+01 -5.1685e+01 -6.1555e+01 -5.5369e+01 -5.8835e+01 -5.1677e+01 -6.1530e+01 -5.5351e+01 -5.8833e+01 -5.1670e+01 -6.1505e+01 -5.5333e+01 -5.8830e+01 -5.1663e+01 -6.1480e+01 -5.5315e+01 -5.8827e+01 -5.1655e+01 -6.1454e+01 -5.5297e+01 -5.8824e+01 -5.1648e+01 -6.1429e+01 -5.5280e+01 -5.8821e+01 -5.1641e+01 -6.1403e+01 -5.5262e+01 -5.8809e+01 -5.1634e+01 -6.1372e+01 -5.5244e+01 -5.8792e+01 -5.1627e+01 -6.1338e+01 -5.5227e+01 -5.8772e+01 -5.1618e+01 -6.1304e+01 -5.5210e+01 -5.8753e+01 -5.1603e+01 -6.1271e+01 -5.5192e+01 -5.8734e+01 -5.1589e+01 -6.1238e+01 -5.5175e+01 -5.8715e+01 -5.1575e+01 -6.1204e+01 -5.5158e+01 -5.8696e+01 -5.1562e+01 -6.1171e+01 -5.5141e+01 -5.8677e+01 -5.1548e+01 -6.1138e+01 -5.5124e+01 -5.8659e+01 -5.1535e+01 -6.1105e+01 -5.5107e+01 -5.8640e+01 -5.1522e+01 -6.1072e+01 -5.5090e+01 -5.8622e+01 -5.1509e+01 -6.1039e+01 -5.5073e+01 -5.8603e+01 -5.1497e+01 -6.1006e+01 -5.5057e+01 -5.8585e+01 -5.1485e+01 -6.0974e+01 -5.5040e+01 -5.8567e+01 -5.1473e+01 -6.0941e+01 -5.5023e+01 -5.8549e+01 -5.1461e+01 -6.0908e+01 -5.5003e+01 -5.8531e+01 -5.1450e+01 -6.0876e+01 -5.4979e+01 -5.8513e+01 -5.1438e+01 -6.0843e+01 -5.4954e+01 -5.8495e+01 -5.1427e+01 -6.0811e+01 -5.4930e+01 -5.8477e+01 -5.1416e+01 -6.0778e+01 -5.4907e+01 -5.8459e+01 -5.1406e+01 -6.0746e+01 -5.4883e+01 -5.8441e+01 -5.1395e+01 -6.0714e+01 -5.4860e+01 -5.8424e+01 -5.1385e+01 -6.0681e+01 -5.4837e+01 -5.8406e+01 -5.1375e+01 -6.0649e+01 -5.4814e+01 -5.8388e+01 -5.1365e+01 -6.0617e+01 -5.4791e+01 -5.8370e+01 -5.1355e+01 -6.0585e+01 -5.4769e+01 -5.8353e+01 -5.1345e+01 -6.0553e+01 -5.4747e+01 -5.8335e+01 -5.1336e+01 -6.0520e+01 -5.4725e+01 -5.8317e+01 -5.1327e+01 -6.0488e+01 -5.4703e+01 -5.8300e+01 -5.1317e+01 -6.0456e+01 -5.4681e+01 -5.8282e+01 -5.1308e+01 -6.0424e+01 -5.4659e+01 -5.8265e+01 -5.1299e+01 -6.0392e+01 -5.4638e+01 -5.8247e+01 -5.1291e+01 -6.0361e+01 -5.4617e+01 -5.8229e+01 -5.1282e+01 -6.0329e+01 -5.4596e+01 -5.8212e+01 -5.1274e+01 -6.0297e+01 -5.4575e+01 -5.8194e+01 -5.1265e+01 -6.0265e+01 -5.4554e+01 -5.8176e+01 -5.1257e+01 -6.0233e+01 -5.4534e+01 -5.8159e+01 -5.1249e+01 -6.0201e+01 -5.4513e+01 -5.8141e+01 -5.1241e+01 -6.0169e+01 -5.4493e+01 -5.8123e+01 -5.1233e+01 -6.0138e+01 -5.4473e+01 -5.8106e+01 -5.1225e+01 -6.0106e+01 -5.4453e+01 -5.8088e+01 -5.1217e+01 -6.0074e+01 -5.4433e+01 -5.8070e+01 -5.1210e+01 -6.0043e+01 -5.4414e+01 -5.8052e+01 -5.1202e+01 -6.0011e+01 -5.4394e+01 -5.8034e+01 -5.1195e+01 -5.9979e+01 -5.4375e+01 -5.8016e+01 -5.1188e+01 -5.9948e+01 -5.4355e+01 -5.7995e+01 -5.1180e+01 -5.9916e+01 -5.4336e+01 -5.7969e+01 -5.1173e+01 -5.9884e+01 -5.4317e+01 -5.7944e+01 -5.1166e+01 -5.9853e+01 -5.4298e+01 -5.7918e+01 -5.1159e+01 -5.9821e+01 -5.4274e+01 -5.7893e+01 -5.1152e+01 -5.9790e+01 -5.4247e+01 -5.7867e+01 -5.1146e+01 -5.9758e+01 -5.4221e+01 -5.7870e+01 -5.1139e+01 -5.9727e+01 -5.4192e+01 -5.7889e+01 -5.1132e+01 -5.9695e+01 -5.4159e+01 -5.7908e+01 -5.1126e+01 -5.9664e+01 -5.4125e+01 -5.7926e+01 -5.1119e+01 -5.9632e+01 -5.4093e+01 -5.7944e+01 -5.1113e+01 -5.9601e+01 -5.4061e+01 -5.7961e+01 -5.1106e+01 -5.9569e+01 -5.4029e+01 -5.7978e+01 -5.1100e+01 -5.9538e+01 -5.3997e+01 -5.7994e+01 -5.1094e+01 -5.9506e+01 -5.3966e+01 -5.8009e+01 -5.1087e+01 -5.9475e+01 -5.3936e+01 -5.8025e+01 -5.1081e+01 -5.9443e+01 -5.3906e+01 -5.8039e+01 -5.1075e+01 -5.9412e+01 -5.3876e+01 -5.8053e+01 -5.1069e+01 -5.9381e+01 -5.3847e+01 -5.8067e+01 -5.1063e+01 -5.9349e+01 -5.3818e+01 -5.8080e+01 -5.1057e+01 -5.9318e+01 -5.3790e+01 -5.8093e+01 -5.1051e+01 -5.9287e+01 -5.3761e+01 -5.8105e+01 -5.1045e+01 -5.9255e+01 -5.3734e+01 -5.8116e+01 -5.1039e+01 -5.9224e+01 -5.3706e+01 -5.8127e+01 -5.1034e+01 -5.9193e+01 -5.3679e+01 -5.8138e+01 -5.1028e+01 -5.9161e+01 -5.3652e+01 -5.8148e+01 -5.1022e+01 -5.9130e+01 -5.3626e+01 -5.8158e+01 -5.1017e+01 -5.9099e+01 -5.3600e+01 -5.8167e+01 -5.1011e+01 -5.9068e+01 -5.3574e+01 -5.8176e+01 -5.1005e+01 -5.9029e+01 -5.3549e+01 -5.8184e+01 -5.1000e+01 -5.8990e+01 -5.3524e+01 -5.8192e+01 -5.0994e+01 -5.8951e+01 -5.3499e+01 -5.8200e+01 -5.0989e+01 -5.8913e+01 -5.3474e+01 -5.8207e+01 -5.0983e+01 -5.8875e+01 -5.3450e+01 -5.8213e+01 -5.0978e+01 -5.8836e+01 -5.3426e+01 -5.8219e+01 -5.0973e+01 -5.8798e+01 -5.3403e+01 -5.8225e+01 -5.0967e+01 -5.8761e+01 -5.3379e+01 -5.8230e+01 -5.0962e+01 -5.8723e+01 -5.3356e+01 -5.8235e+01 -5.0956e+01 -5.8685e+01 -5.3333e+01 -5.8240e+01 -5.0951e+01 -5.8648e+01 -5.3311e+01 -5.8244e+01 -5.0946e+01 -5.8611e+01 -5.3288e+01 -5.8247e+01 -5.0941e+01 -5.8574e+01 -5.3266e+01 -5.8250e+01 -5.0935e+01 -5.8538e+01 -5.3244e+01 -5.8253e+01 -5.0930e+01 -5.8501e+01 -5.3223e+01 -5.8255e+01 -5.0925e+01 -5.8483e+01 -5.3201e+01 -5.8257e+01 -5.0920e+01 -5.8491e+01 -5.3180e+01 -5.8259e+01 -5.0915e+01 -5.8499e+01 -5.3159e+01 -5.8260e+01 -5.0910e+01 -5.8506e+01 -5.3138e+01 -5.8261e+01 -5.0904e+01 -5.8513e+01 -5.3118e+01 -5.8261e+01 -5.0899e+01 -5.8519e+01 -5.3097e+01 -5.8261e+01 -5.0894e+01 -5.8525e+01 -5.3077e+01 -5.8261e+01 -5.0889e+01 -5.8530e+01 -5.3057e+01 -5.8260e+01 -5.0884e+01 -5.8535e+01 -5.3038e+01 -5.8259e+01 -5.0879e+01 -5.8539e+01 -5.3018e+01 -5.8258e+01 -5.0873e+01 -5.8543e+01 -5.2999e+01 -5.8256e+01 -5.0860e+01 -5.8546e+01 -5.2979e+01 -5.8254e+01 -5.0848e+01 -5.8549e+01 -5.2960e+01 -5.8251e+01 -5.0835e+01 -5.8552e+01 -5.2940e+01 -5.8248e+01 -5.0823e+01 -5.8554e+01 -5.2914e+01 -5.8245e+01 -5.0810e+01 -5.8581e+01 -5.2888e+01 -5.8241e+01 -5.0798e+01 -5.8626e+01 -5.2862e+01 -5.8237e+01 -5.0787e+01 -5.8671e+01 -5.2836e+01 -5.8233e+01 -5.0775e+01 -5.8714e+01 -5.2811e+01 -5.8229e+01 -5.0764e+01 -5.8757e+01 -5.2786e+01 -5.8224e+01 -5.0745e+01 -5.8798e+01 -5.2762e+01 -5.8219e+01 -5.0726e+01 -5.8838e+01 -5.2737e+01 -5.8213e+01 -5.0708e+01 -5.8877e+01 -5.2714e+01 -5.8207e+01 -5.0689e+01 -5.8915e+01 -5.2690e+01 -5.8201e+01 -5.0671e+01 -5.8953e+01 -5.2664e+01 -5.8195e+01 -5.0654e+01 -5.8989e+01 -5.2633e+01 -5.8174e+01 -5.0637e+01 -5.9024e+01 -5.2603e+01 -5.8151e+01 -5.0620e+01 -5.9058e+01 -5.2573e+01 -5.8129e+01 -5.0603e+01 -5.9092e+01 -5.2544e+01 -5.8106e+01 -5.0587e+01 -5.9124e+01 -5.2515e+01 -5.8084e+01 -5.0571e+01 -5.9155e+01 -5.2486e+01 -5.8061e+01 -5.0556e+01 -5.9186e+01 -5.2458e+01 -5.8039e+01 -5.0540e+01 -5.9216e+01 -5.2430e+01 -5.8017e+01 -5.0525e+01 -5.9244e+01 -5.2403e+01 -5.7995e+01 -5.0510e+01 -5.9272e+01 -5.2376e+01 -5.7973e+01 -5.0496e+01 -5.9299e+01 -5.2350e+01 -5.7950e+01 -5.0482e+01 -5.9325e+01 -5.2324e+01 -5.7929e+01 -5.0468e+01 -5.9350e+01 -5.2298e+01 -5.7907e+01 -5.0454e+01 -5.9375e+01 -5.2273e+01 -5.7885e+01 -5.0440e+01 -5.9398e+01 -5.2248e+01 -5.7863e+01 -5.0427e+01 -5.9421e+01 -5.2224e+01 -5.7841e+01 -5.0414e+01 -5.9443e+01 -5.2199e+01 -5.7820e+01 -5.0401e+01 -5.9459e+01 -5.2176e+01 -5.7798e+01 -5.0389e+01 -5.9472e+01 -5.2152e+01 -5.7776e+01 -5.0369e+01 -5.9484e+01 -5.2129e+01 -5.7755e+01 -5.0349e+01 -5.9495e+01 -5.2106e+01 -5.7733e+01 -5.0330e+01 -5.9506e+01 -5.2084e+01 -5.7712e+01 -5.0310e+01 -5.9516e+01 -5.2062e+01 -5.7690e+01 -5.0292e+01 -5.9525e+01 -5.2040e+01 -5.7669e+01 -5.0273e+01 -5.9526e+01 -5.2018e+01 -5.7647e+01 -5.0256e+01 -5.9527e+01 -5.1997e+01 -5.7626e+01 -5.0238e+01 -5.9527e+01 -5.1976e+01 -5.7604e+01 -5.0221e+01 -5.9527e+01 -5.1956e+01 -5.7583e+01 -5.0204e+01 -5.9527e+01 -5.1935e+01 -5.7562e+01 -5.0187e+01 -5.9526e+01 -5.1915e+01 -5.7540e+01 -5.0171e+01 -5.9525e+01 -5.1896e+01 -5.7519e+01 -5.0155e+01 -5.9524e+01 -5.1876e+01 -5.7498e+01 -5.0140e+01 -5.9522e+01 -5.1856e+01 -5.7476e+01 -5.0125e+01 -5.9520e+01 -5.1834e+01 -5.7455e+01 -5.0110e+01 -5.9517e+01 -5.1852e+01 -5.7434e+01 -5.0095e+01 -5.9514e+01 -5.1870e+01 -5.7412e+01 -5.0081e+01 -5.9511e+01 -5.1887e+01 -5.7391e+01 -5.0067e+01 -5.9508e+01 -5.1905e+01 -5.7370e+01 -5.0053e+01 -5.9504e+01 -5.1922e+01 -5.7349e+01 -5.0040e+01 -5.9500e+01 -5.1939e+01 -5.7327e+01 -5.0027e+01 -5.9496e+01 -5.1955e+01 -5.7306e+01 -5.0014e+01 -5.9491e+01 -5.1972e+01 -5.7285e+01 -5.0001e+01 -5.9486e+01 -5.1988e+01 -5.7264e+01 -1.0000e+01 -5.9480e+01 -5.2004e+01 -5.7242e+01 -6.0000e+01 -5.9475e+01 -5.2020e+01 -5.7221e+01 -6.0000e+01 -5.9469e+01 -5.2035e+01 -5.7200e+01 -6.0000e+01 -5.9462e+01 -5.2051e+01 -5.7179e+01 -6.0000e+01 -5.9456e+01 -5.2066e+01 -5.7157e+01 -6.0000e+01 -5.9449e+01 -5.2081e+01 -5.7136e+01 -6.0000e+01 -5.9441e+01 -5.2095e+01 -5.7115e+01 -6.0000e+01 -5.9434e+01 -5.2110e+01 -5.7093e+01 -6.0000e+01 -5.9426e+01 -5.2124e+01 -5.7072e+01 -6.0000e+01 -5.9418e+01 -5.2138e+01 -5.7051e+01 -6.0000e+01 -5.9411e+01 -5.2151e+01 -5.7029e+01 -6.0000e+01 -5.9447e+01 -5.2165e+01 -5.7008e+01 -6.0000e+01 -5.9482e+01 -5.2178e+01 -5.6987e+01 -6.0000e+01 -5.9516e+01 -5.2191e+01 -5.6966e+01 -6.0000e+01 -5.9549e+01 -5.2203e+01 -5.6944e+01 -6.0000e+01 -5.9581e+01 -5.2216e+01 -5.6923e+01 -6.0000e+01 -5.9613e+01 -5.2226e+01 -5.6902e+01 -6.0000e+01 -5.9643e+01 -5.2230e+01 -5.6880e+01 -6.0000e+01 -5.9672e+01 -5.2234e+01 -5.6858e+01 -6.0000e+01 -5.9701e+01 -5.2238e+01 -5.6829e+01 -6.0000e+01 -5.9729e+01 -5.2242e+01 -5.6800e+01 -6.0000e+01 -5.9756e+01 -5.2246e+01 -5.6771e+01 -6.0000e+01 -5.9782e+01 -5.2250e+01 -5.6742e+01 -6.0000e+01 -5.9807e+01 -5.2254e+01 -5.6713e+01 -6.0000e+01 -5.9831e+01 -5.2258e+01 -5.6685e+01 -6.0000e+01 -5.9855e+01 -5.2261e+01 -5.6657e+01 -6.0000e+01 -5.9877e+01 -5.2265e+01 -5.6622e+01 -6.0000e+01 -5.9899e+01 -5.2269e+01 -5.6586e+01 -6.0000e+01 -5.9920e+01 -5.2272e+01 -5.6551e+01 -6.0000e+01 -5.9941e+01 -5.2279e+01 -5.6516e+01 -6.0000e+01 -5.9960e+01 -5.2327e+01 -5.6481e+01 -6.0000e+01 -5.9979e+01 -5.2375e+01 -5.6446e+01 -6.0000e+01 -5.9997e+01 -5.2421e+01 -5.6412e+01 -6.0000e+01 -6.0014e+01 -5.2467e+01 -5.6379e+01 -6.0000e+01 -6.0031e+01 -5.2512e+01 -5.6345e+01 -6.0000e+01 -6.0040e+01 -5.2550e+01 -5.6312e+01 -6.0000e+01 -6.0047e+01 -5.2586e+01 -5.6279e+01 -6.0000e+01 -6.0054e+01 -5.2621e+01 -5.6247e+01 -6.0000e+01 -6.0060e+01 -5.2656e+01 -5.6214e+01 -6.0000e+01 -6.0066e+01 -5.2690e+01 -5.6182e+01 -6.0000e+01 -6.0071e+01 -5.2724e+01 -5.6150e+01 -6.0000e+01 -6.0076e+01 -5.2757e+01 -5.6119e+01 -6.0000e+01 -6.0080e+01 -5.2790e+01 -5.6088e+01 -6.0000e+01 -6.0084e+01 -5.2823e+01 -5.6057e+01 -6.0000e+01 -6.0087e+01 -5.2854e+01 -5.6026e+01 -6.0000e+01 -6.0090e+01 -5.2886e+01 -5.5996e+01 -6.0000e+01 -6.0092e+01 -5.2917e+01 -5.5966e+01 -6.0000e+01 -6.0094e+01 -5.2947e+01 -5.5936e+01 -6.0000e+01 -6.0096e+01 -5.2977e+01 -5.5906e+01 -6.0000e+01 -6.0096e+01 -5.3006e+01 -5.5876e+01 -5.9949e+01 -6.0097e+01 -5.3029e+01 -5.5847e+01 -5.9892e+01 -6.0097e+01 -5.3050e+01 -5.5818e+01 -5.9836e+01 -6.0096e+01 -5.3070e+01 -5.5789e+01 -5.9781e+01 -6.0095e+01 -5.3087e+01 -5.5761e+01 -5.9726e+01 -6.0094e+01 -5.3099e+01 -5.5732e+01 -5.9671e+01 -6.0092e+01 -5.3110e+01 -5.5704e+01 -5.9616e+01 -6.0090e+01 -5.3122e+01 -5.5676e+01 -5.9562e+01 -6.0087e+01 -5.3134e+01 -5.5648e+01 -5.9508e+01 -6.0077e+01 -5.3145e+01 -5.5621e+01 -5.9454e+01 -6.0065e+01 -5.3157e+01 -5.5593e+01 -5.9401e+01 -6.0054e+01 -5.3168e+01 -5.5566e+01 -5.9348e+01 -6.0042e+01 -5.3179e+01 -5.5539e+01 -5.9295e+01 -6.0030e+01 -5.3190e+01 -5.5511e+01 -5.9243e+01 -6.0018e+01 -5.3201e+01 -5.5476e+01 -5.9191e+01 -6.0006e+01 -5.3212e+01 -5.5442e+01 -5.9139e+01 -5.9993e+01 -5.3223e+01 -5.5408e+01 -5.9087e+01 -5.9976e+01 -5.3233e+01 -5.5375e+01 -5.9036e+01 -5.9955e+01 -5.3244e+01 -5.5341e+01 -5.8985e+01 -5.9934e+01 -5.3254e+01 -5.5308e+01 -5.8935e+01 -5.9913e+01 -5.3261e+01 -5.5276e+01 -5.8884e+01 -5.9892e+01 -5.3263e+01 -5.5244e+01 -5.8834e+01 -5.9871e+01 -5.3265e+01 -5.5212e+01 -5.8784e+01 -5.9850e+01 -5.3268e+01 -5.5180e+01 -5.8735e+01 -5.9829e+01 -5.3270e+01 -5.5145e+01 -5.8686e+01 -5.9808e+01 -5.3272e+01 -5.5106e+01 -5.8637e+01 -5.9787e+01 -5.3274e+01 -5.5067e+01 -5.8588e+01 -5.9766e+01 -5.3277e+01 -5.5029e+01 -5.8540e+01 -5.9745e+01 -5.3279e+01 -5.4992e+01 -5.8492e+01 -5.9724e+01 -5.3281e+01 -5.4955e+01 -5.8444e+01 -5.9702e+01 -5.3283e+01 -5.4918e+01 -5.8396e+01 -5.9681e+01 -5.3286e+01 -5.4882e+01 -5.8346e+01 -5.9660e+01 -5.3288e+01 -5.4847e+01 -5.8291e+01 -5.9639e+01 -5.3285e+01 -5.4812e+01 -5.8236e+01 -5.9617e+01 -5.3279e+01 -5.4777e+01 -5.8182e+01 -5.9596e+01 -5.3274e+01 -5.4742e+01 -5.8129e+01 -5.9574e+01 -5.3269e+01 -5.4708e+01 -5.8076e+01 -5.9553e+01 -5.3264e+01 -5.4675e+01 -5.8023e+01 -5.9531e+01 -5.3252e+01 -5.4642e+01 -5.7970e+01 -5.9509e+01 -5.3239e+01 -5.4609e+01 -5.7919e+01 -5.9488e+01 -5.3227e+01 -5.4577e+01 -5.7867e+01 -5.9466e+01 -5.3215e+01 -5.4545e+01 -5.7816e+01 -5.9444e+01 -5.3203e+01 -5.4513e+01 -5.7765e+01 -5.9422e+01 -5.3192e+01 -5.4482e+01 -5.7715e+01 -5.9400e+01 -5.3181e+01 -5.4451e+01 -5.7665e+01 -5.9378e+01 -5.3170e+01 -5.4420e+01 -5.7616e+01 -5.9356e+01 -5.3159e+01 -5.4390e+01 -5.7567e+01 -5.9334e+01 -5.3149e+01 -5.4360e+01 -5.7518e+01 -5.9312e+01 -5.3139e+01 -5.4330e+01 -5.7470e+01 -5.9289e+01 -5.3129e+01 -5.4301e+01 -5.7422e+01 -5.9267e+01 -5.3120e+01 -5.4272e+01 -5.7374e+01 -5.9245e+01 -5.3110e+01 -5.4243e+01 -5.7327e+01 -5.9222e+01 -5.3101e+01 -5.4214e+01 -5.7280e+01 -5.9200e+01 -5.3092e+01 -5.4186e+01 -5.7234e+01 -5.9177e+01 -5.3083e+01 -5.4158e+01 -5.7188e+01 -5.9155e+01 -5.3075e+01 -5.4131e+01 -5.7142e+01 -5.9132e+01 -5.3066e+01 -5.4104e+01 -5.7096e+01 -5.9109e+01 -5.3058e+01 -5.4077e+01 -5.7051e+01 -5.9086e+01 -5.3050e+01 -5.4050e+01 -5.7006e+01 -5.9064e+01 -5.3042e+01 -5.4023e+01 -5.6962e+01 -5.9041e+01 -5.3034e+01 -5.3997e+01 -5.6918e+01 -5.9018e+01 -5.3027e+01 -5.3971e+01 -5.6874e+01 -5.8995e+01 -5.3019e+01 -5.3945e+01 -5.6830e+01 -5.8971e+01 -5.3012e+01 -5.3920e+01 -5.6787e+01 -5.8948e+01 -5.3005e+01 -5.3894e+01 -5.6744e+01 -5.8925e+01 -5.2998e+01 -5.3869e+01 -5.6702e+01 -5.8902e+01 -5.2991e+01 -5.3845e+01 -5.6660e+01 -5.8878e+01 -5.2984e+01 -5.3820e+01 -5.6618e+01 -5.8855e+01 -5.2976e+01 -5.3795e+01 -5.6576e+01 -5.8831e+01 -5.2962e+01 -5.3760e+01 -5.6535e+01 -5.8808e+01 -5.2948e+01 -5.3720e+01 -5.6494e+01 -5.8784e+01 -5.2934e+01 -5.3681e+01 -5.6453e+01 -5.8760e+01 -5.2920e+01 -5.3644e+01 -5.6412e+01 -5.8737e+01 -5.2906e+01 -5.3651e+01 -5.6372e+01 -5.8713e+01 -5.2893e+01 -5.3657e+01 -5.6332e+01 -5.8689e+01 -5.2880e+01 -5.3664e+01 -5.6292e+01 -5.8665e+01 -5.2867e+01 -5.3669e+01 -5.6253e+01 -5.8641e+01 -5.2855e+01 -5.3667e+01 -5.6214e+01 -5.8617e+01 -5.2842e+01 -5.3666e+01 -5.6175e+01 -5.8593e+01 -5.2830e+01 -5.3664e+01 -5.6136e+01 -5.8569e+01 -5.2819e+01 -5.3663e+01 -5.6098e+01 -5.8538e+01 -5.2807e+01 -5.3655e+01 -5.6060e+01 -5.8506e+01 -5.2795e+01 -5.3645e+01 -5.6022e+01 -5.8474e+01 -5.2784e+01 -5.3637e+01 -5.5984e+01 -5.8442e+01 -5.2773e+01 -5.3628e+01 -5.5947e+01 -5.8410e+01 -5.2762e+01 -5.3620e+01 -5.5910e+01 -5.8379e+01 -5.2751e+01 -5.3601e+01 -5.5873e+01 -5.8348e+01 -5.2741e+01 -5.3578e+01 -5.5836e+01 -5.8316e+01 -5.2730e+01 -5.3555e+01 -5.5800e+01 -5.8285e+01 -5.2720e+01 -5.3532e+01 -5.5764e+01 -5.8254e+01 -5.2710e+01 -5.3510e+01 -5.5728e+01 -5.8223e+01 -5.2700e+01 -5.3481e+01 -5.5691e+01 -5.8193e+01 -5.2690e+01 -5.3452e+01 -5.5647e+01 -5.8162e+01 -5.2681e+01 -5.3424e+01 -5.5604e+01 -5.8132e+01 -5.2671e+01 -5.3397e+01 -5.5562e+01 -5.8101e+01 -5.2662e+01 -5.3370e+01 -5.5520e+01 -5.8071e+01 -5.2652e+01 -5.3344e+01 -5.5478e+01 -5.8041e+01 -5.2643e+01 -5.3319e+01 -5.5429e+01 -5.8011e+01 -5.2634e+01 -5.3294e+01 -5.5380e+01 -5.7981e+01 -5.2625e+01 -5.3270e+01 -5.5332e+01 -5.7951e+01 -5.2616e+01 -5.3246e+01 -5.5284e+01 -5.7921e+01 -5.2608e+01 -5.3223e+01 -5.5237e+01 -5.7891e+01 -5.2599e+01 -5.3200e+01 -5.5191e+01 -5.7862e+01 -5.2590e+01 -5.3178e+01 -5.5145e+01 -5.7874e+01 -5.2580e+01 -5.3150e+01 -5.5099e+01 -5.7889e+01 -5.2564e+01 -5.3121e+01 -5.5055e+01 -5.7900e+01 -5.2548e+01 -5.3093e+01 -5.5010e+01 -5.7905e+01 -5.2532e+01 -5.3064e+01 -5.4966e+01 -5.7951e+01 -5.2557e+01 -5.3029e+01 -5.4923e+01 -5.8000e+01 -5.2585e+01 -5.2996e+01 -5.4880e+01 -5.8048e+01 -5.2614e+01 -5.2962e+01 -5.4838e+01 -5.8094e+01 -5.2642e+01 -5.2930e+01 -5.4796e+01 -5.8140e+01 -5.2669e+01 -5.2899e+01 -5.4755e+01 -5.8185e+01 -5.2689e+01 -5.2868e+01 -5.4714e+01 -5.8229e+01 -5.2708e+01 -5.2838e+01 -5.4673e+01 -5.8272e+01 -5.2727e+01 -5.2808e+01 -5.4633e+01 -5.8314e+01 -5.2745e+01 -5.2780e+01 -5.4591e+01 -5.8355e+01 -5.2764e+01 -5.2749e+01 -5.4540e+01 -5.8395e+01 -5.2782e+01 -5.2714e+01 -5.4486e+01 -5.8455e+01 -5.2799e+01 -5.2680e+01 -5.4432e+01 -5.8537e+01 -5.2817e+01 -5.2646e+01 -5.4379e+01 -5.8618e+01 -5.2842e+01 -5.2613e+01 -5.4327e+01 -5.8698e+01 -5.2904e+01 -5.2581e+01 -5.4276e+01 -5.8775e+01 -5.2965e+01 -5.2550e+01 -5.4226e+01 -5.8852e+01 -5.3025e+01 -5.2519e+01 -5.4176e+01 -5.8927e+01 -5.3079e+01 -5.2490e+01 -5.4127e+01 -5.9000e+01 -5.3129e+01 -5.2460e+01 -5.4079e+01 -5.9072e+01 -5.3179e+01 -5.2432e+01 -5.4031e+01 -5.9142e+01 -5.3228e+01 -5.2404e+01 -5.3984e+01 -5.9211e+01 -5.3271e+01 -5.2377e+01 -5.3938e+01 -5.9279e+01 -5.3303e+01 -5.2351e+01 -5.3892e+01 -5.9345e+01 -5.3335e+01 -5.2325e+01 -5.3844e+01 -5.9410e+01 -5.3366e+01 -5.2300e+01 -5.3824e+01 -5.9473e+01 -5.3397e+01 -5.2272e+01 -5.3816e+01 -5.9535e+01 -5.3427e+01 -5.2240e+01 -5.3809e+01 -5.9596e+01 -5.3457e+01 -5.2209e+01 -5.3802e+01 -5.9655e+01 -5.3487e+01 -5.2178e+01 -5.3788e+01 -5.9713e+01 -5.3517e+01 -5.2148e+01 -5.3774e+01 -5.9770e+01 -5.3546e+01 -5.2119e+01 -5.3759e+01 -5.9818e+01 -5.3575e+01 -5.2091e+01 -5.3746e+01 -5.9864e+01 -5.3604e+01 -5.2063e+01 -5.3732e+01 -5.9910e+01 -5.3632e+01 -5.2036e+01 -5.3719e+01 -5.9954e+01 -5.3660e+01 -5.2010e+01 -5.3706e+01 -5.9997e+01 -5.3688e+01 -5.1984e+01 -5.3693e+01 -6.0039e+01 -5.3716e+01 -5.1954e+01 -5.3680e+01 -6.0080e+01 -5.3743e+01 -5.1921e+01 -5.3668e+01 -6.0120e+01 -5.3769e+01 -5.1889e+01 -5.3656e+01 -6.0159e+01 -5.3796e+01 -5.1858e+01 -5.3644e+01 -6.0197e+01 -5.3822e+01 -5.1828e+01 -5.3633e+01 -6.0234e+01 -5.3848e+01 -5.1799e+01 -5.3621e+01 -6.0270e+01 -5.3873e+01 -5.1770e+01 -5.3610e+01 -6.0305e+01 -5.3898e+01 -5.1742e+01 -5.3599e+01 -6.0339e+01 -5.3921e+01 -5.1714e+01 -5.3588e+01 -6.0373e+01 -5.3938e+01 -5.1682e+01 -5.3578e+01 -6.0405e+01 -5.3954e+01 -5.1648e+01 -5.3560e+01 -6.0436e+01 -5.3970e+01 -5.1615e+01 -5.3542e+01 -6.0467e+01 -5.3986e+01 -5.1582e+01 -5.3524e+01 -6.0496e+01 -5.4002e+01 -5.1546e+01 -5.3507e+01 -6.0525e+01 -5.4017e+01 -5.1507e+01 -5.3489e+01 -6.0552e+01 -5.4033e+01 -5.1469e+01 -5.3473e+01 -6.0579e+01 -5.4048e+01 -5.1432e+01 -5.3456e+01 -6.0605e+01 -5.4063e+01 -5.1396e+01 -5.3440e+01 -6.0630e+01 -5.4078e+01 -5.1361e+01 -5.3424e+01 -6.0655e+01 -5.4093e+01 -5.1327e+01 -5.3445e+01 -6.0678e+01 -5.4107e+01 -5.1293e+01 -5.3466e+01 -6.0701e+01 -5.4122e+01 -5.1254e+01 -5.3487e+01 -6.0723e+01 -5.4132e+01 -5.1214e+01 -5.3507e+01 -6.0744e+01 -5.4138e+01 -5.1175e+01 -5.3528e+01 -6.0764e+01 -5.4144e+01 -5.1137e+01 -5.3548e+01 -6.0783e+01 -5.4150e+01 -5.1101e+01 -5.3568e+01 -6.0802e+01 -5.4156e+01 -5.1064e+01 -5.3587e+01 -6.0820e+01 -5.4162e+01 -5.1029e+01 -5.3607e+01 -6.0837e+01 -5.4168e+01 -5.0995e+01 -5.3626e+01 -6.0847e+01 -5.4173e+01 -5.0962e+01 -5.3645e+01 -6.0855e+01 -5.4179e+01 -5.0929e+01 -5.3664e+01 -6.0862e+01 -5.4185e+01 -5.0897e+01 -5.3682e+01 -6.0868e+01 -5.4191e+01 -5.0866e+01 -5.3698e+01 -6.0875e+01 -5.4196e+01 -5.0836e+01 -5.3708e+01 -6.0880e+01 -5.4202e+01 -5.0806e+01 -5.3718e+01 -6.0885e+01 -5.4207e+01 -5.0778e+01 -5.3728e+01 -6.0890e+01 -5.4212e+01 -5.0750e+01 -5.3738e+01 -6.0894e+01 -5.4209e+01 -5.0722e+01 -5.3748e+01 -6.0897e+01 -5.4206e+01 -5.0696e+01 -5.3758e+01 -6.0900e+01 -5.4196e+01 -5.0670e+01 -5.3767e+01 -6.0902e+01 -5.4186e+01 -5.0644e+01 -5.3777e+01 -6.0896e+01 -5.4221e+01 -5.0620e+01 -5.3787e+01 -6.0890e+01 -5.4255e+01 -5.0596e+01 -5.3796e+01 -6.0883e+01 -5.4289e+01 -5.0572e+01 -5.3806e+01 -6.0877e+01 -5.4323e+01 -5.0549e+01 -5.3815e+01 -6.0869e+01 -5.4356e+01 -5.0527e+01 -5.3824e+01 -6.0862e+01 -5.4389e+01 -5.0505e+01 -5.3833e+01 -6.0854e+01 -5.4421e+01 -5.0484e+01 -5.3842e+01 -6.0846e+01 -5.4453e+01 -5.0463e+01 -5.3851e+01 -6.0838e+01 -5.4477e+01 -5.0443e+01 -5.3860e+01 -6.0829e+01 -5.4500e+01 -5.0423e+01 -5.3868e+01 -6.0820e+01 -5.4523e+01 -5.0404e+01 -5.3877e+01 -6.0811e+01 -5.4546e+01 -5.0386e+01 -5.3885e+01 -6.0802e+01 -5.4569e+01 -5.0368e+01 -5.3893e+01 -6.0792e+01 -5.4591e+01 -5.0350e+01 -5.3901e+01 -6.0782e+01 -5.4613e+01 -5.0333e+01 -5.3909e+01 -6.0772e+01 -5.4635e+01 -5.0316e+01 -5.3917e+01 -6.0761e+01 -5.4657e+01 -5.0300e+01 -5.3925e+01 -6.0750e+01 -5.4678e+01 -5.0284e+01 -5.3932e+01 -6.0739e+01 -5.4699e+01 -5.0268e+01 -5.3939e+01 -6.0728e+01 -5.4720e+01 -5.0253e+01 -5.3947e+01 -6.0716e+01 -5.4741e+01 -5.0238e+01 -5.3954e+01 -6.0704e+01 -5.4761e+01 -5.0224e+01 -5.3960e+01 -6.0692e+01 -5.4781e+01 -5.0210e+01 -5.3967e+01 -6.0679e+01 -5.4801e+01 -5.0196e+01 -5.3974e+01 -6.0667e+01 -5.4820e+01 -5.0183e+01 -5.3980e+01 -6.0654e+01 -5.4839e+01 -5.0170e+01 -5.3986e+01 -6.0640e+01 -5.4858e+01 -5.0157e+01 -5.3992e+01 -6.0627e+01 -5.4877e+01 -5.0145e+01 -5.3998e+01 -6.0613e+01 -5.4895e+01 -5.0133e+01 -5.4004e+01 -6.0599e+01 -5.4913e+01 -5.0122e+01 -5.4009e+01 -6.0585e+01 -5.4931e+01 -5.0110e+01 -5.4015e+01 -6.0570e+01 -5.4948e+01 -5.0099e+01 -5.4020e+01 -6.0547e+01 -5.4966e+01 -5.0089e+01 -5.4019e+01 -6.0524e+01 -5.4982e+01 -5.0078e+01 -5.4016e+01 -6.0501e+01 -5.4999e+01 -5.0068e+01 -5.4013e+01 -6.0471e+01 -5.5015e+01 -5.0058e+01 -5.4010e+01 -6.0440e+01 -5.5031e+01 -5.0043e+01 -5.4007e+01 -6.0409e+01 -5.5047e+01 -5.0066e+01 -5.4004e+01 -6.0379e+01 -5.5062e+01 -5.0093e+01 -5.4001e+01 -6.0348e+01 -5.5077e+01 -5.0120e+01 -5.3998e+01 -6.0318e+01 -5.5092e+01 -5.0143e+01 -5.3995e+01 -6.0288e+01 -5.5106e+01 -5.0162e+01 -5.3992e+01 -6.0258e+01 -5.5128e+01 -5.0181e+01 -5.3989e+01 -6.0228e+01 -5.5187e+01 -5.0199e+01 -5.3986e+01 -6.0198e+01 -5.5244e+01 -5.0218e+01 -5.3983e+01 -6.0169e+01 -5.5298e+01 -5.0236e+01 -5.3980e+01 -6.0139e+01 -5.5346e+01 -5.0250e+01 -5.3977e+01 -6.0110e+01 -5.5393e+01 -5.0261e+01 -5.3974e+01 -6.0080e+01 -5.5438e+01 -5.0271e+01 -5.3971e+01 -6.0051e+01 -5.5484e+01 -5.0282e+01 -5.3968e+01 -6.0022e+01 -5.5528e+01 -5.0293e+01 -5.3965e+01 -6.0027e+01 -5.5572e+01 -5.0304e+01 -5.3962e+01 -6.0042e+01 -5.5615e+01 -5.0315e+01 -5.3958e+01 -6.0056e+01 -5.5657e+01 -5.0326e+01 -5.3955e+01 -6.0070e+01 -5.5699e+01 -5.0337e+01 -5.3952e+01 -6.0083e+01 -5.5739e+01 -5.0348e+01 -5.3986e+01 -6.0096e+01 -5.5780e+01 -5.0359e+01 -5.4027e+01 -6.0108e+01 -5.5819e+01 -5.0371e+01 -5.4060e+01 -6.0120e+01 -5.5858e+01 -5.0382e+01 -5.4092e+01 -6.0131e+01 -5.5896e+01 -5.0393e+01 -5.4123e+01 -6.0141e+01 -5.5933e+01 -5.0405e+01 -5.4153e+01 -6.0151e+01 -5.5969e+01 -5.0433e+01 -5.4183e+01 -6.0161e+01 -5.6005e+01 -5.0489e+01 -5.4212e+01 -6.0169e+01 -5.6040e+01 -5.0544e+01 -5.4244e+01 -6.0170e+01 -5.6075e+01 -5.0599e+01 -5.4309e+01 -6.0170e+01 -5.6109e+01 -5.0653e+01 -5.4373e+01 -6.0170e+01 -5.6142e+01 -5.0706e+01 -5.4429e+01 -6.0169e+01 -5.6174e+01 -5.0759e+01 -5.4484e+01 -6.0168e+01 -5.6206e+01 -5.0811e+01 -5.4538e+01 -6.0166e+01 -5.6237e+01 -5.0862e+01 -5.4590e+01 -6.0165e+01 -5.6268e+01 -5.0913e+01 -5.4643e+01 -6.0163e+01 -5.6298e+01 -5.0963e+01 -5.4694e+01 -6.0160e+01 -5.6327e+01 -5.1012e+01 -5.4745e+01 -6.0157e+01 -5.6355e+01 -5.1061e+01 -5.4795e+01 -6.0154e+01 -5.6383e+01 -5.1109e+01 -5.4844e+01 -6.0151e+01 -5.6411e+01 -5.1157e+01 -5.4892e+01 -6.0147e+01 -5.6437e+01 -5.1204e+01 -5.4940e+01 -6.0143e+01 -5.6463e+01 -5.1250e+01 -5.4987e+01 -6.0139e+01 -5.6489e+01 -5.1296e+01 -5.5033e+01 -6.0134e+01 -5.6514e+01 -5.1341e+01 -5.5079e+01 -6.0129e+01 -5.6538e+01 -5.1385e+01 -5.5124e+01 -6.0124e+01 -5.6562e+01 -5.1429e+01 -5.5168e+01 -6.0118e+01 -5.6585e+01 -5.1472e+01 -5.5211e+01 -6.0112e+01 -5.6607e+01 -5.1515e+01 -5.5254e+01 -6.0106e+01 -5.6629e+01 -5.1557e+01 -5.5296e+01 -6.0100e+01 -5.6650e+01 -5.1598e+01 -5.5362e+01 -6.0093e+01 -5.6671e+01 -5.1639e+01 -5.5439e+01 -6.0085e+01 -5.6691e+01 -5.1680e+01 -5.5515e+01 -6.0078e+01 -5.6723e+01 -5.1719e+01 -5.5589e+01 -6.0070e+01 -5.6787e+01 -5.1759e+01 -5.5663e+01 -6.0062e+01 -5.6849e+01 -5.1797e+01 -5.5735e+01 -6.0054e+01 -5.6910e+01 -5.1835e+01 -5.5805e+01 -6.0045e+01 -5.6969e+01 -5.1873e+01 -5.5864e+01 -6.0036e+01 -5.7020e+01 -5.1909e+01 -5.5917e+01 -6.0027e+01 -5.7069e+01 -5.1946e+01 -5.5969e+01 -6.0017e+01 -5.7118e+01 -5.1982e+01 -5.6021e+01 -6.0032e+01 -5.7166e+01 -5.2017e+01 -5.6072e+01 -6.0066e+01 -5.7213e+01 -5.2052e+01 -5.6123e+01 -6.0100e+01 -5.7259e+01 -5.2086e+01 -5.6172e+01 -6.0132e+01 -5.7304e+01 -5.2119e+01 -5.6221e+01 -6.0163e+01 -5.7348e+01 -5.2152e+01 -5.6270e+01 -6.0194e+01 -5.7391e+01 -5.2185e+01 -5.6317e+01 -6.0223e+01 -5.7433e+01 -5.2217e+01 -5.6356e+01 -6.0245e+01 -5.7475e+01 -5.2248e+01 -5.6391e+01 -6.0265e+01 -5.7515e+01 -5.2279e+01 -5.6420e+01 -6.0285e+01 -5.7555e+01 -5.2310e+01 -5.6450e+01 -6.0303e+01 -5.7594e+01 -5.2340e+01 -5.6479e+01 -6.0321e+01 -5.7632e+01 -5.2369e+01 -5.6508e+01 -6.0338e+01 -5.7669e+01 -5.2398e+01 -5.6537e+01 -6.0355e+01 -5.7705e+01 -5.2427e+01 -5.6565e+01 -6.0371e+01 -5.7740e+01 -5.2455e+01 -5.6593e+01 -6.0386e+01 -5.7775e+01 -5.2482e+01 -5.6620e+01 -6.0401e+01 -5.7809e+01 -5.2509e+01 -5.6647e+01 -6.0415e+01 -5.7841e+01 -5.2535e+01 -5.6674e+01 -6.0429e+01 -5.7874e+01 -5.2561e+01 -5.6700e+01 -6.0441e+01 -5.7905e+01 -5.2587e+01 -5.6757e+01 -6.0454e+01 -5.7935e+01 -5.2612e+01 -5.6818e+01 -6.0465e+01 -5.7965e+01 -5.2637e+01 -5.6879e+01 -6.0476e+01 -5.7994e+01 -5.2661e+01 -5.6940e+01 -6.0487e+01 -5.8022e+01 -5.2684e+01 -5.6999e+01 -6.0496e+01 -5.8050e+01 -5.2708e+01 -5.7058e+01 -6.0505e+01 -5.8076e+01 -5.2730e+01 -5.7115e+01 -6.0514e+01 -5.8102e+01 -5.2753e+01 -5.7172e+01 -6.0522e+01 -5.8127e+01 -5.2775e+01 -5.7228e+01 -6.0530e+01 -5.8152e+01 -5.2796e+01 -5.7283e+01 -6.0537e+01 -5.8176e+01 -5.2817e+01 -5.7337e+01 -6.0543e+01 -5.8199e+01 -5.2838e+01 -5.7391e+01 -6.0549e+01 -5.8214e+01 -5.2858e+01 -5.7444e+01 -6.0554e+01 -5.8228e+01 -5.2877e+01 -5.7495e+01 -6.0559e+01 -5.8241e+01 -5.2897e+01 -5.7546e+01 -6.0563e+01 -5.8254e+01 -5.2916e+01 -5.7596e+01 -6.0562e+01 -5.8266e+01 -5.2934e+01 -5.7646e+01 -6.0557e+01 -5.8278e+01 -5.2952e+01 -5.7694e+01 -6.0552e+01 -5.8290e+01 -5.2970e+01 -5.7742e+01 -6.0547e+01 -5.8301e+01 -5.2987e+01 -5.7789e+01 -6.0541e+01 -5.8306e+01 -5.3004e+01 -5.7835e+01 -6.0535e+01 -5.8308e+01 -5.3021e+01 -5.7880e+01 -6.0528e+01 -5.8310e+01 -5.3037e+01 -5.7925e+01 -6.0522e+01 -5.8311e+01 -5.3052e+01 -5.7968e+01 -6.0515e+01 -5.8313e+01 -5.3068e+01 -5.8011e+01 -6.0507e+01 -5.8314e+01 -5.3083e+01 -5.8053e+01 -6.0500e+01 -5.8314e+01 -5.3097e+01 -5.8094e+01 -6.0492e+01 -5.8315e+01 -5.3111e+01 -5.8135e+01 -6.0484e+01 -5.8315e+01 -5.3125e+01 -5.8175e+01 -6.0475e+01 -5.8315e+01 -5.3139e+01 -5.8214e+01 -6.0466e+01 -5.8314e+01 -5.3152e+01 -5.8252e+01 -6.0457e+01 -5.8314e+01 -5.3165e+01 -5.8289e+01 -6.0448e+01 -5.8313e+01 -5.3177e+01 -5.8326e+01 -6.0438e+01 -5.8312e+01 -5.3189e+01 -5.8362e+01 -6.0428e+01 -5.8310e+01 -5.3201e+01 -5.8419e+01 -6.0440e+01 -5.8308e+01 -5.3212e+01 -5.8498e+01 -6.0474e+01 -5.8306e+01 -5.3224e+01 -5.8575e+01 -6.0506e+01 -5.8304e+01 -5.3234e+01 -5.8651e+01 -6.0538e+01 -5.8302e+01 -5.3243e+01 -5.8726e+01 -6.0566e+01 -5.8299e+01 -5.3246e+01 -5.8799e+01 -6.0588e+01 -5.8296e+01 -5.3248e+01 -5.8871e+01 -6.0604e+01 -5.8292e+01 -5.3249e+01 -5.8941e+01 -6.0616e+01 -5.8289e+01 -5.3251e+01 -5.9010e+01 -6.0629e+01 -5.8285e+01 -5.3253e+01 -5.9078e+01 -6.0640e+01 -5.8281e+01 -5.3254e+01 -5.9144e+01 -6.0652e+01 -5.8276e+01 -5.3256e+01 -5.9210e+01 -6.0663e+01 -5.8272e+01 -5.3257e+01 -5.9273e+01 -6.0673e+01 -5.8267e+01 -5.3258e+01 -5.9336e+01 -6.0683e+01 -5.8262e+01 -5.3259e+01 -5.9397e+01 -6.0692e+01 -5.8256e+01 -5.3260e+01 -5.9458e+01 -6.0701e+01 -5.8250e+01 -5.3261e+01 -5.9516e+01 -6.0709e+01 -5.8245e+01 -5.3261e+01 -5.9574e+01 -6.0717e+01 -5.8238e+01 -5.3262e+01 -5.9631e+01 -6.0756e+01 -5.8232e+01 -5.3262e+01 -5.9685e+01 -6.0807e+01 -5.8225e+01 -5.3262e+01 -5.9731e+01 -6.0857e+01 -5.8218e+01 -5.3262e+01 -5.9776e+01 -6.0906e+01 -5.8211e+01 -5.3262e+01 -5.9820e+01 -6.0953e+01 -5.8204e+01 -5.3262e+01 -5.9864e+01 -6.1000e+01 -5.8190e+01 -5.3262e+01 -5.9906e+01 -6.1045e+01 -5.8167e+01 -5.3261e+01 -5.9943e+01 -6.1090e+01 -5.8143e+01 -5.3261e+01 -5.9975e+01 -6.1133e+01 -5.8120e+01 -5.3260e+01 -6.0007e+01 -6.1175e+01 -5.8094e+01 -5.3259e+01 -6.0038e+01 -6.1216e+01 -5.8063e+01 -5.3259e+01 -6.0060e+01 -6.1257e+01 -5.8032e+01 -5.3258e+01 -6.0082e+01 -6.1296e+01 -5.8001e+01 -5.3256e+01 -6.0103e+01 -6.1334e+01 -5.7971e+01 -5.3255e+01 -6.0124e+01 -6.1371e+01 -5.7942e+01 -5.3254e+01 -6.0142e+01 -6.1407e+01 -5.7912e+01 -5.3252e+01 -6.0153e+01 -6.1440e+01 -5.7883e+01 -5.3251e+01 -6.0164e+01 -6.1466e+01 -5.7854e+01 -5.3249e+01 -6.0175e+01 -6.1510e+01 -5.7825e+01 -5.3247e+01 -6.0186e+01 -6.1579e+01 -5.7797e+01 -5.3245e+01 -6.0192e+01 -6.1647e+01 -5.7769e+01 -5.3243e+01 -6.0194e+01 -6.1713e+01 -5.7741e+01 -5.3240e+01 -6.0196e+01 -6.1774e+01 -5.7713e+01 -5.3234e+01 -6.0197e+01 -6.1829e+01 -5.7686e+01 -5.3224e+01 -6.0199e+01 -6.1883e+01 -5.7655e+01 -5.3214e+01 -6.0200e+01 -6.1936e+01 -5.7620e+01 -5.3203e+01 -6.0202e+01 -6.1988e+01 -5.7585e+01 -5.3193e+01 -6.0203e+01 -6.2039e+01 -5.7551e+01 -5.3183e+01 -6.0204e+01 -6.2088e+01 -5.7518e+01 -5.3173e+01 -6.0204e+01 -6.2137e+01 -5.7484e+01 -5.3163e+01 -6.0205e+01 -6.2184e+01 -5.7451e+01 -5.3153e+01 -6.0205e+01 -6.2230e+01 -5.7419e+01 -5.3143e+01 -6.0205e+01 -6.2275e+01 -5.7386e+01 -5.3134e+01 -6.0205e+01 -6.2319e+01 -5.7354e+01 -5.3124e+01 -6.0205e+01 -6.2362e+01 -5.7323e+01 -5.3114e+01 -6.0204e+01 -6.2404e+01 -5.7292e+01 -5.3105e+01 -6.0203e+01 -6.2445e+01 -5.7261e+01 -5.3095e+01 -6.0203e+01 -6.2485e+01 -5.7230e+01 -5.3086e+01 -6.0194e+01 -6.2523e+01 -5.7199e+01 -5.3076e+01 -6.0184e+01 -6.2561e+01 -5.7169e+01 -5.3067e+01 -6.0175e+01 -6.2597e+01 -5.7140e+01 -5.3057e+01 -6.0166e+01 -6.2633e+01 -5.7110e+01 -5.3048e+01 -6.0157e+01 -6.2667e+01 -5.7081e+01 -5.3038e+01 -6.0140e+01 -6.2701e+01 -5.7052e+01 -5.3029e+01 -6.0122e+01 -6.2734e+01 -5.7023e+01 -5.3020e+01 -6.0105e+01 -6.2765e+01 -5.6994e+01 -5.3010e+01 -6.0088e+01 -6.2796e+01 -5.6966e+01 -5.3001e+01 -6.0071e+01 -6.2825e+01 -5.6938e+01 -5.2992e+01 -6.0054e+01 -6.2854e+01 -5.6910e+01 -5.2977e+01 -6.0038e+01 -6.2882e+01 -5.6883e+01 -5.2960e+01 -6.0021e+01 -6.2909e+01 -5.6855e+01 -5.2943e+01 -6.0005e+01 -6.2934e+01 -5.6828e+01 -5.2927e+01 -5.9988e+01 -6.2959e+01 -5.6801e+01 -5.2910e+01 -5.9972e+01 -6.2983e+01 -5.6774e+01 -5.2894e+01 -5.9955e+01 -6.3007e+01 -5.6748e+01 -5.2878e+01 -5.9939e+01 -6.3029e+01 -5.6721e+01 -5.2862e+01 -5.9923e+01 -6.3050e+01 -5.6695e+01 -5.2847e+01 -5.9906e+01 -6.3071e+01 -5.6669e+01 -5.2831e+01 -5.9886e+01 -6.3090e+01 -5.6636e+01 -5.2816e+01 -5.9862e+01 -6.3109e+01 -5.6603e+01 -5.2801e+01 -5.9838e+01 -6.3127e+01 -5.6569e+01 -5.2786e+01 -5.9814e+01 -6.3144e+01 -5.6530e+01 -5.2771e+01 -5.9791e+01 -6.3154e+01 -5.6490e+01 -5.2756e+01 -5.9767e+01 -6.3162e+01 -5.6462e+01 -5.2742e+01 -5.9744e+01 -6.3169e+01 -5.6460e+01 -5.2728e+01 -5.9721e+01 -6.3175e+01 -5.6457e+01 -5.2713e+01 -5.9698e+01 -6.3181e+01 -5.6454e+01 -5.2699e+01 -5.9676e+01 -6.3186e+01 -5.6451e+01 -5.2686e+01 -5.9653e+01 -6.3191e+01 -5.6449e+01 -5.2672e+01 -5.9631e+01 -6.3195e+01 -5.6446e+01 -5.2658e+01 -5.9608e+01 -6.3198e+01 -5.6443e+01 -5.2645e+01 -5.9586e+01 -6.3218e+01 -5.6441e+01 -5.2631e+01 -5.9564e+01 -6.3265e+01 -5.6438e+01 -5.2618e+01 -5.9542e+01 -6.3310e+01 -5.6435e+01 -5.2605e+01 -5.9520e+01 -6.3354e+01 -5.6432e+01 -5.2592e+01 -5.9499e+01 -6.3398e+01 -5.6430e+01 -5.2579e+01 -5.9477e+01 -6.3439e+01 -5.6427e+01 -5.2564e+01 -5.9455e+01 -6.3480e+01 -5.6424e+01 -5.2544e+01 -5.9434e+01 -6.3520e+01 -5.6421e+01 -5.2523e+01 -5.9413e+01 -6.3558e+01 -5.6418e+01 -5.2503e+01 -5.9391e+01 -6.3595e+01 -5.6415e+01 -5.2483e+01 -5.9370e+01 -6.3631e+01 -5.6412e+01 -5.2464e+01 -5.9349e+01 -6.3666e+01 -5.6409e+01 -5.2445e+01 -5.9327e+01 -6.3700e+01 -5.6406e+01 -5.2421e+01 -5.9306e+01 -6.3733e+01 -5.6403e+01 -5.2394e+01 -5.9285e+01 -6.3764e+01 -5.6399e+01 -5.2368e+01 -5.9264e+01 -6.3795e+01 -5.6396e+01 -5.2342e+01 -5.9243e+01 -6.3824e+01 -5.6393e+01 -5.2317e+01 -5.9222e+01 -6.3853e+01 -5.6389e+01 -5.2292e+01 -5.9201e+01 -6.3880e+01 -5.6385e+01 -5.2268e+01 -5.9180e+01 -6.3907e+01 -5.6382e+01 -5.2244e+01 -5.9159e+01 -6.3932e+01 -5.6378e+01 -5.2220e+01 -5.9138e+01 -6.3956e+01 -5.6374e+01 -5.2197e+01 -5.9117e+01 -6.3980e+01 -5.6370e+01 -5.2174e+01 -5.9096e+01 -6.4002e+01 -5.6366e+01 -5.2162e+01 -5.9075e+01 -6.4024e+01 -5.6362e+01 -5.2185e+01 -5.9055e+01 -6.4044e+01 -5.6357e+01 -5.2207e+01 -5.9034e+01 -6.4064e+01 -5.6345e+01 -5.2229e+01 -5.9013e+01 -6.4082e+01 -5.6333e+01 -5.2250e+01 -5.8992e+01 -6.4100e+01 -5.6320e+01 -5.2271e+01 -5.8971e+01 -6.4117e+01 -5.6308e+01 -5.2292e+01 -5.8950e+01 -6.4133e+01 -5.6296e+01 -5.2312e+01 -5.8929e+01 -6.4148e+01 -5.6284e+01 -5.2333e+01 -5.8908e+01 -6.4162e+01 -5.6272e+01 -5.2353e+01 -5.8890e+01 -6.4170e+01 -5.6260e+01 -5.2372e+01 -5.8906e+01 -6.4175e+01 -5.6248e+01 -5.2384e+01 -5.8921e+01 -6.4179e+01 -5.6236e+01 -5.2395e+01 -5.8936e+01 -6.4182e+01 -5.6225e+01 -5.2406e+01 -5.8950e+01 -6.4184e+01 -5.6209e+01 -5.2417e+01 -5.8963e+01 -6.4186e+01 -5.6189e+01 -5.2463e+01 -5.8976e+01 -6.4187e+01 -5.6170e+01 -5.2518e+01 -5.8989e+01 -6.4188e+01 -5.6151e+01 -5.2572e+01 -5.9001e+01 -6.4188e+01 -5.6132e+01 -5.2626e+01 -5.9013e+01 -6.4187e+01 -5.6113e+01 -5.2678e+01 -5.9024e+01 -6.4186e+01 -5.6095e+01 -5.2730e+01 -5.9035e+01 -6.4185e+01 -5.6076e+01 -5.2781e+01 -5.9046e+01 -6.4182e+01 -5.6058e+01 -5.2831e+01 -5.9055e+01 -6.4179e+01 -5.6040e+01 -5.2880e+01 -5.9065e+01 -6.4176e+01 -5.6022e+01 -5.2929e+01 -5.9074e+01 -6.4172e+01 -5.6004e+01 -5.2977e+01 -5.9082e+01 -6.4167e+01 -5.5987e+01 -5.3024e+01 -5.9090e+01 -6.4162e+01 -5.5969e+01 -5.3070e+01 -5.9098e+01 -6.4156e+01 -5.5952e+01 -5.3108e+01 -5.9105e+01 -6.4150e+01 -5.5935e+01 -5.3145e+01 -5.9112e+01 -6.4143e+01 -5.5918e+01 -5.3182e+01 -5.9118e+01 -6.4135e+01 -5.5898e+01 -5.3218e+01 -5.9124e+01 -6.4127e+01 -5.5873e+01 -5.3253e+01 -5.9129e+01 -6.4119e+01 -5.5849e+01 -5.3289e+01 -5.9134e+01 -6.4110e+01 -5.5825e+01 -5.3323e+01 -5.9139e+01 -6.4100e+01 -5.5801e+01 -5.3357e+01 -5.9143e+01 -6.4085e+01 -5.5778e+01 -5.3391e+01 -5.9147e+01 -6.4066e+01 -5.5754e+01 -5.3424e+01 -5.9150e+01 -6.4048e+01 -5.5731e+01 -5.3456e+01 -5.9153e+01 -6.4029e+01 -5.5709e+01 -5.3489e+01 -5.9155e+01 -6.4009e+01 -5.5686e+01 -5.3520e+01 -5.9157e+01 -6.3990e+01 -5.5664e+01 -5.3551e+01 -5.9159e+01 -6.3970e+01 -5.5642e+01 -5.3582e+01 -5.9160e+01 -6.3950e+01 -5.5620e+01 -5.3612e+01 -5.9161e+01 -6.3930e+01 -5.5599e+01 -5.3641e+01 -5.9161e+01 -6.3909e+01 -5.5578e+01 -5.3670e+01 -5.9161e+01 -6.3888e+01 -5.5549e+01 -5.3699e+01 -5.9161e+01 -6.3880e+01 -5.5520e+01 -5.3727e+01 -5.9160e+01 -6.3903e+01 -5.5492e+01 -5.3754e+01 -5.9159e+01 -6.3925e+01 -5.5464e+01 -5.3781e+01 -5.9158e+01 -6.3946e+01 -5.5436e+01 -5.3808e+01 -5.9156e+01 -6.3966e+01 -5.5409e+01 -5.3834e+01 -5.9154e+01 -6.3985e+01 -5.5382e+01 -5.3860e+01 -5.9151e+01 -6.4004e+01 -5.5356e+01 -5.3885e+01 -5.9148e+01 -6.4021e+01 -5.5330e+01 -5.3910e+01 -5.9145e+01 -6.4038e+01 -5.5304e+01 -5.3934e+01 -5.9141e+01 -6.4053e+01 -5.5279e+01 -5.3957e+01 -5.9137e+01 -6.4068e+01 -5.5253e+01 -5.3981e+01 -5.9133e+01 -6.4082e+01 -5.5228e+01 -5.4004e+01 -5.9128e+01 -6.4095e+01 -5.5204e+01 -5.4026e+01 -5.9123e+01 -6.4108e+01 -5.5180e+01 -5.4048e+01 -5.9117e+01 -6.4119e+01 -5.5155e+01 -5.4069e+01 -5.9112e+01 -6.4130e+01 -5.5132e+01 -5.4090e+01 -5.9106e+01 -6.4140e+01 -5.5108e+01 -5.4111e+01 -5.9099e+01 -6.4149e+01 -5.5085e+01 -5.4131e+01 -5.9092e+01 -6.4157e+01 -5.5062e+01 -5.4151e+01 -5.9085e+01 -6.4165e+01 -5.5039e+01 -5.4170e+01 -5.9078e+01 -6.4171e+01 -5.5017e+01 -5.4189e+01 -5.9070e+01 -6.4177e+01 -5.4994e+01 -5.4207e+01 -5.9062e+01 -6.4191e+01 -5.4972e+01 -5.4225e+01 -5.9054e+01 -6.4240e+01 -5.4950e+01 -5.4243e+01 -5.9045e+01 -6.4288e+01 -5.4929e+01 -5.4260e+01 -5.9037e+01 -6.4334e+01 -5.4907e+01 -5.4277e+01 -5.9027e+01 -6.4379e+01 -5.4886e+01 -5.4291e+01 -5.9018e+01 -6.4423e+01 -5.4865e+01 -5.4299e+01 -5.9008e+01 -6.4465e+01 -5.4844e+01 -5.4307e+01 -5.8998e+01 -6.4506e+01 -5.4824e+01 -5.4315e+01 -5.8988e+01 -6.4546e+01 -5.4803e+01 -5.4322e+01 -5.8977e+01 -6.4584e+01 -5.4783e+01 -5.4329e+01 -5.8966e+01 -6.4621e+01 -5.4763e+01 -5.4336e+01 -5.8955e+01 -6.4657e+01 -5.4743e+01 -5.4343e+01 -5.8944e+01 -6.4691e+01 -5.4716e+01 -5.4349e+01 -5.8932e+01 -6.4725e+01 -5.4688e+01 -5.4355e+01 -5.8920e+01 -6.4757e+01 -5.4661e+01 -5.4361e+01 -5.8908e+01 -6.4784e+01 -5.4634e+01 -5.4360e+01 -5.8895e+01 -6.4806e+01 -5.4608e+01 -5.4357e+01 -5.8882e+01 -6.4827e+01 -5.4582e+01 -5.4355e+01 -5.8869e+01 -6.4847e+01 -5.4556e+01 -5.4353e+01 -5.8856e+01 -6.4866e+01 -5.4530e+01 -5.4351e+01 -5.8843e+01 -6.4884e+01 -5.4505e+01 -5.4349e+01 -5.8829e+01 -6.4901e+01 -5.4480e+01 -5.4346e+01 -5.8815e+01 -6.4917e+01 -5.4456e+01 -5.4344e+01 -5.8801e+01 -6.4933e+01 -5.4431e+01 -5.4342e+01 -5.8786e+01 -6.4947e+01 -5.4407e+01 -5.4339e+01 -5.8772e+01 -6.4961e+01 -5.4383e+01 -5.4337e+01 -5.8757e+01 -6.4974e+01 -5.4360e+01 -5.4334e+01 -5.8742e+01 -6.4985e+01 -5.4336e+01 -5.4332e+01 -5.8727e+01 -6.4996e+01 -5.4313e+01 -5.4329e+01 -5.8711e+01 -6.5007e+01 -5.4291e+01 -5.4326e+01 -5.8690e+01 -6.5016e+01 -5.4268e+01 -5.4324e+01 -5.8666e+01 -6.5023e+01 -5.4246e+01 -5.4321e+01 -5.8642e+01 -6.5023e+01 -5.4224e+01 -5.4318e+01 -5.8618e+01 -6.5022e+01 -5.4202e+01 -5.4310e+01 -5.8594e+01 -6.5020e+01 -5.4173e+01 -5.4299e+01 -5.8571e+01 -6.5018e+01 -5.4187e+01 -5.4289e+01 -5.8547e+01 -6.5015e+01 -5.4202e+01 -5.4278e+01 -5.8523e+01 -6.5012e+01 -5.4217e+01 -5.4268e+01 -5.8499e+01 -6.5008e+01 -5.4232e+01 -5.4257e+01 -5.8475e+01 -6.5004e+01 -5.4246e+01 -5.4247e+01 -5.8451e+01 -6.4999e+01 -5.4260e+01 -5.4237e+01 -5.8427e+01 -6.4986e+01 -5.4274e+01 -5.4219e+01 -5.8404e+01 -6.4973e+01 -5.4287e+01 -5.4224e+01 -5.8380e+01 -6.4955e+01 -5.4301e+01 -5.4251e+01 -5.8356e+01 -6.4932e+01 -5.4313e+01 -5.4277e+01 -5.8332e+01 -6.4910e+01 -5.4326e+01 -5.4303e+01 -5.8308e+01 -6.4887e+01 -5.4339e+01 -5.4329e+01 -5.8284e+01 -6.4864e+01 -5.4351e+01 -5.4354e+01 -5.8254e+01 -6.4840e+01 -5.4356e+01 -5.4379e+01 -5.8222e+01 -6.4817e+01 -5.4359e+01 -5.4403e+01 -5.8190e+01 -6.4794e+01 -5.4363e+01 -5.4427e+01 -5.8159e+01 -6.4770e+01 -5.4367e+01 -5.4451e+01 -5.8119e+01 -6.4746e+01 -5.4370e+01 -5.4472e+01 -5.8072e+01 -6.4722e+01 -5.4374e+01 -5.4487e+01 -5.8025e+01 -6.4698e+01 -5.4400e+01 -5.4501e+01 -5.7979e+01 -6.4673e+01 -5.4447e+01 -5.4516e+01 -5.7934e+01 -6.4649e+01 -5.4494e+01 -5.4530e+01 -5.7889e+01 -6.4624e+01 -5.4540e+01 -5.4544e+01 -5.7845e+01 -6.4599e+01 -5.4585e+01 -5.4558e+01 -5.7801e+01 -6.4574e+01 -5.4622e+01 -5.4572e+01 -5.7749e+01 -6.4549e+01 -5.4658e+01 -5.4586e+01 -5.7699e+01 -6.4523e+01 -5.4694e+01 -5.4599e+01 -5.7648e+01 -6.4497e+01 -5.4729e+01 -5.4612e+01 -5.7599e+01 -6.4472e+01 -5.4763e+01 -5.4625e+01 -5.7550e+01 -6.4446e+01 -5.4797e+01 -5.4637e+01 -5.7502e+01 -6.4419e+01 -5.4830e+01 -5.4648e+01 -5.7455e+01 -6.4393e+01 -5.4863e+01 -5.4652e+01 -5.7408e+01 -6.4367e+01 -5.4895e+01 -5.4656e+01 -5.7361e+01 -6.4340e+01 -5.4927e+01 -5.4660e+01 -5.7312e+01 -6.4313e+01 -5.4954e+01 -5.4663e+01 -5.7259e+01 -6.4286e+01 -5.4977e+01 -5.4659e+01 -5.7206e+01 -6.4259e+01 -5.4999e+01 -5.4655e+01 -5.7154e+01 -6.4231e+01 -5.5021e+01 -5.4652e+01 -5.7104e+01 -6.4204e+01 -5.5043e+01 -5.4648e+01 -5.7053e+01 -6.4176e+01 -5.5064e+01 -5.4645e+01 -5.7004e+01 -6.4148e+01 -5.5085e+01 -5.4641e+01 -5.6955e+01 -6.4120e+01 -5.5106e+01 -5.4638e+01 -5.6906e+01 -6.4091e+01 -5.5126e+01 -5.4634e+01 -5.6859e+01 -6.4063e+01 -5.5146e+01 -5.4623e+01 -5.6812e+01 -6.4034e+01 -5.5166e+01 -5.4613e+01 -5.6765e+01 -6.4005e+01 -5.5185e+01 -5.4602e+01 -5.6720e+01 -6.3976e+01 -5.5204e+01 -5.4592e+01 -5.6674e+01 -6.3947e+01 -5.5223e+01 -5.4582e+01 -5.6630e+01 -6.3918e+01 -5.5241e+01 -5.4572e+01 -5.6586e+01 -6.3888e+01 -5.5259e+01 -5.4562e+01 -5.6542e+01 -6.3859e+01 -5.5276e+01 -5.4553e+01 -5.6499e+01 -6.3829e+01 -5.5294e+01 -5.4544e+01 -5.6457e+01 -6.3799e+01 -5.5310e+01 -5.4535e+01 -5.6415e+01 -6.3769e+01 -5.5327e+01 -5.4526e+01 -5.6373e+01 -6.3738e+01 -5.5343e+01 -5.4517e+01 -5.6332e+01 -6.3708e+01 -5.5359e+01 -5.4509e+01 -5.6292e+01 -6.3677e+01 -5.5374e+01 -5.4501e+01 -5.6252e+01 -6.3646e+01 -5.5389e+01 -5.4492e+01 -5.6212e+01 -6.3615e+01 -5.5404e+01 -5.4476e+01 -5.6173e+01 -6.3584e+01 -5.5419e+01 -5.4461e+01 -5.6135e+01 -6.3553e+01 -5.5433e+01 -5.4445e+01 -5.6097e+01 -6.3522e+01 -5.5446e+01 -5.4430e+01 -5.6059e+01 -6.3490e+01 -5.5460e+01 -5.4416e+01 -5.6021e+01 -6.3458e+01 -5.5473e+01 -5.4401e+01 -5.5985e+01 -6.3426e+01 -5.5485e+01 -5.4387e+01 -5.5948e+01 -6.3389e+01 -5.5498e+01 -5.4373e+01 -5.5912e+01 -6.3349e+01 -5.5510e+01 -5.4359e+01 -5.5876e+01 -6.3309e+01 -5.5521e+01 -5.4346e+01 -5.5841e+01 -6.3270e+01 -5.5533e+01 -5.4333e+01 -5.5806e+01 -6.3230e+01 -5.5544e+01 -5.4320e+01 -5.5771e+01 -6.3190e+01 -5.5554e+01 -5.4307e+01 -5.5737e+01 -6.3150e+01 -5.5565e+01 -5.4295e+01 -5.5703e+01 -6.3110e+01 -5.5575e+01 -5.4282e+01 -5.5670e+01 -6.3071e+01 -5.5584e+01 -5.4270e+01 -5.5636e+01 -6.3031e+01 -5.5594e+01 -5.4258e+01 -5.5603e+01 -6.2992e+01 -5.5603e+01 -5.4247e+01 -5.5571e+01 -6.2952e+01 -5.5611e+01 -5.4235e+01 -5.5539e+01 -6.2913e+01 -5.5620e+01 -5.4224e+01 -5.5507e+01 -6.2873e+01 -5.5628e+01 -5.4213e+01 -5.5475e+01 -6.2834e+01 -5.5635e+01 -5.4201e+01 -5.5444e+01 -6.2794e+01 -5.5643e+01 -5.4191e+01 -5.5413e+01 -6.2755e+01 -5.5650e+01 -5.4180e+01 -5.5382e+01 -6.2716e+01 -5.5656e+01 -5.4169e+01 -5.5351e+01 -6.2676e+01 -5.5663e+01 -5.4159e+01 -5.5321e+01 -6.2637e+01 -5.5669e+01 -5.4148e+01 -5.5291e+01 -6.2596e+01 -5.5675e+01 -5.4138e+01 -5.5262e+01 -6.2549e+01 -5.5680e+01 -5.4128e+01 -5.5232e+01 -6.2502e+01 -5.5686e+01 -5.4118e+01 -5.5203e+01 -6.2451e+01 -5.5688e+01 -5.4108e+01 -5.5174e+01 -6.2397e+01 -5.5685e+01 -5.4098e+01 -5.5145e+01 -6.2343e+01 -5.5682e+01 -5.4088e+01 -5.5117e+01 -6.2289e+01 -5.5678e+01 -5.4078e+01 -5.5089e+01 -6.2236e+01 -5.5674e+01 -5.4069e+01 -5.5061e+01 -6.2183e+01 -5.5671e+01 -5.4059e+01 -5.5033e+01 -6.2131e+01 -5.5667e+01 -5.4050e+01 -5.5006e+01 -6.2077e+01 -5.5663e+01 -5.4040e+01 -5.4978e+01 -6.2018e+01 -5.5659e+01 -5.4031e+01 -5.4951e+01 -6.1959e+01 -5.5654e+01 -5.4022e+01 -5.4925e+01 -6.1900e+01 -5.5647e+01 -5.4013e+01 -5.4898e+01 -6.1876e+01 -5.5635e+01 -5.4003e+01 -5.4871e+01 -6.1863e+01 -5.5623e+01 -5.3994e+01 -5.4845e+01 -6.1849e+01 -5.5610e+01 -5.3985e+01 -5.4819e+01 -6.1835e+01 -5.5598e+01 -5.3976e+01 -5.4793e+01 -6.1821e+01 -5.5586e+01 -5.3967e+01 -5.4767e+01 -6.1807e+01 -5.5574e+01 -5.3958e+01 -5.4774e+01 -6.1793e+01 -5.5562e+01 -5.3949e+01 -5.4785e+01 -6.1779e+01 -5.5550e+01 -5.3941e+01 -5.4796e+01 -6.1764e+01 -5.5539e+01 -5.3932e+01 -5.4806e+01 -6.1749e+01 -5.5527e+01 -5.3923e+01 -5.4816e+01 -6.1734e+01 -5.5515e+01 -5.3914e+01 -5.4826e+01 -6.1719e+01 -5.5503e+01 -5.3905e+01 -5.4835e+01 -6.1704e+01 -5.5492e+01 -5.3896e+01 -5.4845e+01 -6.1689e+01 -5.5478e+01 -5.3888e+01 -5.4854e+01 -6.1673e+01 -5.5458e+01 -5.3879e+01 -5.4862e+01 -6.1657e+01 -5.5439e+01 -5.3870e+01 -5.4871e+01 -6.1641e+01 -5.5420e+01 -5.3861e+01 -5.4879e+01 -6.1625e+01 -5.5401e+01 -5.3853e+01 -5.4887e+01 -6.1609e+01 -5.5382e+01 -5.3844e+01 -5.4894e+01 -6.1592e+01 -5.5364e+01 -5.3835e+01 -5.4902e+01 -6.1576e+01 -5.5345e+01 -5.3827e+01 -5.4909e+01 -6.1559e+01 -5.5327e+01 -5.3818e+01 -5.4916e+01 -6.1542e+01 -5.5309e+01 -5.3809e+01 -5.4922e+01 -6.1524e+01 -5.5291e+01 -5.3800e+01 -5.4928e+01 -6.1507e+01 -5.5273e+01 -5.3792e+01 -5.4934e+01 -6.1482e+01 -5.5252e+01 -5.3776e+01 -5.4940e+01 -6.1456e+01 -5.5227e+01 -5.3759e+01 -5.4945e+01 -6.1431e+01 -5.5202e+01 -5.3743e+01 -5.4950e+01 -6.1405e+01 -5.5171e+01 -5.3727e+01 -5.4955e+01 -6.1380e+01 -5.5138e+01 -5.3711e+01 -5.4960e+01 -6.1354e+01 -5.5107e+01 -5.3695e+01 -5.4964e+01 -6.1329e+01 -5.5076e+01 -5.3679e+01 -5.4963e+01 -6.1303e+01 -5.5045e+01 -5.3663e+01 -5.4959e+01 -6.1277e+01 -5.5015e+01 -5.3648e+01 -5.4955e+01 -6.1252e+01 -5.4985e+01 -5.3633e+01 -5.4984e+01 -6.1267e+01 -5.5037e+01 -5.3618e+01 -5.5016e+01 -6.1285e+01 -5.5097e+01 -5.3603e+01 -5.5048e+01 -6.1303e+01 -5.5155e+01 -5.3588e+01 -5.5079e+01 -6.1320e+01 -5.5213e+01 -5.3573e+01 -5.5109e+01 -6.1337e+01 -5.5269e+01 -5.3553e+01 -5.5139e+01 -6.1352e+01 -5.5325e+01 -5.3531e+01 -5.5169e+01 -6.1367e+01 -5.5380e+01 -5.3509e+01 -5.5197e+01 -6.1382e+01 -5.5434e+01 -5.3487e+01 -5.5226e+01 -6.1395e+01 -5.5484e+01 -5.3466e+01 -5.5253e+01 -6.1409e+01 -5.5528e+01 -5.3445e+01 -5.5281e+01 -6.1421e+01 -5.5572e+01 -5.3424e+01 -5.5308e+01 -6.1433e+01 -5.5615e+01 -5.3403e+01 -5.5334e+01 -6.1444e+01 -5.5657e+01 -5.3383e+01 -5.5363e+01 -6.1455e+01 -5.5699e+01 -5.3363e+01 -5.5428e+01 -6.1465e+01 -5.5740e+01 -5.3343e+01 -5.5489e+01 -6.1474e+01 -5.5780e+01 -5.3324e+01 -5.5548e+01 -6.1483e+01 -5.5820e+01 -5.3305e+01 -5.5607e+01 -6.1491e+01 -5.5859e+01 -5.3286e+01 -5.5665e+01 -6.1498e+01 -5.5898e+01 -5.3267e+01 -5.5722e+01 -6.1505e+01 -5.5936e+01 -5.3248e+01 -5.5778e+01 -6.1512e+01 -5.5973e+01 -5.3230e+01 -5.5833e+01 -6.1518e+01 -5.6010e+01 -5.3212e+01 -5.5888e+01 -6.1523e+01 -5.6045e+01 -5.3194e+01 -5.5933e+01 -6.1528e+01 -5.6081e+01 -5.3177e+01 -5.5978e+01 -6.1532e+01 -5.6115e+01 -5.3159e+01 -5.6022e+01 -6.1535e+01 -5.6150e+01 -5.3142e+01 -5.6065e+01 -6.1538e+01 -5.6183e+01 -5.3125e+01 -5.6107e+01 -6.1541e+01 -5.6216e+01 -5.3108e+01 -5.6149e+01 -6.1543e+01 -5.6248e+01 -5.3091e+01 -5.6190e+01 -6.1544e+01 -5.6280e+01 -5.3075e+01 -5.6223e+01 -6.1545e+01 -5.6311e+01 -5.3058e+01 -5.6255e+01 -6.1545e+01 -5.6341e+01 -5.3042e+01 -5.6286e+01 -6.1545e+01 -5.6371e+01 -5.3026e+01 -5.6317e+01 -6.1544e+01 -5.6400e+01 -5.3010e+01 -5.6347e+01 -6.1543e+01 -5.6428e+01 -5.2994e+01 -5.6377e+01 -6.1542e+01 -5.6456e+01 -5.2979e+01 -5.6406e+01 -6.1539e+01 -5.6484e+01 -5.2964e+01 -5.6428e+01 -6.1537e+01 -5.6510e+01 -5.2948e+01 -5.6448e+01 -6.1534e+01 -5.6537e+01 -5.2933e+01 -5.6468e+01 -6.1530e+01 -5.6562e+01 -5.2918e+01 -5.6488e+01 -6.1526e+01 -5.6587e+01 -5.2903e+01 -5.6508e+01 -6.1521e+01 -5.6612e+01 -5.2889e+01 -5.6527e+01 -6.1516e+01 -5.6636e+01 -5.2874e+01 -5.6546e+01 -6.1511e+01 -5.6659e+01 -5.2860e+01 -5.6564e+01 -6.1505e+01 -5.6682e+01 -5.2845e+01 -5.6583e+01 -6.1498e+01 -5.6704e+01 -5.2831e+01 -5.6600e+01 -6.1492e+01 -5.6725e+01 -5.2817e+01 -5.6618e+01 -6.1484e+01 -5.6747e+01 -5.2803e+01 -5.6635e+01 -6.1477e+01 -5.6767e+01 -5.2789e+01 -5.6652e+01 -6.1469e+01 -5.6787e+01 -5.2775e+01 -5.6669e+01 -6.1460e+01 -5.6807e+01 -5.2762e+01 -5.6685e+01 -6.1451e+01 -5.6826e+01 -5.2748e+01 -5.6701e+01 -6.1442e+01 -5.6844e+01 -5.2730e+01 -5.6716e+01 -6.1432e+01 -5.6862e+01 -5.2709e+01 -5.6732e+01 -6.1422e+01 -5.6879e+01 -5.2688e+01 -5.6746e+01 -6.1411e+01 -5.6896e+01 -5.2667e+01 -5.6761e+01 -6.1400e+01 -5.6912e+01 -5.2647e+01 -5.6775e+01 -6.1389e+01 -5.6928e+01 -5.2644e+01 -5.6789e+01 -6.1377e+01 -5.6936e+01 -5.2669e+01 -5.6802e+01 -6.1407e+01 -5.6943e+01 -5.2693e+01 -5.6816e+01 -6.1439e+01 -5.6950e+01 -5.2717e+01 -5.6828e+01 -6.1469e+01 -5.6956e+01 -5.2740e+01 -5.6841e+01 -6.1499e+01 -5.6962e+01 -5.2763e+01 -5.6853e+01 -6.1527e+01 -5.6968e+01 -5.2785e+01 -5.6865e+01 -6.1555e+01 -5.6973e+01 -5.2804e+01 -5.6876e+01 -6.1581e+01 -5.6979e+01 -5.2818e+01 -5.6887e+01 -6.1607e+01 -5.6984e+01 -5.2831e+01 -5.6898e+01 -6.1632e+01 -5.6988e+01 -5.2845e+01 -5.6908e+01 -6.1655e+01 -5.6992e+01 -5.2858e+01 -5.6918e+01 -6.1678e+01 -5.6997e+01 -5.2871e+01 -5.6928e+01 -6.1700e+01 -5.7000e+01 -5.2884e+01 -5.6937e+01 -6.1721e+01 -5.7004e+01 -5.2897e+01 -5.6946e+01 -6.1741e+01 -5.7007e+01 -5.2909e+01 -5.6955e+01 -6.1760e+01 -5.7010e+01 -5.2921e+01 -5.6963e+01 -6.1779e+01 -5.7012e+01 -5.2933e+01 -5.6971e+01 -6.1796e+01 -5.7014e+01 -5.2945e+01 -5.6979e+01 -6.1813e+01 -5.7016e+01 -5.2957e+01 -5.6986e+01 -6.1828e+01 -5.7018e+01 -5.2968e+01 -5.6993e+01 -6.1843e+01 -5.7020e+01 -5.2979e+01 -5.6999e+01 -6.1858e+01 -5.7021e+01 -5.2990e+01 -5.7006e+01 -6.1871e+01 -5.7020e+01 -5.3001e+01 -5.7012e+01 -6.1883e+01 -5.7013e+01 -5.3012e+01 -5.7017e+01 -6.1895e+01 -5.7006e+01 -5.3022e+01 -5.7023e+01 -6.1906e+01 -5.6998e+01 -5.3032e+01 -5.7028e+01 -6.1916e+01 -5.6990e+01 -5.3042e+01 -5.7032e+01 -6.1926e+01 -5.6983e+01 -5.3052e+01 -5.7037e+01 -6.1935e+01 -5.6975e+01 -5.3061e+01 -5.7041e+01 -6.1943e+01 -5.6967e+01 -5.3071e+01 -5.7044e+01 -6.1950e+01 -5.6959e+01 -5.3080e+01 -5.7048e+01 -6.1956e+01 -5.6951e+01 -5.3089e+01 -5.7051e+01 -6.1962e+01 -5.6942e+01 -5.3097e+01 -5.7053e+01 -6.1967e+01 -5.6934e+01 -5.3106e+01 -5.7056e+01 -6.1972e+01 -5.6926e+01 -5.3114e+01 -5.7058e+01 -6.1976e+01 -5.6917e+01 -5.3122e+01 -5.7060e+01 -6.1979e+01 -5.6909e+01 -5.3130e+01 -5.7061e+01 -6.1981e+01 -5.6900e+01 -5.3138e+01 -5.7062e+01 -6.1983e+01 -5.6891e+01 -5.3145e+01 -5.7063e+01 -6.1984e+01 -5.6882e+01 -5.3152e+01 -5.7064e+01 -6.1985e+01 -5.6873e+01 -5.3159e+01 -5.7064e+01 -6.1984e+01 -5.6864e+01 -5.3166e+01 -5.7064e+01 -6.1984e+01 -5.6854e+01 -5.3173e+01 -5.7073e+01 -6.1992e+01 -5.6845e+01 -5.3179e+01 -5.7117e+01 -6.2034e+01 -5.6836e+01 -5.3185e+01 -5.7160e+01 -6.2076e+01 -5.6826e+01 -5.3191e+01 -5.7202e+01 -6.2116e+01 -5.6816e+01 -5.3197e+01 -5.7243e+01 -6.2155e+01 -5.6806e+01 -5.3203e+01 -5.7283e+01 -6.2193e+01 -5.6796e+01 -5.3208e+01 -5.7323e+01 -6.2229e+01 -5.6786e+01 -5.3213e+01 -5.7361e+01 -6.2264e+01 -5.6776e+01 -5.3218e+01 -5.7398e+01 -6.2299e+01 -5.6766e+01 -5.3223e+01 -5.7435e+01 -6.2332e+01 -5.6750e+01 -5.3228e+01 -5.7471e+01 -6.2363e+01 -5.6732e+01 -5.3232e+01 -5.7505e+01 -6.2394e+01 -5.6711e+01 -5.3236e+01 -5.7539e+01 -6.2424e+01 -5.6685e+01 -5.3246e+01 -5.7572e+01 -6.2452e+01 -5.6659e+01 -5.3294e+01 -5.7605e+01 -6.2480e+01 -5.6633e+01 -5.3342e+01 -5.7636e+01 -6.2506e+01 -5.6608e+01 -5.3388e+01 -5.7659e+01 -6.2532e+01 -5.6583e+01 -5.3434e+01 -5.7681e+01 -6.2556e+01 -5.6558e+01 -5.3479e+01 -5.7702e+01 -6.2580e+01 -5.6533e+01 -5.3523e+01 -5.7723e+01 -6.2602e+01 -5.6509e+01 -5.3567e+01 -5.7743e+01 -6.2623e+01 -5.6484e+01 -5.3609e+01 -5.7763e+01 -6.2644e+01 -5.6460e+01 -5.3651e+01 -5.7781e+01 -6.2663e+01 -5.6437e+01 -5.3692e+01 -5.7791e+01 -6.2682e+01 -5.6413e+01 -5.3732e+01 -5.7801e+01 -6.2699e+01 -5.6390e+01 -5.3772e+01 -5.7811e+01 -6.2716e+01 -5.6366e+01 -5.3811e+01 -5.7820e+01 -6.2732e+01 -5.6343e+01 -5.3848e+01 -5.7829e+01 -6.2746e+01 -5.6321e+01 -5.3896e+01 -5.7838e+01 -6.2760e+01 -5.6298e+01 -5.3977e+01 -5.7846e+01 -6.2773e+01 -5.6275e+01 -5.4056e+01 -5.7854e+01 -6.2786e+01 -5.6253e+01 -5.4134e+01 -5.7862e+01 -6.2797e+01 -5.6231e+01 -5.4211e+01 -5.7869e+01 -6.2807e+01 -5.6209e+01 -5.4287e+01 -5.7875e+01 -6.2817e+01 -5.6187e+01 -5.4361e+01 -5.7882e+01 -6.2826e+01 -5.6165e+01 -5.4434e+01 -5.7888e+01 -6.2834e+01 -5.6139e+01 -5.4505e+01 -5.7895e+01 -6.2841e+01 -5.6109e+01 -5.4575e+01 -5.7939e+01 -6.2848e+01 -5.6080e+01 -5.4644e+01 -5.7980e+01 -6.2853e+01 -5.6052e+01 -5.4712e+01 -5.8020e+01 -6.2858e+01 -5.6023e+01 -5.4778e+01 -5.8060e+01 -6.2863e+01 -5.5995e+01 -5.4844e+01 -5.8098e+01 -6.2866e+01 -5.5967e+01 -5.4908e+01 -5.8136e+01 -6.2869e+01 -5.5940e+01 -5.4970e+01 -5.8173e+01 -6.2871e+01 -5.5912e+01 -5.5032e+01 -5.8209e+01 -6.2872e+01 -5.5885e+01 -5.5092e+01 -5.8244e+01 -6.2905e+01 -5.5859e+01 -5.5152e+01 -5.8270e+01 -6.2949e+01 -5.5832e+01 -5.5210e+01 -5.8297e+01 -6.2992e+01 -5.5806e+01 -5.5265e+01 -5.8322e+01 -6.3034e+01 -5.5780e+01 -5.5313e+01 -5.8347e+01 -6.3074e+01 -5.5754e+01 -5.5360e+01 -5.8371e+01 -6.3113e+01 -5.5729e+01 -5.5406e+01 -5.8395e+01 -6.3149e+01 -5.5703e+01 -5.5451e+01 -5.8418e+01 -6.3172e+01 -5.5678e+01 -5.5495e+01 -5.8441e+01 -6.3191e+01 -5.5653e+01 -5.5539e+01 -5.8479e+01 -6.3210e+01 -5.5629e+01 -5.5581e+01 -5.8537e+01 -6.3228e+01 -5.5604e+01 -5.5623e+01 -5.8594e+01 -6.3245e+01 -5.5580e+01 -5.5664e+01 -5.8650e+01 -6.3261e+01 -5.5556e+01 -5.5704e+01 -5.8705e+01 -6.3276e+01 -5.5532e+01 -5.5743e+01 -5.8759e+01 -6.3291e+01 -5.5508e+01 -5.5814e+01 -5.8812e+01 -6.3305e+01 -5.5485e+01 -5.5896e+01 -5.8864e+01 -6.3318e+01 -5.5462e+01 -5.5976e+01 -5.8915e+01 -6.3330e+01 -5.5438e+01 -5.6055e+01 -5.8965e+01 -6.3342e+01 -5.5416e+01 -5.6132e+01 -5.9014e+01 -6.3353e+01 -5.5393e+01 -5.6208e+01 -5.9062e+01 -6.3359e+01 -5.5370e+01 -5.6283e+01 -5.9109e+01 -6.3360e+01 -5.5348e+01 -5.6356e+01 -5.9155e+01 -6.3361e+01 -5.5325e+01 -5.6428e+01 -5.9200e+01 -6.3362e+01 -5.5303e+01 -5.6498e+01 -5.9244e+01 -6.3362e+01 -5.5281e+01 -5.6567e+01 -5.9288e+01 -6.3361e+01 -5.5259e+01 -5.6635e+01 -5.9330e+01 -6.3360e+01 -5.5237e+01 -5.6701e+01 -5.9371e+01 -6.3358e+01 -5.5216e+01 -5.6766e+01 -5.9412e+01 -6.3356e+01 -5.5194e+01 -5.6830e+01 -5.9452e+01 -6.3353e+01 -5.5173e+01 -5.6893e+01 -5.9490e+01 -6.3350e+01 -5.5152e+01 -5.6954e+01 -5.9528e+01 -6.3346e+01 -5.5130e+01 -5.7014e+01 -5.9565e+01 -6.3342e+01 -5.5109e+01 -5.7073e+01 -5.9601e+01 -6.3337e+01 -5.5088e+01 -5.7131e+01 -5.9636e+01 -6.3332e+01 -5.5068e+01 -5.7187e+01 -5.9671e+01 -6.3326e+01 -5.5047e+01 -5.7243e+01 -5.9704e+01 -6.3320e+01 -5.5026e+01 -5.7297e+01 -5.9737e+01 -6.3314e+01 -5.5006e+01 -5.7350e+01 -5.9769e+01 -6.3307e+01 -5.4986e+01 -5.7402e+01 -5.9800e+01 -6.3304e+01 -5.4965e+01 -5.7452e+01 -5.9826e+01 -6.3341e+01 -5.4945e+01 -5.7502e+01 -5.9847e+01 -6.3377e+01 -5.4925e+01 -5.7550e+01 -5.9868e+01 -6.3411e+01 -5.4905e+01 -5.7598e+01 -5.9888e+01 -6.3444e+01 -5.4885e+01 -5.7644e+01 -5.9908e+01 -6.3477e+01 -5.4865e+01 -5.7689e+01 -5.9927e+01 -6.3508e+01 -5.4846e+01 -5.7734e+01 -5.9946e+01 -6.3538e+01 -5.4826e+01 -5.7777e+01 -5.9963e+01 -6.3567e+01 -5.4807e+01 -5.7819e+01 -5.9981e+01 -6.3595e+01 -5.4787e+01 -5.7860e+01 -5.9997e+01 -6.3622e+01 -5.4768e+01 -5.7900e+01 -6.0013e+01 -6.3674e+01 -5.4748e+01 -5.7939e+01 -6.0029e+01 -6.3744e+01 -5.4729e+01 -5.7977e+01 -6.0044e+01 -6.3811e+01 -5.4710e+01 -5.8014e+01 -6.0058e+01 -6.3877e+01 -5.4691e+01 -5.8050e+01 -6.0072e+01 -6.3942e+01 -5.4672e+01 -5.8086e+01 -6.0085e+01 -6.4004e+01 -5.4653e+01 -5.8120e+01 -6.0098e+01 -6.4066e+01 -5.4634e+01 -5.8153e+01 -6.0110e+01 -6.4125e+01 -5.4615e+01 -5.8186e+01 -6.0122e+01 -6.4183e+01 -5.4596e+01 -5.8217e+01 -6.0133e+01 -6.4240e+01 -5.4578e+01 -5.8248e+01 -6.0143e+01 -6.4295e+01 -5.4559e+01 -5.8278e+01 -6.0153e+01 -6.4349e+01 -5.4541e+01 -5.8307e+01 -6.0162e+01 -6.4401e+01 -5.4522e+01 -5.8327e+01 -6.0171e+01 -6.4451e+01 -5.4504e+01 -5.8347e+01 -6.0179e+01 -6.4501e+01 -5.4485e+01 -5.8365e+01 -6.0187e+01 -6.4548e+01 -5.4467e+01 -5.8384e+01 -6.0195e+01 -6.4595e+01 -5.4449e+01 -5.8401e+01 -6.0201e+01 -6.4640e+01 -5.4431e+01 -5.8418e+01 -6.0208e+01 -6.4684e+01 -5.4412e+01 -5.8426e+01 -6.0213e+01 -6.4726e+01 -5.4394e+01 -5.8434e+01 -6.0219e+01 -6.4767e+01 -5.4376e+01 -5.8442e+01 -6.0223e+01 -6.4807e+01 -5.4358e+01 -5.8449e+01 -6.0228e+01 -6.4845e+01 -5.4340e+01 -5.8455e+01 -6.0231e+01 -6.4882e+01 -5.4322e+01 -5.8462e+01 -6.0235e+01 -6.4918e+01 -5.4305e+01 -5.8463e+01 -6.0237e+01 -6.4952e+01 -5.4287e+01 -5.8461e+01 -6.0240e+01 -6.4986e+01 -5.4269e+01 -5.8458e+01 -6.0242e+01 -6.5018e+01 -5.4251e+01 -5.8455e+01 -6.0243e+01 -6.5049e+01 -5.4234e+01 -5.8452e+01 -6.0244e+01 -6.5079e+01 -5.4216e+01 -5.8449e+01 -6.0244e+01 -6.5107e+01 -5.4198e+01 -5.8446e+01 -6.0244e+01 -6.5130e+01 -5.4181e+01 -5.8442e+01 -6.0244e+01 -6.5148e+01 -5.4163e+01 -5.8438e+01 -6.0243e+01 -6.5166e+01 -5.4146e+01 -5.8434e+01 -6.0242e+01 -6.5182e+01 -5.4129e+01 -5.8430e+01 -6.0240e+01 -6.5198e+01 -5.4111e+01 -5.8425e+01 -6.0238e+01 -6.5212e+01 -5.4094e+01 -5.8421e+01 -6.0235e+01 -6.5226e+01 -5.4077e+01 -5.8416e+01 -6.0232e+01 -6.5239e+01 -5.4059e+01 -5.8411e+01 -6.0229e+01 -6.5251e+01 -5.4042e+01 -5.8405e+01 -6.0225e+01 -6.5262e+01 -5.4025e+01 -5.8400e+01 -6.0221e+01 -6.5272e+01 -5.4008e+01 -5.8394e+01 -6.0216e+01 -6.5282e+01 -5.3991e+01 -5.8388e+01 -6.0211e+01 -6.5290e+01 -5.3974e+01 -5.8382e+01 -6.0205e+01 -6.5298e+01 -5.3957e+01 -5.8376e+01 -6.0200e+01 -6.5345e+01 -5.3940e+01 -5.8369e+01 -6.0193e+01 -6.5396e+01 -5.3923e+01 -5.8362e+01 -6.0187e+01 -6.5444e+01 -5.3906e+01 -5.8355e+01 -6.0180e+01 -6.5492e+01 -5.3889e+01 -5.8348e+01 -6.0172e+01 -6.5538e+01 -5.3872e+01 -5.8341e+01 -6.0165e+01 -6.5582e+01 -5.3856e+01 -5.8333e+01 -6.0157e+01 -6.5625e+01 -5.3839e+01 -5.8325e+01 -6.0148e+01 -6.5667e+01 -5.3822e+01 -5.8317e+01 -6.0139e+01 -6.5707e+01 -5.3805e+01 -5.8309e+01 -6.0130e+01 -6.5746e+01 -5.3789e+01 -5.8301e+01 -6.0121e+01 -6.5784e+01 -5.3772e+01 -5.8292e+01 -6.0111e+01 -6.5820e+01 -5.3756e+01 -5.8283e+01 -6.0101e+01 -6.5856e+01 -5.3739e+01 -5.8274e+01 -6.0090e+01 -6.5889e+01 -5.3723e+01 -5.8265e+01 -6.0079e+01 -6.5922e+01 -5.3706e+01 -5.8255e+01 -6.0068e+01 -6.5953e+01 -5.3690e+01 -5.8246e+01 -6.0057e+01 -6.5984e+01 -5.3673e+01 -5.8236e+01 -6.0045e+01 -6.6012e+01 -5.3657e+01 -5.8226e+01 -6.0032e+01 -6.6040e+01 -5.3641e+01 -5.8216e+01 -6.0004e+01 -6.6067e+01 -5.3624e+01 -5.8202e+01 -5.9976e+01 -6.6092e+01 -5.3608e+01 -5.8183e+01 -5.9948e+01 -6.6116e+01 -5.3592e+01 -5.8209e+01 -5.9920e+01 -6.6139e+01 -5.3576e+01 -5.8235e+01 -5.9891e+01 -6.6161e+01 -5.3559e+01 -5.8259e+01 -5.9855e+01 -6.6182e+01 -5.3543e+01 -5.8284e+01 -5.9819e+01 -6.6202e+01 -5.3527e+01 -5.8307e+01 -5.9784e+01 -6.6220e+01 -5.3511e+01 -5.8330e+01 -5.9749e+01 -6.6238e+01 -5.3495e+01 -5.8352e+01 -5.9714e+01 -6.6254e+01 -5.3479e+01 -5.8374e+01 -5.9679e+01 -6.6270e+01 -5.3463e+01 -5.8395e+01 -5.9645e+01 -6.6284e+01 -5.3447e+01 -5.8415e+01 -5.9610e+01 -6.6298e+01 -5.3431e+01 -5.8435e+01 -5.9576e+01 -6.6310e+01 -5.3416e+01 -5.8454e+01 -5.9542e+01 -6.6315e+01 -5.3400e+01 -5.8465e+01 -5.9509e+01 -6.6317e+01 -5.3384e+01 -5.8475e+01 -5.9475e+01 -6.6319e+01 -5.3368e+01 -5.8485e+01 -5.9440e+01 -6.6320e+01 -5.3352e+01 -5.8494e+01 -5.9399e+01 -6.6321e+01 -5.3337e+01 -5.8503e+01 -5.9358e+01 -6.6320e+01 -5.3321e+01 -5.8511e+01 -5.9318e+01 -6.6319e+01 -5.3305e+01 -5.8519e+01 -5.9278e+01 -6.6317e+01 -5.3290e+01 -5.8527e+01 -5.9239e+01 -6.6315e+01 -5.3274e+01 -5.8534e+01 -5.9200e+01 -6.6312e+01 -5.3259e+01 -5.8541e+01 -5.9161e+01 -6.6308e+01 -5.3243e+01 -5.8547e+01 -5.9122e+01 -6.6303e+01 -5.3228e+01 -5.8554e+01 -5.9084e+01 -6.6298e+01 -5.3212e+01 -5.8559e+01 -5.9046e+01 -6.6292e+01 -5.3197e+01 -5.8565e+01 -5.9009e+01 -6.6283e+01 -5.3181e+01 -5.8569e+01 -5.8971e+01 -6.6268e+01 -5.3166e+01 -5.8574e+01 -5.8934e+01 -6.6252e+01 -5.3151e+01 -5.8578e+01 -5.8898e+01 -6.6236e+01 -5.3136e+01 -5.8582e+01 -5.8861e+01 -6.6219e+01 -5.3120e+01 -5.8585e+01 -5.8825e+01 -6.6202e+01 -5.3105e+01 -5.8588e+01 -5.8789e+01 -6.6185e+01 -5.3090e+01 -5.8591e+01 -5.8754e+01 -6.6167e+01 -5.3074e+01 -5.8593e+01 -5.8718e+01 -6.6142e+01 -5.3051e+01 -5.8595e+01 -5.8683e+01 -6.6116e+01 -5.3028e+01 -5.8594e+01 -5.8649e+01 -6.6089e+01 -5.3006e+01 -5.8587e+01 -5.8614e+01 -6.6062e+01 -5.2983e+01 -5.8580e+01 -5.8579e+01 -6.6035e+01 -5.2961e+01 -5.8573e+01 -5.8545e+01 -6.6007e+01 -5.2939e+01 -5.8566e+01 -5.8511e+01 -6.5979e+01 -5.2917e+01 -5.8559e+01 -5.8478e+01 -6.5951e+01 -5.2896e+01 -5.8551e+01 -5.8444e+01 -6.5923e+01 -5.2874e+01 -5.8543e+01 -5.8411e+01 -6.5895e+01 -5.2853e+01 -5.8535e+01 -5.8378e+01 -6.5866e+01 -5.2832e+01 -5.8527e+01 -5.8345e+01 -6.5837e+01 -5.2812e+01 -5.8519e+01 -5.8312e+01 -6.5808e+01 -5.2791e+01 -5.8511e+01 -5.8279e+01 -6.5774e+01 -5.2771e+01 -5.8502e+01 -5.8247e+01 -6.5737e+01 -5.2745e+01 -5.8493e+01 -5.8215e+01 -6.5699e+01 -5.2717e+01 -5.8485e+01 -5.8183e+01 -6.5658e+01 -5.2689e+01 -5.8476e+01 -5.8151e+01 -6.5612e+01 -5.2657e+01 -5.8466e+01 -5.8119e+01 -6.5567e+01 -5.2622e+01 -5.8457e+01 -5.8087e+01 -6.5522e+01 -5.2588e+01 -5.8447e+01 -5.8056e+01 -6.5477e+01 -5.2555e+01 -5.8429e+01 -5.8025e+01 -6.5433e+01 -5.2522e+01 -5.8412e+01 -5.7994e+01 -6.5388e+01 -5.2489e+01 -5.8394e+01 -5.7963e+01 -6.5344e+01 -5.2457e+01 -5.8376e+01 -5.7932e+01 -6.5299e+01 -5.2426e+01 -5.8359e+01 -5.7901e+01 -6.5255e+01 -5.2395e+01 -5.8341e+01 -5.7871e+01 -6.5211e+01 -5.2364e+01 -5.8323e+01 -5.7840e+01 -6.5167e+01 -5.2334e+01 -5.8306e+01 -5.7810e+01 -6.5123e+01 -5.2304e+01 -5.8288e+01 -5.7780e+01 -6.5080e+01 -5.2275e+01 -5.8270e+01 -5.7750e+01 -6.5036e+01 -5.2247e+01 -5.8253e+01 -5.7720e+01 -6.4993e+01 -5.2218e+01 -5.8235e+01 -5.7690e+01 -6.4949e+01 -5.2190e+01 -5.8217e+01 -5.7661e+01 -6.4906e+01 -5.2163e+01 -5.8199e+01 -5.7631e+01 -6.4862e+01 -5.2136e+01 -5.8182e+01 -5.7602e+01 -6.4811e+01 -5.2096e+01 -5.8164e+01 -5.7572e+01 -6.4760e+01 -5.2054e+01 -5.8146e+01 -5.7543e+01 -6.4710e+01 -5.2013e+01 -5.8128e+01 -5.7514e+01 -6.4667e+01 -5.1972e+01 -5.8111e+01 -5.7485e+01 -6.4661e+01 -5.1933e+01 -5.8093e+01 -5.7456e+01 -6.4655e+01 -5.1894e+01 -5.8075e+01 -5.7427e+01 -6.4649e+01 -5.1856e+01 -5.8057e+01 -5.7399e+01 -6.4642e+01 -5.1818e+01 -5.8039e+01 -5.7370e+01 -6.4635e+01 -5.1781e+01 -5.8021e+01 -5.7342e+01 -6.4628e+01 -5.1745e+01 -5.8003e+01 -5.7313e+01 -6.4620e+01 -5.1710e+01 -5.7985e+01 -5.7285e+01 -6.4611e+01 -5.1675e+01 -5.7967e+01 -5.7257e+01 -6.4602e+01 -5.1641e+01 -5.7949e+01 -5.7229e+01 -6.4593e+01 -5.1607e+01 -5.7931e+01 -5.7201e+01 -6.4583e+01 -5.1574e+01 -5.7912e+01 -5.7173e+01 -6.4573e+01 -5.1542e+01 -5.7894e+01 -5.7145e+01 -6.4563e+01 -5.1510e+01 -5.7876e+01 -5.7117e+01 -6.4552e+01 -5.1479e+01 -5.7858e+01 -5.7089e+01 -6.4541e+01 -5.1448e+01 -5.7839e+01 -5.7062e+01 -6.4529e+01 -5.1418e+01 -5.7821e+01 -5.7034e+01 -6.4517e+01 -5.1418e+01 -5.7802e+01 -5.7007e+01 -6.4505e+01 -5.1433e+01 -5.7784e+01 -5.6979e+01 -6.4492e+01 -5.1448e+01 -5.7765e+01 -5.6952e+01 -6.4479e+01 -5.1463e+01 -5.7747e+01 -5.6925e+01 -6.4466e+01 -5.1478e+01 -5.7728e+01 -5.6897e+01 -6.4497e+01 -5.1492e+01 -5.7709e+01 -5.6867e+01 -6.4526e+01 -5.1507e+01 -5.7690e+01 -5.6832e+01 -6.4555e+01 -5.1521e+01 -5.7672e+01 -5.6797e+01 -6.4582e+01 -5.1535e+01 -5.7653e+01 -5.6763e+01 -6.4609e+01 -5.1549e+01 -5.7634e+01 -5.6729e+01 -6.4635e+01 -5.1563e+01 -5.7615e+01 -5.6695e+01 -6.4659e+01 -5.1577e+01 -5.7596e+01 -5.6661e+01 -6.4683e+01 -5.1590e+01 -5.7577e+01 -5.6628e+01 -6.4704e+01 -5.1604e+01 -5.7552e+01 -5.6595e+01 -6.4718e+01 -5.1617e+01 -5.7525e+01 -5.6562e+01 -6.4731e+01 -5.1630e+01 -5.7498e+01 -5.6529e+01 -6.4743e+01 -5.1643e+01 -5.7471e+01 -5.6497e+01 -6.4754e+01 -5.1655e+01 -5.7444e+01 -5.6464e+01 -6.4765e+01 -5.1668e+01 -5.7418e+01 -5.6432e+01 -6.4775e+01 -5.1680e+01 -5.7391e+01 -5.6401e+01 -6.4784e+01 -5.1692e+01 -5.7365e+01 -5.6369e+01 -6.4793e+01 -5.1704e+01 -5.7339e+01 -5.6338e+01 -6.4801e+01 -5.1716e+01 -5.7313e+01 -5.6306e+01 -6.4808e+01 -5.1728e+01 -5.7287e+01 -5.6275e+01 -6.4814e+01 -5.1739e+01 -5.7261e+01 -5.6245e+01 -6.4820e+01 -5.1749e+01 -5.7236e+01 -5.6214e+01 -6.4825e+01 -5.1752e+01 -5.7210e+01 -5.6184e+01 -6.4830e+01 -5.1755e+01 -5.7185e+01 -5.6153e+01 -6.4833e+01 -5.1758e+01 -5.7159e+01 -5.6123e+01 -6.4836e+01 -5.1761e+01 -5.7134e+01 -5.6094e+01 -6.4839e+01 -5.1765e+01 -5.7108e+01 -5.6064e+01 -6.4841e+01 -5.1768e+01 -5.7075e+01 -5.6034e+01 -6.4842e+01 -5.1771e+01 -5.7042e+01 -5.6005e+01 -6.4842e+01 -5.1774e+01 -5.7010e+01 -5.5976e+01 -6.4842e+01 -5.1777e+01 -5.6977e+01 -5.5947e+01 -6.4841e+01 -5.1781e+01 -5.6945e+01 -5.5918e+01 -6.4840e+01 -5.1784e+01 -5.6914e+01 -5.5889e+01 -6.4838e+01 -5.1787e+01 -5.6882e+01 -5.5860e+01 -6.4835e+01 -5.1790e+01 -5.6845e+01 -5.5824e+01 -6.4832e+01 -5.1793e+01 -5.6806e+01 -5.5788e+01 -6.4828e+01 -5.1796e+01 -5.6767e+01 -5.5752e+01 -6.4823e+01 -5.1799e+01 -5.6730e+01 -5.5717e+01 -6.4818e+01 -5.1802e+01 -5.6692e+01 -5.5682e+01 -6.4813e+01 -5.1805e+01 -5.6655e+01 -5.5647e+01 -6.4807e+01 -5.1808e+01 -5.6618e+01 -5.5613e+01 -6.4800e+01 -5.1811e+01 -5.6582e+01 -5.5579e+01 -6.4793e+01 -5.1814e+01 -5.6546e+01 -5.5545e+01 -6.4785e+01 -5.1816e+01 -5.6510e+01 -5.5512e+01 -6.4776e+01 -5.1819e+01 -5.6475e+01 -5.5479e+01 -6.4767e+01 -5.1822e+01 -5.6440e+01 -5.5446e+01 -6.4758e+01 -5.1824e+01 -5.6406e+01 -5.5414e+01 -6.4748e+01 -5.1827e+01 -5.6372e+01 -5.5382e+01 -6.4737e+01 -5.1829e+01 -5.6332e+01 -5.5350e+01 -6.4726e+01 -5.1824e+01 -5.6291e+01 -5.5318e+01 -6.4715e+01 -5.1811e+01 -5.6250e+01 -5.5287e+01 -6.4703e+01 -5.1798e+01 -5.6210e+01 -5.5256e+01 -6.4719e+01 -5.1785e+01 -5.6170e+01 -5.5225e+01 -6.4750e+01 -5.1773e+01 -5.6130e+01 -5.5191e+01 -6.4780e+01 -5.1761e+01 -5.6092e+01 -5.5153e+01 -6.4809e+01 -5.1749e+01 -5.6052e+01 -5.5115e+01 -6.4837e+01 -5.1737e+01 -5.6006e+01 -5.5078e+01 -6.4864e+01 -5.1726e+01 -5.5961e+01 -5.5041e+01 -6.4889e+01 -5.1715e+01 -5.5916e+01 -5.5004e+01 -6.4914e+01 -5.1704e+01 -5.5872e+01 -5.4968e+01 -6.4937e+01 -5.1688e+01 -5.5829e+01 -5.4932e+01 -6.4960e+01 -5.1670e+01 -5.5786e+01 -5.4897e+01 -6.4981e+01 -5.1652e+01 -5.5744e+01 -5.4862e+01 -6.5001e+01 -5.1635e+01 -5.5702e+01 -5.4828e+01 -6.5020e+01 -5.1614e+01 -5.5661e+01 -5.4793e+01 -6.5039e+01 -5.1584e+01 -5.5620e+01 -5.4760e+01 -6.5056e+01 -5.1552e+01 -5.5580e+01 -5.4726e+01 -6.5072e+01 -5.1521e+01 -5.5541e+01 -5.4693e+01 -6.5088e+01 -5.1491e+01 -5.5502e+01 -5.4660e+01 -6.5102e+01 -5.1462e+01 -5.5463e+01 -5.4628e+01 -6.5116e+01 -5.1433e+01 -5.5425e+01 -5.4596e+01 -6.5128e+01 -5.1405e+01 -5.5387e+01 -5.4564e+01 -6.5140e+01 -5.1378e+01 -5.5350e+01 -5.4533e+01 -6.5150e+01 -5.1351e+01 -5.5314e+01 -5.4500e+01 -6.5160e+01 -5.1319e+01 -5.5277e+01 -5.4461e+01 -6.5169e+01 -5.1285e+01 -5.5242e+01 -5.4423e+01 -6.5177e+01 -5.1253e+01 -5.5206e+01 -5.4385e+01 -6.5184e+01 -5.1221e+01 -5.5171e+01 -5.4348e+01 -6.5191e+01 -5.1191e+01 -5.5137e+01 -5.4311e+01 -6.5196e+01 -5.1160e+01 -5.5103e+01 -5.4274e+01 -6.5201e+01 -5.1127e+01 -5.5069e+01 -5.4239e+01 -6.5204e+01 -5.1090e+01 -5.5036e+01 -5.4203e+01 -6.5208e+01 -5.1055e+01 -5.5003e+01 -5.4168e+01 -6.5210e+01 -5.1020e+01 -5.4970e+01 -5.4134e+01 -6.5206e+01 -5.0986e+01 -5.4938e+01 -5.4100e+01 -6.5197e+01 -5.0953e+01 -5.4906e+01 -5.4066e+01 -6.5181e+01 -5.0921e+01 -5.4866e+01 -5.4033e+01 -6.5165e+01 -5.0889e+01 -5.4827e+01 -5.4000e+01 -6.5149e+01 -5.0859e+01 -5.4789e+01 -5.3967e+01 -6.5132e+01 -5.0829e+01 -5.4751e+01 -5.3935e+01 -6.5115e+01 -5.0800e+01 -5.4714e+01 -5.3903e+01 -6.5097e+01 -5.0771e+01 -5.4677e+01 -5.3872e+01 -6.5079e+01 -5.0744e+01 -5.4641e+01 -5.3841e+01 -6.5061e+01 -5.0717e+01 -5.4605e+01 -5.3810e+01 -6.5043e+01 -5.0690e+01 -5.4569e+01 -5.3780e+01 -6.5024e+01 -5.0665e+01 -5.4534e+01 -5.3750e+01 -6.5005e+01 -5.0640e+01 -5.4500e+01 -5.3721e+01 -6.4985e+01 -5.0615e+01 -5.4466e+01 -5.3692e+01 -6.4965e+01 -5.0592e+01 -5.4432e+01 -5.3702e+01 -6.4945e+01 -5.0568e+01 -5.4399e+01 -5.3709e+01 -6.4924e+01 -5.0546e+01 -5.4366e+01 -5.3717e+01 -6.4903e+01 -5.0524e+01 -5.4345e+01 -5.3724e+01 -6.4882e+01 -5.0502e+01 -5.4357e+01 -5.3731e+01 -6.4860e+01 -5.0482e+01 -5.4369e+01 -5.3738e+01 -6.4839e+01 -5.0461e+01 -5.4381e+01 -5.3745e+01 -6.4816e+01 -5.0441e+01 -5.4393e+01 -5.3752e+01 -6.4794e+01 -5.0422e+01 -5.4405e+01 -5.3758e+01 -6.4771e+01 -5.0403e+01 -5.4416e+01 -5.3764e+01 -6.4748e+01 -5.0385e+01 -5.4427e+01 -5.3770e+01 -6.4724e+01 -5.0367e+01 -5.4437e+01 -5.3776e+01 -6.4701e+01 -5.0349e+01 -5.4448e+01 -5.3782e+01 -6.4677e+01 -5.0333e+01 -5.4458e+01 -5.3788e+01 -6.4652e+01 -5.0316e+01 -5.4468e+01 -5.3793e+01 -6.4628e+01 -5.0300e+01 -5.4477e+01 -5.3799e+01 -6.4603e+01 -5.0284e+01 -5.4486e+01 -5.3804e+01 -6.4578e+01 -5.0269e+01 -5.4495e+01 -5.3809e+01 -6.4552e+01 -5.0254e+01 -5.4504e+01 -5.3814e+01 -6.4526e+01 -5.0240e+01 -5.4513e+01 -5.3818e+01 -6.4500e+01 -5.0225e+01 -5.4521e+01 -5.3823e+01 -6.4474e+01 -5.0212e+01 -5.4529e+01 -5.3827e+01 -6.4447e+01 -5.0195e+01 -5.4536e+01 -5.3831e+01 -6.4421e+01 -5.0174e+01 -5.4544e+01 -5.3835e+01 -6.4393e+01 -5.0154e+01 -5.4551e+01 -5.3839e+01 -6.4366e+01 -5.0134e+01 -5.4558e+01 -5.3843e+01 -6.4338e+01 -5.0115e+01 -5.4564e+01 -5.3846e+01 -6.4311e+01 -5.0096e+01 -5.4571e+01 -5.3849e+01 -6.4282e+01 -5.0077e+01 -5.4577e+01 -5.3852e+01 -6.4254e+01 -5.0060e+01 -5.4583e+01 -5.3855e+01 -6.4225e+01 -5.0042e+01 -5.4588e+01 -5.3858e+01 -6.4195e+01 -5.0025e+01 -5.4594e+01 -5.3861e+01 -6.4158e+01 -5.0008e+01 -5.4599e+01 -5.3879e+01 -6.4120e+01 -1.0000e+01 -5.4604e+01 -5.3918e+01 -6.4083e+01 -6.0000e+01 -5.4608e+01 -5.3956e+01 -6.4046e+01 -6.0000e+01 -5.4613e+01 -5.3994e+01 -6.4009e+01 -6.0000e+01 -5.4617e+01 -5.4030e+01 -6.3972e+01 -6.0000e+01 -5.4621e+01 -5.4067e+01 -6.3934e+01 -6.0000e+01 -5.4618e+01 -5.4102e+01 -6.3897e+01 -6.0000e+01 -5.4614e+01 -5.4137e+01 -6.3860e+01 -6.0000e+01 -5.4609e+01 -5.4171e+01 -6.3822e+01 -6.0000e+01 -5.4605e+01 -5.4205e+01 -6.3785e+01 -6.0000e+01 -5.4600e+01 -5.4238e+01 -6.3747e+01 -6.0000e+01 -5.4595e+01 -5.4271e+01 -6.3710e+01 -6.0000e+01 -5.4591e+01 -5.4303e+01 -6.3672e+01 -6.0000e+01 -5.4586e+01 -5.4334e+01 -6.3635e+01 -6.0000e+01 -5.4581e+01 -5.4365e+01 -6.3597e+01 -6.0000e+01 -5.4576e+01 -5.4395e+01 -6.3559e+01 -6.0000e+01 -5.4571e+01 -5.4424e+01 -6.3521e+01 -6.0000e+01 -5.4566e+01 -5.4453e+01 -6.3484e+01 -6.0000e+01 -5.4561e+01 -5.4482e+01 -6.3446e+01 -6.0000e+01 -5.4556e+01 -5.4510e+01 -6.3408e+01 -6.0000e+01 -5.4551e+01 -5.4537e+01 -6.3370e+01 -6.0000e+01 -5.4545e+01 -5.4564e+01 -6.3332e+01 -6.0000e+01 -5.4535e+01 -5.4590e+01 -6.3294e+01 -6.0000e+01 -5.4522e+01 -5.4616e+01 -6.3256e+01 -6.0000e+01 -5.4509e+01 -5.4641e+01 -6.3218e+01 -6.0000e+01 -5.4495e+01 -5.4665e+01 -6.3180e+01 -6.0000e+01 -5.4482e+01 -5.4689e+01 -6.3142e+01 -6.0000e+01 -5.4470e+01 -5.4713e+01 -6.3103e+01 -6.0000e+01 -5.4457e+01 -5.4736e+01 -6.3064e+01 -6.0000e+01 -5.4444e+01 -5.4758e+01 -6.3017e+01 -6.0000e+01 -5.4432e+01 -5.4780e+01 -6.2971e+01 -6.0000e+01 -5.4419e+01 -5.4802e+01 -6.2925e+01 -6.0000e+01 -5.4407e+01 -5.4823e+01 -6.2880e+01 -6.0000e+01 -5.4394e+01 -5.4843e+01 -6.2828e+01 -6.0000e+01 -5.4382e+01 -5.4863e+01 -6.2775e+01 -6.0000e+01 -5.4370e+01 -5.4878e+01 -6.2722e+01 -6.0000e+01 -5.4358e+01 -5.4889e+01 -6.2669e+01 -6.0000e+01 -5.4346e+01 -5.4899e+01 -6.2617e+01 -6.0000e+01 -5.4334e+01 -5.4910e+01 -6.2565e+01 -6.0000e+01 -5.4322e+01 -5.4920e+01 -6.2513e+01 -6.0000e+01 -5.4310e+01 -5.4930e+01 -6.2462e+01 -6.0000e+01 -5.4298e+01 -5.4940e+01 -6.2411e+01 -6.0000e+01 -5.4287e+01 -5.4949e+01 -6.2360e+01 -6.0000e+01 -5.4275e+01 -5.4958e+01 -6.2310e+01 -6.0000e+01 -5.4263e+01 -5.4967e+01 -6.2259e+01 -6.0000e+01 -5.4252e+01 -5.4975e+01 -6.2209e+01 -6.0000e+01 -5.4240e+01 -5.4983e+01 -6.2160e+01 -6.0000e+01 -5.4229e+01 -5.4991e+01 -6.2110e+01 -6.0000e+01 -5.4217e+01 -5.4999e+01 -6.2061e+01 -6.0000e+01 -5.4206e+01 -5.5006e+01 -6.2012e+01 -6.0000e+01 -5.4194e+01 -5.5013e+01 -6.1964e+01 -5.9986e+01 -5.4183e+01 -5.5016e+01 -6.1915e+01 -5.9957e+01 -5.4174e+01 -5.5014e+01 -6.1867e+01 -5.9927e+01 -5.4208e+01 -5.5013e+01 -6.1819e+01 -5.9898e+01 -5.4240e+01 -5.5011e+01 -6.1764e+01 -5.9869e+01 -5.4272e+01 -5.5010e+01 -6.1709e+01 -5.9840e+01 -5.4304e+01 -5.5008e+01 -6.1654e+01 -5.9810e+01 -5.4334e+01 -5.5006e+01 -6.1600e+01 -5.9781e+01 -5.4365e+01 -5.5004e+01 -6.1546e+01 -5.9745e+01 -5.4394e+01 -5.5002e+01 -6.1492e+01 -5.9708e+01 -5.4423e+01 -5.5000e+01 -6.1439e+01 -5.9672e+01 -5.4451e+01 -5.4998e+01 -6.1386e+01 -5.9633e+01 -5.4479e+01 -5.4996e+01 -6.1334e+01 -5.9589e+01 -5.4506e+01 -5.4986e+01 -6.1281e+01 -5.9545e+01 -5.4525e+01 -5.4976e+01 -6.1230e+01 -5.9501e+01 -5.4543e+01 -5.4966e+01 -6.1178e+01 -5.9458e+01 -5.4561e+01 -5.4955e+01 -6.1127e+01 -5.9415e+01 -5.4578e+01 -5.4945e+01 -6.1077e+01 -5.9373e+01 -5.4594e+01 -5.4936e+01 -6.1026e+01 -5.9331e+01 -5.4603e+01 -5.4926e+01 -6.0976e+01 -5.9289e+01 -5.4611e+01 -5.4932e+01 -6.0926e+01 -5.9237e+01 -5.4619e+01 -5.4942e+01 -6.0877e+01 -5.9180e+01 -5.4627e+01 -5.4953e+01 -6.0828e+01 -5.9124e+01 -5.4635e+01 -5.4964e+01 -6.0779e+01 -5.9068e+01 -5.4643e+01 -5.4975e+01 -6.0731e+01 -5.9014e+01 -5.4651e+01 -5.4985e+01 -6.0683e+01 -5.8959e+01 -5.4658e+01 -5.4996e+01 -6.0635e+01 -5.8906e+01 -5.4665e+01 -5.5007e+01 -6.0587e+01 -5.8853e+01 -5.4672e+01 -5.5017e+01 -6.0540e+01 -5.8801e+01 -5.4679e+01 -5.5028e+01 -6.0493e+01 -5.8750e+01 -5.4685e+01 -5.5038e+01 -6.0446e+01 -5.8699e+01 -5.4692e+01 -5.5048e+01 -6.0399e+01 -5.8648e+01 -5.4698e+01 -5.5058e+01 -6.0353e+01 -5.8599e+01 -5.4704e+01 -5.5069e+01 -6.0307e+01 -5.8549e+01 -5.4710e+01 -5.5079e+01 -6.0261e+01 -5.8501e+01 -5.4715e+01 -5.5088e+01 -6.0216e+01 -5.8453e+01 -5.4721e+01 -5.5098e+01 -6.0171e+01 -5.8405e+01 -5.4726e+01 -5.5108e+01 -6.0126e+01 -5.8358e+01 -5.4731e+01 -5.5117e+01 -6.0081e+01 -5.8311e+01 -5.4736e+01 -5.5127e+01 -6.0036e+01 -5.8265e+01 -5.4740e+01 -5.5136e+01 -5.9992e+01 -5.8220e+01 -5.4744e+01 -5.5145e+01 -5.9948e+01 -5.8169e+01 -5.4749e+01 -5.5154e+01 -5.9904e+01 -5.8117e+01 -5.4753e+01 -5.5163e+01 -5.9861e+01 -5.8060e+01 -5.4756e+01 -5.5171e+01 -5.9817e+01 -5.8001e+01 -5.4760e+01 -5.5180e+01 -5.9774e+01 -5.7943e+01 -5.4763e+01 -5.5188e+01 -5.9731e+01 -5.7885e+01 -5.4766e+01 -5.5196e+01 -5.9688e+01 -5.7829e+01 -5.4769e+01 -5.5204e+01 -5.9646e+01 -5.7773e+01 -5.4772e+01 -5.5241e+01 -5.9596e+01 -5.7718e+01 -5.4775e+01 -5.5285e+01 -5.9569e+01 -5.7663e+01 -5.4777e+01 -5.5328e+01 -5.9564e+01 -5.7609e+01 -5.4779e+01 -5.5371e+01 -5.9558e+01 -5.7556e+01 -5.4781e+01 -5.5413e+01 -5.9581e+01 -5.7504e+01 -5.4783e+01 -5.5454e+01 -5.9619e+01 -5.7452e+01 -5.4784e+01 -5.5495e+01 -5.9657e+01 -5.7401e+01 -5.4786e+01 -5.5535e+01 -5.9693e+01 -5.7351e+01 -5.4787e+01 -5.5582e+01 -5.9728e+01 -5.7301e+01 -5.4788e+01 -5.5658e+01 -5.9763e+01 -5.7252e+01 -5.4789e+01 -5.5732e+01 -5.9796e+01 -5.7204e+01 -5.4789e+01 -5.5805e+01 -5.9829e+01 -5.7153e+01 -5.4790e+01 -5.5877e+01 -5.9861e+01 -5.7097e+01 -5.4790e+01 -5.5948e+01 -5.9892e+01 -5.7043e+01 -5.4790e+01 -5.6018e+01 -5.9922e+01 -5.6989e+01 -5.4790e+01 -5.6087e+01 -5.9951e+01 -5.6936e+01 -5.4789e+01 -5.6155e+01 -5.9979e+01 -5.6884e+01 -5.4789e+01 -5.6222e+01 -6.0006e+01 -5.6833e+01 -5.4788e+01 -5.6287e+01 -6.0033e+01 -5.6782e+01 -5.4787e+01 -5.6352e+01 -6.0059e+01 -5.6732e+01 -5.4786e+01 -5.6416e+01 -6.0084e+01 -5.6683e+01 -5.4784e+01 -5.6478e+01 -6.0108e+01 -5.6634e+01 -5.4783e+01 -5.6540e+01 -6.0131e+01 -5.6586e+01 -5.4781e+01 -5.6600e+01 -6.0154e+01 -5.6538e+01 -5.4779e+01 -5.6660e+01 -6.0176e+01 -5.6491e+01 -5.4777e+01 -5.6718e+01 -6.0197e+01 -5.6445e+01 -5.4775e+01 -5.6776e+01 -6.0217e+01 -5.6399e+01 -5.4772e+01 -5.6832e+01 -6.0237e+01 -5.6354e+01 -5.4770e+01 -5.6888e+01 -6.0256e+01 -5.6310e+01 -5.4767e+01 -5.6943e+01 -6.0274e+01 -5.6266e+01 -5.4764e+01 -5.6996e+01 -6.0291e+01 -5.6222e+01 -5.4761e+01 -5.7049e+01 -6.0308e+01 -5.6179e+01 -5.4758e+01 -5.7101e+01 -6.0323e+01 -5.6137e+01 -5.4754e+01 -5.7151e+01 -6.0339e+01 -5.6095e+01 -5.4751e+01 -5.7201e+01 -6.0353e+01 -5.6054e+01 -5.4747e+01 -5.7250e+01 -6.0367e+01 -5.6013e+01 -5.4743e+01 -5.7298e+01 -6.0380e+01 -5.5973e+01 -5.4739e+01 -5.7345e+01 -6.0392e+01 -5.5933e+01 -5.4734e+01 -5.7391e+01 -6.0404e+01 -5.5893e+01 -5.4730e+01 -5.7436e+01 -6.0415e+01 -5.5854e+01 -5.4725e+01 -5.7481e+01 -6.0426e+01 -5.5816e+01 -5.4720e+01 -5.7524e+01 -6.0435e+01 -5.5778e+01 -5.4715e+01 -5.7567e+01 -6.0445e+01 -5.5740e+01 -5.4710e+01 -5.7608e+01 -6.0453e+01 -5.5703e+01 -5.4705e+01 -5.7649e+01 -6.0461e+01 -5.5666e+01 -5.4700e+01 -5.7689e+01 -6.0468e+01 -5.5630e+01 -5.4694e+01 -5.7728e+01 -6.0475e+01 -5.5594e+01 -5.4688e+01 -5.7786e+01 -6.0481e+01 -5.5558e+01 -5.4683e+01 -5.7860e+01 -6.0487e+01 -5.5523e+01 -5.4677e+01 -5.7933e+01 -6.0492e+01 -5.5488e+01 -5.4670e+01 -5.8004e+01 -6.0496e+01 -5.5453e+01 -5.4664e+01 -5.8074e+01 -6.0500e+01 -5.5419e+01 -5.4651e+01 -5.8142e+01 -6.0503e+01 -5.5385e+01 -5.4635e+01 -5.8210e+01 -6.0506e+01 -5.5352e+01 -5.4610e+01 -5.8276e+01 -6.0508e+01 -5.5319e+01 -5.4580e+01 -5.8341e+01 -6.0509e+01 -5.5286e+01 -5.4551e+01 -5.8405e+01 -6.0510e+01 -5.5253e+01 -5.4522e+01 -5.8467e+01 -6.0511e+01 -5.5221e+01 -5.4493e+01 -5.8528e+01 -6.0511e+01 -5.5189e+01 -5.4465e+01 -5.8589e+01 -6.0510e+01 -5.5158e+01 -5.4437e+01 -5.8648e+01 -6.0509e+01 -5.5127e+01 -5.4409e+01 -5.8705e+01 -6.0507e+01 -5.5096e+01 -5.4382e+01 -5.8762e+01 -6.0505e+01 -5.5065e+01 -5.4355e+01 -5.8817e+01 -6.0503e+01 -5.5035e+01 -5.4329e+01 -5.8872e+01 -6.0500e+01 -5.5005e+01 -5.4303e+01 -5.8924e+01 -6.0496e+01 -5.4975e+01 -5.4277e+01 -5.8968e+01 -6.0492e+01 -5.4945e+01 -5.4252e+01 -5.9011e+01 -6.0488e+01 -5.4949e+01 -5.4227e+01 -5.9053e+01 -6.0483e+01 -5.4964e+01 -5.4202e+01 -5.9095e+01 -6.0478e+01 -5.4979e+01 -5.4178e+01 -5.9135e+01 -6.0483e+01 -5.4993e+01 -5.4154e+01 -5.9175e+01 -6.0521e+01 -5.5007e+01 -5.4130e+01 -5.9214e+01 -6.0553e+01 -5.5021e+01 -5.4107e+01 -5.9252e+01 -6.0581e+01 -5.5034e+01 -5.4083e+01 -5.9289e+01 -6.0608e+01 -5.5047e+01 -5.4061e+01 -5.9325e+01 -6.0635e+01 -5.5059e+01 -5.4038e+01 -5.9360e+01 -6.0660e+01 -5.5071e+01 -5.4016e+01 -5.9395e+01 -6.0685e+01 -5.5083e+01 -5.3993e+01 -5.9429e+01 -6.0709e+01 -5.5094e+01 -5.3972e+01 -5.9462e+01 -6.0732e+01 -5.5105e+01 -5.3950e+01 -5.9494e+01 -6.0754e+01 -5.5115e+01 -5.3929e+01 -5.9525e+01 -6.0776e+01 -5.5125e+01 -5.3907e+01 -5.9555e+01 -6.0796e+01 -5.5135e+01 -5.3886e+01 -5.9585e+01 -6.0816e+01 -5.5145e+01 -5.3866e+01 -5.9614e+01 -6.0835e+01 -5.5154e+01 -5.3845e+01 -5.9642e+01 -6.0854e+01 -5.5162e+01 -5.3825e+01 -5.9669e+01 -6.0871e+01 -5.5171e+01 -5.3805e+01 -5.9696e+01 -6.0888e+01 -5.5179e+01 -5.3785e+01 -5.9721e+01 -6.0904e+01 -5.5184e+01 -5.3766e+01 -5.9746e+01 -6.0919e+01 -5.5183e+01 -5.3746e+01 -5.9771e+01 -6.0934e+01 -5.5182e+01 -5.3727e+01 -5.9794e+01 -6.0948e+01 -5.5181e+01 -5.3708e+01 -5.9817e+01 -6.0961e+01 -5.5180e+01 -5.3689e+01 -5.9839e+01 -6.0973e+01 -5.5179e+01 -5.3670e+01 -5.9860e+01 -6.0985e+01 -5.5178e+01 -5.3652e+01 -5.9881e+01 -6.0996e+01 -5.5176e+01 -5.3633e+01 -5.9901e+01 -6.1006e+01 -5.5174e+01 -5.3615e+01 -5.9920e+01 -6.1016e+01 -5.5173e+01 -5.3597e+01 -5.9938e+01 -6.1025e+01 -5.5171e+01 -5.3579e+01 -5.9956e+01 -6.1033e+01 -5.5169e+01 -5.3561e+01 -5.9973e+01 -6.1041e+01 -5.5166e+01 -5.3544e+01 -5.9990e+01 -6.1048e+01 -5.5164e+01 -5.3526e+01 -6.0006e+01 -6.1054e+01 -5.5161e+01 -5.3509e+01 -6.0021e+01 -6.1060e+01 -5.5159e+01 -5.3492e+01 -6.0035e+01 -6.1065e+01 -5.5156e+01 -5.3475e+01 -6.0049e+01 -6.1069e+01 -5.5153e+01 -5.3458e+01 -6.0062e+01 -6.1073e+01 -5.5150e+01 -5.3441e+01 -6.0075e+01 -6.1077e+01 -5.5146e+01 -5.3424e+01 -6.0087e+01 -6.1079e+01 -5.5143e+01 -5.3408e+01 -6.0098e+01 -6.1082e+01 -5.5139e+01 -5.3391e+01 -6.0109e+01 -6.1083e+01 -5.5135e+01 -5.3375e+01 -6.0119e+01 -6.1084e+01 -5.5132e+01 -5.3359e+01 -6.0128e+01 -6.1085e+01 -5.5127e+01 -5.3343e+01 -6.0137e+01 -6.1085e+01 -5.5123e+01 -5.3327e+01 -6.0139e+01 -6.1084e+01 -5.5119e+01 -5.3311e+01 -6.0138e+01 -6.1083e+01 -5.5114e+01 -5.3295e+01 -6.0138e+01 -6.1081e+01 -5.5110e+01 -5.3280e+01 -6.0137e+01 -6.1079e+01 -5.5105e+01 -5.3264e+01 -6.0136e+01 -6.1092e+01 -5.5100e+01 -5.3249e+01 -6.0134e+01 -6.1133e+01 -5.5095e+01 -5.3226e+01 -6.0132e+01 -6.1173e+01 -5.5090e+01 -5.3203e+01 -6.0130e+01 -6.1212e+01 -5.5085e+01 -5.3180e+01 -6.0127e+01 -6.1250e+01 -5.5079e+01 -5.3157e+01 -6.0124e+01 -6.1286e+01 -5.5073e+01 -5.3135e+01 -6.0120e+01 -6.1322e+01 -5.5067e+01 -5.3113e+01 -6.0117e+01 -6.1356e+01 -5.5053e+01 -5.3092e+01 -6.0112e+01 -6.1389e+01 -5.5039e+01 -5.3070e+01 -6.0108e+01 -6.1422e+01 -5.5026e+01 -5.3049e+01 -6.0103e+01 -6.1453e+01 -5.5010e+01 -5.3028e+01 -6.0098e+01 -6.1483e+01 -5.4988e+01 -5.3007e+01 -6.0092e+01 -6.1512e+01 -5.4967e+01 -5.2987e+01 -6.0086e+01 -6.1540e+01 -5.4946e+01 -5.2966e+01 -6.0080e+01 -6.1567e+01 -5.4925e+01 -5.2946e+01 -6.0073e+01 -6.1593e+01 -5.4904e+01 -5.2927e+01 -6.0066e+01 -6.1618e+01 -5.4884e+01 -5.2907e+01 -6.0059e+01 -6.1642e+01 -5.4864e+01 -5.2888e+01 -6.0052e+01 -6.1666e+01 -5.4843e+01 -5.2868e+01 -6.0044e+01 -6.1688e+01 -5.4824e+01 -5.2849e+01 -6.0035e+01 -6.1709e+01 -5.4804e+01 -5.2831e+01 -6.0027e+01 -6.1730e+01 -5.4777e+01 -5.2812e+01 -6.0018e+01 -6.1749e+01 -5.4750e+01 -5.2794e+01 -6.0009e+01 -6.1768e+01 -5.4723e+01 -5.2775e+01 -5.9999e+01 -6.1785e+01 -5.4697e+01 -5.2757e+01 -5.9990e+01 -6.1802e+01 -5.4671e+01 -5.2739e+01 -5.9979e+01 -6.1818e+01 -5.4645e+01 -5.2722e+01 -5.9969e+01 -6.1833e+01 -5.4620e+01 -5.2704e+01 -5.9958e+01 -6.1848e+01 -5.4595e+01 -5.2687e+01 -5.9947e+01 -6.1861e+01 -5.4576e+01 -5.2670e+01 -5.9936e+01 -6.1874e+01 -5.4596e+01 -5.2653e+01 -5.9925e+01 -6.1886e+01 -5.4616e+01 -5.2636e+01 -5.9913e+01 -6.1897e+01 -5.4635e+01 -5.2619e+01 -5.9901e+01 -6.1907e+01 -5.4654e+01 -5.2603e+01 -5.9888e+01 -6.1917e+01 -5.4673e+01 -5.2586e+01 -5.9875e+01 -6.1926e+01 -5.4691e+01 -5.2570e+01 -5.9863e+01 -6.1934e+01 -5.4709e+01 -5.2554e+01 -5.9849e+01 -6.1941e+01 -5.4727e+01 -5.2538e+01 -5.9836e+01 -6.1947e+01 -5.4745e+01 -5.2522e+01 -5.9822e+01 -6.1946e+01 -5.4761e+01 -5.2506e+01 -5.9808e+01 -6.1944e+01 -5.4778e+01 -5.2491e+01 -5.9794e+01 -6.1940e+01 -5.4794e+01 -5.2475e+01 -5.9779e+01 -6.1928e+01 -5.4810e+01 -5.2460e+01 -5.9765e+01 -6.1916e+01 -5.4826e+01 -5.2445e+01 -5.9750e+01 -6.1904e+01 -5.4841e+01 -5.2430e+01 -5.9728e+01 -6.1891e+01 -5.4856e+01 -5.2415e+01 -5.9705e+01 -6.1879e+01 -5.4870e+01 -5.2400e+01 -5.9681e+01 -6.1865e+01 -5.4884e+01 -5.2385e+01 -5.9658e+01 -6.1852e+01 -5.4898e+01 -5.2371e+01 -5.9635e+01 -6.1838e+01 -5.4912e+01 -5.2356e+01 -5.9611e+01 -6.1824e+01 -5.4925e+01 -5.2342e+01 -5.9587e+01 -6.1810e+01 -5.4938e+01 -5.2327e+01 -5.9564e+01 -6.1796e+01 -5.4950e+01 -5.2308e+01 -5.9540e+01 -6.1781e+01 -5.4962e+01 -5.2284e+01 -5.9516e+01 -6.1766e+01 -5.4974e+01 -5.2255e+01 -5.9493e+01 -6.1750e+01 -5.4985e+01 -5.2226e+01 -5.9469e+01 -6.1735e+01 -5.4996e+01 -5.2197e+01 -5.9445e+01 -6.1719e+01 -5.5007e+01 -5.2169e+01 -5.9421e+01 -6.1703e+01 -5.5017e+01 -5.2141e+01 -5.9397e+01 -6.1686e+01 -5.5027e+01 -5.2114e+01 -5.9373e+01 -6.1670e+01 -5.5037e+01 -5.2087e+01 -5.9349e+01 -6.1653e+01 -5.5047e+01 -5.2061e+01 -5.9325e+01 -6.1635e+01 -5.5056e+01 -5.2035e+01 -5.9301e+01 -6.1618e+01 -5.5064e+01 -5.2009e+01 -5.9277e+01 -6.1600e+01 -5.5073e+01 -5.1976e+01 -5.9252e+01 -6.1582e+01 -5.5081e+01 -5.1943e+01 -5.9228e+01 -6.1576e+01 -5.5089e+01 -5.1911e+01 -5.9204e+01 -6.1602e+01 -5.5096e+01 -5.1880e+01 -5.9179e+01 -6.1627e+01 -5.5104e+01 -5.1849e+01 -5.9155e+01 -6.1644e+01 -5.5110e+01 -5.1819e+01 -5.9130e+01 -6.1660e+01 -5.5117e+01 -5.1789e+01 -5.9106e+01 -6.1674e+01 -5.5123e+01 -5.1760e+01 -5.9081e+01 -6.1689e+01 -5.5129e+01 -5.1731e+01 -5.9057e+01 -6.1702e+01 -5.5135e+01 -5.1703e+01 -5.9032e+01 -6.1715e+01 -5.5140e+01 -5.1675e+01 -5.9031e+01 -6.1727e+01 -5.5145e+01 -5.1645e+01 -5.9042e+01 -6.1739e+01 -5.5150e+01 -5.1606e+01 -5.9053e+01 -6.1749e+01 -5.5155e+01 -5.1564e+01 -5.9064e+01 -6.1760e+01 -5.5159e+01 -5.1523e+01 -5.9074e+01 -6.1769e+01 -5.5163e+01 -5.1483e+01 -5.9083e+01 -6.1778e+01 -5.5166e+01 -5.1443e+01 -5.9092e+01 -6.1787e+01 -5.5170e+01 -5.1405e+01 -5.9101e+01 -6.1786e+01 -5.5173e+01 -5.1367e+01 -5.9101e+01 -6.1786e+01 -5.5176e+01 -5.1330e+01 -5.9100e+01 -6.1785e+01 -5.5178e+01 -5.1293e+01 -5.9100e+01 -6.1783e+01 -5.5180e+01 -5.1258e+01 -5.9099e+01 -6.1781e+01 -5.5182e+01 -5.1223e+01 -5.9098e+01 -6.1779e+01 -5.5184e+01 -5.1188e+01 -5.9096e+01 -6.1776e+01 -5.5186e+01 -5.1155e+01 -5.9095e+01 -6.1773e+01 -5.5187e+01 -5.1122e+01 -5.9093e+01 -6.1769e+01 -5.5180e+01 -5.1090e+01 -5.9091e+01 -6.1766e+01 -5.5173e+01 -5.1058e+01 -5.9088e+01 -6.1761e+01 -5.5166e+01 -5.1027e+01 -5.9085e+01 -6.1756e+01 -5.5159e+01 -5.0997e+01 -5.9082e+01 -6.1751e+01 -5.5151e+01 -5.0967e+01 -5.9079e+01 -6.1746e+01 -5.5144e+01 -5.0938e+01 -5.9070e+01 -6.1740e+01 -5.5137e+01 -5.0909e+01 -5.9058e+01 -6.1734e+01 -5.5129e+01 -5.0881e+01 -5.9046e+01 -6.1727e+01 -5.5122e+01 -5.0854e+01 -5.9034e+01 -6.1720e+01 -5.5114e+01 -5.0827e+01 -5.9022e+01 -6.1713e+01 -5.5106e+01 -5.0801e+01 -5.9010e+01 -6.1705e+01 -5.5098e+01 -5.0775e+01 -5.8998e+01 -6.1697e+01 -5.5091e+01 -5.0749e+01 -5.8985e+01 -6.1689e+01 -5.5083e+01 -5.0725e+01 -5.8973e+01 -6.1680e+01 -5.5075e+01 -5.0700e+01 -5.8960e+01 -6.1671e+01 -5.5067e+01 -5.0676e+01 -5.8948e+01 -6.1661e+01 -5.5058e+01 -5.0653e+01 -5.8935e+01 -6.1651e+01 -5.5050e+01 -5.0628e+01 -5.8922e+01 -6.1641e+01 -5.5042e+01 -5.0598e+01 -5.8909e+01 -6.1630e+01 -5.5034e+01 -5.0568e+01 -5.8896e+01 -6.1619e+01 -5.5025e+01 -5.0539e+01 -5.8883e+01 -6.1608e+01 -5.5017e+01 -5.0510e+01 -5.8869e+01 -6.1597e+01 -5.5008e+01 -5.0482e+01 -5.8856e+01 -6.1585e+01 -5.4999e+01 -5.0455e+01 -5.8842e+01 -6.1572e+01 -5.4991e+01 -5.0428e+01 -5.8829e+01 -6.1560e+01 -5.4982e+01 -5.0402e+01 -5.8815e+01 -6.1547e+01 -5.4973e+01 -5.0376e+01 -5.8801e+01 -6.1534e+01 -5.4964e+01 -5.0351e+01 -5.8787e+01 -6.1520e+01 -5.4955e+01 -5.0326e+01 -5.8773e+01 -6.1506e+01 -5.4946e+01 -5.0302e+01 -5.8758e+01 -6.1492e+01 -5.4936e+01 -5.0279e+01 -5.8744e+01 -6.1478e+01 -5.4927e+01 -5.0256e+01 -5.8730e+01 -6.1463e+01 -5.4918e+01 -5.0233e+01 -5.8715e+01 -6.1448e+01 -5.4908e+01 -5.0211e+01 -5.8700e+01 -6.1432e+01 -5.4899e+01 -5.0189e+01 -5.8685e+01 -6.1417e+01 -5.4889e+01 -5.0166e+01 -5.8670e+01 -6.1401e+01 -5.4880e+01 -5.0137e+01 -5.8655e+01 -6.1384e+01 -5.4870e+01 -5.0109e+01 -5.8640e+01 -6.1368e+01 -5.4860e+01 -5.0082e+01 -5.8625e+01 -6.1351e+01 -5.4850e+01 -5.0055e+01 -5.8609e+01 -6.1334e+01 -5.4840e+01 -5.0029e+01 -5.8593e+01 -6.1317e+01 -5.4830e+01 -5.0003e+01 -5.8578e+01 -6.1299e+01 -5.4820e+01 -1.0000e+01 -5.8562e+01 -6.1281e+01 -5.4803e+01 -6.0000e+01 -5.8546e+01 -6.1263e+01 -5.4785e+01 -6.0000e+01 -5.8530e+01 -6.1244e+01 -5.4767e+01 -6.0000e+01 -5.8514e+01 -6.1226e+01 -5.4749e+01 -6.0000e+01 -5.8497e+01 -6.1207e+01 -5.4731e+01 -6.0000e+01 -5.8481e+01 -6.1188e+01 -5.4714e+01 -6.0000e+01 -5.8464e+01 -6.1168e+01 -5.4696e+01 -6.0000e+01 -5.8447e+01 -6.1149e+01 -5.4675e+01 -6.0000e+01 -5.8431e+01 -6.1129e+01 -5.4650e+01 -6.0000e+01 -5.8409e+01 -6.1108e+01 -5.4625e+01 -6.0000e+01 -5.8384e+01 -6.1088e+01 -5.4600e+01 -6.0000e+01 -5.8359e+01 -6.1067e+01 -5.4576e+01 -6.0000e+01 -5.8334e+01 -6.1047e+01 -5.4552e+01 -6.0000e+01 -5.8309e+01 -6.1025e+01 -5.4528e+01 -6.0000e+01 -5.8276e+01 -6.1004e+01 -5.4504e+01 -6.0000e+01 -5.8244e+01 -6.0983e+01 -5.4474e+01 -6.0000e+01 -5.8212e+01 -6.0961e+01 -5.4443e+01 -6.0000e+01 -5.8180e+01 -6.0939e+01 -5.4413e+01 -6.0000e+01 -5.8148e+01 -6.0917e+01 -5.4383e+01 -6.0000e+01 -5.8117e+01 -6.0894e+01 -5.4353e+01 -6.0000e+01 -5.8086e+01 -6.0872e+01 -5.4324e+01 -6.0000e+01 -5.8055e+01 -6.0849e+01 -5.4295e+01 -6.0000e+01 -5.8024e+01 -6.0826e+01 -5.4266e+01 -6.0000e+01 -5.7994e+01 -6.0803e+01 -5.4238e+01 -6.0000e+01 -5.7964e+01 -6.0779e+01 -5.4211e+01 -6.0000e+01 -5.7933e+01 -6.0756e+01 -5.4183e+01 -6.0000e+01 -5.7904e+01 -6.0732e+01 -5.4156e+01 -6.0000e+01 -5.7874e+01 -6.0708e+01 -5.4129e+01 -6.0000e+01 -5.7844e+01 -6.0684e+01 -5.4103e+01 -6.0000e+01 -5.7815e+01 -6.0660e+01 -5.4071e+01 -6.0000e+01 -5.7786e+01 -6.0635e+01 -5.4038e+01 -6.0000e+01 -5.7757e+01 -6.0611e+01 -5.4005e+01 -6.0000e+01 -5.7728e+01 -6.0586e+01 -5.3972e+01 -6.0000e+01 -5.7699e+01 -6.0561e+01 -5.3940e+01 -6.0000e+01 -5.7671e+01 -6.0536e+01 -5.3909e+01 -6.0000e+01 -5.7643e+01 -6.0511e+01 -5.3878e+01 -6.0000e+01 -5.7613e+01 -6.0485e+01 -5.3847e+01 -6.0000e+01 -5.7577e+01 -6.0460e+01 -5.3817e+01 -6.0000e+01 -5.7541e+01 -6.0445e+01 -5.3787e+01 -6.0000e+01 -5.7506e+01 -6.0463e+01 -5.3758e+01 -6.0000e+01 -5.7471e+01 -6.0481e+01 -5.3729e+01 -6.0000e+01 -5.7436e+01 -6.0498e+01 -5.3700e+01 -6.0000e+01 -5.7402e+01 -6.0514e+01 -5.3672e+01 -6.0000e+01 -5.7367e+01 -6.0530e+01 -5.3645e+01 -6.0000e+01 -5.7334e+01 -6.0544e+01 -5.3617e+01 -6.0000e+01 -5.7300e+01 -6.0558e+01 -5.3591e+01 -6.0000e+01 -5.7267e+01 -6.0571e+01 -5.3564e+01 -6.0000e+01 -5.7234e+01 -6.0584e+01 -5.3538e+01 -6.0000e+01 -5.7201e+01 -6.0596e+01 -5.3507e+01 -6.0000e+01 -5.7169e+01 -6.0607e+01 -5.3473e+01 -5.9924e+01 -5.7137e+01 -6.0617e+01 -5.3441e+01 -5.9838e+01 -5.7105e+01 -6.0626e+01 -5.3408e+01 -5.9754e+01 -5.7073e+01 -6.0635e+01 -5.3377e+01 -5.9669e+01 -5.7042e+01 -6.0643e+01 -5.3345e+01 -5.9579e+01 -5.7011e+01 -6.0643e+01 -5.3314e+01 -5.9490e+01 -5.6980e+01 -6.0642e+01 -5.3284e+01 -5.9402e+01 -5.6949e+01 -6.0641e+01 -5.3254e+01 -5.9315e+01 -5.6919e+01 -6.0639e+01 -5.3225e+01 -5.9230e+01 -5.6888e+01 -6.0636e+01 -5.3196e+01 -5.9145e+01 -5.6858e+01 -6.0634e+01 -5.3167e+01 -5.9062e+01 -5.6828e+01 -6.0631e+01 -5.3139e+01 -5.8998e+01 -5.6799e+01 -6.0627e+01 -5.3112e+01 -5.8961e+01 -5.6769e+01 -6.0657e+01 -5.3084e+01 -5.8925e+01 -5.6740e+01 -6.0691e+01 -5.3058e+01 -5.8889e+01 -5.6711e+01 -6.0722e+01 -5.3031e+01 -5.8853e+01 -5.6682e+01 -6.0751e+01 -5.3005e+01 -5.8818e+01 -5.6653e+01 -6.0780e+01 -5.2979e+01 -5.8783e+01 -5.6625e+01 -6.0809e+01 -5.2954e+01 -5.8748e+01 -5.6596e+01 -6.0865e+01 -5.2929e+01 -5.8720e+01 -5.6562e+01 -6.0936e+01 -5.2904e+01 -5.8723e+01 -5.6526e+01 -6.1005e+01 -5.2880e+01 -5.8725e+01 -5.6491e+01 -6.1072e+01 -5.2856e+01 -5.8721e+01 -5.6456e+01 -6.1139e+01 -5.2833e+01 -5.8715e+01 -5.6421e+01 -6.1203e+01 -5.2809e+01 -5.8710e+01 -5.6386e+01 -6.1267e+01 -5.2786e+01 -5.8704e+01 -5.6352e+01 -6.1329e+01 -5.2763e+01 -5.8698e+01 -5.6318e+01 -6.1389e+01 -5.2732e+01 -5.8692e+01 -5.6285e+01 -6.1448e+01 -5.2702e+01 -5.8687e+01 -5.6251e+01 -6.1506e+01 -5.2673e+01 -5.8681e+01 -5.6241e+01 -6.1563e+01 -5.2644e+01 -5.8675e+01 -5.6240e+01 -6.1618e+01 -5.2616e+01 -5.8669e+01 -5.6235e+01 -6.1671e+01 -5.2588e+01 -5.8663e+01 -5.6231e+01 -6.1724e+01 -5.2560e+01 -5.8657e+01 -5.6227e+01 -6.1775e+01 -5.2533e+01 -5.8651e+01 -5.6222e+01 -6.1825e+01 -5.2507e+01 -5.8645e+01 -5.6218e+01 -6.1873e+01 -5.2481e+01 -5.8639e+01 -5.6214e+01 -6.1921e+01 -5.2455e+01 -5.8633e+01 -5.6209e+01 -6.1967e+01 -5.2429e+01 -5.8627e+01 -5.6205e+01 -6.2012e+01 -5.2404e+01 -5.8621e+01 -5.6201e+01 -6.2055e+01 -5.2380e+01 -5.8614e+01 -5.6196e+01 -6.2098e+01 -5.2355e+01 -5.8608e+01 -5.6192e+01 -6.2139e+01 -5.2332e+01 -5.8601e+01 -5.6188e+01 -6.2179e+01 -5.2308e+01 -5.8594e+01 -5.6183e+01 -6.2218e+01 -5.2285e+01 -5.8623e+01 -5.6179e+01 -6.2256e+01 -5.2262e+01 -5.8660e+01 -5.6174e+01 -6.2293e+01 -5.2240e+01 -5.8696e+01 -5.6169e+01 -6.2326e+01 -5.2217e+01 -5.8732e+01 -5.6165e+01 -6.2352e+01 -5.2196e+01 -5.8767e+01 -5.6158e+01 -6.2378e+01 -5.2174e+01 -5.8801e+01 -5.6145e+01 -6.2402e+01 -5.2153e+01 -5.8835e+01 -5.6133e+01 -6.2440e+01 -5.2132e+01 -5.8867e+01 -5.6120e+01 -6.2508e+01 -5.2111e+01 -5.8899e+01 -5.6108e+01 -6.2574e+01 -5.2091e+01 -5.8931e+01 -5.6096e+01 -6.2638e+01 -5.2071e+01 -5.8961e+01 -5.6083e+01 -6.2701e+01 -5.2051e+01 -5.8991e+01 -5.6071e+01 -6.2763e+01 -5.2032e+01 -5.9020e+01 -5.6059e+01 -6.2823e+01 -5.2012e+01 -5.9049e+01 -5.6047e+01 -6.2881e+01 -5.1994e+01 -5.9076e+01 -5.6036e+01 -6.2938e+01 -5.1975e+01 -5.9103e+01 -5.6024e+01 -6.2994e+01 -5.1956e+01 -5.9129e+01 -5.6012e+01 -6.3048e+01 -5.1938e+01 -5.9155e+01 -5.6001e+01 -6.3101e+01 -5.1920e+01 -5.9180e+01 -5.5989e+01 -6.3153e+01 -5.1903e+01 -5.9204e+01 -5.5978e+01 -6.3203e+01 -5.1885e+01 -5.9227e+01 -5.5966e+01 -6.3252e+01 -5.1868e+01 -5.9250e+01 -5.5955e+01 -6.3299e+01 -5.1889e+01 -5.9272e+01 -5.5943e+01 -6.3346e+01 -5.1917e+01 -5.9294e+01 -5.5932e+01 -6.3391e+01 -5.1944e+01 -5.9315e+01 -5.5921e+01 -6.3434e+01 -5.1970e+01 -5.9335e+01 -5.5909e+01 -6.3477e+01 -5.1996e+01 -5.9354e+01 -5.5898e+01 -6.3518e+01 -5.2021e+01 -5.9373e+01 -5.5887e+01 -6.3558e+01 -5.2046e+01 -5.9392e+01 -5.5876e+01 -6.3597e+01 -5.2071e+01 -5.9409e+01 -5.5865e+01 -6.3634e+01 -5.2095e+01 -5.9426e+01 -5.5853e+01 -6.3662e+01 -5.2119e+01 -5.9443e+01 -5.5842e+01 -6.3689e+01 -5.2142e+01 -5.9458e+01 -5.5831e+01 -6.3716e+01 -5.2165e+01 -5.9473e+01 -5.5820e+01 -6.3741e+01 -5.2188e+01 -5.9488e+01 -5.5809e+01 -6.3766e+01 -5.2210e+01 -5.9502e+01 -5.5797e+01 -6.3789e+01 -5.2232e+01 -5.9515e+01 -5.5786e+01 -6.3812e+01 -5.2253e+01 -5.9522e+01 -5.5775e+01 -6.3834e+01 -5.2274e+01 -5.9526e+01 -5.5764e+01 -6.3855e+01 -5.2294e+01 -5.9530e+01 -5.5753e+01 -6.3874e+01 -5.2314e+01 -5.9534e+01 -5.5741e+01 -6.3893e+01 -5.2334e+01 -5.9537e+01 -5.5730e+01 -6.3912e+01 -5.2353e+01 -5.9540e+01 -5.5719e+01 -6.3929e+01 -5.2372e+01 -5.9542e+01 -5.5707e+01 -6.3945e+01 -5.2391e+01 -5.9544e+01 -5.5696e+01 -6.3961e+01 -5.2409e+01 -5.9546e+01 -5.5685e+01 -6.3974e+01 -5.2427e+01 -5.9547e+01 -5.5673e+01 -6.3980e+01 -5.2444e+01 -5.9548e+01 -5.5662e+01 -6.3980e+01 -5.2461e+01 -5.9543e+01 -5.5650e+01 -6.3977e+01 -5.2478e+01 -5.9535e+01 -5.5639e+01 -6.3973e+01 -5.2495e+01 -5.9527e+01 -5.5627e+01 -6.3985e+01 -5.2511e+01 -5.9520e+01 -5.5616e+01 -6.4025e+01 -5.2526e+01 -5.9511e+01 -5.5604e+01 -6.4064e+01 -5.2541e+01 -5.9503e+01 -5.5592e+01 -6.4102e+01 -5.2556e+01 -5.9495e+01 -5.5581e+01 -6.4138e+01 -5.2571e+01 -5.9486e+01 -5.5569e+01 -6.4174e+01 -5.2585e+01 -5.9477e+01 -5.5557e+01 -6.4209e+01 -5.2599e+01 -5.9468e+01 -5.5545e+01 -6.4242e+01 -5.2613e+01 -5.9459e+01 -5.5533e+01 -6.4275e+01 -5.2626e+01 -5.9449e+01 -5.5522e+01 -6.4306e+01 -5.2639e+01 -5.9440e+01 -5.5510e+01 -6.4337e+01 -5.2652e+01 -5.9430e+01 -5.5498e+01 -6.4367e+01 -5.2664e+01 -5.9420e+01 -5.5486e+01 -6.4395e+01 -5.2676e+01 -5.9410e+01 -5.5473e+01 -6.4423e+01 -5.2687e+01 -5.9400e+01 -5.5461e+01 -6.4449e+01 -5.2699e+01 -5.9389e+01 -5.5449e+01 -6.4475e+01 -5.2710e+01 -5.9379e+01 -5.5433e+01 -6.4500e+01 -5.2718e+01 -5.9368e+01 -5.5413e+01 -6.4524e+01 -5.2720e+01 -5.9357e+01 -5.5393e+01 -6.4546e+01 -5.2723e+01 -5.9346e+01 -5.5373e+01 -6.4568e+01 -5.2725e+01 -5.9334e+01 -5.5353e+01 -6.4589e+01 -5.2727e+01 -5.9323e+01 -5.5333e+01 -6.4609e+01 -5.2729e+01 -5.9311e+01 -5.5314e+01 -6.4628e+01 -5.2731e+01 -5.9299e+01 -5.5294e+01 -6.4647e+01 -5.2733e+01 -5.9287e+01 -5.5275e+01 -6.4664e+01 -5.2735e+01 -5.9275e+01 -5.5252e+01 -6.4681e+01 -5.2737e+01 -5.9262e+01 -5.5225e+01 -6.4696e+01 -5.2738e+01 -5.9249e+01 -5.5227e+01 -6.4711e+01 -5.2740e+01 -5.9236e+01 -5.5237e+01 -6.4725e+01 -5.2741e+01 -5.9223e+01 -5.5246e+01 -6.4738e+01 -5.2742e+01 -5.9210e+01 -5.5256e+01 -6.4750e+01 -5.2743e+01 -5.9197e+01 -5.5265e+01 -6.4774e+01 -5.2744e+01 -5.9183e+01 -5.5275e+01 -6.4829e+01 -5.2745e+01 -5.9169e+01 -5.5284e+01 -6.4883e+01 -5.2746e+01 -5.9156e+01 -5.5293e+01 -6.4935e+01 -5.2747e+01 -5.9141e+01 -5.5301e+01 -6.4986e+01 -5.2747e+01 -5.9127e+01 -5.5310e+01 -6.5035e+01 -5.2740e+01 -5.9113e+01 -5.5318e+01 -6.5077e+01 -5.2733e+01 -5.9098e+01 -5.5326e+01 -6.5116e+01 -5.2725e+01 -5.9083e+01 -5.5334e+01 -6.5153e+01 -5.2718e+01 -5.9068e+01 -5.5342e+01 -6.5190e+01 -5.2706e+01 -5.9053e+01 -5.5349e+01 -6.5225e+01 -5.2691e+01 -5.9038e+01 -5.5357e+01 -6.5259e+01 -5.2676e+01 -5.9022e+01 -5.5364e+01 -6.5292e+01 -5.2662e+01 -5.9007e+01 -5.5371e+01 -6.5324e+01 -5.2647e+01 -5.8991e+01 -5.5377e+01 -6.5354e+01 -5.2633e+01 -5.8975e+01 -5.5384e+01 -6.5384e+01 -5.2619e+01 -5.8959e+01 -5.5390e+01 -6.5413e+01 -5.2606e+01 -5.8942e+01 -5.5396e+01 -6.5440e+01 -5.2593e+01 -5.8926e+01 -5.5402e+01 -6.5467e+01 -5.2579e+01 -5.8909e+01 -5.5407e+01 -6.5492e+01 -5.2567e+01 -5.8893e+01 -5.5413e+01 -6.5516e+01 -5.2554e+01 -5.8876e+01 -5.5418e+01 -6.5540e+01 -5.2541e+01 -5.8859e+01 -5.5423e+01 -6.5562e+01 -5.2529e+01 -5.8841e+01 -5.5427e+01 -6.5583e+01 -5.2517e+01 -5.8824e+01 -5.5432e+01 -6.5604e+01 -5.2505e+01 -5.8802e+01 -5.5436e+01 -6.5623e+01 -5.2493e+01 -5.8768e+01 -5.5440e+01 -6.5641e+01 -5.2481e+01 -5.8735e+01 -5.5440e+01 -6.5659e+01 -5.2468e+01 -5.8702e+01 -5.5436e+01 -6.5675e+01 -5.2449e+01 -5.8669e+01 -5.5426e+01 -6.5691e+01 -5.2430e+01 -5.8636e+01 -5.5414e+01 -6.5705e+01 -5.2411e+01 -5.8604e+01 -5.5402e+01 -6.5719e+01 -5.2393e+01 -5.8572e+01 -5.5390e+01 -6.5732e+01 -5.2375e+01 -5.8540e+01 -5.5378e+01 -6.5743e+01 -5.2357e+01 -5.8508e+01 -5.5366e+01 -6.5754e+01 -5.2340e+01 -5.8476e+01 -5.5355e+01 -6.5765e+01 -5.2323e+01 -5.8445e+01 -5.5344e+01 -6.5774e+01 -5.2306e+01 -5.8414e+01 -5.5332e+01 -6.5782e+01 -5.2290e+01 -5.8383e+01 -5.5321e+01 -6.5790e+01 -5.2274e+01 -5.8352e+01 -5.5310e+01 -6.5796e+01 -5.2258e+01 -5.8321e+01 -5.5299e+01 -6.5802e+01 -5.2242e+01 -5.8291e+01 -5.5288e+01 -6.5807e+01 -5.2227e+01 -5.8261e+01 -5.5278e+01 -6.5811e+01 -5.2212e+01 -5.8230e+01 -5.5267e+01 -6.5815e+01 -5.2197e+01 -5.8200e+01 -5.5249e+01 -6.5817e+01 -5.2183e+01 -5.8171e+01 -5.5230e+01 -6.5819e+01 -5.2168e+01 -5.8141e+01 -5.5212e+01 -6.5820e+01 -5.2154e+01 -5.8111e+01 -5.5194e+01 -6.5821e+01 -5.2140e+01 -5.8082e+01 -5.5177e+01 -6.5820e+01 -5.2126e+01 -5.8053e+01 -5.5160e+01 -6.5819e+01 -5.2113e+01 -5.8024e+01 -5.5143e+01 -6.5817e+01 -5.2099e+01 -5.7995e+01 -5.5126e+01 -6.5815e+01 -5.2127e+01 -5.7966e+01 -5.5109e+01 -6.5811e+01 -5.2158e+01 -5.7937e+01 -5.5093e+01 -6.5807e+01 -5.2189e+01 -5.7908e+01 -5.5087e+01 -6.5803e+01 -5.2219e+01 -5.7880e+01 -5.5107e+01 -6.5797e+01 -5.2249e+01 -5.7851e+01 -5.5127e+01 -6.5791e+01 -5.2278e+01 -5.7823e+01 -5.5147e+01 -6.5784e+01 -5.2324e+01 -5.7795e+01 -5.5167e+01 -6.5777e+01 -5.2397e+01 -5.7767e+01 -5.5186e+01 -6.5769e+01 -5.2468e+01 -5.7739e+01 -5.5205e+01 -6.5760e+01 -5.2539e+01 -5.7711e+01 -5.5224e+01 -6.5751e+01 -5.2608e+01 -5.7683e+01 -5.5242e+01 -6.5741e+01 -5.2677e+01 -5.7655e+01 -5.5260e+01 -6.5730e+01 -5.2744e+01 -5.7628e+01 -5.5278e+01 -6.5719e+01 -5.2810e+01 -5.7600e+01 -5.5296e+01 -6.5707e+01 -5.2875e+01 -5.7573e+01 -5.5313e+01 -6.5695e+01 -5.2935e+01 -5.7546e+01 -5.5330e+01 -6.5682e+01 -5.2990e+01 -5.7518e+01 -5.5346e+01 -6.5668e+01 -5.3044e+01 -5.7491e+01 -5.5362e+01 -6.5654e+01 -5.3098e+01 -5.7464e+01 -5.5378e+01 -6.5640e+01 -5.3150e+01 -5.7437e+01 -5.5394e+01 -6.5625e+01 -5.3202e+01 -5.7410e+01 -5.5409e+01 -6.5609e+01 -5.3253e+01 -5.7383e+01 -5.5424e+01 -6.5592e+01 -5.3303e+01 -5.7357e+01 -5.5439e+01 -6.5576e+01 -5.3353e+01 -5.7330e+01 -5.5453e+01 -6.5558e+01 -5.3397e+01 -5.7303e+01 -5.5467e+01 -6.5541e+01 -5.3437e+01 -5.7277e+01 -5.5481e+01 -6.5522e+01 -5.3477e+01 -5.7250e+01 -5.5495e+01 -6.5503e+01 -5.3515e+01 -5.7224e+01 -5.5508e+01 -6.5484e+01 -5.3554e+01 -5.7198e+01 -5.5520e+01 -6.5464e+01 -5.3591e+01 -5.7171e+01 -5.5533e+01 -6.5444e+01 -5.3628e+01 -5.7145e+01 -5.5545e+01 -6.5423e+01 -5.3665e+01 -5.7119e+01 -5.5557e+01 -6.5402e+01 -5.3700e+01 -5.7093e+01 -5.5568e+01 -6.5380e+01 -5.3736e+01 -5.7067e+01 -5.5580e+01 -6.5358e+01 -5.3771e+01 -5.7041e+01 -5.5590e+01 -6.5336e+01 -5.3805e+01 -5.7015e+01 -5.5601e+01 -6.5305e+01 -5.3838e+01 -5.6989e+01 -5.5611e+01 -6.5274e+01 -5.3871e+01 -5.6963e+01 -5.5621e+01 -6.5243e+01 -5.3904e+01 -5.6937e+01 -5.5631e+01 -6.5211e+01 -5.3936e+01 -5.6912e+01 -5.5640e+01 -6.5179e+01 -5.3967e+01 -5.6886e+01 -5.5649e+01 -6.5147e+01 -5.3998e+01 -5.6860e+01 -5.5658e+01 -6.5115e+01 -5.4029e+01 -5.6835e+01 -5.5666e+01 -6.5082e+01 -5.4059e+01 -5.6809e+01 -5.5674e+01 -6.5049e+01 -5.4088e+01 -5.6784e+01 -5.5682e+01 -6.5050e+01 -5.4117e+01 -5.6759e+01 -5.5689e+01 -6.5061e+01 -5.4141e+01 -5.6733e+01 -5.5697e+01 -6.5071e+01 -5.4161e+01 -5.6708e+01 -5.5703e+01 -6.5080e+01 -5.4180e+01 -5.6683e+01 -5.5710e+01 -6.5089e+01 -5.4199e+01 -5.6657e+01 -5.5716e+01 -6.5096e+01 -5.4218e+01 -5.6632e+01 -5.5722e+01 -6.5103e+01 -5.4237e+01 -5.6607e+01 -5.5728e+01 -6.5109e+01 -5.4255e+01 -5.6582e+01 -5.5733e+01 -6.5114e+01 -5.4273e+01 -5.6557e+01 -5.5738e+01 -6.5119e+01 -5.4290e+01 -5.6532e+01 -5.5743e+01 -6.5122e+01 -5.4308e+01 -5.6507e+01 -5.5748e+01 -6.5125e+01 -5.4324e+01 -5.6482e+01 -5.5752e+01 -6.5127e+01 -5.4341e+01 -5.6458e+01 -5.5756e+01 -6.5128e+01 -5.4357e+01 -5.6433e+01 -5.5759e+01 -6.5129e+01 -5.4373e+01 -5.6408e+01 -5.5763e+01 -6.5129e+01 -5.4389e+01 -5.6383e+01 -5.5766e+01 -6.5128e+01 -5.4404e+01 -5.6359e+01 -5.5769e+01 -6.5126e+01 -5.4419e+01 -5.6334e+01 -5.5771e+01 -6.5124e+01 -5.4434e+01 -5.6309e+01 -5.5773e+01 -6.5121e+01 -5.4448e+01 -5.6285e+01 -5.5775e+01 -6.5117e+01 -5.4462e+01 -5.6260e+01 -5.5777e+01 -6.5113e+01 -5.4476e+01 -5.6236e+01 -5.5779e+01 -6.5108e+01 -5.4489e+01 -5.6212e+01 -5.5780e+01 -6.5102e+01 -5.4502e+01 -5.6187e+01 -5.5781e+01 -6.5096e+01 -5.4515e+01 -5.6163e+01 -5.5781e+01 -6.5089e+01 -5.4527e+01 -5.6139e+01 -5.5782e+01 -6.5081e+01 -5.4539e+01 -5.6114e+01 -5.5821e+01 -6.5115e+01 -5.4551e+01 -5.6090e+01 -5.5857e+01 -6.5150e+01 -5.4562e+01 -5.6066e+01 -5.5892e+01 -6.5184e+01 -5.4568e+01 -5.6042e+01 -5.5927e+01 -6.5216e+01 -5.4571e+01 -5.6018e+01 -5.5961e+01 -6.5248e+01 -5.4574e+01 -5.5994e+01 -5.5994e+01 -6.5278e+01 -5.4577e+01 -5.5970e+01 -5.6026e+01 -6.5307e+01 -5.4579e+01 -5.5946e+01 -5.6058e+01 -6.5335e+01 -5.4580e+01 -5.5922e+01 -5.6089e+01 -6.5361e+01 -5.4575e+01 -5.5898e+01 -5.6119e+01 -6.5387e+01 -5.4564e+01 -5.5874e+01 -5.6149e+01 -6.5411e+01 -5.4542e+01 -5.5850e+01 -5.6178e+01 -6.5434e+01 -5.4522e+01 -5.5827e+01 -5.6207e+01 -6.5456e+01 -5.4501e+01 -5.5803e+01 -5.6234e+01 -6.5477e+01 -5.4481e+01 -5.5779e+01 -5.6262e+01 -6.5497e+01 -5.4462e+01 -5.5756e+01 -5.6286e+01 -6.5516e+01 -5.4442e+01 -5.5732e+01 -5.6304e+01 -6.5534e+01 -5.4424e+01 -5.5709e+01 -5.6321e+01 -6.5551e+01 -5.4405e+01 -5.5685e+01 -5.6330e+01 -6.5566e+01 -5.4387e+01 -5.5662e+01 -5.6339e+01 -6.5581e+01 -5.4369e+01 -5.5638e+01 -5.6347e+01 -6.5595e+01 -5.4352e+01 -5.5615e+01 -5.6355e+01 -6.5607e+01 -5.4335e+01 -5.5592e+01 -5.6364e+01 -6.5619e+01 -5.4313e+01 -5.5568e+01 -5.6371e+01 -6.5630e+01 -5.4288e+01 -5.5545e+01 -5.6379e+01 -6.5640e+01 -5.4265e+01 -5.5522e+01 -5.6386e+01 -6.5649e+01 -5.4241e+01 -5.5499e+01 -5.6394e+01 -6.5656e+01 -5.4219e+01 -5.5475e+01 -5.6401e+01 -6.5663e+01 -5.4208e+01 -5.5452e+01 -5.6407e+01 -6.5670e+01 -5.4231e+01 -5.5429e+01 -5.6414e+01 -6.5675e+01 -5.4253e+01 -5.5406e+01 -5.6420e+01 -6.5679e+01 -5.4275e+01 -5.5383e+01 -5.6426e+01 -6.5683e+01 -5.4297e+01 -5.5360e+01 -5.6431e+01 -6.5685e+01 -5.4319e+01 -5.5338e+01 -5.6437e+01 -6.5687e+01 -5.4340e+01 -5.5315e+01 -5.6437e+01 -6.5688e+01 -5.4357e+01 -5.5292e+01 -5.6435e+01 -6.5688e+01 -5.4370e+01 -5.5269e+01 -5.6431e+01 -6.5688e+01 -5.4383e+01 -5.5247e+01 -5.6428e+01 -6.5686e+01 -5.4395e+01 -5.5224e+01 -5.6425e+01 -6.5684e+01 -5.4408e+01 -5.5198e+01 -5.6422e+01 -6.5681e+01 -5.4421e+01 -5.5168e+01 -5.6419e+01 -6.5678e+01 -5.4433e+01 -5.5138e+01 -5.6415e+01 -6.5673e+01 -5.4446e+01 -5.5108e+01 -5.6412e+01 -6.5668e+01 -5.4458e+01 -5.5078e+01 -5.6408e+01 -6.5662e+01 -5.4470e+01 -5.5048e+01 -5.6405e+01 -6.5655e+01 -5.4482e+01 -5.5019e+01 -5.6401e+01 -6.5648e+01 -5.4494e+01 -5.4990e+01 -5.6397e+01 -6.5640e+01 -5.4506e+01 -5.4961e+01 -5.6393e+01 -6.5631e+01 -5.4518e+01 -5.4932e+01 -5.6389e+01 -6.5622e+01 -5.4529e+01 -5.4904e+01 -5.6385e+01 -6.5612e+01 -5.4541e+01 -5.4874e+01 -5.6381e+01 -6.5601e+01 -5.4552e+01 -5.4838e+01 -5.6377e+01 -6.5590e+01 -5.4563e+01 -5.4803e+01 -5.6372e+01 -6.5578e+01 -5.4574e+01 -5.4768e+01 -5.6368e+01 -6.5565e+01 -5.4585e+01 -5.4733e+01 -5.6363e+01 -6.5552e+01 -5.4595e+01 -5.4698e+01 -5.6358e+01 -6.5538e+01 -5.4598e+01 -5.4664e+01 -5.6353e+01 -6.5524e+01 -5.4600e+01 -5.4630e+01 -5.6348e+01 -6.5509e+01 -5.4600e+01 -5.4597e+01 -5.6343e+01 -6.5493e+01 -5.4595e+01 -5.4564e+01 -5.6338e+01 -6.5477e+01 -5.4589e+01 -5.4531e+01 -5.6325e+01 -6.5460e+01 -5.4584e+01 -5.4499e+01 -5.6312e+01 -6.5440e+01 -5.4579e+01 -5.4467e+01 -5.6299e+01 -6.5436e+01 -5.4575e+01 -5.4435e+01 -5.6286e+01 -6.5446e+01 -5.4570e+01 -5.4404e+01 -5.6273e+01 -6.5456e+01 -5.4566e+01 -5.4373e+01 -5.6260e+01 -6.5464e+01 -5.4562e+01 -5.4342e+01 -5.6247e+01 -6.5472e+01 -5.4557e+01 -5.4312e+01 -5.6234e+01 -6.5480e+01 -5.4553e+01 -5.4282e+01 -5.6221e+01 -6.5486e+01 -5.4550e+01 -5.4252e+01 -5.6208e+01 -6.5492e+01 -5.4540e+01 -5.4223e+01 -5.6195e+01 -6.5497e+01 -5.4529e+01 -5.4193e+01 -5.6182e+01 -6.5501e+01 -5.4518e+01 -5.4164e+01 -5.6170e+01 -6.5504e+01 -5.4507e+01 -5.4136e+01 -5.6157e+01 -6.5507e+01 -5.4495e+01 -5.4107e+01 -5.6144e+01 -6.5509e+01 -5.4476e+01 -5.4079e+01 -5.6132e+01 -6.5510e+01 -5.4458e+01 -5.4051e+01 -5.6119e+01 -6.5511e+01 -5.4432e+01 -5.4024e+01 -5.6106e+01 -6.5511e+01 -5.4407e+01 -5.3996e+01 -5.6094e+01 -6.5510e+01 -5.4383e+01 -5.3969e+01 -5.6081e+01 -6.5508e+01 -5.4359e+01 -5.3942e+01 -5.6068e+01 -6.5506e+01 -5.4336e+01 -5.3916e+01 -5.6056e+01 -6.5503e+01 -5.4313e+01 -5.3889e+01 -5.6043e+01 -6.5500e+01 -5.4291e+01 -5.3863e+01 -5.6030e+01 -6.5496e+01 -5.4270e+01 -5.3837e+01 -5.6018e+01 -6.5491e+01 -5.4248e+01 -5.3812e+01 -5.6005e+01 -6.5485e+01 -5.4228e+01 -5.3786e+01 -5.5992e+01 -6.5479e+01 -5.4208e+01 -5.3758e+01 -5.5980e+01 -6.5473e+01 -5.4188e+01 -5.3725e+01 -5.5967e+01 -6.5466e+01 -5.4169e+01 -5.3692e+01 -5.5954e+01 -6.5458e+01 -5.4150e+01 -5.3660e+01 -5.5935e+01 -6.5449e+01 -5.4131e+01 -5.3628e+01 -5.5915e+01 -6.5440e+01 -5.4113e+01 -5.3597e+01 -5.5894e+01 -6.5430e+01 -5.4096e+01 -5.3566e+01 -5.5874e+01 -6.5420e+01 -5.4078e+01 -5.3535e+01 -5.5854e+01 -6.5409e+01 -5.4061e+01 -5.3505e+01 -5.5834e+01 -6.5398e+01 -5.4045e+01 -5.3475e+01 -5.5814e+01 -6.5386e+01 -5.4029e+01 -5.3446e+01 -5.5794e+01 -6.5374e+01 -5.4013e+01 -5.3416e+01 -5.5775e+01 -6.5361e+01 -5.3997e+01 -5.3387e+01 -5.5755e+01 -6.5347e+01 -5.3982e+01 -5.3359e+01 -5.5736e+01 -6.5333e+01 -5.3967e+01 -5.3331e+01 -5.5717e+01 -6.5319e+01 -5.3952e+01 -5.3303e+01 -5.5698e+01 -6.5303e+01 -5.3938e+01 -5.3275e+01 -5.5679e+01 -6.5288e+01 -5.3924e+01 -5.3248e+01 -5.5660e+01 -6.5272e+01 -5.3910e+01 -5.3221e+01 -5.5642e+01 -6.5255e+01 -5.3896e+01 -5.3194e+01 -5.5623e+01 -6.5238e+01 -5.3883e+01 -5.3168e+01 -5.5605e+01 -6.5221e+01 -5.3869e+01 -5.3142e+01 -5.5586e+01 -6.5202e+01 -5.3856e+01 -5.3116e+01 -5.5568e+01 -6.5184e+01 -5.3844e+01 -5.3091e+01 -5.5550e+01 -6.5165e+01 -5.3831e+01 -5.3062e+01 -5.5532e+01 -6.5146e+01 -5.3819e+01 -5.3029e+01 -5.5508e+01 -6.5126e+01 -5.3807e+01 -5.2997e+01 -5.5477e+01 -6.5105e+01 -5.3795e+01 -5.2965e+01 -5.5444e+01 -6.5085e+01 -5.3783e+01 -5.2933e+01 -5.5411e+01 -6.5064e+01 -5.3771e+01 -5.2902e+01 -5.5378e+01 -6.5042e+01 -5.3760e+01 -5.2872e+01 -5.5346e+01 -6.5020e+01 -5.3749e+01 -5.2841e+01 -5.5315e+01 -6.4998e+01 -5.3738e+01 -5.2811e+01 -5.5278e+01 -6.4975e+01 -5.3727e+01 -5.2782e+01 -5.5239e+01 -6.4952e+01 -5.3716e+01 -5.2753e+01 -5.5201e+01 -6.4928e+01 -5.3705e+01 -5.2724e+01 -5.5164e+01 -6.4904e+01 -5.3695e+01 -5.2696e+01 -5.5127e+01 -6.4880e+01 -5.3684e+01 -5.2668e+01 -5.5090e+01 -6.4855e+01 -5.3674e+01 -5.2641e+01 -5.5055e+01 -6.4830e+01 -5.3664e+01 -5.2614e+01 -5.5019e+01 -6.4804e+01 -5.3654e+01 -5.2587e+01 -5.4985e+01 -6.4779e+01 -5.3644e+01 -5.2560e+01 -5.4950e+01 -6.4752e+01 -5.3634e+01 -5.2552e+01 -5.4917e+01 -6.4726e+01 -5.3624e+01 -5.2570e+01 -5.4884e+01 -6.4699e+01 -5.3614e+01 -5.2589e+01 -5.4851e+01 -6.4672e+01 -5.3604e+01 -5.2607e+01 -5.4818e+01 -6.4644e+01 -5.3595e+01 -5.2624e+01 -5.4787e+01 -6.4616e+01 -5.3585e+01 -5.2642e+01 -5.4755e+01 -6.4588e+01 -5.3576e+01 -5.2659e+01 -5.4724e+01 -6.4560e+01 -5.3567e+01 -5.2675e+01 -5.4694e+01 -6.4531e+01 -5.3557e+01 -5.2691e+01 -5.4663e+01 -6.4502e+01 -5.3548e+01 -5.2707e+01 -5.4634e+01 -6.4473e+01 -5.3539e+01 -5.2723e+01 -5.4604e+01 -6.4443e+01 -5.3530e+01 -5.2739e+01 -5.4575e+01 -6.4413e+01 -5.3521e+01 -5.2754e+01 -5.4547e+01 -6.4383e+01 -5.3512e+01 -5.2768e+01 -5.4519e+01 -6.4352e+01 -5.3500e+01 -5.2783e+01 -5.4491e+01 -6.4321e+01 -5.3476e+01 -5.2797e+01 -5.4463e+01 -6.4290e+01 -5.3451e+01 -5.2811e+01 -5.4436e+01 -6.4289e+01 -5.3427e+01 -5.2824e+01 -5.4409e+01 -6.4302e+01 -5.3404e+01 -5.2837e+01 -5.4383e+01 -6.4314e+01 -5.3381e+01 -5.2850e+01 -5.4357e+01 -6.4324e+01 -5.3358e+01 -5.2863e+01 -5.4331e+01 -6.4334e+01 -5.3336e+01 -5.2875e+01 -5.4305e+01 -6.4343e+01 -5.3314e+01 -5.2887e+01 -5.4280e+01 -6.4352e+01 -5.3292e+01 -5.2899e+01 -5.4255e+01 -6.4359e+01 -5.3271e+01 -5.2910e+01 -5.4230e+01 -6.4365e+01 -5.3250e+01 -5.2921e+01 -5.4206e+01 -6.4371e+01 -5.3229e+01 -5.2932e+01 -5.4182e+01 -6.4376e+01 -5.3209e+01 -5.2943e+01 -5.4158e+01 -6.4380e+01 -5.3189e+01 -5.2953e+01 -5.4134e+01 -6.4383e+01 -5.3169e+01 -5.2963e+01 -5.4111e+01 -6.4385e+01 -5.3150e+01 -5.2973e+01 -5.4088e+01 -6.4387e+01 -5.3131e+01 -5.2982e+01 -5.4065e+01 -6.4388e+01 -5.3112e+01 -5.2991e+01 -5.4042e+01 -6.4388e+01 -5.3094e+01 -5.3000e+01 -5.4020e+01 -6.4388e+01 -5.3076e+01 -5.3009e+01 -5.3998e+01 -6.4386e+01 -5.3058e+01 -5.3017e+01 -5.3976e+01 -6.4384e+01 -5.3040e+01 -5.3025e+01 -5.3954e+01 -6.4381e+01 -5.3022e+01 -5.3033e+01 -5.3932e+01 -6.4378e+01 -5.3005e+01 -5.3041e+01 -5.3911e+01 -6.4374e+01 -5.2988e+01 -5.3048e+01 -5.3890e+01 -6.4369e+01 -5.2972e+01 -5.3055e+01 -5.3869e+01 -6.4364e+01 -5.2955e+01 -5.3062e+01 -5.3848e+01 -6.4357e+01 -5.2939e+01 -5.3069e+01 -5.3828e+01 -6.4351e+01 -5.2923e+01 -5.3075e+01 -5.3807e+01 -6.4343e+01 -5.2907e+01 -5.3081e+01 -5.3787e+01 -6.4335e+01 -5.2891e+01 -5.3087e+01 -5.3767e+01 -6.4326e+01 -5.2876e+01 -5.3092e+01 -5.3747e+01 -6.4317e+01 -5.2861e+01 -5.3098e+01 -5.3728e+01 -6.4307e+01 -5.2846e+01 -5.3103e+01 -5.3708e+01 -6.4297e+01 -5.2831e+01 -5.3105e+01 -5.3689e+01 -6.4286e+01 -5.2813e+01 -5.3102e+01 -5.3670e+01 -6.4274e+01 -5.2790e+01 -5.3098e+01 -5.3651e+01 -6.4262e+01 -5.2768e+01 -5.3095e+01 -5.3632e+01 -6.4249e+01 -5.2747e+01 -5.3092e+01 -5.3613e+01 -6.4235e+01 -5.2725e+01 -5.3088e+01 -5.3595e+01 -6.4222e+01 -5.2704e+01 -5.3126e+01 -5.3576e+01 -6.4202e+01 -5.2683e+01 -5.3166e+01 -5.3558e+01 -6.4179e+01 -5.2663e+01 -5.3206e+01 -5.3540e+01 -6.4156e+01 -5.2643e+01 -5.3245e+01 -5.3522e+01 -6.4133e+01 -5.2623e+01 -5.3284e+01 -5.3504e+01 -6.4109e+01 -5.2604e+01 -5.3322e+01 -5.3486e+01 -6.4085e+01 -5.2585e+01 -5.3359e+01 -5.3469e+01 -6.4060e+01 -5.2566e+01 -5.3395e+01 -5.3451e+01 -6.4036e+01 -5.2547e+01 -5.3431e+01 -5.3434e+01 -6.4011e+01 -5.2529e+01 -5.3466e+01 -5.3422e+01 -6.3985e+01 -5.2511e+01 -5.3501e+01 -5.3442e+01 -6.3960e+01 -5.2493e+01 -5.3534e+01 -5.3460e+01 -6.3934e+01 -5.2476e+01 -5.3567e+01 -5.3471e+01 -6.3908e+01 -5.2458e+01 -5.3592e+01 -5.3482e+01 -6.3881e+01 -5.2441e+01 -5.3616e+01 -5.3492e+01 -6.3855e+01 -5.2424e+01 -5.3640e+01 -5.3502e+01 -6.3828e+01 -5.2408e+01 -5.3663e+01 -5.3512e+01 -6.3801e+01 -5.2391e+01 -5.3686e+01 -5.3522e+01 -6.3773e+01 -5.2375e+01 -5.3708e+01 -5.3532e+01 -6.3745e+01 -5.2359e+01 -5.3730e+01 -5.3542e+01 -6.3718e+01 -5.2344e+01 -5.3752e+01 -5.3551e+01 -6.3689e+01 -5.2328e+01 -5.3773e+01 -5.3560e+01 -6.3661e+01 -5.2313e+01 -5.3794e+01 -5.3569e+01 -6.3632e+01 -5.2298e+01 -5.3814e+01 -5.3578e+01 -6.3603e+01 -5.2283e+01 -5.3834e+01 -5.3587e+01 -6.3574e+01 -5.2268e+01 -5.3854e+01 -5.3596e+01 -6.3545e+01 -5.2253e+01 -5.3873e+01 -5.3604e+01 -6.3515e+01 -5.2239e+01 -5.3892e+01 -5.3612e+01 -6.3485e+01 -5.2225e+01 -5.3910e+01 -5.3620e+01 -6.3455e+01 -5.2211e+01 -5.3928e+01 -5.3628e+01 -6.3425e+01 -5.2197e+01 -5.3946e+01 -5.3636e+01 -6.3394e+01 -5.2183e+01 -5.3963e+01 -5.3643e+01 -6.3363e+01 -5.2169e+01 -5.3980e+01 -5.3650e+01 -6.3332e+01 -5.2156e+01 -5.3996e+01 -5.3649e+01 -6.3301e+01 -5.2143e+01 -5.4012e+01 -5.3648e+01 -6.3270e+01 -5.2130e+01 -5.4028e+01 -5.3654e+01 -6.3239e+01 -5.2117e+01 -5.4043e+01 -5.3689e+01 -6.3207e+01 -5.2104e+01 -5.4058e+01 -5.3725e+01 -6.3175e+01 -5.2091e+01 -5.4072e+01 -5.3759e+01 -6.3143e+01 -5.2078e+01 -5.4087e+01 -5.3794e+01 -6.3111e+01 -5.2066e+01 -5.4100e+01 -5.3827e+01 -6.3078e+01 -5.2054e+01 -5.4114e+01 -5.3861e+01 -6.3046e+01 -5.2041e+01 -5.4127e+01 -5.3894e+01 -6.3013e+01 -5.2029e+01 -5.4140e+01 -5.3926e+01 -6.2980e+01 -5.2017e+01 -5.4152e+01 -5.3958e+01 -6.2947e+01 -5.2005e+01 -5.4164e+01 -5.3989e+01 -6.2913e+01 -5.1994e+01 -5.4176e+01 -5.4020e+01 -6.2880e+01 -5.1982e+01 -5.4187e+01 -5.4051e+01 -6.2846e+01 -5.1970e+01 -5.4198e+01 -5.4073e+01 -6.2813e+01 -5.1959e+01 -5.4209e+01 -5.4091e+01 -6.2779e+01 -5.1948e+01 -5.4218e+01 -5.4105e+01 -6.2745e+01 -5.1936e+01 -5.4220e+01 -5.4118e+01 -6.2711e+01 -5.1925e+01 -5.4222e+01 -5.4132e+01 -6.2676e+01 -5.1914e+01 -5.4224e+01 -5.4145e+01 -6.2642e+01 -5.1903e+01 -5.4225e+01 -5.4158e+01 -6.2607e+01 -5.1892e+01 -5.4227e+01 -5.4171e+01 -6.2573e+01 -5.1881e+01 -5.4228e+01 -5.4178e+01 -6.2538e+01 -5.1871e+01 -5.4229e+01 -5.4183e+01 -6.2503e+01 -5.1860e+01 -5.4230e+01 -5.4183e+01 -6.2468e+01 -5.1850e+01 -5.4231e+01 -5.4180e+01 -6.2433e+01 -5.1839e+01 -5.4232e+01 -5.4178e+01 -6.2397e+01 -5.1829e+01 -5.4233e+01 -5.4176e+01 -6.2362e+01 -5.1818e+01 -5.4248e+01 -5.4174e+01 -6.2326e+01 -5.1808e+01 -5.4292e+01 -5.4172e+01 -6.2291e+01 -5.1798e+01 -5.4330e+01 -5.4170e+01 -6.2255e+01 -5.1788e+01 -5.4366e+01 -5.4169e+01 -6.2219e+01 -5.1778e+01 -5.4401e+01 -5.4167e+01 -6.2181e+01 -5.1768e+01 -5.4435e+01 -5.4166e+01 -6.2137e+01 -5.1758e+01 -5.4468e+01 -5.4165e+01 -6.2093e+01 -5.1748e+01 -5.4501e+01 -5.4165e+01 -6.2050e+01 -5.1738e+01 -5.4534e+01 -5.4164e+01 -6.2006e+01 -5.1728e+01 -5.4565e+01 -5.4164e+01 -6.1962e+01 -5.1719e+01 -5.4597e+01 -5.4163e+01 -6.1919e+01 -5.1709e+01 -5.4627e+01 -5.4163e+01 -6.1896e+01 -5.1736e+01 -5.4657e+01 -5.4163e+01 -6.1897e+01 -5.1770e+01 -5.4687e+01 -5.4163e+01 -6.1898e+01 -5.1804e+01 -5.4716e+01 -5.4163e+01 -6.1898e+01 -5.1838e+01 -5.4737e+01 -5.4163e+01 -6.1897e+01 -5.1870e+01 -5.4757e+01 -5.4163e+01 -6.1896e+01 -5.1903e+01 -5.4774e+01 -5.4163e+01 -6.1894e+01 -5.1934e+01 -5.4785e+01 -5.4163e+01 -6.1892e+01 -5.1965e+01 -5.4796e+01 -5.4164e+01 -6.1889e+01 -5.1990e+01 -5.4807e+01 -5.4163e+01 -6.1886e+01 -5.2012e+01 -5.4818e+01 -5.4155e+01 -6.1882e+01 -5.2031e+01 -5.4829e+01 -5.4148e+01 -6.1878e+01 -5.2045e+01 -5.4839e+01 -5.4141e+01 -6.1873e+01 -5.2058e+01 -5.4850e+01 -5.4134e+01 -6.1905e+01 -5.2071e+01 -5.4860e+01 -5.4127e+01 -6.1988e+01 -5.2084e+01 -5.4870e+01 -5.4120e+01 -6.2069e+01 -5.2097e+01 -5.4880e+01 -5.4114e+01 -6.2149e+01 -5.2109e+01 -5.4889e+01 -5.4108e+01 -6.2226e+01 -5.2122e+01 -5.4899e+01 -5.4102e+01 -6.2302e+01 -5.2148e+01 -5.4908e+01 -5.4096e+01 -6.2376e+01 -5.2205e+01 -5.4916e+01 -5.4090e+01 -6.2449e+01 -5.2261e+01 -5.4914e+01 -5.4084e+01 -6.2520e+01 -5.2315e+01 -5.4907e+01 -5.4079e+01 -6.2589e+01 -5.2369e+01 -5.4900e+01 -5.4073e+01 -6.2656e+01 -5.2423e+01 -5.4894e+01 -5.4068e+01 -6.2722e+01 -5.2475e+01 -5.4887e+01 -5.4063e+01 -6.2786e+01 -5.2527e+01 -5.4881e+01 -5.4058e+01 -6.2849e+01 -5.2577e+01 -5.4874e+01 -5.4056e+01 -6.2910e+01 -5.2627e+01 -5.4868e+01 -5.4088e+01 -6.2970e+01 -5.2677e+01 -5.4862e+01 -5.4119e+01 -6.3028e+01 -5.2725e+01 -5.4857e+01 -5.4150e+01 -6.3084e+01 -5.2765e+01 -5.4851e+01 -5.4181e+01 -6.3139e+01 -5.2804e+01 -5.4845e+01 -5.4211e+01 -6.3193e+01 -5.2843e+01 -5.4840e+01 -5.4241e+01 -6.3245e+01 -5.2881e+01 -5.4834e+01 -5.4270e+01 -6.3296e+01 -5.2918e+01 -5.4829e+01 -5.4299e+01 -6.3345e+01 -5.2955e+01 -5.4824e+01 -5.4327e+01 -6.3393e+01 -5.2991e+01 -5.4818e+01 -5.4356e+01 -6.3439e+01 -5.3027e+01 -5.4805e+01 -5.4383e+01 -6.3484e+01 -5.3062e+01 -5.4792e+01 -5.4411e+01 -6.3528e+01 -5.3097e+01 -5.4780e+01 -5.4437e+01 -6.3571e+01 -5.3131e+01 -5.4767e+01 -5.4464e+01 -6.3612e+01 -5.3164e+01 -5.4755e+01 -5.4490e+01 -6.3652e+01 -5.3197e+01 -5.4743e+01 -5.4516e+01 -6.3690e+01 -5.3230e+01 -5.4731e+01 -5.4541e+01 -6.3727e+01 -5.3262e+01 -5.4720e+01 -5.4566e+01 -6.3763e+01 -5.3293e+01 -5.4709e+01 -5.4590e+01 -6.3798e+01 -5.3324e+01 -5.4698e+01 -5.4614e+01 -6.3832e+01 -5.3354e+01 -5.4687e+01 -5.4638e+01 -6.3864e+01 -5.3384e+01 -5.4676e+01 -5.4661e+01 -6.3895e+01 -5.3413e+01 -5.4665e+01 -5.4684e+01 -6.3925e+01 -5.3442e+01 -5.4655e+01 -5.4707e+01 -6.3954e+01 -5.3471e+01 -5.4644e+01 -5.4729e+01 -6.3982e+01 -5.3498e+01 -5.4634e+01 -5.4750e+01 -6.4009e+01 -5.3526e+01 -5.4624e+01 -5.4771e+01 -6.4034e+01 -5.3552e+01 -5.4614e+01 -5.4792e+01 -6.4058e+01 -5.3579e+01 -5.4605e+01 -5.4813e+01 -6.4082e+01 -5.3612e+01 -5.4595e+01 -5.4833e+01 -6.4104e+01 -5.3674e+01 -5.4583e+01 -5.4852e+01 -6.4125e+01 -5.3735e+01 -5.4565e+01 -5.4871e+01 -6.4145e+01 -5.3795e+01 -5.4548e+01 -5.4890e+01 -6.4165e+01 -5.3854e+01 -5.4532e+01 -5.4909e+01 -6.4183e+01 -5.3912e+01 -5.4515e+01 -5.4927e+01 -6.4200e+01 -5.3969e+01 -5.4499e+01 -5.4944e+01 -6.4216e+01 -5.4026e+01 -5.4483e+01 -5.4962e+01 -6.4231e+01 -5.4081e+01 -5.4467e+01 -5.4978e+01 -6.4245e+01 -5.4136e+01 -5.4451e+01 -5.4995e+01 -6.4258e+01 -5.4189e+01 -5.4436e+01 -5.5011e+01 -6.4262e+01 -5.4242e+01 -5.4421e+01 -5.5027e+01 -6.4266e+01 -5.4294e+01 -5.4406e+01 -5.5042e+01 -6.4269e+01 -5.4345e+01 -5.4391e+01 -5.5057e+01 -6.4271e+01 -5.4395e+01 -5.4377e+01 -5.5071e+01 -6.4266e+01 -5.4444e+01 -5.4362e+01 -5.5086e+01 -6.4259e+01 -5.4487e+01 -5.4348e+01 -5.5099e+01 -6.4251e+01 -5.4527e+01 -5.4334e+01 -5.5113e+01 -6.4243e+01 -5.4566e+01 -5.4321e+01 -5.5126e+01 -6.4235e+01 -5.4604e+01 -5.4307e+01 -5.5139e+01 -6.4226e+01 -5.4642e+01 -5.4294e+01 -5.5151e+01 -6.4217e+01 -5.4679e+01 -5.4280e+01 -5.5163e+01 -6.4207e+01 -5.4715e+01 -5.4267e+01 -5.5174e+01 -6.4197e+01 -5.4751e+01 -5.4254e+01 -5.5186e+01 -6.4186e+01 -5.4786e+01 -5.4241e+01 -5.5197e+01 -6.4175e+01 -5.4821e+01 -5.4229e+01 -5.5207e+01 -6.4163e+01 -5.4853e+01 -5.4216e+01 -5.5217e+01 -6.4151e+01 -5.4879e+01 -5.4204e+01 -5.5227e+01 -6.4139e+01 -5.4904e+01 -5.4191e+01 -5.5237e+01 -6.4126e+01 -5.4928e+01 -5.4179e+01 -5.5246e+01 -6.4112e+01 -5.4953e+01 -5.4167e+01 -5.5254e+01 -6.4099e+01 -5.4976e+01 -5.4155e+01 -5.5263e+01 -6.4084e+01 -5.5000e+01 -5.4143e+01 -5.5271e+01 -6.4070e+01 -5.5023e+01 -5.4131e+01 -5.5272e+01 -6.4055e+01 -5.5045e+01 -5.4119e+01 -5.5272e+01 -6.4039e+01 -5.5067e+01 -5.4107e+01 -5.5271e+01 -6.4015e+01 -5.5089e+01 -5.4096e+01 -5.5271e+01 -6.3991e+01 -5.5122e+01 -5.4084e+01 -5.5270e+01 -6.3967e+01 -5.5180e+01 -5.4073e+01 -5.5269e+01 -6.3943e+01 -5.5236e+01 -5.4061e+01 -5.5268e+01 -6.3918e+01 -5.5292e+01 -5.4050e+01 -5.5267e+01 -6.3893e+01 -5.5347e+01 -5.4039e+01 -5.5265e+01 -6.3868e+01 -5.5401e+01 -5.4028e+01 -5.5264e+01 -6.3843e+01 -5.5454e+01 -5.4017e+01 -5.5262e+01 -6.3818e+01 -5.5506e+01 -5.4005e+01 -5.5261e+01 -6.3792e+01 -5.5557e+01 -5.3994e+01 -5.5259e+01 -6.3767e+01 -5.5608e+01 -5.3983e+01 -5.5257e+01 -6.3741e+01 -5.5658e+01 -5.3972e+01 -5.5254e+01 -6.3714e+01 -5.5707e+01 -5.3962e+01 -5.5252e+01 -6.3688e+01 -5.5755e+01 -5.3951e+01 -5.5250e+01 -6.3662e+01 -5.5802e+01 -5.3940e+01 -5.5247e+01 -6.3635e+01 -5.5848e+01 -5.3929e+01 -5.5244e+01 -6.3608e+01 -5.5887e+01 -5.3918e+01 -5.5241e+01 -6.3581e+01 -5.5924e+01 -5.3908e+01 -5.5238e+01 -6.3554e+01 -5.5961e+01 -5.3897e+01 -5.5235e+01 -6.3526e+01 -5.5997e+01 -5.3886e+01 -5.5232e+01 -6.3499e+01 -5.6032e+01 -5.3871e+01 -5.5228e+01 -6.3471e+01 -5.6066e+01 -5.3852e+01 -5.5225e+01 -6.3443e+01 -5.6100e+01 -5.3834e+01 -5.5221e+01 -6.3415e+01 -5.6134e+01 -5.3816e+01 -5.5217e+01 -6.3386e+01 -5.6167e+01 -5.3798e+01 -5.5213e+01 -6.3358e+01 -5.6199e+01 -5.3780e+01 -5.5200e+01 -6.3329e+01 -5.6230e+01 -5.3763e+01 -5.5188e+01 -6.3300e+01 -5.6261e+01 -5.3745e+01 -5.5176e+01 -6.3271e+01 -5.6292e+01 -5.3728e+01 -5.5164e+01 -6.3242e+01 -5.6322e+01 -5.3711e+01 -5.5152e+01 -6.3213e+01 -5.6351e+01 -5.3694e+01 -5.5140e+01 -6.3183e+01 -5.6380e+01 -5.3678e+01 -5.5128e+01 -6.3154e+01 -5.6408e+01 -5.3661e+01 -5.5116e+01 -6.3124e+01 -5.6435e+01 -5.3645e+01 -5.5104e+01 -6.3094e+01 -5.6462e+01 -5.3629e+01 -5.5092e+01 -6.3064e+01 -5.6489e+01 -5.3613e+01 -5.5080e+01 -6.3033e+01 -5.6515e+01 -5.3597e+01 -5.5069e+01 -6.3003e+01 -5.6540e+01 -5.3581e+01 -5.5057e+01 -6.2972e+01 -5.6565e+01 -5.3566e+01 -5.5045e+01 -6.2942e+01 -5.6589e+01 -5.3550e+01 -5.5033e+01 -6.2911e+01 -5.6609e+01 -5.3535e+01 -5.5021e+01 -6.2880e+01 -5.6624e+01 -5.3520e+01 -5.5010e+01 -6.2848e+01 -5.6639e+01 -5.3505e+01 -5.4998e+01 -6.2817e+01 -5.6653e+01 -5.3490e+01 -5.4986e+01 -6.2786e+01 -5.6667e+01 -5.3475e+01 -5.4974e+01 -6.2754e+01 -5.6681e+01 -5.3461e+01 -5.4958e+01 -6.2722e+01 -5.6695e+01 -5.3446e+01 -5.4938e+01 -6.2691e+01 -5.6708e+01 -5.3431e+01 -5.4919e+01 -6.2659e+01 -5.6720e+01 -5.3417e+01 -5.4900e+01 -6.2626e+01 -5.6733e+01 -5.3403e+01 -5.4881e+01 -6.2594e+01 -5.6745e+01 -5.3389e+01 -5.4862e+01 -6.2562e+01 -5.6757e+01 -5.3375e+01 -5.4843e+01 -6.2529e+01 -5.6768e+01 -5.3361e+01 -5.4825e+01 -6.2497e+01 -5.6779e+01 -5.3347e+01 -5.4806e+01 -6.2464e+01 -5.6790e+01 -5.3333e+01 -5.4788e+01 -6.2431e+01 -5.6800e+01 -5.3319e+01 -5.4770e+01 -6.2398e+01 -5.6810e+01 -5.3305e+01 -5.4752e+01 -6.2365e+01 -5.6820e+01 -5.3292e+01 -5.4734e+01 -6.2332e+01 -5.6829e+01 -5.3278e+01 -5.4716e+01 -6.2299e+01 -5.6838e+01 -5.3265e+01 -5.4692e+01 -6.2265e+01 -5.6846e+01 -5.3252e+01 -5.4666e+01 -6.2232e+01 -5.6855e+01 -5.3238e+01 -5.4642e+01 -6.2198e+01 -5.6863e+01 -5.3225e+01 -5.4617e+01 -6.2165e+01 -5.6870e+01 -5.3212e+01 -5.4593e+01 -6.2131e+01 -5.6878e+01 -5.3199e+01 -5.4569e+01 -6.2097e+01 -5.6884e+01 -5.3186e+01 -5.4545e+01 -6.2063e+01 -5.6891e+01 -5.3173e+01 -5.4522e+01 -6.2029e+01 -5.6897e+01 -5.3160e+01 -5.4497e+01 -6.1989e+01 -5.6897e+01 -5.3147e+01 -5.4466e+01 -6.1947e+01 -5.6895e+01 -5.3134e+01 -5.4436e+01 -6.1905e+01 -5.6893e+01 -5.3122e+01 -5.4406e+01 -6.1863e+01 -5.6890e+01 -5.3109e+01 -5.4377e+01 -6.1821e+01 -5.6887e+01 -5.3096e+01 -5.4347e+01 -6.1780e+01 -5.6882e+01 -5.3084e+01 -5.4319e+01 -6.1738e+01 -5.6871e+01 -5.3071e+01 -5.4287e+01 -6.1697e+01 -5.6861e+01 -5.3059e+01 -5.4252e+01 -6.1655e+01 -5.6850e+01 -5.3046e+01 -5.4216e+01 -6.1614e+01 -5.6839e+01 -5.3034e+01 -5.4182e+01 -6.1571e+01 -5.6828e+01 -5.3019e+01 -5.4148e+01 -6.1522e+01 -5.6816e+01 -5.2999e+01 -5.4114e+01 -6.1469e+01 -5.6797e+01 -5.2979e+01 -5.4081e+01 -6.1412e+01 -5.6779e+01 -5.2959e+01 -5.4049e+01 -6.1357e+01 -5.6761e+01 -5.2940e+01 -5.4017e+01 -6.1301e+01 -5.6743e+01 -5.2920e+01 -5.3985e+01 -6.1246e+01 -5.6725e+01 -5.2901e+01 -5.3955e+01 -6.1192e+01 -5.6707e+01 -5.2882e+01 -5.3924e+01 -6.1138e+01 -5.6690e+01 -5.2864e+01 -5.3894e+01 -6.1084e+01 -5.6673e+01 -5.2846e+01 -5.3864e+01 -6.1031e+01 -5.6655e+01 -5.2873e+01 -5.3835e+01 -6.0978e+01 -5.6638e+01 -5.2898e+01 -5.3807e+01 -6.0926e+01 -5.6622e+01 -5.2924e+01 -5.3778e+01 -6.0874e+01 -5.6605e+01 -5.2949e+01 -5.3750e+01 -6.0822e+01 -5.6588e+01 -5.2973e+01 -5.3714e+01 -6.0771e+01 -5.6572e+01 -5.2997e+01 -5.3680e+01 -6.0720e+01 -5.6556e+01 -5.3021e+01 -5.3645e+01 -6.0670e+01 -5.6540e+01 -5.3044e+01 -5.3612e+01 -6.0620e+01 -5.6524e+01 -5.3067e+01 -5.3579e+01 -6.0570e+01 -5.6508e+01 -5.3089e+01 -5.3546e+01 -6.0520e+01 -5.6492e+01 -5.3111e+01 -5.3514e+01 -6.0471e+01 -5.6476e+01 -5.3132e+01 -5.3482e+01 -6.0416e+01 -5.6460e+01 -5.3153e+01 -5.3451e+01 -6.0360e+01 -5.6445e+01 -5.3174e+01 -5.3421e+01 -6.0304e+01 -5.6429e+01 -5.3194e+01 -5.3391e+01 -6.0249e+01 -5.6414e+01 -5.3213e+01 -5.3361e+01 -6.0194e+01 -5.6398e+01 -5.3233e+01 -5.3332e+01 -6.0140e+01 -5.6383e+01 -5.3252e+01 -5.3304e+01 -6.0086e+01 -5.6363e+01 -5.3270e+01 -5.3276e+01 -6.0033e+01 -5.6335e+01 -5.3288e+01 -5.3248e+01 -5.9980e+01 -5.6304e+01 -5.3306e+01 -5.3220e+01 -5.9928e+01 -5.6274e+01 -5.3323e+01 -5.3194e+01 -5.9876e+01 -5.6244e+01 -5.3340e+01 -5.3167e+01 -5.9825e+01 -5.6215e+01 -5.3356e+01 -5.3141e+01 -5.9774e+01 -5.6179e+01 -5.3372e+01 -5.3115e+01 -5.9723e+01 -5.6143e+01 -5.3388e+01 -5.3090e+01 -5.9673e+01 -5.6107e+01 -5.3403e+01 -5.3065e+01 -5.9623e+01 -5.6072e+01 -5.3418e+01 -5.3040e+01 -5.9574e+01 -5.6037e+01 -5.3432e+01 -5.3016e+01 -5.9525e+01 -5.6003e+01 -5.3447e+01 -5.2992e+01 -5.9476e+01 -5.5969e+01 -5.3460e+01 -5.2969e+01 -5.9428e+01 -5.5936e+01 -5.3474e+01 -5.2946e+01 -5.9380e+01 -5.5903e+01 -5.3487e+01 -5.2923e+01 -5.9333e+01 -5.5871e+01 -5.3499e+01 -5.2900e+01 -5.9286e+01 -5.5838e+01 -5.3512e+01 -5.2878e+01 -5.9239e+01 -5.5799e+01 -5.3524e+01 -5.2856e+01 -5.9193e+01 -5.5760e+01 -5.3535e+01 -5.2834e+01 -5.9147e+01 -5.5722e+01 -5.3547e+01 -5.2813e+01 -5.9101e+01 -5.5685e+01 -5.3558e+01 -5.2792e+01 -5.9056e+01 -5.5648e+01 -5.3568e+01 -5.2771e+01 -5.9010e+01 -5.5612e+01 -5.3579e+01 -5.2751e+01 -5.8966e+01 -5.5576e+01 -5.3588e+01 -5.2730e+01 -5.8921e+01 -5.5541e+01 -5.3598e+01 -5.2710e+01 -5.8877e+01 -5.5507e+01 -5.3607e+01 -5.2691e+01 -5.8833e+01 -5.5472e+01 -5.3616e+01 -5.2671e+01 -5.8790e+01 -5.5439e+01 -5.3625e+01 -5.2652e+01 -5.8747e+01 -5.5406e+01 -5.3633e+01 -5.2633e+01 -5.8704e+01 -5.5373e+01 -5.3641e+01 -5.2614e+01 -5.8661e+01 -5.5341e+01 -5.3649e+01 -5.2596e+01 -5.8618e+01 -5.5310e+01 -5.3657e+01 -5.2577e+01 -5.8576e+01 -5.5279e+01 -5.3664e+01 -5.2559e+01 -5.8535e+01 -5.5248e+01 -5.3671e+01 -5.2541e+01 -5.8493e+01 -5.5218e+01 -5.3677e+01 -5.2524e+01 -5.8452e+01 -5.5188e+01 -5.3683e+01 -5.2506e+01 -5.8411e+01 -5.5158e+01 -5.3689e+01 -5.2489e+01 -5.8370e+01 -5.5129e+01 -5.3695e+01 -5.2472e+01 -5.8329e+01 -5.5101e+01 -5.3700e+01 -5.2455e+01 -5.8289e+01 -5.5073e+01 -5.3706e+01 -5.2438e+01 -5.8249e+01 -5.5045e+01 -5.3710e+01 -5.2422e+01 -5.8209e+01 -5.5017e+01 -5.3715e+01 -5.2419e+01 -5.8169e+01 -5.4990e+01 -5.3719e+01 -5.2439e+01 -5.8130e+01 -5.4963e+01 -5.3723e+01 -5.2459e+01 -5.8091e+01 -5.4937e+01 -5.3727e+01 -5.2479e+01 -5.8052e+01 -5.4911e+01 -5.3731e+01 -5.2498e+01 -5.8013e+01 -5.4885e+01 -5.3734e+01 -5.2517e+01 -5.8012e+01 -5.4859e+01 -5.3737e+01 -5.2536e+01 -5.8017e+01 -5.4829e+01 -5.3740e+01 -5.2555e+01 -5.8023e+01 -5.4796e+01 -5.3742e+01 -5.2566e+01 -5.8028e+01 -5.4764e+01 -5.3745e+01 -5.2576e+01 -5.8032e+01 -5.4732e+01 -5.3747e+01 -5.2586e+01 -5.8036e+01 -5.4701e+01 -5.3749e+01 -5.2596e+01 -5.8040e+01 -5.4670e+01 -5.3750e+01 -5.2606e+01 -5.8043e+01 -5.4639e+01 -5.3751e+01 -5.2616e+01 -5.8046e+01 -5.4609e+01 -5.3744e+01 -5.2625e+01 -5.8048e+01 -5.4580e+01 -5.3737e+01 -5.2635e+01 -5.8050e+01 -5.4550e+01 -5.3730e+01 -5.2644e+01 -5.8052e+01 -5.4522e+01 -5.3723e+01 -5.2653e+01 -5.8053e+01 -5.4493e+01 -5.3712e+01 -5.2662e+01 -5.8054e+01 -5.4465e+01 -5.3697e+01 -5.2671e+01 -5.8054e+01 -5.4438e+01 -5.3682e+01 -5.2680e+01 -5.8054e+01 -5.4410e+01 -5.3668e+01 -5.2689e+01 -5.8054e+01 -5.4384e+01 -5.3653e+01 -5.2697e+01 -5.8053e+01 -5.4357e+01 -5.3639e+01 -5.2706e+01 -5.8045e+01 -5.4331e+01 -5.3625e+01 -5.2714e+01 -5.8036e+01 -5.4305e+01 -5.3611e+01 -5.2738e+01 -5.8027e+01 -5.4279e+01 -5.3597e+01 -5.2783e+01 -5.8017e+01 -5.4254e+01 -5.3583e+01 -5.2827e+01 -5.8007e+01 -5.4229e+01 -5.3569e+01 -5.2870e+01 -5.7997e+01 -5.4205e+01 -5.3556e+01 -5.2913e+01 -5.7987e+01 -5.4180e+01 -5.3543e+01 -5.2955e+01 -5.7976e+01 -5.4156e+01 -5.3529e+01 -5.2996e+01 -5.7966e+01 -5.4133e+01 -5.3516e+01 -5.3037e+01 -5.7955e+01 -5.4109e+01 -5.3503e+01 -5.3077e+01 -5.7944e+01 -5.4086e+01 -5.3490e+01 -5.3117e+01 -5.7929e+01 -5.4063e+01 -5.3477e+01 -5.3156e+01 -5.7910e+01 -5.4040e+01 -5.3464e+01 -5.3194e+01 -5.7891e+01 -5.4018e+01 -5.3452e+01 -5.3242e+01 -5.7872e+01 -5.3996e+01 -5.3439e+01 -5.3316e+01 -5.7853e+01 -5.3974e+01 -5.3427e+01 -5.3382e+01 -5.7834e+01 -5.3952e+01 -5.3408e+01 -5.3446e+01 -5.7815e+01 -5.3931e+01 -5.3388e+01 -5.3509e+01 -5.7796e+01 -5.3909e+01 -5.3368e+01 -5.3572e+01 -5.7777e+01 -5.3888e+01 -5.3348e+01 -5.3633e+01 -5.7758e+01 -5.3867e+01 -5.3329e+01 -5.3694e+01 -5.7739e+01 -5.3847e+01 -5.3310e+01 -5.3754e+01 -5.7720e+01 -5.3826e+01 -5.3291e+01 -5.3812e+01 -5.7701e+01 -5.3806e+01 -5.3272e+01 -5.3871e+01 -5.7682e+01 -5.3786e+01 -5.3254e+01 -5.3928e+01 -5.7663e+01 -5.3766e+01 -5.3235e+01 -5.4003e+01 -5.7644e+01 -5.3747e+01 -5.3217e+01 -5.4092e+01 -5.7625e+01 -5.3727e+01 -5.3200e+01 -5.4175e+01 -5.7606e+01 -5.3708e+01 -5.3182e+01 -5.4257e+01 -5.7587e+01 -5.3689e+01 -5.3165e+01 -5.4335e+01 -5.7568e+01 -5.3670e+01 -5.3148e+01 -5.4406e+01 -5.7549e+01 -5.3651e+01 -5.3131e+01 -5.4477e+01 -5.7530e+01 -5.3632e+01 -5.3114e+01 -5.4547e+01 -5.7511e+01 -5.3614e+01 -5.3097e+01 -5.4617e+01 -5.7492e+01 -5.3596e+01 -5.3081e+01 -5.4685e+01 -5.7473e+01 -5.3578e+01 -5.3065e+01 -5.4753e+01 -5.7454e+01 -5.3560e+01 -5.3049e+01 -5.4819e+01 -5.7435e+01 -5.3542e+01 -5.3033e+01 -5.4885e+01 -5.7416e+01 -5.3524e+01 -5.3017e+01 -5.4950e+01 -5.7397e+01 -5.3498e+01 -5.3002e+01 -5.5014e+01 -5.7378e+01 -5.3473e+01 -5.2986e+01 -5.5077e+01 -5.7358e+01 -5.3448e+01 -5.2971e+01 -5.5140e+01 -5.7339e+01 -5.3423e+01 -5.2956e+01 -5.5201e+01 -5.7320e+01 -5.3399e+01 -5.2941e+01 -5.5262e+01 -5.7301e+01 -5.3375e+01 -5.2926e+01 -5.5322e+01 -5.7281e+01 -5.3351e+01 -5.2911e+01 -5.5381e+01 -5.7262e+01 -5.3328e+01 -5.2897e+01 -5.5439e+01 -5.7243e+01 -5.3305e+01 -5.2882e+01 -5.5496e+01 -5.7223e+01 -5.3282e+01 -5.2868e+01 -5.5553e+01 -5.7204e+01 -5.3259e+01 -5.2854e+01 -5.5608e+01 -5.7185e+01 -5.3237e+01 -5.2840e+01 -5.5663e+01 -5.7165e+01 -5.3215e+01 -5.2826e+01 -5.5717e+01 -5.7146e+01 -5.3193e+01 -5.2812e+01 -5.5770e+01 -5.7126e+01 -5.3172e+01 -5.2798e+01 -5.5822e+01 -5.7107e+01 -5.3150e+01 -5.2785e+01 -5.5874e+01 -5.7087e+01 -5.3119e+01 -5.2771e+01 -5.5925e+01 -5.7068e+01 -5.3083e+01 -5.2758e+01 -5.5975e+01 -5.7048e+01 -5.3047e+01 -5.2745e+01 -5.6024e+01 -5.7028e+01 -5.3011e+01 -5.2731e+01 -5.6072e+01 -5.7009e+01 -5.2977e+01 -5.2715e+01 -5.6119e+01 -5.6989e+01 -5.2942e+01 -5.2694e+01 -5.6166e+01 -5.6969e+01 -5.2909e+01 -5.2673e+01 -5.6212e+01 -5.6949e+01 -5.2876e+01 -5.2652e+01 -5.6257e+01 -5.6929e+01 -5.2843e+01 -5.2624e+01 -5.6301e+01 -5.6910e+01 -5.2811e+01 -5.2597e+01 -5.6345e+01 -5.6890e+01 -5.2780e+01 -5.2570e+01 -5.6388e+01 -5.6870e+01 -5.2749e+01 -5.2543e+01 -5.6430e+01 -5.6850e+01 -5.2719e+01 -5.2517e+01 -5.6467e+01 -5.6830e+01 -5.2689e+01 -5.2491e+01 -5.6499e+01 -5.6810e+01 -5.2659e+01 -5.2465e+01 -5.6531e+01 -5.6790e+01 -5.2630e+01 -5.2440e+01 -5.6563e+01 -5.6770e+01 -5.2602e+01 -5.2416e+01 -5.6594e+01 -5.6750e+01 -5.2574e+01 -5.2391e+01 -5.6624e+01 -5.6730e+01 -5.2546e+01 -5.2367e+01 -5.6654e+01 -5.6710e+01 -5.2519e+01 -5.2344e+01 -5.6683e+01 -5.6689e+01 -5.2492e+01 -5.2321e+01 -5.6712e+01 -5.6669e+01 -5.2466e+01 -5.2298e+01 -5.6769e+01 -5.6649e+01 -5.2440e+01 -5.2276e+01 -5.6833e+01 -5.6629e+01 -5.2414e+01 -5.2254e+01 -5.6896e+01 -5.6608e+01 -5.2389e+01 -5.2232e+01 -5.6956e+01 -5.6588e+01 -5.2365e+01 -5.2211e+01 -5.7009e+01 -5.6568e+01 -5.2340e+01 -5.2189e+01 -5.7061e+01 -5.6547e+01 -5.2316e+01 -5.2169e+01 -5.7112e+01 -5.6527e+01 -5.2293e+01 -5.2145e+01 -5.7163e+01 -5.6507e+01 -5.2269e+01 -5.2117e+01 -5.7213e+01 -5.6486e+01 -5.2246e+01 -5.2089e+01 -5.7262e+01 -5.6466e+01 -5.2224e+01 -5.2062e+01 -5.7310e+01 -5.6445e+01 -5.2201e+01 -5.2035e+01 -5.7357e+01 -5.6425e+01 -5.2176e+01 -5.2009e+01 -5.7404e+01 -5.6404e+01 -5.2146e+01 -5.1984e+01 -5.7450e+01 -5.6384e+01 -5.2117e+01 -5.1958e+01 -5.7495e+01 -5.6363e+01 -5.2089e+01 -5.1929e+01 -5.7539e+01 -5.6343e+01 -5.2061e+01 -5.1897e+01 -5.7576e+01 -5.6322e+01 -5.2033e+01 -5.1865e+01 -5.7611e+01 -5.6301e+01 -5.2006e+01 -5.1834e+01 -5.7645e+01 -5.6281e+01 -5.1979e+01 -5.1804e+01 -5.7671e+01 -5.6260e+01 -5.1953e+01 -5.1774e+01 -5.7697e+01 -5.6239e+01 -5.1927e+01 -5.1744e+01 -5.7722e+01 -5.6219e+01 -5.1902e+01 -5.1715e+01 -5.7746e+01 -5.6198e+01 -5.1875e+01 -5.1687e+01 -5.7771e+01 -5.6177e+01 -5.1843e+01 -5.1659e+01 -5.7795e+01 -5.6156e+01 -5.1811e+01 -5.1632e+01 -5.7818e+01 -5.6136e+01 -5.1779e+01 -5.1605e+01 -5.7841e+01 -5.6115e+01 -5.1749e+01 -5.1579e+01 -5.7864e+01 -5.6094e+01 -5.1719e+01 -5.1553e+01 -5.7886e+01 -5.6073e+01 -5.1689e+01 -5.1528e+01 -5.7908e+01 -5.6052e+01 -5.1660e+01 -5.1503e+01 -5.7930e+01 -5.6032e+01 -5.1631e+01 -5.1479e+01 -5.7945e+01 -5.6011e+01 -5.1603e+01 -5.1455e+01 -5.7955e+01 -5.5990e+01 -5.1576e+01 -5.1431e+01 -5.7959e+01 -5.5969e+01 -5.1549e+01 -5.1408e+01 -5.7964e+01 -5.5948e+01 -5.1522e+01 -5.1385e+01 -5.7968e+01 -5.5927e+01 -5.1496e+01 -5.1363e+01 -5.7973e+01 -5.5907e+01 -5.1471e+01 -5.1341e+01 -5.7977e+01 -5.5886e+01 -5.1445e+01 -5.1320e+01 -5.7982e+01 -5.5865e+01 -5.1421e+01 -5.1298e+01 -5.7986e+01 -5.5844e+01 -5.1397e+01 -5.1278e+01 -5.7991e+01 -5.5823e+01 -5.1373e+01 -5.1257e+01 -5.7995e+01 -5.5802e+01 -5.1349e+01 -5.1237e+01 -5.7999e+01 -5.5781e+01 -5.1326e+01 -5.1218e+01 -5.8003e+01 -5.5760e+01 -5.1304e+01 -5.1198e+01 -5.8007e+01 -5.5748e+01 -5.1282e+01 -5.1179e+01 -5.8011e+01 -5.5771e+01 -5.1260e+01 -5.1161e+01 -5.8014e+01 -5.5794e+01 -5.1238e+01 -5.1142e+01 -5.8018e+01 -5.5817e+01 -5.1217e+01 -5.1124e+01 -5.8021e+01 -5.5838e+01 -5.1197e+01 -5.1106e+01 -5.8025e+01 -5.5859e+01 -5.1176e+01 -5.1089e+01 -5.8028e+01 -5.5880e+01 -5.1156e+01 -5.1072e+01 -5.8031e+01 -5.5899e+01 -5.1137e+01 -5.1055e+01 -5.8033e+01 -5.5919e+01 -5.1117e+01 -5.1038e+01 -5.8036e+01 -5.5937e+01 -5.1098e+01 -5.1022e+01 -5.8039e+01 -5.5955e+01 -5.1075e+01 -5.1006e+01 -5.8041e+01 -5.5972e+01 -5.1048e+01 -5.0990e+01 -5.8037e+01 -5.5989e+01 -5.1023e+01 -5.0975e+01 -5.8031e+01 -5.6005e+01 -5.0997e+01 -5.0959e+01 -5.8025e+01 -5.6021e+01 -5.0973e+01 -5.0944e+01 -5.8020e+01 -5.6036e+01 -5.0948e+01 -5.0930e+01 -5.8014e+01 -5.6050e+01 -5.0924e+01 -5.0915e+01 -5.8008e+01 -5.6064e+01 -5.0901e+01 -5.0901e+01 -5.8002e+01 -5.6099e+01 -5.0878e+01 -5.0887e+01 -5.7996e+01 -5.6156e+01 -5.0856e+01 -5.0873e+01 -5.7990e+01 -5.6212e+01 -5.0834e+01 -5.0859e+01 -5.7985e+01 -5.6267e+01 -5.0805e+01 -5.0846e+01 -5.7979e+01 -5.6320e+01 -5.0776e+01 -5.0833e+01 -5.7973e+01 -5.6373e+01 -5.0748e+01 -5.0820e+01 -5.7967e+01 -5.6424e+01 -5.0720e+01 -5.0807e+01 -5.7961e+01 -5.6474e+01 -5.0692e+01 -5.0794e+01 -5.7954e+01 -5.6524e+01 -5.0666e+01 -5.0782e+01 -5.7948e+01 -5.6572e+01 -5.0639e+01 -5.0762e+01 -5.7942e+01 -5.6619e+01 -5.0614e+01 -5.0742e+01 -5.7936e+01 -5.6664e+01 -5.0589e+01 -5.0722e+01 -5.7929e+01 -5.6709e+01 -5.0564e+01 -5.0697e+01 -5.7923e+01 -5.6753e+01 -5.0540e+01 -5.0670e+01 -5.7916e+01 -5.6796e+01 -5.0516e+01 -5.0644e+01 -5.7910e+01 -5.6838e+01 -5.0493e+01 -5.0619e+01 -5.7903e+01 -5.6878e+01 -5.0470e+01 -5.0594e+01 -5.7896e+01 -5.6918e+01 -5.0448e+01 -5.0569e+01 -5.7889e+01 -5.6957e+01 -5.0421e+01 -5.0583e+01 -5.7882e+01 -5.6995e+01 -5.0392e+01 -5.0604e+01 -5.7873e+01 -5.7032e+01 -5.0363e+01 -5.0624e+01 -5.7857e+01 -5.7068e+01 -5.0332e+01 -5.0644e+01 -5.7834e+01 -5.7103e+01 -5.0297e+01 -5.0664e+01 -5.7811e+01 -5.7137e+01 -5.0262e+01 -5.0684e+01 -5.7788e+01 -5.7170e+01 -5.0228e+01 -5.0704e+01 -5.7766e+01 -5.7202e+01 -5.0195e+01 -5.0723e+01 -5.7744e+01 -5.7234e+01 -5.0163e+01 -5.0743e+01 -5.7722e+01 -5.7265e+01 -5.0132e+01 -5.0762e+01 -5.7701e+01 -5.7287e+01 -5.0101e+01 -5.0781e+01 -5.7680e+01 -5.7308e+01 -5.0071e+01 -5.0799e+01 -5.7659e+01 -5.7328e+01 -5.0041e+01 -5.0818e+01 -5.7638e+01 -5.7348e+01 -5.0012e+01 -5.0836e+01 -5.7617e+01 -5.7367e+01 -1.0000e+01 -5.0854e+01 -5.7597e+01 -5.7386e+01 -6.0000e+01 -5.0872e+01 -5.7576e+01 -5.7404e+01 -6.0000e+01 -5.0890e+01 -5.7556e+01 -5.7421e+01 -6.0000e+01 -5.0907e+01 -5.7536e+01 -5.7438e+01 -6.0000e+01 -5.0925e+01 -5.7516e+01 -5.7454e+01 -6.0000e+01 -5.0942e+01 -5.7488e+01 -5.7470e+01 -6.0000e+01 -5.0959e+01 -5.7461e+01 -5.7485e+01 -6.0000e+01 -5.0975e+01 -5.7434e+01 -5.7499e+01 -6.0000e+01 -5.0992e+01 -5.7407e+01 -5.7513e+01 -6.0000e+01 -5.1008e+01 -5.7381e+01 -5.7526e+01 -6.0000e+01 -5.1024e+01 -5.7355e+01 -5.7539e+01 -6.0000e+01 -5.1040e+01 -5.7329e+01 -5.7551e+01 -6.0000e+01 -5.1055e+01 -5.7304e+01 -5.7563e+01 -6.0000e+01 -5.1071e+01 -5.7279e+01 -5.7574e+01 -6.0000e+01 -5.1086e+01 -5.7250e+01 -5.7584e+01 -6.0000e+01 -5.1101e+01 -5.7217e+01 -5.7594e+01 -6.0000e+01 -5.1116e+01 -5.7185e+01 -5.7604e+01 -6.0000e+01 -5.1125e+01 -5.7154e+01 -5.7613e+01 -6.0000e+01 -5.1131e+01 -5.7122e+01 -5.7621e+01 -6.0000e+01 -5.1138e+01 -5.7091e+01 -5.7629e+01 -6.0000e+01 -5.1144e+01 -5.7052e+01 -5.7637e+01 -6.0000e+01 -5.1151e+01 -5.7014e+01 -5.7644e+01 -6.0000e+01 -5.1157e+01 -5.6977e+01 -5.7649e+01 -6.0000e+01 -5.1164e+01 -5.6940e+01 -5.7647e+01 -6.0000e+01 -5.1170e+01 -5.6904e+01 -5.7645e+01 -6.0000e+01 -5.1176e+01 -5.6868e+01 -5.7642e+01 -6.0000e+01 -5.1183e+01 -5.6833e+01 -5.7640e+01 -6.0000e+01 -5.1189e+01 -5.6799e+01 -5.7637e+01 -6.0000e+01 -5.1195e+01 -5.6764e+01 -5.7634e+01 -6.0000e+01 -5.1201e+01 -5.6731e+01 -5.7630e+01 -6.0000e+01 -5.1207e+01 -5.6697e+01 -5.7626e+01 -6.0000e+01 -5.1213e+01 -5.6665e+01 -5.7622e+01 -6.0000e+01 -5.1219e+01 -5.6632e+01 -5.7618e+01 -6.0000e+01 -5.1225e+01 -5.6600e+01 -5.7613e+01 -6.0000e+01 -5.1228e+01 -5.6569e+01 -5.7608e+01 -6.0000e+01 -5.1226e+01 -5.6538e+01 -5.7603e+01 -6.0000e+01 -5.1252e+01 -5.6507e+01 -5.7598e+01 -6.0000e+01 -5.1294e+01 -5.6476e+01 -5.7593e+01 -6.0000e+01 -5.1336e+01 -5.6446e+01 -5.7609e+01 -6.0000e+01 -5.1377e+01 -5.6417e+01 -5.7647e+01 -6.0000e+01 -5.1418e+01 -5.6388e+01 -5.7680e+01 -6.0000e+01 -5.1459e+01 -5.6359e+01 -5.7708e+01 -6.0000e+01 -5.1498e+01 -5.6330e+01 -5.7736e+01 -6.0000e+01 -5.1537e+01 -5.6302e+01 -5.7763e+01 -6.0000e+01 -5.1576e+01 -5.6274e+01 -5.7789e+01 -6.0000e+01 -5.1607e+01 -5.6246e+01 -5.7807e+01 -6.0000e+01 -5.1637e+01 -5.6219e+01 -5.7825e+01 -6.0000e+01 -5.1666e+01 -5.6192e+01 -5.7841e+01 -6.0000e+01 -5.1695e+01 -5.6165e+01 -5.7858e+01 -6.0000e+01 -5.1724e+01 -5.6139e+01 -5.7874e+01 -5.9957e+01 -5.1753e+01 -5.6112e+01 -5.7890e+01 -5.9881e+01 -5.1781e+01 -5.6086e+01 -5.7905e+01 -5.9806e+01 -5.1808e+01 -5.6090e+01 -5.7919e+01 -5.9731e+01 -5.1836e+01 -5.6101e+01 -5.7933e+01 -5.9658e+01 -5.1863e+01 -5.6112e+01 -5.7947e+01 -5.9585e+01 -5.1890e+01 -5.6122e+01 -5.7960e+01 -5.9513e+01 -5.1916e+01 -5.6132e+01 -5.7966e+01 -5.9442e+01 -5.1943e+01 -5.6142e+01 -5.7970e+01 -5.9371e+01 -5.1968e+01 -5.6152e+01 -5.7975e+01 -5.9301e+01 -5.1994e+01 -5.6161e+01 -5.7979e+01 -5.9232e+01 -5.2019e+01 -5.6171e+01 -5.7982e+01 -5.9164e+01 -5.2044e+01 -5.6180e+01 -5.7986e+01 -5.9097e+01 -5.2068e+01 -5.6188e+01 -5.7989e+01 -5.9030e+01 -5.2092e+01 -5.6197e+01 -5.7992e+01 -5.8963e+01 -5.2116e+01 -5.6205e+01 -5.7995e+01 -5.8898e+01 -5.2140e+01 -5.6213e+01 -5.7998e+01 -5.8833e+01 -5.2163e+01 -5.6221e+01 -5.8000e+01 -5.8769e+01 -5.2185e+01 -5.6225e+01 -5.8002e+01 -5.8702e+01 -5.2208e+01 -5.6224e+01 -5.8004e+01 -5.8631e+01 -5.2230e+01 -5.6224e+01 -5.8005e+01 -5.8561e+01 -5.2252e+01 -5.6223e+01 -5.8006e+01 -5.8492e+01 -5.2273e+01 -5.6222e+01 -5.8007e+01 -5.8423e+01 -5.2294e+01 -5.6221e+01 -5.8008e+01 -5.8355e+01 -5.2315e+01 -5.6220e+01 -5.8008e+01 -5.8289e+01 -5.2336e+01 -5.6219e+01 -5.8008e+01 -5.8222e+01 -5.2356e+01 -5.6218e+01 -5.8008e+01 -5.8157e+01 -5.2376e+01 -5.6216e+01 -5.8008e+01 -5.8092e+01 -5.2393e+01 -5.6215e+01 -5.8007e+01 -5.8028e+01 -5.2405e+01 -5.6214e+01 -5.8006e+01 -5.7965e+01 -5.2416e+01 -5.6212e+01 -5.8005e+01 -5.7902e+01 -5.2427e+01 -5.6211e+01 -5.8004e+01 -5.7840e+01 -5.2437e+01 -5.6209e+01 -5.8002e+01 -5.7779e+01 -5.2448e+01 -5.6207e+01 -5.8000e+01 -5.7719e+01 -5.2459e+01 -5.6205e+01 -5.7998e+01 -5.7659e+01 -5.2469e+01 -5.6203e+01 -5.7995e+01 -5.7599e+01 -5.2479e+01 -5.6201e+01 -5.7992e+01 -5.7541e+01 -5.2489e+01 -5.6198e+01 -5.7989e+01 -5.7483e+01 -5.2499e+01 -5.6196e+01 -5.7986e+01 -5.7425e+01 -5.2509e+01 -5.6193e+01 -5.7983e+01 -5.7369e+01 -5.2519e+01 -5.6191e+01 -5.7979e+01 -5.7312e+01 -5.2528e+01 -5.6188e+01 -5.7975e+01 -5.7257e+01 -5.2538e+01 -5.6185e+01 -5.7971e+01 -5.7202e+01 -5.2547e+01 -5.6182e+01 -5.7966e+01 -5.7147e+01 -5.2556e+01 -5.6179e+01 -5.7961e+01 -5.7093e+01 -5.2565e+01 -5.6176e+01 -5.7956e+01 -5.7040e+01 -5.2574e+01 -5.6172e+01 -5.7951e+01 -5.6986e+01 -5.2582e+01 -5.6169e+01 -5.7946e+01 -5.6926e+01 -5.2591e+01 -5.6165e+01 -5.7940e+01 -5.6899e+01 -5.2599e+01 -5.6161e+01 -5.7934e+01 -5.6876e+01 -5.2600e+01 -5.6157e+01 -5.7928e+01 -5.6854e+01 -5.2600e+01 -5.6153e+01 -5.7921e+01 -5.6832e+01 -5.2600e+01 -5.6149e+01 -5.7915e+01 -5.6810e+01 -5.2601e+01 -5.6144e+01 -5.7908e+01 -5.6787e+01 -5.2601e+01 -5.6140e+01 -5.7900e+01 -5.6758e+01 -5.2601e+01 -5.6135e+01 -5.7893e+01 -5.6729e+01 -5.2601e+01 -5.6130e+01 -5.7885e+01 -5.6700e+01 -5.2601e+01 -5.6117e+01 -5.7878e+01 -5.6671e+01 -5.2602e+01 -5.6104e+01 -5.7869e+01 -5.6643e+01 -5.2602e+01 -5.6091e+01 -5.7861e+01 -5.6616e+01 -5.2602e+01 -5.6079e+01 -5.7853e+01 -5.6588e+01 -5.2602e+01 -5.6066e+01 -5.7844e+01 -5.6561e+01 -5.2603e+01 -5.6053e+01 -5.7835e+01 -5.6535e+01 -5.2603e+01 -5.6040e+01 -5.7826e+01 -5.6508e+01 -5.2603e+01 -5.6028e+01 -5.7816e+01 -5.6482e+01 -5.2603e+01 -5.6015e+01 -5.7807e+01 -5.6456e+01 -5.2603e+01 -5.6003e+01 -5.7797e+01 -5.6431e+01 -5.2603e+01 -5.5990e+01 -5.7787e+01 -5.6406e+01 -5.2622e+01 -5.5977e+01 -5.7777e+01 -5.6381e+01 -5.2666e+01 -5.5965e+01 -5.7766e+01 -5.6356e+01 -5.2710e+01 -5.5952e+01 -5.7756e+01 -5.6331e+01 -5.2753e+01 -5.5940e+01 -5.7745e+01 -5.6307e+01 -5.2795e+01 -5.5927e+01 -5.7734e+01 -5.6283e+01 -5.2837e+01 -5.5915e+01 -5.7723e+01 -5.6260e+01 -5.2878e+01 -5.5902e+01 -5.7711e+01 -5.6236e+01 -5.2919e+01 -5.5890e+01 -5.7700e+01 -5.6213e+01 -5.2958e+01 -5.5877e+01 -5.7688e+01 -5.6190e+01 -5.2997e+01 -5.5865e+01 -5.7676e+01 -5.6167e+01 -5.3036e+01 -5.5852e+01 -5.7664e+01 -5.6144e+01 -5.3073e+01 -5.5839e+01 -5.7651e+01 -5.6122e+01 -5.3111e+01 -5.5827e+01 -5.7639e+01 -5.6099e+01 -5.3147e+01 -5.5814e+01 -5.7626e+01 -5.6077e+01 -5.3183e+01 -5.5802e+01 -5.7613e+01 -5.6047e+01 -5.3218e+01 -5.5789e+01 -5.7600e+01 -5.6017e+01 -5.3253e+01 -5.5776e+01 -5.7587e+01 -5.5988e+01 -5.3287e+01 -5.5760e+01 -5.7573e+01 -5.5959e+01 -5.3320e+01 -5.5739e+01 -5.7557e+01 -5.5930e+01 -5.3353e+01 -5.5719e+01 -5.7535e+01 -5.5902e+01 -5.3385e+01 -5.5699e+01 -5.7513e+01 -5.5884e+01 -5.3416e+01 -5.5678e+01 -5.7492e+01 -5.5886e+01 -5.3447e+01 -5.5659e+01 -5.7470e+01 -5.5887e+01 -5.3478e+01 -5.5639e+01 -5.7448e+01 -5.5888e+01 -5.3508e+01 -5.5619e+01 -5.7427e+01 -5.5889e+01 -5.3537e+01 -5.5600e+01 -5.7405e+01 -5.5891e+01 -5.3565e+01 -5.5580e+01 -5.7384e+01 -5.5889e+01 -5.3594e+01 -5.5561e+01 -5.7362e+01 -5.5883e+01 -5.3621e+01 -5.5542e+01 -5.7348e+01 -5.5876e+01 -5.3648e+01 -5.5516e+01 -5.7371e+01 -5.5869e+01 -5.3668e+01 -5.5489e+01 -5.7393e+01 -5.5863e+01 -5.3686e+01 -5.5463e+01 -5.7415e+01 -5.5857e+01 -5.3698e+01 -5.5437e+01 -5.7436e+01 -5.5851e+01 -5.3707e+01 -5.5411e+01 -5.7457e+01 -5.5845e+01 -5.3716e+01 -5.5378e+01 -5.7477e+01 -5.5839e+01 -5.3726e+01 -5.5345e+01 -5.7496e+01 -5.5834e+01 -5.3735e+01 -5.5312e+01 -5.7515e+01 -5.5828e+01 -5.3744e+01 -5.5287e+01 -5.7533e+01 -5.5823e+01 -5.3752e+01 -5.5292e+01 -5.7550e+01 -5.5817e+01 -5.3761e+01 -5.5297e+01 -5.7567e+01 -5.5812e+01 -5.3770e+01 -5.5302e+01 -5.7579e+01 -5.5807e+01 -5.3778e+01 -5.5307e+01 -5.7587e+01 -5.5802e+01 -5.3786e+01 -5.5311e+01 -5.7594e+01 -5.5797e+01 -5.3794e+01 -5.5316e+01 -5.7601e+01 -5.5792e+01 -5.3802e+01 -5.5320e+01 -5.7608e+01 -5.5787e+01 -5.3809e+01 -5.5325e+01 -5.7614e+01 -5.5782e+01 -5.3817e+01 -5.5329e+01 -5.7620e+01 -5.5777e+01 -5.3824e+01 -5.5334e+01 -5.7626e+01 -5.5772e+01 -5.3831e+01 -5.5338e+01 -5.7631e+01 -5.5767e+01 -5.3838e+01 -5.5342e+01 -5.7636e+01 -5.5762e+01 -5.3845e+01 -5.5346e+01 -5.7640e+01 -5.5758e+01 -5.3849e+01 -5.5350e+01 -5.7645e+01 -5.5751e+01 -5.3847e+01 -5.5354e+01 -5.7648e+01 -5.5738e+01 -5.3846e+01 -5.5358e+01 -5.7652e+01 -5.5723e+01 -5.3844e+01 -5.5362e+01 -5.7655e+01 -5.5699e+01 -5.3843e+01 -5.5365e+01 -5.7657e+01 -5.5671e+01 -5.3841e+01 -5.5369e+01 -5.7660e+01 -5.5643e+01 -5.3831e+01 -5.5372e+01 -5.7658e+01 -5.5617e+01 -5.3822e+01 -5.5375e+01 -5.7652e+01 -5.5591e+01 -5.3813e+01 -5.5378e+01 -5.7646e+01 -5.5565e+01 -5.3804e+01 -5.5381e+01 -5.7639e+01 -5.5540e+01 -5.3795e+01 -5.5384e+01 -5.7632e+01 -5.5515e+01 -5.3786e+01 -5.5386e+01 -5.7626e+01 -5.5491e+01 -5.3778e+01 -5.5389e+01 -5.7619e+01 -5.5467e+01 -5.3770e+01 -5.5391e+01 -5.7611e+01 -5.5443e+01 -5.3762e+01 -5.5394e+01 -5.7604e+01 -5.5420e+01 -5.3754e+01 -5.5396e+01 -5.7597e+01 -5.5398e+01 -5.3746e+01 -5.5398e+01 -5.7589e+01 -5.5376e+01 -5.3738e+01 -5.5399e+01 -5.7581e+01 -5.5354e+01 -5.3730e+01 -5.5401e+01 -5.7574e+01 -5.5332e+01 -5.3723e+01 -5.5402e+01 -5.7566e+01 -5.5304e+01 -5.3715e+01 -5.5404e+01 -5.7557e+01 -5.5276e+01 -5.3708e+01 -5.5405e+01 -5.7549e+01 -5.5248e+01 -5.3701e+01 -5.5406e+01 -5.7541e+01 -5.5220e+01 -5.3694e+01 -5.5407e+01 -5.7532e+01 -5.5194e+01 -5.3687e+01 -5.5407e+01 -5.7523e+01 -5.5167e+01 -5.3680e+01 -5.5408e+01 -5.7514e+01 -5.5141e+01 -5.3673e+01 -5.5408e+01 -5.7505e+01 -5.5116e+01 -5.3666e+01 -5.5409e+01 -5.7496e+01 -5.5090e+01 -5.3659e+01 -5.5409e+01 -5.7487e+01 -5.5066e+01 -5.3652e+01 -5.5408e+01 -5.7477e+01 -5.5042e+01 -5.3646e+01 -5.5408e+01 -5.7467e+01 -5.5018e+01 -5.3639e+01 -5.5408e+01 -5.7457e+01 -5.4994e+01 -5.3632e+01 -5.5407e+01 -5.7447e+01 -5.4971e+01 -5.3626e+01 -5.5406e+01 -5.7429e+01 -5.4949e+01 -5.3619e+01 -5.5405e+01 -5.7411e+01 -5.4926e+01 -5.3613e+01 -5.5404e+01 -5.7393e+01 -5.4904e+01 -5.3606e+01 -5.5403e+01 -5.7375e+01 -5.4883e+01 -5.3600e+01 -5.5401e+01 -5.7357e+01 -5.4862e+01 -5.3593e+01 -5.5400e+01 -5.7339e+01 -5.4841e+01 -5.3587e+01 -5.5398e+01 -5.7321e+01 -5.4820e+01 -5.3572e+01 -5.5396e+01 -5.7303e+01 -5.4800e+01 -5.3558e+01 -5.5394e+01 -5.7285e+01 -5.4780e+01 -5.3544e+01 -5.5392e+01 -5.7267e+01 -5.4760e+01 -5.3531e+01 -5.5389e+01 -5.7250e+01 -5.4784e+01 -5.3517e+01 -5.5387e+01 -5.7232e+01 -5.4809e+01 -5.3504e+01 -5.5384e+01 -5.7214e+01 -5.4833e+01 -5.3490e+01 -5.5381e+01 -5.7196e+01 -5.4849e+01 -5.3477e+01 -5.5378e+01 -5.7178e+01 -5.4865e+01 -5.3465e+01 -5.5374e+01 -5.7160e+01 -5.4881e+01 -5.3452e+01 -5.5371e+01 -5.7143e+01 -5.4896e+01 -5.3439e+01 -5.5367e+01 -5.7122e+01 -5.4911e+01 -5.3424e+01 -5.5364e+01 -5.7096e+01 -5.4926e+01 -5.3404e+01 -5.5360e+01 -5.7071e+01 -5.4941e+01 -5.3384e+01 -5.5356e+01 -5.7045e+01 -5.4956e+01 -5.3365e+01 -5.5351e+01 -5.7020e+01 -5.4970e+01 -5.3346e+01 -5.5347e+01 -5.6995e+01 -5.4984e+01 -5.3327e+01 -5.5342e+01 -5.6970e+01 -5.4998e+01 -5.3308e+01 -5.5338e+01 -5.6946e+01 -5.5012e+01 -5.3290e+01 -5.5333e+01 -5.6921e+01 -5.5025e+01 -5.3272e+01 -5.5328e+01 -5.6897e+01 -5.5038e+01 -5.3254e+01 -5.5322e+01 -5.6873e+01 -5.5051e+01 -5.3237e+01 -5.5317e+01 -5.6849e+01 -5.5064e+01 -5.3220e+01 -5.5312e+01 -5.6825e+01 -5.5076e+01 -5.3203e+01 -5.5306e+01 -5.6801e+01 -5.5089e+01 -5.3186e+01 -5.5300e+01 -5.6778e+01 -5.5100e+01 -5.3170e+01 -5.5294e+01 -5.6754e+01 -5.5112e+01 -5.3154e+01 -5.5288e+01 -5.6731e+01 -5.5124e+01 -5.3138e+01 -5.5298e+01 -5.6708e+01 -5.5135e+01 -5.3122e+01 -5.5328e+01 -5.6679e+01 -5.5146e+01 -5.3107e+01 -5.5357e+01 -5.6648e+01 -5.5156e+01 -5.3091e+01 -5.5386e+01 -5.6617e+01 -5.5167e+01 -5.3076e+01 -5.5414e+01 -5.6587e+01 -5.5177e+01 -5.3061e+01 -5.5442e+01 -5.6557e+01 -5.5187e+01 -5.3047e+01 -5.5469e+01 -5.6528e+01 -5.5196e+01 -5.3032e+01 -5.5495e+01 -5.6494e+01 -5.5206e+01 -5.3018e+01 -5.5521e+01 -5.6457e+01 -5.5215e+01 -5.2996e+01 -5.5547e+01 -5.6421e+01 -5.5224e+01 -5.2974e+01 -5.5571e+01 -5.6385e+01 -5.5232e+01 -5.2953e+01 -5.5595e+01 -5.6349e+01 -5.5241e+01 -5.2932e+01 -5.5619e+01 -5.6314e+01 -5.5249e+01 -5.2911e+01 -5.5642e+01 -5.6279e+01 -5.5257e+01 -5.2891e+01 -5.5664e+01 -5.6245e+01 -5.5264e+01 -5.2871e+01 -5.5686e+01 -5.6211e+01 -5.5271e+01 -5.2851e+01 -5.5708e+01 -5.6177e+01 -5.5278e+01 -5.2831e+01 -5.5728e+01 -5.6144e+01 -5.5284e+01 -5.2812e+01 -5.5749e+01 -5.6111e+01 -5.5283e+01 -5.2793e+01 -5.5798e+01 -5.6113e+01 -5.5281e+01 -5.2775e+01 -5.5853e+01 -5.6125e+01 -5.5279e+01 -5.2757e+01 -5.5908e+01 -5.6137e+01 -5.5278e+01 -5.2739e+01 -5.5961e+01 -5.6148e+01 -5.5276e+01 -5.2721e+01 -5.6014e+01 -5.6159e+01 -5.5274e+01 -5.2703e+01 -5.6065e+01 -5.6170e+01 -5.5272e+01 -5.2686e+01 -5.6116e+01 -5.6181e+01 -5.5270e+01 -5.2669e+01 -5.6166e+01 -5.6191e+01 -5.5268e+01 -5.2652e+01 -5.6214e+01 -5.6201e+01 -5.5266e+01 -5.2636e+01 -5.6262e+01 -5.6210e+01 -5.5264e+01 -5.2620e+01 -5.6309e+01 -5.6219e+01 -5.5262e+01 -5.2603e+01 -5.6355e+01 -5.6221e+01 -5.5259e+01 -5.2588e+01 -5.6400e+01 -5.6222e+01 -5.5257e+01 -5.2572e+01 -5.6444e+01 -5.6223e+01 -5.5254e+01 -5.2557e+01 -5.6488e+01 -5.6223e+01 -5.5252e+01 -5.2541e+01 -5.6530e+01 -5.6224e+01 -5.5249e+01 -5.2526e+01 -5.6572e+01 -5.6224e+01 -5.5246e+01 -5.2511e+01 -5.6612e+01 -5.6224e+01 -5.5243e+01 -5.2497e+01 -5.6652e+01 -5.6224e+01 -5.5240e+01 -5.2482e+01 -5.6691e+01 -5.6224e+01 -5.5237e+01 -5.2468e+01 -5.6729e+01 -5.6223e+01 -5.5233e+01 -5.2454e+01 -5.6767e+01 -5.6245e+01 -5.5230e+01 -5.2440e+01 -5.6803e+01 -5.6289e+01 -5.5226e+01 -5.2426e+01 -5.6839e+01 -5.6332e+01 -5.5223e+01 -5.2412e+01 -5.6874e+01 -5.6374e+01 -5.5218e+01 -5.2399e+01 -5.6908e+01 -5.6416e+01 -5.5206e+01 -5.2386e+01 -5.6941e+01 -5.6456e+01 -5.5194e+01 -5.2372e+01 -5.6974e+01 -5.6496e+01 -5.5183e+01 -5.2359e+01 -5.7005e+01 -5.6535e+01 -5.5171e+01 -5.2346e+01 -5.7036e+01 -5.6573e+01 -5.5159e+01 -5.2334e+01 -5.7067e+01 -5.6611e+01 -5.5148e+01 -5.2317e+01 -5.7096e+01 -5.6647e+01 -5.5137e+01 -5.2297e+01 -5.7125e+01 -5.6683e+01 -5.5125e+01 -5.2277e+01 -5.7153e+01 -5.6719e+01 -5.5114e+01 -5.2257e+01 -5.7180e+01 -5.6750e+01 -5.5103e+01 -5.2237e+01 -5.7207e+01 -5.6776e+01 -5.5091e+01 -5.2218e+01 -5.7232e+01 -5.6801e+01 -5.5080e+01 -5.2199e+01 -5.7257e+01 -5.6826e+01 -5.5069e+01 -5.2181e+01 -5.7282e+01 -5.6850e+01 -5.5058e+01 -5.2162e+01 -5.7306e+01 -5.6874e+01 -5.5047e+01 -5.2144e+01 -5.7329e+01 -5.6897e+01 -5.5036e+01 -5.2127e+01 -5.7351e+01 -5.6920e+01 -5.5025e+01 -5.2109e+01 -5.7373e+01 -5.6942e+01 -5.5014e+01 -5.2092e+01 -5.7394e+01 -5.6964e+01 -5.5003e+01 -5.2075e+01 -5.7417e+01 -5.6985e+01 -5.4992e+01 -5.2058e+01 -5.7474e+01 -5.7005e+01 -5.4981e+01 -5.2041e+01 -5.7529e+01 -5.7025e+01 -5.4970e+01 -5.2025e+01 -5.7583e+01 -5.7045e+01 -5.4959e+01 -5.2009e+01 -5.7631e+01 -5.7064e+01 -5.4948e+01 -5.1993e+01 -5.7676e+01 -5.7083e+01 -5.4937e+01 -5.1977e+01 -5.7719e+01 -5.7101e+01 -5.4926e+01 -5.1962e+01 -5.7761e+01 -5.7118e+01 -5.4915e+01 -5.1947e+01 -5.7803e+01 -5.7135e+01 -5.4904e+01 -5.1932e+01 -5.7844e+01 -5.7152e+01 -5.4894e+01 -5.1917e+01 -5.7883e+01 -5.7168e+01 -5.4883e+01 -5.1902e+01 -5.7922e+01 -5.7184e+01 -5.4872e+01 -5.1888e+01 -5.7961e+01 -5.7199e+01 -5.4861e+01 -5.1874e+01 -5.7998e+01 -5.7214e+01 -5.4850e+01 -5.1860e+01 -5.8034e+01 -5.7228e+01 -5.4839e+01 -5.1846e+01 -5.8070e+01 -5.7242e+01 -5.4824e+01 -5.1832e+01 -5.8105e+01 -5.7255e+01 -5.4805e+01 -5.1818e+01 -5.8139e+01 -5.7268e+01 -5.4786e+01 -5.1805e+01 -5.8173e+01 -5.7280e+01 -5.4767e+01 -5.1792e+01 -5.8205e+01 -5.7292e+01 -5.4749e+01 -5.1779e+01 -5.8237e+01 -5.7303e+01 -5.4731e+01 -5.1766e+01 -5.8263e+01 -5.7314e+01 -5.4713e+01 -5.1753e+01 -5.8286e+01 -5.7325e+01 -5.4695e+01 -5.1740e+01 -5.8308e+01 -5.7335e+01 -5.4677e+01 -5.1728e+01 -5.8329e+01 -5.7345e+01 -5.4659e+01 -5.1715e+01 -5.8350e+01 -5.7354e+01 -5.4642e+01 -5.1703e+01 -5.8370e+01 -5.7363e+01 -5.4625e+01 -5.1691e+01 -5.8389e+01 -5.7371e+01 -5.4607e+01 -5.1679e+01 -5.8408e+01 -5.7379e+01 -5.4590e+01 -5.1667e+01 -5.8427e+01 -5.7387e+01 -5.4573e+01 -5.1655e+01 -5.8445e+01 -5.7392e+01 -5.4556e+01 -5.1644e+01 -5.8462e+01 -5.7391e+01 -5.4540e+01 -5.1632e+01 -5.8479e+01 -5.7390e+01 -5.4523e+01 -5.1621e+01 -5.8496e+01 -5.7388e+01 -5.4506e+01 -5.1610e+01 -5.8511e+01 -5.7386e+01 -5.4490e+01 -5.1599e+01 -5.8521e+01 -5.7384e+01 -5.4469e+01 -5.1588e+01 -5.8528e+01 -5.7382e+01 -5.4445e+01 -5.1577e+01 -5.8535e+01 -5.7379e+01 -5.4421e+01 -5.1566e+01 -5.8541e+01 -5.7376e+01 -5.4398e+01 -5.1555e+01 -5.8547e+01 -5.7373e+01 -5.4375e+01 -5.1544e+01 -5.8553e+01 -5.7370e+01 -5.4352e+01 -5.1534e+01 -5.8558e+01 -5.7367e+01 -5.4329e+01 -5.1523e+01 -5.8563e+01 -5.7363e+01 -5.4306e+01 -5.1513e+01 -5.8568e+01 -5.7359e+01 -5.4280e+01 -5.1499e+01 -5.8572e+01 -5.7355e+01 -5.4250e+01 -5.1481e+01 -5.8576e+01 -5.7351e+01 -5.4221e+01 -5.1463e+01 -5.8580e+01 -5.7347e+01 -5.4192e+01 -5.1461e+01 -5.8583e+01 -5.7342e+01 -5.4163e+01 -5.1488e+01 -5.8586e+01 -5.7337e+01 -5.4135e+01 -5.1515e+01 -5.8589e+01 -5.7332e+01 -5.4107e+01 -5.1541e+01 -5.8591e+01 -5.7327e+01 -5.4080e+01 -5.1567e+01 -5.8593e+01 -5.7321e+01 -5.4045e+01 -5.1593e+01 -5.8618e+01 -5.7316e+01 -5.4010e+01 -5.1618e+01 -5.8648e+01 -5.7310e+01 -5.3976e+01 -5.1643e+01 -5.8678e+01 -5.7304e+01 -5.3943e+01 -5.1667e+01 -5.8706e+01 -5.7297e+01 -5.3910e+01 -5.1691e+01 -5.8735e+01 -5.7291e+01 -5.3878e+01 -5.1713e+01 -5.8762e+01 -5.7284e+01 -5.3846e+01 -5.1728e+01 -5.8789e+01 -5.7277e+01 -5.3815e+01 -5.1743e+01 -5.8816e+01 -5.7270e+01 -5.3784e+01 -5.1758e+01 -5.8841e+01 -5.7263e+01 -5.3754e+01 -5.1773e+01 -5.8866e+01 -5.7255e+01 -5.3724e+01 -5.1788e+01 -5.8883e+01 -5.7248e+01 -5.3694e+01 -5.1802e+01 -5.8899e+01 -5.7240e+01 -5.3665e+01 -5.1816e+01 -5.8915e+01 -5.7232e+01 -5.3637e+01 -5.1830e+01 -5.8931e+01 -5.7223e+01 -5.3608e+01 -5.1844e+01 -5.8946e+01 -5.7215e+01 -5.3581e+01 -5.1858e+01 -5.8961e+01 -5.7206e+01 -5.3553e+01 -5.1871e+01 -5.8975e+01 -5.7197e+01 -5.3526e+01 -5.1884e+01 -5.8989e+01 -5.7188e+01 -5.3500e+01 -5.1892e+01 -5.9003e+01 -5.7179e+01 -5.3474e+01 -5.1897e+01 -5.9016e+01 -5.7170e+01 -5.3448e+01 -5.1902e+01 -5.9029e+01 -5.7160e+01 -5.3422e+01 -5.1907e+01 -5.9041e+01 -5.7142e+01 -5.3389e+01 -5.1912e+01 -5.9052e+01 -5.7124e+01 -5.3357e+01 -5.1917e+01 -5.9056e+01 -5.7107e+01 -5.3325e+01 -5.1922e+01 -5.9059e+01 -5.7089e+01 -5.3293e+01 -5.1927e+01 -5.9062e+01 -5.7071e+01 -5.3262e+01 -5.1932e+01 -5.9065e+01 -5.7054e+01 -5.3232e+01 -5.1937e+01 -5.9101e+01 -5.7036e+01 -5.3202e+01 -5.1942e+01 -5.9140e+01 -5.7018e+01 -5.3170e+01 -5.1947e+01 -5.9178e+01 -5.7000e+01 -5.3133e+01 -5.1952e+01 -5.9216e+01 -5.6983e+01 -5.3097e+01 -5.1956e+01 -5.9252e+01 -5.6965e+01 -5.3061e+01 -5.1961e+01 -5.9289e+01 -5.6947e+01 -5.3026e+01 -5.1966e+01 -5.9324e+01 -5.6930e+01 -5.2992e+01 -5.1970e+01 -5.9359e+01 -5.6912e+01 -5.2958e+01 -5.1975e+01 -5.9393e+01 -5.6909e+01 -5.2924e+01 -5.1979e+01 -5.9426e+01 -5.6936e+01 -5.2892e+01 -5.1984e+01 -5.9459e+01 -5.6962e+01 -5.2860e+01 -5.1988e+01 -5.9491e+01 -5.6987e+01 -5.2828e+01 -5.1992e+01 -5.9516e+01 -5.7012e+01 -5.2792e+01 -5.1997e+01 -5.9539e+01 -5.7036e+01 -5.2754e+01 -5.2001e+01 -5.9561e+01 -5.7060e+01 -5.2716e+01 -5.2005e+01 -5.9583e+01 -5.7082e+01 -5.2679e+01 -5.2005e+01 -5.9605e+01 -5.7097e+01 -5.2643e+01 -5.2012e+01 -5.9626e+01 -5.7111e+01 -5.2607e+01 -5.2045e+01 -5.9642e+01 -5.7124e+01 -5.2572e+01 -5.2089e+01 -5.9654e+01 -5.7137e+01 -5.2538e+01 -5.2165e+01 -5.9666e+01 -5.7149e+01 -5.2504e+01 -5.2241e+01 -5.9677e+01 -5.7161e+01 -5.2471e+01 -5.2315e+01 -5.9688e+01 -5.7173e+01 -5.2438e+01 -5.2389e+01 -5.9699e+01 -5.7184e+01 -5.2406e+01 -5.2461e+01 -5.9710e+01 -5.7195e+01 -5.2375e+01 -5.2533e+01 -5.9721e+01 -5.7205e+01 -5.2344e+01 -5.2603e+01 -5.9731e+01 -5.7215e+01 -5.2314e+01 -5.2673e+01 -5.9740e+01 -5.7225e+01 -5.2284e+01 -5.2741e+01 -5.9750e+01 -5.7234e+01 -5.2255e+01 -5.2809e+01 -5.9759e+01 -5.7242e+01 -5.2226e+01 -5.2874e+01 -5.9768e+01 -5.7251e+01 -5.2198e+01 -5.2932e+01 -5.9776e+01 -5.7259e+01 -5.2170e+01 -5.2989e+01 -5.9784e+01 -5.7266e+01 -5.2143e+01 -5.3045e+01 -5.9792e+01 -5.7273e+01 -5.2116e+01 -5.3100e+01 -5.9800e+01 -5.7280e+01 -5.2090e+01 -5.3155e+01 -5.9807e+01 -5.7286e+01 -5.2064e+01 -5.3207e+01 -5.9814e+01 -5.7292e+01 -5.2039e+01 -5.3252e+01 -5.9820e+01 -5.7298e+01 -5.2014e+01 -5.3297e+01 -5.9820e+01 -5.7303e+01 -5.1989e+01 -5.3341e+01 -5.9818e+01 -5.7308e+01 -5.1965e+01 -5.3385e+01 -5.9816e+01 -5.7313e+01 -5.1942e+01 -5.3428e+01 -5.9814e+01 -5.7317e+01 -5.1918e+01 -5.3470e+01 -5.9811e+01 -5.7321e+01 -5.1895e+01 -5.3512e+01 -5.9809e+01 -5.7324e+01 -5.1873e+01 -5.3553e+01 -5.9806e+01 -5.7327e+01 -5.1851e+01 -5.3594e+01 -5.9803e+01 -5.7330e+01 -5.1829e+01 -5.3635e+01 -5.9800e+01 -5.7332e+01 -5.1807e+01 -5.3674e+01 -5.9796e+01 -5.7334e+01 -5.1786e+01 -5.3713e+01 -5.9793e+01 -5.7336e+01 -5.1766e+01 -5.3746e+01 -5.9789e+01 -5.7337e+01 -5.1745e+01 -5.3770e+01 -5.9785e+01 -5.7338e+01 -5.1725e+01 -5.3792e+01 -5.9781e+01 -5.7338e+01 -5.1705e+01 -5.3814e+01 -5.9777e+01 -5.7339e+01 -5.1686e+01 -5.3836e+01 -5.9773e+01 -5.7339e+01 -5.1667e+01 -5.3857e+01 -5.9768e+01 -5.7338e+01 -5.1648e+01 -5.3879e+01 -5.9763e+01 -5.7338e+01 -5.1629e+01 -5.3900e+01 -5.9758e+01 -5.7373e+01 -5.1611e+01 -5.3921e+01 -5.9753e+01 -5.7416e+01 -5.1593e+01 -5.3942e+01 -5.9748e+01 -5.7458e+01 -5.1575e+01 -5.3963e+01 -5.9737e+01 -5.7499e+01 -5.1558e+01 -5.3983e+01 -5.9723e+01 -5.7532e+01 -5.1540e+01 -5.4003e+01 -5.9709e+01 -5.7563e+01 -5.1523e+01 -5.4023e+01 -5.9696e+01 -5.7593e+01 -5.1507e+01 -5.4043e+01 -5.9682e+01 -5.7623e+01 -5.1490e+01 -5.4063e+01 -5.9668e+01 -5.7652e+01 -5.1474e+01 -5.4082e+01 -5.9654e+01 -5.7680e+01 -5.1458e+01 -5.4101e+01 -5.9640e+01 -5.7707e+01 -5.1442e+01 -5.4120e+01 -5.9627e+01 -5.7734e+01 -5.1427e+01 -5.4139e+01 -5.9613e+01 -5.7760e+01 -5.1412e+01 -5.4157e+01 -5.9599e+01 -5.7786e+01 -5.1396e+01 -5.4176e+01 -5.9585e+01 -5.7810e+01 -5.1382e+01 -5.4194e+01 -5.9570e+01 -5.7835e+01 -5.1367e+01 -5.4211e+01 -5.9556e+01 -5.7858e+01 -5.1352e+01 -5.4229e+01 -5.9542e+01 -5.7881e+01 -5.1331e+01 -5.4243e+01 -5.9528e+01 -5.7903e+01 -5.1309e+01 -5.4252e+01 -5.9513e+01 -5.7924e+01 -5.1288e+01 -5.4261e+01 -5.9499e+01 -5.7945e+01 -5.1267e+01 -5.4270e+01 -5.9484e+01 -5.7965e+01 -5.1246e+01 -5.4278e+01 -5.9470e+01 -5.7984e+01 -5.1225e+01 -5.4287e+01 -5.9455e+01 -5.8003e+01 -5.1205e+01 -5.4296e+01 -5.9440e+01 -5.8021e+01 -5.1186e+01 -5.4304e+01 -5.9426e+01 -5.8039e+01 -5.1166e+01 -5.4313e+01 -5.9411e+01 -5.8056e+01 -5.1147e+01 -5.4321e+01 -5.9396e+01 -5.8072e+01 -5.1129e+01 -5.4330e+01 -5.9380e+01 -5.8088e+01 -5.1110e+01 -5.4338e+01 -5.9365e+01 -5.8103e+01 -5.1092e+01 -5.4346e+01 -5.9350e+01 -5.8118e+01 -5.1074e+01 -5.4354e+01 -5.9334e+01 -5.8132e+01 -5.1057e+01 -5.4362e+01 -5.9314e+01 -5.8145e+01 -5.1037e+01 -5.4369e+01 -5.9290e+01 -5.8158e+01 -5.1005e+01 -5.4377e+01 -5.9267e+01 -5.8171e+01 -5.0973e+01 -5.4384e+01 -5.9244e+01 -5.8182e+01 -5.0942e+01 -5.4391e+01 -5.9221e+01 -5.8194e+01 -5.0911e+01 -5.4399e+01 -5.9197e+01 -5.8204e+01 -5.0881e+01 -5.4406e+01 -5.9174e+01 -5.8215e+01 -5.0851e+01 -5.4413e+01 -5.9151e+01 -5.8224e+01 -5.0822e+01 -5.4419e+01 -5.9128e+01 -5.8233e+01 -5.0794e+01 -5.4426e+01 -5.9106e+01 -5.8242e+01 -5.0766e+01 -5.4432e+01 -5.9083e+01 -5.8250e+01 -5.0738e+01 -5.4438e+01 -5.9060e+01 -5.8257e+01 -5.0712e+01 -5.4445e+01 -5.9037e+01 -5.8265e+01 -5.0686e+01 -5.4451e+01 -5.9015e+01 -5.8271e+01 -5.0660e+01 -5.4456e+01 -5.8990e+01 -5.8277e+01 -5.0635e+01 -5.4462e+01 -5.8960e+01 -5.8283e+01 -5.0610e+01 -5.4467e+01 -5.8929e+01 -5.8288e+01 -5.0586e+01 -5.4473e+01 -5.8899e+01 -5.8293e+01 -5.0563e+01 -5.4478e+01 -5.8869e+01 -5.8297e+01 -5.0539e+01 -5.4483e+01 -5.8840e+01 -5.8300e+01 -5.0517e+01 -5.4488e+01 -5.8810e+01 -5.8304e+01 -5.0488e+01 -5.4492e+01 -5.8773e+01 -5.8306e+01 -5.0458e+01 -5.4497e+01 -5.8735e+01 -5.8309e+01 -5.0429e+01 -5.4501e+01 -5.8691e+01 -5.8311e+01 -5.0401e+01 -5.4505e+01 -5.8647e+01 -5.8312e+01 -5.0373e+01 -5.4509e+01 -5.8603e+01 -5.8313e+01 -5.0346e+01 -5.4513e+01 -5.8561e+01 -5.8314e+01 -5.0320e+01 -5.4510e+01 -5.8518e+01 -5.8314e+01 -5.0294e+01 -5.4506e+01 -5.8476e+01 -5.8314e+01 -5.0265e+01 -5.4501e+01 -5.8435e+01 -5.8313e+01 -5.0232e+01 -5.4497e+01 -5.8394e+01 -5.8312e+01 -5.0200e+01 -5.4493e+01 -5.8346e+01 -5.8311e+01 -5.0169e+01 -5.4488e+01 -5.8299e+01 -5.8309e+01 -5.0138e+01 -5.4484e+01 -5.8252e+01 -5.8307e+01 -5.0108e+01 -5.4479e+01 -5.8205e+01 -5.8304e+01 -5.0079e+01 -5.4475e+01 -5.8160e+01 -5.8301e+01 -5.0045e+01 -5.4470e+01 -5.8114e+01 -5.8298e+01 -5.0009e+01 -5.4466e+01 -5.8070e+01 -5.8294e+01 -1.0000e+01 -5.4453e+01 -5.8026e+01 -5.8290e+01 -6.0000e+01 -5.4454e+01 -5.7982e+01 -5.8286e+01 -6.0000e+01 -5.4487e+01 -5.7940e+01 -5.8277e+01 -6.0000e+01 -5.4514e+01 -5.7897e+01 -5.8264e+01 -6.0000e+01 -5.4538e+01 -5.7855e+01 -5.8251e+01 -6.0000e+01 -5.4561e+01 -5.7814e+01 -5.8237e+01 -6.0000e+01 -5.4584e+01 -5.7773e+01 -5.8224e+01 -6.0000e+01 -5.4606e+01 -5.7733e+01 -5.8210e+01 -6.0000e+01 -5.4628e+01 -5.7693e+01 -5.8196e+01 -6.0000e+01 -5.4650e+01 -5.7654e+01 -5.8182e+01 -6.0000e+01 -5.4672e+01 -5.7615e+01 -5.8168e+01 -6.0000e+01 -5.4693e+01 -5.7576e+01 -5.8154e+01 -6.0000e+01 -5.4714e+01 -5.7538e+01 -5.8140e+01 -6.0000e+01 -5.4735e+01 -5.7500e+01 -5.8125e+01 -6.0000e+01 -5.4755e+01 -5.7463e+01 -5.8111e+01 -6.0000e+01 -5.4775e+01 -5.7426e+01 -5.8140e+01 -6.0000e+01 -5.4795e+01 -5.7390e+01 -5.8169e+01 -6.0000e+01 -5.4814e+01 -5.7354e+01 -5.8197e+01 -6.0000e+01 -5.4833e+01 -5.7318e+01 -5.8225e+01 -6.0000e+01 -5.4852e+01 -5.7283e+01 -5.8252e+01 -6.0000e+01 -5.4870e+01 -5.7248e+01 -5.8278e+01 -6.0000e+01 -5.4888e+01 -5.7213e+01 -5.8319e+01 -6.0000e+01 -5.4906e+01 -5.7179e+01 -5.8389e+01 -6.0000e+01 -5.4923e+01 -5.7145e+01 -5.8501e+01 -6.0000e+01 -5.4940e+01 -5.7111e+01 -5.8611e+01 -6.0000e+01 -5.4957e+01 -5.7078e+01 -5.8719e+01 -6.0000e+01 -5.4973e+01 -5.7045e+01 -5.8825e+01 -6.0000e+01 -5.4989e+01 -5.7012e+01 -5.8929e+01 -6.0000e+01 -5.5005e+01 -5.6980e+01 -5.9031e+01 -6.0000e+01 -5.5020e+01 -5.6948e+01 -5.9131e+01 -6.0000e+01 -5.5035e+01 -5.6916e+01 -5.9229e+01 -6.0000e+01 -5.5050e+01 -5.6885e+01 -5.9317e+01 -6.0000e+01 -5.5058e+01 -5.6853e+01 -5.9404e+01 -6.0000e+01 -5.5064e+01 -5.6839e+01 -5.9489e+01 -6.0000e+01 -5.5070e+01 -5.6845e+01 -5.9572e+01 -6.0000e+01 -5.5076e+01 -5.6850e+01 -5.9654e+01 -6.0000e+01 -5.5082e+01 -5.6856e+01 -5.9734e+01 -6.0000e+01 -5.5087e+01 -5.6861e+01 -5.9812e+01 -6.0000e+01 -5.5093e+01 -5.6865e+01 -5.9889e+01 -6.0000e+01 -5.5098e+01 -5.6870e+01 -5.9964e+01 -6.0000e+01 -5.5103e+01 -5.6874e+01 -6.0038e+01 -6.0000e+01 -5.5108e+01 -5.6879e+01 -6.0110e+01 -6.0000e+01 -5.5113e+01 -5.6882e+01 -6.0181e+01 -6.0000e+01 -5.5118e+01 -5.6886e+01 -6.0250e+01 -6.0000e+01 -5.5122e+01 -5.6890e+01 -6.0318e+01 -6.0000e+01 -5.5127e+01 -5.6893e+01 -6.0384e+01 -6.0000e+01 -5.5131e+01 -5.6896e+01 -6.0449e+01 -6.0000e+01 -5.5133e+01 -5.6899e+01 -6.0513e+01 -6.0000e+01 -5.5129e+01 -5.6901e+01 -6.0575e+01 -6.0000e+01 -5.5125e+01 -5.6903e+01 -6.0635e+01 -5.9942e+01 -5.5121e+01 -5.6905e+01 -6.0695e+01 -5.9866e+01 -5.5117e+01 -5.6907e+01 -6.0752e+01 -5.9790e+01 -5.5112e+01 -5.6909e+01 -6.0809e+01 -5.9715e+01 -5.5100e+01 -5.6910e+01 -6.0864e+01 -5.9641e+01 -5.5089e+01 -5.6911e+01 -6.0918e+01 -5.9568e+01 -5.5077e+01 -5.6912e+01 -6.0971e+01 -5.9496e+01 -5.5066e+01 -5.6913e+01 -6.1022e+01 -5.9424e+01 -5.5054e+01 -5.6913e+01 -6.1072e+01 -5.9353e+01 -5.5043e+01 -5.6913e+01 -6.1121e+01 -5.9283e+01 -5.5032e+01 -5.6913e+01 -6.1168e+01 -5.9214e+01 -5.5021e+01 -5.6913e+01 -6.1215e+01 -5.9145e+01 -5.5011e+01 -5.6912e+01 -6.1260e+01 -5.9077e+01 -5.5000e+01 -5.6911e+01 -6.1304e+01 -5.9010e+01 -5.4990e+01 -5.6910e+01 -6.1346e+01 -5.8944e+01 -5.4979e+01 -5.6909e+01 -6.1388e+01 -5.8878e+01 -5.4969e+01 -5.6908e+01 -6.1428e+01 -5.8813e+01 -5.4959e+01 -5.6906e+01 -6.1467e+01 -5.8748e+01 -5.4949e+01 -5.6904e+01 -6.1506e+01 -5.8684e+01 -5.4939e+01 -5.6902e+01 -6.1543e+01 -5.8621e+01 -5.4930e+01 -5.6899e+01 -6.1578e+01 -5.8559e+01 -5.4920e+01 -5.6897e+01 -6.1613e+01 -5.8497e+01 -5.4910e+01 -5.6894e+01 -6.1639e+01 -5.8435e+01 -5.4901e+01 -5.6891e+01 -6.1659e+01 -5.8375e+01 -5.4891e+01 -5.6887e+01 -6.1675e+01 -5.8314e+01 -5.4882e+01 -5.6884e+01 -6.1691e+01 -5.8255e+01 -5.4873e+01 -5.6914e+01 -6.1706e+01 -5.8196e+01 -5.4863e+01 -5.6946e+01 -6.1720e+01 -5.8137e+01 -5.4854e+01 -5.6978e+01 -6.1733e+01 -5.8116e+01 -5.4844e+01 -5.7009e+01 -6.1746e+01 -5.8103e+01 -5.4827e+01 -5.7039e+01 -6.1759e+01 -5.8089e+01 -5.4810e+01 -5.7068e+01 -6.1770e+01 -5.8072e+01 -5.4794e+01 -5.7097e+01 -6.1783e+01 -5.8050e+01 -5.4777e+01 -5.7125e+01 -6.1838e+01 -5.8037e+01 -5.4761e+01 -5.7153e+01 -6.1892e+01 -5.8060e+01 -5.4745e+01 -5.7180e+01 -6.1945e+01 -5.8083e+01 -5.4722e+01 -5.7206e+01 -6.1996e+01 -5.8105e+01 -5.4698e+01 -5.7232e+01 -6.2045e+01 -5.8127e+01 -5.4675e+01 -5.7257e+01 -6.2086e+01 -5.8148e+01 -5.4653e+01 -5.7281e+01 -6.2126e+01 -5.8168e+01 -5.4630e+01 -5.7305e+01 -6.2164e+01 -5.8188e+01 -5.4608e+01 -5.7328e+01 -6.2202e+01 -5.8206e+01 -5.4587e+01 -5.7350e+01 -6.2239e+01 -5.8216e+01 -5.4565e+01 -5.7372e+01 -6.2275e+01 -5.8227e+01 -5.4544e+01 -5.7393e+01 -6.2310e+01 -5.8236e+01 -5.4524e+01 -5.7414e+01 -6.2343e+01 -5.8246e+01 -5.4503e+01 -5.7434e+01 -6.2376e+01 -5.8255e+01 -5.4483e+01 -5.7454e+01 -6.2408e+01 -5.8264e+01 -5.4483e+01 -5.7473e+01 -6.2439e+01 -5.8272e+01 -5.4508e+01 -5.7491e+01 -6.2469e+01 -5.8281e+01 -5.4532e+01 -5.7509e+01 -6.2499e+01 -5.8288e+01 -5.4556e+01 -5.7526e+01 -6.2527e+01 -5.8296e+01 -5.4580e+01 -5.7542e+01 -6.2554e+01 -5.8303e+01 -5.4603e+01 -5.7559e+01 -6.2581e+01 -5.8309e+01 -5.4626e+01 -5.7574e+01 -6.2606e+01 -5.8315e+01 -5.4648e+01 -5.7589e+01 -6.2631e+01 -5.8321e+01 -5.4662e+01 -5.7603e+01 -6.2655e+01 -5.8327e+01 -5.4676e+01 -5.7617e+01 -6.2678e+01 -5.8332e+01 -5.4687e+01 -5.7631e+01 -6.2700e+01 -5.8337e+01 -5.4692e+01 -5.7644e+01 -6.2721e+01 -5.8341e+01 -5.4698e+01 -5.7656e+01 -6.2742e+01 -5.8346e+01 -5.4703e+01 -5.7668e+01 -6.2761e+01 -5.8349e+01 -5.4709e+01 -5.7679e+01 -6.2780e+01 -5.8353e+01 -5.4714e+01 -5.7690e+01 -6.2798e+01 -5.8356e+01 -5.4719e+01 -5.7700e+01 -6.2815e+01 -5.8359e+01 -5.4725e+01 -5.7710e+01 -6.2831e+01 -5.8361e+01 -5.4730e+01 -5.7719e+01 -6.2847e+01 -5.8363e+01 -5.4735e+01 -5.7728e+01 -6.2862e+01 -5.8365e+01 -5.4740e+01 -5.7736e+01 -6.2876e+01 -5.8366e+01 -5.4745e+01 -5.7741e+01 -6.2889e+01 -5.8367e+01 -5.4751e+01 -5.7740e+01 -6.2902e+01 -5.8368e+01 -5.4755e+01 -5.7739e+01 -6.2913e+01 -5.8368e+01 -5.4760e+01 -5.7738e+01 -6.2924e+01 -5.8368e+01 -5.4765e+01 -5.7737e+01 -6.2935e+01 -5.8368e+01 -5.4770e+01 -5.7735e+01 -6.2940e+01 -5.8367e+01 -5.4770e+01 -5.7733e+01 -6.2940e+01 -5.8366e+01 -5.4766e+01 -5.7731e+01 -6.2941e+01 -5.8365e+01 -5.4763e+01 -5.7729e+01 -6.2941e+01 -5.8363e+01 -5.4760e+01 -5.7726e+01 -6.2940e+01 -5.8361e+01 -5.4757e+01 -5.7723e+01 -6.2939e+01 -5.8359e+01 -5.4754e+01 -5.7720e+01 -6.2938e+01 -5.8357e+01 -5.4751e+01 -5.7717e+01 -6.2936e+01 -5.8354e+01 -5.4748e+01 -5.7713e+01 -6.2933e+01 -5.8343e+01 -5.4745e+01 -5.7709e+01 -6.2930e+01 -5.8332e+01 -5.4742e+01 -5.7705e+01 -6.2926e+01 -5.8321e+01 -5.4739e+01 -5.7701e+01 -6.2930e+01 -5.8309e+01 -5.4736e+01 -5.7696e+01 -6.2970e+01 -5.8298e+01 -5.4734e+01 -5.7691e+01 -6.3009e+01 -5.8286e+01 -5.4731e+01 -5.7686e+01 -6.3046e+01 -5.8274e+01 -5.4728e+01 -5.7681e+01 -6.3074e+01 -5.8262e+01 -5.4726e+01 -5.7675e+01 -6.3102e+01 -5.8250e+01 -5.4723e+01 -5.7669e+01 -6.3129e+01 -5.8238e+01 -5.4720e+01 -5.7663e+01 -6.3155e+01 -5.8226e+01 -5.4718e+01 -5.7656e+01 -6.3217e+01 -5.8213e+01 -5.4715e+01 -5.7650e+01 -6.3286e+01 -5.8201e+01 -5.4712e+01 -5.7643e+01 -6.3353e+01 -5.8188e+01 -5.4709e+01 -5.7636e+01 -6.3418e+01 -5.8175e+01 -5.4707e+01 -5.7629e+01 -6.3482e+01 -5.8162e+01 -5.4704e+01 -5.7621e+01 -6.3544e+01 -5.8149e+01 -5.4701e+01 -5.7613e+01 -6.3605e+01 -5.8136e+01 -5.4698e+01 -5.7605e+01 -6.3665e+01 -5.8123e+01 -5.4695e+01 -5.7597e+01 -6.3723e+01 -5.8109e+01 -5.4692e+01 -5.7589e+01 -6.3780e+01 -5.8096e+01 -5.4683e+01 -5.7580e+01 -6.3835e+01 -5.8082e+01 -5.4672e+01 -5.7571e+01 -6.3889e+01 -5.8068e+01 -5.4661e+01 -5.7562e+01 -6.3941e+01 -5.8055e+01 -5.4650e+01 -5.7553e+01 -6.3992e+01 -5.8041e+01 -5.4640e+01 -5.7544e+01 -6.4042e+01 -5.8026e+01 -5.4630e+01 -5.7534e+01 -6.4090e+01 -5.8012e+01 -5.4620e+01 -5.7524e+01 -6.4138e+01 -5.7998e+01 -5.4609e+01 -5.7514e+01 -6.4183e+01 -5.7983e+01 -5.4600e+01 -5.7504e+01 -6.4228e+01 -5.7969e+01 -5.4590e+01 -5.7493e+01 -6.4271e+01 -5.7954e+01 -5.4580e+01 -5.7482e+01 -6.4313e+01 -5.7939e+01 -5.4570e+01 -5.7471e+01 -6.4350e+01 -5.7924e+01 -5.4561e+01 -5.7460e+01 -6.4373e+01 -5.7909e+01 -5.4551e+01 -5.7449e+01 -6.4396e+01 -5.7894e+01 -5.4542e+01 -5.7438e+01 -6.4418e+01 -5.7879e+01 -5.4532e+01 -5.7426e+01 -6.4439e+01 -5.7863e+01 -5.4523e+01 -5.7414e+01 -6.4460e+01 -5.7848e+01 -5.4514e+01 -5.7402e+01 -6.4479e+01 -5.7832e+01 -5.4505e+01 -5.7390e+01 -6.4498e+01 -5.7816e+01 -5.4495e+01 -5.7378e+01 -6.4516e+01 -5.7800e+01 -5.4486e+01 -5.7365e+01 -6.4533e+01 -5.7784e+01 -5.4477e+01 -5.7352e+01 -6.4550e+01 -5.7768e+01 -5.4468e+01 -5.7339e+01 -6.4565e+01 -5.7752e+01 -5.4459e+01 -5.7326e+01 -6.4580e+01 -5.7735e+01 -5.4451e+01 -5.7313e+01 -6.4594e+01 -5.7719e+01 -5.4442e+01 -5.7300e+01 -6.4608e+01 -5.7702e+01 -5.4433e+01 -5.7286e+01 -6.4620e+01 -5.7686e+01 -5.4424e+01 -5.7272e+01 -6.4632e+01 -5.7669e+01 -5.4415e+01 -5.7259e+01 -6.4643e+01 -5.7652e+01 -5.4406e+01 -5.7245e+01 -6.4654e+01 -5.7635e+01 -5.4398e+01 -5.7229e+01 -6.4663e+01 -5.7618e+01 -5.4389e+01 -5.7207e+01 -6.4672e+01 -5.7601e+01 -5.4374e+01 -5.7185e+01 -6.4680e+01 -5.7583e+01 -5.4358e+01 -5.7162e+01 -6.4688e+01 -5.7566e+01 -5.4341e+01 -5.7140e+01 -6.4695e+01 -5.7548e+01 -5.4325e+01 -5.7118e+01 -6.4701e+01 -5.7531e+01 -5.4309e+01 -5.7096e+01 -6.4706e+01 -5.7513e+01 -5.4293e+01 -5.7074e+01 -6.4711e+01 -5.7495e+01 -5.4278e+01 -5.7052e+01 -6.4715e+01 -5.7477e+01 -5.4262e+01 -5.7030e+01 -6.4719e+01 -5.7459e+01 -5.4247e+01 -5.7008e+01 -6.4721e+01 -5.7474e+01 -5.4232e+01 -5.6986e+01 -6.4724e+01 -5.7500e+01 -5.4216e+01 -5.6964e+01 -6.4725e+01 -5.7525e+01 -5.4202e+01 -5.6942e+01 -6.4726e+01 -5.7549e+01 -5.4187e+01 -5.6921e+01 -6.4726e+01 -5.7573e+01 -5.4172e+01 -5.6899e+01 -6.4726e+01 -5.7596e+01 -5.4158e+01 -5.6877e+01 -6.4724e+01 -5.7618e+01 -5.4143e+01 -5.6855e+01 -6.4723e+01 -5.7640e+01 -5.4129e+01 -5.6833e+01 -6.4721e+01 -5.7661e+01 -5.4115e+01 -5.6812e+01 -6.4718e+01 -5.7681e+01 -5.4101e+01 -5.6790e+01 -6.4714e+01 -5.7701e+01 -5.4079e+01 -5.6768e+01 -6.4710e+01 -5.7719e+01 -5.4058e+01 -5.6747e+01 -6.4705e+01 -5.7738e+01 -5.4036e+01 -5.6725e+01 -6.4698e+01 -5.7755e+01 -5.4015e+01 -5.6703e+01 -6.4684e+01 -5.7772e+01 -5.3995e+01 -5.6682e+01 -6.4670e+01 -5.7788e+01 -5.3974e+01 -5.6660e+01 -6.4655e+01 -5.7804e+01 -5.3954e+01 -5.6639e+01 -6.4640e+01 -5.7819e+01 -5.3934e+01 -5.6617e+01 -6.4625e+01 -5.7833e+01 -5.3914e+01 -5.6596e+01 -6.4609e+01 -5.7847e+01 -5.3895e+01 -5.6574e+01 -6.4594e+01 -5.7860e+01 -5.3876e+01 -5.6553e+01 -6.4577e+01 -5.7872e+01 -5.3857e+01 -5.6531e+01 -6.4561e+01 -5.7884e+01 -5.3838e+01 -5.6510e+01 -6.4544e+01 -5.7896e+01 -5.3820e+01 -5.6488e+01 -6.4526e+01 -5.7906e+01 -5.3801e+01 -5.6467e+01 -6.4508e+01 -5.7917e+01 -5.3783e+01 -5.6441e+01 -6.4490e+01 -5.7926e+01 -5.3765e+01 -5.6412e+01 -6.4506e+01 -5.7935e+01 -5.3748e+01 -5.6383e+01 -6.4532e+01 -5.7944e+01 -5.3730e+01 -5.6354e+01 -6.4556e+01 -5.7950e+01 -5.3713e+01 -5.6325e+01 -6.4580e+01 -5.7950e+01 -5.3696e+01 -5.6297e+01 -6.4602e+01 -5.7948e+01 -5.3679e+01 -5.6268e+01 -6.4624e+01 -5.7939e+01 -5.3662e+01 -5.6240e+01 -6.4644e+01 -5.7930e+01 -5.3645e+01 -5.6212e+01 -6.4664e+01 -5.7920e+01 -5.3629e+01 -5.6184e+01 -6.4682e+01 -5.7911e+01 -5.3613e+01 -5.6157e+01 -6.4700e+01 -5.7901e+01 -5.3596e+01 -5.6129e+01 -6.4717e+01 -5.7892e+01 -5.3581e+01 -5.6102e+01 -6.4733e+01 -5.7882e+01 -5.3565e+01 -5.6075e+01 -6.4748e+01 -5.7872e+01 -5.3549e+01 -5.6048e+01 -6.4762e+01 -5.7862e+01 -5.3533e+01 -5.6021e+01 -6.4776e+01 -5.7851e+01 -5.3518e+01 -5.5994e+01 -6.4788e+01 -5.7841e+01 -5.3503e+01 -5.5968e+01 -6.4800e+01 -5.7830e+01 -5.3487e+01 -5.5942e+01 -6.4810e+01 -5.7820e+01 -5.3468e+01 -5.5915e+01 -6.4820e+01 -5.7807e+01 -5.3445e+01 -5.5889e+01 -6.4829e+01 -5.7788e+01 -5.3422e+01 -5.5863e+01 -6.4838e+01 -5.7769e+01 -5.3400e+01 -5.5838e+01 -6.4845e+01 -5.7750e+01 -5.3378e+01 -5.5812e+01 -6.4852e+01 -5.7732e+01 -5.3357e+01 -5.5786e+01 -6.4858e+01 -5.7711e+01 -5.3335e+01 -5.5761e+01 -6.4863e+01 -5.7684e+01 -5.3314e+01 -5.5736e+01 -6.4867e+01 -5.7658e+01 -5.3293e+01 -5.5711e+01 -6.4871e+01 -5.7632e+01 -5.3273e+01 -5.5686e+01 -6.4873e+01 -5.7599e+01 -5.3253e+01 -5.5661e+01 -6.4876e+01 -5.7566e+01 -5.3233e+01 -5.5636e+01 -6.4877e+01 -5.7533e+01 -5.3213e+01 -5.5611e+01 -6.4878e+01 -5.7500e+01 -5.3193e+01 -5.5587e+01 -6.4878e+01 -5.7468e+01 -5.3174e+01 -5.5562e+01 -6.4877e+01 -5.7436e+01 -5.3155e+01 -5.5538e+01 -6.4875e+01 -5.7404e+01 -5.3136e+01 -5.5514e+01 -6.4873e+01 -5.7373e+01 -5.3118e+01 -5.5490e+01 -6.4870e+01 -5.7342e+01 -5.3099e+01 -5.5465e+01 -6.4867e+01 -5.7311e+01 -5.3081e+01 -5.5434e+01 -6.4863e+01 -5.7281e+01 -5.3063e+01 -5.5402e+01 -6.4858e+01 -5.7251e+01 -5.3045e+01 -5.5371e+01 -6.4852e+01 -5.7222e+01 -5.3028e+01 -5.5340e+01 -6.4846e+01 -5.7192e+01 -5.3010e+01 -5.5309e+01 -6.4840e+01 -5.7163e+01 -5.2993e+01 -5.5278e+01 -6.4832e+01 -5.7135e+01 -5.2976e+01 -5.5248e+01 -6.4825e+01 -5.7106e+01 -5.2959e+01 -5.5218e+01 -6.4816e+01 -5.7078e+01 -5.2942e+01 -5.5189e+01 -6.4807e+01 -5.7050e+01 -5.2926e+01 -5.5159e+01 -6.4797e+01 -5.7022e+01 -5.2909e+01 -5.5130e+01 -6.4787e+01 -5.6995e+01 -5.2893e+01 -5.5101e+01 -6.4770e+01 -5.6968e+01 -5.2877e+01 -5.5073e+01 -6.4751e+01 -5.6941e+01 -5.2861e+01 -5.5044e+01 -6.4731e+01 -5.6914e+01 -5.2845e+01 -5.5016e+01 -6.4711e+01 -5.6888e+01 -5.2830e+01 -5.4988e+01 -6.4691e+01 -5.6861e+01 -5.2814e+01 -5.4960e+01 -6.4670e+01 -5.6835e+01 -5.2799e+01 -5.4933e+01 -6.4649e+01 -5.6809e+01 -5.2784e+01 -5.4906e+01 -6.4628e+01 -5.6784e+01 -5.2769e+01 -5.4879e+01 -6.4606e+01 -5.6758e+01 -5.2754e+01 -5.4852e+01 -6.4584e+01 -5.6733e+01 -5.2739e+01 -5.4825e+01 -6.4562e+01 -5.6708e+01 -5.2724e+01 -5.4799e+01 -6.4539e+01 -5.6683e+01 -5.2710e+01 -5.4772e+01 -6.4516e+01 -5.6658e+01 -5.2695e+01 -5.4746e+01 -6.4493e+01 -5.6633e+01 -5.2681e+01 -5.4720e+01 -6.4469e+01 -5.6609e+01 -5.2667e+01 -5.4695e+01 -6.4445e+01 -5.6584e+01 -5.2653e+01 -5.4669e+01 -6.4421e+01 -5.6560e+01 -5.2639e+01 -5.4644e+01 -6.4396e+01 -5.6536e+01 -5.2625e+01 -5.4619e+01 -6.4371e+01 -5.6512e+01 -5.2611e+01 -5.4594e+01 -6.4346e+01 -5.6488e+01 -5.2597e+01 -5.4569e+01 -6.4321e+01 -5.6465e+01 -5.2584e+01 -5.4545e+01 -6.4295e+01 -5.6441e+01 -5.2570e+01 -5.4520e+01 -6.4269e+01 -5.6418e+01 -5.2557e+01 -5.4496e+01 -6.4243e+01 -5.6394e+01 -5.2543e+01 -5.4472e+01 -6.4216e+01 -5.6363e+01 -5.2530e+01 -5.4448e+01 -6.4189e+01 -5.6332e+01 -5.2517e+01 -5.4424e+01 -6.4162e+01 -5.6301e+01 -5.2504e+01 -5.4400e+01 -6.4135e+01 -5.6271e+01 -5.2491e+01 -5.4377e+01 -6.4107e+01 -5.6241e+01 -5.2478e+01 -5.4354e+01 -6.4079e+01 -5.6212e+01 -5.2498e+01 -5.4324e+01 -6.4051e+01 -5.6182e+01 -5.2530e+01 -5.4293e+01 -6.4023e+01 -5.6153e+01 -5.2561e+01 -5.4263e+01 -6.3994e+01 -5.6125e+01 -5.2591e+01 -5.4233e+01 -6.3965e+01 -5.6096e+01 -5.2620e+01 -5.4203e+01 -6.3936e+01 -5.6068e+01 -5.2650e+01 -5.4173e+01 -6.3907e+01 -5.6040e+01 -5.2678e+01 -5.4144e+01 -6.3877e+01 -5.6012e+01 -5.2706e+01 -5.4115e+01 -6.3847e+01 -5.5984e+01 -5.2734e+01 -5.4086e+01 -6.3817e+01 -5.5957e+01 -5.2761e+01 -5.4058e+01 -6.3787e+01 -5.5930e+01 -5.2787e+01 -5.4030e+01 -6.3757e+01 -5.5903e+01 -5.2813e+01 -5.4002e+01 -6.3726e+01 -5.5876e+01 -5.2838e+01 -5.3974e+01 -6.3695e+01 -5.5850e+01 -5.2863e+01 -5.3947e+01 -6.3664e+01 -5.5824e+01 -5.2887e+01 -5.3920e+01 -6.3632e+01 -5.5798e+01 -5.2911e+01 -5.3894e+01 -6.3601e+01 -5.5772e+01 -5.2934e+01 -5.3867e+01 -6.3569e+01 -5.5746e+01 -5.2957e+01 -5.3841e+01 -6.3537e+01 -5.5721e+01 -5.2979e+01 -5.3815e+01 -6.3505e+01 -5.5695e+01 -5.3001e+01 -5.3789e+01 -6.3473e+01 -5.5670e+01 -5.3022e+01 -5.3764e+01 -6.3433e+01 -5.5645e+01 -5.3036e+01 -5.3739e+01 -6.3392e+01 -5.5621e+01 -5.3048e+01 -5.3714e+01 -6.3352e+01 -5.5596e+01 -5.3060e+01 -5.3689e+01 -6.3311e+01 -5.5572e+01 -5.3072e+01 -5.3664e+01 -6.3271e+01 -5.5547e+01 -5.3084e+01 -5.3640e+01 -6.3230e+01 -5.5523e+01 -5.3096e+01 -5.3616e+01 -6.3190e+01 -5.5499e+01 -5.3107e+01 -5.3592e+01 -6.3149e+01 -5.5475e+01 -5.3118e+01 -5.3569e+01 -6.3109e+01 -5.5450e+01 -5.3128e+01 -5.3545e+01 -6.3066e+01 -5.5419e+01 -5.3139e+01 -5.3522e+01 -6.3018e+01 -5.5387e+01 -5.3149e+01 -5.3499e+01 -6.2970e+01 -5.5357e+01 -5.3159e+01 -5.3476e+01 -6.2922e+01 -5.5326e+01 -5.3169e+01 -5.3453e+01 -6.2874e+01 -5.5296e+01 -5.3178e+01 -5.3431e+01 -6.2827e+01 -5.5266e+01 -5.3187e+01 -5.3409e+01 -6.2780e+01 -5.5236e+01 -5.3196e+01 -5.3386e+01 -6.2732e+01 -5.5207e+01 -5.3204e+01 -5.3365e+01 -6.2685e+01 -5.5178e+01 -5.3213e+01 -5.3343e+01 -6.2639e+01 -5.5149e+01 -5.3221e+01 -5.3321e+01 -6.2592e+01 -5.5121e+01 -5.3229e+01 -5.3300e+01 -6.2546e+01 -5.5093e+01 -5.3236e+01 -5.3279e+01 -6.2499e+01 -5.5060e+01 -5.3244e+01 -5.3258e+01 -6.2453e+01 -5.5024e+01 -5.3251e+01 -5.3237e+01 -6.2407e+01 -5.4989e+01 -5.3258e+01 -5.3216e+01 -6.2362e+01 -5.4955e+01 -5.3264e+01 -5.3195e+01 -6.2316e+01 -5.4920e+01 -5.3271e+01 -5.3175e+01 -6.2265e+01 -5.4887e+01 -5.3277e+01 -5.3155e+01 -6.2204e+01 -5.4853e+01 -5.3283e+01 -5.3135e+01 -6.2143e+01 -5.4813e+01 -5.3289e+01 -5.3115e+01 -6.2083e+01 -5.4773e+01 -5.3294e+01 -5.3095e+01 -6.2024e+01 -5.4733e+01 -5.3299e+01 -5.3075e+01 -6.1965e+01 -5.4694e+01 -5.3304e+01 -5.3056e+01 -6.1906e+01 -5.4655e+01 -5.3309e+01 -5.3036e+01 -6.1848e+01 -5.4617e+01 -5.3314e+01 -5.3017e+01 -6.1791e+01 -5.4580e+01 -5.3318e+01 -5.2998e+01 -6.1734e+01 -5.4542e+01 -5.3322e+01 -5.2979e+01 -6.1677e+01 -5.4506e+01 -5.3326e+01 -5.2960e+01 -6.1621e+01 -5.4470e+01 -5.3330e+01 -5.2941e+01 -6.1565e+01 -5.4434e+01 -5.3329e+01 -5.2923e+01 -6.1510e+01 -5.4399e+01 -5.3325e+01 -5.2904e+01 -6.1455e+01 -5.4365e+01 -5.3320e+01 -5.2886e+01 -6.1400e+01 -5.4331e+01 -5.3315e+01 -5.2868e+01 -6.1346e+01 -5.4297e+01 -5.3311e+01 -5.2850e+01 -6.1293e+01 -5.4264e+01 -5.3306e+01 -5.2832e+01 -6.1240e+01 -5.4231e+01 -5.3301e+01 -5.2814e+01 -6.1187e+01 -5.4199e+01 -5.3297e+01 -5.2796e+01 -6.1134e+01 -5.4167e+01 -5.3292e+01 -5.2779e+01 -6.1082e+01 -5.4135e+01 -5.3287e+01 -5.2761e+01 -6.1030e+01 -5.4104e+01 -5.3282e+01 -5.2744e+01 -6.0979e+01 -5.4073e+01 -5.3277e+01 -5.2726e+01 -6.0928e+01 -5.4043e+01 -5.3315e+01 -5.2709e+01 -6.0877e+01 -5.4013e+01 -5.3355e+01 -5.2692e+01 -6.0827e+01 -5.3981e+01 -5.3393e+01 -5.2675e+01 -6.0777e+01 -5.3943e+01 -5.3431e+01 -5.2658e+01 -6.0728e+01 -5.3907e+01 -5.3468e+01 -5.2641e+01 -6.0678e+01 -5.3871e+01 -5.3504e+01 -5.2625e+01 -6.0629e+01 -5.3835e+01 -5.3540e+01 -5.2608e+01 -6.0581e+01 -5.3800e+01 -5.3575e+01 -5.2589e+01 -6.0532e+01 -5.3766e+01 -5.3607e+01 -5.2565e+01 -6.0484e+01 -5.3732e+01 -5.3632e+01 -5.2541e+01 -6.0436e+01 -5.3698e+01 -5.3658e+01 -5.2517e+01 -6.0389e+01 -5.3665e+01 -5.3683e+01 -5.2494e+01 -6.0342e+01 -5.3633e+01 -5.3707e+01 -5.2470e+01 -6.0295e+01 -5.3601e+01 -5.3731e+01 -5.2447e+01 -6.0248e+01 -5.3569e+01 -5.3755e+01 -5.2425e+01 -6.0202e+01 -5.3538e+01 -5.3778e+01 -5.2402e+01 -6.0156e+01 -5.3507e+01 -5.3800e+01 -5.2380e+01 -6.0110e+01 -5.3477e+01 -5.3823e+01 -5.2359e+01 -6.0064e+01 -5.3447e+01 -5.3845e+01 -5.2329e+01 -6.0019e+01 -5.3417e+01 -5.3866e+01 -5.2300e+01 -5.9974e+01 -5.3388e+01 -5.3887e+01 -5.2271e+01 -5.9929e+01 -5.3359e+01 -5.3900e+01 -5.2243e+01 -5.9885e+01 -5.3331e+01 -5.3913e+01 -5.2215e+01 -5.9840e+01 -5.3303e+01 -5.3925e+01 -5.2188e+01 -5.9796e+01 -5.3275e+01 -5.3937e+01 -5.2161e+01 -5.9753e+01 -5.3248e+01 -5.3948e+01 -5.2134e+01 -5.9709e+01 -5.3221e+01 -5.3960e+01 -5.2108e+01 -5.9665e+01 -5.3195e+01 -5.3971e+01 -5.2082e+01 -5.9622e+01 -5.3169e+01 -5.3982e+01 -5.2056e+01 -5.9575e+01 -5.3143e+01 -5.3993e+01 -5.2031e+01 -5.9524e+01 -5.3117e+01 -5.4003e+01 -5.2006e+01 -5.9474e+01 -5.3092e+01 -5.4013e+01 -5.1982e+01 -5.9424e+01 -5.3067e+01 -5.4019e+01 -5.1957e+01 -5.9375e+01 -5.3042e+01 -5.4021e+01 -5.1934e+01 -5.9326e+01 -5.3016e+01 -5.4023e+01 -5.1910e+01 -5.9277e+01 -5.2984e+01 -5.4025e+01 -5.1887e+01 -5.9229e+01 -5.2953e+01 -5.4026e+01 -5.1870e+01 -5.9188e+01 -5.2922e+01 -5.4028e+01 -5.1882e+01 -5.9185e+01 -5.2891e+01 -5.4030e+01 -5.1888e+01 -5.9181e+01 -5.2861e+01 -5.4032e+01 -5.1894e+01 -5.9178e+01 -5.2832e+01 -5.4033e+01 -5.1900e+01 -5.9174e+01 -5.2802e+01 -5.4035e+01 -5.1906e+01 -5.9170e+01 -5.2774e+01 -5.4036e+01 -5.1912e+01 -5.9165e+01 -5.2745e+01 -5.4038e+01 -5.1919e+01 -5.9160e+01 -5.2717e+01 -5.4039e+01 -5.1925e+01 -5.9155e+01 -5.2684e+01 -5.4040e+01 -5.1931e+01 -5.9176e+01 -5.2649e+01 -5.4042e+01 -5.1937e+01 -5.9215e+01 -5.2614e+01 -5.4043e+01 -5.1943e+01 -5.9252e+01 -5.2597e+01 -5.4044e+01 -5.1949e+01 -5.9289e+01 -5.2608e+01 -5.4045e+01 -5.1955e+01 -5.9325e+01 -5.2619e+01 -5.4045e+01 -5.1961e+01 -5.9360e+01 -5.2630e+01 -5.4046e+01 -5.1967e+01 -5.9394e+01 -5.2641e+01 -5.4047e+01 -5.1973e+01 -5.9427e+01 -5.2651e+01 -5.4048e+01 -5.2012e+01 -5.9459e+01 -5.2662e+01 -5.4048e+01 -5.2054e+01 -5.9490e+01 -5.2667e+01 -5.4048e+01 -5.2096e+01 -5.9520e+01 -5.2670e+01 -5.4049e+01 -5.2137e+01 -5.9550e+01 -5.2672e+01 -5.4049e+01 -5.2178e+01 -5.9578e+01 -5.2675e+01 -5.4049e+01 -5.2218e+01 -5.9606e+01 -5.2677e+01 -5.4049e+01 -5.2258e+01 -5.9633e+01 -5.2680e+01 -5.4049e+01 -5.2297e+01 -5.9659e+01 -5.2682e+01 -5.4041e+01 -5.2335e+01 -5.9684e+01 -5.2685e+01 -5.4033e+01 -5.2373e+01 -5.9709e+01 -5.2688e+01 -5.4025e+01 -5.2411e+01 -5.9732e+01 -5.2690e+01 -5.4017e+01 -5.2448e+01 -5.9755e+01 -5.2693e+01 -5.4009e+01 -5.2485e+01 -5.9777e+01 -5.2696e+01 -5.4001e+01 -5.2521e+01 -5.9799e+01 -5.2699e+01 -5.3993e+01 -5.2556e+01 -5.9819e+01 -5.2701e+01 -5.3986e+01 -5.2591e+01 -5.9839e+01 -5.2704e+01 -5.3978e+01 -5.2626e+01 -5.9858e+01 -5.2707e+01 -5.3970e+01 -5.2660e+01 -5.9874e+01 -5.2710e+01 -5.3963e+01 -5.2694e+01 -5.9884e+01 -5.2712e+01 -5.3955e+01 -5.2727e+01 -5.9893e+01 -5.2711e+01 -5.3948e+01 -5.2759e+01 -5.9901e+01 -5.2705e+01 -5.3940e+01 -5.2792e+01 -5.9909e+01 -5.2700e+01 -5.3933e+01 -5.2823e+01 -5.9917e+01 -5.2695e+01 -5.3926e+01 -5.2854e+01 -5.9924e+01 -5.2691e+01 -5.3918e+01 -5.2885e+01 -5.9930e+01 -5.2686e+01 -5.3911e+01 -5.2915e+01 -5.9936e+01 -5.2681e+01 -5.3904e+01 -5.2945e+01 -5.9942e+01 -5.2677e+01 -5.3896e+01 -5.2974e+01 -5.9947e+01 -5.2673e+01 -5.3889e+01 -5.3003e+01 -5.9951e+01 -5.2669e+01 -5.3882e+01 -5.3032e+01 -5.9955e+01 -5.2665e+01 -5.3875e+01 -5.3059e+01 -5.9959e+01 -5.2661e+01 -5.3867e+01 -5.3087e+01 -5.9962e+01 -5.2657e+01 -5.3860e+01 -5.3114e+01 -5.9965e+01 -5.2653e+01 -5.3853e+01 -5.3140e+01 -5.9967e+01 -5.2642e+01 -5.3846e+01 -5.3166e+01 -5.9968e+01 -5.2630e+01 -5.3838e+01 -5.3192e+01 -5.9970e+01 -5.2619e+01 -5.3823e+01 -5.3217e+01 -5.9970e+01 -5.2608e+01 -5.3808e+01 -5.3264e+01 -5.9971e+01 -5.2598e+01 -5.3793e+01 -5.3325e+01 -5.9971e+01 -5.2587e+01 -5.3779e+01 -5.3384e+01 -5.9970e+01 -5.2577e+01 -5.3764e+01 -5.3443e+01 -5.9969e+01 -5.2567e+01 -5.3750e+01 -5.3501e+01 -5.9968e+01 -5.2558e+01 -5.3736e+01 -5.3558e+01 -5.9966e+01 -5.2548e+01 -5.3722e+01 -5.3614e+01 -5.9964e+01 -5.2539e+01 -5.3708e+01 -5.3670e+01 -5.9961e+01 -5.2530e+01 -5.3694e+01 -5.3724e+01 -5.9958e+01 -5.2521e+01 -5.3680e+01 -5.3777e+01 -5.9949e+01 -5.2513e+01 -5.3667e+01 -5.3830e+01 -5.9937e+01 -5.2504e+01 -5.3654e+01 -5.3882e+01 -5.9925e+01 -5.2496e+01 -5.3640e+01 -5.3933e+01 -5.9913e+01 -5.2488e+01 -5.3627e+01 -5.3983e+01 -5.9901e+01 -5.2480e+01 -5.3614e+01 -5.4032e+01 -5.9888e+01 -5.2472e+01 -5.3602e+01 -5.4081e+01 -5.9875e+01 -5.2464e+01 -5.3589e+01 -5.4124e+01 -5.9862e+01 -5.2457e+01 -5.3576e+01 -5.4163e+01 -5.9849e+01 -5.2449e+01 -5.3564e+01 -5.4202e+01 -5.9836e+01 -5.2442e+01 -5.3551e+01 -5.4239e+01 -5.9822e+01 -5.2435e+01 -5.3539e+01 -5.4276e+01 -5.9808e+01 -5.2428e+01 -5.3527e+01 -5.4313e+01 -5.9794e+01 -5.2421e+01 -5.3515e+01 -5.4349e+01 -5.9780e+01 -5.2414e+01 -5.3502e+01 -5.4384e+01 -5.9766e+01 -5.2429e+01 -5.3490e+01 -5.4419e+01 -5.9751e+01 -5.2466e+01 -5.3479e+01 -5.4453e+01 -5.9743e+01 -5.2499e+01 -5.3467e+01 -5.4487e+01 -5.9773e+01 -5.2527e+01 -5.3455e+01 -5.4520e+01 -5.9801e+01 -5.2556e+01 -5.3443e+01 -5.4552e+01 -5.9823e+01 -5.2584e+01 -5.3432e+01 -5.4584e+01 -5.9842e+01 -5.2611e+01 -5.3420e+01 -5.4615e+01 -5.9861e+01 -5.2639e+01 -5.3409e+01 -5.4646e+01 -5.9879e+01 -5.2665e+01 -5.3397e+01 -5.4676e+01 -5.9896e+01 -5.2692e+01 -5.3420e+01 -5.4706e+01 -5.9913e+01 -5.2744e+01 -5.3453e+01 -5.4735e+01 -5.9929e+01 -5.2814e+01 -5.3485e+01 -5.4763e+01 -5.9945e+01 -5.2883e+01 -5.3517e+01 -5.4791e+01 -5.9959e+01 -5.2951e+01 -5.3548e+01 -5.4818e+01 -5.9974e+01 -5.3018e+01 -5.3578e+01 -5.4845e+01 -5.9987e+01 -5.3084e+01 -5.3608e+01 -5.4871e+01 -6.0001e+01 -5.3149e+01 -5.3637e+01 -5.4897e+01 -6.0013e+01 -5.3213e+01 -5.3666e+01 -5.4922e+01 -6.0025e+01 -5.3276e+01 -5.3694e+01 -5.4947e+01 -6.0036e+01 -5.3338e+01 -5.3722e+01 -5.4971e+01 -6.0047e+01 -5.3399e+01 -5.3744e+01 -5.4995e+01 -6.0057e+01 -5.3459e+01 -5.3762e+01 -5.5018e+01 -6.0067e+01 -5.3518e+01 -5.3781e+01 -5.5041e+01 -6.0076e+01 -5.3576e+01 -5.3798e+01 -5.5063e+01 -6.0085e+01 -5.3634e+01 -5.3816e+01 -5.5114e+01 -6.0093e+01 -5.3690e+01 -5.3833e+01 -5.5171e+01 -6.0100e+01 -5.3746e+01 -5.3850e+01 -5.5228e+01 -6.0107e+01 -5.3800e+01 -5.3866e+01 -5.5283e+01 -6.0114e+01 -5.3854e+01 -5.3882e+01 -5.5338e+01 -6.0120e+01 -5.3906e+01 -5.3898e+01 -5.5391e+01 -6.0125e+01 -5.3958e+01 -5.3914e+01 -5.5444e+01 -6.0130e+01 -5.4009e+01 -5.3929e+01 -5.5496e+01 -6.0134e+01 -5.4059e+01 -5.3943e+01 -5.5546e+01 -6.0138e+01 -5.4108e+01 -5.3958e+01 -5.5596e+01 -6.0141e+01 -5.4157e+01 -5.3972e+01 -5.5645e+01 -6.0144e+01 -5.4204e+01 -5.3986e+01 -5.5693e+01 -6.0147e+01 -5.4251e+01 -5.3999e+01 -5.5741e+01 -6.0148e+01 -5.4297e+01 -5.4012e+01 -5.5787e+01 -6.0150e+01 -5.4342e+01 -5.4026e+01 -5.5833e+01 -6.0151e+01 -5.4386e+01 -5.4083e+01 -5.5877e+01 -6.0151e+01 -5.4429e+01 -5.4139e+01 -5.5921e+01 -6.0151e+01 -5.4472e+01 -5.4194e+01 -5.5964e+01 -6.0151e+01 -5.4514e+01 -5.4248e+01 -5.6003e+01 -6.0150e+01 -5.4555e+01 -5.4302e+01 -5.6036e+01 -6.0148e+01 -5.4595e+01 -5.4354e+01 -5.6069e+01 -6.0147e+01 -5.4634e+01 -5.4405e+01 -5.6101e+01 -6.0144e+01 -5.4673e+01 -5.4455e+01 -5.6133e+01 -6.0142e+01 -5.4711e+01 -5.4505e+01 -5.6163e+01 -6.0139e+01 -5.4748e+01 -5.4553e+01 -5.6194e+01 -6.0135e+01 -5.4785e+01 -5.4601e+01 -5.6223e+01 -6.0131e+01 -5.4820e+01 -5.4648e+01 -5.6252e+01 -6.0127e+01 -5.4855e+01 -5.4693e+01 -5.6281e+01 -6.0122e+01 -5.4882e+01 -5.4738e+01 -5.6308e+01 -6.0117e+01 -5.4908e+01 -5.4782e+01 -5.6335e+01 -6.0111e+01 -5.4933e+01 -5.4826e+01 -5.6362e+01 -6.0105e+01 -5.4955e+01 -5.4868e+01 -5.6388e+01 -6.0132e+01 -5.4971e+01 -5.4909e+01 -5.6413e+01 -6.0169e+01 -5.4987e+01 -5.4950e+01 -5.6438e+01 -6.0206e+01 -5.5003e+01 -5.4990e+01 -5.6463e+01 -6.0241e+01 -5.5062e+01 -5.5029e+01 -5.6486e+01 -6.0275e+01 -5.5121e+01 -5.5067e+01 -5.6509e+01 -6.0308e+01 -5.5179e+01 -5.5105e+01 -5.6553e+01 -6.0341e+01 -5.5236e+01 -5.5141e+01 -5.6611e+01 -6.0372e+01 -5.5292e+01 -5.5177e+01 -5.6669e+01 -6.0403e+01 -5.5347e+01 -5.5212e+01 -5.6725e+01 -6.0432e+01 -5.5402e+01 -5.5247e+01 -5.6780e+01 -6.0460e+01 -5.5455e+01 -5.5280e+01 -5.6835e+01 -6.0488e+01 -5.5507e+01 -5.5313e+01 -5.6888e+01 -6.0515e+01 -5.5559e+01 -5.5345e+01 -5.6941e+01 -6.0540e+01 -5.5609e+01 -5.5373e+01 -5.6992e+01 -6.0570e+01 -5.5651e+01 -5.5396e+01 -5.7042e+01 -6.0642e+01 -5.5692e+01 -5.5418e+01 -5.7092e+01 -6.0753e+01 -5.5732e+01 -5.5440e+01 -5.7140e+01 -6.0863e+01 -5.5772e+01 -5.5461e+01 -5.7188e+01 -6.0970e+01 -5.5811e+01 -5.5481e+01 -5.7235e+01 -6.1075e+01 -5.5849e+01 -5.5502e+01 -5.7280e+01 -6.1178e+01 -5.5887e+01 -5.5521e+01 -5.7325e+01 -6.1279e+01 -5.5923e+01 -5.5540e+01 -5.7369e+01 -6.1378e+01 -5.5960e+01 -5.5559e+01 -5.7412e+01 -6.1474e+01 -5.5995e+01 -5.5577e+01 -5.7454e+01 -6.1569e+01 -5.6027e+01 -5.5595e+01 -5.7496e+01 -6.1662e+01 -5.6054e+01 -5.5612e+01 -5.7536e+01 -6.1752e+01 -5.6079e+01 -5.5629e+01 -5.7575e+01 -6.1833e+01 -5.6105e+01 -5.5645e+01 -5.7614e+01 -6.1912e+01 -5.6130e+01 -5.5661e+01 -5.7652e+01 -6.1990e+01 -5.6154e+01 -5.5677e+01 -5.7689e+01 -6.2065e+01 -5.6178e+01 -5.5691e+01 -5.7725e+01 -6.2139e+01 -5.6202e+01 -5.5706e+01 -5.7760e+01 -6.2212e+01 -5.6223e+01 -5.5720e+01 -5.7794e+01 -6.2283e+01 -5.6237e+01 -5.5733e+01 -5.7828e+01 -6.2352e+01 -5.6252e+01 -5.5747e+01 -5.7861e+01 -6.2419e+01 -5.6266e+01 -5.5759e+01 -5.7893e+01 -6.2485e+01 -5.6280e+01 -5.5772e+01 -5.7924e+01 -6.2550e+01 -5.6293e+01 -5.5783e+01 -5.7955e+01 -6.2613e+01 -5.6307e+01 -5.5795e+01 -5.7984e+01 -6.2674e+01 -5.6320e+01 -5.5806e+01 -5.8013e+01 -6.2734e+01 -5.6333e+01 -5.5816e+01 -5.8041e+01 -6.2793e+01 -5.6345e+01 -5.5826e+01 -5.8069e+01 -6.2850e+01 -5.6358e+01 -5.5836e+01 -5.8095e+01 -6.2905e+01 -5.6370e+01 -5.5845e+01 -5.8121e+01 -6.2959e+01 -5.6381e+01 -5.5854e+01 -5.8146e+01 -6.3012e+01 -5.6393e+01 -5.5863e+01 -5.8171e+01 -6.3063e+01 -5.6404e+01 -5.5868e+01 -5.8194e+01 -6.3113e+01 -5.6415e+01 -5.5867e+01 -5.8217e+01 -6.3162e+01 -5.6425e+01 -5.5867e+01 -5.8240e+01 -6.3209e+01 -5.6436e+01 -5.5867e+01 -5.8261e+01 -6.3255e+01 -5.6446e+01 -5.5866e+01 -5.8282e+01 -6.3299e+01 -5.6455e+01 -5.5865e+01 -5.8303e+01 -6.3336e+01 -5.6465e+01 -5.5857e+01 -5.8320e+01 -6.3370e+01 -5.6474e+01 -5.5840e+01 -5.8331e+01 -6.3403e+01 -5.6483e+01 -5.5824e+01 -5.8341e+01 -6.3435e+01 -5.6491e+01 -5.5829e+01 -5.8351e+01 -6.3466e+01 -5.6499e+01 -5.5857e+01 -5.8361e+01 -6.3496e+01 -5.6507e+01 -5.5884e+01 -5.8365e+01 -6.3525e+01 -5.6515e+01 -5.5911e+01 -5.8366e+01 -6.3553e+01 -5.6522e+01 -5.5937e+01 -5.8367e+01 -6.3580e+01 -5.6529e+01 -5.5963e+01 -5.8367e+01 -6.3606e+01 -5.6536e+01 -5.5989e+01 -5.8367e+01 -6.3631e+01 -5.6543e+01 -5.6013e+01 -5.8367e+01 -6.3655e+01 -5.6549e+01 -5.6038e+01 -5.8367e+01 -6.3678e+01 -5.6555e+01 -5.6062e+01 -5.8366e+01 -6.3700e+01 -5.6560e+01 -5.6085e+01 -5.8365e+01 -6.3721e+01 -5.6566e+01 -5.6108e+01 -5.8364e+01 -6.3741e+01 -5.6571e+01 -5.6131e+01 -5.8362e+01 -6.3760e+01 -5.6575e+01 -5.6153e+01 -5.8361e+01 -6.3778e+01 -5.6580e+01 -5.6174e+01 -5.8359e+01 -6.3796e+01 -5.6584e+01 -5.6195e+01 -5.8357e+01 -6.3812e+01 -5.6588e+01 -5.6207e+01 -5.8354e+01 -6.3828e+01 -5.6591e+01 -5.6220e+01 -5.8352e+01 -6.3843e+01 -5.6595e+01 -5.6232e+01 -5.8349e+01 -6.3857e+01 -5.6598e+01 -5.6244e+01 -5.8345e+01 -6.3870e+01 -5.6601e+01 -5.6255e+01 -5.8342e+01 -6.3882e+01 -5.6603e+01 -5.6267e+01 -5.8338e+01 -6.3893e+01 -5.6601e+01 -5.6278e+01 -5.8334e+01 -6.3904e+01 -5.6595e+01 -5.6288e+01 -5.8330e+01 -6.3908e+01 -5.6589e+01 -5.6297e+01 -5.8326e+01 -6.3909e+01 -5.6583e+01 -5.6299e+01 -5.8315e+01 -6.3909e+01 -5.6576e+01 -5.6301e+01 -5.8303e+01 -6.3909e+01 -5.6570e+01 -5.6304e+01 -5.8290e+01 -6.3909e+01 -5.6564e+01 -5.6306e+01 -5.8277e+01 -6.3907e+01 -5.6557e+01 -5.6307e+01 -5.8264e+01 -6.3906e+01 -5.6551e+01 -5.6309e+01 -5.8251e+01 -6.3903e+01 -5.6544e+01 -5.6311e+01 -5.8238e+01 -6.3900e+01 -5.6537e+01 -5.6312e+01 -5.8222e+01 -6.3897e+01 -5.6530e+01 -5.6314e+01 -5.8200e+01 -6.3893e+01 -5.6523e+01 -5.6315e+01 -5.8180e+01 -6.3888e+01 -5.6516e+01 -5.6316e+01 -5.8159e+01 -6.3883e+01 -5.6509e+01 -5.6317e+01 -5.8138e+01 -6.3878e+01 -5.6502e+01 -5.6318e+01 -5.8117e+01 -6.3872e+01 -5.6494e+01 -5.6319e+01 -5.8097e+01 -6.3865e+01 -5.6487e+01 -5.6320e+01 -5.8074e+01 -6.3858e+01 -5.6479e+01 -5.6320e+01 -5.8046e+01 -6.3850e+01 -5.6471e+01 -5.6321e+01 -5.8018e+01 -6.3842e+01 -5.6463e+01 -5.6321e+01 -5.7990e+01 -6.3833e+01 -5.6455e+01 -5.6321e+01 -5.7963e+01 -6.3824e+01 -5.6447e+01 -5.6318e+01 -5.7935e+01 -6.3814e+01 -5.6439e+01 -5.6310e+01 -5.7908e+01 -6.3804e+01 -5.6431e+01 -5.6302e+01 -5.7882e+01 -6.3794e+01 -5.6422e+01 -5.6294e+01 -5.7855e+01 -6.3783e+01 -5.6414e+01 -5.6286e+01 -5.7829e+01 -6.3771e+01 -5.6405e+01 -5.6278e+01 -5.7803e+01 -6.3759e+01 -5.6397e+01 -5.6270e+01 -5.7777e+01 -6.3747e+01 -5.6388e+01 -5.6260e+01 -5.7752e+01 -6.3734e+01 -5.6379e+01 -5.6245e+01 -5.7726e+01 -6.3720e+01 -5.6370e+01 -5.6229e+01 -5.7701e+01 -6.3729e+01 -5.6360e+01 -5.6213e+01 -5.7676e+01 -6.3759e+01 -5.6351e+01 -5.6198e+01 -5.7651e+01 -6.3788e+01 -5.6339e+01 -5.6183e+01 -5.7627e+01 -6.3816e+01 -5.6321e+01 -5.6168e+01 -5.7602e+01 -6.3843e+01 -5.6304e+01 -5.6153e+01 -5.7578e+01 -6.3869e+01 -5.6287e+01 -5.6139e+01 -5.7554e+01 -6.3894e+01 -5.6269e+01 -5.6124e+01 -5.7530e+01 -6.3918e+01 -5.6252e+01 -5.6110e+01 -5.7506e+01 -6.3940e+01 -5.6235e+01 -5.6092e+01 -5.7482e+01 -6.3962e+01 -5.6218e+01 -5.6070e+01 -5.7458e+01 -6.3983e+01 -5.6201e+01 -5.6049e+01 -5.7435e+01 -6.4003e+01 -5.6184e+01 -5.6027e+01 -5.7412e+01 -6.4021e+01 -5.6167e+01 -5.6006e+01 -5.7388e+01 -6.4039e+01 -5.6150e+01 -5.5986e+01 -5.7365e+01 -6.4056e+01 -5.6133e+01 -5.5962e+01 -5.7342e+01 -6.4072e+01 -5.6117e+01 -5.5934e+01 -5.7319e+01 -6.4087e+01 -5.6098e+01 -5.5906e+01 -5.7297e+01 -6.4101e+01 -5.6074e+01 -5.5879e+01 -5.7274e+01 -6.4115e+01 -5.6049e+01 -5.5852e+01 -5.7251e+01 -6.4127e+01 -5.6025e+01 -5.5826e+01 -5.7229e+01 -6.4139e+01 -5.6001e+01 -5.5800e+01 -5.7206e+01 -6.4149e+01 -5.5977e+01 -5.5774e+01 -5.7176e+01 -6.4159e+01 -5.5954e+01 -5.5749e+01 -5.7146e+01 -6.4168e+01 -5.5930e+01 -5.5724e+01 -5.7116e+01 -6.4176e+01 -5.5907e+01 -5.5700e+01 -5.7086e+01 -6.4183e+01 -5.5884e+01 -5.5676e+01 -5.7057e+01 -6.4190e+01 -5.5862e+01 -5.5652e+01 -5.7028e+01 -6.4188e+01 -5.5839e+01 -5.5629e+01 -5.6995e+01 -6.4185e+01 -5.5817e+01 -5.5605e+01 -5.6959e+01 -6.4181e+01 -5.5794e+01 -5.5583e+01 -5.6923e+01 -6.4177e+01 -5.5772e+01 -5.5560e+01 -5.6882e+01 -6.4173e+01 -5.5749e+01 -5.5538e+01 -5.6839e+01 -6.4168e+01 -5.5719e+01 -5.5516e+01 -5.6797e+01 -6.4162e+01 -5.5690e+01 -5.5494e+01 -5.6755e+01 -6.4156e+01 -5.5661e+01 -5.5473e+01 -5.6706e+01 -6.4149e+01 -5.5632e+01 -5.5452e+01 -5.6657e+01 -6.4141e+01 -5.5604e+01 -5.5431e+01 -5.6610e+01 -6.4134e+01 -5.5572e+01 -5.5410e+01 -5.6563e+01 -6.4125e+01 -5.5537e+01 -5.5390e+01 -5.6516e+01 -6.4116e+01 -5.5502e+01 -5.5370e+01 -5.6471e+01 -6.4107e+01 -5.5467e+01 -5.5350e+01 -5.6426e+01 -6.4097e+01 -5.5433e+01 -5.5330e+01 -5.6381e+01 -6.4086e+01 -5.5399e+01 -5.5310e+01 -5.6338e+01 -6.4075e+01 -5.5366e+01 -5.5291e+01 -5.6294e+01 -6.4064e+01 -5.5333e+01 -5.5272e+01 -5.6252e+01 -6.4052e+01 -5.5300e+01 -5.5253e+01 -5.6210e+01 -6.4040e+01 -5.5268e+01 -5.5234e+01 -5.6169e+01 -6.4027e+01 -5.5237e+01 -5.5216e+01 -5.6128e+01 -6.4013e+01 -5.5205e+01 -5.5197e+01 -5.6088e+01 -6.3998e+01 -5.5175e+01 -5.5179e+01 -5.6049e+01 -6.3976e+01 -5.5144e+01 -5.5161e+01 -5.6009e+01 -6.3954e+01 -5.5114e+01 -5.5143e+01 -5.5971e+01 -6.3931e+01 -5.5084e+01 -5.5125e+01 -5.5933e+01 -6.3908e+01 -5.5055e+01 -5.5107e+01 -5.5895e+01 -6.3877e+01 -5.5026e+01 -5.5090e+01 -5.5858e+01 -6.3846e+01 -5.4998e+01 -5.5073e+01 -5.5822e+01 -6.3815e+01 -5.4969e+01 -5.5055e+01 -5.5786e+01 -6.3783e+01 -5.4941e+01 -5.5036e+01 -5.5750e+01 -6.3752e+01 -5.4914e+01 -5.5011e+01 -5.5715e+01 -6.3720e+01 -5.4886e+01 -5.4986e+01 -5.5680e+01 -6.3685e+01 -5.4859e+01 -5.4962e+01 -5.5646e+01 -6.3645e+01 -5.4828e+01 -5.4938e+01 -5.5612e+01 -6.3606e+01 -5.4794e+01 -5.4914e+01 -5.5579e+01 -6.3567e+01 -5.4760e+01 -5.4891e+01 -5.5546e+01 -6.3528e+01 -5.4727e+01 -5.4867e+01 -5.5513e+01 -6.3489e+01 -5.4694e+01 -5.4844e+01 -5.5481e+01 -6.3450e+01 -5.4661e+01 -5.4822e+01 -5.5449e+01 -6.3411e+01 -5.4629e+01 -5.4799e+01 -5.5417e+01 -6.3372e+01 -5.4598e+01 -5.4777e+01 -5.5386e+01 -6.3325e+01 -5.4567e+01 -5.4755e+01 -5.5355e+01 -6.3279e+01 -5.4536e+01 -5.4728e+01 -5.5325e+01 -6.3233e+01 -5.4504e+01 -5.4699e+01 -5.5295e+01 -6.3187e+01 -5.4465e+01 -5.4670e+01 -5.5265e+01 -6.3142e+01 -5.4420e+01 -5.4641e+01 -5.5235e+01 -6.3097e+01 -5.4375e+01 -5.4613e+01 -5.5206e+01 -6.3052e+01 -5.4331e+01 -5.4585e+01 -5.5177e+01 -6.3008e+01 -5.4288e+01 -5.4558e+01 -5.5149e+01 -6.2983e+01 -5.4264e+01 -5.4531e+01 -5.5121e+01 -6.2983e+01 -5.4267e+01 -5.4504e+01 -5.5093e+01 -6.2983e+01 -5.4270e+01 -5.4478e+01 -5.5065e+01 -6.2982e+01 -5.4273e+01 -5.4452e+01 -5.5037e+01 -6.2981e+01 -5.4276e+01 -5.4427e+01 -5.5010e+01 -6.2980e+01 -5.4278e+01 -5.4401e+01 -5.4983e+01 -6.2978e+01 -5.4281e+01 -5.4376e+01 -5.4957e+01 -6.2976e+01 -5.4284e+01 -5.4352e+01 -5.4930e+01 -6.2973e+01 -5.4287e+01 -5.4327e+01 -5.4904e+01 -6.2970e+01 -5.4290e+01 -5.4303e+01 -5.4878e+01 -6.2966e+01 -5.4292e+01 -5.4280e+01 -5.4853e+01 -6.2962e+01 -5.4295e+01 -5.4256e+01 -5.4827e+01 -6.2958e+01 -5.4298e+01 -5.4233e+01 -5.4802e+01 -6.2953e+01 -5.4300e+01 -5.4210e+01 -5.4777e+01 -6.2948e+01 -5.4303e+01 -5.4187e+01 -5.4747e+01 -6.2942e+01 -5.4306e+01 -5.4165e+01 -5.4714e+01 -6.2936e+01 -5.4308e+01 -5.4143e+01 -5.4682e+01 -6.2929e+01 -5.4311e+01 -5.4121e+01 -5.4651e+01 -6.2922e+01 -5.4313e+01 -5.4099e+01 -5.4619e+01 -6.2915e+01 -5.4315e+01 -5.4078e+01 -5.4588e+01 -6.2907e+01 -5.4317e+01 -5.4057e+01 -5.4558e+01 -6.2899e+01 -5.4320e+01 -5.4036e+01 -5.4528e+01 -6.2891e+01 -5.4322e+01 -5.4015e+01 -5.4498e+01 -6.2882e+01 -5.4324e+01 -5.3994e+01 -5.4469e+01 -6.2873e+01 -5.4326e+01 -5.3974e+01 -5.4440e+01 -6.2863e+01 -5.4328e+01 -5.3954e+01 -5.4411e+01 -6.2853e+01 -5.4329e+01 -5.3934e+01 -5.4382e+01 -6.2842e+01 -5.4331e+01 -5.3914e+01 -5.4354e+01 -6.2832e+01 -5.4333e+01 -5.3894e+01 -5.4326e+01 -6.2821e+01 -5.4334e+01 -5.3875e+01 -5.4299e+01 -6.2809e+01 -5.4335e+01 -5.3856e+01 -5.4272e+01 -6.2797e+01 -5.4337e+01 -5.3837e+01 -5.4245e+01 -6.2785e+01 -5.4338e+01 -5.3818e+01 -5.4218e+01 -6.2772e+01 -5.4339e+01 -5.3799e+01 -5.4192e+01 -6.2759e+01 -5.4340e+01 -5.3781e+01 -5.4166e+01 -6.2746e+01 -5.4341e+01 -5.3787e+01 -5.4140e+01 -6.2732e+01 -5.4341e+01 -5.3813e+01 -5.4115e+01 -6.2718e+01 -5.4342e+01 -5.3839e+01 -5.4089e+01 -6.2704e+01 -5.4343e+01 -5.3864e+01 -5.4064e+01 -6.2683e+01 -5.4343e+01 -5.3889e+01 -5.4040e+01 -6.2660e+01 -5.4343e+01 -5.3913e+01 -5.4009e+01 -6.2637e+01 -5.4343e+01 -5.3930e+01 -5.3977e+01 -6.2614e+01 -5.4343e+01 -5.3945e+01 -5.3945e+01 -6.2591e+01 -5.4337e+01 -5.3960e+01 -5.3914e+01 -6.2567e+01 -5.4329e+01 -5.3975e+01 -5.3883e+01 -6.2544e+01 -5.4321e+01 -5.3989e+01 -5.3853e+01 -6.2520e+01 -5.4313e+01 -5.4003e+01 -5.3823e+01 -6.2496e+01 -5.4305e+01 -5.4017e+01 -5.3793e+01 -6.2472e+01 -5.4297e+01 -5.4030e+01 -5.3764e+01 -6.2448e+01 -5.4289e+01 -5.4043e+01 -5.3735e+01 -6.2424e+01 -5.4282e+01 -5.4056e+01 -5.3706e+01 -6.2399e+01 -5.4274e+01 -5.4069e+01 -5.3678e+01 -6.2375e+01 -5.4266e+01 -5.4081e+01 -5.3665e+01 -6.2350e+01 -5.4259e+01 -5.4093e+01 -5.3674e+01 -6.2325e+01 -5.4251e+01 -5.4104e+01 -5.3683e+01 -6.2300e+01 -5.4244e+01 -5.4116e+01 -5.3691e+01 -6.2275e+01 -5.4236e+01 -5.4127e+01 -5.3700e+01 -6.2249e+01 -5.4229e+01 -5.4138e+01 -5.3708e+01 -6.2224e+01 -5.4222e+01 -5.4148e+01 -5.3717e+01 -6.2198e+01 -5.4214e+01 -5.4159e+01 -5.3725e+01 -6.2173e+01 -5.4207e+01 -5.4169e+01 -5.3733e+01 -6.2147e+01 -5.4199e+01 -5.4178e+01 -5.3741e+01 -6.2121e+01 -5.4192e+01 -5.4188e+01 -5.3749e+01 -6.2095e+01 -5.4184e+01 -5.4197e+01 -5.3756e+01 -6.2068e+01 -5.4177e+01 -5.4206e+01 -5.3763e+01 -6.2042e+01 -5.4165e+01 -5.4214e+01 -5.3771e+01 -6.2015e+01 -5.4150e+01 -5.4223e+01 -5.3778e+01 -6.1989e+01 -5.4135e+01 -5.4231e+01 -5.3785e+01 -6.1962e+01 -5.4120e+01 -5.4233e+01 -5.3791e+01 -6.1935e+01 -5.4105e+01 -5.4225e+01 -5.3798e+01 -6.1908e+01 -5.4090e+01 -5.4217e+01 -5.3804e+01 -6.1881e+01 -5.4076e+01 -5.4208e+01 -5.3811e+01 -6.1853e+01 -5.4062e+01 -5.4200e+01 -5.3817e+01 -6.1826e+01 -5.4048e+01 -5.4192e+01 -5.3823e+01 -6.1798e+01 -5.4028e+01 -5.4185e+01 -5.3828e+01 -6.1771e+01 -5.4006e+01 -5.4177e+01 -5.3834e+01 -6.1743e+01 -5.3985e+01 -5.4169e+01 -5.3839e+01 -6.1715e+01 -5.3964e+01 -5.4162e+01 -5.3845e+01 -6.1687e+01 -5.3943e+01 -5.4154e+01 -5.3850e+01 -6.1659e+01 -5.3923e+01 -5.4147e+01 -5.3855e+01 -6.1630e+01 -5.3903e+01 -5.4140e+01 -5.3859e+01 -6.1602e+01 -5.3883e+01 -5.4132e+01 -5.3864e+01 -6.1573e+01 -5.3864e+01 -5.4125e+01 -5.3868e+01 -6.1545e+01 -5.3844e+01 -5.4118e+01 -5.3872e+01 -6.1516e+01 -5.3826e+01 -5.4111e+01 -5.3876e+01 -6.1487e+01 -5.3807e+01 -5.4104e+01 -5.3880e+01 -6.1458e+01 -5.3788e+01 -5.4097e+01 -5.3884e+01 -6.1429e+01 -5.3770e+01 -5.4090e+01 -5.3887e+01 -6.1400e+01 -5.3752e+01 -5.4083e+01 -5.3891e+01 -6.1370e+01 -5.3734e+01 -5.4076e+01 -5.3894e+01 -6.1341e+01 -5.3717e+01 -5.4069e+01 -5.3897e+01 -6.1304e+01 -5.3700e+01 -5.4062e+01 -5.3900e+01 -6.1267e+01 -5.3675e+01 -5.4055e+01 -5.3902e+01 -6.1229e+01 -5.3650e+01 -5.4048e+01 -5.3905e+01 -6.1192e+01 -5.3626e+01 -5.4042e+01 -5.3907e+01 -6.1155e+01 -5.3602e+01 -5.4035e+01 -5.3909e+01 -6.1118e+01 -5.3578e+01 -5.4028e+01 -5.3911e+01 -6.1081e+01 -5.3555e+01 -5.4021e+01 -5.3905e+01 -6.1068e+01 -5.3525e+01 -5.4014e+01 -5.3898e+01 -6.1075e+01 -5.3495e+01 -5.4008e+01 -5.3884e+01 -6.1082e+01 -5.3465e+01 -5.4001e+01 -5.3870e+01 -6.1088e+01 -5.3436e+01 -5.3994e+01 -5.3856e+01 -6.1094e+01 -5.3407e+01 -5.3987e+01 -5.3843e+01 -6.1099e+01 -5.3379e+01 -5.3980e+01 -5.3829e+01 -6.1104e+01 -5.3351e+01 -5.3973e+01 -5.3816e+01 -6.1108e+01 -5.3324e+01 -5.3967e+01 -5.3803e+01 -6.1112e+01 -5.3297e+01 -5.3960e+01 -5.3790e+01 -6.1115e+01 -5.3271e+01 -5.3953e+01 -5.3777e+01 -6.1117e+01 -5.3245e+01 -5.3946e+01 -5.3765e+01 -6.1119e+01 -5.3219e+01 -5.3939e+01 -5.3753e+01 -6.1121e+01 -5.3194e+01 -5.3932e+01 -5.3740e+01 -6.1121e+01 -5.3170e+01 -5.3925e+01 -5.3728e+01 -6.1122e+01 -5.3145e+01 -5.3918e+01 -5.3716e+01 -6.1122e+01 -5.3122e+01 -5.3911e+01 -5.3705e+01 -6.1121e+01 -5.3098e+01 -5.3904e+01 -5.3693e+01 -6.1120e+01 -5.3075e+01 -5.3897e+01 -5.3681e+01 -6.1118e+01 -5.3052e+01 -5.3889e+01 -5.3670e+01 -6.1116e+01 -5.3030e+01 -5.3874e+01 -5.3659e+01 -6.1114e+01 -5.3008e+01 -5.3859e+01 -5.3648e+01 -6.1111e+01 -5.2986e+01 -5.3844e+01 -5.3637e+01 -6.1107e+01 -5.2965e+01 -5.3829e+01 -5.3626e+01 -6.1103e+01 -5.2939e+01 -5.3815e+01 -5.3615e+01 -6.1099e+01 -5.2910e+01 -5.3800e+01 -5.3604e+01 -6.1094e+01 -5.2882e+01 -5.3786e+01 -5.3593e+01 -6.1088e+01 -5.2854e+01 -5.3772e+01 -5.3583e+01 -6.1083e+01 -5.2827e+01 -5.3758e+01 -5.3572e+01 -6.1076e+01 -5.2801e+01 -5.3742e+01 -5.3562e+01 -6.1065e+01 -5.2774e+01 -5.3720e+01 -5.3551e+01 -6.1050e+01 -5.2749e+01 -5.3699e+01 -5.3541e+01 -6.1035e+01 -5.2723e+01 -5.3678e+01 -5.3531e+01 -6.1019e+01 -5.2698e+01 -5.3657e+01 -5.3521e+01 -6.1004e+01 -5.2669e+01 -5.3637e+01 -5.3510e+01 -6.0988e+01 -5.2637e+01 -5.3616e+01 -5.3500e+01 -6.0972e+01 -5.2606e+01 -5.3596e+01 -5.3490e+01 -6.0955e+01 -5.2575e+01 -5.3577e+01 -5.3480e+01 -6.0939e+01 -5.2545e+01 -5.3557e+01 -5.3470e+01 -6.0922e+01 -5.2515e+01 -5.3538e+01 -5.3461e+01 -6.0905e+01 -5.2486e+01 -5.3519e+01 -5.3451e+01 -6.0888e+01 -5.2457e+01 -5.3500e+01 -5.3441e+01 -6.0871e+01 -5.2429e+01 -5.3482e+01 -5.3431e+01 -6.0853e+01 -5.2402e+01 -5.3464e+01 -5.3422e+01 -6.0838e+01 -5.2375e+01 -5.3446e+01 -5.3412e+01 -6.0864e+01 -5.2348e+01 -5.3428e+01 -5.3402e+01 -6.0890e+01 -5.2322e+01 -5.3410e+01 -5.3393e+01 -6.0907e+01 -5.2297e+01 -5.3386e+01 -5.3383e+01 -6.0924e+01 -5.2265e+01 -5.3361e+01 -5.3374e+01 -6.0934e+01 -5.2232e+01 -5.3336e+01 -5.3364e+01 -6.0937e+01 -5.2200e+01 -5.3312e+01 -5.3355e+01 -6.0936e+01 -5.2161e+01 -5.3288e+01 -5.3345e+01 -6.0934e+01 -5.2122e+01 -5.3265e+01 -5.3336e+01 -6.0932e+01 -5.2084e+01 -5.3242e+01 -5.3326e+01 -6.0930e+01 -5.2048e+01 -5.3219e+01 -5.3317e+01 -6.0928e+01 -5.2011e+01 -5.3196e+01 -5.3307e+01 -6.0925e+01 -5.1976e+01 -5.3174e+01 -5.3298e+01 -6.0923e+01 -5.1934e+01 -5.3152e+01 -5.3289e+01 -6.0920e+01 -5.1892e+01 -5.3131e+01 -5.3279e+01 -6.0916e+01 -5.1851e+01 -5.3110e+01 -5.3270e+01 -6.0913e+01 -5.1811e+01 -5.3089e+01 -5.3260e+01 -6.0909e+01 -5.1771e+01 -5.3068e+01 -5.3251e+01 -6.0905e+01 -5.1733e+01 -5.3048e+01 -5.3242e+01 -6.0900e+01 -5.1695e+01 -5.3028e+01 -5.3232e+01 -6.0896e+01 -5.1658e+01 -5.3008e+01 -5.3223e+01 -6.0889e+01 -5.1622e+01 -5.2989e+01 -5.3214e+01 -6.0876e+01 -5.1587e+01 -5.2970e+01 -5.3204e+01 -6.0863e+01 -5.1550e+01 -5.2951e+01 -5.3195e+01 -6.0850e+01 -5.1508e+01 -5.2932e+01 -5.3186e+01 -6.0836e+01 -5.1467e+01 -5.2913e+01 -5.3176e+01 -6.0823e+01 -5.1427e+01 -5.2895e+01 -5.3167e+01 -6.0809e+01 -5.1388e+01 -5.2877e+01 -5.3158e+01 -6.0796e+01 -5.1350e+01 -5.2859e+01 -5.3148e+01 -6.0782e+01 -5.1312e+01 -5.2842e+01 -5.3139e+01 -6.0768e+01 -5.1276e+01 -5.2824e+01 -5.3129e+01 -6.0754e+01 -5.1240e+01 -5.2807e+01 -5.3112e+01 -6.0740e+01 -5.1205e+01 -5.2790e+01 -5.3094e+01 -6.0726e+01 -5.1170e+01 -5.2774e+01 -5.3077e+01 -6.0712e+01 -5.1137e+01 -5.2757e+01 -5.3061e+01 -6.0697e+01 -5.1104e+01 -5.2741e+01 -5.3044e+01 -6.0683e+01 -5.1072e+01 -5.2724e+01 -5.3028e+01 -6.0668e+01 -5.1040e+01 -5.2708e+01 -5.3011e+01 -6.0653e+01 -5.1009e+01 -5.2693e+01 -5.2995e+01 -6.0653e+01 -5.0979e+01 -5.2677e+01 -5.2979e+01 -6.0683e+01 -5.0944e+01 -5.2661e+01 -5.2963e+01 -6.0711e+01 -5.0908e+01 -5.2646e+01 -5.2948e+01 -6.0739e+01 -5.0872e+01 -5.2631e+01 -5.2932e+01 -6.0766e+01 -5.0837e+01 -5.2616e+01 -5.2917e+01 -6.0792e+01 -5.0800e+01 -5.2600e+01 -5.2902e+01 -6.0818e+01 -5.0758e+01 -5.2577e+01 -5.2886e+01 -6.0843e+01 -5.0718e+01 -5.2555e+01 -5.2872e+01 -6.0867e+01 -5.0678e+01 -5.2533e+01 -5.2857e+01 -6.0890e+01 -5.0640e+01 -5.2511e+01 -5.2842e+01 -6.0912e+01 -5.0602e+01 -5.2490e+01 -5.2827e+01 -6.0934e+01 -5.0565e+01 -5.2469e+01 -5.2813e+01 -6.0955e+01 -5.0529e+01 -5.2448e+01 -5.2799e+01 -6.0976e+01 -5.0494e+01 -5.2428e+01 -5.2784e+01 -6.0995e+01 -5.0459e+01 -5.2408e+01 -5.2770e+01 -6.1014e+01 -5.0426e+01 -5.2388e+01 -5.2756e+01 -6.1032e+01 -5.0393e+01 -5.2368e+01 -5.2742e+01 -6.1050e+01 -5.0386e+01 -5.2349e+01 -5.2729e+01 -6.1066e+01 -5.0399e+01 -5.2330e+01 -5.2715e+01 -6.1082e+01 -5.0412e+01 -5.2311e+01 -5.2701e+01 -6.1098e+01 -5.0425e+01 -5.2292e+01 -5.2688e+01 -6.1113e+01 -5.0438e+01 -5.2274e+01 -5.2675e+01 -6.1127e+01 -5.0452e+01 -5.2256e+01 -5.2661e+01 -6.1140e+01 -5.0465e+01 -5.2238e+01 -5.2648e+01 -6.1153e+01 -5.0478e+01 -5.2221e+01 -5.2635e+01 -6.1165e+01 -5.0491e+01 -5.2203e+01 -5.2622e+01 -6.1176e+01 -5.0504e+01 -5.2186e+01 -5.2609e+01 -6.1183e+01 -5.0518e+01 -5.2169e+01 -5.2596e+01 -6.1186e+01 -5.0531e+01 -5.2153e+01 -5.2583e+01 -6.1187e+01 -5.0544e+01 -5.2136e+01 -5.2571e+01 -6.1189e+01 -5.0557e+01 -5.2120e+01 -5.2558e+01 -6.1190e+01 -5.0571e+01 -5.2104e+01 -5.2546e+01 -6.1190e+01 -5.0584e+01 -5.2088e+01 -5.2533e+01 -6.1190e+01 -5.0597e+01 -5.2072e+01 -5.2521e+01 -6.1190e+01 -5.0610e+01 -5.2057e+01 -5.2508e+01 -6.1189e+01 -5.0623e+01 -5.2041e+01 -5.2496e+01 -6.1188e+01 -5.0636e+01 -5.2026e+01 -5.2484e+01 -6.1187e+01 -5.0649e+01 -5.2006e+01 -5.2472e+01 -6.1185e+01 -5.0662e+01 -5.1984e+01 -5.2460e+01 -6.1183e+01 -5.0675e+01 -5.1961e+01 -5.2448e+01 -6.1180e+01 -5.0688e+01 -5.1939e+01 -5.2434e+01 -6.1177e+01 -5.0701e+01 -5.1918e+01 -5.2414e+01 -6.1173e+01 -5.0713e+01 -5.1897e+01 -5.2394e+01 -6.1169e+01 -5.0735e+01 -5.1876e+01 -5.2375e+01 -6.1165e+01 -5.0792e+01 -5.1855e+01 -5.2356e+01 -6.1160e+01 -5.0848e+01 -5.1835e+01 -5.2337e+01 -6.1155e+01 -5.0904e+01 -5.1815e+01 -5.2318e+01 -6.1150e+01 -5.0959e+01 -5.1795e+01 -5.2300e+01 -6.1144e+01 -5.1013e+01 -5.1776e+01 -5.2295e+01 -6.1137e+01 -5.1066e+01 -5.1757e+01 -5.2314e+01 -6.1131e+01 -5.1119e+01 -5.1738e+01 -5.2332e+01 -6.1124e+01 -5.1171e+01 -5.1719e+01 -5.2350e+01 -6.1116e+01 -5.1222e+01 -5.1701e+01 -5.2368e+01 -6.1109e+01 -5.1273e+01 -5.1683e+01 -5.2386e+01 -6.1101e+01 -5.1322e+01 -5.1666e+01 -5.2403e+01 -6.1092e+01 -5.1366e+01 -5.1648e+01 -5.2420e+01 -6.1083e+01 -5.1407e+01 -5.1631e+01 -5.2437e+01 -6.1074e+01 -5.1447e+01 -5.1614e+01 -5.2453e+01 -6.1065e+01 -5.1487e+01 -5.1597e+01 -5.2469e+01 -6.1051e+01 -5.1526e+01 -5.1581e+01 -5.2485e+01 -6.1033e+01 -5.1559e+01 -5.1565e+01 -5.2501e+01 -6.1015e+01 -5.1589e+01 -5.1549e+01 -5.2517e+01 -6.0997e+01 -5.1619e+01 -5.1533e+01 -5.2532e+01 -6.0978e+01 -5.1649e+01 -5.1517e+01 -5.2547e+01 -6.0960e+01 -5.1678e+01 -5.1502e+01 -5.2562e+01 -6.0941e+01 -5.1707e+01 -5.1487e+01 -5.2576e+01 -6.0922e+01 -5.1736e+01 -5.1472e+01 -5.2590e+01 -6.0903e+01 -5.1764e+01 -5.1457e+01 -5.2604e+01 -6.0884e+01 -5.1793e+01 -5.1441e+01 -5.2618e+01 -6.0864e+01 -5.1820e+01 -5.1418e+01 -5.2632e+01 -6.0845e+01 -5.1848e+01 -5.1396e+01 -5.2645e+01 -6.0825e+01 -5.1875e+01 -5.1375e+01 -5.2658e+01 -6.0805e+01 -5.1902e+01 -5.1354e+01 -5.2664e+01 -6.0785e+01 -5.1929e+01 -5.1333e+01 -5.2669e+01 -6.0765e+01 -5.1955e+01 -5.1312e+01 -5.2672e+01 -6.0745e+01 -5.1981e+01 -5.1313e+01 -5.2668e+01 -6.0725e+01 -5.2007e+01 -5.1338e+01 -5.2665e+01 -6.0704e+01 -5.2032e+01 -5.1362e+01 -5.2662e+01 -6.0684e+01 -5.2057e+01 -5.1386e+01 -5.2659e+01 -6.0663e+01 -5.2082e+01 -5.1409e+01 -5.2656e+01 -6.0642e+01 -5.2106e+01 -5.1432e+01 -5.2653e+01 -6.0621e+01 -5.2130e+01 -5.1455e+01 -5.2650e+01 -6.0600e+01 -5.2154e+01 -5.1478e+01 -5.2647e+01 -6.0578e+01 -5.2178e+01 -5.1500e+01 -5.2645e+01 -6.0557e+01 -5.2201e+01 -5.1522e+01 -5.2642e+01 -6.0535e+01 -5.2223e+01 -5.1544e+01 -5.2640e+01 -6.0514e+01 -5.2246e+01 -5.1565e+01 -5.2637e+01 -6.0492e+01 -5.2268e+01 -5.1586e+01 -5.2635e+01 -6.0470e+01 -5.2290e+01 -5.1607e+01 -5.2633e+01 -6.0448e+01 -5.2311e+01 -5.1627e+01 -5.2631e+01 -6.0425e+01 -5.2332e+01 -5.1647e+01 -5.2629e+01 -6.0403e+01 -5.2353e+01 -5.1667e+01 -5.2627e+01 -6.0380e+01 -5.2374e+01 -5.1702e+01 -5.2625e+01 -6.0358e+01 -5.2388e+01 -5.1766e+01 -5.2623e+01 -6.0335e+01 -5.2400e+01 -5.1828e+01 -5.2621e+01 -6.0312e+01 -5.2412e+01 -5.1890e+01 -5.2619e+01 -6.0289e+01 -5.2424e+01 -5.1950e+01 -5.2617e+01 -6.0266e+01 -5.2436e+01 -5.2010e+01 -5.2615e+01 -6.0242e+01 -5.2447e+01 -5.2069e+01 -5.2613e+01 -6.0219e+01 -5.2459e+01 -5.2126e+01 -5.2611e+01 -6.0195e+01 -5.2470e+01 -5.2183e+01 -5.2609e+01 -6.0172e+01 -5.2481e+01 -5.2239e+01 -5.2608e+01 -6.0148e+01 -5.2492e+01 -5.2294e+01 -5.2606e+01 -6.0124e+01 -5.2503e+01 -5.2348e+01 -5.2604e+01 -6.0100e+01 -5.2514e+01 -5.2402e+01 -5.2602e+01 -6.0076e+01 -5.2524e+01 -5.2454e+01 -5.2600e+01 -6.0052e+01 -5.2535e+01 -5.2505e+01 -5.2598e+01 -6.0027e+01 -5.2545e+01 -5.2556e+01 -5.2588e+01 -6.0003e+01 -5.2555e+01 -5.2606e+01 -5.2578e+01 -5.9978e+01 -5.2565e+01 -5.2655e+01 -5.2569e+01 -5.9953e+01 -5.2575e+01 -5.2703e+01 -5.2560e+01 -5.9929e+01 -5.2584e+01 -5.2750e+01 -5.2551e+01 -5.9904e+01 -5.2594e+01 -5.2797e+01 -5.2542e+01 -5.9879e+01 -5.2603e+01 -5.2842e+01 -5.2533e+01 -5.9854e+01 -5.2612e+01 -5.2887e+01 -5.2524e+01 -5.9828e+01 -5.2621e+01 -5.2931e+01 -5.2516e+01 -5.9803e+01 -5.2630e+01 -5.2975e+01 -5.2507e+01 -5.9778e+01 -5.2638e+01 -5.3017e+01 -5.2499e+01 -5.9752e+01 -5.2647e+01 -5.3059e+01 -5.2491e+01 -5.9727e+01 -5.2655e+01 -5.3100e+01 -5.2483e+01 -5.9701e+01 -5.2663e+01 -5.3140e+01 -5.2475e+01 -5.9675e+01 -5.2671e+01 -5.3180e+01 -5.2468e+01 -5.9649e+01 -5.2679e+01 -5.3218e+01 -5.2460e+01 -5.9623e+01 -5.2687e+01 -5.3256e+01 -5.2452e+01 -5.9597e+01 -5.2694e+01 -5.3294e+01 -5.2445e+01 -5.9571e+01 -5.2701e+01 -5.3330e+01 -5.2438e+01 -5.9545e+01 -5.2709e+01 -5.3366e+01 -5.2430e+01 -5.9519e+01 -5.2716e+01 -5.3402e+01 -5.2423e+01 -5.9492e+01 -5.2722e+01 -5.3436e+01 -5.2416e+01 -5.9466e+01 -5.2729e+01 -5.3470e+01 -5.2409e+01 -5.9439e+01 -5.2735e+01 -5.3503e+01 -5.2402e+01 -5.9412e+01 -5.2742e+01 -5.3536e+01 -5.2395e+01 -5.9386e+01 -5.2748e+01 -5.3567e+01 -5.2385e+01 -5.9359e+01 -5.2754e+01 -5.3599e+01 -5.2370e+01 -5.9332e+01 -5.2759e+01 -5.3629e+01 -5.2356e+01 -5.9305e+01 -5.2765e+01 -5.3659e+01 -5.2342e+01 -5.9278e+01 -5.2770e+01 -5.3688e+01 -5.2328e+01 -5.9251e+01 -5.2776e+01 -5.3717e+01 -5.2314e+01 -5.9238e+01 -5.2781e+01 -5.3745e+01 -5.2301e+01 -5.9255e+01 -5.2786e+01 -5.3772e+01 -5.2288e+01 -5.9271e+01 -5.2790e+01 -5.3799e+01 -5.2275e+01 -5.9287e+01 -5.2795e+01 -5.3825e+01 -5.2262e+01 -5.9302e+01 -5.2799e+01 -5.3851e+01 -5.2249e+01 -5.9317e+01 -5.2803e+01 -5.3876e+01 -5.2237e+01 -5.9331e+01 -5.2807e+01 -5.3901e+01 -5.2225e+01 -5.9344e+01 -5.2811e+01 -5.3925e+01 -5.2213e+01 -5.9356e+01 -5.2815e+01 -5.3948e+01 -5.2201e+01 -5.9368e+01 -5.2819e+01 -5.3971e+01 -5.2190e+01 -5.9379e+01 -5.2822e+01 -5.3993e+01 -5.2178e+01 -5.9389e+01 -5.2825e+01 -5.4015e+01 -5.2167e+01 -5.9399e+01 -5.2828e+01 -5.4036e+01 -5.2156e+01 -5.9408e+01 -5.2831e+01 -5.4056e+01 -5.2145e+01 -5.9417e+01 -5.2834e+01 -5.4077e+01 -5.2127e+01 -5.9425e+01 -5.2837e+01 -5.4096e+01 -5.2109e+01 -5.9432e+01 -5.2839e+01 -5.4115e+01 -5.2091e+01 -5.9439e+01 -5.2841e+01 -5.4134e+01 -5.2069e+01 -5.9445e+01 -5.2843e+01 -5.4152e+01 -5.2044e+01 -5.9450e+01 -5.2845e+01 -5.4169e+01 -5.2019e+01 -5.9455e+01 -5.2847e+01 -5.4187e+01 -5.1995e+01 -5.9460e+01 -5.2849e+01 -5.4203e+01 -5.1971e+01 -5.9463e+01 -5.2850e+01 -5.4219e+01 -5.1947e+01 -5.9467e+01 -5.2852e+01 -5.4235e+01 -5.1920e+01 -5.9469e+01 -5.2853e+01 -5.4247e+01 -5.1882e+01 -5.9472e+01 -5.2854e+01 -5.4254e+01 -5.1844e+01 -5.9473e+01 -5.2855e+01 -5.4260e+01 -5.1807e+01 -5.9474e+01 -5.2855e+01 -5.4266e+01 -5.1772e+01 -5.9475e+01 -5.2856e+01 -5.4273e+01 -5.1736e+01 -5.9475e+01 -5.2856e+01 -5.4278e+01 -5.1702e+01 -5.9475e+01 -5.2857e+01 -5.4284e+01 -5.1668e+01 -5.9474e+01 -5.2857e+01 -5.4289e+01 -5.1635e+01 -5.9473e+01 -5.2857e+01 -5.4322e+01 -5.1603e+01 -5.9464e+01 -5.2857e+01 -5.4371e+01 -5.1572e+01 -5.9454e+01 -5.2856e+01 -5.4419e+01 -5.1541e+01 -5.9443e+01 -5.2856e+01 -5.4466e+01 -5.1511e+01 -5.9433e+01 -5.2856e+01 -5.4512e+01 -5.1481e+01 -5.9422e+01 -5.2855e+01 -5.4558e+01 -5.1445e+01 -5.9410e+01 -5.2854e+01 -5.4602e+01 -5.1409e+01 -5.9399e+01 -5.2853e+01 -5.4646e+01 -5.1374e+01 -5.9387e+01 -5.2852e+01 -5.4689e+01 -5.1339e+01 -5.9375e+01 -5.2851e+01 -5.4731e+01 -5.1306e+01 -5.9363e+01 -5.2872e+01 -5.4772e+01 -5.1273e+01 -5.9351e+01 -5.2915e+01 -5.4813e+01 -5.1240e+01 -5.9338e+01 -5.2957e+01 -5.4852e+01 -5.1209e+01 -5.9325e+01 -5.2998e+01 -5.4891e+01 -5.1178e+01 -5.9312e+01 -5.3038e+01 -5.4929e+01 -5.1148e+01 -5.9298e+01 -5.3078e+01 -5.4966e+01 -5.1118e+01 -5.9285e+01 -5.3117e+01 -5.5003e+01 -5.1090e+01 -5.9271e+01 -5.3155e+01 -5.5038e+01 -5.1061e+01 -5.9257e+01 -5.3193e+01 -5.5073e+01 -5.1034e+01 -5.9242e+01 -5.3230e+01 -5.5107e+01 -5.1007e+01 -5.9228e+01 -5.3266e+01 -5.5140e+01 -5.0980e+01 -5.9213e+01 -5.3296e+01 -5.5165e+01 -5.0955e+01 -5.9198e+01 -5.3322e+01 -5.5189e+01 -5.0930e+01 -5.9183e+01 -5.3349e+01 -5.5212e+01 -5.0905e+01 -5.9167e+01 -5.3374e+01 -5.5235e+01 -5.0881e+01 -5.9152e+01 -5.3400e+01 -5.5258e+01 -5.0857e+01 -5.9136e+01 -5.3424e+01 -5.5280e+01 -5.0834e+01 -5.9120e+01 -5.3449e+01 -5.5301e+01 -5.0812e+01 -5.9103e+01 -5.3472e+01 -5.5322e+01 -5.0790e+01 -5.9087e+01 -5.3496e+01 -5.5343e+01 -5.0768e+01 -5.9070e+01 -5.3518e+01 -5.5363e+01 -5.0747e+01 -5.9053e+01 -5.3541e+01 -5.5382e+01 -5.0727e+01 -5.9036e+01 -5.3563e+01 -5.5401e+01 -5.0706e+01 -5.9019e+01 -5.3584e+01 -5.5420e+01 -5.0687e+01 -5.9001e+01 -5.3605e+01 -5.5438e+01 -5.0667e+01 -5.8984e+01 -5.3626e+01 -5.5455e+01 -5.0649e+01 -5.8966e+01 -5.3646e+01 -5.5472e+01 -5.0630e+01 -5.8948e+01 -5.3665e+01 -5.5489e+01 -5.0612e+01 -5.8930e+01 -5.3684e+01 -5.5505e+01 -5.0595e+01 -5.8911e+01 -5.3703e+01 -5.5520e+01 -5.0577e+01 -5.8893e+01 -5.3721e+01 -5.5535e+01 -5.0560e+01 -5.8874e+01 -5.3739e+01 -5.5550e+01 -5.0544e+01 -5.8855e+01 -5.3757e+01 -5.5564e+01 -5.0528e+01 -5.8836e+01 -5.3774e+01 -5.5578e+01 -5.0512e+01 -5.8817e+01 -5.3790e+01 -5.5592e+01 -5.0497e+01 -5.8798e+01 -5.3806e+01 -5.5605e+01 -5.0482e+01 -5.8778e+01 -5.3822e+01 -5.5617e+01 -5.0467e+01 -5.8759e+01 -5.3838e+01 -5.5629e+01 -5.0452e+01 -5.8739e+01 -5.3853e+01 -5.5641e+01 -5.0438e+01 -5.8719e+01 -5.3867e+01 -5.5652e+01 -5.0424e+01 -5.8699e+01 -5.3881e+01 -5.5663e+01 -5.0411e+01 -5.8679e+01 -5.3895e+01 -5.5673e+01 -5.0390e+01 -5.8658e+01 -5.3901e+01 -5.5683e+01 -5.0369e+01 -5.8638e+01 -5.3906e+01 -5.5693e+01 -5.0349e+01 -5.8617e+01 -5.3911e+01 -5.5702e+01 -5.0329e+01 -5.8596e+01 -5.3916e+01 -5.5711e+01 -5.0309e+01 -5.8575e+01 -5.3920e+01 -5.5719e+01 -5.0291e+01 -5.8554e+01 -5.3925e+01 -5.5727e+01 -5.0272e+01 -5.8532e+01 -5.3929e+01 -5.5735e+01 -5.0254e+01 -5.8502e+01 -5.3933e+01 -5.5742e+01 -5.0236e+01 -5.8473e+01 -5.3937e+01 -5.5749e+01 -5.0219e+01 -5.8444e+01 -5.3941e+01 -5.5755e+01 -5.0231e+01 -5.8415e+01 -5.3944e+01 -5.5753e+01 -5.0251e+01 -5.8386e+01 -5.3948e+01 -5.5751e+01 -5.0271e+01 -5.8357e+01 -5.3951e+01 -5.5748e+01 -5.0290e+01 -5.8328e+01 -5.3954e+01 -5.5746e+01 -5.0305e+01 -5.8299e+01 -5.3957e+01 -5.5743e+01 -5.0316e+01 -5.8271e+01 -5.3959e+01 -5.5741e+01 -5.0328e+01 -5.8242e+01 -5.3962e+01 -5.5738e+01 -5.0335e+01 -5.8213e+01 -5.3964e+01 -5.5735e+01 -5.0338e+01 -5.8185e+01 -5.3966e+01 -5.5732e+01 -5.0343e+01 -5.8156e+01 -5.3966e+01 -5.5728e+01 -5.0347e+01 -5.8128e+01 -5.3959e+01 -5.5725e+01 -5.0352e+01 -5.8099e+01 -5.3953e+01 -5.5721e+01 -5.0356e+01 -5.8071e+01 -5.3947e+01 -5.5717e+01 -5.0358e+01 -5.8043e+01 -5.3941e+01 -5.5713e+01 -5.0356e+01 -5.8014e+01 -5.3935e+01 -5.5709e+01 -5.0353e+01 -5.7986e+01 -5.3928e+01 -5.5704e+01 -5.0352e+01 -5.7958e+01 -5.3916e+01 -5.5700e+01 -5.0350e+01 -5.7930e+01 -5.3902e+01 -5.5695e+01 -5.0349e+01 -5.7902e+01 -5.3888e+01 -5.5690e+01 -5.0348e+01 -5.7874e+01 -5.3875e+01 -5.5685e+01 -5.0348e+01 -5.7840e+01 -5.3861e+01 -5.5680e+01 -5.0347e+01 -5.7805e+01 -5.3848e+01 -5.5675e+01 -5.0347e+01 -5.7769e+01 -5.3835e+01 -5.5669e+01 -5.0348e+01 -5.7734e+01 -5.3822e+01 -5.5658e+01 -5.0349e+01 -5.7699e+01 -5.3809e+01 -5.5645e+01 -5.0349e+01 -5.7664e+01 -5.3797e+01 -5.5631e+01 -5.0351e+01 -5.7629e+01 -5.3784e+01 -5.5617e+01 -5.0352e+01 -5.7595e+01 -5.3763e+01 -5.5604e+01 -5.0354e+01 -5.7561e+01 -5.3743e+01 -5.5590e+01 -5.0356e+01 -5.7527e+01 -5.3724e+01 -5.5577e+01 -5.0358e+01 -5.7493e+01 -5.3702e+01 -5.5563e+01 -5.0360e+01 -5.7460e+01 -5.3675e+01 -5.5549e+01 -5.0363e+01 -5.7426e+01 -5.3649e+01 -5.5536e+01 -5.0365e+01 -5.7393e+01 -5.3623e+01 -5.5523e+01 -5.0368e+01 -5.7360e+01 -5.3597e+01 -5.5509e+01 -5.0371e+01 -5.7327e+01 -5.3572e+01 -5.5496e+01 -5.0374e+01 -5.7295e+01 -5.3547e+01 -5.5482e+01 -5.0378e+01 -5.7262e+01 -5.3523e+01 -5.5469e+01 -5.0389e+01 -5.7240e+01 -5.3499e+01 -5.5455e+01 -5.0430e+01 -5.7252e+01 -5.3476e+01 -5.5442e+01 -5.0469e+01 -5.7264e+01 -5.3453e+01 -5.5429e+01 -5.0509e+01 -5.7276e+01 -5.3430e+01 -5.5415e+01 -5.0548e+01 -5.7330e+01 -5.3408e+01 -5.5402e+01 -5.0587e+01 -5.7385e+01 -5.3386e+01 -5.5388e+01 -5.0625e+01 -5.7438e+01 -5.3364e+01 -5.5375e+01 -5.0664e+01 -5.7490e+01 -5.3343e+01 -5.5360e+01 -5.0701e+01 -5.7542e+01 -5.3322e+01 -5.5339e+01 -5.0739e+01 -5.7592e+01 -5.3302e+01 -5.5317e+01 -5.0776e+01 -5.7641e+01 -5.3282e+01 -5.5296e+01 -5.0812e+01 -5.7689e+01 -5.3262e+01 -5.5275e+01 -5.0849e+01 -5.7733e+01 -5.3242e+01 -5.5255e+01 -5.0885e+01 -5.7771e+01 -5.3223e+01 -5.5234e+01 -5.0920e+01 -5.7808e+01 -5.3204e+01 -5.5214e+01 -5.0956e+01 -5.7844e+01 -5.3185e+01 -5.5194e+01 -5.0990e+01 -5.7879e+01 -5.3167e+01 -5.5168e+01 -5.1025e+01 -5.7914e+01 -5.3144e+01 -5.5136e+01 -5.1059e+01 -5.7948e+01 -5.3118e+01 -5.5100e+01 -5.1093e+01 -5.7980e+01 -5.3093e+01 -5.5066e+01 -5.1126e+01 -5.8013e+01 -5.3068e+01 -5.5031e+01 -5.1159e+01 -5.8044e+01 -5.3044e+01 -5.4998e+01 -5.1192e+01 -5.8075e+01 -5.3020e+01 -5.4964e+01 -5.1224e+01 -5.8104e+01 -5.2996e+01 -5.4932e+01 -5.1256e+01 -5.8133e+01 -5.2973e+01 -5.4899e+01 -5.1287e+01 -5.8162e+01 -5.2950e+01 -5.4867e+01 -5.1318e+01 -5.8189e+01 -5.2928e+01 -5.4836e+01 -5.1346e+01 -5.8216e+01 -5.2906e+01 -5.4805e+01 -5.1369e+01 -5.8242e+01 -5.2884e+01 -5.4775e+01 -5.1391e+01 -5.8267e+01 -5.2863e+01 -5.4744e+01 -5.1413e+01 -5.8292e+01 -5.2842e+01 -5.4715e+01 -5.1435e+01 -5.8316e+01 -5.2821e+01 -5.4685e+01 -5.1456e+01 -5.8339e+01 -5.2801e+01 -5.4657e+01 -5.1478e+01 -5.8357e+01 -5.2781e+01 -5.4622e+01 -5.1499e+01 -5.8371e+01 -5.2798e+01 -5.4586e+01 -5.1520e+01 -5.8381e+01 -5.2823e+01 -5.4551e+01 -5.1541e+01 -5.8386e+01 -5.2847e+01 -5.4516e+01 -5.1562e+01 -5.8391e+01 -5.2871e+01 -5.4481e+01 -5.1582e+01 -5.8395e+01 -5.2895e+01 -5.4447e+01 -5.1603e+01 -5.8399e+01 -5.2918e+01 -5.4414e+01 -5.1623e+01 -5.8403e+01 -5.2941e+01 -5.4381e+01 -5.1642e+01 -5.8407e+01 -5.2964e+01 -5.4349e+01 -5.1662e+01 -5.8410e+01 -5.2986e+01 -5.4317e+01 -5.1681e+01 -5.8448e+01 -5.3008e+01 -5.4286e+01 -5.1701e+01 -5.8540e+01 -5.3029e+01 -5.4255e+01 -5.1720e+01 -5.8629e+01 -5.3051e+01 -5.4224e+01 -5.1738e+01 -5.8718e+01 -5.3071e+01 -5.4194e+01 -5.1757e+01 -5.8801e+01 -5.3086e+01 -5.4164e+01 -5.1775e+01 -5.8878e+01 -5.3098e+01 -5.4135e+01 -5.1792e+01 -5.8954e+01 -5.3110e+01 -5.4106e+01 -5.1802e+01 -5.9029e+01 -5.3122e+01 -5.4078e+01 -5.1812e+01 -5.9102e+01 -5.3134e+01 -5.4050e+01 -5.1821e+01 -5.9214e+01 -5.3145e+01 -5.4020e+01 -5.1831e+01 -5.9328e+01 -5.3157e+01 -5.3985e+01 -5.1841e+01 -5.9441e+01 -5.3168e+01 -5.3950e+01 -5.1851e+01 -5.9551e+01 -5.3179e+01 -5.3916e+01 -5.1860e+01 -5.9660e+01 -5.3190e+01 -5.3882e+01 -5.1878e+01 -5.9767e+01 -5.3200e+01 -5.3849e+01 -5.1924e+01 -5.9872e+01 -5.3211e+01 -5.3816e+01 -5.1970e+01 -5.9975e+01 -5.3221e+01 -5.3784e+01 -5.2015e+01 -6.0076e+01 -5.3232e+01 -5.3753e+01 -5.2059e+01 -6.0175e+01 -5.3242e+01 -5.3722e+01 -5.2103e+01 -6.0273e+01 -5.3251e+01 -5.3691e+01 -5.2146e+01 -6.0368e+01 -5.3261e+01 -5.3661e+01 -5.2189e+01 -6.0462e+01 -5.3270e+01 -5.3631e+01 -5.2231e+01 -6.0554e+01 -5.3280e+01 -5.3602e+01 -5.2273e+01 -6.0645e+01 -5.3289e+01 -5.3573e+01 -5.2314e+01 -6.0733e+01 -5.3298e+01 -5.3545e+01 -5.2355e+01 -6.0820e+01 -5.3306e+01 -5.3517e+01 -5.2395e+01 -6.0906e+01 -5.3315e+01 -5.3489e+01 -5.2435e+01 -6.0989e+01 -5.3323e+01 -5.3462e+01 -5.2474e+01 -6.1071e+01 -5.3331e+01 -5.3435e+01 -5.2528e+01 -6.1151e+01 -5.3339e+01 -5.3409e+01 -5.2603e+01 -6.1230e+01 -5.3347e+01 -5.3382e+01 -5.2676e+01 -6.1307e+01 -5.3354e+01 -5.3357e+01 -5.2749e+01 -6.1383e+01 -5.3362e+01 -5.3331e+01 -5.2820e+01 -6.1456e+01 -5.3369e+01 -5.3306e+01 -5.2891e+01 -6.1529e+01 -5.3376e+01 -5.3282e+01 -5.2960e+01 -6.1599e+01 -5.3383e+01 -5.3251e+01 -5.3029e+01 -6.1669e+01 -5.3382e+01 -5.3219e+01 -5.3097e+01 -6.1736e+01 -5.3380e+01 -5.3188e+01 -5.3163e+01 -6.1803e+01 -5.3379e+01 -5.3157e+01 -5.3229e+01 -6.1867e+01 -5.3378e+01 -5.3127e+01 -5.3294e+01 -6.1931e+01 -5.3376e+01 -5.3097e+01 -5.3358e+01 -6.1992e+01 -5.3375e+01 -5.3066e+01 -5.3421e+01 -6.2044e+01 -5.3373e+01 -5.3030e+01 -5.3483e+01 -6.2095e+01 -5.3372e+01 -5.2993e+01 -5.3540e+01 -6.2145e+01 -5.3365e+01 -5.2958e+01 -5.3592e+01 -6.2194e+01 -5.3356e+01 -5.2922e+01 -5.3644e+01 -6.2242e+01 -5.3347e+01 -5.2888e+01 -5.3695e+01 -6.2288e+01 -5.3338e+01 -5.2854e+01 -5.3738e+01 -6.2334e+01 -5.3329e+01 -5.2821e+01 -5.3780e+01 -6.2378e+01 -5.3320e+01 -5.2788e+01 -5.3821e+01 -6.2421e+01 -5.3311e+01 -5.2756e+01 -5.3861e+01 -6.2463e+01 -5.3303e+01 -5.2724e+01 -5.3901e+01 -6.2503e+01 -5.3294e+01 -5.2685e+01 -5.3941e+01 -6.2543e+01 -5.3286e+01 -5.2647e+01 -5.3980e+01 -6.2582e+01 -5.3278e+01 -5.2609e+01 -5.4019e+01 -6.2619e+01 -5.3270e+01 -5.2572e+01 -5.4057e+01 -6.2656e+01 -5.3262e+01 -5.2529e+01 -5.4094e+01 -6.2691e+01 -5.3254e+01 -5.2486e+01 -5.4131e+01 -6.2725e+01 -5.3247e+01 -5.2443e+01 -5.4168e+01 -6.2759e+01 -5.3239e+01 -5.2401e+01 -5.4204e+01 -6.2791e+01 -5.3232e+01 -5.2361e+01 -5.4240e+01 -6.2822e+01 -5.3224e+01 -5.2320e+01 -5.4275e+01 -6.2852e+01 -5.3217e+01 -5.2281e+01 -5.4309e+01 -6.2882e+01 -5.3209e+01 -5.2242e+01 -5.4343e+01 -6.2910e+01 -5.3194e+01 -5.2204e+01 -5.4377e+01 -6.2937e+01 -5.3179e+01 -5.2167e+01 -5.4410e+01 -6.2963e+01 -5.3165e+01 -5.2131e+01 -5.4442e+01 -6.2989e+01 -5.3150e+01 -5.2095e+01 -5.4474e+01 -6.3013e+01 -5.3136e+01 -5.2051e+01 -5.4505e+01 -6.3037e+01 -5.3122e+01 -5.2034e+01 -5.4536e+01 -6.3059e+01 -5.3108e+01 -5.2028e+01 -5.4567e+01 -6.3081e+01 -5.3095e+01 -5.2015e+01 -5.4597e+01 -6.3101e+01 -5.3082e+01 -5.2004e+01 -5.4626e+01 -6.3121e+01 -5.3069e+01 -5.2037e+01 -5.4655e+01 -6.3140e+01 -5.3049e+01 -5.2070e+01 -5.4684e+01 -6.3158e+01 -5.3028e+01 -5.2102e+01 -5.4712e+01 -6.3176e+01 -5.3008e+01 -5.2135e+01 -5.4739e+01 -6.3192e+01 -5.2988e+01 -5.2167e+01 -5.4766e+01 -6.3208e+01 -5.2969e+01 -5.2199e+01 -5.4792e+01 -6.3222e+01 -5.2950e+01 -5.2231e+01 -5.4818e+01 -6.3236e+01 -5.2931e+01 -5.2263e+01 -5.4844e+01 -6.3249e+01 -5.2913e+01 -5.2295e+01 -5.4869e+01 -6.3255e+01 -5.2895e+01 -5.2326e+01 -5.4893e+01 -6.3258e+01 -5.2890e+01 -5.2357e+01 -5.4917e+01 -6.3261e+01 -5.2910e+01 -5.2388e+01 -5.4941e+01 -6.3264e+01 -5.2929e+01 -5.2419e+01 -5.4964e+01 -6.3266e+01 -5.2948e+01 -5.2449e+01 -5.4987e+01 -6.3267e+01 -5.2966e+01 -5.2479e+01 -5.5009e+01 -6.3268e+01 -5.2985e+01 -5.2509e+01 -5.5031e+01 -6.3268e+01 -5.3003e+01 -5.2539e+01 -5.5052e+01 -6.3261e+01 -5.3021e+01 -5.2568e+01 -5.5073e+01 -6.3248e+01 -5.3038e+01 -5.2597e+01 -5.5093e+01 -6.3230e+01 -5.3056e+01 -5.2626e+01 -5.5113e+01 -6.3213e+01 -5.3073e+01 -5.2655e+01 -5.5132e+01 -6.3196e+01 -5.3090e+01 -5.2683e+01 -5.5151e+01 -6.3178e+01 -5.3107e+01 -5.2711e+01 -5.5170e+01 -6.3161e+01 -5.3120e+01 -5.2733e+01 -5.5188e+01 -6.3143e+01 -5.3129e+01 -5.2753e+01 -5.5205e+01 -6.3125e+01 -5.3138e+01 -5.2772e+01 -5.5222e+01 -6.3107e+01 -5.3146e+01 -5.2792e+01 -5.5239e+01 -6.3088e+01 -5.3155e+01 -5.2811e+01 -5.5255e+01 -6.3070e+01 -5.3163e+01 -5.2830e+01 -5.5271e+01 -6.3051e+01 -5.3172e+01 -5.2849e+01 -5.5287e+01 -6.3032e+01 -5.3180e+01 -5.2868e+01 -5.5302e+01 -6.3013e+01 -5.3188e+01 -5.2887e+01 -5.5316e+01 -6.2994e+01 -5.3197e+01 -5.2905e+01 -5.5331e+01 -6.2975e+01 -5.3205e+01 -5.2924e+01 -5.5341e+01 -6.2955e+01 -5.3213e+01 -5.2938e+01 -5.5347e+01 -6.2935e+01 -5.3221e+01 -5.2948e+01 -5.5352e+01 -6.2915e+01 -5.3229e+01 -5.2959e+01 -5.5357e+01 -6.2895e+01 -5.3237e+01 -5.2969e+01 -5.5362e+01 -6.2875e+01 -5.3241e+01 -5.2979e+01 -5.5366e+01 -6.2854e+01 -5.3241e+01 -5.2990e+01 -5.5371e+01 -6.2827e+01 -5.3241e+01 -5.2993e+01 -5.5375e+01 -6.2798e+01 -5.3241e+01 -5.2996e+01 -5.5378e+01 -6.2769e+01 -5.3241e+01 -5.2993e+01 -5.5374e+01 -6.2741e+01 -5.3241e+01 -5.2988e+01 -5.5370e+01 -6.2712e+01 -5.3242e+01 -5.2984e+01 -5.5365e+01 -6.2683e+01 -5.3242e+01 -5.2979e+01 -5.5361e+01 -6.2655e+01 -5.3243e+01 -5.2975e+01 -5.5357e+01 -6.2626e+01 -5.3243e+01 -5.2972e+01 -5.5352e+01 -6.2597e+01 -5.3244e+01 -5.2961e+01 -5.5348e+01 -6.2569e+01 -5.3244e+01 -5.2950e+01 -5.5344e+01 -6.2540e+01 -5.3245e+01 -5.2940e+01 -5.5339e+01 -6.2511e+01 -5.3246e+01 -5.2930e+01 -5.5335e+01 -6.2482e+01 -5.3246e+01 -5.2920e+01 -5.5330e+01 -6.2453e+01 -5.3247e+01 -5.2911e+01 -5.5326e+01 -6.2425e+01 -5.3248e+01 -5.2902e+01 -5.5321e+01 -6.2396e+01 -5.3248e+01 -5.2894e+01 -5.5316e+01 -6.2367e+01 -5.3249e+01 -5.2886e+01 -5.5335e+01 -6.2338e+01 -5.3250e+01 -5.2878e+01 -5.5366e+01 -6.2309e+01 -5.3251e+01 -5.2871e+01 -5.5397e+01 -6.2280e+01 -5.3246e+01 -5.2864e+01 -5.5428e+01 -6.2251e+01 -5.3239e+01 -5.2858e+01 -5.5458e+01 -6.2222e+01 -5.3232e+01 -5.2851e+01 -5.5487e+01 -6.2193e+01 -5.3225e+01 -5.2845e+01 -5.5516e+01 -6.2163e+01 -5.3218e+01 -5.2840e+01 -5.5544e+01 -6.2134e+01 -5.3212e+01 -5.2834e+01 -5.5572e+01 -6.2105e+01 -5.3206e+01 -5.2829e+01 -5.5599e+01 -6.2076e+01 -5.3200e+01 -5.2824e+01 -5.5626e+01 -6.2046e+01 -5.3193e+01 -5.2820e+01 -5.5652e+01 -6.2017e+01 -5.3188e+01 -5.2815e+01 -5.5678e+01 -6.1987e+01 -5.3182e+01 -5.2811e+01 -5.5703e+01 -6.1958e+01 -5.3176e+01 -5.2807e+01 -5.5728e+01 -6.1928e+01 -5.3170e+01 -5.2803e+01 -5.5752e+01 -6.1899e+01 -5.3165e+01 -5.2800e+01 -5.5772e+01 -6.1862e+01 -5.3160e+01 -5.2796e+01 -5.5788e+01 -6.1824e+01 -5.3154e+01 -5.2793e+01 -5.5803e+01 -6.1787e+01 -5.3149e+01 -5.2790e+01 -5.5817e+01 -6.1749e+01 -5.3136e+01 -5.2787e+01 -5.5832e+01 -6.1712e+01 -5.3123e+01 -5.2784e+01 -5.5846e+01 -6.1675e+01 -5.3111e+01 -5.2781e+01 -5.5860e+01 -6.1638e+01 -5.3098e+01 -5.2779e+01 -5.5873e+01 -6.1598e+01 -5.3086e+01 -5.2802e+01 -5.5886e+01 -6.1553e+01 -5.3075e+01 -5.2844e+01 -5.5899e+01 -6.1509e+01 -5.3063e+01 -5.2885e+01 -5.5912e+01 -6.1465e+01 -5.3052e+01 -5.2926e+01 -5.5924e+01 -6.1421e+01 -5.3040e+01 -5.2967e+01 -5.5936e+01 -6.1378e+01 -5.3029e+01 -5.3006e+01 -5.5948e+01 -6.1335e+01 -5.3019e+01 -5.3046e+01 -5.5952e+01 -6.1292e+01 -5.3008e+01 -5.3084e+01 -5.5955e+01 -6.1249e+01 -5.2998e+01 -5.3123e+01 -5.5958e+01 -6.1207e+01 -5.2988e+01 -5.3160e+01 -5.5961e+01 -6.1165e+01 -5.2978e+01 -5.3197e+01 -5.5964e+01 -6.1123e+01 -5.2968e+01 -5.3234e+01 -5.5966e+01 -6.1081e+01 -5.2958e+01 -5.3270e+01 -5.5969e+01 -6.1040e+01 -5.2948e+01 -5.3305e+01 -5.5971e+01 -6.0999e+01 -5.2939e+01 -5.3340e+01 -5.5974e+01 -6.0958e+01 -5.2930e+01 -5.3375e+01 -5.5976e+01 -6.0917e+01 -5.2921e+01 -5.3409e+01 -5.5978e+01 -6.0877e+01 -5.2912e+01 -5.3442e+01 -5.5980e+01 -6.0837e+01 -5.2903e+01 -5.3475e+01 -5.5981e+01 -6.0796e+01 -5.2894e+01 -5.3507e+01 -5.5983e+01 -6.0757e+01 -5.2886e+01 -5.3539e+01 -5.5984e+01 -6.0717e+01 -5.2877e+01 -5.3570e+01 -5.5986e+01 -6.0677e+01 -5.2869e+01 -5.3601e+01 -5.5987e+01 -6.0638e+01 -5.2860e+01 -5.3631e+01 -5.5988e+01 -6.0599e+01 -5.2852e+01 -5.3661e+01 -5.5988e+01 -6.0560e+01 -5.2844e+01 -5.3690e+01 -5.5989e+01 -6.0521e+01 -5.2836e+01 -5.3711e+01 -5.5990e+01 -6.0483e+01 -5.2828e+01 -5.3731e+01 -5.5990e+01 -6.0444e+01 -5.2820e+01 -5.3751e+01 -5.5990e+01 -6.0406e+01 -5.2812e+01 -5.3771e+01 -5.5990e+01 -6.0368e+01 -5.2805e+01 -5.3790e+01 -5.5990e+01 -6.0330e+01 -5.2797e+01 -5.3810e+01 -5.5989e+01 -6.0292e+01 -5.2790e+01 -5.3829e+01 -5.5989e+01 -6.0254e+01 -5.2782e+01 -5.3847e+01 -5.5988e+01 -6.0216e+01 -5.2775e+01 -5.3865e+01 -5.5987e+01 -6.0179e+01 -5.2767e+01 -5.3883e+01 -5.5986e+01 -6.0142e+01 -5.2760e+01 -5.3901e+01 -5.5985e+01 -6.0105e+01 -5.2753e+01 -5.3918e+01 -5.5983e+01 -6.0068e+01 -5.2745e+01 -5.3935e+01 -5.5982e+01 -6.0031e+01 -5.2738e+01 -5.3944e+01 -5.5980e+01 -5.9994e+01 -5.2731e+01 -5.3953e+01 -5.5978e+01 -5.9957e+01 -5.2724e+01 -5.3961e+01 -5.5976e+01 -5.9921e+01 -5.2717e+01 -5.3970e+01 -5.5974e+01 -5.9884e+01 -5.2710e+01 -5.3978e+01 -5.5971e+01 -5.9848e+01 -5.2703e+01 -5.3986e+01 -5.5969e+01 -5.9812e+01 -5.2696e+01 -5.3994e+01 -5.5966e+01 -5.9776e+01 -5.2689e+01 -5.4002e+01 -5.5963e+01 -5.9740e+01 -5.2682e+01 -5.4010e+01 -5.5960e+01 -5.9704e+01 -5.2675e+01 -5.4017e+01 -5.5956e+01 -5.9668e+01 -5.2668e+01 -5.4025e+01 -5.5953e+01 -5.9633e+01 -5.2661e+01 -5.4032e+01 -5.5949e+01 -5.9597e+01 -5.2655e+01 -5.4039e+01 -5.5945e+01 -5.9562e+01 -5.2648e+01 -5.4046e+01 -5.5941e+01 -5.9527e+01 -5.2641e+01 -5.4053e+01 -5.5937e+01 -5.9491e+01 -5.2634e+01 -5.4060e+01 -5.5933e+01 -5.9456e+01 -5.2627e+01 -5.4066e+01 -5.5928e+01 -5.9421e+01 -5.2621e+01 -5.4073e+01 -5.5923e+01 -5.9386e+01 -5.2614e+01 -5.4079e+01 -5.5918e+01 -5.9351e+01 -5.2607e+01 -5.4085e+01 -5.5913e+01 -5.9317e+01 -5.2600e+01 -5.4091e+01 -5.5908e+01 -5.9282e+01 -5.2593e+01 -5.4097e+01 -5.5903e+01 -5.9247e+01 -5.2587e+01 -5.4102e+01 -5.5897e+01 -5.9213e+01 -5.2580e+01 -5.4108e+01 -5.5891e+01 -5.9178e+01 -5.2573e+01 -5.4113e+01 -5.5886e+01 -5.9144e+01 -5.2566e+01 -5.4118e+01 -5.5880e+01 -5.9110e+01 -5.2560e+01 -5.4123e+01 -5.5873e+01 -5.9076e+01 -5.2553e+01 -5.4128e+01 -5.5867e+01 -5.9042e+01 -5.2546e+01 -5.4132e+01 -5.5860e+01 -5.9030e+01 -5.2539e+01 -5.4136e+01 -5.5854e+01 -5.9041e+01 -5.2533e+01 -5.4141e+01 -5.5847e+01 -5.9050e+01 -5.2526e+01 -5.4145e+01 -5.5840e+01 -5.9060e+01 -5.2519e+01 -5.4149e+01 -5.5833e+01 -5.9068e+01 -5.2512e+01 -5.4152e+01 -5.5825e+01 -5.9076e+01 -5.2505e+01 -5.4156e+01 -5.5818e+01 -5.9084e+01 -5.2498e+01 -5.4159e+01 -5.5810e+01 -5.9091e+01 -5.2492e+01 -5.4162e+01 -5.5802e+01 -5.9097e+01 -5.2485e+01 -5.4165e+01 -5.5794e+01 -5.9103e+01 -5.2478e+01 -5.4168e+01 -5.5786e+01 -5.9109e+01 -5.2471e+01 -5.4171e+01 -5.5778e+01 -5.9114e+01 -5.2464e+01 -5.4173e+01 -5.5770e+01 -5.9118e+01 -5.2457e+01 -5.4176e+01 -5.5761e+01 -5.9122e+01 -5.2450e+01 -5.4178e+01 -5.5753e+01 -5.9125e+01 -5.2443e+01 -5.4180e+01 -5.5744e+01 -5.9128e+01 -5.2436e+01 -5.4181e+01 -5.5735e+01 -5.9130e+01 -5.2429e+01 -5.4183e+01 -5.5726e+01 -5.9132e+01 -5.2422e+01 -5.4184e+01 -5.5716e+01 -5.9133e+01 -5.2415e+01 -5.4186e+01 -5.5707e+01 -5.9134e+01 -5.2408e+01 -5.4187e+01 -5.5698e+01 -5.9135e+01 -5.2401e+01 -5.4188e+01 -5.5688e+01 -5.9135e+01 -5.2394e+01 -5.4188e+01 -5.5678e+01 -5.9130e+01 -5.2387e+01 -5.4189e+01 -5.5668e+01 -5.9121e+01 -5.2380e+01 -5.4189e+01 -5.5658e+01 -5.9112e+01 -5.2373e+01 -5.4190e+01 -5.5648e+01 -5.9103e+01 -5.2366e+01 -5.4190e+01 -5.5638e+01 -5.9093e+01 -5.2358e+01 -5.4190e+01 -5.5627e+01 -5.9083e+01 -5.2351e+01 -5.4182e+01 -5.5617e+01 -5.9073e+01 -5.2344e+01 -5.4174e+01 -5.5606e+01 -5.9063e+01 -5.2337e+01 -5.4166e+01 -5.5595e+01 -5.9052e+01 -5.2329e+01 -5.4157e+01 -5.5584e+01 -5.9041e+01 -5.2322e+01 -5.4149e+01 -5.5573e+01 -5.9030e+01 -5.2315e+01 -5.4141e+01 -5.5562e+01 -5.9018e+01 -5.2308e+01 -5.4133e+01 -5.5551e+01 -5.8998e+01 -5.2300e+01 -5.4125e+01 -5.5539e+01 -5.8979e+01 -5.2293e+01 -5.4116e+01 -5.5528e+01 -5.8959e+01 -5.2286e+01 -5.4108e+01 -5.5516e+01 -5.8940e+01 -5.2278e+01 -5.4100e+01 -5.5504e+01 -5.8920e+01 -5.2271e+01 -5.4092e+01 -5.5485e+01 -5.8893e+01 -5.2263e+01 -5.4076e+01 -5.5465e+01 -5.8865e+01 -5.2256e+01 -5.4060e+01 -5.5445e+01 -5.8838e+01 -5.2248e+01 -5.4044e+01 -5.5426e+01 -5.8811e+01 -5.2241e+01 -5.4029e+01 -5.5406e+01 -5.8779e+01 -5.2233e+01 -5.4013e+01 -5.5387e+01 -5.8744e+01 -5.2226e+01 -5.3998e+01 -5.5367e+01 -5.8710e+01 -5.2218e+01 -5.3983e+01 -5.5348e+01 -5.8676e+01 -5.2211e+01 -5.3968e+01 -5.5329e+01 -5.8642e+01 -5.2203e+01 -5.3953e+01 -5.5310e+01 -5.8608e+01 -5.2195e+01 -5.3939e+01 -5.5291e+01 -5.8575e+01 -5.2188e+01 -5.3923e+01 -5.5272e+01 -5.8542e+01 -5.2180e+01 -5.3900e+01 -5.5253e+01 -5.8510e+01 -5.2173e+01 -5.3878e+01 -5.5234e+01 -5.8477e+01 -5.2165e+01 -5.3857e+01 -5.5215e+01 -5.8445e+01 -5.2157e+01 -5.3836e+01 -5.5196e+01 -5.8413e+01 -5.2149e+01 -5.3815e+01 -5.5178e+01 -5.8382e+01 -5.2137e+01 -5.3794e+01 -5.5159e+01 -5.8350e+01 -5.2121e+01 -5.3774e+01 -5.5136e+01 -5.8319e+01 -5.2105e+01 -5.3754e+01 -5.5108e+01 -5.8288e+01 -5.2090e+01 -5.3734e+01 -5.5074e+01 -5.8258e+01 -5.2075e+01 -5.3714e+01 -5.5040e+01 -5.8227e+01 -5.2060e+01 -5.3695e+01 -5.5007e+01 -5.8197e+01 -5.2045e+01 -5.3676e+01 -5.4974e+01 -5.8167e+01 -5.2031e+01 -5.3657e+01 -5.4941e+01 -5.8137e+01 -5.2016e+01 -5.3639e+01 -5.4909e+01 -5.8107e+01 -5.2002e+01 -5.3620e+01 -5.4870e+01 -5.8078e+01 -5.1988e+01 -5.3602e+01 -5.4831e+01 -5.8048e+01 -5.1974e+01 -5.3585e+01 -5.4793e+01 -5.8019e+01 -5.1954e+01 -5.3567e+01 -5.4755e+01 -5.7990e+01 -5.1924e+01 -5.3549e+01 -5.4717e+01 -5.7962e+01 -5.1895e+01 -5.3532e+01 -5.4681e+01 -5.7933e+01 -5.1866e+01 -5.3515e+01 -5.4644e+01 -5.7904e+01 -5.1838e+01 -5.3498e+01 -5.4609e+01 -5.7876e+01 -5.1811e+01 -5.3499e+01 -5.4573e+01 -5.7848e+01 -5.1784e+01 -5.3527e+01 -5.4539e+01 -5.7820e+01 -5.1757e+01 -5.3554e+01 -5.4504e+01 -5.7792e+01 -5.1731e+01 -5.3581e+01 -5.4470e+01 -5.7764e+01 -5.1705e+01 -5.3608e+01 -5.4437e+01 -5.7737e+01 -5.1680e+01 -5.3634e+01 -5.4404e+01 -5.7709e+01 -5.1656e+01 -5.3660e+01 -5.4372e+01 -5.7682e+01 -5.1631e+01 -5.3685e+01 -5.4340e+01 -5.7655e+01 -5.1607e+01 -5.3709e+01 -5.4308e+01 -5.7627e+01 -5.1584e+01 -5.3733e+01 -5.4277e+01 -5.7600e+01 -5.1561e+01 -5.3757e+01 -5.4246e+01 -5.7574e+01 -5.1538e+01 -5.3780e+01 -5.4216e+01 -5.7547e+01 -5.1516e+01 -5.3803e+01 -5.4186e+01 -5.7520e+01 -5.1494e+01 -5.3825e+01 -5.4156e+01 -5.7494e+01 -5.1472e+01 -5.3847e+01 -5.4127e+01 -5.7467e+01 -5.1451e+01 -5.3869e+01 -5.4098e+01 -5.7441e+01 -5.1430e+01 -5.3890e+01 -5.4069e+01 -5.7414e+01 -5.1410e+01 -5.3910e+01 -5.4041e+01 -5.7388e+01 -5.1389e+01 -5.3930e+01 -5.4013e+01 -5.7362e+01 -5.1370e+01 -5.3950e+01 -5.3988e+01 -5.7336e+01 -5.1350e+01 -5.3969e+01 -5.3998e+01 -5.7310e+01 -5.1331e+01 -5.3988e+01 -5.4007e+01 -5.7284e+01 -5.1312e+01 -5.4007e+01 -5.4016e+01 -5.7259e+01 -5.1294e+01 -5.4025e+01 -5.4025e+01 -5.7233e+01 -5.1275e+01 -5.4042e+01 -5.4034e+01 -5.7228e+01 -5.1257e+01 -5.4059e+01 -5.4043e+01 -5.7246e+01 -5.1240e+01 -5.4076e+01 -5.4051e+01 -5.7265e+01 -5.1222e+01 -5.4092e+01 -5.4060e+01 -5.7282e+01 -5.1205e+01 -5.4108e+01 -5.4068e+01 -5.7299e+01 -5.1188e+01 -5.4124e+01 -5.4076e+01 -5.7316e+01 -5.1172e+01 -5.4139e+01 -5.4084e+01 -5.7332e+01 -5.1155e+01 -5.4154e+01 -5.4091e+01 -5.7347e+01 -5.1139e+01 -5.4168e+01 -5.4099e+01 -5.7362e+01 -5.1123e+01 -5.4182e+01 -5.4106e+01 -5.7376e+01 -5.1108e+01 -5.4196e+01 -5.4113e+01 -5.7390e+01 -5.1092e+01 -5.4209e+01 -5.4106e+01 -5.7403e+01 -5.1077e+01 -5.4222e+01 -5.4098e+01 -5.7416e+01 -5.1062e+01 -5.4234e+01 -5.4089e+01 -5.7428e+01 -5.1048e+01 -5.4244e+01 -5.4081e+01 -5.7440e+01 -5.1033e+01 -5.4248e+01 -5.4072e+01 -5.7451e+01 -5.1019e+01 -5.4251e+01 -5.4064e+01 -5.7461e+01 -5.1005e+01 -5.4255e+01 -5.4056e+01 -5.7472e+01 -5.0991e+01 -5.4253e+01 -5.4049e+01 -5.7481e+01 -5.0978e+01 -5.4248e+01 -5.4041e+01 -5.7490e+01 -5.0964e+01 -5.4243e+01 -5.4034e+01 -5.7499e+01 -5.0951e+01 -5.4238e+01 -5.4027e+01 -5.7507e+01 -5.0938e+01 -5.4234e+01 -5.4019e+01 -5.7515e+01 -5.0925e+01 -5.4229e+01 -5.4012e+01 -5.7522e+01 -5.0912e+01 -5.4224e+01 -5.4006e+01 -5.7529e+01 -5.0900e+01 -5.4220e+01 -5.3999e+01 -5.7535e+01 -5.0887e+01 -5.4215e+01 -5.3992e+01 -5.7541e+01 -5.0875e+01 -5.4210e+01 -5.3986e+01 -5.7546e+01 -5.0863e+01 -5.4206e+01 -5.3979e+01 -5.7551e+01 -5.0851e+01 -5.4201e+01 -5.3973e+01 -5.7555e+01 -5.0840e+01 -5.4196e+01 -5.3966e+01 -5.7559e+01 -5.0828e+01 -5.4192e+01 -5.3960e+01 -5.7563e+01 -5.0817e+01 -5.4187e+01 -5.3954e+01 -5.7566e+01 -5.0806e+01 -5.4182e+01 -5.3948e+01 -5.7569e+01 -5.0795e+01 -5.4177e+01 -5.3942e+01 -5.7570e+01 -5.0784e+01 -5.4173e+01 -5.3936e+01 -5.7564e+01 -5.0773e+01 -5.4168e+01 -5.3930e+01 -5.7558e+01 -5.0762e+01 -5.4163e+01 -5.3924e+01 -5.7552e+01 -5.0752e+01 -5.4158e+01 -5.3918e+01 -5.7545e+01 -5.0741e+01 -5.4153e+01 -5.3913e+01 -5.7538e+01 -5.0731e+01 -5.4148e+01 -5.3907e+01 -5.7529e+01 -5.0721e+01 -5.4143e+01 -5.3899e+01 -5.7514e+01 -5.0711e+01 -5.4138e+01 -5.3885e+01 -5.7499e+01 -5.0701e+01 -5.4133e+01 -5.3894e+01 -5.7483e+01 -5.0691e+01 -5.4128e+01 -5.3917e+01 -5.7468e+01 -5.0682e+01 -5.4119e+01 -5.3940e+01 -5.7453e+01 -5.0672e+01 -5.4105e+01 -5.3963e+01 -5.7438e+01 -5.0663e+01 -5.4084e+01 -5.3985e+01 -5.7422e+01 -5.0653e+01 -5.4064e+01 -5.4001e+01 -5.7407e+01 -5.0644e+01 -5.4043e+01 -5.4015e+01 -5.7392e+01 -5.0635e+01 -5.4023e+01 -5.4029e+01 -5.7377e+01 -5.0626e+01 -5.4004e+01 -5.4050e+01 -5.7371e+01 -5.0617e+01 -5.3984e+01 -5.4101e+01 -5.7400e+01 -5.0608e+01 -5.3965e+01 -5.4150e+01 -5.7428e+01 -5.0600e+01 -5.3938e+01 -5.4200e+01 -5.7456e+01 -5.0591e+01 -5.3912e+01 -5.4248e+01 -5.7483e+01 -5.0583e+01 -5.3886e+01 -5.4296e+01 -5.7510e+01 -5.0574e+01 -5.3861e+01 -5.4344e+01 -5.7535e+01 -5.0566e+01 -5.3836e+01 -5.4390e+01 -5.7560e+01 -5.0558e+01 -5.3812e+01 -5.4437e+01 -5.7585e+01 -5.0550e+01 -5.3787e+01 -5.4482e+01 -5.7609e+01 -5.0541e+01 -5.3764e+01 -5.4527e+01 -5.7632e+01 -5.0534e+01 -5.3740e+01 -5.4572e+01 -5.7654e+01 -5.0526e+01 -5.3718e+01 -5.4616e+01 -5.7676e+01 -5.0518e+01 -5.3695e+01 -5.4659e+01 -5.7697e+01 -5.0510e+01 -5.3673e+01 -5.4702e+01 -5.7718e+01 -5.0502e+01 -5.3651e+01 -5.4744e+01 -5.7738e+01 -5.0495e+01 -5.3630e+01 -5.4786e+01 -5.7757e+01 -5.0487e+01 -5.3608e+01 -5.4827e+01 -5.7776e+01 -5.0480e+01 -5.3588e+01 -5.4867e+01 -5.7794e+01 -5.0473e+01 -5.3567e+01 -5.4907e+01 -5.7809e+01 -5.0465e+01 -5.3547e+01 -5.4946e+01 -5.7817e+01 -5.0458e+01 -5.3527e+01 -5.4985e+01 -5.7826e+01 -5.0451e+01 -5.3508e+01 -5.5023e+01 -5.7834e+01 -5.0439e+01 -5.3488e+01 -5.5060e+01 -5.7842e+01 -5.0424e+01 -5.3469e+01 -5.5097e+01 -5.7850e+01 -5.0410e+01 -5.3448e+01 -5.5133e+01 -5.7873e+01 -5.0395e+01 -5.3422e+01 -5.5169e+01 -5.7924e+01 -5.0381e+01 -5.3396e+01 -5.5204e+01 -5.7974e+01 -5.0367e+01 -5.3368e+01 -5.5239e+01 -5.8016e+01 -5.0354e+01 -5.3335e+01 -5.5273e+01 -5.8056e+01 -5.0340e+01 -5.3303e+01 -5.5306e+01 -5.8095e+01 -5.0327e+01 -5.3271e+01 -5.5339e+01 -5.8125e+01 -5.0314e+01 -5.3240e+01 -5.5372e+01 -5.8155e+01 -5.0300e+01 -5.3209e+01 -5.5403e+01 -5.8185e+01 -5.0279e+01 -5.3179e+01 -5.5434e+01 -5.8214e+01 -5.0252e+01 -5.3150e+01 -5.5465e+01 -5.8242e+01 -5.0224e+01 -5.3121e+01 -5.5495e+01 -5.8269e+01 -5.0196e+01 -5.3092e+01 -5.5525e+01 -5.8290e+01 -5.0162e+01 -5.3064e+01 -5.5554e+01 -5.8309e+01 -5.0128e+01 -5.3037e+01 -5.5582e+01 -5.8327e+01 -5.0096e+01 -5.3010e+01 -5.5610e+01 -5.8344e+01 -5.0063e+01 -5.2983e+01 -5.5637e+01 -5.8362e+01 -5.0032e+01 -5.2957e+01 -5.5664e+01 -5.8379e+01 -5.0001e+01 -5.2932e+01 -5.5690e+01 -5.8395e+01 -1.0000e+01 -5.2907e+01 -5.5716e+01 -5.8417e+01 -6.0000e+01 -5.2882e+01 -5.5737e+01 -5.8477e+01 -6.0000e+01 -5.2858e+01 -5.5754e+01 -5.8536e+01 -6.0000e+01 -5.2834e+01 -5.5770e+01 -5.8594e+01 -6.0000e+01 -5.2811e+01 -5.5786e+01 -5.8651e+01 -6.0000e+01 -5.2788e+01 -5.5802e+01 -5.8708e+01 -6.0000e+01 -5.2765e+01 -5.5817e+01 -5.8763e+01 -6.0000e+01 -5.2743e+01 -5.5824e+01 -5.8817e+01 -6.0000e+01 -5.2714e+01 -5.5831e+01 -5.8869e+01 -6.0000e+01 -5.2685e+01 -5.5838e+01 -5.8921e+01 -6.0000e+01 -5.2656e+01 -5.5844e+01 -5.8972e+01 -6.0000e+01 -5.2627e+01 -5.5851e+01 -5.9022e+01 -6.0000e+01 -5.2598e+01 -5.5857e+01 -5.9071e+01 -6.0000e+01 -5.2563e+01 -5.5863e+01 -5.9119e+01 -6.0000e+01 -5.2528e+01 -5.5869e+01 -5.9166e+01 -6.0000e+01 -5.2495e+01 -5.5875e+01 -5.9212e+01 -6.0000e+01 -5.2461e+01 -5.5881e+01 -5.9257e+01 -6.0000e+01 -5.2429e+01 -5.5886e+01 -5.9301e+01 -6.0000e+01 -5.2397e+01 -5.5892e+01 -5.9344e+01 -6.0000e+01 -5.2366e+01 -5.5897e+01 -5.9386e+01 -6.0000e+01 -5.2335e+01 -5.5902e+01 -5.9427e+01 -6.0000e+01 -5.2305e+01 -5.5907e+01 -5.9467e+01 -6.0000e+01 -5.2275e+01 -5.5911e+01 -5.9507e+01 -6.0000e+01 -5.2246e+01 -5.5916e+01 -5.9545e+01 -6.0000e+01 -5.2218e+01 -5.5933e+01 -5.9570e+01 -6.0000e+01 -5.2184e+01 -5.5973e+01 -5.9591e+01 -6.0000e+01 -5.2149e+01 -5.6013e+01 -5.9612e+01 -6.0000e+01 -5.2114e+01 -5.6052e+01 -5.9631e+01 -6.0000e+01 -5.2072e+01 -5.6091e+01 -5.9651e+01 -6.0000e+01 -5.2031e+01 -5.6129e+01 -5.9670e+01 -6.0000e+01 -5.1991e+01 -5.6166e+01 -5.9685e+01 -6.0000e+01 -5.1952e+01 -5.6203e+01 -5.9695e+01 -6.0000e+01 -5.1913e+01 -5.6239e+01 -5.9705e+01 -6.0000e+01 -5.1876e+01 -5.6274e+01 -5.9710e+01 -6.0000e+01 -5.1839e+01 -5.6309e+01 -5.9711e+01 -6.0000e+01 -5.1803e+01 -5.6343e+01 -5.9712e+01 -6.0000e+01 -5.1768e+01 -5.6377e+01 -5.9713e+01 -6.0000e+01 -5.1733e+01 -5.6410e+01 -5.9714e+01 -6.0000e+01 -5.1700e+01 -5.6440e+01 -5.9733e+01 -6.0000e+01 -5.1667e+01 -5.6463e+01 -5.9778e+01 -6.0000e+01 -5.1634e+01 -5.6487e+01 -5.9822e+01 -6.0000e+01 -5.1602e+01 -5.6509e+01 -5.9865e+01 -6.0000e+01 -5.1571e+01 -5.6532e+01 -5.9908e+01 -6.0000e+01 -5.1541e+01 -5.6554e+01 -5.9950e+01 -6.0000e+01 -5.1511e+01 -5.6575e+01 -5.9991e+01 -6.0000e+01 -5.1482e+01 -5.6596e+01 -6.0073e+01 -6.0000e+01 -5.1454e+01 -5.6617e+01 -6.0156e+01 -6.0000e+01 -5.1426e+01 -5.6637e+01 -6.0238e+01 -6.0000e+01 -5.1398e+01 -5.6651e+01 -6.0319e+01 -6.0000e+01 -5.1371e+01 -5.6662e+01 -6.0398e+01 -5.9901e+01 -5.1345e+01 -5.6674e+01 -6.0475e+01 -5.9799e+01 -5.1319e+01 -5.6685e+01 -6.0552e+01 -5.9698e+01 -5.1294e+01 -5.6695e+01 -6.0626e+01 -5.9599e+01 -5.1269e+01 -5.6706e+01 -6.0700e+01 -5.9501e+01 -5.1245e+01 -5.6717e+01 -6.0772e+01 -5.9404e+01 -5.1214e+01 -5.6727e+01 -6.0842e+01 -5.9309e+01 -5.1183e+01 -5.6737e+01 -6.0912e+01 -5.9215e+01 -5.1152e+01 -5.6746e+01 -6.0980e+01 -5.9116e+01 -5.1122e+01 -5.6756e+01 -6.1046e+01 -5.9017e+01 -5.1093e+01 -5.6765e+01 -6.1112e+01 -5.8920e+01 -5.1065e+01 -5.6774e+01 -6.1176e+01 -5.8824e+01 -5.1037e+01 -5.6782e+01 -6.1238e+01 -5.8729e+01 -5.1010e+01 -5.6791e+01 -6.1300e+01 -5.8636e+01 -5.0983e+01 -5.6791e+01 -6.1360e+01 -5.8544e+01 -5.0957e+01 -5.6791e+01 -6.1419e+01 -5.8453e+01 -5.0932e+01 -5.6791e+01 -6.1476e+01 -5.8368e+01 -5.0936e+01 -5.6791e+01 -6.1533e+01 -5.8325e+01 -5.0956e+01 -5.6791e+01 -6.1588e+01 -5.8282e+01 -5.0976e+01 -5.6790e+01 -6.1642e+01 -5.8240e+01 -5.0995e+01 -5.6790e+01 -6.1694e+01 -5.8198e+01 -5.1014e+01 -5.6786e+01 -6.1746e+01 -5.8157e+01 -5.1034e+01 -5.6778e+01 -6.1796e+01 -5.8117e+01 -5.1053e+01 -5.6769e+01 -6.1845e+01 -5.8077e+01 -5.1071e+01 -5.6761e+01 -6.1893e+01 -5.8037e+01 -5.1090e+01 -5.6753e+01 -6.1940e+01 -5.7998e+01 -5.1109e+01 -5.6745e+01 -6.1986e+01 -5.7960e+01 -5.1127e+01 -5.6737e+01 -6.2030e+01 -5.7922e+01 -5.1145e+01 -5.6728e+01 -6.2074e+01 -5.7884e+01 -5.1163e+01 -5.6720e+01 -6.2116e+01 -5.7847e+01 -5.1181e+01 -5.6713e+01 -6.2157e+01 -5.7810e+01 -5.1199e+01 -5.6705e+01 -6.2200e+01 -5.7774e+01 -5.1216e+01 -5.6697e+01 -6.2283e+01 -5.7738e+01 -5.1234e+01 -5.6689e+01 -6.2365e+01 -5.7703e+01 -5.1251e+01 -5.6681e+01 -6.2446e+01 -5.7668e+01 -5.1260e+01 -5.6673e+01 -6.2524e+01 -5.7634e+01 -5.1269e+01 -5.6665e+01 -6.2601e+01 -5.7599e+01 -5.1278e+01 -5.6658e+01 -6.2676e+01 -5.7566e+01 -5.1287e+01 -5.6650e+01 -6.2750e+01 -5.7532e+01 -5.1338e+01 -5.6642e+01 -6.2821e+01 -5.7491e+01 -5.1391e+01 -5.6634e+01 -6.2892e+01 -5.7450e+01 -5.1443e+01 -5.6626e+01 -6.2960e+01 -5.7410e+01 -5.1494e+01 -5.6618e+01 -6.3028e+01 -5.7371e+01 -5.1545e+01 -5.6611e+01 -6.3093e+01 -5.7332e+01 -5.1596e+01 -5.6603e+01 -6.3157e+01 -5.7293e+01 -5.1645e+01 -5.6595e+01 -6.3220e+01 -5.7255e+01 -5.1694e+01 -5.6587e+01 -6.3281e+01 -5.7218e+01 -5.1743e+01 -5.6579e+01 -6.3340e+01 -5.7180e+01 -5.1790e+01 -5.6571e+01 -6.3398e+01 -5.7144e+01 -5.1837e+01 -5.6562e+01 -6.3455e+01 -5.7107e+01 -5.1884e+01 -5.6554e+01 -6.3510e+01 -5.7072e+01 -5.1929e+01 -5.6546e+01 -6.3564e+01 -5.7036e+01 -5.1974e+01 -5.6538e+01 -6.3616e+01 -5.7001e+01 -5.2019e+01 -5.6530e+01 -6.3667e+01 -5.6967e+01 -5.2063e+01 -5.6521e+01 -6.3716e+01 -5.6932e+01 -5.2106e+01 -5.6513e+01 -6.3769e+01 -5.6898e+01 -5.2148e+01 -5.6504e+01 -6.3860e+01 -5.6860e+01 -5.2190e+01 -5.6488e+01 -6.3950e+01 -5.6819e+01 -5.2232e+01 -5.6472e+01 -6.4037e+01 -5.6779e+01 -5.2272e+01 -5.6455e+01 -6.4123e+01 -5.6739e+01 -5.2312e+01 -5.6439e+01 -6.4206e+01 -5.6699e+01 -5.2352e+01 -5.6423e+01 -6.4288e+01 -5.6660e+01 -5.2391e+01 -5.6407e+01 -6.4368e+01 -5.6622e+01 -5.2429e+01 -5.6391e+01 -6.4446e+01 -5.6584e+01 -5.2467e+01 -5.6375e+01 -6.4522e+01 -5.6546e+01 -5.2504e+01 -5.6359e+01 -6.4613e+01 -5.6509e+01 -5.2569e+01 -5.6344e+01 -6.4730e+01 -5.6473e+01 -5.2649e+01 -5.6328e+01 -6.4845e+01 -5.6437e+01 -5.2728e+01 -5.6313e+01 -6.4957e+01 -5.6401e+01 -5.2806e+01 -5.6297e+01 -6.5066e+01 -5.6366e+01 -5.2882e+01 -5.6282e+01 -6.5174e+01 -5.6331e+01 -5.2958e+01 -5.6267e+01 -6.5279e+01 -5.6297e+01 -5.3032e+01 -5.6252e+01 -6.5382e+01 -5.6255e+01 -5.3105e+01 -5.6236e+01 -6.5482e+01 -5.6214e+01 -5.3176e+01 -5.6221e+01 -6.5580e+01 -5.6173e+01 -5.3247e+01 -5.6198e+01 -6.5676e+01 -5.6133e+01 -5.3316e+01 -5.6175e+01 -6.5770e+01 -5.6093e+01 -5.3385e+01 -5.6153e+01 -6.5862e+01 -5.6053e+01 -5.3452e+01 -5.6130e+01 -6.5951e+01 -5.6015e+01 -5.3518e+01 -5.6108e+01 -6.6039e+01 -5.5976e+01 -5.3583e+01 -5.6086e+01 -6.6124e+01 -5.5939e+01 -5.3647e+01 -5.6065e+01 -6.6207e+01 -5.5901e+01 -5.3709e+01 -5.6043e+01 -6.6289e+01 -5.5865e+01 -5.3771e+01 -5.6022e+01 -6.6368e+01 -5.5828e+01 -5.3832e+01 -5.6001e+01 -6.6445e+01 -5.5792e+01 -5.3892e+01 -5.5980e+01 -6.6521e+01 -5.5757e+01 -5.3950e+01 -5.5957e+01 -6.6594e+01 -5.5722e+01 -5.4008e+01 -5.5928e+01 -6.6666e+01 -5.5687e+01 -5.4061e+01 -5.5894e+01 -6.6735e+01 -5.5653e+01 -5.4109e+01 -5.5859e+01 -6.6803e+01 -5.5620e+01 -5.4155e+01 -5.5823e+01 -6.6869e+01 -5.5586e+01 -5.4201e+01 -5.5789e+01 -6.6933e+01 -5.5553e+01 -5.4247e+01 -5.5755e+01 -6.6995e+01 -5.5521e+01 -5.4291e+01 -5.5721e+01 -6.7056e+01 -5.5489e+01 -5.4335e+01 -5.5688e+01 -6.7114e+01 -5.5457e+01 -5.4378e+01 -5.5655e+01 -6.7172e+01 -5.5425e+01 -5.4420e+01 -5.5623e+01 -6.7227e+01 -5.5394e+01 -5.4461e+01 -5.5591e+01 -6.7281e+01 -5.5363e+01 -5.4502e+01 -5.5560e+01 -6.7333e+01 -5.5333e+01 -5.4542e+01 -5.5529e+01 -6.7383e+01 -5.5303e+01 -5.4581e+01 -5.5499e+01 -6.7432e+01 -5.5273e+01 -5.4617e+01 -5.5469e+01 -6.7479e+01 -5.5244e+01 -5.4640e+01 -5.5439e+01 -6.7524e+01 -5.5214e+01 -5.4662e+01 -5.5410e+01 -6.7568e+01 -5.5186e+01 -5.4683e+01 -5.5381e+01 -6.7611e+01 -5.5157e+01 -5.4704e+01 -5.5352e+01 -6.7652e+01 -5.5129e+01 -5.4724e+01 -5.5324e+01 -6.7691e+01 -5.5101e+01 -5.4744e+01 -5.5297e+01 -6.7729e+01 -5.5073e+01 -5.4764e+01 -5.5269e+01 -6.7766e+01 -5.5046e+01 -5.4784e+01 -5.5242e+01 -6.7801e+01 -5.5018e+01 -5.4803e+01 -5.5215e+01 -6.7835e+01 -5.4991e+01 -5.4822e+01 -5.5189e+01 -6.7867e+01 -5.4965e+01 -5.4840e+01 -5.5163e+01 -6.7898e+01 -5.4938e+01 -5.4858e+01 -5.5137e+01 -6.7927e+01 -5.4912e+01 -5.4876e+01 -5.5111e+01 -6.7956e+01 -5.4886e+01 -5.4894e+01 -5.5086e+01 -6.7982e+01 -5.4860e+01 -5.4911e+01 -5.5061e+01 -6.8008e+01 -5.4835e+01 -5.4928e+01 -5.5064e+01 -6.8032e+01 -5.4810e+01 -5.4944e+01 -5.5076e+01 -6.8055e+01 -5.4785e+01 -5.4961e+01 -5.5087e+01 -6.8077e+01 -5.4760e+01 -5.4976e+01 -5.5099e+01 -6.8097e+01 -5.4732e+01 -5.4992e+01 -5.5110e+01 -6.8117e+01 -5.4700e+01 -5.5007e+01 -5.5114e+01 -6.8135e+01 -5.4668e+01 -5.5022e+01 -5.5117e+01 -6.8167e+01 -5.4636e+01 -5.5037e+01 -5.5120e+01 -6.8227e+01 -5.4605e+01 -5.5051e+01 -5.5122e+01 -6.8285e+01 -5.4574e+01 -5.5062e+01 -5.5125e+01 -6.8342e+01 -5.4568e+01 -5.5067e+01 -5.5128e+01 -6.8396e+01 -5.4582e+01 -5.5073e+01 -5.5131e+01 -6.8449e+01 -5.4596e+01 -5.5078e+01 -5.5134e+01 -6.8501e+01 -5.4610e+01 -5.5083e+01 -5.5136e+01 -6.8550e+01 -5.4623e+01 -5.5088e+01 -5.5139e+01 -6.8598e+01 -5.4636e+01 -5.5093e+01 -5.5142e+01 -6.8644e+01 -5.4649e+01 -5.5098e+01 -5.5144e+01 -6.8689e+01 -5.4661e+01 -5.5103e+01 -5.5146e+01 -6.8732e+01 -5.4673e+01 -5.5107e+01 -5.5149e+01 -6.8773e+01 -5.4685e+01 -5.5111e+01 -5.5151e+01 -6.8813e+01 -5.4696e+01 -5.5116e+01 -5.5153e+01 -6.8851e+01 -5.4707e+01 -5.5120e+01 -5.5155e+01 -6.8888e+01 -5.4718e+01 -5.5123e+01 -5.5157e+01 -6.8923e+01 -5.4728e+01 -5.5127e+01 -5.5159e+01 -6.8957e+01 -5.4738e+01 -5.5130e+01 -5.5161e+01 -6.8989e+01 -5.4748e+01 -5.5134e+01 -5.5162e+01 -6.9020e+01 -5.4758e+01 -5.5137e+01 -5.5164e+01 -6.9049e+01 -5.4767e+01 -5.5140e+01 -5.5165e+01 -6.9077e+01 -5.4776e+01 -5.5143e+01 -5.5167e+01 -6.9103e+01 -5.4785e+01 -5.5145e+01 -5.5168e+01 -6.9129e+01 -5.4793e+01 -5.5148e+01 -5.5169e+01 -6.9152e+01 -5.4801e+01 -5.5150e+01 -5.5170e+01 -6.9175e+01 -5.4809e+01 -5.5152e+01 -5.5171e+01 -6.9196e+01 -5.4817e+01 -5.5154e+01 -5.5172e+01 -6.9216e+01 -5.4824e+01 -5.5156e+01 -5.5172e+01 -6.9234e+01 -5.4831e+01 -5.5157e+01 -5.5173e+01 -6.9252e+01 -5.4835e+01 -5.5159e+01 -5.5173e+01 -6.9268e+01 -5.4833e+01 -5.5160e+01 -5.5173e+01 -6.9282e+01 -5.4831e+01 -5.5161e+01 -5.5173e+01 -6.9296e+01 -5.4830e+01 -5.5162e+01 -5.5173e+01 -6.9308e+01 -5.4828e+01 -5.5163e+01 -5.5173e+01 -6.9315e+01 -5.4826e+01 -5.5163e+01 -5.5172e+01 -6.9317e+01 -5.4824e+01 -5.5164e+01 -5.5172e+01 -6.9318e+01 -5.4822e+01 -5.5164e+01 -5.5171e+01 -6.9319e+01 -5.4820e+01 -5.5164e+01 -5.5170e+01 -6.9318e+01 -5.4817e+01 -5.5164e+01 -5.5170e+01 -6.9316e+01 -5.4825e+01 -5.5163e+01 -5.5168e+01 -6.9314e+01 -5.4867e+01 -5.5163e+01 -5.5167e+01 -6.9311e+01 -5.4908e+01 -5.5162e+01 -5.5166e+01 -6.9299e+01 -5.4949e+01 -5.5161e+01 -5.5164e+01 -6.9286e+01 -5.4989e+01 -5.5160e+01 -5.5163e+01 -6.9291e+01 -5.5028e+01 -5.5159e+01 -5.5161e+01 -6.9322e+01 -5.5066e+01 -5.5157e+01 -5.5159e+01 -6.9351e+01 -5.5103e+01 -5.5156e+01 -5.5170e+01 -6.9378e+01 -5.5140e+01 -5.5154e+01 -5.5205e+01 -6.9404e+01 -5.5176e+01 -5.5152e+01 -5.5238e+01 -6.9429e+01 -5.5212e+01 -5.5150e+01 -5.5271e+01 -6.9453e+01 -5.5246e+01 -5.5147e+01 -5.5304e+01 -6.9472e+01 -5.5280e+01 -5.5145e+01 -5.5335e+01 -6.9486e+01 -5.5313e+01 -5.5142e+01 -5.5367e+01 -6.9498e+01 -5.5346e+01 -5.5139e+01 -5.5397e+01 -6.9510e+01 -5.5378e+01 -5.5136e+01 -5.5427e+01 -6.9520e+01 -5.5409e+01 -5.5133e+01 -5.5457e+01 -6.9529e+01 -5.5440e+01 -5.5130e+01 -5.5486e+01 -6.9538e+01 -5.5469e+01 -5.5126e+01 -5.5514e+01 -6.9545e+01 -5.5499e+01 -5.5123e+01 -5.5540e+01 -6.9552e+01 -5.5519e+01 -5.5119e+01 -5.5559e+01 -6.9558e+01 -5.5540e+01 -5.5115e+01 -5.5578e+01 -6.9562e+01 -5.5559e+01 -5.5111e+01 -5.5597e+01 -6.9566e+01 -5.5576e+01 -5.5107e+01 -5.5615e+01 -6.9569e+01 -5.5587e+01 -5.5102e+01 -5.5632e+01 -6.9566e+01 -5.5597e+01 -5.5097e+01 -5.5649e+01 -6.9559e+01 -5.5608e+01 -5.5093e+01 -5.5659e+01 -6.9552e+01 -5.5618e+01 -5.5088e+01 -5.5667e+01 -6.9544e+01 -5.5628e+01 -5.5082e+01 -5.5676e+01 -6.9535e+01 -5.5637e+01 -5.5077e+01 -5.5684e+01 -6.9525e+01 -5.5646e+01 -5.5072e+01 -5.5692e+01 -6.9515e+01 -5.5656e+01 -5.5066e+01 -5.5700e+01 -6.9504e+01 -5.5664e+01 -5.5060e+01 -5.5708e+01 -6.9493e+01 -5.5673e+01 -5.5055e+01 -5.5716e+01 -6.9481e+01 -5.5681e+01 -5.5049e+01 -5.5723e+01 -6.9466e+01 -5.5689e+01 -5.5042e+01 -5.5730e+01 -6.9445e+01 -5.5697e+01 -5.5036e+01 -5.5737e+01 -6.9423e+01 -5.5705e+01 -5.5030e+01 -5.5744e+01 -6.9401e+01 -5.5712e+01 -5.5023e+01 -5.5751e+01 -6.9379e+01 -5.5719e+01 -5.5016e+01 -5.5757e+01 -6.9356e+01 -5.5726e+01 -5.5009e+01 -5.5763e+01 -6.9332e+01 -5.5732e+01 -5.5002e+01 -5.5769e+01 -6.9308e+01 -5.5739e+01 -5.4995e+01 -5.5775e+01 -6.9284e+01 -5.5745e+01 -5.4988e+01 -5.5781e+01 -6.9260e+01 -5.5750e+01 -5.4980e+01 -5.5786e+01 -6.9235e+01 -5.5756e+01 -5.4973e+01 -5.5791e+01 -6.9209e+01 -5.5761e+01 -5.4965e+01 -5.5796e+01 -6.9183e+01 -5.5766e+01 -5.4957e+01 -5.5801e+01 -6.9157e+01 -5.5771e+01 -5.4949e+01 -5.5805e+01 -6.9131e+01 -5.5774e+01 -5.4941e+01 -5.5809e+01 -6.9104e+01 -5.5771e+01 -5.4933e+01 -5.5814e+01 -6.9076e+01 -5.5767e+01 -5.4924e+01 -5.5812e+01 -6.9048e+01 -5.5763e+01 -5.4916e+01 -5.5807e+01 -6.9020e+01 -5.5759e+01 -5.4907e+01 -5.5803e+01 -6.8992e+01 -5.5755e+01 -5.4898e+01 -5.5799e+01 -6.8963e+01 -5.5751e+01 -5.4890e+01 -5.5794e+01 -6.8933e+01 -5.5747e+01 -5.4881e+01 -5.5790e+01 -6.8904e+01 -5.5743e+01 -5.4871e+01 -5.5786e+01 -6.8874e+01 -5.5738e+01 -5.4862e+01 -5.5781e+01 -6.8843e+01 -5.5764e+01 -5.4853e+01 -5.5777e+01 -6.8813e+01 -5.5804e+01 -5.4843e+01 -5.5772e+01 -6.8782e+01 -5.5843e+01 -5.4834e+01 -5.5767e+01 -6.8750e+01 -5.5881e+01 -5.4824e+01 -5.5763e+01 -6.8718e+01 -5.5919e+01 -5.4814e+01 -5.5758e+01 -6.8686e+01 -5.5955e+01 -5.4802e+01 -5.5753e+01 -6.8654e+01 -5.5991e+01 -5.4784e+01 -5.5744e+01 -6.8621e+01 -5.6027e+01 -5.4766e+01 -5.5731e+01 -6.8588e+01 -5.6061e+01 -5.4748e+01 -5.5719e+01 -6.8554e+01 -5.6095e+01 -5.4731e+01 -5.5706e+01 -6.8520e+01 -5.6150e+01 -5.4713e+01 -5.5693e+01 -6.8486e+01 -5.6227e+01 -5.4696e+01 -5.5681e+01 -6.8452e+01 -5.6303e+01 -5.4678e+01 -5.5669e+01 -6.8417e+01 -5.6377e+01 -5.4661e+01 -5.5657e+01 -6.8382e+01 -5.6450e+01 -5.4644e+01 -5.5645e+01 -6.8346e+01 -5.6521e+01 -5.4626e+01 -5.5632e+01 -6.8305e+01 -5.6585e+01 -5.4609e+01 -5.5621e+01 -6.8261e+01 -5.6647e+01 -5.4592e+01 -5.5609e+01 -6.8217e+01 -5.6707e+01 -5.4575e+01 -5.5597e+01 -6.8173e+01 -5.6766e+01 -5.4558e+01 -5.5585e+01 -6.8128e+01 -5.6824e+01 -5.4541e+01 -5.5573e+01 -6.8084e+01 -5.6880e+01 -5.4525e+01 -5.5562e+01 -6.8040e+01 -5.6936e+01 -5.4508e+01 -5.5550e+01 -6.7995e+01 -5.6991e+01 -5.4491e+01 -5.5539e+01 -6.7951e+01 -5.7045e+01 -5.4475e+01 -5.5527e+01 -6.7906e+01 -5.7098e+01 -5.4458e+01 -5.5516e+01 -6.7854e+01 -5.7149e+01 -5.4441e+01 -5.5504e+01 -6.7801e+01 -5.7200e+01 -5.4425e+01 -5.5493e+01 -6.7748e+01 -5.7250e+01 -5.4408e+01 -5.5482e+01 -6.7696e+01 -5.7299e+01 -5.4392e+01 -5.5470e+01 -6.7643e+01 -5.7347e+01 -5.4376e+01 -5.5459e+01 -6.7591e+01 -5.7393e+01 -5.4359e+01 -5.5448e+01 -6.7539e+01 -5.7437e+01 -5.4343e+01 -5.5436e+01 -6.7486e+01 -5.7474e+01 -5.4327e+01 -5.5425e+01 -6.7434e+01 -5.7510e+01 -5.4311e+01 -5.5414e+01 -6.7382e+01 -5.7545e+01 -5.4295e+01 -5.5403e+01 -6.7330e+01 -5.7580e+01 -5.4279e+01 -5.5391e+01 -6.7278e+01 -5.7614e+01 -5.4263e+01 -5.5380e+01 -6.7227e+01 -5.7648e+01 -5.4247e+01 -5.5369e+01 -6.7175e+01 -5.7680e+01 -5.4231e+01 -5.5357e+01 -6.7123e+01 -5.7712e+01 -5.4215e+01 -5.5346e+01 -6.7071e+01 -5.7744e+01 -5.4199e+01 -5.5335e+01 -6.7020e+01 -5.7774e+01 -5.4183e+01 -5.5324e+01 -6.6968e+01 -5.7804e+01 -5.4167e+01 -5.5312e+01 -6.6917e+01 -5.7833e+01 -5.4151e+01 -5.5301e+01 -6.6865e+01 -5.7861e+01 -5.4136e+01 -5.5290e+01 -6.6814e+01 -5.7889e+01 -5.4120e+01 -5.5278e+01 -6.6762e+01 -5.7916e+01 -5.4104e+01 -5.5267e+01 -6.6711e+01 -5.7943e+01 -5.4088e+01 -5.5255e+01 -6.6660e+01 -5.7969e+01 -5.4073e+01 -5.5244e+01 -6.6609e+01 -5.7994e+01 -5.4057e+01 -5.5233e+01 -6.6557e+01 -5.8018e+01 -5.4042e+01 -5.5221e+01 -6.6506e+01 -5.8042e+01 -5.4026e+01 -5.5210e+01 -6.6455e+01 -5.8065e+01 -5.4010e+01 -5.5198e+01 -6.6404e+01 -5.8088e+01 -5.3995e+01 -5.5186e+01 -6.6353e+01 -5.8109e+01 -5.3979e+01 -5.5175e+01 -6.6302e+01 -5.8131e+01 -5.3964e+01 -5.5163e+01 -6.6251e+01 -5.8151e+01 -5.3949e+01 -5.5152e+01 -6.6200e+01 -5.8171e+01 -5.3933e+01 -5.5140e+01 -6.6149e+01 -5.8191e+01 -5.3918e+01 -5.5128e+01 -6.6098e+01 -5.8209e+01 -5.3902e+01 -5.5116e+01 -6.6048e+01 -5.8221e+01 -5.3887e+01 -5.5105e+01 -6.5997e+01 -5.8231e+01 -5.3872e+01 -5.5093e+01 -6.5946e+01 -5.8240e+01 -5.3856e+01 -5.5081e+01 -6.5895e+01 -5.8249e+01 -5.3841e+01 -5.5069e+01 -6.5845e+01 -5.8258e+01 -5.3826e+01 -5.5057e+01 -6.5794e+01 -5.8266e+01 -5.3811e+01 -5.5045e+01 -6.5743e+01 -5.8274e+01 -5.3832e+01 -5.5033e+01 -6.5693e+01 -5.8281e+01 -5.3861e+01 -5.5021e+01 -6.5642e+01 -5.8288e+01 -5.3889e+01 -5.5009e+01 -6.5591e+01 -5.8291e+01 -5.3917e+01 -5.4997e+01 -6.5541e+01 -5.8283e+01 -5.3938e+01 -5.4984e+01 -6.5491e+01 -5.8274e+01 -5.3957e+01 -5.4972e+01 -6.5440e+01 -5.8258e+01 -5.3975e+01 -5.4960e+01 -6.5390e+01 -5.8240e+01 -5.3993e+01 -5.4948e+01 -6.5339e+01 -5.8223e+01 -5.4010e+01 -5.4935e+01 -6.5289e+01 -5.8206e+01 -5.4027e+01 -5.4923e+01 -6.5239e+01 -5.8189e+01 -5.4044e+01 -5.4910e+01 -6.5188e+01 -5.8172e+01 -5.4060e+01 -5.4898e+01 -6.5179e+01 -5.8155e+01 -5.4075e+01 -5.4885e+01 -6.5173e+01 -5.8139e+01 -5.4091e+01 -5.4873e+01 -6.5166e+01 -5.8122e+01 -5.4106e+01 -5.4860e+01 -6.5159e+01 -5.8106e+01 -5.4120e+01 -5.4848e+01 -6.5151e+01 -5.8090e+01 -5.4134e+01 -5.4835e+01 -6.5142e+01 -5.8074e+01 -5.4148e+01 -5.4822e+01 -6.5133e+01 -5.8058e+01 -5.4162e+01 -5.4809e+01 -6.5123e+01 -5.8042e+01 -5.4175e+01 -5.4797e+01 -6.5113e+01 -5.8027e+01 -5.4187e+01 -5.4784e+01 -6.5102e+01 -5.8011e+01 -5.4200e+01 -5.4771e+01 -6.5090e+01 -5.7995e+01 -5.4212e+01 -5.4758e+01 -6.5078e+01 -5.7980e+01 -5.4223e+01 -5.4745e+01 -6.5065e+01 -5.7964e+01 -5.4233e+01 -5.4732e+01 -6.5052e+01 -5.7949e+01 -5.4236e+01 -5.4719e+01 -6.5038e+01 -5.7934e+01 -5.4239e+01 -5.4706e+01 -6.5024e+01 -5.7918e+01 -5.4242e+01 -5.4693e+01 -6.5009e+01 -5.7903e+01 -5.4244e+01 -5.4679e+01 -6.4994e+01 -5.7888e+01 -5.4246e+01 -5.4666e+01 -6.4978e+01 -5.7870e+01 -5.4249e+01 -5.4653e+01 -6.4962e+01 -5.7847e+01 -5.4250e+01 -5.4640e+01 -6.4945e+01 -5.7825e+01 -5.4252e+01 -5.4626e+01 -6.4928e+01 -5.7802e+01 -5.4254e+01 -5.4613e+01 -6.4910e+01 -5.7779e+01 -5.4255e+01 -5.4599e+01 -6.4892e+01 -5.7757e+01 -5.4257e+01 -5.4586e+01 -6.4873e+01 -5.7735e+01 -5.4258e+01 -5.4572e+01 -6.4854e+01 -5.7713e+01 -5.4258e+01 -5.4559e+01 -6.4835e+01 -5.7692e+01 -5.4251e+01 -5.4545e+01 -6.4815e+01 -5.7670e+01 -5.4244e+01 -5.4532e+01 -6.4794e+01 -5.7649e+01 -5.4237e+01 -5.4518e+01 -6.4773e+01 -5.7628e+01 -5.4230e+01 -5.4504e+01 -6.4752e+01 -5.7607e+01 -5.4223e+01 -5.4491e+01 -6.4730e+01 -5.7586e+01 -5.4216e+01 -5.4477e+01 -6.4708e+01 -5.7562e+01 -5.4209e+01 -5.4463e+01 -6.4686e+01 -5.7534e+01 -5.4202e+01 -5.4449e+01 -6.4663e+01 -5.7506e+01 -5.4195e+01 -5.4436e+01 -6.4639e+01 -5.7478e+01 -5.4188e+01 -5.4422e+01 -6.4616e+01 -5.7450e+01 -5.4182e+01 -5.4408e+01 -6.4592e+01 -5.7423e+01 -5.4175e+01 -5.4394e+01 -6.4567e+01 -5.7396e+01 -5.4168e+01 -5.4380e+01 -6.4542e+01 -5.7369e+01 -5.4161e+01 -5.4366e+01 -6.4517e+01 -5.7342e+01 -5.4154e+01 -5.4352e+01 -6.4491e+01 -5.7316e+01 -5.4147e+01 -5.4338e+01 -6.4466e+01 -5.7290e+01 -5.4140e+01 -5.4324e+01 -6.4439e+01 -5.7264e+01 -5.4133e+01 -5.4310e+01 -6.4413e+01 -5.7239e+01 -5.4126e+01 -5.4295e+01 -6.4386e+01 -5.7214e+01 -5.4120e+01 -5.4281e+01 -6.4358e+01 -5.7189e+01 -5.4108e+01 -5.4267e+01 -6.4331e+01 -5.7160e+01 -5.4093e+01 -5.4253e+01 -6.4303e+01 -5.7128e+01 -5.4079e+01 -5.4239e+01 -6.4275e+01 -5.7096e+01 -5.4064e+01 -5.4224e+01 -6.4246e+01 -5.7064e+01 -5.4050e+01 -5.4210e+01 -6.4217e+01 -5.7026e+01 -5.4036e+01 -5.4196e+01 -6.4188e+01 -5.6987e+01 -5.4022e+01 -5.4181e+01 -6.4159e+01 -5.6949e+01 -5.4008e+01 -5.4167e+01 -6.4129e+01 -5.6911e+01 -5.4007e+01 -5.4153e+01 -6.4099e+01 -5.6874e+01 -5.4038e+01 -5.4130e+01 -6.4069e+01 -5.6837e+01 -5.4068e+01 -5.4108e+01 -6.4039e+01 -5.6798e+01 -5.4098e+01 -5.4086e+01 -6.4008e+01 -5.6754e+01 -5.4127e+01 -5.4064e+01 -6.3977e+01 -5.6711e+01 -5.4156e+01 -5.4043e+01 -6.3945e+01 -5.6669e+01 -5.4184e+01 -5.4017e+01 -6.3914e+01 -5.6627e+01 -5.4212e+01 -5.3987e+01 -6.3882e+01 -5.6586e+01 -5.4239e+01 -5.3958e+01 -6.3850e+01 -5.6545e+01 -5.4265e+01 -5.3930e+01 -6.3818e+01 -5.6505e+01 -5.4292e+01 -5.3903e+01 -6.3785e+01 -5.6466e+01 -5.4317e+01 -5.3905e+01 -6.3753e+01 -5.6427e+01 -5.4342e+01 -5.3906e+01 -6.3720e+01 -5.6389e+01 -5.4367e+01 -5.3907e+01 -6.3686e+01 -5.6351e+01 -5.4391e+01 -5.3908e+01 -6.3653e+01 -5.6314e+01 -5.4415e+01 -5.3909e+01 -6.3620e+01 -5.6278e+01 -5.4430e+01 -5.3910e+01 -6.3586e+01 -5.6242e+01 -5.4445e+01 -5.3911e+01 -6.3566e+01 -5.6206e+01 -5.4460e+01 -5.3912e+01 -6.3576e+01 -5.6171e+01 -5.4474e+01 -5.3913e+01 -6.3586e+01 -5.6136e+01 -5.4488e+01 -5.3914e+01 -6.3594e+01 -5.6102e+01 -5.4502e+01 -5.3915e+01 -6.3602e+01 -5.6068e+01 -5.4515e+01 -5.3916e+01 -6.3609e+01 -5.6035e+01 -5.4528e+01 -5.3917e+01 -6.3615e+01 -5.6002e+01 -5.4541e+01 -5.3918e+01 -6.3620e+01 -5.5969e+01 -5.4554e+01 -5.3919e+01 -6.3625e+01 -5.5937e+01 -5.4566e+01 -5.3920e+01 -6.3628e+01 -5.5905e+01 -5.4578e+01 -5.3921e+01 -6.3623e+01 -5.5874e+01 -5.4590e+01 -5.3921e+01 -6.3617e+01 -5.5843e+01 -5.4601e+01 -5.3922e+01 -6.3611e+01 -5.5813e+01 -5.4612e+01 -5.3923e+01 -6.3604e+01 -5.5782e+01 -5.4623e+01 -5.3924e+01 -6.3597e+01 -5.5753e+01 -5.4634e+01 -5.3925e+01 -6.3589e+01 -5.5723e+01 -5.4644e+01 -5.3925e+01 -6.3581e+01 -5.5694e+01 -5.4654e+01 -5.3926e+01 -6.3572e+01 -5.5665e+01 -5.4664e+01 -5.3926e+01 -6.3563e+01 -5.5636e+01 -5.4673e+01 -5.3927e+01 -6.3553e+01 -5.5602e+01 -5.4683e+01 -5.3927e+01 -6.3543e+01 -5.5566e+01 -5.4691e+01 -5.3928e+01 -6.3532e+01 -5.5531e+01 -5.4700e+01 -5.3928e+01 -6.3521e+01 -5.5496e+01 -5.4708e+01 -5.3928e+01 -6.3509e+01 -5.5462e+01 -5.4716e+01 -5.3928e+01 -6.3497e+01 -5.5428e+01 -5.4724e+01 -5.3928e+01 -6.3485e+01 -5.5394e+01 -5.4732e+01 -5.3922e+01 -6.3471e+01 -5.5361e+01 -5.4739e+01 -5.3914e+01 -6.3458e+01 -5.5329e+01 -5.4746e+01 -5.3906e+01 -6.3444e+01 -5.5297e+01 -5.4752e+01 -5.3899e+01 -6.3429e+01 -5.5265e+01 -5.4759e+01 -5.3891e+01 -6.3415e+01 -5.5233e+01 -5.4765e+01 -5.3884e+01 -6.3399e+01 -5.5202e+01 -5.4771e+01 -5.3876e+01 -6.3383e+01 -5.5172e+01 -5.4776e+01 -5.3869e+01 -6.3367e+01 -5.5142e+01 -5.4782e+01 -5.3862e+01 -6.3351e+01 -5.5112e+01 -5.4787e+01 -5.3854e+01 -6.3334e+01 -5.5082e+01 -5.4792e+01 -5.3847e+01 -6.3316e+01 -5.5053e+01 -5.4796e+01 -5.3840e+01 -6.3299e+01 -5.5024e+01 -5.4800e+01 -5.3833e+01 -6.3280e+01 -5.4996e+01 -5.4804e+01 -5.3826e+01 -6.3262e+01 -5.4968e+01 -5.4808e+01 -5.3819e+01 -6.3243e+01 -5.4940e+01 -5.4812e+01 -5.3813e+01 -6.3224e+01 -5.4912e+01 -5.4815e+01 -5.3806e+01 -6.3204e+01 -5.4885e+01 -5.4818e+01 -5.3799e+01 -6.3184e+01 -5.4858e+01 -5.4821e+01 -5.3792e+01 -6.3157e+01 -5.4831e+01 -5.4823e+01 -5.3786e+01 -6.3129e+01 -5.4805e+01 -5.4826e+01 -5.3779e+01 -6.3100e+01 -5.4779e+01 -5.4828e+01 -5.3772e+01 -6.3071e+01 -5.4745e+01 -5.4829e+01 -5.3766e+01 -6.3042e+01 -5.4712e+01 -5.4831e+01 -5.3759e+01 -6.3013e+01 -5.4679e+01 -5.4832e+01 -5.3753e+01 -6.2983e+01 -5.4646e+01 -5.4825e+01 -5.3746e+01 -6.2954e+01 -5.4614e+01 -5.4818e+01 -5.3739e+01 -6.2924e+01 -5.4583e+01 -5.4811e+01 -5.3733e+01 -6.2895e+01 -5.4551e+01 -5.4804e+01 -5.3726e+01 -6.2865e+01 -5.4521e+01 -5.4797e+01 -5.3720e+01 -6.2835e+01 -5.4490e+01 -5.4790e+01 -5.3713e+01 -6.2804e+01 -5.4460e+01 -5.4783e+01 -5.3707e+01 -6.2774e+01 -5.4430e+01 -5.4776e+01 -5.3700e+01 -6.2744e+01 -5.4401e+01 -5.4768e+01 -5.3694e+01 -6.2713e+01 -5.4372e+01 -5.4761e+01 -5.3687e+01 -6.2682e+01 -5.4344e+01 -5.4754e+01 -5.3680e+01 -6.2652e+01 -5.4316e+01 -5.4746e+01 -5.3674e+01 -6.2621e+01 -5.4288e+01 -5.4739e+01 -5.3667e+01 -6.2590e+01 -5.4260e+01 -5.4732e+01 -5.3661e+01 -6.2558e+01 -5.4233e+01 -5.4724e+01 -5.3654e+01 -6.2527e+01 -5.4218e+01 -5.4712e+01 -5.3647e+01 -6.2496e+01 -5.4236e+01 -5.4696e+01 -5.3641e+01 -6.2464e+01 -5.4253e+01 -5.4681e+01 -5.3634e+01 -6.2432e+01 -5.4270e+01 -5.4665e+01 -5.3627e+01 -6.2400e+01 -5.4287e+01 -5.4650e+01 -5.3620e+01 -6.2369e+01 -5.4304e+01 -5.4635e+01 -5.3614e+01 -6.2336e+01 -5.4320e+01 -5.4620e+01 -5.3607e+01 -6.2304e+01 -5.4336e+01 -5.4606e+01 -5.3600e+01 -6.2272e+01 -5.4351e+01 -5.4591e+01 -5.3593e+01 -6.2240e+01 -5.4366e+01 -5.4576e+01 -5.3586e+01 -6.2207e+01 -5.4381e+01 -5.4562e+01 -5.3579e+01 -6.2175e+01 -5.4395e+01 -5.4548e+01 -5.3572e+01 -6.2142e+01 -5.4409e+01 -5.4533e+01 -5.3565e+01 -6.2109e+01 -5.4423e+01 -5.4519e+01 -5.3558e+01 -6.2076e+01 -5.4436e+01 -5.4505e+01 -5.3551e+01 -6.2043e+01 -5.4449e+01 -5.4491e+01 -5.3544e+01 -6.2010e+01 -5.4462e+01 -5.4477e+01 -5.3537e+01 -6.1977e+01 -5.4474e+01 -5.4463e+01 -5.3530e+01 -6.1944e+01 -5.4486e+01 -5.4450e+01 -5.3522e+01 -6.1911e+01 -5.4498e+01 -5.4436e+01 -5.3515e+01 -6.1877e+01 -5.4509e+01 -5.4422e+01 -5.3508e+01 -6.1844e+01 -5.4520e+01 -5.4409e+01 -5.3500e+01 -6.1854e+01 -5.4531e+01 -5.4395e+01 -5.3493e+01 -6.1864e+01 -5.4541e+01 -5.4382e+01 -5.3486e+01 -6.1874e+01 -5.4551e+01 -5.4363e+01 -5.3478e+01 -6.1883e+01 -5.4561e+01 -5.4342e+01 -5.3471e+01 -6.1891e+01 -5.4570e+01 -5.4321e+01 -5.3463e+01 -6.1893e+01 -5.4579e+01 -5.4300e+01 -5.3455e+01 -6.1892e+01 -5.4588e+01 -5.4280e+01 -5.3448e+01 -6.1890e+01 -5.4597e+01 -5.4259e+01 -5.3440e+01 -6.1888e+01 -5.4605e+01 -5.4239e+01 -5.3432e+01 -6.1885e+01 -5.4613e+01 -5.4220e+01 -5.3424e+01 -6.1882e+01 -5.4620e+01 -5.4200e+01 -5.3417e+01 -6.1879e+01 -5.4627e+01 -5.4180e+01 -5.3409e+01 -6.1875e+01 -5.4634e+01 -5.4161e+01 -5.3401e+01 -6.1870e+01 -5.4641e+01 -5.4142e+01 -5.3393e+01 -6.1865e+01 -5.4647e+01 -5.4123e+01 -5.3385e+01 -6.1860e+01 -5.4653e+01 -5.4105e+01 -5.3377e+01 -6.1854e+01 -5.4659e+01 -5.4086e+01 -5.3369e+01 -6.1848e+01 -5.4665e+01 -5.4068e+01 -5.3361e+01 -6.1866e+01 -5.4670e+01 -5.4050e+01 -5.3352e+01 -6.1904e+01 -5.4674e+01 -5.4032e+01 -5.3344e+01 -6.1940e+01 -5.4664e+01 -5.4014e+01 -5.3336e+01 -6.1974e+01 -5.4653e+01 -5.3996e+01 -5.3327e+01 -6.2008e+01 -5.4642e+01 -5.3979e+01 -5.3319e+01 -6.2041e+01 -5.4631e+01 -5.3961e+01 -5.3311e+01 -6.2073e+01 -5.4620e+01 -5.3944e+01 -5.3299e+01 -6.2103e+01 -5.4609e+01 -5.3927e+01 -5.3282e+01 -6.2133e+01 -5.4598e+01 -5.3910e+01 -5.3266e+01 -6.2162e+01 -5.4587e+01 -5.3893e+01 -5.3250e+01 -6.2189e+01 -5.4577e+01 -5.3876e+01 -5.3234e+01 -6.2216e+01 -5.4566e+01 -5.3860e+01 -5.3218e+01 -6.2242e+01 -5.4556e+01 -5.3843e+01 -5.3202e+01 -6.2267e+01 -5.4546e+01 -5.3827e+01 -5.3187e+01 -6.2290e+01 -5.4535e+01 -5.3811e+01 -5.3164e+01 -6.2313e+01 -5.4525e+01 -5.3795e+01 -5.3141e+01 -6.2335e+01 -5.4515e+01 -5.3810e+01 -5.3118e+01 -6.2356e+01 -5.4505e+01 -5.3826e+01 -5.3096e+01 -6.2376e+01 -5.4495e+01 -5.3830e+01 -5.3073e+01 -6.2395e+01 -5.4485e+01 -5.3834e+01 -5.3051e+01 -6.2414e+01 -5.4475e+01 -5.3838e+01 -5.3030e+01 -6.2431e+01 -5.4465e+01 -5.3842e+01 -5.3009e+01 -6.2448e+01 -5.4449e+01 -5.3838e+01 -5.2988e+01 -6.2457e+01 -5.4431e+01 -5.3835e+01 -5.2967e+01 -6.2464e+01 -5.4413e+01 -5.3831e+01 -5.2946e+01 -6.2470e+01 -5.4396e+01 -5.3828e+01 -5.2926e+01 -6.2476e+01 -5.4387e+01 -5.3823e+01 -5.2906e+01 -6.2481e+01 -5.4415e+01 -5.3812e+01 -5.2886e+01 -6.2486e+01 -5.4442e+01 -5.3801e+01 -5.2867e+01 -6.2490e+01 -5.4469e+01 -5.3791e+01 -5.2848e+01 -6.2493e+01 -5.4495e+01 -5.3781e+01 -5.2829e+01 -6.2496e+01 -5.4521e+01 -5.3772e+01 -5.2810e+01 -6.2498e+01 -5.4546e+01 -5.3763e+01 -5.2791e+01 -6.2500e+01 -5.4571e+01 -5.3754e+01 -5.2773e+01 -6.2501e+01 -5.4595e+01 -5.3745e+01 -5.2755e+01 -6.2501e+01 -5.4619e+01 -5.3737e+01 -5.2737e+01 -6.2501e+01 -5.4643e+01 -5.3729e+01 -5.2719e+01 -6.2500e+01 -5.4666e+01 -5.3721e+01 -5.2702e+01 -6.2499e+01 -5.4688e+01 -5.3713e+01 -5.2684e+01 -6.2497e+01 -5.4710e+01 -5.3706e+01 -5.2667e+01 -6.2495e+01 -5.4732e+01 -5.3698e+01 -5.2650e+01 -6.2492e+01 -5.4753e+01 -5.3691e+01 -5.2633e+01 -6.2489e+01 -5.4774e+01 -5.3685e+01 -5.2617e+01 -6.2485e+01 -5.4795e+01 -5.3678e+01 -5.2600e+01 -6.2480e+01 -5.4815e+01 -5.3671e+01 -5.2584e+01 -6.2475e+01 -5.4834e+01 -5.3665e+01 -5.2568e+01 -6.2470e+01 -5.4853e+01 -5.3659e+01 -5.2552e+01 -6.2464e+01 -5.4872e+01 -5.3653e+01 -5.2536e+01 -6.2457e+01 -5.4890e+01 -5.3647e+01 -5.2520e+01 -6.2450e+01 -5.4908e+01 -5.3642e+01 -5.2505e+01 -6.2443e+01 -5.4925e+01 -5.3636e+01 -5.2490e+01 -6.2435e+01 -5.4942e+01 -5.3631e+01 -5.2475e+01 -6.2427e+01 -5.4959e+01 -5.3625e+01 -5.2459e+01 -6.2418e+01 -5.4975e+01 -5.3620e+01 -5.2445e+01 -6.2409e+01 -5.4990e+01 -5.3615e+01 -5.2430e+01 -6.2399e+01 -5.5006e+01 -5.3610e+01 -5.2415e+01 -6.2389e+01 -5.5021e+01 -5.3605e+01 -5.2401e+01 -6.2378e+01 -5.5035e+01 -5.3600e+01 -5.2386e+01 -6.2367e+01 -5.5049e+01 -5.3595e+01 -5.2372e+01 -6.2356e+01 -5.5063e+01 -5.3591e+01 -5.2358e+01 -6.2344e+01 -5.5076e+01 -5.3586e+01 -5.2344e+01 -6.2332e+01 -5.5086e+01 -5.3580e+01 -5.2330e+01 -6.2319e+01 -5.5087e+01 -5.3567e+01 -5.2316e+01 -6.2306e+01 -5.5083e+01 -5.3555e+01 -5.2302e+01 -6.2292e+01 -5.5080e+01 -5.3543e+01 -5.2289e+01 -6.2278e+01 -5.5076e+01 -5.3531e+01 -5.2275e+01 -6.2264e+01 -5.5073e+01 -5.3520e+01 -5.2262e+01 -6.2242e+01 -5.5070e+01 -5.3508e+01 -5.2249e+01 -6.2219e+01 -5.5066e+01 -5.3497e+01 -5.2236e+01 -6.2189e+01 -5.5063e+01 -5.3480e+01 -5.2223e+01 -6.2158e+01 -5.5059e+01 -5.3461e+01 -5.2210e+01 -6.2127e+01 -5.5055e+01 -5.3443e+01 -5.2197e+01 -6.2096e+01 -5.5052e+01 -5.3425e+01 -5.2184e+01 -6.2065e+01 -5.5048e+01 -5.3408e+01 -5.2171e+01 -6.2034e+01 -5.5045e+01 -5.3389e+01 -5.2158e+01 -6.2003e+01 -5.5041e+01 -5.3364e+01 -5.2130e+01 -6.1972e+01 -5.5037e+01 -5.3338e+01 -5.2102e+01 -6.1941e+01 -5.5033e+01 -5.3307e+01 -5.2074e+01 -6.1910e+01 -5.5030e+01 -5.3276e+01 -5.2047e+01 -6.1879e+01 -5.5023e+01 -5.3246e+01 -5.2020e+01 -6.1848e+01 -5.5011e+01 -5.3216e+01 -5.1994e+01 -6.1817e+01 -5.4999e+01 -5.3187e+01 -5.1968e+01 -6.1786e+01 -5.4988e+01 -5.3159e+01 -5.1943e+01 -6.1755e+01 -5.4976e+01 -5.3131e+01 -5.1918e+01 -6.1723e+01 -5.4965e+01 -5.3104e+01 -5.1894e+01 -6.1692e+01 -5.4954e+01 -5.3077e+01 -5.1870e+01 -6.1670e+01 -5.4942e+01 -5.3052e+01 -5.1846e+01 -6.1684e+01 -5.4930e+01 -5.3026e+01 -5.1822e+01 -6.1697e+01 -5.4911e+01 -5.3001e+01 -5.1799e+01 -6.1709e+01 -5.4893e+01 -5.2977e+01 -5.1777e+01 -6.1720e+01 -5.4874e+01 -5.2953e+01 -5.1755e+01 -6.1731e+01 -5.4856e+01 -5.2930e+01 -5.1733e+01 -6.1741e+01 -5.4839e+01 -5.2930e+01 -5.1711e+01 -6.1750e+01 -5.4821e+01 -5.2952e+01 -5.1690e+01 -6.1759e+01 -5.4804e+01 -5.2974e+01 -5.1669e+01 -6.1767e+01 -5.4787e+01 -5.2995e+01 -5.1649e+01 -6.1775e+01 -5.4770e+01 -5.3017e+01 -5.1628e+01 -6.1782e+01 -5.4753e+01 -5.3038e+01 -5.1608e+01 -6.1788e+01 -5.4737e+01 -5.3058e+01 -5.1589e+01 -6.1794e+01 -5.4721e+01 -5.3079e+01 -5.1569e+01 -6.1799e+01 -5.4705e+01 -5.3100e+01 -5.1550e+01 -6.1803e+01 -5.4689e+01 -5.3120e+01 -5.1532e+01 -6.1807e+01 -5.4673e+01 -5.3140e+01 -5.1513e+01 -6.1810e+01 -5.4658e+01 -5.3159e+01 -5.1491e+01 -6.1813e+01 -5.4643e+01 -5.3179e+01 -5.1465e+01 -6.1815e+01 -5.4628e+01 -5.3198e+01 -5.1440e+01 -6.1817e+01 -5.4613e+01 -5.3217e+01 -5.1415e+01 -6.1818e+01 -5.4598e+01 -5.3236e+01 -5.1390e+01 -6.1818e+01 -5.4583e+01 -5.3254e+01 -5.1366e+01 -6.1818e+01 -5.4569e+01 -5.3272e+01 -5.1343e+01 -6.1818e+01 -5.4555e+01 -5.3290e+01 -5.1319e+01 -6.1816e+01 -5.4540e+01 -5.3308e+01 -5.1297e+01 -6.1815e+01 -5.4526e+01 -5.3326e+01 -5.1274e+01 -6.1812e+01 -5.4510e+01 -5.3343e+01 -5.1252e+01 -6.1810e+01 -5.4489e+01 -5.3360e+01 -5.1231e+01 -6.1807e+01 -5.4467e+01 -5.3376e+01 -5.1209e+01 -6.1803e+01 -5.4446e+01 -5.3393e+01 -5.1188e+01 -6.1799e+01 -5.4425e+01 -5.3409e+01 -5.1166e+01 -6.1794e+01 -5.4405e+01 -5.3425e+01 -5.1138e+01 -6.1789e+01 -5.4384e+01 -5.3441e+01 -5.1110e+01 -6.1783e+01 -5.4364e+01 -5.3456e+01 -5.1083e+01 -6.1777e+01 -5.4344e+01 -5.3471e+01 -5.1056e+01 -6.1770e+01 -5.4325e+01 -5.3486e+01 -5.1030e+01 -6.1763e+01 -5.4305e+01 -5.3500e+01 -5.1005e+01 -6.1756e+01 -5.4286e+01 -5.3515e+01 -5.0980e+01 -6.1748e+01 -5.4268e+01 -5.3529e+01 -5.0955e+01 -6.1739e+01 -5.4249e+01 -5.3543e+01 -5.0931e+01 -6.1730e+01 -5.4231e+01 -5.3556e+01 -5.0907e+01 -6.1721e+01 -5.4212e+01 -5.3569e+01 -5.0884e+01 -6.1711e+01 -5.4194e+01 -5.3582e+01 -5.0861e+01 -6.1701e+01 -5.4176e+01 -5.3595e+01 -5.0839e+01 -6.1691e+01 -5.4150e+01 -5.3608e+01 -5.0817e+01 -6.1680e+01 -5.4125e+01 -5.3620e+01 -5.0795e+01 -6.1668e+01 -5.4100e+01 -5.3632e+01 -5.0774e+01 -6.1656e+01 -5.4076e+01 -5.3643e+01 -5.0754e+01 -6.1644e+01 -5.4052e+01 -5.3655e+01 -5.0757e+01 -6.1632e+01 -5.4028e+01 -5.3666e+01 -5.0774e+01 -6.1619e+01 -5.4005e+01 -5.3677e+01 -5.0785e+01 -6.1605e+01 -5.3982e+01 -5.3687e+01 -5.0793e+01 -6.1592e+01 -5.3959e+01 -5.3698e+01 -5.0802e+01 -6.1577e+01 -5.3936e+01 -5.3729e+01 -5.0810e+01 -6.1563e+01 -5.3914e+01 -5.3783e+01 -5.0819e+01 -6.1548e+01 -5.3893e+01 -5.3837e+01 -5.0827e+01 -6.1533e+01 -5.3871e+01 -5.3883e+01 -5.0836e+01 -6.1518e+01 -5.3850e+01 -5.3927e+01 -5.0845e+01 -6.1502e+01 -5.3829e+01 -5.3970e+01 -5.0854e+01 -6.1486e+01 -5.3804e+01 -5.4012e+01 -5.0862e+01 -6.1469e+01 -5.3776e+01 -5.4053e+01 -5.0871e+01 -6.1452e+01 -5.3748e+01 -5.4094e+01 -5.0880e+01 -6.1435e+01 -5.3714e+01 -5.4134e+01 -5.0889e+01 -6.1417e+01 -5.3679e+01 -5.4174e+01 -5.0898e+01 -6.1400e+01 -5.3645e+01 -5.4212e+01 -5.0907e+01 -6.1382e+01 -5.3611e+01 -5.4251e+01 -5.0916e+01 -6.1363e+01 -5.3578e+01 -5.4288e+01 -5.0925e+01 -6.1344e+01 -5.3546e+01 -5.4325e+01 -5.0934e+01 -6.1325e+01 -5.3514e+01 -5.4361e+01 -5.0943e+01 -6.1306e+01 -5.3483e+01 -5.4396e+01 -5.0952e+01 -6.1287e+01 -5.3452e+01 -5.4431e+01 -5.0961e+01 -6.1267e+01 -5.3422e+01 -5.4465e+01 -5.0970e+01 -6.1246e+01 -5.3392e+01 -5.4499e+01 -5.0979e+01 -6.1226e+01 -5.3363e+01 -5.4532e+01 -5.0984e+01 -6.1205e+01 -5.3334e+01 -5.4564e+01 -5.0985e+01 -6.1184e+01 -5.3306e+01 -5.4596e+01 -5.0986e+01 -6.1163e+01 -5.3278e+01 -5.4627e+01 -5.0987e+01 -6.1142e+01 -5.3250e+01 -5.4657e+01 -5.0989e+01 -6.1120e+01 -5.3224e+01 -5.4687e+01 -5.0990e+01 -6.1098e+01 -5.3197e+01 -5.4716e+01 -5.0992e+01 -6.1076e+01 -5.3171e+01 -5.4745e+01 -5.0994e+01 -6.1053e+01 -5.3145e+01 -5.4771e+01 -5.0996e+01 -6.1031e+01 -5.3120e+01 -5.4791e+01 -5.0998e+01 -6.1008e+01 -5.3095e+01 -5.4810e+01 -5.1000e+01 -6.0985e+01 -5.3071e+01 -5.4829e+01 -5.1002e+01 -6.0961e+01 -5.3047e+01 -5.4847e+01 -5.1004e+01 -6.0938e+01 -5.3023e+01 -5.4865e+01 -5.1006e+01 -6.0914e+01 -5.3000e+01 -5.4883e+01 -5.1009e+01 -6.0890e+01 -5.2977e+01 -5.4900e+01 -5.1011e+01 -6.0866e+01 -5.2954e+01 -5.4917e+01 -5.1014e+01 -6.0841e+01 -5.2932e+01 -5.4933e+01 -5.1016e+01 -6.0817e+01 -5.2910e+01 -5.4949e+01 -5.1019e+01 -6.0792e+01 -5.2888e+01 -5.4965e+01 -5.1022e+01 -6.0767e+01 -5.2867e+01 -5.4980e+01 -5.1025e+01 -6.0742e+01 -5.2846e+01 -5.4995e+01 -5.1028e+01 -6.0716e+01 -5.2825e+01 -5.5010e+01 -5.1030e+01 -6.0691e+01 -5.2805e+01 -5.5054e+01 -5.1031e+01 -6.0665e+01 -5.2785e+01 -5.5112e+01 -5.1026e+01 -6.0639e+01 -5.2765e+01 -5.5169e+01 -5.1022e+01 -6.0613e+01 -5.2745e+01 -5.5225e+01 -5.1017e+01 -6.0587e+01 -5.2726e+01 -5.5279e+01 -5.1013e+01 -6.0560e+01 -5.2707e+01 -5.5326e+01 -5.1035e+01 -6.0534e+01 -5.2688e+01 -5.5371e+01 -5.1059e+01 -6.0507e+01 -5.2670e+01 -5.5415e+01 -5.1083e+01 -6.0480e+01 -5.2651e+01 -5.5459e+01 -5.1107e+01 -6.0453e+01 -5.2633e+01 -5.5502e+01 -5.1132e+01 -6.0426e+01 -5.2615e+01 -5.5544e+01 -5.1156e+01 -6.0398e+01 -5.2598e+01 -5.5586e+01 -5.1179e+01 -6.0371e+01 -5.2578e+01 -5.5626e+01 -5.1203e+01 -6.0343e+01 -5.2553e+01 -5.5666e+01 -5.1227e+01 -6.0316e+01 -5.2528e+01 -5.5705e+01 -5.1250e+01 -6.0285e+01 -5.2504e+01 -5.5744e+01 -5.1276e+01 -6.0242e+01 -5.2480e+01 -5.5782e+01 -5.1336e+01 -6.0198e+01 -5.2456e+01 -5.5819e+01 -5.1395e+01 -6.0155e+01 -5.2433e+01 -5.5855e+01 -5.1454e+01 -6.0111e+01 -5.2410e+01 -5.5890e+01 -5.1512e+01 -6.0068e+01 -5.2388e+01 -5.5925e+01 -5.1569e+01 -6.0053e+01 -5.2366e+01 -5.5959e+01 -5.1626e+01 -6.0055e+01 -5.2344e+01 -5.5993e+01 -5.1682e+01 -6.0057e+01 -5.2322e+01 -5.6026e+01 -5.1738e+01 -6.0058e+01 -5.2301e+01 -5.6058e+01 -5.1793e+01 -6.0058e+01 -5.2281e+01 -5.6089e+01 -5.1847e+01 -6.0058e+01 -5.2260e+01 -5.6120e+01 -5.1901e+01 -6.0058e+01 -5.2240e+01 -5.6150e+01 -5.1954e+01 -6.0057e+01 -5.2220e+01 -5.6179e+01 -5.2006e+01 -6.0056e+01 -5.2201e+01 -5.6208e+01 -5.2058e+01 -6.0055e+01 -5.2181e+01 -5.6236e+01 -5.2109e+01 -6.0053e+01 -5.2162e+01 -5.6263e+01 -5.2160e+01 -6.0051e+01 -5.2143e+01 -5.6290e+01 -5.2210e+01 -6.0048e+01 -5.2125e+01 -5.6316e+01 -5.2259e+01 -6.0045e+01 -5.2107e+01 -5.6341e+01 -5.2308e+01 -6.0042e+01 -5.2089e+01 -5.6366e+01 -5.2356e+01 -6.0038e+01 -5.2071e+01 -5.6383e+01 -5.2403e+01 -6.0034e+01 -5.2054e+01 -5.6399e+01 -5.2450e+01 -6.0029e+01 -5.2036e+01 -5.6415e+01 -5.2496e+01 -6.0024e+01 -5.2012e+01 -5.6430e+01 -5.2542e+01 -6.0019e+01 -5.1987e+01 -5.6444e+01 -5.2587e+01 -6.0013e+01 -5.1963e+01 -5.6458e+01 -5.2631e+01 -6.0007e+01 -5.1939e+01 -5.6472e+01 -5.2675e+01 -6.0001e+01 -5.1916e+01 -5.6485e+01 -5.2718e+01 -5.9994e+01 -5.1893e+01 -5.6498e+01 -5.2761e+01 -5.9987e+01 -5.1870e+01 -5.6511e+01 -5.2803e+01 -5.9980e+01 -5.1848e+01 -5.6523e+01 -5.2844e+01 -5.9969e+01 -5.1826e+01 -5.6535e+01 -5.2885e+01 -5.9953e+01 -5.1805e+01 -5.6546e+01 -5.2926e+01 -5.9937e+01 -5.1784e+01 -5.6557e+01 -5.2965e+01 -5.9921e+01 -5.1763e+01 -5.6568e+01 -5.3004e+01 -5.9905e+01 -5.1743e+01 -5.6578e+01 -5.3043e+01 -5.9888e+01 -5.1715e+01 -5.6588e+01 -5.3081e+01 -5.9871e+01 -5.1687e+01 -5.6597e+01 -5.3118e+01 -5.9855e+01 -5.1660e+01 -5.6606e+01 -5.3155e+01 -5.9838e+01 -5.1634e+01 -5.6615e+01 -5.3191e+01 -5.9821e+01 -5.1608e+01 -5.6623e+01 -5.3226e+01 -5.9803e+01 -5.1582e+01 -5.6631e+01 -5.3261e+01 -5.9786e+01 -5.1557e+01 -5.6642e+01 -5.3296e+01 -5.9769e+01 -5.1532e+01 -5.6689e+01 -5.3330e+01 -5.9751e+01 -5.1508e+01 -5.6732e+01 -5.3363e+01 -5.9733e+01 -5.1484e+01 -5.6774e+01 -5.3396e+01 -5.9715e+01 -5.1461e+01 -5.6815e+01 -5.3428e+01 -5.9697e+01 -5.1438e+01 -5.6856e+01 -5.3460e+01 -5.9679e+01 -5.1415e+01 -5.6895e+01 -5.3491e+01 -5.9661e+01 -5.1393e+01 -5.6926e+01 -5.3522e+01 -5.9642e+01 -5.1371e+01 -5.6956e+01 -5.3552e+01 -5.9624e+01 -5.1350e+01 -5.6986e+01 -5.3582e+01 -5.9605e+01 -5.1329e+01 -5.7015e+01 -5.3611e+01 -5.9586e+01 -5.1308e+01 -5.7043e+01 -5.3639e+01 -5.9567e+01 -5.1288e+01 -5.7071e+01 -5.3667e+01 -5.9548e+01 -5.1268e+01 -5.7098e+01 -5.3695e+01 -5.9529e+01 -5.1248e+01 -5.7125e+01 -5.3722e+01 -5.9509e+01 -5.1229e+01 -5.7151e+01 -5.3748e+01 -5.9490e+01 -5.1210e+01 -5.7177e+01 -5.3774e+01 -5.9470e+01 -5.1191e+01 -5.7202e+01 -5.3800e+01 -5.9450e+01 -5.1173e+01 -5.7226e+01 -5.3825e+01 -5.9430e+01 -5.1155e+01 -5.7250e+01 -5.3849e+01 -5.9410e+01 -5.1138e+01 -5.7273e+01 -5.3873e+01 -5.9390e+01 -5.1120e+01 -5.7296e+01 -5.3897e+01 -5.9370e+01 -5.1103e+01 -5.7318e+01 -5.3920e+01 -5.9350e+01 -5.1086e+01 -5.7340e+01 -5.3942e+01 -5.9329e+01 -5.1070e+01 -5.7361e+01 -5.3964e+01 -5.9308e+01 -5.1054e+01 -5.7382e+01 -5.3986e+01 -5.9288e+01 -5.1031e+01 -5.7402e+01 -5.4007e+01 -5.9267e+01 -5.1007e+01 -5.7421e+01 -5.4028e+01 -5.9246e+01 -5.0984e+01 -5.7440e+01 -5.4048e+01 -5.9225e+01 -5.0961e+01 -5.7458e+01 -5.4068e+01 -5.9203e+01 -5.0939e+01 -5.7476e+01 -5.4087e+01 -5.9182e+01 -5.0917e+01 -5.7493e+01 -5.4100e+01 -5.9161e+01 -5.0896e+01 -5.7510e+01 -5.4111e+01 -5.9139e+01 -5.0875e+01 -5.7527e+01 -5.4121e+01 -5.9117e+01 -5.0854e+01 -5.7542e+01 -5.4131e+01 -5.9096e+01 -5.0829e+01 -5.7558e+01 -5.4141e+01 -5.9074e+01 -5.0801e+01 -5.7572e+01 -5.4150e+01 -5.9052e+01 -5.0774e+01 -5.7587e+01 -5.4160e+01 -5.9030e+01 -5.0747e+01 -5.7600e+01 -5.4169e+01 -5.9004e+01 -5.0721e+01 -5.7614e+01 -5.4178e+01 -5.8974e+01 -5.0696e+01 -5.7626e+01 -5.4186e+01 -5.8944e+01 -5.0671e+01 -5.7638e+01 -5.4195e+01 -5.8914e+01 -5.0646e+01 -5.7642e+01 -5.4203e+01 -5.8884e+01 -5.0623e+01 -5.7646e+01 -5.4211e+01 -5.8854e+01 -5.0599e+01 -5.7649e+01 -5.4218e+01 -5.8824e+01 -5.0576e+01 -5.7652e+01 -5.4226e+01 -5.8794e+01 -5.0554e+01 -5.7655e+01 -5.4233e+01 -5.8765e+01 -5.0532e+01 -5.7657e+01 -5.4240e+01 -5.8735e+01 -5.0510e+01 -5.7659e+01 -5.4246e+01 -5.8706e+01 -5.0489e+01 -5.7661e+01 -5.4253e+01 -5.8676e+01 -5.0468e+01 -5.7663e+01 -5.4259e+01 -5.8647e+01 -5.0448e+01 -5.7664e+01 -5.4265e+01 -5.8618e+01 -5.0428e+01 -5.7665e+01 -5.4271e+01 -5.8589e+01 -5.0408e+01 -5.7666e+01 -5.4276e+01 -5.8560e+01 -5.0389e+01 -5.7666e+01 -5.4276e+01 -5.8530e+01 -5.0370e+01 -5.7666e+01 -5.4273e+01 -5.8501e+01 -5.0352e+01 -5.7666e+01 -5.4271e+01 -5.8473e+01 -5.0329e+01 -5.7666e+01 -5.4268e+01 -5.8444e+01 -5.0303e+01 -5.7665e+01 -5.4265e+01 -5.8415e+01 -5.0279e+01 -5.7665e+01 -5.4262e+01 -5.8386e+01 -5.0254e+01 -5.7663e+01 -5.4259e+01 -5.8357e+01 -5.0228e+01 -5.7662e+01 -5.4255e+01 -5.8329e+01 -5.0197e+01 -5.7660e+01 -5.4252e+01 -5.8300e+01 -5.0166e+01 -5.7658e+01 -5.4249e+01 -5.8272e+01 -5.0136e+01 -5.7648e+01 -5.4246e+01 -5.8243e+01 -5.0107e+01 -5.7638e+01 -5.4242e+01 -5.8215e+01 -5.0078e+01 -5.7627e+01 -5.4238e+01 -5.8186e+01 -5.0051e+01 -5.7617e+01 -5.4226e+01 -5.8158e+01 -5.0023e+01 -5.7607e+01 -5.4215e+01 -5.8130e+01 -1.0000e+01 -5.7596e+01 -5.4204e+01 -5.8102e+01 -6.0000e+01 -5.7585e+01 -5.4193e+01 -5.8073e+01 -6.0000e+01 -5.7575e+01 -5.4182e+01 -5.8045e+01 -6.0000e+01 -5.7564e+01 -5.4171e+01 -5.8017e+01 -6.0000e+01 -5.7553e+01 -5.4160e+01 -5.7989e+01 -6.0000e+01 -5.7542e+01 -5.4150e+01 -5.7961e+01 -6.0000e+01 -5.7531e+01 -5.4139e+01 -5.7933e+01 -6.0000e+01 -5.7520e+01 -5.4129e+01 -5.7905e+01 -6.0000e+01 -5.7509e+01 -5.4119e+01 -5.7877e+01 -6.0000e+01 -5.7497e+01 -5.4108e+01 -5.7849e+01 -6.0000e+01 -5.7486e+01 -5.4098e+01 -5.7822e+01 -6.0000e+01 -5.7474e+01 -5.4088e+01 -5.7794e+01 -6.0000e+01 -5.7463e+01 -5.4078e+01 -5.7766e+01 -6.0000e+01 -5.7451e+01 -5.4068e+01 -5.7738e+01 -6.0000e+01 -5.7439e+01 -5.4058e+01 -5.7711e+01 -6.0000e+01 -5.7427e+01 -5.4048e+01 -5.7683e+01 -6.0000e+01 -5.7415e+01 -5.4038e+01 -5.7656e+01 -6.0000e+01 -5.7403e+01 -5.4029e+01 -5.7628e+01 -6.0000e+01 -5.7391e+01 -5.4019e+01 -5.7601e+01 -6.0000e+01 -5.7379e+01 -5.4006e+01 -5.7573e+01 -6.0000e+01 -5.7366e+01 -5.3988e+01 -5.7546e+01 -6.0000e+01 -5.7354e+01 -5.3971e+01 -5.7518e+01 -6.0000e+01 -5.7341e+01 -5.3954e+01 -5.7491e+01 -6.0000e+01 -5.7328e+01 -5.3937e+01 -5.7464e+01 -6.0000e+01 -5.7316e+01 -5.3921e+01 -5.7436e+01 -6.0000e+01 -5.7303e+01 -5.3904e+01 -5.7409e+01 -6.0000e+01 -5.7290e+01 -5.3888e+01 -5.7409e+01 -6.0000e+01 -5.7277e+01 -5.3872e+01 -5.7426e+01 -6.0000e+01 -5.7263e+01 -5.3856e+01 -5.7442e+01 -6.0000e+01 -5.7250e+01 -5.3840e+01 -5.7458e+01 -6.0000e+01 -5.7230e+01 -5.3825e+01 -5.7473e+01 -6.0000e+01 -5.7208e+01 -5.3810e+01 -5.7488e+01 -6.0000e+01 -5.7187e+01 -5.3794e+01 -5.7502e+01 -6.0000e+01 -5.7166e+01 -5.3780e+01 -5.7515e+01 -6.0000e+01 -5.7145e+01 -5.3765e+01 -5.7528e+01 -6.0000e+01 -5.7124e+01 -5.3750e+01 -5.7540e+01 -6.0000e+01 -5.7103e+01 -5.3735e+01 -5.7552e+01 -6.0000e+01 -5.7082e+01 -5.3721e+01 -5.7561e+01 -6.0000e+01 -5.7061e+01 -5.3707e+01 -5.7563e+01 -6.0000e+01 -5.7040e+01 -5.3693e+01 -5.7566e+01 -6.0000e+01 -5.7020e+01 -5.3679e+01 -5.7568e+01 -6.0000e+01 -5.6999e+01 -5.3665e+01 -5.7569e+01 -6.0000e+01 -5.6978e+01 -5.3651e+01 -5.7571e+01 -6.0000e+01 -5.6958e+01 -5.3638e+01 -5.7572e+01 -6.0000e+01 -5.6937e+01 -5.3624e+01 -5.7572e+01 -6.0000e+01 -5.6917e+01 -5.3609e+01 -5.7572e+01 -6.0000e+01 -5.6929e+01 -5.3588e+01 -5.7572e+01 -6.0000e+01 -5.6953e+01 -5.3567e+01 -5.7572e+01 -6.0000e+01 -5.6976e+01 -5.3546e+01 -5.7565e+01 -6.0000e+01 -5.6999e+01 -5.3522e+01 -5.7556e+01 -5.9990e+01 -5.7018e+01 -5.3494e+01 -5.7547e+01 -5.9914e+01 -5.7032e+01 -5.3467e+01 -5.7538e+01 -5.9839e+01 -5.7045e+01 -5.3440e+01 -5.7529e+01 -5.9764e+01 -5.7058e+01 -5.3413e+01 -5.7519e+01 -5.9691e+01 -5.7070e+01 -5.3387e+01 -5.7502e+01 -5.9618e+01 -5.7082e+01 -5.3361e+01 -5.7485e+01 -5.9546e+01 -5.7093e+01 -5.3330e+01 -5.7467e+01 -5.9475e+01 -5.7104e+01 -5.3297e+01 -5.7450e+01 -5.9404e+01 -5.7115e+01 -5.3265e+01 -5.7433e+01 -5.9335e+01 -5.7126e+01 -5.3233e+01 -5.7416e+01 -5.9266e+01 -5.7135e+01 -5.3202e+01 -5.7398e+01 -5.9197e+01 -5.7145e+01 -5.3171e+01 -5.7381e+01 -5.9130e+01 -5.7154e+01 -5.3141e+01 -5.7364e+01 -5.9063e+01 -5.7163e+01 -5.3112e+01 -5.7347e+01 -5.8997e+01 -5.7171e+01 -5.3083e+01 -5.7330e+01 -5.8931e+01 -5.7179e+01 -5.3055e+01 -5.7313e+01 -5.8866e+01 -5.7187e+01 -5.3027e+01 -5.7296e+01 -5.8802e+01 -5.7192e+01 -5.2999e+01 -5.7279e+01 -5.8738e+01 -5.7191e+01 -5.2966e+01 -5.7262e+01 -5.8675e+01 -5.7190e+01 -5.2931e+01 -5.7245e+01 -5.8613e+01 -5.7189e+01 -5.2898e+01 -5.7229e+01 -5.8551e+01 -5.7187e+01 -5.2864e+01 -5.7212e+01 -5.8490e+01 -5.7185e+01 -5.2832e+01 -5.7195e+01 -5.8429e+01 -5.7183e+01 -5.2800e+01 -5.7178e+01 -5.8370e+01 -5.7181e+01 -5.2769e+01 -5.7161e+01 -5.8310e+01 -5.7179e+01 -5.2738e+01 -5.7144e+01 -5.8251e+01 -5.7169e+01 -5.2703e+01 -5.7124e+01 -5.8193e+01 -5.7158e+01 -5.2666e+01 -5.7099e+01 -5.8135e+01 -5.7148e+01 -5.2629e+01 -5.7074e+01 -5.8078e+01 -5.7138e+01 -5.2593e+01 -5.7050e+01 -5.8022e+01 -5.7127e+01 -5.2557e+01 -5.7026e+01 -5.7965e+01 -5.7117e+01 -5.2523e+01 -5.7002e+01 -5.7910e+01 -5.7106e+01 -5.2488e+01 -5.6978e+01 -5.7855e+01 -5.7096e+01 -5.2455e+01 -5.6954e+01 -5.7800e+01 -5.7086e+01 -5.2422e+01 -5.6931e+01 -5.7746e+01 -5.7075e+01 -5.2381e+01 -5.6907e+01 -5.7693e+01 -5.7065e+01 -5.2342e+01 -5.6924e+01 -5.7639e+01 -5.7054e+01 -5.2304e+01 -5.6945e+01 -5.7587e+01 -5.7044e+01 -5.2266e+01 -5.6965e+01 -5.7535e+01 -5.7033e+01 -5.2229e+01 -5.6985e+01 -5.7483e+01 -5.7015e+01 -5.2193e+01 -5.7005e+01 -5.7432e+01 -5.6996e+01 -5.2156e+01 -5.7024e+01 -5.7381e+01 -5.6978e+01 -5.2114e+01 -5.7042e+01 -5.7326e+01 -5.6960e+01 -5.2072e+01 -5.7090e+01 -5.7269e+01 -5.6942e+01 -5.2031e+01 -5.7152e+01 -5.7211e+01 -5.6924e+01 -5.1990e+01 -5.7212e+01 -5.7155e+01 -5.6906e+01 -5.1951e+01 -5.7271e+01 -5.7099e+01 -5.6888e+01 -5.1913e+01 -5.7329e+01 -5.7044e+01 -5.6864e+01 -5.1875e+01 -5.7385e+01 -5.6989e+01 -5.6839e+01 -5.1838e+01 -5.7433e+01 -5.6935e+01 -5.6814e+01 -5.1802e+01 -5.7480e+01 -5.6881e+01 -5.6789e+01 -5.1766e+01 -5.7526e+01 -5.6828e+01 -5.6765e+01 -5.1732e+01 -5.7572e+01 -5.6775e+01 -5.6741e+01 -5.1698e+01 -5.7616e+01 -5.6724e+01 -5.6717e+01 -5.1665e+01 -5.7659e+01 -5.6672e+01 -5.6694e+01 -5.1632e+01 -5.7734e+01 -5.6621e+01 -5.6670e+01 -5.1600e+01 -5.7820e+01 -5.6571e+01 -5.6647e+01 -5.1569e+01 -5.7905e+01 -5.6521e+01 -5.6624e+01 -5.1538e+01 -5.7988e+01 -5.6472e+01 -5.6602e+01 -5.1508e+01 -5.8069e+01 -5.6423e+01 -5.6579e+01 -5.1479e+01 -5.8149e+01 -5.6374e+01 -5.6557e+01 -5.1450e+01 -5.8227e+01 -5.6327e+01 -5.6535e+01 -5.1442e+01 -5.8328e+01 -5.6279e+01 -5.6513e+01 -5.1451e+01 -5.8448e+01 -5.6232e+01 -5.6491e+01 -5.1459e+01 -5.8566e+01 -5.6186e+01 -5.6470e+01 -5.1468e+01 -5.8682e+01 -5.6140e+01 -5.6449e+01 -5.1477e+01 -5.8795e+01 -5.6094e+01 -5.6428e+01 -5.1487e+01 -5.8907e+01 -5.6049e+01 -5.6407e+01 -5.1496e+01 -5.9017e+01 -5.6004e+01 -5.6386e+01 -5.1505e+01 -5.9124e+01 -5.5960e+01 -5.6365e+01 -5.1514e+01 -5.9230e+01 -5.5916e+01 -5.6345e+01 -5.1524e+01 -5.9334e+01 -5.5873e+01 -5.6324e+01 -5.1533e+01 -5.9436e+01 -5.5830e+01 -5.6304e+01 -5.1542e+01 -5.9535e+01 -5.5787e+01 -5.6284e+01 -5.1552e+01 -5.9634e+01 -5.5745e+01 -5.6264e+01 -5.1561e+01 -5.9730e+01 -5.5703e+01 -5.6244e+01 -5.1571e+01 -5.9824e+01 -5.5661e+01 -5.6224e+01 -5.1580e+01 -5.9917e+01 -5.5620e+01 -5.6205e+01 -5.1590e+01 -6.0008e+01 -5.5579e+01 -5.6185e+01 -5.1599e+01 -6.0097e+01 -5.5539e+01 -5.6166e+01 -5.1608e+01 -6.0184e+01 -5.5499e+01 -5.6147e+01 -5.1618e+01 -6.0269e+01 -5.5459e+01 -5.6128e+01 -5.1627e+01 -6.0353e+01 -5.5417e+01 -5.6108e+01 -5.1636e+01 -6.0435e+01 -5.5370e+01 -5.6089e+01 -5.1646e+01 -6.0516e+01 -5.5324e+01 -5.6070e+01 -5.1655e+01 -6.0595e+01 -5.5278e+01 -5.6052e+01 -5.1664e+01 -6.0672e+01 -5.5233e+01 -5.6033e+01 -5.1673e+01 -6.0747e+01 -5.5188e+01 -5.6014e+01 -5.1682e+01 -6.0821e+01 -5.5144e+01 -5.5996e+01 -5.1691e+01 -6.0894e+01 -5.5100e+01 -5.5977e+01 -5.1700e+01 -6.0964e+01 -5.5057e+01 -5.5959e+01 -5.1709e+01 -6.1033e+01 -5.5014e+01 -5.5940e+01 -5.1718e+01 -6.1101e+01 -5.4972e+01 -5.5922e+01 -5.1727e+01 -6.1167e+01 -5.4930e+01 -5.5903e+01 -5.1735e+01 -6.1232e+01 -5.4889e+01 -5.5885e+01 -5.1744e+01 -6.1295e+01 -5.4848e+01 -5.5867e+01 -5.1752e+01 -6.1357e+01 -5.4807e+01 -5.5849e+01 -5.1761e+01 -6.1417e+01 -5.4767e+01 -5.5831e+01 -5.1769e+01 -6.1476e+01 -5.4727e+01 -5.5813e+01 -5.1778e+01 -6.1534e+01 -5.4688e+01 -5.5795e+01 -5.1783e+01 -6.1590e+01 -5.4649e+01 -5.5777e+01 -5.1775e+01 -6.1644e+01 -5.4611e+01 -5.5752e+01 -5.1768e+01 -6.1698e+01 -5.4573e+01 -5.5726e+01 -5.1760e+01 -6.1750e+01 -5.4536e+01 -5.5701e+01 -5.1753e+01 -6.1800e+01 -5.4498e+01 -5.5676e+01 -5.1747e+01 -6.1850e+01 -5.4462e+01 -5.5651e+01 -5.1740e+01 -6.1898e+01 -5.4425e+01 -5.5626e+01 -5.1734e+01 -6.1944e+01 -5.4389e+01 -5.5601e+01 -5.1728e+01 -6.1990e+01 -5.4353e+01 -5.5577e+01 -5.1722e+01 -6.2034e+01 -5.4318e+01 -5.5553e+01 -5.1717e+01 -6.2077e+01 -5.4283e+01 -5.5529e+01 -5.1711e+01 -6.2119e+01 -5.4248e+01 -5.5505e+01 -5.1706e+01 -6.2159e+01 -5.4214e+01 -5.5481e+01 -5.1701e+01 -6.2199e+01 -5.4180e+01 -5.5458e+01 -5.1697e+01 -6.2237e+01 -5.4147e+01 -5.5435e+01 -5.1692e+01 -6.2274e+01 -5.4113e+01 -5.5411e+01 -5.1688e+01 -6.2310e+01 -5.4080e+01 -5.5389e+01 -5.1684e+01 -6.2344e+01 -5.4048e+01 -5.5366e+01 -5.1680e+01 -6.2378e+01 -5.4015e+01 -5.5343e+01 -5.1676e+01 -6.2411e+01 -5.3983e+01 -5.5321e+01 -5.1672e+01 -6.2442e+01 -5.3952e+01 -5.5298e+01 -5.1668e+01 -6.2472e+01 -5.3920e+01 -5.5276e+01 -5.1665e+01 -6.2502e+01 -5.3889e+01 -5.5254e+01 -5.1662e+01 -6.2530e+01 -5.3858e+01 -5.5232e+01 -5.1658e+01 -6.2557e+01 -5.3828e+01 -5.5211e+01 -5.1655e+01 -6.2583e+01 -5.3798e+01 -5.5189e+01 -5.1663e+01 -6.2608e+01 -5.3768e+01 -5.5168e+01 -5.1696e+01 -6.2632e+01 -5.3738e+01 -5.5146e+01 -5.1730e+01 -6.2655e+01 -5.3709e+01 -5.5125e+01 -5.1762e+01 -6.2678e+01 -5.3679e+01 -5.5104e+01 -5.1795e+01 -6.2699e+01 -5.3651e+01 -5.5083e+01 -5.1827e+01 -6.2719e+01 -5.3622e+01 -5.5062e+01 -5.1855e+01 -6.2738e+01 -5.3594e+01 -5.5040e+01 -5.1878e+01 -6.2757e+01 -5.3566e+01 -5.5012e+01 -5.1902e+01 -6.2774e+01 -5.3538e+01 -5.4983e+01 -5.1925e+01 -6.2791e+01 -5.3510e+01 -5.4955e+01 -5.1948e+01 -6.2806e+01 -5.3483e+01 -5.4928e+01 -5.1971e+01 -6.2821e+01 -5.3456e+01 -5.4900e+01 -5.1993e+01 -6.2835e+01 -5.3429e+01 -5.4873e+01 -5.2016e+01 -6.2848e+01 -5.3402e+01 -5.4846e+01 -5.2038e+01 -6.2860e+01 -5.3376e+01 -5.4819e+01 -5.2060e+01 -6.2872e+01 -5.3349e+01 -5.4793e+01 -5.2082e+01 -6.2882e+01 -5.3324e+01 -5.4767e+01 -5.2103e+01 -6.2892e+01 -5.3298e+01 -5.4741e+01 -5.2125e+01 -6.2901e+01 -5.3272e+01 -5.4716e+01 -5.2146e+01 -6.2909e+01 -5.3247e+01 -5.4690e+01 -5.2167e+01 -6.2917e+01 -5.3222e+01 -5.4657e+01 -5.2188e+01 -6.2923e+01 -5.3197e+01 -5.4624e+01 -5.2208e+01 -6.2929e+01 -5.3172e+01 -5.4592e+01 -5.2228e+01 -6.2934e+01 -5.3148e+01 -5.4560e+01 -5.2248e+01 -6.2939e+01 -5.3123e+01 -5.4529e+01 -5.2268e+01 -6.2942e+01 -5.3099e+01 -5.4497e+01 -5.2288e+01 -6.2945e+01 -5.3075e+01 -5.4467e+01 -5.2332e+01 -6.2947e+01 -5.3052e+01 -5.4436e+01 -5.2379e+01 -6.2949e+01 -5.3028e+01 -5.4406e+01 -5.2426e+01 -6.2950e+01 -5.3005e+01 -5.4377e+01 -5.2473e+01 -6.2950e+01 -5.2982e+01 -5.4348e+01 -5.2519e+01 -6.2949e+01 -5.2959e+01 -5.4319e+01 -5.2564e+01 -6.2948e+01 -5.2929e+01 -5.4290e+01 -5.2609e+01 -6.2946e+01 -5.2898e+01 -5.4257e+01 -5.2653e+01 -6.2944e+01 -5.2868e+01 -5.4221e+01 -5.2697e+01 -6.2933e+01 -5.2839e+01 -5.4186e+01 -5.2741e+01 -6.2921e+01 -5.2809e+01 -5.4151e+01 -5.2784e+01 -6.2909e+01 -5.2780e+01 -5.4117e+01 -5.2826e+01 -6.2897e+01 -5.2752e+01 -5.4083e+01 -5.2868e+01 -6.2884e+01 -5.2724e+01 -5.4050e+01 -5.2909e+01 -6.2871e+01 -5.2696e+01 -5.4017e+01 -5.2950e+01 -6.2857e+01 -5.2668e+01 -5.3985e+01 -5.2990e+01 -6.2843e+01 -5.2641e+01 -5.3953e+01 -5.3030e+01 -6.2829e+01 -5.2614e+01 -5.3921e+01 -5.3069e+01 -6.2814e+01 -5.2584e+01 -5.3910e+01 -5.3107e+01 -6.2799e+01 -5.2549e+01 -5.3924e+01 -5.3146e+01 -6.2784e+01 -5.2516e+01 -5.3938e+01 -5.3183e+01 -6.2768e+01 -5.2482e+01 -5.3951e+01 -5.3220e+01 -6.2752e+01 -5.2450e+01 -5.3964e+01 -5.3257e+01 -6.2735e+01 -5.2417e+01 -5.3976e+01 -5.3293e+01 -6.2718e+01 -5.2385e+01 -5.3989e+01 -5.3329e+01 -6.2701e+01 -5.2354e+01 -5.4001e+01 -5.3364e+01 -6.2683e+01 -5.2323e+01 -5.4013e+01 -5.3433e+01 -6.2665e+01 -5.2293e+01 -5.4025e+01 -5.3503e+01 -6.2647e+01 -5.2263e+01 -5.4036e+01 -5.3573e+01 -6.2628e+01 -5.2233e+01 -5.4047e+01 -5.3641e+01 -6.2609e+01 -5.2204e+01 -5.4058e+01 -5.3708e+01 -6.2590e+01 -5.2175e+01 -5.4069e+01 -5.3775e+01 -6.2570e+01 -5.2146e+01 -5.4079e+01 -5.3840e+01 -6.2550e+01 -5.2118e+01 -5.4089e+01 -5.3904e+01 -6.2530e+01 -5.2091e+01 -5.4096e+01 -5.3968e+01 -6.2510e+01 -5.2064e+01 -5.4098e+01 -5.4030e+01 -6.2489e+01 -5.2037e+01 -5.4099e+01 -5.4092e+01 -6.2467e+01 -5.2010e+01 -5.4101e+01 -5.4153e+01 -6.2446e+01 -5.1984e+01 -5.4102e+01 -5.4213e+01 -6.2424e+01 -5.1958e+01 -5.4104e+01 -5.4271e+01 -6.2402e+01 -5.1933e+01 -5.4105e+01 -5.4329e+01 -6.2380e+01 -5.1908e+01 -5.4106e+01 -5.4386e+01 -6.2357e+01 -5.1883e+01 -5.4108e+01 -5.4443e+01 -6.2334e+01 -5.1857e+01 -5.4109e+01 -5.4498e+01 -6.2311e+01 -5.1824e+01 -5.4110e+01 -5.4552e+01 -6.2288e+01 -5.1793e+01 -5.4111e+01 -5.4606e+01 -6.2264e+01 -5.1762e+01 -5.4111e+01 -5.4658e+01 -6.2240e+01 -5.1731e+01 -5.4112e+01 -5.4710e+01 -6.2216e+01 -5.1701e+01 -5.4113e+01 -5.4761e+01 -6.2192e+01 -5.1672e+01 -5.4113e+01 -5.4811e+01 -6.2167e+01 -5.1643e+01 -5.4114e+01 -5.4860e+01 -6.2142e+01 -5.1614e+01 -5.4114e+01 -5.4909e+01 -6.2117e+01 -5.1586e+01 -5.4114e+01 -5.4956e+01 -6.2091e+01 -5.1558e+01 -5.4115e+01 -5.5003e+01 -6.2066e+01 -5.1531e+01 -5.4115e+01 -5.5049e+01 -6.2040e+01 -5.1523e+01 -5.4115e+01 -5.5094e+01 -6.2014e+01 -5.1541e+01 -5.4114e+01 -5.5138e+01 -6.1988e+01 -5.1558e+01 -5.4114e+01 -5.5182e+01 -6.1961e+01 -5.1576e+01 -5.4114e+01 -5.5225e+01 -6.1934e+01 -5.1593e+01 -5.4113e+01 -5.5266e+01 -6.1908e+01 -5.1610e+01 -5.4113e+01 -5.5308e+01 -6.1879e+01 -5.1626e+01 -5.4112e+01 -5.5348e+01 -6.1843e+01 -5.1641e+01 -5.4111e+01 -5.5388e+01 -6.1808e+01 -5.1650e+01 -5.4110e+01 -5.5426e+01 -6.1773e+01 -5.1658e+01 -5.4109e+01 -5.5464e+01 -6.1738e+01 -5.1666e+01 -5.4108e+01 -5.5502e+01 -6.1702e+01 -5.1674e+01 -5.4107e+01 -5.5538e+01 -6.1667e+01 -5.1682e+01 -5.4105e+01 -5.5574e+01 -6.1632e+01 -5.1690e+01 -5.4104e+01 -5.5609e+01 -6.1597e+01 -5.1698e+01 -5.4102e+01 -5.5642e+01 -6.1561e+01 -5.1705e+01 -5.4100e+01 -5.5668e+01 -6.1526e+01 -5.1713e+01 -5.4099e+01 -5.5693e+01 -6.1491e+01 -5.1721e+01 -5.4097e+01 -5.5718e+01 -6.1455e+01 -5.1728e+01 -5.4094e+01 -5.5742e+01 -6.1420e+01 -5.1736e+01 -5.4092e+01 -5.5757e+01 -6.1385e+01 -5.1740e+01 -5.4090e+01 -5.5773e+01 -6.1350e+01 -5.1739e+01 -5.4087e+01 -5.5788e+01 -6.1314e+01 -5.1739e+01 -5.4085e+01 -5.5803e+01 -6.1279e+01 -5.1738e+01 -5.4082e+01 -5.5817e+01 -6.1244e+01 -5.1738e+01 -5.4079e+01 -5.5831e+01 -6.1205e+01 -5.1738e+01 -5.4074e+01 -5.5845e+01 -6.1161e+01 -5.1737e+01 -5.4063e+01 -5.5859e+01 -6.1118e+01 -5.1737e+01 -5.4052e+01 -5.5872e+01 -6.1076e+01 -5.1737e+01 -5.4041e+01 -5.5885e+01 -6.1033e+01 -5.1737e+01 -5.4030e+01 -5.5897e+01 -6.0991e+01 -5.1737e+01 -5.4017e+01 -5.5910e+01 -6.0948e+01 -5.1759e+01 -5.3998e+01 -5.5922e+01 -6.0906e+01 -5.1803e+01 -5.3980e+01 -5.5933e+01 -6.0864e+01 -5.1847e+01 -5.3962e+01 -5.5945e+01 -6.0823e+01 -5.1891e+01 -5.3951e+01 -5.5956e+01 -6.0781e+01 -5.1933e+01 -5.3978e+01 -5.5967e+01 -6.0740e+01 -5.1976e+01 -5.4004e+01 -5.5977e+01 -6.0698e+01 -5.2017e+01 -5.4031e+01 -5.5987e+01 -6.0657e+01 -5.2058e+01 -5.4056e+01 -5.5997e+01 -6.0616e+01 -5.2096e+01 -5.4081e+01 -5.6006e+01 -6.0576e+01 -5.2128e+01 -5.4106e+01 -5.6015e+01 -6.0535e+01 -5.2159e+01 -5.4131e+01 -5.6047e+01 -6.0495e+01 -5.2190e+01 -5.4154e+01 -5.6091e+01 -6.0454e+01 -5.2221e+01 -5.4178e+01 -5.6128e+01 -6.0414e+01 -5.2251e+01 -5.4201e+01 -5.6163e+01 -6.0374e+01 -5.2281e+01 -5.4224e+01 -5.6198e+01 -6.0334e+01 -5.2310e+01 -5.4246e+01 -5.6233e+01 -6.0294e+01 -5.2339e+01 -5.4268e+01 -5.6266e+01 -6.0255e+01 -5.2368e+01 -5.4289e+01 -5.6300e+01 -6.0215e+01 -5.2396e+01 -5.4310e+01 -5.6333e+01 -6.0176e+01 -5.2424e+01 -5.4324e+01 -5.6365e+01 -6.0137e+01 -5.2452e+01 -5.4336e+01 -5.6396e+01 -6.0098e+01 -5.2479e+01 -5.4348e+01 -5.6427e+01 -6.0059e+01 -5.2505e+01 -5.4360e+01 -5.6458e+01 -6.0016e+01 -5.2532e+01 -5.4372e+01 -5.6488e+01 -5.9969e+01 -5.2550e+01 -5.4383e+01 -5.6517e+01 -5.9923e+01 -5.2567e+01 -5.4388e+01 -5.6546e+01 -5.9877e+01 -5.2585e+01 -5.4391e+01 -5.6574e+01 -5.9831e+01 -5.2602e+01 -5.4391e+01 -5.6602e+01 -5.9786e+01 -5.2619e+01 -5.4386e+01 -5.6629e+01 -5.9741e+01 -5.2636e+01 -5.4381e+01 -5.6655e+01 -5.9732e+01 -5.2653e+01 -5.4377e+01 -5.6681e+01 -5.9732e+01 -5.2670e+01 -5.4372e+01 -5.6707e+01 -5.9731e+01 -5.2686e+01 -5.4368e+01 -5.6732e+01 -5.9730e+01 -5.2702e+01 -5.4360e+01 -5.6756e+01 -5.9728e+01 -5.2718e+01 -5.4348e+01 -5.6780e+01 -5.9726e+01 -5.2734e+01 -5.4336e+01 -5.6800e+01 -5.9724e+01 -5.2749e+01 -5.4318e+01 -5.6815e+01 -5.9721e+01 -5.2765e+01 -5.4293e+01 -5.6830e+01 -5.9718e+01 -5.2780e+01 -5.4266e+01 -5.6844e+01 -5.9715e+01 -5.2795e+01 -5.4241e+01 -5.6858e+01 -5.9711e+01 -5.2809e+01 -5.4216e+01 -5.6871e+01 -5.9707e+01 -5.2824e+01 -5.4191e+01 -5.6880e+01 -5.9702e+01 -5.2838e+01 -5.4167e+01 -5.6885e+01 -5.9697e+01 -5.2851e+01 -5.4144e+01 -5.6890e+01 -5.9692e+01 -5.2856e+01 -5.4121e+01 -5.6895e+01 -5.9687e+01 -5.2854e+01 -5.4099e+01 -5.6899e+01 -5.9681e+01 -5.2851e+01 -5.4077e+01 -5.6899e+01 -5.9675e+01 -5.2850e+01 -5.4056e+01 -5.6895e+01 -5.9668e+01 -5.2848e+01 -5.4035e+01 -5.6891e+01 -5.9661e+01 -5.2846e+01 -5.4015e+01 -5.6888e+01 -5.9654e+01 -5.2845e+01 -5.3995e+01 -5.6884e+01 -5.9647e+01 -5.2843e+01 -5.3976e+01 -5.6880e+01 -5.9639e+01 -5.2842e+01 -5.3957e+01 -5.6877e+01 -5.9631e+01 -5.2841e+01 -5.3939e+01 -5.6873e+01 -5.9622e+01 -5.2840e+01 -5.3921e+01 -5.6870e+01 -5.9613e+01 -5.2839e+01 -5.3903e+01 -5.6866e+01 -5.9604e+01 -5.2838e+01 -5.3887e+01 -5.6862e+01 -5.9595e+01 -5.2837e+01 -5.3915e+01 -5.6859e+01 -5.9585e+01 -5.2836e+01 -5.3942e+01 -5.6855e+01 -5.9575e+01 -5.2836e+01 -5.3969e+01 -5.6851e+01 -5.9565e+01 -5.2835e+01 -5.3996e+01 -5.6848e+01 -5.9555e+01 -5.2835e+01 -5.4023e+01 -5.6844e+01 -5.9544e+01 -5.2834e+01 -5.4049e+01 -5.6840e+01 -5.9533e+01 -5.2834e+01 -5.4075e+01 -5.6836e+01 -5.9521e+01 -5.2833e+01 -5.4100e+01 -5.6832e+01 -5.9509e+01 -5.2825e+01 -5.4125e+01 -5.6828e+01 -5.9494e+01 -5.2817e+01 -5.4150e+01 -5.6824e+01 -5.9473e+01 -5.2809e+01 -5.4175e+01 -5.6820e+01 -5.9453e+01 -5.2801e+01 -5.4199e+01 -5.6815e+01 -5.9433e+01 -5.2793e+01 -5.4223e+01 -5.6811e+01 -5.9413e+01 -5.2786e+01 -5.4246e+01 -5.6806e+01 -5.9392e+01 -5.2779e+01 -5.4270e+01 -5.6802e+01 -5.9372e+01 -5.2772e+01 -5.4292e+01 -5.6797e+01 -5.9351e+01 -5.2766e+01 -5.4315e+01 -5.6787e+01 -5.9330e+01 -5.2759e+01 -5.4337e+01 -5.6774e+01 -5.9310e+01 -5.2753e+01 -5.4359e+01 -5.6762e+01 -5.9289e+01 -5.2745e+01 -5.4380e+01 -5.6749e+01 -5.9268e+01 -5.2731e+01 -5.4401e+01 -5.6737e+01 -5.9247e+01 -5.2717e+01 -5.4414e+01 -5.6724e+01 -5.9226e+01 -5.2704e+01 -5.4426e+01 -5.6712e+01 -5.9205e+01 -5.2691e+01 -5.4439e+01 -5.6696e+01 -5.9184e+01 -5.2674e+01 -5.4451e+01 -5.6676e+01 -5.9162e+01 -5.2653e+01 -5.4463e+01 -5.6656e+01 -5.9141e+01 -5.2633e+01 -5.4475e+01 -5.6636e+01 -5.9162e+01 -5.2614e+01 -5.4487e+01 -5.6609e+01 -5.9184e+01 -5.2596e+01 -5.4499e+01 -5.6582e+01 -5.9206e+01 -5.2622e+01 -5.4510e+01 -5.6556e+01 -5.9227e+01 -5.2648e+01 -5.4522e+01 -5.6530e+01 -5.9247e+01 -5.2674e+01 -5.4533e+01 -5.6504e+01 -5.9267e+01 -5.2699e+01 -5.4544e+01 -5.6479e+01 -5.9286e+01 -5.2724e+01 -5.4554e+01 -5.6454e+01 -5.9304e+01 -5.2749e+01 -5.4565e+01 -5.6429e+01 -5.9322e+01 -5.2774e+01 -5.4575e+01 -5.6405e+01 -5.9339e+01 -5.2798e+01 -5.4585e+01 -5.6381e+01 -5.9355e+01 -5.2822e+01 -5.4595e+01 -5.6353e+01 -5.9370e+01 -5.2846e+01 -5.4601e+01 -5.6322e+01 -5.9385e+01 -5.2870e+01 -5.4602e+01 -5.6296e+01 -5.9399e+01 -5.2893e+01 -5.4604e+01 -5.6300e+01 -5.9413e+01 -5.2916e+01 -5.4606e+01 -5.6299e+01 -5.9426e+01 -5.2939e+01 -5.4607e+01 -5.6297e+01 -5.9438e+01 -5.2961e+01 -5.4609e+01 -5.6296e+01 -5.9450e+01 -5.2983e+01 -5.4610e+01 -5.6295e+01 -5.9461e+01 -5.3005e+01 -5.4612e+01 -5.6294e+01 -5.9471e+01 -5.3027e+01 -5.4613e+01 -5.6293e+01 -5.9481e+01 -5.3048e+01 -5.4615e+01 -5.6293e+01 -5.9490e+01 -5.3069e+01 -5.4616e+01 -5.6292e+01 -5.9499e+01 -5.3090e+01 -5.4617e+01 -5.6292e+01 -5.9500e+01 -5.3110e+01 -5.4612e+01 -5.6291e+01 -5.9500e+01 -5.3131e+01 -5.4605e+01 -5.6284e+01 -5.9499e+01 -5.3150e+01 -5.4599e+01 -5.6276e+01 -5.9505e+01 -5.3170e+01 -5.4592e+01 -5.6268e+01 -5.9548e+01 -5.3189e+01 -5.4586e+01 -5.6260e+01 -5.9590e+01 -5.3208e+01 -5.4580e+01 -5.6253e+01 -5.9627e+01 -5.3227e+01 -5.4574e+01 -5.6246e+01 -5.9659e+01 -5.3245e+01 -5.4568e+01 -5.6239e+01 -5.9691e+01 -5.3263e+01 -5.4562e+01 -5.6232e+01 -5.9721e+01 -5.3281e+01 -5.4556e+01 -5.6226e+01 -5.9751e+01 -5.3299e+01 -5.4550e+01 -5.6220e+01 -5.9780e+01 -5.3316e+01 -5.4545e+01 -5.6214e+01 -5.9808e+01 -5.3333e+01 -5.4536e+01 -5.6208e+01 -5.9835e+01 -5.3350e+01 -5.4522e+01 -5.6202e+01 -5.9862e+01 -5.3366e+01 -5.4509e+01 -5.6196e+01 -5.9888e+01 -5.3376e+01 -5.4496e+01 -5.6190e+01 -5.9913e+01 -5.3384e+01 -5.4483e+01 -5.6185e+01 -5.9937e+01 -5.3392e+01 -5.4471e+01 -5.6180e+01 -5.9961e+01 -5.3399e+01 -5.4459e+01 -5.6174e+01 -5.9984e+01 -5.3407e+01 -5.4446e+01 -5.6169e+01 -6.0006e+01 -5.3414e+01 -5.4434e+01 -5.6164e+01 -6.0028e+01 -5.3422e+01 -5.4423e+01 -5.6159e+01 -6.0048e+01 -5.3427e+01 -5.4411e+01 -5.6154e+01 -6.0069e+01 -5.3426e+01 -5.4400e+01 -5.6149e+01 -6.0088e+01 -5.3425e+01 -5.4389e+01 -5.6144e+01 -6.0107e+01 -5.3424e+01 -5.4377e+01 -5.6139e+01 -6.0125e+01 -5.3424e+01 -5.4367e+01 -5.6171e+01 -6.0142e+01 -5.3423e+01 -5.4356e+01 -5.6202e+01 -6.0158e+01 -5.3423e+01 -5.4345e+01 -5.6233e+01 -6.0174e+01 -5.3422e+01 -5.4335e+01 -5.6264e+01 -6.0190e+01 -5.3422e+01 -5.4324e+01 -5.6294e+01 -6.0204e+01 -5.3422e+01 -5.4314e+01 -5.6324e+01 -6.0218e+01 -5.3421e+01 -5.4304e+01 -5.6353e+01 -6.0232e+01 -5.3421e+01 -5.4294e+01 -5.6381e+01 -6.0244e+01 -5.3421e+01 -5.4284e+01 -5.6410e+01 -6.0257e+01 -5.3420e+01 -5.4274e+01 -5.6437e+01 -6.0268e+01 -5.3420e+01 -5.4264e+01 -5.6465e+01 -6.0279e+01 -5.3420e+01 -5.4254e+01 -5.6492e+01 -6.0289e+01 -5.3419e+01 -5.4245e+01 -5.6518e+01 -6.0299e+01 -5.3419e+01 -5.4235e+01 -5.6544e+01 -6.0308e+01 -5.3419e+01 -5.4222e+01 -5.6569e+01 -6.0316e+01 -5.3418e+01 -5.4205e+01 -5.6594e+01 -6.0324e+01 -5.3418e+01 -5.4188e+01 -5.6619e+01 -6.0331e+01 -5.3418e+01 -5.4171e+01 -5.6643e+01 -6.0338e+01 -5.3417e+01 -5.4155e+01 -5.6667e+01 -6.0344e+01 -5.3417e+01 -5.4139e+01 -5.6690e+01 -6.0350e+01 -5.3417e+01 -5.4122e+01 -5.6712e+01 -6.0355e+01 -5.3416e+01 -5.4107e+01 -5.6735e+01 -6.0359e+01 -5.3416e+01 -5.4091e+01 -5.6757e+01 -6.0363e+01 -5.3415e+01 -5.4076e+01 -5.6778e+01 -6.0367e+01 -5.3414e+01 -5.4060e+01 -5.6799e+01 -6.0370e+01 -5.3414e+01 -5.4045e+01 -5.6819e+01 -6.0372e+01 -5.3413e+01 -5.4030e+01 -5.6839e+01 -6.0374e+01 -5.3412e+01 -5.4016e+01 -5.6859e+01 -6.0375e+01 -5.3412e+01 -5.4001e+01 -5.6878e+01 -6.0376e+01 -5.3411e+01 -5.3987e+01 -5.6896e+01 -6.0377e+01 -5.3410e+01 -5.3973e+01 -5.6914e+01 -6.0376e+01 -5.3409e+01 -5.3959e+01 -5.6932e+01 -6.0376e+01 -5.3408e+01 -5.3945e+01 -5.6949e+01 -6.0375e+01 -5.3407e+01 -5.3931e+01 -5.6962e+01 -6.0373e+01 -5.3406e+01 -5.3918e+01 -5.6971e+01 -6.0371e+01 -5.3405e+01 -5.3904e+01 -5.6979e+01 -6.0368e+01 -5.3403e+01 -5.3891e+01 -5.6987e+01 -6.0365e+01 -5.3402e+01 -5.3878e+01 -5.6995e+01 -6.0362e+01 -5.3400e+01 -5.3865e+01 -5.7002e+01 -6.0358e+01 -5.3399e+01 -5.3852e+01 -5.7009e+01 -6.0354e+01 -5.3397e+01 -5.3839e+01 -5.7016e+01 -6.0349e+01 -5.3396e+01 -5.3826e+01 -5.7023e+01 -6.0344e+01 -5.3394e+01 -5.3814e+01 -5.7029e+01 -6.0338e+01 -5.3392e+01 -5.3801e+01 -5.7035e+01 -6.0332e+01 -5.3390e+01 -5.3789e+01 -5.7041e+01 -6.0326e+01 -5.3388e+01 -5.3777e+01 -5.7047e+01 -6.0319e+01 -5.3386e+01 -5.3764e+01 -5.7052e+01 -6.0312e+01 -5.3384e+01 -5.3752e+01 -5.7057e+01 -6.0304e+01 -5.3382e+01 -5.3740e+01 -5.7062e+01 -6.0296e+01 -5.3380e+01 -5.3728e+01 -5.7067e+01 -6.0287e+01 -5.3378e+01 -5.3716e+01 -5.7071e+01 -6.0279e+01 -5.3375e+01 -5.3704e+01 -5.7075e+01 -6.0269e+01 -5.3373e+01 -5.3693e+01 -5.7079e+01 -6.0260e+01 -5.3370e+01 -5.3681e+01 -5.7082e+01 -6.0250e+01 -5.3367e+01 -5.3669e+01 -5.7086e+01 -6.0240e+01 -5.3364e+01 -5.3658e+01 -5.7089e+01 -6.0229e+01 -5.3362e+01 -5.3646e+01 -5.7091e+01 -6.0218e+01 -5.3359e+01 -5.3635e+01 -5.7094e+01 -6.0237e+01 -5.3356e+01 -5.3623e+01 -5.7096e+01 -6.0270e+01 -5.3352e+01 -5.3612e+01 -5.7098e+01 -6.0301e+01 -5.3349e+01 -5.3601e+01 -5.7100e+01 -6.0332e+01 -5.3346e+01 -5.3590e+01 -5.7101e+01 -6.0361e+01 -5.3343e+01 -5.3578e+01 -5.7102e+01 -6.0390e+01 -5.3339e+01 -5.3567e+01 -5.7103e+01 -6.0417e+01 -5.3332e+01 -5.3556e+01 -5.7104e+01 -6.0444e+01 -5.3320e+01 -5.3545e+01 -5.7104e+01 -6.0470e+01 -5.3309e+01 -5.3534e+01 -5.7104e+01 -6.0495e+01 -5.3297e+01 -5.3523e+01 -5.7104e+01 -6.0519e+01 -5.3286e+01 -5.3512e+01 -5.7103e+01 -6.0542e+01 -5.3274e+01 -5.3501e+01 -5.7103e+01 -6.0564e+01 -5.3255e+01 -5.3490e+01 -5.7102e+01 -6.0585e+01 -5.3236e+01 -5.3479e+01 -5.7100e+01 -6.0605e+01 -5.3217e+01 -5.3468e+01 -5.7099e+01 -6.0625e+01 -5.3199e+01 -5.3457e+01 -5.7097e+01 -6.0644e+01 -5.3181e+01 -5.3447e+01 -5.7095e+01 -6.0662e+01 -5.3164e+01 -5.3436e+01 -5.7093e+01 -6.0679e+01 -5.3146e+01 -5.3425e+01 -5.7091e+01 -6.0695e+01 -5.3129e+01 -5.3414e+01 -5.7082e+01 -6.0711e+01 -5.3112e+01 -5.3404e+01 -5.7072e+01 -6.0725e+01 -5.3095e+01 -5.3393e+01 -5.7061e+01 -6.0739e+01 -5.3079e+01 -5.3382e+01 -5.7050e+01 -6.0753e+01 -5.3063e+01 -5.3371e+01 -5.7039e+01 -6.0765e+01 -5.3047e+01 -5.3361e+01 -5.7028e+01 -6.0777e+01 -5.3031e+01 -5.3350e+01 -5.7017e+01 -6.0788e+01 -5.3015e+01 -5.3339e+01 -5.7006e+01 -6.0798e+01 -5.3000e+01 -5.3329e+01 -5.6994e+01 -6.0807e+01 -5.2984e+01 -5.3318e+01 -5.6983e+01 -6.0816e+01 -5.2969e+01 -5.3307e+01 -5.6972e+01 -6.0824e+01 -5.2951e+01 -5.3297e+01 -5.6960e+01 -6.0832e+01 -5.2929e+01 -5.3286e+01 -5.6949e+01 -6.0839e+01 -5.2906e+01 -5.3275e+01 -5.6938e+01 -6.0845e+01 -5.2884e+01 -5.3265e+01 -5.6926e+01 -6.0850e+01 -5.2863e+01 -5.3254e+01 -5.6914e+01 -6.0855e+01 -5.2842e+01 -5.3244e+01 -5.6902e+01 -6.0859e+01 -5.2821e+01 -5.3233e+01 -5.6891e+01 -6.0863e+01 -5.2800e+01 -5.3222e+01 -5.6879e+01 -6.0866e+01 -5.2780e+01 -5.3212e+01 -5.6865e+01 -6.0868e+01 -5.2760e+01 -5.3201e+01 -5.6845e+01 -6.0870e+01 -5.2740e+01 -5.3190e+01 -5.6825e+01 -6.0871e+01 -5.2721e+01 -5.3180e+01 -5.6806e+01 -6.0871e+01 -5.2702e+01 -5.3169e+01 -5.6786e+01 -6.0871e+01 -5.2683e+01 -5.3152e+01 -5.6766e+01 -6.0871e+01 -5.2665e+01 -5.3134e+01 -5.6747e+01 -6.0869e+01 -5.2643e+01 -5.3116e+01 -5.6727e+01 -6.0866e+01 -5.2617e+01 -5.3098e+01 -5.6708e+01 -6.0856e+01 -5.2591e+01 -5.3080e+01 -5.6689e+01 -6.0845e+01 -5.2566e+01 -5.3062e+01 -5.6670e+01 -6.0834e+01 -5.2542e+01 -5.3044e+01 -5.6651e+01 -6.0823e+01 -5.2518e+01 -5.3027e+01 -5.6632e+01 -6.0812e+01 -5.2494e+01 -5.3010e+01 -5.6613e+01 -6.0800e+01 -5.2471e+01 -5.2993e+01 -5.6594e+01 -6.0787e+01 -5.2448e+01 -5.2976e+01 -5.6575e+01 -6.0775e+01 -5.2425e+01 -5.2959e+01 -5.6557e+01 -6.0762e+01 -5.2403e+01 -5.2943e+01 -5.6538e+01 -6.0749e+01 -5.2381e+01 -5.2926e+01 -5.6519e+01 -6.0735e+01 -5.2360e+01 -5.2910e+01 -5.6501e+01 -6.0722e+01 -5.2339e+01 -5.2894e+01 -5.6482e+01 -6.0708e+01 -5.2318e+01 -5.2878e+01 -5.6464e+01 -6.0693e+01 -5.2298e+01 -5.2862e+01 -5.6446e+01 -6.0678e+01 -5.2278e+01 -5.2846e+01 -5.6421e+01 -6.0664e+01 -5.2258e+01 -5.2831e+01 -5.6416e+01 -6.0648e+01 -5.2238e+01 -5.2815e+01 -5.6426e+01 -6.0633e+01 -5.2219e+01 -5.2800e+01 -5.6436e+01 -6.0617e+01 -5.2200e+01 -5.2785e+01 -5.6446e+01 -6.0601e+01 -5.2182e+01 -5.2770e+01 -5.6456e+01 -6.0585e+01 -5.2163e+01 -5.2755e+01 -5.6466e+01 -6.0568e+01 -5.2145e+01 -5.2740e+01 -5.6475e+01 -6.0551e+01 -5.2128e+01 -5.2723e+01 -5.6484e+01 -6.0534e+01 -5.2110e+01 -5.2701e+01 -5.6493e+01 -6.0516e+01 -5.2093e+01 -5.2678e+01 -5.6501e+01 -6.0499e+01 -5.2076e+01 -5.2656e+01 -5.6509e+01 -6.0481e+01 -5.2059e+01 -5.2635e+01 -5.6517e+01 -6.0463e+01 -5.2043e+01 -5.2613e+01 -5.6525e+01 -6.0444e+01 -5.2027e+01 -5.2592e+01 -5.6532e+01 -6.0426e+01 -5.2011e+01 -5.2571e+01 -5.6540e+01 -6.0407e+01 -5.1995e+01 -5.2551e+01 -5.6547e+01 -6.0388e+01 -5.1979e+01 -5.2530e+01 -5.6553e+01 -6.0368e+01 -5.1964e+01 -5.2510e+01 -5.6560e+01 -6.0349e+01 -5.1949e+01 -5.2490e+01 -5.6566e+01 -6.0329e+01 -5.1934e+01 -5.2471e+01 -5.6572e+01 -6.0309e+01 -5.1919e+01 -5.2452e+01 -5.6577e+01 -6.0289e+01 -5.1904e+01 -5.2432e+01 -5.6583e+01 -6.0265e+01 -5.1890e+01 -5.2414e+01 -5.6588e+01 -6.0237e+01 -5.1873e+01 -5.2395e+01 -5.6592e+01 -6.0208e+01 -5.1851e+01 -5.2377e+01 -5.6597e+01 -6.0180e+01 -5.1830e+01 -5.2358e+01 -5.6601e+01 -6.0151e+01 -5.1809e+01 -5.2340e+01 -5.6605e+01 -6.0122e+01 -5.1788e+01 -5.2323e+01 -5.6609e+01 -6.0094e+01 -5.1767e+01 -5.2305e+01 -5.6613e+01 -6.0065e+01 -5.1747e+01 -5.2288e+01 -5.6616e+01 -6.0036e+01 -5.1727e+01 -5.2270e+01 -5.6619e+01 -6.0008e+01 -5.1708e+01 -5.2253e+01 -5.6621e+01 -5.9979e+01 -5.1689e+01 -5.2237e+01 -5.6624e+01 -5.9950e+01 -5.1670e+01 -5.2220e+01 -5.6626e+01 -5.9922e+01 -5.1651e+01 -5.2204e+01 -5.6628e+01 -5.9893e+01 -5.1633e+01 -5.2186e+01 -5.6630e+01 -5.9864e+01 -5.1615e+01 -5.2162e+01 -5.6631e+01 -5.9836e+01 -5.1597e+01 -5.2138e+01 -5.6632e+01 -5.9807e+01 -5.1580e+01 -5.2115e+01 -5.6633e+01 -5.9820e+01 -5.1605e+01 -5.2092e+01 -5.6634e+01 -5.9835e+01 -5.1632e+01 -5.2069e+01 -5.6634e+01 -5.9845e+01 -5.1659e+01 -5.2047e+01 -5.6634e+01 -5.9851e+01 -5.1685e+01 -5.2025e+01 -5.6634e+01 -5.9857e+01 -5.1711e+01 -5.2003e+01 -5.6633e+01 -5.9862e+01 -5.1737e+01 -5.1982e+01 -5.6633e+01 -5.9867e+01 -5.1762e+01 -5.2004e+01 -5.6632e+01 -5.9871e+01 -5.1787e+01 -5.2028e+01 -5.6631e+01 -5.9875e+01 -5.1811e+01 -5.2051e+01 -5.6629e+01 -5.9878e+01 -5.1835e+01 -5.2073e+01 -5.6628e+01 -5.9881e+01 -5.1859e+01 -5.2095e+01 -5.6626e+01 -5.9883e+01 -5.1888e+01 -5.2117e+01 -5.6624e+01 -5.9885e+01 -5.1955e+01 -5.2139e+01 -5.6621e+01 -5.9886e+01 -5.2022e+01 -5.2160e+01 -5.6619e+01 -5.9887e+01 -5.2087e+01 -5.2181e+01 -5.6616e+01 -5.9888e+01 -5.2152e+01 -5.2201e+01 -5.6613e+01 -5.9888e+01 -5.2215e+01 -5.2221e+01 -5.6610e+01 -5.9888e+01 -5.2277e+01 -5.2241e+01 -5.6606e+01 -5.9888e+01 -5.2339e+01 -5.2260e+01 -5.6602e+01 -5.9910e+01 -5.2399e+01 -5.2279e+01 -5.6598e+01 -5.9953e+01 -5.2498e+01 -5.2289e+01 -5.6594e+01 -5.9995e+01 -5.2601e+01 -5.2300e+01 -5.6583e+01 -6.0036e+01 -5.2702e+01 -5.2310e+01 -5.6571e+01 -6.0075e+01 -5.2801e+01 -5.2321e+01 -5.6558e+01 -6.0114e+01 -5.2899e+01 -5.2331e+01 -5.6546e+01 -6.0152e+01 -5.2995e+01 -5.2341e+01 -5.6533e+01 -6.0188e+01 -5.3089e+01 -5.2351e+01 -5.6520e+01 -6.0224e+01 -5.3183e+01 -5.2361e+01 -5.6508e+01 -6.0259e+01 -5.3274e+01 -5.2370e+01 -5.6495e+01 -6.0292e+01 -5.3364e+01 -5.2380e+01 -5.6482e+01 -6.0325e+01 -5.3453e+01 -5.2389e+01 -5.6469e+01 -6.0357e+01 -5.3540e+01 -5.2398e+01 -5.6457e+01 -6.0388e+01 -5.3626e+01 -5.2407e+01 -5.6444e+01 -6.0417e+01 -5.3710e+01 -5.2416e+01 -5.6431e+01 -6.0446e+01 -5.3793e+01 -5.2424e+01 -5.6418e+01 -6.0474e+01 -5.3874e+01 -5.2433e+01 -5.6405e+01 -6.0502e+01 -5.3954e+01 -5.2441e+01 -5.6392e+01 -6.0528e+01 -5.4033e+01 -5.2449e+01 -5.6379e+01 -6.0553e+01 -5.4111e+01 -5.2453e+01 -5.6366e+01 -6.0578e+01 -5.4187e+01 -5.2453e+01 -5.6352e+01 -6.0601e+01 -5.4261e+01 -5.2453e+01 -5.6339e+01 -6.0624e+01 -5.4335e+01 -5.2453e+01 -5.6326e+01 -6.0638e+01 -5.4407e+01 -5.2453e+01 -5.6312e+01 -6.0651e+01 -5.4477e+01 -5.2446e+01 -5.6292e+01 -6.0664e+01 -5.4547e+01 -5.2438e+01 -5.6270e+01 -6.0676e+01 -5.4615e+01 -5.2431e+01 -5.6249e+01 -6.0687e+01 -5.4682e+01 -5.2423e+01 -5.6228e+01 -6.0698e+01 -5.4748e+01 -5.2416e+01 -5.6207e+01 -6.0709e+01 -5.4813e+01 -5.2409e+01 -5.6187e+01 -6.0718e+01 -5.4876e+01 -5.2402e+01 -5.6166e+01 -6.0727e+01 -5.4938e+01 -5.2396e+01 -5.6145e+01 -6.0736e+01 -5.4999e+01 -5.2389e+01 -5.6125e+01 -6.0744e+01 -5.5059e+01 -5.2383e+01 -5.6105e+01 -6.0772e+01 -5.5118e+01 -5.2370e+01 -5.6085e+01 -6.0823e+01 -5.5176e+01 -5.2356e+01 -5.6064e+01 -6.0873e+01 -5.5232e+01 -5.2342e+01 -5.6044e+01 -6.0953e+01 -5.5288e+01 -5.2329e+01 -5.6025e+01 -6.1045e+01 -5.5342e+01 -5.2316e+01 -5.6005e+01 -6.1135e+01 -5.5395e+01 -5.2304e+01 -5.5985e+01 -6.1223e+01 -5.5440e+01 -5.2291e+01 -5.5965e+01 -6.1309e+01 -5.5483e+01 -5.2279e+01 -5.5946e+01 -6.1393e+01 -5.5526e+01 -5.2268e+01 -5.5926e+01 -6.1476e+01 -5.5567e+01 -5.2256e+01 -5.5907e+01 -6.1557e+01 -5.5608e+01 -5.2245e+01 -5.5888e+01 -6.1636e+01 -5.5648e+01 -5.2234e+01 -5.5868e+01 -6.1713e+01 -5.5687e+01 -5.2223e+01 -5.5849e+01 -6.1789e+01 -5.5726e+01 -5.2213e+01 -5.5830e+01 -6.1863e+01 -5.5763e+01 -5.2203e+01 -5.5811e+01 -6.1936e+01 -5.5800e+01 -5.2192e+01 -5.5792e+01 -6.2007e+01 -5.5836e+01 -5.2183e+01 -5.5773e+01 -6.2076e+01 -5.5871e+01 -5.2173e+01 -5.5754e+01 -6.2143e+01 -5.5905e+01 -5.2164e+01 -5.5735e+01 -6.2209e+01 -5.5939e+01 -5.2154e+01 -5.5716e+01 -6.2274e+01 -5.5972e+01 -5.2145e+01 -5.5698e+01 -6.2337e+01 -5.6004e+01 -5.2136e+01 -5.5679e+01 -6.2398e+01 -5.6036e+01 -5.2128e+01 -5.5660e+01 -6.2458e+01 -5.6066e+01 -5.2119e+01 -5.5642e+01 -6.2517e+01 -5.6096e+01 -5.2111e+01 -5.5623e+01 -6.2574e+01 -5.6126e+01 -5.2102e+01 -5.5598e+01 -6.2629e+01 -5.6154e+01 -5.2094e+01 -5.5572e+01 -6.2683e+01 -5.6182e+01 -5.2086e+01 -5.5546e+01 -6.2736e+01 -5.6209e+01 -5.2079e+01 -5.5520e+01 -6.2787e+01 -5.6236e+01 -5.2071e+01 -5.5495e+01 -6.2837e+01 -5.6261e+01 -5.2063e+01 -5.5469e+01 -6.2886e+01 -5.6287e+01 -5.2056e+01 -5.5444e+01 -6.2933e+01 -5.6311e+01 -5.2049e+01 -5.5419e+01 -6.2979e+01 -5.6335e+01 -5.2042e+01 -5.5394e+01 -6.3023e+01 -5.6358e+01 -5.2034e+01 -5.5370e+01 -6.3067e+01 -5.6381e+01 -5.2028e+01 -5.5345e+01 -6.3109e+01 -5.6403e+01 -5.2021e+01 -5.5321e+01 -6.3149e+01 -5.6424e+01 -5.2014e+01 -5.5297e+01 -6.3189e+01 -5.6444e+01 -5.2007e+01 -5.5273e+01 -6.3227e+01 -5.6465e+01 -5.2001e+01 -5.5249e+01 -6.3264e+01 -5.6484e+01 -5.1994e+01 -5.5226e+01 -6.3300e+01 -5.6503e+01 -5.1988e+01 -5.5203e+01 -6.3334e+01 -5.6521e+01 -5.1981e+01 -5.5179e+01 -6.3368e+01 -5.6539e+01 -5.1975e+01 -5.5156e+01 -6.3400e+01 -5.6556e+01 -5.1969e+01 -5.5134e+01 -6.3431e+01 -5.6572e+01 -5.1963e+01 -5.5110e+01 -6.3461e+01 -5.6588e+01 -5.1957e+01 -5.5080e+01 -6.3490e+01 -5.6604e+01 -5.1951e+01 -5.5049e+01 -6.3518e+01 -5.6618e+01 -5.1945e+01 -5.5020e+01 -6.3545e+01 -5.6633e+01 -5.1939e+01 -5.4990e+01 -6.3570e+01 -5.6647e+01 -5.1926e+01 -5.4961e+01 -6.3595e+01 -5.6660e+01 -5.1928e+01 -5.4932e+01 -6.3618e+01 -5.6672e+01 -5.1959e+01 -5.4903e+01 -6.3641e+01 -5.6685e+01 -5.1990e+01 -5.4875e+01 -6.3662e+01 -5.6696e+01 -5.2020e+01 -5.4847e+01 -6.3683e+01 -5.6707e+01 -5.2050e+01 -5.4819e+01 -6.3702e+01 -5.6718e+01 -5.2079e+01 -5.4792e+01 -6.3721e+01 -5.6728e+01 -5.2108e+01 -5.4765e+01 -6.3738e+01 -5.6738e+01 -5.2136e+01 -5.4738e+01 -6.3755e+01 -5.6747e+01 -5.2164e+01 -5.4712e+01 -6.3771e+01 -5.6756e+01 -5.2192e+01 -5.4685e+01 -6.3785e+01 -5.6764e+01 -5.2219e+01 -5.4652e+01 -6.3799e+01 -5.6772e+01 -5.2246e+01 -5.4618e+01 -6.3812e+01 -5.6779e+01 -5.2273e+01 -5.4585e+01 -6.3824e+01 -5.6786e+01 -5.2299e+01 -5.4552e+01 -6.3835e+01 -5.6788e+01 -5.2324e+01 -5.4520e+01 -6.3845e+01 -5.6786e+01 -5.2349e+01 -5.4488e+01 -6.3855e+01 -5.6783e+01 -5.2374e+01 -5.4456e+01 -6.3863e+01 -5.6781e+01 -5.2399e+01 -5.4425e+01 -6.3871e+01 -5.6778e+01 -5.2423e+01 -5.4395e+01 -6.3878e+01 -5.6775e+01 -5.2446e+01 -5.4364e+01 -6.3884e+01 -5.6772e+01 -5.2469e+01 -5.4334e+01 -6.3889e+01 -5.6761e+01 -5.2492e+01 -5.4305e+01 -6.3894e+01 -5.6750e+01 -5.2515e+01 -5.4275e+01 -6.3897e+01 -5.6738e+01 -5.2537e+01 -5.4246e+01 -6.3900e+01 -5.6727e+01 -5.2558e+01 -5.4218e+01 -6.3903e+01 -5.6715e+01 -5.2580e+01 -5.4189e+01 -6.3904e+01 -5.6704e+01 -5.2601e+01 -5.4161e+01 -6.3905e+01 -5.6692e+01 -5.2621e+01 -5.4134e+01 -6.3905e+01 -5.6680e+01 -5.2641e+01 -5.4107e+01 -6.3904e+01 -5.6668e+01 -5.2661e+01 -5.4080e+01 -6.3903e+01 -5.6657e+01 -5.2680e+01 -5.4053e+01 -6.3900e+01 -5.6645e+01 -5.2699e+01 -5.4026e+01 -6.3898e+01 -5.6633e+01 -5.2718e+01 -5.4000e+01 -6.3894e+01 -5.6621e+01 -5.2736e+01 -5.3975e+01 -6.3890e+01 -5.6609e+01 -5.2754e+01 -5.3949e+01 -6.3885e+01 -5.6597e+01 -5.2772e+01 -5.3924e+01 -6.3880e+01 -5.6585e+01 -5.2789e+01 -5.3899e+01 -6.3868e+01 -5.6573e+01 -5.2806e+01 -5.3874e+01 -6.3858e+01 -5.6560e+01 -5.2822e+01 -5.3845e+01 -6.3888e+01 -5.6548e+01 -5.2838e+01 -5.3813e+01 -6.3916e+01 -5.6528e+01 -5.2854e+01 -5.3781e+01 -6.3944e+01 -5.6508e+01 -5.2870e+01 -5.3750e+01 -6.3970e+01 -5.6488e+01 -5.2885e+01 -5.3719e+01 -6.3996e+01 -5.6468e+01 -5.2899e+01 -5.3689e+01 -6.4013e+01 -5.6448e+01 -5.2914e+01 -5.3659e+01 -6.4029e+01 -5.6428e+01 -5.2928e+01 -5.3629e+01 -6.4044e+01 -5.6408e+01 -5.2942e+01 -5.3600e+01 -6.4057e+01 -5.6389e+01 -5.2955e+01 -5.3571e+01 -6.4070e+01 -5.6369e+01 -5.2968e+01 -5.3542e+01 -6.4083e+01 -5.6350e+01 -5.2981e+01 -5.3514e+01 -6.4094e+01 -5.6331e+01 -5.2994e+01 -5.3486e+01 -6.4105e+01 -5.6311e+01 -5.3006e+01 -5.3459e+01 -6.4115e+01 -5.6292e+01 -5.3018e+01 -5.3432e+01 -6.4124e+01 -5.6273e+01 -5.3029e+01 -5.3405e+01 -6.4132e+01 -5.6254e+01 -5.3040e+01 -5.3379e+01 -6.4140e+01 -5.6235e+01 -5.3051e+01 -5.3353e+01 -6.4147e+01 -5.6217e+01 -5.3062e+01 -5.3327e+01 -6.4153e+01 -5.6198e+01 -5.3070e+01 -5.3302e+01 -6.4155e+01 -5.6179e+01 -5.3072e+01 -5.3277e+01 -6.4152e+01 -5.6161e+01 -5.3074e+01 -5.3252e+01 -6.4148e+01 -5.6142e+01 -5.3076e+01 -5.3227e+01 -6.4144e+01 -5.6124e+01 -5.3078e+01 -5.3203e+01 -6.4139e+01 -5.6105e+01 -5.3079e+01 -5.3179e+01 -6.4134e+01 -5.6087e+01 -5.3081e+01 -5.3155e+01 -6.4129e+01 -5.6068e+01 -5.3082e+01 -5.3132e+01 -6.4123e+01 -5.6050e+01 -5.3084e+01 -5.3109e+01 -6.4116e+01 -5.6032e+01 -5.3085e+01 -5.3086e+01 -6.4109e+01 -5.6014e+01 -5.3111e+01 -5.3063e+01 -6.4101e+01 -5.5996e+01 -5.3157e+01 -5.3041e+01 -6.4094e+01 -5.5978e+01 -5.3201e+01 -5.3019e+01 -6.4085e+01 -5.5959e+01 -5.3243e+01 -5.2997e+01 -6.4076e+01 -5.5941e+01 -5.3278e+01 -5.2967e+01 -6.4067e+01 -5.5923e+01 -5.3312e+01 -5.2938e+01 -6.4057e+01 -5.5905e+01 -5.3346e+01 -5.2909e+01 -6.4047e+01 -5.5887e+01 -5.3380e+01 -5.2881e+01 -6.4036e+01 -5.5870e+01 -5.3413e+01 -5.2853e+01 -6.4025e+01 -5.5852e+01 -5.3445e+01 -5.2825e+01 -6.4013e+01 -5.5834e+01 -5.3477e+01 -5.2798e+01 -6.4001e+01 -5.5816e+01 -5.3508e+01 -5.2771e+01 -6.3989e+01 -5.5798e+01 -5.3539e+01 -5.2745e+01 -6.3976e+01 -5.5780e+01 -5.3569e+01 -5.2719e+01 -6.3963e+01 -5.5763e+01 -5.3599e+01 -5.2693e+01 -6.3949e+01 -5.5738e+01 -5.3628e+01 -5.2668e+01 -6.3935e+01 -5.5713e+01 -5.3657e+01 -5.2643e+01 -6.3921e+01 -5.5687e+01 -5.3685e+01 -5.2618e+01 -6.3906e+01 -5.5662e+01 -5.3713e+01 -5.2594e+01 -6.3890e+01 -5.5637e+01 -5.3740e+01 -5.2569e+01 -6.3875e+01 -5.5612e+01 -5.3767e+01 -5.2546e+01 -6.3858e+01 -5.5588e+01 -5.3787e+01 -5.2522e+01 -6.3842e+01 -5.5562e+01 -5.3805e+01 -5.2499e+01 -6.3825e+01 -5.5530e+01 -5.3822e+01 -5.2476e+01 -6.3808e+01 -5.5498e+01 -5.3839e+01 -5.2454e+01 -6.3790e+01 -5.5466e+01 -5.3856e+01 -5.2426e+01 -6.3772e+01 -5.5430e+01 -5.3873e+01 -5.2396e+01 -6.3754e+01 -5.5391e+01 -5.3889e+01 -5.2367e+01 -6.3735e+01 -5.5353e+01 -5.3905e+01 -5.2338e+01 -6.3716e+01 -5.5316e+01 -5.3962e+01 -5.2310e+01 -6.3697e+01 -5.5279e+01 -5.4022e+01 -5.2282e+01 -6.3677e+01 -5.5242e+01 -5.4080e+01 -5.2254e+01 -6.3657e+01 -5.5206e+01 -5.4138e+01 -5.2227e+01 -6.3637e+01 -5.5171e+01 -5.4194e+01 -5.2200e+01 -6.3616e+01 -5.5136e+01 -5.4250e+01 -5.2174e+01 -6.3595e+01 -5.5101e+01 -5.4305e+01 -5.2148e+01 -6.3573e+01 -5.5067e+01 -5.4359e+01 -5.2123e+01 -6.3548e+01 -5.5033e+01 -5.4411e+01 -5.2098e+01 -6.3518e+01 -5.5000e+01 -5.4464e+01 -5.2073e+01 -6.3488e+01 -5.4967e+01 -5.4515e+01 -5.2049e+01 -6.3458e+01 -5.4935e+01 -5.4565e+01 -5.2025e+01 -6.3427e+01 -5.4903e+01 -5.4614e+01 -5.2001e+01 -6.3397e+01 -5.4871e+01 -5.4663e+01 -5.1978e+01 -6.3388e+01 -5.4840e+01 -5.4710e+01 -5.1955e+01 -6.3402e+01 -5.4809e+01 -5.4757e+01 -5.1932e+01 -6.3415e+01 -5.4777e+01 -5.4803e+01 -5.1910e+01 -6.3427e+01 -5.4739e+01 -5.4848e+01 -5.1888e+01 -6.3438e+01 -5.4701e+01 -5.4892e+01 -5.1866e+01 -6.3449e+01 -5.4664e+01 -5.4936e+01 -5.1845e+01 -6.3459e+01 -5.4628e+01 -5.4978e+01 -5.1824e+01 -6.3468e+01 -5.4592e+01 -5.5020e+01 -5.1803e+01 -6.3476e+01 -5.4556e+01 -5.5061e+01 -5.1783e+01 -6.3484e+01 -5.4521e+01 -5.5101e+01 -5.1763e+01 -6.3491e+01 -5.4479e+01 -5.5141e+01 -5.1743e+01 -6.3497e+01 -5.4438e+01 -5.5179e+01 -5.1723e+01 -6.3503e+01 -5.4397e+01 -5.5217e+01 -5.1704e+01 -6.3508e+01 -5.4356e+01 -5.5254e+01 -5.1685e+01 -6.3512e+01 -5.4316e+01 -5.5291e+01 -5.1699e+01 -6.3515e+01 -5.4277e+01 -5.5326e+01 -5.1717e+01 -6.3518e+01 -5.4238e+01 -5.5361e+01 -5.1734e+01 -6.3521e+01 -5.4200e+01 -5.5395e+01 -5.1751e+01 -6.3522e+01 -5.4163e+01 -5.5428e+01 -5.1775e+01 -6.3523e+01 -5.4126e+01 -5.5461e+01 -5.1829e+01 -6.3523e+01 -5.4090e+01 -5.5493e+01 -5.1881e+01 -6.3523e+01 -5.4054e+01 -5.5524e+01 -5.1933e+01 -6.3522e+01 -5.4019e+01 -5.5555e+01 -5.1985e+01 -6.3520e+01 -5.3984e+01 -5.5585e+01 -5.2035e+01 -6.3518e+01 -5.3950e+01 -5.5614e+01 -5.2085e+01 -6.3515e+01 -5.3916e+01 -5.5642e+01 -5.2135e+01 -6.3512e+01 -5.3883e+01 -5.5670e+01 -5.2183e+01 -6.3508e+01 -5.3850e+01 -5.5697e+01 -5.2231e+01 -6.3503e+01 -5.3818e+01 -5.5724e+01 -5.2278e+01 -6.3498e+01 -5.3786e+01 -5.5749e+01 -5.2348e+01 -6.3492e+01 -5.3755e+01 -5.5775e+01 -5.2423e+01 -6.3486e+01 -5.3724e+01 -5.5799e+01 -5.2496e+01 -6.3479e+01 -5.3693e+01 -5.5823e+01 -5.2569e+01 -6.3472e+01 -5.3663e+01 -5.5846e+01 -5.2641e+01 -6.3464e+01 -5.3634e+01 -5.5869e+01 -5.2724e+01 -6.3456e+01 -5.3604e+01 -5.5891e+01 -5.2829e+01 -6.3447e+01 -5.3576e+01 -5.5912e+01 -5.2926e+01 -6.3437e+01 -5.3547e+01 -5.5933e+01 -5.3021e+01 -6.3427e+01 -5.3519e+01 -5.5954e+01 -5.3116e+01 -6.3417e+01 -5.3491e+01 -5.5973e+01 -5.3209e+01 -6.3406e+01 -5.3464e+01 -5.5992e+01 -5.3302e+01 -6.3395e+01 -5.3437e+01 -5.6011e+01 -5.3393e+01 -6.3383e+01 -5.3402e+01 -5.6029e+01 -5.3483e+01 -6.3370e+01 -5.3368e+01 -5.6046e+01 -5.3572e+01 -6.3358e+01 -5.3335e+01 -5.6063e+01 -5.3660e+01 -6.3344e+01 -5.3302e+01 -5.6076e+01 -5.3746e+01 -6.3330e+01 -5.3269e+01 -5.6084e+01 -5.3832e+01 -6.3316e+01 -5.3237e+01 -5.6091e+01 -5.3916e+01 -6.3302e+01 -5.3206e+01 -5.6099e+01 -5.3999e+01 -6.3286e+01 -5.3175e+01 -5.6105e+01 -5.4081e+01 -6.3271e+01 -5.3144e+01 -5.6112e+01 -5.4162e+01 -6.3255e+01 -5.3114e+01 -5.6114e+01 -5.4242e+01 -6.3233e+01 -5.3084e+01 -5.6112e+01 -5.4321e+01 -6.3209e+01 -5.3055e+01 -5.6110e+01 -5.4398e+01 -6.3184e+01 -5.3026e+01 -5.6108e+01 -5.4475e+01 -6.3159e+01 -5.2998e+01 -5.6105e+01 -5.4551e+01 -6.3133e+01 -5.2970e+01 -5.6103e+01 -5.4625e+01 -6.3108e+01 -5.2942e+01 -5.6100e+01 -5.4698e+01 -6.3082e+01 -5.2915e+01 -5.6131e+01 -5.4771e+01 -6.3056e+01 -5.2888e+01 -5.6172e+01 -5.4842e+01 -6.3030e+01 -5.2854e+01 -5.6212e+01 -5.4912e+01 -6.3004e+01 -5.2820e+01 -5.6252e+01 -5.4981e+01 -6.2978e+01 -5.2787e+01 -5.6291e+01 -5.5049e+01 -6.2951e+01 -5.2754e+01 -5.6329e+01 -5.5116e+01 -6.2924e+01 -5.2722e+01 -5.6366e+01 -5.5182e+01 -6.2897e+01 -5.2690e+01 -5.6403e+01 -5.5247e+01 -6.2870e+01 -5.2659e+01 -5.6438e+01 -5.5311e+01 -6.2842e+01 -5.2627e+01 -5.6473e+01 -5.5374e+01 -6.2815e+01 -5.2588e+01 -5.6508e+01 -5.5436e+01 -6.2787e+01 -5.2551e+01 -5.6541e+01 -5.5497e+01 -6.2759e+01 -5.2514e+01 -5.6574e+01 -5.5557e+01 -6.2731e+01 -5.2478e+01 -5.6606e+01 -5.5616e+01 -6.2702e+01 -5.2443e+01 -5.6637e+01 -5.5674e+01 -6.2674e+01 -5.2408e+01 -5.6668e+01 -5.5731e+01 -6.2645e+01 -5.2374e+01 -5.6698e+01 -5.5787e+01 -6.2617e+01 -5.2340e+01 -5.6727e+01 -5.5842e+01 -6.2588e+01 -5.2306e+01 -5.6756e+01 -5.5896e+01 -6.2558e+01 -5.2265e+01 -5.6783e+01 -5.5949e+01 -6.2529e+01 -5.2218e+01 -5.6810e+01 -5.6002e+01 -6.2500e+01 -5.2171e+01 -5.6837e+01 -5.6053e+01 -6.2470e+01 -5.2125e+01 -5.6863e+01 -5.6104e+01 -6.2440e+01 -5.2080e+01 -5.6888e+01 -5.6153e+01 -6.2410e+01 -5.2036e+01 -5.6912e+01 -5.6202e+01 -6.2380e+01 -5.1993e+01 -5.6936e+01 -5.6243e+01 -6.2350e+01 -5.1982e+01 -5.6959e+01 -5.6282e+01 -6.2320e+01 -5.1985e+01 -5.6982e+01 -5.6321e+01 -6.2289e+01 -5.1988e+01 -5.7004e+01 -5.6358e+01 -6.2258e+01 -5.1991e+01 -5.7025e+01 -5.6395e+01 -6.2228e+01 -5.1994e+01 -5.7046e+01 -5.6432e+01 -6.2197e+01 -5.1997e+01 -5.7066e+01 -5.6467e+01 -6.2166e+01 -5.2001e+01 -5.7085e+01 -5.6502e+01 -6.2135e+01 -5.2004e+01 -5.7104e+01 -5.6536e+01 -6.2103e+01 -5.2008e+01 -5.7122e+01 -5.6570e+01 -6.2072e+01 -5.2011e+01 -5.7140e+01 -5.6603e+01 -6.2040e+01 -5.2015e+01 -5.7157e+01 -5.6635e+01 -6.2009e+01 -5.2019e+01 -5.7173e+01 -5.6667e+01 -6.1977e+01 -5.2023e+01 -5.7189e+01 -5.6698e+01 -6.1945e+01 -5.2027e+01 -5.7205e+01 -5.6728e+01 -6.1913e+01 -5.2031e+01 -5.7220e+01 -5.6758e+01 -6.1881e+01 -5.2031e+01 -5.7234e+01 -5.6787e+01 -6.1848e+01 -5.2022e+01 -5.7248e+01 -5.6816e+01 -6.1816e+01 -5.2011e+01 -5.7261e+01 -5.6844e+01 -6.1784e+01 -5.1999e+01 -5.7273e+01 -5.6871e+01 -6.1751e+01 -5.1981e+01 -5.7286e+01 -5.6898e+01 -6.1718e+01 -5.1963e+01 -5.7297e+01 -5.6924e+01 -6.1677e+01 -5.1945e+01 -5.7308e+01 -5.6949e+01 -6.1636e+01 -5.1929e+01 -5.7319e+01 -5.6974e+01 -6.1596e+01 -5.1912e+01 -5.7329e+01 -5.6998e+01 -6.1555e+01 -5.1897e+01 -5.7338e+01 -5.7022e+01 -6.1515e+01 -5.1882e+01 -5.7348e+01 -5.7045e+01 -6.1475e+01 -5.1867e+01 -5.7356e+01 -5.7067e+01 -6.1434e+01 -5.1853e+01 -5.7364e+01 -5.7089e+01 -6.1394e+01 -5.1839e+01 -5.7372e+01 -5.7110e+01 -6.1354e+01 -5.1826e+01 -5.7379e+01 -5.7131e+01 -6.1314e+01 -5.1813e+01 -5.7386e+01 -5.7151e+01 -6.1275e+01 -5.1800e+01 -5.7392e+01 -5.7171e+01 -6.1235e+01 -5.1788e+01 -5.7398e+01 -5.7188e+01 -6.1195e+01 -5.1771e+01 -5.7403e+01 -5.7199e+01 -6.1156e+01 -5.1746e+01 -5.7408e+01 -5.7209e+01 -6.1116e+01 -5.1720e+01 -5.7412e+01 -5.7219e+01 -6.1077e+01 -5.1694e+01 -5.7417e+01 -5.7228e+01 -6.1037e+01 -5.1669e+01 -5.7420e+01 -5.7237e+01 -6.0998e+01 -5.1645e+01 -5.7423e+01 -5.7246e+01 -6.0959e+01 -5.1621e+01 -5.7426e+01 -5.7254e+01 -6.0920e+01 -5.1599e+01 -5.7428e+01 -5.7262e+01 -6.0881e+01 -5.1576e+01 -5.7430e+01 -5.7270e+01 -6.0842e+01 -5.1555e+01 -5.7429e+01 -5.7277e+01 -6.0803e+01 -5.1534e+01 -5.7422e+01 -5.7284e+01 -6.0764e+01 -5.1514e+01 -5.7415e+01 -5.7291e+01 -6.0726e+01 -5.1494e+01 -5.7408e+01 -5.7297e+01 -6.0687e+01 -5.1475e+01 -5.7400e+01 -5.7303e+01 -6.0648e+01 -5.1456e+01 -5.7393e+01 -5.7309e+01 -6.0610e+01 -5.1438e+01 -5.7385e+01 -5.7314e+01 -6.0571e+01 -5.1421e+01 -5.7377e+01 -5.7319e+01 -6.0533e+01 -5.1404e+01 -5.7369e+01 -5.7324e+01 -6.0495e+01 -5.1387e+01 -5.7361e+01 -5.7328e+01 -6.0456e+01 -5.1371e+01 -5.7352e+01 -5.7332e+01 -6.0418e+01 -5.1356e+01 -5.7344e+01 -5.7336e+01 -6.0380e+01 -5.1341e+01 -5.7335e+01 -5.7339e+01 -6.0342e+01 -5.1325e+01 -5.7326e+01 -5.7342e+01 -6.0304e+01 -5.1302e+01 -5.7316e+01 -5.7345e+01 -6.0266e+01 -5.1281e+01 -5.7307e+01 -5.7347e+01 -6.0228e+01 -5.1260e+01 -5.7297e+01 -5.7349e+01 -6.0191e+01 -5.1240e+01 -5.7288e+01 -5.7351e+01 -6.0153e+01 -5.1220e+01 -5.7278e+01 -5.7352e+01 -6.0115e+01 -5.1201e+01 -5.7267e+01 -5.7353e+01 -6.0078e+01 -5.1182e+01 -5.7257e+01 -5.7354e+01 -6.0040e+01 -5.1164e+01 -5.7247e+01 -5.7355e+01 -6.0003e+01 -5.1146e+01 -5.7236e+01 -5.7355e+01 -5.9965e+01 -5.1129e+01 -5.7225e+01 -5.7355e+01 -5.9928e+01 -5.1112e+01 -5.7214e+01 -5.7354e+01 -5.9891e+01 -5.1096e+01 -5.7203e+01 -5.7353e+01 -5.9854e+01 -5.1080e+01 -5.7192e+01 -5.7352e+01 -5.9816e+01 -5.1065e+01 -5.7180e+01 -5.7351e+01 -5.9779e+01 -5.1050e+01 -5.7169e+01 -5.7344e+01 -5.9742e+01 -5.1029e+01 -5.7157e+01 -5.7335e+01 -5.9705e+01 -5.1007e+01 -5.7145e+01 -5.7325e+01 -5.9669e+01 -5.0986e+01 -5.7133e+01 -5.7315e+01 -5.9632e+01 -5.0965e+01 -5.7120e+01 -5.7305e+01 -5.9595e+01 -5.0945e+01 -5.7108e+01 -5.7294e+01 -5.9558e+01 -5.0925e+01 -5.7095e+01 -5.7284e+01 -5.9522e+01 -5.0906e+01 -5.7083e+01 -5.7274e+01 -5.9485e+01 -5.0888e+01 -5.7070e+01 -5.7263e+01 -5.9449e+01 -5.0870e+01 -5.7055e+01 -5.7253e+01 -5.9412e+01 -5.0852e+01 -5.7034e+01 -5.7242e+01 -5.9376e+01 -5.0835e+01 -5.7013e+01 -5.7231e+01 -5.9339e+01 -5.0812e+01 -5.6992e+01 -5.7221e+01 -5.9303e+01 -5.0788e+01 -5.6971e+01 -5.7210e+01 -5.9267e+01 -5.0765e+01 -5.6950e+01 -5.7199e+01 -5.9231e+01 -5.0742e+01 -5.6929e+01 -5.7187e+01 -5.9195e+01 -5.0720e+01 -5.6908e+01 -5.7176e+01 -5.9159e+01 -5.0699e+01 -5.6887e+01 -5.7165e+01 -5.9123e+01 -5.0678e+01 -5.6867e+01 -5.7153e+01 -5.9087e+01 -5.0658e+01 -5.6846e+01 -5.7142e+01 -5.9051e+01 -5.0638e+01 -5.6825e+01 -5.7130e+01 -5.9016e+01 -5.0619e+01 -5.6804e+01 -5.7118e+01 -5.8980e+01 -5.0600e+01 -5.6784e+01 -5.7106e+01 -5.8944e+01 -5.0582e+01 -5.6763e+01 -5.7094e+01 -5.8909e+01 -5.0564e+01 -5.6742e+01 -5.7082e+01 -5.8873e+01 -5.0547e+01 -5.6722e+01 -5.7070e+01 -5.8838e+01 -5.0530e+01 -5.6701e+01 -5.7057e+01 -5.8803e+01 -5.0514e+01 -5.6681e+01 -5.7045e+01 -5.8767e+01 -5.0493e+01 -5.6660e+01 -5.7032e+01 -5.8732e+01 -5.0470e+01 -5.6640e+01 -5.7020e+01 -5.8733e+01 -5.0442e+01 -5.6619e+01 -5.7007e+01 -5.8742e+01 -5.0412e+01 -5.6599e+01 -5.6994e+01 -5.8750e+01 -5.0383e+01 -5.6578e+01 -5.6981e+01 -5.8758e+01 -5.0365e+01 -5.6558e+01 -5.6968e+01 -5.8765e+01 -5.0382e+01 -5.6538e+01 -5.6954e+01 -5.8772e+01 -5.0399e+01 -5.6517e+01 -5.6941e+01 -5.8778e+01 -5.0416e+01 -5.6497e+01 -5.6928e+01 -5.8784e+01 -5.0433e+01 -5.6476e+01 -5.6914e+01 -5.8789e+01 -5.0450e+01 -5.6453e+01 -5.6901e+01 -5.8794e+01 -5.0468e+01 -5.6425e+01 -5.6887e+01 -5.8798e+01 -5.0485e+01 -5.6397e+01 -5.6873e+01 -5.8801e+01 -5.0502e+01 -5.6369e+01 -5.6859e+01 -5.8804e+01 -5.0519e+01 -5.6341e+01 -5.6845e+01 -5.8806e+01 -5.0536e+01 -5.6314e+01 -5.6831e+01 -5.8808e+01 -5.0554e+01 -5.6287e+01 -5.6816e+01 -5.8810e+01 -5.0571e+01 -5.6260e+01 -5.6802e+01 -5.8811e+01 -5.0588e+01 -5.6233e+01 -5.6788e+01 -5.8811e+01 -5.0605e+01 -5.6206e+01 -5.6773e+01 -5.8811e+01 -5.0622e+01 -5.6179e+01 -5.6758e+01 -5.8811e+01 -5.0639e+01 -5.6153e+01 -5.6744e+01 -5.8810e+01 -5.0656e+01 -5.6127e+01 -5.6727e+01 -5.8808e+01 -5.0673e+01 -5.6101e+01 -5.6704e+01 -5.8807e+01 -5.0690e+01 -5.6075e+01 -5.6681e+01 -5.8804e+01 -5.0707e+01 -5.6049e+01 -5.6659e+01 -5.8802e+01 -5.0724e+01 -5.6023e+01 -5.6636e+01 -5.8798e+01 -5.0741e+01 -5.5998e+01 -5.6613e+01 -5.8795e+01 -5.0757e+01 -5.5965e+01 -5.6591e+01 -5.8791e+01 -5.0774e+01 -5.5932e+01 -5.6569e+01 -5.8787e+01 -5.0790e+01 -5.5900e+01 -5.6546e+01 -5.8782e+01 -5.0807e+01 -5.5867e+01 -5.6524e+01 -5.8777e+01 -5.0823e+01 -5.5835e+01 -5.6502e+01 -5.8771e+01 -5.0833e+01 -5.5804e+01 -5.6480e+01 -5.8757e+01 -5.0833e+01 -5.5772e+01 -5.6458e+01 -5.8743e+01 -5.0833e+01 -5.5741e+01 -5.6436e+01 -5.8728e+01 -5.0834e+01 -5.5710e+01 -5.6414e+01 -5.8714e+01 -5.0835e+01 -5.5680e+01 -5.6393e+01 -5.8699e+01 -5.0836e+01 -5.5650e+01 -5.6371e+01 -5.8683e+01 -5.0838e+01 -5.5620e+01 -5.6349e+01 -5.8660e+01 -5.0840e+01 -5.5590e+01 -5.6328e+01 -5.8637e+01 -5.0842e+01 -5.5560e+01 -5.6306e+01 -5.8614e+01 -5.0844e+01 -5.5531e+01 -5.6285e+01 -5.8591e+01 -5.0846e+01 -5.5502e+01 -5.6263e+01 -5.8568e+01 -5.0849e+01 -5.5474e+01 -5.6242e+01 -5.8545e+01 -5.0852e+01 -5.5445e+01 -5.6221e+01 -5.8522e+01 -5.0854e+01 -5.5417e+01 -5.6200e+01 -5.8499e+01 -5.0858e+01 -5.5389e+01 -5.6174e+01 -5.8476e+01 -5.0861e+01 -5.5361e+01 -5.6145e+01 -5.8453e+01 -5.0864e+01 -5.5334e+01 -5.6116e+01 -5.8429e+01 -5.0868e+01 -5.5307e+01 -5.6083e+01 -5.8398e+01 -5.0871e+01 -5.5279e+01 -5.6046e+01 -5.8368e+01 -5.0875e+01 -5.5253e+01 -5.6011e+01 -5.8337e+01 -5.0876e+01 -5.5226e+01 -5.5975e+01 -5.8307e+01 -5.0872e+01 -5.5199e+01 -5.5934e+01 -5.8277e+01 -5.0868e+01 -5.5173e+01 -5.5892e+01 -5.8247e+01 -5.0865e+01 -5.5147e+01 -5.5850e+01 -5.8217e+01 -5.0862e+01 -5.5121e+01 -5.5809e+01 -5.8188e+01 -5.0859e+01 -5.5096e+01 -5.5768e+01 -5.8158e+01 -5.0857e+01 -5.5070e+01 -5.5728e+01 -5.8129e+01 -5.0854e+01 -5.5045e+01 -5.5688e+01 -5.8100e+01 -5.0852e+01 -5.5020e+01 -5.5649e+01 -5.8071e+01 -5.0850e+01 -5.4995e+01 -5.5611e+01 -5.8042e+01 -5.0849e+01 -5.4970e+01 -5.5573e+01 -5.8014e+01 -5.0847e+01 -5.4945e+01 -5.5535e+01 -5.7985e+01 -5.0846e+01 -5.4921e+01 -5.5498e+01 -5.7957e+01 -5.0845e+01 -5.4896e+01 -5.5461e+01 -5.7928e+01 -5.0844e+01 -5.4872e+01 -5.5425e+01 -5.7892e+01 -5.0835e+01 -5.4848e+01 -5.5389e+01 -5.7856e+01 -5.0827e+01 -5.4824e+01 -5.5354e+01 -5.7820e+01 -5.0819e+01 -5.4801e+01 -5.5319e+01 -5.7785e+01 -5.0811e+01 -5.4777e+01 -5.5276e+01 -5.7750e+01 -5.0804e+01 -5.4754e+01 -5.5235e+01 -5.7716e+01 -5.0797e+01 -5.4731e+01 -5.5193e+01 -5.7682e+01 -5.0791e+01 -5.4707e+01 -5.5153e+01 -5.7648e+01 -5.0784e+01 -5.4684e+01 -5.5113e+01 -5.7614e+01 -5.0778e+01 -5.4657e+01 -5.5073e+01 -5.7581e+01 -5.0773e+01 -5.4627e+01 -5.5034e+01 -5.7547e+01 -5.0767e+01 -5.4596e+01 -5.4996e+01 -5.7514e+01 -5.0762e+01 -5.4566e+01 -5.4958e+01 -5.7482e+01 -5.0751e+01 -5.4537e+01 -5.4921e+01 -5.7450e+01 -5.0738e+01 -5.4507e+01 -5.4884e+01 -5.7462e+01 -5.0726e+01 -5.4478e+01 -5.4848e+01 -5.7474e+01 -5.0715e+01 -5.4449e+01 -5.4812e+01 -5.7486e+01 -5.0703e+01 -5.4421e+01 -5.4776e+01 -5.7497e+01 -5.0692e+01 -5.4389e+01 -5.4741e+01 -5.7508e+01 -5.0682e+01 -5.4354e+01 -5.4707e+01 -5.7518e+01 -5.0672e+01 -5.4318e+01 -5.4673e+01 -5.7528e+01 -5.0662e+01 -5.4283e+01 -5.4675e+01 -5.7537e+01 -5.0653e+01 -5.4249e+01 -5.4678e+01 -5.7546e+01 -5.0644e+01 -5.4215e+01 -5.4681e+01 -5.7555e+01 -5.0635e+01 -5.4181e+01 -5.4684e+01 -5.7563e+01 -5.0626e+01 -5.4148e+01 -5.4686e+01 -5.7571e+01 -5.0618e+01 -5.4116e+01 -5.4689e+01 -5.7579e+01 -5.0610e+01 -5.4083e+01 -5.4692e+01 -5.7586e+01 -5.0603e+01 -5.4051e+01 -5.4695e+01 -5.7592e+01 -5.0593e+01 -5.4020e+01 -5.4697e+01 -5.7598e+01 -5.0579e+01 -5.3989e+01 -5.4700e+01 -5.7604e+01 -5.0564e+01 -5.3951e+01 -5.4702e+01 -5.7610e+01 -5.0550e+01 -5.3912e+01 -5.4705e+01 -5.7615e+01 -5.0537e+01 -5.3875e+01 -5.4700e+01 -5.7619e+01 -5.0524e+01 -5.3838e+01 -5.4695e+01 -5.7624e+01 -5.0511e+01 -5.3801e+01 -5.4689e+01 -5.7628e+01 -5.0499e+01 -5.3765e+01 -5.4684e+01 -5.7631e+01 -5.0487e+01 -5.3771e+01 -5.4678e+01 -5.7634e+01 -5.0475e+01 -5.3780e+01 -5.4673e+01 -5.7637e+01 -5.0464e+01 -5.3789e+01 -5.4668e+01 -5.7640e+01 -5.0453e+01 -5.3798e+01 -5.4663e+01 -5.7642e+01 -5.0443e+01 -5.3806e+01 -5.4651e+01 -5.7643e+01 -5.0433e+01 -5.3815e+01 -5.4638e+01 -5.7645e+01 -5.0423e+01 -5.3823e+01 -5.4626e+01 -5.7666e+01 -5.0413e+01 -5.3831e+01 -5.4613e+01 -5.7711e+01 -5.0404e+01 -5.3839e+01 -5.4595e+01 -5.7755e+01 -5.0395e+01 -5.3847e+01 -5.4575e+01 -5.7798e+01 -5.0387e+01 -5.3854e+01 -5.4556e+01 -5.7840e+01 -5.0379e+01 -5.3861e+01 -5.4537e+01 -5.7881e+01 -5.0371e+01 -5.3868e+01 -5.4518e+01 -5.7921e+01 -5.0363e+01 -5.3875e+01 -5.4500e+01 -5.7960e+01 -5.0355e+01 -5.3882e+01 -5.4474e+01 -5.7998e+01 -5.0348e+01 -5.3889e+01 -5.4449e+01 -5.8035e+01 -5.0341e+01 -5.3895e+01 -5.4424e+01 -5.8072e+01 -5.0335e+01 -5.3901e+01 -5.4400e+01 -5.8107e+01 -5.0328e+01 -5.3907e+01 -5.4376e+01 -5.8142e+01 -5.0322e+01 -5.3913e+01 -5.4352e+01 -5.8175e+01 -5.0316e+01 -5.3919e+01 -5.4330e+01 -5.8208e+01 -5.0310e+01 -5.3924e+01 -5.4307e+01 -5.8240e+01 -5.0304e+01 -5.3930e+01 -5.4285e+01 -5.8271e+01 -5.0299e+01 -5.3935e+01 -5.4264e+01 -5.8301e+01 -5.0294e+01 -5.3940e+01 -5.4242e+01 -5.8331e+01 -5.0289e+01 -5.3944e+01 -5.4222e+01 -5.8359e+01 -5.0284e+01 -5.3949e+01 -5.4201e+01 -5.8387e+01 -5.0279e+01 -5.3953e+01 -5.4181e+01 -5.8414e+01 -5.0274e+01 -5.3957e+01 -5.4162e+01 -5.8440e+01 -5.0270e+01 -5.3961e+01 -5.4143e+01 -5.8465e+01 -5.0266e+01 -5.3965e+01 -5.4124e+01 -5.8489e+01 -5.0262e+01 -5.3969e+01 -5.4105e+01 -5.8513e+01 -5.0258e+01 -5.3972e+01 -5.4087e+01 -5.8536e+01 -5.0254e+01 -5.3975e+01 -5.4069e+01 -5.8558e+01 -5.0251e+01 -5.3979e+01 -5.4051e+01 -5.8579e+01 -5.0247e+01 -5.3981e+01 -5.4034e+01 -5.8600e+01 -5.0244e+01 -5.3984e+01 -5.4017e+01 -5.8620e+01 -5.0240e+01 -5.3987e+01 -5.4000e+01 -5.8639e+01 -5.0237e+01 -5.4005e+01 -5.3984e+01 -5.8658e+01 -5.0234e+01 -5.4052e+01 -5.3967e+01 -5.8676e+01 -5.0226e+01 -5.4098e+01 -5.3951e+01 -5.8693e+01 -5.0216e+01 -5.4143e+01 -5.3936e+01 -5.8709e+01 -5.0205e+01 -5.4187e+01 -5.3920e+01 -5.8725e+01 -5.0195e+01 -5.4230e+01 -5.3905e+01 -5.8740e+01 -5.0186e+01 -5.4272e+01 -5.3890e+01 -5.8754e+01 -5.0176e+01 -5.4314e+01 -5.3875e+01 -5.8768e+01 -5.0167e+01 -5.4354e+01 -5.3861e+01 -5.8781e+01 -5.0158e+01 -5.4394e+01 -5.3846e+01 -5.8794e+01 -5.0149e+01 -5.4434e+01 -5.3832e+01 -5.8806e+01 -5.0141e+01 -5.4472e+01 -5.3818e+01 -5.8817e+01 -5.0132e+01 -5.4510e+01 -5.3804e+01 -5.8827e+01 -5.0124e+01 -5.4547e+01 -5.3790e+01 -5.8837e+01 -5.0116e+01 -5.4583e+01 -5.3777e+01 -5.8847e+01 -5.0109e+01 -5.4618e+01 -5.3764e+01 -5.8856e+01 -5.0102e+01 -5.4653e+01 -5.3747e+01 -5.8864e+01 -5.0094e+01 -5.4687e+01 -5.3726e+01 -5.8872e+01 -5.0087e+01 -5.4714e+01 -5.3698e+01 -5.8879e+01 -5.0081e+01 -5.4739e+01 -5.3670e+01 -5.8885e+01 -5.0074e+01 -5.4763e+01 -5.3642e+01 -5.8891e+01 -5.0068e+01 -5.4787e+01 -5.3619e+01 -5.8897e+01 -5.0062e+01 -5.4810e+01 -5.3629e+01 -5.8901e+01 -5.0056e+01 -5.4833e+01 -5.3639e+01 -5.8906e+01 -5.0050e+01 -5.4855e+01 -5.3649e+01 -5.8910e+01 -5.0038e+01 -5.4877e+01 -5.3659e+01 -5.8913e+01 -5.0024e+01 -5.4898e+01 -5.3665e+01 -5.8916e+01 -5.0011e+01 -5.4919e+01 -5.3667e+01 -5.8918e+01 -1.0000e+01 -5.4939e+01 -5.3669e+01 -5.8920e+01 -6.0000e+01 -5.4959e+01 -5.3671e+01 -5.8921e+01 -6.0000e+01 -5.4978e+01 -5.3674e+01 -5.8916e+01 -6.0000e+01 -5.4997e+01 -5.3677e+01 -5.8909e+01 -6.0000e+01 -5.5015e+01 -5.3680e+01 -5.8901e+01 -6.0000e+01 -5.5033e+01 -5.3683e+01 -5.8893e+01 -6.0000e+01 -5.5051e+01 -5.3686e+01 -5.8879e+01 -6.0000e+01 -5.5068e+01 -5.3689e+01 -5.8863e+01 -6.0000e+01 -5.5084e+01 -5.3692e+01 -5.8840e+01 -6.0000e+01 -5.5100e+01 -5.3696e+01 -5.8816e+01 -6.0000e+01 -5.5116e+01 -5.3699e+01 -5.8791e+01 -6.0000e+01 -5.5131e+01 -5.3703e+01 -5.8767e+01 -6.0000e+01 -5.5180e+01 -5.3706e+01 -5.8743e+01 -6.0000e+01 -5.5230e+01 -5.3710e+01 -5.8719e+01 -6.0000e+01 -5.5280e+01 -5.3742e+01 -5.8695e+01 -6.0000e+01 -5.5324e+01 -5.3782e+01 -5.8671e+01 -6.0000e+01 -5.5364e+01 -5.3821e+01 -5.8648e+01 -6.0000e+01 -5.5429e+01 -5.3860e+01 -5.8624e+01 -6.0000e+01 -5.5512e+01 -5.3899e+01 -5.8587e+01 -6.0000e+01 -5.5594e+01 -5.3937e+01 -5.8548e+01 -6.0000e+01 -5.5674e+01 -5.3975e+01 -5.8510e+01 -6.0000e+01 -5.5754e+01 -5.4010e+01 -5.8471e+01 -6.0000e+01 -5.5831e+01 -5.4039e+01 -5.8434e+01 -6.0000e+01 -5.5908e+01 -5.4068e+01 -5.8396e+01 -6.0000e+01 -5.5983e+01 -5.4096e+01 -5.8359e+01 -6.0000e+01 -5.6057e+01 -5.4124e+01 -5.8323e+01 -6.0000e+01 -5.6130e+01 -5.4152e+01 -5.8287e+01 -6.0000e+01 -5.6201e+01 -5.4180e+01 -5.8251e+01 -6.0000e+01 -5.6271e+01 -5.4207e+01 -5.8216e+01 -6.0000e+01 -5.6340e+01 -5.4234e+01 -5.8181e+01 -6.0000e+01 -5.6408e+01 -5.4260e+01 -5.8146e+01 -6.0000e+01 -5.6475e+01 -5.4287e+01 -5.8149e+01 -6.0000e+01 -5.6540e+01 -5.4313e+01 -5.8159e+01 -6.0000e+01 -5.6604e+01 -5.4339e+01 -5.8169e+01 -6.0000e+01 -5.6667e+01 -5.4364e+01 -5.8178e+01 -6.0000e+01 -5.6729e+01 -5.4389e+01 -5.8188e+01 -6.0000e+01 -5.6790e+01 -5.4414e+01 -5.8196e+01 -6.0000e+01 -5.6850e+01 -5.4433e+01 -5.8205e+01 -6.0000e+01 -5.6903e+01 -5.4449e+01 -5.8213e+01 -6.0000e+01 -5.6952e+01 -5.4465e+01 -5.8221e+01 -6.0000e+01 -5.7001e+01 -5.4481e+01 -5.8228e+01 -6.0000e+01 -5.7049e+01 -5.4497e+01 -5.8236e+01 -6.0000e+01 -5.7095e+01 -5.4513e+01 -5.8242e+01 -6.0000e+01 -5.7141e+01 -5.4528e+01 -5.8249e+01 -6.0000e+01 -5.7186e+01 -5.4544e+01 -5.8255e+01 -6.0000e+01 -5.7231e+01 -5.4559e+01 -5.8261e+01 -6.0000e+01 -5.7274e+01 -5.4574e+01 -5.8266e+01 -6.0000e+01 -5.7317e+01 -5.4589e+01 -5.8271e+01 -6.0000e+01 -5.7358e+01 -5.4604e+01 -5.8276e+01 -6.0000e+01 -5.7399e+01 -5.4618e+01 -5.8281e+01 -5.9996e+01 -5.7439e+01 -5.4633e+01 -5.8285e+01 -5.9965e+01 -5.7478e+01 -5.4647e+01 -5.8289e+01 -5.9934e+01 -5.7516e+01 -5.4661e+01 -5.8292e+01 -5.9903e+01 -5.7554e+01 -5.4675e+01 -5.8295e+01 -5.9872e+01 -5.7591e+01 -5.4688e+01 -5.8298e+01 -5.9841e+01 -5.7627e+01 -5.4701e+01 -5.8301e+01 -5.9810e+01 -5.7662e+01 -5.4715e+01 -5.8303e+01 -5.9780e+01 -5.7696e+01 -5.4728e+01 -5.8305e+01 -5.9749e+01 -5.7729e+01 -5.4740e+01 -5.8306e+01 -5.9719e+01 -5.7756e+01 -5.4753e+01 -5.8307e+01 -5.9689e+01 -5.7780e+01 -5.4765e+01 -5.8308e+01 -5.9659e+01 -5.7804e+01 -5.4777e+01 -5.8309e+01 -5.9629e+01 -5.7827e+01 -5.4789e+01 -5.8309e+01 -5.9600e+01 -5.7849e+01 -5.4800e+01 -5.8309e+01 -5.9570e+01 -5.7871e+01 -5.4812e+01 -5.8309e+01 -5.9541e+01 -5.7892e+01 -5.4823e+01 -5.8308e+01 -5.9511e+01 -5.7913e+01 -5.4834e+01 -5.8307e+01 -5.9482e+01 -5.7933e+01 -5.4845e+01 -5.8306e+01 -5.9453e+01 -5.7953e+01 -5.4855e+01 -5.8304e+01 -5.9424e+01 -5.7972e+01 -5.4865e+01 -5.8302e+01 -5.9395e+01 -5.7991e+01 -5.4875e+01 -5.8300e+01 -5.9366e+01 -5.8009e+01 -5.4885e+01 -5.8298e+01 -5.9337e+01 -5.8026e+01 -5.4894e+01 -5.8295e+01 -5.9309e+01 -5.8043e+01 -5.4904e+01 -5.8292e+01 -5.9280e+01 -5.8060e+01 -5.4913e+01 -5.8288e+01 -5.9251e+01 -5.8072e+01 -5.4921e+01 -5.8284e+01 -5.9223e+01 -5.8080e+01 -5.4930e+01 -5.8281e+01 -5.9193e+01 -5.8087e+01 -5.4938e+01 -5.8276e+01 -5.9157e+01 -5.8094e+01 -5.4946e+01 -5.8272e+01 -5.9121e+01 -5.8100e+01 -5.4954e+01 -5.8267e+01 -5.9085e+01 -5.8107e+01 -5.4961e+01 -5.8262e+01 -5.9049e+01 -5.8113e+01 -5.4969e+01 -5.8256e+01 -5.9014e+01 -5.8118e+01 -5.4976e+01 -5.8251e+01 -5.8979e+01 -5.8123e+01 -5.4983e+01 -5.8245e+01 -5.8951e+01 -5.8128e+01 -5.4989e+01 -5.8238e+01 -5.8961e+01 -5.8133e+01 -5.4996e+01 -5.8232e+01 -5.8965e+01 -5.8137e+01 -5.5002e+01 -5.8225e+01 -5.8966e+01 -5.8141e+01 -5.5007e+01 -5.8218e+01 -5.8967e+01 -5.8145e+01 -5.5013e+01 -5.8211e+01 -5.8968e+01 -5.8148e+01 -5.5018e+01 -5.8203e+01 -5.8968e+01 -5.8151e+01 -5.5024e+01 -5.8196e+01 -5.8964e+01 -5.8154e+01 -5.5028e+01 -5.8188e+01 -5.8948e+01 -5.8156e+01 -5.5033e+01 -5.8179e+01 -5.8932e+01 -5.8159e+01 -5.5037e+01 -5.8171e+01 -5.8917e+01 -5.8160e+01 -5.5042e+01 -5.8162e+01 -5.8901e+01 -5.8162e+01 -5.5046e+01 -5.8153e+01 -5.8886e+01 -5.8163e+01 -5.5049e+01 -5.8144e+01 -5.8870e+01 -5.8164e+01 -5.5053e+01 -5.8134e+01 -5.8855e+01 -5.8164e+01 -5.5056e+01 -5.8124e+01 -5.8840e+01 -5.8165e+01 -5.5059e+01 -5.8114e+01 -5.8825e+01 -5.8157e+01 -5.5062e+01 -5.8104e+01 -5.8810e+01 -5.8149e+01 -5.5064e+01 -5.8094e+01 -5.8795e+01 -5.8141e+01 -5.5067e+01 -5.8083e+01 -5.8781e+01 -5.8132e+01 -5.5069e+01 -5.8072e+01 -5.8766e+01 -5.8124e+01 -5.5070e+01 -5.8061e+01 -5.8751e+01 -5.8115e+01 -5.5072e+01 -5.8050e+01 -5.8737e+01 -5.8106e+01 -5.5073e+01 -5.8038e+01 -5.8722e+01 -5.8098e+01 -5.5075e+01 -5.8029e+01 -5.8708e+01 -5.8089e+01 -5.5070e+01 -5.8062e+01 -5.8693e+01 -5.8079e+01 -5.5063e+01 -5.8094e+01 -5.8678e+01 -5.8070e+01 -5.5056e+01 -5.8124e+01 -5.8664e+01 -5.8061e+01 -5.5048e+01 -5.8155e+01 -5.8649e+01 -5.8051e+01 -5.5041e+01 -5.8184e+01 -5.8635e+01 -5.8042e+01 -5.5034e+01 -5.8212e+01 -5.8620e+01 -5.8032e+01 -5.5027e+01 -5.8240e+01 -5.8606e+01 -5.8022e+01 -5.5019e+01 -5.8266e+01 -5.8591e+01 -5.8012e+01 -5.5012e+01 -5.8292e+01 -5.8577e+01 -5.8002e+01 -5.5005e+01 -5.8317e+01 -5.8562e+01 -5.7992e+01 -5.4997e+01 -5.8342e+01 -5.8548e+01 -5.7981e+01 -5.4990e+01 -5.8365e+01 -5.8533e+01 -5.7971e+01 -5.4982e+01 -5.8388e+01 -5.8511e+01 -5.7960e+01 -5.4974e+01 -5.8410e+01 -5.8488e+01 -5.7949e+01 -5.4967e+01 -5.8424e+01 -5.8466e+01 -5.7939e+01 -5.4956e+01 -5.8437e+01 -5.8438e+01 -5.7927e+01 -5.4940e+01 -5.8449e+01 -5.8409e+01 -5.7916e+01 -5.4925e+01 -5.8461e+01 -5.8379e+01 -5.7905e+01 -5.4909e+01 -5.8472e+01 -5.8350e+01 -5.7893e+01 -5.4894e+01 -5.8482e+01 -5.8321e+01 -5.7882e+01 -5.4879e+01 -5.8490e+01 -5.8292e+01 -5.7868e+01 -5.4864e+01 -5.8492e+01 -5.8264e+01 -5.7848e+01 -5.4842e+01 -5.8493e+01 -5.8236e+01 -5.7828e+01 -5.4820e+01 -5.8494e+01 -5.8208e+01 -5.7809e+01 -5.4798e+01 -5.8495e+01 -5.8181e+01 -5.7789e+01 -5.4776e+01 -5.8495e+01 -5.8154e+01 -5.7769e+01 -5.4754e+01 -5.8490e+01 -5.8127e+01 -5.7750e+01 -5.4732e+01 -5.8482e+01 -5.8100e+01 -5.7730e+01 -5.4711e+01 -5.8474e+01 -5.8074e+01 -5.7711e+01 -5.4690e+01 -5.8466e+01 -5.8047e+01 -5.7691e+01 -5.4670e+01 -5.8457e+01 -5.8021e+01 -5.7672e+01 -5.4649e+01 -5.8449e+01 -5.7995e+01 -5.7653e+01 -5.4629e+01 -5.8440e+01 -5.7970e+01 -5.7633e+01 -5.4609e+01 -5.8431e+01 -5.7944e+01 -5.7614e+01 -5.4589e+01 -5.8422e+01 -5.7951e+01 -5.7594e+01 -5.4570e+01 -5.8413e+01 -5.7970e+01 -5.7575e+01 -5.4551e+01 -5.8408e+01 -5.7989e+01 -5.7556e+01 -5.4532e+01 -5.8443e+01 -5.8002e+01 -5.7537e+01 -5.4513e+01 -5.8478e+01 -5.8012e+01 -5.7517e+01 -5.4497e+01 -5.8511e+01 -5.8021e+01 -5.7498e+01 -5.4515e+01 -5.8544e+01 -5.8031e+01 -5.7479e+01 -5.4533e+01 -5.8576e+01 -5.8040e+01 -5.7460e+01 -5.4551e+01 -5.8608e+01 -5.8048e+01 -5.7440e+01 -5.4568e+01 -5.8639e+01 -5.8057e+01 -5.7421e+01 -5.4585e+01 -5.8668e+01 -5.8065e+01 -5.7399e+01 -5.4602e+01 -5.8698e+01 -5.8072e+01 -5.7372e+01 -5.4618e+01 -5.8726e+01 -5.8080e+01 -5.7345e+01 -5.4634e+01 -5.8754e+01 -5.8087e+01 -5.7318e+01 -5.4650e+01 -5.8781e+01 -5.8094e+01 -5.7291e+01 -5.4666e+01 -5.8807e+01 -5.8100e+01 -5.7263e+01 -5.4681e+01 -5.8832e+01 -5.8107e+01 -5.7229e+01 -5.4727e+01 -5.8857e+01 -5.8113e+01 -5.7195e+01 -5.4778e+01 -5.8881e+01 -5.8118e+01 -5.7161e+01 -5.4828e+01 -5.8905e+01 -5.8123e+01 -5.7128e+01 -5.4877e+01 -5.8927e+01 -5.8129e+01 -5.7095e+01 -5.4926e+01 -5.8949e+01 -5.8133e+01 -5.7063e+01 -5.4974e+01 -5.8971e+01 -5.8138e+01 -5.7031e+01 -5.5021e+01 -5.8991e+01 -5.8142e+01 -5.6999e+01 -5.5067e+01 -5.9011e+01 -5.8146e+01 -5.6967e+01 -5.5113e+01 -5.9030e+01 -5.8149e+01 -5.6936e+01 -5.5158e+01 -5.9049e+01 -5.8152e+01 -5.6905e+01 -5.5202e+01 -5.9067e+01 -5.8155e+01 -5.6875e+01 -5.5245e+01 -5.9084e+01 -5.8158e+01 -5.6844e+01 -5.5288e+01 -5.9101e+01 -5.8160e+01 -5.6814e+01 -5.5330e+01 -5.9117e+01 -5.8162e+01 -5.6784e+01 -5.5372e+01 -5.9133e+01 -5.8164e+01 -5.6755e+01 -5.5412e+01 -5.9148e+01 -5.8165e+01 -5.6725e+01 -5.5452e+01 -5.9162e+01 -5.8166e+01 -5.6696e+01 -5.5491e+01 -5.9175e+01 -5.8167e+01 -5.6668e+01 -5.5530e+01 -5.9188e+01 -5.8168e+01 -5.6639e+01 -5.5567e+01 -5.9201e+01 -5.8168e+01 -5.6611e+01 -5.5604e+01 -5.9213e+01 -5.8168e+01 -5.6582e+01 -5.5641e+01 -5.9224e+01 -5.8167e+01 -5.6555e+01 -5.5676e+01 -5.9235e+01 -5.8167e+01 -5.6527e+01 -5.5712e+01 -5.9245e+01 -5.8166e+01 -5.6499e+01 -5.5746e+01 -5.9254e+01 -5.8164e+01 -5.6472e+01 -5.5780e+01 -5.9263e+01 -5.8163e+01 -5.6445e+01 -5.5813e+01 -5.9272e+01 -5.8161e+01 -5.6418e+01 -5.5845e+01 -5.9279e+01 -5.8159e+01 -5.6391e+01 -5.5877e+01 -5.9287e+01 -5.8156e+01 -5.6365e+01 -5.5908e+01 -5.9294e+01 -5.8154e+01 -5.6338e+01 -5.5938e+01 -5.9300e+01 -5.8151e+01 -5.6312e+01 -5.5968e+01 -5.9306e+01 -5.8147e+01 -5.6286e+01 -5.5997e+01 -5.9311e+01 -5.8144e+01 -5.6260e+01 -5.6026e+01 -5.9316e+01 -5.8140e+01 -5.6234e+01 -5.6053e+01 -5.9320e+01 -5.8136e+01 -5.6209e+01 -5.6081e+01 -5.9324e+01 -5.8132e+01 -5.6183e+01 -5.6107e+01 -5.9327e+01 -5.8127e+01 -5.6158e+01 -5.6133e+01 -5.9330e+01 -5.8122e+01 -5.6133e+01 -5.6159e+01 -5.9332e+01 -5.8117e+01 -5.6108e+01 -5.6184e+01 -5.9334e+01 -5.8111e+01 -5.6083e+01 -5.6208e+01 -5.9335e+01 -5.8100e+01 -5.6058e+01 -5.6232e+01 -5.9336e+01 -5.8086e+01 -5.6034e+01 -5.6255e+01 -5.9336e+01 -5.8072e+01 -5.6009e+01 -5.6277e+01 -5.9336e+01 -5.8058e+01 -5.5985e+01 -5.6299e+01 -5.9336e+01 -5.8044e+01 -5.5961e+01 -5.6320e+01 -5.9335e+01 -5.8030e+01 -5.5937e+01 -5.6341e+01 -5.9368e+01 -5.8016e+01 -5.5913e+01 -5.6362e+01 -5.9410e+01 -5.8001e+01 -5.5889e+01 -5.6381e+01 -5.9452e+01 -5.7987e+01 -5.5865e+01 -5.6400e+01 -5.9492e+01 -5.7973e+01 -5.5842e+01 -5.6419e+01 -5.9531e+01 -5.7958e+01 -5.5818e+01 -5.6437e+01 -5.9569e+01 -5.7944e+01 -5.5795e+01 -5.6454e+01 -5.9606e+01 -5.7929e+01 -5.5772e+01 -5.6471e+01 -5.9642e+01 -5.7915e+01 -5.5749e+01 -5.6488e+01 -5.9677e+01 -5.7900e+01 -5.5725e+01 -5.6504e+01 -5.9711e+01 -5.7885e+01 -5.5702e+01 -5.6519e+01 -5.9744e+01 -5.7870e+01 -5.5680e+01 -5.6534e+01 -5.9776e+01 -5.7851e+01 -5.5657e+01 -5.6549e+01 -5.9807e+01 -5.7828e+01 -5.5634e+01 -5.6562e+01 -5.9837e+01 -5.7805e+01 -5.5612e+01 -5.6576e+01 -5.9866e+01 -5.7782e+01 -5.5589e+01 -5.6589e+01 -5.9894e+01 -5.7759e+01 -5.5567e+01 -5.6601e+01 -5.9922e+01 -5.7737e+01 -5.5544e+01 -5.6613e+01 -5.9948e+01 -5.7714e+01 -5.5522e+01 -5.6625e+01 -5.9974e+01 -5.7692e+01 -5.5500e+01 -5.6636e+01 -5.9998e+01 -5.7670e+01 -5.5478e+01 -5.6646e+01 -6.0022e+01 -5.7648e+01 -5.5456e+01 -5.6656e+01 -6.0045e+01 -5.7625e+01 -5.5434e+01 -5.6666e+01 -6.0067e+01 -5.7603e+01 -5.5412e+01 -5.6675e+01 -6.0085e+01 -5.7581e+01 -5.5390e+01 -5.6684e+01 -6.0098e+01 -5.7559e+01 -5.5368e+01 -5.6692e+01 -6.0110e+01 -5.7538e+01 -5.5344e+01 -5.6700e+01 -6.0121e+01 -5.7516e+01 -5.5315e+01 -5.6708e+01 -6.0132e+01 -5.7494e+01 -5.5285e+01 -5.6715e+01 -6.0142e+01 -5.7472e+01 -5.5256e+01 -5.6721e+01 -6.0151e+01 -5.7451e+01 -5.5228e+01 -5.6727e+01 -6.0160e+01 -5.7429e+01 -5.5199e+01 -5.6733e+01 -6.0168e+01 -5.7408e+01 -5.5171e+01 -5.6738e+01 -6.0176e+01 -5.7386e+01 -5.5143e+01 -5.6743e+01 -6.0183e+01 -5.7365e+01 -5.5115e+01 -5.6748e+01 -6.0189e+01 -5.7343e+01 -5.5088e+01 -5.6752e+01 -6.0195e+01 -5.7322e+01 -5.5060e+01 -5.6756e+01 -6.0201e+01 -5.7301e+01 -5.5033e+01 -5.6759e+01 -6.0206e+01 -5.7280e+01 -5.5006e+01 -5.6762e+01 -6.0210e+01 -5.7258e+01 -5.4974e+01 -5.6765e+01 -6.0214e+01 -5.7237e+01 -5.4940e+01 -5.6767e+01 -6.0217e+01 -5.7216e+01 -5.4906e+01 -5.6769e+01 -6.0220e+01 -5.7195e+01 -5.4873e+01 -5.6771e+01 -6.0222e+01 -5.7174e+01 -5.4839e+01 -5.6772e+01 -6.0224e+01 -5.7152e+01 -5.4807e+01 -5.6773e+01 -6.0225e+01 -5.7131e+01 -5.4767e+01 -5.6773e+01 -6.0226e+01 -5.7110e+01 -5.4727e+01 -5.6773e+01 -6.0226e+01 -5.7089e+01 -5.4688e+01 -5.6773e+01 -6.0226e+01 -5.7068e+01 -5.4649e+01 -5.6772e+01 -6.0225e+01 -5.7047e+01 -5.4611e+01 -5.6771e+01 -6.0224e+01 -5.7026e+01 -5.4573e+01 -5.6770e+01 -6.0222e+01 -5.7005e+01 -5.4536e+01 -5.6769e+01 -6.0220e+01 -5.6984e+01 -5.4499e+01 -5.6767e+01 -6.0217e+01 -5.6963e+01 -5.4463e+01 -5.6765e+01 -6.0214e+01 -5.6942e+01 -5.4427e+01 -5.6762e+01 -6.0211e+01 -5.6921e+01 -5.4392e+01 -5.6755e+01 -6.0207e+01 -5.6900e+01 -5.4357e+01 -5.6744e+01 -6.0202e+01 -5.6879e+01 -5.4323e+01 -5.6732e+01 -6.0198e+01 -5.6858e+01 -5.4289e+01 -5.6721e+01 -6.0192e+01 -5.6837e+01 -5.4256e+01 -5.6710e+01 -6.0187e+01 -5.6817e+01 -5.4222e+01 -5.6699e+01 -6.0181e+01 -5.6796e+01 -5.4190e+01 -5.6687e+01 -6.0174e+01 -5.6775e+01 -5.4156e+01 -5.6675e+01 -6.0167e+01 -5.6754e+01 -5.4117e+01 -5.6664e+01 -6.0160e+01 -5.6733e+01 -5.4077e+01 -5.6652e+01 -6.0152e+01 -5.6712e+01 -5.4039e+01 -5.6640e+01 -6.0144e+01 -5.6691e+01 -5.4001e+01 -5.6628e+01 -6.0136e+01 -5.6670e+01 -5.3963e+01 -5.6616e+01 -6.0127e+01 -5.6649e+01 -5.3926e+01 -5.6603e+01 -6.0118e+01 -5.6628e+01 -5.3890e+01 -5.6591e+01 -6.0108e+01 -5.6608e+01 -5.3854e+01 -5.6579e+01 -6.0099e+01 -5.6587e+01 -5.3818e+01 -5.6566e+01 -6.0088e+01 -5.6566e+01 -5.3783e+01 -5.6553e+01 -6.0080e+01 -5.6538e+01 -5.3749e+01 -5.6540e+01 -6.0114e+01 -5.6510e+01 -5.3715e+01 -5.6528e+01 -6.0146e+01 -5.6481e+01 -5.3682e+01 -5.6515e+01 -6.0178e+01 -5.6453e+01 -5.3649e+01 -5.6502e+01 -6.0209e+01 -5.6425e+01 -5.3616e+01 -5.6488e+01 -6.0238e+01 -5.6397e+01 -5.3584e+01 -5.6469e+01 -6.0267e+01 -5.6369e+01 -5.3552e+01 -5.6448e+01 -6.0295e+01 -5.6341e+01 -5.3521e+01 -5.6427e+01 -6.0322e+01 -5.6314e+01 -5.3490e+01 -5.6406e+01 -6.0348e+01 -5.6286e+01 -5.3460e+01 -5.6385e+01 -6.0373e+01 -5.6259e+01 -5.3425e+01 -5.6364e+01 -6.0397e+01 -5.6232e+01 -5.3387e+01 -5.6343e+01 -6.0420e+01 -5.6205e+01 -5.3350e+01 -5.6322e+01 -6.0442e+01 -5.6179e+01 -5.3314e+01 -5.6302e+01 -6.0464e+01 -5.6152e+01 -5.3278e+01 -5.6281e+01 -6.0485e+01 -5.6126e+01 -5.3243e+01 -5.6261e+01 -6.0504e+01 -5.6093e+01 -5.3208e+01 -5.6240e+01 -6.0523e+01 -5.6060e+01 -5.3174e+01 -5.6220e+01 -6.0539e+01 -5.6026e+01 -5.3140e+01 -5.6200e+01 -6.0548e+01 -5.5993e+01 -5.3107e+01 -5.6180e+01 -6.0557e+01 -5.5960e+01 -5.3075e+01 -5.6159e+01 -6.0565e+01 -5.5927e+01 -5.3043e+01 -5.6139e+01 -6.0573e+01 -5.5895e+01 -5.3011e+01 -5.6119e+01 -6.0580e+01 -5.5863e+01 -5.2980e+01 -5.6099e+01 -6.0586e+01 -5.5831e+01 -5.2949e+01 -5.6079e+01 -6.0592e+01 -5.5800e+01 -5.2919e+01 -5.6059e+01 -6.0597e+01 -5.5768e+01 -5.2889e+01 -5.6040e+01 -6.0602e+01 -5.5737e+01 -5.2859e+01 -5.6020e+01 -6.0606e+01 -5.5707e+01 -5.2830e+01 -5.6000e+01 -6.0610e+01 -5.5676e+01 -5.2802e+01 -5.5980e+01 -6.0613e+01 -5.5646e+01 -5.2774e+01 -5.5961e+01 -6.0616e+01 -5.5617e+01 -5.2746e+01 -5.5941e+01 -6.0618e+01 -5.5587e+01 -5.2718e+01 -5.5922e+01 -6.0619e+01 -5.5558e+01 -5.2691e+01 -5.5897e+01 -6.0620e+01 -5.5529e+01 -5.2665e+01 -5.5869e+01 -6.0619e+01 -5.5500e+01 -5.2638e+01 -5.5842e+01 -6.0611e+01 -5.5470e+01 -5.2606e+01 -5.5815e+01 -6.0602e+01 -5.5434e+01 -5.2573e+01 -5.5789e+01 -6.0594e+01 -5.5398e+01 -5.2540e+01 -5.5762e+01 -6.0585e+01 -5.5362e+01 -5.2507e+01 -5.5736e+01 -6.0576e+01 -5.5327e+01 -5.2476e+01 -5.5710e+01 -6.0566e+01 -5.5292e+01 -5.2444e+01 -5.5684e+01 -6.0556e+01 -5.5258e+01 -5.2414e+01 -5.5658e+01 -6.0546e+01 -5.5224e+01 -5.2383e+01 -5.5633e+01 -6.0536e+01 -5.5190e+01 -5.2353e+01 -5.5607e+01 -6.0525e+01 -5.5157e+01 -5.2324e+01 -5.5577e+01 -6.0514e+01 -5.5124e+01 -5.2295e+01 -5.5544e+01 -6.0503e+01 -5.5092e+01 -5.2267e+01 -5.5512e+01 -6.0492e+01 -5.5059e+01 -5.2239e+01 -5.5480e+01 -6.0480e+01 -5.5028e+01 -5.2211e+01 -5.5448e+01 -6.0468e+01 -5.4996e+01 -5.2184e+01 -5.5417e+01 -6.0456e+01 -5.4965e+01 -5.2151e+01 -5.5386e+01 -6.0443e+01 -5.4934e+01 -5.2117e+01 -5.5355e+01 -6.0430e+01 -5.4903e+01 -5.2084e+01 -5.5325e+01 -6.0417e+01 -5.4873e+01 -5.2051e+01 -5.5295e+01 -6.0404e+01 -5.4843e+01 -5.2012e+01 -5.5265e+01 -6.0390e+01 -5.4814e+01 -5.1972e+01 -5.5236e+01 -6.0376e+01 -5.4784e+01 -5.1933e+01 -5.5206e+01 -6.0361e+01 -5.4755e+01 -5.1889e+01 -5.5178e+01 -6.0339e+01 -5.4726e+01 -5.1844e+01 -5.5149e+01 -6.0316e+01 -5.4698e+01 -5.1799e+01 -5.5121e+01 -6.0294e+01 -5.4669e+01 -5.1756e+01 -5.5093e+01 -6.0271e+01 -5.4641e+01 -5.1713e+01 -5.5065e+01 -6.0249e+01 -5.4614e+01 -5.1671e+01 -5.5038e+01 -6.0226e+01 -5.4586e+01 -5.1630e+01 -5.5010e+01 -6.0203e+01 -5.4559e+01 -5.1590e+01 -5.4983e+01 -6.0181e+01 -5.4532e+01 -5.1550e+01 -5.4957e+01 -6.0158e+01 -5.4505e+01 -5.1512e+01 -5.4930e+01 -6.0135e+01 -5.4479e+01 -5.1474e+01 -5.4904e+01 -6.0112e+01 -5.4452e+01 -5.1436e+01 -5.4878e+01 -6.0089e+01 -5.4426e+01 -5.1400e+01 -5.4852e+01 -6.0066e+01 -5.4400e+01 -5.1364e+01 -5.4826e+01 -6.0043e+01 -5.4375e+01 -5.1329e+01 -5.4801e+01 -6.0041e+01 -5.4349e+01 -5.1295e+01 -5.4776e+01 -6.0059e+01 -5.4324e+01 -5.1261e+01 -5.4751e+01 -6.0071e+01 -5.4299e+01 -5.1228e+01 -5.4726e+01 -6.0083e+01 -5.4274e+01 -5.1196e+01 -5.4702e+01 -6.0095e+01 -5.4250e+01 -5.1164e+01 -5.4677e+01 -6.0105e+01 -5.4225e+01 -5.1133e+01 -5.4653e+01 -6.0116e+01 -5.4201e+01 -5.1141e+01 -5.4629e+01 -6.0126e+01 -5.4177e+01 -5.1159e+01 -5.4606e+01 -6.0135e+01 -5.4153e+01 -5.1217e+01 -5.4582e+01 -6.0144e+01 -5.4130e+01 -5.1275e+01 -5.4559e+01 -6.0152e+01 -5.4106e+01 -5.1360e+01 -5.4535e+01 -6.0160e+01 -5.4083e+01 -5.1461e+01 -5.4512e+01 -6.0167e+01 -5.4060e+01 -5.1560e+01 -5.4489e+01 -6.0174e+01 -5.4037e+01 -5.1658e+01 -5.4467e+01 -6.0180e+01 -5.4014e+01 -5.1755e+01 -5.4444e+01 -6.0186e+01 -5.3991e+01 -5.1850e+01 -5.4445e+01 -6.0191e+01 -5.3969e+01 -5.1944e+01 -5.4459e+01 -6.0196e+01 -5.3946e+01 -5.2036e+01 -5.4472e+01 -6.0200e+01 -5.3916e+01 -5.2127e+01 -5.4486e+01 -6.0204e+01 -5.3878e+01 -5.2217e+01 -5.4499e+01 -6.0208e+01 -5.3841e+01 -5.2306e+01 -5.4512e+01 -6.0211e+01 -5.3804e+01 -5.2393e+01 -5.4524e+01 -6.0213e+01 -5.3768e+01 -5.2479e+01 -5.4537e+01 -6.0215e+01 -5.3732e+01 -5.2563e+01 -5.4549e+01 -6.0217e+01 -5.3697e+01 -5.2647e+01 -5.4560e+01 -6.0218e+01 -5.3662e+01 -5.2729e+01 -5.4571e+01 -6.0219e+01 -5.3621e+01 -5.2810e+01 -5.4582e+01 -6.0219e+01 -5.3580e+01 -5.2889e+01 -5.4593e+01 -6.0219e+01 -5.3539e+01 -5.2960e+01 -5.4603e+01 -6.0218e+01 -5.3498e+01 -5.3029e+01 -5.4614e+01 -6.0217e+01 -5.3459e+01 -5.3098e+01 -5.4623e+01 -6.0216e+01 -5.3420e+01 -5.3165e+01 -5.4633e+01 -6.0242e+01 -5.3381e+01 -5.3232e+01 -5.4642e+01 -6.0283e+01 -5.3343e+01 -5.3297e+01 -5.4651e+01 -6.0324e+01 -5.3306e+01 -5.3362e+01 -5.4659e+01 -6.0364e+01 -5.3269e+01 -5.3425e+01 -5.4668e+01 -6.0403e+01 -5.3233e+01 -5.3487e+01 -5.4676e+01 -6.0433e+01 -5.3198e+01 -5.3549e+01 -5.4683e+01 -6.0462e+01 -5.3163e+01 -5.3610e+01 -5.4691e+01 -6.0490e+01 -5.3128e+01 -5.3669e+01 -5.4698e+01 -6.0518e+01 -5.3094e+01 -5.3719e+01 -5.4705e+01 -6.0544e+01 -5.3061e+01 -5.3769e+01 -5.4711e+01 -6.0570e+01 -5.3028e+01 -5.3819e+01 -5.4718e+01 -6.0594e+01 -5.2995e+01 -5.3867e+01 -5.4724e+01 -6.0619e+01 -5.2963e+01 -5.3915e+01 -5.4729e+01 -6.0642e+01 -5.2930e+01 -5.3962e+01 -5.4735e+01 -6.0664e+01 -5.2891e+01 -5.4009e+01 -5.4740e+01 -6.0686e+01 -5.2853e+01 -5.4055e+01 -5.4745e+01 -6.0707e+01 -5.2815e+01 -5.4100e+01 -5.4747e+01 -6.0727e+01 -5.2778e+01 -5.4144e+01 -5.4743e+01 -6.0747e+01 -5.2742e+01 -5.4188e+01 -5.4740e+01 -6.0766e+01 -5.2706e+01 -5.4230e+01 -5.4736e+01 -6.0784e+01 -5.2670e+01 -5.4273e+01 -5.4732e+01 -6.0801e+01 -5.2636e+01 -5.4314e+01 -5.4728e+01 -6.0818e+01 -5.2602e+01 -5.4353e+01 -5.4724e+01 -6.0834e+01 -5.2568e+01 -5.4385e+01 -5.4720e+01 -6.0849e+01 -5.2535e+01 -5.4417e+01 -5.4716e+01 -6.0864e+01 -5.2502e+01 -5.4448e+01 -5.4712e+01 -6.0877e+01 -5.2470e+01 -5.4479e+01 -5.4708e+01 -6.0891e+01 -5.2435e+01 -5.4510e+01 -5.4704e+01 -6.0903e+01 -5.2396e+01 -5.4540e+01 -5.4699e+01 -6.0915e+01 -5.2358e+01 -5.4569e+01 -5.4695e+01 -6.0922e+01 -5.2321e+01 -5.4598e+01 -5.4690e+01 -6.0925e+01 -5.2284e+01 -5.4626e+01 -5.4680e+01 -6.0927e+01 -5.2242e+01 -5.4655e+01 -5.4667e+01 -6.0929e+01 -5.2199e+01 -5.4682e+01 -5.4655e+01 -6.0930e+01 -5.2156e+01 -5.4709e+01 -5.4643e+01 -6.0931e+01 -5.2114e+01 -5.4736e+01 -5.4630e+01 -6.0932e+01 -5.2073e+01 -5.4762e+01 -5.4618e+01 -6.0932e+01 -5.2033e+01 -5.4788e+01 -5.4606e+01 -6.0931e+01 -5.1993e+01 -5.4813e+01 -5.4594e+01 -6.0922e+01 -5.1954e+01 -5.4838e+01 -5.4582e+01 -6.0913e+01 -5.1916e+01 -5.4862e+01 -5.4570e+01 -6.0904e+01 -5.1879e+01 -5.4886e+01 -5.4558e+01 -6.0894e+01 -5.1842e+01 -5.4925e+01 -5.4546e+01 -6.0884e+01 -5.1806e+01 -5.4992e+01 -5.4535e+01 -6.0874e+01 -5.1770e+01 -5.5059e+01 -5.4523e+01 -6.0864e+01 -5.1736e+01 -5.5124e+01 -5.4529e+01 -6.0875e+01 -5.1701e+01 -5.5188e+01 -5.4554e+01 -6.0909e+01 -5.1668e+01 -5.5247e+01 -5.4579e+01 -6.0942e+01 -5.1635e+01 -5.5300e+01 -5.4603e+01 -6.0974e+01 -5.1603e+01 -5.5354e+01 -5.4626e+01 -6.1005e+01 -5.1571e+01 -5.5406e+01 -5.4649e+01 -6.1035e+01 -5.1540e+01 -5.5457e+01 -5.4672e+01 -6.1065e+01 -5.1510e+01 -5.5508e+01 -5.4695e+01 -6.1093e+01 -5.1480e+01 -5.5557e+01 -5.4717e+01 -6.1121e+01 -5.1450e+01 -5.5606e+01 -5.4738e+01 -6.1147e+01 -5.1421e+01 -5.5654e+01 -5.4759e+01 -6.1173e+01 -5.1393e+01 -5.5701e+01 -5.4780e+01 -6.1194e+01 -5.1360e+01 -5.5739e+01 -5.4801e+01 -6.1210e+01 -5.1325e+01 -5.5777e+01 -5.4820e+01 -6.1226e+01 -5.1290e+01 -5.5814e+01 -5.4840e+01 -6.1241e+01 -5.1257e+01 -5.5851e+01 -5.4859e+01 -6.1256e+01 -5.1223e+01 -5.5886e+01 -5.4878e+01 -6.1270e+01 -5.1191e+01 -5.5922e+01 -5.4896e+01 -6.1284e+01 -5.1159e+01 -5.5953e+01 -5.4914e+01 -6.1296e+01 -5.1127e+01 -5.5979e+01 -5.4932e+01 -6.1309e+01 -5.1097e+01 -5.6005e+01 -5.4949e+01 -6.1320e+01 -5.1066e+01 -5.6030e+01 -5.4965e+01 -6.1331e+01 -5.1037e+01 -5.6055e+01 -5.4982e+01 -6.1342e+01 -5.1008e+01 -5.6079e+01 -5.4998e+01 -6.1352e+01 -5.0979e+01 -5.6103e+01 -5.5013e+01 -6.1361e+01 -5.0952e+01 -5.6127e+01 -5.5029e+01 -6.1370e+01 -5.0924e+01 -5.6144e+01 -5.5043e+01 -6.1378e+01 -5.0897e+01 -5.6159e+01 -5.5058e+01 -6.1386e+01 -5.0871e+01 -5.6174e+01 -5.5072e+01 -6.1393e+01 -5.0845e+01 -5.6189e+01 -5.5085e+01 -6.1400e+01 -5.0820e+01 -5.6203e+01 -5.5099e+01 -6.1406e+01 -5.0795e+01 -5.6217e+01 -5.5112e+01 -6.1411e+01 -5.0771e+01 -5.6231e+01 -5.5124e+01 -6.1416e+01 -5.0747e+01 -5.6244e+01 -5.5136e+01 -6.1421e+01 -5.0723e+01 -5.6257e+01 -5.5148e+01 -6.1425e+01 -5.0700e+01 -5.6270e+01 -5.5160e+01 -6.1428e+01 -5.0678e+01 -5.6283e+01 -5.5171e+01 -6.1431e+01 -5.0656e+01 -5.6289e+01 -5.5181e+01 -6.1433e+01 -5.0634e+01 -5.6293e+01 -5.5192e+01 -6.1435e+01 -5.0623e+01 -5.6297e+01 -5.5202e+01 -6.1436e+01 -5.0647e+01 -5.6302e+01 -5.5211e+01 -6.1437e+01 -5.0670e+01 -5.6306e+01 -5.5221e+01 -6.1438e+01 -5.0693e+01 -5.6310e+01 -5.5230e+01 -6.1438e+01 -5.0716e+01 -5.6314e+01 -5.5238e+01 -6.1437e+01 -5.0738e+01 -5.6318e+01 -5.5247e+01 -6.1436e+01 -5.0782e+01 -5.6322e+01 -5.5255e+01 -6.1434e+01 -5.0849e+01 -5.6326e+01 -5.5262e+01 -6.1432e+01 -5.0914e+01 -5.6329e+01 -5.5270e+01 -6.1430e+01 -5.0978e+01 -5.6333e+01 -5.5277e+01 -6.1427e+01 -5.1042e+01 -5.6336e+01 -5.5283e+01 -6.1424e+01 -5.1104e+01 -5.6339e+01 -5.5289e+01 -6.1420e+01 -5.1164e+01 -5.6343e+01 -5.5295e+01 -6.1415e+01 -5.1216e+01 -5.6346e+01 -5.5301e+01 -6.1411e+01 -5.1269e+01 -5.6348e+01 -5.5306e+01 -6.1405e+01 -5.1320e+01 -5.6351e+01 -5.5304e+01 -6.1400e+01 -5.1371e+01 -5.6354e+01 -5.5301e+01 -6.1394e+01 -5.1421e+01 -5.6356e+01 -5.5297e+01 -6.1387e+01 -5.1470e+01 -5.6358e+01 -5.5294e+01 -6.1380e+01 -5.1519e+01 -5.6360e+01 -5.5291e+01 -6.1373e+01 -5.1567e+01 -5.6362e+01 -5.5287e+01 -6.1365e+01 -5.1614e+01 -5.6364e+01 -5.5311e+01 -6.1357e+01 -5.1653e+01 -5.6366e+01 -5.5336e+01 -6.1349e+01 -5.1691e+01 -5.6367e+01 -5.5360e+01 -6.1340e+01 -5.1725e+01 -5.6369e+01 -5.5384e+01 -6.1331e+01 -5.1755e+01 -5.6368e+01 -5.5407e+01 -6.1321e+01 -5.1784e+01 -5.6361e+01 -5.5431e+01 -6.1311e+01 -5.1813e+01 -5.6354e+01 -5.5453e+01 -6.1300e+01 -5.1842e+01 -5.6347e+01 -5.5476e+01 -6.1290e+01 -5.1865e+01 -5.6340e+01 -5.5497e+01 -6.1278e+01 -5.1885e+01 -5.6333e+01 -5.5519e+01 -6.1267e+01 -5.1906e+01 -5.6326e+01 -5.5540e+01 -6.1255e+01 -5.1926e+01 -5.6319e+01 -5.5561e+01 -6.1243e+01 -5.1946e+01 -5.6312e+01 -5.5581e+01 -6.1230e+01 -5.1966e+01 -5.6306e+01 -5.5601e+01 -6.1217e+01 -5.1985e+01 -5.6299e+01 -5.5621e+01 -6.1204e+01 -5.2005e+01 -5.6292e+01 -5.5640e+01 -6.1190e+01 -5.2025e+01 -5.6285e+01 -5.5658e+01 -6.1176e+01 -5.2044e+01 -5.6278e+01 -5.5677e+01 -6.1162e+01 -5.2063e+01 -5.6271e+01 -5.5695e+01 -6.1147e+01 -5.2083e+01 -5.6264e+01 -5.5712e+01 -6.1132e+01 -5.2102e+01 -5.6257e+01 -5.5730e+01 -6.1117e+01 -5.2120e+01 -5.6250e+01 -5.5746e+01 -6.1101e+01 -5.2139e+01 -5.6242e+01 -5.5763e+01 -6.1099e+01 -5.2158e+01 -5.6235e+01 -5.5779e+01 -6.1127e+01 -5.2176e+01 -5.6228e+01 -5.5794e+01 -6.1154e+01 -5.2194e+01 -5.6221e+01 -5.5810e+01 -6.1181e+01 -5.2212e+01 -5.6213e+01 -5.5818e+01 -6.1206e+01 -5.2230e+01 -5.6206e+01 -5.5825e+01 -6.1231e+01 -5.2248e+01 -5.6198e+01 -5.5831e+01 -6.1254e+01 -5.2266e+01 -5.6191e+01 -5.5837e+01 -6.1277e+01 -5.2283e+01 -5.6183e+01 -5.5843e+01 -6.1299e+01 -5.2300e+01 -5.6176e+01 -5.5849e+01 -6.1319e+01 -5.2317e+01 -5.6168e+01 -5.5855e+01 -6.1339e+01 -5.2334e+01 -5.6160e+01 -5.5860e+01 -6.1359e+01 -5.2351e+01 -5.6152e+01 -5.5866e+01 -6.1377e+01 -5.2367e+01 -5.6144e+01 -5.5871e+01 -6.1394e+01 -5.2383e+01 -5.6133e+01 -5.5876e+01 -6.1411e+01 -5.2399e+01 -5.6117e+01 -5.5878e+01 -6.1427e+01 -5.2415e+01 -5.6101e+01 -5.5875e+01 -6.1442e+01 -5.2431e+01 -5.6085e+01 -5.5871e+01 -6.1456e+01 -5.2446e+01 -5.6069e+01 -5.5868e+01 -6.1469e+01 -5.2461e+01 -5.6054e+01 -5.5864e+01 -6.1482e+01 -5.2476e+01 -5.6038e+01 -5.5860e+01 -6.1494e+01 -5.2487e+01 -5.6023e+01 -5.5857e+01 -6.1505e+01 -5.2493e+01 -5.6007e+01 -5.5853e+01 -6.1515e+01 -5.2500e+01 -5.5992e+01 -5.5850e+01 -6.1525e+01 -5.2504e+01 -5.5977e+01 -5.5846e+01 -6.1534e+01 -5.2502e+01 -5.5962e+01 -5.5842e+01 -6.1542e+01 -5.2501e+01 -5.5947e+01 -5.5838e+01 -6.1550e+01 -5.2500e+01 -5.5932e+01 -5.5835e+01 -6.1556e+01 -5.2499e+01 -5.5917e+01 -5.5831e+01 -6.1562e+01 -5.2499e+01 -5.5902e+01 -5.5827e+01 -6.1568e+01 -5.2498e+01 -5.5887e+01 -5.5823e+01 -6.1573e+01 -5.2498e+01 -5.5872e+01 -5.5828e+01 -6.1577e+01 -5.2498e+01 -5.5858e+01 -5.5860e+01 -6.1580e+01 -5.2497e+01 -5.5843e+01 -5.5892e+01 -6.1583e+01 -5.2497e+01 -5.5828e+01 -5.5923e+01 -6.1577e+01 -5.2497e+01 -5.5814e+01 -5.5954e+01 -6.1571e+01 -5.2497e+01 -5.5799e+01 -5.5984e+01 -6.1564e+01 -5.2497e+01 -5.5785e+01 -5.6014e+01 -6.1557e+01 -5.2498e+01 -5.5770e+01 -5.6043e+01 -6.1549e+01 -5.2498e+01 -5.5756e+01 -5.6072e+01 -6.1541e+01 -5.2498e+01 -5.5741e+01 -5.6100e+01 -6.1533e+01 -5.2499e+01 -5.5727e+01 -5.6127e+01 -6.1524e+01 -5.2492e+01 -5.5712e+01 -5.6154e+01 -6.1515e+01 -5.2485e+01 -5.5698e+01 -5.6181e+01 -6.1505e+01 -5.2478e+01 -5.5684e+01 -5.6200e+01 -6.1495e+01 -5.2471e+01 -5.5669e+01 -5.6218e+01 -6.1485e+01 -5.2464e+01 -5.5655e+01 -5.6235e+01 -6.1474e+01 -5.2458e+01 -5.5641e+01 -5.6252e+01 -6.1463e+01 -5.2452e+01 -5.5619e+01 -5.6269e+01 -6.1452e+01 -5.2446e+01 -5.5597e+01 -5.6285e+01 -6.1440e+01 -5.2440e+01 -5.5575e+01 -5.6301e+01 -6.1428e+01 -5.2434e+01 -5.5553e+01 -5.6317e+01 -6.1415e+01 -5.2429e+01 -5.5532e+01 -5.6332e+01 -6.1403e+01 -5.2424e+01 -5.5510e+01 -5.6343e+01 -6.1389e+01 -5.2418e+01 -5.5489e+01 -5.6350e+01 -6.1376e+01 -5.2413e+01 -5.5463e+01 -5.6356e+01 -6.1362e+01 -5.2407e+01 -5.5435e+01 -5.6363e+01 -6.1348e+01 -5.2394e+01 -5.5406e+01 -5.6369e+01 -6.1333e+01 -5.2382e+01 -5.5378e+01 -5.6375e+01 -6.1318e+01 -5.2370e+01 -5.5350e+01 -5.6381e+01 -6.1303e+01 -5.2358e+01 -5.5323e+01 -5.6387e+01 -6.1287e+01 -5.2346e+01 -5.5296e+01 -5.6393e+01 -6.1313e+01 -5.2335e+01 -5.5269e+01 -5.6398e+01 -6.1341e+01 -5.2324e+01 -5.5243e+01 -5.6403e+01 -6.1368e+01 -5.2314e+01 -5.5216e+01 -5.6409e+01 -6.1394e+01 -5.2304e+01 -5.5191e+01 -5.6414e+01 -6.1419e+01 -5.2293e+01 -5.5165e+01 -5.6418e+01 -6.1443e+01 -5.2284e+01 -5.5131e+01 -5.6423e+01 -6.1466e+01 -5.2274e+01 -5.5098e+01 -5.6427e+01 -6.1482e+01 -5.2265e+01 -5.5066e+01 -5.6432e+01 -6.1495e+01 -5.2255e+01 -5.5034e+01 -5.6436e+01 -6.1508e+01 -5.2247e+01 -5.5003e+01 -5.6439e+01 -6.1520e+01 -5.2238e+01 -5.4971e+01 -5.6443e+01 -6.1532e+01 -5.2229e+01 -5.4941e+01 -5.6447e+01 -6.1542e+01 -5.2221e+01 -5.4911e+01 -5.6450e+01 -6.1553e+01 -5.2213e+01 -5.4881e+01 -5.6453e+01 -6.1562e+01 -5.2205e+01 -5.4851e+01 -5.6456e+01 -6.1571e+01 -5.2197e+01 -5.4822e+01 -5.6458e+01 -6.1579e+01 -5.2189e+01 -5.4793e+01 -5.6461e+01 -6.1581e+01 -5.2182e+01 -5.4761e+01 -5.6463e+01 -6.1573e+01 -5.2174e+01 -5.4725e+01 -5.6465e+01 -6.1563e+01 -5.2185e+01 -5.4690e+01 -5.6467e+01 -6.1554e+01 -5.2220e+01 -5.4655e+01 -5.6468e+01 -6.1544e+01 -5.2249e+01 -5.4621e+01 -5.6470e+01 -6.1535e+01 -5.2278e+01 -5.4587e+01 -5.6471e+01 -6.1525e+01 -5.2306e+01 -5.4554e+01 -5.6472e+01 -6.1510e+01 -5.2334e+01 -5.4521e+01 -5.6469e+01 -6.1491e+01 -5.2361e+01 -5.4488e+01 -5.6462e+01 -6.1471e+01 -5.2388e+01 -5.4456e+01 -5.6454e+01 -6.1445e+01 -5.2415e+01 -5.4425e+01 -5.6447e+01 -6.1419e+01 -5.2442e+01 -5.4394e+01 -5.6440e+01 -6.1392e+01 -5.2468e+01 -5.4363e+01 -5.6432e+01 -6.1366e+01 -5.2494e+01 -5.4333e+01 -5.6425e+01 -6.1340e+01 -5.2519e+01 -5.4304e+01 -5.6417e+01 -6.1312e+01 -5.2544e+01 -5.4274e+01 -5.6410e+01 -6.1279e+01 -5.2569e+01 -5.4245e+01 -5.6402e+01 -6.1245e+01 -5.2594e+01 -5.4212e+01 -5.6394e+01 -6.1212e+01 -5.2618e+01 -5.4176e+01 -5.6387e+01 -6.1180e+01 -5.2642e+01 -5.4140e+01 -5.6379e+01 -6.1147e+01 -5.2665e+01 -5.4105e+01 -5.6371e+01 -6.1115e+01 -5.2688e+01 -5.4071e+01 -5.6363e+01 -6.1083e+01 -5.2711e+01 -5.4032e+01 -5.6356e+01 -6.1051e+01 -5.2733e+01 -5.3991e+01 -5.6348e+01 -6.1020e+01 -5.2755e+01 -5.3951e+01 -5.6340e+01 -6.0988e+01 -5.2777e+01 -5.3911e+01 -5.6331e+01 -6.0954e+01 -5.2798e+01 -5.3872e+01 -5.6323e+01 -6.0907e+01 -5.2819e+01 -5.3826e+01 -5.6315e+01 -6.0861e+01 -5.2840e+01 -5.3780e+01 -5.6307e+01 -6.0816e+01 -5.2861e+01 -5.3735e+01 -5.6298e+01 -6.0770e+01 -5.2881e+01 -5.3691e+01 -5.6290e+01 -6.0726e+01 -5.2900e+01 -5.3648e+01 -5.6281e+01 -6.0682e+01 -5.2920e+01 -5.3605e+01 -5.6272e+01 -6.0639e+01 -5.2939e+01 -5.3564e+01 -5.6248e+01 -6.0596e+01 -5.2957e+01 -5.3523e+01 -5.6223e+01 -6.0553e+01 -5.2976e+01 -5.3482e+01 -5.6199e+01 -6.0511e+01 -5.2994e+01 -5.3443e+01 -5.6175e+01 -6.0470e+01 -5.3006e+01 -5.3404e+01 -5.6152e+01 -6.0428e+01 -5.3015e+01 -5.3366e+01 -5.6129e+01 -6.0416e+01 -5.3025e+01 -5.3328e+01 -5.6106e+01 -6.0420e+01 -5.3034e+01 -5.3291e+01 -5.6083e+01 -6.0423e+01 -5.3043e+01 -5.3255e+01 -5.6061e+01 -6.0427e+01 -5.3052e+01 -5.3220e+01 -5.6039e+01 -6.0430e+01 -5.3061e+01 -5.3185e+01 -5.6017e+01 -6.0433e+01 -5.3070e+01 -5.3150e+01 -5.5995e+01 -6.0436e+01 -5.3078e+01 -5.3116e+01 -5.5973e+01 -6.0438e+01 -5.3087e+01 -5.3083e+01 -5.5952e+01 -6.0440e+01 -5.3095e+01 -5.3050e+01 -5.5931e+01 -6.0442e+01 -5.3103e+01 -5.3018e+01 -5.5910e+01 -6.0444e+01 -5.3106e+01 -5.2980e+01 -5.5890e+01 -6.0445e+01 -5.3105e+01 -5.2941e+01 -5.5869e+01 -6.0446e+01 -5.3105e+01 -5.2903e+01 -5.5849e+01 -6.0447e+01 -5.3105e+01 -5.2865e+01 -5.5829e+01 -6.0448e+01 -5.3105e+01 -5.2828e+01 -5.5809e+01 -6.0448e+01 -5.3105e+01 -5.2792e+01 -5.5789e+01 -6.0448e+01 -5.3106e+01 -5.2757e+01 -5.5769e+01 -6.0447e+01 -5.3106e+01 -5.2722e+01 -5.5750e+01 -6.0447e+01 -5.3106e+01 -5.2687e+01 -5.5730e+01 -6.0446e+01 -5.3106e+01 -5.2654e+01 -5.5705e+01 -6.0444e+01 -5.3106e+01 -5.2621e+01 -5.5678e+01 -6.0443e+01 -5.3106e+01 -5.2588e+01 -5.5651e+01 -6.0441e+01 -5.3106e+01 -5.2556e+01 -5.5625e+01 -6.0439e+01 -5.3106e+01 -5.2525e+01 -5.5599e+01 -6.0437e+01 -5.3106e+01 -5.2494e+01 -5.5573e+01 -6.0434e+01 -5.3106e+01 -5.2464e+01 -5.5548e+01 -6.0431e+01 -5.3106e+01 -5.2434e+01 -5.5523e+01 -6.0428e+01 -5.3106e+01 -5.2405e+01 -5.5494e+01 -6.0424e+01 -5.3106e+01 -5.2376e+01 -5.5462e+01 -6.0420e+01 -5.3106e+01 -5.2348e+01 -5.5430e+01 -6.0416e+01 -5.3106e+01 -5.2316e+01 -5.5398e+01 -6.0408e+01 -5.3106e+01 -5.2281e+01 -5.5367e+01 -6.0395e+01 -5.3106e+01 -5.2246e+01 -5.5337e+01 -6.0382e+01 -5.3100e+01 -5.2213e+01 -5.5307e+01 -6.0369e+01 -5.3092e+01 -5.2179e+01 -5.5277e+01 -6.0356e+01 -5.3084e+01 -5.2147e+01 -5.5247e+01 -6.0335e+01 -5.3076e+01 -5.2115e+01 -5.5218e+01 -6.0314e+01 -5.3068e+01 -5.2083e+01 -5.5190e+01 -6.0293e+01 -5.3061e+01 -5.2052e+01 -5.5162e+01 -6.0303e+01 -5.3053e+01 -5.2022e+01 -5.5134e+01 -6.0326e+01 -5.3046e+01 -5.1992e+01 -5.5106e+01 -6.0349e+01 -5.3039e+01 -5.1963e+01 -5.5079e+01 -6.0371e+01 -5.3032e+01 -5.1934e+01 -5.5052e+01 -6.0393e+01 -5.3025e+01 -5.1906e+01 -5.5018e+01 -6.0414e+01 -5.3018e+01 -5.1878e+01 -5.4984e+01 -6.0435e+01 -5.3011e+01 -5.1851e+01 -5.4951e+01 -6.0454e+01 -5.3004e+01 -5.1821e+01 -5.4918e+01 -6.0474e+01 -5.2998e+01 -5.1787e+01 -5.4885e+01 -6.0492e+01 -5.2991e+01 -5.1747e+01 -5.4847e+01 -6.0511e+01 -5.2985e+01 -5.1701e+01 -5.4808e+01 -6.0528e+01 -5.2978e+01 -5.1653e+01 -5.4769e+01 -6.0545e+01 -5.2964e+01 -5.1606e+01 -5.4731e+01 -6.0561e+01 -5.2950e+01 -5.1561e+01 -5.4692e+01 -6.0577e+01 -5.2934e+01 -5.1516e+01 -5.4647e+01 -6.0592e+01 -5.2913e+01 -5.1511e+01 -5.4603e+01 -6.0607e+01 -5.2892e+01 -5.1512e+01 -5.4559e+01 -6.0621e+01 -5.2871e+01 -5.1509e+01 -5.4517e+01 -6.0635e+01 -5.2851e+01 -5.1503e+01 -5.4475e+01 -6.0648e+01 -5.2831e+01 -5.1497e+01 -5.4434e+01 -6.0660e+01 -5.2825e+01 -5.1492e+01 -5.4393e+01 -6.0672e+01 -5.2850e+01 -5.1487e+01 -5.4353e+01 -6.0683e+01 -5.2875e+01 -5.1482e+01 -5.4314e+01 -6.0694e+01 -5.2900e+01 -5.1478e+01 -5.4276e+01 -6.0704e+01 -5.2924e+01 -5.1474e+01 -5.4238e+01 -6.0714e+01 -5.2948e+01 -5.1470e+01 -5.4201e+01 -6.0723e+01 -5.2972e+01 -5.1467e+01 -5.4164e+01 -6.0732e+01 -5.2996e+01 -5.1464e+01 -5.4128e+01 -6.0740e+01 -5.3011e+01 -5.1461e+01 -5.4093e+01 -6.0747e+01 -5.3026e+01 -5.1459e+01 -5.4058e+01 -6.0755e+01 -5.3041e+01 -5.1457e+01 -5.4016e+01 -6.0761e+01 -5.3056e+01 -5.1491e+01 -5.3984e+01 -6.0759e+01 -5.3071e+01 -5.1533e+01 -5.3979e+01 -6.0757e+01 -5.3086e+01 -5.1575e+01 -5.3975e+01 -6.0754e+01 -5.3100e+01 -5.1617e+01 -5.3972e+01 -6.0751e+01 -5.3115e+01 -5.1658e+01 -5.3968e+01 -6.0748e+01 -5.3129e+01 -5.1699e+01 -5.3965e+01 -6.0744e+01 -5.3143e+01 -5.1740e+01 -5.3962e+01 -6.0741e+01 -5.3157e+01 -5.1780e+01 -5.3959e+01 -6.0737e+01 -5.3171e+01 -5.1819e+01 -5.3956e+01 -6.0732e+01 -5.3184e+01 -5.1859e+01 -5.3953e+01 -6.0727e+01 -5.3198e+01 -5.1897e+01 -5.3951e+01 -6.0722e+01 -5.3211e+01 -5.1936e+01 -5.3949e+01 -6.0717e+01 -5.3224e+01 -5.1973e+01 -5.3946e+01 -6.0711e+01 -5.3237e+01 -5.2011e+01 -5.3944e+01 -6.0706e+01 -5.3250e+01 -5.2048e+01 -5.3942e+01 -6.0699e+01 -5.3256e+01 -5.2084e+01 -5.3941e+01 -6.0693e+01 -5.3261e+01 -5.2120e+01 -5.3939e+01 -6.0686e+01 -5.3265e+01 -5.2156e+01 -5.3937e+01 -6.0679e+01 -5.3270e+01 -5.2191e+01 -5.3936e+01 -6.0671e+01 -5.3275e+01 -5.2226e+01 -5.3934e+01 -6.0664e+01 -5.3279e+01 -5.2260e+01 -5.3933e+01 -6.0667e+01 -5.3284e+01 -5.2290e+01 -5.3932e+01 -6.0704e+01 -5.3288e+01 -5.2316e+01 -5.3931e+01 -6.0739e+01 -5.3293e+01 -5.2341e+01 -5.3930e+01 -6.0773e+01 -5.3297e+01 -5.2366e+01 -5.3928e+01 -6.0836e+01 -5.3297e+01 -5.2391e+01 -5.3927e+01 -6.0912e+01 -5.3293e+01 -5.2416e+01 -5.3926e+01 -6.0987e+01 -5.3286e+01 -5.2440e+01 -5.3925e+01 -6.1061e+01 -5.3275e+01 -5.2464e+01 -5.3924e+01 -6.1133e+01 -5.3264e+01 -5.2488e+01 -5.3924e+01 -6.1203e+01 -5.3254e+01 -5.2511e+01 -5.3923e+01 -6.1272e+01 -5.3244e+01 -5.2535e+01 -5.3922e+01 -6.1339e+01 -5.3234e+01 -5.2558e+01 -5.3921e+01 -6.1405e+01 -5.3225e+01 -5.2580e+01 -5.3920e+01 -6.1470e+01 -5.3216e+01 -5.2603e+01 -5.3919e+01 -6.1533e+01 -5.3207e+01 -5.2625e+01 -5.3918e+01 -6.1594e+01 -5.3198e+01 -5.2655e+01 -5.3917e+01 -6.1654e+01 -5.3190e+01 -5.2721e+01 -5.3916e+01 -6.1713e+01 -5.3181e+01 -5.2786e+01 -5.3915e+01 -6.1770e+01 -5.3173e+01 -5.2850e+01 -5.3914e+01 -6.1826e+01 -5.3166e+01 -5.2914e+01 -5.3913e+01 -6.1881e+01 -5.3158e+01 -5.2976e+01 -5.3912e+01 -6.1934e+01 -5.3151e+01 -5.3037e+01 -5.3911e+01 -6.1986e+01 -5.3144e+01 -5.3098e+01 -5.3910e+01 -6.2037e+01 -5.3137e+01 -5.3158e+01 -5.3909e+01 -6.2086e+01 -5.3130e+01 -5.3217e+01 -5.3908e+01 -6.2134e+01 -5.3124e+01 -5.3274e+01 -5.3907e+01 -6.2181e+01 -5.3117e+01 -5.3331e+01 -5.3905e+01 -6.2226e+01 -5.3111e+01 -5.3387e+01 -5.3904e+01 -6.2271e+01 -5.3105e+01 -5.3443e+01 -5.3902e+01 -6.2314e+01 -5.3099e+01 -5.3497e+01 -5.3901e+01 -6.2356e+01 -5.3093e+01 -5.3551e+01 -5.3896e+01 -6.2396e+01 -5.3087e+01 -5.3603e+01 -5.3887e+01 -6.2436e+01 -5.3082e+01 -5.3655e+01 -5.3877e+01 -6.2467e+01 -5.3076e+01 -5.3706e+01 -5.3868e+01 -6.2489e+01 -5.3071e+01 -5.3756e+01 -5.3859e+01 -6.2509e+01 -5.3065e+01 -5.3805e+01 -5.3850e+01 -6.2529e+01 -5.3060e+01 -5.3854e+01 -5.3841e+01 -6.2548e+01 -5.3049e+01 -5.3902e+01 -5.3832e+01 -6.2566e+01 -5.3036e+01 -5.3948e+01 -5.3824e+01 -6.2584e+01 -5.3023e+01 -5.3995e+01 -5.3815e+01 -6.2601e+01 -5.3011e+01 -5.4040e+01 -5.3807e+01 -6.2617e+01 -5.2999e+01 -5.4084e+01 -5.3798e+01 -6.2633e+01 -5.2987e+01 -5.4128e+01 -5.3790e+01 -6.2647e+01 -5.2976e+01 -5.4171e+01 -5.3781e+01 -6.2662e+01 -5.2964e+01 -5.4213e+01 -5.3773e+01 -6.2675e+01 -5.2953e+01 -5.4255e+01 -5.3765e+01 -6.2688e+01 -5.2942e+01 -5.4295e+01 -5.3757e+01 -6.2700e+01 -5.2932e+01 -5.4335e+01 -5.3749e+01 -6.2711e+01 -5.2921e+01 -5.4374e+01 -5.3741e+01 -6.2722e+01 -5.2911e+01 -5.4413e+01 -5.3733e+01 -6.2732e+01 -5.2898e+01 -5.4451e+01 -5.3725e+01 -6.2741e+01 -5.2880e+01 -5.4488e+01 -5.3717e+01 -6.2750e+01 -5.2862e+01 -5.4524e+01 -5.3708e+01 -6.2758e+01 -5.2845e+01 -5.4559e+01 -5.3693e+01 -6.2765e+01 -5.2829e+01 -5.4594e+01 -5.3677e+01 -6.2772e+01 -5.2812e+01 -5.4628e+01 -5.3662e+01 -6.2778e+01 -5.2796e+01 -5.4662e+01 -5.3647e+01 -6.2784e+01 -5.2780e+01 -5.4695e+01 -5.3632e+01 -6.2789e+01 -5.2765e+01 -5.4727e+01 -5.3617e+01 -6.2793e+01 -5.2747e+01 -5.4758e+01 -5.3603e+01 -6.2797e+01 -5.2724e+01 -5.4789e+01 -5.3589e+01 -6.2800e+01 -5.2702e+01 -5.4819e+01 -5.3574e+01 -6.2803e+01 -5.2678e+01 -5.4849e+01 -5.3561e+01 -6.2805e+01 -5.2649e+01 -5.4878e+01 -5.3547e+01 -6.2806e+01 -5.2620e+01 -5.4906e+01 -5.3533e+01 -6.2807e+01 -5.2592e+01 -5.4927e+01 -5.3520e+01 -6.2807e+01 -5.2565e+01 -5.4947e+01 -5.3507e+01 -6.2807e+01 -5.2538e+01 -5.4965e+01 -5.3490e+01 -6.2806e+01 -5.2512e+01 -5.4984e+01 -5.3469e+01 -6.2804e+01 -5.2486e+01 -5.5001e+01 -5.3449e+01 -6.2802e+01 -5.2461e+01 -5.5019e+01 -5.3429e+01 -6.2800e+01 -5.2436e+01 -5.5036e+01 -5.3409e+01 -6.2797e+01 -5.2412e+01 -5.5053e+01 -5.3389e+01 -6.2793e+01 -5.2383e+01 -5.5069e+01 -5.3370e+01 -6.2789e+01 -5.2352e+01 -5.5085e+01 -5.3351e+01 -6.2785e+01 -5.2322e+01 -5.5100e+01 -5.3332e+01 -6.2779e+01 -5.2292e+01 -5.5115e+01 -5.3314e+01 -6.2774e+01 -5.2263e+01 -5.5130e+01 -5.3296e+01 -6.2768e+01 -5.2235e+01 -5.5144e+01 -5.3278e+01 -6.2761e+01 -5.2207e+01 -5.5158e+01 -5.3260e+01 -6.2754e+01 -5.2180e+01 -5.5172e+01 -5.3243e+01 -6.2746e+01 -5.2154e+01 -5.5185e+01 -5.3226e+01 -6.2738e+01 -5.2128e+01 -5.5197e+01 -5.3209e+01 -6.2730e+01 -5.2102e+01 -5.5210e+01 -5.3192e+01 -6.2721e+01 -5.2077e+01 -5.5222e+01 -5.3172e+01 -6.2711e+01 -5.2053e+01 -5.5268e+01 -5.3147e+01 -6.2701e+01 -5.2029e+01 -5.5324e+01 -5.3124e+01 -6.2691e+01 -5.2006e+01 -5.5378e+01 -5.3100e+01 -6.2680e+01 -5.1983e+01 -5.5431e+01 -5.3078e+01 -6.2669e+01 -5.1961e+01 -5.5483e+01 -5.3055e+01 -6.2657e+01 -5.1939e+01 -5.5535e+01 -5.3033e+01 -6.2645e+01 -5.1918e+01 -5.5585e+01 -5.3011e+01 -6.2633e+01 -5.1897e+01 -5.5634e+01 -5.2990e+01 -6.2620e+01 -5.1876e+01 -5.5683e+01 -5.2968e+01 -6.2606e+01 -5.1856e+01 -5.5730e+01 -5.2948e+01 -6.2593e+01 -5.1837e+01 -5.5777e+01 -5.2927e+01 -6.2578e+01 -5.1817e+01 -5.5822e+01 -5.2907e+01 -6.2556e+01 -5.1798e+01 -5.5867e+01 -5.2887e+01 -6.2533e+01 -5.1780e+01 -5.5910e+01 -5.2868e+01 -6.2510e+01 -5.1762e+01 -5.5953e+01 -5.2848e+01 -6.2487e+01 -5.1744e+01 -5.5991e+01 -5.2829e+01 -6.2464e+01 -5.1727e+01 -5.6024e+01 -5.2811e+01 -6.2440e+01 -5.1710e+01 -5.6057e+01 -5.2792e+01 -6.2417e+01 -5.1693e+01 -5.6088e+01 -5.2774e+01 -6.2393e+01 -5.1677e+01 -5.6119e+01 -5.2756e+01 -6.2369e+01 -5.1661e+01 -5.6150e+01 -5.2739e+01 -6.2344e+01 -5.1645e+01 -5.6179e+01 -5.2721e+01 -6.2320e+01 -5.1630e+01 -5.6208e+01 -5.2704e+01 -6.2296e+01 -5.1615e+01 -5.6237e+01 -5.2687e+01 -6.2271e+01 -5.1600e+01 -5.6265e+01 -5.2671e+01 -6.2246e+01 -5.1585e+01 -5.6292e+01 -5.2654e+01 -6.2221e+01 -5.1571e+01 -5.6318e+01 -5.2638e+01 -6.2196e+01 -5.1557e+01 -5.6336e+01 -5.2614e+01 -6.2170e+01 -5.1543e+01 -5.6354e+01 -5.2591e+01 -6.2145e+01 -5.1530e+01 -5.6371e+01 -5.2568e+01 -6.2119e+01 -5.1517e+01 -5.6387e+01 -5.2545e+01 -6.2093e+01 -5.1504e+01 -5.6404e+01 -5.2522e+01 -6.2067e+01 -5.1491e+01 -5.6419e+01 -5.2500e+01 -6.2041e+01 -5.1479e+01 -5.6435e+01 -5.2478e+01 -6.2014e+01 -5.1466e+01 -5.6449e+01 -5.2457e+01 -6.1988e+01 -5.1454e+01 -5.6464e+01 -5.2436e+01 -6.1961e+01 -5.1443e+01 -5.6478e+01 -5.2415e+01 -6.1934e+01 -5.1431e+01 -5.6492e+01 -5.2395e+01 -6.1907e+01 -5.1419e+01 -5.6505e+01 -5.2375e+01 -6.1880e+01 -5.1408e+01 -5.6518e+01 -5.2355e+01 -6.1852e+01 -5.1397e+01 -5.6530e+01 -5.2336e+01 -6.1825e+01 -5.1386e+01 -5.6534e+01 -5.2317e+01 -6.1797e+01 -5.1376e+01 -5.6538e+01 -5.2298e+01 -6.1770e+01 -5.1365e+01 -5.6542e+01 -5.2279e+01 -6.1742e+01 -5.1355e+01 -5.6545e+01 -5.2261e+01 -6.1714e+01 -5.1345e+01 -5.6549e+01 -5.2243e+01 -6.1681e+01 -5.1335e+01 -5.6552e+01 -5.2225e+01 -6.1645e+01 -5.1325e+01 -5.6554e+01 -5.2208e+01 -6.1609e+01 -5.1315e+01 -5.6557e+01 -5.2191e+01 -6.1573e+01 -5.1306e+01 -5.6559e+01 -5.2174e+01 -6.1537e+01 -5.1296e+01 -5.6562e+01 -5.2157e+01 -6.1501e+01 -5.1287e+01 -5.6564e+01 -5.2140e+01 -6.1465e+01 -5.1278e+01 -5.6565e+01 -5.2124e+01 -6.1429e+01 -5.1262e+01 -5.6567e+01 -5.2108e+01 -6.1393e+01 -5.1245e+01 -5.6568e+01 -5.2092e+01 -6.1357e+01 -5.1229e+01 -5.6569e+01 -5.2077e+01 -6.1322e+01 -5.1213e+01 -5.6570e+01 -5.2061e+01 -6.1286e+01 -5.1197e+01 -5.6571e+01 -5.2046e+01 -6.1250e+01 -5.1182e+01 -5.6571e+01 -5.2031e+01 -6.1215e+01 -5.1166e+01 -5.6572e+01 -5.2016e+01 -6.1179e+01 -5.1151e+01 -5.6566e+01 -5.2002e+01 -6.1144e+01 -5.1137e+01 -5.6558e+01 -5.1987e+01 -6.1108e+01 -5.1123e+01 -5.6550e+01 -5.1973e+01 -6.1073e+01 -5.1108e+01 -5.6542e+01 -5.1959e+01 -6.1037e+01 -5.1095e+01 -5.6533e+01 -5.1945e+01 -6.1002e+01 -5.1081e+01 -5.6525e+01 -5.1931e+01 -6.0967e+01 -5.1066e+01 -5.6517e+01 -5.1918e+01 -6.0931e+01 -5.1045e+01 -5.6509e+01 -5.1904e+01 -6.0929e+01 -5.1025e+01 -5.6501e+01 -5.1891e+01 -6.0938e+01 -5.1004e+01 -5.6492e+01 -5.1878e+01 -6.0946e+01 -5.0985e+01 -5.6484e+01 -5.1865e+01 -6.0954e+01 -5.0965e+01 -5.6476e+01 -5.1852e+01 -6.0961e+01 -5.0946e+01 -5.6467e+01 -5.1840e+01 -6.0967e+01 -5.0928e+01 -5.6459e+01 -5.1827e+01 -6.0973e+01 -5.0910e+01 -5.6443e+01 -5.1815e+01 -6.0979e+01 -5.0892e+01 -5.6426e+01 -5.1803e+01 -6.0983e+01 -5.0874e+01 -5.6410e+01 -5.1791e+01 -6.0987e+01 -5.0857e+01 -5.6394e+01 -5.1779e+01 -6.0991e+01 -5.0840e+01 -5.6378e+01 -5.1767e+01 -6.0994e+01 -5.0824e+01 -5.6362e+01 -5.1755e+01 -6.0996e+01 -5.0808e+01 -5.6346e+01 -5.1743e+01 -6.0998e+01 -5.0792e+01 -5.6330e+01 -5.1732e+01 -6.1000e+01 -5.0776e+01 -5.6314e+01 -5.1721e+01 -6.1000e+01 -5.0761e+01 -5.6299e+01 -5.1709e+01 -6.1001e+01 -5.0746e+01 -5.6283e+01 -5.1698e+01 -6.1000e+01 -5.0732e+01 -5.6268e+01 -5.1687e+01 -6.1000e+01 -5.0717e+01 -5.6253e+01 -5.1676e+01 -6.0998e+01 -5.0703e+01 -5.6237e+01 -5.1665e+01 -6.0996e+01 -5.0690e+01 -5.6222e+01 -5.1654e+01 -6.0994e+01 -5.0676e+01 -5.6207e+01 -5.1644e+01 -6.0991e+01 -5.0663e+01 -5.6192e+01 -5.1627e+01 -6.0988e+01 -5.0650e+01 -5.6177e+01 -5.1609e+01 -6.0984e+01 -5.0636e+01 -5.6162e+01 -5.1591e+01 -6.0980e+01 -5.0616e+01 -5.6147e+01 -5.1573e+01 -6.0975e+01 -5.0596e+01 -5.6132e+01 -5.1555e+01 -6.0970e+01 -5.0576e+01 -5.6118e+01 -5.1538e+01 -6.0964e+01 -5.0557e+01 -5.6103e+01 -5.1521e+01 -6.0958e+01 -5.0538e+01 -5.6088e+01 -5.1504e+01 -6.0952e+01 -5.0520e+01 -5.6073e+01 -5.1488e+01 -6.0945e+01 -5.0502e+01 -5.6059e+01 -5.1472e+01 -6.0937e+01 -5.0484e+01 -5.6044e+01 -5.1456e+01 -6.0929e+01 -5.0463e+01 -5.6029e+01 -5.1440e+01 -6.0921e+01 -5.0438e+01 -5.6015e+01 -5.1425e+01 -6.0912e+01 -5.0414e+01 -5.6000e+01 -5.1409e+01 -6.0903e+01 -5.0390e+01 -5.5986e+01 -5.1394e+01 -6.0894e+01 -5.0367e+01 -5.5971e+01 -5.1375e+01 -6.0884e+01 -5.0344e+01 -5.5957e+01 -5.1352e+01 -6.0874e+01 -5.0322e+01 -5.5942e+01 -5.1330e+01 -6.0863e+01 -5.0300e+01 -5.5927e+01 -5.1308e+01 -6.0852e+01 -5.0279e+01 -5.5913e+01 -5.1287e+01 -6.0840e+01 -5.0258e+01 -5.5898e+01 -5.1266e+01 -6.0828e+01 -5.0238e+01 -5.5884e+01 -5.1245e+01 -6.0816e+01 -5.0218e+01 -5.5869e+01 -5.1219e+01 -6.0804e+01 -5.0199e+01 -5.5855e+01 -5.1190e+01 -6.0791e+01 -5.0180e+01 -5.5840e+01 -5.1155e+01 -6.0777e+01 -5.0161e+01 -5.5826e+01 -5.1120e+01 -6.0764e+01 -5.0143e+01 -5.5811e+01 -5.1087e+01 -6.0750e+01 -5.0126e+01 -5.5797e+01 -5.1054e+01 -6.0735e+01 -5.0108e+01 -5.5782e+01 -5.1021e+01 -6.0721e+01 -5.0091e+01 -5.5767e+01 -5.0990e+01 -6.0706e+01 -5.0075e+01 -5.5753e+01 -5.0959e+01 -6.0690e+01 -5.0059e+01 -5.5738e+01 -5.0928e+01 -6.0675e+01 -5.0043e+01 -5.5724e+01 -5.0898e+01 -6.0659e+01 -5.0027e+01 -5.5709e+01 -5.0869e+01 -6.0643e+01 -5.0012e+01 -5.5694e+01 -5.0841e+01 -6.0626e+01 -1.0000e+01 -5.5680e+01 -5.0813e+01 -6.0609e+01 -6.0000e+01 -5.5665e+01 -5.0785e+01 -6.0592e+01 -6.0000e+01 -5.5650e+01 -5.0758e+01 -6.0575e+01 -6.0000e+01 -5.5636e+01 -5.0745e+01 -6.0557e+01 -6.0000e+01 -5.5621e+01 -5.0755e+01 -6.0539e+01 -6.0000e+01 -5.5606e+01 -5.0766e+01 -6.0521e+01 -6.0000e+01 -5.5591e+01 -5.0777e+01 -6.0502e+01 -6.0000e+01 -5.5574e+01 -5.0788e+01 -6.0524e+01 -6.0000e+01 -5.5551e+01 -5.0799e+01 -6.0549e+01 -6.0000e+01 -5.5528e+01 -5.0810e+01 -6.0573e+01 -6.0000e+01 -5.5506e+01 -5.0821e+01 -6.0596e+01 -6.0000e+01 -5.5484e+01 -5.0832e+01 -6.0618e+01 -6.0000e+01 -5.5461e+01 -5.0843e+01 -6.0640e+01 -6.0000e+01 -5.5439e+01 -5.0854e+01 -6.0660e+01 -6.0000e+01 -5.5418e+01 -5.0865e+01 -6.0680e+01 -6.0000e+01 -5.5396e+01 -5.0876e+01 -6.0699e+01 -6.0000e+01 -5.5371e+01 -5.0924e+01 -6.0717e+01 -6.0000e+01 -5.5342e+01 -5.0971e+01 -6.0734e+01 -6.0000e+01 -5.5313e+01 -5.1018e+01 -6.0750e+01 -6.0000e+01 -5.5284e+01 -5.1064e+01 -6.0766e+01 -6.0000e+01 -5.5256e+01 -5.1110e+01 -6.0780e+01 -6.0000e+01 -5.5228e+01 -5.1155e+01 -6.0794e+01 -6.0000e+01 -5.5200e+01 -5.1200e+01 -6.0807e+01 -6.0000e+01 -5.5173e+01 -5.1244e+01 -6.0820e+01 -6.0000e+01 -5.5145e+01 -5.1288e+01 -6.0831e+01 -6.0000e+01 -5.5119e+01 -5.1331e+01 -6.0842e+01 -6.0000e+01 -5.5092e+01 -5.1374e+01 -6.0853e+01 -6.0000e+01 -5.5066e+01 -5.1416e+01 -6.0862e+01 -6.0000e+01 -5.5040e+01 -5.1458e+01 -6.0871e+01 -6.0000e+01 -5.5014e+01 -5.1499e+01 -6.0879e+01 -6.0000e+01 -5.4988e+01 -5.1540e+01 -6.0886e+01 -6.0000e+01 -5.4963e+01 -5.1581e+01 -6.0893e+01 -6.0000e+01 -5.4938e+01 -5.1620e+01 -6.0899e+01 -6.0000e+01 -5.4913e+01 -5.1660e+01 -6.0904e+01 -6.0000e+01 -5.4888e+01 -5.1691e+01 -6.0909e+01 -6.0000e+01 -5.4864e+01 -5.1721e+01 -6.0955e+01 -6.0000e+01 -5.4840e+01 -5.1752e+01 -6.0996e+01 -6.0000e+01 -5.4816e+01 -5.1782e+01 -6.1035e+01 -6.0000e+01 -5.4792e+01 -5.1811e+01 -6.1072e+01 -6.0000e+01 -5.4768e+01 -5.1841e+01 -6.1108e+01 -6.0000e+01 -5.4737e+01 -5.1870e+01 -6.1143e+01 -6.0000e+01 -5.4706e+01 -5.1899e+01 -6.1177e+01 -6.0000e+01 -5.4675e+01 -5.1927e+01 -6.1210e+01 -6.0000e+01 -5.4645e+01 -5.1955e+01 -6.1242e+01 -6.0000e+01 -5.4615e+01 -5.1983e+01 -6.1273e+01 -6.0000e+01 -5.4586e+01 -5.2011e+01 -6.1303e+01 -6.0000e+01 -5.4557e+01 -5.2038e+01 -6.1332e+01 -6.0000e+01 -5.4528e+01 -5.2065e+01 -6.1361e+01 -6.0000e+01 -5.4500e+01 -5.2091e+01 -6.1388e+01 -6.0000e+01 -5.4463e+01 -5.2117e+01 -6.1414e+01 -5.9989e+01 -5.4428e+01 -5.2143e+01 -6.1439e+01 -5.9927e+01 -5.4393e+01 -5.2169e+01 -6.1463e+01 -5.9865e+01 -5.4358e+01 -5.2194e+01 -6.1487e+01 -5.9803e+01 -5.4324e+01 -5.2219e+01 -6.1509e+01 -5.9742e+01 -5.4291e+01 -5.2244e+01 -6.1531e+01 -5.9681e+01 -5.4258e+01 -5.2268e+01 -6.1552e+01 -5.9621e+01 -5.4225e+01 -5.2292e+01 -6.1572e+01 -5.9562e+01 -5.4193e+01 -5.2316e+01 -6.1591e+01 -5.9502e+01 -5.4161e+01 -5.2339e+01 -6.1609e+01 -5.9444e+01 -5.4130e+01 -5.2362e+01 -6.1626e+01 -5.9385e+01 -5.4099e+01 -5.2385e+01 -6.1643e+01 -5.9328e+01 -5.4068e+01 -5.2407e+01 -6.1659e+01 -5.9270e+01 -5.4038e+01 -5.2429e+01 -6.1673e+01 -5.9213e+01 -5.4009e+01 -5.2451e+01 -6.1688e+01 -5.9157e+01 -5.3979e+01 -5.2472e+01 -6.1701e+01 -5.9101e+01 -5.3950e+01 -5.2494e+01 -6.1713e+01 -5.9045e+01 -5.3922e+01 -5.2514e+01 -6.1725e+01 -5.8990e+01 -5.3894e+01 -5.2535e+01 -6.1736e+01 -5.8935e+01 -5.3866e+01 -5.2555e+01 -6.1746e+01 -5.8881e+01 -5.3838e+01 -5.2575e+01 -6.1747e+01 -5.8827e+01 -5.3811e+01 -5.2594e+01 -6.1748e+01 -5.8773e+01 -5.3784e+01 -5.2613e+01 -6.1749e+01 -5.8720e+01 -5.3758e+01 -5.2632e+01 -6.1749e+01 -5.8667e+01 -5.3732e+01 -5.2650e+01 -6.1748e+01 -5.8614e+01 -5.3706e+01 -5.2669e+01 -6.1747e+01 -5.8562e+01 -5.3680e+01 -5.2686e+01 -6.1746e+01 -5.8511e+01 -5.3655e+01 -5.2704e+01 -6.1744e+01 -5.8459e+01 -5.3630e+01 -5.2721e+01 -6.1741e+01 -5.8408e+01 -5.3605e+01 -5.2738e+01 -6.1738e+01 -5.8358e+01 -5.3581e+01 -5.2755e+01 -6.1735e+01 -5.8307e+01 -5.3581e+01 -5.2771e+01 -6.1731e+01 -5.8257e+01 -5.3601e+01 -5.2787e+01 -6.1726e+01 -5.8201e+01 -5.3621e+01 -5.2803e+01 -6.1721e+01 -5.8144e+01 -5.3641e+01 -5.2817e+01 -6.1716e+01 -5.8087e+01 -5.3659e+01 -5.2824e+01 -6.1710e+01 -5.8031e+01 -5.3670e+01 -5.2831e+01 -6.1704e+01 -5.7976e+01 -5.3681e+01 -5.2838e+01 -6.1697e+01 -5.7921e+01 -5.3691e+01 -5.2845e+01 -6.1690e+01 -5.7859e+01 -5.3702e+01 -5.2887e+01 -6.1683e+01 -5.7797e+01 -5.3712e+01 -5.2930e+01 -6.1675e+01 -5.7736e+01 -5.3722e+01 -5.2972e+01 -6.1666e+01 -5.7676e+01 -5.3732e+01 -5.3014e+01 -6.1657e+01 -5.7616e+01 -5.3741e+01 -5.3055e+01 -6.1648e+01 -5.7557e+01 -5.3751e+01 -5.3095e+01 -6.1639e+01 -5.7498e+01 -5.3760e+01 -5.3135e+01 -6.1628e+01 -5.7440e+01 -5.3769e+01 -5.3174e+01 -6.1618e+01 -5.7383e+01 -5.3777e+01 -5.3213e+01 -6.1607e+01 -5.7327e+01 -5.3786e+01 -5.3251e+01 -6.1596e+01 -5.7271e+01 -5.3794e+01 -5.3284e+01 -6.1584e+01 -5.7215e+01 -5.3802e+01 -5.3313e+01 -6.1572e+01 -5.7160e+01 -5.3810e+01 -5.3342e+01 -6.1560e+01 -5.7106e+01 -5.3818e+01 -5.3370e+01 -6.1547e+01 -5.7052e+01 -5.3825e+01 -5.3398e+01 -6.1534e+01 -5.6999e+01 -5.3833e+01 -5.3426e+01 -6.1520e+01 -5.6946e+01 -5.3840e+01 -5.3453e+01 -6.1507e+01 -5.6894e+01 -5.3847e+01 -5.3480e+01 -6.1492e+01 -5.6843e+01 -5.3853e+01 -5.3507e+01 -6.1478e+01 -5.6792e+01 -5.3860e+01 -5.3531e+01 -6.1463e+01 -5.6741e+01 -5.3866e+01 -5.3549e+01 -6.1448e+01 -5.6691e+01 -5.3872e+01 -5.3567e+01 -6.1432e+01 -5.6642e+01 -5.3878e+01 -5.3584e+01 -6.1416e+01 -5.6593e+01 -5.3884e+01 -5.3601e+01 -6.1400e+01 -5.6544e+01 -5.3889e+01 -5.3618e+01 -6.1384e+01 -5.6496e+01 -5.3894e+01 -5.3635e+01 -6.1367e+01 -5.6443e+01 -5.3899e+01 -5.3652e+01 -6.1350e+01 -5.6388e+01 -5.3904e+01 -5.3669e+01 -6.1332e+01 -5.6333e+01 -5.3909e+01 -5.3685e+01 -6.1314e+01 -5.6279e+01 -5.3913e+01 -5.3701e+01 -6.1296e+01 -5.6226e+01 -5.3917e+01 -5.3717e+01 -6.1278e+01 -5.6174e+01 -5.3921e+01 -5.3733e+01 -6.1259e+01 -5.6122e+01 -5.3925e+01 -5.3748e+01 -6.1240e+01 -5.6071e+01 -5.3929e+01 -5.3763e+01 -6.1221e+01 -5.6020e+01 -5.3932e+01 -5.3778e+01 -6.1202e+01 -5.5970e+01 -5.3935e+01 -5.3793e+01 -6.1182e+01 -5.5920e+01 -5.3938e+01 -5.3808e+01 -6.1162e+01 -5.5871e+01 -5.3941e+01 -5.3822e+01 -6.1142e+01 -5.5823e+01 -5.3944e+01 -5.3835e+01 -6.1121e+01 -5.5775e+01 -5.3946e+01 -5.3840e+01 -6.1100e+01 -5.5728e+01 -5.3948e+01 -5.3846e+01 -6.1072e+01 -5.5681e+01 -5.3950e+01 -5.3852e+01 -6.1043e+01 -5.5634e+01 -5.3952e+01 -5.3858e+01 -6.1014e+01 -5.5589e+01 -5.3954e+01 -5.3864e+01 -6.0984e+01 -5.5543e+01 -5.3955e+01 -5.3869e+01 -6.0955e+01 -5.5499e+01 -5.3957e+01 -5.3875e+01 -6.0926e+01 -5.5454e+01 -5.3958e+01 -5.3872e+01 -6.0896e+01 -5.5410e+01 -5.3959e+01 -5.3870e+01 -6.0867e+01 -5.5367e+01 -5.3959e+01 -5.3868e+01 -6.0838e+01 -5.5324e+01 -5.3960e+01 -5.3866e+01 -6.0808e+01 -5.5281e+01 -5.3960e+01 -5.3864e+01 -6.0779e+01 -5.5233e+01 -5.3960e+01 -5.3862e+01 -6.0749e+01 -5.5183e+01 -5.3960e+01 -5.3860e+01 -6.0719e+01 -5.5134e+01 -5.3960e+01 -5.3858e+01 -6.0690e+01 -5.5086e+01 -5.3960e+01 -5.3857e+01 -6.0660e+01 -5.5039e+01 -5.3959e+01 -5.3855e+01 -6.0630e+01 -5.4992e+01 -5.3959e+01 -5.3854e+01 -6.0600e+01 -5.4945e+01 -5.3958e+01 -5.3852e+01 -6.0570e+01 -5.4899e+01 -5.3957e+01 -5.3851e+01 -6.0541e+01 -5.4854e+01 -5.3955e+01 -5.3849e+01 -6.0511e+01 -5.4809e+01 -5.3954e+01 -5.3848e+01 -6.0481e+01 -5.4760e+01 -5.3952e+01 -5.3847e+01 -6.0451e+01 -5.4708e+01 -5.3951e+01 -5.3846e+01 -6.0420e+01 -5.4658e+01 -5.3949e+01 -5.3844e+01 -6.0390e+01 -5.4607e+01 -5.3947e+01 -5.3843e+01 -6.0360e+01 -5.4558e+01 -5.3944e+01 -5.3842e+01 -6.0330e+01 -5.4509e+01 -5.3942e+01 -5.3841e+01 -6.0300e+01 -5.4461e+01 -5.3940e+01 -5.3839e+01 -6.0269e+01 -5.4414e+01 -5.3937e+01 -5.3838e+01 -6.0239e+01 -5.4367e+01 -5.3934e+01 -5.3837e+01 -6.0209e+01 -5.4321e+01 -5.3931e+01 -5.3836e+01 -6.0178e+01 -5.4276e+01 -5.3928e+01 -5.3835e+01 -6.0148e+01 -5.4231e+01 -5.3925e+01 -5.3833e+01 -6.0117e+01 -5.4187e+01 -5.3916e+01 -5.3832e+01 -6.0087e+01 -5.4143e+01 -5.3905e+01 -5.3831e+01 -6.0056e+01 -5.4100e+01 -5.3886e+01 -5.3829e+01 -6.0026e+01 -5.4057e+01 -5.3866e+01 -5.3828e+01 -5.9995e+01 -5.4015e+01 -5.3847e+01 -5.3827e+01 -5.9964e+01 -5.3974e+01 -5.3829e+01 -5.3861e+01 -5.9934e+01 -5.3930e+01 -5.3810e+01 -5.3896e+01 -5.9903e+01 -5.3882e+01 -5.3792e+01 -5.3930e+01 -5.9872e+01 -5.3835e+01 -5.3774e+01 -5.3963e+01 -5.9841e+01 -5.3788e+01 -5.3756e+01 -5.3997e+01 -5.9811e+01 -5.3742e+01 -5.3738e+01 -5.4029e+01 -5.9780e+01 -5.3696e+01 -5.3721e+01 -5.4061e+01 -5.9749e+01 -5.3652e+01 -5.3703e+01 -5.4093e+01 -5.9718e+01 -5.3607e+01 -5.3686e+01 -5.4124e+01 -5.9687e+01 -5.3564e+01 -5.3669e+01 -5.4155e+01 -5.9656e+01 -5.3521e+01 -5.3653e+01 -5.4185e+01 -5.9625e+01 -5.3479e+01 -5.3636e+01 -5.4215e+01 -5.9594e+01 -5.3437e+01 -5.3620e+01 -5.4244e+01 -5.9563e+01 -5.3396e+01 -5.3604e+01 -5.4273e+01 -5.9532e+01 -5.3356e+01 -5.3587e+01 -5.4299e+01 -5.9501e+01 -5.3316e+01 -5.3572e+01 -5.4319e+01 -5.9470e+01 -5.3277e+01 -5.3556e+01 -5.4338e+01 -5.9439e+01 -5.3238e+01 -5.3540e+01 -5.4374e+01 -5.9408e+01 -5.3200e+01 -5.3525e+01 -5.4429e+01 -5.9377e+01 -5.3162e+01 -5.3509e+01 -5.4484e+01 -5.9346e+01 -5.3125e+01 -5.3494e+01 -5.4537e+01 -5.9315e+01 -5.3086e+01 -5.3479e+01 -5.4583e+01 -5.9283e+01 -5.3037e+01 -5.3459e+01 -5.4627e+01 -5.9252e+01 -5.2986e+01 -5.3437e+01 -5.4671e+01 -5.9216e+01 -5.2936e+01 -5.3414e+01 -5.4715e+01 -5.9177e+01 -5.2886e+01 -5.3392e+01 -5.4750e+01 -5.9138e+01 -5.2838e+01 -5.3370e+01 -5.4785e+01 -5.9099e+01 -5.2790e+01 -5.3349e+01 -5.4819e+01 -5.9061e+01 -5.2743e+01 -5.3327e+01 -5.4853e+01 -5.9022e+01 -5.2697e+01 -5.3306e+01 -5.4886e+01 -5.8984e+01 -5.2651e+01 -5.3286e+01 -5.4919e+01 -5.8946e+01 -5.2607e+01 -5.3265e+01 -5.4951e+01 -5.8909e+01 -5.2563e+01 -5.3245e+01 -5.4983e+01 -5.8871e+01 -5.2520e+01 -5.3225e+01 -5.5015e+01 -5.8834e+01 -5.2478e+01 -5.3206e+01 -5.5046e+01 -5.8796e+01 -5.2436e+01 -5.3186e+01 -5.5077e+01 -5.8759e+01 -5.2395e+01 -5.3167e+01 -5.5108e+01 -5.8722e+01 -5.2355e+01 -5.3148e+01 -5.5138e+01 -5.8685e+01 -5.2315e+01 -5.3129e+01 -5.5168e+01 -5.8649e+01 -5.2276e+01 -5.3102e+01 -5.5197e+01 -5.8612e+01 -5.2238e+01 -5.3076e+01 -5.5226e+01 -5.8576e+01 -5.2200e+01 -5.3051e+01 -5.5254e+01 -5.8540e+01 -5.2163e+01 -5.3025e+01 -5.5282e+01 -5.8504e+01 -5.2127e+01 -5.3000e+01 -5.5310e+01 -5.8468e+01 -5.2091e+01 -5.2976e+01 -5.5337e+01 -5.8432e+01 -5.2055e+01 -5.2952e+01 -5.5364e+01 -5.8396e+01 -5.2021e+01 -5.2926e+01 -5.5390e+01 -5.8361e+01 -5.2013e+01 -5.2887e+01 -5.5416e+01 -5.8325e+01 -5.2015e+01 -5.2849e+01 -5.5442e+01 -5.8290e+01 -5.2018e+01 -5.2811e+01 -5.5467e+01 -5.8255e+01 -5.2021e+01 -5.2774e+01 -5.5492e+01 -5.8220e+01 -5.2024e+01 -5.2737e+01 -5.5516e+01 -5.8185e+01 -5.2027e+01 -5.2701e+01 -5.5540e+01 -5.8151e+01 -5.2030e+01 -5.2666e+01 -5.5563e+01 -5.8116e+01 -5.2032e+01 -5.2631e+01 -5.5586e+01 -5.8082e+01 -5.2027e+01 -5.2597e+01 -5.5609e+01 -5.8047e+01 -5.2022e+01 -5.2564e+01 -5.5631e+01 -5.8013e+01 -5.2018e+01 -5.2531e+01 -5.5653e+01 -5.7974e+01 -5.2014e+01 -5.2499e+01 -5.5674e+01 -5.7932e+01 -5.2010e+01 -5.2468e+01 -5.5695e+01 -5.7891e+01 -5.2006e+01 -5.2437e+01 -5.5715e+01 -5.7850e+01 -5.2003e+01 -5.2406e+01 -5.5735e+01 -5.7809e+01 -5.1999e+01 -5.2376e+01 -5.5755e+01 -5.7768e+01 -5.1996e+01 -5.2347e+01 -5.5774e+01 -5.7728e+01 -5.1993e+01 -5.2318e+01 -5.5793e+01 -5.7688e+01 -5.1990e+01 -5.2290e+01 -5.5811e+01 -5.7648e+01 -5.1987e+01 -5.2262e+01 -5.5829e+01 -5.7609e+01 -5.1985e+01 -5.2235e+01 -5.5847e+01 -5.7569e+01 -5.1998e+01 -5.2208e+01 -5.5864e+01 -5.7530e+01 -5.2040e+01 -5.2182e+01 -5.5881e+01 -5.7492e+01 -5.2081e+01 -5.2156e+01 -5.5897e+01 -5.7453e+01 -5.2122e+01 -5.2130e+01 -5.5906e+01 -5.7415e+01 -5.2163e+01 -5.2105e+01 -5.5914e+01 -5.7377e+01 -5.2203e+01 -5.2081e+01 -5.5921e+01 -5.7340e+01 -5.2242e+01 -5.2056e+01 -5.5929e+01 -5.7302e+01 -5.2281e+01 -5.2033e+01 -5.5936e+01 -5.7265e+01 -5.2320e+01 -5.2009e+01 -5.5942e+01 -5.7228e+01 -5.2357e+01 -5.1986e+01 -5.5949e+01 -5.7192e+01 -5.2395e+01 -5.1964e+01 -5.5955e+01 -5.7155e+01 -5.2432e+01 -5.1941e+01 -5.5961e+01 -5.7119e+01 -5.2468e+01 -5.1920e+01 -5.5967e+01 -5.7075e+01 -5.2504e+01 -5.1898e+01 -5.5973e+01 -5.7032e+01 -5.2539e+01 -5.1877e+01 -5.5979e+01 -5.6988e+01 -5.2574e+01 -5.1856e+01 -5.5984e+01 -5.6946e+01 -5.2608e+01 -5.1836e+01 -5.5989e+01 -5.6903e+01 -5.2641e+01 -5.1816e+01 -5.5994e+01 -5.6904e+01 -5.2675e+01 -5.1796e+01 -5.5998e+01 -5.6906e+01 -5.2707e+01 -5.1776e+01 -5.6003e+01 -5.6909e+01 -5.2739e+01 -5.1757e+01 -5.6007e+01 -5.6910e+01 -5.2764e+01 -5.1734e+01 -5.6011e+01 -5.6906e+01 -5.2788e+01 -5.1702e+01 -5.6014e+01 -5.6912e+01 -5.2811e+01 -5.1668e+01 -5.6018e+01 -5.6941e+01 -5.2832e+01 -5.1627e+01 -5.6021e+01 -5.6971e+01 -5.2846e+01 -5.1586e+01 -5.6024e+01 -5.6999e+01 -5.2861e+01 -5.1547e+01 -5.6025e+01 -5.7019e+01 -5.2875e+01 -5.1508e+01 -5.6012e+01 -5.7039e+01 -5.2885e+01 -5.1470e+01 -5.5999e+01 -5.7058e+01 -5.2891e+01 -5.1433e+01 -5.5985e+01 -5.7077e+01 -5.2898e+01 -5.1397e+01 -5.5972e+01 -5.7096e+01 -5.2904e+01 -5.1361e+01 -5.5960e+01 -5.7115e+01 -5.2907e+01 -5.1326e+01 -5.5947e+01 -5.7133e+01 -5.2905e+01 -5.1292e+01 -5.5934e+01 -5.7151e+01 -5.2904e+01 -5.1259e+01 -5.5922e+01 -5.7168e+01 -5.2902e+01 -5.1226e+01 -5.5910e+01 -5.7185e+01 -5.2902e+01 -5.1194e+01 -5.5898e+01 -5.7202e+01 -5.2901e+01 -5.1163e+01 -5.5882e+01 -5.7214e+01 -5.2900e+01 -5.1132e+01 -5.5862e+01 -5.7222e+01 -5.2900e+01 -5.1102e+01 -5.5843e+01 -5.7229e+01 -5.2900e+01 -5.1072e+01 -5.5823e+01 -5.7237e+01 -5.2895e+01 -5.1041e+01 -5.5804e+01 -5.7245e+01 -5.2888e+01 -5.1005e+01 -5.5786e+01 -5.7252e+01 -5.2880e+01 -5.0969e+01 -5.5767e+01 -5.7259e+01 -5.2873e+01 -5.0934e+01 -5.5749e+01 -5.7266e+01 -5.2866e+01 -5.0901e+01 -5.5730e+01 -5.7273e+01 -5.2860e+01 -5.0867e+01 -5.5713e+01 -5.7279e+01 -5.2854e+01 -5.0835e+01 -5.5695e+01 -5.7285e+01 -5.2848e+01 -5.0803e+01 -5.5677e+01 -5.7291e+01 -5.2842e+01 -5.0772e+01 -5.5660e+01 -5.7297e+01 -5.2837e+01 -5.0741e+01 -5.5643e+01 -5.7303e+01 -5.2831e+01 -5.0711e+01 -5.5624e+01 -5.7308e+01 -5.2826e+01 -5.0682e+01 -5.5636e+01 -5.7314e+01 -5.2822e+01 -5.0654e+01 -5.5648e+01 -5.7319e+01 -5.2817e+01 -5.0626e+01 -5.5660e+01 -5.7323e+01 -5.2813e+01 -5.0598e+01 -5.5671e+01 -5.7328e+01 -5.2809e+01 -5.0572e+01 -5.5683e+01 -5.7332e+01 -5.2805e+01 -5.0545e+01 -5.5693e+01 -5.7336e+01 -5.2801e+01 -5.0520e+01 -5.5696e+01 -5.7340e+01 -5.2795e+01 -5.0495e+01 -5.5699e+01 -5.7344e+01 -5.2783e+01 -5.0470e+01 -5.5703e+01 -5.7347e+01 -5.2772e+01 -5.0446e+01 -5.5706e+01 -5.7350e+01 -5.2762e+01 -5.0423e+01 -5.5710e+01 -5.7353e+01 -5.2752e+01 -5.0400e+01 -5.5713e+01 -5.7348e+01 -5.2742e+01 -5.0377e+01 -5.5717e+01 -5.7343e+01 -5.2732e+01 -5.0351e+01 -5.5721e+01 -5.7338e+01 -5.2722e+01 -5.0322e+01 -5.5724e+01 -5.7332e+01 -5.2713e+01 -5.0293e+01 -5.5728e+01 -5.7327e+01 -5.2704e+01 -5.0265e+01 -5.5731e+01 -5.7321e+01 -5.2696e+01 -5.0237e+01 -5.5735e+01 -5.7315e+01 -5.2687e+01 -5.0211e+01 -5.5738e+01 -5.7310e+01 -5.2679e+01 -5.0184e+01 -5.5742e+01 -5.7304e+01 -5.2671e+01 -5.0159e+01 -5.5745e+01 -5.7298e+01 -5.2664e+01 -5.0133e+01 -5.5748e+01 -5.7292e+01 -5.2656e+01 -5.0109e+01 -5.5752e+01 -5.7286e+01 -5.2649e+01 -5.0080e+01 -5.5755e+01 -5.7280e+01 -5.2642e+01 -5.0049e+01 -5.5758e+01 -5.7273e+01 -5.2635e+01 -5.0018e+01 -5.5761e+01 -5.7267e+01 -5.2629e+01 -1.0000e+01 -5.5764e+01 -5.7261e+01 -5.2622e+01 -6.0000e+01 -5.5767e+01 -5.7254e+01 -5.2616e+01 -6.0000e+01 -5.5770e+01 -5.7248e+01 -5.2610e+01 -6.0000e+01 -5.5772e+01 -5.7241e+01 -5.2604e+01 -6.0000e+01 -5.5775e+01 -5.7234e+01 -5.2598e+01 -6.0000e+01 -5.5777e+01 -5.7254e+01 -5.2592e+01 -6.0000e+01 -5.5780e+01 -5.7283e+01 -5.2587e+01 -6.0000e+01 -5.5782e+01 -5.7312e+01 -5.2581e+01 -6.0000e+01 -5.5784e+01 -5.7340e+01 -5.2576e+01 -6.0000e+01 -5.5786e+01 -5.7367e+01 -5.2571e+01 -6.0000e+01 -5.5824e+01 -5.7394e+01 -5.2566e+01 -6.0000e+01 -5.5862e+01 -5.7421e+01 -5.2561e+01 -6.0000e+01 -5.5900e+01 -5.7447e+01 -5.2556e+01 -6.0000e+01 -5.5948e+01 -5.7472e+01 -5.2551e+01 -6.0000e+01 -5.6021e+01 -5.7497e+01 -5.2546e+01 -6.0000e+01 -5.6093e+01 -5.7521e+01 -5.2542e+01 -6.0000e+01 -5.6163e+01 -5.7544e+01 -5.2537e+01 -6.0000e+01 -5.6233e+01 -5.7567e+01 -5.2533e+01 -6.0000e+01 -5.6302e+01 -5.7590e+01 -5.2528e+01 -6.0000e+01 -5.6369e+01 -5.7612e+01 -5.2524e+01 -6.0000e+01 -5.6436e+01 -5.7633e+01 -5.2520e+01 -6.0000e+01 -5.6501e+01 -5.7654e+01 -5.2515e+01 -6.0000e+01 -5.6565e+01 -5.7674e+01 -5.2511e+01 -6.0000e+01 -5.6629e+01 -5.7694e+01 -5.2507e+01 -6.0000e+01 -5.6691e+01 -5.7713e+01 -5.2503e+01 -6.0000e+01 -5.6753e+01 -5.7732e+01 -5.2499e+01 -6.0000e+01 -5.6813e+01 -5.7750e+01 -5.2495e+01 -6.0000e+01 -5.6872e+01 -5.7768e+01 -5.2491e+01 -6.0000e+01 -5.6931e+01 -5.7785e+01 -5.2487e+01 -6.0000e+01 -5.6988e+01 -5.7802e+01 -5.2483e+01 -6.0000e+01 -5.7045e+01 -5.7818e+01 -5.2480e+01 -6.0000e+01 -5.7100e+01 -5.7833e+01 -5.2476e+01 -6.0000e+01 -5.7155e+01 -5.7848e+01 -5.2471e+01 -6.0000e+01 -5.7208e+01 -5.7863e+01 -5.2459e+01 -6.0000e+01 -5.7261e+01 -5.7877e+01 -5.2447e+01 -6.0000e+01 -5.7313e+01 -5.7891e+01 -5.2436e+01 -6.0000e+01 -5.7363e+01 -5.7904e+01 -5.2425e+01 -6.0000e+01 -5.7413e+01 -5.7916e+01 -5.2414e+01 -6.0000e+01 -5.7462e+01 -5.7928e+01 -5.2403e+01 -6.0000e+01 -5.7510e+01 -5.7940e+01 -5.2393e+01 -6.0000e+01 -5.7557e+01 -5.7951e+01 -5.2382e+01 -6.0000e+01 -5.7603e+01 -5.7962e+01 -5.2372e+01 -6.0000e+01 -5.7648e+01 -5.7972e+01 -5.2362e+01 -6.0000e+01 -5.7693e+01 -5.7982e+01 -5.2352e+01 -6.0000e+01 -5.7736e+01 -5.7991e+01 -5.2342e+01 -6.0000e+01 -5.7779e+01 -5.8000e+01 -5.2333e+01 -6.0000e+01 -5.7821e+01 -5.8009e+01 -5.2323e+01 -6.0000e+01 -5.7861e+01 -5.8017e+01 -5.2314e+01 -6.0000e+01 -5.7901e+01 -5.8024e+01 -5.2304e+01 -6.0000e+01 -5.7941e+01 -5.8031e+01 -5.2295e+01 -5.9967e+01 -5.7979e+01 -5.8038e+01 -5.2286e+01 -5.9883e+01 -5.8016e+01 -5.8044e+01 -5.2278e+01 -5.9800e+01 -5.8053e+01 -5.8050e+01 -5.2269e+01 -5.9718e+01 -5.8089e+01 -5.8055e+01 -5.2260e+01 -5.9637e+01 -5.8124e+01 -5.8060e+01 -5.2252e+01 -5.9557e+01 -5.8158e+01 -5.8064e+01 -5.2243e+01 -5.9478e+01 -5.8192e+01 -5.8068e+01 -5.2235e+01 -5.9399e+01 -5.8224e+01 -5.8072e+01 -5.2227e+01 -5.9322e+01 -5.8256e+01 -5.8075e+01 -5.2219e+01 -5.9246e+01 -5.8287e+01 -5.8078e+01 -5.2211e+01 -5.9171e+01 -5.8318e+01 -5.8081e+01 -5.2203e+01 -5.9096e+01 -5.8347e+01 -5.8083e+01 -5.2195e+01 -5.9022e+01 -5.8376e+01 -5.8084e+01 -5.2187e+01 -5.8941e+01 -5.8404e+01 -5.8083e+01 -5.2177e+01 -5.8861e+01 -5.8431e+01 -5.8076e+01 -5.2162e+01 -5.8783e+01 -5.8458e+01 -5.8069e+01 -5.2146e+01 -5.8705e+01 -5.8484e+01 -5.8062e+01 -5.2131e+01 -5.8628e+01 -5.8509e+01 -5.8054e+01 -5.2116e+01 -5.8553e+01 -5.8533e+01 -5.8046e+01 -5.2102e+01 -5.8478e+01 -5.8557e+01 -5.8038e+01 -5.2087e+01 -5.8404e+01 -5.8580e+01 -5.8030e+01 -5.2073e+01 -5.8331e+01 -5.8602e+01 -5.8022e+01 -5.2060e+01 -5.8259e+01 -5.8624e+01 -5.8013e+01 -5.2046e+01 -5.8188e+01 -5.8644e+01 -5.8005e+01 -5.2032e+01 -5.8118e+01 -5.8665e+01 -5.7996e+01 -5.2019e+01 -5.8049e+01 -5.8684e+01 -5.7979e+01 -5.2006e+01 -5.7980e+01 -5.8703e+01 -5.8004e+01 -5.1986e+01 -5.7913e+01 -5.8721e+01 -5.8031e+01 -5.1965e+01 -5.7846e+01 -5.8739e+01 -5.8057e+01 -5.1945e+01 -5.7780e+01 -5.8749e+01 -5.8083e+01 -5.1926e+01 -5.7715e+01 -5.8758e+01 -5.8108e+01 -5.1906e+01 -5.7650e+01 -5.8766e+01 -5.8133e+01 -5.1887e+01 -5.7586e+01 -5.8773e+01 -5.8156e+01 -5.1869e+01 -5.7523e+01 -5.8781e+01 -5.8180e+01 -5.1850e+01 -5.7461e+01 -5.8787e+01 -5.8202e+01 -5.1832e+01 -5.7400e+01 -5.8794e+01 -5.8224e+01 -5.1815e+01 -5.7339e+01 -5.8793e+01 -5.8245e+01 -5.1797e+01 -5.7274e+01 -5.8791e+01 -5.8266e+01 -5.1780e+01 -5.7206e+01 -5.8788e+01 -5.8286e+01 -5.1764e+01 -5.7136e+01 -5.8786e+01 -5.8306e+01 -5.1747e+01 -5.7063e+01 -5.8783e+01 -5.8325e+01 -5.1731e+01 -5.6990e+01 -5.8779e+01 -5.8343e+01 -5.1715e+01 -5.6919e+01 -5.8776e+01 -5.8361e+01 -5.1700e+01 -5.6849e+01 -5.8772e+01 -5.8378e+01 -5.1684e+01 -5.6779e+01 -5.8768e+01 -5.8395e+01 -5.1669e+01 -5.6711e+01 -5.8764e+01 -5.8411e+01 -5.1654e+01 -5.6643e+01 -5.8760e+01 -5.8426e+01 -5.1640e+01 -5.6577e+01 -5.8755e+01 -5.8441e+01 -5.1626e+01 -5.6511e+01 -5.8751e+01 -5.8455e+01 -5.1611e+01 -5.6446e+01 -5.8745e+01 -5.8469e+01 -5.1598e+01 -5.6383e+01 -5.8740e+01 -5.8482e+01 -5.1584e+01 -5.6320e+01 -5.8735e+01 -5.8495e+01 -5.1571e+01 -5.6258e+01 -5.8729e+01 -5.8507e+01 -5.1557e+01 -5.6196e+01 -5.8723e+01 -5.8519e+01 -5.1544e+01 -5.6136e+01 -5.8717e+01 -5.8530e+01 -5.1531e+01 -5.6076e+01 -5.8711e+01 -5.8541e+01 -5.1519e+01 -5.6017e+01 -5.8704e+01 -5.8551e+01 -5.1506e+01 -5.5959e+01 -5.8697e+01 -5.8560e+01 -5.1494e+01 -5.5902e+01 -5.8690e+01 -5.8569e+01 -5.1482e+01 -5.5845e+01 -5.8683e+01 -5.8578e+01 -5.1470e+01 -5.5789e+01 -5.8675e+01 -5.8586e+01 -5.1458e+01 -5.5728e+01 -5.8668e+01 -5.8594e+01 -5.1447e+01 -5.5666e+01 -5.8660e+01 -5.8601e+01 -5.1436e+01 -5.5605e+01 -5.8651e+01 -5.8601e+01 -5.1424e+01 -5.5544e+01 -5.8643e+01 -5.8600e+01 -5.1420e+01 -5.5485e+01 -5.8634e+01 -5.8598e+01 -5.1453e+01 -5.5426e+01 -5.8626e+01 -5.8595e+01 -5.1486e+01 -5.5368e+01 -5.8617e+01 -5.8593e+01 -5.1517e+01 -5.5311e+01 -5.8607e+01 -5.8590e+01 -5.1541e+01 -5.5255e+01 -5.8598e+01 -5.8587e+01 -5.1565e+01 -5.5199e+01 -5.8600e+01 -5.8584e+01 -5.1589e+01 -5.5144e+01 -5.8626e+01 -5.8580e+01 -5.1612e+01 -5.5086e+01 -5.8652e+01 -5.8576e+01 -5.1635e+01 -5.5025e+01 -5.8678e+01 -5.8572e+01 -5.1657e+01 -5.4965e+01 -5.8702e+01 -5.8567e+01 -5.1680e+01 -5.4906e+01 -5.8726e+01 -5.8563e+01 -5.1702e+01 -5.4847e+01 -5.8749e+01 -5.8558e+01 -5.1723e+01 -5.4790e+01 -5.8772e+01 -5.8552e+01 -5.1745e+01 -5.4732e+01 -5.8794e+01 -5.8547e+01 -5.1766e+01 -5.4668e+01 -5.8815e+01 -5.8541e+01 -5.1787e+01 -5.4606e+01 -5.8836e+01 -5.8535e+01 -5.1807e+01 -5.4544e+01 -5.8856e+01 -5.8529e+01 -5.1827e+01 -5.4483e+01 -5.8875e+01 -5.8522e+01 -5.1847e+01 -5.4424e+01 -5.8894e+01 -5.8516e+01 -5.1867e+01 -5.4365e+01 -5.8912e+01 -5.8509e+01 -5.1886e+01 -5.4307e+01 -5.8930e+01 -5.8501e+01 -5.1905e+01 -5.4250e+01 -5.8947e+01 -5.8494e+01 -5.1924e+01 -5.4194e+01 -5.8963e+01 -5.8486e+01 -5.1942e+01 -5.4139e+01 -5.8979e+01 -5.8478e+01 -5.1960e+01 -5.4084e+01 -5.8994e+01 -5.8470e+01 -5.1978e+01 -5.4031e+01 -5.9009e+01 -5.8461e+01 -5.1995e+01 -5.3978e+01 -5.9023e+01 -5.8485e+01 -5.2046e+01 -5.3927e+01 -5.9036e+01 -5.8521e+01 -5.2107e+01 -5.3876e+01 -5.9076e+01 -5.8588e+01 -5.2167e+01 -5.3825e+01 -5.9125e+01 -5.8665e+01 -5.2226e+01 -5.3776e+01 -5.9173e+01 -5.8741e+01 -5.2284e+01 -5.3727e+01 -5.9219e+01 -5.8816e+01 -5.2341e+01 -5.3679e+01 -5.9265e+01 -5.8889e+01 -5.2398e+01 -5.3632e+01 -5.9309e+01 -5.8960e+01 -5.2453e+01 -5.3586e+01 -5.9353e+01 -5.9030e+01 -5.2508e+01 -5.3540e+01 -5.9395e+01 -5.9099e+01 -5.2561e+01 -5.3495e+01 -5.9437e+01 -5.9166e+01 -5.2614e+01 -5.3451e+01 -5.9478e+01 -5.9232e+01 -5.2663e+01 -5.3407e+01 -5.9518e+01 -5.9296e+01 -5.2706e+01 -5.3364e+01 -5.9556e+01 -5.9359e+01 -5.2749e+01 -5.3322e+01 -5.9594e+01 -5.9421e+01 -5.2790e+01 -5.3280e+01 -5.9631e+01 -5.9481e+01 -5.2832e+01 -5.3239e+01 -5.9667e+01 -5.9540e+01 -5.2872e+01 -5.3198e+01 -5.9702e+01 -5.9597e+01 -5.2912e+01 -5.3156e+01 -5.9736e+01 -5.9653e+01 -5.2951e+01 -5.3109e+01 -5.9770e+01 -5.9708e+01 -5.2990e+01 -5.3061e+01 -5.9802e+01 -5.9762e+01 -5.3028e+01 -5.3007e+01 -5.9834e+01 -5.9814e+01 -5.3065e+01 -5.2955e+01 -5.9864e+01 -5.9866e+01 -5.3102e+01 -5.2903e+01 -5.9894e+01 -5.9915e+01 -5.3138e+01 -5.2852e+01 -5.9923e+01 -5.9964e+01 -5.3174e+01 -5.2802e+01 -5.9951e+01 -6.0012e+01 -5.3208e+01 -5.2752e+01 -5.9978e+01 -6.0058e+01 -5.3243e+01 -5.2696e+01 -6.0005e+01 -6.0103e+01 -5.3276e+01 -5.2640e+01 -6.0031e+01 -6.0147e+01 -5.3310e+01 -5.2586e+01 -6.0055e+01 -6.0190e+01 -5.3342e+01 -5.2533e+01 -6.0079e+01 -6.0231e+01 -5.3374e+01 -5.2480e+01 -6.0103e+01 -6.0272e+01 -5.3405e+01 -5.2429e+01 -6.0125e+01 -6.0311e+01 -5.3436e+01 -5.2379e+01 -6.0147e+01 -6.0350e+01 -5.3466e+01 -5.2329e+01 -6.0168e+01 -6.0387e+01 -5.3496e+01 -5.2281e+01 -6.0188e+01 -6.0423e+01 -5.3525e+01 -5.2233e+01 -6.0207e+01 -6.0459e+01 -5.3554e+01 -5.2186e+01 -6.0226e+01 -6.0538e+01 -5.3582e+01 -5.2140e+01 -6.0239e+01 -6.0615e+01 -5.3609e+01 -5.2095e+01 -6.0249e+01 -6.0690e+01 -5.3636e+01 -5.2051e+01 -6.0257e+01 -6.0764e+01 -5.3663e+01 -5.2007e+01 -6.0266e+01 -6.0836e+01 -5.3688e+01 -5.1964e+01 -6.0273e+01 -6.0906e+01 -5.3714e+01 -5.1922e+01 -6.0281e+01 -6.0975e+01 -5.3746e+01 -5.1919e+01 -6.0288e+01 -6.1042e+01 -5.3815e+01 -5.1922e+01 -6.0294e+01 -6.1108e+01 -5.3883e+01 -5.1926e+01 -6.0300e+01 -6.1172e+01 -5.3949e+01 -5.1930e+01 -6.0305e+01 -6.1235e+01 -5.4015e+01 -5.1934e+01 -6.0310e+01 -6.1296e+01 -5.4079e+01 -5.1938e+01 -6.0314e+01 -6.1356e+01 -5.4142e+01 -5.1941e+01 -6.0318e+01 -6.1414e+01 -5.4204e+01 -5.1945e+01 -6.0321e+01 -6.1471e+01 -5.4265e+01 -5.1949e+01 -6.0324e+01 -6.1526e+01 -5.4325e+01 -5.1953e+01 -6.0326e+01 -6.1580e+01 -5.4383e+01 -5.1957e+01 -6.0328e+01 -6.1633e+01 -5.4441e+01 -5.1961e+01 -6.0330e+01 -6.1684e+01 -5.4498e+01 -5.1965e+01 -6.0331e+01 -6.1734e+01 -5.4553e+01 -5.1969e+01 -6.0331e+01 -6.1782e+01 -5.4608e+01 -5.1973e+01 -6.0331e+01 -6.1829e+01 -5.4661e+01 -5.1977e+01 -6.0331e+01 -6.1875e+01 -5.4714e+01 -5.1982e+01 -6.0330e+01 -6.1920e+01 -5.4765e+01 -5.1986e+01 -6.0329e+01 -6.1963e+01 -5.4815e+01 -5.1990e+01 -6.0328e+01 -6.2005e+01 -5.4858e+01 -5.1994e+01 -6.0325e+01 -6.2046e+01 -5.4898e+01 -5.1998e+01 -6.0323e+01 -6.2085e+01 -5.4938e+01 -5.2001e+01 -6.0320e+01 -6.2124e+01 -5.4978e+01 -5.2005e+01 -6.0317e+01 -6.2161e+01 -5.5016e+01 -5.2009e+01 -6.0313e+01 -6.2197e+01 -5.5054e+01 -5.2013e+01 -6.0309e+01 -6.2229e+01 -5.5091e+01 -5.2017e+01 -6.0304e+01 -6.2255e+01 -5.5127e+01 -5.2021e+01 -6.0299e+01 -6.2279e+01 -5.5163e+01 -5.2024e+01 -6.0294e+01 -6.2303e+01 -5.5197e+01 -5.2028e+01 -6.0288e+01 -6.2326e+01 -5.5231e+01 -5.2032e+01 -6.0282e+01 -6.2348e+01 -5.5265e+01 -5.2035e+01 -6.0276e+01 -6.2369e+01 -5.5298e+01 -5.2039e+01 -6.0269e+01 -6.2390e+01 -5.5330e+01 -5.2042e+01 -6.0262e+01 -6.2409e+01 -5.5361e+01 -5.2046e+01 -6.0254e+01 -6.2427e+01 -5.5392e+01 -5.2049e+01 -6.0246e+01 -6.2445e+01 -5.5422e+01 -5.2052e+01 -6.0238e+01 -6.2462e+01 -5.5451e+01 -5.2055e+01 -6.0227e+01 -6.2478e+01 -5.5480e+01 -5.2059e+01 -6.0210e+01 -6.2493e+01 -5.5508e+01 -5.2062e+01 -6.0193e+01 -6.2508e+01 -5.5535e+01 -5.2065e+01 -6.0176e+01 -6.2521e+01 -5.5562e+01 -5.2068e+01 -6.0158e+01 -6.2534e+01 -5.5588e+01 -5.2070e+01 -6.0141e+01 -6.2546e+01 -5.5613e+01 -5.2094e+01 -6.0123e+01 -6.2557e+01 -5.5638e+01 -5.2141e+01 -6.0105e+01 -6.2567e+01 -5.5662e+01 -5.2188e+01 -6.0087e+01 -6.2577e+01 -5.5686e+01 -5.2233e+01 -6.0069e+01 -6.2586e+01 -5.5709e+01 -5.2278e+01 -6.0051e+01 -6.2594e+01 -5.5731e+01 -5.2322e+01 -6.0032e+01 -6.2602e+01 -5.5753e+01 -5.2359e+01 -6.0014e+01 -6.2608e+01 -5.5775e+01 -5.2394e+01 -5.9995e+01 -6.2614e+01 -5.5795e+01 -5.2424e+01 -5.9976e+01 -6.2620e+01 -5.5815e+01 -5.2450e+01 -5.9957e+01 -6.2624e+01 -5.5835e+01 -5.2476e+01 -5.9938e+01 -6.2628e+01 -5.5854e+01 -5.2501e+01 -5.9919e+01 -6.2632e+01 -5.5872e+01 -5.2526e+01 -5.9899e+01 -6.2634e+01 -5.5890e+01 -5.2551e+01 -5.9880e+01 -6.2636e+01 -5.5908e+01 -5.2575e+01 -5.9860e+01 -6.2638e+01 -5.5923e+01 -5.2599e+01 -5.9840e+01 -6.2638e+01 -5.5931e+01 -5.2623e+01 -5.9820e+01 -6.2638e+01 -5.5936e+01 -5.2646e+01 -5.9792e+01 -6.2638e+01 -5.5936e+01 -5.2670e+01 -5.9764e+01 -6.2630e+01 -5.5936e+01 -5.2692e+01 -5.9736e+01 -6.2620e+01 -5.5935e+01 -5.2715e+01 -5.9708e+01 -6.2610e+01 -5.5935e+01 -5.2737e+01 -5.9680e+01 -6.2600e+01 -5.5934e+01 -5.2759e+01 -5.9652e+01 -6.2589e+01 -5.5933e+01 -5.2780e+01 -5.9624e+01 -6.2578e+01 -5.5932e+01 -5.2802e+01 -5.9596e+01 -6.2566e+01 -5.5931e+01 -5.2823e+01 -5.9569e+01 -6.2554e+01 -5.5929e+01 -5.2843e+01 -5.9541e+01 -6.2540e+01 -5.5928e+01 -5.2863e+01 -5.9513e+01 -6.2519e+01 -5.5926e+01 -5.2883e+01 -5.9486e+01 -6.2498e+01 -5.5925e+01 -5.2903e+01 -5.9458e+01 -6.2477e+01 -5.5923e+01 -5.2922e+01 -5.9430e+01 -6.2456e+01 -5.5921e+01 -5.2941e+01 -5.9403e+01 -6.2435e+01 -5.5919e+01 -5.2960e+01 -5.9375e+01 -6.2413e+01 -5.5916e+01 -5.2978e+01 -5.9348e+01 -6.2391e+01 -5.5914e+01 -5.2996e+01 -5.9320e+01 -6.2369e+01 -5.5911e+01 -5.3014e+01 -5.9293e+01 -6.2347e+01 -5.5909e+01 -5.3032e+01 -5.9266e+01 -6.2325e+01 -5.5906e+01 -5.3049e+01 -5.9238e+01 -6.2302e+01 -5.5903e+01 -5.3065e+01 -5.9211e+01 -6.2280e+01 -5.5899e+01 -5.3082e+01 -5.9183e+01 -6.2257e+01 -5.5896e+01 -5.3098e+01 -5.9156e+01 -6.2234e+01 -5.5892e+01 -5.3114e+01 -5.9129e+01 -6.2211e+01 -5.5889e+01 -5.3129e+01 -5.9101e+01 -6.2187e+01 -5.5885e+01 -5.3145e+01 -5.9074e+01 -6.2164e+01 -5.5881e+01 -5.3160e+01 -5.9047e+01 -6.2140e+01 -5.5877e+01 -5.3174e+01 -5.9020e+01 -6.2117e+01 -5.5873e+01 -5.3189e+01 -5.8992e+01 -6.2093e+01 -5.5868e+01 -5.3203e+01 -5.8965e+01 -6.2068e+01 -5.5863e+01 -5.3216e+01 -5.8938e+01 -6.2044e+01 -5.5859e+01 -5.3230e+01 -5.8911e+01 -6.2020e+01 -5.5854e+01 -5.3243e+01 -5.8883e+01 -6.1995e+01 -5.5849e+01 -5.3256e+01 -5.8856e+01 -6.1970e+01 -5.5844e+01 -5.3268e+01 -5.8829e+01 -6.1945e+01 -5.5838e+01 -5.3281e+01 -5.8802e+01 -6.1920e+01 -5.5833e+01 -5.3292e+01 -5.8775e+01 -6.1895e+01 -5.5827e+01 -5.3304e+01 -5.8747e+01 -6.1869e+01 -5.5821e+01 -5.3316e+01 -5.8720e+01 -6.1844e+01 -5.5815e+01 -5.3327e+01 -5.8693e+01 -6.1818e+01 -5.5809e+01 -5.3337e+01 -5.8666e+01 -6.1792e+01 -5.5803e+01 -5.3348e+01 -5.8639e+01 -6.1766e+01 -5.5796e+01 -5.3358e+01 -5.8611e+01 -6.1740e+01 -5.5787e+01 -5.3368e+01 -5.8584e+01 -6.1714e+01 -5.5772e+01 -5.3378e+01 -5.8557e+01 -6.1687e+01 -5.5757e+01 -5.3387e+01 -5.8530e+01 -6.1661e+01 -5.5743e+01 -5.3396e+01 -5.8503e+01 -6.1634e+01 -5.5728e+01 -5.3405e+01 -5.8476e+01 -6.1607e+01 -5.5714e+01 -5.3414e+01 -5.8448e+01 -6.1580e+01 -5.5700e+01 -5.3422e+01 -5.8421e+01 -6.1553e+01 -5.5685e+01 -5.3430e+01 -5.8394e+01 -6.1520e+01 -5.5671e+01 -5.3438e+01 -5.8382e+01 -6.1484e+01 -5.5656e+01 -5.3446e+01 -5.8391e+01 -6.1449e+01 -5.5642e+01 -5.3453e+01 -5.8400e+01 -6.1413e+01 -5.5628e+01 -5.3460e+01 -5.8408e+01 -6.1370e+01 -5.5614e+01 -5.3467e+01 -5.8416e+01 -6.1347e+01 -5.5599e+01 -5.3473e+01 -5.8419e+01 -6.1349e+01 -5.5585e+01 -5.3480e+01 -5.8417e+01 -6.1350e+01 -5.5571e+01 -5.3486e+01 -5.8407e+01 -6.1351e+01 -5.5557e+01 -5.3491e+01 -5.8398e+01 -6.1352e+01 -5.5542e+01 -5.3497e+01 -5.8389e+01 -6.1352e+01 -5.5528e+01 -5.3502e+01 -5.8380e+01 -6.1351e+01 -5.5514e+01 -5.3507e+01 -5.8371e+01 -6.1351e+01 -5.5498e+01 -5.3512e+01 -5.8361e+01 -6.1350e+01 -5.5475e+01 -5.3517e+01 -5.8352e+01 -6.1348e+01 -5.5453e+01 -5.3521e+01 -5.8342e+01 -6.1346e+01 -5.5432e+01 -5.3525e+01 -5.8333e+01 -6.1344e+01 -5.5410e+01 -5.3529e+01 -5.8323e+01 -6.1341e+01 -5.5389e+01 -5.3533e+01 -5.8313e+01 -6.1338e+01 -5.5368e+01 -5.3536e+01 -5.8304e+01 -6.1335e+01 -5.5347e+01 -5.3539e+01 -5.8294e+01 -6.1331e+01 -5.5326e+01 -5.3542e+01 -5.8284e+01 -6.1326e+01 -5.5305e+01 -5.3545e+01 -5.8273e+01 -6.1322e+01 -5.5285e+01 -5.3548e+01 -5.8263e+01 -6.1317e+01 -5.5263e+01 -5.3550e+01 -5.8253e+01 -6.1311e+01 -5.5234e+01 -5.3552e+01 -5.8242e+01 -6.1305e+01 -5.5207e+01 -5.3554e+01 -5.8232e+01 -6.1299e+01 -5.5179e+01 -5.3556e+01 -5.8221e+01 -6.1293e+01 -5.5152e+01 -5.3557e+01 -5.8211e+01 -6.1286e+01 -5.5125e+01 -5.3558e+01 -5.8200e+01 -6.1278e+01 -5.5099e+01 -5.3559e+01 -5.8189e+01 -6.1271e+01 -5.5072e+01 -5.3560e+01 -5.8178e+01 -6.1263e+01 -5.5046e+01 -5.3561e+01 -5.8166e+01 -6.1254e+01 -5.5021e+01 -5.3561e+01 -5.8155e+01 -6.1246e+01 -5.4989e+01 -5.3562e+01 -5.8144e+01 -6.1237e+01 -5.4956e+01 -5.3562e+01 -5.8132e+01 -6.1227e+01 -5.4924e+01 -5.3562e+01 -5.8120e+01 -6.1217e+01 -5.4892e+01 -5.3561e+01 -5.8109e+01 -6.1207e+01 -5.4860e+01 -5.3561e+01 -5.8097e+01 -6.1197e+01 -5.4829e+01 -5.3560e+01 -5.8085e+01 -6.1186e+01 -5.4798e+01 -5.3560e+01 -5.8073e+01 -6.1175e+01 -5.4768e+01 -5.3559e+01 -5.8060e+01 -6.1164e+01 -5.4738e+01 -5.3557e+01 -5.8048e+01 -6.1173e+01 -5.4708e+01 -5.3556e+01 -5.8035e+01 -6.1205e+01 -5.4679e+01 -5.3554e+01 -5.8023e+01 -6.1234e+01 -5.4651e+01 -5.3553e+01 -5.8010e+01 -6.1256e+01 -5.4622e+01 -5.3551e+01 -5.7997e+01 -6.1278e+01 -5.4594e+01 -5.3549e+01 -5.7984e+01 -6.1299e+01 -5.4562e+01 -5.3547e+01 -5.7971e+01 -6.1319e+01 -5.4526e+01 -5.3544e+01 -5.7958e+01 -6.1338e+01 -5.4492e+01 -5.3542e+01 -5.7944e+01 -6.1357e+01 -5.4457e+01 -5.3539e+01 -5.7931e+01 -6.1375e+01 -5.4424e+01 -5.3536e+01 -5.7917e+01 -6.1392e+01 -5.4390e+01 -5.3533e+01 -5.7903e+01 -6.1408e+01 -5.4358e+01 -5.3530e+01 -5.7890e+01 -6.1424e+01 -5.4326e+01 -5.3527e+01 -5.7875e+01 -6.1439e+01 -5.4294e+01 -5.3523e+01 -5.7861e+01 -6.1454e+01 -5.4262e+01 -5.3520e+01 -5.7847e+01 -6.1467e+01 -5.4232e+01 -5.3516e+01 -5.7833e+01 -6.1480e+01 -5.4201e+01 -5.3512e+01 -5.7818e+01 -6.1493e+01 -5.4171e+01 -5.3508e+01 -5.7804e+01 -6.1504e+01 -5.4141e+01 -5.3504e+01 -5.7789e+01 -6.1515e+01 -5.4112e+01 -5.3500e+01 -5.7774e+01 -6.1526e+01 -5.4084e+01 -5.3495e+01 -5.7759e+01 -6.1533e+01 -5.4055e+01 -5.3488e+01 -5.7744e+01 -6.1534e+01 -5.4027e+01 -5.3475e+01 -5.7729e+01 -6.1534e+01 -5.3999e+01 -5.3463e+01 -5.7713e+01 -6.1535e+01 -5.3972e+01 -5.3450e+01 -5.7698e+01 -6.1534e+01 -5.3945e+01 -5.3438e+01 -5.7682e+01 -6.1534e+01 -5.3919e+01 -5.3425e+01 -5.7667e+01 -6.1533e+01 -5.3892e+01 -5.3413e+01 -5.7651e+01 -6.1531e+01 -5.3866e+01 -5.3401e+01 -5.7635e+01 -6.1529e+01 -5.3841e+01 -5.3388e+01 -5.7619e+01 -6.1527e+01 -5.3815e+01 -5.3376e+01 -5.7603e+01 -6.1524e+01 -5.3791e+01 -5.3364e+01 -5.7587e+01 -6.1521e+01 -5.3766e+01 -5.3352e+01 -5.7570e+01 -6.1518e+01 -5.3741e+01 -5.3340e+01 -5.7547e+01 -6.1514e+01 -5.3717e+01 -5.3328e+01 -5.7522e+01 -6.1509e+01 -5.3694e+01 -5.3316e+01 -5.7498e+01 -6.1505e+01 -5.3670e+01 -5.3304e+01 -5.7474e+01 -6.1499e+01 -5.3647e+01 -5.3292e+01 -5.7449e+01 -6.1494e+01 -5.3624e+01 -5.3280e+01 -5.7425e+01 -6.1488e+01 -5.3601e+01 -5.3268e+01 -5.7401e+01 -6.1482e+01 -5.3579e+01 -5.3253e+01 -5.7378e+01 -6.1495e+01 -5.3556e+01 -5.3234e+01 -5.7354e+01 -6.1532e+01 -5.3534e+01 -5.3214e+01 -5.7330e+01 -6.1569e+01 -5.3513e+01 -5.3195e+01 -5.7301e+01 -6.1604e+01 -5.3491e+01 -5.3176e+01 -5.7270e+01 -6.1638e+01 -5.3470e+01 -5.3157e+01 -5.7238e+01 -6.1671e+01 -5.3449e+01 -5.3139e+01 -5.7207e+01 -6.1703e+01 -5.3428e+01 -5.3120e+01 -5.7177e+01 -6.1734e+01 -5.3407e+01 -5.3102e+01 -5.7146e+01 -6.1765e+01 -5.3387e+01 -5.3084e+01 -5.7116e+01 -6.1794e+01 -5.3360e+01 -5.3066e+01 -5.7086e+01 -6.1822e+01 -5.3332e+01 -5.3049e+01 -5.7056e+01 -6.1849e+01 -5.3305e+01 -5.3031e+01 -5.7026e+01 -6.1876e+01 -5.3278e+01 -5.3014e+01 -5.6997e+01 -6.1901e+01 -5.3251e+01 -5.2997e+01 -5.6968e+01 -6.1926e+01 -5.3225e+01 -5.2980e+01 -5.6939e+01 -6.1949e+01 -5.3199e+01 -5.2963e+01 -5.6910e+01 -6.1972e+01 -5.3173e+01 -5.2947e+01 -5.6881e+01 -6.1994e+01 -5.3148e+01 -5.2930e+01 -5.6853e+01 -6.2015e+01 -5.3116e+01 -5.2914e+01 -5.6825e+01 -6.2035e+01 -5.3084e+01 -5.2898e+01 -5.6797e+01 -6.2054e+01 -5.3052e+01 -5.2882e+01 -5.6769e+01 -6.2073e+01 -5.3020e+01 -5.2866e+01 -5.6741e+01 -6.2090e+01 -5.2989e+01 -5.2851e+01 -5.6714e+01 -6.2107e+01 -5.2959e+01 -5.2835e+01 -5.6686e+01 -6.2123e+01 -5.2929e+01 -5.2820e+01 -5.6659e+01 -6.2138e+01 -5.2898e+01 -5.2804e+01 -5.6632e+01 -6.2153e+01 -5.2861e+01 -5.2789e+01 -5.6605e+01 -6.2166e+01 -5.2825e+01 -5.2774e+01 -5.6578e+01 -6.2179e+01 -5.2789e+01 -5.2759e+01 -5.6552e+01 -6.2191e+01 -5.2754e+01 -5.2744e+01 -5.6525e+01 -6.2202e+01 -5.2720e+01 -5.2730e+01 -5.6499e+01 -6.2213e+01 -5.2686e+01 -5.2715e+01 -5.6473e+01 -6.2223e+01 -5.2652e+01 -5.2702e+01 -5.6447e+01 -6.2232e+01 -5.2612e+01 -5.2726e+01 -5.6421e+01 -6.2240e+01 -5.2572e+01 -5.2748e+01 -5.6395e+01 -6.2248e+01 -5.2532e+01 -5.2769e+01 -5.6369e+01 -6.2255e+01 -5.2494e+01 -5.2791e+01 -5.6344e+01 -6.2261e+01 -5.2456e+01 -5.2811e+01 -5.6318e+01 -6.2267e+01 -5.2419e+01 -5.2861e+01 -5.6293e+01 -6.2271e+01 -5.2382e+01 -5.2926e+01 -5.6268e+01 -6.2276e+01 -5.2347e+01 -5.2989e+01 -5.6242e+01 -6.2279e+01 -5.2311e+01 -5.3051e+01 -5.6217e+01 -6.2282e+01 -5.2277e+01 -5.3113e+01 -5.6193e+01 -6.2284e+01 -5.2243e+01 -5.3173e+01 -5.6168e+01 -6.2286e+01 -5.2210e+01 -5.3232e+01 -5.6143e+01 -6.2287e+01 -5.2177e+01 -5.3291e+01 -5.6118e+01 -6.2287e+01 -5.2145e+01 -5.3348e+01 -5.6094e+01 -6.2287e+01 -5.2113e+01 -5.3404e+01 -5.6070e+01 -6.2286e+01 -5.2080e+01 -5.3460e+01 -5.6045e+01 -6.2285e+01 -5.2042e+01 -5.3515e+01 -5.6012e+01 -6.2283e+01 -5.2004e+01 -5.3567e+01 -5.5981e+01 -6.2280e+01 -5.1962e+01 -5.3612e+01 -5.5949e+01 -6.2277e+01 -5.1918e+01 -5.3656e+01 -5.5918e+01 -6.2273e+01 -5.1875e+01 -5.3699e+01 -5.5887e+01 -6.2269e+01 -5.1832e+01 -5.3742e+01 -5.5856e+01 -6.2264e+01 -5.1791e+01 -5.3784e+01 -5.5825e+01 -6.2259e+01 -5.1750e+01 -5.3825e+01 -5.5795e+01 -6.2253e+01 -5.1710e+01 -5.3866e+01 -5.5765e+01 -6.2246e+01 -5.1671e+01 -5.3901e+01 -5.5735e+01 -6.2239e+01 -5.1633e+01 -5.3932e+01 -5.5705e+01 -6.2232e+01 -5.1596e+01 -5.3963e+01 -5.5667e+01 -6.2224e+01 -5.1559e+01 -5.3993e+01 -5.5631e+01 -6.2216e+01 -5.1523e+01 -5.4023e+01 -5.5594e+01 -6.2207e+01 -5.1488e+01 -5.4053e+01 -5.5558e+01 -6.2197e+01 -5.1453e+01 -5.4082e+01 -5.5522e+01 -6.2187e+01 -5.1419e+01 -5.4110e+01 -5.5487e+01 -6.2177e+01 -5.1386e+01 -5.4132e+01 -5.5452e+01 -6.2166e+01 -5.1353e+01 -5.4151e+01 -5.5418e+01 -6.2155e+01 -5.1322e+01 -5.4171e+01 -5.5384e+01 -6.2143e+01 -5.1290e+01 -5.4190e+01 -5.5350e+01 -6.2131e+01 -5.1260e+01 -5.4209e+01 -5.5317e+01 -6.2118e+01 -5.1230e+01 -5.4228e+01 -5.5284e+01 -6.2105e+01 -5.1200e+01 -5.4246e+01 -5.5251e+01 -6.2092e+01 -5.1165e+01 -5.4264e+01 -5.5219e+01 -6.2078e+01 -5.1129e+01 -5.4282e+01 -5.5191e+01 -6.2063e+01 -5.1094e+01 -5.4300e+01 -5.5196e+01 -6.2049e+01 -5.1059e+01 -5.4317e+01 -5.5201e+01 -6.2033e+01 -5.1025e+01 -5.4334e+01 -5.5205e+01 -6.2018e+01 -5.0992e+01 -5.4350e+01 -5.5210e+01 -6.2002e+01 -5.0959e+01 -5.4367e+01 -5.5214e+01 -6.1986e+01 -5.0928e+01 -5.4383e+01 -5.5218e+01 -6.1969e+01 -5.0896e+01 -5.4399e+01 -5.5222e+01 -6.1952e+01 -5.0866e+01 -5.4412e+01 -5.5226e+01 -6.1935e+01 -5.0836e+01 -5.4419e+01 -5.5230e+01 -6.1917e+01 -5.0807e+01 -5.4427e+01 -5.5233e+01 -6.1899e+01 -5.0778e+01 -5.4434e+01 -5.5237e+01 -6.1880e+01 -5.0750e+01 -5.4441e+01 -5.5240e+01 -6.1862e+01 -5.0722e+01 -5.4448e+01 -5.5243e+01 -6.1843e+01 -5.0695e+01 -5.4454e+01 -5.5246e+01 -6.1823e+01 -5.0669e+01 -5.4461e+01 -5.5248e+01 -6.1803e+01 -5.0643e+01 -5.4467e+01 -5.5248e+01 -6.1783e+01 -5.0618e+01 -5.4474e+01 -5.5243e+01 -6.1763e+01 -5.0593e+01 -5.4475e+01 -5.5237e+01 -6.1742e+01 -5.0569e+01 -5.4473e+01 -5.5231e+01 -6.1716e+01 -5.0545e+01 -5.4471e+01 -5.5226e+01 -6.1686e+01 -5.0522e+01 -5.4470e+01 -5.5220e+01 -6.1657e+01 -5.0499e+01 -5.4468e+01 -5.5215e+01 -6.1628e+01 -5.0476e+01 -5.4466e+01 -5.5209e+01 -6.1598e+01 -5.0455e+01 -5.4465e+01 -5.5204e+01 -6.1569e+01 -5.0433e+01 -5.4463e+01 -5.5198e+01 -6.1539e+01 -5.0412e+01 -5.4462e+01 -5.5192e+01 -6.1509e+01 -5.0392e+01 -5.4461e+01 -5.5187e+01 -6.1480e+01 -5.0371e+01 -5.4459e+01 -5.5181e+01 -6.1450e+01 -5.0352e+01 -5.4458e+01 -5.5175e+01 -6.1420e+01 -5.0332e+01 -5.4456e+01 -5.5170e+01 -6.1390e+01 -5.0313e+01 -5.4455e+01 -5.5164e+01 -6.1359e+01 -5.0289e+01 -5.4454e+01 -5.5158e+01 -6.1329e+01 -5.0263e+01 -5.4452e+01 -5.5152e+01 -6.1299e+01 -5.0238e+01 -5.4451e+01 -5.5146e+01 -6.1268e+01 -5.0212e+01 -5.4449e+01 -5.5141e+01 -6.1235e+01 -5.0179e+01 -5.4445e+01 -5.5135e+01 -6.1196e+01 -5.0148e+01 -5.4435e+01 -5.5146e+01 -6.1158e+01 -5.0117e+01 -5.4426e+01 -5.5176e+01 -6.1120e+01 -5.0087e+01 -5.4417e+01 -5.5206e+01 -6.1081e+01 -5.0057e+01 -5.4408e+01 -5.5236e+01 -6.1043e+01 -5.0028e+01 -5.4396e+01 -5.5264e+01 -6.1005e+01 -5.0000e+01 -5.4375e+01 -5.5293e+01 -6.0968e+01 -1.0000e+01 -5.4351e+01 -5.5334e+01 -6.0930e+01 -6.0000e+01 -5.4327e+01 -5.5397e+01 -6.0892e+01 -6.0000e+01 -5.4304e+01 -5.5460e+01 -6.0855e+01 -6.0000e+01 -5.4281e+01 -5.5522e+01 -6.0817e+01 -6.0000e+01 -5.4259e+01 -5.5583e+01 -6.0780e+01 -6.0000e+01 -5.4237e+01 -5.5640e+01 -6.0743e+01 -6.0000e+01 -5.4216e+01 -5.5691e+01 -6.0705e+01 -6.0000e+01 -5.4195e+01 -5.5742e+01 -6.0668e+01 -6.0000e+01 -5.4174e+01 -5.5791e+01 -6.0631e+01 -6.0000e+01 -5.4154e+01 -5.5840e+01 -6.0594e+01 -6.0000e+01 -5.4135e+01 -5.5888e+01 -6.0557e+01 -6.0000e+01 -5.4115e+01 -5.5935e+01 -6.0521e+01 -6.0000e+01 -5.4096e+01 -5.5982e+01 -6.0484e+01 -6.0000e+01 -5.4078e+01 -5.6028e+01 -6.0447e+01 -6.0000e+01 -5.4059e+01 -5.6073e+01 -6.0411e+01 -6.0000e+01 -5.4041e+01 -5.6117e+01 -6.0375e+01 -6.0000e+01 -5.4024e+01 -5.6161e+01 -6.0338e+01 -6.0000e+01 -5.4006e+01 -5.6204e+01 -6.0302e+01 -6.0000e+01 -5.3981e+01 -5.6246e+01 -6.0266e+01 -6.0000e+01 -5.3957e+01 -5.6287e+01 -6.0229e+01 -6.0000e+01 -5.3933e+01 -5.6328e+01 -6.0193e+01 -6.0000e+01 -5.3909e+01 -5.6368e+01 -6.0157e+01 -6.0000e+01 -5.3886e+01 -5.6408e+01 -6.0121e+01 -6.0000e+01 -5.3864e+01 -5.6446e+01 -6.0086e+01 -6.0000e+01 -5.3841e+01 -5.6484e+01 -6.0050e+01 -6.0000e+01 -5.3820e+01 -5.6521e+01 -6.0014e+01 -6.0000e+01 -5.3798e+01 -5.6558e+01 -5.9975e+01 -6.0000e+01 -5.3777e+01 -5.6592e+01 -5.9932e+01 -6.0000e+01 -5.3757e+01 -5.6619e+01 -5.9888e+01 -6.0000e+01 -5.3736e+01 -5.6646e+01 -5.9845e+01 -6.0000e+01 -5.3716e+01 -5.6672e+01 -5.9803e+01 -6.0000e+01 -5.3697e+01 -5.6698e+01 -5.9760e+01 -6.0000e+01 -5.3678e+01 -5.6723e+01 -5.9718e+01 -6.0000e+01 -5.3658e+01 -5.6748e+01 -5.9706e+01 -6.0000e+01 -5.3632e+01 -5.6772e+01 -5.9709e+01 -6.0000e+01 -5.3606e+01 -5.6792e+01 -5.9711e+01 -6.0000e+01 -5.3580e+01 -5.6807e+01 -5.9712e+01 -6.0000e+01 -5.3555e+01 -5.6823e+01 -5.9713e+01 -6.0000e+01 -5.3531e+01 -5.6837e+01 -5.9714e+01 -6.0000e+01 -5.3507e+01 -5.6852e+01 -5.9714e+01 -6.0000e+01 -5.3483e+01 -5.6866e+01 -5.9714e+01 -6.0000e+01 -5.3460e+01 -5.6880e+01 -5.9713e+01 -6.0000e+01 -5.3437e+01 -5.6894e+01 -5.9712e+01 -6.0000e+01 -5.3415e+01 -5.6907e+01 -5.9711e+01 -6.0000e+01 -5.3393e+01 -5.6920e+01 -5.9709e+01 -6.0000e+01 -5.3371e+01 -5.6933e+01 -5.9707e+01 -6.0000e+01 -5.3350e+01 -5.6946e+01 -5.9705e+01 -6.0000e+01 -5.3329e+01 -5.6958e+01 -5.9695e+01 -6.0000e+01 -5.3309e+01 -5.6970e+01 -5.9683e+01 -6.0000e+01 -5.3288e+01 -5.6981e+01 -5.9672e+01 -6.0017e+01 -5.3269e+01 -5.6992e+01 -5.9660e+01 -6.0033e+01 -5.3249e+01 -5.7003e+01 -5.9649e+01 -6.0048e+01 -5.3230e+01 -5.7014e+01 -5.9637e+01 -6.0063e+01 -5.3211e+01 -5.7024e+01 -5.9625e+01 -6.0077e+01 -5.3193e+01 -5.7034e+01 -5.9613e+01 -6.0091e+01 -5.3175e+01 -5.7044e+01 -5.9600e+01 -6.0104e+01 -5.3157e+01 -5.7053e+01 -5.9587e+01 -6.0116e+01 -5.3139e+01 -5.7062e+01 -5.9575e+01 -6.0127e+01 -5.3122e+01 -5.7071e+01 -5.9562e+01 -6.0138e+01 -5.3105e+01 -5.7079e+01 -5.9548e+01 -6.0148e+01 -5.3088e+01 -5.7087e+01 -5.9535e+01 -6.0158e+01 -5.3071e+01 -5.7095e+01 -5.9521e+01 -6.0167e+01 -5.3064e+01 -5.7103e+01 -5.9508e+01 -6.0175e+01 -5.3092e+01 -5.7110e+01 -5.9494e+01 -6.0183e+01 -5.3120e+01 -5.7117e+01 -5.9480e+01 -6.0190e+01 -5.3148e+01 -5.7123e+01 -5.9465e+01 -6.0197e+01 -5.3175e+01 -5.7129e+01 -5.9451e+01 -6.0203e+01 -5.3202e+01 -5.7134e+01 -5.9436e+01 -6.0208e+01 -5.3228e+01 -5.7132e+01 -5.9421e+01 -6.0213e+01 -5.3254e+01 -5.7129e+01 -5.9406e+01 -6.0217e+01 -5.3279e+01 -5.7127e+01 -5.9391e+01 -6.0221e+01 -5.3304e+01 -5.7124e+01 -5.9376e+01 -6.0224e+01 -5.3329e+01 -5.7121e+01 -5.9360e+01 -6.0227e+01 -5.3353e+01 -5.7118e+01 -5.9345e+01 -6.0224e+01 -5.3377e+01 -5.7109e+01 -5.9329e+01 -6.0218e+01 -5.3400e+01 -5.7097e+01 -5.9313e+01 -6.0211e+01 -5.3423e+01 -5.7086e+01 -5.9289e+01 -6.0196e+01 -5.3446e+01 -5.7071e+01 -5.9264e+01 -6.0181e+01 -5.3462e+01 -5.7052e+01 -5.9231e+01 -6.0166e+01 -5.3476e+01 -5.7033e+01 -5.9200e+01 -6.0151e+01 -5.3490e+01 -5.7014e+01 -5.9168e+01 -6.0135e+01 -5.3503e+01 -5.6987e+01 -5.9136e+01 -6.0119e+01 -5.3516e+01 -5.6949e+01 -5.9103e+01 -6.0095e+01 -5.3525e+01 -5.6908e+01 -5.9064e+01 -6.0071e+01 -5.3530e+01 -5.6866e+01 -5.9025e+01 -6.0048e+01 -5.3535e+01 -5.6819e+01 -5.8987e+01 -6.0024e+01 -5.3540e+01 -5.6773e+01 -5.8949e+01 -6.0001e+01 -5.3545e+01 -5.6727e+01 -5.8911e+01 -5.9977e+01 -5.3549e+01 -5.6682e+01 -5.8874e+01 -5.9954e+01 -5.3554e+01 -5.6638e+01 -5.8837e+01 -5.9931e+01 -5.3559e+01 -5.6595e+01 -5.8801e+01 -5.9908e+01 -5.3563e+01 -5.6553e+01 -5.8765e+01 -5.9884e+01 -5.3568e+01 -5.6512e+01 -5.8729e+01 -5.9861e+01 -5.3573e+01 -5.6471e+01 -5.8693e+01 -5.9838e+01 -5.3577e+01 -5.6431e+01 -5.8658e+01 -5.9815e+01 -5.3581e+01 -5.6392e+01 -5.8623e+01 -5.9792e+01 -5.3586e+01 -5.6354e+01 -5.8588e+01 -5.9769e+01 -5.3590e+01 -5.6316e+01 -5.8554e+01 -5.9745e+01 -5.3594e+01 -5.6279e+01 -5.8520e+01 -5.9722e+01 -5.3598e+01 -5.6243e+01 -5.8486e+01 -5.9699e+01 -5.3602e+01 -5.6207e+01 -5.8452e+01 -5.9676e+01 -5.3606e+01 -5.6172e+01 -5.8412e+01 -5.9653e+01 -5.3610e+01 -5.6137e+01 -5.8371e+01 -5.9630e+01 -5.3614e+01 -5.6095e+01 -5.8331e+01 -5.9607e+01 -5.3617e+01 -5.6054e+01 -5.8291e+01 -5.9584e+01 -5.3621e+01 -5.6014e+01 -5.8251e+01 -5.9561e+01 -5.3621e+01 -5.5974e+01 -5.8212e+01 -5.9537e+01 -5.3616e+01 -5.5935e+01 -5.8173e+01 -5.9514e+01 -5.3604e+01 -5.5897e+01 -5.8134e+01 -5.9491e+01 -5.3592e+01 -5.5860e+01 -5.8096e+01 -5.9468e+01 -5.3576e+01 -5.5823e+01 -5.8058e+01 -5.9445e+01 -5.3556e+01 -5.5787e+01 -5.8021e+01 -5.9422e+01 -5.3537e+01 -5.5745e+01 -5.7984e+01 -5.9395e+01 -5.3518e+01 -5.5702e+01 -5.7947e+01 -5.9364e+01 -5.3500e+01 -5.5660e+01 -5.7911e+01 -5.9333e+01 -5.3482e+01 -5.5619e+01 -5.7875e+01 -5.9302e+01 -5.3464e+01 -5.5579e+01 -5.7839e+01 -5.9272e+01 -5.3447e+01 -5.5539e+01 -5.7803e+01 -5.9241e+01 -5.3431e+01 -5.5500e+01 -5.7768e+01 -5.9211e+01 -5.3414e+01 -5.5461e+01 -5.7734e+01 -5.9180e+01 -5.3398e+01 -5.5424e+01 -5.7699e+01 -5.9150e+01 -5.3381e+01 -5.5387e+01 -5.7665e+01 -5.9120e+01 -5.3358e+01 -5.5351e+01 -5.7631e+01 -5.9090e+01 -5.3335e+01 -5.5315e+01 -5.7597e+01 -5.9061e+01 -5.3313e+01 -5.5280e+01 -5.7564e+01 -5.9031e+01 -5.3291e+01 -5.5245e+01 -5.7530e+01 -5.9002e+01 -5.3270e+01 -5.5212e+01 -5.7497e+01 -5.8972e+01 -5.3249e+01 -5.5172e+01 -5.7465e+01 -5.8943e+01 -5.3229e+01 -5.5132e+01 -5.7432e+01 -5.8914e+01 -5.3209e+01 -5.5092e+01 -5.7400e+01 -5.8885e+01 -5.3189e+01 -5.5053e+01 -5.7368e+01 -5.8856e+01 -5.3170e+01 -5.5014e+01 -5.7336e+01 -5.8827e+01 -5.3151e+01 -5.4977e+01 -5.7305e+01 -5.8798e+01 -5.3133e+01 -5.4940e+01 -5.7273e+01 -5.8770e+01 -5.3115e+01 -5.4903e+01 -5.7242e+01 -5.8741e+01 -5.3098e+01 -5.4868e+01 -5.7211e+01 -5.8707e+01 -5.3080e+01 -5.4833e+01 -5.7181e+01 -5.8670e+01 -5.3063e+01 -5.4798e+01 -5.7150e+01 -5.8634e+01 -5.3047e+01 -5.4764e+01 -5.7120e+01 -5.8599e+01 -5.3031e+01 -5.4731e+01 -5.7090e+01 -5.8563e+01 -5.3015e+01 -5.4698e+01 -5.7060e+01 -5.8528e+01 -5.2999e+01 -5.4666e+01 -5.7030e+01 -5.8493e+01 -5.2984e+01 -5.4634e+01 -5.7000e+01 -5.8459e+01 -5.2969e+01 -5.4603e+01 -5.6978e+01 -5.8424e+01 -5.2954e+01 -5.4572e+01 -5.6993e+01 -5.8390e+01 -5.2940e+01 -5.4542e+01 -5.7008e+01 -5.8356e+01 -5.2926e+01 -5.4513e+01 -5.7023e+01 -5.8321e+01 -5.2912e+01 -5.4483e+01 -5.7036e+01 -5.8279e+01 -5.2898e+01 -5.4455e+01 -5.7050e+01 -5.8238e+01 -5.2885e+01 -5.4427e+01 -5.7063e+01 -5.8197e+01 -5.2868e+01 -5.4399e+01 -5.7075e+01 -5.8157e+01 -5.2847e+01 -5.4371e+01 -5.7087e+01 -5.8117e+01 -5.2826e+01 -5.4344e+01 -5.7098e+01 -5.8078e+01 -5.2806e+01 -5.4318e+01 -5.7109e+01 -5.8039e+01 -5.2787e+01 -5.4292e+01 -5.7120e+01 -5.8000e+01 -5.2767e+01 -5.4266e+01 -5.7130e+01 -5.7961e+01 -5.2748e+01 -5.4241e+01 -5.7139e+01 -5.7923e+01 -5.2730e+01 -5.4216e+01 -5.7148e+01 -5.7877e+01 -5.2712e+01 -5.4191e+01 -5.7157e+01 -5.7832e+01 -5.2694e+01 -5.4167e+01 -5.7165e+01 -5.7787e+01 -5.2676e+01 -5.4143e+01 -5.7173e+01 -5.7743e+01 -5.2659e+01 -5.4119e+01 -5.7181e+01 -5.7699e+01 -5.2642e+01 -5.4096e+01 -5.7187e+01 -5.7656e+01 -5.2626e+01 -5.4073e+01 -5.7194e+01 -5.7613e+01 -5.2609e+01 -5.4050e+01 -5.7200e+01 -5.7571e+01 -5.2593e+01 -5.4028e+01 -5.7206e+01 -5.7529e+01 -5.2578e+01 -5.4006e+01 -5.7211e+01 -5.7488e+01 -5.2562e+01 -5.3984e+01 -5.7216e+01 -5.7447e+01 -5.2547e+01 -5.3962e+01 -5.7220e+01 -5.7406e+01 -5.2532e+01 -5.3941e+01 -5.7225e+01 -5.7366e+01 -5.2518e+01 -5.3920e+01 -5.7228e+01 -5.7326e+01 -5.2503e+01 -5.3900e+01 -5.7232e+01 -5.7287e+01 -5.2489e+01 -5.3879e+01 -5.7234e+01 -5.7248e+01 -5.2475e+01 -5.3859e+01 -5.7237e+01 -5.7210e+01 -5.2461e+01 -5.3839e+01 -5.7239e+01 -5.7172e+01 -5.2490e+01 -5.3819e+01 -5.7241e+01 -5.7134e+01 -5.2521e+01 -5.3800e+01 -5.7242e+01 -5.7096e+01 -5.2551e+01 -5.3815e+01 -5.7243e+01 -5.7059e+01 -5.2581e+01 -5.3832e+01 -5.7244e+01 -5.7022e+01 -5.2604e+01 -5.3849e+01 -5.7244e+01 -5.6986e+01 -5.2625e+01 -5.3865e+01 -5.7244e+01 -5.6950e+01 -5.2646e+01 -5.3882e+01 -5.7244e+01 -5.6914e+01 -5.2666e+01 -5.3898e+01 -5.7243e+01 -5.6871e+01 -5.2687e+01 -5.3914e+01 -5.7242e+01 -5.6828e+01 -5.2707e+01 -5.3929e+01 -5.7241e+01 -5.6786e+01 -5.2727e+01 -5.3945e+01 -5.7239e+01 -5.6741e+01 -5.2746e+01 -5.3960e+01 -5.7237e+01 -5.6691e+01 -5.2766e+01 -5.3991e+01 -5.7235e+01 -5.6643e+01 -5.2785e+01 -5.4042e+01 -5.7232e+01 -5.6595e+01 -5.2803e+01 -5.4093e+01 -5.7229e+01 -5.6547e+01 -5.2822e+01 -5.4142e+01 -5.7226e+01 -5.6500e+01 -5.2840e+01 -5.4191e+01 -5.7222e+01 -5.6454e+01 -5.2858e+01 -5.4239e+01 -5.7218e+01 -5.6408e+01 -5.2876e+01 -5.4286e+01 -5.7214e+01 -5.6363e+01 -5.2893e+01 -5.4333e+01 -5.7209e+01 -5.6319e+01 -5.2911e+01 -5.4379e+01 -5.7204e+01 -5.6275e+01 -5.2928e+01 -5.4424e+01 -5.7199e+01 -5.6232e+01 -5.2944e+01 -5.4469e+01 -5.7194e+01 -5.6189e+01 -5.2961e+01 -5.4512e+01 -5.7188e+01 -5.6147e+01 -5.2977e+01 -5.4555e+01 -5.7182e+01 -5.6105e+01 -5.2993e+01 -5.4598e+01 -5.7176e+01 -5.6064e+01 -5.3008e+01 -5.4640e+01 -5.7169e+01 -5.6023e+01 -5.3023e+01 -5.4681e+01 -5.7163e+01 -5.5983e+01 -5.3038e+01 -5.4721e+01 -5.7156e+01 -5.5943e+01 -5.3053e+01 -5.4761e+01 -5.7148e+01 -5.5904e+01 -5.3068e+01 -5.4799e+01 -5.7141e+01 -5.5865e+01 -5.3082e+01 -5.4838e+01 -5.7133e+01 -5.5824e+01 -5.3096e+01 -5.4875e+01 -5.7125e+01 -5.5778e+01 -5.3109e+01 -5.4912e+01 -5.7116e+01 -5.5733e+01 -5.3123e+01 -5.4949e+01 -5.7108e+01 -5.5689e+01 -5.3128e+01 -5.4984e+01 -5.7099e+01 -5.5644e+01 -5.3133e+01 -5.5013e+01 -5.7086e+01 -5.5601e+01 -5.3138e+01 -5.5039e+01 -5.7069e+01 -5.5558e+01 -5.3143e+01 -5.5065e+01 -5.7052e+01 -5.5513e+01 -5.3148e+01 -5.5091e+01 -5.7035e+01 -5.5464e+01 -5.3173e+01 -5.5116e+01 -5.7017e+01 -5.5415e+01 -5.3222e+01 -5.5141e+01 -5.7000e+01 -5.5366e+01 -5.3270e+01 -5.5165e+01 -5.6983e+01 -5.5319e+01 -5.3317e+01 -5.5189e+01 -5.6965e+01 -5.5272e+01 -5.3364e+01 -5.5212e+01 -5.6948e+01 -5.5226e+01 -5.3410e+01 -5.5235e+01 -5.6930e+01 -5.5180e+01 -5.3456e+01 -5.5258e+01 -5.6913e+01 -5.5135e+01 -5.3500e+01 -5.5280e+01 -5.6895e+01 -5.5083e+01 -5.3544e+01 -5.5302e+01 -5.6877e+01 -5.5032e+01 -5.3587e+01 -5.5323e+01 -5.6860e+01 -5.4981e+01 -5.3630e+01 -5.5344e+01 -5.6842e+01 -5.4932e+01 -5.3671e+01 -5.5364e+01 -5.6824e+01 -5.4883e+01 -5.3712e+01 -5.5384e+01 -5.6807e+01 -5.4834e+01 -5.3753e+01 -5.5403e+01 -5.6789e+01 -5.4787e+01 -5.3793e+01 -5.5422e+01 -5.6771e+01 -5.4740e+01 -5.3832e+01 -5.5441e+01 -5.6753e+01 -5.4694e+01 -5.3870e+01 -5.5459e+01 -5.6735e+01 -5.4649e+01 -5.3907e+01 -5.5477e+01 -5.6717e+01 -5.4599e+01 -5.3944e+01 -5.5494e+01 -5.6699e+01 -5.4547e+01 -5.3981e+01 -5.5511e+01 -5.6681e+01 -5.4496e+01 -5.4016e+01 -5.5528e+01 -5.6663e+01 -5.4446e+01 -5.4051e+01 -5.5544e+01 -5.6645e+01 -5.4397e+01 -5.4086e+01 -5.5560e+01 -5.6627e+01 -5.4349e+01 -5.4119e+01 -5.5575e+01 -5.6608e+01 -5.4301e+01 -5.4153e+01 -5.5590e+01 -5.6590e+01 -5.4254e+01 -5.4185e+01 -5.5604e+01 -5.6572e+01 -5.4208e+01 -5.4217e+01 -5.5618e+01 -5.6553e+01 -5.4163e+01 -5.4248e+01 -5.5632e+01 -5.6535e+01 -5.4118e+01 -5.4279e+01 -5.5645e+01 -5.6517e+01 -5.4074e+01 -5.4309e+01 -5.5658e+01 -5.6498e+01 -5.4031e+01 -5.4338e+01 -5.5671e+01 -5.6480e+01 -5.3988e+01 -5.4367e+01 -5.5683e+01 -5.6461e+01 -5.3947e+01 -5.4395e+01 -5.5694e+01 -5.6442e+01 -5.3905e+01 -5.4423e+01 -5.5706e+01 -5.6424e+01 -5.3865e+01 -5.4450e+01 -5.5717e+01 -5.6405e+01 -5.3825e+01 -5.4476e+01 -5.5727e+01 -5.6386e+01 -5.3786e+01 -5.4502e+01 -5.5737e+01 -5.6361e+01 -5.3747e+01 -5.4520e+01 -5.5747e+01 -5.6334e+01 -5.3709e+01 -5.4537e+01 -5.5757e+01 -5.6308e+01 -5.3671e+01 -5.4554e+01 -5.5766e+01 -5.6282e+01 -5.3634e+01 -5.4566e+01 -5.5774e+01 -5.6255e+01 -5.3598e+01 -5.4574e+01 -5.5783e+01 -5.6229e+01 -5.3562e+01 -5.4582e+01 -5.5791e+01 -5.6204e+01 -5.3527e+01 -5.4590e+01 -5.5798e+01 -5.6178e+01 -5.3492e+01 -5.4597e+01 -5.5806e+01 -5.6152e+01 -5.3458e+01 -5.4605e+01 -5.5813e+01 -5.6127e+01 -5.3424e+01 -5.4612e+01 -5.5819e+01 -5.6102e+01 -5.3391e+01 -5.4619e+01 -5.5825e+01 -5.6076e+01 -5.3358e+01 -5.4625e+01 -5.5831e+01 -5.6051e+01 -5.3325e+01 -5.4632e+01 -5.5837e+01 -5.6026e+01 -5.3294e+01 -5.4638e+01 -5.5842e+01 -5.6002e+01 -5.3262e+01 -5.4645e+01 -5.5847e+01 -5.5977e+01 -5.3231e+01 -5.4651e+01 -5.5852e+01 -5.5952e+01 -5.3201e+01 -5.4657e+01 -5.5856e+01 -5.5928e+01 -5.3171e+01 -5.4662e+01 -5.5860e+01 -5.5904e+01 -5.3141e+01 -5.4668e+01 -5.5863e+01 -5.5879e+01 -5.3112e+01 -5.4673e+01 -5.5867e+01 -5.5855e+01 -5.3083e+01 -5.4678e+01 -5.5870e+01 -5.5831e+01 -5.3046e+01 -5.4683e+01 -5.5872e+01 -5.5807e+01 -5.3002e+01 -5.4688e+01 -5.5871e+01 -5.5784e+01 -5.2955e+01 -5.4693e+01 -5.5865e+01 -5.5760e+01 -5.2904e+01 -5.4697e+01 -5.5859e+01 -5.5736e+01 -5.2855e+01 -5.4701e+01 -5.5853e+01 -5.5713e+01 -5.2807e+01 -5.4705e+01 -5.5847e+01 -5.5689e+01 -5.2759e+01 -5.4709e+01 -5.5841e+01 -5.5666e+01 -5.2713e+01 -5.4713e+01 -5.5834e+01 -5.5650e+01 -5.2667e+01 -5.4716e+01 -5.5828e+01 -5.5671e+01 -5.2622e+01 -5.4719e+01 -5.5821e+01 -5.5692e+01 -5.2578e+01 -5.4722e+01 -5.5814e+01 -5.5712e+01 -5.2535e+01 -5.4725e+01 -5.5808e+01 -5.5732e+01 -5.2492e+01 -5.4728e+01 -5.5801e+01 -5.5751e+01 -5.2444e+01 -5.4730e+01 -5.5794e+01 -5.5770e+01 -5.2395e+01 -5.4733e+01 -5.5786e+01 -5.5788e+01 -5.2347e+01 -5.4727e+01 -5.5779e+01 -5.5805e+01 -5.2300e+01 -5.4721e+01 -5.5772e+01 -5.5822e+01 -5.2254e+01 -5.4715e+01 -5.5764e+01 -5.5839e+01 -5.2209e+01 -5.4709e+01 -5.5757e+01 -5.5854e+01 -5.2165e+01 -5.4703e+01 -5.5749e+01 -5.5870e+01 -5.2122e+01 -5.4697e+01 -5.5741e+01 -5.5885e+01 -5.2079e+01 -5.4691e+01 -5.5733e+01 -5.5899e+01 -5.2038e+01 -5.4685e+01 -5.5725e+01 -5.5913e+01 -5.1997e+01 -5.4679e+01 -5.5717e+01 -5.5926e+01 -5.1957e+01 -5.4673e+01 -5.5709e+01 -5.5939e+01 -5.1917e+01 -5.4667e+01 -5.5700e+01 -5.5952e+01 -5.1879e+01 -5.4661e+01 -5.5692e+01 -5.5964e+01 -5.1841e+01 -5.4655e+01 -5.5683e+01 -5.5975e+01 -5.1804e+01 -5.4649e+01 -5.5674e+01 -5.5986e+01 -5.1767e+01 -5.4643e+01 -5.5665e+01 -5.5996e+01 -5.1732e+01 -5.4637e+01 -5.5656e+01 -5.6006e+01 -5.1697e+01 -5.4631e+01 -5.5647e+01 -5.6016e+01 -5.1662e+01 -5.4625e+01 -5.5638e+01 -5.6025e+01 -5.1628e+01 -5.4618e+01 -5.5629e+01 -5.6034e+01 -5.1595e+01 -5.4612e+01 -5.5619e+01 -5.6042e+01 -5.1563e+01 -5.4606e+01 -5.5610e+01 -5.6050e+01 -5.1531e+01 -5.4599e+01 -5.5600e+01 -5.6058e+01 -5.1500e+01 -5.4593e+01 -5.5590e+01 -5.6065e+01 -5.1469e+01 -5.4586e+01 -5.5580e+01 -5.6071e+01 -5.1439e+01 -5.4580e+01 -5.5570e+01 -5.6077e+01 -5.1409e+01 -5.4573e+01 -5.5560e+01 -5.6083e+01 -5.1380e+01 -5.4566e+01 -5.5550e+01 -5.6088e+01 -5.1352e+01 -5.4560e+01 -5.5540e+01 -5.6093e+01 -5.1353e+01 -5.4553e+01 -5.5529e+01 -5.6098e+01 -5.1370e+01 -5.4546e+01 -5.5519e+01 -5.6102e+01 -5.1386e+01 -5.4539e+01 -5.5508e+01 -5.6106e+01 -5.1403e+01 -5.4532e+01 -5.5498e+01 -5.6109e+01 -5.1419e+01 -5.4525e+01 -5.5487e+01 -5.6113e+01 -5.1435e+01 -5.4518e+01 -5.5476e+01 -5.6115e+01 -5.1451e+01 -5.4511e+01 -5.5465e+01 -5.6118e+01 -5.1467e+01 -5.4504e+01 -5.5454e+01 -5.6120e+01 -5.1483e+01 -5.4496e+01 -5.5443e+01 -5.6121e+01 -5.1498e+01 -5.4489e+01 -5.5431e+01 -5.6123e+01 -5.1514e+01 -5.4479e+01 -5.5420e+01 -5.6123e+01 -5.1521e+01 -5.4464e+01 -5.5408e+01 -5.6164e+01 -5.1528e+01 -5.4449e+01 -5.5397e+01 -5.6208e+01 -5.1535e+01 -5.4434e+01 -5.5385e+01 -5.6252e+01 -5.1543e+01 -5.4418e+01 -5.5373e+01 -5.6294e+01 -5.1550e+01 -5.4404e+01 -5.5361e+01 -5.6335e+01 -5.1557e+01 -5.4389e+01 -5.5349e+01 -5.6376e+01 -5.1564e+01 -5.4374e+01 -5.5337e+01 -5.6415e+01 -5.1571e+01 -5.4359e+01 -5.5325e+01 -5.6454e+01 -5.1578e+01 -5.4345e+01 -5.5313e+01 -5.6492e+01 -5.1586e+01 -5.4331e+01 -5.5297e+01 -5.6528e+01 -5.1593e+01 -5.4312e+01 -5.5277e+01 -5.6564e+01 -5.1600e+01 -5.4290e+01 -5.5256e+01 -5.6599e+01 -5.1607e+01 -5.4268e+01 -5.5236e+01 -5.6633e+01 -5.1614e+01 -5.4246e+01 -5.5216e+01 -5.6662e+01 -5.1621e+01 -5.4225e+01 -5.5196e+01 -5.6686e+01 -5.1628e+01 -5.4204e+01 -5.5175e+01 -5.6710e+01 -5.1635e+01 -5.4183e+01 -5.5148e+01 -5.6733e+01 -5.1641e+01 -5.4163e+01 -5.5120e+01 -5.6756e+01 -5.1648e+01 -5.4142e+01 -5.5093e+01 -5.6777e+01 -5.1655e+01 -5.4122e+01 -5.5066e+01 -5.6791e+01 -5.1662e+01 -5.4102e+01 -5.5040e+01 -5.6803e+01 -5.1668e+01 -5.4083e+01 -5.5050e+01 -5.6816e+01 -5.1675e+01 -5.4063e+01 -5.5060e+01 -5.6828e+01 -5.1681e+01 -5.4044e+01 -5.5070e+01 -5.6840e+01 -5.1688e+01 -5.4025e+01 -5.5080e+01 -5.6851e+01 -5.1694e+01 -5.4007e+01 -5.5089e+01 -5.6862e+01 -5.1700e+01 -5.3988e+01 -5.5099e+01 -5.6872e+01 -5.1706e+01 -5.3970e+01 -5.5108e+01 -5.6882e+01 -5.1712e+01 -5.3951e+01 -5.5117e+01 -5.6892e+01 -5.1710e+01 -5.3933e+01 -5.5126e+01 -5.6901e+01 -5.1708e+01 -5.3915e+01 -5.5134e+01 -5.6910e+01 -5.1707e+01 -5.3898e+01 -5.5142e+01 -5.6919e+01 -5.1705e+01 -5.3880e+01 -5.5150e+01 -5.6927e+01 -5.1703e+01 -5.3863e+01 -5.5158e+01 -5.6935e+01 -5.1702e+01 -5.3846e+01 -5.5166e+01 -5.6942e+01 -5.1701e+01 -5.3829e+01 -5.5173e+01 -5.6949e+01 -5.1699e+01 -5.3805e+01 -5.5180e+01 -5.6956e+01 -5.1698e+01 -5.3780e+01 -5.5187e+01 -5.6962e+01 -5.1697e+01 -5.3756e+01 -5.5194e+01 -5.6968e+01 -5.1694e+01 -5.3732e+01 -5.5200e+01 -5.6973e+01 -5.1685e+01 -5.3708e+01 -5.5206e+01 -5.6978e+01 -5.1677e+01 -5.3685e+01 -5.5212e+01 -5.6983e+01 -5.1668e+01 -5.3662e+01 -5.5218e+01 -5.6987e+01 -5.1660e+01 -5.3639e+01 -5.5224e+01 -5.6991e+01 -5.1652e+01 -5.3617e+01 -5.5229e+01 -5.6995e+01 -5.1644e+01 -5.3595e+01 -5.5234e+01 -5.6998e+01 -5.1637e+01 -5.3573e+01 -5.5239e+01 -5.7001e+01 -5.1629e+01 -5.3551e+01 -5.5243e+01 -5.7004e+01 -5.1622e+01 -5.3530e+01 -5.5248e+01 -5.7006e+01 -5.1615e+01 -5.3509e+01 -5.5252e+01 -5.7008e+01 -5.1608e+01 -5.3488e+01 -5.5256e+01 -5.7010e+01 -5.1602e+01 -5.3468e+01 -5.5259e+01 -5.7011e+01 -5.1595e+01 -5.3447e+01 -5.5263e+01 -5.7012e+01 -5.1589e+01 -5.3427e+01 -5.5266e+01 -5.7013e+01 -5.1583e+01 -5.3407e+01 -5.5269e+01 -5.7013e+01 -5.1577e+01 -5.3388e+01 -5.5272e+01 -5.7013e+01 -5.1571e+01 -5.3368e+01 -5.5274e+01 -5.7013e+01 -5.1566e+01 -5.3349e+01 -5.5276e+01 -5.7012e+01 -5.1560e+01 -5.3330e+01 -5.5278e+01 -5.7011e+01 -5.1553e+01 -5.3311e+01 -5.5280e+01 -5.7010e+01 -5.1540e+01 -5.3293e+01 -5.5282e+01 -5.7009e+01 -5.1527e+01 -5.3274e+01 -5.5283e+01 -5.7007e+01 -5.1515e+01 -5.3256e+01 -5.5278e+01 -5.7005e+01 -5.1502e+01 -5.3238e+01 -5.5271e+01 -5.7002e+01 -5.1490e+01 -5.3220e+01 -5.5264e+01 -5.7000e+01 -5.1479e+01 -5.3203e+01 -5.5257e+01 -5.6997e+01 -5.1467e+01 -5.3182e+01 -5.5250e+01 -5.6993e+01 -5.1456e+01 -5.3157e+01 -5.5243e+01 -5.6990e+01 -5.1445e+01 -5.3132e+01 -5.5236e+01 -5.6986e+01 -5.1434e+01 -5.3108e+01 -5.5229e+01 -5.6982e+01 -5.1424e+01 -5.3084e+01 -5.5222e+01 -5.6977e+01 -5.1414e+01 -5.3058e+01 -5.5215e+01 -5.6973e+01 -5.1404e+01 -5.3027e+01 -5.5208e+01 -5.6968e+01 -5.1394e+01 -5.2996e+01 -5.5200e+01 -5.6962e+01 -5.1385e+01 -5.2965e+01 -5.5193e+01 -5.6957e+01 -5.1376e+01 -5.2935e+01 -5.5186e+01 -5.6951e+01 -5.1366e+01 -5.2906e+01 -5.5178e+01 -5.6945e+01 -5.1358e+01 -5.2877e+01 -5.5171e+01 -5.6932e+01 -5.1349e+01 -5.2848e+01 -5.5163e+01 -5.6917e+01 -5.1340e+01 -5.2820e+01 -5.5156e+01 -5.6903e+01 -5.1332e+01 -5.2793e+01 -5.5148e+01 -5.6889e+01 -5.1324e+01 -5.2760e+01 -5.5140e+01 -5.6874e+01 -5.1316e+01 -5.2725e+01 -5.5136e+01 -5.6860e+01 -5.1308e+01 -5.2691e+01 -5.5165e+01 -5.6845e+01 -5.1301e+01 -5.2658e+01 -5.5190e+01 -5.6831e+01 -5.1293e+01 -5.2625e+01 -5.5210e+01 -5.6816e+01 -5.1286e+01 -5.2593e+01 -5.5229e+01 -5.6801e+01 -5.1279e+01 -5.2561e+01 -5.5248e+01 -5.6786e+01 -5.1272e+01 -5.2530e+01 -5.5267e+01 -5.6772e+01 -5.1265e+01 -5.2499e+01 -5.5286e+01 -5.6757e+01 -5.1258e+01 -5.2469e+01 -5.5304e+01 -5.6742e+01 -5.1251e+01 -5.2440e+01 -5.5321e+01 -5.6727e+01 -5.1245e+01 -5.2408e+01 -5.5339e+01 -5.6712e+01 -5.1238e+01 -5.2371e+01 -5.5356e+01 -5.6696e+01 -5.1232e+01 -5.2335e+01 -5.5373e+01 -5.6681e+01 -5.1226e+01 -5.2300e+01 -5.5389e+01 -5.6666e+01 -5.1220e+01 -5.2266e+01 -5.5403e+01 -5.6651e+01 -5.1214e+01 -5.2232e+01 -5.5410e+01 -5.6635e+01 -5.1208e+01 -5.2199e+01 -5.5418e+01 -5.6618e+01 -5.1202e+01 -5.2166e+01 -5.5426e+01 -5.6595e+01 -5.1196e+01 -5.2134e+01 -5.5427e+01 -5.6571e+01 -5.1191e+01 -5.2103e+01 -5.5427e+01 -5.6548e+01 -5.1185e+01 -5.2072e+01 -5.5426e+01 -5.6525e+01 -5.1180e+01 -5.2042e+01 -5.5426e+01 -5.6502e+01 -5.1174e+01 -5.2012e+01 -5.5425e+01 -5.6479e+01 -5.1169e+01 -5.1983e+01 -5.5425e+01 -5.6457e+01 -5.1164e+01 -5.1954e+01 -5.5424e+01 -5.6434e+01 -5.1159e+01 -5.1926e+01 -5.5424e+01 -5.6412e+01 -5.1153e+01 -5.1898e+01 -5.5440e+01 -5.6387e+01 -5.1148e+01 -5.1869e+01 -5.5476e+01 -5.6357e+01 -5.1143e+01 -5.1834e+01 -5.5511e+01 -5.6327e+01 -5.1137e+01 -5.1800e+01 -5.5546e+01 -5.6297e+01 -5.1124e+01 -5.1767e+01 -5.5581e+01 -5.6268e+01 -5.1111e+01 -5.1727e+01 -5.5615e+01 -5.6239e+01 -5.1099e+01 -5.1687e+01 -5.5648e+01 -5.6210e+01 -5.1087e+01 -5.1648e+01 -5.5681e+01 -5.6181e+01 -5.1075e+01 -5.1610e+01 -5.5714e+01 -5.6153e+01 -5.1064e+01 -5.1572e+01 -5.5746e+01 -5.6125e+01 -5.1052e+01 -5.1535e+01 -5.5777e+01 -5.6097e+01 -5.1041e+01 -5.1500e+01 -5.5809e+01 -5.6070e+01 -5.1030e+01 -5.1464e+01 -5.5839e+01 -5.6042e+01 -5.1019e+01 -5.1430e+01 -5.5869e+01 -5.6015e+01 -5.1009e+01 -5.1396e+01 -5.5899e+01 -5.5988e+01 -5.0998e+01 -5.1363e+01 -5.5928e+01 -5.5962e+01 -5.0988e+01 -5.1331e+01 -5.5956e+01 -5.5935e+01 -5.0978e+01 -5.1299e+01 -5.5985e+01 -5.5909e+01 -5.0968e+01 -5.1268e+01 -5.6012e+01 -5.5883e+01 -5.0959e+01 -5.1237e+01 -5.6039e+01 -5.5857e+01 -5.0949e+01 -5.1207e+01 -5.6066e+01 -5.5831e+01 -5.0940e+01 -5.1178e+01 -5.6092e+01 -5.5806e+01 -5.0931e+01 -5.1149e+01 -5.6118e+01 -5.5781e+01 -5.0922e+01 -5.1121e+01 -5.6143e+01 -5.5756e+01 -5.0913e+01 -5.1085e+01 -5.6168e+01 -5.5731e+01 -5.0904e+01 -5.1051e+01 -5.6192e+01 -5.5706e+01 -5.0896e+01 -5.1017e+01 -5.6216e+01 -5.5681e+01 -5.0887e+01 -5.0983e+01 -5.6239e+01 -5.5657e+01 -5.0879e+01 -5.0950e+01 -5.6261e+01 -5.5633e+01 -5.0871e+01 -5.0919e+01 -5.6284e+01 -5.5609e+01 -5.0863e+01 -5.0887e+01 -5.6306e+01 -5.5585e+01 -5.0855e+01 -5.0857e+01 -5.6327e+01 -5.5561e+01 -5.0847e+01 -5.0827e+01 -5.6348e+01 -5.5537e+01 -5.0840e+01 -5.0797e+01 -5.6368e+01 -5.5514e+01 -5.0832e+01 -5.0768e+01 -5.6388e+01 -5.5490e+01 -5.0825e+01 -5.0740e+01 -5.6407e+01 -5.5467e+01 -5.0818e+01 -5.0713e+01 -5.6426e+01 -5.5444e+01 -5.0810e+01 -5.0686e+01 -5.6445e+01 -5.5417e+01 -5.0800e+01 -5.0659e+01 -5.6463e+01 -5.5386e+01 -5.0785e+01 -5.0633e+01 -5.6480e+01 -5.5356e+01 -5.0770e+01 -5.0608e+01 -5.6497e+01 -5.5326e+01 -5.0756e+01 -5.0583e+01 -5.6514e+01 -5.5296e+01 -5.0742e+01 -5.0559e+01 -5.6530e+01 -5.5267e+01 -5.0728e+01 -5.0535e+01 -5.6546e+01 -5.5237e+01 -5.0715e+01 -5.0512e+01 -5.6561e+01 -5.5208e+01 -5.0701e+01 -5.0489e+01 -5.6576e+01 -5.5180e+01 -5.0688e+01 -5.0467e+01 -5.6591e+01 -5.5151e+01 -5.0676e+01 -5.0445e+01 -5.6604e+01 -5.5123e+01 -5.0663e+01 -5.0424e+01 -5.6618e+01 -5.5095e+01 -5.0651e+01 -5.0403e+01 -5.6631e+01 -5.5068e+01 -5.0639e+01 -5.0383e+01 -5.6644e+01 -5.5040e+01 -5.0627e+01 -5.0362e+01 -5.6656e+01 -5.5013e+01 -5.0616e+01 -5.0343e+01 -5.6668e+01 -5.4987e+01 -5.0604e+01 -5.0324e+01 -5.6679e+01 -5.4960e+01 -5.0593e+01 -5.0305e+01 -5.6690e+01 -5.4934e+01 -5.0582e+01 -5.0286e+01 -5.6701e+01 -5.4907e+01 -5.0571e+01 -5.0268e+01 -5.6711e+01 -5.4882e+01 -5.0554e+01 -5.0251e+01 -5.6721e+01 -5.4856e+01 -5.0536e+01 -5.0233e+01 -5.6730e+01 -5.4830e+01 -5.0518e+01 -5.0216e+01 -5.6739e+01 -5.4805e+01 -5.0501e+01 -5.0200e+01 -5.6747e+01 -5.4780e+01 -5.0484e+01 -5.0184e+01 -5.6756e+01 -5.4755e+01 -5.0467e+01 -5.0168e+01 -5.6763e+01 -5.4730e+01 -5.0451e+01 -5.0152e+01 -5.6771e+01 -5.4706e+01 -5.0435e+01 -5.0137e+01 -5.6778e+01 -5.4682e+01 -5.0415e+01 -5.0117e+01 -5.6784e+01 -5.4658e+01 -5.0392e+01 -5.0094e+01 -5.6790e+01 -5.4634e+01 -5.0369e+01 -5.0070e+01 -5.6796e+01 -5.4610e+01 -5.0347e+01 -5.0040e+01 -5.6802e+01 -5.4586e+01 -5.0325e+01 -5.0011e+01 -5.6807e+01 -5.4563e+01 -5.0304e+01 -1.0000e+01 -5.6812e+01 -5.4540e+01 -5.0283e+01 -6.0000e+01 -5.6816e+01 -5.4517e+01 -5.0263e+01 -6.0000e+01 -5.6820e+01 -5.4494e+01 -5.0243e+01 -6.0000e+01 -5.6824e+01 -5.4471e+01 -5.0224e+01 -6.0000e+01 -5.6827e+01 -5.4449e+01 -5.0205e+01 -6.0000e+01 -5.6830e+01 -5.4426e+01 -5.0186e+01 -6.0000e+01 -5.6832e+01 -5.4404e+01 -5.0168e+01 -6.0000e+01 -5.6835e+01 -5.4382e+01 -5.0150e+01 -6.0000e+01 -5.6836e+01 -5.4360e+01 -5.0133e+01 -6.0000e+01 -5.6838e+01 -5.4338e+01 -5.0116e+01 -6.0000e+01 -5.6839e+01 -5.4316e+01 -5.0099e+01 -6.0000e+01 -5.6840e+01 -5.4295e+01 -5.0083e+01 -6.0000e+01 -5.6841e+01 -5.4273e+01 -5.0067e+01 -6.0000e+01 -5.6841e+01 -5.4252e+01 -5.0051e+01 -6.0000e+01 -5.6841e+01 -5.4231e+01 -5.0036e+01 -6.0000e+01 -5.6840e+01 -5.4210e+01 -5.0021e+01 -6.0000e+01 -5.6840e+01 -5.4189e+01 -5.0007e+01 -6.0000e+01 -5.6839e+01 -5.4168e+01 -1.0000e+01 -6.0000e+01 -5.6837e+01 -5.4147e+01 -6.0000e+01 -6.0000e+01 -5.6836e+01 -5.4127e+01 -6.0000e+01 -6.0000e+01 -5.6834e+01 -5.4103e+01 -6.0000e+01 -6.0000e+01 -5.6832e+01 -5.4075e+01 -6.0000e+01 -6.0000e+01 -5.6829e+01 -5.4047e+01 -6.0000e+01 -6.0000e+01 -5.6826e+01 -5.4019e+01 -6.0000e+01 -6.0000e+01 -5.6823e+01 -5.3992e+01 -6.0000e+01 -6.0000e+01 -5.6820e+01 -5.3965e+01 -6.0000e+01 -6.0000e+01 -5.6816e+01 -5.3938e+01 -6.0000e+01 -6.0000e+01 -5.6812e+01 -5.3912e+01 -6.0000e+01 -6.0000e+01 -5.6808e+01 -5.3885e+01 -6.0000e+01 -6.0000e+01 -5.6821e+01 -5.3859e+01 -6.0000e+01 -6.0000e+01 -5.6853e+01 -5.3834e+01 -6.0000e+01 -6.0000e+01 -5.6884e+01 -5.3808e+01 -6.0000e+01 -6.0000e+01 -5.6907e+01 -5.3783e+01 -6.0000e+01 -6.0000e+01 -5.6929e+01 -5.3758e+01 -6.0000e+01 -6.0000e+01 -5.6950e+01 -5.3734e+01 -6.0000e+01 -6.0000e+01 -5.6971e+01 -5.3709e+01 -6.0000e+01 -6.0000e+01 -5.6991e+01 -5.3685e+01 -6.0000e+01 -6.0000e+01 -5.7010e+01 -5.3661e+01 -6.0000e+01 -6.0000e+01 -5.7029e+01 -5.3637e+01 -6.0000e+01 -6.0000e+01 -5.7048e+01 -5.3614e+01 -6.0000e+01 -6.0000e+01 -5.7066e+01 -5.3591e+01 -6.0000e+01 -6.0000e+01 -5.7084e+01 -5.3567e+01 -6.0000e+01 -6.0000e+01 -5.7101e+01 -5.3536e+01 -6.0000e+01 -6.0000e+01 -5.7118e+01 -5.3506e+01 -6.0000e+01 -6.0000e+01 -5.7134e+01 -5.3476e+01 -6.0000e+01 -6.0000e+01 -5.7150e+01 -5.3446e+01 -6.0000e+01 -6.0000e+01 -5.7165e+01 -5.3417e+01 -6.0000e+01 -6.0000e+01 -5.7179e+01 -5.3388e+01 -6.0000e+01 -6.0000e+01 -5.7194e+01 -5.3360e+01 -6.0000e+01 -6.0000e+01 -5.7207e+01 -5.3331e+01 -6.0000e+01 -5.9995e+01 -5.7221e+01 -5.3304e+01 -6.0000e+01 -5.9987e+01 -5.7234e+01 -5.3276e+01 -6.0000e+01 -5.9979e+01 -5.7246e+01 -5.3249e+01 -6.0000e+01 -5.9970e+01 -5.7258e+01 -5.3222e+01 -6.0000e+01 -5.9961e+01 -5.7269e+01 -5.3196e+01 -6.0000e+01 -5.9952e+01 -5.7280e+01 -5.3170e+01 -6.0000e+01 -5.9943e+01 -5.7291e+01 -5.3144e+01 -6.0000e+01 -5.9934e+01 -5.7301e+01 -5.3118e+01 -6.0000e+01 -5.9924e+01 -5.7311e+01 -5.3093e+01 -6.0000e+01 -5.9914e+01 -5.7320e+01 -5.3068e+01 -6.0000e+01 -5.9904e+01 -5.7324e+01 -5.3043e+01 -6.0000e+01 -5.9893e+01 -5.7324e+01 -5.3019e+01 -6.0000e+01 -5.9883e+01 -5.7325e+01 -5.2995e+01 -6.0000e+01 -5.9872e+01 -5.7325e+01 -5.2970e+01 -6.0000e+01 -5.9861e+01 -5.7325e+01 -5.2939e+01 -6.0000e+01 -5.9850e+01 -5.7324e+01 -5.2908e+01 -6.0000e+01 -5.9838e+01 -5.7324e+01 -5.2877e+01 -6.0000e+01 -5.9827e+01 -5.7323e+01 -5.2847e+01 -5.9965e+01 -5.9815e+01 -5.7322e+01 -5.2817e+01 -5.9898e+01 -5.9803e+01 -5.7320e+01 -5.2773e+01 -5.9831e+01 -5.9784e+01 -5.7319e+01 -5.2728e+01 -5.9765e+01 -5.9763e+01 -5.7317e+01 -5.2685e+01 -5.9700e+01 -5.9743e+01 -5.7315e+01 -5.2642e+01 -5.9635e+01 -5.9722e+01 -5.7313e+01 -5.2600e+01 -5.9570e+01 -5.9702e+01 -5.7310e+01 -5.2558e+01 -5.9507e+01 -5.9682e+01 -5.7308e+01 -5.2518e+01 -5.9444e+01 -5.9661e+01 -5.7342e+01 -5.2478e+01 -5.9381e+01 -5.9641e+01 -5.7375e+01 -5.2438e+01 -5.9319e+01 -5.9620e+01 -5.7407e+01 -5.2400e+01 -5.9258e+01 -5.9600e+01 -5.7439e+01 -5.2362e+01 -5.9190e+01 -5.9579e+01 -5.7470e+01 -5.2325e+01 -5.9121e+01 -5.9558e+01 -5.7500e+01 -5.2288e+01 -5.9054e+01 -5.9538e+01 -5.7530e+01 -5.2252e+01 -5.8987e+01 -5.9517e+01 -5.7553e+01 -5.2217e+01 -5.8921e+01 -5.9496e+01 -5.7573e+01 -5.2181e+01 -5.8898e+01 -5.9475e+01 -5.7593e+01 -5.2139e+01 -5.8877e+01 -5.9454e+01 -5.7613e+01 -5.2098e+01 -5.8856e+01 -5.9434e+01 -5.7632e+01 -5.2058e+01 -5.8836e+01 -5.9413e+01 -5.7651e+01 -5.2013e+01 -5.8815e+01 -5.9392e+01 -5.7669e+01 -5.1966e+01 -5.8794e+01 -5.9371e+01 -5.7686e+01 -5.1920e+01 -5.8774e+01 -5.9349e+01 -5.7701e+01 -5.1875e+01 -5.8750e+01 -5.9328e+01 -5.7710e+01 -5.1831e+01 -5.8722e+01 -5.9307e+01 -5.7718e+01 -5.1787e+01 -5.8693e+01 -5.9286e+01 -5.7727e+01 -5.1745e+01 -5.8665e+01 -5.9264e+01 -5.7735e+01 -5.1703e+01 -5.8637e+01 -5.9243e+01 -5.7743e+01 -5.1663e+01 -5.8609e+01 -5.9221e+01 -5.7750e+01 -5.1623e+01 -5.8581e+01 -5.9200e+01 -5.7757e+01 -5.1583e+01 -5.8553e+01 -5.9178e+01 -5.7764e+01 -5.1545e+01 -5.8526e+01 -5.9157e+01 -5.7771e+01 -5.1507e+01 -5.8498e+01 -5.9135e+01 -5.7777e+01 -5.1470e+01 -5.8471e+01 -5.9113e+01 -5.7784e+01 -5.1434e+01 -5.8444e+01 -5.9091e+01 -5.7789e+01 -5.1399e+01 -5.8417e+01 -5.9069e+01 -5.7795e+01 -5.1364e+01 -5.8390e+01 -5.9048e+01 -5.7802e+01 -5.1330e+01 -5.8363e+01 -5.9025e+01 -5.7843e+01 -5.1296e+01 -5.8337e+01 -5.9003e+01 -5.7876e+01 -5.1263e+01 -5.8310e+01 -5.8981e+01 -5.7909e+01 -5.1231e+01 -5.8284e+01 -5.8959e+01 -5.7940e+01 -5.1199e+01 -5.8258e+01 -5.8937e+01 -5.7972e+01 -5.1168e+01 -5.8232e+01 -5.8914e+01 -5.8002e+01 -5.1138e+01 -5.8205e+01 -5.8892e+01 -5.8033e+01 -5.1108e+01 -5.8180e+01 -5.8870e+01 -5.8062e+01 -5.1079e+01 -5.8154e+01 -5.8847e+01 -5.8091e+01 -5.1050e+01 -5.8128e+01 -5.8824e+01 -5.8120e+01 -5.1022e+01 -5.8102e+01 -5.8802e+01 -5.8148e+01 -5.0995e+01 -5.8076e+01 -5.8779e+01 -5.8168e+01 -5.0968e+01 -5.8051e+01 -5.8756e+01 -5.8187e+01 -5.0941e+01 -5.8025e+01 -5.8733e+01 -5.8206e+01 -5.0915e+01 -5.8000e+01 -5.8711e+01 -5.8224e+01 -5.0889e+01 -5.7975e+01 -5.8688e+01 -5.8234e+01 -5.0898e+01 -5.7943e+01 -5.8665e+01 -5.8244e+01 -5.0918e+01 -5.7910e+01 -5.8641e+01 -5.8254e+01 -5.0937e+01 -5.7878e+01 -5.8618e+01 -5.8263e+01 -5.0956e+01 -5.7845e+01 -5.8595e+01 -5.8272e+01 -5.0975e+01 -5.7813e+01 -5.8572e+01 -5.8282e+01 -5.0994e+01 -5.7781e+01 -5.8549e+01 -5.8290e+01 -5.1013e+01 -5.7749e+01 -5.8525e+01 -5.8299e+01 -5.1031e+01 -5.7717e+01 -5.8502e+01 -5.8308e+01 -5.1049e+01 -5.7686e+01 -5.8478e+01 -5.8316e+01 -5.1067e+01 -5.7655e+01 -5.8455e+01 -5.8324e+01 -5.1085e+01 -5.7624e+01 -5.8431e+01 -5.8332e+01 -5.1102e+01 -5.7593e+01 -5.8408e+01 -5.8339e+01 -5.1120e+01 -5.7563e+01 -5.8384e+01 -5.8347e+01 -5.1137e+01 -5.7532e+01 -5.8360e+01 -5.8354e+01 -5.1154e+01 -5.7502e+01 -5.8336e+01 -5.8361e+01 -5.1171e+01 -5.7472e+01 -5.8312e+01 -5.8367e+01 -5.1187e+01 -5.7443e+01 -5.8289e+01 -5.8374e+01 -5.1203e+01 -5.7413e+01 -5.8265e+01 -5.8380e+01 -5.1219e+01 -5.7384e+01 -5.8241e+01 -5.8386e+01 -5.1235e+01 -5.7354e+01 -5.8217e+01 -5.8391e+01 -5.1251e+01 -5.7325e+01 -5.8192e+01 -5.8397e+01 -5.1266e+01 -5.7296e+01 -5.8168e+01 -5.8402e+01 -5.1282e+01 -5.7268e+01 -5.8144e+01 -5.8407e+01 -5.1303e+01 -5.7239e+01 -5.8120e+01 -5.8411e+01 -5.1362e+01 -5.7211e+01 -5.8096e+01 -5.8416e+01 -5.1420e+01 -5.7182e+01 -5.8071e+01 -5.8420e+01 -5.1478e+01 -5.7148e+01 -5.8047e+01 -5.8424e+01 -5.1535e+01 -5.7107e+01 -5.8023e+01 -5.8427e+01 -5.1591e+01 -5.7063e+01 -5.7998e+01 -5.8430e+01 -5.1646e+01 -5.7021e+01 -5.7974e+01 -5.8433e+01 -5.1700e+01 -5.6978e+01 -5.7949e+01 -5.8436e+01 -5.1753e+01 -5.6936e+01 -5.7925e+01 -5.8439e+01 -5.1806e+01 -5.6895e+01 -5.7900e+01 -5.8441e+01 -5.1858e+01 -5.6854e+01 -5.7875e+01 -5.8443e+01 -5.1909e+01 -5.6814e+01 -5.7851e+01 -5.8444e+01 -5.1959e+01 -5.6774e+01 -5.7826e+01 -5.8446e+01 -5.2008e+01 -5.6734e+01 -5.7801e+01 -5.8447e+01 -5.2057e+01 -5.6695e+01 -5.7777e+01 -5.8448e+01 -5.2104e+01 -5.6656e+01 -5.7752e+01 -5.8448e+01 -5.2151e+01 -5.6618e+01 -5.7727e+01 -5.8448e+01 -5.2198e+01 -5.6580e+01 -5.7702e+01 -5.8448e+01 -5.2243e+01 -5.6543e+01 -5.7677e+01 -5.8448e+01 -5.2288e+01 -5.6506e+01 -5.7652e+01 -5.8448e+01 -5.2332e+01 -5.6469e+01 -5.7628e+01 -5.8447e+01 -5.2375e+01 -5.6433e+01 -5.7603e+01 -5.8446e+01 -5.2417e+01 -5.6397e+01 -5.7578e+01 -5.8444e+01 -5.2459e+01 -5.6362e+01 -5.7553e+01 -5.8443e+01 -5.2500e+01 -5.6327e+01 -5.7528e+01 -5.8441e+01 -5.2541e+01 -5.6292e+01 -5.7503e+01 -5.8439e+01 -5.2580e+01 -5.6257e+01 -5.7478e+01 -5.8436e+01 -5.2619e+01 -5.6223e+01 -5.7453e+01 -5.8433e+01 -5.2695e+01 -5.6189e+01 -5.7427e+01 -5.8430e+01 -5.2777e+01 -5.6156e+01 -5.7402e+01 -5.8427e+01 -5.2857e+01 -5.6123e+01 -5.7377e+01 -5.8443e+01 -5.2937e+01 -5.6090e+01 -5.7352e+01 -5.8476e+01 -5.3014e+01 -5.6057e+01 -5.7327e+01 -5.8508e+01 -5.3091e+01 -5.6025e+01 -5.7302e+01 -5.8539e+01 -5.3166e+01 -5.5993e+01 -5.7277e+01 -5.8569e+01 -5.3238e+01 -5.5961e+01 -5.7251e+01 -5.8599e+01 -5.3302e+01 -5.5929e+01 -5.7226e+01 -5.8628e+01 -5.3366e+01 -5.5890e+01 -5.7201e+01 -5.8649e+01 -5.3429e+01 -5.5851e+01 -5.7176e+01 -5.8668e+01 -5.3490e+01 -5.5813e+01 -5.7151e+01 -5.8688e+01 -5.3551e+01 -5.5775e+01 -5.7125e+01 -5.8706e+01 -5.3610e+01 -5.5738e+01 -5.7098e+01 -5.8725e+01 -5.3669e+01 -5.5701e+01 -5.7058e+01 -5.8743e+01 -5.3727e+01 -5.5665e+01 -5.7017e+01 -5.8760e+01 -5.3783e+01 -5.5628e+01 -5.6977e+01 -5.8777e+01 -5.3839e+01 -5.5584e+01 -5.6936e+01 -5.8793e+01 -5.3894e+01 -5.5541e+01 -5.6897e+01 -5.8809e+01 -5.3947e+01 -5.5499e+01 -5.6857e+01 -5.8820e+01 -5.4000e+01 -5.5457e+01 -5.6819e+01 -5.8827e+01 -5.4052e+01 -5.5415e+01 -5.6780e+01 -5.8833e+01 -5.4098e+01 -5.5375e+01 -5.6742e+01 -5.8840e+01 -5.4140e+01 -5.5334e+01 -5.6704e+01 -5.8846e+01 -5.4182e+01 -5.5295e+01 -5.6666e+01 -5.8851e+01 -5.4222e+01 -5.5255e+01 -5.6629e+01 -5.8857e+01 -5.4263e+01 -5.5217e+01 -5.6592e+01 -5.8862e+01 -5.4302e+01 -5.5178e+01 -5.6555e+01 -5.8867e+01 -5.4341e+01 -5.5141e+01 -5.6519e+01 -5.8871e+01 -5.4379e+01 -5.5103e+01 -5.6483e+01 -5.8868e+01 -5.4416e+01 -5.5067e+01 -5.6439e+01 -5.8864e+01 -5.4460e+01 -5.5030e+01 -5.6396e+01 -5.8860e+01 -5.4541e+01 -5.4994e+01 -5.6353e+01 -5.8856e+01 -5.4620e+01 -5.4959e+01 -5.6311e+01 -5.8852e+01 -5.4698e+01 -5.4924e+01 -5.6269e+01 -5.8847e+01 -5.4775e+01 -5.4889e+01 -5.6228e+01 -5.8843e+01 -5.4851e+01 -5.4855e+01 -5.6181e+01 -5.8839e+01 -5.4925e+01 -5.4821e+01 -5.6132e+01 -5.8834e+01 -5.4998e+01 -5.4788e+01 -5.6083e+01 -5.8829e+01 -5.5069e+01 -5.4755e+01 -5.6028e+01 -5.8824e+01 -5.5140e+01 -5.4722e+01 -5.5973e+01 -5.8819e+01 -5.5209e+01 -5.4690e+01 -5.5920e+01 -5.8814e+01 -5.5277e+01 -5.4658e+01 -5.5867e+01 -5.8803e+01 -5.5343e+01 -5.4627e+01 -5.5815e+01 -5.8790e+01 -5.5409e+01 -5.4595e+01 -5.5764e+01 -5.8776e+01 -5.5473e+01 -5.4562e+01 -5.5714e+01 -5.8763e+01 -5.5537e+01 -5.4523e+01 -5.5664e+01 -5.8750e+01 -5.5599e+01 -5.4485e+01 -5.5615e+01 -5.8736e+01 -5.5660e+01 -5.4448e+01 -5.5566e+01 -5.8723e+01 -5.5719e+01 -5.4411e+01 -5.5519e+01 -5.8710e+01 -5.5778e+01 -5.4375e+01 -5.5471e+01 -5.8697e+01 -5.5836e+01 -5.4339e+01 -5.5425e+01 -5.8683e+01 -5.5892e+01 -5.4326e+01 -5.5379e+01 -5.8670e+01 -5.5948e+01 -5.4335e+01 -5.5334e+01 -5.8657e+01 -5.6002e+01 -5.4365e+01 -5.5289e+01 -5.8643e+01 -5.6055e+01 -5.4419e+01 -5.5245e+01 -5.8630e+01 -5.6103e+01 -5.4471e+01 -5.5202e+01 -5.8617e+01 -5.6146e+01 -5.4523e+01 -5.5157e+01 -5.8603e+01 -5.6188e+01 -5.4573e+01 -5.5107e+01 -5.8590e+01 -5.6230e+01 -5.4623e+01 -5.5057e+01 -5.8569e+01 -5.6271e+01 -5.4672e+01 -5.5008e+01 -5.8548e+01 -5.6311e+01 -5.4720e+01 -5.4960e+01 -5.8527e+01 -5.6345e+01 -5.4762e+01 -5.4913e+01 -5.8506e+01 -5.6376e+01 -5.4801e+01 -5.4866e+01 -5.8485e+01 -5.6406e+01 -5.4839e+01 -5.4820e+01 -5.8465e+01 -5.6435e+01 -5.4876e+01 -5.4775e+01 -5.8444e+01 -5.6464e+01 -5.4913e+01 -5.4731e+01 -5.8424e+01 -5.6492e+01 -5.4949e+01 -5.4687e+01 -5.8403e+01 -5.6520e+01 -5.4985e+01 -5.4643e+01 -5.8383e+01 -5.6547e+01 -5.5020e+01 -5.4600e+01 -5.8363e+01 -5.6573e+01 -5.5054e+01 -5.4558e+01 -5.8343e+01 -5.6599e+01 -5.5088e+01 -5.4517e+01 -5.8321e+01 -5.6625e+01 -5.5121e+01 -5.4476e+01 -5.8294e+01 -5.6649e+01 -5.5154e+01 -5.4435e+01 -5.8266e+01 -5.6673e+01 -5.5186e+01 -5.4395e+01 -5.8239e+01 -5.6697e+01 -5.5217e+01 -5.4356e+01 -5.8212e+01 -5.6720e+01 -5.5248e+01 -5.4317e+01 -5.8185e+01 -5.6743e+01 -5.5278e+01 -5.4279e+01 -5.8158e+01 -5.6765e+01 -5.5308e+01 -5.4241e+01 -5.8132e+01 -5.6786e+01 -5.5337e+01 -5.4204e+01 -5.8106e+01 -5.6807e+01 -5.5365e+01 -5.4167e+01 -5.8080e+01 -5.6827e+01 -5.5393e+01 -5.4131e+01 -5.8051e+01 -5.6847e+01 -5.5420e+01 -5.4095e+01 -5.8018e+01 -5.6867e+01 -5.5447e+01 -5.4060e+01 -5.7985e+01 -5.6885e+01 -5.5473e+01 -5.4025e+01 -5.7952e+01 -5.6904e+01 -5.5499e+01 -5.3991e+01 -5.7920e+01 -5.6921e+01 -5.5524e+01 -5.3957e+01 -5.7888e+01 -5.6939e+01 -5.5549e+01 -5.3923e+01 -5.7857e+01 -5.6955e+01 -5.5573e+01 -5.3890e+01 -5.7825e+01 -5.6972e+01 -5.5596e+01 -5.3857e+01 -5.7795e+01 -5.6987e+01 -5.5619e+01 -5.3825e+01 -5.7764e+01 -5.7003e+01 -5.5642e+01 -5.3793e+01 -5.7734e+01 -5.7017e+01 -5.5664e+01 -5.3761e+01 -5.7704e+01 -5.7031e+01 -5.5685e+01 -5.3730e+01 -5.7674e+01 -5.7045e+01 -5.5706e+01 -5.3700e+01 -5.7645e+01 -5.7058e+01 -5.5726e+01 -5.3669e+01 -5.7616e+01 -5.7067e+01 -5.5746e+01 -5.3639e+01 -5.7587e+01 -5.7071e+01 -5.5765e+01 -5.3610e+01 -5.7558e+01 -5.7076e+01 -5.5784e+01 -5.3580e+01 -5.7530e+01 -5.7079e+01 -5.5803e+01 -5.3552e+01 -5.7502e+01 -5.7083e+01 -5.5820e+01 -5.3568e+01 -5.7474e+01 -5.7086e+01 -5.5838e+01 -5.3584e+01 -5.7447e+01 -5.7089e+01 -5.5855e+01 -5.3599e+01 -5.7419e+01 -5.7092e+01 -5.5871e+01 -5.3614e+01 -5.7392e+01 -5.7095e+01 -5.5887e+01 -5.3629e+01 -5.7365e+01 -5.7097e+01 -5.5902e+01 -5.3643e+01 -5.7339e+01 -5.7099e+01 -5.5917e+01 -5.3657e+01 -5.7312e+01 -5.7101e+01 -5.5932e+01 -5.3671e+01 -5.7286e+01 -5.7100e+01 -5.5946e+01 -5.3685e+01 -5.7260e+01 -5.7093e+01 -5.5960e+01 -5.3698e+01 -5.7226e+01 -5.7086e+01 -5.5973e+01 -5.3710e+01 -5.7193e+01 -5.7079e+01 -5.5985e+01 -5.3722e+01 -5.7159e+01 -5.7072e+01 -5.5998e+01 -5.3726e+01 -5.7127e+01 -5.7065e+01 -5.6009e+01 -5.3730e+01 -5.7094e+01 -5.7057e+01 -5.6021e+01 -5.3734e+01 -5.7062e+01 -5.7042e+01 -5.6032e+01 -5.3738e+01 -5.7030e+01 -5.7026e+01 -5.6042e+01 -5.3742e+01 -5.6999e+01 -5.7006e+01 -5.6052e+01 -5.3745e+01 -5.6967e+01 -5.6983e+01 -5.6062e+01 -5.3749e+01 -5.6934e+01 -5.6960e+01 -5.6071e+01 -5.3752e+01 -5.6895e+01 -5.6938e+01 -5.6080e+01 -5.3755e+01 -5.6857e+01 -5.6916e+01 -5.6089e+01 -5.3758e+01 -5.6819e+01 -5.6895e+01 -5.6097e+01 -5.3761e+01 -5.6782e+01 -5.6873e+01 -5.6104e+01 -5.3764e+01 -5.6746e+01 -5.6852e+01 -5.6112e+01 -5.3763e+01 -5.6710e+01 -5.6826e+01 -5.6129e+01 -5.3756e+01 -5.6674e+01 -5.6794e+01 -5.6180e+01 -5.3741e+01 -5.6638e+01 -5.6758e+01 -5.6230e+01 -5.3720e+01 -5.6604e+01 -5.6723e+01 -5.6279e+01 -5.3699e+01 -5.6569e+01 -5.6688e+01 -5.6327e+01 -5.3679e+01 -5.6535e+01 -5.6653e+01 -5.6374e+01 -5.3659e+01 -5.6501e+01 -5.6620e+01 -5.6420e+01 -5.3640e+01 -5.6468e+01 -5.6586e+01 -5.6464e+01 -5.3621e+01 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/example_data_about.json0000644000175100001660000000041514743453644017254 0ustar00runnerdocker{ "filename": "example_data.txt", "delimiter": " ", "timecolumn": null, "units": "mV", "time_units": "ms", "sampling_rate": { "value": 1.0, "units": "kHz" }, "method": "genfromtxt", "signal_group_mode": "all-in-one" }././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/make.bat0000644000175100001660000000577514743453644014166 0ustar00runnerdocker@ECHO OFF REM Command file for Sphinx documentation set SPHINXBUILD=sphinx-build set BUILDDIR=build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\neo.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\neo.ghc goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1154153 neo-0.14.0/doc/old_stuffs/0000755000175100001660000000000014743453656014716 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/old_stuffs/core.rst0000644000175100001660000002653614743453644016411 0ustar00runnerdocker******** Neo core ******** .. currentmodule:: neo.core This figure shows the main data types in Neo, with the exception of the newly added ImageSequence and RegionOfInterest classes: .. image:: images/base_schematic.png :height: 500 px :alt: Illustration of the main Neo data types :align: center Neo objects fall into three categories: data objects, container objects and grouping objects. Data objects ------------ These objects directly represent data as arrays of numerical values with associated metadata (units, sampling frequency, etc.). * :py:class:`AnalogSignal`: A regular sampling of a single- or multi-channel continuous analog signal. * :py:class:`IrregularlySampledSignal`: A non-regular sampling of a single- or multi-channel continuous analog signal. * :py:class:`SpikeTrain`: A set of action potentials (spikes) emitted by the same unit in a period of time (with optional waveforms). * :py:class:`Event`: An array of time points representing one or more events in the data. * :py:class:`Epoch`: An array of time intervals representing one or more periods of time in the data. * :py:class:`ImageSequence`: A three dimensional array representing a sequence of images. Container objects ----------------- There is a simple hierarchy of containers: * :py:class:`Segment`: A container for heterogeneous discrete or continuous data sharing a common clock (time basis) but not necessarily the same sampling rate, start time or end time. A :py:class:`Segment` can be considered as equivalent to a "trial", "episode", "run", "recording", etc., depending on the experimental context. May contain any of the data objects. * :py:class:`Block`: The top-level container gathering all of the data, discrete and continuous, for a given recording session. Contains :class:`Segment` and :class:`Group` objects. Grouping/linking objects ------------------------ These objects express the relationships between data items, such as which signals were recorded on which electrodes, which spike trains were obtained from which membrane potential signals, etc. They contain references to data objects that cut across the simple container hierarchy. * :py:class:`ChannelView`: A set of indices into :py:class:`AnalogSignal` objects, representing logical and/or physical recording channels. For spike sorting of extracellular signals, where spikes may be recorded on more than one recording channel, the :py:class:`ChannelView` can be used to reference the group of recording channels from which the spikes were obtained. * :py:class:`Group`: Can contain any of the data objects, views, or other groups, outside the hierarchy of the segment and block containers. A common use is to link the :class:`SpikeTrain` objects within a :class:`Block`, possibly across multiple Segments, that were emitted by the same neuron. * :py:class:`CircularRegionOfInterest`, :py:class:`RectangularRegionOfInterest` and :py:class:`PolygonRegionOfInterest` are three subclasses that link :class:`ImageSequence` objects to signals (:class:`AnalogSignal` objects) extracted from them. For more details, see :doc:`grouping`. NumPy compatibility =================== Neo data objects inherit from :py:class:`Quantity`, which in turn inherits from NumPy :py:class:`ndarray`. This means that a Neo :py:class:`AnalogSignal` is also a :py:class:`Quantity` and an array, giving you access to all of the methods available for those objects. For example, you can pass a :py:class:`SpikeTrain` directly to the :py:func:`numpy.histogram` function, or an :py:class:`AnalogSignal` directly to the :py:func:`numpy.std` function. If you want to get a numpy.ndarray you use magnitude and rescale from quantities:: >>> np_sig = neo_analogsignal.rescale('mV').magnitude >>> np_times = neo_analogsignal.times.rescale('s').magnitude Relationships between objects ============================= Container objects like :py:class:`Block` or :py:class:`Segment` are gateways to access other objects. For example, a :class:`Block` can access a :class:`Segment` with:: >>> bl = Block() >>> bl.segments # gives a list of segments A :class:`Segment` can access the :class:`AnalogSignal` objects that it contains with:: >>> seg = Segment() >>> seg.analogsignals # gives a list of AnalogSignals In the :ref:`neo_diagram` below, these *one to many* relationships are represented by cyan arrows. In general, an object can access its children with an attribute *childname+s* in lower case, e.g. * :attr:`Block.segments` * :attr:`Segments.analogsignals` * :attr:`Segments.spiketrains` * :attr:`Block.groups` These relationships are bi-directional, i.e. a child object can access its parent: * :attr:`Segment.block` * :attr:`AnalogSignal.segment` * :attr:`SpikeTrain.segment` * :attr:`Group.block` Here is an example showing these relationships in use:: from neo.io import AxonIO import urllib.request url = "https://web.gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/axon/File_axon_3.abf" filename = './test.abf' urllib.request.urlretrieve(url, filename) r = AxonIO(filename=filename) blocks = r.read() # read the entire file > a list of Blocks bl = blocks[0] print(bl) print(bl.segments) # child access for seg in bl.segments: print(seg) print(seg.block) # parent access In some cases, a one-to-many relationship is sufficient. Here is a simple example with tetrodes, in which each tetrode has its own group.:: from neo import Block, Group bl = Block() # the four tetrodes for i in range(4): group = Group(name='Tetrode %d' % i) bl.groups.append(group) # now we load the data and associate it with the created channels # ... Now consider a more complex example: a 1x4 silicon probe, with a neuron on channels 0,1,2 and another neuron on channels 1,2,3. We create a group for each neuron to hold the spiketrains for each spike sorting group together with the channels on which that neuron spiked:: bl = Block(name='probe data') # one group for each neuron view0 = ChannelView(recorded_signals, index=[0, 1, 2]) unit0 = Group(view0, name='Group 0') bl.groups.append(unit0) view1 = ChannelView(recorded_signals, index=[1, 2, 3]) unit1 = Group(view1, name='Group 1') bl.groups.append(unit1) # now we add the spiketrains from Unit 0 to unit0 # and add the spiketrains from Unit 1 to unit1 # ... Now each putative neuron is represented by a :class:`Group` containing the spiketrains of that neuron and a view of the signal selecting only those channels from which the spikes were obtained. See :doc:`usecases` for more examples of how the different objects may be used. .. _neo_diagram: Neo diagram =========== Object: * With a star = inherits from :class:`Quantity` Attributes: * In red = required * In white = recommended Relationship: * In cyan = one to many * In yellow = properties (deduced from other relationships) .. image:: images/simple_generated_diagram.png :width: 750 px :download:`Click here for a better quality SVG diagram <./images/simple_generated_diagram.svg>` .. note:: This figure does not include :class:`ChannelView` and :class:`RegionOfInterest`. For more details, see the :doc:`api_reference`. Initialization ============== Neo objects are initialized with "required", "recommended", and "additional" arguments. - Required arguments MUST be provided at the time of initialization. They are used in the construction of the object. - Recommended arguments may be provided at the time of initialization. They are accessible as Python attributes. They can also be set or modified after initialization. - Additional arguments are defined by the user and are not part of the Neo object model. A primary goal of the Neo project is extensibility. These additional arguments are entries in an attribute of the object: a Python dict called :py:attr:`annotations`. Note : Neo annotations are not the same as the *__annotations__* attribute introduced in Python 3.6. Example: SpikeTrain ------------------- :py:class:`SpikeTrain` is a :py:class:`Quantity`, which is a NumPy array containing values with physical dimensions. The spike times are a required attribute, because the dimensionality of the spike times determines the way in which the :py:class:`Quantity` is constructed. Here is how you initialize a :py:class:`SpikeTrain` with required arguments:: >>> import neo >>> st = neo.SpikeTrain([3, 4, 5], units='sec', t_stop=10.0) >>> print(st) [ 3. 4. 5.] s You will see the spike times printed in a nice format including the units. Because `st` "is a" :py:class:`Quantity` array with units of seconds, it absolutely must have this information at the time of initialization. You can specify the spike times with a keyword argument too:: >>> st = neo.SpikeTrain(times=[3, 4, 5], units='sec', t_stop=10.0) The spike times could also be in a NumPy array. If it is not specified, :attr:`t_start` is assumed to be zero, but another value can easily be specified:: >>> st = neo.SpikeTrain(times=[3, 4, 5], units='sec', t_start=1.0, t_stop=10.0) >>> st.t_start array(1.0) * s Recommended attributes must be specified as keyword arguments, not positional arguments. Finally, let's consider "additional arguments". These are the ones you define for your experiment:: >>> st = neo.SpikeTrain(times=[3, 4, 5], units='sec', t_stop=10.0, rat_name='Fred') >>> print(st.annotations) {'rat_name': 'Fred'} Because ``rat_name`` is not part of the Neo object model, it is placed in the dict :py:attr:`annotations`. This dict can be modified as necessary by your code. Annotations ----------- As well as adding annotations as "additional" arguments when an object is constructed, objects may be annotated using the :meth:`annotate` method possessed by all Neo core objects, e.g.:: >>> seg = Segment() >>> seg.annotate(stimulus="step pulse", amplitude=10*nA) >>> print(seg.annotations) {'amplitude': array(10.0) * nA, 'stimulus': 'step pulse'} Since annotations may be written to a file or database, there are some limitations on the data types of annotations: they must be "simple" types or containers (lists, dicts, tuples, NumPy arrays) of simple types, where the simple types are ``integer``, ``float``, ``complex``, ``Quantity``, ``string``, ``date``, ``time`` and ``datetime``. Array Annotations ----------------- Next to "regular" annotations there is also a way to annotate arrays of values in order to create annotations with one value per data point. Using this feature, called Array Annotations, the consistency of those annotations with the actual data is ensured. Apart from adding those on object construction, Array Annotations can also be added using the :meth:`array_annotate` method provided by all Neo data objects, e.g.:: >>> sptr = SpikeTrain(times=[1, 2, 3]*pq.s, t_stop=3*pq.s) >>> sptr.array_annotate(index=[0, 1, 2], relevant=[True, False, True]) >>> print(sptr.array_annotations) {'index': array([0, 1, 2]), 'relevant': array([ True, False, True])} Since Array Annotations may be written to a file or database, there are some limitations on the data types of arrays: they must be 1-dimensional (i.e. not nested) and contain the same types as annotations: ``integer``, ``float``, ``complex``, ``Quantity``, ``string``, ``date``, ``time`` and ``datetime``. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/old_stuffs/developers_guide.rst0000644000175100001660000002154314743453644020777 0ustar00runnerdocker================= Developers' guide ================= These instructions are for developing on a Unix-like platform, e.g. Linux or macOS, with the bash shell. If you develop on Windows, please get in touch. Mailing lists ------------- General discussion of Neo development takes place in the `NeuralEnsemble Google group`_. Discussion of issues specific to a particular ticket in the issue tracker should take place on the tracker. Using the issue tracker ----------------------- If you find a bug in Neo, please create a new ticket on the `issue tracker`_, setting the type to "defect". Choose a name that is as specific as possible to the problem you've found, and in the description give as much information as you think is necessary to recreate the problem. The best way to do this is to create the shortest possible Python script that demonstrates the problem, and attach the file to the ticket. If you have an idea for an improvement to Neo, create a ticket with type "enhancement". If you already have an implementation of the idea, create a patch (see below) and attach it to the ticket. To keep track of changes to the code and to tickets, you can register for a GitHub account and then set to watch the repository at `GitHub Repository`_ (see https://help.github.com/en/articles/watching-and-unwatching-repositories). Requirements ------------ * Python_ 3.8 or later * numpy_ >= 1.19.5 * quantities_ >= 0.14.1 * joblib >= 1.0.0 * pytest (for running tests) * Sphinx_ (for building documentation) There are many optional dependencies for different IO modules (see below). If you don't install these, tests for those modules will be skipped. We strongly recommend you develop within a virtual environment (from virtualenv, venv or conda). Getting the source code ----------------------- We use the Git version control system. The best way to contribute is through GitHub_. You will first need a GitHub account, and you should then fork the repository at `GitHub Repository`_ (see http://help.github.com/en/articles/fork-a-repo). To get a local copy of the repository:: $ cd /some/directory $ git clone git@github.com:/python-neo.git Now you need to make sure that the ``neo`` package is on your PYTHONPATH. You can do this by installing Neo with the *editable* option, which avoids reinstalling when there are changes in the code:: $ cd python-neo $ pip install -e . To install all dependencies needed for testing, including optional dependencies for IO modules, run:: $ pip install -e .[test] or if using the zsh shell:: $ pip install -e ".[test]" To update to the latest version from the repository:: $ git pull Running the test suite ---------------------- Before you make any changes, run the test suite to make sure all the tests pass on your system:: $ pytest At the end, if you see "OK", then all the tests passed (or were skipped because certain dependencies are not installed), otherwise it will report on tests that failed or produced errors. To run tests from an individual file:: $ pytest test_analogsignal.py Writing tests ------------- You should try to write automated tests for any new code that you add. If you have found a bug and want to fix it, first write a test that isolates the bug (and that therefore fails with the existing codebase). Then apply your fix and check that the test now passes. To see how well the tests cover the code base, run:: $ pytest --cov=neo Working on the documentation ---------------------------- All modules, classes, functions, and methods (including private and subclassed builtin methods) should have docstrings. Please see `PEP257`_ for a description of docstring conventions. Module docstrings should explain briefly what functions or classes are present. Detailed descriptions can be left for the docstrings of the respective functions or classes. Private functions do not need to be explained here. Class docstrings should include an explanation of the purpose of the class and, when applicable, how it relates to standard neuroscientific data. They should also include at least one example, which should be written so it can be run as-is from a clean newly-started Python interactive session (that means all imports should be included). Finally, they should include a list of all arguments, attributes, and properties, with explanations. Properties that return data calculated from other data should explain what calculation is done. A list of methods is not needed, since documentation will be generated from the method docstrings. Method and function docstrings should include an explanation for what the method or function does. If this may not be clear, one or more examples may be included. Examples that are only a few lines do not need to include imports or setup, but more complicated examples should have them. Examples can be tested easily using the iPython `%doctest_mode` magic. This will strip >>> and ... from the beginning of each line of the example, so the example can be copied and pasted as-is. The documentation is written in `reStructuredText`_, using the `Sphinx`_ documentation system. Any mention of another Neo module, class, attribute, method, or function should be properly marked up so automatic links can be generated. The same goes for quantities or NumPy. To build the documentation:: $ cd python-neo/doc $ make html Then open `some/directory/python-neo/doc/build/html/index.html` in your browser. Committing your changes ----------------------- Once you are happy with your changes, **run the test suite again to check that you have not introduced any new bugs**. It is also recommended to check your code with a code checking program, such as `pyflakes`_ or `flake8`_. Then you can commit them to your local repository:: $ git commit -m 'informative commit message' If this is your first commit to the project, please add your name and affiliation/employer to :file:`doc/source/authors.rst` You can then push your changes to your online repository on GitHub:: $ git push Once you think your changes are ready to be included in the main Neo repository, open a pull request on GitHub (see https://help.github.com/en/articles/about-pull-requests). Python version -------------- Neo should work with Python 3.8 or newer. If you need support for Python 2.7, use Neo v0.8.0 or earlier. Coding standards and style -------------------------- All code should conform as much as possible to `PEP 8`_, and should run with Python 3.8 or newer. You can use the `pep8`_ program to check the code for PEP 8 conformity. You can also use `flake8`_, which combines pep8 and pyflakes. However, the pep8 and flake8 programs do not check for all PEP 8 issues. In particular, they do not check that the import statements are in the correct order. Also, please do not use ``from xyz import *``. This is slow, can lead to conflicts, and makes it difficult for code analysis software. Making a release ---------------- .. TODO: discuss branching/tagging policy. Add a section in :file:`/doc/source/whatisnew.rst` for the release. First check that the version string (in :file:`pyproject.toml`) is correct. To build source and wheel packages:: $ python -m build Tag the release in the Git repository and push it:: $ git tag $ git push --tags origin $ git push --tags upstream To upload the package to `PyPI`_ (the members of the `maintainers team`_ have the necessary permissions to do this):: $ twine upload dist/neo-0.X.Y.tar.gz dist/neo-0.X.Y-py3-none-any.whl .. talk about readthedocs .. make a release branch If you want to develop your own IO module ----------------------------------------- See :ref:`io_dev_guide` for implementation of a new IO. Project governance ------------------ The :doc:`governance` document describes how decisions about the project are taken. .. _Python: https://www.python.org .. _Setuptools: https://pypi.python.org/pypi/setuptools/ .. _tox: http://codespeak.net/tox/ .. _coverage: https://coverage.readthedocs.io/ .. _`PEP 8`: https://www.python.org/dev/peps/pep-0008/ .. _`issue tracker`: https://github.com/NeuralEnsemble/python-neo/issues .. _`Porting to Python 3`: http://python3porting.com/ .. _`NeuralEnsemble Google group`: https://groups.google.com/forum/#!forum/neuralensemble .. _reStructuredText: http://docutils.sourceforge.net/rst.html .. _Sphinx: http://www.sphinx-doc.org/ .. _numpy: https://numpy.org/ .. _quantities: https://pypi.org/project/quantities/ .. _PEP257: https://www.python.org/dev/peps/pep-0257/ .. _PEP394: https://www.python.org/dev/peps/pep-0394/ .. _PyPI: https://pypi.org .. _GitHub: https://github.com .. _`GitHub Repository`: https://github.com/NeuralEnsemble/python-neo/ .. _pep8: https://pypi.org/project/pep8/ .. _flake8: https://pypi.org/project/flake8/ .. _pyflakes: https://pypi.org/project/pyflakes/ .. _`maintainers team`: https://github.com/orgs/NeuralEnsemble/teams/neo-maintainers ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/old_stuffs/examples.rst0000644000175100001660000000054214743453644017264 0ustar00runnerdocker**************** Examples **************** .. currentmodule:: neo Introduction ============= A set of examples in :file:`neo/examples/` illustrates the use of Neo classes. .. literalinclude:: ../../examples/read_files_neo_io.py .. literalinclude:: ../../examples/read_files_neo_rawio.py .. literalinclude:: ../../examples/plot_with_matplotlib.py ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/old_stuffs/gif2011workshop.rst0000644000175100001660000000766214743453644020326 0ustar00runnerdocker************************************ Gif 2011 workshop decisions ************************************ This have been writtent before neo 2 implementation just after the wokshop. Not every hting is up to date. After a workshop in GIF we are happy to present the following improvements: =========================================================================== 1. We made a few renames of objects - "Neuron" into "Unit" - "RecordingPoint" into "RecordingChannel" to remove electrophysiological (or other) dependencies and keep generality. 2. For every object we specified mandatory attributes and recommended attributes. For every attribute we define a python-based data type. The changes are reflected in the diagram #FIXME with red (mandatory) and blue (recommended) attributes indicated. 3. New objects are required for operational performance (memory allocation) and logical consistency (neo eeg, etc): - AnalogSignalArray - IrregularlySampledAnalogSignal - EventArray - EpochArray - RecordingChannelGroup Attributes and parent objects are available on the diagram #FIXME 4. Due to some logical considerations we remove the link between "RecordingChannel" and "Spiketrain". "SpikeTrain" now depends on "Unit", which in its turn connects to "RecordingChannel". For inconsistency reasons we removed link between "SpikeTrain" and a "Spike" ("SpikeTrain" is an object containing numpy array of spikes, but not a container of "Spike" objects - which is performance-unefficient). The same idea is applied to AnalogSignal / AnalogSignalArray, Event / EventArray etc. All changes are relected in # FIXME 5. In order to implement flexibility and embed user-defined metadata into the NEO objects we decided to assign "annotations" dictionnary to very NEO object. This attribute is optional; user may add key-value pairs to it according to its scientific needs. 6. The decision is made to use "quantities" package for objects, representing data arrays with units. "Quantities" is a stable (at least for python2.6) package, presented in pypi, easy-embeddable into NEO object model. Points of implementation are presented in the diagram # FIXME 7. We postpone the solution of object ID management inside NEO. 8. In AnalogSignal - t_stop become a property (for consistency reasons). 9. In order to provie a support for "advanced" object load we decided to include parameters - lazy (True/False) - cascade (True/False) in the BaseIO class. These parameters are valid for every method, provided by the IO (.read_segment() etc.). If "lazy" is True, the IO does not load data array, and makes array load otherwise. "Cascade" parameter regulates load of object relations. 10. We postpone the question of data analysis storage till the next NEO congress. Analysis objects are free for the moment. 11. We stay with Python 2.6 / 2.7 support. Python 3 to be considered in a later discussions. New object diagram discussed =============================================== .. image:: images/neo_UML_French_workshop.png :height: 500 px :align: center Actions to be performed: =============================================================== promotion: at g-node: philipp, andrey in neuralesemble: andrew within incf network: andrew thomas at posters: all logo: samuel paper: next year in the web: pypi object struture: common: samuel draft: yann andrey tree diagram: philipp florant io: ExampleIO : samuel HDF5 IO: andrey doc: first page: andrew thomas object disription: samuel draft+ andrew io user/ io dev: samuel example/cookbook: andrey script, samuel NeuroConvert, doctest unitest: andrew packaging: samuel account for more licence: BSD-3-Clause copyright: CNRS, GNode, University of Provence hosting test data: Philipp Other questions discussed: =========================== - consistency in names of object attributes and get/set functions ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/old_stuffs/grouping.rst0000644000175100001660000001307114743453644017301 0ustar00runnerdocker************************* Grouping and linking data ************************* Migrating from ChannelIndex/Unit to ChannelView/Group ===================================================== While the basic hierarchical :class:`Block` - :class:`Segment` structure of Neo has remained unchanged since the inception of Neo, the structures used to cross-link objects (for example to link a signal to the spike trains derived from it) have undergone changes, in an effort to find an easily understandable and usable approach. Below we give some examples of how to migrate from :class:`ChannelIndex` and :class:`Unit`, as used in Neo 0.8, to the new classes :class:`Group` and :class:`ChannelView` introduced in Neo 0.9. Note that Neo 0.9 supports the new and old API in parallel, to facilitate migration. IO classes in Neo 0.9 can read :class:`ChannelIndex` and :class:`Unit` objects, but do not write them. :class:`ChannelIndex` and :class:`Unit` will be removed in Neo 0.10.0. Examples -------- A simple example with two tetrodes. Here the :class:`ChannelIndex` was not being used for grouping, simply to associate a name with each channel. Using :class:`ChannelIndex`:: import numpy as np from quantities import kHz, mV from neo import Block, Segment, ChannelIndex, AnalogSignal block = Block() segment = Segment() block.segments.append(segment) for i in (0, 1): signal = AnalogSignal(np.random.rand(1000, 4) * mV, sampling_rate=1 * kHz,) segment.analogsignals.append(signal) chx = ChannelIndex(name=f"Tetrode #{i + 1}", index=[0, 1, 2, 3], channel_names=["A", "B", "C", "D"]) chx.analogsignals.append(signal) block.channel_indexes.append(chx) Using array annotations, we annotate the channels of the :class:`AnalogSignal` directly:: import numpy as np from quantities import kHz, mV from neo import Block, Segment, AnalogSignal block = Block() segment = Segment() block.segments.append(segment) for i in (0, 1): signal = AnalogSignal(np.random.rand(1000, 4) * mV, sampling_rate=1 * kHz, channel_names=["A", "B", "C", "D"]) segment.analogsignals.append(signal) Now a more complex example: a 1x4 silicon probe, with a neuron on channels 0,1,2 and another neuron on channels 1,2,3. We create a :class:`ChannelIndex` for each neuron to hold the :class:`Unit` object associated with this spike sorting group. Each :class:`ChannelIndex` also contains the list of channels on which that neuron spiked. :: import numpy as np from quantities import ms, mV, kHz from neo import Block, Segment, ChannelIndex, Unit, SpikeTrain, AnalogSignal block = Block(name="probe data") segment = Segment() block.segments.append(segment) # create 4-channel AnalogSignal with dummy data signal = AnalogSignal(np.random.rand(1000, 4) * mV, sampling_rate=10 * kHz) # create spike trains with dummy data # we will pretend the spikes have been extracted from the dummy signal spiketrains = [ SpikeTrain(np.arange(5, 100) * ms, t_stop=100 * ms), SpikeTrain(np.arange(7, 100) * ms, t_stop=100 * ms) ] segment.analogsignals.append(signal) segment.spiketrains.extend(spiketrains) # assign each spiketrain to a neuron (Unit) units = [] for i, spiketrain in enumerate(spiketrains): unit = Unit(name=f"Neuron #{i + 1}") unit.spiketrains.append(spiketrain) units.append(unit) # create a ChannelIndex for each unit, to show which channels the spikes come from chx0 = ChannelIndex(name="Channel Group 1", index=[0, 1, 2]) chx0.units.append(units[0]) chx0.analogsignals.append(signal) units[0].channel_index = chx0 chx1 = ChannelIndex(name="Channel Group 2", index=[1, 2, 3]) chx1.units.append(units[1]) chx1.analogsignals.append(signal) units[1].channel_index = chx1 block.channel_indexes.extend((chx0, chx1)) Using :class:`ChannelView` and :class:`Group`:: import numpy as np from quantities import ms, mV, kHz from neo import Block, Segment, ChannelView, Group, SpikeTrain, AnalogSignal block = Block(name="probe data") segment = Segment() block.segments.append(segment) # create 4-channel AnalogSignal with dummy data signal = AnalogSignal(np.random.rand(1000, 4) * mV, sampling_rate=10 * kHz) # create spike trains with dummy data # we will pretend the spikes have been extracted from the dummy signal spiketrains = [ SpikeTrain(np.arange(5, 100) * ms, t_stop=100 * ms), SpikeTrain(np.arange(7, 100) * ms, t_stop=100 * ms) ] segment.analogsignals.append(signal) segment.spiketrains.extend(spiketrains) # assign each spiketrain to a neuron (now using Group) units = [] for i, spiketrain in enumerate(spiketrains): unit = Group([spiketrain], name=f"Neuron #{i + 1}") units.append(unit) # create a ChannelView of the signal for each unit, to show which channels the spikes come from # and add it to the relevant Group view0 = ChannelView(signal, index=[0, 1, 2], name="Channel Group 1") units[0].add(view0) view1 = ChannelView(signal, index=[1, 2, 3], name="Channel Group 2") units[1].add(view1) block.groups.extend(units) Now each putative neuron is represented by a :class:`Group` containing the spiketrains of that neuron and a view of the signal selecting only those channels from which the spikes were obtained. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/old_stuffs/index.rst0000644000175100001660000000620114743453644016553 0ustar00runnerdocker.. module:: neo .. image:: images/neologo.png :width: 600 px Neo is a Python package for working with electrophysiology data in Python, together with support for reading a wide range of neurophysiology file formats, including Spike2, NeuroExplorer, AlphaOmega, Axon, Blackrock, Plexon, Tdt, Igor Pro, and support for writing to a subset of these formats plus non-proprietary formats including Kwik and HDF5. The goal of Neo is to improve interoperability between Python tools for analyzing, visualizing and generating electrophysiology data, by providing a common, shared object model. In order to be as lightweight a dependency as possible, Neo is deliberately limited to representation of data, with no functions for data analysis or visualization. Neo is used by a number of other software tools, including SpykeViewer_ (data analysis and visualization), Elephant_ (data analysis), the G-node_ suite (databasing), PyNN_ (simulations), tridesclous_ (spike sorting) and ephyviewer_ (data visualization). OpenElectrophy_ (data analysis and visualization) used an older version of Neo. Neo implements a hierarchical data model well adapted to intracellular and extracellular electrophysiology and EEG data with support for multi-electrodes (for example tetrodes). Neo's data objects build on the quantities_ package, which in turn builds on NumPy by adding support for physical dimensions. Thus Neo objects behave just like normal NumPy arrays, but with additional metadata, checks for dimensional consistency and automatic unit conversion. A project with similar aims but for neuroimaging file formats is `NiBabel`_. Documentation ------------- .. toctree:: :maxdepth: 1 install core usecases io rawio examples api_reference whatisnew developers_guide io_developers_guide authors License ------- Neo is free software, distributed under a 3-clause Revised BSD license (BSD-3-Clause). Support ------- If you have problems installing the software or questions about usage, documentation or anything else related to Neo, you can post to the `NeuralEnsemble mailing list`_. If you find a bug, please create a ticket in our `issue tracker`_. Contributing ------------ Any feedback is gladly received and highly appreciated! Neo is a community project, and all contributions are welcomed - see the :doc:`developers_guide` for more information. `Source code `_ is on GitHub. Citation -------- .. include:: ../../CITATION.txt .. _OpenElectrophy: https://github.com/OpenElectrophy/OpenElectrophy .. _Elephant: http://neuralensemble.org/elephant .. _G-node: http://www.g-node.org/ .. _Neuroshare: http://neuroshare.org/ .. _SpykeViewer: https://spyke-viewer.readthedocs.io/en/latest/ .. _NiBabel: https://nipy.org/nibabel/ .. _PyNN: http://neuralensemble.org/PyNN .. _quantities: https://pypi.org/project/quantities/ .. _`NeuralEnsemble mailing list`: https://groups.google.com/forum/#!forum/neuralensemble .. _`issue tracker`: https://github.com/NeuralEnsemble/python-neo/issues .. _tridesclous: https://github.com/tridesclous/tridesclous .. _ephyviewer: https://github.com/NeuralEnsemble/ephyviewer ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/old_stuffs/install.rst0000644000175100001660000000345214743453644017117 0ustar00runnerdocker************ Installation ************ Neo is a pure Python package, so it should be easy to get it running on any system. Installing from the Python Package Index ======================================== Dependencies ------------ * Python_ >= 3.7 * numpy_ >= 1.18.5 * quantities_ >= 0.12.1 You can install the latest published version of Neo and its dependencies using:: $ pip install neo Certain IO modules have additional dependencies. If these are not satisfied, Neo will still install but the IO module that uses them will fail on loading: * scipy >= 1.0.0 for NeoMatlabIO * h5py >= 2.5 for KwikIO * klusta for KwikIO * igor >= 0.2 for IgorIO * nixio >= 1.5 for NixIO * stfio for StimfitIO * pillow for TiffIO These dependencies can be installed by specifying a comma-separated list with the ``pip install`` command:: $ pip install neo[nixio,tiffio] Or when installing a specific version of neo:: $ pip install neo[nixio,tiffio]==0.9.0 These additional dependencies for IO modules are available:: * igorproio * kwikio * neomatlabio * nixio * stimfitio * tiffio To download and install the package manually, download: |neo_github_url| Then: .. parsed-literal:: $ unzip neo-|release|.zip $ cd neo-|release| $ python setup.py install Installing from source ====================== To install the latest version of Neo from the Git repository:: $ git clone git://github.com/NeuralEnsemble/python-neo.git $ cd python-neo $ python setup.py install .. _`Python`: https://www.python.org/ .. _`numpy`: https://numpy.org/ .. _`quantities`: https://pypi.org/project/quantities/ .. _`pip`: https://pypi.org/project/pip/ .. _`setuptools`: http://pypi.python.org/pypi/setuptools .. _Anaconda: https://www.anaconda.com/distribution/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/old_stuffs/io.rst0000644000175100001660000003111714743453644016057 0ustar00runnerdocker****** Neo IO ****** .. currentmodule:: neo Preamble ======== The Neo :mod:`io` module aims to provide an exhaustive way of loading and saving several widely used data formats in electrophysiology. The more these heterogeneous formats are supported, the easier it will be to manipulate them as Neo objects in a similar way. Therefore the IO set of classes propose a simple and flexible IO API that fits many format specifications. It is not only file-oriented, it can also read/write objects from a database. At the moment, there are 3 families of IO modules: 1. for reading closed manufacturers' formats (Spike2, Plexon, AlphaOmega, BlackRock, Axon, ...) 2. for reading(/writing) formats from open source tools (KlustaKwik, Elan, WinEdr, WinWcp, ...) 3. for reading/writing Neo structure in neutral formats (HDF5, .mat, ...) but with Neo structure inside (NeoHDF5, NeoMatlab, ...) Combining **1** for reading and **3** for writing is a good example of use: converting your datasets to a more standard format when you want to share/collaborate. Introduction ============ There is an intrinsic structure in the different Neo objects, that could be seen as a hierarchy with cross-links. See :doc:`core`. The highest level object is the :class:`Block` object, which is the high level container able to encapsulate all the others. A :class:`Block` has therefore a list of :class:`Segment` objects, that can, in some file formats, be accessed individually. Depending on the file format, i.e. if it is streamable or not, the whole :class:`Block` may need to be loaded, but sometimes particular :class:`Segment` objects can be accessed individually. Within a :class:`Segment`, the same hierarchical organization applies. A :class:`Segment` embeds several objects, such as :class:`SpikeTrain`, :class:`AnalogSignal`, :class:`IrregularlySampledSignal`, :class:`Epoch`, :class:`Event` (basically, all the different Neo objects). Depending on the file format, these objects can sometimes be loaded separately, without the need to load the whole file. If possible, a file IO therefore provides distinct methods allowing to load only particular objects that may be present in the file. The basic idea of each IO file format is to have, as much as possible, read/write methods for the individual encapsulated objects, and otherwise to provide a read/write method that will return the object at the highest level of hierarchy (by default, a :class:`Block` or a :class:`Segment`). The :mod:`neo.io` API is a balance between full flexibility for the user (all :meth:`read_XXX` methods are enabled) and simple, clean and understandable code for the developer (few :meth:`read_XXX` methods are enabled). This means that not all IOs offer the full flexibility for partial reading of data files. One format = one class ====================== The basic syntax is as follows. If you want to load a file format that is implemented in a generic :class:`MyFormatIO` class:: >>> from neo.io import MyFormatIO >>> reader = MyFormatIO(filename="myfile.dat") you can replace :class:`MyFormatIO` by any implemented class, see :ref:`list_of_io` Modes ====== An IO module can be based on a single file, a directory containing files, or a database. This is described in the :attr:`mode` attribute of the IO class. >>> from neo.io import MyFormatIO >>> print(MyFormatIO.mode) 'file' For *file* mode the *filename* keyword argument is necessary. For *directory* mode the *dirname* keyword argument is necessary. Ex: >>> reader = io.PlexonIO(filename='File_plexon_1.plx') >>> reader = io.TdtIO(dirname='aep_05') Supported objects/readable objects ================================== To know what types of object are supported by a given IO interface:: >>> MyFormatIO.supported_objects [Segment , AnalogSignal , SpikeTrain, Event, Spike] Supported objects does not mean objects that you can read directly. For instance, many formats support :class:`AnalogSignal` but don't allow them to be loaded directly, rather to access the :class:`AnalogSignal` objects, you must read a :class:`Segment`:: >>> seg = reader.read_segment() >>> print(seg.analogsignals) >>> print(seg.analogsignals[0]) To get a list of directly readable objects :: >>> MyFormatIO.readable_objects [Segment] The first element of the previous list is the highest level for reading the file. This mean that the IO has a :meth:`read_segment` method:: >>> seg = reader.read_segment() >>> type(seg) neo.core.Segment All IOs have a read() method that returns a list of :class:`Block` objects (representing the whole content of the file):: >>> bl = reader.read() >>> print(bl[0].segments[0]) neo.core.Segment Read a time slice of Segment ============================ Some objects support the ``time_slice`` argument in ``read_segment()``. This is useful to read only a subset of a dataset clipped in time. By default ``time_slice=None`` will load everything. This reads everything:: seg = reader.read_segment(time_slice=None) This reads only the first 5 seconds:: seg = reader.read_segment(time_slice=(0*pq.s, 5.*pq.s)) .. _section-lazy: Lazy option and proxy objects ============================= In some cases you may not want to load everything in memory (RAM) because it could be too big. For this scenario, some IOs implement ``lazy=True/False``. Since neo 0.7, a new lazy system has been added for some IO modules (all IO classes that inherit from rawio). To know if a class supports lazy mode use ``ClassIO.support_lazy``. With ``lazy=True`` all data objects (AnalogSignal/SpikeTrain/Event/Epoch) are replaced by proxy objects (AnalogSignalProxy/SpikeTrainProxy/EventProxy/EpochProxy). By default (if not specified), ``lazy=False``, i.e. all data is loaded. These proxy objects contain metadata (name, sampling_rate, id, ...) so they can be inspected but they do not contain any array-like data. All proxy objects contain a ``load()`` method to postpone the real load of array like data. Furthermore the ``load()`` method has a ``time_slice`` argument to load only a slice from the file. In this way the consumption of memory can be finely controlled. Here are two examples that read a dataset, extract sections of the signal based on recorded events, and average the sections. The first example is without lazy mode, so it consumes more memory:: lim0, lim1 = -500 * pq.ms, +1500 * pq.ms seg = reader.read_segment(lazy=False) triggers = seg.events[0] sig = seg.analogsignals[0] # here sig contain the whole recording in memory all_sig_chunks = [] for t in triggers.times: t0, t1 = (t + lim0), (t + lim1) sig_chunk = sig.time_slice(t0, t1) all_sig_chunks.append(sig_chunk) apply_my_fancy_average(all_sig_chunks) The second example uses lazy mode, so it consumes less memory:: lim0, lim1 = -500*pq.ms, +1500*pq.ms seg = reader.read_segment(lazy=True) triggers = seg.events[0].load(time_slice=None) # this loads all triggers in memory sigproxy = seg.analogsignals[0] # this is a proxy all_sig_chunks = [] for t in triggers.times: t0, t1 = (t + lim0), (t + lim1) sig_chunk = sigproxy.load(time_slice=(t0, t1)) # here real data are loaded all_sig_chunks.append(sig_chunk) apply_my_fancy_average(all_sig_chunks) In addition to ``time_slice``, AnalogSignalProxy supports the ``channel_indexes`` argument. This allows loading only a subset of channels. This is useful when the channel count is very high. .. TODO: add something about magnitude mode when implemented for all objects. In this example, we read only three selected channels:: seg = reader.read_segment(lazy=True) anasig = seg.analogsignals[0].load(time_slice=None, channel_indexes=[0, 2, 18]) .. _neo_io_API: Details of API ============== The :mod:`neo.io` API is designed to be simple and intuitive: - each file format has an IO class (for example for Spike2 files you have a :class:`Spike2IO` class). - each IO class inherits from the :class:`BaseIO` class. - each IO class can read or write directly one or several Neo objects (for example :class:`Segment`, :class:`Block`, ...): see the :attr:`readable_objects` and :attr:`writable_objects` attributes of the IO class. - each IO class supports part of the :mod:`neo.core` hierarchy, though not necessarily all of it (see :attr:`supported_objects`). - each IO class has a :meth:`read()` method that returns a list of :class:`Block` objects. If the IO only supports :class:`Segment` reading, the list will contain one block with all segments from the file. - each IO class that supports writing has a :meth:`write()` method that takes as a parameter a list of blocks, a single block or a single segment, depending on the IO's :attr:`writable_objects`. - some IO are able to do a *lazy* load: all metadata (e.g. :attr:`sampling_rate`) are read, but not the actual numerical data. - each IO is able to save and load all required attributes (metadata) of the objects it supports. - each IO can freely add user-defined or manufacturer-defined metadata to the :attr:`annotations` attribute of an object. If you want to develop your own IO ================================== See :doc:`io_developers_guide` for information on how to implement a new IO. .. _list_of_io: List of implemented formats =========================== .. automodule:: neo.io Logging ======= :mod:`neo` uses the standard Python :mod:`logging` module for logging. All :mod:`neo.io` classes have logging set up by default, although not all classes produce log messages. The logger name is the same as the full qualified class name, e.g. :class:`neo.io.nixio.NixIO`. By default, only log messages that are critically important for users are displayed, so users should not disable log messages unless they are sure they know what they are doing. However, if you wish to disable the messages, you can do so:: >>> import logging >>> >>> logger = logging.getLogger('neo') >>> logger.setLevel(100) Some io classes provide additional information that might be interesting to advanced users. To enable these messages, do the following:: >>> import logging >>> >>> logger = logging.getLogger('neo') >>> logger.setLevel(logging.INFO) It is also possible to log to a file in addition to the terminal:: >>> import logging >>> >>> logger = logging.getLogger('neo') >>> handler = logging.FileHandler('filename.log') >>> logger.addHandler(handler) To only log to the terminal:: >>> import logging >>> from neo import logging_handler >>> >>> logger = logging.getLogger('neo') >>> handler = logging.FileHandler('filename.log') >>> logger.addHandler(handler) >>> >>> logging_handler.setLevel(100) This can also be done for individual IO classes:: >>> import logging >>> >>> logger = logging.getLogger('neo.io.nixio.NixIO') >>> handler = logging.FileHandler('filename.log') >>> logger.addHandler(handler) Individual IO classes can have their loggers disabled as well:: >>> import logging >>> >>> logger = logging.getLogger('neo.io.nixio.NixIO') >>> logger.setLevel(100) And more detailed logging messages can be enabled for individual IO classes:: >>> import logging >>> >>> logger = logging.getLogger('neo.io.nixio.NixIO') >>> logger.setLevel(logging.INFO) The default handler, which is used to print logs to the command line, is stored in :attr:`neo.logging_handler`. This example changes how the log text is displayed:: >>> import logging >>> from neo import logging_handler >>> >>> formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') >>> logging_handler.setFormatter(formatter) For more complex logging, please see the documentation for the logging_ module. .. note:: If you wish to implement more advanced logging as describe in the documentation for the logging_ module or elsewhere on the internet, please do so before calling any :mod:`neo` functions or initializing any :mod:`neo` classes. This is because the default handler is created when :mod:`neo` is imported, but it is not attached to the :mod:`neo` logger until a class that uses logging is initialized or a function that uses logging is called. Furthermore, the handler is only attached if there are no handlers already attached to the root logger or the :mod:`neo` logger, so adding your own logger will override the default one. Additional functions and/or classes may get logging during bugfix releases, so code relying on particular modules not having logging may break at any time without warning. .. _`logging`: https://docs.python.org/3/library/logging.html ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/old_stuffs/io_developers_guide.rst0000644000175100001660000001340414743453644021463 0ustar00runnerdocker.. _io_dev_guide: ******************** IO developers' guide ******************** .. _io_guiline: Guidelines for IO implementation ================================ There are two ways to add a new IO module: * By directly adding a new IO class in a module within :mod:`neo.io`: the reader/writer will deal directly with Neo objects * By adding a RawIO class in a module within :mod:`neo.rawio`: the reader should work with raw buffers from the file and provide some internal headers for the scale/units/name/... You can then generate an IO module simply by inheriting from your RawIO class and from :class:`neo.io.BaseFromRaw` For read only classes, we encourage you to write a :class:`RawIO` class because it allows slice reading, and is generally much quicker and easier (although only for reading) than implementing a full IO class. For read/write classes you can mix the two levels neo.rawio for reading and neo.io for writing. Recipe to develop an IO module for a new data format: 1. Fully understand the object model. See :doc:`core`. If in doubt ask the `mailing list`_. 2. Fully understand :mod:`neo.rawio.examplerawio`. It is a fake IO to explain the API. If in doubt ask the list. 3. Copy/paste ``examplerawio.py`` and choose clear file and class names for your IO. 4. Implement all methods that **raise(NotImplementedError)** in :mod:`neo.rawio.baserawio`. Return None when the object is not supported (spike/waveform) 5. Write good docstrings. List dependencies, including minimum version numbers. 6. Add your class to :mod:`neo.rawio.__init__`. Keep imports inside ``try/except`` for dependency reasons. 7. Create a class in :file:`neo/io/` 8. Add your class to :mod:`neo.io.__init__`. Keep imports inside ``try/except`` for dependency reasons. 9. Create an account at https://gin.g-node.org and deposit files in :file:`NeuralEnsemble/ephy_testing_data`. 10. Write tests in :file:`neo/rawio/test_xxxxxrawio.py`. You must at least pass the standard tests (inherited from :class:`BaseTestRawIO`). See :file:`test_examplerawio.py` 11. Write a similar test in :file:`neo.tests/iotests/test_xxxxxio.py`. See :file:`test_exampleio.py` 12. Make a pull request when all tests pass. Miscellaneous ============= * If your IO supports several versions of a format (like ABF1, ABF2), upload to the gin.g-node.org test file repository all file versions possible. (for test coverage). * In the docstring, explain where you obtained the file format specification if it is a closed one. * If your IO is based on a database mapper, keep in mind that the returned object MUST be detached, because this object can be written to another url for copying. Tests ===== :py:class:`neo.rawio.tests.common_rawio_test.BaseTestRawIO` and :py:class:`neo.test.io.commun_io_test.BaseTestIO` provide standard tests. To use these you need to upload some sample data files at `gin-gnode`_. They will be publicly accessible for testing Neo. These tests: * check for compliance with the schema: hierarchy, attribute types, ... * For IO modules confirm they able to both write and read data; they compare a generated dataset with the same data after a write/read cycle. The test scripts download all files from `gin-gnode`_ and store them locally in ``/ 'ephy_testing_data'``. Subsequent test runs use the previously downloaded files, rather than trying to download them each time. Each test must have at least one class that inherits ``BaseTestRawIO`` and that has 3 attributes: * ``rawioclass``: the class * ``entities_to_test``: a list of files (or directories) to be tested one by one * ``files_to_download``: a list of files to download (sometimes bigger than ``entities_to_test``) Here is an example test script taken from the distribution: :file:`test_axonrawio.py`: .. literalinclude:: ../../neo/test/rawiotest/test_axonrawio.py Logging ======= All IO classes by default have logging using the standard :mod:`logging` module already set up. The logger name is the same as the fully qualified class name, e.g. :class:`neo.io.nixio.NixIO`. The :attr:`class.logger` attribute holds the logger for easy access. There are generally 3 types of situations in which an IO class should use a logger * Recoverable errors with the file that the users need to be notified about. In this case, please use :meth:`logger.warning` or :meth:`logger.error`. If there is an exception associated with the issue, you can use :meth:`logger.exception` in the exception handler to automatically include a backtrace with the log. By default, all users will see messages at this level, so please restrict it only to problems the user absolutely needs to know about. * Informational messages that advanced users might want to see in order to get some insight into the file. In this case, please use :meth:`logger.info`. * Messages useful to developers to fix problems with the io class. In this case, please use :meth:`logger.debug`. A log handler is automatically added to :mod:`neo`, so please do not user your own handler. Please use the :attr:`class.logger` attribute for accessing the logger inside the class rather than :meth:`logging.getLogger`. Please do not log directly to the root logger (e.g. :meth:`logging.warning`), use the class's logger instead (:meth:`class.logger.warning`). In the tests for the io class, if you intentionally test broken files, please disable logs by setting the logging level to `100`. ExampleIO ========= .. autoclass:: neo.rawio.ExampleRawIO .. autoclass:: neo.io.ExampleIO Here are the entire files: .. literalinclude:: ../../neo/rawio/examplerawio.py .. literalinclude:: ../../neo/io/exampleio.py .. _`mailing list`: https://groups.google.com/forum/#!forum/neuralensemble .. _gin-gnode: https://gin.g-node.org/NeuralEnsemble/ephy_testing_data ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/old_stuffs/rawio.rst0000644000175100001660000002072114743453644016570 0ustar00runnerdocker********* Neo RawIO ********* .. currentmodule:: neo.rawio .. _neo_rawio_API: Neo RawIO API ============= For performance and memory consumption reasons a new layer has been added to Neo. In brief: * **neo.io** is the user-oriented read/write layer. Reading consists of getting a tree of Neo objects from a data source (file, url, or directory). When reading, all Neo objects are correctly scaled to the correct units. Writing consists of making a set of Neo objects persistent in a file format. * **neo.rawio** is a low-level layer for reading data only. Reading consists of getting NumPy buffers (often int16/int64) of signals/spikes/events. Scaling to real values (microV, times, ...) is done in a second step. Here the underlying objects must be consistent across Blocks and Segments for a given data source. The neo.rawio API has been added for developers. The neo.rawio is close to what could be a C API for reading data but in Python/NumPy. Not all IOs are implemented in :mod:`neo.rawio` but all classes implemented in :mod:`neo.rawio` are also available in :mod:`neo.io`. Possible uses of the :mod:`neo.rawio` API are: * fast reading chunks of signals in int16 and do the scaling of units (uV) on a GPU while scaling the zoom. This should improve bandwidth HD to RAM and RAM to GPU memory. * load only some small chunk of data for heavy computations. For instance the spike sorting module tridesclous_ does this. The :mod:`neo.rawio` API is less flexible than :mod:`neo.io` and has some limitations: * read-only * AnalogSignals must have the same characteristics across all Blocks and Segments: ``sampling_rate``, ``shape[1]``, ``dtype`` * AnalogSignals should all have the same value of ``sampling_rate``, otherwise they won't be read at the same time. * Units must have SpikeTrain event if empty across all Block and Segment * Epoch and Event are processed the same way (with ``durations=None`` for Event). For an intuitive comparison of :mod:`neo.io` and :mod:`neo.rawio` see: * :file:`example/read_file_neo_io.py` * :file:`example/read_file_neo_rawio.py` One speculative benefit of the :mod:`neo.rawio` API should be that a developer should be able to code a new RawIO class with little knowledge of the Neo tree of objects or of the :mod:`quantities` package. Basic usage =========== First create a reader from a class:: >>> from neo.rawio import PlexonRawIO >>> reader = PlexonRawIO(filename='File_plexon_3.plx') Then browse the internal header and display information:: >>> reader.parse_header() >>> print(reader) PlexonRawIO: File_plexon_3.plx nb_block: 1 nb_segment: [1] signal_channels: [V1] spike_channels: [Wspk1u, Wspk2u, Wspk4u, Wspk5u ... Wspk29u Wspk30u Wspk31u Wspk32u] event_channels: [] You get the number of blocks and segments per block. You have information about channels: **signal_channels**, **spike_channels**, **event_channels**. All this information is internally available in the *header* dict:: >>> for k, v in reader.header.items(): ... print(k, v) signal_channels [('V1', 0, 1000., 'int16', '', 2.44140625, 0., 0)] event_channels [] nb_segment [1] nb_block 1 spike_channels [('Wspk1u', 'ch1#0', '', 0.00146484, 0., 0, 30000.) ('Wspk2u', 'ch2#0', '', 0.00146484, 0., 0, 30000.) ... Read signal chunks of data and scale them:: >>> channel_indexes = None  #could be channel_indexes = [0] >>> raw_sigs = reader.get_analogsignal_chunk(block_index=0, seg_index=0, i_start=1024, i_stop=2048, channel_indexes=channel_indexes) >>> float_sigs = reader.rescale_signal_raw_to_float(raw_sigs, dtype='float64') >>> sampling_rate = reader.get_signal_sampling_rate() >>> t_start = reader.get_signal_t_start(block_index=0, seg_index=0) >>> units =reader.header['signal_channels'][0]['units'] >>> print(raw_sigs.shape, raw_sigs.dtype) >>> print(float_sigs.shape, float_sigs.dtype) >>> print(sampling_rate, t_start, units) (1024, 1) int16 (1024, 1) float64 1000.0 0.0 V There are 3 ways to select a subset of channels: by index (0 based), by id or by name. By index is unambiguous 0 to n-1 (included), whereas for some IOs channel_names (and sometimes channel_ids) have no guarantees to be unique. In such cases, using names or ids may raise an error. A selected subset of channels which is passed to get_analog_signal_chunk, get_analog_signal_size, or get_analog_signal_t_start has the additional restriction that all such channels must have the same t_start and signal_size. Such subsets of channels may be available in specific RawIOs by using the get_group_signal_channel_indexes method, if the RawIO has defined separate group_ids for each group with those common characteristics. Example with BlackrockRawIO for the file FileSpec2.3001:: >>> raw_sigs = reader.get_analogsignal_chunk(channel_indexes=None) #Take all channels >>> raw_sigs1 = reader.get_analogsignal_chunk(channel_indexes=[0, 2, 4])) #Take 0 2 and 4 >>> raw_sigs2 = reader.get_analogsignal_chunk(channel_ids=[1, 3, 5]) # Same but with there id (1 based) >>> raw_sigs3 = reader.get_analogsignal_chunk(channel_names=['chan1', 'chan3', 'chan5'])) # Same but with there name print(raw_sigs1.shape[1], raw_sigs2.shape[1], raw_sigs3.shape[1]) 3, 3, 3 Inspect units channel. Each channel gives a SpikeTrain for each Segment. Note that for many formats a physical channel can have several units after spike sorting. So the nb_unit could be more than physical channel or signal channels. >>> nb_unit = reader.spike_channels_count() >>> print('nb_unit', nb_unit) nb_unit 30 >>> for unit_index in range(nb_unit): ... nb_spike = reader.spike_count(block_index=0, seg_index=0, unit_index=unit_index) ... print('unit_index', unit_index, 'nb_spike', nb_spike) unit_index 0 nb_spike 701 unit_index 1 nb_spike 716 unit_index 2 nb_spike 69 unit_index 3 nb_spike 12 unit_index 4 nb_spike 95 unit_index 5 nb_spike 37 unit_index 6 nb_spike 25 unit_index 7 nb_spike 15 unit_index 8 nb_spike 33 ... Get spike timestamps only between 0 and 10 seconds and convert them to spike times:: >>> spike_timestamps = reader.spike_timestamps(block_index=0, seg_index=0, unit_index=0, t_start=0., t_stop=10.) >>> print(spike_timestamps.shape, spike_timestamps.dtype, spike_timestamps[:5]) (424,) int64 [ 90 420 708 1020 1310] >>> spike_times = reader.rescale_spike_timestamp( spike_timestamps, dtype='float64') >>> print(spike_times.shape, spike_times.dtype, spike_times[:5]) (424,) float64 [ 0.003 0.014 0.0236 0.034 0.04366667] Get spike waveforms between 0 and 10 s:: >>> raw_waveforms = reader.spike_raw_waveforms( block_index=0, seg_index=0, unit_index=0, t_start=0., t_stop=10.) >>> print(raw_waveforms.shape, raw_waveforms.dtype, raw_waveforms[0,0,:4]) (424, 1, 64) int16 [-449 -206 34 40] >>> float_waveforms = reader.rescale_waveforms_to_float(raw_waveforms, dtype='float32', unit_index=0) >>> print(float_waveforms.shape, float_waveforms.dtype, float_waveforms[0,0,:4]) (424, 1, 64) float32 [-0.65771484 -0.30175781 0.04980469 0.05859375] Count events per channel:: >>> reader = PlexonRawIO(filename='File_plexon_2.plx') >>> reader.parse_header() >>> nb_event_channel = reader.event_channels_count() nb_event_channel 28 >>> print('nb_event_channel', nb_event_channel) >>> for chan_index in range(nb_event_channel): ... nb_event = reader.event_count(block_index=0, seg_index=0, event_channel_index=chan_index) ... print('chan_index',chan_index, 'nb_event', nb_event) chan_index 0 nb_event 1 chan_index 1 nb_event 0 chan_index 2 nb_event 0 chan_index 3 nb_event 0 ... Read event timestamps and times for chanindex=0 and with time limits (t_start=None, t_stop=None):: >>> ev_timestamps, ev_durations, ev_labels = reader.event_timestamps(block_index=0, seg_index=0, event_channel_index=0, t_start=None, t_stop=None) >>> print(ev_timestamps, ev_durations, ev_labels) [1268] None ['0'] >>> ev_times = reader.rescale_event_timestamp(ev_timestamps, dtype='float64') >>> print(ev_times) [ 0.0317] List of implemented formats =========================== .. automodule:: neo.rawio .. _tridesclous: https://github.com/tridesclous/tridesclous ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/old_stuffs/specific_annotations.rst0000644000175100001660000000161614743453644021653 0ustar00runnerdocker.. _specific_annotations: ******************** Specific annotations ******************** Introduction ------------ Neo imposes and recommends some attributes for all objects, and also provides the *annotations* dict for all objects to deal with any kind of extensions. This flexible feature allow Neo objects to be customized for many use cases. While any names can be used for annotations, interoperability will be improved if there is some consistency in naming. Here we suggest some conventions for annotation names. Patch clamp ----------- .. todo: TODO Network simultaion ------------------ Spike sorting ------------- **SpikeTrain.annotations['waveform_features']** : when spike sorting the waveform is reduced to a smaller dimensional space with PCA or wavelets. This attribute is the projected matrice. NxM (N spike number, M features number. KlustakwikIO supports this feature. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/old_stuffs/usecases.rst0000644000175100001660000001723414743453644017267 0ustar00runnerdocker***************** Typical use cases ***************** Recording multiple trials from multiple channels ================================================ In this example we suppose that we have recorded from an 8-channel probe, and that we have recorded three trials/episodes. We therefore have a total of 8 x 3 = 24 signals, grouped into three :class:`AnalogSignal` objects, one per trial. Our entire dataset is contained in a :class:`Block`, which in turn contains: * 3 :class:`Segment` objects, each representing data from a single trial, * 1 :class:`Group`. .. image:: images/multi_segment_diagram.png :width: 75% :align: center :class:`Segment` and :class:`Group` objects provide two different ways to access the data, corresponding respectively, in this scenario, to access by **time** and by **space**. .. note:: Segments do not always represent trials, they can be used for many purposes: segments could represent parallel recordings for different subjects, or different steps in a current clamp protocol. **Temporal (by segment)** In this case you want to go through your data in order, perhaps because you want to correlate the neural response with the stimulus that was delivered in each segment. In this example, we're averaging over the channels. .. doctest:: import numpy as np from matplotlib import pyplot as plt for seg in block.segments: print("Analyzing segment %d" % seg.index) avg = np.mean(seg.analogsignals[0], axis=1) plt.figure() plt.plot(avg) plt.title("Peak response in segment %d: %f" % (seg.index, avg.max())) **Spatial (by channel)** In this case you want to go through your data by channel location and average over time. Perhaps you want to see which physical location produces the strongest response, and every stimulus was the same: .. doctest:: # We assume that our block has only 1 Group group = block.groups[0] avg = np.mean(group.analogsignals, axis=0) plt.figure() for index, name in enumerate(group.annotations["channel_names"]): plt.plot(avg[:, index]) plt.title("Average response on channels %s: %s' % (index, name) **Mixed example** Combining simultaneously the two approaches of descending the hierarchy temporally and spatially can be tricky. Here's an example. Let's say you saw something interesting on the 6th channel (index 5) on even numbered trials during the experiment and you want to follow up. What was the average response? .. doctest:: index = 5 avg = np.mean([seg.analogsignals[0][:, index] for seg in block.segments[::2]], axis=1) plt.plot(avg) Recording spikes from multiple tetrodes ======================================= Here is a similar example in which we have recorded with two tetrodes and extracted spikes from the extra-cellular signals. The spike times are contained in :class:`SpikeTrain` objects. * 3 :class:`Segments` (one per trial). * 7 :class:`Groups` (one per neuron), which each contain: * 3 :class:`SpikeTrain` objects * an annotation showing which tetrode the spiketrains were recorded from In total we have 3 x 7 = 21 :class:`SpikeTrains` in this :class:`Block`. .. image:: images/multi_segment_diagram_spiketrain.png :width: 75% :align: center .. note:: In this scenario we have discarded the original signals, perhaps to save space, therefore we use annotations to link the spiketrains to the tetrode they were recorded from. If we wished to include the original extracellular signals, we would add a reference to the three :class:`AnalogSignal` objects for the appropriate tetrode to the :class:`Group` for each neuron. There are three ways to access the :class:`SpikeTrain` data: * by trial (:class:`Segment`) * by neuron (:class:`Group`) * by tetrode **By trial** In this example, each :class:`Segment` represents data from one trial, and we want a PSTH for each trial from all units combined: .. doctest:: plt.figure() for seg in block.segments: print(f"Analyzing segment {seg.index}") stlist = [st - st.t_start for st in seg.spiketrains] plt.subplot(len(block.segments), 1, seg.index + 1) count, bins = np.histogram(stlist) plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title(f"PSTH in segment {seg.index}") plt.show() **By neuron** Now we can calculate the PSTH averaged over trials for each unit, using the :attr:`block.groups` property: .. doctest:: plt.figure() for i, group in enumerate(block.groups): stlist = [st - st.t_start for st in group.spiketrains] plt.subplot(len(block.groups), 1, i + 1) count, bins = np.histogram(stlist) plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title(f"PSTH of unit {group.name}") plt.show() **By tetrode** Here we calculate a PSTH averaged over trials by channel location, blending all units: .. doctest:: plt.figure() for i, tetrode_id in enumerate(block.annotations["tetrode_ids"]): stlist = [] for unit in block.filter(objects=Group, tetrode_id=tetrode_id): stlist.extend([st - st.t_start for st in unit.spiketrains]) plt.subplot(2, 1, i + 1) count, bins = np.histogram(stlist) plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title(f"PSTH blend of tetrode {tetrode_id}") plt.show() Spike sorting ============= Spike sorting is the process of detecting and classifying high-frequency deflections ("spikes") on a group of physically nearby recording channels. For example, let's say you have recordings from a tetrode containing 4 separate channels. Here is an example showing (with fake data) how you could iterate over the contained signals and extract spike times. (Of course in reality you would use a more sophisticated algorithm.) .. doctest:: # generate some fake data seg = Segment() seg.analogsignals.append( AnalogSignal([[0.1, 0.1, 0.1, 0.1], [-2.0, -2.0, -2.0, -2.0], [0.1, 0.1, 0.1, 0.1], [-0.1, -0.1, -0.1, -0.1], [-0.1, -0.1, -0.1, -0.1], [-3.0, -3.0, -3.0, -3.0], [0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.1, 0.1]], sampling_rate=1000*Hz, units='V')) # extract spike trains from all channels st_list = [] for signal in seg.analogsignals: # use a simple threshold detector spike_mask = np.where(np.min(signal.magnitude, axis=1) < -1.0)[0] # create a spike train spike_times = signal.times[spike_mask] st = SpikeTrain(spike_times, t_start=signal.t_start, t_stop=signal.t_stop) # remember the spike waveforms wf_list = [] for spike_idx in np.nonzero(spike_mask)[0]: wf_list.append(signal[spike_idx-1:spike_idx+2, :]) st.waveforms = np.array(wf_list) st_list.append(st) At this point, we have a list of spiketrain objects. We could simply create a single :class:`Group` object, assign all spiketrains to it, and then also assign the :class:`AnalogSignal` on which we detected them. .. doctest:: unit = Group() unit.spiketrains = st_list unit.analogsignals.extend(seg.analogsignals) Further processing could assign each of the detected spikes to an independent source, a putative single neuron. (This processing is outside the scope of Neo. There are many open-source toolboxes to do it, for instance our sister project OpenElectrophy.) In that case we would create a separate :class:`Group` for each cluster, assign its spiketrains to it, and still store in each group a reference to the original recording. .. EEG .. Network simulations ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/requirements_docs.txt0000644000175100001660000000016014743453644017034 0ustar00runnerdockerdocutils<0.18 numpy>=1.16.1 quantities>=0.12.1 sphinx-inline-tabs sphinx-gallery ipython matplotlib nixio pynwb ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1194153 neo-0.14.0/doc/source/0000755000175100001660000000000014743453656014046 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1084154 neo-0.14.0/doc/source/_static/0000755000175100001660000000000014743453656015474 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1194153 neo-0.14.0/doc/source/_static/css/0000755000175100001660000000000014743453656016264 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/_static/css/custom.css0000644000175100001660000000032614743453644020306 0ustar00runnerdocker .navbar-header-items li.nav-item { text-align: center; } html[data-theme="light"] { --pst-color-inline-code: rgb(11, 96, 38); } html[data-theme="dark"] { --pst-color-inline-code: rgb(15, 127, 51); } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/add_file_format.rst0000644000175100001660000001465414743453644017706 0ustar00runnerdocker.. _io_dev_guide: ==================================== Adding support for a new file format ==================================== If you would like to use Neo with a file format that is not yet supported, you have two options: 1. Make an enhancement request (see :doc:`bug_reports`). There is no guarantee that a Neo developer will have the time to work on this, but the more information you can give about the format, and the more people upvote your request, the more likely it will be implemented. 2. Implement it yourself. If you'd like to try this approach, first read :doc:`contributing`, then return and read the rest of this page. There are two ways to implement a new IO module: 1. by directly adding a new IO class in a module within :mod:`neo.io`: the reader/writer will deal directly with Neo objects; 2. by adding a RawIO class in a module within :mod:`neo.rawio`: the reader should work with raw buffers from the file and provide some internal headers for the scale/units/name/... You can then generate an IO module simply by inheriting from your RawIO class and from :class:`neo.io.BaseFromRaw`. For read-only classes, we encourage you to write a :class:`RawIO` class because it allows slice reading, and is generally much quicker and easier than implementing a full IO class. For read/write classes you can mix the two levels: ``neo.rawio`` for reading and ``neo.io`` for writing. .. _section-raw-io-recipe: Recipe to develop an IO module for a new data format ==================================================== 1. Fully understand the object model. If in doubt ask the `mailing list`_. 2. Fully understand :mod:`neo.rawio.examplerawio`, which is a fake IO module to explain the API. If in doubt ask the list. 3. Copy/paste ``examplerawio.py`` and choose clear file and class names for your IO. 4. implement all methods that raise :class:`NotImplementedError` in :mod:`neo.rawio.baserawio`. Return None when the object is not supported (e.g., spikes, waveforms) 5. Write good docstrings. List dependencies, including minimum version numbers. 6. Add your class to :mod:`neo.rawio.__init__`. Keep imports inside ``try/except`` for dependency reasons. 7. Create a class in :file:`neo/io/` 8. Add your class to :mod:`neo.io.__init__`. Keep imports inside ``try/except`` for dependency reasons. 9. Create an account at https://gin.g-node.org and deposit files in `NeuralEnsemble/ephy_testing_data`_. 10. Write tests in :file:`neo/rawio/test_xxxxxrawio.py`. You must at least pass the standard tests (inherited from :class:`BaseTestRawIO`). See :file:`test_examplerawio.py` 11. Write a similar test in :file:`neo.tests/iotests/test_xxxxxio.py`. See :file:`test_exampleio.py` 12. Make a pull request when all tests pass. Additional suggestions ---------------------- - If your IO supports several versions of a format (like ABF1, ABF2), upload to the gin.g-node.org test file repository all file versions possible (for test coverage). - :py:func:`neo.core.Block.create_many_to_one_relationship` offers a utility to complete the hierarchy when all one-to-many relationships have been created. - In the docstring, explain where you obtained the file format specification, especially if it is a closed one. - If your IO is based on a database mapper, keep in mind that the returned object MUST be detached, because this object can be written to another url for copying. Tests ===== :py:class:`neo.rawio.tests.common_rawio_test.BaseTestRawIO` and :py:class:`neo.test.io.commun_io_test.BaseTestIO` provide standard tests. To use these you need to upload some sample data files at `gin-gnode`_. They will be publicly accessible for testing Neo. These tests: - check compliance with the schema: hierarchy, attribute types, ... - for IO modules able to both write and read data, compare a generated dataset with the same data after a write/read cycle. The test scripts download all files from `gin-gnode`_ and store them locally in a temporary directory. Subsequent test runs use the previously downloaded files, rather than trying to download them each time. Each test must have at least one class that inherits ``BaseTestRawIO`` and that has 3 attributes: - ``rawioclass``: the class - ``entities_to_download``: a list of files or directories to download - ``entities_to_test``: a list of files (or directories) to be tested one by one Here is an example test script taken from the distribution: :file:`test_axonrawio.py`: .. literalinclude:: ../../neo/test/rawiotest/test_axonrawio.py Logging ======= All IO classes by default have logging using the standard :mod:`logging` module: already set up. The logger name is the same as the fully qualified class name, e.g. :class:`neo.io.nixio.NixIO`. The :attr:`class.logger` attribute holds the logger for easy access. There are generally 3 types of situations in which an IO class should use a logger: - Recoverable errors with the file that the users need to be notified about. In this case, please use :meth:`logger.warning` or :meth:`logger.error`. If there is an exception associated with the issue, you can use :meth:`logger.exception` in the exception handler to automatically include a backtrace with the log. By default, all users will see messages at this level, so please restrict it only to problems the user absolutely needs to know about. - Informational messages that advanced users might want to see in order to get some insight into the file. In this case, please use :meth:`logger.info`. - Messages useful to developers to fix problems with the io class. In this case, please use :meth:`logger.debug`. A log handler is automatically added to :mod:`neo`, so please do not use your own handler. Please use the :attr:`class.logger` attribute for accessing the logger inside the class rather than :meth:`logging.getLogger`. Please do not log directly to the root logger (e.g. :meth:`logging.warning`), use the class's logger instead (:meth:`class.logger.warning`). In the tests for the io class, if you intentionally test broken files, please disable logs by setting the logging level to `100`. ExampleIO ========= .. autoclass:: neo.rawio.ExampleRawIO .. autoclass:: neo.io.ExampleIO Here are the entire files: .. literalinclude:: ../../neo/rawio/examplerawio.py .. literalinclude:: ../../neo/io/exampleio.py .. _`mailing list`: http://neuralensemble.org/community .. _gin-gnode: https://gin.g-node.org/NeuralEnsemble/ephy_testing_data .. _`NeuralEnsemble/ephy_testing_data`: https://gin.g-node.org/NeuralEnsemble/ephy_testing_data ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/api_reference.rst0000644000175100001660000000122614743453644017365 0ustar00runnerdocker====================== Neo core API Reference ====================== Relationships between Neo objects ================================= Object: * With a star = inherits from :class:`Quantity` Attributes: * In red = required * In white = recommended Relationships: * In cyan = one to many .. image:: images/simple_generated_diagram.png :width: 750 px :download:`Click here for a better quality SVG diagram <./images/simple_generated_diagram.svg>` .. note:: This figure does not include :class:`ChannelView` and :class:`RegionOfInterest`. .. automodule:: neo.core .. testsetup:: * from neo import SpikeTrain import quantities as pq ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/authors.rst0000644000175100001660000001235314743453644016266 0ustar00runnerdocker======================== Authors and contributors ======================== The following people have contributed code and/or ideas to the current version of Neo. The institutional affiliations are those at the time of the contribution, and may not be the current affiliation of a contributor. * Samuel Garcia [1] * Andrew Davison [2, 21] * Chris Rodgers [3] * Pierre Yger [2] * Yann Mahnoun [4] * Luc Estabanez [2] * Andrey Sobolev [5] * Thierry Brizzi [2] * Florent Jaillet [6] * Philipp Rautenberg [5] * Thomas Wachtler [5] * Cyril Dejean [7] * Robert Pröpper [8] * Domenico Guarino [2] * Achilleas Koutsou [5] * Erik Li [9] * Georg Raiser [10] * Joffrey Gonin [2] * Kyler Brown * Mikkel Elle Lepperød [11] * C Daniel Meliza [12] * Michael Denker [13, 29] * Julia Sprenger [13, 6] * Maximilian Schmidt [13] * Johanna Senk [13] * Carlos Canova [13] * Hélissande Fragnaud [2] * Mark Hollenbeck [14] * Mieszko Grodzicki * Rick Gerkin [15] * Matthieu Sénoville [2] * Chadwick Boulay [16] * Björn Müller [13] * William Hart [17] * erikli(github) * Jeffrey Gill [18] * Lucas (lkoelman@github) * Mark Histed * Mike Sintsov [19] * Scott W Harden [20] * Chek Yin Choi (hkchekc@github) * Corentin Fragnaud [21] * Alexander Kleinjohann * Christian Kothe * rishidhingra@github * Hugo van Kemenade * Aitor Morales-Gregorio [13] * Peter N Steinmetz [22] * Shashwat Sridhar * Alessio Buccino [23, 24, 38] * Regimantas Jurkus [13] * Steffen Buergers [24] * Etienne Combrisson [6] * Ben Dichter [24] * Elodie Legouée [21] * Oliver Kloss [13] * Heberto Mayorquin [24] * Thomas Perret [25] * Kyle Johnsen [26, 27] * Zach McKenzie [28,39] * Moritz Alexander Kern [29] * Joscha Schmiedt * Daniel P. Crepeau [30] * Divyansh Gupta [31] * Nate Dolensek [3] * Philipp Hornauer [32] * Robert Wolff * Jules Lebert [33] * Benjamin Heasly * Baptiste Grimaud [34] * Cody Baker [24] * Fernando J. Chaure [35] * Filipe*github * Matthias Klumpp * Greg Knoll [36] * Chris Halcrow [37] * Szonja Weigl [24] * Chris Heydrick [40] * Kyu Hun Lee * Téo Lohrer * Anthony Pinto [41] * Xin Niu * Nikhil Chandra [40] * Luigi Petrucco [42] 1. Centre de Recherche en Neuroscience de Lyon, CNRS UMR5292 - INSERM U1028 - Universite Claude Bernard Lyon 1 2. Unité de Neuroscience, Information et Complexité, CNRS UPR 3293, Gif-sur-Yvette, France 3. University of California, Berkeley 4. Laboratoire de Neurosciences Intégratives et Adaptatives, CNRS UMR 6149 - Université de Provence, Marseille, France 5. G-Node, Ludwig-Maximilians-Universität, Munich, Germany 6. Institut de Neurosciences de la Timone, CNRS UMR 7289 - Université d'Aix-Marseille, Marseille, France 7. Centre de Neurosciences Integratives et Cognitives, UMR 5228 - CNRS - Université Bordeaux I - Université Bordeaux II 8. Neural Information Processing Group, TU Berlin, Germany 9. Department of Neurobiology & Anatomy, Drexel University College of Medicine, Philadelphia, PA, USA 10. University of Konstanz, Konstanz, Germany 11. Centre for Integrative Neuroplasticity (CINPLA), University of Oslo, Norway 12. University of Virginia 13. INM-6, Forschungszentrum Jülich, Germany 14. University of Texas at Austin 15. Arizona State University 16. Ottawa Hospital Research Institute, Canada 17. Swinburne University of Technology, Australia 18. Case Western Reserve University (CWRU) · Department of Biology 19. IAL Developmental Neurobiology, Kazan Federal University, Kazan, Russia 20. Harden Technologies, LLC 21. Institut des Neurosciences Paris-Saclay, CNRS UMR 9197 - Université Paris-Sud, Gif-sur-Yvette, France 22. Neurtex Brain Research Institute, Dallas, TX, USAs 23. Bio Engineering Laboratory, DBSSE, ETH, Basel, Switzerland 24. CatalystNeuro 25. Institut des Sciences Cognitives Marc Jeannerod, CNRS UMR5229, Lyon, France 26. Georgia Institute of Technology 27. Emory University 28. Harvard Medical School 29. Institute for Advanced Simulation (IAS-6), Forschungszentrum Jülich, Germany 30. Dark Horse Neuro, Inc. 31. IST Austria 32. Department of Biosystems Science and Engineering, ETH Zürich, Basel, Switzerland 33. University College London 34. École Normale Supérieure Paris-Saclay 35. Institute of Biomedical Engineering, University of Buenos Aires, Argentina 36. Bernstein Center for Computational Neuroscience, Berlin, Germany 37. University of Edinburgh 38. Allen Institute for Neural Dynamics, Seattle, WA, United States 39. Massachusetts General Hospital, Department of Molecular Biology 40. Plexon Inc. 41. Paris Brain Institute 42. Istituto Italiano di Tecnologia (IIT), Italy If we've somehow missed you off the list we're very sorry - please let us know. Acknowledgements ---------------- .. image:: https://www.braincouncil.eu/wp-content/uploads/2018/11/wsi-imageoptim-EU-Logo.jpg :alt: "EU Logo" :height: 104px :width: 156px :align: right Development of Neo has been partially funded by the European Union Sixth Framework Program (FP6) under grant agreement FETPI-015879 (FACETS), by the European Union Seventh Framework Program (FP7/2007­-2013) under grant agreements no. 269921 (BrainScaleS) and no. 604102 (HBP), and by the European Union's Horizon 2020 Framework Programme for Research and Innovation under the Specific Grant Agreements No. 720270 (Human Brain Project SGA1), No. 785907 (Human Brain Project SGA2) and No. 945539 (Human Brain Project SGA3). ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/bug_reports.rst0000644000175100001660000000232414743453644017131 0ustar00runnerdocker======================================= Reporting bugs, requesting new features ======================================= If you find a bug, unclear documentation, or would like to add a new feature to Neo, please go to https://github.com/NeuralEnsemble/python-neo/issues/. Searching the issue tracker =========================== Before creating a new issue, please read through the existing list of issues to check whether someone else has already created a similar one. You can also use Github's search capabilities for this. If you do find an existing issue, then please add a comment to say that you have also encountered this bug, or would like this feature to be added. If your issue is similar, but not identical, to one or more existing issues, then create a new issue making reference to the existing one, and explaining how your issue differs. Creating a new issue ==================== To create a new issue, click on "New issue", then click "Get started" next to the appropriate template: - "Bug report" - "Confusing documentation" - "Feature request" Please fill in all the information requested in the template. If you'd like to open an issue that isn't covered by these three options, click "Open a blank issue". ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/conf.py0000644000175100001660000002005614743453644015345 0ustar00runnerdocker# # neo documentation build configuration file, created by # sphinx-quickstart on Fri Feb 25 14:18:12 2011. # # This file is execfile()d with the current directory set to its containing # dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import os import sys import re from packaging.version import Version with open("../../pyproject.toml", mode="r") as f: txt = f.read() neo_release = re.findall('version = "(\S+)"', txt)[0] neo_version = ".".join((str(e) for e in Version(neo_release).release[:2])) AUTHORS = "Neo authors and contributors " # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.append(os.path.abspath('.')) # -- General configuration ---------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [ "sphinx.ext.autodoc", "sphinx.ext.doctest", "sphinx.ext.todo", "IPython.sphinxext.ipython_console_highlighting", "IPython.sphinxext.ipython_directive", "matplotlib.sphinxext.plot_directive", "sphinx_gallery.gen_gallery", "sphinx_inline_tabs", "sphinx_design", ] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix of source filenames. source_suffix = ".rst" # The encoding of source files. # source_encoding = 'utf-8' # The master toctree document. master_doc = "index" # General information about the project. project = "Neo" copyright = "2010-2024, " + AUTHORS # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = neo_version # The full version, including alpha/beta/rc tags. release = neo_release # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of documents that shouldn't be included in the build. # unused_docs = [] # List of directories, relative to source directory, that shouldn't be searched # for source files. exclude_trees = [] # The reST default role (used for this markup: `text`) # to use for all documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # -- Options for HTML output -------------------------------------------------- # The theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. # html_theme = 'default' # html_theme = 'sphinxdoc' # html_theme = 'haiku' # html_theme = 'scrolls' # html_theme = 'agogo' # html_theme = 'alabaster' html_theme = "pydata_sphinx_theme" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. html_theme_options = { "logo": { "image_light": "images/neologo_small.png", "image_dark": "images/neologo_small_darkmode.png", }, "icon_links": [ {"name": "GitHub", "url": "https://github.com/NeuralEnsemble/python-neo", "icon": "fa-brands fa-square-github"}, { "name": "PyPI", "url": "https://pypi.org/project/neo", "icon": "fa-solid fa-box", }, ], "icon_links_label": "External Links", # for screen reader "use_edit_page_button": False, "navbar_end": ["theme-switcher", "navbar-icon-links"], } # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = "images/neologo_small.png" # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. html_favicon = "images/neologo_favicon.png" # 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 = ["images", "_static"] html_css_files = [ "css/custom.css", ] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {'index': 'index.html'} # If false, no module index is generated. # html_use_modindex = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = "neodoc" # -- Options for LaTeX output ------------------------------------------------- # The paper size ('letter' or 'a4'). # latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). # latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, # documentclass [howto/manual]). latex_documents = [("index", "neo.tex", "Neo Documentation", AUTHORS, "manual")] # The name of an image file (relative to this directory) to place at the # top of the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # Additional stuff for the LaTeX preamble. # latex_preamble = '' # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_use_modindex = True todo_include_todos = True # set to False before releasing documentation rst_epilog = """ .. |neo_github_url| replace:: https://github.com/NeuralEnsemble/python-neo/archive/neo-{}.zip """.format( neo_release ) sphinx_gallery_conf = { # 'only_warn_on_example_error': True, # helps with debugging broken examples "examples_dirs": "../../examples", # path to your example scripts "gallery_dirs": "examples", # path to where to save gallery generated output } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/contributing.rst0000644000175100001660000005026314743453644017312 0ustar00runnerdocker=============================== Contributing to Neo development =============================== Contributions to Neo, whether it be fixing bugs, adding support for new file formats, improving the documentation, or adding new features, are welcome. Many :doc:`contributors to Neo` are PhD students or postdocs, often with little or no previous experience of software development or open-source projects, so as a community we try to be particularly welcoming to new contributors. If you're new to open source software, `How to Contribute to Open Source`_ is a good introductory guide. Discussing with other Neo developers ==================================== If you have an idea for improving Neo, the first step is to discuss it with other Neo developers on the NeuralEnsemble `mailing list`_. Discussion of issues specific to a particular ticket in the `issue tracker`_ should take place on the tracker. .. note:: Note that the mailing list is shared with other projects in the general domain of computational and systems neuroscience, so please don't be confused if you see posts that don't relate to Neo! .. goodforbeginners label Setting up a development environment ==================================== These instructions are written for beginning developers. If you are an experienced developer, you can skim this section. If any steps are unclear or confusing, please let us know. Fork the project on Github -------------------------- To work on Neo you will need a Github account. Once you have an account, go to the Neo project at https://github.com/NeuralEnsemble/python-neo and click on the "Fork button" near the top-right corner (`more information on forking`_). Now you can go to your own copy of the project at ``https://github.com//python-neo/`` Get the source code ------------------- We use the Git version control software to work on Neo. Git makes it easier to keep track of changes to the Neo code. If you don't have git installed on your computer, and/or haven't used git before, see the `GitHub Docs on git`_. On the homepage of your own copy of Neo, click on the green "Code" button, and copy either the HTTPS or SSH link, which will look like ``https://github.com//python-neo.git`` or ``git@github.com:/python-neo.git``. If you choose the HTTPS method you will be asked for your Github username and password regularly. To avoid this, you can `add an SSH key to your Github account`_. Now choose a location on your computer where you'd like to put the Neo source code, change to that directory, and run *one* of the following commands (depending on whether you chose HTTPS or SSH): :: git clone https://github.com//python-neo.git :: git clone git@github.com:/python-neo.git This copies the "master" branch of the Neo code to a directory named "python-neo". Now we need to make sure you can easily get the latest changes to Neo. Run:: cd python-neo git remote -v You should see something like:: origin git@github.com:/python-neo.git (fetch) origin git@github.com:/python-neo.git (push) which means that Git is using the alias "origin" to refer to your fork of the code. So that you can easily download any ongoing changes to Neo after the initial "git clone", we are going to add an alias "upstream" to refer to the main Neo repository:: git remote add upstream https://github.com/NeuralEnsemble/python-neo.git Create a virtual environment ---------------------------- It is strongly recommended to always work in a Python "virtual environment", to avoid conflicts between different versions of packages you might need for different projects, and to avoid causing problems with your operating system. With a virtual environment, you are working in an isolated space, which contains only the packages you specifically install into that environment. You can, for example, create different environments with different versions of Python, of NumPy, etc., and easily switch between them. We give instructions here for :mod:`conda` and for Python's built-in :mod:`venv` tool. Other virtual environment tools, such as virtualenv, are also available. :mod:`venv` is a built-in Python module, so if you already have Python installed on your computer, you can immediately get started without needing to install conda. The disadvantage is that you can only use the same version(s) of Python as already installed on your system, whereas conda allows you to easily create environments with different Python versions. .. tab:: conda We suggest using Miniconda_, which provides a minimal Python environment, but still allows you to easily install packages from the Anaconda repository. Install Miniconda using the instructions on its website, then create a conda environment using:: conda create --name my_neo_env where "my_neo_env" is a name for your environment: you can choose any name you wish. You then need to activate the environment:: conda activate my_neo_env If you wish to leave the environment:: conda deactivate .. tab:: venv Unlike with :mod:`conda`, which stores your environment in a standard location, with :mod:`venv` you have to choose where to store the environment files. One option is to create a folder :file:`venv` in your home directory, and then create your virtual envs in subdirectories like :file:`venv/neo`. Another option is to create :file:`env` within the Neo source code folder, e.g.: .. tab:: Unix/macOS .. code-block:: bash python3 -m venv env .. tab:: Windows .. code-block:: bat py -m venv env You then need to activate the environment: .. tab:: Unix/macOS .. code-block:: bash source env/bin/activate .. tab:: Windows .. code-block:: bat .\env\Scripts\activate If you want to switch projects or otherwise leave your virtual environment, simply run:: deactivate Install dependencies -------------------- The following commands will install all the packages needed to use Neo, run tests, and build the documentation. .. tab:: conda .. code-block:: bash conda install --file requirements_dev.txt pip install -e . .. tab:: venv The Neo testsuite uses Datalad_ to download test files. Datalad in turn depends on git-annex, which is not a Python package, and so cannot be installed with pip. See `installing Datalad`_ for instructions about installing git-annex on your system, then continue from here: .. code-block:: bash pip install -e .[test] This does not install all the optional dependencies for different file formats. If you're planning to work on a specific IO module, e.g. :class:`NixIO`, you can install the dependencies for that module:: pip install -e .[nixio] Or you can install all optional dependencies with:: pip install -e .[all] .. note:: the "-e" flag is for "editable". It means that any changes you make to the Neo code will be immediately available in your virtual environment. Without this flag, you would need to re-run ``pip install`` every time you change the code. Running the test suite ====================== To run the full test-suite, run:: pytest The first time this is run, all of the Neo test files will be downloaded to your machine, so the run time can be an hour or more. For subsequent runs, the files are already there, so the tests will run much faster. Because Neo downloads datasets this can lead to issues in the course of offline development or for packaging Neo (e.g. for a Linux distribution). In order to not download datasets and to skip tests which require downloaded datasets the environment variable :code:`NEO_TESTS_NO_NETWORK` can be set to any truthy value (e.g. :code:`'True'``). For macOS/Linux this can be done by doing: .. code-block:: bash NEO_TESTS_NO_NETWORK='True' pytest . For Windows this can be done by doing: .. code-block:: bat set NEO_TESTS_NO_NETWORK=true pytest . This can also be done with a conda environment variable if developing in a conda env. To configure these see the docs at `conda env vars documentation`_. It is often helpful to run only parts of the test suite. To test only the :mod:`neo.core` module, which is much quicker than testing :mod:`neo.io`, run:: pytest neo/test/coretest You can also run only tests in a specific file, e.g.:: pytest neo/test/coretest/test_analogsignal.py and you can even run individual tests, e.g.:: pytest neo/test/coretest/test_analogsignal.py::TestAnalogSignalConstructor::test__create_from_1d_quantities_array Test coverage ------------- A good way to start contributing to Neo is to improve the test coverage. If you run pytest with the "--cov" option: :: pytest --cov=neo --cov-report html --cov-report term Then pytest will track which lines of Neo code are executed while running the tests, and will generate a set of local web pages showing which lines have not been executed, and hence not tested. Our goal is 100% coverage, so adding tests to increase coverage is always welcome. Writing tests ============= You should try to write automated tests for any new code that you add. If you have found a bug and want to fix it, first write a test that isolates the bug (and that therefore fails with the existing codebase). Then apply your fix and check that the test now passes. We use Python's built-in :mod:`unittest` module to structure our tests, which are placed in the :file:`neo/test` directory. Related tests are grouped into classes, and each individual test is a method of that class, so take a look at the existing tests before deciding whether to add a new method, a new class or a new file. Some guidelines on writing tests: - Each test must be independent, the results shouldn't depend on the order in which tests are run. - Fast tests are preferred: we have a lot of tests, so the total time adds up quickly. - Where there are branches in the code (e.g. ``if`` statements), try to test all possible branches. Coding standards and style ========================== All code should conform as much as possible to `PEP 8`_, with a maximum line length of 99 characters, and should run with Python 3.8 or newer. You can use the `pep8`_ program to check the code for PEP 8 conformity. You can also use `flake8`_, which combines pep8 and pyflakes. However, the pep8 and flake8 programs do not check for all PEP 8 issues. In particular, they do not check that the import statements are in the correct order (standard library imports first, then other dependencies, then Neo's own code). Working on the documentation ============================ All modules, classes, functions, and methods (including private and subclassed builtin methods) should have docstrings. Please see `PEP 257`_ for a description of docstring conventions. Module docstrings should explain briefly what functions or classes are present. Detailed descriptions can be left for the docstrings of the respective functions or classes. Class docstrings should include an explanation of the purpose of the class and, when applicable, how it relates to standard neuroscience data. They should also include at least one example, which should be written so it can be run as-is from a clean, newly-started Python interactive session (this means all imports should be included). Finally, they should include a list of all arguments, attributes, and properties, with explanations. Properties that return data calculated from other data should explain what calculation is done. A list of methods is not needed, since documentation will be generated from the method docstrings. Method and function docstrings should include an explanation of what the method or function does. If this may not be clear, one or more examples may be included. Examples that are only a few lines do not need to include imports or setup, but more complicated examples should have them. The documentation is written in `reStructuredText`_, using the `Sphinx`_ documentation system. Any mention of another Neo module, class, attribute, method, or function should be properly marked up so automatic links can be generated. To build the documentation:: pip install -e .[docs] cd doc make html Then open :file:`build/html/index.html` in your browser. Writing an IO module ==================== The topic of writing a new IO module is addressed in :doc:`add_file_format`. Working with Git ================ If you're new to Git, there are many good learning resources on the web, such as `Blischak, Davenport and Wilson (2016)`_. We recommend the following best practices, based on `this document by Luis Matos`_: **Commit related changes** Try to ensure that each commit contains only changes related to a single topic. For example, fixing two different bugs should result in two separate commits. Small commits make it easier for other developers to understand the changes. You don't have to commit all the changes in your working copy: use the `staging area`_ and the ability to stage only parts of a file to only include relevant changes. Graphical Git tools such as Sourcetree_ and GitKraken_ can make this very easy. **Commit and push often** Committing often helps to (i) keep your commits small, (ii) commit only related changes, (iii) reduce the risk of losing work, and (iv) share your code more frequently with others, which is important for a fairly busy project like Neo because it makes it easier to integrate different people's changes. **Test your code before you commit** Since the Neo IO module tests take a long time to run, you may not wish to run them before every commit. However, the core module tests run quickly, so you can run them every time, and of course if you're working on a particular IO module you should run the tests for that module. **Write informative commit messages** The first line of your commit message should be a short summary of your changes. Then add a blank line. Then give additional information, for example explaining the motivation for the change and adding links to related Github issue(s). **Use branches** **Always** work in a branch specific to the bug you're trying to fix or the feature you're trying to add, never in the master/main branch. Branches should ideally be short lived, to minimise the risk of conflicts when merging into the master branch. You should aim to synchronize the master/main branch in your own fork with the upstream NeuralEnsemble master branch frequently, and always create a new branch off this master branch. Making a pull request ===================== When you think your bug fix, new feature, or cleanup is ready to be merged into Neo, `open a pull request on GitHub`_. If this is your first pull request to the project, please include a commit in which you add your name and affiliation/employer (if any) to :file:`doc/source/authors.rst`. Reviewing pull requests ======================= In addition to writing code and documentation, constructive reviewing of other people's code is also a great way to contribute to Neo development. Please review the `Code of Conduct`_ before reviewing. Code reviews are a big part of what determines whether contributing to Neo is a positive experience or not. Like reviewing scientific papers, reviewing pull requests (PRs) requires both attention to detail and seeing the big picture. **Attention to detail** - For every line of code added or removed, ensure you understand the purpose of the change. If this is unclear, add a comment in the PR. - Ensure that unit tests have been added or modified appropriately to test the modified code. - Check that all of the automated checks have passed. Occasionally a test failure is not related to the specific pull request, but to some change in the CI system, or some other unrelated change. If you're *absolutely sure* this is the case, then it's ok to approve the PR, but please add a comment explaining why you think the failure is unrelated. - If you see a more efficient way to implement something, feel free to add a comment about this, but please ensure all comments are polite and constructive. - Check that new code is adequately documented, with docstrings for new functions or classes, comments to explain complex pieces of code, and changes to the user guide if adding or removing features. - Ensure there is no temporary, commented out code. Since Neo is a library, there should be no, or very few ``print()`` functions. **The big picture** - Is this code maintainable? If the algorithm is highly complex so that few people can understand it, or it's a very niche feature, then it may not be possible to maintain this code in the long term. - Are you aware of other people working on the same issue, or a related one? If that's the case, please make the submitter aware of this so they can coordinate with the others. - Pull requests don't have to be perfect, especially if they're from first-time or inexperienced contributors. Sometimes it's ok to accept a partial or sub-optimal solution that can be improved later, as long as it moves the project in a good direction. Making a release ================ - Create a new file with the release notes in the folder :file:`doc/source/releases` then add a link to it in :file:`/doc/source/releases.rst`. - Ensure you are in the master branch. - Check that all tests pass, and that the documentation builds correctly (see above). - Tag the release in the Git repository and push it:: git tag git push --tags origin git push --tags upstream - Wait for the `continuous integration server`_ to run all the tests, ensure there are no failures. If there are failures, fix them, and move the tag to the new commit. - Build source and wheel packages:: python -m build - Upload the package to `PyPI`_ (the members of the :ref:`section-maintainers` team have the necessary permissions to do this):: twine upload dist/neo-0.X.Y.tar.gz - Check the `Read the Docs`_ documentation has built correctly. If not, you may need to manually activate the new version in the `docs configuration page`_. .. _`mailing list`: http://neuralensemble.org/community .. _`issue tracker`: https://github.com/NeuralEnsemble/python-neo/issues/ .. _`add an SSH key to your Github account`: https://docs.github.com/en/authentication/connecting-to-github-with-ssh .. _`more information on forking`: http://help.github.com/en/articles/fork-a-repo .. _`GitHub Docs on git`: https://docs.github.com/en/get-started/quickstart/set-up-git .. _`How to Contribute to Open Source`: https://opensource.guide/how-to-contribute/ .. _Miniconda: https://docs.conda.io/en/latest/miniconda.html .. _Datalad: https://www.datalad.org .. _`installing Datalad`: https://handbook.datalad.org/en/latest/intro/installation.html#installation-and-configuration .. _pep8: https://pypi.org/project/pep8/ .. _flake8: https://pypi.org/project/flake8/ .. _pyflakes: https://pypi.org/project/pyflakes/ .. _reStructuredText: http://docutils.sourceforge.net/rst.html .. _Sphinx: http://www.sphinx-doc.org/ .. _`PEP 257`: https://www.python.org/dev/peps/pep-0257/ .. _`PEP 8`: https://www.python.org/dev/peps/pep-0008/ .. _pep8: https://pypi.org/project/pep8/ .. _`Blischak, Davenport and Wilson (2016)`: https://doi.org/10.1371/journal.pcbi.1004668 .. _`this document by Luis Matos`: https://gist.github.com/luismts/ .. _`staging area`: https://coderefinery.github.io/git-intro/staging-area/ .. _Sourcetree: https://www.sourcetreeapp.com .. _GitKraken: https://www.gitkraken.com .. _`open a pull request on GitHub`: https://help.github.com/en/articles/about-pull-requests .. _`Code of Conduct`: https://github.com/NeuralEnsemble/python-neo/blob/master/CODE_OF_CONDUCT.md .. _`maintainers team`: https://github.com/orgs/NeuralEnsemble/teams/neo-maintainers .. _PyPI: https://pypi.org/project/neo .. _`continuous integration server`: https://github.com/NeuralEnsemble/python-neo/actions .. _`Read the Docs`: https://neo.readthedocs.io/en/latest/ .. _`docs configuration page`: https://readthedocs.org/projects/neo/ .. _`conda env vars documentation`: https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#activating-an-environment././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/example_data.txt0000644000175100001660000165146014743453644017245 0ustar00runnerdocker-5.8469e+01 -5.2855e+01 -5.8790e+01 -5.8815e+01 -5.9061e+01 -5.0518e+01 -5.2003e+01 -5.7240e+01 -5.9010e+01 -5.0510e+01 -5.1988e+01 -5.7199e+01 -5.8960e+01 -5.0503e+01 -5.1973e+01 -5.7158e+01 -5.8911e+01 -5.0495e+01 -5.1958e+01 -5.7117e+01 -5.8861e+01 -5.0488e+01 -5.1944e+01 -5.7076e+01 -5.8812e+01 -5.0480e+01 -5.1929e+01 -5.7036e+01 -5.8763e+01 -5.0473e+01 -5.1914e+01 -5.6996e+01 -5.8715e+01 -5.0466e+01 -5.1900e+01 -5.6956e+01 -5.8666e+01 -5.0457e+01 -5.1885e+01 -5.6917e+01 -5.8618e+01 -5.0442e+01 -5.1871e+01 -5.6877e+01 -5.8570e+01 -5.0427e+01 -5.1857e+01 -5.6838e+01 -5.8522e+01 -5.0412e+01 -5.1842e+01 -5.6799e+01 -5.8475e+01 -5.0397e+01 -5.1828e+01 -5.6760e+01 -5.8445e+01 -5.0383e+01 -5.1814e+01 -5.6721e+01 -5.8442e+01 -5.0369e+01 -5.1800e+01 -5.6683e+01 -5.8439e+01 -5.0355e+01 -5.1786e+01 -5.6644e+01 -5.8435e+01 -5.0341e+01 -5.1772e+01 -5.6606e+01 -5.8432e+01 -5.0328e+01 -5.1758e+01 -5.6568e+01 -5.8427e+01 -5.0315e+01 -5.1745e+01 -5.6530e+01 -5.8423e+01 -5.0301e+01 -5.1731e+01 -5.6493e+01 -5.8417e+01 -5.0289e+01 -5.1714e+01 -5.6456e+01 -5.8412e+01 -5.0276e+01 -5.1692e+01 -5.6418e+01 -5.8406e+01 -5.0263e+01 -5.1671e+01 -5.6381e+01 -5.8399e+01 -5.0251e+01 -5.1649e+01 -5.6345e+01 -5.8384e+01 -5.0239e+01 -5.1620e+01 -5.6308e+01 -5.8369e+01 -5.0227e+01 -5.1592e+01 -5.6271e+01 -5.8354e+01 -5.0215e+01 -5.1564e+01 -5.6235e+01 -5.8339e+01 -5.0204e+01 -5.1537e+01 -5.6199e+01 -5.8324e+01 -5.0192e+01 -5.1510e+01 -5.6163e+01 -5.8307e+01 -5.0181e+01 -5.1484e+01 -5.6127e+01 -5.8283e+01 -5.0170e+01 -5.1457e+01 -5.6092e+01 -5.8260e+01 -5.0159e+01 -5.1432e+01 -5.6057e+01 -5.8236e+01 -5.0148e+01 -5.1406e+01 -5.6021e+01 -5.8213e+01 -5.0137e+01 -5.1382e+01 -5.5986e+01 -5.8211e+01 -5.0127e+01 -5.1357e+01 -5.5950e+01 -5.8232e+01 -5.0109e+01 -5.1333e+01 -5.5908e+01 -5.8252e+01 -5.0090e+01 -5.1309e+01 -5.5865e+01 -5.8272e+01 -5.0073e+01 -5.1286e+01 -5.5823e+01 -5.8291e+01 -5.0055e+01 -5.1263e+01 -5.5782e+01 -5.8314e+01 -5.0033e+01 -5.1240e+01 -5.5741e+01 -5.8376e+01 -5.0008e+01 -5.1217e+01 -5.5698e+01 -5.8438e+01 -6.0000e+01 -5.1195e+01 -5.5649e+01 -5.8498e+01 -6.0000e+01 -5.1174e+01 -5.5601e+01 -5.8556e+01 -6.0000e+01 -5.1152e+01 -5.5554e+01 -5.8614e+01 -6.0000e+01 -5.1131e+01 -5.5507e+01 -5.8670e+01 -6.0000e+01 -5.1110e+01 -5.5461e+01 -5.8725e+01 -6.0000e+01 -5.1086e+01 -5.5415e+01 -5.8779e+01 -6.0000e+01 -5.1058e+01 -5.5370e+01 -5.8831e+01 -6.0000e+01 -5.1030e+01 -5.5325e+01 -5.8883e+01 -6.0000e+01 -5.0996e+01 -5.5280e+01 -5.8933e+01 -6.0000e+01 -5.0962e+01 -5.5237e+01 -5.8982e+01 -6.0000e+01 -5.0928e+01 -5.5193e+01 -5.9070e+01 -6.0000e+01 -5.0895e+01 -5.5150e+01 -5.9161e+01 -6.0000e+01 -5.0862e+01 -5.5108e+01 -5.9250e+01 -6.0000e+01 -5.0830e+01 -5.5066e+01 -5.9338e+01 -6.0000e+01 -5.0799e+01 -5.5024e+01 -5.9422e+01 -6.0000e+01 -5.0768e+01 -5.4983e+01 -5.9497e+01 -6.0000e+01 -5.0738e+01 -5.4942e+01 -5.9564e+01 -6.0000e+01 -5.0709e+01 -5.4902e+01 -5.9629e+01 -6.0000e+01 -5.0680e+01 -5.4862e+01 -5.9693e+01 -6.0000e+01 -5.0651e+01 -5.4822e+01 -5.9756e+01 -6.0000e+01 -5.0623e+01 -5.4783e+01 -5.9818e+01 -6.0000e+01 -5.0596e+01 -5.4736e+01 -5.9878e+01 -6.0000e+01 -5.0569e+01 -5.4690e+01 -5.9937e+01 -6.0000e+01 -5.0543e+01 -5.4644e+01 -5.9995e+01 -6.0000e+01 -5.0517e+01 -5.4600e+01 -6.0052e+01 -6.0000e+01 -5.0492e+01 -5.4555e+01 -6.0107e+01 -6.0000e+01 -5.0467e+01 -5.4511e+01 -6.0162e+01 -6.0000e+01 -5.0442e+01 -5.4476e+01 -6.0215e+01 -6.0000e+01 -5.0418e+01 -5.4478e+01 -6.0267e+01 -6.0000e+01 -5.0395e+01 -5.4479e+01 -6.0318e+01 -6.0000e+01 -5.0372e+01 -5.4481e+01 -6.0363e+01 -6.0000e+01 -5.0349e+01 -5.4482e+01 -6.0403e+01 -6.0000e+01 -5.0327e+01 -5.4478e+01 -6.0443e+01 -6.0000e+01 -5.0305e+01 -5.4471e+01 -6.0478e+01 -6.0000e+01 -5.0284e+01 -5.4464e+01 -6.0508e+01 -6.0000e+01 -5.0263e+01 -5.4457e+01 -6.0537e+01 -6.0000e+01 -5.0242e+01 -5.4443e+01 -6.0566e+01 -6.0000e+01 -5.0222e+01 -5.4428e+01 -6.0594e+01 -6.0000e+01 -5.0202e+01 -5.4407e+01 -6.0621e+01 -6.0000e+01 -5.0183e+01 -5.4386e+01 -6.0642e+01 -6.0000e+01 -5.0164e+01 -5.4364e+01 -6.0660e+01 -6.0000e+01 -5.0145e+01 -5.4343e+01 -6.0678e+01 -6.0000e+01 -5.0127e+01 -5.4322e+01 -6.0695e+01 -6.0000e+01 -5.0109e+01 -5.4300e+01 -6.0712e+01 -6.0000e+01 -5.0091e+01 -5.4272e+01 -6.0728e+01 -6.0000e+01 -5.0074e+01 -5.4245e+01 -6.0744e+01 -6.0000e+01 -5.0056e+01 -5.4215e+01 -6.0759e+01 -6.0000e+01 -5.0040e+01 -5.4181e+01 -6.0773e+01 -6.0000e+01 -5.0023e+01 -5.4147e+01 -6.0788e+01 -6.0000e+01 -5.0007e+01 -5.4114e+01 -6.0801e+01 -6.0054e+01 -6.0000e+01 -5.4082e+01 -6.0815e+01 -6.0133e+01 -6.0000e+01 -5.4050e+01 -6.0827e+01 -6.0212e+01 -6.0000e+01 -5.4019e+01 -6.0840e+01 -6.0289e+01 -6.0000e+01 -5.3987e+01 -6.0849e+01 -6.0364e+01 -6.0000e+01 -5.3949e+01 -6.0852e+01 -6.0439e+01 -6.0000e+01 -5.3912e+01 -6.0855e+01 -6.0512e+01 -6.0000e+01 -5.3876e+01 -6.0858e+01 -6.0584e+01 -6.0000e+01 -5.3840e+01 -6.0860e+01 -6.0654e+01 -6.0000e+01 -5.3806e+01 -6.0862e+01 -6.0724e+01 -6.0000e+01 -5.3772e+01 -6.0864e+01 -6.0792e+01 -6.0000e+01 -5.3735e+01 -6.0866e+01 -6.0859e+01 -6.0000e+01 -5.3694e+01 -6.0867e+01 -6.0924e+01 -6.0000e+01 -5.3655e+01 -6.0868e+01 -6.0989e+01 -6.0000e+01 -5.3616e+01 -6.0869e+01 -6.1052e+01 -6.0000e+01 -5.3578e+01 -6.0869e+01 -6.1114e+01 -6.0000e+01 -5.3541e+01 -6.0869e+01 -6.1175e+01 -6.0000e+01 -5.3532e+01 -6.0869e+01 -6.1234e+01 -6.0000e+01 -5.3541e+01 -6.0868e+01 -6.1293e+01 -6.0000e+01 -5.3549e+01 -6.0867e+01 -6.1350e+01 -6.0000e+01 -5.3558e+01 -6.0866e+01 -6.1400e+01 -6.0000e+01 -5.3567e+01 -6.0865e+01 -6.1448e+01 -6.0000e+01 -5.3575e+01 -6.0863e+01 -6.1494e+01 -6.0000e+01 -5.3584e+01 -6.0861e+01 -6.1535e+01 -6.0000e+01 -5.3593e+01 -6.0858e+01 -6.1571e+01 -6.0000e+01 -5.3602e+01 -6.0856e+01 -6.1607e+01 -6.0000e+01 -5.3611e+01 -6.0853e+01 -6.1642e+01 -6.0000e+01 -5.3653e+01 -6.0849e+01 -6.1676e+01 -6.0000e+01 -5.3706e+01 -6.0845e+01 -6.1709e+01 -6.0000e+01 -5.3759e+01 -6.0841e+01 -6.1734e+01 -6.0000e+01 -5.3810e+01 -6.0837e+01 -6.1758e+01 -6.0000e+01 -5.3861e+01 -6.0832e+01 -6.1781e+01 -6.0000e+01 -5.3912e+01 -6.0816e+01 -6.1804e+01 -6.0000e+01 -5.3961e+01 -6.0795e+01 -6.1827e+01 -6.0000e+01 -5.4008e+01 -6.0774e+01 -6.1849e+01 -6.0000e+01 -5.4049e+01 -6.0753e+01 -6.1870e+01 -6.0000e+01 -5.4088e+01 -6.0733e+01 -6.1891e+01 -6.0000e+01 -5.4120e+01 -6.0712e+01 -6.1911e+01 -6.0000e+01 -5.4151e+01 -6.0691e+01 -6.1925e+01 -6.0000e+01 -5.4182e+01 -6.0671e+01 -6.1936e+01 -6.0000e+01 -5.4213e+01 -6.0650e+01 -6.1941e+01 -6.0000e+01 -5.4243e+01 -6.0630e+01 -6.1944e+01 -6.0000e+01 -5.4273e+01 -6.0609e+01 -6.1947e+01 -6.0000e+01 -5.4303e+01 -6.0589e+01 -6.1949e+01 -6.0000e+01 -5.4332e+01 -6.0568e+01 -6.1951e+01 -6.0000e+01 -5.4361e+01 -6.0548e+01 -6.1945e+01 -6.0000e+01 -5.4390e+01 -6.0528e+01 -6.1933e+01 -6.0000e+01 -5.4419e+01 -6.0507e+01 -6.1919e+01 -6.0000e+01 -5.4447e+01 -6.0487e+01 -6.1905e+01 -6.0000e+01 -5.4474e+01 -6.0467e+01 -6.1907e+01 -6.0000e+01 -5.4502e+01 -6.0446e+01 -6.1938e+01 -6.0023e+01 -5.4529e+01 -6.0421e+01 -6.1969e+01 -6.0064e+01 -5.4556e+01 -6.0392e+01 -6.1999e+01 -6.0104e+01 -5.4582e+01 -6.0364e+01 -6.2028e+01 -6.0144e+01 -5.4608e+01 -6.0336e+01 -6.2057e+01 -6.0182e+01 -5.4634e+01 -6.0308e+01 -6.2086e+01 -6.0220e+01 -5.4659e+01 -6.0281e+01 -6.2114e+01 -6.0257e+01 -5.4684e+01 -6.0253e+01 -6.2141e+01 -6.0293e+01 -5.4709e+01 -6.0226e+01 -6.2168e+01 -6.0328e+01 -5.4733e+01 -6.0199e+01 -6.2194e+01 -6.0362e+01 -5.4757e+01 -6.0172e+01 -6.2220e+01 -6.0396e+01 -5.4781e+01 -6.0145e+01 -6.2245e+01 -6.0428e+01 -5.4804e+01 -6.0118e+01 -6.2269e+01 -6.0460e+01 -5.4827e+01 -6.0091e+01 -6.2293e+01 -6.0491e+01 -5.4850e+01 -6.0065e+01 -6.2317e+01 -6.0522e+01 -5.4872e+01 -6.0038e+01 -6.2340e+01 -6.0551e+01 -5.4894e+01 -6.0012e+01 -6.2362e+01 -6.0580e+01 -5.4915e+01 -5.9985e+01 -6.2384e+01 -6.0608e+01 -5.4936e+01 -5.9959e+01 -6.2405e+01 -6.0635e+01 -5.4957e+01 -5.9933e+01 -6.2425e+01 -6.0661e+01 -5.4977e+01 -5.9907e+01 -6.2445e+01 -6.0687e+01 -5.4997e+01 -5.9881e+01 -6.2464e+01 -6.0711e+01 -5.5017e+01 -5.9855e+01 -6.2483e+01 -6.0735e+01 -5.5036e+01 -5.9829e+01 -6.2501e+01 -6.0759e+01 -5.5055e+01 -5.9803e+01 -6.2519e+01 -6.0781e+01 -5.5073e+01 -5.9778e+01 -6.2536e+01 -6.0803e+01 -5.5091e+01 -5.9752e+01 -6.2553e+01 -6.0824e+01 -5.5109e+01 -5.9726e+01 -6.2569e+01 -6.0845e+01 -5.5126e+01 -5.9701e+01 -6.2584e+01 -6.0864e+01 -5.5143e+01 -5.9669e+01 -6.2599e+01 -6.0875e+01 -5.5160e+01 -5.9636e+01 -6.2613e+01 -6.0885e+01 -5.5176e+01 -5.9603e+01 -6.2626e+01 -6.0895e+01 -5.5192e+01 -5.9570e+01 -6.2639e+01 -6.0905e+01 -5.5208e+01 -5.9537e+01 -6.2652e+01 -6.0914e+01 -5.5223e+01 -5.9504e+01 -6.2664e+01 -6.0922e+01 -5.5238e+01 -5.9472e+01 -6.2675e+01 -6.0930e+01 -5.5252e+01 -5.9440e+01 -6.2686e+01 -6.0938e+01 -5.5266e+01 -5.9408e+01 -6.2696e+01 -6.0944e+01 -5.5280e+01 -5.9376e+01 -6.2706e+01 -6.0951e+01 -5.5293e+01 -5.9345e+01 -6.2715e+01 -6.0957e+01 -5.5306e+01 -5.9313e+01 -6.2723e+01 -6.0962e+01 -5.5319e+01 -5.9282e+01 -6.2731e+01 -6.0967e+01 -5.5331e+01 -5.9251e+01 -6.2739e+01 -6.0972e+01 -5.5343e+01 -5.9220e+01 -6.2746e+01 -6.0976e+01 -5.5355e+01 -5.9189e+01 -6.2752e+01 -6.0980e+01 -5.5366e+01 -5.9159e+01 -6.2758e+01 -6.0983e+01 -5.5377e+01 -5.9128e+01 -6.2763e+01 -6.0986e+01 -5.5388e+01 -5.9098e+01 -6.2768e+01 -6.0988e+01 -5.5398e+01 -5.9068e+01 -6.2772e+01 -6.0990e+01 -5.5408e+01 -5.9038e+01 -6.2776e+01 -6.0991e+01 -5.5418e+01 -5.9008e+01 -6.2779e+01 -6.0992e+01 -5.5427e+01 -5.8978e+01 -6.2782e+01 -6.0992e+01 -5.5436e+01 -5.8945e+01 -6.2784e+01 -6.0992e+01 -5.5445e+01 -5.8908e+01 -6.2786e+01 -6.0992e+01 -5.5453e+01 -5.8871e+01 -6.2787e+01 -6.0991e+01 -5.5461e+01 -5.8834e+01 -6.2787e+01 -6.0989e+01 -5.5468e+01 -5.8797e+01 -6.2788e+01 -6.0988e+01 -5.5476e+01 -5.8761e+01 -6.2787e+01 -6.0985e+01 -5.5483e+01 -5.8725e+01 -6.2786e+01 -6.0983e+01 -5.5489e+01 -5.8689e+01 -6.2785e+01 -6.0980e+01 -5.5496e+01 -5.8654e+01 -6.2783e+01 -6.0976e+01 -5.5502e+01 -5.8619e+01 -6.2781e+01 -6.0973e+01 -5.5507e+01 -5.8584e+01 -6.2778e+01 -6.0968e+01 -5.5513e+01 -5.8549e+01 -6.2775e+01 -6.0964e+01 -5.5518e+01 -5.8514e+01 -6.2771e+01 -6.0959e+01 -5.5523e+01 -5.8480e+01 -6.2767e+01 -6.0953e+01 -5.5527e+01 -5.8446e+01 -6.2762e+01 -6.0947e+01 -5.5531e+01 -5.8412e+01 -6.2757e+01 -6.0941e+01 -5.5535e+01 -5.8379e+01 -6.2751e+01 -6.0934e+01 -5.5539e+01 -5.8346e+01 -6.2745e+01 -6.0927e+01 -5.5542e+01 -5.8312e+01 -6.2739e+01 -6.0920e+01 -5.5545e+01 -5.8280e+01 -6.2732e+01 -6.0912e+01 -5.5548e+01 -5.8247e+01 -6.2724e+01 -6.0904e+01 -5.5550e+01 -5.8214e+01 -6.2717e+01 -6.0896e+01 -5.5553e+01 -5.8180e+01 -6.2708e+01 -6.0887e+01 -5.5555e+01 -5.8140e+01 -6.2700e+01 -6.0877e+01 -5.5556e+01 -5.8100e+01 -6.2691e+01 -6.0868e+01 -5.5558e+01 -5.8061e+01 -6.2681e+01 -6.0858e+01 -5.5559e+01 -5.8022e+01 -6.2671e+01 -6.0848e+01 -5.5559e+01 -5.7983e+01 -6.2661e+01 -6.0837e+01 -5.5560e+01 -5.7945e+01 -6.2650e+01 -6.0826e+01 -5.5560e+01 -5.7907e+01 -6.2639e+01 -6.0815e+01 -5.5560e+01 -5.7869e+01 -6.2627e+01 -6.0803e+01 -5.5560e+01 -5.7832e+01 -6.2615e+01 -6.0791e+01 -5.5560e+01 -5.7795e+01 -6.2603e+01 -6.0779e+01 -5.5559e+01 -5.7758e+01 -6.2590e+01 -6.0766e+01 -5.5558e+01 -5.7722e+01 -6.2577e+01 -6.0754e+01 -5.5556e+01 -5.7686e+01 -6.2564e+01 -6.0740e+01 -5.5555e+01 -5.7650e+01 -6.2550e+01 -6.0727e+01 -5.5553e+01 -5.7614e+01 -6.2536e+01 -6.0713e+01 -5.5551e+01 -5.7579e+01 -6.2521e+01 -6.0699e+01 -5.5549e+01 -5.7544e+01 -6.2506e+01 -6.0684e+01 -5.5547e+01 -5.7510e+01 -6.2491e+01 -6.0670e+01 -5.5544e+01 -5.7475e+01 -6.2475e+01 -6.0655e+01 -5.5541e+01 -5.7441e+01 -6.2459e+01 -6.0639e+01 -5.5538e+01 -5.7407e+01 -6.2443e+01 -6.0624e+01 -5.5534e+01 -5.7373e+01 -6.2426e+01 -6.0608e+01 -5.5531e+01 -5.7340e+01 -6.2409e+01 -6.0592e+01 -5.5527e+01 -5.7307e+01 -6.2392e+01 -6.0575e+01 -5.5523e+01 -5.7274e+01 -6.2374e+01 -6.0559e+01 -5.5519e+01 -5.7241e+01 -6.2356e+01 -6.0542e+01 -5.5514e+01 -5.7209e+01 -6.2338e+01 -6.0525e+01 -5.5510e+01 -5.7176e+01 -6.2320e+01 -6.0507e+01 -5.5505e+01 -5.7144e+01 -6.2301e+01 -6.0489e+01 -5.5500e+01 -5.7112e+01 -6.2281e+01 -6.0471e+01 -5.5494e+01 -5.7081e+01 -6.2262e+01 -6.0446e+01 -5.5489e+01 -5.7049e+01 -6.2242e+01 -6.0419e+01 -5.5483e+01 -5.7018e+01 -6.2222e+01 -6.0393e+01 -5.5477e+01 -5.6987e+01 -6.2202e+01 -6.0367e+01 -5.5471e+01 -5.6956e+01 -6.2181e+01 -6.0340e+01 -5.5465e+01 -5.6925e+01 -6.2160e+01 -6.0314e+01 -5.5458e+01 -5.6895e+01 -6.2139e+01 -6.0287e+01 -5.5452e+01 -5.6864e+01 -6.2117e+01 -6.0261e+01 -5.5445e+01 -5.6834e+01 -6.2095e+01 -6.0234e+01 -5.5438e+01 -5.6804e+01 -6.2073e+01 -6.0208e+01 -5.5431e+01 -5.6774e+01 -6.2051e+01 -6.0181e+01 -5.5423e+01 -5.6745e+01 -6.2028e+01 -6.0154e+01 -5.5416e+01 -5.6715e+01 -6.2006e+01 -6.0127e+01 -5.5408e+01 -5.6686e+01 -6.1983e+01 -6.0101e+01 -5.5400e+01 -5.6657e+01 -6.1959e+01 -6.0074e+01 -5.5392e+01 -5.6628e+01 -6.1936e+01 -6.0047e+01 -5.5384e+01 -5.6599e+01 -6.1912e+01 -6.0020e+01 -5.5375e+01 -5.6570e+01 -6.1888e+01 -5.9993e+01 -5.5367e+01 -5.6541e+01 -6.1864e+01 -5.9966e+01 -5.5358e+01 -5.6513e+01 -6.1833e+01 -5.9938e+01 -5.5349e+01 -5.6484e+01 -6.1800e+01 -5.9911e+01 -5.5340e+01 -5.6456e+01 -6.1768e+01 -5.9884e+01 -5.5331e+01 -5.6428e+01 -6.1735e+01 -5.9857e+01 -5.5322e+01 -5.6400e+01 -6.1703e+01 -5.9829e+01 -5.5312e+01 -5.6372e+01 -6.1670e+01 -5.9802e+01 -5.5303e+01 -5.6345e+01 -6.1637e+01 -5.9775e+01 -5.5293e+01 -5.6317e+01 -6.1605e+01 -5.9747e+01 -5.5283e+01 -5.6290e+01 -6.1572e+01 -5.9720e+01 -5.5273e+01 -5.6263e+01 -6.1539e+01 -5.9692e+01 -5.5263e+01 -5.6235e+01 -6.1506e+01 -5.9665e+01 -5.5252e+01 -5.6208e+01 -6.1473e+01 -5.9637e+01 -5.5242e+01 -5.6181e+01 -6.1440e+01 -5.9609e+01 -5.5231e+01 -5.6155e+01 -6.1408e+01 -5.9581e+01 -5.5221e+01 -5.6128e+01 -6.1375e+01 -5.9554e+01 -5.5210e+01 -5.6101e+01 -6.1342e+01 -5.9526e+01 -5.5194e+01 -5.6075e+01 -6.1309e+01 -5.9498e+01 -5.5175e+01 -5.6048e+01 -6.1276e+01 -5.9470e+01 -5.5156e+01 -5.6022e+01 -6.1243e+01 -5.9442e+01 -5.5137e+01 -5.5996e+01 -6.1210e+01 -5.9414e+01 -5.5118e+01 -5.5970e+01 -6.1177e+01 -5.9386e+01 -5.5100e+01 -5.5942e+01 -6.1143e+01 -5.9358e+01 -5.5081e+01 -5.5908e+01 -6.1110e+01 -5.9330e+01 -5.5062e+01 -5.5875e+01 -6.1077e+01 -5.9302e+01 -5.5044e+01 -5.5841e+01 -6.1044e+01 -5.9274e+01 -5.5025e+01 -5.5808e+01 -6.1011e+01 -5.9246e+01 -5.5007e+01 -5.5776e+01 -6.0978e+01 -5.9217e+01 -5.4988e+01 -5.5743e+01 -6.0944e+01 -5.9189e+01 -5.4961e+01 -5.5711e+01 -6.0911e+01 -5.9161e+01 -5.4935e+01 -5.5679e+01 -6.0878e+01 -5.9132e+01 -5.4910e+01 -5.5648e+01 -6.0844e+01 -5.9104e+01 -5.4884e+01 -5.5616e+01 -6.0811e+01 -5.9076e+01 -5.4859e+01 -5.5585e+01 -6.0778e+01 -5.9047e+01 -5.4834e+01 -5.5554e+01 -6.0744e+01 -5.9019e+01 -5.4809e+01 -5.5524e+01 -6.0711e+01 -5.8990e+01 -5.4785e+01 -5.5493e+01 -6.0677e+01 -5.8962e+01 -5.4760e+01 -5.5463e+01 -6.0644e+01 -5.8933e+01 -5.4736e+01 -5.5433e+01 -6.0610e+01 -5.8905e+01 -5.4712e+01 -5.5404e+01 -6.0609e+01 -5.8908e+01 -5.4688e+01 -5.5374e+01 -6.0620e+01 -5.8924e+01 -5.4665e+01 -5.5345e+01 -6.0630e+01 -5.8939e+01 -5.4641e+01 -5.5312e+01 -6.0639e+01 -5.8953e+01 -5.4618e+01 -5.5275e+01 -6.0648e+01 -5.8967e+01 -5.4595e+01 -5.5252e+01 -6.0656e+01 -5.8979e+01 -5.4572e+01 -5.5261e+01 -6.0663e+01 -5.8992e+01 -5.4550e+01 -5.5269e+01 -6.0670e+01 -5.9003e+01 -5.4527e+01 -5.5277e+01 -6.0676e+01 -5.9014e+01 -5.4505e+01 -5.5285e+01 -6.0681e+01 -5.9025e+01 -5.4483e+01 -5.5292e+01 -6.0686e+01 -5.9034e+01 -5.4461e+01 -5.5291e+01 -6.0691e+01 -5.9044e+01 -5.4439e+01 -5.5290e+01 -6.0694e+01 -5.9050e+01 -5.4418e+01 -5.5289e+01 -6.0697e+01 -5.9050e+01 -5.4396e+01 -5.5288e+01 -6.0700e+01 -5.9049e+01 -5.4375e+01 -5.5287e+01 -6.0702e+01 -5.9049e+01 -5.4354e+01 -5.5286e+01 -6.0703e+01 -5.9047e+01 -5.4333e+01 -5.5285e+01 -6.0704e+01 -5.9046e+01 -5.4312e+01 -5.5283e+01 -6.0704e+01 -5.9044e+01 -5.4291e+01 -5.5282e+01 -6.0704e+01 -5.9042e+01 -5.4270e+01 -5.5280e+01 -6.0703e+01 -5.9039e+01 -5.4250e+01 -5.5277e+01 -6.0702e+01 -5.9036e+01 -5.4228e+01 -5.5267e+01 -6.0700e+01 -5.9033e+01 -5.4200e+01 -5.5257e+01 -6.0698e+01 -5.9029e+01 -5.4172e+01 -5.5248e+01 -6.0695e+01 -5.9025e+01 -5.4144e+01 -5.5238e+01 -6.0691e+01 -5.9021e+01 -5.4117e+01 -5.5229e+01 -6.0687e+01 -5.9016e+01 -5.4090e+01 -5.5219e+01 -6.0683e+01 -5.9011e+01 -5.4063e+01 -5.5210e+01 -6.0678e+01 -5.9005e+01 -5.4037e+01 -5.5201e+01 -6.0673e+01 -5.9000e+01 -5.4011e+01 -5.5200e+01 -6.0667e+01 -5.8994e+01 -5.3985e+01 -5.5236e+01 -6.0661e+01 -5.8987e+01 -5.3960e+01 -5.5271e+01 -6.0654e+01 -5.8980e+01 -5.3934e+01 -5.5305e+01 -6.0647e+01 -5.8973e+01 -5.3909e+01 -5.5338e+01 -6.0640e+01 -5.8966e+01 -5.3885e+01 -5.5371e+01 -6.0631e+01 -5.8958e+01 -5.3860e+01 -5.5404e+01 -6.0623e+01 -5.8950e+01 -5.3836e+01 -5.5435e+01 -6.0614e+01 -5.8942e+01 -5.3812e+01 -5.5467e+01 -6.0605e+01 -5.8933e+01 -5.3788e+01 -5.5497e+01 -6.0595e+01 -5.8925e+01 -5.3765e+01 -5.5527e+01 -6.0585e+01 -5.8915e+01 -5.3741e+01 -5.5556e+01 -6.0575e+01 -5.8901e+01 -5.3718e+01 -5.5585e+01 -6.0563e+01 -5.8883e+01 -5.3695e+01 -5.5613e+01 -6.0544e+01 -5.8865e+01 -5.3673e+01 -5.5641e+01 -6.0525e+01 -5.8847e+01 -5.3650e+01 -5.5668e+01 -6.0505e+01 -5.8830e+01 -5.3628e+01 -5.5695e+01 -6.0485e+01 -5.8812e+01 -5.3606e+01 -5.5720e+01 -6.0465e+01 -5.8793e+01 -5.3584e+01 -5.5746e+01 -6.0445e+01 -5.8775e+01 -5.3563e+01 -5.5771e+01 -6.0425e+01 -5.8757e+01 -5.3541e+01 -5.5795e+01 -6.0404e+01 -5.8739e+01 -5.3520e+01 -5.5819e+01 -6.0384e+01 -5.8720e+01 -5.3499e+01 -5.5842e+01 -6.0363e+01 -5.8702e+01 -5.3478e+01 -5.5864e+01 -6.0342e+01 -5.8683e+01 -5.3457e+01 -5.5886e+01 -6.0321e+01 -5.8664e+01 -5.3429e+01 -5.5908e+01 -6.0299e+01 -5.8646e+01 -5.3400e+01 -5.5928e+01 -6.0278e+01 -5.8627e+01 -5.3373e+01 -5.5940e+01 -6.0256e+01 -5.8608e+01 -5.3345e+01 -5.5953e+01 -6.0234e+01 -5.8589e+01 -5.3318e+01 -5.5964e+01 -6.0212e+01 -5.8569e+01 -5.3291e+01 -5.5976e+01 -6.0222e+01 -5.8550e+01 -5.3265e+01 -5.5987e+01 -6.0244e+01 -5.8531e+01 -5.3239e+01 -5.5998e+01 -6.0265e+01 -5.8511e+01 -5.3213e+01 -5.6009e+01 -6.0285e+01 -5.8492e+01 -5.3187e+01 -5.6019e+01 -6.0304e+01 -5.8472e+01 -5.3162e+01 -5.6029e+01 -6.0323e+01 -5.8452e+01 -5.3137e+01 -5.6038e+01 -6.0341e+01 -5.8424e+01 -5.3113e+01 -5.6048e+01 -6.0358e+01 -5.8396e+01 -5.3089e+01 -5.6057e+01 -6.0375e+01 -5.8369e+01 -5.3065e+01 -5.6065e+01 -6.0390e+01 -5.8341e+01 -5.3041e+01 -5.6074e+01 -6.0403e+01 -5.8314e+01 -5.3017e+01 -5.6082e+01 -6.0409e+01 -5.8287e+01 -5.2994e+01 -5.6089e+01 -6.0415e+01 -5.8260e+01 -5.2971e+01 -5.6097e+01 -6.0420e+01 -5.8233e+01 -5.2949e+01 -5.6104e+01 -6.0425e+01 -5.8206e+01 -5.2926e+01 -5.6111e+01 -6.0429e+01 -5.8179e+01 -5.2904e+01 -5.6117e+01 -6.0433e+01 -5.8152e+01 -5.2882e+01 -5.6123e+01 -6.0436e+01 -5.8125e+01 -5.2860e+01 -5.6129e+01 -6.0439e+01 -5.8099e+01 -5.2839e+01 -5.6135e+01 -6.0441e+01 -5.8072e+01 -5.2818e+01 -5.6140e+01 -6.0443e+01 -5.8045e+01 -5.2797e+01 -5.6145e+01 -6.0444e+01 -5.8019e+01 -5.2776e+01 -5.6149e+01 -6.0445e+01 -5.7993e+01 -5.2756e+01 -5.6154e+01 -6.0445e+01 -5.7966e+01 -5.2735e+01 -5.6158e+01 -6.0445e+01 -5.7940e+01 -5.2715e+01 -5.6161e+01 -6.0445e+01 -5.7914e+01 -5.2695e+01 -5.6165e+01 -6.0442e+01 -5.7888e+01 -5.2675e+01 -5.6168e+01 -6.0432e+01 -5.7862e+01 -5.2656e+01 -5.6171e+01 -6.0423e+01 -5.7836e+01 -5.2637e+01 -5.6174e+01 -6.0413e+01 -5.7810e+01 -5.2617e+01 -5.6176e+01 -6.0402e+01 -5.7784e+01 -5.2598e+01 -5.6178e+01 -6.0392e+01 -5.7758e+01 -5.2580e+01 -5.6180e+01 -6.0381e+01 -5.7732e+01 -5.2561e+01 -5.6181e+01 -6.0370e+01 -5.7707e+01 -5.2543e+01 -5.6182e+01 -6.0359e+01 -5.7681e+01 -5.2524e+01 -5.6183e+01 -6.0348e+01 -5.7655e+01 -5.2506e+01 -5.6184e+01 -6.0336e+01 -5.7630e+01 -5.2488e+01 -5.6184e+01 -6.0324e+01 -5.7599e+01 -5.2466e+01 -5.6184e+01 -6.0312e+01 -5.7566e+01 -5.2440e+01 -5.6184e+01 -6.0300e+01 -5.7533e+01 -5.2415e+01 -5.6184e+01 -6.0287e+01 -5.7500e+01 -5.2390e+01 -5.6183e+01 -6.0274e+01 -5.7467e+01 -5.2366e+01 -5.6182e+01 -6.0261e+01 -5.7434e+01 -5.2342e+01 -5.6181e+01 -6.0248e+01 -5.7402e+01 -5.2318e+01 -5.6179e+01 -6.0234e+01 -5.7370e+01 -5.2295e+01 -5.6178e+01 -6.0221e+01 -5.7338e+01 -5.2272e+01 -5.6176e+01 -6.0207e+01 -5.7307e+01 -5.2249e+01 -5.6173e+01 -6.0192e+01 -5.7275e+01 -5.2226e+01 -5.6171e+01 -6.0178e+01 -5.7244e+01 -5.2204e+01 -5.6168e+01 -6.0163e+01 -5.7213e+01 -5.2182e+01 -5.6165e+01 -6.0148e+01 -5.7182e+01 -5.2161e+01 -5.6162e+01 -6.0133e+01 -5.7151e+01 -5.2139e+01 -5.6159e+01 -6.0118e+01 -5.7121e+01 -5.2118e+01 -5.6155e+01 -6.0102e+01 -5.7091e+01 -5.2097e+01 -5.6151e+01 -6.0087e+01 -5.7060e+01 -5.2077e+01 -5.6147e+01 -6.0071e+01 -5.7031e+01 -5.2056e+01 -5.6143e+01 -6.0054e+01 -5.7001e+01 -5.2036e+01 -5.6138e+01 -6.0038e+01 -5.6971e+01 -5.2017e+01 -5.6133e+01 -6.0021e+01 -5.6942e+01 -5.1997e+01 -5.6128e+01 -6.0005e+01 -5.6912e+01 -5.1978e+01 -5.6123e+01 -5.9988e+01 -5.6883e+01 -5.1959e+01 -5.6117e+01 -5.9970e+01 -5.6854e+01 -5.1940e+01 -5.6112e+01 -5.9953e+01 -5.6825e+01 -5.1921e+01 -5.6106e+01 -5.9935e+01 -5.6796e+01 -5.1903e+01 -5.6100e+01 -5.9918e+01 -5.6768e+01 -5.1885e+01 -5.6093e+01 -5.9900e+01 -5.6732e+01 -5.1867e+01 -5.6087e+01 -5.9882e+01 -5.6695e+01 -5.1841e+01 -5.6080e+01 -5.9883e+01 -5.6686e+01 -5.1815e+01 -5.6073e+01 -5.9909e+01 -5.6695e+01 -5.1791e+01 -5.6066e+01 -5.9934e+01 -5.6703e+01 -5.1766e+01 -5.6059e+01 -5.9958e+01 -5.6711e+01 -5.1742e+01 -5.6051e+01 -5.9981e+01 -5.6719e+01 -5.1718e+01 -5.6044e+01 -6.0004e+01 -5.6726e+01 -5.1695e+01 -5.6031e+01 -6.0026e+01 -5.6733e+01 -5.1671e+01 -5.6015e+01 -6.0046e+01 -5.6740e+01 -5.1649e+01 -5.5999e+01 -6.0067e+01 -5.6746e+01 -5.1626e+01 -5.5983e+01 -6.0086e+01 -5.6752e+01 -5.1604e+01 -5.5967e+01 -6.0104e+01 -5.6758e+01 -5.1617e+01 -5.5951e+01 -6.0122e+01 -5.6764e+01 -5.1640e+01 -5.5935e+01 -6.0139e+01 -5.6769e+01 -5.1661e+01 -5.5919e+01 -6.0156e+01 -5.6773e+01 -5.1675e+01 -5.5895e+01 -6.0195e+01 -5.6778e+01 -5.1689e+01 -5.5872e+01 -6.0254e+01 -5.6782e+01 -5.1703e+01 -5.5848e+01 -6.0312e+01 -5.6786e+01 -5.1717e+01 -5.5825e+01 -6.0368e+01 -5.6789e+01 -5.1730e+01 -5.5802e+01 -6.0423e+01 -5.6792e+01 -5.1743e+01 -5.5779e+01 -6.0477e+01 -5.6795e+01 -5.1757e+01 -5.5756e+01 -6.0529e+01 -5.6797e+01 -5.1770e+01 -5.5733e+01 -6.0580e+01 -5.6791e+01 -5.1783e+01 -5.5711e+01 -6.0630e+01 -5.6785e+01 -5.1795e+01 -5.5689e+01 -6.0676e+01 -5.6779e+01 -5.1808e+01 -5.5666e+01 -6.0715e+01 -5.6773e+01 -5.1820e+01 -5.5644e+01 -6.0754e+01 -5.6759e+01 -5.1833e+01 -5.5623e+01 -6.0791e+01 -5.6745e+01 -5.1845e+01 -5.5601e+01 -6.0827e+01 -5.6731e+01 -5.1857e+01 -5.5579e+01 -6.0863e+01 -5.6717e+01 -5.1869e+01 -5.5558e+01 -6.0897e+01 -5.6703e+01 -5.1880e+01 -5.5537e+01 -6.0930e+01 -5.6689e+01 -5.1892e+01 -5.5515e+01 -6.0963e+01 -5.6675e+01 -5.1903e+01 -5.5494e+01 -6.0994e+01 -5.6661e+01 -5.1914e+01 -5.5474e+01 -6.1024e+01 -5.6648e+01 -5.1925e+01 -5.5450e+01 -6.1054e+01 -5.6634e+01 -5.1936e+01 -5.5421e+01 -6.1082e+01 -5.6620e+01 -5.1946e+01 -5.5393e+01 -6.1110e+01 -5.6606e+01 -5.1957e+01 -5.5365e+01 -6.1137e+01 -5.6588e+01 -5.1967e+01 -5.5337e+01 -6.1162e+01 -5.6566e+01 -5.1977e+01 -5.5310e+01 -6.1187e+01 -5.6545e+01 -5.1987e+01 -5.5278e+01 -6.1205e+01 -5.6524e+01 -5.1996e+01 -5.5243e+01 -6.1221e+01 -5.6503e+01 -5.2006e+01 -5.5209e+01 -6.1235e+01 -5.6482e+01 -5.2015e+01 -5.5175e+01 -6.1249e+01 -5.6462e+01 -5.2023e+01 -5.5142e+01 -6.1263e+01 -5.6442e+01 -5.2024e+01 -5.5109e+01 -6.1275e+01 -5.6421e+01 -5.2025e+01 -5.5076e+01 -6.1287e+01 -5.6401e+01 -5.2026e+01 -5.5036e+01 -6.1299e+01 -5.6382e+01 -5.2027e+01 -5.4996e+01 -6.1309e+01 -5.6362e+01 -5.2028e+01 -5.4957e+01 -6.1320e+01 -5.6343e+01 -5.2029e+01 -5.4909e+01 -6.1329e+01 -5.6323e+01 -5.2030e+01 -5.4855e+01 -6.1338e+01 -5.6304e+01 -5.2031e+01 -5.4803e+01 -6.1346e+01 -5.6285e+01 -5.2032e+01 -5.4751e+01 -6.1354e+01 -5.6266e+01 -5.2034e+01 -5.4700e+01 -6.1361e+01 -5.6247e+01 -5.2035e+01 -5.4650e+01 -6.1368e+01 -5.6229e+01 -5.2036e+01 -5.4601e+01 -6.1374e+01 -5.6210e+01 -5.2037e+01 -5.4553e+01 -6.1379e+01 -5.6192e+01 -5.2038e+01 -5.4506e+01 -6.1384e+01 -5.6172e+01 -5.2037e+01 -5.4459e+01 -6.1388e+01 -5.6146e+01 -5.2030e+01 -5.4408e+01 -6.1392e+01 -5.6120e+01 -5.2023e+01 -5.4350e+01 -6.1388e+01 -5.6094e+01 -5.2017e+01 -5.4289e+01 -6.1382e+01 -5.6069e+01 -5.2009e+01 -5.4222e+01 -6.1377e+01 -5.6044e+01 -5.2040e+01 -5.4157e+01 -6.1371e+01 -5.6019e+01 -5.2070e+01 -5.4093e+01 -6.1364e+01 -5.5994e+01 -5.2095e+01 -5.4025e+01 -6.1358e+01 -5.5970e+01 -5.2117e+01 -5.3955e+01 -6.1351e+01 -5.5946e+01 -5.2164e+01 -5.3887e+01 -6.1344e+01 -5.5922e+01 -5.2274e+01 -5.3821e+01 -6.1370e+01 -5.5899e+01 -5.2383e+01 -5.3755e+01 -6.1406e+01 -5.5875e+01 -5.2490e+01 -5.3692e+01 -6.1441e+01 -5.5852e+01 -5.2596e+01 -5.3629e+01 -6.1475e+01 -5.5829e+01 -5.2700e+01 -5.3567e+01 -6.1509e+01 -5.5806e+01 -5.2803e+01 -5.3507e+01 -6.1541e+01 -5.5784e+01 -5.2904e+01 -5.3448e+01 -6.1572e+01 -5.5761e+01 -5.3004e+01 -5.3390e+01 -6.1602e+01 -5.5739e+01 -5.3103e+01 -5.3334e+01 -6.1632e+01 -5.5717e+01 -5.3200e+01 -5.3278e+01 -6.1653e+01 -5.5695e+01 -5.3290e+01 -5.3224e+01 -6.1673e+01 -5.5673e+01 -5.3377e+01 -5.3197e+01 -6.1692e+01 -5.5652e+01 -5.3462e+01 -5.3183e+01 -6.1710e+01 -5.5630e+01 -5.3546e+01 -5.3167e+01 -6.1728e+01 -5.5609e+01 -5.3630e+01 -5.3152e+01 -6.1745e+01 -5.5588e+01 -5.3712e+01 -5.3138e+01 -6.1761e+01 -5.5567e+01 -5.3792e+01 -5.3124e+01 -6.1777e+01 -5.5546e+01 -5.3872e+01 -5.3110e+01 -6.1791e+01 -5.5526e+01 -5.3951e+01 -5.3097e+01 -6.1812e+01 -5.5505e+01 -5.4028e+01 -5.3085e+01 -6.1870e+01 -5.5485e+01 -5.4105e+01 -5.3073e+01 -6.1927e+01 -5.5465e+01 -5.4180e+01 -5.3061e+01 -6.1982e+01 -5.5445e+01 -5.4254e+01 -5.3050e+01 -6.2036e+01 -5.5425e+01 -5.4327e+01 -5.3039e+01 -6.2089e+01 -5.5405e+01 -5.4399e+01 -5.3029e+01 -6.2141e+01 -5.5385e+01 -5.4470e+01 -5.3019e+01 -6.2191e+01 -5.5365e+01 -5.4540e+01 -5.3009e+01 -6.2233e+01 -5.5346e+01 -5.4609e+01 -5.3000e+01 -6.2272e+01 -5.5326e+01 -5.4677e+01 -5.2991e+01 -6.2303e+01 -5.5307e+01 -5.4743e+01 -5.2982e+01 -6.2333e+01 -5.5320e+01 -5.4809e+01 -5.2974e+01 -6.2363e+01 -5.5345e+01 -5.4870e+01 -5.2966e+01 -6.2391e+01 -5.5369e+01 -5.4926e+01 -5.2958e+01 -6.2419e+01 -5.5393e+01 -5.4981e+01 -5.2951e+01 -6.2446e+01 -5.5417e+01 -5.5067e+01 -5.2944e+01 -6.2472e+01 -5.5439e+01 -5.5165e+01 -5.2926e+01 -6.2498e+01 -5.5462e+01 -5.5261e+01 -5.2904e+01 -6.2522e+01 -5.5483e+01 -5.5355e+01 -5.2882e+01 -6.2546e+01 -5.5504e+01 -5.5448e+01 -5.2861e+01 -6.2569e+01 -5.5525e+01 -5.5540e+01 -5.2840e+01 -6.2591e+01 -5.5545e+01 -5.5630e+01 -5.2820e+01 -6.2613e+01 -5.5564e+01 -5.5719e+01 -5.2801e+01 -6.2634e+01 -5.5583e+01 -5.5806e+01 -5.2782e+01 -6.2654e+01 -5.5602e+01 -5.5892e+01 -5.2763e+01 -6.2668e+01 -5.5620e+01 -5.5976e+01 -5.2746e+01 -6.2678e+01 -5.5637e+01 -5.6054e+01 -5.2728e+01 -6.2689e+01 -5.5654e+01 -5.6128e+01 -5.2711e+01 -6.2698e+01 -5.5671e+01 -5.6201e+01 -5.2695e+01 -6.2707e+01 -5.5687e+01 -5.6273e+01 -5.2679e+01 -6.2716e+01 -5.5702e+01 -5.6343e+01 -5.2664e+01 -6.2724e+01 -5.5717e+01 -5.6413e+01 -5.2644e+01 -6.2731e+01 -5.5732e+01 -5.6481e+01 -5.2621e+01 -6.2738e+01 -5.5746e+01 -5.6548e+01 -5.2599e+01 -6.2745e+01 -5.5759e+01 -5.6614e+01 -5.2578e+01 -6.2750e+01 -5.5773e+01 -5.6679e+01 -5.2557e+01 -6.2756e+01 -5.5785e+01 -5.6743e+01 -5.2537e+01 -6.2761e+01 -5.5797e+01 -5.6806e+01 -5.2517e+01 -6.2764e+01 -5.5809e+01 -5.6868e+01 -5.2498e+01 -6.2751e+01 -5.5821e+01 -5.6928e+01 -5.2479e+01 -6.2739e+01 -5.5831e+01 -5.6988e+01 -5.2461e+01 -6.2727e+01 -5.5842e+01 -5.7046e+01 -5.2443e+01 -6.2714e+01 -5.5852e+01 -5.7104e+01 -5.2426e+01 -6.2702e+01 -5.5861e+01 -5.7160e+01 -5.2409e+01 -6.2689e+01 -5.5863e+01 -5.7216e+01 -5.2392e+01 -6.2676e+01 -5.5864e+01 -5.7270e+01 -5.2376e+01 -6.2663e+01 -5.5865e+01 -5.7324e+01 -5.2361e+01 -6.2650e+01 -5.5865e+01 -5.7376e+01 -5.2346e+01 -6.2636e+01 -5.5866e+01 -5.7428e+01 -5.2331e+01 -6.2623e+01 -5.5866e+01 -5.7478e+01 -5.2309e+01 -6.2609e+01 -5.5866e+01 -5.7528e+01 -5.2287e+01 -6.2595e+01 -5.5865e+01 -5.7576e+01 -5.2266e+01 -6.2581e+01 -5.5865e+01 -5.7624e+01 -5.2245e+01 -6.2567e+01 -5.5864e+01 -5.7670e+01 -5.2225e+01 -6.2553e+01 -5.5863e+01 -5.7716e+01 -5.2205e+01 -6.2538e+01 -5.5862e+01 -5.7761e+01 -5.2186e+01 -6.2522e+01 -5.5860e+01 -5.7805e+01 -5.2167e+01 -6.2500e+01 -5.5859e+01 -5.7848e+01 -5.2149e+01 -6.2477e+01 -5.5857e+01 -5.7890e+01 -5.2131e+01 -6.2454e+01 -5.5855e+01 -5.7931e+01 -5.2113e+01 -6.2431e+01 -5.5852e+01 -5.7971e+01 -5.2096e+01 -6.2408e+01 -5.5850e+01 -5.8010e+01 -5.2080e+01 -6.2385e+01 -5.5847e+01 -5.8049e+01 -5.2063e+01 -6.2363e+01 -5.5845e+01 -5.8086e+01 -5.2048e+01 -6.2340e+01 -5.5841e+01 -5.8123e+01 -5.2032e+01 -6.2317e+01 -5.5838e+01 -5.8159e+01 -5.2017e+01 -6.2294e+01 -5.5835e+01 -5.8194e+01 -5.2002e+01 -6.2271e+01 -5.5831e+01 -5.8228e+01 -5.1988e+01 -6.2248e+01 -5.5827e+01 -5.8261e+01 -5.1974e+01 -6.2225e+01 -5.5823e+01 -5.8294e+01 -5.1960e+01 -6.2202e+01 -5.5819e+01 -5.8325e+01 -5.1947e+01 -6.2179e+01 -5.5814e+01 -5.8356e+01 -5.1934e+01 -6.2156e+01 -5.5810e+01 -5.8386e+01 -5.1921e+01 -6.2133e+01 -5.5805e+01 -5.8416e+01 -5.1909e+01 -6.2110e+01 -5.5800e+01 -5.8444e+01 -5.1896e+01 -6.2086e+01 -5.5795e+01 -5.8472e+01 -5.1884e+01 -6.2063e+01 -5.5781e+01 -5.8499e+01 -5.1873e+01 -6.2040e+01 -5.5759e+01 -5.8525e+01 -5.1861e+01 -6.2016e+01 -5.5738e+01 -5.8551e+01 -5.1850e+01 -6.1993e+01 -5.5717e+01 -5.8575e+01 -5.1839e+01 -6.1969e+01 -5.5697e+01 -5.8599e+01 -5.1829e+01 -6.1945e+01 -5.5676e+01 -5.8623e+01 -5.1818e+01 -6.1922e+01 -5.5656e+01 -5.8645e+01 -5.1808e+01 -6.1898e+01 -5.5635e+01 -5.8667e+01 -5.1798e+01 -6.1874e+01 -5.5615e+01 -5.8688e+01 -5.1788e+01 -6.1850e+01 -5.5596e+01 -5.8708e+01 -5.1779e+01 -6.1826e+01 -5.5576e+01 -5.8728e+01 -5.1769e+01 -6.1802e+01 -5.5556e+01 -5.8747e+01 -5.1760e+01 -6.1778e+01 -5.5537e+01 -5.8766e+01 -5.1751e+01 -6.1753e+01 -5.5518e+01 -5.8783e+01 -5.1742e+01 -6.1729e+01 -5.5499e+01 -5.8800e+01 -5.1734e+01 -6.1704e+01 -5.5480e+01 -5.8809e+01 -5.1725e+01 -6.1680e+01 -5.5461e+01 -5.8817e+01 -5.1717e+01 -6.1655e+01 -5.5442e+01 -5.8825e+01 -5.1709e+01 -6.1630e+01 -5.5424e+01 -5.8832e+01 -5.1701e+01 -6.1605e+01 -5.5405e+01 -5.8838e+01 -5.1693e+01 -6.1580e+01 -5.5387e+01 -5.8837e+01 -5.1685e+01 -6.1555e+01 -5.5369e+01 -5.8835e+01 -5.1677e+01 -6.1530e+01 -5.5351e+01 -5.8833e+01 -5.1670e+01 -6.1505e+01 -5.5333e+01 -5.8830e+01 -5.1663e+01 -6.1480e+01 -5.5315e+01 -5.8827e+01 -5.1655e+01 -6.1454e+01 -5.5297e+01 -5.8824e+01 -5.1648e+01 -6.1429e+01 -5.5280e+01 -5.8821e+01 -5.1641e+01 -6.1403e+01 -5.5262e+01 -5.8809e+01 -5.1634e+01 -6.1372e+01 -5.5244e+01 -5.8792e+01 -5.1627e+01 -6.1338e+01 -5.5227e+01 -5.8772e+01 -5.1618e+01 -6.1304e+01 -5.5210e+01 -5.8753e+01 -5.1603e+01 -6.1271e+01 -5.5192e+01 -5.8734e+01 -5.1589e+01 -6.1238e+01 -5.5175e+01 -5.8715e+01 -5.1575e+01 -6.1204e+01 -5.5158e+01 -5.8696e+01 -5.1562e+01 -6.1171e+01 -5.5141e+01 -5.8677e+01 -5.1548e+01 -6.1138e+01 -5.5124e+01 -5.8659e+01 -5.1535e+01 -6.1105e+01 -5.5107e+01 -5.8640e+01 -5.1522e+01 -6.1072e+01 -5.5090e+01 -5.8622e+01 -5.1509e+01 -6.1039e+01 -5.5073e+01 -5.8603e+01 -5.1497e+01 -6.1006e+01 -5.5057e+01 -5.8585e+01 -5.1485e+01 -6.0974e+01 -5.5040e+01 -5.8567e+01 -5.1473e+01 -6.0941e+01 -5.5023e+01 -5.8549e+01 -5.1461e+01 -6.0908e+01 -5.5003e+01 -5.8531e+01 -5.1450e+01 -6.0876e+01 -5.4979e+01 -5.8513e+01 -5.1438e+01 -6.0843e+01 -5.4954e+01 -5.8495e+01 -5.1427e+01 -6.0811e+01 -5.4930e+01 -5.8477e+01 -5.1416e+01 -6.0778e+01 -5.4907e+01 -5.8459e+01 -5.1406e+01 -6.0746e+01 -5.4883e+01 -5.8441e+01 -5.1395e+01 -6.0714e+01 -5.4860e+01 -5.8424e+01 -5.1385e+01 -6.0681e+01 -5.4837e+01 -5.8406e+01 -5.1375e+01 -6.0649e+01 -5.4814e+01 -5.8388e+01 -5.1365e+01 -6.0617e+01 -5.4791e+01 -5.8370e+01 -5.1355e+01 -6.0585e+01 -5.4769e+01 -5.8353e+01 -5.1345e+01 -6.0553e+01 -5.4747e+01 -5.8335e+01 -5.1336e+01 -6.0520e+01 -5.4725e+01 -5.8317e+01 -5.1327e+01 -6.0488e+01 -5.4703e+01 -5.8300e+01 -5.1317e+01 -6.0456e+01 -5.4681e+01 -5.8282e+01 -5.1308e+01 -6.0424e+01 -5.4659e+01 -5.8265e+01 -5.1299e+01 -6.0392e+01 -5.4638e+01 -5.8247e+01 -5.1291e+01 -6.0361e+01 -5.4617e+01 -5.8229e+01 -5.1282e+01 -6.0329e+01 -5.4596e+01 -5.8212e+01 -5.1274e+01 -6.0297e+01 -5.4575e+01 -5.8194e+01 -5.1265e+01 -6.0265e+01 -5.4554e+01 -5.8176e+01 -5.1257e+01 -6.0233e+01 -5.4534e+01 -5.8159e+01 -5.1249e+01 -6.0201e+01 -5.4513e+01 -5.8141e+01 -5.1241e+01 -6.0169e+01 -5.4493e+01 -5.8123e+01 -5.1233e+01 -6.0138e+01 -5.4473e+01 -5.8106e+01 -5.1225e+01 -6.0106e+01 -5.4453e+01 -5.8088e+01 -5.1217e+01 -6.0074e+01 -5.4433e+01 -5.8070e+01 -5.1210e+01 -6.0043e+01 -5.4414e+01 -5.8052e+01 -5.1202e+01 -6.0011e+01 -5.4394e+01 -5.8034e+01 -5.1195e+01 -5.9979e+01 -5.4375e+01 -5.8016e+01 -5.1188e+01 -5.9948e+01 -5.4355e+01 -5.7995e+01 -5.1180e+01 -5.9916e+01 -5.4336e+01 -5.7969e+01 -5.1173e+01 -5.9884e+01 -5.4317e+01 -5.7944e+01 -5.1166e+01 -5.9853e+01 -5.4298e+01 -5.7918e+01 -5.1159e+01 -5.9821e+01 -5.4274e+01 -5.7893e+01 -5.1152e+01 -5.9790e+01 -5.4247e+01 -5.7867e+01 -5.1146e+01 -5.9758e+01 -5.4221e+01 -5.7870e+01 -5.1139e+01 -5.9727e+01 -5.4192e+01 -5.7889e+01 -5.1132e+01 -5.9695e+01 -5.4159e+01 -5.7908e+01 -5.1126e+01 -5.9664e+01 -5.4125e+01 -5.7926e+01 -5.1119e+01 -5.9632e+01 -5.4093e+01 -5.7944e+01 -5.1113e+01 -5.9601e+01 -5.4061e+01 -5.7961e+01 -5.1106e+01 -5.9569e+01 -5.4029e+01 -5.7978e+01 -5.1100e+01 -5.9538e+01 -5.3997e+01 -5.7994e+01 -5.1094e+01 -5.9506e+01 -5.3966e+01 -5.8009e+01 -5.1087e+01 -5.9475e+01 -5.3936e+01 -5.8025e+01 -5.1081e+01 -5.9443e+01 -5.3906e+01 -5.8039e+01 -5.1075e+01 -5.9412e+01 -5.3876e+01 -5.8053e+01 -5.1069e+01 -5.9381e+01 -5.3847e+01 -5.8067e+01 -5.1063e+01 -5.9349e+01 -5.3818e+01 -5.8080e+01 -5.1057e+01 -5.9318e+01 -5.3790e+01 -5.8093e+01 -5.1051e+01 -5.9287e+01 -5.3761e+01 -5.8105e+01 -5.1045e+01 -5.9255e+01 -5.3734e+01 -5.8116e+01 -5.1039e+01 -5.9224e+01 -5.3706e+01 -5.8127e+01 -5.1034e+01 -5.9193e+01 -5.3679e+01 -5.8138e+01 -5.1028e+01 -5.9161e+01 -5.3652e+01 -5.8148e+01 -5.1022e+01 -5.9130e+01 -5.3626e+01 -5.8158e+01 -5.1017e+01 -5.9099e+01 -5.3600e+01 -5.8167e+01 -5.1011e+01 -5.9068e+01 -5.3574e+01 -5.8176e+01 -5.1005e+01 -5.9029e+01 -5.3549e+01 -5.8184e+01 -5.1000e+01 -5.8990e+01 -5.3524e+01 -5.8192e+01 -5.0994e+01 -5.8951e+01 -5.3499e+01 -5.8200e+01 -5.0989e+01 -5.8913e+01 -5.3474e+01 -5.8207e+01 -5.0983e+01 -5.8875e+01 -5.3450e+01 -5.8213e+01 -5.0978e+01 -5.8836e+01 -5.3426e+01 -5.8219e+01 -5.0973e+01 -5.8798e+01 -5.3403e+01 -5.8225e+01 -5.0967e+01 -5.8761e+01 -5.3379e+01 -5.8230e+01 -5.0962e+01 -5.8723e+01 -5.3356e+01 -5.8235e+01 -5.0956e+01 -5.8685e+01 -5.3333e+01 -5.8240e+01 -5.0951e+01 -5.8648e+01 -5.3311e+01 -5.8244e+01 -5.0946e+01 -5.8611e+01 -5.3288e+01 -5.8247e+01 -5.0941e+01 -5.8574e+01 -5.3266e+01 -5.8250e+01 -5.0935e+01 -5.8538e+01 -5.3244e+01 -5.8253e+01 -5.0930e+01 -5.8501e+01 -5.3223e+01 -5.8255e+01 -5.0925e+01 -5.8483e+01 -5.3201e+01 -5.8257e+01 -5.0920e+01 -5.8491e+01 -5.3180e+01 -5.8259e+01 -5.0915e+01 -5.8499e+01 -5.3159e+01 -5.8260e+01 -5.0910e+01 -5.8506e+01 -5.3138e+01 -5.8261e+01 -5.0904e+01 -5.8513e+01 -5.3118e+01 -5.8261e+01 -5.0899e+01 -5.8519e+01 -5.3097e+01 -5.8261e+01 -5.0894e+01 -5.8525e+01 -5.3077e+01 -5.8261e+01 -5.0889e+01 -5.8530e+01 -5.3057e+01 -5.8260e+01 -5.0884e+01 -5.8535e+01 -5.3038e+01 -5.8259e+01 -5.0879e+01 -5.8539e+01 -5.3018e+01 -5.8258e+01 -5.0873e+01 -5.8543e+01 -5.2999e+01 -5.8256e+01 -5.0860e+01 -5.8546e+01 -5.2979e+01 -5.8254e+01 -5.0848e+01 -5.8549e+01 -5.2960e+01 -5.8251e+01 -5.0835e+01 -5.8552e+01 -5.2940e+01 -5.8248e+01 -5.0823e+01 -5.8554e+01 -5.2914e+01 -5.8245e+01 -5.0810e+01 -5.8581e+01 -5.2888e+01 -5.8241e+01 -5.0798e+01 -5.8626e+01 -5.2862e+01 -5.8237e+01 -5.0787e+01 -5.8671e+01 -5.2836e+01 -5.8233e+01 -5.0775e+01 -5.8714e+01 -5.2811e+01 -5.8229e+01 -5.0764e+01 -5.8757e+01 -5.2786e+01 -5.8224e+01 -5.0745e+01 -5.8798e+01 -5.2762e+01 -5.8219e+01 -5.0726e+01 -5.8838e+01 -5.2737e+01 -5.8213e+01 -5.0708e+01 -5.8877e+01 -5.2714e+01 -5.8207e+01 -5.0689e+01 -5.8915e+01 -5.2690e+01 -5.8201e+01 -5.0671e+01 -5.8953e+01 -5.2664e+01 -5.8195e+01 -5.0654e+01 -5.8989e+01 -5.2633e+01 -5.8174e+01 -5.0637e+01 -5.9024e+01 -5.2603e+01 -5.8151e+01 -5.0620e+01 -5.9058e+01 -5.2573e+01 -5.8129e+01 -5.0603e+01 -5.9092e+01 -5.2544e+01 -5.8106e+01 -5.0587e+01 -5.9124e+01 -5.2515e+01 -5.8084e+01 -5.0571e+01 -5.9155e+01 -5.2486e+01 -5.8061e+01 -5.0556e+01 -5.9186e+01 -5.2458e+01 -5.8039e+01 -5.0540e+01 -5.9216e+01 -5.2430e+01 -5.8017e+01 -5.0525e+01 -5.9244e+01 -5.2403e+01 -5.7995e+01 -5.0510e+01 -5.9272e+01 -5.2376e+01 -5.7973e+01 -5.0496e+01 -5.9299e+01 -5.2350e+01 -5.7950e+01 -5.0482e+01 -5.9325e+01 -5.2324e+01 -5.7929e+01 -5.0468e+01 -5.9350e+01 -5.2298e+01 -5.7907e+01 -5.0454e+01 -5.9375e+01 -5.2273e+01 -5.7885e+01 -5.0440e+01 -5.9398e+01 -5.2248e+01 -5.7863e+01 -5.0427e+01 -5.9421e+01 -5.2224e+01 -5.7841e+01 -5.0414e+01 -5.9443e+01 -5.2199e+01 -5.7820e+01 -5.0401e+01 -5.9459e+01 -5.2176e+01 -5.7798e+01 -5.0389e+01 -5.9472e+01 -5.2152e+01 -5.7776e+01 -5.0369e+01 -5.9484e+01 -5.2129e+01 -5.7755e+01 -5.0349e+01 -5.9495e+01 -5.2106e+01 -5.7733e+01 -5.0330e+01 -5.9506e+01 -5.2084e+01 -5.7712e+01 -5.0310e+01 -5.9516e+01 -5.2062e+01 -5.7690e+01 -5.0292e+01 -5.9525e+01 -5.2040e+01 -5.7669e+01 -5.0273e+01 -5.9526e+01 -5.2018e+01 -5.7647e+01 -5.0256e+01 -5.9527e+01 -5.1997e+01 -5.7626e+01 -5.0238e+01 -5.9527e+01 -5.1976e+01 -5.7604e+01 -5.0221e+01 -5.9527e+01 -5.1956e+01 -5.7583e+01 -5.0204e+01 -5.9527e+01 -5.1935e+01 -5.7562e+01 -5.0187e+01 -5.9526e+01 -5.1915e+01 -5.7540e+01 -5.0171e+01 -5.9525e+01 -5.1896e+01 -5.7519e+01 -5.0155e+01 -5.9524e+01 -5.1876e+01 -5.7498e+01 -5.0140e+01 -5.9522e+01 -5.1856e+01 -5.7476e+01 -5.0125e+01 -5.9520e+01 -5.1834e+01 -5.7455e+01 -5.0110e+01 -5.9517e+01 -5.1852e+01 -5.7434e+01 -5.0095e+01 -5.9514e+01 -5.1870e+01 -5.7412e+01 -5.0081e+01 -5.9511e+01 -5.1887e+01 -5.7391e+01 -5.0067e+01 -5.9508e+01 -5.1905e+01 -5.7370e+01 -5.0053e+01 -5.9504e+01 -5.1922e+01 -5.7349e+01 -5.0040e+01 -5.9500e+01 -5.1939e+01 -5.7327e+01 -5.0027e+01 -5.9496e+01 -5.1955e+01 -5.7306e+01 -5.0014e+01 -5.9491e+01 -5.1972e+01 -5.7285e+01 -5.0001e+01 -5.9486e+01 -5.1988e+01 -5.7264e+01 -1.0000e+01 -5.9480e+01 -5.2004e+01 -5.7242e+01 -6.0000e+01 -5.9475e+01 -5.2020e+01 -5.7221e+01 -6.0000e+01 -5.9469e+01 -5.2035e+01 -5.7200e+01 -6.0000e+01 -5.9462e+01 -5.2051e+01 -5.7179e+01 -6.0000e+01 -5.9456e+01 -5.2066e+01 -5.7157e+01 -6.0000e+01 -5.9449e+01 -5.2081e+01 -5.7136e+01 -6.0000e+01 -5.9441e+01 -5.2095e+01 -5.7115e+01 -6.0000e+01 -5.9434e+01 -5.2110e+01 -5.7093e+01 -6.0000e+01 -5.9426e+01 -5.2124e+01 -5.7072e+01 -6.0000e+01 -5.9418e+01 -5.2138e+01 -5.7051e+01 -6.0000e+01 -5.9411e+01 -5.2151e+01 -5.7029e+01 -6.0000e+01 -5.9447e+01 -5.2165e+01 -5.7008e+01 -6.0000e+01 -5.9482e+01 -5.2178e+01 -5.6987e+01 -6.0000e+01 -5.9516e+01 -5.2191e+01 -5.6966e+01 -6.0000e+01 -5.9549e+01 -5.2203e+01 -5.6944e+01 -6.0000e+01 -5.9581e+01 -5.2216e+01 -5.6923e+01 -6.0000e+01 -5.9613e+01 -5.2226e+01 -5.6902e+01 -6.0000e+01 -5.9643e+01 -5.2230e+01 -5.6880e+01 -6.0000e+01 -5.9672e+01 -5.2234e+01 -5.6858e+01 -6.0000e+01 -5.9701e+01 -5.2238e+01 -5.6829e+01 -6.0000e+01 -5.9729e+01 -5.2242e+01 -5.6800e+01 -6.0000e+01 -5.9756e+01 -5.2246e+01 -5.6771e+01 -6.0000e+01 -5.9782e+01 -5.2250e+01 -5.6742e+01 -6.0000e+01 -5.9807e+01 -5.2254e+01 -5.6713e+01 -6.0000e+01 -5.9831e+01 -5.2258e+01 -5.6685e+01 -6.0000e+01 -5.9855e+01 -5.2261e+01 -5.6657e+01 -6.0000e+01 -5.9877e+01 -5.2265e+01 -5.6622e+01 -6.0000e+01 -5.9899e+01 -5.2269e+01 -5.6586e+01 -6.0000e+01 -5.9920e+01 -5.2272e+01 -5.6551e+01 -6.0000e+01 -5.9941e+01 -5.2279e+01 -5.6516e+01 -6.0000e+01 -5.9960e+01 -5.2327e+01 -5.6481e+01 -6.0000e+01 -5.9979e+01 -5.2375e+01 -5.6446e+01 -6.0000e+01 -5.9997e+01 -5.2421e+01 -5.6412e+01 -6.0000e+01 -6.0014e+01 -5.2467e+01 -5.6379e+01 -6.0000e+01 -6.0031e+01 -5.2512e+01 -5.6345e+01 -6.0000e+01 -6.0040e+01 -5.2550e+01 -5.6312e+01 -6.0000e+01 -6.0047e+01 -5.2586e+01 -5.6279e+01 -6.0000e+01 -6.0054e+01 -5.2621e+01 -5.6247e+01 -6.0000e+01 -6.0060e+01 -5.2656e+01 -5.6214e+01 -6.0000e+01 -6.0066e+01 -5.2690e+01 -5.6182e+01 -6.0000e+01 -6.0071e+01 -5.2724e+01 -5.6150e+01 -6.0000e+01 -6.0076e+01 -5.2757e+01 -5.6119e+01 -6.0000e+01 -6.0080e+01 -5.2790e+01 -5.6088e+01 -6.0000e+01 -6.0084e+01 -5.2823e+01 -5.6057e+01 -6.0000e+01 -6.0087e+01 -5.2854e+01 -5.6026e+01 -6.0000e+01 -6.0090e+01 -5.2886e+01 -5.5996e+01 -6.0000e+01 -6.0092e+01 -5.2917e+01 -5.5966e+01 -6.0000e+01 -6.0094e+01 -5.2947e+01 -5.5936e+01 -6.0000e+01 -6.0096e+01 -5.2977e+01 -5.5906e+01 -6.0000e+01 -6.0096e+01 -5.3006e+01 -5.5876e+01 -5.9949e+01 -6.0097e+01 -5.3029e+01 -5.5847e+01 -5.9892e+01 -6.0097e+01 -5.3050e+01 -5.5818e+01 -5.9836e+01 -6.0096e+01 -5.3070e+01 -5.5789e+01 -5.9781e+01 -6.0095e+01 -5.3087e+01 -5.5761e+01 -5.9726e+01 -6.0094e+01 -5.3099e+01 -5.5732e+01 -5.9671e+01 -6.0092e+01 -5.3110e+01 -5.5704e+01 -5.9616e+01 -6.0090e+01 -5.3122e+01 -5.5676e+01 -5.9562e+01 -6.0087e+01 -5.3134e+01 -5.5648e+01 -5.9508e+01 -6.0077e+01 -5.3145e+01 -5.5621e+01 -5.9454e+01 -6.0065e+01 -5.3157e+01 -5.5593e+01 -5.9401e+01 -6.0054e+01 -5.3168e+01 -5.5566e+01 -5.9348e+01 -6.0042e+01 -5.3179e+01 -5.5539e+01 -5.9295e+01 -6.0030e+01 -5.3190e+01 -5.5511e+01 -5.9243e+01 -6.0018e+01 -5.3201e+01 -5.5476e+01 -5.9191e+01 -6.0006e+01 -5.3212e+01 -5.5442e+01 -5.9139e+01 -5.9993e+01 -5.3223e+01 -5.5408e+01 -5.9087e+01 -5.9976e+01 -5.3233e+01 -5.5375e+01 -5.9036e+01 -5.9955e+01 -5.3244e+01 -5.5341e+01 -5.8985e+01 -5.9934e+01 -5.3254e+01 -5.5308e+01 -5.8935e+01 -5.9913e+01 -5.3261e+01 -5.5276e+01 -5.8884e+01 -5.9892e+01 -5.3263e+01 -5.5244e+01 -5.8834e+01 -5.9871e+01 -5.3265e+01 -5.5212e+01 -5.8784e+01 -5.9850e+01 -5.3268e+01 -5.5180e+01 -5.8735e+01 -5.9829e+01 -5.3270e+01 -5.5145e+01 -5.8686e+01 -5.9808e+01 -5.3272e+01 -5.5106e+01 -5.8637e+01 -5.9787e+01 -5.3274e+01 -5.5067e+01 -5.8588e+01 -5.9766e+01 -5.3277e+01 -5.5029e+01 -5.8540e+01 -5.9745e+01 -5.3279e+01 -5.4992e+01 -5.8492e+01 -5.9724e+01 -5.3281e+01 -5.4955e+01 -5.8444e+01 -5.9702e+01 -5.3283e+01 -5.4918e+01 -5.8396e+01 -5.9681e+01 -5.3286e+01 -5.4882e+01 -5.8346e+01 -5.9660e+01 -5.3288e+01 -5.4847e+01 -5.8291e+01 -5.9639e+01 -5.3285e+01 -5.4812e+01 -5.8236e+01 -5.9617e+01 -5.3279e+01 -5.4777e+01 -5.8182e+01 -5.9596e+01 -5.3274e+01 -5.4742e+01 -5.8129e+01 -5.9574e+01 -5.3269e+01 -5.4708e+01 -5.8076e+01 -5.9553e+01 -5.3264e+01 -5.4675e+01 -5.8023e+01 -5.9531e+01 -5.3252e+01 -5.4642e+01 -5.7970e+01 -5.9509e+01 -5.3239e+01 -5.4609e+01 -5.7919e+01 -5.9488e+01 -5.3227e+01 -5.4577e+01 -5.7867e+01 -5.9466e+01 -5.3215e+01 -5.4545e+01 -5.7816e+01 -5.9444e+01 -5.3203e+01 -5.4513e+01 -5.7765e+01 -5.9422e+01 -5.3192e+01 -5.4482e+01 -5.7715e+01 -5.9400e+01 -5.3181e+01 -5.4451e+01 -5.7665e+01 -5.9378e+01 -5.3170e+01 -5.4420e+01 -5.7616e+01 -5.9356e+01 -5.3159e+01 -5.4390e+01 -5.7567e+01 -5.9334e+01 -5.3149e+01 -5.4360e+01 -5.7518e+01 -5.9312e+01 -5.3139e+01 -5.4330e+01 -5.7470e+01 -5.9289e+01 -5.3129e+01 -5.4301e+01 -5.7422e+01 -5.9267e+01 -5.3120e+01 -5.4272e+01 -5.7374e+01 -5.9245e+01 -5.3110e+01 -5.4243e+01 -5.7327e+01 -5.9222e+01 -5.3101e+01 -5.4214e+01 -5.7280e+01 -5.9200e+01 -5.3092e+01 -5.4186e+01 -5.7234e+01 -5.9177e+01 -5.3083e+01 -5.4158e+01 -5.7188e+01 -5.9155e+01 -5.3075e+01 -5.4131e+01 -5.7142e+01 -5.9132e+01 -5.3066e+01 -5.4104e+01 -5.7096e+01 -5.9109e+01 -5.3058e+01 -5.4077e+01 -5.7051e+01 -5.9086e+01 -5.3050e+01 -5.4050e+01 -5.7006e+01 -5.9064e+01 -5.3042e+01 -5.4023e+01 -5.6962e+01 -5.9041e+01 -5.3034e+01 -5.3997e+01 -5.6918e+01 -5.9018e+01 -5.3027e+01 -5.3971e+01 -5.6874e+01 -5.8995e+01 -5.3019e+01 -5.3945e+01 -5.6830e+01 -5.8971e+01 -5.3012e+01 -5.3920e+01 -5.6787e+01 -5.8948e+01 -5.3005e+01 -5.3894e+01 -5.6744e+01 -5.8925e+01 -5.2998e+01 -5.3869e+01 -5.6702e+01 -5.8902e+01 -5.2991e+01 -5.3845e+01 -5.6660e+01 -5.8878e+01 -5.2984e+01 -5.3820e+01 -5.6618e+01 -5.8855e+01 -5.2976e+01 -5.3795e+01 -5.6576e+01 -5.8831e+01 -5.2962e+01 -5.3760e+01 -5.6535e+01 -5.8808e+01 -5.2948e+01 -5.3720e+01 -5.6494e+01 -5.8784e+01 -5.2934e+01 -5.3681e+01 -5.6453e+01 -5.8760e+01 -5.2920e+01 -5.3644e+01 -5.6412e+01 -5.8737e+01 -5.2906e+01 -5.3651e+01 -5.6372e+01 -5.8713e+01 -5.2893e+01 -5.3657e+01 -5.6332e+01 -5.8689e+01 -5.2880e+01 -5.3664e+01 -5.6292e+01 -5.8665e+01 -5.2867e+01 -5.3669e+01 -5.6253e+01 -5.8641e+01 -5.2855e+01 -5.3667e+01 -5.6214e+01 -5.8617e+01 -5.2842e+01 -5.3666e+01 -5.6175e+01 -5.8593e+01 -5.2830e+01 -5.3664e+01 -5.6136e+01 -5.8569e+01 -5.2819e+01 -5.3663e+01 -5.6098e+01 -5.8538e+01 -5.2807e+01 -5.3655e+01 -5.6060e+01 -5.8506e+01 -5.2795e+01 -5.3645e+01 -5.6022e+01 -5.8474e+01 -5.2784e+01 -5.3637e+01 -5.5984e+01 -5.8442e+01 -5.2773e+01 -5.3628e+01 -5.5947e+01 -5.8410e+01 -5.2762e+01 -5.3620e+01 -5.5910e+01 -5.8379e+01 -5.2751e+01 -5.3601e+01 -5.5873e+01 -5.8348e+01 -5.2741e+01 -5.3578e+01 -5.5836e+01 -5.8316e+01 -5.2730e+01 -5.3555e+01 -5.5800e+01 -5.8285e+01 -5.2720e+01 -5.3532e+01 -5.5764e+01 -5.8254e+01 -5.2710e+01 -5.3510e+01 -5.5728e+01 -5.8223e+01 -5.2700e+01 -5.3481e+01 -5.5691e+01 -5.8193e+01 -5.2690e+01 -5.3452e+01 -5.5647e+01 -5.8162e+01 -5.2681e+01 -5.3424e+01 -5.5604e+01 -5.8132e+01 -5.2671e+01 -5.3397e+01 -5.5562e+01 -5.8101e+01 -5.2662e+01 -5.3370e+01 -5.5520e+01 -5.8071e+01 -5.2652e+01 -5.3344e+01 -5.5478e+01 -5.8041e+01 -5.2643e+01 -5.3319e+01 -5.5429e+01 -5.8011e+01 -5.2634e+01 -5.3294e+01 -5.5380e+01 -5.7981e+01 -5.2625e+01 -5.3270e+01 -5.5332e+01 -5.7951e+01 -5.2616e+01 -5.3246e+01 -5.5284e+01 -5.7921e+01 -5.2608e+01 -5.3223e+01 -5.5237e+01 -5.7891e+01 -5.2599e+01 -5.3200e+01 -5.5191e+01 -5.7862e+01 -5.2590e+01 -5.3178e+01 -5.5145e+01 -5.7874e+01 -5.2580e+01 -5.3150e+01 -5.5099e+01 -5.7889e+01 -5.2564e+01 -5.3121e+01 -5.5055e+01 -5.7900e+01 -5.2548e+01 -5.3093e+01 -5.5010e+01 -5.7905e+01 -5.2532e+01 -5.3064e+01 -5.4966e+01 -5.7951e+01 -5.2557e+01 -5.3029e+01 -5.4923e+01 -5.8000e+01 -5.2585e+01 -5.2996e+01 -5.4880e+01 -5.8048e+01 -5.2614e+01 -5.2962e+01 -5.4838e+01 -5.8094e+01 -5.2642e+01 -5.2930e+01 -5.4796e+01 -5.8140e+01 -5.2669e+01 -5.2899e+01 -5.4755e+01 -5.8185e+01 -5.2689e+01 -5.2868e+01 -5.4714e+01 -5.8229e+01 -5.2708e+01 -5.2838e+01 -5.4673e+01 -5.8272e+01 -5.2727e+01 -5.2808e+01 -5.4633e+01 -5.8314e+01 -5.2745e+01 -5.2780e+01 -5.4591e+01 -5.8355e+01 -5.2764e+01 -5.2749e+01 -5.4540e+01 -5.8395e+01 -5.2782e+01 -5.2714e+01 -5.4486e+01 -5.8455e+01 -5.2799e+01 -5.2680e+01 -5.4432e+01 -5.8537e+01 -5.2817e+01 -5.2646e+01 -5.4379e+01 -5.8618e+01 -5.2842e+01 -5.2613e+01 -5.4327e+01 -5.8698e+01 -5.2904e+01 -5.2581e+01 -5.4276e+01 -5.8775e+01 -5.2965e+01 -5.2550e+01 -5.4226e+01 -5.8852e+01 -5.3025e+01 -5.2519e+01 -5.4176e+01 -5.8927e+01 -5.3079e+01 -5.2490e+01 -5.4127e+01 -5.9000e+01 -5.3129e+01 -5.2460e+01 -5.4079e+01 -5.9072e+01 -5.3179e+01 -5.2432e+01 -5.4031e+01 -5.9142e+01 -5.3228e+01 -5.2404e+01 -5.3984e+01 -5.9211e+01 -5.3271e+01 -5.2377e+01 -5.3938e+01 -5.9279e+01 -5.3303e+01 -5.2351e+01 -5.3892e+01 -5.9345e+01 -5.3335e+01 -5.2325e+01 -5.3844e+01 -5.9410e+01 -5.3366e+01 -5.2300e+01 -5.3824e+01 -5.9473e+01 -5.3397e+01 -5.2272e+01 -5.3816e+01 -5.9535e+01 -5.3427e+01 -5.2240e+01 -5.3809e+01 -5.9596e+01 -5.3457e+01 -5.2209e+01 -5.3802e+01 -5.9655e+01 -5.3487e+01 -5.2178e+01 -5.3788e+01 -5.9713e+01 -5.3517e+01 -5.2148e+01 -5.3774e+01 -5.9770e+01 -5.3546e+01 -5.2119e+01 -5.3759e+01 -5.9818e+01 -5.3575e+01 -5.2091e+01 -5.3746e+01 -5.9864e+01 -5.3604e+01 -5.2063e+01 -5.3732e+01 -5.9910e+01 -5.3632e+01 -5.2036e+01 -5.3719e+01 -5.9954e+01 -5.3660e+01 -5.2010e+01 -5.3706e+01 -5.9997e+01 -5.3688e+01 -5.1984e+01 -5.3693e+01 -6.0039e+01 -5.3716e+01 -5.1954e+01 -5.3680e+01 -6.0080e+01 -5.3743e+01 -5.1921e+01 -5.3668e+01 -6.0120e+01 -5.3769e+01 -5.1889e+01 -5.3656e+01 -6.0159e+01 -5.3796e+01 -5.1858e+01 -5.3644e+01 -6.0197e+01 -5.3822e+01 -5.1828e+01 -5.3633e+01 -6.0234e+01 -5.3848e+01 -5.1799e+01 -5.3621e+01 -6.0270e+01 -5.3873e+01 -5.1770e+01 -5.3610e+01 -6.0305e+01 -5.3898e+01 -5.1742e+01 -5.3599e+01 -6.0339e+01 -5.3921e+01 -5.1714e+01 -5.3588e+01 -6.0373e+01 -5.3938e+01 -5.1682e+01 -5.3578e+01 -6.0405e+01 -5.3954e+01 -5.1648e+01 -5.3560e+01 -6.0436e+01 -5.3970e+01 -5.1615e+01 -5.3542e+01 -6.0467e+01 -5.3986e+01 -5.1582e+01 -5.3524e+01 -6.0496e+01 -5.4002e+01 -5.1546e+01 -5.3507e+01 -6.0525e+01 -5.4017e+01 -5.1507e+01 -5.3489e+01 -6.0552e+01 -5.4033e+01 -5.1469e+01 -5.3473e+01 -6.0579e+01 -5.4048e+01 -5.1432e+01 -5.3456e+01 -6.0605e+01 -5.4063e+01 -5.1396e+01 -5.3440e+01 -6.0630e+01 -5.4078e+01 -5.1361e+01 -5.3424e+01 -6.0655e+01 -5.4093e+01 -5.1327e+01 -5.3445e+01 -6.0678e+01 -5.4107e+01 -5.1293e+01 -5.3466e+01 -6.0701e+01 -5.4122e+01 -5.1254e+01 -5.3487e+01 -6.0723e+01 -5.4132e+01 -5.1214e+01 -5.3507e+01 -6.0744e+01 -5.4138e+01 -5.1175e+01 -5.3528e+01 -6.0764e+01 -5.4144e+01 -5.1137e+01 -5.3548e+01 -6.0783e+01 -5.4150e+01 -5.1101e+01 -5.3568e+01 -6.0802e+01 -5.4156e+01 -5.1064e+01 -5.3587e+01 -6.0820e+01 -5.4162e+01 -5.1029e+01 -5.3607e+01 -6.0837e+01 -5.4168e+01 -5.0995e+01 -5.3626e+01 -6.0847e+01 -5.4173e+01 -5.0962e+01 -5.3645e+01 -6.0855e+01 -5.4179e+01 -5.0929e+01 -5.3664e+01 -6.0862e+01 -5.4185e+01 -5.0897e+01 -5.3682e+01 -6.0868e+01 -5.4191e+01 -5.0866e+01 -5.3698e+01 -6.0875e+01 -5.4196e+01 -5.0836e+01 -5.3708e+01 -6.0880e+01 -5.4202e+01 -5.0806e+01 -5.3718e+01 -6.0885e+01 -5.4207e+01 -5.0778e+01 -5.3728e+01 -6.0890e+01 -5.4212e+01 -5.0750e+01 -5.3738e+01 -6.0894e+01 -5.4209e+01 -5.0722e+01 -5.3748e+01 -6.0897e+01 -5.4206e+01 -5.0696e+01 -5.3758e+01 -6.0900e+01 -5.4196e+01 -5.0670e+01 -5.3767e+01 -6.0902e+01 -5.4186e+01 -5.0644e+01 -5.3777e+01 -6.0896e+01 -5.4221e+01 -5.0620e+01 -5.3787e+01 -6.0890e+01 -5.4255e+01 -5.0596e+01 -5.3796e+01 -6.0883e+01 -5.4289e+01 -5.0572e+01 -5.3806e+01 -6.0877e+01 -5.4323e+01 -5.0549e+01 -5.3815e+01 -6.0869e+01 -5.4356e+01 -5.0527e+01 -5.3824e+01 -6.0862e+01 -5.4389e+01 -5.0505e+01 -5.3833e+01 -6.0854e+01 -5.4421e+01 -5.0484e+01 -5.3842e+01 -6.0846e+01 -5.4453e+01 -5.0463e+01 -5.3851e+01 -6.0838e+01 -5.4477e+01 -5.0443e+01 -5.3860e+01 -6.0829e+01 -5.4500e+01 -5.0423e+01 -5.3868e+01 -6.0820e+01 -5.4523e+01 -5.0404e+01 -5.3877e+01 -6.0811e+01 -5.4546e+01 -5.0386e+01 -5.3885e+01 -6.0802e+01 -5.4569e+01 -5.0368e+01 -5.3893e+01 -6.0792e+01 -5.4591e+01 -5.0350e+01 -5.3901e+01 -6.0782e+01 -5.4613e+01 -5.0333e+01 -5.3909e+01 -6.0772e+01 -5.4635e+01 -5.0316e+01 -5.3917e+01 -6.0761e+01 -5.4657e+01 -5.0300e+01 -5.3925e+01 -6.0750e+01 -5.4678e+01 -5.0284e+01 -5.3932e+01 -6.0739e+01 -5.4699e+01 -5.0268e+01 -5.3939e+01 -6.0728e+01 -5.4720e+01 -5.0253e+01 -5.3947e+01 -6.0716e+01 -5.4741e+01 -5.0238e+01 -5.3954e+01 -6.0704e+01 -5.4761e+01 -5.0224e+01 -5.3960e+01 -6.0692e+01 -5.4781e+01 -5.0210e+01 -5.3967e+01 -6.0679e+01 -5.4801e+01 -5.0196e+01 -5.3974e+01 -6.0667e+01 -5.4820e+01 -5.0183e+01 -5.3980e+01 -6.0654e+01 -5.4839e+01 -5.0170e+01 -5.3986e+01 -6.0640e+01 -5.4858e+01 -5.0157e+01 -5.3992e+01 -6.0627e+01 -5.4877e+01 -5.0145e+01 -5.3998e+01 -6.0613e+01 -5.4895e+01 -5.0133e+01 -5.4004e+01 -6.0599e+01 -5.4913e+01 -5.0122e+01 -5.4009e+01 -6.0585e+01 -5.4931e+01 -5.0110e+01 -5.4015e+01 -6.0570e+01 -5.4948e+01 -5.0099e+01 -5.4020e+01 -6.0547e+01 -5.4966e+01 -5.0089e+01 -5.4019e+01 -6.0524e+01 -5.4982e+01 -5.0078e+01 -5.4016e+01 -6.0501e+01 -5.4999e+01 -5.0068e+01 -5.4013e+01 -6.0471e+01 -5.5015e+01 -5.0058e+01 -5.4010e+01 -6.0440e+01 -5.5031e+01 -5.0043e+01 -5.4007e+01 -6.0409e+01 -5.5047e+01 -5.0066e+01 -5.4004e+01 -6.0379e+01 -5.5062e+01 -5.0093e+01 -5.4001e+01 -6.0348e+01 -5.5077e+01 -5.0120e+01 -5.3998e+01 -6.0318e+01 -5.5092e+01 -5.0143e+01 -5.3995e+01 -6.0288e+01 -5.5106e+01 -5.0162e+01 -5.3992e+01 -6.0258e+01 -5.5128e+01 -5.0181e+01 -5.3989e+01 -6.0228e+01 -5.5187e+01 -5.0199e+01 -5.3986e+01 -6.0198e+01 -5.5244e+01 -5.0218e+01 -5.3983e+01 -6.0169e+01 -5.5298e+01 -5.0236e+01 -5.3980e+01 -6.0139e+01 -5.5346e+01 -5.0250e+01 -5.3977e+01 -6.0110e+01 -5.5393e+01 -5.0261e+01 -5.3974e+01 -6.0080e+01 -5.5438e+01 -5.0271e+01 -5.3971e+01 -6.0051e+01 -5.5484e+01 -5.0282e+01 -5.3968e+01 -6.0022e+01 -5.5528e+01 -5.0293e+01 -5.3965e+01 -6.0027e+01 -5.5572e+01 -5.0304e+01 -5.3962e+01 -6.0042e+01 -5.5615e+01 -5.0315e+01 -5.3958e+01 -6.0056e+01 -5.5657e+01 -5.0326e+01 -5.3955e+01 -6.0070e+01 -5.5699e+01 -5.0337e+01 -5.3952e+01 -6.0083e+01 -5.5739e+01 -5.0348e+01 -5.3986e+01 -6.0096e+01 -5.5780e+01 -5.0359e+01 -5.4027e+01 -6.0108e+01 -5.5819e+01 -5.0371e+01 -5.4060e+01 -6.0120e+01 -5.5858e+01 -5.0382e+01 -5.4092e+01 -6.0131e+01 -5.5896e+01 -5.0393e+01 -5.4123e+01 -6.0141e+01 -5.5933e+01 -5.0405e+01 -5.4153e+01 -6.0151e+01 -5.5969e+01 -5.0433e+01 -5.4183e+01 -6.0161e+01 -5.6005e+01 -5.0489e+01 -5.4212e+01 -6.0169e+01 -5.6040e+01 -5.0544e+01 -5.4244e+01 -6.0170e+01 -5.6075e+01 -5.0599e+01 -5.4309e+01 -6.0170e+01 -5.6109e+01 -5.0653e+01 -5.4373e+01 -6.0170e+01 -5.6142e+01 -5.0706e+01 -5.4429e+01 -6.0169e+01 -5.6174e+01 -5.0759e+01 -5.4484e+01 -6.0168e+01 -5.6206e+01 -5.0811e+01 -5.4538e+01 -6.0166e+01 -5.6237e+01 -5.0862e+01 -5.4590e+01 -6.0165e+01 -5.6268e+01 -5.0913e+01 -5.4643e+01 -6.0163e+01 -5.6298e+01 -5.0963e+01 -5.4694e+01 -6.0160e+01 -5.6327e+01 -5.1012e+01 -5.4745e+01 -6.0157e+01 -5.6355e+01 -5.1061e+01 -5.4795e+01 -6.0154e+01 -5.6383e+01 -5.1109e+01 -5.4844e+01 -6.0151e+01 -5.6411e+01 -5.1157e+01 -5.4892e+01 -6.0147e+01 -5.6437e+01 -5.1204e+01 -5.4940e+01 -6.0143e+01 -5.6463e+01 -5.1250e+01 -5.4987e+01 -6.0139e+01 -5.6489e+01 -5.1296e+01 -5.5033e+01 -6.0134e+01 -5.6514e+01 -5.1341e+01 -5.5079e+01 -6.0129e+01 -5.6538e+01 -5.1385e+01 -5.5124e+01 -6.0124e+01 -5.6562e+01 -5.1429e+01 -5.5168e+01 -6.0118e+01 -5.6585e+01 -5.1472e+01 -5.5211e+01 -6.0112e+01 -5.6607e+01 -5.1515e+01 -5.5254e+01 -6.0106e+01 -5.6629e+01 -5.1557e+01 -5.5296e+01 -6.0100e+01 -5.6650e+01 -5.1598e+01 -5.5362e+01 -6.0093e+01 -5.6671e+01 -5.1639e+01 -5.5439e+01 -6.0085e+01 -5.6691e+01 -5.1680e+01 -5.5515e+01 -6.0078e+01 -5.6723e+01 -5.1719e+01 -5.5589e+01 -6.0070e+01 -5.6787e+01 -5.1759e+01 -5.5663e+01 -6.0062e+01 -5.6849e+01 -5.1797e+01 -5.5735e+01 -6.0054e+01 -5.6910e+01 -5.1835e+01 -5.5805e+01 -6.0045e+01 -5.6969e+01 -5.1873e+01 -5.5864e+01 -6.0036e+01 -5.7020e+01 -5.1909e+01 -5.5917e+01 -6.0027e+01 -5.7069e+01 -5.1946e+01 -5.5969e+01 -6.0017e+01 -5.7118e+01 -5.1982e+01 -5.6021e+01 -6.0032e+01 -5.7166e+01 -5.2017e+01 -5.6072e+01 -6.0066e+01 -5.7213e+01 -5.2052e+01 -5.6123e+01 -6.0100e+01 -5.7259e+01 -5.2086e+01 -5.6172e+01 -6.0132e+01 -5.7304e+01 -5.2119e+01 -5.6221e+01 -6.0163e+01 -5.7348e+01 -5.2152e+01 -5.6270e+01 -6.0194e+01 -5.7391e+01 -5.2185e+01 -5.6317e+01 -6.0223e+01 -5.7433e+01 -5.2217e+01 -5.6356e+01 -6.0245e+01 -5.7475e+01 -5.2248e+01 -5.6391e+01 -6.0265e+01 -5.7515e+01 -5.2279e+01 -5.6420e+01 -6.0285e+01 -5.7555e+01 -5.2310e+01 -5.6450e+01 -6.0303e+01 -5.7594e+01 -5.2340e+01 -5.6479e+01 -6.0321e+01 -5.7632e+01 -5.2369e+01 -5.6508e+01 -6.0338e+01 -5.7669e+01 -5.2398e+01 -5.6537e+01 -6.0355e+01 -5.7705e+01 -5.2427e+01 -5.6565e+01 -6.0371e+01 -5.7740e+01 -5.2455e+01 -5.6593e+01 -6.0386e+01 -5.7775e+01 -5.2482e+01 -5.6620e+01 -6.0401e+01 -5.7809e+01 -5.2509e+01 -5.6647e+01 -6.0415e+01 -5.7841e+01 -5.2535e+01 -5.6674e+01 -6.0429e+01 -5.7874e+01 -5.2561e+01 -5.6700e+01 -6.0441e+01 -5.7905e+01 -5.2587e+01 -5.6757e+01 -6.0454e+01 -5.7935e+01 -5.2612e+01 -5.6818e+01 -6.0465e+01 -5.7965e+01 -5.2637e+01 -5.6879e+01 -6.0476e+01 -5.7994e+01 -5.2661e+01 -5.6940e+01 -6.0487e+01 -5.8022e+01 -5.2684e+01 -5.6999e+01 -6.0496e+01 -5.8050e+01 -5.2708e+01 -5.7058e+01 -6.0505e+01 -5.8076e+01 -5.2730e+01 -5.7115e+01 -6.0514e+01 -5.8102e+01 -5.2753e+01 -5.7172e+01 -6.0522e+01 -5.8127e+01 -5.2775e+01 -5.7228e+01 -6.0530e+01 -5.8152e+01 -5.2796e+01 -5.7283e+01 -6.0537e+01 -5.8176e+01 -5.2817e+01 -5.7337e+01 -6.0543e+01 -5.8199e+01 -5.2838e+01 -5.7391e+01 -6.0549e+01 -5.8214e+01 -5.2858e+01 -5.7444e+01 -6.0554e+01 -5.8228e+01 -5.2877e+01 -5.7495e+01 -6.0559e+01 -5.8241e+01 -5.2897e+01 -5.7546e+01 -6.0563e+01 -5.8254e+01 -5.2916e+01 -5.7596e+01 -6.0562e+01 -5.8266e+01 -5.2934e+01 -5.7646e+01 -6.0557e+01 -5.8278e+01 -5.2952e+01 -5.7694e+01 -6.0552e+01 -5.8290e+01 -5.2970e+01 -5.7742e+01 -6.0547e+01 -5.8301e+01 -5.2987e+01 -5.7789e+01 -6.0541e+01 -5.8306e+01 -5.3004e+01 -5.7835e+01 -6.0535e+01 -5.8308e+01 -5.3021e+01 -5.7880e+01 -6.0528e+01 -5.8310e+01 -5.3037e+01 -5.7925e+01 -6.0522e+01 -5.8311e+01 -5.3052e+01 -5.7968e+01 -6.0515e+01 -5.8313e+01 -5.3068e+01 -5.8011e+01 -6.0507e+01 -5.8314e+01 -5.3083e+01 -5.8053e+01 -6.0500e+01 -5.8314e+01 -5.3097e+01 -5.8094e+01 -6.0492e+01 -5.8315e+01 -5.3111e+01 -5.8135e+01 -6.0484e+01 -5.8315e+01 -5.3125e+01 -5.8175e+01 -6.0475e+01 -5.8315e+01 -5.3139e+01 -5.8214e+01 -6.0466e+01 -5.8314e+01 -5.3152e+01 -5.8252e+01 -6.0457e+01 -5.8314e+01 -5.3165e+01 -5.8289e+01 -6.0448e+01 -5.8313e+01 -5.3177e+01 -5.8326e+01 -6.0438e+01 -5.8312e+01 -5.3189e+01 -5.8362e+01 -6.0428e+01 -5.8310e+01 -5.3201e+01 -5.8419e+01 -6.0440e+01 -5.8308e+01 -5.3212e+01 -5.8498e+01 -6.0474e+01 -5.8306e+01 -5.3224e+01 -5.8575e+01 -6.0506e+01 -5.8304e+01 -5.3234e+01 -5.8651e+01 -6.0538e+01 -5.8302e+01 -5.3243e+01 -5.8726e+01 -6.0566e+01 -5.8299e+01 -5.3246e+01 -5.8799e+01 -6.0588e+01 -5.8296e+01 -5.3248e+01 -5.8871e+01 -6.0604e+01 -5.8292e+01 -5.3249e+01 -5.8941e+01 -6.0616e+01 -5.8289e+01 -5.3251e+01 -5.9010e+01 -6.0629e+01 -5.8285e+01 -5.3253e+01 -5.9078e+01 -6.0640e+01 -5.8281e+01 -5.3254e+01 -5.9144e+01 -6.0652e+01 -5.8276e+01 -5.3256e+01 -5.9210e+01 -6.0663e+01 -5.8272e+01 -5.3257e+01 -5.9273e+01 -6.0673e+01 -5.8267e+01 -5.3258e+01 -5.9336e+01 -6.0683e+01 -5.8262e+01 -5.3259e+01 -5.9397e+01 -6.0692e+01 -5.8256e+01 -5.3260e+01 -5.9458e+01 -6.0701e+01 -5.8250e+01 -5.3261e+01 -5.9516e+01 -6.0709e+01 -5.8245e+01 -5.3261e+01 -5.9574e+01 -6.0717e+01 -5.8238e+01 -5.3262e+01 -5.9631e+01 -6.0756e+01 -5.8232e+01 -5.3262e+01 -5.9685e+01 -6.0807e+01 -5.8225e+01 -5.3262e+01 -5.9731e+01 -6.0857e+01 -5.8218e+01 -5.3262e+01 -5.9776e+01 -6.0906e+01 -5.8211e+01 -5.3262e+01 -5.9820e+01 -6.0953e+01 -5.8204e+01 -5.3262e+01 -5.9864e+01 -6.1000e+01 -5.8190e+01 -5.3262e+01 -5.9906e+01 -6.1045e+01 -5.8167e+01 -5.3261e+01 -5.9943e+01 -6.1090e+01 -5.8143e+01 -5.3261e+01 -5.9975e+01 -6.1133e+01 -5.8120e+01 -5.3260e+01 -6.0007e+01 -6.1175e+01 -5.8094e+01 -5.3259e+01 -6.0038e+01 -6.1216e+01 -5.8063e+01 -5.3259e+01 -6.0060e+01 -6.1257e+01 -5.8032e+01 -5.3258e+01 -6.0082e+01 -6.1296e+01 -5.8001e+01 -5.3256e+01 -6.0103e+01 -6.1334e+01 -5.7971e+01 -5.3255e+01 -6.0124e+01 -6.1371e+01 -5.7942e+01 -5.3254e+01 -6.0142e+01 -6.1407e+01 -5.7912e+01 -5.3252e+01 -6.0153e+01 -6.1440e+01 -5.7883e+01 -5.3251e+01 -6.0164e+01 -6.1466e+01 -5.7854e+01 -5.3249e+01 -6.0175e+01 -6.1510e+01 -5.7825e+01 -5.3247e+01 -6.0186e+01 -6.1579e+01 -5.7797e+01 -5.3245e+01 -6.0192e+01 -6.1647e+01 -5.7769e+01 -5.3243e+01 -6.0194e+01 -6.1713e+01 -5.7741e+01 -5.3240e+01 -6.0196e+01 -6.1774e+01 -5.7713e+01 -5.3234e+01 -6.0197e+01 -6.1829e+01 -5.7686e+01 -5.3224e+01 -6.0199e+01 -6.1883e+01 -5.7655e+01 -5.3214e+01 -6.0200e+01 -6.1936e+01 -5.7620e+01 -5.3203e+01 -6.0202e+01 -6.1988e+01 -5.7585e+01 -5.3193e+01 -6.0203e+01 -6.2039e+01 -5.7551e+01 -5.3183e+01 -6.0204e+01 -6.2088e+01 -5.7518e+01 -5.3173e+01 -6.0204e+01 -6.2137e+01 -5.7484e+01 -5.3163e+01 -6.0205e+01 -6.2184e+01 -5.7451e+01 -5.3153e+01 -6.0205e+01 -6.2230e+01 -5.7419e+01 -5.3143e+01 -6.0205e+01 -6.2275e+01 -5.7386e+01 -5.3134e+01 -6.0205e+01 -6.2319e+01 -5.7354e+01 -5.3124e+01 -6.0205e+01 -6.2362e+01 -5.7323e+01 -5.3114e+01 -6.0204e+01 -6.2404e+01 -5.7292e+01 -5.3105e+01 -6.0203e+01 -6.2445e+01 -5.7261e+01 -5.3095e+01 -6.0203e+01 -6.2485e+01 -5.7230e+01 -5.3086e+01 -6.0194e+01 -6.2523e+01 -5.7199e+01 -5.3076e+01 -6.0184e+01 -6.2561e+01 -5.7169e+01 -5.3067e+01 -6.0175e+01 -6.2597e+01 -5.7140e+01 -5.3057e+01 -6.0166e+01 -6.2633e+01 -5.7110e+01 -5.3048e+01 -6.0157e+01 -6.2667e+01 -5.7081e+01 -5.3038e+01 -6.0140e+01 -6.2701e+01 -5.7052e+01 -5.3029e+01 -6.0122e+01 -6.2734e+01 -5.7023e+01 -5.3020e+01 -6.0105e+01 -6.2765e+01 -5.6994e+01 -5.3010e+01 -6.0088e+01 -6.2796e+01 -5.6966e+01 -5.3001e+01 -6.0071e+01 -6.2825e+01 -5.6938e+01 -5.2992e+01 -6.0054e+01 -6.2854e+01 -5.6910e+01 -5.2977e+01 -6.0038e+01 -6.2882e+01 -5.6883e+01 -5.2960e+01 -6.0021e+01 -6.2909e+01 -5.6855e+01 -5.2943e+01 -6.0005e+01 -6.2934e+01 -5.6828e+01 -5.2927e+01 -5.9988e+01 -6.2959e+01 -5.6801e+01 -5.2910e+01 -5.9972e+01 -6.2983e+01 -5.6774e+01 -5.2894e+01 -5.9955e+01 -6.3007e+01 -5.6748e+01 -5.2878e+01 -5.9939e+01 -6.3029e+01 -5.6721e+01 -5.2862e+01 -5.9923e+01 -6.3050e+01 -5.6695e+01 -5.2847e+01 -5.9906e+01 -6.3071e+01 -5.6669e+01 -5.2831e+01 -5.9886e+01 -6.3090e+01 -5.6636e+01 -5.2816e+01 -5.9862e+01 -6.3109e+01 -5.6603e+01 -5.2801e+01 -5.9838e+01 -6.3127e+01 -5.6569e+01 -5.2786e+01 -5.9814e+01 -6.3144e+01 -5.6530e+01 -5.2771e+01 -5.9791e+01 -6.3154e+01 -5.6490e+01 -5.2756e+01 -5.9767e+01 -6.3162e+01 -5.6462e+01 -5.2742e+01 -5.9744e+01 -6.3169e+01 -5.6460e+01 -5.2728e+01 -5.9721e+01 -6.3175e+01 -5.6457e+01 -5.2713e+01 -5.9698e+01 -6.3181e+01 -5.6454e+01 -5.2699e+01 -5.9676e+01 -6.3186e+01 -5.6451e+01 -5.2686e+01 -5.9653e+01 -6.3191e+01 -5.6449e+01 -5.2672e+01 -5.9631e+01 -6.3195e+01 -5.6446e+01 -5.2658e+01 -5.9608e+01 -6.3198e+01 -5.6443e+01 -5.2645e+01 -5.9586e+01 -6.3218e+01 -5.6441e+01 -5.2631e+01 -5.9564e+01 -6.3265e+01 -5.6438e+01 -5.2618e+01 -5.9542e+01 -6.3310e+01 -5.6435e+01 -5.2605e+01 -5.9520e+01 -6.3354e+01 -5.6432e+01 -5.2592e+01 -5.9499e+01 -6.3398e+01 -5.6430e+01 -5.2579e+01 -5.9477e+01 -6.3439e+01 -5.6427e+01 -5.2564e+01 -5.9455e+01 -6.3480e+01 -5.6424e+01 -5.2544e+01 -5.9434e+01 -6.3520e+01 -5.6421e+01 -5.2523e+01 -5.9413e+01 -6.3558e+01 -5.6418e+01 -5.2503e+01 -5.9391e+01 -6.3595e+01 -5.6415e+01 -5.2483e+01 -5.9370e+01 -6.3631e+01 -5.6412e+01 -5.2464e+01 -5.9349e+01 -6.3666e+01 -5.6409e+01 -5.2445e+01 -5.9327e+01 -6.3700e+01 -5.6406e+01 -5.2421e+01 -5.9306e+01 -6.3733e+01 -5.6403e+01 -5.2394e+01 -5.9285e+01 -6.3764e+01 -5.6399e+01 -5.2368e+01 -5.9264e+01 -6.3795e+01 -5.6396e+01 -5.2342e+01 -5.9243e+01 -6.3824e+01 -5.6393e+01 -5.2317e+01 -5.9222e+01 -6.3853e+01 -5.6389e+01 -5.2292e+01 -5.9201e+01 -6.3880e+01 -5.6385e+01 -5.2268e+01 -5.9180e+01 -6.3907e+01 -5.6382e+01 -5.2244e+01 -5.9159e+01 -6.3932e+01 -5.6378e+01 -5.2220e+01 -5.9138e+01 -6.3956e+01 -5.6374e+01 -5.2197e+01 -5.9117e+01 -6.3980e+01 -5.6370e+01 -5.2174e+01 -5.9096e+01 -6.4002e+01 -5.6366e+01 -5.2162e+01 -5.9075e+01 -6.4024e+01 -5.6362e+01 -5.2185e+01 -5.9055e+01 -6.4044e+01 -5.6357e+01 -5.2207e+01 -5.9034e+01 -6.4064e+01 -5.6345e+01 -5.2229e+01 -5.9013e+01 -6.4082e+01 -5.6333e+01 -5.2250e+01 -5.8992e+01 -6.4100e+01 -5.6320e+01 -5.2271e+01 -5.8971e+01 -6.4117e+01 -5.6308e+01 -5.2292e+01 -5.8950e+01 -6.4133e+01 -5.6296e+01 -5.2312e+01 -5.8929e+01 -6.4148e+01 -5.6284e+01 -5.2333e+01 -5.8908e+01 -6.4162e+01 -5.6272e+01 -5.2353e+01 -5.8890e+01 -6.4170e+01 -5.6260e+01 -5.2372e+01 -5.8906e+01 -6.4175e+01 -5.6248e+01 -5.2384e+01 -5.8921e+01 -6.4179e+01 -5.6236e+01 -5.2395e+01 -5.8936e+01 -6.4182e+01 -5.6225e+01 -5.2406e+01 -5.8950e+01 -6.4184e+01 -5.6209e+01 -5.2417e+01 -5.8963e+01 -6.4186e+01 -5.6189e+01 -5.2463e+01 -5.8976e+01 -6.4187e+01 -5.6170e+01 -5.2518e+01 -5.8989e+01 -6.4188e+01 -5.6151e+01 -5.2572e+01 -5.9001e+01 -6.4188e+01 -5.6132e+01 -5.2626e+01 -5.9013e+01 -6.4187e+01 -5.6113e+01 -5.2678e+01 -5.9024e+01 -6.4186e+01 -5.6095e+01 -5.2730e+01 -5.9035e+01 -6.4185e+01 -5.6076e+01 -5.2781e+01 -5.9046e+01 -6.4182e+01 -5.6058e+01 -5.2831e+01 -5.9055e+01 -6.4179e+01 -5.6040e+01 -5.2880e+01 -5.9065e+01 -6.4176e+01 -5.6022e+01 -5.2929e+01 -5.9074e+01 -6.4172e+01 -5.6004e+01 -5.2977e+01 -5.9082e+01 -6.4167e+01 -5.5987e+01 -5.3024e+01 -5.9090e+01 -6.4162e+01 -5.5969e+01 -5.3070e+01 -5.9098e+01 -6.4156e+01 -5.5952e+01 -5.3108e+01 -5.9105e+01 -6.4150e+01 -5.5935e+01 -5.3145e+01 -5.9112e+01 -6.4143e+01 -5.5918e+01 -5.3182e+01 -5.9118e+01 -6.4135e+01 -5.5898e+01 -5.3218e+01 -5.9124e+01 -6.4127e+01 -5.5873e+01 -5.3253e+01 -5.9129e+01 -6.4119e+01 -5.5849e+01 -5.3289e+01 -5.9134e+01 -6.4110e+01 -5.5825e+01 -5.3323e+01 -5.9139e+01 -6.4100e+01 -5.5801e+01 -5.3357e+01 -5.9143e+01 -6.4085e+01 -5.5778e+01 -5.3391e+01 -5.9147e+01 -6.4066e+01 -5.5754e+01 -5.3424e+01 -5.9150e+01 -6.4048e+01 -5.5731e+01 -5.3456e+01 -5.9153e+01 -6.4029e+01 -5.5709e+01 -5.3489e+01 -5.9155e+01 -6.4009e+01 -5.5686e+01 -5.3520e+01 -5.9157e+01 -6.3990e+01 -5.5664e+01 -5.3551e+01 -5.9159e+01 -6.3970e+01 -5.5642e+01 -5.3582e+01 -5.9160e+01 -6.3950e+01 -5.5620e+01 -5.3612e+01 -5.9161e+01 -6.3930e+01 -5.5599e+01 -5.3641e+01 -5.9161e+01 -6.3909e+01 -5.5578e+01 -5.3670e+01 -5.9161e+01 -6.3888e+01 -5.5549e+01 -5.3699e+01 -5.9161e+01 -6.3880e+01 -5.5520e+01 -5.3727e+01 -5.9160e+01 -6.3903e+01 -5.5492e+01 -5.3754e+01 -5.9159e+01 -6.3925e+01 -5.5464e+01 -5.3781e+01 -5.9158e+01 -6.3946e+01 -5.5436e+01 -5.3808e+01 -5.9156e+01 -6.3966e+01 -5.5409e+01 -5.3834e+01 -5.9154e+01 -6.3985e+01 -5.5382e+01 -5.3860e+01 -5.9151e+01 -6.4004e+01 -5.5356e+01 -5.3885e+01 -5.9148e+01 -6.4021e+01 -5.5330e+01 -5.3910e+01 -5.9145e+01 -6.4038e+01 -5.5304e+01 -5.3934e+01 -5.9141e+01 -6.4053e+01 -5.5279e+01 -5.3957e+01 -5.9137e+01 -6.4068e+01 -5.5253e+01 -5.3981e+01 -5.9133e+01 -6.4082e+01 -5.5228e+01 -5.4004e+01 -5.9128e+01 -6.4095e+01 -5.5204e+01 -5.4026e+01 -5.9123e+01 -6.4108e+01 -5.5180e+01 -5.4048e+01 -5.9117e+01 -6.4119e+01 -5.5155e+01 -5.4069e+01 -5.9112e+01 -6.4130e+01 -5.5132e+01 -5.4090e+01 -5.9106e+01 -6.4140e+01 -5.5108e+01 -5.4111e+01 -5.9099e+01 -6.4149e+01 -5.5085e+01 -5.4131e+01 -5.9092e+01 -6.4157e+01 -5.5062e+01 -5.4151e+01 -5.9085e+01 -6.4165e+01 -5.5039e+01 -5.4170e+01 -5.9078e+01 -6.4171e+01 -5.5017e+01 -5.4189e+01 -5.9070e+01 -6.4177e+01 -5.4994e+01 -5.4207e+01 -5.9062e+01 -6.4191e+01 -5.4972e+01 -5.4225e+01 -5.9054e+01 -6.4240e+01 -5.4950e+01 -5.4243e+01 -5.9045e+01 -6.4288e+01 -5.4929e+01 -5.4260e+01 -5.9037e+01 -6.4334e+01 -5.4907e+01 -5.4277e+01 -5.9027e+01 -6.4379e+01 -5.4886e+01 -5.4291e+01 -5.9018e+01 -6.4423e+01 -5.4865e+01 -5.4299e+01 -5.9008e+01 -6.4465e+01 -5.4844e+01 -5.4307e+01 -5.8998e+01 -6.4506e+01 -5.4824e+01 -5.4315e+01 -5.8988e+01 -6.4546e+01 -5.4803e+01 -5.4322e+01 -5.8977e+01 -6.4584e+01 -5.4783e+01 -5.4329e+01 -5.8966e+01 -6.4621e+01 -5.4763e+01 -5.4336e+01 -5.8955e+01 -6.4657e+01 -5.4743e+01 -5.4343e+01 -5.8944e+01 -6.4691e+01 -5.4716e+01 -5.4349e+01 -5.8932e+01 -6.4725e+01 -5.4688e+01 -5.4355e+01 -5.8920e+01 -6.4757e+01 -5.4661e+01 -5.4361e+01 -5.8908e+01 -6.4784e+01 -5.4634e+01 -5.4360e+01 -5.8895e+01 -6.4806e+01 -5.4608e+01 -5.4357e+01 -5.8882e+01 -6.4827e+01 -5.4582e+01 -5.4355e+01 -5.8869e+01 -6.4847e+01 -5.4556e+01 -5.4353e+01 -5.8856e+01 -6.4866e+01 -5.4530e+01 -5.4351e+01 -5.8843e+01 -6.4884e+01 -5.4505e+01 -5.4349e+01 -5.8829e+01 -6.4901e+01 -5.4480e+01 -5.4346e+01 -5.8815e+01 -6.4917e+01 -5.4456e+01 -5.4344e+01 -5.8801e+01 -6.4933e+01 -5.4431e+01 -5.4342e+01 -5.8786e+01 -6.4947e+01 -5.4407e+01 -5.4339e+01 -5.8772e+01 -6.4961e+01 -5.4383e+01 -5.4337e+01 -5.8757e+01 -6.4974e+01 -5.4360e+01 -5.4334e+01 -5.8742e+01 -6.4985e+01 -5.4336e+01 -5.4332e+01 -5.8727e+01 -6.4996e+01 -5.4313e+01 -5.4329e+01 -5.8711e+01 -6.5007e+01 -5.4291e+01 -5.4326e+01 -5.8690e+01 -6.5016e+01 -5.4268e+01 -5.4324e+01 -5.8666e+01 -6.5023e+01 -5.4246e+01 -5.4321e+01 -5.8642e+01 -6.5023e+01 -5.4224e+01 -5.4318e+01 -5.8618e+01 -6.5022e+01 -5.4202e+01 -5.4310e+01 -5.8594e+01 -6.5020e+01 -5.4173e+01 -5.4299e+01 -5.8571e+01 -6.5018e+01 -5.4187e+01 -5.4289e+01 -5.8547e+01 -6.5015e+01 -5.4202e+01 -5.4278e+01 -5.8523e+01 -6.5012e+01 -5.4217e+01 -5.4268e+01 -5.8499e+01 -6.5008e+01 -5.4232e+01 -5.4257e+01 -5.8475e+01 -6.5004e+01 -5.4246e+01 -5.4247e+01 -5.8451e+01 -6.4999e+01 -5.4260e+01 -5.4237e+01 -5.8427e+01 -6.4986e+01 -5.4274e+01 -5.4219e+01 -5.8404e+01 -6.4973e+01 -5.4287e+01 -5.4224e+01 -5.8380e+01 -6.4955e+01 -5.4301e+01 -5.4251e+01 -5.8356e+01 -6.4932e+01 -5.4313e+01 -5.4277e+01 -5.8332e+01 -6.4910e+01 -5.4326e+01 -5.4303e+01 -5.8308e+01 -6.4887e+01 -5.4339e+01 -5.4329e+01 -5.8284e+01 -6.4864e+01 -5.4351e+01 -5.4354e+01 -5.8254e+01 -6.4840e+01 -5.4356e+01 -5.4379e+01 -5.8222e+01 -6.4817e+01 -5.4359e+01 -5.4403e+01 -5.8190e+01 -6.4794e+01 -5.4363e+01 -5.4427e+01 -5.8159e+01 -6.4770e+01 -5.4367e+01 -5.4451e+01 -5.8119e+01 -6.4746e+01 -5.4370e+01 -5.4472e+01 -5.8072e+01 -6.4722e+01 -5.4374e+01 -5.4487e+01 -5.8025e+01 -6.4698e+01 -5.4400e+01 -5.4501e+01 -5.7979e+01 -6.4673e+01 -5.4447e+01 -5.4516e+01 -5.7934e+01 -6.4649e+01 -5.4494e+01 -5.4530e+01 -5.7889e+01 -6.4624e+01 -5.4540e+01 -5.4544e+01 -5.7845e+01 -6.4599e+01 -5.4585e+01 -5.4558e+01 -5.7801e+01 -6.4574e+01 -5.4622e+01 -5.4572e+01 -5.7749e+01 -6.4549e+01 -5.4658e+01 -5.4586e+01 -5.7699e+01 -6.4523e+01 -5.4694e+01 -5.4599e+01 -5.7648e+01 -6.4497e+01 -5.4729e+01 -5.4612e+01 -5.7599e+01 -6.4472e+01 -5.4763e+01 -5.4625e+01 -5.7550e+01 -6.4446e+01 -5.4797e+01 -5.4637e+01 -5.7502e+01 -6.4419e+01 -5.4830e+01 -5.4648e+01 -5.7455e+01 -6.4393e+01 -5.4863e+01 -5.4652e+01 -5.7408e+01 -6.4367e+01 -5.4895e+01 -5.4656e+01 -5.7361e+01 -6.4340e+01 -5.4927e+01 -5.4660e+01 -5.7312e+01 -6.4313e+01 -5.4954e+01 -5.4663e+01 -5.7259e+01 -6.4286e+01 -5.4977e+01 -5.4659e+01 -5.7206e+01 -6.4259e+01 -5.4999e+01 -5.4655e+01 -5.7154e+01 -6.4231e+01 -5.5021e+01 -5.4652e+01 -5.7104e+01 -6.4204e+01 -5.5043e+01 -5.4648e+01 -5.7053e+01 -6.4176e+01 -5.5064e+01 -5.4645e+01 -5.7004e+01 -6.4148e+01 -5.5085e+01 -5.4641e+01 -5.6955e+01 -6.4120e+01 -5.5106e+01 -5.4638e+01 -5.6906e+01 -6.4091e+01 -5.5126e+01 -5.4634e+01 -5.6859e+01 -6.4063e+01 -5.5146e+01 -5.4623e+01 -5.6812e+01 -6.4034e+01 -5.5166e+01 -5.4613e+01 -5.6765e+01 -6.4005e+01 -5.5185e+01 -5.4602e+01 -5.6720e+01 -6.3976e+01 -5.5204e+01 -5.4592e+01 -5.6674e+01 -6.3947e+01 -5.5223e+01 -5.4582e+01 -5.6630e+01 -6.3918e+01 -5.5241e+01 -5.4572e+01 -5.6586e+01 -6.3888e+01 -5.5259e+01 -5.4562e+01 -5.6542e+01 -6.3859e+01 -5.5276e+01 -5.4553e+01 -5.6499e+01 -6.3829e+01 -5.5294e+01 -5.4544e+01 -5.6457e+01 -6.3799e+01 -5.5310e+01 -5.4535e+01 -5.6415e+01 -6.3769e+01 -5.5327e+01 -5.4526e+01 -5.6373e+01 -6.3738e+01 -5.5343e+01 -5.4517e+01 -5.6332e+01 -6.3708e+01 -5.5359e+01 -5.4509e+01 -5.6292e+01 -6.3677e+01 -5.5374e+01 -5.4501e+01 -5.6252e+01 -6.3646e+01 -5.5389e+01 -5.4492e+01 -5.6212e+01 -6.3615e+01 -5.5404e+01 -5.4476e+01 -5.6173e+01 -6.3584e+01 -5.5419e+01 -5.4461e+01 -5.6135e+01 -6.3553e+01 -5.5433e+01 -5.4445e+01 -5.6097e+01 -6.3522e+01 -5.5446e+01 -5.4430e+01 -5.6059e+01 -6.3490e+01 -5.5460e+01 -5.4416e+01 -5.6021e+01 -6.3458e+01 -5.5473e+01 -5.4401e+01 -5.5985e+01 -6.3426e+01 -5.5485e+01 -5.4387e+01 -5.5948e+01 -6.3389e+01 -5.5498e+01 -5.4373e+01 -5.5912e+01 -6.3349e+01 -5.5510e+01 -5.4359e+01 -5.5876e+01 -6.3309e+01 -5.5521e+01 -5.4346e+01 -5.5841e+01 -6.3270e+01 -5.5533e+01 -5.4333e+01 -5.5806e+01 -6.3230e+01 -5.5544e+01 -5.4320e+01 -5.5771e+01 -6.3190e+01 -5.5554e+01 -5.4307e+01 -5.5737e+01 -6.3150e+01 -5.5565e+01 -5.4295e+01 -5.5703e+01 -6.3110e+01 -5.5575e+01 -5.4282e+01 -5.5670e+01 -6.3071e+01 -5.5584e+01 -5.4270e+01 -5.5636e+01 -6.3031e+01 -5.5594e+01 -5.4258e+01 -5.5603e+01 -6.2992e+01 -5.5603e+01 -5.4247e+01 -5.5571e+01 -6.2952e+01 -5.5611e+01 -5.4235e+01 -5.5539e+01 -6.2913e+01 -5.5620e+01 -5.4224e+01 -5.5507e+01 -6.2873e+01 -5.5628e+01 -5.4213e+01 -5.5475e+01 -6.2834e+01 -5.5635e+01 -5.4201e+01 -5.5444e+01 -6.2794e+01 -5.5643e+01 -5.4191e+01 -5.5413e+01 -6.2755e+01 -5.5650e+01 -5.4180e+01 -5.5382e+01 -6.2716e+01 -5.5656e+01 -5.4169e+01 -5.5351e+01 -6.2676e+01 -5.5663e+01 -5.4159e+01 -5.5321e+01 -6.2637e+01 -5.5669e+01 -5.4148e+01 -5.5291e+01 -6.2596e+01 -5.5675e+01 -5.4138e+01 -5.5262e+01 -6.2549e+01 -5.5680e+01 -5.4128e+01 -5.5232e+01 -6.2502e+01 -5.5686e+01 -5.4118e+01 -5.5203e+01 -6.2451e+01 -5.5688e+01 -5.4108e+01 -5.5174e+01 -6.2397e+01 -5.5685e+01 -5.4098e+01 -5.5145e+01 -6.2343e+01 -5.5682e+01 -5.4088e+01 -5.5117e+01 -6.2289e+01 -5.5678e+01 -5.4078e+01 -5.5089e+01 -6.2236e+01 -5.5674e+01 -5.4069e+01 -5.5061e+01 -6.2183e+01 -5.5671e+01 -5.4059e+01 -5.5033e+01 -6.2131e+01 -5.5667e+01 -5.4050e+01 -5.5006e+01 -6.2077e+01 -5.5663e+01 -5.4040e+01 -5.4978e+01 -6.2018e+01 -5.5659e+01 -5.4031e+01 -5.4951e+01 -6.1959e+01 -5.5654e+01 -5.4022e+01 -5.4925e+01 -6.1900e+01 -5.5647e+01 -5.4013e+01 -5.4898e+01 -6.1876e+01 -5.5635e+01 -5.4003e+01 -5.4871e+01 -6.1863e+01 -5.5623e+01 -5.3994e+01 -5.4845e+01 -6.1849e+01 -5.5610e+01 -5.3985e+01 -5.4819e+01 -6.1835e+01 -5.5598e+01 -5.3976e+01 -5.4793e+01 -6.1821e+01 -5.5586e+01 -5.3967e+01 -5.4767e+01 -6.1807e+01 -5.5574e+01 -5.3958e+01 -5.4774e+01 -6.1793e+01 -5.5562e+01 -5.3949e+01 -5.4785e+01 -6.1779e+01 -5.5550e+01 -5.3941e+01 -5.4796e+01 -6.1764e+01 -5.5539e+01 -5.3932e+01 -5.4806e+01 -6.1749e+01 -5.5527e+01 -5.3923e+01 -5.4816e+01 -6.1734e+01 -5.5515e+01 -5.3914e+01 -5.4826e+01 -6.1719e+01 -5.5503e+01 -5.3905e+01 -5.4835e+01 -6.1704e+01 -5.5492e+01 -5.3896e+01 -5.4845e+01 -6.1689e+01 -5.5478e+01 -5.3888e+01 -5.4854e+01 -6.1673e+01 -5.5458e+01 -5.3879e+01 -5.4862e+01 -6.1657e+01 -5.5439e+01 -5.3870e+01 -5.4871e+01 -6.1641e+01 -5.5420e+01 -5.3861e+01 -5.4879e+01 -6.1625e+01 -5.5401e+01 -5.3853e+01 -5.4887e+01 -6.1609e+01 -5.5382e+01 -5.3844e+01 -5.4894e+01 -6.1592e+01 -5.5364e+01 -5.3835e+01 -5.4902e+01 -6.1576e+01 -5.5345e+01 -5.3827e+01 -5.4909e+01 -6.1559e+01 -5.5327e+01 -5.3818e+01 -5.4916e+01 -6.1542e+01 -5.5309e+01 -5.3809e+01 -5.4922e+01 -6.1524e+01 -5.5291e+01 -5.3800e+01 -5.4928e+01 -6.1507e+01 -5.5273e+01 -5.3792e+01 -5.4934e+01 -6.1482e+01 -5.5252e+01 -5.3776e+01 -5.4940e+01 -6.1456e+01 -5.5227e+01 -5.3759e+01 -5.4945e+01 -6.1431e+01 -5.5202e+01 -5.3743e+01 -5.4950e+01 -6.1405e+01 -5.5171e+01 -5.3727e+01 -5.4955e+01 -6.1380e+01 -5.5138e+01 -5.3711e+01 -5.4960e+01 -6.1354e+01 -5.5107e+01 -5.3695e+01 -5.4964e+01 -6.1329e+01 -5.5076e+01 -5.3679e+01 -5.4963e+01 -6.1303e+01 -5.5045e+01 -5.3663e+01 -5.4959e+01 -6.1277e+01 -5.5015e+01 -5.3648e+01 -5.4955e+01 -6.1252e+01 -5.4985e+01 -5.3633e+01 -5.4984e+01 -6.1267e+01 -5.5037e+01 -5.3618e+01 -5.5016e+01 -6.1285e+01 -5.5097e+01 -5.3603e+01 -5.5048e+01 -6.1303e+01 -5.5155e+01 -5.3588e+01 -5.5079e+01 -6.1320e+01 -5.5213e+01 -5.3573e+01 -5.5109e+01 -6.1337e+01 -5.5269e+01 -5.3553e+01 -5.5139e+01 -6.1352e+01 -5.5325e+01 -5.3531e+01 -5.5169e+01 -6.1367e+01 -5.5380e+01 -5.3509e+01 -5.5197e+01 -6.1382e+01 -5.5434e+01 -5.3487e+01 -5.5226e+01 -6.1395e+01 -5.5484e+01 -5.3466e+01 -5.5253e+01 -6.1409e+01 -5.5528e+01 -5.3445e+01 -5.5281e+01 -6.1421e+01 -5.5572e+01 -5.3424e+01 -5.5308e+01 -6.1433e+01 -5.5615e+01 -5.3403e+01 -5.5334e+01 -6.1444e+01 -5.5657e+01 -5.3383e+01 -5.5363e+01 -6.1455e+01 -5.5699e+01 -5.3363e+01 -5.5428e+01 -6.1465e+01 -5.5740e+01 -5.3343e+01 -5.5489e+01 -6.1474e+01 -5.5780e+01 -5.3324e+01 -5.5548e+01 -6.1483e+01 -5.5820e+01 -5.3305e+01 -5.5607e+01 -6.1491e+01 -5.5859e+01 -5.3286e+01 -5.5665e+01 -6.1498e+01 -5.5898e+01 -5.3267e+01 -5.5722e+01 -6.1505e+01 -5.5936e+01 -5.3248e+01 -5.5778e+01 -6.1512e+01 -5.5973e+01 -5.3230e+01 -5.5833e+01 -6.1518e+01 -5.6010e+01 -5.3212e+01 -5.5888e+01 -6.1523e+01 -5.6045e+01 -5.3194e+01 -5.5933e+01 -6.1528e+01 -5.6081e+01 -5.3177e+01 -5.5978e+01 -6.1532e+01 -5.6115e+01 -5.3159e+01 -5.6022e+01 -6.1535e+01 -5.6150e+01 -5.3142e+01 -5.6065e+01 -6.1538e+01 -5.6183e+01 -5.3125e+01 -5.6107e+01 -6.1541e+01 -5.6216e+01 -5.3108e+01 -5.6149e+01 -6.1543e+01 -5.6248e+01 -5.3091e+01 -5.6190e+01 -6.1544e+01 -5.6280e+01 -5.3075e+01 -5.6223e+01 -6.1545e+01 -5.6311e+01 -5.3058e+01 -5.6255e+01 -6.1545e+01 -5.6341e+01 -5.3042e+01 -5.6286e+01 -6.1545e+01 -5.6371e+01 -5.3026e+01 -5.6317e+01 -6.1544e+01 -5.6400e+01 -5.3010e+01 -5.6347e+01 -6.1543e+01 -5.6428e+01 -5.2994e+01 -5.6377e+01 -6.1542e+01 -5.6456e+01 -5.2979e+01 -5.6406e+01 -6.1539e+01 -5.6484e+01 -5.2964e+01 -5.6428e+01 -6.1537e+01 -5.6510e+01 -5.2948e+01 -5.6448e+01 -6.1534e+01 -5.6537e+01 -5.2933e+01 -5.6468e+01 -6.1530e+01 -5.6562e+01 -5.2918e+01 -5.6488e+01 -6.1526e+01 -5.6587e+01 -5.2903e+01 -5.6508e+01 -6.1521e+01 -5.6612e+01 -5.2889e+01 -5.6527e+01 -6.1516e+01 -5.6636e+01 -5.2874e+01 -5.6546e+01 -6.1511e+01 -5.6659e+01 -5.2860e+01 -5.6564e+01 -6.1505e+01 -5.6682e+01 -5.2845e+01 -5.6583e+01 -6.1498e+01 -5.6704e+01 -5.2831e+01 -5.6600e+01 -6.1492e+01 -5.6725e+01 -5.2817e+01 -5.6618e+01 -6.1484e+01 -5.6747e+01 -5.2803e+01 -5.6635e+01 -6.1477e+01 -5.6767e+01 -5.2789e+01 -5.6652e+01 -6.1469e+01 -5.6787e+01 -5.2775e+01 -5.6669e+01 -6.1460e+01 -5.6807e+01 -5.2762e+01 -5.6685e+01 -6.1451e+01 -5.6826e+01 -5.2748e+01 -5.6701e+01 -6.1442e+01 -5.6844e+01 -5.2730e+01 -5.6716e+01 -6.1432e+01 -5.6862e+01 -5.2709e+01 -5.6732e+01 -6.1422e+01 -5.6879e+01 -5.2688e+01 -5.6746e+01 -6.1411e+01 -5.6896e+01 -5.2667e+01 -5.6761e+01 -6.1400e+01 -5.6912e+01 -5.2647e+01 -5.6775e+01 -6.1389e+01 -5.6928e+01 -5.2644e+01 -5.6789e+01 -6.1377e+01 -5.6936e+01 -5.2669e+01 -5.6802e+01 -6.1407e+01 -5.6943e+01 -5.2693e+01 -5.6816e+01 -6.1439e+01 -5.6950e+01 -5.2717e+01 -5.6828e+01 -6.1469e+01 -5.6956e+01 -5.2740e+01 -5.6841e+01 -6.1499e+01 -5.6962e+01 -5.2763e+01 -5.6853e+01 -6.1527e+01 -5.6968e+01 -5.2785e+01 -5.6865e+01 -6.1555e+01 -5.6973e+01 -5.2804e+01 -5.6876e+01 -6.1581e+01 -5.6979e+01 -5.2818e+01 -5.6887e+01 -6.1607e+01 -5.6984e+01 -5.2831e+01 -5.6898e+01 -6.1632e+01 -5.6988e+01 -5.2845e+01 -5.6908e+01 -6.1655e+01 -5.6992e+01 -5.2858e+01 -5.6918e+01 -6.1678e+01 -5.6997e+01 -5.2871e+01 -5.6928e+01 -6.1700e+01 -5.7000e+01 -5.2884e+01 -5.6937e+01 -6.1721e+01 -5.7004e+01 -5.2897e+01 -5.6946e+01 -6.1741e+01 -5.7007e+01 -5.2909e+01 -5.6955e+01 -6.1760e+01 -5.7010e+01 -5.2921e+01 -5.6963e+01 -6.1779e+01 -5.7012e+01 -5.2933e+01 -5.6971e+01 -6.1796e+01 -5.7014e+01 -5.2945e+01 -5.6979e+01 -6.1813e+01 -5.7016e+01 -5.2957e+01 -5.6986e+01 -6.1828e+01 -5.7018e+01 -5.2968e+01 -5.6993e+01 -6.1843e+01 -5.7020e+01 -5.2979e+01 -5.6999e+01 -6.1858e+01 -5.7021e+01 -5.2990e+01 -5.7006e+01 -6.1871e+01 -5.7020e+01 -5.3001e+01 -5.7012e+01 -6.1883e+01 -5.7013e+01 -5.3012e+01 -5.7017e+01 -6.1895e+01 -5.7006e+01 -5.3022e+01 -5.7023e+01 -6.1906e+01 -5.6998e+01 -5.3032e+01 -5.7028e+01 -6.1916e+01 -5.6990e+01 -5.3042e+01 -5.7032e+01 -6.1926e+01 -5.6983e+01 -5.3052e+01 -5.7037e+01 -6.1935e+01 -5.6975e+01 -5.3061e+01 -5.7041e+01 -6.1943e+01 -5.6967e+01 -5.3071e+01 -5.7044e+01 -6.1950e+01 -5.6959e+01 -5.3080e+01 -5.7048e+01 -6.1956e+01 -5.6951e+01 -5.3089e+01 -5.7051e+01 -6.1962e+01 -5.6942e+01 -5.3097e+01 -5.7053e+01 -6.1967e+01 -5.6934e+01 -5.3106e+01 -5.7056e+01 -6.1972e+01 -5.6926e+01 -5.3114e+01 -5.7058e+01 -6.1976e+01 -5.6917e+01 -5.3122e+01 -5.7060e+01 -6.1979e+01 -5.6909e+01 -5.3130e+01 -5.7061e+01 -6.1981e+01 -5.6900e+01 -5.3138e+01 -5.7062e+01 -6.1983e+01 -5.6891e+01 -5.3145e+01 -5.7063e+01 -6.1984e+01 -5.6882e+01 -5.3152e+01 -5.7064e+01 -6.1985e+01 -5.6873e+01 -5.3159e+01 -5.7064e+01 -6.1984e+01 -5.6864e+01 -5.3166e+01 -5.7064e+01 -6.1984e+01 -5.6854e+01 -5.3173e+01 -5.7073e+01 -6.1992e+01 -5.6845e+01 -5.3179e+01 -5.7117e+01 -6.2034e+01 -5.6836e+01 -5.3185e+01 -5.7160e+01 -6.2076e+01 -5.6826e+01 -5.3191e+01 -5.7202e+01 -6.2116e+01 -5.6816e+01 -5.3197e+01 -5.7243e+01 -6.2155e+01 -5.6806e+01 -5.3203e+01 -5.7283e+01 -6.2193e+01 -5.6796e+01 -5.3208e+01 -5.7323e+01 -6.2229e+01 -5.6786e+01 -5.3213e+01 -5.7361e+01 -6.2264e+01 -5.6776e+01 -5.3218e+01 -5.7398e+01 -6.2299e+01 -5.6766e+01 -5.3223e+01 -5.7435e+01 -6.2332e+01 -5.6750e+01 -5.3228e+01 -5.7471e+01 -6.2363e+01 -5.6732e+01 -5.3232e+01 -5.7505e+01 -6.2394e+01 -5.6711e+01 -5.3236e+01 -5.7539e+01 -6.2424e+01 -5.6685e+01 -5.3246e+01 -5.7572e+01 -6.2452e+01 -5.6659e+01 -5.3294e+01 -5.7605e+01 -6.2480e+01 -5.6633e+01 -5.3342e+01 -5.7636e+01 -6.2506e+01 -5.6608e+01 -5.3388e+01 -5.7659e+01 -6.2532e+01 -5.6583e+01 -5.3434e+01 -5.7681e+01 -6.2556e+01 -5.6558e+01 -5.3479e+01 -5.7702e+01 -6.2580e+01 -5.6533e+01 -5.3523e+01 -5.7723e+01 -6.2602e+01 -5.6509e+01 -5.3567e+01 -5.7743e+01 -6.2623e+01 -5.6484e+01 -5.3609e+01 -5.7763e+01 -6.2644e+01 -5.6460e+01 -5.3651e+01 -5.7781e+01 -6.2663e+01 -5.6437e+01 -5.3692e+01 -5.7791e+01 -6.2682e+01 -5.6413e+01 -5.3732e+01 -5.7801e+01 -6.2699e+01 -5.6390e+01 -5.3772e+01 -5.7811e+01 -6.2716e+01 -5.6366e+01 -5.3811e+01 -5.7820e+01 -6.2732e+01 -5.6343e+01 -5.3848e+01 -5.7829e+01 -6.2746e+01 -5.6321e+01 -5.3896e+01 -5.7838e+01 -6.2760e+01 -5.6298e+01 -5.3977e+01 -5.7846e+01 -6.2773e+01 -5.6275e+01 -5.4056e+01 -5.7854e+01 -6.2786e+01 -5.6253e+01 -5.4134e+01 -5.7862e+01 -6.2797e+01 -5.6231e+01 -5.4211e+01 -5.7869e+01 -6.2807e+01 -5.6209e+01 -5.4287e+01 -5.7875e+01 -6.2817e+01 -5.6187e+01 -5.4361e+01 -5.7882e+01 -6.2826e+01 -5.6165e+01 -5.4434e+01 -5.7888e+01 -6.2834e+01 -5.6139e+01 -5.4505e+01 -5.7895e+01 -6.2841e+01 -5.6109e+01 -5.4575e+01 -5.7939e+01 -6.2848e+01 -5.6080e+01 -5.4644e+01 -5.7980e+01 -6.2853e+01 -5.6052e+01 -5.4712e+01 -5.8020e+01 -6.2858e+01 -5.6023e+01 -5.4778e+01 -5.8060e+01 -6.2863e+01 -5.5995e+01 -5.4844e+01 -5.8098e+01 -6.2866e+01 -5.5967e+01 -5.4908e+01 -5.8136e+01 -6.2869e+01 -5.5940e+01 -5.4970e+01 -5.8173e+01 -6.2871e+01 -5.5912e+01 -5.5032e+01 -5.8209e+01 -6.2872e+01 -5.5885e+01 -5.5092e+01 -5.8244e+01 -6.2905e+01 -5.5859e+01 -5.5152e+01 -5.8270e+01 -6.2949e+01 -5.5832e+01 -5.5210e+01 -5.8297e+01 -6.2992e+01 -5.5806e+01 -5.5265e+01 -5.8322e+01 -6.3034e+01 -5.5780e+01 -5.5313e+01 -5.8347e+01 -6.3074e+01 -5.5754e+01 -5.5360e+01 -5.8371e+01 -6.3113e+01 -5.5729e+01 -5.5406e+01 -5.8395e+01 -6.3149e+01 -5.5703e+01 -5.5451e+01 -5.8418e+01 -6.3172e+01 -5.5678e+01 -5.5495e+01 -5.8441e+01 -6.3191e+01 -5.5653e+01 -5.5539e+01 -5.8479e+01 -6.3210e+01 -5.5629e+01 -5.5581e+01 -5.8537e+01 -6.3228e+01 -5.5604e+01 -5.5623e+01 -5.8594e+01 -6.3245e+01 -5.5580e+01 -5.5664e+01 -5.8650e+01 -6.3261e+01 -5.5556e+01 -5.5704e+01 -5.8705e+01 -6.3276e+01 -5.5532e+01 -5.5743e+01 -5.8759e+01 -6.3291e+01 -5.5508e+01 -5.5814e+01 -5.8812e+01 -6.3305e+01 -5.5485e+01 -5.5896e+01 -5.8864e+01 -6.3318e+01 -5.5462e+01 -5.5976e+01 -5.8915e+01 -6.3330e+01 -5.5438e+01 -5.6055e+01 -5.8965e+01 -6.3342e+01 -5.5416e+01 -5.6132e+01 -5.9014e+01 -6.3353e+01 -5.5393e+01 -5.6208e+01 -5.9062e+01 -6.3359e+01 -5.5370e+01 -5.6283e+01 -5.9109e+01 -6.3360e+01 -5.5348e+01 -5.6356e+01 -5.9155e+01 -6.3361e+01 -5.5325e+01 -5.6428e+01 -5.9200e+01 -6.3362e+01 -5.5303e+01 -5.6498e+01 -5.9244e+01 -6.3362e+01 -5.5281e+01 -5.6567e+01 -5.9288e+01 -6.3361e+01 -5.5259e+01 -5.6635e+01 -5.9330e+01 -6.3360e+01 -5.5237e+01 -5.6701e+01 -5.9371e+01 -6.3358e+01 -5.5216e+01 -5.6766e+01 -5.9412e+01 -6.3356e+01 -5.5194e+01 -5.6830e+01 -5.9452e+01 -6.3353e+01 -5.5173e+01 -5.6893e+01 -5.9490e+01 -6.3350e+01 -5.5152e+01 -5.6954e+01 -5.9528e+01 -6.3346e+01 -5.5130e+01 -5.7014e+01 -5.9565e+01 -6.3342e+01 -5.5109e+01 -5.7073e+01 -5.9601e+01 -6.3337e+01 -5.5088e+01 -5.7131e+01 -5.9636e+01 -6.3332e+01 -5.5068e+01 -5.7187e+01 -5.9671e+01 -6.3326e+01 -5.5047e+01 -5.7243e+01 -5.9704e+01 -6.3320e+01 -5.5026e+01 -5.7297e+01 -5.9737e+01 -6.3314e+01 -5.5006e+01 -5.7350e+01 -5.9769e+01 -6.3307e+01 -5.4986e+01 -5.7402e+01 -5.9800e+01 -6.3304e+01 -5.4965e+01 -5.7452e+01 -5.9826e+01 -6.3341e+01 -5.4945e+01 -5.7502e+01 -5.9847e+01 -6.3377e+01 -5.4925e+01 -5.7550e+01 -5.9868e+01 -6.3411e+01 -5.4905e+01 -5.7598e+01 -5.9888e+01 -6.3444e+01 -5.4885e+01 -5.7644e+01 -5.9908e+01 -6.3477e+01 -5.4865e+01 -5.7689e+01 -5.9927e+01 -6.3508e+01 -5.4846e+01 -5.7734e+01 -5.9946e+01 -6.3538e+01 -5.4826e+01 -5.7777e+01 -5.9963e+01 -6.3567e+01 -5.4807e+01 -5.7819e+01 -5.9981e+01 -6.3595e+01 -5.4787e+01 -5.7860e+01 -5.9997e+01 -6.3622e+01 -5.4768e+01 -5.7900e+01 -6.0013e+01 -6.3674e+01 -5.4748e+01 -5.7939e+01 -6.0029e+01 -6.3744e+01 -5.4729e+01 -5.7977e+01 -6.0044e+01 -6.3811e+01 -5.4710e+01 -5.8014e+01 -6.0058e+01 -6.3877e+01 -5.4691e+01 -5.8050e+01 -6.0072e+01 -6.3942e+01 -5.4672e+01 -5.8086e+01 -6.0085e+01 -6.4004e+01 -5.4653e+01 -5.8120e+01 -6.0098e+01 -6.4066e+01 -5.4634e+01 -5.8153e+01 -6.0110e+01 -6.4125e+01 -5.4615e+01 -5.8186e+01 -6.0122e+01 -6.4183e+01 -5.4596e+01 -5.8217e+01 -6.0133e+01 -6.4240e+01 -5.4578e+01 -5.8248e+01 -6.0143e+01 -6.4295e+01 -5.4559e+01 -5.8278e+01 -6.0153e+01 -6.4349e+01 -5.4541e+01 -5.8307e+01 -6.0162e+01 -6.4401e+01 -5.4522e+01 -5.8327e+01 -6.0171e+01 -6.4451e+01 -5.4504e+01 -5.8347e+01 -6.0179e+01 -6.4501e+01 -5.4485e+01 -5.8365e+01 -6.0187e+01 -6.4548e+01 -5.4467e+01 -5.8384e+01 -6.0195e+01 -6.4595e+01 -5.4449e+01 -5.8401e+01 -6.0201e+01 -6.4640e+01 -5.4431e+01 -5.8418e+01 -6.0208e+01 -6.4684e+01 -5.4412e+01 -5.8426e+01 -6.0213e+01 -6.4726e+01 -5.4394e+01 -5.8434e+01 -6.0219e+01 -6.4767e+01 -5.4376e+01 -5.8442e+01 -6.0223e+01 -6.4807e+01 -5.4358e+01 -5.8449e+01 -6.0228e+01 -6.4845e+01 -5.4340e+01 -5.8455e+01 -6.0231e+01 -6.4882e+01 -5.4322e+01 -5.8462e+01 -6.0235e+01 -6.4918e+01 -5.4305e+01 -5.8463e+01 -6.0237e+01 -6.4952e+01 -5.4287e+01 -5.8461e+01 -6.0240e+01 -6.4986e+01 -5.4269e+01 -5.8458e+01 -6.0242e+01 -6.5018e+01 -5.4251e+01 -5.8455e+01 -6.0243e+01 -6.5049e+01 -5.4234e+01 -5.8452e+01 -6.0244e+01 -6.5079e+01 -5.4216e+01 -5.8449e+01 -6.0244e+01 -6.5107e+01 -5.4198e+01 -5.8446e+01 -6.0244e+01 -6.5130e+01 -5.4181e+01 -5.8442e+01 -6.0244e+01 -6.5148e+01 -5.4163e+01 -5.8438e+01 -6.0243e+01 -6.5166e+01 -5.4146e+01 -5.8434e+01 -6.0242e+01 -6.5182e+01 -5.4129e+01 -5.8430e+01 -6.0240e+01 -6.5198e+01 -5.4111e+01 -5.8425e+01 -6.0238e+01 -6.5212e+01 -5.4094e+01 -5.8421e+01 -6.0235e+01 -6.5226e+01 -5.4077e+01 -5.8416e+01 -6.0232e+01 -6.5239e+01 -5.4059e+01 -5.8411e+01 -6.0229e+01 -6.5251e+01 -5.4042e+01 -5.8405e+01 -6.0225e+01 -6.5262e+01 -5.4025e+01 -5.8400e+01 -6.0221e+01 -6.5272e+01 -5.4008e+01 -5.8394e+01 -6.0216e+01 -6.5282e+01 -5.3991e+01 -5.8388e+01 -6.0211e+01 -6.5290e+01 -5.3974e+01 -5.8382e+01 -6.0205e+01 -6.5298e+01 -5.3957e+01 -5.8376e+01 -6.0200e+01 -6.5345e+01 -5.3940e+01 -5.8369e+01 -6.0193e+01 -6.5396e+01 -5.3923e+01 -5.8362e+01 -6.0187e+01 -6.5444e+01 -5.3906e+01 -5.8355e+01 -6.0180e+01 -6.5492e+01 -5.3889e+01 -5.8348e+01 -6.0172e+01 -6.5538e+01 -5.3872e+01 -5.8341e+01 -6.0165e+01 -6.5582e+01 -5.3856e+01 -5.8333e+01 -6.0157e+01 -6.5625e+01 -5.3839e+01 -5.8325e+01 -6.0148e+01 -6.5667e+01 -5.3822e+01 -5.8317e+01 -6.0139e+01 -6.5707e+01 -5.3805e+01 -5.8309e+01 -6.0130e+01 -6.5746e+01 -5.3789e+01 -5.8301e+01 -6.0121e+01 -6.5784e+01 -5.3772e+01 -5.8292e+01 -6.0111e+01 -6.5820e+01 -5.3756e+01 -5.8283e+01 -6.0101e+01 -6.5856e+01 -5.3739e+01 -5.8274e+01 -6.0090e+01 -6.5889e+01 -5.3723e+01 -5.8265e+01 -6.0079e+01 -6.5922e+01 -5.3706e+01 -5.8255e+01 -6.0068e+01 -6.5953e+01 -5.3690e+01 -5.8246e+01 -6.0057e+01 -6.5984e+01 -5.3673e+01 -5.8236e+01 -6.0045e+01 -6.6012e+01 -5.3657e+01 -5.8226e+01 -6.0032e+01 -6.6040e+01 -5.3641e+01 -5.8216e+01 -6.0004e+01 -6.6067e+01 -5.3624e+01 -5.8202e+01 -5.9976e+01 -6.6092e+01 -5.3608e+01 -5.8183e+01 -5.9948e+01 -6.6116e+01 -5.3592e+01 -5.8209e+01 -5.9920e+01 -6.6139e+01 -5.3576e+01 -5.8235e+01 -5.9891e+01 -6.6161e+01 -5.3559e+01 -5.8259e+01 -5.9855e+01 -6.6182e+01 -5.3543e+01 -5.8284e+01 -5.9819e+01 -6.6202e+01 -5.3527e+01 -5.8307e+01 -5.9784e+01 -6.6220e+01 -5.3511e+01 -5.8330e+01 -5.9749e+01 -6.6238e+01 -5.3495e+01 -5.8352e+01 -5.9714e+01 -6.6254e+01 -5.3479e+01 -5.8374e+01 -5.9679e+01 -6.6270e+01 -5.3463e+01 -5.8395e+01 -5.9645e+01 -6.6284e+01 -5.3447e+01 -5.8415e+01 -5.9610e+01 -6.6298e+01 -5.3431e+01 -5.8435e+01 -5.9576e+01 -6.6310e+01 -5.3416e+01 -5.8454e+01 -5.9542e+01 -6.6315e+01 -5.3400e+01 -5.8465e+01 -5.9509e+01 -6.6317e+01 -5.3384e+01 -5.8475e+01 -5.9475e+01 -6.6319e+01 -5.3368e+01 -5.8485e+01 -5.9440e+01 -6.6320e+01 -5.3352e+01 -5.8494e+01 -5.9399e+01 -6.6321e+01 -5.3337e+01 -5.8503e+01 -5.9358e+01 -6.6320e+01 -5.3321e+01 -5.8511e+01 -5.9318e+01 -6.6319e+01 -5.3305e+01 -5.8519e+01 -5.9278e+01 -6.6317e+01 -5.3290e+01 -5.8527e+01 -5.9239e+01 -6.6315e+01 -5.3274e+01 -5.8534e+01 -5.9200e+01 -6.6312e+01 -5.3259e+01 -5.8541e+01 -5.9161e+01 -6.6308e+01 -5.3243e+01 -5.8547e+01 -5.9122e+01 -6.6303e+01 -5.3228e+01 -5.8554e+01 -5.9084e+01 -6.6298e+01 -5.3212e+01 -5.8559e+01 -5.9046e+01 -6.6292e+01 -5.3197e+01 -5.8565e+01 -5.9009e+01 -6.6283e+01 -5.3181e+01 -5.8569e+01 -5.8971e+01 -6.6268e+01 -5.3166e+01 -5.8574e+01 -5.8934e+01 -6.6252e+01 -5.3151e+01 -5.8578e+01 -5.8898e+01 -6.6236e+01 -5.3136e+01 -5.8582e+01 -5.8861e+01 -6.6219e+01 -5.3120e+01 -5.8585e+01 -5.8825e+01 -6.6202e+01 -5.3105e+01 -5.8588e+01 -5.8789e+01 -6.6185e+01 -5.3090e+01 -5.8591e+01 -5.8754e+01 -6.6167e+01 -5.3074e+01 -5.8593e+01 -5.8718e+01 -6.6142e+01 -5.3051e+01 -5.8595e+01 -5.8683e+01 -6.6116e+01 -5.3028e+01 -5.8594e+01 -5.8649e+01 -6.6089e+01 -5.3006e+01 -5.8587e+01 -5.8614e+01 -6.6062e+01 -5.2983e+01 -5.8580e+01 -5.8579e+01 -6.6035e+01 -5.2961e+01 -5.8573e+01 -5.8545e+01 -6.6007e+01 -5.2939e+01 -5.8566e+01 -5.8511e+01 -6.5979e+01 -5.2917e+01 -5.8559e+01 -5.8478e+01 -6.5951e+01 -5.2896e+01 -5.8551e+01 -5.8444e+01 -6.5923e+01 -5.2874e+01 -5.8543e+01 -5.8411e+01 -6.5895e+01 -5.2853e+01 -5.8535e+01 -5.8378e+01 -6.5866e+01 -5.2832e+01 -5.8527e+01 -5.8345e+01 -6.5837e+01 -5.2812e+01 -5.8519e+01 -5.8312e+01 -6.5808e+01 -5.2791e+01 -5.8511e+01 -5.8279e+01 -6.5774e+01 -5.2771e+01 -5.8502e+01 -5.8247e+01 -6.5737e+01 -5.2745e+01 -5.8493e+01 -5.8215e+01 -6.5699e+01 -5.2717e+01 -5.8485e+01 -5.8183e+01 -6.5658e+01 -5.2689e+01 -5.8476e+01 -5.8151e+01 -6.5612e+01 -5.2657e+01 -5.8466e+01 -5.8119e+01 -6.5567e+01 -5.2622e+01 -5.8457e+01 -5.8087e+01 -6.5522e+01 -5.2588e+01 -5.8447e+01 -5.8056e+01 -6.5477e+01 -5.2555e+01 -5.8429e+01 -5.8025e+01 -6.5433e+01 -5.2522e+01 -5.8412e+01 -5.7994e+01 -6.5388e+01 -5.2489e+01 -5.8394e+01 -5.7963e+01 -6.5344e+01 -5.2457e+01 -5.8376e+01 -5.7932e+01 -6.5299e+01 -5.2426e+01 -5.8359e+01 -5.7901e+01 -6.5255e+01 -5.2395e+01 -5.8341e+01 -5.7871e+01 -6.5211e+01 -5.2364e+01 -5.8323e+01 -5.7840e+01 -6.5167e+01 -5.2334e+01 -5.8306e+01 -5.7810e+01 -6.5123e+01 -5.2304e+01 -5.8288e+01 -5.7780e+01 -6.5080e+01 -5.2275e+01 -5.8270e+01 -5.7750e+01 -6.5036e+01 -5.2247e+01 -5.8253e+01 -5.7720e+01 -6.4993e+01 -5.2218e+01 -5.8235e+01 -5.7690e+01 -6.4949e+01 -5.2190e+01 -5.8217e+01 -5.7661e+01 -6.4906e+01 -5.2163e+01 -5.8199e+01 -5.7631e+01 -6.4862e+01 -5.2136e+01 -5.8182e+01 -5.7602e+01 -6.4811e+01 -5.2096e+01 -5.8164e+01 -5.7572e+01 -6.4760e+01 -5.2054e+01 -5.8146e+01 -5.7543e+01 -6.4710e+01 -5.2013e+01 -5.8128e+01 -5.7514e+01 -6.4667e+01 -5.1972e+01 -5.8111e+01 -5.7485e+01 -6.4661e+01 -5.1933e+01 -5.8093e+01 -5.7456e+01 -6.4655e+01 -5.1894e+01 -5.8075e+01 -5.7427e+01 -6.4649e+01 -5.1856e+01 -5.8057e+01 -5.7399e+01 -6.4642e+01 -5.1818e+01 -5.8039e+01 -5.7370e+01 -6.4635e+01 -5.1781e+01 -5.8021e+01 -5.7342e+01 -6.4628e+01 -5.1745e+01 -5.8003e+01 -5.7313e+01 -6.4620e+01 -5.1710e+01 -5.7985e+01 -5.7285e+01 -6.4611e+01 -5.1675e+01 -5.7967e+01 -5.7257e+01 -6.4602e+01 -5.1641e+01 -5.7949e+01 -5.7229e+01 -6.4593e+01 -5.1607e+01 -5.7931e+01 -5.7201e+01 -6.4583e+01 -5.1574e+01 -5.7912e+01 -5.7173e+01 -6.4573e+01 -5.1542e+01 -5.7894e+01 -5.7145e+01 -6.4563e+01 -5.1510e+01 -5.7876e+01 -5.7117e+01 -6.4552e+01 -5.1479e+01 -5.7858e+01 -5.7089e+01 -6.4541e+01 -5.1448e+01 -5.7839e+01 -5.7062e+01 -6.4529e+01 -5.1418e+01 -5.7821e+01 -5.7034e+01 -6.4517e+01 -5.1418e+01 -5.7802e+01 -5.7007e+01 -6.4505e+01 -5.1433e+01 -5.7784e+01 -5.6979e+01 -6.4492e+01 -5.1448e+01 -5.7765e+01 -5.6952e+01 -6.4479e+01 -5.1463e+01 -5.7747e+01 -5.6925e+01 -6.4466e+01 -5.1478e+01 -5.7728e+01 -5.6897e+01 -6.4497e+01 -5.1492e+01 -5.7709e+01 -5.6867e+01 -6.4526e+01 -5.1507e+01 -5.7690e+01 -5.6832e+01 -6.4555e+01 -5.1521e+01 -5.7672e+01 -5.6797e+01 -6.4582e+01 -5.1535e+01 -5.7653e+01 -5.6763e+01 -6.4609e+01 -5.1549e+01 -5.7634e+01 -5.6729e+01 -6.4635e+01 -5.1563e+01 -5.7615e+01 -5.6695e+01 -6.4659e+01 -5.1577e+01 -5.7596e+01 -5.6661e+01 -6.4683e+01 -5.1590e+01 -5.7577e+01 -5.6628e+01 -6.4704e+01 -5.1604e+01 -5.7552e+01 -5.6595e+01 -6.4718e+01 -5.1617e+01 -5.7525e+01 -5.6562e+01 -6.4731e+01 -5.1630e+01 -5.7498e+01 -5.6529e+01 -6.4743e+01 -5.1643e+01 -5.7471e+01 -5.6497e+01 -6.4754e+01 -5.1655e+01 -5.7444e+01 -5.6464e+01 -6.4765e+01 -5.1668e+01 -5.7418e+01 -5.6432e+01 -6.4775e+01 -5.1680e+01 -5.7391e+01 -5.6401e+01 -6.4784e+01 -5.1692e+01 -5.7365e+01 -5.6369e+01 -6.4793e+01 -5.1704e+01 -5.7339e+01 -5.6338e+01 -6.4801e+01 -5.1716e+01 -5.7313e+01 -5.6306e+01 -6.4808e+01 -5.1728e+01 -5.7287e+01 -5.6275e+01 -6.4814e+01 -5.1739e+01 -5.7261e+01 -5.6245e+01 -6.4820e+01 -5.1749e+01 -5.7236e+01 -5.6214e+01 -6.4825e+01 -5.1752e+01 -5.7210e+01 -5.6184e+01 -6.4830e+01 -5.1755e+01 -5.7185e+01 -5.6153e+01 -6.4833e+01 -5.1758e+01 -5.7159e+01 -5.6123e+01 -6.4836e+01 -5.1761e+01 -5.7134e+01 -5.6094e+01 -6.4839e+01 -5.1765e+01 -5.7108e+01 -5.6064e+01 -6.4841e+01 -5.1768e+01 -5.7075e+01 -5.6034e+01 -6.4842e+01 -5.1771e+01 -5.7042e+01 -5.6005e+01 -6.4842e+01 -5.1774e+01 -5.7010e+01 -5.5976e+01 -6.4842e+01 -5.1777e+01 -5.6977e+01 -5.5947e+01 -6.4841e+01 -5.1781e+01 -5.6945e+01 -5.5918e+01 -6.4840e+01 -5.1784e+01 -5.6914e+01 -5.5889e+01 -6.4838e+01 -5.1787e+01 -5.6882e+01 -5.5860e+01 -6.4835e+01 -5.1790e+01 -5.6845e+01 -5.5824e+01 -6.4832e+01 -5.1793e+01 -5.6806e+01 -5.5788e+01 -6.4828e+01 -5.1796e+01 -5.6767e+01 -5.5752e+01 -6.4823e+01 -5.1799e+01 -5.6730e+01 -5.5717e+01 -6.4818e+01 -5.1802e+01 -5.6692e+01 -5.5682e+01 -6.4813e+01 -5.1805e+01 -5.6655e+01 -5.5647e+01 -6.4807e+01 -5.1808e+01 -5.6618e+01 -5.5613e+01 -6.4800e+01 -5.1811e+01 -5.6582e+01 -5.5579e+01 -6.4793e+01 -5.1814e+01 -5.6546e+01 -5.5545e+01 -6.4785e+01 -5.1816e+01 -5.6510e+01 -5.5512e+01 -6.4776e+01 -5.1819e+01 -5.6475e+01 -5.5479e+01 -6.4767e+01 -5.1822e+01 -5.6440e+01 -5.5446e+01 -6.4758e+01 -5.1824e+01 -5.6406e+01 -5.5414e+01 -6.4748e+01 -5.1827e+01 -5.6372e+01 -5.5382e+01 -6.4737e+01 -5.1829e+01 -5.6332e+01 -5.5350e+01 -6.4726e+01 -5.1824e+01 -5.6291e+01 -5.5318e+01 -6.4715e+01 -5.1811e+01 -5.6250e+01 -5.5287e+01 -6.4703e+01 -5.1798e+01 -5.6210e+01 -5.5256e+01 -6.4719e+01 -5.1785e+01 -5.6170e+01 -5.5225e+01 -6.4750e+01 -5.1773e+01 -5.6130e+01 -5.5191e+01 -6.4780e+01 -5.1761e+01 -5.6092e+01 -5.5153e+01 -6.4809e+01 -5.1749e+01 -5.6052e+01 -5.5115e+01 -6.4837e+01 -5.1737e+01 -5.6006e+01 -5.5078e+01 -6.4864e+01 -5.1726e+01 -5.5961e+01 -5.5041e+01 -6.4889e+01 -5.1715e+01 -5.5916e+01 -5.5004e+01 -6.4914e+01 -5.1704e+01 -5.5872e+01 -5.4968e+01 -6.4937e+01 -5.1688e+01 -5.5829e+01 -5.4932e+01 -6.4960e+01 -5.1670e+01 -5.5786e+01 -5.4897e+01 -6.4981e+01 -5.1652e+01 -5.5744e+01 -5.4862e+01 -6.5001e+01 -5.1635e+01 -5.5702e+01 -5.4828e+01 -6.5020e+01 -5.1614e+01 -5.5661e+01 -5.4793e+01 -6.5039e+01 -5.1584e+01 -5.5620e+01 -5.4760e+01 -6.5056e+01 -5.1552e+01 -5.5580e+01 -5.4726e+01 -6.5072e+01 -5.1521e+01 -5.5541e+01 -5.4693e+01 -6.5088e+01 -5.1491e+01 -5.5502e+01 -5.4660e+01 -6.5102e+01 -5.1462e+01 -5.5463e+01 -5.4628e+01 -6.5116e+01 -5.1433e+01 -5.5425e+01 -5.4596e+01 -6.5128e+01 -5.1405e+01 -5.5387e+01 -5.4564e+01 -6.5140e+01 -5.1378e+01 -5.5350e+01 -5.4533e+01 -6.5150e+01 -5.1351e+01 -5.5314e+01 -5.4500e+01 -6.5160e+01 -5.1319e+01 -5.5277e+01 -5.4461e+01 -6.5169e+01 -5.1285e+01 -5.5242e+01 -5.4423e+01 -6.5177e+01 -5.1253e+01 -5.5206e+01 -5.4385e+01 -6.5184e+01 -5.1221e+01 -5.5171e+01 -5.4348e+01 -6.5191e+01 -5.1191e+01 -5.5137e+01 -5.4311e+01 -6.5196e+01 -5.1160e+01 -5.5103e+01 -5.4274e+01 -6.5201e+01 -5.1127e+01 -5.5069e+01 -5.4239e+01 -6.5204e+01 -5.1090e+01 -5.5036e+01 -5.4203e+01 -6.5208e+01 -5.1055e+01 -5.5003e+01 -5.4168e+01 -6.5210e+01 -5.1020e+01 -5.4970e+01 -5.4134e+01 -6.5206e+01 -5.0986e+01 -5.4938e+01 -5.4100e+01 -6.5197e+01 -5.0953e+01 -5.4906e+01 -5.4066e+01 -6.5181e+01 -5.0921e+01 -5.4866e+01 -5.4033e+01 -6.5165e+01 -5.0889e+01 -5.4827e+01 -5.4000e+01 -6.5149e+01 -5.0859e+01 -5.4789e+01 -5.3967e+01 -6.5132e+01 -5.0829e+01 -5.4751e+01 -5.3935e+01 -6.5115e+01 -5.0800e+01 -5.4714e+01 -5.3903e+01 -6.5097e+01 -5.0771e+01 -5.4677e+01 -5.3872e+01 -6.5079e+01 -5.0744e+01 -5.4641e+01 -5.3841e+01 -6.5061e+01 -5.0717e+01 -5.4605e+01 -5.3810e+01 -6.5043e+01 -5.0690e+01 -5.4569e+01 -5.3780e+01 -6.5024e+01 -5.0665e+01 -5.4534e+01 -5.3750e+01 -6.5005e+01 -5.0640e+01 -5.4500e+01 -5.3721e+01 -6.4985e+01 -5.0615e+01 -5.4466e+01 -5.3692e+01 -6.4965e+01 -5.0592e+01 -5.4432e+01 -5.3702e+01 -6.4945e+01 -5.0568e+01 -5.4399e+01 -5.3709e+01 -6.4924e+01 -5.0546e+01 -5.4366e+01 -5.3717e+01 -6.4903e+01 -5.0524e+01 -5.4345e+01 -5.3724e+01 -6.4882e+01 -5.0502e+01 -5.4357e+01 -5.3731e+01 -6.4860e+01 -5.0482e+01 -5.4369e+01 -5.3738e+01 -6.4839e+01 -5.0461e+01 -5.4381e+01 -5.3745e+01 -6.4816e+01 -5.0441e+01 -5.4393e+01 -5.3752e+01 -6.4794e+01 -5.0422e+01 -5.4405e+01 -5.3758e+01 -6.4771e+01 -5.0403e+01 -5.4416e+01 -5.3764e+01 -6.4748e+01 -5.0385e+01 -5.4427e+01 -5.3770e+01 -6.4724e+01 -5.0367e+01 -5.4437e+01 -5.3776e+01 -6.4701e+01 -5.0349e+01 -5.4448e+01 -5.3782e+01 -6.4677e+01 -5.0333e+01 -5.4458e+01 -5.3788e+01 -6.4652e+01 -5.0316e+01 -5.4468e+01 -5.3793e+01 -6.4628e+01 -5.0300e+01 -5.4477e+01 -5.3799e+01 -6.4603e+01 -5.0284e+01 -5.4486e+01 -5.3804e+01 -6.4578e+01 -5.0269e+01 -5.4495e+01 -5.3809e+01 -6.4552e+01 -5.0254e+01 -5.4504e+01 -5.3814e+01 -6.4526e+01 -5.0240e+01 -5.4513e+01 -5.3818e+01 -6.4500e+01 -5.0225e+01 -5.4521e+01 -5.3823e+01 -6.4474e+01 -5.0212e+01 -5.4529e+01 -5.3827e+01 -6.4447e+01 -5.0195e+01 -5.4536e+01 -5.3831e+01 -6.4421e+01 -5.0174e+01 -5.4544e+01 -5.3835e+01 -6.4393e+01 -5.0154e+01 -5.4551e+01 -5.3839e+01 -6.4366e+01 -5.0134e+01 -5.4558e+01 -5.3843e+01 -6.4338e+01 -5.0115e+01 -5.4564e+01 -5.3846e+01 -6.4311e+01 -5.0096e+01 -5.4571e+01 -5.3849e+01 -6.4282e+01 -5.0077e+01 -5.4577e+01 -5.3852e+01 -6.4254e+01 -5.0060e+01 -5.4583e+01 -5.3855e+01 -6.4225e+01 -5.0042e+01 -5.4588e+01 -5.3858e+01 -6.4195e+01 -5.0025e+01 -5.4594e+01 -5.3861e+01 -6.4158e+01 -5.0008e+01 -5.4599e+01 -5.3879e+01 -6.4120e+01 -1.0000e+01 -5.4604e+01 -5.3918e+01 -6.4083e+01 -6.0000e+01 -5.4608e+01 -5.3956e+01 -6.4046e+01 -6.0000e+01 -5.4613e+01 -5.3994e+01 -6.4009e+01 -6.0000e+01 -5.4617e+01 -5.4030e+01 -6.3972e+01 -6.0000e+01 -5.4621e+01 -5.4067e+01 -6.3934e+01 -6.0000e+01 -5.4618e+01 -5.4102e+01 -6.3897e+01 -6.0000e+01 -5.4614e+01 -5.4137e+01 -6.3860e+01 -6.0000e+01 -5.4609e+01 -5.4171e+01 -6.3822e+01 -6.0000e+01 -5.4605e+01 -5.4205e+01 -6.3785e+01 -6.0000e+01 -5.4600e+01 -5.4238e+01 -6.3747e+01 -6.0000e+01 -5.4595e+01 -5.4271e+01 -6.3710e+01 -6.0000e+01 -5.4591e+01 -5.4303e+01 -6.3672e+01 -6.0000e+01 -5.4586e+01 -5.4334e+01 -6.3635e+01 -6.0000e+01 -5.4581e+01 -5.4365e+01 -6.3597e+01 -6.0000e+01 -5.4576e+01 -5.4395e+01 -6.3559e+01 -6.0000e+01 -5.4571e+01 -5.4424e+01 -6.3521e+01 -6.0000e+01 -5.4566e+01 -5.4453e+01 -6.3484e+01 -6.0000e+01 -5.4561e+01 -5.4482e+01 -6.3446e+01 -6.0000e+01 -5.4556e+01 -5.4510e+01 -6.3408e+01 -6.0000e+01 -5.4551e+01 -5.4537e+01 -6.3370e+01 -6.0000e+01 -5.4545e+01 -5.4564e+01 -6.3332e+01 -6.0000e+01 -5.4535e+01 -5.4590e+01 -6.3294e+01 -6.0000e+01 -5.4522e+01 -5.4616e+01 -6.3256e+01 -6.0000e+01 -5.4509e+01 -5.4641e+01 -6.3218e+01 -6.0000e+01 -5.4495e+01 -5.4665e+01 -6.3180e+01 -6.0000e+01 -5.4482e+01 -5.4689e+01 -6.3142e+01 -6.0000e+01 -5.4470e+01 -5.4713e+01 -6.3103e+01 -6.0000e+01 -5.4457e+01 -5.4736e+01 -6.3064e+01 -6.0000e+01 -5.4444e+01 -5.4758e+01 -6.3017e+01 -6.0000e+01 -5.4432e+01 -5.4780e+01 -6.2971e+01 -6.0000e+01 -5.4419e+01 -5.4802e+01 -6.2925e+01 -6.0000e+01 -5.4407e+01 -5.4823e+01 -6.2880e+01 -6.0000e+01 -5.4394e+01 -5.4843e+01 -6.2828e+01 -6.0000e+01 -5.4382e+01 -5.4863e+01 -6.2775e+01 -6.0000e+01 -5.4370e+01 -5.4878e+01 -6.2722e+01 -6.0000e+01 -5.4358e+01 -5.4889e+01 -6.2669e+01 -6.0000e+01 -5.4346e+01 -5.4899e+01 -6.2617e+01 -6.0000e+01 -5.4334e+01 -5.4910e+01 -6.2565e+01 -6.0000e+01 -5.4322e+01 -5.4920e+01 -6.2513e+01 -6.0000e+01 -5.4310e+01 -5.4930e+01 -6.2462e+01 -6.0000e+01 -5.4298e+01 -5.4940e+01 -6.2411e+01 -6.0000e+01 -5.4287e+01 -5.4949e+01 -6.2360e+01 -6.0000e+01 -5.4275e+01 -5.4958e+01 -6.2310e+01 -6.0000e+01 -5.4263e+01 -5.4967e+01 -6.2259e+01 -6.0000e+01 -5.4252e+01 -5.4975e+01 -6.2209e+01 -6.0000e+01 -5.4240e+01 -5.4983e+01 -6.2160e+01 -6.0000e+01 -5.4229e+01 -5.4991e+01 -6.2110e+01 -6.0000e+01 -5.4217e+01 -5.4999e+01 -6.2061e+01 -6.0000e+01 -5.4206e+01 -5.5006e+01 -6.2012e+01 -6.0000e+01 -5.4194e+01 -5.5013e+01 -6.1964e+01 -5.9986e+01 -5.4183e+01 -5.5016e+01 -6.1915e+01 -5.9957e+01 -5.4174e+01 -5.5014e+01 -6.1867e+01 -5.9927e+01 -5.4208e+01 -5.5013e+01 -6.1819e+01 -5.9898e+01 -5.4240e+01 -5.5011e+01 -6.1764e+01 -5.9869e+01 -5.4272e+01 -5.5010e+01 -6.1709e+01 -5.9840e+01 -5.4304e+01 -5.5008e+01 -6.1654e+01 -5.9810e+01 -5.4334e+01 -5.5006e+01 -6.1600e+01 -5.9781e+01 -5.4365e+01 -5.5004e+01 -6.1546e+01 -5.9745e+01 -5.4394e+01 -5.5002e+01 -6.1492e+01 -5.9708e+01 -5.4423e+01 -5.5000e+01 -6.1439e+01 -5.9672e+01 -5.4451e+01 -5.4998e+01 -6.1386e+01 -5.9633e+01 -5.4479e+01 -5.4996e+01 -6.1334e+01 -5.9589e+01 -5.4506e+01 -5.4986e+01 -6.1281e+01 -5.9545e+01 -5.4525e+01 -5.4976e+01 -6.1230e+01 -5.9501e+01 -5.4543e+01 -5.4966e+01 -6.1178e+01 -5.9458e+01 -5.4561e+01 -5.4955e+01 -6.1127e+01 -5.9415e+01 -5.4578e+01 -5.4945e+01 -6.1077e+01 -5.9373e+01 -5.4594e+01 -5.4936e+01 -6.1026e+01 -5.9331e+01 -5.4603e+01 -5.4926e+01 -6.0976e+01 -5.9289e+01 -5.4611e+01 -5.4932e+01 -6.0926e+01 -5.9237e+01 -5.4619e+01 -5.4942e+01 -6.0877e+01 -5.9180e+01 -5.4627e+01 -5.4953e+01 -6.0828e+01 -5.9124e+01 -5.4635e+01 -5.4964e+01 -6.0779e+01 -5.9068e+01 -5.4643e+01 -5.4975e+01 -6.0731e+01 -5.9014e+01 -5.4651e+01 -5.4985e+01 -6.0683e+01 -5.8959e+01 -5.4658e+01 -5.4996e+01 -6.0635e+01 -5.8906e+01 -5.4665e+01 -5.5007e+01 -6.0587e+01 -5.8853e+01 -5.4672e+01 -5.5017e+01 -6.0540e+01 -5.8801e+01 -5.4679e+01 -5.5028e+01 -6.0493e+01 -5.8750e+01 -5.4685e+01 -5.5038e+01 -6.0446e+01 -5.8699e+01 -5.4692e+01 -5.5048e+01 -6.0399e+01 -5.8648e+01 -5.4698e+01 -5.5058e+01 -6.0353e+01 -5.8599e+01 -5.4704e+01 -5.5069e+01 -6.0307e+01 -5.8549e+01 -5.4710e+01 -5.5079e+01 -6.0261e+01 -5.8501e+01 -5.4715e+01 -5.5088e+01 -6.0216e+01 -5.8453e+01 -5.4721e+01 -5.5098e+01 -6.0171e+01 -5.8405e+01 -5.4726e+01 -5.5108e+01 -6.0126e+01 -5.8358e+01 -5.4731e+01 -5.5117e+01 -6.0081e+01 -5.8311e+01 -5.4736e+01 -5.5127e+01 -6.0036e+01 -5.8265e+01 -5.4740e+01 -5.5136e+01 -5.9992e+01 -5.8220e+01 -5.4744e+01 -5.5145e+01 -5.9948e+01 -5.8169e+01 -5.4749e+01 -5.5154e+01 -5.9904e+01 -5.8117e+01 -5.4753e+01 -5.5163e+01 -5.9861e+01 -5.8060e+01 -5.4756e+01 -5.5171e+01 -5.9817e+01 -5.8001e+01 -5.4760e+01 -5.5180e+01 -5.9774e+01 -5.7943e+01 -5.4763e+01 -5.5188e+01 -5.9731e+01 -5.7885e+01 -5.4766e+01 -5.5196e+01 -5.9688e+01 -5.7829e+01 -5.4769e+01 -5.5204e+01 -5.9646e+01 -5.7773e+01 -5.4772e+01 -5.5241e+01 -5.9596e+01 -5.7718e+01 -5.4775e+01 -5.5285e+01 -5.9569e+01 -5.7663e+01 -5.4777e+01 -5.5328e+01 -5.9564e+01 -5.7609e+01 -5.4779e+01 -5.5371e+01 -5.9558e+01 -5.7556e+01 -5.4781e+01 -5.5413e+01 -5.9581e+01 -5.7504e+01 -5.4783e+01 -5.5454e+01 -5.9619e+01 -5.7452e+01 -5.4784e+01 -5.5495e+01 -5.9657e+01 -5.7401e+01 -5.4786e+01 -5.5535e+01 -5.9693e+01 -5.7351e+01 -5.4787e+01 -5.5582e+01 -5.9728e+01 -5.7301e+01 -5.4788e+01 -5.5658e+01 -5.9763e+01 -5.7252e+01 -5.4789e+01 -5.5732e+01 -5.9796e+01 -5.7204e+01 -5.4789e+01 -5.5805e+01 -5.9829e+01 -5.7153e+01 -5.4790e+01 -5.5877e+01 -5.9861e+01 -5.7097e+01 -5.4790e+01 -5.5948e+01 -5.9892e+01 -5.7043e+01 -5.4790e+01 -5.6018e+01 -5.9922e+01 -5.6989e+01 -5.4790e+01 -5.6087e+01 -5.9951e+01 -5.6936e+01 -5.4789e+01 -5.6155e+01 -5.9979e+01 -5.6884e+01 -5.4789e+01 -5.6222e+01 -6.0006e+01 -5.6833e+01 -5.4788e+01 -5.6287e+01 -6.0033e+01 -5.6782e+01 -5.4787e+01 -5.6352e+01 -6.0059e+01 -5.6732e+01 -5.4786e+01 -5.6416e+01 -6.0084e+01 -5.6683e+01 -5.4784e+01 -5.6478e+01 -6.0108e+01 -5.6634e+01 -5.4783e+01 -5.6540e+01 -6.0131e+01 -5.6586e+01 -5.4781e+01 -5.6600e+01 -6.0154e+01 -5.6538e+01 -5.4779e+01 -5.6660e+01 -6.0176e+01 -5.6491e+01 -5.4777e+01 -5.6718e+01 -6.0197e+01 -5.6445e+01 -5.4775e+01 -5.6776e+01 -6.0217e+01 -5.6399e+01 -5.4772e+01 -5.6832e+01 -6.0237e+01 -5.6354e+01 -5.4770e+01 -5.6888e+01 -6.0256e+01 -5.6310e+01 -5.4767e+01 -5.6943e+01 -6.0274e+01 -5.6266e+01 -5.4764e+01 -5.6996e+01 -6.0291e+01 -5.6222e+01 -5.4761e+01 -5.7049e+01 -6.0308e+01 -5.6179e+01 -5.4758e+01 -5.7101e+01 -6.0323e+01 -5.6137e+01 -5.4754e+01 -5.7151e+01 -6.0339e+01 -5.6095e+01 -5.4751e+01 -5.7201e+01 -6.0353e+01 -5.6054e+01 -5.4747e+01 -5.7250e+01 -6.0367e+01 -5.6013e+01 -5.4743e+01 -5.7298e+01 -6.0380e+01 -5.5973e+01 -5.4739e+01 -5.7345e+01 -6.0392e+01 -5.5933e+01 -5.4734e+01 -5.7391e+01 -6.0404e+01 -5.5893e+01 -5.4730e+01 -5.7436e+01 -6.0415e+01 -5.5854e+01 -5.4725e+01 -5.7481e+01 -6.0426e+01 -5.5816e+01 -5.4720e+01 -5.7524e+01 -6.0435e+01 -5.5778e+01 -5.4715e+01 -5.7567e+01 -6.0445e+01 -5.5740e+01 -5.4710e+01 -5.7608e+01 -6.0453e+01 -5.5703e+01 -5.4705e+01 -5.7649e+01 -6.0461e+01 -5.5666e+01 -5.4700e+01 -5.7689e+01 -6.0468e+01 -5.5630e+01 -5.4694e+01 -5.7728e+01 -6.0475e+01 -5.5594e+01 -5.4688e+01 -5.7786e+01 -6.0481e+01 -5.5558e+01 -5.4683e+01 -5.7860e+01 -6.0487e+01 -5.5523e+01 -5.4677e+01 -5.7933e+01 -6.0492e+01 -5.5488e+01 -5.4670e+01 -5.8004e+01 -6.0496e+01 -5.5453e+01 -5.4664e+01 -5.8074e+01 -6.0500e+01 -5.5419e+01 -5.4651e+01 -5.8142e+01 -6.0503e+01 -5.5385e+01 -5.4635e+01 -5.8210e+01 -6.0506e+01 -5.5352e+01 -5.4610e+01 -5.8276e+01 -6.0508e+01 -5.5319e+01 -5.4580e+01 -5.8341e+01 -6.0509e+01 -5.5286e+01 -5.4551e+01 -5.8405e+01 -6.0510e+01 -5.5253e+01 -5.4522e+01 -5.8467e+01 -6.0511e+01 -5.5221e+01 -5.4493e+01 -5.8528e+01 -6.0511e+01 -5.5189e+01 -5.4465e+01 -5.8589e+01 -6.0510e+01 -5.5158e+01 -5.4437e+01 -5.8648e+01 -6.0509e+01 -5.5127e+01 -5.4409e+01 -5.8705e+01 -6.0507e+01 -5.5096e+01 -5.4382e+01 -5.8762e+01 -6.0505e+01 -5.5065e+01 -5.4355e+01 -5.8817e+01 -6.0503e+01 -5.5035e+01 -5.4329e+01 -5.8872e+01 -6.0500e+01 -5.5005e+01 -5.4303e+01 -5.8924e+01 -6.0496e+01 -5.4975e+01 -5.4277e+01 -5.8968e+01 -6.0492e+01 -5.4945e+01 -5.4252e+01 -5.9011e+01 -6.0488e+01 -5.4949e+01 -5.4227e+01 -5.9053e+01 -6.0483e+01 -5.4964e+01 -5.4202e+01 -5.9095e+01 -6.0478e+01 -5.4979e+01 -5.4178e+01 -5.9135e+01 -6.0483e+01 -5.4993e+01 -5.4154e+01 -5.9175e+01 -6.0521e+01 -5.5007e+01 -5.4130e+01 -5.9214e+01 -6.0553e+01 -5.5021e+01 -5.4107e+01 -5.9252e+01 -6.0581e+01 -5.5034e+01 -5.4083e+01 -5.9289e+01 -6.0608e+01 -5.5047e+01 -5.4061e+01 -5.9325e+01 -6.0635e+01 -5.5059e+01 -5.4038e+01 -5.9360e+01 -6.0660e+01 -5.5071e+01 -5.4016e+01 -5.9395e+01 -6.0685e+01 -5.5083e+01 -5.3993e+01 -5.9429e+01 -6.0709e+01 -5.5094e+01 -5.3972e+01 -5.9462e+01 -6.0732e+01 -5.5105e+01 -5.3950e+01 -5.9494e+01 -6.0754e+01 -5.5115e+01 -5.3929e+01 -5.9525e+01 -6.0776e+01 -5.5125e+01 -5.3907e+01 -5.9555e+01 -6.0796e+01 -5.5135e+01 -5.3886e+01 -5.9585e+01 -6.0816e+01 -5.5145e+01 -5.3866e+01 -5.9614e+01 -6.0835e+01 -5.5154e+01 -5.3845e+01 -5.9642e+01 -6.0854e+01 -5.5162e+01 -5.3825e+01 -5.9669e+01 -6.0871e+01 -5.5171e+01 -5.3805e+01 -5.9696e+01 -6.0888e+01 -5.5179e+01 -5.3785e+01 -5.9721e+01 -6.0904e+01 -5.5184e+01 -5.3766e+01 -5.9746e+01 -6.0919e+01 -5.5183e+01 -5.3746e+01 -5.9771e+01 -6.0934e+01 -5.5182e+01 -5.3727e+01 -5.9794e+01 -6.0948e+01 -5.5181e+01 -5.3708e+01 -5.9817e+01 -6.0961e+01 -5.5180e+01 -5.3689e+01 -5.9839e+01 -6.0973e+01 -5.5179e+01 -5.3670e+01 -5.9860e+01 -6.0985e+01 -5.5178e+01 -5.3652e+01 -5.9881e+01 -6.0996e+01 -5.5176e+01 -5.3633e+01 -5.9901e+01 -6.1006e+01 -5.5174e+01 -5.3615e+01 -5.9920e+01 -6.1016e+01 -5.5173e+01 -5.3597e+01 -5.9938e+01 -6.1025e+01 -5.5171e+01 -5.3579e+01 -5.9956e+01 -6.1033e+01 -5.5169e+01 -5.3561e+01 -5.9973e+01 -6.1041e+01 -5.5166e+01 -5.3544e+01 -5.9990e+01 -6.1048e+01 -5.5164e+01 -5.3526e+01 -6.0006e+01 -6.1054e+01 -5.5161e+01 -5.3509e+01 -6.0021e+01 -6.1060e+01 -5.5159e+01 -5.3492e+01 -6.0035e+01 -6.1065e+01 -5.5156e+01 -5.3475e+01 -6.0049e+01 -6.1069e+01 -5.5153e+01 -5.3458e+01 -6.0062e+01 -6.1073e+01 -5.5150e+01 -5.3441e+01 -6.0075e+01 -6.1077e+01 -5.5146e+01 -5.3424e+01 -6.0087e+01 -6.1079e+01 -5.5143e+01 -5.3408e+01 -6.0098e+01 -6.1082e+01 -5.5139e+01 -5.3391e+01 -6.0109e+01 -6.1083e+01 -5.5135e+01 -5.3375e+01 -6.0119e+01 -6.1084e+01 -5.5132e+01 -5.3359e+01 -6.0128e+01 -6.1085e+01 -5.5127e+01 -5.3343e+01 -6.0137e+01 -6.1085e+01 -5.5123e+01 -5.3327e+01 -6.0139e+01 -6.1084e+01 -5.5119e+01 -5.3311e+01 -6.0138e+01 -6.1083e+01 -5.5114e+01 -5.3295e+01 -6.0138e+01 -6.1081e+01 -5.5110e+01 -5.3280e+01 -6.0137e+01 -6.1079e+01 -5.5105e+01 -5.3264e+01 -6.0136e+01 -6.1092e+01 -5.5100e+01 -5.3249e+01 -6.0134e+01 -6.1133e+01 -5.5095e+01 -5.3226e+01 -6.0132e+01 -6.1173e+01 -5.5090e+01 -5.3203e+01 -6.0130e+01 -6.1212e+01 -5.5085e+01 -5.3180e+01 -6.0127e+01 -6.1250e+01 -5.5079e+01 -5.3157e+01 -6.0124e+01 -6.1286e+01 -5.5073e+01 -5.3135e+01 -6.0120e+01 -6.1322e+01 -5.5067e+01 -5.3113e+01 -6.0117e+01 -6.1356e+01 -5.5053e+01 -5.3092e+01 -6.0112e+01 -6.1389e+01 -5.5039e+01 -5.3070e+01 -6.0108e+01 -6.1422e+01 -5.5026e+01 -5.3049e+01 -6.0103e+01 -6.1453e+01 -5.5010e+01 -5.3028e+01 -6.0098e+01 -6.1483e+01 -5.4988e+01 -5.3007e+01 -6.0092e+01 -6.1512e+01 -5.4967e+01 -5.2987e+01 -6.0086e+01 -6.1540e+01 -5.4946e+01 -5.2966e+01 -6.0080e+01 -6.1567e+01 -5.4925e+01 -5.2946e+01 -6.0073e+01 -6.1593e+01 -5.4904e+01 -5.2927e+01 -6.0066e+01 -6.1618e+01 -5.4884e+01 -5.2907e+01 -6.0059e+01 -6.1642e+01 -5.4864e+01 -5.2888e+01 -6.0052e+01 -6.1666e+01 -5.4843e+01 -5.2868e+01 -6.0044e+01 -6.1688e+01 -5.4824e+01 -5.2849e+01 -6.0035e+01 -6.1709e+01 -5.4804e+01 -5.2831e+01 -6.0027e+01 -6.1730e+01 -5.4777e+01 -5.2812e+01 -6.0018e+01 -6.1749e+01 -5.4750e+01 -5.2794e+01 -6.0009e+01 -6.1768e+01 -5.4723e+01 -5.2775e+01 -5.9999e+01 -6.1785e+01 -5.4697e+01 -5.2757e+01 -5.9990e+01 -6.1802e+01 -5.4671e+01 -5.2739e+01 -5.9979e+01 -6.1818e+01 -5.4645e+01 -5.2722e+01 -5.9969e+01 -6.1833e+01 -5.4620e+01 -5.2704e+01 -5.9958e+01 -6.1848e+01 -5.4595e+01 -5.2687e+01 -5.9947e+01 -6.1861e+01 -5.4576e+01 -5.2670e+01 -5.9936e+01 -6.1874e+01 -5.4596e+01 -5.2653e+01 -5.9925e+01 -6.1886e+01 -5.4616e+01 -5.2636e+01 -5.9913e+01 -6.1897e+01 -5.4635e+01 -5.2619e+01 -5.9901e+01 -6.1907e+01 -5.4654e+01 -5.2603e+01 -5.9888e+01 -6.1917e+01 -5.4673e+01 -5.2586e+01 -5.9875e+01 -6.1926e+01 -5.4691e+01 -5.2570e+01 -5.9863e+01 -6.1934e+01 -5.4709e+01 -5.2554e+01 -5.9849e+01 -6.1941e+01 -5.4727e+01 -5.2538e+01 -5.9836e+01 -6.1947e+01 -5.4745e+01 -5.2522e+01 -5.9822e+01 -6.1946e+01 -5.4761e+01 -5.2506e+01 -5.9808e+01 -6.1944e+01 -5.4778e+01 -5.2491e+01 -5.9794e+01 -6.1940e+01 -5.4794e+01 -5.2475e+01 -5.9779e+01 -6.1928e+01 -5.4810e+01 -5.2460e+01 -5.9765e+01 -6.1916e+01 -5.4826e+01 -5.2445e+01 -5.9750e+01 -6.1904e+01 -5.4841e+01 -5.2430e+01 -5.9728e+01 -6.1891e+01 -5.4856e+01 -5.2415e+01 -5.9705e+01 -6.1879e+01 -5.4870e+01 -5.2400e+01 -5.9681e+01 -6.1865e+01 -5.4884e+01 -5.2385e+01 -5.9658e+01 -6.1852e+01 -5.4898e+01 -5.2371e+01 -5.9635e+01 -6.1838e+01 -5.4912e+01 -5.2356e+01 -5.9611e+01 -6.1824e+01 -5.4925e+01 -5.2342e+01 -5.9587e+01 -6.1810e+01 -5.4938e+01 -5.2327e+01 -5.9564e+01 -6.1796e+01 -5.4950e+01 -5.2308e+01 -5.9540e+01 -6.1781e+01 -5.4962e+01 -5.2284e+01 -5.9516e+01 -6.1766e+01 -5.4974e+01 -5.2255e+01 -5.9493e+01 -6.1750e+01 -5.4985e+01 -5.2226e+01 -5.9469e+01 -6.1735e+01 -5.4996e+01 -5.2197e+01 -5.9445e+01 -6.1719e+01 -5.5007e+01 -5.2169e+01 -5.9421e+01 -6.1703e+01 -5.5017e+01 -5.2141e+01 -5.9397e+01 -6.1686e+01 -5.5027e+01 -5.2114e+01 -5.9373e+01 -6.1670e+01 -5.5037e+01 -5.2087e+01 -5.9349e+01 -6.1653e+01 -5.5047e+01 -5.2061e+01 -5.9325e+01 -6.1635e+01 -5.5056e+01 -5.2035e+01 -5.9301e+01 -6.1618e+01 -5.5064e+01 -5.2009e+01 -5.9277e+01 -6.1600e+01 -5.5073e+01 -5.1976e+01 -5.9252e+01 -6.1582e+01 -5.5081e+01 -5.1943e+01 -5.9228e+01 -6.1576e+01 -5.5089e+01 -5.1911e+01 -5.9204e+01 -6.1602e+01 -5.5096e+01 -5.1880e+01 -5.9179e+01 -6.1627e+01 -5.5104e+01 -5.1849e+01 -5.9155e+01 -6.1644e+01 -5.5110e+01 -5.1819e+01 -5.9130e+01 -6.1660e+01 -5.5117e+01 -5.1789e+01 -5.9106e+01 -6.1674e+01 -5.5123e+01 -5.1760e+01 -5.9081e+01 -6.1689e+01 -5.5129e+01 -5.1731e+01 -5.9057e+01 -6.1702e+01 -5.5135e+01 -5.1703e+01 -5.9032e+01 -6.1715e+01 -5.5140e+01 -5.1675e+01 -5.9031e+01 -6.1727e+01 -5.5145e+01 -5.1645e+01 -5.9042e+01 -6.1739e+01 -5.5150e+01 -5.1606e+01 -5.9053e+01 -6.1749e+01 -5.5155e+01 -5.1564e+01 -5.9064e+01 -6.1760e+01 -5.5159e+01 -5.1523e+01 -5.9074e+01 -6.1769e+01 -5.5163e+01 -5.1483e+01 -5.9083e+01 -6.1778e+01 -5.5166e+01 -5.1443e+01 -5.9092e+01 -6.1787e+01 -5.5170e+01 -5.1405e+01 -5.9101e+01 -6.1786e+01 -5.5173e+01 -5.1367e+01 -5.9101e+01 -6.1786e+01 -5.5176e+01 -5.1330e+01 -5.9100e+01 -6.1785e+01 -5.5178e+01 -5.1293e+01 -5.9100e+01 -6.1783e+01 -5.5180e+01 -5.1258e+01 -5.9099e+01 -6.1781e+01 -5.5182e+01 -5.1223e+01 -5.9098e+01 -6.1779e+01 -5.5184e+01 -5.1188e+01 -5.9096e+01 -6.1776e+01 -5.5186e+01 -5.1155e+01 -5.9095e+01 -6.1773e+01 -5.5187e+01 -5.1122e+01 -5.9093e+01 -6.1769e+01 -5.5180e+01 -5.1090e+01 -5.9091e+01 -6.1766e+01 -5.5173e+01 -5.1058e+01 -5.9088e+01 -6.1761e+01 -5.5166e+01 -5.1027e+01 -5.9085e+01 -6.1756e+01 -5.5159e+01 -5.0997e+01 -5.9082e+01 -6.1751e+01 -5.5151e+01 -5.0967e+01 -5.9079e+01 -6.1746e+01 -5.5144e+01 -5.0938e+01 -5.9070e+01 -6.1740e+01 -5.5137e+01 -5.0909e+01 -5.9058e+01 -6.1734e+01 -5.5129e+01 -5.0881e+01 -5.9046e+01 -6.1727e+01 -5.5122e+01 -5.0854e+01 -5.9034e+01 -6.1720e+01 -5.5114e+01 -5.0827e+01 -5.9022e+01 -6.1713e+01 -5.5106e+01 -5.0801e+01 -5.9010e+01 -6.1705e+01 -5.5098e+01 -5.0775e+01 -5.8998e+01 -6.1697e+01 -5.5091e+01 -5.0749e+01 -5.8985e+01 -6.1689e+01 -5.5083e+01 -5.0725e+01 -5.8973e+01 -6.1680e+01 -5.5075e+01 -5.0700e+01 -5.8960e+01 -6.1671e+01 -5.5067e+01 -5.0676e+01 -5.8948e+01 -6.1661e+01 -5.5058e+01 -5.0653e+01 -5.8935e+01 -6.1651e+01 -5.5050e+01 -5.0628e+01 -5.8922e+01 -6.1641e+01 -5.5042e+01 -5.0598e+01 -5.8909e+01 -6.1630e+01 -5.5034e+01 -5.0568e+01 -5.8896e+01 -6.1619e+01 -5.5025e+01 -5.0539e+01 -5.8883e+01 -6.1608e+01 -5.5017e+01 -5.0510e+01 -5.8869e+01 -6.1597e+01 -5.5008e+01 -5.0482e+01 -5.8856e+01 -6.1585e+01 -5.4999e+01 -5.0455e+01 -5.8842e+01 -6.1572e+01 -5.4991e+01 -5.0428e+01 -5.8829e+01 -6.1560e+01 -5.4982e+01 -5.0402e+01 -5.8815e+01 -6.1547e+01 -5.4973e+01 -5.0376e+01 -5.8801e+01 -6.1534e+01 -5.4964e+01 -5.0351e+01 -5.8787e+01 -6.1520e+01 -5.4955e+01 -5.0326e+01 -5.8773e+01 -6.1506e+01 -5.4946e+01 -5.0302e+01 -5.8758e+01 -6.1492e+01 -5.4936e+01 -5.0279e+01 -5.8744e+01 -6.1478e+01 -5.4927e+01 -5.0256e+01 -5.8730e+01 -6.1463e+01 -5.4918e+01 -5.0233e+01 -5.8715e+01 -6.1448e+01 -5.4908e+01 -5.0211e+01 -5.8700e+01 -6.1432e+01 -5.4899e+01 -5.0189e+01 -5.8685e+01 -6.1417e+01 -5.4889e+01 -5.0166e+01 -5.8670e+01 -6.1401e+01 -5.4880e+01 -5.0137e+01 -5.8655e+01 -6.1384e+01 -5.4870e+01 -5.0109e+01 -5.8640e+01 -6.1368e+01 -5.4860e+01 -5.0082e+01 -5.8625e+01 -6.1351e+01 -5.4850e+01 -5.0055e+01 -5.8609e+01 -6.1334e+01 -5.4840e+01 -5.0029e+01 -5.8593e+01 -6.1317e+01 -5.4830e+01 -5.0003e+01 -5.8578e+01 -6.1299e+01 -5.4820e+01 -1.0000e+01 -5.8562e+01 -6.1281e+01 -5.4803e+01 -6.0000e+01 -5.8546e+01 -6.1263e+01 -5.4785e+01 -6.0000e+01 -5.8530e+01 -6.1244e+01 -5.4767e+01 -6.0000e+01 -5.8514e+01 -6.1226e+01 -5.4749e+01 -6.0000e+01 -5.8497e+01 -6.1207e+01 -5.4731e+01 -6.0000e+01 -5.8481e+01 -6.1188e+01 -5.4714e+01 -6.0000e+01 -5.8464e+01 -6.1168e+01 -5.4696e+01 -6.0000e+01 -5.8447e+01 -6.1149e+01 -5.4675e+01 -6.0000e+01 -5.8431e+01 -6.1129e+01 -5.4650e+01 -6.0000e+01 -5.8409e+01 -6.1108e+01 -5.4625e+01 -6.0000e+01 -5.8384e+01 -6.1088e+01 -5.4600e+01 -6.0000e+01 -5.8359e+01 -6.1067e+01 -5.4576e+01 -6.0000e+01 -5.8334e+01 -6.1047e+01 -5.4552e+01 -6.0000e+01 -5.8309e+01 -6.1025e+01 -5.4528e+01 -6.0000e+01 -5.8276e+01 -6.1004e+01 -5.4504e+01 -6.0000e+01 -5.8244e+01 -6.0983e+01 -5.4474e+01 -6.0000e+01 -5.8212e+01 -6.0961e+01 -5.4443e+01 -6.0000e+01 -5.8180e+01 -6.0939e+01 -5.4413e+01 -6.0000e+01 -5.8148e+01 -6.0917e+01 -5.4383e+01 -6.0000e+01 -5.8117e+01 -6.0894e+01 -5.4353e+01 -6.0000e+01 -5.8086e+01 -6.0872e+01 -5.4324e+01 -6.0000e+01 -5.8055e+01 -6.0849e+01 -5.4295e+01 -6.0000e+01 -5.8024e+01 -6.0826e+01 -5.4266e+01 -6.0000e+01 -5.7994e+01 -6.0803e+01 -5.4238e+01 -6.0000e+01 -5.7964e+01 -6.0779e+01 -5.4211e+01 -6.0000e+01 -5.7933e+01 -6.0756e+01 -5.4183e+01 -6.0000e+01 -5.7904e+01 -6.0732e+01 -5.4156e+01 -6.0000e+01 -5.7874e+01 -6.0708e+01 -5.4129e+01 -6.0000e+01 -5.7844e+01 -6.0684e+01 -5.4103e+01 -6.0000e+01 -5.7815e+01 -6.0660e+01 -5.4071e+01 -6.0000e+01 -5.7786e+01 -6.0635e+01 -5.4038e+01 -6.0000e+01 -5.7757e+01 -6.0611e+01 -5.4005e+01 -6.0000e+01 -5.7728e+01 -6.0586e+01 -5.3972e+01 -6.0000e+01 -5.7699e+01 -6.0561e+01 -5.3940e+01 -6.0000e+01 -5.7671e+01 -6.0536e+01 -5.3909e+01 -6.0000e+01 -5.7643e+01 -6.0511e+01 -5.3878e+01 -6.0000e+01 -5.7613e+01 -6.0485e+01 -5.3847e+01 -6.0000e+01 -5.7577e+01 -6.0460e+01 -5.3817e+01 -6.0000e+01 -5.7541e+01 -6.0445e+01 -5.3787e+01 -6.0000e+01 -5.7506e+01 -6.0463e+01 -5.3758e+01 -6.0000e+01 -5.7471e+01 -6.0481e+01 -5.3729e+01 -6.0000e+01 -5.7436e+01 -6.0498e+01 -5.3700e+01 -6.0000e+01 -5.7402e+01 -6.0514e+01 -5.3672e+01 -6.0000e+01 -5.7367e+01 -6.0530e+01 -5.3645e+01 -6.0000e+01 -5.7334e+01 -6.0544e+01 -5.3617e+01 -6.0000e+01 -5.7300e+01 -6.0558e+01 -5.3591e+01 -6.0000e+01 -5.7267e+01 -6.0571e+01 -5.3564e+01 -6.0000e+01 -5.7234e+01 -6.0584e+01 -5.3538e+01 -6.0000e+01 -5.7201e+01 -6.0596e+01 -5.3507e+01 -6.0000e+01 -5.7169e+01 -6.0607e+01 -5.3473e+01 -5.9924e+01 -5.7137e+01 -6.0617e+01 -5.3441e+01 -5.9838e+01 -5.7105e+01 -6.0626e+01 -5.3408e+01 -5.9754e+01 -5.7073e+01 -6.0635e+01 -5.3377e+01 -5.9669e+01 -5.7042e+01 -6.0643e+01 -5.3345e+01 -5.9579e+01 -5.7011e+01 -6.0643e+01 -5.3314e+01 -5.9490e+01 -5.6980e+01 -6.0642e+01 -5.3284e+01 -5.9402e+01 -5.6949e+01 -6.0641e+01 -5.3254e+01 -5.9315e+01 -5.6919e+01 -6.0639e+01 -5.3225e+01 -5.9230e+01 -5.6888e+01 -6.0636e+01 -5.3196e+01 -5.9145e+01 -5.6858e+01 -6.0634e+01 -5.3167e+01 -5.9062e+01 -5.6828e+01 -6.0631e+01 -5.3139e+01 -5.8998e+01 -5.6799e+01 -6.0627e+01 -5.3112e+01 -5.8961e+01 -5.6769e+01 -6.0657e+01 -5.3084e+01 -5.8925e+01 -5.6740e+01 -6.0691e+01 -5.3058e+01 -5.8889e+01 -5.6711e+01 -6.0722e+01 -5.3031e+01 -5.8853e+01 -5.6682e+01 -6.0751e+01 -5.3005e+01 -5.8818e+01 -5.6653e+01 -6.0780e+01 -5.2979e+01 -5.8783e+01 -5.6625e+01 -6.0809e+01 -5.2954e+01 -5.8748e+01 -5.6596e+01 -6.0865e+01 -5.2929e+01 -5.8720e+01 -5.6562e+01 -6.0936e+01 -5.2904e+01 -5.8723e+01 -5.6526e+01 -6.1005e+01 -5.2880e+01 -5.8725e+01 -5.6491e+01 -6.1072e+01 -5.2856e+01 -5.8721e+01 -5.6456e+01 -6.1139e+01 -5.2833e+01 -5.8715e+01 -5.6421e+01 -6.1203e+01 -5.2809e+01 -5.8710e+01 -5.6386e+01 -6.1267e+01 -5.2786e+01 -5.8704e+01 -5.6352e+01 -6.1329e+01 -5.2763e+01 -5.8698e+01 -5.6318e+01 -6.1389e+01 -5.2732e+01 -5.8692e+01 -5.6285e+01 -6.1448e+01 -5.2702e+01 -5.8687e+01 -5.6251e+01 -6.1506e+01 -5.2673e+01 -5.8681e+01 -5.6241e+01 -6.1563e+01 -5.2644e+01 -5.8675e+01 -5.6240e+01 -6.1618e+01 -5.2616e+01 -5.8669e+01 -5.6235e+01 -6.1671e+01 -5.2588e+01 -5.8663e+01 -5.6231e+01 -6.1724e+01 -5.2560e+01 -5.8657e+01 -5.6227e+01 -6.1775e+01 -5.2533e+01 -5.8651e+01 -5.6222e+01 -6.1825e+01 -5.2507e+01 -5.8645e+01 -5.6218e+01 -6.1873e+01 -5.2481e+01 -5.8639e+01 -5.6214e+01 -6.1921e+01 -5.2455e+01 -5.8633e+01 -5.6209e+01 -6.1967e+01 -5.2429e+01 -5.8627e+01 -5.6205e+01 -6.2012e+01 -5.2404e+01 -5.8621e+01 -5.6201e+01 -6.2055e+01 -5.2380e+01 -5.8614e+01 -5.6196e+01 -6.2098e+01 -5.2355e+01 -5.8608e+01 -5.6192e+01 -6.2139e+01 -5.2332e+01 -5.8601e+01 -5.6188e+01 -6.2179e+01 -5.2308e+01 -5.8594e+01 -5.6183e+01 -6.2218e+01 -5.2285e+01 -5.8623e+01 -5.6179e+01 -6.2256e+01 -5.2262e+01 -5.8660e+01 -5.6174e+01 -6.2293e+01 -5.2240e+01 -5.8696e+01 -5.6169e+01 -6.2326e+01 -5.2217e+01 -5.8732e+01 -5.6165e+01 -6.2352e+01 -5.2196e+01 -5.8767e+01 -5.6158e+01 -6.2378e+01 -5.2174e+01 -5.8801e+01 -5.6145e+01 -6.2402e+01 -5.2153e+01 -5.8835e+01 -5.6133e+01 -6.2440e+01 -5.2132e+01 -5.8867e+01 -5.6120e+01 -6.2508e+01 -5.2111e+01 -5.8899e+01 -5.6108e+01 -6.2574e+01 -5.2091e+01 -5.8931e+01 -5.6096e+01 -6.2638e+01 -5.2071e+01 -5.8961e+01 -5.6083e+01 -6.2701e+01 -5.2051e+01 -5.8991e+01 -5.6071e+01 -6.2763e+01 -5.2032e+01 -5.9020e+01 -5.6059e+01 -6.2823e+01 -5.2012e+01 -5.9049e+01 -5.6047e+01 -6.2881e+01 -5.1994e+01 -5.9076e+01 -5.6036e+01 -6.2938e+01 -5.1975e+01 -5.9103e+01 -5.6024e+01 -6.2994e+01 -5.1956e+01 -5.9129e+01 -5.6012e+01 -6.3048e+01 -5.1938e+01 -5.9155e+01 -5.6001e+01 -6.3101e+01 -5.1920e+01 -5.9180e+01 -5.5989e+01 -6.3153e+01 -5.1903e+01 -5.9204e+01 -5.5978e+01 -6.3203e+01 -5.1885e+01 -5.9227e+01 -5.5966e+01 -6.3252e+01 -5.1868e+01 -5.9250e+01 -5.5955e+01 -6.3299e+01 -5.1889e+01 -5.9272e+01 -5.5943e+01 -6.3346e+01 -5.1917e+01 -5.9294e+01 -5.5932e+01 -6.3391e+01 -5.1944e+01 -5.9315e+01 -5.5921e+01 -6.3434e+01 -5.1970e+01 -5.9335e+01 -5.5909e+01 -6.3477e+01 -5.1996e+01 -5.9354e+01 -5.5898e+01 -6.3518e+01 -5.2021e+01 -5.9373e+01 -5.5887e+01 -6.3558e+01 -5.2046e+01 -5.9392e+01 -5.5876e+01 -6.3597e+01 -5.2071e+01 -5.9409e+01 -5.5865e+01 -6.3634e+01 -5.2095e+01 -5.9426e+01 -5.5853e+01 -6.3662e+01 -5.2119e+01 -5.9443e+01 -5.5842e+01 -6.3689e+01 -5.2142e+01 -5.9458e+01 -5.5831e+01 -6.3716e+01 -5.2165e+01 -5.9473e+01 -5.5820e+01 -6.3741e+01 -5.2188e+01 -5.9488e+01 -5.5809e+01 -6.3766e+01 -5.2210e+01 -5.9502e+01 -5.5797e+01 -6.3789e+01 -5.2232e+01 -5.9515e+01 -5.5786e+01 -6.3812e+01 -5.2253e+01 -5.9522e+01 -5.5775e+01 -6.3834e+01 -5.2274e+01 -5.9526e+01 -5.5764e+01 -6.3855e+01 -5.2294e+01 -5.9530e+01 -5.5753e+01 -6.3874e+01 -5.2314e+01 -5.9534e+01 -5.5741e+01 -6.3893e+01 -5.2334e+01 -5.9537e+01 -5.5730e+01 -6.3912e+01 -5.2353e+01 -5.9540e+01 -5.5719e+01 -6.3929e+01 -5.2372e+01 -5.9542e+01 -5.5707e+01 -6.3945e+01 -5.2391e+01 -5.9544e+01 -5.5696e+01 -6.3961e+01 -5.2409e+01 -5.9546e+01 -5.5685e+01 -6.3974e+01 -5.2427e+01 -5.9547e+01 -5.5673e+01 -6.3980e+01 -5.2444e+01 -5.9548e+01 -5.5662e+01 -6.3980e+01 -5.2461e+01 -5.9543e+01 -5.5650e+01 -6.3977e+01 -5.2478e+01 -5.9535e+01 -5.5639e+01 -6.3973e+01 -5.2495e+01 -5.9527e+01 -5.5627e+01 -6.3985e+01 -5.2511e+01 -5.9520e+01 -5.5616e+01 -6.4025e+01 -5.2526e+01 -5.9511e+01 -5.5604e+01 -6.4064e+01 -5.2541e+01 -5.9503e+01 -5.5592e+01 -6.4102e+01 -5.2556e+01 -5.9495e+01 -5.5581e+01 -6.4138e+01 -5.2571e+01 -5.9486e+01 -5.5569e+01 -6.4174e+01 -5.2585e+01 -5.9477e+01 -5.5557e+01 -6.4209e+01 -5.2599e+01 -5.9468e+01 -5.5545e+01 -6.4242e+01 -5.2613e+01 -5.9459e+01 -5.5533e+01 -6.4275e+01 -5.2626e+01 -5.9449e+01 -5.5522e+01 -6.4306e+01 -5.2639e+01 -5.9440e+01 -5.5510e+01 -6.4337e+01 -5.2652e+01 -5.9430e+01 -5.5498e+01 -6.4367e+01 -5.2664e+01 -5.9420e+01 -5.5486e+01 -6.4395e+01 -5.2676e+01 -5.9410e+01 -5.5473e+01 -6.4423e+01 -5.2687e+01 -5.9400e+01 -5.5461e+01 -6.4449e+01 -5.2699e+01 -5.9389e+01 -5.5449e+01 -6.4475e+01 -5.2710e+01 -5.9379e+01 -5.5433e+01 -6.4500e+01 -5.2718e+01 -5.9368e+01 -5.5413e+01 -6.4524e+01 -5.2720e+01 -5.9357e+01 -5.5393e+01 -6.4546e+01 -5.2723e+01 -5.9346e+01 -5.5373e+01 -6.4568e+01 -5.2725e+01 -5.9334e+01 -5.5353e+01 -6.4589e+01 -5.2727e+01 -5.9323e+01 -5.5333e+01 -6.4609e+01 -5.2729e+01 -5.9311e+01 -5.5314e+01 -6.4628e+01 -5.2731e+01 -5.9299e+01 -5.5294e+01 -6.4647e+01 -5.2733e+01 -5.9287e+01 -5.5275e+01 -6.4664e+01 -5.2735e+01 -5.9275e+01 -5.5252e+01 -6.4681e+01 -5.2737e+01 -5.9262e+01 -5.5225e+01 -6.4696e+01 -5.2738e+01 -5.9249e+01 -5.5227e+01 -6.4711e+01 -5.2740e+01 -5.9236e+01 -5.5237e+01 -6.4725e+01 -5.2741e+01 -5.9223e+01 -5.5246e+01 -6.4738e+01 -5.2742e+01 -5.9210e+01 -5.5256e+01 -6.4750e+01 -5.2743e+01 -5.9197e+01 -5.5265e+01 -6.4774e+01 -5.2744e+01 -5.9183e+01 -5.5275e+01 -6.4829e+01 -5.2745e+01 -5.9169e+01 -5.5284e+01 -6.4883e+01 -5.2746e+01 -5.9156e+01 -5.5293e+01 -6.4935e+01 -5.2747e+01 -5.9141e+01 -5.5301e+01 -6.4986e+01 -5.2747e+01 -5.9127e+01 -5.5310e+01 -6.5035e+01 -5.2740e+01 -5.9113e+01 -5.5318e+01 -6.5077e+01 -5.2733e+01 -5.9098e+01 -5.5326e+01 -6.5116e+01 -5.2725e+01 -5.9083e+01 -5.5334e+01 -6.5153e+01 -5.2718e+01 -5.9068e+01 -5.5342e+01 -6.5190e+01 -5.2706e+01 -5.9053e+01 -5.5349e+01 -6.5225e+01 -5.2691e+01 -5.9038e+01 -5.5357e+01 -6.5259e+01 -5.2676e+01 -5.9022e+01 -5.5364e+01 -6.5292e+01 -5.2662e+01 -5.9007e+01 -5.5371e+01 -6.5324e+01 -5.2647e+01 -5.8991e+01 -5.5377e+01 -6.5354e+01 -5.2633e+01 -5.8975e+01 -5.5384e+01 -6.5384e+01 -5.2619e+01 -5.8959e+01 -5.5390e+01 -6.5413e+01 -5.2606e+01 -5.8942e+01 -5.5396e+01 -6.5440e+01 -5.2593e+01 -5.8926e+01 -5.5402e+01 -6.5467e+01 -5.2579e+01 -5.8909e+01 -5.5407e+01 -6.5492e+01 -5.2567e+01 -5.8893e+01 -5.5413e+01 -6.5516e+01 -5.2554e+01 -5.8876e+01 -5.5418e+01 -6.5540e+01 -5.2541e+01 -5.8859e+01 -5.5423e+01 -6.5562e+01 -5.2529e+01 -5.8841e+01 -5.5427e+01 -6.5583e+01 -5.2517e+01 -5.8824e+01 -5.5432e+01 -6.5604e+01 -5.2505e+01 -5.8802e+01 -5.5436e+01 -6.5623e+01 -5.2493e+01 -5.8768e+01 -5.5440e+01 -6.5641e+01 -5.2481e+01 -5.8735e+01 -5.5440e+01 -6.5659e+01 -5.2468e+01 -5.8702e+01 -5.5436e+01 -6.5675e+01 -5.2449e+01 -5.8669e+01 -5.5426e+01 -6.5691e+01 -5.2430e+01 -5.8636e+01 -5.5414e+01 -6.5705e+01 -5.2411e+01 -5.8604e+01 -5.5402e+01 -6.5719e+01 -5.2393e+01 -5.8572e+01 -5.5390e+01 -6.5732e+01 -5.2375e+01 -5.8540e+01 -5.5378e+01 -6.5743e+01 -5.2357e+01 -5.8508e+01 -5.5366e+01 -6.5754e+01 -5.2340e+01 -5.8476e+01 -5.5355e+01 -6.5765e+01 -5.2323e+01 -5.8445e+01 -5.5344e+01 -6.5774e+01 -5.2306e+01 -5.8414e+01 -5.5332e+01 -6.5782e+01 -5.2290e+01 -5.8383e+01 -5.5321e+01 -6.5790e+01 -5.2274e+01 -5.8352e+01 -5.5310e+01 -6.5796e+01 -5.2258e+01 -5.8321e+01 -5.5299e+01 -6.5802e+01 -5.2242e+01 -5.8291e+01 -5.5288e+01 -6.5807e+01 -5.2227e+01 -5.8261e+01 -5.5278e+01 -6.5811e+01 -5.2212e+01 -5.8230e+01 -5.5267e+01 -6.5815e+01 -5.2197e+01 -5.8200e+01 -5.5249e+01 -6.5817e+01 -5.2183e+01 -5.8171e+01 -5.5230e+01 -6.5819e+01 -5.2168e+01 -5.8141e+01 -5.5212e+01 -6.5820e+01 -5.2154e+01 -5.8111e+01 -5.5194e+01 -6.5821e+01 -5.2140e+01 -5.8082e+01 -5.5177e+01 -6.5820e+01 -5.2126e+01 -5.8053e+01 -5.5160e+01 -6.5819e+01 -5.2113e+01 -5.8024e+01 -5.5143e+01 -6.5817e+01 -5.2099e+01 -5.7995e+01 -5.5126e+01 -6.5815e+01 -5.2127e+01 -5.7966e+01 -5.5109e+01 -6.5811e+01 -5.2158e+01 -5.7937e+01 -5.5093e+01 -6.5807e+01 -5.2189e+01 -5.7908e+01 -5.5087e+01 -6.5803e+01 -5.2219e+01 -5.7880e+01 -5.5107e+01 -6.5797e+01 -5.2249e+01 -5.7851e+01 -5.5127e+01 -6.5791e+01 -5.2278e+01 -5.7823e+01 -5.5147e+01 -6.5784e+01 -5.2324e+01 -5.7795e+01 -5.5167e+01 -6.5777e+01 -5.2397e+01 -5.7767e+01 -5.5186e+01 -6.5769e+01 -5.2468e+01 -5.7739e+01 -5.5205e+01 -6.5760e+01 -5.2539e+01 -5.7711e+01 -5.5224e+01 -6.5751e+01 -5.2608e+01 -5.7683e+01 -5.5242e+01 -6.5741e+01 -5.2677e+01 -5.7655e+01 -5.5260e+01 -6.5730e+01 -5.2744e+01 -5.7628e+01 -5.5278e+01 -6.5719e+01 -5.2810e+01 -5.7600e+01 -5.5296e+01 -6.5707e+01 -5.2875e+01 -5.7573e+01 -5.5313e+01 -6.5695e+01 -5.2935e+01 -5.7546e+01 -5.5330e+01 -6.5682e+01 -5.2990e+01 -5.7518e+01 -5.5346e+01 -6.5668e+01 -5.3044e+01 -5.7491e+01 -5.5362e+01 -6.5654e+01 -5.3098e+01 -5.7464e+01 -5.5378e+01 -6.5640e+01 -5.3150e+01 -5.7437e+01 -5.5394e+01 -6.5625e+01 -5.3202e+01 -5.7410e+01 -5.5409e+01 -6.5609e+01 -5.3253e+01 -5.7383e+01 -5.5424e+01 -6.5592e+01 -5.3303e+01 -5.7357e+01 -5.5439e+01 -6.5576e+01 -5.3353e+01 -5.7330e+01 -5.5453e+01 -6.5558e+01 -5.3397e+01 -5.7303e+01 -5.5467e+01 -6.5541e+01 -5.3437e+01 -5.7277e+01 -5.5481e+01 -6.5522e+01 -5.3477e+01 -5.7250e+01 -5.5495e+01 -6.5503e+01 -5.3515e+01 -5.7224e+01 -5.5508e+01 -6.5484e+01 -5.3554e+01 -5.7198e+01 -5.5520e+01 -6.5464e+01 -5.3591e+01 -5.7171e+01 -5.5533e+01 -6.5444e+01 -5.3628e+01 -5.7145e+01 -5.5545e+01 -6.5423e+01 -5.3665e+01 -5.7119e+01 -5.5557e+01 -6.5402e+01 -5.3700e+01 -5.7093e+01 -5.5568e+01 -6.5380e+01 -5.3736e+01 -5.7067e+01 -5.5580e+01 -6.5358e+01 -5.3771e+01 -5.7041e+01 -5.5590e+01 -6.5336e+01 -5.3805e+01 -5.7015e+01 -5.5601e+01 -6.5305e+01 -5.3838e+01 -5.6989e+01 -5.5611e+01 -6.5274e+01 -5.3871e+01 -5.6963e+01 -5.5621e+01 -6.5243e+01 -5.3904e+01 -5.6937e+01 -5.5631e+01 -6.5211e+01 -5.3936e+01 -5.6912e+01 -5.5640e+01 -6.5179e+01 -5.3967e+01 -5.6886e+01 -5.5649e+01 -6.5147e+01 -5.3998e+01 -5.6860e+01 -5.5658e+01 -6.5115e+01 -5.4029e+01 -5.6835e+01 -5.5666e+01 -6.5082e+01 -5.4059e+01 -5.6809e+01 -5.5674e+01 -6.5049e+01 -5.4088e+01 -5.6784e+01 -5.5682e+01 -6.5050e+01 -5.4117e+01 -5.6759e+01 -5.5689e+01 -6.5061e+01 -5.4141e+01 -5.6733e+01 -5.5697e+01 -6.5071e+01 -5.4161e+01 -5.6708e+01 -5.5703e+01 -6.5080e+01 -5.4180e+01 -5.6683e+01 -5.5710e+01 -6.5089e+01 -5.4199e+01 -5.6657e+01 -5.5716e+01 -6.5096e+01 -5.4218e+01 -5.6632e+01 -5.5722e+01 -6.5103e+01 -5.4237e+01 -5.6607e+01 -5.5728e+01 -6.5109e+01 -5.4255e+01 -5.6582e+01 -5.5733e+01 -6.5114e+01 -5.4273e+01 -5.6557e+01 -5.5738e+01 -6.5119e+01 -5.4290e+01 -5.6532e+01 -5.5743e+01 -6.5122e+01 -5.4308e+01 -5.6507e+01 -5.5748e+01 -6.5125e+01 -5.4324e+01 -5.6482e+01 -5.5752e+01 -6.5127e+01 -5.4341e+01 -5.6458e+01 -5.5756e+01 -6.5128e+01 -5.4357e+01 -5.6433e+01 -5.5759e+01 -6.5129e+01 -5.4373e+01 -5.6408e+01 -5.5763e+01 -6.5129e+01 -5.4389e+01 -5.6383e+01 -5.5766e+01 -6.5128e+01 -5.4404e+01 -5.6359e+01 -5.5769e+01 -6.5126e+01 -5.4419e+01 -5.6334e+01 -5.5771e+01 -6.5124e+01 -5.4434e+01 -5.6309e+01 -5.5773e+01 -6.5121e+01 -5.4448e+01 -5.6285e+01 -5.5775e+01 -6.5117e+01 -5.4462e+01 -5.6260e+01 -5.5777e+01 -6.5113e+01 -5.4476e+01 -5.6236e+01 -5.5779e+01 -6.5108e+01 -5.4489e+01 -5.6212e+01 -5.5780e+01 -6.5102e+01 -5.4502e+01 -5.6187e+01 -5.5781e+01 -6.5096e+01 -5.4515e+01 -5.6163e+01 -5.5781e+01 -6.5089e+01 -5.4527e+01 -5.6139e+01 -5.5782e+01 -6.5081e+01 -5.4539e+01 -5.6114e+01 -5.5821e+01 -6.5115e+01 -5.4551e+01 -5.6090e+01 -5.5857e+01 -6.5150e+01 -5.4562e+01 -5.6066e+01 -5.5892e+01 -6.5184e+01 -5.4568e+01 -5.6042e+01 -5.5927e+01 -6.5216e+01 -5.4571e+01 -5.6018e+01 -5.5961e+01 -6.5248e+01 -5.4574e+01 -5.5994e+01 -5.5994e+01 -6.5278e+01 -5.4577e+01 -5.5970e+01 -5.6026e+01 -6.5307e+01 -5.4579e+01 -5.5946e+01 -5.6058e+01 -6.5335e+01 -5.4580e+01 -5.5922e+01 -5.6089e+01 -6.5361e+01 -5.4575e+01 -5.5898e+01 -5.6119e+01 -6.5387e+01 -5.4564e+01 -5.5874e+01 -5.6149e+01 -6.5411e+01 -5.4542e+01 -5.5850e+01 -5.6178e+01 -6.5434e+01 -5.4522e+01 -5.5827e+01 -5.6207e+01 -6.5456e+01 -5.4501e+01 -5.5803e+01 -5.6234e+01 -6.5477e+01 -5.4481e+01 -5.5779e+01 -5.6262e+01 -6.5497e+01 -5.4462e+01 -5.5756e+01 -5.6286e+01 -6.5516e+01 -5.4442e+01 -5.5732e+01 -5.6304e+01 -6.5534e+01 -5.4424e+01 -5.5709e+01 -5.6321e+01 -6.5551e+01 -5.4405e+01 -5.5685e+01 -5.6330e+01 -6.5566e+01 -5.4387e+01 -5.5662e+01 -5.6339e+01 -6.5581e+01 -5.4369e+01 -5.5638e+01 -5.6347e+01 -6.5595e+01 -5.4352e+01 -5.5615e+01 -5.6355e+01 -6.5607e+01 -5.4335e+01 -5.5592e+01 -5.6364e+01 -6.5619e+01 -5.4313e+01 -5.5568e+01 -5.6371e+01 -6.5630e+01 -5.4288e+01 -5.5545e+01 -5.6379e+01 -6.5640e+01 -5.4265e+01 -5.5522e+01 -5.6386e+01 -6.5649e+01 -5.4241e+01 -5.5499e+01 -5.6394e+01 -6.5656e+01 -5.4219e+01 -5.5475e+01 -5.6401e+01 -6.5663e+01 -5.4208e+01 -5.5452e+01 -5.6407e+01 -6.5670e+01 -5.4231e+01 -5.5429e+01 -5.6414e+01 -6.5675e+01 -5.4253e+01 -5.5406e+01 -5.6420e+01 -6.5679e+01 -5.4275e+01 -5.5383e+01 -5.6426e+01 -6.5683e+01 -5.4297e+01 -5.5360e+01 -5.6431e+01 -6.5685e+01 -5.4319e+01 -5.5338e+01 -5.6437e+01 -6.5687e+01 -5.4340e+01 -5.5315e+01 -5.6437e+01 -6.5688e+01 -5.4357e+01 -5.5292e+01 -5.6435e+01 -6.5688e+01 -5.4370e+01 -5.5269e+01 -5.6431e+01 -6.5688e+01 -5.4383e+01 -5.5247e+01 -5.6428e+01 -6.5686e+01 -5.4395e+01 -5.5224e+01 -5.6425e+01 -6.5684e+01 -5.4408e+01 -5.5198e+01 -5.6422e+01 -6.5681e+01 -5.4421e+01 -5.5168e+01 -5.6419e+01 -6.5678e+01 -5.4433e+01 -5.5138e+01 -5.6415e+01 -6.5673e+01 -5.4446e+01 -5.5108e+01 -5.6412e+01 -6.5668e+01 -5.4458e+01 -5.5078e+01 -5.6408e+01 -6.5662e+01 -5.4470e+01 -5.5048e+01 -5.6405e+01 -6.5655e+01 -5.4482e+01 -5.5019e+01 -5.6401e+01 -6.5648e+01 -5.4494e+01 -5.4990e+01 -5.6397e+01 -6.5640e+01 -5.4506e+01 -5.4961e+01 -5.6393e+01 -6.5631e+01 -5.4518e+01 -5.4932e+01 -5.6389e+01 -6.5622e+01 -5.4529e+01 -5.4904e+01 -5.6385e+01 -6.5612e+01 -5.4541e+01 -5.4874e+01 -5.6381e+01 -6.5601e+01 -5.4552e+01 -5.4838e+01 -5.6377e+01 -6.5590e+01 -5.4563e+01 -5.4803e+01 -5.6372e+01 -6.5578e+01 -5.4574e+01 -5.4768e+01 -5.6368e+01 -6.5565e+01 -5.4585e+01 -5.4733e+01 -5.6363e+01 -6.5552e+01 -5.4595e+01 -5.4698e+01 -5.6358e+01 -6.5538e+01 -5.4598e+01 -5.4664e+01 -5.6353e+01 -6.5524e+01 -5.4600e+01 -5.4630e+01 -5.6348e+01 -6.5509e+01 -5.4600e+01 -5.4597e+01 -5.6343e+01 -6.5493e+01 -5.4595e+01 -5.4564e+01 -5.6338e+01 -6.5477e+01 -5.4589e+01 -5.4531e+01 -5.6325e+01 -6.5460e+01 -5.4584e+01 -5.4499e+01 -5.6312e+01 -6.5440e+01 -5.4579e+01 -5.4467e+01 -5.6299e+01 -6.5436e+01 -5.4575e+01 -5.4435e+01 -5.6286e+01 -6.5446e+01 -5.4570e+01 -5.4404e+01 -5.6273e+01 -6.5456e+01 -5.4566e+01 -5.4373e+01 -5.6260e+01 -6.5464e+01 -5.4562e+01 -5.4342e+01 -5.6247e+01 -6.5472e+01 -5.4557e+01 -5.4312e+01 -5.6234e+01 -6.5480e+01 -5.4553e+01 -5.4282e+01 -5.6221e+01 -6.5486e+01 -5.4550e+01 -5.4252e+01 -5.6208e+01 -6.5492e+01 -5.4540e+01 -5.4223e+01 -5.6195e+01 -6.5497e+01 -5.4529e+01 -5.4193e+01 -5.6182e+01 -6.5501e+01 -5.4518e+01 -5.4164e+01 -5.6170e+01 -6.5504e+01 -5.4507e+01 -5.4136e+01 -5.6157e+01 -6.5507e+01 -5.4495e+01 -5.4107e+01 -5.6144e+01 -6.5509e+01 -5.4476e+01 -5.4079e+01 -5.6132e+01 -6.5510e+01 -5.4458e+01 -5.4051e+01 -5.6119e+01 -6.5511e+01 -5.4432e+01 -5.4024e+01 -5.6106e+01 -6.5511e+01 -5.4407e+01 -5.3996e+01 -5.6094e+01 -6.5510e+01 -5.4383e+01 -5.3969e+01 -5.6081e+01 -6.5508e+01 -5.4359e+01 -5.3942e+01 -5.6068e+01 -6.5506e+01 -5.4336e+01 -5.3916e+01 -5.6056e+01 -6.5503e+01 -5.4313e+01 -5.3889e+01 -5.6043e+01 -6.5500e+01 -5.4291e+01 -5.3863e+01 -5.6030e+01 -6.5496e+01 -5.4270e+01 -5.3837e+01 -5.6018e+01 -6.5491e+01 -5.4248e+01 -5.3812e+01 -5.6005e+01 -6.5485e+01 -5.4228e+01 -5.3786e+01 -5.5992e+01 -6.5479e+01 -5.4208e+01 -5.3758e+01 -5.5980e+01 -6.5473e+01 -5.4188e+01 -5.3725e+01 -5.5967e+01 -6.5466e+01 -5.4169e+01 -5.3692e+01 -5.5954e+01 -6.5458e+01 -5.4150e+01 -5.3660e+01 -5.5935e+01 -6.5449e+01 -5.4131e+01 -5.3628e+01 -5.5915e+01 -6.5440e+01 -5.4113e+01 -5.3597e+01 -5.5894e+01 -6.5430e+01 -5.4096e+01 -5.3566e+01 -5.5874e+01 -6.5420e+01 -5.4078e+01 -5.3535e+01 -5.5854e+01 -6.5409e+01 -5.4061e+01 -5.3505e+01 -5.5834e+01 -6.5398e+01 -5.4045e+01 -5.3475e+01 -5.5814e+01 -6.5386e+01 -5.4029e+01 -5.3446e+01 -5.5794e+01 -6.5374e+01 -5.4013e+01 -5.3416e+01 -5.5775e+01 -6.5361e+01 -5.3997e+01 -5.3387e+01 -5.5755e+01 -6.5347e+01 -5.3982e+01 -5.3359e+01 -5.5736e+01 -6.5333e+01 -5.3967e+01 -5.3331e+01 -5.5717e+01 -6.5319e+01 -5.3952e+01 -5.3303e+01 -5.5698e+01 -6.5303e+01 -5.3938e+01 -5.3275e+01 -5.5679e+01 -6.5288e+01 -5.3924e+01 -5.3248e+01 -5.5660e+01 -6.5272e+01 -5.3910e+01 -5.3221e+01 -5.5642e+01 -6.5255e+01 -5.3896e+01 -5.3194e+01 -5.5623e+01 -6.5238e+01 -5.3883e+01 -5.3168e+01 -5.5605e+01 -6.5221e+01 -5.3869e+01 -5.3142e+01 -5.5586e+01 -6.5202e+01 -5.3856e+01 -5.3116e+01 -5.5568e+01 -6.5184e+01 -5.3844e+01 -5.3091e+01 -5.5550e+01 -6.5165e+01 -5.3831e+01 -5.3062e+01 -5.5532e+01 -6.5146e+01 -5.3819e+01 -5.3029e+01 -5.5508e+01 -6.5126e+01 -5.3807e+01 -5.2997e+01 -5.5477e+01 -6.5105e+01 -5.3795e+01 -5.2965e+01 -5.5444e+01 -6.5085e+01 -5.3783e+01 -5.2933e+01 -5.5411e+01 -6.5064e+01 -5.3771e+01 -5.2902e+01 -5.5378e+01 -6.5042e+01 -5.3760e+01 -5.2872e+01 -5.5346e+01 -6.5020e+01 -5.3749e+01 -5.2841e+01 -5.5315e+01 -6.4998e+01 -5.3738e+01 -5.2811e+01 -5.5278e+01 -6.4975e+01 -5.3727e+01 -5.2782e+01 -5.5239e+01 -6.4952e+01 -5.3716e+01 -5.2753e+01 -5.5201e+01 -6.4928e+01 -5.3705e+01 -5.2724e+01 -5.5164e+01 -6.4904e+01 -5.3695e+01 -5.2696e+01 -5.5127e+01 -6.4880e+01 -5.3684e+01 -5.2668e+01 -5.5090e+01 -6.4855e+01 -5.3674e+01 -5.2641e+01 -5.5055e+01 -6.4830e+01 -5.3664e+01 -5.2614e+01 -5.5019e+01 -6.4804e+01 -5.3654e+01 -5.2587e+01 -5.4985e+01 -6.4779e+01 -5.3644e+01 -5.2560e+01 -5.4950e+01 -6.4752e+01 -5.3634e+01 -5.2552e+01 -5.4917e+01 -6.4726e+01 -5.3624e+01 -5.2570e+01 -5.4884e+01 -6.4699e+01 -5.3614e+01 -5.2589e+01 -5.4851e+01 -6.4672e+01 -5.3604e+01 -5.2607e+01 -5.4818e+01 -6.4644e+01 -5.3595e+01 -5.2624e+01 -5.4787e+01 -6.4616e+01 -5.3585e+01 -5.2642e+01 -5.4755e+01 -6.4588e+01 -5.3576e+01 -5.2659e+01 -5.4724e+01 -6.4560e+01 -5.3567e+01 -5.2675e+01 -5.4694e+01 -6.4531e+01 -5.3557e+01 -5.2691e+01 -5.4663e+01 -6.4502e+01 -5.3548e+01 -5.2707e+01 -5.4634e+01 -6.4473e+01 -5.3539e+01 -5.2723e+01 -5.4604e+01 -6.4443e+01 -5.3530e+01 -5.2739e+01 -5.4575e+01 -6.4413e+01 -5.3521e+01 -5.2754e+01 -5.4547e+01 -6.4383e+01 -5.3512e+01 -5.2768e+01 -5.4519e+01 -6.4352e+01 -5.3500e+01 -5.2783e+01 -5.4491e+01 -6.4321e+01 -5.3476e+01 -5.2797e+01 -5.4463e+01 -6.4290e+01 -5.3451e+01 -5.2811e+01 -5.4436e+01 -6.4289e+01 -5.3427e+01 -5.2824e+01 -5.4409e+01 -6.4302e+01 -5.3404e+01 -5.2837e+01 -5.4383e+01 -6.4314e+01 -5.3381e+01 -5.2850e+01 -5.4357e+01 -6.4324e+01 -5.3358e+01 -5.2863e+01 -5.4331e+01 -6.4334e+01 -5.3336e+01 -5.2875e+01 -5.4305e+01 -6.4343e+01 -5.3314e+01 -5.2887e+01 -5.4280e+01 -6.4352e+01 -5.3292e+01 -5.2899e+01 -5.4255e+01 -6.4359e+01 -5.3271e+01 -5.2910e+01 -5.4230e+01 -6.4365e+01 -5.3250e+01 -5.2921e+01 -5.4206e+01 -6.4371e+01 -5.3229e+01 -5.2932e+01 -5.4182e+01 -6.4376e+01 -5.3209e+01 -5.2943e+01 -5.4158e+01 -6.4380e+01 -5.3189e+01 -5.2953e+01 -5.4134e+01 -6.4383e+01 -5.3169e+01 -5.2963e+01 -5.4111e+01 -6.4385e+01 -5.3150e+01 -5.2973e+01 -5.4088e+01 -6.4387e+01 -5.3131e+01 -5.2982e+01 -5.4065e+01 -6.4388e+01 -5.3112e+01 -5.2991e+01 -5.4042e+01 -6.4388e+01 -5.3094e+01 -5.3000e+01 -5.4020e+01 -6.4388e+01 -5.3076e+01 -5.3009e+01 -5.3998e+01 -6.4386e+01 -5.3058e+01 -5.3017e+01 -5.3976e+01 -6.4384e+01 -5.3040e+01 -5.3025e+01 -5.3954e+01 -6.4381e+01 -5.3022e+01 -5.3033e+01 -5.3932e+01 -6.4378e+01 -5.3005e+01 -5.3041e+01 -5.3911e+01 -6.4374e+01 -5.2988e+01 -5.3048e+01 -5.3890e+01 -6.4369e+01 -5.2972e+01 -5.3055e+01 -5.3869e+01 -6.4364e+01 -5.2955e+01 -5.3062e+01 -5.3848e+01 -6.4357e+01 -5.2939e+01 -5.3069e+01 -5.3828e+01 -6.4351e+01 -5.2923e+01 -5.3075e+01 -5.3807e+01 -6.4343e+01 -5.2907e+01 -5.3081e+01 -5.3787e+01 -6.4335e+01 -5.2891e+01 -5.3087e+01 -5.3767e+01 -6.4326e+01 -5.2876e+01 -5.3092e+01 -5.3747e+01 -6.4317e+01 -5.2861e+01 -5.3098e+01 -5.3728e+01 -6.4307e+01 -5.2846e+01 -5.3103e+01 -5.3708e+01 -6.4297e+01 -5.2831e+01 -5.3105e+01 -5.3689e+01 -6.4286e+01 -5.2813e+01 -5.3102e+01 -5.3670e+01 -6.4274e+01 -5.2790e+01 -5.3098e+01 -5.3651e+01 -6.4262e+01 -5.2768e+01 -5.3095e+01 -5.3632e+01 -6.4249e+01 -5.2747e+01 -5.3092e+01 -5.3613e+01 -6.4235e+01 -5.2725e+01 -5.3088e+01 -5.3595e+01 -6.4222e+01 -5.2704e+01 -5.3126e+01 -5.3576e+01 -6.4202e+01 -5.2683e+01 -5.3166e+01 -5.3558e+01 -6.4179e+01 -5.2663e+01 -5.3206e+01 -5.3540e+01 -6.4156e+01 -5.2643e+01 -5.3245e+01 -5.3522e+01 -6.4133e+01 -5.2623e+01 -5.3284e+01 -5.3504e+01 -6.4109e+01 -5.2604e+01 -5.3322e+01 -5.3486e+01 -6.4085e+01 -5.2585e+01 -5.3359e+01 -5.3469e+01 -6.4060e+01 -5.2566e+01 -5.3395e+01 -5.3451e+01 -6.4036e+01 -5.2547e+01 -5.3431e+01 -5.3434e+01 -6.4011e+01 -5.2529e+01 -5.3466e+01 -5.3422e+01 -6.3985e+01 -5.2511e+01 -5.3501e+01 -5.3442e+01 -6.3960e+01 -5.2493e+01 -5.3534e+01 -5.3460e+01 -6.3934e+01 -5.2476e+01 -5.3567e+01 -5.3471e+01 -6.3908e+01 -5.2458e+01 -5.3592e+01 -5.3482e+01 -6.3881e+01 -5.2441e+01 -5.3616e+01 -5.3492e+01 -6.3855e+01 -5.2424e+01 -5.3640e+01 -5.3502e+01 -6.3828e+01 -5.2408e+01 -5.3663e+01 -5.3512e+01 -6.3801e+01 -5.2391e+01 -5.3686e+01 -5.3522e+01 -6.3773e+01 -5.2375e+01 -5.3708e+01 -5.3532e+01 -6.3745e+01 -5.2359e+01 -5.3730e+01 -5.3542e+01 -6.3718e+01 -5.2344e+01 -5.3752e+01 -5.3551e+01 -6.3689e+01 -5.2328e+01 -5.3773e+01 -5.3560e+01 -6.3661e+01 -5.2313e+01 -5.3794e+01 -5.3569e+01 -6.3632e+01 -5.2298e+01 -5.3814e+01 -5.3578e+01 -6.3603e+01 -5.2283e+01 -5.3834e+01 -5.3587e+01 -6.3574e+01 -5.2268e+01 -5.3854e+01 -5.3596e+01 -6.3545e+01 -5.2253e+01 -5.3873e+01 -5.3604e+01 -6.3515e+01 -5.2239e+01 -5.3892e+01 -5.3612e+01 -6.3485e+01 -5.2225e+01 -5.3910e+01 -5.3620e+01 -6.3455e+01 -5.2211e+01 -5.3928e+01 -5.3628e+01 -6.3425e+01 -5.2197e+01 -5.3946e+01 -5.3636e+01 -6.3394e+01 -5.2183e+01 -5.3963e+01 -5.3643e+01 -6.3363e+01 -5.2169e+01 -5.3980e+01 -5.3650e+01 -6.3332e+01 -5.2156e+01 -5.3996e+01 -5.3649e+01 -6.3301e+01 -5.2143e+01 -5.4012e+01 -5.3648e+01 -6.3270e+01 -5.2130e+01 -5.4028e+01 -5.3654e+01 -6.3239e+01 -5.2117e+01 -5.4043e+01 -5.3689e+01 -6.3207e+01 -5.2104e+01 -5.4058e+01 -5.3725e+01 -6.3175e+01 -5.2091e+01 -5.4072e+01 -5.3759e+01 -6.3143e+01 -5.2078e+01 -5.4087e+01 -5.3794e+01 -6.3111e+01 -5.2066e+01 -5.4100e+01 -5.3827e+01 -6.3078e+01 -5.2054e+01 -5.4114e+01 -5.3861e+01 -6.3046e+01 -5.2041e+01 -5.4127e+01 -5.3894e+01 -6.3013e+01 -5.2029e+01 -5.4140e+01 -5.3926e+01 -6.2980e+01 -5.2017e+01 -5.4152e+01 -5.3958e+01 -6.2947e+01 -5.2005e+01 -5.4164e+01 -5.3989e+01 -6.2913e+01 -5.1994e+01 -5.4176e+01 -5.4020e+01 -6.2880e+01 -5.1982e+01 -5.4187e+01 -5.4051e+01 -6.2846e+01 -5.1970e+01 -5.4198e+01 -5.4073e+01 -6.2813e+01 -5.1959e+01 -5.4209e+01 -5.4091e+01 -6.2779e+01 -5.1948e+01 -5.4218e+01 -5.4105e+01 -6.2745e+01 -5.1936e+01 -5.4220e+01 -5.4118e+01 -6.2711e+01 -5.1925e+01 -5.4222e+01 -5.4132e+01 -6.2676e+01 -5.1914e+01 -5.4224e+01 -5.4145e+01 -6.2642e+01 -5.1903e+01 -5.4225e+01 -5.4158e+01 -6.2607e+01 -5.1892e+01 -5.4227e+01 -5.4171e+01 -6.2573e+01 -5.1881e+01 -5.4228e+01 -5.4178e+01 -6.2538e+01 -5.1871e+01 -5.4229e+01 -5.4183e+01 -6.2503e+01 -5.1860e+01 -5.4230e+01 -5.4183e+01 -6.2468e+01 -5.1850e+01 -5.4231e+01 -5.4180e+01 -6.2433e+01 -5.1839e+01 -5.4232e+01 -5.4178e+01 -6.2397e+01 -5.1829e+01 -5.4233e+01 -5.4176e+01 -6.2362e+01 -5.1818e+01 -5.4248e+01 -5.4174e+01 -6.2326e+01 -5.1808e+01 -5.4292e+01 -5.4172e+01 -6.2291e+01 -5.1798e+01 -5.4330e+01 -5.4170e+01 -6.2255e+01 -5.1788e+01 -5.4366e+01 -5.4169e+01 -6.2219e+01 -5.1778e+01 -5.4401e+01 -5.4167e+01 -6.2181e+01 -5.1768e+01 -5.4435e+01 -5.4166e+01 -6.2137e+01 -5.1758e+01 -5.4468e+01 -5.4165e+01 -6.2093e+01 -5.1748e+01 -5.4501e+01 -5.4165e+01 -6.2050e+01 -5.1738e+01 -5.4534e+01 -5.4164e+01 -6.2006e+01 -5.1728e+01 -5.4565e+01 -5.4164e+01 -6.1962e+01 -5.1719e+01 -5.4597e+01 -5.4163e+01 -6.1919e+01 -5.1709e+01 -5.4627e+01 -5.4163e+01 -6.1896e+01 -5.1736e+01 -5.4657e+01 -5.4163e+01 -6.1897e+01 -5.1770e+01 -5.4687e+01 -5.4163e+01 -6.1898e+01 -5.1804e+01 -5.4716e+01 -5.4163e+01 -6.1898e+01 -5.1838e+01 -5.4737e+01 -5.4163e+01 -6.1897e+01 -5.1870e+01 -5.4757e+01 -5.4163e+01 -6.1896e+01 -5.1903e+01 -5.4774e+01 -5.4163e+01 -6.1894e+01 -5.1934e+01 -5.4785e+01 -5.4163e+01 -6.1892e+01 -5.1965e+01 -5.4796e+01 -5.4164e+01 -6.1889e+01 -5.1990e+01 -5.4807e+01 -5.4163e+01 -6.1886e+01 -5.2012e+01 -5.4818e+01 -5.4155e+01 -6.1882e+01 -5.2031e+01 -5.4829e+01 -5.4148e+01 -6.1878e+01 -5.2045e+01 -5.4839e+01 -5.4141e+01 -6.1873e+01 -5.2058e+01 -5.4850e+01 -5.4134e+01 -6.1905e+01 -5.2071e+01 -5.4860e+01 -5.4127e+01 -6.1988e+01 -5.2084e+01 -5.4870e+01 -5.4120e+01 -6.2069e+01 -5.2097e+01 -5.4880e+01 -5.4114e+01 -6.2149e+01 -5.2109e+01 -5.4889e+01 -5.4108e+01 -6.2226e+01 -5.2122e+01 -5.4899e+01 -5.4102e+01 -6.2302e+01 -5.2148e+01 -5.4908e+01 -5.4096e+01 -6.2376e+01 -5.2205e+01 -5.4916e+01 -5.4090e+01 -6.2449e+01 -5.2261e+01 -5.4914e+01 -5.4084e+01 -6.2520e+01 -5.2315e+01 -5.4907e+01 -5.4079e+01 -6.2589e+01 -5.2369e+01 -5.4900e+01 -5.4073e+01 -6.2656e+01 -5.2423e+01 -5.4894e+01 -5.4068e+01 -6.2722e+01 -5.2475e+01 -5.4887e+01 -5.4063e+01 -6.2786e+01 -5.2527e+01 -5.4881e+01 -5.4058e+01 -6.2849e+01 -5.2577e+01 -5.4874e+01 -5.4056e+01 -6.2910e+01 -5.2627e+01 -5.4868e+01 -5.4088e+01 -6.2970e+01 -5.2677e+01 -5.4862e+01 -5.4119e+01 -6.3028e+01 -5.2725e+01 -5.4857e+01 -5.4150e+01 -6.3084e+01 -5.2765e+01 -5.4851e+01 -5.4181e+01 -6.3139e+01 -5.2804e+01 -5.4845e+01 -5.4211e+01 -6.3193e+01 -5.2843e+01 -5.4840e+01 -5.4241e+01 -6.3245e+01 -5.2881e+01 -5.4834e+01 -5.4270e+01 -6.3296e+01 -5.2918e+01 -5.4829e+01 -5.4299e+01 -6.3345e+01 -5.2955e+01 -5.4824e+01 -5.4327e+01 -6.3393e+01 -5.2991e+01 -5.4818e+01 -5.4356e+01 -6.3439e+01 -5.3027e+01 -5.4805e+01 -5.4383e+01 -6.3484e+01 -5.3062e+01 -5.4792e+01 -5.4411e+01 -6.3528e+01 -5.3097e+01 -5.4780e+01 -5.4437e+01 -6.3571e+01 -5.3131e+01 -5.4767e+01 -5.4464e+01 -6.3612e+01 -5.3164e+01 -5.4755e+01 -5.4490e+01 -6.3652e+01 -5.3197e+01 -5.4743e+01 -5.4516e+01 -6.3690e+01 -5.3230e+01 -5.4731e+01 -5.4541e+01 -6.3727e+01 -5.3262e+01 -5.4720e+01 -5.4566e+01 -6.3763e+01 -5.3293e+01 -5.4709e+01 -5.4590e+01 -6.3798e+01 -5.3324e+01 -5.4698e+01 -5.4614e+01 -6.3832e+01 -5.3354e+01 -5.4687e+01 -5.4638e+01 -6.3864e+01 -5.3384e+01 -5.4676e+01 -5.4661e+01 -6.3895e+01 -5.3413e+01 -5.4665e+01 -5.4684e+01 -6.3925e+01 -5.3442e+01 -5.4655e+01 -5.4707e+01 -6.3954e+01 -5.3471e+01 -5.4644e+01 -5.4729e+01 -6.3982e+01 -5.3498e+01 -5.4634e+01 -5.4750e+01 -6.4009e+01 -5.3526e+01 -5.4624e+01 -5.4771e+01 -6.4034e+01 -5.3552e+01 -5.4614e+01 -5.4792e+01 -6.4058e+01 -5.3579e+01 -5.4605e+01 -5.4813e+01 -6.4082e+01 -5.3612e+01 -5.4595e+01 -5.4833e+01 -6.4104e+01 -5.3674e+01 -5.4583e+01 -5.4852e+01 -6.4125e+01 -5.3735e+01 -5.4565e+01 -5.4871e+01 -6.4145e+01 -5.3795e+01 -5.4548e+01 -5.4890e+01 -6.4165e+01 -5.3854e+01 -5.4532e+01 -5.4909e+01 -6.4183e+01 -5.3912e+01 -5.4515e+01 -5.4927e+01 -6.4200e+01 -5.3969e+01 -5.4499e+01 -5.4944e+01 -6.4216e+01 -5.4026e+01 -5.4483e+01 -5.4962e+01 -6.4231e+01 -5.4081e+01 -5.4467e+01 -5.4978e+01 -6.4245e+01 -5.4136e+01 -5.4451e+01 -5.4995e+01 -6.4258e+01 -5.4189e+01 -5.4436e+01 -5.5011e+01 -6.4262e+01 -5.4242e+01 -5.4421e+01 -5.5027e+01 -6.4266e+01 -5.4294e+01 -5.4406e+01 -5.5042e+01 -6.4269e+01 -5.4345e+01 -5.4391e+01 -5.5057e+01 -6.4271e+01 -5.4395e+01 -5.4377e+01 -5.5071e+01 -6.4266e+01 -5.4444e+01 -5.4362e+01 -5.5086e+01 -6.4259e+01 -5.4487e+01 -5.4348e+01 -5.5099e+01 -6.4251e+01 -5.4527e+01 -5.4334e+01 -5.5113e+01 -6.4243e+01 -5.4566e+01 -5.4321e+01 -5.5126e+01 -6.4235e+01 -5.4604e+01 -5.4307e+01 -5.5139e+01 -6.4226e+01 -5.4642e+01 -5.4294e+01 -5.5151e+01 -6.4217e+01 -5.4679e+01 -5.4280e+01 -5.5163e+01 -6.4207e+01 -5.4715e+01 -5.4267e+01 -5.5174e+01 -6.4197e+01 -5.4751e+01 -5.4254e+01 -5.5186e+01 -6.4186e+01 -5.4786e+01 -5.4241e+01 -5.5197e+01 -6.4175e+01 -5.4821e+01 -5.4229e+01 -5.5207e+01 -6.4163e+01 -5.4853e+01 -5.4216e+01 -5.5217e+01 -6.4151e+01 -5.4879e+01 -5.4204e+01 -5.5227e+01 -6.4139e+01 -5.4904e+01 -5.4191e+01 -5.5237e+01 -6.4126e+01 -5.4928e+01 -5.4179e+01 -5.5246e+01 -6.4112e+01 -5.4953e+01 -5.4167e+01 -5.5254e+01 -6.4099e+01 -5.4976e+01 -5.4155e+01 -5.5263e+01 -6.4084e+01 -5.5000e+01 -5.4143e+01 -5.5271e+01 -6.4070e+01 -5.5023e+01 -5.4131e+01 -5.5272e+01 -6.4055e+01 -5.5045e+01 -5.4119e+01 -5.5272e+01 -6.4039e+01 -5.5067e+01 -5.4107e+01 -5.5271e+01 -6.4015e+01 -5.5089e+01 -5.4096e+01 -5.5271e+01 -6.3991e+01 -5.5122e+01 -5.4084e+01 -5.5270e+01 -6.3967e+01 -5.5180e+01 -5.4073e+01 -5.5269e+01 -6.3943e+01 -5.5236e+01 -5.4061e+01 -5.5268e+01 -6.3918e+01 -5.5292e+01 -5.4050e+01 -5.5267e+01 -6.3893e+01 -5.5347e+01 -5.4039e+01 -5.5265e+01 -6.3868e+01 -5.5401e+01 -5.4028e+01 -5.5264e+01 -6.3843e+01 -5.5454e+01 -5.4017e+01 -5.5262e+01 -6.3818e+01 -5.5506e+01 -5.4005e+01 -5.5261e+01 -6.3792e+01 -5.5557e+01 -5.3994e+01 -5.5259e+01 -6.3767e+01 -5.5608e+01 -5.3983e+01 -5.5257e+01 -6.3741e+01 -5.5658e+01 -5.3972e+01 -5.5254e+01 -6.3714e+01 -5.5707e+01 -5.3962e+01 -5.5252e+01 -6.3688e+01 -5.5755e+01 -5.3951e+01 -5.5250e+01 -6.3662e+01 -5.5802e+01 -5.3940e+01 -5.5247e+01 -6.3635e+01 -5.5848e+01 -5.3929e+01 -5.5244e+01 -6.3608e+01 -5.5887e+01 -5.3918e+01 -5.5241e+01 -6.3581e+01 -5.5924e+01 -5.3908e+01 -5.5238e+01 -6.3554e+01 -5.5961e+01 -5.3897e+01 -5.5235e+01 -6.3526e+01 -5.5997e+01 -5.3886e+01 -5.5232e+01 -6.3499e+01 -5.6032e+01 -5.3871e+01 -5.5228e+01 -6.3471e+01 -5.6066e+01 -5.3852e+01 -5.5225e+01 -6.3443e+01 -5.6100e+01 -5.3834e+01 -5.5221e+01 -6.3415e+01 -5.6134e+01 -5.3816e+01 -5.5217e+01 -6.3386e+01 -5.6167e+01 -5.3798e+01 -5.5213e+01 -6.3358e+01 -5.6199e+01 -5.3780e+01 -5.5200e+01 -6.3329e+01 -5.6230e+01 -5.3763e+01 -5.5188e+01 -6.3300e+01 -5.6261e+01 -5.3745e+01 -5.5176e+01 -6.3271e+01 -5.6292e+01 -5.3728e+01 -5.5164e+01 -6.3242e+01 -5.6322e+01 -5.3711e+01 -5.5152e+01 -6.3213e+01 -5.6351e+01 -5.3694e+01 -5.5140e+01 -6.3183e+01 -5.6380e+01 -5.3678e+01 -5.5128e+01 -6.3154e+01 -5.6408e+01 -5.3661e+01 -5.5116e+01 -6.3124e+01 -5.6435e+01 -5.3645e+01 -5.5104e+01 -6.3094e+01 -5.6462e+01 -5.3629e+01 -5.5092e+01 -6.3064e+01 -5.6489e+01 -5.3613e+01 -5.5080e+01 -6.3033e+01 -5.6515e+01 -5.3597e+01 -5.5069e+01 -6.3003e+01 -5.6540e+01 -5.3581e+01 -5.5057e+01 -6.2972e+01 -5.6565e+01 -5.3566e+01 -5.5045e+01 -6.2942e+01 -5.6589e+01 -5.3550e+01 -5.5033e+01 -6.2911e+01 -5.6609e+01 -5.3535e+01 -5.5021e+01 -6.2880e+01 -5.6624e+01 -5.3520e+01 -5.5010e+01 -6.2848e+01 -5.6639e+01 -5.3505e+01 -5.4998e+01 -6.2817e+01 -5.6653e+01 -5.3490e+01 -5.4986e+01 -6.2786e+01 -5.6667e+01 -5.3475e+01 -5.4974e+01 -6.2754e+01 -5.6681e+01 -5.3461e+01 -5.4958e+01 -6.2722e+01 -5.6695e+01 -5.3446e+01 -5.4938e+01 -6.2691e+01 -5.6708e+01 -5.3431e+01 -5.4919e+01 -6.2659e+01 -5.6720e+01 -5.3417e+01 -5.4900e+01 -6.2626e+01 -5.6733e+01 -5.3403e+01 -5.4881e+01 -6.2594e+01 -5.6745e+01 -5.3389e+01 -5.4862e+01 -6.2562e+01 -5.6757e+01 -5.3375e+01 -5.4843e+01 -6.2529e+01 -5.6768e+01 -5.3361e+01 -5.4825e+01 -6.2497e+01 -5.6779e+01 -5.3347e+01 -5.4806e+01 -6.2464e+01 -5.6790e+01 -5.3333e+01 -5.4788e+01 -6.2431e+01 -5.6800e+01 -5.3319e+01 -5.4770e+01 -6.2398e+01 -5.6810e+01 -5.3305e+01 -5.4752e+01 -6.2365e+01 -5.6820e+01 -5.3292e+01 -5.4734e+01 -6.2332e+01 -5.6829e+01 -5.3278e+01 -5.4716e+01 -6.2299e+01 -5.6838e+01 -5.3265e+01 -5.4692e+01 -6.2265e+01 -5.6846e+01 -5.3252e+01 -5.4666e+01 -6.2232e+01 -5.6855e+01 -5.3238e+01 -5.4642e+01 -6.2198e+01 -5.6863e+01 -5.3225e+01 -5.4617e+01 -6.2165e+01 -5.6870e+01 -5.3212e+01 -5.4593e+01 -6.2131e+01 -5.6878e+01 -5.3199e+01 -5.4569e+01 -6.2097e+01 -5.6884e+01 -5.3186e+01 -5.4545e+01 -6.2063e+01 -5.6891e+01 -5.3173e+01 -5.4522e+01 -6.2029e+01 -5.6897e+01 -5.3160e+01 -5.4497e+01 -6.1989e+01 -5.6897e+01 -5.3147e+01 -5.4466e+01 -6.1947e+01 -5.6895e+01 -5.3134e+01 -5.4436e+01 -6.1905e+01 -5.6893e+01 -5.3122e+01 -5.4406e+01 -6.1863e+01 -5.6890e+01 -5.3109e+01 -5.4377e+01 -6.1821e+01 -5.6887e+01 -5.3096e+01 -5.4347e+01 -6.1780e+01 -5.6882e+01 -5.3084e+01 -5.4319e+01 -6.1738e+01 -5.6871e+01 -5.3071e+01 -5.4287e+01 -6.1697e+01 -5.6861e+01 -5.3059e+01 -5.4252e+01 -6.1655e+01 -5.6850e+01 -5.3046e+01 -5.4216e+01 -6.1614e+01 -5.6839e+01 -5.3034e+01 -5.4182e+01 -6.1571e+01 -5.6828e+01 -5.3019e+01 -5.4148e+01 -6.1522e+01 -5.6816e+01 -5.2999e+01 -5.4114e+01 -6.1469e+01 -5.6797e+01 -5.2979e+01 -5.4081e+01 -6.1412e+01 -5.6779e+01 -5.2959e+01 -5.4049e+01 -6.1357e+01 -5.6761e+01 -5.2940e+01 -5.4017e+01 -6.1301e+01 -5.6743e+01 -5.2920e+01 -5.3985e+01 -6.1246e+01 -5.6725e+01 -5.2901e+01 -5.3955e+01 -6.1192e+01 -5.6707e+01 -5.2882e+01 -5.3924e+01 -6.1138e+01 -5.6690e+01 -5.2864e+01 -5.3894e+01 -6.1084e+01 -5.6673e+01 -5.2846e+01 -5.3864e+01 -6.1031e+01 -5.6655e+01 -5.2873e+01 -5.3835e+01 -6.0978e+01 -5.6638e+01 -5.2898e+01 -5.3807e+01 -6.0926e+01 -5.6622e+01 -5.2924e+01 -5.3778e+01 -6.0874e+01 -5.6605e+01 -5.2949e+01 -5.3750e+01 -6.0822e+01 -5.6588e+01 -5.2973e+01 -5.3714e+01 -6.0771e+01 -5.6572e+01 -5.2997e+01 -5.3680e+01 -6.0720e+01 -5.6556e+01 -5.3021e+01 -5.3645e+01 -6.0670e+01 -5.6540e+01 -5.3044e+01 -5.3612e+01 -6.0620e+01 -5.6524e+01 -5.3067e+01 -5.3579e+01 -6.0570e+01 -5.6508e+01 -5.3089e+01 -5.3546e+01 -6.0520e+01 -5.6492e+01 -5.3111e+01 -5.3514e+01 -6.0471e+01 -5.6476e+01 -5.3132e+01 -5.3482e+01 -6.0416e+01 -5.6460e+01 -5.3153e+01 -5.3451e+01 -6.0360e+01 -5.6445e+01 -5.3174e+01 -5.3421e+01 -6.0304e+01 -5.6429e+01 -5.3194e+01 -5.3391e+01 -6.0249e+01 -5.6414e+01 -5.3213e+01 -5.3361e+01 -6.0194e+01 -5.6398e+01 -5.3233e+01 -5.3332e+01 -6.0140e+01 -5.6383e+01 -5.3252e+01 -5.3304e+01 -6.0086e+01 -5.6363e+01 -5.3270e+01 -5.3276e+01 -6.0033e+01 -5.6335e+01 -5.3288e+01 -5.3248e+01 -5.9980e+01 -5.6304e+01 -5.3306e+01 -5.3220e+01 -5.9928e+01 -5.6274e+01 -5.3323e+01 -5.3194e+01 -5.9876e+01 -5.6244e+01 -5.3340e+01 -5.3167e+01 -5.9825e+01 -5.6215e+01 -5.3356e+01 -5.3141e+01 -5.9774e+01 -5.6179e+01 -5.3372e+01 -5.3115e+01 -5.9723e+01 -5.6143e+01 -5.3388e+01 -5.3090e+01 -5.9673e+01 -5.6107e+01 -5.3403e+01 -5.3065e+01 -5.9623e+01 -5.6072e+01 -5.3418e+01 -5.3040e+01 -5.9574e+01 -5.6037e+01 -5.3432e+01 -5.3016e+01 -5.9525e+01 -5.6003e+01 -5.3447e+01 -5.2992e+01 -5.9476e+01 -5.5969e+01 -5.3460e+01 -5.2969e+01 -5.9428e+01 -5.5936e+01 -5.3474e+01 -5.2946e+01 -5.9380e+01 -5.5903e+01 -5.3487e+01 -5.2923e+01 -5.9333e+01 -5.5871e+01 -5.3499e+01 -5.2900e+01 -5.9286e+01 -5.5838e+01 -5.3512e+01 -5.2878e+01 -5.9239e+01 -5.5799e+01 -5.3524e+01 -5.2856e+01 -5.9193e+01 -5.5760e+01 -5.3535e+01 -5.2834e+01 -5.9147e+01 -5.5722e+01 -5.3547e+01 -5.2813e+01 -5.9101e+01 -5.5685e+01 -5.3558e+01 -5.2792e+01 -5.9056e+01 -5.5648e+01 -5.3568e+01 -5.2771e+01 -5.9010e+01 -5.5612e+01 -5.3579e+01 -5.2751e+01 -5.8966e+01 -5.5576e+01 -5.3588e+01 -5.2730e+01 -5.8921e+01 -5.5541e+01 -5.3598e+01 -5.2710e+01 -5.8877e+01 -5.5507e+01 -5.3607e+01 -5.2691e+01 -5.8833e+01 -5.5472e+01 -5.3616e+01 -5.2671e+01 -5.8790e+01 -5.5439e+01 -5.3625e+01 -5.2652e+01 -5.8747e+01 -5.5406e+01 -5.3633e+01 -5.2633e+01 -5.8704e+01 -5.5373e+01 -5.3641e+01 -5.2614e+01 -5.8661e+01 -5.5341e+01 -5.3649e+01 -5.2596e+01 -5.8618e+01 -5.5310e+01 -5.3657e+01 -5.2577e+01 -5.8576e+01 -5.5279e+01 -5.3664e+01 -5.2559e+01 -5.8535e+01 -5.5248e+01 -5.3671e+01 -5.2541e+01 -5.8493e+01 -5.5218e+01 -5.3677e+01 -5.2524e+01 -5.8452e+01 -5.5188e+01 -5.3683e+01 -5.2506e+01 -5.8411e+01 -5.5158e+01 -5.3689e+01 -5.2489e+01 -5.8370e+01 -5.5129e+01 -5.3695e+01 -5.2472e+01 -5.8329e+01 -5.5101e+01 -5.3700e+01 -5.2455e+01 -5.8289e+01 -5.5073e+01 -5.3706e+01 -5.2438e+01 -5.8249e+01 -5.5045e+01 -5.3710e+01 -5.2422e+01 -5.8209e+01 -5.5017e+01 -5.3715e+01 -5.2419e+01 -5.8169e+01 -5.4990e+01 -5.3719e+01 -5.2439e+01 -5.8130e+01 -5.4963e+01 -5.3723e+01 -5.2459e+01 -5.8091e+01 -5.4937e+01 -5.3727e+01 -5.2479e+01 -5.8052e+01 -5.4911e+01 -5.3731e+01 -5.2498e+01 -5.8013e+01 -5.4885e+01 -5.3734e+01 -5.2517e+01 -5.8012e+01 -5.4859e+01 -5.3737e+01 -5.2536e+01 -5.8017e+01 -5.4829e+01 -5.3740e+01 -5.2555e+01 -5.8023e+01 -5.4796e+01 -5.3742e+01 -5.2566e+01 -5.8028e+01 -5.4764e+01 -5.3745e+01 -5.2576e+01 -5.8032e+01 -5.4732e+01 -5.3747e+01 -5.2586e+01 -5.8036e+01 -5.4701e+01 -5.3749e+01 -5.2596e+01 -5.8040e+01 -5.4670e+01 -5.3750e+01 -5.2606e+01 -5.8043e+01 -5.4639e+01 -5.3751e+01 -5.2616e+01 -5.8046e+01 -5.4609e+01 -5.3744e+01 -5.2625e+01 -5.8048e+01 -5.4580e+01 -5.3737e+01 -5.2635e+01 -5.8050e+01 -5.4550e+01 -5.3730e+01 -5.2644e+01 -5.8052e+01 -5.4522e+01 -5.3723e+01 -5.2653e+01 -5.8053e+01 -5.4493e+01 -5.3712e+01 -5.2662e+01 -5.8054e+01 -5.4465e+01 -5.3697e+01 -5.2671e+01 -5.8054e+01 -5.4438e+01 -5.3682e+01 -5.2680e+01 -5.8054e+01 -5.4410e+01 -5.3668e+01 -5.2689e+01 -5.8054e+01 -5.4384e+01 -5.3653e+01 -5.2697e+01 -5.8053e+01 -5.4357e+01 -5.3639e+01 -5.2706e+01 -5.8045e+01 -5.4331e+01 -5.3625e+01 -5.2714e+01 -5.8036e+01 -5.4305e+01 -5.3611e+01 -5.2738e+01 -5.8027e+01 -5.4279e+01 -5.3597e+01 -5.2783e+01 -5.8017e+01 -5.4254e+01 -5.3583e+01 -5.2827e+01 -5.8007e+01 -5.4229e+01 -5.3569e+01 -5.2870e+01 -5.7997e+01 -5.4205e+01 -5.3556e+01 -5.2913e+01 -5.7987e+01 -5.4180e+01 -5.3543e+01 -5.2955e+01 -5.7976e+01 -5.4156e+01 -5.3529e+01 -5.2996e+01 -5.7966e+01 -5.4133e+01 -5.3516e+01 -5.3037e+01 -5.7955e+01 -5.4109e+01 -5.3503e+01 -5.3077e+01 -5.7944e+01 -5.4086e+01 -5.3490e+01 -5.3117e+01 -5.7929e+01 -5.4063e+01 -5.3477e+01 -5.3156e+01 -5.7910e+01 -5.4040e+01 -5.3464e+01 -5.3194e+01 -5.7891e+01 -5.4018e+01 -5.3452e+01 -5.3242e+01 -5.7872e+01 -5.3996e+01 -5.3439e+01 -5.3316e+01 -5.7853e+01 -5.3974e+01 -5.3427e+01 -5.3382e+01 -5.7834e+01 -5.3952e+01 -5.3408e+01 -5.3446e+01 -5.7815e+01 -5.3931e+01 -5.3388e+01 -5.3509e+01 -5.7796e+01 -5.3909e+01 -5.3368e+01 -5.3572e+01 -5.7777e+01 -5.3888e+01 -5.3348e+01 -5.3633e+01 -5.7758e+01 -5.3867e+01 -5.3329e+01 -5.3694e+01 -5.7739e+01 -5.3847e+01 -5.3310e+01 -5.3754e+01 -5.7720e+01 -5.3826e+01 -5.3291e+01 -5.3812e+01 -5.7701e+01 -5.3806e+01 -5.3272e+01 -5.3871e+01 -5.7682e+01 -5.3786e+01 -5.3254e+01 -5.3928e+01 -5.7663e+01 -5.3766e+01 -5.3235e+01 -5.4003e+01 -5.7644e+01 -5.3747e+01 -5.3217e+01 -5.4092e+01 -5.7625e+01 -5.3727e+01 -5.3200e+01 -5.4175e+01 -5.7606e+01 -5.3708e+01 -5.3182e+01 -5.4257e+01 -5.7587e+01 -5.3689e+01 -5.3165e+01 -5.4335e+01 -5.7568e+01 -5.3670e+01 -5.3148e+01 -5.4406e+01 -5.7549e+01 -5.3651e+01 -5.3131e+01 -5.4477e+01 -5.7530e+01 -5.3632e+01 -5.3114e+01 -5.4547e+01 -5.7511e+01 -5.3614e+01 -5.3097e+01 -5.4617e+01 -5.7492e+01 -5.3596e+01 -5.3081e+01 -5.4685e+01 -5.7473e+01 -5.3578e+01 -5.3065e+01 -5.4753e+01 -5.7454e+01 -5.3560e+01 -5.3049e+01 -5.4819e+01 -5.7435e+01 -5.3542e+01 -5.3033e+01 -5.4885e+01 -5.7416e+01 -5.3524e+01 -5.3017e+01 -5.4950e+01 -5.7397e+01 -5.3498e+01 -5.3002e+01 -5.5014e+01 -5.7378e+01 -5.3473e+01 -5.2986e+01 -5.5077e+01 -5.7358e+01 -5.3448e+01 -5.2971e+01 -5.5140e+01 -5.7339e+01 -5.3423e+01 -5.2956e+01 -5.5201e+01 -5.7320e+01 -5.3399e+01 -5.2941e+01 -5.5262e+01 -5.7301e+01 -5.3375e+01 -5.2926e+01 -5.5322e+01 -5.7281e+01 -5.3351e+01 -5.2911e+01 -5.5381e+01 -5.7262e+01 -5.3328e+01 -5.2897e+01 -5.5439e+01 -5.7243e+01 -5.3305e+01 -5.2882e+01 -5.5496e+01 -5.7223e+01 -5.3282e+01 -5.2868e+01 -5.5553e+01 -5.7204e+01 -5.3259e+01 -5.2854e+01 -5.5608e+01 -5.7185e+01 -5.3237e+01 -5.2840e+01 -5.5663e+01 -5.7165e+01 -5.3215e+01 -5.2826e+01 -5.5717e+01 -5.7146e+01 -5.3193e+01 -5.2812e+01 -5.5770e+01 -5.7126e+01 -5.3172e+01 -5.2798e+01 -5.5822e+01 -5.7107e+01 -5.3150e+01 -5.2785e+01 -5.5874e+01 -5.7087e+01 -5.3119e+01 -5.2771e+01 -5.5925e+01 -5.7068e+01 -5.3083e+01 -5.2758e+01 -5.5975e+01 -5.7048e+01 -5.3047e+01 -5.2745e+01 -5.6024e+01 -5.7028e+01 -5.3011e+01 -5.2731e+01 -5.6072e+01 -5.7009e+01 -5.2977e+01 -5.2715e+01 -5.6119e+01 -5.6989e+01 -5.2942e+01 -5.2694e+01 -5.6166e+01 -5.6969e+01 -5.2909e+01 -5.2673e+01 -5.6212e+01 -5.6949e+01 -5.2876e+01 -5.2652e+01 -5.6257e+01 -5.6929e+01 -5.2843e+01 -5.2624e+01 -5.6301e+01 -5.6910e+01 -5.2811e+01 -5.2597e+01 -5.6345e+01 -5.6890e+01 -5.2780e+01 -5.2570e+01 -5.6388e+01 -5.6870e+01 -5.2749e+01 -5.2543e+01 -5.6430e+01 -5.6850e+01 -5.2719e+01 -5.2517e+01 -5.6467e+01 -5.6830e+01 -5.2689e+01 -5.2491e+01 -5.6499e+01 -5.6810e+01 -5.2659e+01 -5.2465e+01 -5.6531e+01 -5.6790e+01 -5.2630e+01 -5.2440e+01 -5.6563e+01 -5.6770e+01 -5.2602e+01 -5.2416e+01 -5.6594e+01 -5.6750e+01 -5.2574e+01 -5.2391e+01 -5.6624e+01 -5.6730e+01 -5.2546e+01 -5.2367e+01 -5.6654e+01 -5.6710e+01 -5.2519e+01 -5.2344e+01 -5.6683e+01 -5.6689e+01 -5.2492e+01 -5.2321e+01 -5.6712e+01 -5.6669e+01 -5.2466e+01 -5.2298e+01 -5.6769e+01 -5.6649e+01 -5.2440e+01 -5.2276e+01 -5.6833e+01 -5.6629e+01 -5.2414e+01 -5.2254e+01 -5.6896e+01 -5.6608e+01 -5.2389e+01 -5.2232e+01 -5.6956e+01 -5.6588e+01 -5.2365e+01 -5.2211e+01 -5.7009e+01 -5.6568e+01 -5.2340e+01 -5.2189e+01 -5.7061e+01 -5.6547e+01 -5.2316e+01 -5.2169e+01 -5.7112e+01 -5.6527e+01 -5.2293e+01 -5.2145e+01 -5.7163e+01 -5.6507e+01 -5.2269e+01 -5.2117e+01 -5.7213e+01 -5.6486e+01 -5.2246e+01 -5.2089e+01 -5.7262e+01 -5.6466e+01 -5.2224e+01 -5.2062e+01 -5.7310e+01 -5.6445e+01 -5.2201e+01 -5.2035e+01 -5.7357e+01 -5.6425e+01 -5.2176e+01 -5.2009e+01 -5.7404e+01 -5.6404e+01 -5.2146e+01 -5.1984e+01 -5.7450e+01 -5.6384e+01 -5.2117e+01 -5.1958e+01 -5.7495e+01 -5.6363e+01 -5.2089e+01 -5.1929e+01 -5.7539e+01 -5.6343e+01 -5.2061e+01 -5.1897e+01 -5.7576e+01 -5.6322e+01 -5.2033e+01 -5.1865e+01 -5.7611e+01 -5.6301e+01 -5.2006e+01 -5.1834e+01 -5.7645e+01 -5.6281e+01 -5.1979e+01 -5.1804e+01 -5.7671e+01 -5.6260e+01 -5.1953e+01 -5.1774e+01 -5.7697e+01 -5.6239e+01 -5.1927e+01 -5.1744e+01 -5.7722e+01 -5.6219e+01 -5.1902e+01 -5.1715e+01 -5.7746e+01 -5.6198e+01 -5.1875e+01 -5.1687e+01 -5.7771e+01 -5.6177e+01 -5.1843e+01 -5.1659e+01 -5.7795e+01 -5.6156e+01 -5.1811e+01 -5.1632e+01 -5.7818e+01 -5.6136e+01 -5.1779e+01 -5.1605e+01 -5.7841e+01 -5.6115e+01 -5.1749e+01 -5.1579e+01 -5.7864e+01 -5.6094e+01 -5.1719e+01 -5.1553e+01 -5.7886e+01 -5.6073e+01 -5.1689e+01 -5.1528e+01 -5.7908e+01 -5.6052e+01 -5.1660e+01 -5.1503e+01 -5.7930e+01 -5.6032e+01 -5.1631e+01 -5.1479e+01 -5.7945e+01 -5.6011e+01 -5.1603e+01 -5.1455e+01 -5.7955e+01 -5.5990e+01 -5.1576e+01 -5.1431e+01 -5.7959e+01 -5.5969e+01 -5.1549e+01 -5.1408e+01 -5.7964e+01 -5.5948e+01 -5.1522e+01 -5.1385e+01 -5.7968e+01 -5.5927e+01 -5.1496e+01 -5.1363e+01 -5.7973e+01 -5.5907e+01 -5.1471e+01 -5.1341e+01 -5.7977e+01 -5.5886e+01 -5.1445e+01 -5.1320e+01 -5.7982e+01 -5.5865e+01 -5.1421e+01 -5.1298e+01 -5.7986e+01 -5.5844e+01 -5.1397e+01 -5.1278e+01 -5.7991e+01 -5.5823e+01 -5.1373e+01 -5.1257e+01 -5.7995e+01 -5.5802e+01 -5.1349e+01 -5.1237e+01 -5.7999e+01 -5.5781e+01 -5.1326e+01 -5.1218e+01 -5.8003e+01 -5.5760e+01 -5.1304e+01 -5.1198e+01 -5.8007e+01 -5.5748e+01 -5.1282e+01 -5.1179e+01 -5.8011e+01 -5.5771e+01 -5.1260e+01 -5.1161e+01 -5.8014e+01 -5.5794e+01 -5.1238e+01 -5.1142e+01 -5.8018e+01 -5.5817e+01 -5.1217e+01 -5.1124e+01 -5.8021e+01 -5.5838e+01 -5.1197e+01 -5.1106e+01 -5.8025e+01 -5.5859e+01 -5.1176e+01 -5.1089e+01 -5.8028e+01 -5.5880e+01 -5.1156e+01 -5.1072e+01 -5.8031e+01 -5.5899e+01 -5.1137e+01 -5.1055e+01 -5.8033e+01 -5.5919e+01 -5.1117e+01 -5.1038e+01 -5.8036e+01 -5.5937e+01 -5.1098e+01 -5.1022e+01 -5.8039e+01 -5.5955e+01 -5.1075e+01 -5.1006e+01 -5.8041e+01 -5.5972e+01 -5.1048e+01 -5.0990e+01 -5.8037e+01 -5.5989e+01 -5.1023e+01 -5.0975e+01 -5.8031e+01 -5.6005e+01 -5.0997e+01 -5.0959e+01 -5.8025e+01 -5.6021e+01 -5.0973e+01 -5.0944e+01 -5.8020e+01 -5.6036e+01 -5.0948e+01 -5.0930e+01 -5.8014e+01 -5.6050e+01 -5.0924e+01 -5.0915e+01 -5.8008e+01 -5.6064e+01 -5.0901e+01 -5.0901e+01 -5.8002e+01 -5.6099e+01 -5.0878e+01 -5.0887e+01 -5.7996e+01 -5.6156e+01 -5.0856e+01 -5.0873e+01 -5.7990e+01 -5.6212e+01 -5.0834e+01 -5.0859e+01 -5.7985e+01 -5.6267e+01 -5.0805e+01 -5.0846e+01 -5.7979e+01 -5.6320e+01 -5.0776e+01 -5.0833e+01 -5.7973e+01 -5.6373e+01 -5.0748e+01 -5.0820e+01 -5.7967e+01 -5.6424e+01 -5.0720e+01 -5.0807e+01 -5.7961e+01 -5.6474e+01 -5.0692e+01 -5.0794e+01 -5.7954e+01 -5.6524e+01 -5.0666e+01 -5.0782e+01 -5.7948e+01 -5.6572e+01 -5.0639e+01 -5.0762e+01 -5.7942e+01 -5.6619e+01 -5.0614e+01 -5.0742e+01 -5.7936e+01 -5.6664e+01 -5.0589e+01 -5.0722e+01 -5.7929e+01 -5.6709e+01 -5.0564e+01 -5.0697e+01 -5.7923e+01 -5.6753e+01 -5.0540e+01 -5.0670e+01 -5.7916e+01 -5.6796e+01 -5.0516e+01 -5.0644e+01 -5.7910e+01 -5.6838e+01 -5.0493e+01 -5.0619e+01 -5.7903e+01 -5.6878e+01 -5.0470e+01 -5.0594e+01 -5.7896e+01 -5.6918e+01 -5.0448e+01 -5.0569e+01 -5.7889e+01 -5.6957e+01 -5.0421e+01 -5.0583e+01 -5.7882e+01 -5.6995e+01 -5.0392e+01 -5.0604e+01 -5.7873e+01 -5.7032e+01 -5.0363e+01 -5.0624e+01 -5.7857e+01 -5.7068e+01 -5.0332e+01 -5.0644e+01 -5.7834e+01 -5.7103e+01 -5.0297e+01 -5.0664e+01 -5.7811e+01 -5.7137e+01 -5.0262e+01 -5.0684e+01 -5.7788e+01 -5.7170e+01 -5.0228e+01 -5.0704e+01 -5.7766e+01 -5.7202e+01 -5.0195e+01 -5.0723e+01 -5.7744e+01 -5.7234e+01 -5.0163e+01 -5.0743e+01 -5.7722e+01 -5.7265e+01 -5.0132e+01 -5.0762e+01 -5.7701e+01 -5.7287e+01 -5.0101e+01 -5.0781e+01 -5.7680e+01 -5.7308e+01 -5.0071e+01 -5.0799e+01 -5.7659e+01 -5.7328e+01 -5.0041e+01 -5.0818e+01 -5.7638e+01 -5.7348e+01 -5.0012e+01 -5.0836e+01 -5.7617e+01 -5.7367e+01 -1.0000e+01 -5.0854e+01 -5.7597e+01 -5.7386e+01 -6.0000e+01 -5.0872e+01 -5.7576e+01 -5.7404e+01 -6.0000e+01 -5.0890e+01 -5.7556e+01 -5.7421e+01 -6.0000e+01 -5.0907e+01 -5.7536e+01 -5.7438e+01 -6.0000e+01 -5.0925e+01 -5.7516e+01 -5.7454e+01 -6.0000e+01 -5.0942e+01 -5.7488e+01 -5.7470e+01 -6.0000e+01 -5.0959e+01 -5.7461e+01 -5.7485e+01 -6.0000e+01 -5.0975e+01 -5.7434e+01 -5.7499e+01 -6.0000e+01 -5.0992e+01 -5.7407e+01 -5.7513e+01 -6.0000e+01 -5.1008e+01 -5.7381e+01 -5.7526e+01 -6.0000e+01 -5.1024e+01 -5.7355e+01 -5.7539e+01 -6.0000e+01 -5.1040e+01 -5.7329e+01 -5.7551e+01 -6.0000e+01 -5.1055e+01 -5.7304e+01 -5.7563e+01 -6.0000e+01 -5.1071e+01 -5.7279e+01 -5.7574e+01 -6.0000e+01 -5.1086e+01 -5.7250e+01 -5.7584e+01 -6.0000e+01 -5.1101e+01 -5.7217e+01 -5.7594e+01 -6.0000e+01 -5.1116e+01 -5.7185e+01 -5.7604e+01 -6.0000e+01 -5.1125e+01 -5.7154e+01 -5.7613e+01 -6.0000e+01 -5.1131e+01 -5.7122e+01 -5.7621e+01 -6.0000e+01 -5.1138e+01 -5.7091e+01 -5.7629e+01 -6.0000e+01 -5.1144e+01 -5.7052e+01 -5.7637e+01 -6.0000e+01 -5.1151e+01 -5.7014e+01 -5.7644e+01 -6.0000e+01 -5.1157e+01 -5.6977e+01 -5.7649e+01 -6.0000e+01 -5.1164e+01 -5.6940e+01 -5.7647e+01 -6.0000e+01 -5.1170e+01 -5.6904e+01 -5.7645e+01 -6.0000e+01 -5.1176e+01 -5.6868e+01 -5.7642e+01 -6.0000e+01 -5.1183e+01 -5.6833e+01 -5.7640e+01 -6.0000e+01 -5.1189e+01 -5.6799e+01 -5.7637e+01 -6.0000e+01 -5.1195e+01 -5.6764e+01 -5.7634e+01 -6.0000e+01 -5.1201e+01 -5.6731e+01 -5.7630e+01 -6.0000e+01 -5.1207e+01 -5.6697e+01 -5.7626e+01 -6.0000e+01 -5.1213e+01 -5.6665e+01 -5.7622e+01 -6.0000e+01 -5.1219e+01 -5.6632e+01 -5.7618e+01 -6.0000e+01 -5.1225e+01 -5.6600e+01 -5.7613e+01 -6.0000e+01 -5.1228e+01 -5.6569e+01 -5.7608e+01 -6.0000e+01 -5.1226e+01 -5.6538e+01 -5.7603e+01 -6.0000e+01 -5.1252e+01 -5.6507e+01 -5.7598e+01 -6.0000e+01 -5.1294e+01 -5.6476e+01 -5.7593e+01 -6.0000e+01 -5.1336e+01 -5.6446e+01 -5.7609e+01 -6.0000e+01 -5.1377e+01 -5.6417e+01 -5.7647e+01 -6.0000e+01 -5.1418e+01 -5.6388e+01 -5.7680e+01 -6.0000e+01 -5.1459e+01 -5.6359e+01 -5.7708e+01 -6.0000e+01 -5.1498e+01 -5.6330e+01 -5.7736e+01 -6.0000e+01 -5.1537e+01 -5.6302e+01 -5.7763e+01 -6.0000e+01 -5.1576e+01 -5.6274e+01 -5.7789e+01 -6.0000e+01 -5.1607e+01 -5.6246e+01 -5.7807e+01 -6.0000e+01 -5.1637e+01 -5.6219e+01 -5.7825e+01 -6.0000e+01 -5.1666e+01 -5.6192e+01 -5.7841e+01 -6.0000e+01 -5.1695e+01 -5.6165e+01 -5.7858e+01 -6.0000e+01 -5.1724e+01 -5.6139e+01 -5.7874e+01 -5.9957e+01 -5.1753e+01 -5.6112e+01 -5.7890e+01 -5.9881e+01 -5.1781e+01 -5.6086e+01 -5.7905e+01 -5.9806e+01 -5.1808e+01 -5.6090e+01 -5.7919e+01 -5.9731e+01 -5.1836e+01 -5.6101e+01 -5.7933e+01 -5.9658e+01 -5.1863e+01 -5.6112e+01 -5.7947e+01 -5.9585e+01 -5.1890e+01 -5.6122e+01 -5.7960e+01 -5.9513e+01 -5.1916e+01 -5.6132e+01 -5.7966e+01 -5.9442e+01 -5.1943e+01 -5.6142e+01 -5.7970e+01 -5.9371e+01 -5.1968e+01 -5.6152e+01 -5.7975e+01 -5.9301e+01 -5.1994e+01 -5.6161e+01 -5.7979e+01 -5.9232e+01 -5.2019e+01 -5.6171e+01 -5.7982e+01 -5.9164e+01 -5.2044e+01 -5.6180e+01 -5.7986e+01 -5.9097e+01 -5.2068e+01 -5.6188e+01 -5.7989e+01 -5.9030e+01 -5.2092e+01 -5.6197e+01 -5.7992e+01 -5.8963e+01 -5.2116e+01 -5.6205e+01 -5.7995e+01 -5.8898e+01 -5.2140e+01 -5.6213e+01 -5.7998e+01 -5.8833e+01 -5.2163e+01 -5.6221e+01 -5.8000e+01 -5.8769e+01 -5.2185e+01 -5.6225e+01 -5.8002e+01 -5.8702e+01 -5.2208e+01 -5.6224e+01 -5.8004e+01 -5.8631e+01 -5.2230e+01 -5.6224e+01 -5.8005e+01 -5.8561e+01 -5.2252e+01 -5.6223e+01 -5.8006e+01 -5.8492e+01 -5.2273e+01 -5.6222e+01 -5.8007e+01 -5.8423e+01 -5.2294e+01 -5.6221e+01 -5.8008e+01 -5.8355e+01 -5.2315e+01 -5.6220e+01 -5.8008e+01 -5.8289e+01 -5.2336e+01 -5.6219e+01 -5.8008e+01 -5.8222e+01 -5.2356e+01 -5.6218e+01 -5.8008e+01 -5.8157e+01 -5.2376e+01 -5.6216e+01 -5.8008e+01 -5.8092e+01 -5.2393e+01 -5.6215e+01 -5.8007e+01 -5.8028e+01 -5.2405e+01 -5.6214e+01 -5.8006e+01 -5.7965e+01 -5.2416e+01 -5.6212e+01 -5.8005e+01 -5.7902e+01 -5.2427e+01 -5.6211e+01 -5.8004e+01 -5.7840e+01 -5.2437e+01 -5.6209e+01 -5.8002e+01 -5.7779e+01 -5.2448e+01 -5.6207e+01 -5.8000e+01 -5.7719e+01 -5.2459e+01 -5.6205e+01 -5.7998e+01 -5.7659e+01 -5.2469e+01 -5.6203e+01 -5.7995e+01 -5.7599e+01 -5.2479e+01 -5.6201e+01 -5.7992e+01 -5.7541e+01 -5.2489e+01 -5.6198e+01 -5.7989e+01 -5.7483e+01 -5.2499e+01 -5.6196e+01 -5.7986e+01 -5.7425e+01 -5.2509e+01 -5.6193e+01 -5.7983e+01 -5.7369e+01 -5.2519e+01 -5.6191e+01 -5.7979e+01 -5.7312e+01 -5.2528e+01 -5.6188e+01 -5.7975e+01 -5.7257e+01 -5.2538e+01 -5.6185e+01 -5.7971e+01 -5.7202e+01 -5.2547e+01 -5.6182e+01 -5.7966e+01 -5.7147e+01 -5.2556e+01 -5.6179e+01 -5.7961e+01 -5.7093e+01 -5.2565e+01 -5.6176e+01 -5.7956e+01 -5.7040e+01 -5.2574e+01 -5.6172e+01 -5.7951e+01 -5.6986e+01 -5.2582e+01 -5.6169e+01 -5.7946e+01 -5.6926e+01 -5.2591e+01 -5.6165e+01 -5.7940e+01 -5.6899e+01 -5.2599e+01 -5.6161e+01 -5.7934e+01 -5.6876e+01 -5.2600e+01 -5.6157e+01 -5.7928e+01 -5.6854e+01 -5.2600e+01 -5.6153e+01 -5.7921e+01 -5.6832e+01 -5.2600e+01 -5.6149e+01 -5.7915e+01 -5.6810e+01 -5.2601e+01 -5.6144e+01 -5.7908e+01 -5.6787e+01 -5.2601e+01 -5.6140e+01 -5.7900e+01 -5.6758e+01 -5.2601e+01 -5.6135e+01 -5.7893e+01 -5.6729e+01 -5.2601e+01 -5.6130e+01 -5.7885e+01 -5.6700e+01 -5.2601e+01 -5.6117e+01 -5.7878e+01 -5.6671e+01 -5.2602e+01 -5.6104e+01 -5.7869e+01 -5.6643e+01 -5.2602e+01 -5.6091e+01 -5.7861e+01 -5.6616e+01 -5.2602e+01 -5.6079e+01 -5.7853e+01 -5.6588e+01 -5.2602e+01 -5.6066e+01 -5.7844e+01 -5.6561e+01 -5.2603e+01 -5.6053e+01 -5.7835e+01 -5.6535e+01 -5.2603e+01 -5.6040e+01 -5.7826e+01 -5.6508e+01 -5.2603e+01 -5.6028e+01 -5.7816e+01 -5.6482e+01 -5.2603e+01 -5.6015e+01 -5.7807e+01 -5.6456e+01 -5.2603e+01 -5.6003e+01 -5.7797e+01 -5.6431e+01 -5.2603e+01 -5.5990e+01 -5.7787e+01 -5.6406e+01 -5.2622e+01 -5.5977e+01 -5.7777e+01 -5.6381e+01 -5.2666e+01 -5.5965e+01 -5.7766e+01 -5.6356e+01 -5.2710e+01 -5.5952e+01 -5.7756e+01 -5.6331e+01 -5.2753e+01 -5.5940e+01 -5.7745e+01 -5.6307e+01 -5.2795e+01 -5.5927e+01 -5.7734e+01 -5.6283e+01 -5.2837e+01 -5.5915e+01 -5.7723e+01 -5.6260e+01 -5.2878e+01 -5.5902e+01 -5.7711e+01 -5.6236e+01 -5.2919e+01 -5.5890e+01 -5.7700e+01 -5.6213e+01 -5.2958e+01 -5.5877e+01 -5.7688e+01 -5.6190e+01 -5.2997e+01 -5.5865e+01 -5.7676e+01 -5.6167e+01 -5.3036e+01 -5.5852e+01 -5.7664e+01 -5.6144e+01 -5.3073e+01 -5.5839e+01 -5.7651e+01 -5.6122e+01 -5.3111e+01 -5.5827e+01 -5.7639e+01 -5.6099e+01 -5.3147e+01 -5.5814e+01 -5.7626e+01 -5.6077e+01 -5.3183e+01 -5.5802e+01 -5.7613e+01 -5.6047e+01 -5.3218e+01 -5.5789e+01 -5.7600e+01 -5.6017e+01 -5.3253e+01 -5.5776e+01 -5.7587e+01 -5.5988e+01 -5.3287e+01 -5.5760e+01 -5.7573e+01 -5.5959e+01 -5.3320e+01 -5.5739e+01 -5.7557e+01 -5.5930e+01 -5.3353e+01 -5.5719e+01 -5.7535e+01 -5.5902e+01 -5.3385e+01 -5.5699e+01 -5.7513e+01 -5.5884e+01 -5.3416e+01 -5.5678e+01 -5.7492e+01 -5.5886e+01 -5.3447e+01 -5.5659e+01 -5.7470e+01 -5.5887e+01 -5.3478e+01 -5.5639e+01 -5.7448e+01 -5.5888e+01 -5.3508e+01 -5.5619e+01 -5.7427e+01 -5.5889e+01 -5.3537e+01 -5.5600e+01 -5.7405e+01 -5.5891e+01 -5.3565e+01 -5.5580e+01 -5.7384e+01 -5.5889e+01 -5.3594e+01 -5.5561e+01 -5.7362e+01 -5.5883e+01 -5.3621e+01 -5.5542e+01 -5.7348e+01 -5.5876e+01 -5.3648e+01 -5.5516e+01 -5.7371e+01 -5.5869e+01 -5.3668e+01 -5.5489e+01 -5.7393e+01 -5.5863e+01 -5.3686e+01 -5.5463e+01 -5.7415e+01 -5.5857e+01 -5.3698e+01 -5.5437e+01 -5.7436e+01 -5.5851e+01 -5.3707e+01 -5.5411e+01 -5.7457e+01 -5.5845e+01 -5.3716e+01 -5.5378e+01 -5.7477e+01 -5.5839e+01 -5.3726e+01 -5.5345e+01 -5.7496e+01 -5.5834e+01 -5.3735e+01 -5.5312e+01 -5.7515e+01 -5.5828e+01 -5.3744e+01 -5.5287e+01 -5.7533e+01 -5.5823e+01 -5.3752e+01 -5.5292e+01 -5.7550e+01 -5.5817e+01 -5.3761e+01 -5.5297e+01 -5.7567e+01 -5.5812e+01 -5.3770e+01 -5.5302e+01 -5.7579e+01 -5.5807e+01 -5.3778e+01 -5.5307e+01 -5.7587e+01 -5.5802e+01 -5.3786e+01 -5.5311e+01 -5.7594e+01 -5.5797e+01 -5.3794e+01 -5.5316e+01 -5.7601e+01 -5.5792e+01 -5.3802e+01 -5.5320e+01 -5.7608e+01 -5.5787e+01 -5.3809e+01 -5.5325e+01 -5.7614e+01 -5.5782e+01 -5.3817e+01 -5.5329e+01 -5.7620e+01 -5.5777e+01 -5.3824e+01 -5.5334e+01 -5.7626e+01 -5.5772e+01 -5.3831e+01 -5.5338e+01 -5.7631e+01 -5.5767e+01 -5.3838e+01 -5.5342e+01 -5.7636e+01 -5.5762e+01 -5.3845e+01 -5.5346e+01 -5.7640e+01 -5.5758e+01 -5.3849e+01 -5.5350e+01 -5.7645e+01 -5.5751e+01 -5.3847e+01 -5.5354e+01 -5.7648e+01 -5.5738e+01 -5.3846e+01 -5.5358e+01 -5.7652e+01 -5.5723e+01 -5.3844e+01 -5.5362e+01 -5.7655e+01 -5.5699e+01 -5.3843e+01 -5.5365e+01 -5.7657e+01 -5.5671e+01 -5.3841e+01 -5.5369e+01 -5.7660e+01 -5.5643e+01 -5.3831e+01 -5.5372e+01 -5.7658e+01 -5.5617e+01 -5.3822e+01 -5.5375e+01 -5.7652e+01 -5.5591e+01 -5.3813e+01 -5.5378e+01 -5.7646e+01 -5.5565e+01 -5.3804e+01 -5.5381e+01 -5.7639e+01 -5.5540e+01 -5.3795e+01 -5.5384e+01 -5.7632e+01 -5.5515e+01 -5.3786e+01 -5.5386e+01 -5.7626e+01 -5.5491e+01 -5.3778e+01 -5.5389e+01 -5.7619e+01 -5.5467e+01 -5.3770e+01 -5.5391e+01 -5.7611e+01 -5.5443e+01 -5.3762e+01 -5.5394e+01 -5.7604e+01 -5.5420e+01 -5.3754e+01 -5.5396e+01 -5.7597e+01 -5.5398e+01 -5.3746e+01 -5.5398e+01 -5.7589e+01 -5.5376e+01 -5.3738e+01 -5.5399e+01 -5.7581e+01 -5.5354e+01 -5.3730e+01 -5.5401e+01 -5.7574e+01 -5.5332e+01 -5.3723e+01 -5.5402e+01 -5.7566e+01 -5.5304e+01 -5.3715e+01 -5.5404e+01 -5.7557e+01 -5.5276e+01 -5.3708e+01 -5.5405e+01 -5.7549e+01 -5.5248e+01 -5.3701e+01 -5.5406e+01 -5.7541e+01 -5.5220e+01 -5.3694e+01 -5.5407e+01 -5.7532e+01 -5.5194e+01 -5.3687e+01 -5.5407e+01 -5.7523e+01 -5.5167e+01 -5.3680e+01 -5.5408e+01 -5.7514e+01 -5.5141e+01 -5.3673e+01 -5.5408e+01 -5.7505e+01 -5.5116e+01 -5.3666e+01 -5.5409e+01 -5.7496e+01 -5.5090e+01 -5.3659e+01 -5.5409e+01 -5.7487e+01 -5.5066e+01 -5.3652e+01 -5.5408e+01 -5.7477e+01 -5.5042e+01 -5.3646e+01 -5.5408e+01 -5.7467e+01 -5.5018e+01 -5.3639e+01 -5.5408e+01 -5.7457e+01 -5.4994e+01 -5.3632e+01 -5.5407e+01 -5.7447e+01 -5.4971e+01 -5.3626e+01 -5.5406e+01 -5.7429e+01 -5.4949e+01 -5.3619e+01 -5.5405e+01 -5.7411e+01 -5.4926e+01 -5.3613e+01 -5.5404e+01 -5.7393e+01 -5.4904e+01 -5.3606e+01 -5.5403e+01 -5.7375e+01 -5.4883e+01 -5.3600e+01 -5.5401e+01 -5.7357e+01 -5.4862e+01 -5.3593e+01 -5.5400e+01 -5.7339e+01 -5.4841e+01 -5.3587e+01 -5.5398e+01 -5.7321e+01 -5.4820e+01 -5.3572e+01 -5.5396e+01 -5.7303e+01 -5.4800e+01 -5.3558e+01 -5.5394e+01 -5.7285e+01 -5.4780e+01 -5.3544e+01 -5.5392e+01 -5.7267e+01 -5.4760e+01 -5.3531e+01 -5.5389e+01 -5.7250e+01 -5.4784e+01 -5.3517e+01 -5.5387e+01 -5.7232e+01 -5.4809e+01 -5.3504e+01 -5.5384e+01 -5.7214e+01 -5.4833e+01 -5.3490e+01 -5.5381e+01 -5.7196e+01 -5.4849e+01 -5.3477e+01 -5.5378e+01 -5.7178e+01 -5.4865e+01 -5.3465e+01 -5.5374e+01 -5.7160e+01 -5.4881e+01 -5.3452e+01 -5.5371e+01 -5.7143e+01 -5.4896e+01 -5.3439e+01 -5.5367e+01 -5.7122e+01 -5.4911e+01 -5.3424e+01 -5.5364e+01 -5.7096e+01 -5.4926e+01 -5.3404e+01 -5.5360e+01 -5.7071e+01 -5.4941e+01 -5.3384e+01 -5.5356e+01 -5.7045e+01 -5.4956e+01 -5.3365e+01 -5.5351e+01 -5.7020e+01 -5.4970e+01 -5.3346e+01 -5.5347e+01 -5.6995e+01 -5.4984e+01 -5.3327e+01 -5.5342e+01 -5.6970e+01 -5.4998e+01 -5.3308e+01 -5.5338e+01 -5.6946e+01 -5.5012e+01 -5.3290e+01 -5.5333e+01 -5.6921e+01 -5.5025e+01 -5.3272e+01 -5.5328e+01 -5.6897e+01 -5.5038e+01 -5.3254e+01 -5.5322e+01 -5.6873e+01 -5.5051e+01 -5.3237e+01 -5.5317e+01 -5.6849e+01 -5.5064e+01 -5.3220e+01 -5.5312e+01 -5.6825e+01 -5.5076e+01 -5.3203e+01 -5.5306e+01 -5.6801e+01 -5.5089e+01 -5.3186e+01 -5.5300e+01 -5.6778e+01 -5.5100e+01 -5.3170e+01 -5.5294e+01 -5.6754e+01 -5.5112e+01 -5.3154e+01 -5.5288e+01 -5.6731e+01 -5.5124e+01 -5.3138e+01 -5.5298e+01 -5.6708e+01 -5.5135e+01 -5.3122e+01 -5.5328e+01 -5.6679e+01 -5.5146e+01 -5.3107e+01 -5.5357e+01 -5.6648e+01 -5.5156e+01 -5.3091e+01 -5.5386e+01 -5.6617e+01 -5.5167e+01 -5.3076e+01 -5.5414e+01 -5.6587e+01 -5.5177e+01 -5.3061e+01 -5.5442e+01 -5.6557e+01 -5.5187e+01 -5.3047e+01 -5.5469e+01 -5.6528e+01 -5.5196e+01 -5.3032e+01 -5.5495e+01 -5.6494e+01 -5.5206e+01 -5.3018e+01 -5.5521e+01 -5.6457e+01 -5.5215e+01 -5.2996e+01 -5.5547e+01 -5.6421e+01 -5.5224e+01 -5.2974e+01 -5.5571e+01 -5.6385e+01 -5.5232e+01 -5.2953e+01 -5.5595e+01 -5.6349e+01 -5.5241e+01 -5.2932e+01 -5.5619e+01 -5.6314e+01 -5.5249e+01 -5.2911e+01 -5.5642e+01 -5.6279e+01 -5.5257e+01 -5.2891e+01 -5.5664e+01 -5.6245e+01 -5.5264e+01 -5.2871e+01 -5.5686e+01 -5.6211e+01 -5.5271e+01 -5.2851e+01 -5.5708e+01 -5.6177e+01 -5.5278e+01 -5.2831e+01 -5.5728e+01 -5.6144e+01 -5.5284e+01 -5.2812e+01 -5.5749e+01 -5.6111e+01 -5.5283e+01 -5.2793e+01 -5.5798e+01 -5.6113e+01 -5.5281e+01 -5.2775e+01 -5.5853e+01 -5.6125e+01 -5.5279e+01 -5.2757e+01 -5.5908e+01 -5.6137e+01 -5.5278e+01 -5.2739e+01 -5.5961e+01 -5.6148e+01 -5.5276e+01 -5.2721e+01 -5.6014e+01 -5.6159e+01 -5.5274e+01 -5.2703e+01 -5.6065e+01 -5.6170e+01 -5.5272e+01 -5.2686e+01 -5.6116e+01 -5.6181e+01 -5.5270e+01 -5.2669e+01 -5.6166e+01 -5.6191e+01 -5.5268e+01 -5.2652e+01 -5.6214e+01 -5.6201e+01 -5.5266e+01 -5.2636e+01 -5.6262e+01 -5.6210e+01 -5.5264e+01 -5.2620e+01 -5.6309e+01 -5.6219e+01 -5.5262e+01 -5.2603e+01 -5.6355e+01 -5.6221e+01 -5.5259e+01 -5.2588e+01 -5.6400e+01 -5.6222e+01 -5.5257e+01 -5.2572e+01 -5.6444e+01 -5.6223e+01 -5.5254e+01 -5.2557e+01 -5.6488e+01 -5.6223e+01 -5.5252e+01 -5.2541e+01 -5.6530e+01 -5.6224e+01 -5.5249e+01 -5.2526e+01 -5.6572e+01 -5.6224e+01 -5.5246e+01 -5.2511e+01 -5.6612e+01 -5.6224e+01 -5.5243e+01 -5.2497e+01 -5.6652e+01 -5.6224e+01 -5.5240e+01 -5.2482e+01 -5.6691e+01 -5.6224e+01 -5.5237e+01 -5.2468e+01 -5.6729e+01 -5.6223e+01 -5.5233e+01 -5.2454e+01 -5.6767e+01 -5.6245e+01 -5.5230e+01 -5.2440e+01 -5.6803e+01 -5.6289e+01 -5.5226e+01 -5.2426e+01 -5.6839e+01 -5.6332e+01 -5.5223e+01 -5.2412e+01 -5.6874e+01 -5.6374e+01 -5.5218e+01 -5.2399e+01 -5.6908e+01 -5.6416e+01 -5.5206e+01 -5.2386e+01 -5.6941e+01 -5.6456e+01 -5.5194e+01 -5.2372e+01 -5.6974e+01 -5.6496e+01 -5.5183e+01 -5.2359e+01 -5.7005e+01 -5.6535e+01 -5.5171e+01 -5.2346e+01 -5.7036e+01 -5.6573e+01 -5.5159e+01 -5.2334e+01 -5.7067e+01 -5.6611e+01 -5.5148e+01 -5.2317e+01 -5.7096e+01 -5.6647e+01 -5.5137e+01 -5.2297e+01 -5.7125e+01 -5.6683e+01 -5.5125e+01 -5.2277e+01 -5.7153e+01 -5.6719e+01 -5.5114e+01 -5.2257e+01 -5.7180e+01 -5.6750e+01 -5.5103e+01 -5.2237e+01 -5.7207e+01 -5.6776e+01 -5.5091e+01 -5.2218e+01 -5.7232e+01 -5.6801e+01 -5.5080e+01 -5.2199e+01 -5.7257e+01 -5.6826e+01 -5.5069e+01 -5.2181e+01 -5.7282e+01 -5.6850e+01 -5.5058e+01 -5.2162e+01 -5.7306e+01 -5.6874e+01 -5.5047e+01 -5.2144e+01 -5.7329e+01 -5.6897e+01 -5.5036e+01 -5.2127e+01 -5.7351e+01 -5.6920e+01 -5.5025e+01 -5.2109e+01 -5.7373e+01 -5.6942e+01 -5.5014e+01 -5.2092e+01 -5.7394e+01 -5.6964e+01 -5.5003e+01 -5.2075e+01 -5.7417e+01 -5.6985e+01 -5.4992e+01 -5.2058e+01 -5.7474e+01 -5.7005e+01 -5.4981e+01 -5.2041e+01 -5.7529e+01 -5.7025e+01 -5.4970e+01 -5.2025e+01 -5.7583e+01 -5.7045e+01 -5.4959e+01 -5.2009e+01 -5.7631e+01 -5.7064e+01 -5.4948e+01 -5.1993e+01 -5.7676e+01 -5.7083e+01 -5.4937e+01 -5.1977e+01 -5.7719e+01 -5.7101e+01 -5.4926e+01 -5.1962e+01 -5.7761e+01 -5.7118e+01 -5.4915e+01 -5.1947e+01 -5.7803e+01 -5.7135e+01 -5.4904e+01 -5.1932e+01 -5.7844e+01 -5.7152e+01 -5.4894e+01 -5.1917e+01 -5.7883e+01 -5.7168e+01 -5.4883e+01 -5.1902e+01 -5.7922e+01 -5.7184e+01 -5.4872e+01 -5.1888e+01 -5.7961e+01 -5.7199e+01 -5.4861e+01 -5.1874e+01 -5.7998e+01 -5.7214e+01 -5.4850e+01 -5.1860e+01 -5.8034e+01 -5.7228e+01 -5.4839e+01 -5.1846e+01 -5.8070e+01 -5.7242e+01 -5.4824e+01 -5.1832e+01 -5.8105e+01 -5.7255e+01 -5.4805e+01 -5.1818e+01 -5.8139e+01 -5.7268e+01 -5.4786e+01 -5.1805e+01 -5.8173e+01 -5.7280e+01 -5.4767e+01 -5.1792e+01 -5.8205e+01 -5.7292e+01 -5.4749e+01 -5.1779e+01 -5.8237e+01 -5.7303e+01 -5.4731e+01 -5.1766e+01 -5.8263e+01 -5.7314e+01 -5.4713e+01 -5.1753e+01 -5.8286e+01 -5.7325e+01 -5.4695e+01 -5.1740e+01 -5.8308e+01 -5.7335e+01 -5.4677e+01 -5.1728e+01 -5.8329e+01 -5.7345e+01 -5.4659e+01 -5.1715e+01 -5.8350e+01 -5.7354e+01 -5.4642e+01 -5.1703e+01 -5.8370e+01 -5.7363e+01 -5.4625e+01 -5.1691e+01 -5.8389e+01 -5.7371e+01 -5.4607e+01 -5.1679e+01 -5.8408e+01 -5.7379e+01 -5.4590e+01 -5.1667e+01 -5.8427e+01 -5.7387e+01 -5.4573e+01 -5.1655e+01 -5.8445e+01 -5.7392e+01 -5.4556e+01 -5.1644e+01 -5.8462e+01 -5.7391e+01 -5.4540e+01 -5.1632e+01 -5.8479e+01 -5.7390e+01 -5.4523e+01 -5.1621e+01 -5.8496e+01 -5.7388e+01 -5.4506e+01 -5.1610e+01 -5.8511e+01 -5.7386e+01 -5.4490e+01 -5.1599e+01 -5.8521e+01 -5.7384e+01 -5.4469e+01 -5.1588e+01 -5.8528e+01 -5.7382e+01 -5.4445e+01 -5.1577e+01 -5.8535e+01 -5.7379e+01 -5.4421e+01 -5.1566e+01 -5.8541e+01 -5.7376e+01 -5.4398e+01 -5.1555e+01 -5.8547e+01 -5.7373e+01 -5.4375e+01 -5.1544e+01 -5.8553e+01 -5.7370e+01 -5.4352e+01 -5.1534e+01 -5.8558e+01 -5.7367e+01 -5.4329e+01 -5.1523e+01 -5.8563e+01 -5.7363e+01 -5.4306e+01 -5.1513e+01 -5.8568e+01 -5.7359e+01 -5.4280e+01 -5.1499e+01 -5.8572e+01 -5.7355e+01 -5.4250e+01 -5.1481e+01 -5.8576e+01 -5.7351e+01 -5.4221e+01 -5.1463e+01 -5.8580e+01 -5.7347e+01 -5.4192e+01 -5.1461e+01 -5.8583e+01 -5.7342e+01 -5.4163e+01 -5.1488e+01 -5.8586e+01 -5.7337e+01 -5.4135e+01 -5.1515e+01 -5.8589e+01 -5.7332e+01 -5.4107e+01 -5.1541e+01 -5.8591e+01 -5.7327e+01 -5.4080e+01 -5.1567e+01 -5.8593e+01 -5.7321e+01 -5.4045e+01 -5.1593e+01 -5.8618e+01 -5.7316e+01 -5.4010e+01 -5.1618e+01 -5.8648e+01 -5.7310e+01 -5.3976e+01 -5.1643e+01 -5.8678e+01 -5.7304e+01 -5.3943e+01 -5.1667e+01 -5.8706e+01 -5.7297e+01 -5.3910e+01 -5.1691e+01 -5.8735e+01 -5.7291e+01 -5.3878e+01 -5.1713e+01 -5.8762e+01 -5.7284e+01 -5.3846e+01 -5.1728e+01 -5.8789e+01 -5.7277e+01 -5.3815e+01 -5.1743e+01 -5.8816e+01 -5.7270e+01 -5.3784e+01 -5.1758e+01 -5.8841e+01 -5.7263e+01 -5.3754e+01 -5.1773e+01 -5.8866e+01 -5.7255e+01 -5.3724e+01 -5.1788e+01 -5.8883e+01 -5.7248e+01 -5.3694e+01 -5.1802e+01 -5.8899e+01 -5.7240e+01 -5.3665e+01 -5.1816e+01 -5.8915e+01 -5.7232e+01 -5.3637e+01 -5.1830e+01 -5.8931e+01 -5.7223e+01 -5.3608e+01 -5.1844e+01 -5.8946e+01 -5.7215e+01 -5.3581e+01 -5.1858e+01 -5.8961e+01 -5.7206e+01 -5.3553e+01 -5.1871e+01 -5.8975e+01 -5.7197e+01 -5.3526e+01 -5.1884e+01 -5.8989e+01 -5.7188e+01 -5.3500e+01 -5.1892e+01 -5.9003e+01 -5.7179e+01 -5.3474e+01 -5.1897e+01 -5.9016e+01 -5.7170e+01 -5.3448e+01 -5.1902e+01 -5.9029e+01 -5.7160e+01 -5.3422e+01 -5.1907e+01 -5.9041e+01 -5.7142e+01 -5.3389e+01 -5.1912e+01 -5.9052e+01 -5.7124e+01 -5.3357e+01 -5.1917e+01 -5.9056e+01 -5.7107e+01 -5.3325e+01 -5.1922e+01 -5.9059e+01 -5.7089e+01 -5.3293e+01 -5.1927e+01 -5.9062e+01 -5.7071e+01 -5.3262e+01 -5.1932e+01 -5.9065e+01 -5.7054e+01 -5.3232e+01 -5.1937e+01 -5.9101e+01 -5.7036e+01 -5.3202e+01 -5.1942e+01 -5.9140e+01 -5.7018e+01 -5.3170e+01 -5.1947e+01 -5.9178e+01 -5.7000e+01 -5.3133e+01 -5.1952e+01 -5.9216e+01 -5.6983e+01 -5.3097e+01 -5.1956e+01 -5.9252e+01 -5.6965e+01 -5.3061e+01 -5.1961e+01 -5.9289e+01 -5.6947e+01 -5.3026e+01 -5.1966e+01 -5.9324e+01 -5.6930e+01 -5.2992e+01 -5.1970e+01 -5.9359e+01 -5.6912e+01 -5.2958e+01 -5.1975e+01 -5.9393e+01 -5.6909e+01 -5.2924e+01 -5.1979e+01 -5.9426e+01 -5.6936e+01 -5.2892e+01 -5.1984e+01 -5.9459e+01 -5.6962e+01 -5.2860e+01 -5.1988e+01 -5.9491e+01 -5.6987e+01 -5.2828e+01 -5.1992e+01 -5.9516e+01 -5.7012e+01 -5.2792e+01 -5.1997e+01 -5.9539e+01 -5.7036e+01 -5.2754e+01 -5.2001e+01 -5.9561e+01 -5.7060e+01 -5.2716e+01 -5.2005e+01 -5.9583e+01 -5.7082e+01 -5.2679e+01 -5.2005e+01 -5.9605e+01 -5.7097e+01 -5.2643e+01 -5.2012e+01 -5.9626e+01 -5.7111e+01 -5.2607e+01 -5.2045e+01 -5.9642e+01 -5.7124e+01 -5.2572e+01 -5.2089e+01 -5.9654e+01 -5.7137e+01 -5.2538e+01 -5.2165e+01 -5.9666e+01 -5.7149e+01 -5.2504e+01 -5.2241e+01 -5.9677e+01 -5.7161e+01 -5.2471e+01 -5.2315e+01 -5.9688e+01 -5.7173e+01 -5.2438e+01 -5.2389e+01 -5.9699e+01 -5.7184e+01 -5.2406e+01 -5.2461e+01 -5.9710e+01 -5.7195e+01 -5.2375e+01 -5.2533e+01 -5.9721e+01 -5.7205e+01 -5.2344e+01 -5.2603e+01 -5.9731e+01 -5.7215e+01 -5.2314e+01 -5.2673e+01 -5.9740e+01 -5.7225e+01 -5.2284e+01 -5.2741e+01 -5.9750e+01 -5.7234e+01 -5.2255e+01 -5.2809e+01 -5.9759e+01 -5.7242e+01 -5.2226e+01 -5.2874e+01 -5.9768e+01 -5.7251e+01 -5.2198e+01 -5.2932e+01 -5.9776e+01 -5.7259e+01 -5.2170e+01 -5.2989e+01 -5.9784e+01 -5.7266e+01 -5.2143e+01 -5.3045e+01 -5.9792e+01 -5.7273e+01 -5.2116e+01 -5.3100e+01 -5.9800e+01 -5.7280e+01 -5.2090e+01 -5.3155e+01 -5.9807e+01 -5.7286e+01 -5.2064e+01 -5.3207e+01 -5.9814e+01 -5.7292e+01 -5.2039e+01 -5.3252e+01 -5.9820e+01 -5.7298e+01 -5.2014e+01 -5.3297e+01 -5.9820e+01 -5.7303e+01 -5.1989e+01 -5.3341e+01 -5.9818e+01 -5.7308e+01 -5.1965e+01 -5.3385e+01 -5.9816e+01 -5.7313e+01 -5.1942e+01 -5.3428e+01 -5.9814e+01 -5.7317e+01 -5.1918e+01 -5.3470e+01 -5.9811e+01 -5.7321e+01 -5.1895e+01 -5.3512e+01 -5.9809e+01 -5.7324e+01 -5.1873e+01 -5.3553e+01 -5.9806e+01 -5.7327e+01 -5.1851e+01 -5.3594e+01 -5.9803e+01 -5.7330e+01 -5.1829e+01 -5.3635e+01 -5.9800e+01 -5.7332e+01 -5.1807e+01 -5.3674e+01 -5.9796e+01 -5.7334e+01 -5.1786e+01 -5.3713e+01 -5.9793e+01 -5.7336e+01 -5.1766e+01 -5.3746e+01 -5.9789e+01 -5.7337e+01 -5.1745e+01 -5.3770e+01 -5.9785e+01 -5.7338e+01 -5.1725e+01 -5.3792e+01 -5.9781e+01 -5.7338e+01 -5.1705e+01 -5.3814e+01 -5.9777e+01 -5.7339e+01 -5.1686e+01 -5.3836e+01 -5.9773e+01 -5.7339e+01 -5.1667e+01 -5.3857e+01 -5.9768e+01 -5.7338e+01 -5.1648e+01 -5.3879e+01 -5.9763e+01 -5.7338e+01 -5.1629e+01 -5.3900e+01 -5.9758e+01 -5.7373e+01 -5.1611e+01 -5.3921e+01 -5.9753e+01 -5.7416e+01 -5.1593e+01 -5.3942e+01 -5.9748e+01 -5.7458e+01 -5.1575e+01 -5.3963e+01 -5.9737e+01 -5.7499e+01 -5.1558e+01 -5.3983e+01 -5.9723e+01 -5.7532e+01 -5.1540e+01 -5.4003e+01 -5.9709e+01 -5.7563e+01 -5.1523e+01 -5.4023e+01 -5.9696e+01 -5.7593e+01 -5.1507e+01 -5.4043e+01 -5.9682e+01 -5.7623e+01 -5.1490e+01 -5.4063e+01 -5.9668e+01 -5.7652e+01 -5.1474e+01 -5.4082e+01 -5.9654e+01 -5.7680e+01 -5.1458e+01 -5.4101e+01 -5.9640e+01 -5.7707e+01 -5.1442e+01 -5.4120e+01 -5.9627e+01 -5.7734e+01 -5.1427e+01 -5.4139e+01 -5.9613e+01 -5.7760e+01 -5.1412e+01 -5.4157e+01 -5.9599e+01 -5.7786e+01 -5.1396e+01 -5.4176e+01 -5.9585e+01 -5.7810e+01 -5.1382e+01 -5.4194e+01 -5.9570e+01 -5.7835e+01 -5.1367e+01 -5.4211e+01 -5.9556e+01 -5.7858e+01 -5.1352e+01 -5.4229e+01 -5.9542e+01 -5.7881e+01 -5.1331e+01 -5.4243e+01 -5.9528e+01 -5.7903e+01 -5.1309e+01 -5.4252e+01 -5.9513e+01 -5.7924e+01 -5.1288e+01 -5.4261e+01 -5.9499e+01 -5.7945e+01 -5.1267e+01 -5.4270e+01 -5.9484e+01 -5.7965e+01 -5.1246e+01 -5.4278e+01 -5.9470e+01 -5.7984e+01 -5.1225e+01 -5.4287e+01 -5.9455e+01 -5.8003e+01 -5.1205e+01 -5.4296e+01 -5.9440e+01 -5.8021e+01 -5.1186e+01 -5.4304e+01 -5.9426e+01 -5.8039e+01 -5.1166e+01 -5.4313e+01 -5.9411e+01 -5.8056e+01 -5.1147e+01 -5.4321e+01 -5.9396e+01 -5.8072e+01 -5.1129e+01 -5.4330e+01 -5.9380e+01 -5.8088e+01 -5.1110e+01 -5.4338e+01 -5.9365e+01 -5.8103e+01 -5.1092e+01 -5.4346e+01 -5.9350e+01 -5.8118e+01 -5.1074e+01 -5.4354e+01 -5.9334e+01 -5.8132e+01 -5.1057e+01 -5.4362e+01 -5.9314e+01 -5.8145e+01 -5.1037e+01 -5.4369e+01 -5.9290e+01 -5.8158e+01 -5.1005e+01 -5.4377e+01 -5.9267e+01 -5.8171e+01 -5.0973e+01 -5.4384e+01 -5.9244e+01 -5.8182e+01 -5.0942e+01 -5.4391e+01 -5.9221e+01 -5.8194e+01 -5.0911e+01 -5.4399e+01 -5.9197e+01 -5.8204e+01 -5.0881e+01 -5.4406e+01 -5.9174e+01 -5.8215e+01 -5.0851e+01 -5.4413e+01 -5.9151e+01 -5.8224e+01 -5.0822e+01 -5.4419e+01 -5.9128e+01 -5.8233e+01 -5.0794e+01 -5.4426e+01 -5.9106e+01 -5.8242e+01 -5.0766e+01 -5.4432e+01 -5.9083e+01 -5.8250e+01 -5.0738e+01 -5.4438e+01 -5.9060e+01 -5.8257e+01 -5.0712e+01 -5.4445e+01 -5.9037e+01 -5.8265e+01 -5.0686e+01 -5.4451e+01 -5.9015e+01 -5.8271e+01 -5.0660e+01 -5.4456e+01 -5.8990e+01 -5.8277e+01 -5.0635e+01 -5.4462e+01 -5.8960e+01 -5.8283e+01 -5.0610e+01 -5.4467e+01 -5.8929e+01 -5.8288e+01 -5.0586e+01 -5.4473e+01 -5.8899e+01 -5.8293e+01 -5.0563e+01 -5.4478e+01 -5.8869e+01 -5.8297e+01 -5.0539e+01 -5.4483e+01 -5.8840e+01 -5.8300e+01 -5.0517e+01 -5.4488e+01 -5.8810e+01 -5.8304e+01 -5.0488e+01 -5.4492e+01 -5.8773e+01 -5.8306e+01 -5.0458e+01 -5.4497e+01 -5.8735e+01 -5.8309e+01 -5.0429e+01 -5.4501e+01 -5.8691e+01 -5.8311e+01 -5.0401e+01 -5.4505e+01 -5.8647e+01 -5.8312e+01 -5.0373e+01 -5.4509e+01 -5.8603e+01 -5.8313e+01 -5.0346e+01 -5.4513e+01 -5.8561e+01 -5.8314e+01 -5.0320e+01 -5.4510e+01 -5.8518e+01 -5.8314e+01 -5.0294e+01 -5.4506e+01 -5.8476e+01 -5.8314e+01 -5.0265e+01 -5.4501e+01 -5.8435e+01 -5.8313e+01 -5.0232e+01 -5.4497e+01 -5.8394e+01 -5.8312e+01 -5.0200e+01 -5.4493e+01 -5.8346e+01 -5.8311e+01 -5.0169e+01 -5.4488e+01 -5.8299e+01 -5.8309e+01 -5.0138e+01 -5.4484e+01 -5.8252e+01 -5.8307e+01 -5.0108e+01 -5.4479e+01 -5.8205e+01 -5.8304e+01 -5.0079e+01 -5.4475e+01 -5.8160e+01 -5.8301e+01 -5.0045e+01 -5.4470e+01 -5.8114e+01 -5.8298e+01 -5.0009e+01 -5.4466e+01 -5.8070e+01 -5.8294e+01 -1.0000e+01 -5.4453e+01 -5.8026e+01 -5.8290e+01 -6.0000e+01 -5.4454e+01 -5.7982e+01 -5.8286e+01 -6.0000e+01 -5.4487e+01 -5.7940e+01 -5.8277e+01 -6.0000e+01 -5.4514e+01 -5.7897e+01 -5.8264e+01 -6.0000e+01 -5.4538e+01 -5.7855e+01 -5.8251e+01 -6.0000e+01 -5.4561e+01 -5.7814e+01 -5.8237e+01 -6.0000e+01 -5.4584e+01 -5.7773e+01 -5.8224e+01 -6.0000e+01 -5.4606e+01 -5.7733e+01 -5.8210e+01 -6.0000e+01 -5.4628e+01 -5.7693e+01 -5.8196e+01 -6.0000e+01 -5.4650e+01 -5.7654e+01 -5.8182e+01 -6.0000e+01 -5.4672e+01 -5.7615e+01 -5.8168e+01 -6.0000e+01 -5.4693e+01 -5.7576e+01 -5.8154e+01 -6.0000e+01 -5.4714e+01 -5.7538e+01 -5.8140e+01 -6.0000e+01 -5.4735e+01 -5.7500e+01 -5.8125e+01 -6.0000e+01 -5.4755e+01 -5.7463e+01 -5.8111e+01 -6.0000e+01 -5.4775e+01 -5.7426e+01 -5.8140e+01 -6.0000e+01 -5.4795e+01 -5.7390e+01 -5.8169e+01 -6.0000e+01 -5.4814e+01 -5.7354e+01 -5.8197e+01 -6.0000e+01 -5.4833e+01 -5.7318e+01 -5.8225e+01 -6.0000e+01 -5.4852e+01 -5.7283e+01 -5.8252e+01 -6.0000e+01 -5.4870e+01 -5.7248e+01 -5.8278e+01 -6.0000e+01 -5.4888e+01 -5.7213e+01 -5.8319e+01 -6.0000e+01 -5.4906e+01 -5.7179e+01 -5.8389e+01 -6.0000e+01 -5.4923e+01 -5.7145e+01 -5.8501e+01 -6.0000e+01 -5.4940e+01 -5.7111e+01 -5.8611e+01 -6.0000e+01 -5.4957e+01 -5.7078e+01 -5.8719e+01 -6.0000e+01 -5.4973e+01 -5.7045e+01 -5.8825e+01 -6.0000e+01 -5.4989e+01 -5.7012e+01 -5.8929e+01 -6.0000e+01 -5.5005e+01 -5.6980e+01 -5.9031e+01 -6.0000e+01 -5.5020e+01 -5.6948e+01 -5.9131e+01 -6.0000e+01 -5.5035e+01 -5.6916e+01 -5.9229e+01 -6.0000e+01 -5.5050e+01 -5.6885e+01 -5.9317e+01 -6.0000e+01 -5.5058e+01 -5.6853e+01 -5.9404e+01 -6.0000e+01 -5.5064e+01 -5.6839e+01 -5.9489e+01 -6.0000e+01 -5.5070e+01 -5.6845e+01 -5.9572e+01 -6.0000e+01 -5.5076e+01 -5.6850e+01 -5.9654e+01 -6.0000e+01 -5.5082e+01 -5.6856e+01 -5.9734e+01 -6.0000e+01 -5.5087e+01 -5.6861e+01 -5.9812e+01 -6.0000e+01 -5.5093e+01 -5.6865e+01 -5.9889e+01 -6.0000e+01 -5.5098e+01 -5.6870e+01 -5.9964e+01 -6.0000e+01 -5.5103e+01 -5.6874e+01 -6.0038e+01 -6.0000e+01 -5.5108e+01 -5.6879e+01 -6.0110e+01 -6.0000e+01 -5.5113e+01 -5.6882e+01 -6.0181e+01 -6.0000e+01 -5.5118e+01 -5.6886e+01 -6.0250e+01 -6.0000e+01 -5.5122e+01 -5.6890e+01 -6.0318e+01 -6.0000e+01 -5.5127e+01 -5.6893e+01 -6.0384e+01 -6.0000e+01 -5.5131e+01 -5.6896e+01 -6.0449e+01 -6.0000e+01 -5.5133e+01 -5.6899e+01 -6.0513e+01 -6.0000e+01 -5.5129e+01 -5.6901e+01 -6.0575e+01 -6.0000e+01 -5.5125e+01 -5.6903e+01 -6.0635e+01 -5.9942e+01 -5.5121e+01 -5.6905e+01 -6.0695e+01 -5.9866e+01 -5.5117e+01 -5.6907e+01 -6.0752e+01 -5.9790e+01 -5.5112e+01 -5.6909e+01 -6.0809e+01 -5.9715e+01 -5.5100e+01 -5.6910e+01 -6.0864e+01 -5.9641e+01 -5.5089e+01 -5.6911e+01 -6.0918e+01 -5.9568e+01 -5.5077e+01 -5.6912e+01 -6.0971e+01 -5.9496e+01 -5.5066e+01 -5.6913e+01 -6.1022e+01 -5.9424e+01 -5.5054e+01 -5.6913e+01 -6.1072e+01 -5.9353e+01 -5.5043e+01 -5.6913e+01 -6.1121e+01 -5.9283e+01 -5.5032e+01 -5.6913e+01 -6.1168e+01 -5.9214e+01 -5.5021e+01 -5.6913e+01 -6.1215e+01 -5.9145e+01 -5.5011e+01 -5.6912e+01 -6.1260e+01 -5.9077e+01 -5.5000e+01 -5.6911e+01 -6.1304e+01 -5.9010e+01 -5.4990e+01 -5.6910e+01 -6.1346e+01 -5.8944e+01 -5.4979e+01 -5.6909e+01 -6.1388e+01 -5.8878e+01 -5.4969e+01 -5.6908e+01 -6.1428e+01 -5.8813e+01 -5.4959e+01 -5.6906e+01 -6.1467e+01 -5.8748e+01 -5.4949e+01 -5.6904e+01 -6.1506e+01 -5.8684e+01 -5.4939e+01 -5.6902e+01 -6.1543e+01 -5.8621e+01 -5.4930e+01 -5.6899e+01 -6.1578e+01 -5.8559e+01 -5.4920e+01 -5.6897e+01 -6.1613e+01 -5.8497e+01 -5.4910e+01 -5.6894e+01 -6.1639e+01 -5.8435e+01 -5.4901e+01 -5.6891e+01 -6.1659e+01 -5.8375e+01 -5.4891e+01 -5.6887e+01 -6.1675e+01 -5.8314e+01 -5.4882e+01 -5.6884e+01 -6.1691e+01 -5.8255e+01 -5.4873e+01 -5.6914e+01 -6.1706e+01 -5.8196e+01 -5.4863e+01 -5.6946e+01 -6.1720e+01 -5.8137e+01 -5.4854e+01 -5.6978e+01 -6.1733e+01 -5.8116e+01 -5.4844e+01 -5.7009e+01 -6.1746e+01 -5.8103e+01 -5.4827e+01 -5.7039e+01 -6.1759e+01 -5.8089e+01 -5.4810e+01 -5.7068e+01 -6.1770e+01 -5.8072e+01 -5.4794e+01 -5.7097e+01 -6.1783e+01 -5.8050e+01 -5.4777e+01 -5.7125e+01 -6.1838e+01 -5.8037e+01 -5.4761e+01 -5.7153e+01 -6.1892e+01 -5.8060e+01 -5.4745e+01 -5.7180e+01 -6.1945e+01 -5.8083e+01 -5.4722e+01 -5.7206e+01 -6.1996e+01 -5.8105e+01 -5.4698e+01 -5.7232e+01 -6.2045e+01 -5.8127e+01 -5.4675e+01 -5.7257e+01 -6.2086e+01 -5.8148e+01 -5.4653e+01 -5.7281e+01 -6.2126e+01 -5.8168e+01 -5.4630e+01 -5.7305e+01 -6.2164e+01 -5.8188e+01 -5.4608e+01 -5.7328e+01 -6.2202e+01 -5.8206e+01 -5.4587e+01 -5.7350e+01 -6.2239e+01 -5.8216e+01 -5.4565e+01 -5.7372e+01 -6.2275e+01 -5.8227e+01 -5.4544e+01 -5.7393e+01 -6.2310e+01 -5.8236e+01 -5.4524e+01 -5.7414e+01 -6.2343e+01 -5.8246e+01 -5.4503e+01 -5.7434e+01 -6.2376e+01 -5.8255e+01 -5.4483e+01 -5.7454e+01 -6.2408e+01 -5.8264e+01 -5.4483e+01 -5.7473e+01 -6.2439e+01 -5.8272e+01 -5.4508e+01 -5.7491e+01 -6.2469e+01 -5.8281e+01 -5.4532e+01 -5.7509e+01 -6.2499e+01 -5.8288e+01 -5.4556e+01 -5.7526e+01 -6.2527e+01 -5.8296e+01 -5.4580e+01 -5.7542e+01 -6.2554e+01 -5.8303e+01 -5.4603e+01 -5.7559e+01 -6.2581e+01 -5.8309e+01 -5.4626e+01 -5.7574e+01 -6.2606e+01 -5.8315e+01 -5.4648e+01 -5.7589e+01 -6.2631e+01 -5.8321e+01 -5.4662e+01 -5.7603e+01 -6.2655e+01 -5.8327e+01 -5.4676e+01 -5.7617e+01 -6.2678e+01 -5.8332e+01 -5.4687e+01 -5.7631e+01 -6.2700e+01 -5.8337e+01 -5.4692e+01 -5.7644e+01 -6.2721e+01 -5.8341e+01 -5.4698e+01 -5.7656e+01 -6.2742e+01 -5.8346e+01 -5.4703e+01 -5.7668e+01 -6.2761e+01 -5.8349e+01 -5.4709e+01 -5.7679e+01 -6.2780e+01 -5.8353e+01 -5.4714e+01 -5.7690e+01 -6.2798e+01 -5.8356e+01 -5.4719e+01 -5.7700e+01 -6.2815e+01 -5.8359e+01 -5.4725e+01 -5.7710e+01 -6.2831e+01 -5.8361e+01 -5.4730e+01 -5.7719e+01 -6.2847e+01 -5.8363e+01 -5.4735e+01 -5.7728e+01 -6.2862e+01 -5.8365e+01 -5.4740e+01 -5.7736e+01 -6.2876e+01 -5.8366e+01 -5.4745e+01 -5.7741e+01 -6.2889e+01 -5.8367e+01 -5.4751e+01 -5.7740e+01 -6.2902e+01 -5.8368e+01 -5.4755e+01 -5.7739e+01 -6.2913e+01 -5.8368e+01 -5.4760e+01 -5.7738e+01 -6.2924e+01 -5.8368e+01 -5.4765e+01 -5.7737e+01 -6.2935e+01 -5.8368e+01 -5.4770e+01 -5.7735e+01 -6.2940e+01 -5.8367e+01 -5.4770e+01 -5.7733e+01 -6.2940e+01 -5.8366e+01 -5.4766e+01 -5.7731e+01 -6.2941e+01 -5.8365e+01 -5.4763e+01 -5.7729e+01 -6.2941e+01 -5.8363e+01 -5.4760e+01 -5.7726e+01 -6.2940e+01 -5.8361e+01 -5.4757e+01 -5.7723e+01 -6.2939e+01 -5.8359e+01 -5.4754e+01 -5.7720e+01 -6.2938e+01 -5.8357e+01 -5.4751e+01 -5.7717e+01 -6.2936e+01 -5.8354e+01 -5.4748e+01 -5.7713e+01 -6.2933e+01 -5.8343e+01 -5.4745e+01 -5.7709e+01 -6.2930e+01 -5.8332e+01 -5.4742e+01 -5.7705e+01 -6.2926e+01 -5.8321e+01 -5.4739e+01 -5.7701e+01 -6.2930e+01 -5.8309e+01 -5.4736e+01 -5.7696e+01 -6.2970e+01 -5.8298e+01 -5.4734e+01 -5.7691e+01 -6.3009e+01 -5.8286e+01 -5.4731e+01 -5.7686e+01 -6.3046e+01 -5.8274e+01 -5.4728e+01 -5.7681e+01 -6.3074e+01 -5.8262e+01 -5.4726e+01 -5.7675e+01 -6.3102e+01 -5.8250e+01 -5.4723e+01 -5.7669e+01 -6.3129e+01 -5.8238e+01 -5.4720e+01 -5.7663e+01 -6.3155e+01 -5.8226e+01 -5.4718e+01 -5.7656e+01 -6.3217e+01 -5.8213e+01 -5.4715e+01 -5.7650e+01 -6.3286e+01 -5.8201e+01 -5.4712e+01 -5.7643e+01 -6.3353e+01 -5.8188e+01 -5.4709e+01 -5.7636e+01 -6.3418e+01 -5.8175e+01 -5.4707e+01 -5.7629e+01 -6.3482e+01 -5.8162e+01 -5.4704e+01 -5.7621e+01 -6.3544e+01 -5.8149e+01 -5.4701e+01 -5.7613e+01 -6.3605e+01 -5.8136e+01 -5.4698e+01 -5.7605e+01 -6.3665e+01 -5.8123e+01 -5.4695e+01 -5.7597e+01 -6.3723e+01 -5.8109e+01 -5.4692e+01 -5.7589e+01 -6.3780e+01 -5.8096e+01 -5.4683e+01 -5.7580e+01 -6.3835e+01 -5.8082e+01 -5.4672e+01 -5.7571e+01 -6.3889e+01 -5.8068e+01 -5.4661e+01 -5.7562e+01 -6.3941e+01 -5.8055e+01 -5.4650e+01 -5.7553e+01 -6.3992e+01 -5.8041e+01 -5.4640e+01 -5.7544e+01 -6.4042e+01 -5.8026e+01 -5.4630e+01 -5.7534e+01 -6.4090e+01 -5.8012e+01 -5.4620e+01 -5.7524e+01 -6.4138e+01 -5.7998e+01 -5.4609e+01 -5.7514e+01 -6.4183e+01 -5.7983e+01 -5.4600e+01 -5.7504e+01 -6.4228e+01 -5.7969e+01 -5.4590e+01 -5.7493e+01 -6.4271e+01 -5.7954e+01 -5.4580e+01 -5.7482e+01 -6.4313e+01 -5.7939e+01 -5.4570e+01 -5.7471e+01 -6.4350e+01 -5.7924e+01 -5.4561e+01 -5.7460e+01 -6.4373e+01 -5.7909e+01 -5.4551e+01 -5.7449e+01 -6.4396e+01 -5.7894e+01 -5.4542e+01 -5.7438e+01 -6.4418e+01 -5.7879e+01 -5.4532e+01 -5.7426e+01 -6.4439e+01 -5.7863e+01 -5.4523e+01 -5.7414e+01 -6.4460e+01 -5.7848e+01 -5.4514e+01 -5.7402e+01 -6.4479e+01 -5.7832e+01 -5.4505e+01 -5.7390e+01 -6.4498e+01 -5.7816e+01 -5.4495e+01 -5.7378e+01 -6.4516e+01 -5.7800e+01 -5.4486e+01 -5.7365e+01 -6.4533e+01 -5.7784e+01 -5.4477e+01 -5.7352e+01 -6.4550e+01 -5.7768e+01 -5.4468e+01 -5.7339e+01 -6.4565e+01 -5.7752e+01 -5.4459e+01 -5.7326e+01 -6.4580e+01 -5.7735e+01 -5.4451e+01 -5.7313e+01 -6.4594e+01 -5.7719e+01 -5.4442e+01 -5.7300e+01 -6.4608e+01 -5.7702e+01 -5.4433e+01 -5.7286e+01 -6.4620e+01 -5.7686e+01 -5.4424e+01 -5.7272e+01 -6.4632e+01 -5.7669e+01 -5.4415e+01 -5.7259e+01 -6.4643e+01 -5.7652e+01 -5.4406e+01 -5.7245e+01 -6.4654e+01 -5.7635e+01 -5.4398e+01 -5.7229e+01 -6.4663e+01 -5.7618e+01 -5.4389e+01 -5.7207e+01 -6.4672e+01 -5.7601e+01 -5.4374e+01 -5.7185e+01 -6.4680e+01 -5.7583e+01 -5.4358e+01 -5.7162e+01 -6.4688e+01 -5.7566e+01 -5.4341e+01 -5.7140e+01 -6.4695e+01 -5.7548e+01 -5.4325e+01 -5.7118e+01 -6.4701e+01 -5.7531e+01 -5.4309e+01 -5.7096e+01 -6.4706e+01 -5.7513e+01 -5.4293e+01 -5.7074e+01 -6.4711e+01 -5.7495e+01 -5.4278e+01 -5.7052e+01 -6.4715e+01 -5.7477e+01 -5.4262e+01 -5.7030e+01 -6.4719e+01 -5.7459e+01 -5.4247e+01 -5.7008e+01 -6.4721e+01 -5.7474e+01 -5.4232e+01 -5.6986e+01 -6.4724e+01 -5.7500e+01 -5.4216e+01 -5.6964e+01 -6.4725e+01 -5.7525e+01 -5.4202e+01 -5.6942e+01 -6.4726e+01 -5.7549e+01 -5.4187e+01 -5.6921e+01 -6.4726e+01 -5.7573e+01 -5.4172e+01 -5.6899e+01 -6.4726e+01 -5.7596e+01 -5.4158e+01 -5.6877e+01 -6.4724e+01 -5.7618e+01 -5.4143e+01 -5.6855e+01 -6.4723e+01 -5.7640e+01 -5.4129e+01 -5.6833e+01 -6.4721e+01 -5.7661e+01 -5.4115e+01 -5.6812e+01 -6.4718e+01 -5.7681e+01 -5.4101e+01 -5.6790e+01 -6.4714e+01 -5.7701e+01 -5.4079e+01 -5.6768e+01 -6.4710e+01 -5.7719e+01 -5.4058e+01 -5.6747e+01 -6.4705e+01 -5.7738e+01 -5.4036e+01 -5.6725e+01 -6.4698e+01 -5.7755e+01 -5.4015e+01 -5.6703e+01 -6.4684e+01 -5.7772e+01 -5.3995e+01 -5.6682e+01 -6.4670e+01 -5.7788e+01 -5.3974e+01 -5.6660e+01 -6.4655e+01 -5.7804e+01 -5.3954e+01 -5.6639e+01 -6.4640e+01 -5.7819e+01 -5.3934e+01 -5.6617e+01 -6.4625e+01 -5.7833e+01 -5.3914e+01 -5.6596e+01 -6.4609e+01 -5.7847e+01 -5.3895e+01 -5.6574e+01 -6.4594e+01 -5.7860e+01 -5.3876e+01 -5.6553e+01 -6.4577e+01 -5.7872e+01 -5.3857e+01 -5.6531e+01 -6.4561e+01 -5.7884e+01 -5.3838e+01 -5.6510e+01 -6.4544e+01 -5.7896e+01 -5.3820e+01 -5.6488e+01 -6.4526e+01 -5.7906e+01 -5.3801e+01 -5.6467e+01 -6.4508e+01 -5.7917e+01 -5.3783e+01 -5.6441e+01 -6.4490e+01 -5.7926e+01 -5.3765e+01 -5.6412e+01 -6.4506e+01 -5.7935e+01 -5.3748e+01 -5.6383e+01 -6.4532e+01 -5.7944e+01 -5.3730e+01 -5.6354e+01 -6.4556e+01 -5.7950e+01 -5.3713e+01 -5.6325e+01 -6.4580e+01 -5.7950e+01 -5.3696e+01 -5.6297e+01 -6.4602e+01 -5.7948e+01 -5.3679e+01 -5.6268e+01 -6.4624e+01 -5.7939e+01 -5.3662e+01 -5.6240e+01 -6.4644e+01 -5.7930e+01 -5.3645e+01 -5.6212e+01 -6.4664e+01 -5.7920e+01 -5.3629e+01 -5.6184e+01 -6.4682e+01 -5.7911e+01 -5.3613e+01 -5.6157e+01 -6.4700e+01 -5.7901e+01 -5.3596e+01 -5.6129e+01 -6.4717e+01 -5.7892e+01 -5.3581e+01 -5.6102e+01 -6.4733e+01 -5.7882e+01 -5.3565e+01 -5.6075e+01 -6.4748e+01 -5.7872e+01 -5.3549e+01 -5.6048e+01 -6.4762e+01 -5.7862e+01 -5.3533e+01 -5.6021e+01 -6.4776e+01 -5.7851e+01 -5.3518e+01 -5.5994e+01 -6.4788e+01 -5.7841e+01 -5.3503e+01 -5.5968e+01 -6.4800e+01 -5.7830e+01 -5.3487e+01 -5.5942e+01 -6.4810e+01 -5.7820e+01 -5.3468e+01 -5.5915e+01 -6.4820e+01 -5.7807e+01 -5.3445e+01 -5.5889e+01 -6.4829e+01 -5.7788e+01 -5.3422e+01 -5.5863e+01 -6.4838e+01 -5.7769e+01 -5.3400e+01 -5.5838e+01 -6.4845e+01 -5.7750e+01 -5.3378e+01 -5.5812e+01 -6.4852e+01 -5.7732e+01 -5.3357e+01 -5.5786e+01 -6.4858e+01 -5.7711e+01 -5.3335e+01 -5.5761e+01 -6.4863e+01 -5.7684e+01 -5.3314e+01 -5.5736e+01 -6.4867e+01 -5.7658e+01 -5.3293e+01 -5.5711e+01 -6.4871e+01 -5.7632e+01 -5.3273e+01 -5.5686e+01 -6.4873e+01 -5.7599e+01 -5.3253e+01 -5.5661e+01 -6.4876e+01 -5.7566e+01 -5.3233e+01 -5.5636e+01 -6.4877e+01 -5.7533e+01 -5.3213e+01 -5.5611e+01 -6.4878e+01 -5.7500e+01 -5.3193e+01 -5.5587e+01 -6.4878e+01 -5.7468e+01 -5.3174e+01 -5.5562e+01 -6.4877e+01 -5.7436e+01 -5.3155e+01 -5.5538e+01 -6.4875e+01 -5.7404e+01 -5.3136e+01 -5.5514e+01 -6.4873e+01 -5.7373e+01 -5.3118e+01 -5.5490e+01 -6.4870e+01 -5.7342e+01 -5.3099e+01 -5.5465e+01 -6.4867e+01 -5.7311e+01 -5.3081e+01 -5.5434e+01 -6.4863e+01 -5.7281e+01 -5.3063e+01 -5.5402e+01 -6.4858e+01 -5.7251e+01 -5.3045e+01 -5.5371e+01 -6.4852e+01 -5.7222e+01 -5.3028e+01 -5.5340e+01 -6.4846e+01 -5.7192e+01 -5.3010e+01 -5.5309e+01 -6.4840e+01 -5.7163e+01 -5.2993e+01 -5.5278e+01 -6.4832e+01 -5.7135e+01 -5.2976e+01 -5.5248e+01 -6.4825e+01 -5.7106e+01 -5.2959e+01 -5.5218e+01 -6.4816e+01 -5.7078e+01 -5.2942e+01 -5.5189e+01 -6.4807e+01 -5.7050e+01 -5.2926e+01 -5.5159e+01 -6.4797e+01 -5.7022e+01 -5.2909e+01 -5.5130e+01 -6.4787e+01 -5.6995e+01 -5.2893e+01 -5.5101e+01 -6.4770e+01 -5.6968e+01 -5.2877e+01 -5.5073e+01 -6.4751e+01 -5.6941e+01 -5.2861e+01 -5.5044e+01 -6.4731e+01 -5.6914e+01 -5.2845e+01 -5.5016e+01 -6.4711e+01 -5.6888e+01 -5.2830e+01 -5.4988e+01 -6.4691e+01 -5.6861e+01 -5.2814e+01 -5.4960e+01 -6.4670e+01 -5.6835e+01 -5.2799e+01 -5.4933e+01 -6.4649e+01 -5.6809e+01 -5.2784e+01 -5.4906e+01 -6.4628e+01 -5.6784e+01 -5.2769e+01 -5.4879e+01 -6.4606e+01 -5.6758e+01 -5.2754e+01 -5.4852e+01 -6.4584e+01 -5.6733e+01 -5.2739e+01 -5.4825e+01 -6.4562e+01 -5.6708e+01 -5.2724e+01 -5.4799e+01 -6.4539e+01 -5.6683e+01 -5.2710e+01 -5.4772e+01 -6.4516e+01 -5.6658e+01 -5.2695e+01 -5.4746e+01 -6.4493e+01 -5.6633e+01 -5.2681e+01 -5.4720e+01 -6.4469e+01 -5.6609e+01 -5.2667e+01 -5.4695e+01 -6.4445e+01 -5.6584e+01 -5.2653e+01 -5.4669e+01 -6.4421e+01 -5.6560e+01 -5.2639e+01 -5.4644e+01 -6.4396e+01 -5.6536e+01 -5.2625e+01 -5.4619e+01 -6.4371e+01 -5.6512e+01 -5.2611e+01 -5.4594e+01 -6.4346e+01 -5.6488e+01 -5.2597e+01 -5.4569e+01 -6.4321e+01 -5.6465e+01 -5.2584e+01 -5.4545e+01 -6.4295e+01 -5.6441e+01 -5.2570e+01 -5.4520e+01 -6.4269e+01 -5.6418e+01 -5.2557e+01 -5.4496e+01 -6.4243e+01 -5.6394e+01 -5.2543e+01 -5.4472e+01 -6.4216e+01 -5.6363e+01 -5.2530e+01 -5.4448e+01 -6.4189e+01 -5.6332e+01 -5.2517e+01 -5.4424e+01 -6.4162e+01 -5.6301e+01 -5.2504e+01 -5.4400e+01 -6.4135e+01 -5.6271e+01 -5.2491e+01 -5.4377e+01 -6.4107e+01 -5.6241e+01 -5.2478e+01 -5.4354e+01 -6.4079e+01 -5.6212e+01 -5.2498e+01 -5.4324e+01 -6.4051e+01 -5.6182e+01 -5.2530e+01 -5.4293e+01 -6.4023e+01 -5.6153e+01 -5.2561e+01 -5.4263e+01 -6.3994e+01 -5.6125e+01 -5.2591e+01 -5.4233e+01 -6.3965e+01 -5.6096e+01 -5.2620e+01 -5.4203e+01 -6.3936e+01 -5.6068e+01 -5.2650e+01 -5.4173e+01 -6.3907e+01 -5.6040e+01 -5.2678e+01 -5.4144e+01 -6.3877e+01 -5.6012e+01 -5.2706e+01 -5.4115e+01 -6.3847e+01 -5.5984e+01 -5.2734e+01 -5.4086e+01 -6.3817e+01 -5.5957e+01 -5.2761e+01 -5.4058e+01 -6.3787e+01 -5.5930e+01 -5.2787e+01 -5.4030e+01 -6.3757e+01 -5.5903e+01 -5.2813e+01 -5.4002e+01 -6.3726e+01 -5.5876e+01 -5.2838e+01 -5.3974e+01 -6.3695e+01 -5.5850e+01 -5.2863e+01 -5.3947e+01 -6.3664e+01 -5.5824e+01 -5.2887e+01 -5.3920e+01 -6.3632e+01 -5.5798e+01 -5.2911e+01 -5.3894e+01 -6.3601e+01 -5.5772e+01 -5.2934e+01 -5.3867e+01 -6.3569e+01 -5.5746e+01 -5.2957e+01 -5.3841e+01 -6.3537e+01 -5.5721e+01 -5.2979e+01 -5.3815e+01 -6.3505e+01 -5.5695e+01 -5.3001e+01 -5.3789e+01 -6.3473e+01 -5.5670e+01 -5.3022e+01 -5.3764e+01 -6.3433e+01 -5.5645e+01 -5.3036e+01 -5.3739e+01 -6.3392e+01 -5.5621e+01 -5.3048e+01 -5.3714e+01 -6.3352e+01 -5.5596e+01 -5.3060e+01 -5.3689e+01 -6.3311e+01 -5.5572e+01 -5.3072e+01 -5.3664e+01 -6.3271e+01 -5.5547e+01 -5.3084e+01 -5.3640e+01 -6.3230e+01 -5.5523e+01 -5.3096e+01 -5.3616e+01 -6.3190e+01 -5.5499e+01 -5.3107e+01 -5.3592e+01 -6.3149e+01 -5.5475e+01 -5.3118e+01 -5.3569e+01 -6.3109e+01 -5.5450e+01 -5.3128e+01 -5.3545e+01 -6.3066e+01 -5.5419e+01 -5.3139e+01 -5.3522e+01 -6.3018e+01 -5.5387e+01 -5.3149e+01 -5.3499e+01 -6.2970e+01 -5.5357e+01 -5.3159e+01 -5.3476e+01 -6.2922e+01 -5.5326e+01 -5.3169e+01 -5.3453e+01 -6.2874e+01 -5.5296e+01 -5.3178e+01 -5.3431e+01 -6.2827e+01 -5.5266e+01 -5.3187e+01 -5.3409e+01 -6.2780e+01 -5.5236e+01 -5.3196e+01 -5.3386e+01 -6.2732e+01 -5.5207e+01 -5.3204e+01 -5.3365e+01 -6.2685e+01 -5.5178e+01 -5.3213e+01 -5.3343e+01 -6.2639e+01 -5.5149e+01 -5.3221e+01 -5.3321e+01 -6.2592e+01 -5.5121e+01 -5.3229e+01 -5.3300e+01 -6.2546e+01 -5.5093e+01 -5.3236e+01 -5.3279e+01 -6.2499e+01 -5.5060e+01 -5.3244e+01 -5.3258e+01 -6.2453e+01 -5.5024e+01 -5.3251e+01 -5.3237e+01 -6.2407e+01 -5.4989e+01 -5.3258e+01 -5.3216e+01 -6.2362e+01 -5.4955e+01 -5.3264e+01 -5.3195e+01 -6.2316e+01 -5.4920e+01 -5.3271e+01 -5.3175e+01 -6.2265e+01 -5.4887e+01 -5.3277e+01 -5.3155e+01 -6.2204e+01 -5.4853e+01 -5.3283e+01 -5.3135e+01 -6.2143e+01 -5.4813e+01 -5.3289e+01 -5.3115e+01 -6.2083e+01 -5.4773e+01 -5.3294e+01 -5.3095e+01 -6.2024e+01 -5.4733e+01 -5.3299e+01 -5.3075e+01 -6.1965e+01 -5.4694e+01 -5.3304e+01 -5.3056e+01 -6.1906e+01 -5.4655e+01 -5.3309e+01 -5.3036e+01 -6.1848e+01 -5.4617e+01 -5.3314e+01 -5.3017e+01 -6.1791e+01 -5.4580e+01 -5.3318e+01 -5.2998e+01 -6.1734e+01 -5.4542e+01 -5.3322e+01 -5.2979e+01 -6.1677e+01 -5.4506e+01 -5.3326e+01 -5.2960e+01 -6.1621e+01 -5.4470e+01 -5.3330e+01 -5.2941e+01 -6.1565e+01 -5.4434e+01 -5.3329e+01 -5.2923e+01 -6.1510e+01 -5.4399e+01 -5.3325e+01 -5.2904e+01 -6.1455e+01 -5.4365e+01 -5.3320e+01 -5.2886e+01 -6.1400e+01 -5.4331e+01 -5.3315e+01 -5.2868e+01 -6.1346e+01 -5.4297e+01 -5.3311e+01 -5.2850e+01 -6.1293e+01 -5.4264e+01 -5.3306e+01 -5.2832e+01 -6.1240e+01 -5.4231e+01 -5.3301e+01 -5.2814e+01 -6.1187e+01 -5.4199e+01 -5.3297e+01 -5.2796e+01 -6.1134e+01 -5.4167e+01 -5.3292e+01 -5.2779e+01 -6.1082e+01 -5.4135e+01 -5.3287e+01 -5.2761e+01 -6.1030e+01 -5.4104e+01 -5.3282e+01 -5.2744e+01 -6.0979e+01 -5.4073e+01 -5.3277e+01 -5.2726e+01 -6.0928e+01 -5.4043e+01 -5.3315e+01 -5.2709e+01 -6.0877e+01 -5.4013e+01 -5.3355e+01 -5.2692e+01 -6.0827e+01 -5.3981e+01 -5.3393e+01 -5.2675e+01 -6.0777e+01 -5.3943e+01 -5.3431e+01 -5.2658e+01 -6.0728e+01 -5.3907e+01 -5.3468e+01 -5.2641e+01 -6.0678e+01 -5.3871e+01 -5.3504e+01 -5.2625e+01 -6.0629e+01 -5.3835e+01 -5.3540e+01 -5.2608e+01 -6.0581e+01 -5.3800e+01 -5.3575e+01 -5.2589e+01 -6.0532e+01 -5.3766e+01 -5.3607e+01 -5.2565e+01 -6.0484e+01 -5.3732e+01 -5.3632e+01 -5.2541e+01 -6.0436e+01 -5.3698e+01 -5.3658e+01 -5.2517e+01 -6.0389e+01 -5.3665e+01 -5.3683e+01 -5.2494e+01 -6.0342e+01 -5.3633e+01 -5.3707e+01 -5.2470e+01 -6.0295e+01 -5.3601e+01 -5.3731e+01 -5.2447e+01 -6.0248e+01 -5.3569e+01 -5.3755e+01 -5.2425e+01 -6.0202e+01 -5.3538e+01 -5.3778e+01 -5.2402e+01 -6.0156e+01 -5.3507e+01 -5.3800e+01 -5.2380e+01 -6.0110e+01 -5.3477e+01 -5.3823e+01 -5.2359e+01 -6.0064e+01 -5.3447e+01 -5.3845e+01 -5.2329e+01 -6.0019e+01 -5.3417e+01 -5.3866e+01 -5.2300e+01 -5.9974e+01 -5.3388e+01 -5.3887e+01 -5.2271e+01 -5.9929e+01 -5.3359e+01 -5.3900e+01 -5.2243e+01 -5.9885e+01 -5.3331e+01 -5.3913e+01 -5.2215e+01 -5.9840e+01 -5.3303e+01 -5.3925e+01 -5.2188e+01 -5.9796e+01 -5.3275e+01 -5.3937e+01 -5.2161e+01 -5.9753e+01 -5.3248e+01 -5.3948e+01 -5.2134e+01 -5.9709e+01 -5.3221e+01 -5.3960e+01 -5.2108e+01 -5.9665e+01 -5.3195e+01 -5.3971e+01 -5.2082e+01 -5.9622e+01 -5.3169e+01 -5.3982e+01 -5.2056e+01 -5.9575e+01 -5.3143e+01 -5.3993e+01 -5.2031e+01 -5.9524e+01 -5.3117e+01 -5.4003e+01 -5.2006e+01 -5.9474e+01 -5.3092e+01 -5.4013e+01 -5.1982e+01 -5.9424e+01 -5.3067e+01 -5.4019e+01 -5.1957e+01 -5.9375e+01 -5.3042e+01 -5.4021e+01 -5.1934e+01 -5.9326e+01 -5.3016e+01 -5.4023e+01 -5.1910e+01 -5.9277e+01 -5.2984e+01 -5.4025e+01 -5.1887e+01 -5.9229e+01 -5.2953e+01 -5.4026e+01 -5.1870e+01 -5.9188e+01 -5.2922e+01 -5.4028e+01 -5.1882e+01 -5.9185e+01 -5.2891e+01 -5.4030e+01 -5.1888e+01 -5.9181e+01 -5.2861e+01 -5.4032e+01 -5.1894e+01 -5.9178e+01 -5.2832e+01 -5.4033e+01 -5.1900e+01 -5.9174e+01 -5.2802e+01 -5.4035e+01 -5.1906e+01 -5.9170e+01 -5.2774e+01 -5.4036e+01 -5.1912e+01 -5.9165e+01 -5.2745e+01 -5.4038e+01 -5.1919e+01 -5.9160e+01 -5.2717e+01 -5.4039e+01 -5.1925e+01 -5.9155e+01 -5.2684e+01 -5.4040e+01 -5.1931e+01 -5.9176e+01 -5.2649e+01 -5.4042e+01 -5.1937e+01 -5.9215e+01 -5.2614e+01 -5.4043e+01 -5.1943e+01 -5.9252e+01 -5.2597e+01 -5.4044e+01 -5.1949e+01 -5.9289e+01 -5.2608e+01 -5.4045e+01 -5.1955e+01 -5.9325e+01 -5.2619e+01 -5.4045e+01 -5.1961e+01 -5.9360e+01 -5.2630e+01 -5.4046e+01 -5.1967e+01 -5.9394e+01 -5.2641e+01 -5.4047e+01 -5.1973e+01 -5.9427e+01 -5.2651e+01 -5.4048e+01 -5.2012e+01 -5.9459e+01 -5.2662e+01 -5.4048e+01 -5.2054e+01 -5.9490e+01 -5.2667e+01 -5.4048e+01 -5.2096e+01 -5.9520e+01 -5.2670e+01 -5.4049e+01 -5.2137e+01 -5.9550e+01 -5.2672e+01 -5.4049e+01 -5.2178e+01 -5.9578e+01 -5.2675e+01 -5.4049e+01 -5.2218e+01 -5.9606e+01 -5.2677e+01 -5.4049e+01 -5.2258e+01 -5.9633e+01 -5.2680e+01 -5.4049e+01 -5.2297e+01 -5.9659e+01 -5.2682e+01 -5.4041e+01 -5.2335e+01 -5.9684e+01 -5.2685e+01 -5.4033e+01 -5.2373e+01 -5.9709e+01 -5.2688e+01 -5.4025e+01 -5.2411e+01 -5.9732e+01 -5.2690e+01 -5.4017e+01 -5.2448e+01 -5.9755e+01 -5.2693e+01 -5.4009e+01 -5.2485e+01 -5.9777e+01 -5.2696e+01 -5.4001e+01 -5.2521e+01 -5.9799e+01 -5.2699e+01 -5.3993e+01 -5.2556e+01 -5.9819e+01 -5.2701e+01 -5.3986e+01 -5.2591e+01 -5.9839e+01 -5.2704e+01 -5.3978e+01 -5.2626e+01 -5.9858e+01 -5.2707e+01 -5.3970e+01 -5.2660e+01 -5.9874e+01 -5.2710e+01 -5.3963e+01 -5.2694e+01 -5.9884e+01 -5.2712e+01 -5.3955e+01 -5.2727e+01 -5.9893e+01 -5.2711e+01 -5.3948e+01 -5.2759e+01 -5.9901e+01 -5.2705e+01 -5.3940e+01 -5.2792e+01 -5.9909e+01 -5.2700e+01 -5.3933e+01 -5.2823e+01 -5.9917e+01 -5.2695e+01 -5.3926e+01 -5.2854e+01 -5.9924e+01 -5.2691e+01 -5.3918e+01 -5.2885e+01 -5.9930e+01 -5.2686e+01 -5.3911e+01 -5.2915e+01 -5.9936e+01 -5.2681e+01 -5.3904e+01 -5.2945e+01 -5.9942e+01 -5.2677e+01 -5.3896e+01 -5.2974e+01 -5.9947e+01 -5.2673e+01 -5.3889e+01 -5.3003e+01 -5.9951e+01 -5.2669e+01 -5.3882e+01 -5.3032e+01 -5.9955e+01 -5.2665e+01 -5.3875e+01 -5.3059e+01 -5.9959e+01 -5.2661e+01 -5.3867e+01 -5.3087e+01 -5.9962e+01 -5.2657e+01 -5.3860e+01 -5.3114e+01 -5.9965e+01 -5.2653e+01 -5.3853e+01 -5.3140e+01 -5.9967e+01 -5.2642e+01 -5.3846e+01 -5.3166e+01 -5.9968e+01 -5.2630e+01 -5.3838e+01 -5.3192e+01 -5.9970e+01 -5.2619e+01 -5.3823e+01 -5.3217e+01 -5.9970e+01 -5.2608e+01 -5.3808e+01 -5.3264e+01 -5.9971e+01 -5.2598e+01 -5.3793e+01 -5.3325e+01 -5.9971e+01 -5.2587e+01 -5.3779e+01 -5.3384e+01 -5.9970e+01 -5.2577e+01 -5.3764e+01 -5.3443e+01 -5.9969e+01 -5.2567e+01 -5.3750e+01 -5.3501e+01 -5.9968e+01 -5.2558e+01 -5.3736e+01 -5.3558e+01 -5.9966e+01 -5.2548e+01 -5.3722e+01 -5.3614e+01 -5.9964e+01 -5.2539e+01 -5.3708e+01 -5.3670e+01 -5.9961e+01 -5.2530e+01 -5.3694e+01 -5.3724e+01 -5.9958e+01 -5.2521e+01 -5.3680e+01 -5.3777e+01 -5.9949e+01 -5.2513e+01 -5.3667e+01 -5.3830e+01 -5.9937e+01 -5.2504e+01 -5.3654e+01 -5.3882e+01 -5.9925e+01 -5.2496e+01 -5.3640e+01 -5.3933e+01 -5.9913e+01 -5.2488e+01 -5.3627e+01 -5.3983e+01 -5.9901e+01 -5.2480e+01 -5.3614e+01 -5.4032e+01 -5.9888e+01 -5.2472e+01 -5.3602e+01 -5.4081e+01 -5.9875e+01 -5.2464e+01 -5.3589e+01 -5.4124e+01 -5.9862e+01 -5.2457e+01 -5.3576e+01 -5.4163e+01 -5.9849e+01 -5.2449e+01 -5.3564e+01 -5.4202e+01 -5.9836e+01 -5.2442e+01 -5.3551e+01 -5.4239e+01 -5.9822e+01 -5.2435e+01 -5.3539e+01 -5.4276e+01 -5.9808e+01 -5.2428e+01 -5.3527e+01 -5.4313e+01 -5.9794e+01 -5.2421e+01 -5.3515e+01 -5.4349e+01 -5.9780e+01 -5.2414e+01 -5.3502e+01 -5.4384e+01 -5.9766e+01 -5.2429e+01 -5.3490e+01 -5.4419e+01 -5.9751e+01 -5.2466e+01 -5.3479e+01 -5.4453e+01 -5.9743e+01 -5.2499e+01 -5.3467e+01 -5.4487e+01 -5.9773e+01 -5.2527e+01 -5.3455e+01 -5.4520e+01 -5.9801e+01 -5.2556e+01 -5.3443e+01 -5.4552e+01 -5.9823e+01 -5.2584e+01 -5.3432e+01 -5.4584e+01 -5.9842e+01 -5.2611e+01 -5.3420e+01 -5.4615e+01 -5.9861e+01 -5.2639e+01 -5.3409e+01 -5.4646e+01 -5.9879e+01 -5.2665e+01 -5.3397e+01 -5.4676e+01 -5.9896e+01 -5.2692e+01 -5.3420e+01 -5.4706e+01 -5.9913e+01 -5.2744e+01 -5.3453e+01 -5.4735e+01 -5.9929e+01 -5.2814e+01 -5.3485e+01 -5.4763e+01 -5.9945e+01 -5.2883e+01 -5.3517e+01 -5.4791e+01 -5.9959e+01 -5.2951e+01 -5.3548e+01 -5.4818e+01 -5.9974e+01 -5.3018e+01 -5.3578e+01 -5.4845e+01 -5.9987e+01 -5.3084e+01 -5.3608e+01 -5.4871e+01 -6.0001e+01 -5.3149e+01 -5.3637e+01 -5.4897e+01 -6.0013e+01 -5.3213e+01 -5.3666e+01 -5.4922e+01 -6.0025e+01 -5.3276e+01 -5.3694e+01 -5.4947e+01 -6.0036e+01 -5.3338e+01 -5.3722e+01 -5.4971e+01 -6.0047e+01 -5.3399e+01 -5.3744e+01 -5.4995e+01 -6.0057e+01 -5.3459e+01 -5.3762e+01 -5.5018e+01 -6.0067e+01 -5.3518e+01 -5.3781e+01 -5.5041e+01 -6.0076e+01 -5.3576e+01 -5.3798e+01 -5.5063e+01 -6.0085e+01 -5.3634e+01 -5.3816e+01 -5.5114e+01 -6.0093e+01 -5.3690e+01 -5.3833e+01 -5.5171e+01 -6.0100e+01 -5.3746e+01 -5.3850e+01 -5.5228e+01 -6.0107e+01 -5.3800e+01 -5.3866e+01 -5.5283e+01 -6.0114e+01 -5.3854e+01 -5.3882e+01 -5.5338e+01 -6.0120e+01 -5.3906e+01 -5.3898e+01 -5.5391e+01 -6.0125e+01 -5.3958e+01 -5.3914e+01 -5.5444e+01 -6.0130e+01 -5.4009e+01 -5.3929e+01 -5.5496e+01 -6.0134e+01 -5.4059e+01 -5.3943e+01 -5.5546e+01 -6.0138e+01 -5.4108e+01 -5.3958e+01 -5.5596e+01 -6.0141e+01 -5.4157e+01 -5.3972e+01 -5.5645e+01 -6.0144e+01 -5.4204e+01 -5.3986e+01 -5.5693e+01 -6.0147e+01 -5.4251e+01 -5.3999e+01 -5.5741e+01 -6.0148e+01 -5.4297e+01 -5.4012e+01 -5.5787e+01 -6.0150e+01 -5.4342e+01 -5.4026e+01 -5.5833e+01 -6.0151e+01 -5.4386e+01 -5.4083e+01 -5.5877e+01 -6.0151e+01 -5.4429e+01 -5.4139e+01 -5.5921e+01 -6.0151e+01 -5.4472e+01 -5.4194e+01 -5.5964e+01 -6.0151e+01 -5.4514e+01 -5.4248e+01 -5.6003e+01 -6.0150e+01 -5.4555e+01 -5.4302e+01 -5.6036e+01 -6.0148e+01 -5.4595e+01 -5.4354e+01 -5.6069e+01 -6.0147e+01 -5.4634e+01 -5.4405e+01 -5.6101e+01 -6.0144e+01 -5.4673e+01 -5.4455e+01 -5.6133e+01 -6.0142e+01 -5.4711e+01 -5.4505e+01 -5.6163e+01 -6.0139e+01 -5.4748e+01 -5.4553e+01 -5.6194e+01 -6.0135e+01 -5.4785e+01 -5.4601e+01 -5.6223e+01 -6.0131e+01 -5.4820e+01 -5.4648e+01 -5.6252e+01 -6.0127e+01 -5.4855e+01 -5.4693e+01 -5.6281e+01 -6.0122e+01 -5.4882e+01 -5.4738e+01 -5.6308e+01 -6.0117e+01 -5.4908e+01 -5.4782e+01 -5.6335e+01 -6.0111e+01 -5.4933e+01 -5.4826e+01 -5.6362e+01 -6.0105e+01 -5.4955e+01 -5.4868e+01 -5.6388e+01 -6.0132e+01 -5.4971e+01 -5.4909e+01 -5.6413e+01 -6.0169e+01 -5.4987e+01 -5.4950e+01 -5.6438e+01 -6.0206e+01 -5.5003e+01 -5.4990e+01 -5.6463e+01 -6.0241e+01 -5.5062e+01 -5.5029e+01 -5.6486e+01 -6.0275e+01 -5.5121e+01 -5.5067e+01 -5.6509e+01 -6.0308e+01 -5.5179e+01 -5.5105e+01 -5.6553e+01 -6.0341e+01 -5.5236e+01 -5.5141e+01 -5.6611e+01 -6.0372e+01 -5.5292e+01 -5.5177e+01 -5.6669e+01 -6.0403e+01 -5.5347e+01 -5.5212e+01 -5.6725e+01 -6.0432e+01 -5.5402e+01 -5.5247e+01 -5.6780e+01 -6.0460e+01 -5.5455e+01 -5.5280e+01 -5.6835e+01 -6.0488e+01 -5.5507e+01 -5.5313e+01 -5.6888e+01 -6.0515e+01 -5.5559e+01 -5.5345e+01 -5.6941e+01 -6.0540e+01 -5.5609e+01 -5.5373e+01 -5.6992e+01 -6.0570e+01 -5.5651e+01 -5.5396e+01 -5.7042e+01 -6.0642e+01 -5.5692e+01 -5.5418e+01 -5.7092e+01 -6.0753e+01 -5.5732e+01 -5.5440e+01 -5.7140e+01 -6.0863e+01 -5.5772e+01 -5.5461e+01 -5.7188e+01 -6.0970e+01 -5.5811e+01 -5.5481e+01 -5.7235e+01 -6.1075e+01 -5.5849e+01 -5.5502e+01 -5.7280e+01 -6.1178e+01 -5.5887e+01 -5.5521e+01 -5.7325e+01 -6.1279e+01 -5.5923e+01 -5.5540e+01 -5.7369e+01 -6.1378e+01 -5.5960e+01 -5.5559e+01 -5.7412e+01 -6.1474e+01 -5.5995e+01 -5.5577e+01 -5.7454e+01 -6.1569e+01 -5.6027e+01 -5.5595e+01 -5.7496e+01 -6.1662e+01 -5.6054e+01 -5.5612e+01 -5.7536e+01 -6.1752e+01 -5.6079e+01 -5.5629e+01 -5.7575e+01 -6.1833e+01 -5.6105e+01 -5.5645e+01 -5.7614e+01 -6.1912e+01 -5.6130e+01 -5.5661e+01 -5.7652e+01 -6.1990e+01 -5.6154e+01 -5.5677e+01 -5.7689e+01 -6.2065e+01 -5.6178e+01 -5.5691e+01 -5.7725e+01 -6.2139e+01 -5.6202e+01 -5.5706e+01 -5.7760e+01 -6.2212e+01 -5.6223e+01 -5.5720e+01 -5.7794e+01 -6.2283e+01 -5.6237e+01 -5.5733e+01 -5.7828e+01 -6.2352e+01 -5.6252e+01 -5.5747e+01 -5.7861e+01 -6.2419e+01 -5.6266e+01 -5.5759e+01 -5.7893e+01 -6.2485e+01 -5.6280e+01 -5.5772e+01 -5.7924e+01 -6.2550e+01 -5.6293e+01 -5.5783e+01 -5.7955e+01 -6.2613e+01 -5.6307e+01 -5.5795e+01 -5.7984e+01 -6.2674e+01 -5.6320e+01 -5.5806e+01 -5.8013e+01 -6.2734e+01 -5.6333e+01 -5.5816e+01 -5.8041e+01 -6.2793e+01 -5.6345e+01 -5.5826e+01 -5.8069e+01 -6.2850e+01 -5.6358e+01 -5.5836e+01 -5.8095e+01 -6.2905e+01 -5.6370e+01 -5.5845e+01 -5.8121e+01 -6.2959e+01 -5.6381e+01 -5.5854e+01 -5.8146e+01 -6.3012e+01 -5.6393e+01 -5.5863e+01 -5.8171e+01 -6.3063e+01 -5.6404e+01 -5.5868e+01 -5.8194e+01 -6.3113e+01 -5.6415e+01 -5.5867e+01 -5.8217e+01 -6.3162e+01 -5.6425e+01 -5.5867e+01 -5.8240e+01 -6.3209e+01 -5.6436e+01 -5.5867e+01 -5.8261e+01 -6.3255e+01 -5.6446e+01 -5.5866e+01 -5.8282e+01 -6.3299e+01 -5.6455e+01 -5.5865e+01 -5.8303e+01 -6.3336e+01 -5.6465e+01 -5.5857e+01 -5.8320e+01 -6.3370e+01 -5.6474e+01 -5.5840e+01 -5.8331e+01 -6.3403e+01 -5.6483e+01 -5.5824e+01 -5.8341e+01 -6.3435e+01 -5.6491e+01 -5.5829e+01 -5.8351e+01 -6.3466e+01 -5.6499e+01 -5.5857e+01 -5.8361e+01 -6.3496e+01 -5.6507e+01 -5.5884e+01 -5.8365e+01 -6.3525e+01 -5.6515e+01 -5.5911e+01 -5.8366e+01 -6.3553e+01 -5.6522e+01 -5.5937e+01 -5.8367e+01 -6.3580e+01 -5.6529e+01 -5.5963e+01 -5.8367e+01 -6.3606e+01 -5.6536e+01 -5.5989e+01 -5.8367e+01 -6.3631e+01 -5.6543e+01 -5.6013e+01 -5.8367e+01 -6.3655e+01 -5.6549e+01 -5.6038e+01 -5.8367e+01 -6.3678e+01 -5.6555e+01 -5.6062e+01 -5.8366e+01 -6.3700e+01 -5.6560e+01 -5.6085e+01 -5.8365e+01 -6.3721e+01 -5.6566e+01 -5.6108e+01 -5.8364e+01 -6.3741e+01 -5.6571e+01 -5.6131e+01 -5.8362e+01 -6.3760e+01 -5.6575e+01 -5.6153e+01 -5.8361e+01 -6.3778e+01 -5.6580e+01 -5.6174e+01 -5.8359e+01 -6.3796e+01 -5.6584e+01 -5.6195e+01 -5.8357e+01 -6.3812e+01 -5.6588e+01 -5.6207e+01 -5.8354e+01 -6.3828e+01 -5.6591e+01 -5.6220e+01 -5.8352e+01 -6.3843e+01 -5.6595e+01 -5.6232e+01 -5.8349e+01 -6.3857e+01 -5.6598e+01 -5.6244e+01 -5.8345e+01 -6.3870e+01 -5.6601e+01 -5.6255e+01 -5.8342e+01 -6.3882e+01 -5.6603e+01 -5.6267e+01 -5.8338e+01 -6.3893e+01 -5.6601e+01 -5.6278e+01 -5.8334e+01 -6.3904e+01 -5.6595e+01 -5.6288e+01 -5.8330e+01 -6.3908e+01 -5.6589e+01 -5.6297e+01 -5.8326e+01 -6.3909e+01 -5.6583e+01 -5.6299e+01 -5.8315e+01 -6.3909e+01 -5.6576e+01 -5.6301e+01 -5.8303e+01 -6.3909e+01 -5.6570e+01 -5.6304e+01 -5.8290e+01 -6.3909e+01 -5.6564e+01 -5.6306e+01 -5.8277e+01 -6.3907e+01 -5.6557e+01 -5.6307e+01 -5.8264e+01 -6.3906e+01 -5.6551e+01 -5.6309e+01 -5.8251e+01 -6.3903e+01 -5.6544e+01 -5.6311e+01 -5.8238e+01 -6.3900e+01 -5.6537e+01 -5.6312e+01 -5.8222e+01 -6.3897e+01 -5.6530e+01 -5.6314e+01 -5.8200e+01 -6.3893e+01 -5.6523e+01 -5.6315e+01 -5.8180e+01 -6.3888e+01 -5.6516e+01 -5.6316e+01 -5.8159e+01 -6.3883e+01 -5.6509e+01 -5.6317e+01 -5.8138e+01 -6.3878e+01 -5.6502e+01 -5.6318e+01 -5.8117e+01 -6.3872e+01 -5.6494e+01 -5.6319e+01 -5.8097e+01 -6.3865e+01 -5.6487e+01 -5.6320e+01 -5.8074e+01 -6.3858e+01 -5.6479e+01 -5.6320e+01 -5.8046e+01 -6.3850e+01 -5.6471e+01 -5.6321e+01 -5.8018e+01 -6.3842e+01 -5.6463e+01 -5.6321e+01 -5.7990e+01 -6.3833e+01 -5.6455e+01 -5.6321e+01 -5.7963e+01 -6.3824e+01 -5.6447e+01 -5.6318e+01 -5.7935e+01 -6.3814e+01 -5.6439e+01 -5.6310e+01 -5.7908e+01 -6.3804e+01 -5.6431e+01 -5.6302e+01 -5.7882e+01 -6.3794e+01 -5.6422e+01 -5.6294e+01 -5.7855e+01 -6.3783e+01 -5.6414e+01 -5.6286e+01 -5.7829e+01 -6.3771e+01 -5.6405e+01 -5.6278e+01 -5.7803e+01 -6.3759e+01 -5.6397e+01 -5.6270e+01 -5.7777e+01 -6.3747e+01 -5.6388e+01 -5.6260e+01 -5.7752e+01 -6.3734e+01 -5.6379e+01 -5.6245e+01 -5.7726e+01 -6.3720e+01 -5.6370e+01 -5.6229e+01 -5.7701e+01 -6.3729e+01 -5.6360e+01 -5.6213e+01 -5.7676e+01 -6.3759e+01 -5.6351e+01 -5.6198e+01 -5.7651e+01 -6.3788e+01 -5.6339e+01 -5.6183e+01 -5.7627e+01 -6.3816e+01 -5.6321e+01 -5.6168e+01 -5.7602e+01 -6.3843e+01 -5.6304e+01 -5.6153e+01 -5.7578e+01 -6.3869e+01 -5.6287e+01 -5.6139e+01 -5.7554e+01 -6.3894e+01 -5.6269e+01 -5.6124e+01 -5.7530e+01 -6.3918e+01 -5.6252e+01 -5.6110e+01 -5.7506e+01 -6.3940e+01 -5.6235e+01 -5.6092e+01 -5.7482e+01 -6.3962e+01 -5.6218e+01 -5.6070e+01 -5.7458e+01 -6.3983e+01 -5.6201e+01 -5.6049e+01 -5.7435e+01 -6.4003e+01 -5.6184e+01 -5.6027e+01 -5.7412e+01 -6.4021e+01 -5.6167e+01 -5.6006e+01 -5.7388e+01 -6.4039e+01 -5.6150e+01 -5.5986e+01 -5.7365e+01 -6.4056e+01 -5.6133e+01 -5.5962e+01 -5.7342e+01 -6.4072e+01 -5.6117e+01 -5.5934e+01 -5.7319e+01 -6.4087e+01 -5.6098e+01 -5.5906e+01 -5.7297e+01 -6.4101e+01 -5.6074e+01 -5.5879e+01 -5.7274e+01 -6.4115e+01 -5.6049e+01 -5.5852e+01 -5.7251e+01 -6.4127e+01 -5.6025e+01 -5.5826e+01 -5.7229e+01 -6.4139e+01 -5.6001e+01 -5.5800e+01 -5.7206e+01 -6.4149e+01 -5.5977e+01 -5.5774e+01 -5.7176e+01 -6.4159e+01 -5.5954e+01 -5.5749e+01 -5.7146e+01 -6.4168e+01 -5.5930e+01 -5.5724e+01 -5.7116e+01 -6.4176e+01 -5.5907e+01 -5.5700e+01 -5.7086e+01 -6.4183e+01 -5.5884e+01 -5.5676e+01 -5.7057e+01 -6.4190e+01 -5.5862e+01 -5.5652e+01 -5.7028e+01 -6.4188e+01 -5.5839e+01 -5.5629e+01 -5.6995e+01 -6.4185e+01 -5.5817e+01 -5.5605e+01 -5.6959e+01 -6.4181e+01 -5.5794e+01 -5.5583e+01 -5.6923e+01 -6.4177e+01 -5.5772e+01 -5.5560e+01 -5.6882e+01 -6.4173e+01 -5.5749e+01 -5.5538e+01 -5.6839e+01 -6.4168e+01 -5.5719e+01 -5.5516e+01 -5.6797e+01 -6.4162e+01 -5.5690e+01 -5.5494e+01 -5.6755e+01 -6.4156e+01 -5.5661e+01 -5.5473e+01 -5.6706e+01 -6.4149e+01 -5.5632e+01 -5.5452e+01 -5.6657e+01 -6.4141e+01 -5.5604e+01 -5.5431e+01 -5.6610e+01 -6.4134e+01 -5.5572e+01 -5.5410e+01 -5.6563e+01 -6.4125e+01 -5.5537e+01 -5.5390e+01 -5.6516e+01 -6.4116e+01 -5.5502e+01 -5.5370e+01 -5.6471e+01 -6.4107e+01 -5.5467e+01 -5.5350e+01 -5.6426e+01 -6.4097e+01 -5.5433e+01 -5.5330e+01 -5.6381e+01 -6.4086e+01 -5.5399e+01 -5.5310e+01 -5.6338e+01 -6.4075e+01 -5.5366e+01 -5.5291e+01 -5.6294e+01 -6.4064e+01 -5.5333e+01 -5.5272e+01 -5.6252e+01 -6.4052e+01 -5.5300e+01 -5.5253e+01 -5.6210e+01 -6.4040e+01 -5.5268e+01 -5.5234e+01 -5.6169e+01 -6.4027e+01 -5.5237e+01 -5.5216e+01 -5.6128e+01 -6.4013e+01 -5.5205e+01 -5.5197e+01 -5.6088e+01 -6.3998e+01 -5.5175e+01 -5.5179e+01 -5.6049e+01 -6.3976e+01 -5.5144e+01 -5.5161e+01 -5.6009e+01 -6.3954e+01 -5.5114e+01 -5.5143e+01 -5.5971e+01 -6.3931e+01 -5.5084e+01 -5.5125e+01 -5.5933e+01 -6.3908e+01 -5.5055e+01 -5.5107e+01 -5.5895e+01 -6.3877e+01 -5.5026e+01 -5.5090e+01 -5.5858e+01 -6.3846e+01 -5.4998e+01 -5.5073e+01 -5.5822e+01 -6.3815e+01 -5.4969e+01 -5.5055e+01 -5.5786e+01 -6.3783e+01 -5.4941e+01 -5.5036e+01 -5.5750e+01 -6.3752e+01 -5.4914e+01 -5.5011e+01 -5.5715e+01 -6.3720e+01 -5.4886e+01 -5.4986e+01 -5.5680e+01 -6.3685e+01 -5.4859e+01 -5.4962e+01 -5.5646e+01 -6.3645e+01 -5.4828e+01 -5.4938e+01 -5.5612e+01 -6.3606e+01 -5.4794e+01 -5.4914e+01 -5.5579e+01 -6.3567e+01 -5.4760e+01 -5.4891e+01 -5.5546e+01 -6.3528e+01 -5.4727e+01 -5.4867e+01 -5.5513e+01 -6.3489e+01 -5.4694e+01 -5.4844e+01 -5.5481e+01 -6.3450e+01 -5.4661e+01 -5.4822e+01 -5.5449e+01 -6.3411e+01 -5.4629e+01 -5.4799e+01 -5.5417e+01 -6.3372e+01 -5.4598e+01 -5.4777e+01 -5.5386e+01 -6.3325e+01 -5.4567e+01 -5.4755e+01 -5.5355e+01 -6.3279e+01 -5.4536e+01 -5.4728e+01 -5.5325e+01 -6.3233e+01 -5.4504e+01 -5.4699e+01 -5.5295e+01 -6.3187e+01 -5.4465e+01 -5.4670e+01 -5.5265e+01 -6.3142e+01 -5.4420e+01 -5.4641e+01 -5.5235e+01 -6.3097e+01 -5.4375e+01 -5.4613e+01 -5.5206e+01 -6.3052e+01 -5.4331e+01 -5.4585e+01 -5.5177e+01 -6.3008e+01 -5.4288e+01 -5.4558e+01 -5.5149e+01 -6.2983e+01 -5.4264e+01 -5.4531e+01 -5.5121e+01 -6.2983e+01 -5.4267e+01 -5.4504e+01 -5.5093e+01 -6.2983e+01 -5.4270e+01 -5.4478e+01 -5.5065e+01 -6.2982e+01 -5.4273e+01 -5.4452e+01 -5.5037e+01 -6.2981e+01 -5.4276e+01 -5.4427e+01 -5.5010e+01 -6.2980e+01 -5.4278e+01 -5.4401e+01 -5.4983e+01 -6.2978e+01 -5.4281e+01 -5.4376e+01 -5.4957e+01 -6.2976e+01 -5.4284e+01 -5.4352e+01 -5.4930e+01 -6.2973e+01 -5.4287e+01 -5.4327e+01 -5.4904e+01 -6.2970e+01 -5.4290e+01 -5.4303e+01 -5.4878e+01 -6.2966e+01 -5.4292e+01 -5.4280e+01 -5.4853e+01 -6.2962e+01 -5.4295e+01 -5.4256e+01 -5.4827e+01 -6.2958e+01 -5.4298e+01 -5.4233e+01 -5.4802e+01 -6.2953e+01 -5.4300e+01 -5.4210e+01 -5.4777e+01 -6.2948e+01 -5.4303e+01 -5.4187e+01 -5.4747e+01 -6.2942e+01 -5.4306e+01 -5.4165e+01 -5.4714e+01 -6.2936e+01 -5.4308e+01 -5.4143e+01 -5.4682e+01 -6.2929e+01 -5.4311e+01 -5.4121e+01 -5.4651e+01 -6.2922e+01 -5.4313e+01 -5.4099e+01 -5.4619e+01 -6.2915e+01 -5.4315e+01 -5.4078e+01 -5.4588e+01 -6.2907e+01 -5.4317e+01 -5.4057e+01 -5.4558e+01 -6.2899e+01 -5.4320e+01 -5.4036e+01 -5.4528e+01 -6.2891e+01 -5.4322e+01 -5.4015e+01 -5.4498e+01 -6.2882e+01 -5.4324e+01 -5.3994e+01 -5.4469e+01 -6.2873e+01 -5.4326e+01 -5.3974e+01 -5.4440e+01 -6.2863e+01 -5.4328e+01 -5.3954e+01 -5.4411e+01 -6.2853e+01 -5.4329e+01 -5.3934e+01 -5.4382e+01 -6.2842e+01 -5.4331e+01 -5.3914e+01 -5.4354e+01 -6.2832e+01 -5.4333e+01 -5.3894e+01 -5.4326e+01 -6.2821e+01 -5.4334e+01 -5.3875e+01 -5.4299e+01 -6.2809e+01 -5.4335e+01 -5.3856e+01 -5.4272e+01 -6.2797e+01 -5.4337e+01 -5.3837e+01 -5.4245e+01 -6.2785e+01 -5.4338e+01 -5.3818e+01 -5.4218e+01 -6.2772e+01 -5.4339e+01 -5.3799e+01 -5.4192e+01 -6.2759e+01 -5.4340e+01 -5.3781e+01 -5.4166e+01 -6.2746e+01 -5.4341e+01 -5.3787e+01 -5.4140e+01 -6.2732e+01 -5.4341e+01 -5.3813e+01 -5.4115e+01 -6.2718e+01 -5.4342e+01 -5.3839e+01 -5.4089e+01 -6.2704e+01 -5.4343e+01 -5.3864e+01 -5.4064e+01 -6.2683e+01 -5.4343e+01 -5.3889e+01 -5.4040e+01 -6.2660e+01 -5.4343e+01 -5.3913e+01 -5.4009e+01 -6.2637e+01 -5.4343e+01 -5.3930e+01 -5.3977e+01 -6.2614e+01 -5.4343e+01 -5.3945e+01 -5.3945e+01 -6.2591e+01 -5.4337e+01 -5.3960e+01 -5.3914e+01 -6.2567e+01 -5.4329e+01 -5.3975e+01 -5.3883e+01 -6.2544e+01 -5.4321e+01 -5.3989e+01 -5.3853e+01 -6.2520e+01 -5.4313e+01 -5.4003e+01 -5.3823e+01 -6.2496e+01 -5.4305e+01 -5.4017e+01 -5.3793e+01 -6.2472e+01 -5.4297e+01 -5.4030e+01 -5.3764e+01 -6.2448e+01 -5.4289e+01 -5.4043e+01 -5.3735e+01 -6.2424e+01 -5.4282e+01 -5.4056e+01 -5.3706e+01 -6.2399e+01 -5.4274e+01 -5.4069e+01 -5.3678e+01 -6.2375e+01 -5.4266e+01 -5.4081e+01 -5.3665e+01 -6.2350e+01 -5.4259e+01 -5.4093e+01 -5.3674e+01 -6.2325e+01 -5.4251e+01 -5.4104e+01 -5.3683e+01 -6.2300e+01 -5.4244e+01 -5.4116e+01 -5.3691e+01 -6.2275e+01 -5.4236e+01 -5.4127e+01 -5.3700e+01 -6.2249e+01 -5.4229e+01 -5.4138e+01 -5.3708e+01 -6.2224e+01 -5.4222e+01 -5.4148e+01 -5.3717e+01 -6.2198e+01 -5.4214e+01 -5.4159e+01 -5.3725e+01 -6.2173e+01 -5.4207e+01 -5.4169e+01 -5.3733e+01 -6.2147e+01 -5.4199e+01 -5.4178e+01 -5.3741e+01 -6.2121e+01 -5.4192e+01 -5.4188e+01 -5.3749e+01 -6.2095e+01 -5.4184e+01 -5.4197e+01 -5.3756e+01 -6.2068e+01 -5.4177e+01 -5.4206e+01 -5.3763e+01 -6.2042e+01 -5.4165e+01 -5.4214e+01 -5.3771e+01 -6.2015e+01 -5.4150e+01 -5.4223e+01 -5.3778e+01 -6.1989e+01 -5.4135e+01 -5.4231e+01 -5.3785e+01 -6.1962e+01 -5.4120e+01 -5.4233e+01 -5.3791e+01 -6.1935e+01 -5.4105e+01 -5.4225e+01 -5.3798e+01 -6.1908e+01 -5.4090e+01 -5.4217e+01 -5.3804e+01 -6.1881e+01 -5.4076e+01 -5.4208e+01 -5.3811e+01 -6.1853e+01 -5.4062e+01 -5.4200e+01 -5.3817e+01 -6.1826e+01 -5.4048e+01 -5.4192e+01 -5.3823e+01 -6.1798e+01 -5.4028e+01 -5.4185e+01 -5.3828e+01 -6.1771e+01 -5.4006e+01 -5.4177e+01 -5.3834e+01 -6.1743e+01 -5.3985e+01 -5.4169e+01 -5.3839e+01 -6.1715e+01 -5.3964e+01 -5.4162e+01 -5.3845e+01 -6.1687e+01 -5.3943e+01 -5.4154e+01 -5.3850e+01 -6.1659e+01 -5.3923e+01 -5.4147e+01 -5.3855e+01 -6.1630e+01 -5.3903e+01 -5.4140e+01 -5.3859e+01 -6.1602e+01 -5.3883e+01 -5.4132e+01 -5.3864e+01 -6.1573e+01 -5.3864e+01 -5.4125e+01 -5.3868e+01 -6.1545e+01 -5.3844e+01 -5.4118e+01 -5.3872e+01 -6.1516e+01 -5.3826e+01 -5.4111e+01 -5.3876e+01 -6.1487e+01 -5.3807e+01 -5.4104e+01 -5.3880e+01 -6.1458e+01 -5.3788e+01 -5.4097e+01 -5.3884e+01 -6.1429e+01 -5.3770e+01 -5.4090e+01 -5.3887e+01 -6.1400e+01 -5.3752e+01 -5.4083e+01 -5.3891e+01 -6.1370e+01 -5.3734e+01 -5.4076e+01 -5.3894e+01 -6.1341e+01 -5.3717e+01 -5.4069e+01 -5.3897e+01 -6.1304e+01 -5.3700e+01 -5.4062e+01 -5.3900e+01 -6.1267e+01 -5.3675e+01 -5.4055e+01 -5.3902e+01 -6.1229e+01 -5.3650e+01 -5.4048e+01 -5.3905e+01 -6.1192e+01 -5.3626e+01 -5.4042e+01 -5.3907e+01 -6.1155e+01 -5.3602e+01 -5.4035e+01 -5.3909e+01 -6.1118e+01 -5.3578e+01 -5.4028e+01 -5.3911e+01 -6.1081e+01 -5.3555e+01 -5.4021e+01 -5.3905e+01 -6.1068e+01 -5.3525e+01 -5.4014e+01 -5.3898e+01 -6.1075e+01 -5.3495e+01 -5.4008e+01 -5.3884e+01 -6.1082e+01 -5.3465e+01 -5.4001e+01 -5.3870e+01 -6.1088e+01 -5.3436e+01 -5.3994e+01 -5.3856e+01 -6.1094e+01 -5.3407e+01 -5.3987e+01 -5.3843e+01 -6.1099e+01 -5.3379e+01 -5.3980e+01 -5.3829e+01 -6.1104e+01 -5.3351e+01 -5.3973e+01 -5.3816e+01 -6.1108e+01 -5.3324e+01 -5.3967e+01 -5.3803e+01 -6.1112e+01 -5.3297e+01 -5.3960e+01 -5.3790e+01 -6.1115e+01 -5.3271e+01 -5.3953e+01 -5.3777e+01 -6.1117e+01 -5.3245e+01 -5.3946e+01 -5.3765e+01 -6.1119e+01 -5.3219e+01 -5.3939e+01 -5.3753e+01 -6.1121e+01 -5.3194e+01 -5.3932e+01 -5.3740e+01 -6.1121e+01 -5.3170e+01 -5.3925e+01 -5.3728e+01 -6.1122e+01 -5.3145e+01 -5.3918e+01 -5.3716e+01 -6.1122e+01 -5.3122e+01 -5.3911e+01 -5.3705e+01 -6.1121e+01 -5.3098e+01 -5.3904e+01 -5.3693e+01 -6.1120e+01 -5.3075e+01 -5.3897e+01 -5.3681e+01 -6.1118e+01 -5.3052e+01 -5.3889e+01 -5.3670e+01 -6.1116e+01 -5.3030e+01 -5.3874e+01 -5.3659e+01 -6.1114e+01 -5.3008e+01 -5.3859e+01 -5.3648e+01 -6.1111e+01 -5.2986e+01 -5.3844e+01 -5.3637e+01 -6.1107e+01 -5.2965e+01 -5.3829e+01 -5.3626e+01 -6.1103e+01 -5.2939e+01 -5.3815e+01 -5.3615e+01 -6.1099e+01 -5.2910e+01 -5.3800e+01 -5.3604e+01 -6.1094e+01 -5.2882e+01 -5.3786e+01 -5.3593e+01 -6.1088e+01 -5.2854e+01 -5.3772e+01 -5.3583e+01 -6.1083e+01 -5.2827e+01 -5.3758e+01 -5.3572e+01 -6.1076e+01 -5.2801e+01 -5.3742e+01 -5.3562e+01 -6.1065e+01 -5.2774e+01 -5.3720e+01 -5.3551e+01 -6.1050e+01 -5.2749e+01 -5.3699e+01 -5.3541e+01 -6.1035e+01 -5.2723e+01 -5.3678e+01 -5.3531e+01 -6.1019e+01 -5.2698e+01 -5.3657e+01 -5.3521e+01 -6.1004e+01 -5.2669e+01 -5.3637e+01 -5.3510e+01 -6.0988e+01 -5.2637e+01 -5.3616e+01 -5.3500e+01 -6.0972e+01 -5.2606e+01 -5.3596e+01 -5.3490e+01 -6.0955e+01 -5.2575e+01 -5.3577e+01 -5.3480e+01 -6.0939e+01 -5.2545e+01 -5.3557e+01 -5.3470e+01 -6.0922e+01 -5.2515e+01 -5.3538e+01 -5.3461e+01 -6.0905e+01 -5.2486e+01 -5.3519e+01 -5.3451e+01 -6.0888e+01 -5.2457e+01 -5.3500e+01 -5.3441e+01 -6.0871e+01 -5.2429e+01 -5.3482e+01 -5.3431e+01 -6.0853e+01 -5.2402e+01 -5.3464e+01 -5.3422e+01 -6.0838e+01 -5.2375e+01 -5.3446e+01 -5.3412e+01 -6.0864e+01 -5.2348e+01 -5.3428e+01 -5.3402e+01 -6.0890e+01 -5.2322e+01 -5.3410e+01 -5.3393e+01 -6.0907e+01 -5.2297e+01 -5.3386e+01 -5.3383e+01 -6.0924e+01 -5.2265e+01 -5.3361e+01 -5.3374e+01 -6.0934e+01 -5.2232e+01 -5.3336e+01 -5.3364e+01 -6.0937e+01 -5.2200e+01 -5.3312e+01 -5.3355e+01 -6.0936e+01 -5.2161e+01 -5.3288e+01 -5.3345e+01 -6.0934e+01 -5.2122e+01 -5.3265e+01 -5.3336e+01 -6.0932e+01 -5.2084e+01 -5.3242e+01 -5.3326e+01 -6.0930e+01 -5.2048e+01 -5.3219e+01 -5.3317e+01 -6.0928e+01 -5.2011e+01 -5.3196e+01 -5.3307e+01 -6.0925e+01 -5.1976e+01 -5.3174e+01 -5.3298e+01 -6.0923e+01 -5.1934e+01 -5.3152e+01 -5.3289e+01 -6.0920e+01 -5.1892e+01 -5.3131e+01 -5.3279e+01 -6.0916e+01 -5.1851e+01 -5.3110e+01 -5.3270e+01 -6.0913e+01 -5.1811e+01 -5.3089e+01 -5.3260e+01 -6.0909e+01 -5.1771e+01 -5.3068e+01 -5.3251e+01 -6.0905e+01 -5.1733e+01 -5.3048e+01 -5.3242e+01 -6.0900e+01 -5.1695e+01 -5.3028e+01 -5.3232e+01 -6.0896e+01 -5.1658e+01 -5.3008e+01 -5.3223e+01 -6.0889e+01 -5.1622e+01 -5.2989e+01 -5.3214e+01 -6.0876e+01 -5.1587e+01 -5.2970e+01 -5.3204e+01 -6.0863e+01 -5.1550e+01 -5.2951e+01 -5.3195e+01 -6.0850e+01 -5.1508e+01 -5.2932e+01 -5.3186e+01 -6.0836e+01 -5.1467e+01 -5.2913e+01 -5.3176e+01 -6.0823e+01 -5.1427e+01 -5.2895e+01 -5.3167e+01 -6.0809e+01 -5.1388e+01 -5.2877e+01 -5.3158e+01 -6.0796e+01 -5.1350e+01 -5.2859e+01 -5.3148e+01 -6.0782e+01 -5.1312e+01 -5.2842e+01 -5.3139e+01 -6.0768e+01 -5.1276e+01 -5.2824e+01 -5.3129e+01 -6.0754e+01 -5.1240e+01 -5.2807e+01 -5.3112e+01 -6.0740e+01 -5.1205e+01 -5.2790e+01 -5.3094e+01 -6.0726e+01 -5.1170e+01 -5.2774e+01 -5.3077e+01 -6.0712e+01 -5.1137e+01 -5.2757e+01 -5.3061e+01 -6.0697e+01 -5.1104e+01 -5.2741e+01 -5.3044e+01 -6.0683e+01 -5.1072e+01 -5.2724e+01 -5.3028e+01 -6.0668e+01 -5.1040e+01 -5.2708e+01 -5.3011e+01 -6.0653e+01 -5.1009e+01 -5.2693e+01 -5.2995e+01 -6.0653e+01 -5.0979e+01 -5.2677e+01 -5.2979e+01 -6.0683e+01 -5.0944e+01 -5.2661e+01 -5.2963e+01 -6.0711e+01 -5.0908e+01 -5.2646e+01 -5.2948e+01 -6.0739e+01 -5.0872e+01 -5.2631e+01 -5.2932e+01 -6.0766e+01 -5.0837e+01 -5.2616e+01 -5.2917e+01 -6.0792e+01 -5.0800e+01 -5.2600e+01 -5.2902e+01 -6.0818e+01 -5.0758e+01 -5.2577e+01 -5.2886e+01 -6.0843e+01 -5.0718e+01 -5.2555e+01 -5.2872e+01 -6.0867e+01 -5.0678e+01 -5.2533e+01 -5.2857e+01 -6.0890e+01 -5.0640e+01 -5.2511e+01 -5.2842e+01 -6.0912e+01 -5.0602e+01 -5.2490e+01 -5.2827e+01 -6.0934e+01 -5.0565e+01 -5.2469e+01 -5.2813e+01 -6.0955e+01 -5.0529e+01 -5.2448e+01 -5.2799e+01 -6.0976e+01 -5.0494e+01 -5.2428e+01 -5.2784e+01 -6.0995e+01 -5.0459e+01 -5.2408e+01 -5.2770e+01 -6.1014e+01 -5.0426e+01 -5.2388e+01 -5.2756e+01 -6.1032e+01 -5.0393e+01 -5.2368e+01 -5.2742e+01 -6.1050e+01 -5.0386e+01 -5.2349e+01 -5.2729e+01 -6.1066e+01 -5.0399e+01 -5.2330e+01 -5.2715e+01 -6.1082e+01 -5.0412e+01 -5.2311e+01 -5.2701e+01 -6.1098e+01 -5.0425e+01 -5.2292e+01 -5.2688e+01 -6.1113e+01 -5.0438e+01 -5.2274e+01 -5.2675e+01 -6.1127e+01 -5.0452e+01 -5.2256e+01 -5.2661e+01 -6.1140e+01 -5.0465e+01 -5.2238e+01 -5.2648e+01 -6.1153e+01 -5.0478e+01 -5.2221e+01 -5.2635e+01 -6.1165e+01 -5.0491e+01 -5.2203e+01 -5.2622e+01 -6.1176e+01 -5.0504e+01 -5.2186e+01 -5.2609e+01 -6.1183e+01 -5.0518e+01 -5.2169e+01 -5.2596e+01 -6.1186e+01 -5.0531e+01 -5.2153e+01 -5.2583e+01 -6.1187e+01 -5.0544e+01 -5.2136e+01 -5.2571e+01 -6.1189e+01 -5.0557e+01 -5.2120e+01 -5.2558e+01 -6.1190e+01 -5.0571e+01 -5.2104e+01 -5.2546e+01 -6.1190e+01 -5.0584e+01 -5.2088e+01 -5.2533e+01 -6.1190e+01 -5.0597e+01 -5.2072e+01 -5.2521e+01 -6.1190e+01 -5.0610e+01 -5.2057e+01 -5.2508e+01 -6.1189e+01 -5.0623e+01 -5.2041e+01 -5.2496e+01 -6.1188e+01 -5.0636e+01 -5.2026e+01 -5.2484e+01 -6.1187e+01 -5.0649e+01 -5.2006e+01 -5.2472e+01 -6.1185e+01 -5.0662e+01 -5.1984e+01 -5.2460e+01 -6.1183e+01 -5.0675e+01 -5.1961e+01 -5.2448e+01 -6.1180e+01 -5.0688e+01 -5.1939e+01 -5.2434e+01 -6.1177e+01 -5.0701e+01 -5.1918e+01 -5.2414e+01 -6.1173e+01 -5.0713e+01 -5.1897e+01 -5.2394e+01 -6.1169e+01 -5.0735e+01 -5.1876e+01 -5.2375e+01 -6.1165e+01 -5.0792e+01 -5.1855e+01 -5.2356e+01 -6.1160e+01 -5.0848e+01 -5.1835e+01 -5.2337e+01 -6.1155e+01 -5.0904e+01 -5.1815e+01 -5.2318e+01 -6.1150e+01 -5.0959e+01 -5.1795e+01 -5.2300e+01 -6.1144e+01 -5.1013e+01 -5.1776e+01 -5.2295e+01 -6.1137e+01 -5.1066e+01 -5.1757e+01 -5.2314e+01 -6.1131e+01 -5.1119e+01 -5.1738e+01 -5.2332e+01 -6.1124e+01 -5.1171e+01 -5.1719e+01 -5.2350e+01 -6.1116e+01 -5.1222e+01 -5.1701e+01 -5.2368e+01 -6.1109e+01 -5.1273e+01 -5.1683e+01 -5.2386e+01 -6.1101e+01 -5.1322e+01 -5.1666e+01 -5.2403e+01 -6.1092e+01 -5.1366e+01 -5.1648e+01 -5.2420e+01 -6.1083e+01 -5.1407e+01 -5.1631e+01 -5.2437e+01 -6.1074e+01 -5.1447e+01 -5.1614e+01 -5.2453e+01 -6.1065e+01 -5.1487e+01 -5.1597e+01 -5.2469e+01 -6.1051e+01 -5.1526e+01 -5.1581e+01 -5.2485e+01 -6.1033e+01 -5.1559e+01 -5.1565e+01 -5.2501e+01 -6.1015e+01 -5.1589e+01 -5.1549e+01 -5.2517e+01 -6.0997e+01 -5.1619e+01 -5.1533e+01 -5.2532e+01 -6.0978e+01 -5.1649e+01 -5.1517e+01 -5.2547e+01 -6.0960e+01 -5.1678e+01 -5.1502e+01 -5.2562e+01 -6.0941e+01 -5.1707e+01 -5.1487e+01 -5.2576e+01 -6.0922e+01 -5.1736e+01 -5.1472e+01 -5.2590e+01 -6.0903e+01 -5.1764e+01 -5.1457e+01 -5.2604e+01 -6.0884e+01 -5.1793e+01 -5.1441e+01 -5.2618e+01 -6.0864e+01 -5.1820e+01 -5.1418e+01 -5.2632e+01 -6.0845e+01 -5.1848e+01 -5.1396e+01 -5.2645e+01 -6.0825e+01 -5.1875e+01 -5.1375e+01 -5.2658e+01 -6.0805e+01 -5.1902e+01 -5.1354e+01 -5.2664e+01 -6.0785e+01 -5.1929e+01 -5.1333e+01 -5.2669e+01 -6.0765e+01 -5.1955e+01 -5.1312e+01 -5.2672e+01 -6.0745e+01 -5.1981e+01 -5.1313e+01 -5.2668e+01 -6.0725e+01 -5.2007e+01 -5.1338e+01 -5.2665e+01 -6.0704e+01 -5.2032e+01 -5.1362e+01 -5.2662e+01 -6.0684e+01 -5.2057e+01 -5.1386e+01 -5.2659e+01 -6.0663e+01 -5.2082e+01 -5.1409e+01 -5.2656e+01 -6.0642e+01 -5.2106e+01 -5.1432e+01 -5.2653e+01 -6.0621e+01 -5.2130e+01 -5.1455e+01 -5.2650e+01 -6.0600e+01 -5.2154e+01 -5.1478e+01 -5.2647e+01 -6.0578e+01 -5.2178e+01 -5.1500e+01 -5.2645e+01 -6.0557e+01 -5.2201e+01 -5.1522e+01 -5.2642e+01 -6.0535e+01 -5.2223e+01 -5.1544e+01 -5.2640e+01 -6.0514e+01 -5.2246e+01 -5.1565e+01 -5.2637e+01 -6.0492e+01 -5.2268e+01 -5.1586e+01 -5.2635e+01 -6.0470e+01 -5.2290e+01 -5.1607e+01 -5.2633e+01 -6.0448e+01 -5.2311e+01 -5.1627e+01 -5.2631e+01 -6.0425e+01 -5.2332e+01 -5.1647e+01 -5.2629e+01 -6.0403e+01 -5.2353e+01 -5.1667e+01 -5.2627e+01 -6.0380e+01 -5.2374e+01 -5.1702e+01 -5.2625e+01 -6.0358e+01 -5.2388e+01 -5.1766e+01 -5.2623e+01 -6.0335e+01 -5.2400e+01 -5.1828e+01 -5.2621e+01 -6.0312e+01 -5.2412e+01 -5.1890e+01 -5.2619e+01 -6.0289e+01 -5.2424e+01 -5.1950e+01 -5.2617e+01 -6.0266e+01 -5.2436e+01 -5.2010e+01 -5.2615e+01 -6.0242e+01 -5.2447e+01 -5.2069e+01 -5.2613e+01 -6.0219e+01 -5.2459e+01 -5.2126e+01 -5.2611e+01 -6.0195e+01 -5.2470e+01 -5.2183e+01 -5.2609e+01 -6.0172e+01 -5.2481e+01 -5.2239e+01 -5.2608e+01 -6.0148e+01 -5.2492e+01 -5.2294e+01 -5.2606e+01 -6.0124e+01 -5.2503e+01 -5.2348e+01 -5.2604e+01 -6.0100e+01 -5.2514e+01 -5.2402e+01 -5.2602e+01 -6.0076e+01 -5.2524e+01 -5.2454e+01 -5.2600e+01 -6.0052e+01 -5.2535e+01 -5.2505e+01 -5.2598e+01 -6.0027e+01 -5.2545e+01 -5.2556e+01 -5.2588e+01 -6.0003e+01 -5.2555e+01 -5.2606e+01 -5.2578e+01 -5.9978e+01 -5.2565e+01 -5.2655e+01 -5.2569e+01 -5.9953e+01 -5.2575e+01 -5.2703e+01 -5.2560e+01 -5.9929e+01 -5.2584e+01 -5.2750e+01 -5.2551e+01 -5.9904e+01 -5.2594e+01 -5.2797e+01 -5.2542e+01 -5.9879e+01 -5.2603e+01 -5.2842e+01 -5.2533e+01 -5.9854e+01 -5.2612e+01 -5.2887e+01 -5.2524e+01 -5.9828e+01 -5.2621e+01 -5.2931e+01 -5.2516e+01 -5.9803e+01 -5.2630e+01 -5.2975e+01 -5.2507e+01 -5.9778e+01 -5.2638e+01 -5.3017e+01 -5.2499e+01 -5.9752e+01 -5.2647e+01 -5.3059e+01 -5.2491e+01 -5.9727e+01 -5.2655e+01 -5.3100e+01 -5.2483e+01 -5.9701e+01 -5.2663e+01 -5.3140e+01 -5.2475e+01 -5.9675e+01 -5.2671e+01 -5.3180e+01 -5.2468e+01 -5.9649e+01 -5.2679e+01 -5.3218e+01 -5.2460e+01 -5.9623e+01 -5.2687e+01 -5.3256e+01 -5.2452e+01 -5.9597e+01 -5.2694e+01 -5.3294e+01 -5.2445e+01 -5.9571e+01 -5.2701e+01 -5.3330e+01 -5.2438e+01 -5.9545e+01 -5.2709e+01 -5.3366e+01 -5.2430e+01 -5.9519e+01 -5.2716e+01 -5.3402e+01 -5.2423e+01 -5.9492e+01 -5.2722e+01 -5.3436e+01 -5.2416e+01 -5.9466e+01 -5.2729e+01 -5.3470e+01 -5.2409e+01 -5.9439e+01 -5.2735e+01 -5.3503e+01 -5.2402e+01 -5.9412e+01 -5.2742e+01 -5.3536e+01 -5.2395e+01 -5.9386e+01 -5.2748e+01 -5.3567e+01 -5.2385e+01 -5.9359e+01 -5.2754e+01 -5.3599e+01 -5.2370e+01 -5.9332e+01 -5.2759e+01 -5.3629e+01 -5.2356e+01 -5.9305e+01 -5.2765e+01 -5.3659e+01 -5.2342e+01 -5.9278e+01 -5.2770e+01 -5.3688e+01 -5.2328e+01 -5.9251e+01 -5.2776e+01 -5.3717e+01 -5.2314e+01 -5.9238e+01 -5.2781e+01 -5.3745e+01 -5.2301e+01 -5.9255e+01 -5.2786e+01 -5.3772e+01 -5.2288e+01 -5.9271e+01 -5.2790e+01 -5.3799e+01 -5.2275e+01 -5.9287e+01 -5.2795e+01 -5.3825e+01 -5.2262e+01 -5.9302e+01 -5.2799e+01 -5.3851e+01 -5.2249e+01 -5.9317e+01 -5.2803e+01 -5.3876e+01 -5.2237e+01 -5.9331e+01 -5.2807e+01 -5.3901e+01 -5.2225e+01 -5.9344e+01 -5.2811e+01 -5.3925e+01 -5.2213e+01 -5.9356e+01 -5.2815e+01 -5.3948e+01 -5.2201e+01 -5.9368e+01 -5.2819e+01 -5.3971e+01 -5.2190e+01 -5.9379e+01 -5.2822e+01 -5.3993e+01 -5.2178e+01 -5.9389e+01 -5.2825e+01 -5.4015e+01 -5.2167e+01 -5.9399e+01 -5.2828e+01 -5.4036e+01 -5.2156e+01 -5.9408e+01 -5.2831e+01 -5.4056e+01 -5.2145e+01 -5.9417e+01 -5.2834e+01 -5.4077e+01 -5.2127e+01 -5.9425e+01 -5.2837e+01 -5.4096e+01 -5.2109e+01 -5.9432e+01 -5.2839e+01 -5.4115e+01 -5.2091e+01 -5.9439e+01 -5.2841e+01 -5.4134e+01 -5.2069e+01 -5.9445e+01 -5.2843e+01 -5.4152e+01 -5.2044e+01 -5.9450e+01 -5.2845e+01 -5.4169e+01 -5.2019e+01 -5.9455e+01 -5.2847e+01 -5.4187e+01 -5.1995e+01 -5.9460e+01 -5.2849e+01 -5.4203e+01 -5.1971e+01 -5.9463e+01 -5.2850e+01 -5.4219e+01 -5.1947e+01 -5.9467e+01 -5.2852e+01 -5.4235e+01 -5.1920e+01 -5.9469e+01 -5.2853e+01 -5.4247e+01 -5.1882e+01 -5.9472e+01 -5.2854e+01 -5.4254e+01 -5.1844e+01 -5.9473e+01 -5.2855e+01 -5.4260e+01 -5.1807e+01 -5.9474e+01 -5.2855e+01 -5.4266e+01 -5.1772e+01 -5.9475e+01 -5.2856e+01 -5.4273e+01 -5.1736e+01 -5.9475e+01 -5.2856e+01 -5.4278e+01 -5.1702e+01 -5.9475e+01 -5.2857e+01 -5.4284e+01 -5.1668e+01 -5.9474e+01 -5.2857e+01 -5.4289e+01 -5.1635e+01 -5.9473e+01 -5.2857e+01 -5.4322e+01 -5.1603e+01 -5.9464e+01 -5.2857e+01 -5.4371e+01 -5.1572e+01 -5.9454e+01 -5.2856e+01 -5.4419e+01 -5.1541e+01 -5.9443e+01 -5.2856e+01 -5.4466e+01 -5.1511e+01 -5.9433e+01 -5.2856e+01 -5.4512e+01 -5.1481e+01 -5.9422e+01 -5.2855e+01 -5.4558e+01 -5.1445e+01 -5.9410e+01 -5.2854e+01 -5.4602e+01 -5.1409e+01 -5.9399e+01 -5.2853e+01 -5.4646e+01 -5.1374e+01 -5.9387e+01 -5.2852e+01 -5.4689e+01 -5.1339e+01 -5.9375e+01 -5.2851e+01 -5.4731e+01 -5.1306e+01 -5.9363e+01 -5.2872e+01 -5.4772e+01 -5.1273e+01 -5.9351e+01 -5.2915e+01 -5.4813e+01 -5.1240e+01 -5.9338e+01 -5.2957e+01 -5.4852e+01 -5.1209e+01 -5.9325e+01 -5.2998e+01 -5.4891e+01 -5.1178e+01 -5.9312e+01 -5.3038e+01 -5.4929e+01 -5.1148e+01 -5.9298e+01 -5.3078e+01 -5.4966e+01 -5.1118e+01 -5.9285e+01 -5.3117e+01 -5.5003e+01 -5.1090e+01 -5.9271e+01 -5.3155e+01 -5.5038e+01 -5.1061e+01 -5.9257e+01 -5.3193e+01 -5.5073e+01 -5.1034e+01 -5.9242e+01 -5.3230e+01 -5.5107e+01 -5.1007e+01 -5.9228e+01 -5.3266e+01 -5.5140e+01 -5.0980e+01 -5.9213e+01 -5.3296e+01 -5.5165e+01 -5.0955e+01 -5.9198e+01 -5.3322e+01 -5.5189e+01 -5.0930e+01 -5.9183e+01 -5.3349e+01 -5.5212e+01 -5.0905e+01 -5.9167e+01 -5.3374e+01 -5.5235e+01 -5.0881e+01 -5.9152e+01 -5.3400e+01 -5.5258e+01 -5.0857e+01 -5.9136e+01 -5.3424e+01 -5.5280e+01 -5.0834e+01 -5.9120e+01 -5.3449e+01 -5.5301e+01 -5.0812e+01 -5.9103e+01 -5.3472e+01 -5.5322e+01 -5.0790e+01 -5.9087e+01 -5.3496e+01 -5.5343e+01 -5.0768e+01 -5.9070e+01 -5.3518e+01 -5.5363e+01 -5.0747e+01 -5.9053e+01 -5.3541e+01 -5.5382e+01 -5.0727e+01 -5.9036e+01 -5.3563e+01 -5.5401e+01 -5.0706e+01 -5.9019e+01 -5.3584e+01 -5.5420e+01 -5.0687e+01 -5.9001e+01 -5.3605e+01 -5.5438e+01 -5.0667e+01 -5.8984e+01 -5.3626e+01 -5.5455e+01 -5.0649e+01 -5.8966e+01 -5.3646e+01 -5.5472e+01 -5.0630e+01 -5.8948e+01 -5.3665e+01 -5.5489e+01 -5.0612e+01 -5.8930e+01 -5.3684e+01 -5.5505e+01 -5.0595e+01 -5.8911e+01 -5.3703e+01 -5.5520e+01 -5.0577e+01 -5.8893e+01 -5.3721e+01 -5.5535e+01 -5.0560e+01 -5.8874e+01 -5.3739e+01 -5.5550e+01 -5.0544e+01 -5.8855e+01 -5.3757e+01 -5.5564e+01 -5.0528e+01 -5.8836e+01 -5.3774e+01 -5.5578e+01 -5.0512e+01 -5.8817e+01 -5.3790e+01 -5.5592e+01 -5.0497e+01 -5.8798e+01 -5.3806e+01 -5.5605e+01 -5.0482e+01 -5.8778e+01 -5.3822e+01 -5.5617e+01 -5.0467e+01 -5.8759e+01 -5.3838e+01 -5.5629e+01 -5.0452e+01 -5.8739e+01 -5.3853e+01 -5.5641e+01 -5.0438e+01 -5.8719e+01 -5.3867e+01 -5.5652e+01 -5.0424e+01 -5.8699e+01 -5.3881e+01 -5.5663e+01 -5.0411e+01 -5.8679e+01 -5.3895e+01 -5.5673e+01 -5.0390e+01 -5.8658e+01 -5.3901e+01 -5.5683e+01 -5.0369e+01 -5.8638e+01 -5.3906e+01 -5.5693e+01 -5.0349e+01 -5.8617e+01 -5.3911e+01 -5.5702e+01 -5.0329e+01 -5.8596e+01 -5.3916e+01 -5.5711e+01 -5.0309e+01 -5.8575e+01 -5.3920e+01 -5.5719e+01 -5.0291e+01 -5.8554e+01 -5.3925e+01 -5.5727e+01 -5.0272e+01 -5.8532e+01 -5.3929e+01 -5.5735e+01 -5.0254e+01 -5.8502e+01 -5.3933e+01 -5.5742e+01 -5.0236e+01 -5.8473e+01 -5.3937e+01 -5.5749e+01 -5.0219e+01 -5.8444e+01 -5.3941e+01 -5.5755e+01 -5.0231e+01 -5.8415e+01 -5.3944e+01 -5.5753e+01 -5.0251e+01 -5.8386e+01 -5.3948e+01 -5.5751e+01 -5.0271e+01 -5.8357e+01 -5.3951e+01 -5.5748e+01 -5.0290e+01 -5.8328e+01 -5.3954e+01 -5.5746e+01 -5.0305e+01 -5.8299e+01 -5.3957e+01 -5.5743e+01 -5.0316e+01 -5.8271e+01 -5.3959e+01 -5.5741e+01 -5.0328e+01 -5.8242e+01 -5.3962e+01 -5.5738e+01 -5.0335e+01 -5.8213e+01 -5.3964e+01 -5.5735e+01 -5.0338e+01 -5.8185e+01 -5.3966e+01 -5.5732e+01 -5.0343e+01 -5.8156e+01 -5.3966e+01 -5.5728e+01 -5.0347e+01 -5.8128e+01 -5.3959e+01 -5.5725e+01 -5.0352e+01 -5.8099e+01 -5.3953e+01 -5.5721e+01 -5.0356e+01 -5.8071e+01 -5.3947e+01 -5.5717e+01 -5.0358e+01 -5.8043e+01 -5.3941e+01 -5.5713e+01 -5.0356e+01 -5.8014e+01 -5.3935e+01 -5.5709e+01 -5.0353e+01 -5.7986e+01 -5.3928e+01 -5.5704e+01 -5.0352e+01 -5.7958e+01 -5.3916e+01 -5.5700e+01 -5.0350e+01 -5.7930e+01 -5.3902e+01 -5.5695e+01 -5.0349e+01 -5.7902e+01 -5.3888e+01 -5.5690e+01 -5.0348e+01 -5.7874e+01 -5.3875e+01 -5.5685e+01 -5.0348e+01 -5.7840e+01 -5.3861e+01 -5.5680e+01 -5.0347e+01 -5.7805e+01 -5.3848e+01 -5.5675e+01 -5.0347e+01 -5.7769e+01 -5.3835e+01 -5.5669e+01 -5.0348e+01 -5.7734e+01 -5.3822e+01 -5.5658e+01 -5.0349e+01 -5.7699e+01 -5.3809e+01 -5.5645e+01 -5.0349e+01 -5.7664e+01 -5.3797e+01 -5.5631e+01 -5.0351e+01 -5.7629e+01 -5.3784e+01 -5.5617e+01 -5.0352e+01 -5.7595e+01 -5.3763e+01 -5.5604e+01 -5.0354e+01 -5.7561e+01 -5.3743e+01 -5.5590e+01 -5.0356e+01 -5.7527e+01 -5.3724e+01 -5.5577e+01 -5.0358e+01 -5.7493e+01 -5.3702e+01 -5.5563e+01 -5.0360e+01 -5.7460e+01 -5.3675e+01 -5.5549e+01 -5.0363e+01 -5.7426e+01 -5.3649e+01 -5.5536e+01 -5.0365e+01 -5.7393e+01 -5.3623e+01 -5.5523e+01 -5.0368e+01 -5.7360e+01 -5.3597e+01 -5.5509e+01 -5.0371e+01 -5.7327e+01 -5.3572e+01 -5.5496e+01 -5.0374e+01 -5.7295e+01 -5.3547e+01 -5.5482e+01 -5.0378e+01 -5.7262e+01 -5.3523e+01 -5.5469e+01 -5.0389e+01 -5.7240e+01 -5.3499e+01 -5.5455e+01 -5.0430e+01 -5.7252e+01 -5.3476e+01 -5.5442e+01 -5.0469e+01 -5.7264e+01 -5.3453e+01 -5.5429e+01 -5.0509e+01 -5.7276e+01 -5.3430e+01 -5.5415e+01 -5.0548e+01 -5.7330e+01 -5.3408e+01 -5.5402e+01 -5.0587e+01 -5.7385e+01 -5.3386e+01 -5.5388e+01 -5.0625e+01 -5.7438e+01 -5.3364e+01 -5.5375e+01 -5.0664e+01 -5.7490e+01 -5.3343e+01 -5.5360e+01 -5.0701e+01 -5.7542e+01 -5.3322e+01 -5.5339e+01 -5.0739e+01 -5.7592e+01 -5.3302e+01 -5.5317e+01 -5.0776e+01 -5.7641e+01 -5.3282e+01 -5.5296e+01 -5.0812e+01 -5.7689e+01 -5.3262e+01 -5.5275e+01 -5.0849e+01 -5.7733e+01 -5.3242e+01 -5.5255e+01 -5.0885e+01 -5.7771e+01 -5.3223e+01 -5.5234e+01 -5.0920e+01 -5.7808e+01 -5.3204e+01 -5.5214e+01 -5.0956e+01 -5.7844e+01 -5.3185e+01 -5.5194e+01 -5.0990e+01 -5.7879e+01 -5.3167e+01 -5.5168e+01 -5.1025e+01 -5.7914e+01 -5.3144e+01 -5.5136e+01 -5.1059e+01 -5.7948e+01 -5.3118e+01 -5.5100e+01 -5.1093e+01 -5.7980e+01 -5.3093e+01 -5.5066e+01 -5.1126e+01 -5.8013e+01 -5.3068e+01 -5.5031e+01 -5.1159e+01 -5.8044e+01 -5.3044e+01 -5.4998e+01 -5.1192e+01 -5.8075e+01 -5.3020e+01 -5.4964e+01 -5.1224e+01 -5.8104e+01 -5.2996e+01 -5.4932e+01 -5.1256e+01 -5.8133e+01 -5.2973e+01 -5.4899e+01 -5.1287e+01 -5.8162e+01 -5.2950e+01 -5.4867e+01 -5.1318e+01 -5.8189e+01 -5.2928e+01 -5.4836e+01 -5.1346e+01 -5.8216e+01 -5.2906e+01 -5.4805e+01 -5.1369e+01 -5.8242e+01 -5.2884e+01 -5.4775e+01 -5.1391e+01 -5.8267e+01 -5.2863e+01 -5.4744e+01 -5.1413e+01 -5.8292e+01 -5.2842e+01 -5.4715e+01 -5.1435e+01 -5.8316e+01 -5.2821e+01 -5.4685e+01 -5.1456e+01 -5.8339e+01 -5.2801e+01 -5.4657e+01 -5.1478e+01 -5.8357e+01 -5.2781e+01 -5.4622e+01 -5.1499e+01 -5.8371e+01 -5.2798e+01 -5.4586e+01 -5.1520e+01 -5.8381e+01 -5.2823e+01 -5.4551e+01 -5.1541e+01 -5.8386e+01 -5.2847e+01 -5.4516e+01 -5.1562e+01 -5.8391e+01 -5.2871e+01 -5.4481e+01 -5.1582e+01 -5.8395e+01 -5.2895e+01 -5.4447e+01 -5.1603e+01 -5.8399e+01 -5.2918e+01 -5.4414e+01 -5.1623e+01 -5.8403e+01 -5.2941e+01 -5.4381e+01 -5.1642e+01 -5.8407e+01 -5.2964e+01 -5.4349e+01 -5.1662e+01 -5.8410e+01 -5.2986e+01 -5.4317e+01 -5.1681e+01 -5.8448e+01 -5.3008e+01 -5.4286e+01 -5.1701e+01 -5.8540e+01 -5.3029e+01 -5.4255e+01 -5.1720e+01 -5.8629e+01 -5.3051e+01 -5.4224e+01 -5.1738e+01 -5.8718e+01 -5.3071e+01 -5.4194e+01 -5.1757e+01 -5.8801e+01 -5.3086e+01 -5.4164e+01 -5.1775e+01 -5.8878e+01 -5.3098e+01 -5.4135e+01 -5.1792e+01 -5.8954e+01 -5.3110e+01 -5.4106e+01 -5.1802e+01 -5.9029e+01 -5.3122e+01 -5.4078e+01 -5.1812e+01 -5.9102e+01 -5.3134e+01 -5.4050e+01 -5.1821e+01 -5.9214e+01 -5.3145e+01 -5.4020e+01 -5.1831e+01 -5.9328e+01 -5.3157e+01 -5.3985e+01 -5.1841e+01 -5.9441e+01 -5.3168e+01 -5.3950e+01 -5.1851e+01 -5.9551e+01 -5.3179e+01 -5.3916e+01 -5.1860e+01 -5.9660e+01 -5.3190e+01 -5.3882e+01 -5.1878e+01 -5.9767e+01 -5.3200e+01 -5.3849e+01 -5.1924e+01 -5.9872e+01 -5.3211e+01 -5.3816e+01 -5.1970e+01 -5.9975e+01 -5.3221e+01 -5.3784e+01 -5.2015e+01 -6.0076e+01 -5.3232e+01 -5.3753e+01 -5.2059e+01 -6.0175e+01 -5.3242e+01 -5.3722e+01 -5.2103e+01 -6.0273e+01 -5.3251e+01 -5.3691e+01 -5.2146e+01 -6.0368e+01 -5.3261e+01 -5.3661e+01 -5.2189e+01 -6.0462e+01 -5.3270e+01 -5.3631e+01 -5.2231e+01 -6.0554e+01 -5.3280e+01 -5.3602e+01 -5.2273e+01 -6.0645e+01 -5.3289e+01 -5.3573e+01 -5.2314e+01 -6.0733e+01 -5.3298e+01 -5.3545e+01 -5.2355e+01 -6.0820e+01 -5.3306e+01 -5.3517e+01 -5.2395e+01 -6.0906e+01 -5.3315e+01 -5.3489e+01 -5.2435e+01 -6.0989e+01 -5.3323e+01 -5.3462e+01 -5.2474e+01 -6.1071e+01 -5.3331e+01 -5.3435e+01 -5.2528e+01 -6.1151e+01 -5.3339e+01 -5.3409e+01 -5.2603e+01 -6.1230e+01 -5.3347e+01 -5.3382e+01 -5.2676e+01 -6.1307e+01 -5.3354e+01 -5.3357e+01 -5.2749e+01 -6.1383e+01 -5.3362e+01 -5.3331e+01 -5.2820e+01 -6.1456e+01 -5.3369e+01 -5.3306e+01 -5.2891e+01 -6.1529e+01 -5.3376e+01 -5.3282e+01 -5.2960e+01 -6.1599e+01 -5.3383e+01 -5.3251e+01 -5.3029e+01 -6.1669e+01 -5.3382e+01 -5.3219e+01 -5.3097e+01 -6.1736e+01 -5.3380e+01 -5.3188e+01 -5.3163e+01 -6.1803e+01 -5.3379e+01 -5.3157e+01 -5.3229e+01 -6.1867e+01 -5.3378e+01 -5.3127e+01 -5.3294e+01 -6.1931e+01 -5.3376e+01 -5.3097e+01 -5.3358e+01 -6.1992e+01 -5.3375e+01 -5.3066e+01 -5.3421e+01 -6.2044e+01 -5.3373e+01 -5.3030e+01 -5.3483e+01 -6.2095e+01 -5.3372e+01 -5.2993e+01 -5.3540e+01 -6.2145e+01 -5.3365e+01 -5.2958e+01 -5.3592e+01 -6.2194e+01 -5.3356e+01 -5.2922e+01 -5.3644e+01 -6.2242e+01 -5.3347e+01 -5.2888e+01 -5.3695e+01 -6.2288e+01 -5.3338e+01 -5.2854e+01 -5.3738e+01 -6.2334e+01 -5.3329e+01 -5.2821e+01 -5.3780e+01 -6.2378e+01 -5.3320e+01 -5.2788e+01 -5.3821e+01 -6.2421e+01 -5.3311e+01 -5.2756e+01 -5.3861e+01 -6.2463e+01 -5.3303e+01 -5.2724e+01 -5.3901e+01 -6.2503e+01 -5.3294e+01 -5.2685e+01 -5.3941e+01 -6.2543e+01 -5.3286e+01 -5.2647e+01 -5.3980e+01 -6.2582e+01 -5.3278e+01 -5.2609e+01 -5.4019e+01 -6.2619e+01 -5.3270e+01 -5.2572e+01 -5.4057e+01 -6.2656e+01 -5.3262e+01 -5.2529e+01 -5.4094e+01 -6.2691e+01 -5.3254e+01 -5.2486e+01 -5.4131e+01 -6.2725e+01 -5.3247e+01 -5.2443e+01 -5.4168e+01 -6.2759e+01 -5.3239e+01 -5.2401e+01 -5.4204e+01 -6.2791e+01 -5.3232e+01 -5.2361e+01 -5.4240e+01 -6.2822e+01 -5.3224e+01 -5.2320e+01 -5.4275e+01 -6.2852e+01 -5.3217e+01 -5.2281e+01 -5.4309e+01 -6.2882e+01 -5.3209e+01 -5.2242e+01 -5.4343e+01 -6.2910e+01 -5.3194e+01 -5.2204e+01 -5.4377e+01 -6.2937e+01 -5.3179e+01 -5.2167e+01 -5.4410e+01 -6.2963e+01 -5.3165e+01 -5.2131e+01 -5.4442e+01 -6.2989e+01 -5.3150e+01 -5.2095e+01 -5.4474e+01 -6.3013e+01 -5.3136e+01 -5.2051e+01 -5.4505e+01 -6.3037e+01 -5.3122e+01 -5.2034e+01 -5.4536e+01 -6.3059e+01 -5.3108e+01 -5.2028e+01 -5.4567e+01 -6.3081e+01 -5.3095e+01 -5.2015e+01 -5.4597e+01 -6.3101e+01 -5.3082e+01 -5.2004e+01 -5.4626e+01 -6.3121e+01 -5.3069e+01 -5.2037e+01 -5.4655e+01 -6.3140e+01 -5.3049e+01 -5.2070e+01 -5.4684e+01 -6.3158e+01 -5.3028e+01 -5.2102e+01 -5.4712e+01 -6.3176e+01 -5.3008e+01 -5.2135e+01 -5.4739e+01 -6.3192e+01 -5.2988e+01 -5.2167e+01 -5.4766e+01 -6.3208e+01 -5.2969e+01 -5.2199e+01 -5.4792e+01 -6.3222e+01 -5.2950e+01 -5.2231e+01 -5.4818e+01 -6.3236e+01 -5.2931e+01 -5.2263e+01 -5.4844e+01 -6.3249e+01 -5.2913e+01 -5.2295e+01 -5.4869e+01 -6.3255e+01 -5.2895e+01 -5.2326e+01 -5.4893e+01 -6.3258e+01 -5.2890e+01 -5.2357e+01 -5.4917e+01 -6.3261e+01 -5.2910e+01 -5.2388e+01 -5.4941e+01 -6.3264e+01 -5.2929e+01 -5.2419e+01 -5.4964e+01 -6.3266e+01 -5.2948e+01 -5.2449e+01 -5.4987e+01 -6.3267e+01 -5.2966e+01 -5.2479e+01 -5.5009e+01 -6.3268e+01 -5.2985e+01 -5.2509e+01 -5.5031e+01 -6.3268e+01 -5.3003e+01 -5.2539e+01 -5.5052e+01 -6.3261e+01 -5.3021e+01 -5.2568e+01 -5.5073e+01 -6.3248e+01 -5.3038e+01 -5.2597e+01 -5.5093e+01 -6.3230e+01 -5.3056e+01 -5.2626e+01 -5.5113e+01 -6.3213e+01 -5.3073e+01 -5.2655e+01 -5.5132e+01 -6.3196e+01 -5.3090e+01 -5.2683e+01 -5.5151e+01 -6.3178e+01 -5.3107e+01 -5.2711e+01 -5.5170e+01 -6.3161e+01 -5.3120e+01 -5.2733e+01 -5.5188e+01 -6.3143e+01 -5.3129e+01 -5.2753e+01 -5.5205e+01 -6.3125e+01 -5.3138e+01 -5.2772e+01 -5.5222e+01 -6.3107e+01 -5.3146e+01 -5.2792e+01 -5.5239e+01 -6.3088e+01 -5.3155e+01 -5.2811e+01 -5.5255e+01 -6.3070e+01 -5.3163e+01 -5.2830e+01 -5.5271e+01 -6.3051e+01 -5.3172e+01 -5.2849e+01 -5.5287e+01 -6.3032e+01 -5.3180e+01 -5.2868e+01 -5.5302e+01 -6.3013e+01 -5.3188e+01 -5.2887e+01 -5.5316e+01 -6.2994e+01 -5.3197e+01 -5.2905e+01 -5.5331e+01 -6.2975e+01 -5.3205e+01 -5.2924e+01 -5.5341e+01 -6.2955e+01 -5.3213e+01 -5.2938e+01 -5.5347e+01 -6.2935e+01 -5.3221e+01 -5.2948e+01 -5.5352e+01 -6.2915e+01 -5.3229e+01 -5.2959e+01 -5.5357e+01 -6.2895e+01 -5.3237e+01 -5.2969e+01 -5.5362e+01 -6.2875e+01 -5.3241e+01 -5.2979e+01 -5.5366e+01 -6.2854e+01 -5.3241e+01 -5.2990e+01 -5.5371e+01 -6.2827e+01 -5.3241e+01 -5.2993e+01 -5.5375e+01 -6.2798e+01 -5.3241e+01 -5.2996e+01 -5.5378e+01 -6.2769e+01 -5.3241e+01 -5.2993e+01 -5.5374e+01 -6.2741e+01 -5.3241e+01 -5.2988e+01 -5.5370e+01 -6.2712e+01 -5.3242e+01 -5.2984e+01 -5.5365e+01 -6.2683e+01 -5.3242e+01 -5.2979e+01 -5.5361e+01 -6.2655e+01 -5.3243e+01 -5.2975e+01 -5.5357e+01 -6.2626e+01 -5.3243e+01 -5.2972e+01 -5.5352e+01 -6.2597e+01 -5.3244e+01 -5.2961e+01 -5.5348e+01 -6.2569e+01 -5.3244e+01 -5.2950e+01 -5.5344e+01 -6.2540e+01 -5.3245e+01 -5.2940e+01 -5.5339e+01 -6.2511e+01 -5.3246e+01 -5.2930e+01 -5.5335e+01 -6.2482e+01 -5.3246e+01 -5.2920e+01 -5.5330e+01 -6.2453e+01 -5.3247e+01 -5.2911e+01 -5.5326e+01 -6.2425e+01 -5.3248e+01 -5.2902e+01 -5.5321e+01 -6.2396e+01 -5.3248e+01 -5.2894e+01 -5.5316e+01 -6.2367e+01 -5.3249e+01 -5.2886e+01 -5.5335e+01 -6.2338e+01 -5.3250e+01 -5.2878e+01 -5.5366e+01 -6.2309e+01 -5.3251e+01 -5.2871e+01 -5.5397e+01 -6.2280e+01 -5.3246e+01 -5.2864e+01 -5.5428e+01 -6.2251e+01 -5.3239e+01 -5.2858e+01 -5.5458e+01 -6.2222e+01 -5.3232e+01 -5.2851e+01 -5.5487e+01 -6.2193e+01 -5.3225e+01 -5.2845e+01 -5.5516e+01 -6.2163e+01 -5.3218e+01 -5.2840e+01 -5.5544e+01 -6.2134e+01 -5.3212e+01 -5.2834e+01 -5.5572e+01 -6.2105e+01 -5.3206e+01 -5.2829e+01 -5.5599e+01 -6.2076e+01 -5.3200e+01 -5.2824e+01 -5.5626e+01 -6.2046e+01 -5.3193e+01 -5.2820e+01 -5.5652e+01 -6.2017e+01 -5.3188e+01 -5.2815e+01 -5.5678e+01 -6.1987e+01 -5.3182e+01 -5.2811e+01 -5.5703e+01 -6.1958e+01 -5.3176e+01 -5.2807e+01 -5.5728e+01 -6.1928e+01 -5.3170e+01 -5.2803e+01 -5.5752e+01 -6.1899e+01 -5.3165e+01 -5.2800e+01 -5.5772e+01 -6.1862e+01 -5.3160e+01 -5.2796e+01 -5.5788e+01 -6.1824e+01 -5.3154e+01 -5.2793e+01 -5.5803e+01 -6.1787e+01 -5.3149e+01 -5.2790e+01 -5.5817e+01 -6.1749e+01 -5.3136e+01 -5.2787e+01 -5.5832e+01 -6.1712e+01 -5.3123e+01 -5.2784e+01 -5.5846e+01 -6.1675e+01 -5.3111e+01 -5.2781e+01 -5.5860e+01 -6.1638e+01 -5.3098e+01 -5.2779e+01 -5.5873e+01 -6.1598e+01 -5.3086e+01 -5.2802e+01 -5.5886e+01 -6.1553e+01 -5.3075e+01 -5.2844e+01 -5.5899e+01 -6.1509e+01 -5.3063e+01 -5.2885e+01 -5.5912e+01 -6.1465e+01 -5.3052e+01 -5.2926e+01 -5.5924e+01 -6.1421e+01 -5.3040e+01 -5.2967e+01 -5.5936e+01 -6.1378e+01 -5.3029e+01 -5.3006e+01 -5.5948e+01 -6.1335e+01 -5.3019e+01 -5.3046e+01 -5.5952e+01 -6.1292e+01 -5.3008e+01 -5.3084e+01 -5.5955e+01 -6.1249e+01 -5.2998e+01 -5.3123e+01 -5.5958e+01 -6.1207e+01 -5.2988e+01 -5.3160e+01 -5.5961e+01 -6.1165e+01 -5.2978e+01 -5.3197e+01 -5.5964e+01 -6.1123e+01 -5.2968e+01 -5.3234e+01 -5.5966e+01 -6.1081e+01 -5.2958e+01 -5.3270e+01 -5.5969e+01 -6.1040e+01 -5.2948e+01 -5.3305e+01 -5.5971e+01 -6.0999e+01 -5.2939e+01 -5.3340e+01 -5.5974e+01 -6.0958e+01 -5.2930e+01 -5.3375e+01 -5.5976e+01 -6.0917e+01 -5.2921e+01 -5.3409e+01 -5.5978e+01 -6.0877e+01 -5.2912e+01 -5.3442e+01 -5.5980e+01 -6.0837e+01 -5.2903e+01 -5.3475e+01 -5.5981e+01 -6.0796e+01 -5.2894e+01 -5.3507e+01 -5.5983e+01 -6.0757e+01 -5.2886e+01 -5.3539e+01 -5.5984e+01 -6.0717e+01 -5.2877e+01 -5.3570e+01 -5.5986e+01 -6.0677e+01 -5.2869e+01 -5.3601e+01 -5.5987e+01 -6.0638e+01 -5.2860e+01 -5.3631e+01 -5.5988e+01 -6.0599e+01 -5.2852e+01 -5.3661e+01 -5.5988e+01 -6.0560e+01 -5.2844e+01 -5.3690e+01 -5.5989e+01 -6.0521e+01 -5.2836e+01 -5.3711e+01 -5.5990e+01 -6.0483e+01 -5.2828e+01 -5.3731e+01 -5.5990e+01 -6.0444e+01 -5.2820e+01 -5.3751e+01 -5.5990e+01 -6.0406e+01 -5.2812e+01 -5.3771e+01 -5.5990e+01 -6.0368e+01 -5.2805e+01 -5.3790e+01 -5.5990e+01 -6.0330e+01 -5.2797e+01 -5.3810e+01 -5.5989e+01 -6.0292e+01 -5.2790e+01 -5.3829e+01 -5.5989e+01 -6.0254e+01 -5.2782e+01 -5.3847e+01 -5.5988e+01 -6.0216e+01 -5.2775e+01 -5.3865e+01 -5.5987e+01 -6.0179e+01 -5.2767e+01 -5.3883e+01 -5.5986e+01 -6.0142e+01 -5.2760e+01 -5.3901e+01 -5.5985e+01 -6.0105e+01 -5.2753e+01 -5.3918e+01 -5.5983e+01 -6.0068e+01 -5.2745e+01 -5.3935e+01 -5.5982e+01 -6.0031e+01 -5.2738e+01 -5.3944e+01 -5.5980e+01 -5.9994e+01 -5.2731e+01 -5.3953e+01 -5.5978e+01 -5.9957e+01 -5.2724e+01 -5.3961e+01 -5.5976e+01 -5.9921e+01 -5.2717e+01 -5.3970e+01 -5.5974e+01 -5.9884e+01 -5.2710e+01 -5.3978e+01 -5.5971e+01 -5.9848e+01 -5.2703e+01 -5.3986e+01 -5.5969e+01 -5.9812e+01 -5.2696e+01 -5.3994e+01 -5.5966e+01 -5.9776e+01 -5.2689e+01 -5.4002e+01 -5.5963e+01 -5.9740e+01 -5.2682e+01 -5.4010e+01 -5.5960e+01 -5.9704e+01 -5.2675e+01 -5.4017e+01 -5.5956e+01 -5.9668e+01 -5.2668e+01 -5.4025e+01 -5.5953e+01 -5.9633e+01 -5.2661e+01 -5.4032e+01 -5.5949e+01 -5.9597e+01 -5.2655e+01 -5.4039e+01 -5.5945e+01 -5.9562e+01 -5.2648e+01 -5.4046e+01 -5.5941e+01 -5.9527e+01 -5.2641e+01 -5.4053e+01 -5.5937e+01 -5.9491e+01 -5.2634e+01 -5.4060e+01 -5.5933e+01 -5.9456e+01 -5.2627e+01 -5.4066e+01 -5.5928e+01 -5.9421e+01 -5.2621e+01 -5.4073e+01 -5.5923e+01 -5.9386e+01 -5.2614e+01 -5.4079e+01 -5.5918e+01 -5.9351e+01 -5.2607e+01 -5.4085e+01 -5.5913e+01 -5.9317e+01 -5.2600e+01 -5.4091e+01 -5.5908e+01 -5.9282e+01 -5.2593e+01 -5.4097e+01 -5.5903e+01 -5.9247e+01 -5.2587e+01 -5.4102e+01 -5.5897e+01 -5.9213e+01 -5.2580e+01 -5.4108e+01 -5.5891e+01 -5.9178e+01 -5.2573e+01 -5.4113e+01 -5.5886e+01 -5.9144e+01 -5.2566e+01 -5.4118e+01 -5.5880e+01 -5.9110e+01 -5.2560e+01 -5.4123e+01 -5.5873e+01 -5.9076e+01 -5.2553e+01 -5.4128e+01 -5.5867e+01 -5.9042e+01 -5.2546e+01 -5.4132e+01 -5.5860e+01 -5.9030e+01 -5.2539e+01 -5.4136e+01 -5.5854e+01 -5.9041e+01 -5.2533e+01 -5.4141e+01 -5.5847e+01 -5.9050e+01 -5.2526e+01 -5.4145e+01 -5.5840e+01 -5.9060e+01 -5.2519e+01 -5.4149e+01 -5.5833e+01 -5.9068e+01 -5.2512e+01 -5.4152e+01 -5.5825e+01 -5.9076e+01 -5.2505e+01 -5.4156e+01 -5.5818e+01 -5.9084e+01 -5.2498e+01 -5.4159e+01 -5.5810e+01 -5.9091e+01 -5.2492e+01 -5.4162e+01 -5.5802e+01 -5.9097e+01 -5.2485e+01 -5.4165e+01 -5.5794e+01 -5.9103e+01 -5.2478e+01 -5.4168e+01 -5.5786e+01 -5.9109e+01 -5.2471e+01 -5.4171e+01 -5.5778e+01 -5.9114e+01 -5.2464e+01 -5.4173e+01 -5.5770e+01 -5.9118e+01 -5.2457e+01 -5.4176e+01 -5.5761e+01 -5.9122e+01 -5.2450e+01 -5.4178e+01 -5.5753e+01 -5.9125e+01 -5.2443e+01 -5.4180e+01 -5.5744e+01 -5.9128e+01 -5.2436e+01 -5.4181e+01 -5.5735e+01 -5.9130e+01 -5.2429e+01 -5.4183e+01 -5.5726e+01 -5.9132e+01 -5.2422e+01 -5.4184e+01 -5.5716e+01 -5.9133e+01 -5.2415e+01 -5.4186e+01 -5.5707e+01 -5.9134e+01 -5.2408e+01 -5.4187e+01 -5.5698e+01 -5.9135e+01 -5.2401e+01 -5.4188e+01 -5.5688e+01 -5.9135e+01 -5.2394e+01 -5.4188e+01 -5.5678e+01 -5.9130e+01 -5.2387e+01 -5.4189e+01 -5.5668e+01 -5.9121e+01 -5.2380e+01 -5.4189e+01 -5.5658e+01 -5.9112e+01 -5.2373e+01 -5.4190e+01 -5.5648e+01 -5.9103e+01 -5.2366e+01 -5.4190e+01 -5.5638e+01 -5.9093e+01 -5.2358e+01 -5.4190e+01 -5.5627e+01 -5.9083e+01 -5.2351e+01 -5.4182e+01 -5.5617e+01 -5.9073e+01 -5.2344e+01 -5.4174e+01 -5.5606e+01 -5.9063e+01 -5.2337e+01 -5.4166e+01 -5.5595e+01 -5.9052e+01 -5.2329e+01 -5.4157e+01 -5.5584e+01 -5.9041e+01 -5.2322e+01 -5.4149e+01 -5.5573e+01 -5.9030e+01 -5.2315e+01 -5.4141e+01 -5.5562e+01 -5.9018e+01 -5.2308e+01 -5.4133e+01 -5.5551e+01 -5.8998e+01 -5.2300e+01 -5.4125e+01 -5.5539e+01 -5.8979e+01 -5.2293e+01 -5.4116e+01 -5.5528e+01 -5.8959e+01 -5.2286e+01 -5.4108e+01 -5.5516e+01 -5.8940e+01 -5.2278e+01 -5.4100e+01 -5.5504e+01 -5.8920e+01 -5.2271e+01 -5.4092e+01 -5.5485e+01 -5.8893e+01 -5.2263e+01 -5.4076e+01 -5.5465e+01 -5.8865e+01 -5.2256e+01 -5.4060e+01 -5.5445e+01 -5.8838e+01 -5.2248e+01 -5.4044e+01 -5.5426e+01 -5.8811e+01 -5.2241e+01 -5.4029e+01 -5.5406e+01 -5.8779e+01 -5.2233e+01 -5.4013e+01 -5.5387e+01 -5.8744e+01 -5.2226e+01 -5.3998e+01 -5.5367e+01 -5.8710e+01 -5.2218e+01 -5.3983e+01 -5.5348e+01 -5.8676e+01 -5.2211e+01 -5.3968e+01 -5.5329e+01 -5.8642e+01 -5.2203e+01 -5.3953e+01 -5.5310e+01 -5.8608e+01 -5.2195e+01 -5.3939e+01 -5.5291e+01 -5.8575e+01 -5.2188e+01 -5.3923e+01 -5.5272e+01 -5.8542e+01 -5.2180e+01 -5.3900e+01 -5.5253e+01 -5.8510e+01 -5.2173e+01 -5.3878e+01 -5.5234e+01 -5.8477e+01 -5.2165e+01 -5.3857e+01 -5.5215e+01 -5.8445e+01 -5.2157e+01 -5.3836e+01 -5.5196e+01 -5.8413e+01 -5.2149e+01 -5.3815e+01 -5.5178e+01 -5.8382e+01 -5.2137e+01 -5.3794e+01 -5.5159e+01 -5.8350e+01 -5.2121e+01 -5.3774e+01 -5.5136e+01 -5.8319e+01 -5.2105e+01 -5.3754e+01 -5.5108e+01 -5.8288e+01 -5.2090e+01 -5.3734e+01 -5.5074e+01 -5.8258e+01 -5.2075e+01 -5.3714e+01 -5.5040e+01 -5.8227e+01 -5.2060e+01 -5.3695e+01 -5.5007e+01 -5.8197e+01 -5.2045e+01 -5.3676e+01 -5.4974e+01 -5.8167e+01 -5.2031e+01 -5.3657e+01 -5.4941e+01 -5.8137e+01 -5.2016e+01 -5.3639e+01 -5.4909e+01 -5.8107e+01 -5.2002e+01 -5.3620e+01 -5.4870e+01 -5.8078e+01 -5.1988e+01 -5.3602e+01 -5.4831e+01 -5.8048e+01 -5.1974e+01 -5.3585e+01 -5.4793e+01 -5.8019e+01 -5.1954e+01 -5.3567e+01 -5.4755e+01 -5.7990e+01 -5.1924e+01 -5.3549e+01 -5.4717e+01 -5.7962e+01 -5.1895e+01 -5.3532e+01 -5.4681e+01 -5.7933e+01 -5.1866e+01 -5.3515e+01 -5.4644e+01 -5.7904e+01 -5.1838e+01 -5.3498e+01 -5.4609e+01 -5.7876e+01 -5.1811e+01 -5.3499e+01 -5.4573e+01 -5.7848e+01 -5.1784e+01 -5.3527e+01 -5.4539e+01 -5.7820e+01 -5.1757e+01 -5.3554e+01 -5.4504e+01 -5.7792e+01 -5.1731e+01 -5.3581e+01 -5.4470e+01 -5.7764e+01 -5.1705e+01 -5.3608e+01 -5.4437e+01 -5.7737e+01 -5.1680e+01 -5.3634e+01 -5.4404e+01 -5.7709e+01 -5.1656e+01 -5.3660e+01 -5.4372e+01 -5.7682e+01 -5.1631e+01 -5.3685e+01 -5.4340e+01 -5.7655e+01 -5.1607e+01 -5.3709e+01 -5.4308e+01 -5.7627e+01 -5.1584e+01 -5.3733e+01 -5.4277e+01 -5.7600e+01 -5.1561e+01 -5.3757e+01 -5.4246e+01 -5.7574e+01 -5.1538e+01 -5.3780e+01 -5.4216e+01 -5.7547e+01 -5.1516e+01 -5.3803e+01 -5.4186e+01 -5.7520e+01 -5.1494e+01 -5.3825e+01 -5.4156e+01 -5.7494e+01 -5.1472e+01 -5.3847e+01 -5.4127e+01 -5.7467e+01 -5.1451e+01 -5.3869e+01 -5.4098e+01 -5.7441e+01 -5.1430e+01 -5.3890e+01 -5.4069e+01 -5.7414e+01 -5.1410e+01 -5.3910e+01 -5.4041e+01 -5.7388e+01 -5.1389e+01 -5.3930e+01 -5.4013e+01 -5.7362e+01 -5.1370e+01 -5.3950e+01 -5.3988e+01 -5.7336e+01 -5.1350e+01 -5.3969e+01 -5.3998e+01 -5.7310e+01 -5.1331e+01 -5.3988e+01 -5.4007e+01 -5.7284e+01 -5.1312e+01 -5.4007e+01 -5.4016e+01 -5.7259e+01 -5.1294e+01 -5.4025e+01 -5.4025e+01 -5.7233e+01 -5.1275e+01 -5.4042e+01 -5.4034e+01 -5.7228e+01 -5.1257e+01 -5.4059e+01 -5.4043e+01 -5.7246e+01 -5.1240e+01 -5.4076e+01 -5.4051e+01 -5.7265e+01 -5.1222e+01 -5.4092e+01 -5.4060e+01 -5.7282e+01 -5.1205e+01 -5.4108e+01 -5.4068e+01 -5.7299e+01 -5.1188e+01 -5.4124e+01 -5.4076e+01 -5.7316e+01 -5.1172e+01 -5.4139e+01 -5.4084e+01 -5.7332e+01 -5.1155e+01 -5.4154e+01 -5.4091e+01 -5.7347e+01 -5.1139e+01 -5.4168e+01 -5.4099e+01 -5.7362e+01 -5.1123e+01 -5.4182e+01 -5.4106e+01 -5.7376e+01 -5.1108e+01 -5.4196e+01 -5.4113e+01 -5.7390e+01 -5.1092e+01 -5.4209e+01 -5.4106e+01 -5.7403e+01 -5.1077e+01 -5.4222e+01 -5.4098e+01 -5.7416e+01 -5.1062e+01 -5.4234e+01 -5.4089e+01 -5.7428e+01 -5.1048e+01 -5.4244e+01 -5.4081e+01 -5.7440e+01 -5.1033e+01 -5.4248e+01 -5.4072e+01 -5.7451e+01 -5.1019e+01 -5.4251e+01 -5.4064e+01 -5.7461e+01 -5.1005e+01 -5.4255e+01 -5.4056e+01 -5.7472e+01 -5.0991e+01 -5.4253e+01 -5.4049e+01 -5.7481e+01 -5.0978e+01 -5.4248e+01 -5.4041e+01 -5.7490e+01 -5.0964e+01 -5.4243e+01 -5.4034e+01 -5.7499e+01 -5.0951e+01 -5.4238e+01 -5.4027e+01 -5.7507e+01 -5.0938e+01 -5.4234e+01 -5.4019e+01 -5.7515e+01 -5.0925e+01 -5.4229e+01 -5.4012e+01 -5.7522e+01 -5.0912e+01 -5.4224e+01 -5.4006e+01 -5.7529e+01 -5.0900e+01 -5.4220e+01 -5.3999e+01 -5.7535e+01 -5.0887e+01 -5.4215e+01 -5.3992e+01 -5.7541e+01 -5.0875e+01 -5.4210e+01 -5.3986e+01 -5.7546e+01 -5.0863e+01 -5.4206e+01 -5.3979e+01 -5.7551e+01 -5.0851e+01 -5.4201e+01 -5.3973e+01 -5.7555e+01 -5.0840e+01 -5.4196e+01 -5.3966e+01 -5.7559e+01 -5.0828e+01 -5.4192e+01 -5.3960e+01 -5.7563e+01 -5.0817e+01 -5.4187e+01 -5.3954e+01 -5.7566e+01 -5.0806e+01 -5.4182e+01 -5.3948e+01 -5.7569e+01 -5.0795e+01 -5.4177e+01 -5.3942e+01 -5.7570e+01 -5.0784e+01 -5.4173e+01 -5.3936e+01 -5.7564e+01 -5.0773e+01 -5.4168e+01 -5.3930e+01 -5.7558e+01 -5.0762e+01 -5.4163e+01 -5.3924e+01 -5.7552e+01 -5.0752e+01 -5.4158e+01 -5.3918e+01 -5.7545e+01 -5.0741e+01 -5.4153e+01 -5.3913e+01 -5.7538e+01 -5.0731e+01 -5.4148e+01 -5.3907e+01 -5.7529e+01 -5.0721e+01 -5.4143e+01 -5.3899e+01 -5.7514e+01 -5.0711e+01 -5.4138e+01 -5.3885e+01 -5.7499e+01 -5.0701e+01 -5.4133e+01 -5.3894e+01 -5.7483e+01 -5.0691e+01 -5.4128e+01 -5.3917e+01 -5.7468e+01 -5.0682e+01 -5.4119e+01 -5.3940e+01 -5.7453e+01 -5.0672e+01 -5.4105e+01 -5.3963e+01 -5.7438e+01 -5.0663e+01 -5.4084e+01 -5.3985e+01 -5.7422e+01 -5.0653e+01 -5.4064e+01 -5.4001e+01 -5.7407e+01 -5.0644e+01 -5.4043e+01 -5.4015e+01 -5.7392e+01 -5.0635e+01 -5.4023e+01 -5.4029e+01 -5.7377e+01 -5.0626e+01 -5.4004e+01 -5.4050e+01 -5.7371e+01 -5.0617e+01 -5.3984e+01 -5.4101e+01 -5.7400e+01 -5.0608e+01 -5.3965e+01 -5.4150e+01 -5.7428e+01 -5.0600e+01 -5.3938e+01 -5.4200e+01 -5.7456e+01 -5.0591e+01 -5.3912e+01 -5.4248e+01 -5.7483e+01 -5.0583e+01 -5.3886e+01 -5.4296e+01 -5.7510e+01 -5.0574e+01 -5.3861e+01 -5.4344e+01 -5.7535e+01 -5.0566e+01 -5.3836e+01 -5.4390e+01 -5.7560e+01 -5.0558e+01 -5.3812e+01 -5.4437e+01 -5.7585e+01 -5.0550e+01 -5.3787e+01 -5.4482e+01 -5.7609e+01 -5.0541e+01 -5.3764e+01 -5.4527e+01 -5.7632e+01 -5.0534e+01 -5.3740e+01 -5.4572e+01 -5.7654e+01 -5.0526e+01 -5.3718e+01 -5.4616e+01 -5.7676e+01 -5.0518e+01 -5.3695e+01 -5.4659e+01 -5.7697e+01 -5.0510e+01 -5.3673e+01 -5.4702e+01 -5.7718e+01 -5.0502e+01 -5.3651e+01 -5.4744e+01 -5.7738e+01 -5.0495e+01 -5.3630e+01 -5.4786e+01 -5.7757e+01 -5.0487e+01 -5.3608e+01 -5.4827e+01 -5.7776e+01 -5.0480e+01 -5.3588e+01 -5.4867e+01 -5.7794e+01 -5.0473e+01 -5.3567e+01 -5.4907e+01 -5.7809e+01 -5.0465e+01 -5.3547e+01 -5.4946e+01 -5.7817e+01 -5.0458e+01 -5.3527e+01 -5.4985e+01 -5.7826e+01 -5.0451e+01 -5.3508e+01 -5.5023e+01 -5.7834e+01 -5.0439e+01 -5.3488e+01 -5.5060e+01 -5.7842e+01 -5.0424e+01 -5.3469e+01 -5.5097e+01 -5.7850e+01 -5.0410e+01 -5.3448e+01 -5.5133e+01 -5.7873e+01 -5.0395e+01 -5.3422e+01 -5.5169e+01 -5.7924e+01 -5.0381e+01 -5.3396e+01 -5.5204e+01 -5.7974e+01 -5.0367e+01 -5.3368e+01 -5.5239e+01 -5.8016e+01 -5.0354e+01 -5.3335e+01 -5.5273e+01 -5.8056e+01 -5.0340e+01 -5.3303e+01 -5.5306e+01 -5.8095e+01 -5.0327e+01 -5.3271e+01 -5.5339e+01 -5.8125e+01 -5.0314e+01 -5.3240e+01 -5.5372e+01 -5.8155e+01 -5.0300e+01 -5.3209e+01 -5.5403e+01 -5.8185e+01 -5.0279e+01 -5.3179e+01 -5.5434e+01 -5.8214e+01 -5.0252e+01 -5.3150e+01 -5.5465e+01 -5.8242e+01 -5.0224e+01 -5.3121e+01 -5.5495e+01 -5.8269e+01 -5.0196e+01 -5.3092e+01 -5.5525e+01 -5.8290e+01 -5.0162e+01 -5.3064e+01 -5.5554e+01 -5.8309e+01 -5.0128e+01 -5.3037e+01 -5.5582e+01 -5.8327e+01 -5.0096e+01 -5.3010e+01 -5.5610e+01 -5.8344e+01 -5.0063e+01 -5.2983e+01 -5.5637e+01 -5.8362e+01 -5.0032e+01 -5.2957e+01 -5.5664e+01 -5.8379e+01 -5.0001e+01 -5.2932e+01 -5.5690e+01 -5.8395e+01 -1.0000e+01 -5.2907e+01 -5.5716e+01 -5.8417e+01 -6.0000e+01 -5.2882e+01 -5.5737e+01 -5.8477e+01 -6.0000e+01 -5.2858e+01 -5.5754e+01 -5.8536e+01 -6.0000e+01 -5.2834e+01 -5.5770e+01 -5.8594e+01 -6.0000e+01 -5.2811e+01 -5.5786e+01 -5.8651e+01 -6.0000e+01 -5.2788e+01 -5.5802e+01 -5.8708e+01 -6.0000e+01 -5.2765e+01 -5.5817e+01 -5.8763e+01 -6.0000e+01 -5.2743e+01 -5.5824e+01 -5.8817e+01 -6.0000e+01 -5.2714e+01 -5.5831e+01 -5.8869e+01 -6.0000e+01 -5.2685e+01 -5.5838e+01 -5.8921e+01 -6.0000e+01 -5.2656e+01 -5.5844e+01 -5.8972e+01 -6.0000e+01 -5.2627e+01 -5.5851e+01 -5.9022e+01 -6.0000e+01 -5.2598e+01 -5.5857e+01 -5.9071e+01 -6.0000e+01 -5.2563e+01 -5.5863e+01 -5.9119e+01 -6.0000e+01 -5.2528e+01 -5.5869e+01 -5.9166e+01 -6.0000e+01 -5.2495e+01 -5.5875e+01 -5.9212e+01 -6.0000e+01 -5.2461e+01 -5.5881e+01 -5.9257e+01 -6.0000e+01 -5.2429e+01 -5.5886e+01 -5.9301e+01 -6.0000e+01 -5.2397e+01 -5.5892e+01 -5.9344e+01 -6.0000e+01 -5.2366e+01 -5.5897e+01 -5.9386e+01 -6.0000e+01 -5.2335e+01 -5.5902e+01 -5.9427e+01 -6.0000e+01 -5.2305e+01 -5.5907e+01 -5.9467e+01 -6.0000e+01 -5.2275e+01 -5.5911e+01 -5.9507e+01 -6.0000e+01 -5.2246e+01 -5.5916e+01 -5.9545e+01 -6.0000e+01 -5.2218e+01 -5.5933e+01 -5.9570e+01 -6.0000e+01 -5.2184e+01 -5.5973e+01 -5.9591e+01 -6.0000e+01 -5.2149e+01 -5.6013e+01 -5.9612e+01 -6.0000e+01 -5.2114e+01 -5.6052e+01 -5.9631e+01 -6.0000e+01 -5.2072e+01 -5.6091e+01 -5.9651e+01 -6.0000e+01 -5.2031e+01 -5.6129e+01 -5.9670e+01 -6.0000e+01 -5.1991e+01 -5.6166e+01 -5.9685e+01 -6.0000e+01 -5.1952e+01 -5.6203e+01 -5.9695e+01 -6.0000e+01 -5.1913e+01 -5.6239e+01 -5.9705e+01 -6.0000e+01 -5.1876e+01 -5.6274e+01 -5.9710e+01 -6.0000e+01 -5.1839e+01 -5.6309e+01 -5.9711e+01 -6.0000e+01 -5.1803e+01 -5.6343e+01 -5.9712e+01 -6.0000e+01 -5.1768e+01 -5.6377e+01 -5.9713e+01 -6.0000e+01 -5.1733e+01 -5.6410e+01 -5.9714e+01 -6.0000e+01 -5.1700e+01 -5.6440e+01 -5.9733e+01 -6.0000e+01 -5.1667e+01 -5.6463e+01 -5.9778e+01 -6.0000e+01 -5.1634e+01 -5.6487e+01 -5.9822e+01 -6.0000e+01 -5.1602e+01 -5.6509e+01 -5.9865e+01 -6.0000e+01 -5.1571e+01 -5.6532e+01 -5.9908e+01 -6.0000e+01 -5.1541e+01 -5.6554e+01 -5.9950e+01 -6.0000e+01 -5.1511e+01 -5.6575e+01 -5.9991e+01 -6.0000e+01 -5.1482e+01 -5.6596e+01 -6.0073e+01 -6.0000e+01 -5.1454e+01 -5.6617e+01 -6.0156e+01 -6.0000e+01 -5.1426e+01 -5.6637e+01 -6.0238e+01 -6.0000e+01 -5.1398e+01 -5.6651e+01 -6.0319e+01 -6.0000e+01 -5.1371e+01 -5.6662e+01 -6.0398e+01 -5.9901e+01 -5.1345e+01 -5.6674e+01 -6.0475e+01 -5.9799e+01 -5.1319e+01 -5.6685e+01 -6.0552e+01 -5.9698e+01 -5.1294e+01 -5.6695e+01 -6.0626e+01 -5.9599e+01 -5.1269e+01 -5.6706e+01 -6.0700e+01 -5.9501e+01 -5.1245e+01 -5.6717e+01 -6.0772e+01 -5.9404e+01 -5.1214e+01 -5.6727e+01 -6.0842e+01 -5.9309e+01 -5.1183e+01 -5.6737e+01 -6.0912e+01 -5.9215e+01 -5.1152e+01 -5.6746e+01 -6.0980e+01 -5.9116e+01 -5.1122e+01 -5.6756e+01 -6.1046e+01 -5.9017e+01 -5.1093e+01 -5.6765e+01 -6.1112e+01 -5.8920e+01 -5.1065e+01 -5.6774e+01 -6.1176e+01 -5.8824e+01 -5.1037e+01 -5.6782e+01 -6.1238e+01 -5.8729e+01 -5.1010e+01 -5.6791e+01 -6.1300e+01 -5.8636e+01 -5.0983e+01 -5.6791e+01 -6.1360e+01 -5.8544e+01 -5.0957e+01 -5.6791e+01 -6.1419e+01 -5.8453e+01 -5.0932e+01 -5.6791e+01 -6.1476e+01 -5.8368e+01 -5.0936e+01 -5.6791e+01 -6.1533e+01 -5.8325e+01 -5.0956e+01 -5.6791e+01 -6.1588e+01 -5.8282e+01 -5.0976e+01 -5.6790e+01 -6.1642e+01 -5.8240e+01 -5.0995e+01 -5.6790e+01 -6.1694e+01 -5.8198e+01 -5.1014e+01 -5.6786e+01 -6.1746e+01 -5.8157e+01 -5.1034e+01 -5.6778e+01 -6.1796e+01 -5.8117e+01 -5.1053e+01 -5.6769e+01 -6.1845e+01 -5.8077e+01 -5.1071e+01 -5.6761e+01 -6.1893e+01 -5.8037e+01 -5.1090e+01 -5.6753e+01 -6.1940e+01 -5.7998e+01 -5.1109e+01 -5.6745e+01 -6.1986e+01 -5.7960e+01 -5.1127e+01 -5.6737e+01 -6.2030e+01 -5.7922e+01 -5.1145e+01 -5.6728e+01 -6.2074e+01 -5.7884e+01 -5.1163e+01 -5.6720e+01 -6.2116e+01 -5.7847e+01 -5.1181e+01 -5.6713e+01 -6.2157e+01 -5.7810e+01 -5.1199e+01 -5.6705e+01 -6.2200e+01 -5.7774e+01 -5.1216e+01 -5.6697e+01 -6.2283e+01 -5.7738e+01 -5.1234e+01 -5.6689e+01 -6.2365e+01 -5.7703e+01 -5.1251e+01 -5.6681e+01 -6.2446e+01 -5.7668e+01 -5.1260e+01 -5.6673e+01 -6.2524e+01 -5.7634e+01 -5.1269e+01 -5.6665e+01 -6.2601e+01 -5.7599e+01 -5.1278e+01 -5.6658e+01 -6.2676e+01 -5.7566e+01 -5.1287e+01 -5.6650e+01 -6.2750e+01 -5.7532e+01 -5.1338e+01 -5.6642e+01 -6.2821e+01 -5.7491e+01 -5.1391e+01 -5.6634e+01 -6.2892e+01 -5.7450e+01 -5.1443e+01 -5.6626e+01 -6.2960e+01 -5.7410e+01 -5.1494e+01 -5.6618e+01 -6.3028e+01 -5.7371e+01 -5.1545e+01 -5.6611e+01 -6.3093e+01 -5.7332e+01 -5.1596e+01 -5.6603e+01 -6.3157e+01 -5.7293e+01 -5.1645e+01 -5.6595e+01 -6.3220e+01 -5.7255e+01 -5.1694e+01 -5.6587e+01 -6.3281e+01 -5.7218e+01 -5.1743e+01 -5.6579e+01 -6.3340e+01 -5.7180e+01 -5.1790e+01 -5.6571e+01 -6.3398e+01 -5.7144e+01 -5.1837e+01 -5.6562e+01 -6.3455e+01 -5.7107e+01 -5.1884e+01 -5.6554e+01 -6.3510e+01 -5.7072e+01 -5.1929e+01 -5.6546e+01 -6.3564e+01 -5.7036e+01 -5.1974e+01 -5.6538e+01 -6.3616e+01 -5.7001e+01 -5.2019e+01 -5.6530e+01 -6.3667e+01 -5.6967e+01 -5.2063e+01 -5.6521e+01 -6.3716e+01 -5.6932e+01 -5.2106e+01 -5.6513e+01 -6.3769e+01 -5.6898e+01 -5.2148e+01 -5.6504e+01 -6.3860e+01 -5.6860e+01 -5.2190e+01 -5.6488e+01 -6.3950e+01 -5.6819e+01 -5.2232e+01 -5.6472e+01 -6.4037e+01 -5.6779e+01 -5.2272e+01 -5.6455e+01 -6.4123e+01 -5.6739e+01 -5.2312e+01 -5.6439e+01 -6.4206e+01 -5.6699e+01 -5.2352e+01 -5.6423e+01 -6.4288e+01 -5.6660e+01 -5.2391e+01 -5.6407e+01 -6.4368e+01 -5.6622e+01 -5.2429e+01 -5.6391e+01 -6.4446e+01 -5.6584e+01 -5.2467e+01 -5.6375e+01 -6.4522e+01 -5.6546e+01 -5.2504e+01 -5.6359e+01 -6.4613e+01 -5.6509e+01 -5.2569e+01 -5.6344e+01 -6.4730e+01 -5.6473e+01 -5.2649e+01 -5.6328e+01 -6.4845e+01 -5.6437e+01 -5.2728e+01 -5.6313e+01 -6.4957e+01 -5.6401e+01 -5.2806e+01 -5.6297e+01 -6.5066e+01 -5.6366e+01 -5.2882e+01 -5.6282e+01 -6.5174e+01 -5.6331e+01 -5.2958e+01 -5.6267e+01 -6.5279e+01 -5.6297e+01 -5.3032e+01 -5.6252e+01 -6.5382e+01 -5.6255e+01 -5.3105e+01 -5.6236e+01 -6.5482e+01 -5.6214e+01 -5.3176e+01 -5.6221e+01 -6.5580e+01 -5.6173e+01 -5.3247e+01 -5.6198e+01 -6.5676e+01 -5.6133e+01 -5.3316e+01 -5.6175e+01 -6.5770e+01 -5.6093e+01 -5.3385e+01 -5.6153e+01 -6.5862e+01 -5.6053e+01 -5.3452e+01 -5.6130e+01 -6.5951e+01 -5.6015e+01 -5.3518e+01 -5.6108e+01 -6.6039e+01 -5.5976e+01 -5.3583e+01 -5.6086e+01 -6.6124e+01 -5.5939e+01 -5.3647e+01 -5.6065e+01 -6.6207e+01 -5.5901e+01 -5.3709e+01 -5.6043e+01 -6.6289e+01 -5.5865e+01 -5.3771e+01 -5.6022e+01 -6.6368e+01 -5.5828e+01 -5.3832e+01 -5.6001e+01 -6.6445e+01 -5.5792e+01 -5.3892e+01 -5.5980e+01 -6.6521e+01 -5.5757e+01 -5.3950e+01 -5.5957e+01 -6.6594e+01 -5.5722e+01 -5.4008e+01 -5.5928e+01 -6.6666e+01 -5.5687e+01 -5.4061e+01 -5.5894e+01 -6.6735e+01 -5.5653e+01 -5.4109e+01 -5.5859e+01 -6.6803e+01 -5.5620e+01 -5.4155e+01 -5.5823e+01 -6.6869e+01 -5.5586e+01 -5.4201e+01 -5.5789e+01 -6.6933e+01 -5.5553e+01 -5.4247e+01 -5.5755e+01 -6.6995e+01 -5.5521e+01 -5.4291e+01 -5.5721e+01 -6.7056e+01 -5.5489e+01 -5.4335e+01 -5.5688e+01 -6.7114e+01 -5.5457e+01 -5.4378e+01 -5.5655e+01 -6.7172e+01 -5.5425e+01 -5.4420e+01 -5.5623e+01 -6.7227e+01 -5.5394e+01 -5.4461e+01 -5.5591e+01 -6.7281e+01 -5.5363e+01 -5.4502e+01 -5.5560e+01 -6.7333e+01 -5.5333e+01 -5.4542e+01 -5.5529e+01 -6.7383e+01 -5.5303e+01 -5.4581e+01 -5.5499e+01 -6.7432e+01 -5.5273e+01 -5.4617e+01 -5.5469e+01 -6.7479e+01 -5.5244e+01 -5.4640e+01 -5.5439e+01 -6.7524e+01 -5.5214e+01 -5.4662e+01 -5.5410e+01 -6.7568e+01 -5.5186e+01 -5.4683e+01 -5.5381e+01 -6.7611e+01 -5.5157e+01 -5.4704e+01 -5.5352e+01 -6.7652e+01 -5.5129e+01 -5.4724e+01 -5.5324e+01 -6.7691e+01 -5.5101e+01 -5.4744e+01 -5.5297e+01 -6.7729e+01 -5.5073e+01 -5.4764e+01 -5.5269e+01 -6.7766e+01 -5.5046e+01 -5.4784e+01 -5.5242e+01 -6.7801e+01 -5.5018e+01 -5.4803e+01 -5.5215e+01 -6.7835e+01 -5.4991e+01 -5.4822e+01 -5.5189e+01 -6.7867e+01 -5.4965e+01 -5.4840e+01 -5.5163e+01 -6.7898e+01 -5.4938e+01 -5.4858e+01 -5.5137e+01 -6.7927e+01 -5.4912e+01 -5.4876e+01 -5.5111e+01 -6.7956e+01 -5.4886e+01 -5.4894e+01 -5.5086e+01 -6.7982e+01 -5.4860e+01 -5.4911e+01 -5.5061e+01 -6.8008e+01 -5.4835e+01 -5.4928e+01 -5.5064e+01 -6.8032e+01 -5.4810e+01 -5.4944e+01 -5.5076e+01 -6.8055e+01 -5.4785e+01 -5.4961e+01 -5.5087e+01 -6.8077e+01 -5.4760e+01 -5.4976e+01 -5.5099e+01 -6.8097e+01 -5.4732e+01 -5.4992e+01 -5.5110e+01 -6.8117e+01 -5.4700e+01 -5.5007e+01 -5.5114e+01 -6.8135e+01 -5.4668e+01 -5.5022e+01 -5.5117e+01 -6.8167e+01 -5.4636e+01 -5.5037e+01 -5.5120e+01 -6.8227e+01 -5.4605e+01 -5.5051e+01 -5.5122e+01 -6.8285e+01 -5.4574e+01 -5.5062e+01 -5.5125e+01 -6.8342e+01 -5.4568e+01 -5.5067e+01 -5.5128e+01 -6.8396e+01 -5.4582e+01 -5.5073e+01 -5.5131e+01 -6.8449e+01 -5.4596e+01 -5.5078e+01 -5.5134e+01 -6.8501e+01 -5.4610e+01 -5.5083e+01 -5.5136e+01 -6.8550e+01 -5.4623e+01 -5.5088e+01 -5.5139e+01 -6.8598e+01 -5.4636e+01 -5.5093e+01 -5.5142e+01 -6.8644e+01 -5.4649e+01 -5.5098e+01 -5.5144e+01 -6.8689e+01 -5.4661e+01 -5.5103e+01 -5.5146e+01 -6.8732e+01 -5.4673e+01 -5.5107e+01 -5.5149e+01 -6.8773e+01 -5.4685e+01 -5.5111e+01 -5.5151e+01 -6.8813e+01 -5.4696e+01 -5.5116e+01 -5.5153e+01 -6.8851e+01 -5.4707e+01 -5.5120e+01 -5.5155e+01 -6.8888e+01 -5.4718e+01 -5.5123e+01 -5.5157e+01 -6.8923e+01 -5.4728e+01 -5.5127e+01 -5.5159e+01 -6.8957e+01 -5.4738e+01 -5.5130e+01 -5.5161e+01 -6.8989e+01 -5.4748e+01 -5.5134e+01 -5.5162e+01 -6.9020e+01 -5.4758e+01 -5.5137e+01 -5.5164e+01 -6.9049e+01 -5.4767e+01 -5.5140e+01 -5.5165e+01 -6.9077e+01 -5.4776e+01 -5.5143e+01 -5.5167e+01 -6.9103e+01 -5.4785e+01 -5.5145e+01 -5.5168e+01 -6.9129e+01 -5.4793e+01 -5.5148e+01 -5.5169e+01 -6.9152e+01 -5.4801e+01 -5.5150e+01 -5.5170e+01 -6.9175e+01 -5.4809e+01 -5.5152e+01 -5.5171e+01 -6.9196e+01 -5.4817e+01 -5.5154e+01 -5.5172e+01 -6.9216e+01 -5.4824e+01 -5.5156e+01 -5.5172e+01 -6.9234e+01 -5.4831e+01 -5.5157e+01 -5.5173e+01 -6.9252e+01 -5.4835e+01 -5.5159e+01 -5.5173e+01 -6.9268e+01 -5.4833e+01 -5.5160e+01 -5.5173e+01 -6.9282e+01 -5.4831e+01 -5.5161e+01 -5.5173e+01 -6.9296e+01 -5.4830e+01 -5.5162e+01 -5.5173e+01 -6.9308e+01 -5.4828e+01 -5.5163e+01 -5.5173e+01 -6.9315e+01 -5.4826e+01 -5.5163e+01 -5.5172e+01 -6.9317e+01 -5.4824e+01 -5.5164e+01 -5.5172e+01 -6.9318e+01 -5.4822e+01 -5.5164e+01 -5.5171e+01 -6.9319e+01 -5.4820e+01 -5.5164e+01 -5.5170e+01 -6.9318e+01 -5.4817e+01 -5.5164e+01 -5.5170e+01 -6.9316e+01 -5.4825e+01 -5.5163e+01 -5.5168e+01 -6.9314e+01 -5.4867e+01 -5.5163e+01 -5.5167e+01 -6.9311e+01 -5.4908e+01 -5.5162e+01 -5.5166e+01 -6.9299e+01 -5.4949e+01 -5.5161e+01 -5.5164e+01 -6.9286e+01 -5.4989e+01 -5.5160e+01 -5.5163e+01 -6.9291e+01 -5.5028e+01 -5.5159e+01 -5.5161e+01 -6.9322e+01 -5.5066e+01 -5.5157e+01 -5.5159e+01 -6.9351e+01 -5.5103e+01 -5.5156e+01 -5.5170e+01 -6.9378e+01 -5.5140e+01 -5.5154e+01 -5.5205e+01 -6.9404e+01 -5.5176e+01 -5.5152e+01 -5.5238e+01 -6.9429e+01 -5.5212e+01 -5.5150e+01 -5.5271e+01 -6.9453e+01 -5.5246e+01 -5.5147e+01 -5.5304e+01 -6.9472e+01 -5.5280e+01 -5.5145e+01 -5.5335e+01 -6.9486e+01 -5.5313e+01 -5.5142e+01 -5.5367e+01 -6.9498e+01 -5.5346e+01 -5.5139e+01 -5.5397e+01 -6.9510e+01 -5.5378e+01 -5.5136e+01 -5.5427e+01 -6.9520e+01 -5.5409e+01 -5.5133e+01 -5.5457e+01 -6.9529e+01 -5.5440e+01 -5.5130e+01 -5.5486e+01 -6.9538e+01 -5.5469e+01 -5.5126e+01 -5.5514e+01 -6.9545e+01 -5.5499e+01 -5.5123e+01 -5.5540e+01 -6.9552e+01 -5.5519e+01 -5.5119e+01 -5.5559e+01 -6.9558e+01 -5.5540e+01 -5.5115e+01 -5.5578e+01 -6.9562e+01 -5.5559e+01 -5.5111e+01 -5.5597e+01 -6.9566e+01 -5.5576e+01 -5.5107e+01 -5.5615e+01 -6.9569e+01 -5.5587e+01 -5.5102e+01 -5.5632e+01 -6.9566e+01 -5.5597e+01 -5.5097e+01 -5.5649e+01 -6.9559e+01 -5.5608e+01 -5.5093e+01 -5.5659e+01 -6.9552e+01 -5.5618e+01 -5.5088e+01 -5.5667e+01 -6.9544e+01 -5.5628e+01 -5.5082e+01 -5.5676e+01 -6.9535e+01 -5.5637e+01 -5.5077e+01 -5.5684e+01 -6.9525e+01 -5.5646e+01 -5.5072e+01 -5.5692e+01 -6.9515e+01 -5.5656e+01 -5.5066e+01 -5.5700e+01 -6.9504e+01 -5.5664e+01 -5.5060e+01 -5.5708e+01 -6.9493e+01 -5.5673e+01 -5.5055e+01 -5.5716e+01 -6.9481e+01 -5.5681e+01 -5.5049e+01 -5.5723e+01 -6.9466e+01 -5.5689e+01 -5.5042e+01 -5.5730e+01 -6.9445e+01 -5.5697e+01 -5.5036e+01 -5.5737e+01 -6.9423e+01 -5.5705e+01 -5.5030e+01 -5.5744e+01 -6.9401e+01 -5.5712e+01 -5.5023e+01 -5.5751e+01 -6.9379e+01 -5.5719e+01 -5.5016e+01 -5.5757e+01 -6.9356e+01 -5.5726e+01 -5.5009e+01 -5.5763e+01 -6.9332e+01 -5.5732e+01 -5.5002e+01 -5.5769e+01 -6.9308e+01 -5.5739e+01 -5.4995e+01 -5.5775e+01 -6.9284e+01 -5.5745e+01 -5.4988e+01 -5.5781e+01 -6.9260e+01 -5.5750e+01 -5.4980e+01 -5.5786e+01 -6.9235e+01 -5.5756e+01 -5.4973e+01 -5.5791e+01 -6.9209e+01 -5.5761e+01 -5.4965e+01 -5.5796e+01 -6.9183e+01 -5.5766e+01 -5.4957e+01 -5.5801e+01 -6.9157e+01 -5.5771e+01 -5.4949e+01 -5.5805e+01 -6.9131e+01 -5.5774e+01 -5.4941e+01 -5.5809e+01 -6.9104e+01 -5.5771e+01 -5.4933e+01 -5.5814e+01 -6.9076e+01 -5.5767e+01 -5.4924e+01 -5.5812e+01 -6.9048e+01 -5.5763e+01 -5.4916e+01 -5.5807e+01 -6.9020e+01 -5.5759e+01 -5.4907e+01 -5.5803e+01 -6.8992e+01 -5.5755e+01 -5.4898e+01 -5.5799e+01 -6.8963e+01 -5.5751e+01 -5.4890e+01 -5.5794e+01 -6.8933e+01 -5.5747e+01 -5.4881e+01 -5.5790e+01 -6.8904e+01 -5.5743e+01 -5.4871e+01 -5.5786e+01 -6.8874e+01 -5.5738e+01 -5.4862e+01 -5.5781e+01 -6.8843e+01 -5.5764e+01 -5.4853e+01 -5.5777e+01 -6.8813e+01 -5.5804e+01 -5.4843e+01 -5.5772e+01 -6.8782e+01 -5.5843e+01 -5.4834e+01 -5.5767e+01 -6.8750e+01 -5.5881e+01 -5.4824e+01 -5.5763e+01 -6.8718e+01 -5.5919e+01 -5.4814e+01 -5.5758e+01 -6.8686e+01 -5.5955e+01 -5.4802e+01 -5.5753e+01 -6.8654e+01 -5.5991e+01 -5.4784e+01 -5.5744e+01 -6.8621e+01 -5.6027e+01 -5.4766e+01 -5.5731e+01 -6.8588e+01 -5.6061e+01 -5.4748e+01 -5.5719e+01 -6.8554e+01 -5.6095e+01 -5.4731e+01 -5.5706e+01 -6.8520e+01 -5.6150e+01 -5.4713e+01 -5.5693e+01 -6.8486e+01 -5.6227e+01 -5.4696e+01 -5.5681e+01 -6.8452e+01 -5.6303e+01 -5.4678e+01 -5.5669e+01 -6.8417e+01 -5.6377e+01 -5.4661e+01 -5.5657e+01 -6.8382e+01 -5.6450e+01 -5.4644e+01 -5.5645e+01 -6.8346e+01 -5.6521e+01 -5.4626e+01 -5.5632e+01 -6.8305e+01 -5.6585e+01 -5.4609e+01 -5.5621e+01 -6.8261e+01 -5.6647e+01 -5.4592e+01 -5.5609e+01 -6.8217e+01 -5.6707e+01 -5.4575e+01 -5.5597e+01 -6.8173e+01 -5.6766e+01 -5.4558e+01 -5.5585e+01 -6.8128e+01 -5.6824e+01 -5.4541e+01 -5.5573e+01 -6.8084e+01 -5.6880e+01 -5.4525e+01 -5.5562e+01 -6.8040e+01 -5.6936e+01 -5.4508e+01 -5.5550e+01 -6.7995e+01 -5.6991e+01 -5.4491e+01 -5.5539e+01 -6.7951e+01 -5.7045e+01 -5.4475e+01 -5.5527e+01 -6.7906e+01 -5.7098e+01 -5.4458e+01 -5.5516e+01 -6.7854e+01 -5.7149e+01 -5.4441e+01 -5.5504e+01 -6.7801e+01 -5.7200e+01 -5.4425e+01 -5.5493e+01 -6.7748e+01 -5.7250e+01 -5.4408e+01 -5.5482e+01 -6.7696e+01 -5.7299e+01 -5.4392e+01 -5.5470e+01 -6.7643e+01 -5.7347e+01 -5.4376e+01 -5.5459e+01 -6.7591e+01 -5.7393e+01 -5.4359e+01 -5.5448e+01 -6.7539e+01 -5.7437e+01 -5.4343e+01 -5.5436e+01 -6.7486e+01 -5.7474e+01 -5.4327e+01 -5.5425e+01 -6.7434e+01 -5.7510e+01 -5.4311e+01 -5.5414e+01 -6.7382e+01 -5.7545e+01 -5.4295e+01 -5.5403e+01 -6.7330e+01 -5.7580e+01 -5.4279e+01 -5.5391e+01 -6.7278e+01 -5.7614e+01 -5.4263e+01 -5.5380e+01 -6.7227e+01 -5.7648e+01 -5.4247e+01 -5.5369e+01 -6.7175e+01 -5.7680e+01 -5.4231e+01 -5.5357e+01 -6.7123e+01 -5.7712e+01 -5.4215e+01 -5.5346e+01 -6.7071e+01 -5.7744e+01 -5.4199e+01 -5.5335e+01 -6.7020e+01 -5.7774e+01 -5.4183e+01 -5.5324e+01 -6.6968e+01 -5.7804e+01 -5.4167e+01 -5.5312e+01 -6.6917e+01 -5.7833e+01 -5.4151e+01 -5.5301e+01 -6.6865e+01 -5.7861e+01 -5.4136e+01 -5.5290e+01 -6.6814e+01 -5.7889e+01 -5.4120e+01 -5.5278e+01 -6.6762e+01 -5.7916e+01 -5.4104e+01 -5.5267e+01 -6.6711e+01 -5.7943e+01 -5.4088e+01 -5.5255e+01 -6.6660e+01 -5.7969e+01 -5.4073e+01 -5.5244e+01 -6.6609e+01 -5.7994e+01 -5.4057e+01 -5.5233e+01 -6.6557e+01 -5.8018e+01 -5.4042e+01 -5.5221e+01 -6.6506e+01 -5.8042e+01 -5.4026e+01 -5.5210e+01 -6.6455e+01 -5.8065e+01 -5.4010e+01 -5.5198e+01 -6.6404e+01 -5.8088e+01 -5.3995e+01 -5.5186e+01 -6.6353e+01 -5.8109e+01 -5.3979e+01 -5.5175e+01 -6.6302e+01 -5.8131e+01 -5.3964e+01 -5.5163e+01 -6.6251e+01 -5.8151e+01 -5.3949e+01 -5.5152e+01 -6.6200e+01 -5.8171e+01 -5.3933e+01 -5.5140e+01 -6.6149e+01 -5.8191e+01 -5.3918e+01 -5.5128e+01 -6.6098e+01 -5.8209e+01 -5.3902e+01 -5.5116e+01 -6.6048e+01 -5.8221e+01 -5.3887e+01 -5.5105e+01 -6.5997e+01 -5.8231e+01 -5.3872e+01 -5.5093e+01 -6.5946e+01 -5.8240e+01 -5.3856e+01 -5.5081e+01 -6.5895e+01 -5.8249e+01 -5.3841e+01 -5.5069e+01 -6.5845e+01 -5.8258e+01 -5.3826e+01 -5.5057e+01 -6.5794e+01 -5.8266e+01 -5.3811e+01 -5.5045e+01 -6.5743e+01 -5.8274e+01 -5.3832e+01 -5.5033e+01 -6.5693e+01 -5.8281e+01 -5.3861e+01 -5.5021e+01 -6.5642e+01 -5.8288e+01 -5.3889e+01 -5.5009e+01 -6.5591e+01 -5.8291e+01 -5.3917e+01 -5.4997e+01 -6.5541e+01 -5.8283e+01 -5.3938e+01 -5.4984e+01 -6.5491e+01 -5.8274e+01 -5.3957e+01 -5.4972e+01 -6.5440e+01 -5.8258e+01 -5.3975e+01 -5.4960e+01 -6.5390e+01 -5.8240e+01 -5.3993e+01 -5.4948e+01 -6.5339e+01 -5.8223e+01 -5.4010e+01 -5.4935e+01 -6.5289e+01 -5.8206e+01 -5.4027e+01 -5.4923e+01 -6.5239e+01 -5.8189e+01 -5.4044e+01 -5.4910e+01 -6.5188e+01 -5.8172e+01 -5.4060e+01 -5.4898e+01 -6.5179e+01 -5.8155e+01 -5.4075e+01 -5.4885e+01 -6.5173e+01 -5.8139e+01 -5.4091e+01 -5.4873e+01 -6.5166e+01 -5.8122e+01 -5.4106e+01 -5.4860e+01 -6.5159e+01 -5.8106e+01 -5.4120e+01 -5.4848e+01 -6.5151e+01 -5.8090e+01 -5.4134e+01 -5.4835e+01 -6.5142e+01 -5.8074e+01 -5.4148e+01 -5.4822e+01 -6.5133e+01 -5.8058e+01 -5.4162e+01 -5.4809e+01 -6.5123e+01 -5.8042e+01 -5.4175e+01 -5.4797e+01 -6.5113e+01 -5.8027e+01 -5.4187e+01 -5.4784e+01 -6.5102e+01 -5.8011e+01 -5.4200e+01 -5.4771e+01 -6.5090e+01 -5.7995e+01 -5.4212e+01 -5.4758e+01 -6.5078e+01 -5.7980e+01 -5.4223e+01 -5.4745e+01 -6.5065e+01 -5.7964e+01 -5.4233e+01 -5.4732e+01 -6.5052e+01 -5.7949e+01 -5.4236e+01 -5.4719e+01 -6.5038e+01 -5.7934e+01 -5.4239e+01 -5.4706e+01 -6.5024e+01 -5.7918e+01 -5.4242e+01 -5.4693e+01 -6.5009e+01 -5.7903e+01 -5.4244e+01 -5.4679e+01 -6.4994e+01 -5.7888e+01 -5.4246e+01 -5.4666e+01 -6.4978e+01 -5.7870e+01 -5.4249e+01 -5.4653e+01 -6.4962e+01 -5.7847e+01 -5.4250e+01 -5.4640e+01 -6.4945e+01 -5.7825e+01 -5.4252e+01 -5.4626e+01 -6.4928e+01 -5.7802e+01 -5.4254e+01 -5.4613e+01 -6.4910e+01 -5.7779e+01 -5.4255e+01 -5.4599e+01 -6.4892e+01 -5.7757e+01 -5.4257e+01 -5.4586e+01 -6.4873e+01 -5.7735e+01 -5.4258e+01 -5.4572e+01 -6.4854e+01 -5.7713e+01 -5.4258e+01 -5.4559e+01 -6.4835e+01 -5.7692e+01 -5.4251e+01 -5.4545e+01 -6.4815e+01 -5.7670e+01 -5.4244e+01 -5.4532e+01 -6.4794e+01 -5.7649e+01 -5.4237e+01 -5.4518e+01 -6.4773e+01 -5.7628e+01 -5.4230e+01 -5.4504e+01 -6.4752e+01 -5.7607e+01 -5.4223e+01 -5.4491e+01 -6.4730e+01 -5.7586e+01 -5.4216e+01 -5.4477e+01 -6.4708e+01 -5.7562e+01 -5.4209e+01 -5.4463e+01 -6.4686e+01 -5.7534e+01 -5.4202e+01 -5.4449e+01 -6.4663e+01 -5.7506e+01 -5.4195e+01 -5.4436e+01 -6.4639e+01 -5.7478e+01 -5.4188e+01 -5.4422e+01 -6.4616e+01 -5.7450e+01 -5.4182e+01 -5.4408e+01 -6.4592e+01 -5.7423e+01 -5.4175e+01 -5.4394e+01 -6.4567e+01 -5.7396e+01 -5.4168e+01 -5.4380e+01 -6.4542e+01 -5.7369e+01 -5.4161e+01 -5.4366e+01 -6.4517e+01 -5.7342e+01 -5.4154e+01 -5.4352e+01 -6.4491e+01 -5.7316e+01 -5.4147e+01 -5.4338e+01 -6.4466e+01 -5.7290e+01 -5.4140e+01 -5.4324e+01 -6.4439e+01 -5.7264e+01 -5.4133e+01 -5.4310e+01 -6.4413e+01 -5.7239e+01 -5.4126e+01 -5.4295e+01 -6.4386e+01 -5.7214e+01 -5.4120e+01 -5.4281e+01 -6.4358e+01 -5.7189e+01 -5.4108e+01 -5.4267e+01 -6.4331e+01 -5.7160e+01 -5.4093e+01 -5.4253e+01 -6.4303e+01 -5.7128e+01 -5.4079e+01 -5.4239e+01 -6.4275e+01 -5.7096e+01 -5.4064e+01 -5.4224e+01 -6.4246e+01 -5.7064e+01 -5.4050e+01 -5.4210e+01 -6.4217e+01 -5.7026e+01 -5.4036e+01 -5.4196e+01 -6.4188e+01 -5.6987e+01 -5.4022e+01 -5.4181e+01 -6.4159e+01 -5.6949e+01 -5.4008e+01 -5.4167e+01 -6.4129e+01 -5.6911e+01 -5.4007e+01 -5.4153e+01 -6.4099e+01 -5.6874e+01 -5.4038e+01 -5.4130e+01 -6.4069e+01 -5.6837e+01 -5.4068e+01 -5.4108e+01 -6.4039e+01 -5.6798e+01 -5.4098e+01 -5.4086e+01 -6.4008e+01 -5.6754e+01 -5.4127e+01 -5.4064e+01 -6.3977e+01 -5.6711e+01 -5.4156e+01 -5.4043e+01 -6.3945e+01 -5.6669e+01 -5.4184e+01 -5.4017e+01 -6.3914e+01 -5.6627e+01 -5.4212e+01 -5.3987e+01 -6.3882e+01 -5.6586e+01 -5.4239e+01 -5.3958e+01 -6.3850e+01 -5.6545e+01 -5.4265e+01 -5.3930e+01 -6.3818e+01 -5.6505e+01 -5.4292e+01 -5.3903e+01 -6.3785e+01 -5.6466e+01 -5.4317e+01 -5.3905e+01 -6.3753e+01 -5.6427e+01 -5.4342e+01 -5.3906e+01 -6.3720e+01 -5.6389e+01 -5.4367e+01 -5.3907e+01 -6.3686e+01 -5.6351e+01 -5.4391e+01 -5.3908e+01 -6.3653e+01 -5.6314e+01 -5.4415e+01 -5.3909e+01 -6.3620e+01 -5.6278e+01 -5.4430e+01 -5.3910e+01 -6.3586e+01 -5.6242e+01 -5.4445e+01 -5.3911e+01 -6.3566e+01 -5.6206e+01 -5.4460e+01 -5.3912e+01 -6.3576e+01 -5.6171e+01 -5.4474e+01 -5.3913e+01 -6.3586e+01 -5.6136e+01 -5.4488e+01 -5.3914e+01 -6.3594e+01 -5.6102e+01 -5.4502e+01 -5.3915e+01 -6.3602e+01 -5.6068e+01 -5.4515e+01 -5.3916e+01 -6.3609e+01 -5.6035e+01 -5.4528e+01 -5.3917e+01 -6.3615e+01 -5.6002e+01 -5.4541e+01 -5.3918e+01 -6.3620e+01 -5.5969e+01 -5.4554e+01 -5.3919e+01 -6.3625e+01 -5.5937e+01 -5.4566e+01 -5.3920e+01 -6.3628e+01 -5.5905e+01 -5.4578e+01 -5.3921e+01 -6.3623e+01 -5.5874e+01 -5.4590e+01 -5.3921e+01 -6.3617e+01 -5.5843e+01 -5.4601e+01 -5.3922e+01 -6.3611e+01 -5.5813e+01 -5.4612e+01 -5.3923e+01 -6.3604e+01 -5.5782e+01 -5.4623e+01 -5.3924e+01 -6.3597e+01 -5.5753e+01 -5.4634e+01 -5.3925e+01 -6.3589e+01 -5.5723e+01 -5.4644e+01 -5.3925e+01 -6.3581e+01 -5.5694e+01 -5.4654e+01 -5.3926e+01 -6.3572e+01 -5.5665e+01 -5.4664e+01 -5.3926e+01 -6.3563e+01 -5.5636e+01 -5.4673e+01 -5.3927e+01 -6.3553e+01 -5.5602e+01 -5.4683e+01 -5.3927e+01 -6.3543e+01 -5.5566e+01 -5.4691e+01 -5.3928e+01 -6.3532e+01 -5.5531e+01 -5.4700e+01 -5.3928e+01 -6.3521e+01 -5.5496e+01 -5.4708e+01 -5.3928e+01 -6.3509e+01 -5.5462e+01 -5.4716e+01 -5.3928e+01 -6.3497e+01 -5.5428e+01 -5.4724e+01 -5.3928e+01 -6.3485e+01 -5.5394e+01 -5.4732e+01 -5.3922e+01 -6.3471e+01 -5.5361e+01 -5.4739e+01 -5.3914e+01 -6.3458e+01 -5.5329e+01 -5.4746e+01 -5.3906e+01 -6.3444e+01 -5.5297e+01 -5.4752e+01 -5.3899e+01 -6.3429e+01 -5.5265e+01 -5.4759e+01 -5.3891e+01 -6.3415e+01 -5.5233e+01 -5.4765e+01 -5.3884e+01 -6.3399e+01 -5.5202e+01 -5.4771e+01 -5.3876e+01 -6.3383e+01 -5.5172e+01 -5.4776e+01 -5.3869e+01 -6.3367e+01 -5.5142e+01 -5.4782e+01 -5.3862e+01 -6.3351e+01 -5.5112e+01 -5.4787e+01 -5.3854e+01 -6.3334e+01 -5.5082e+01 -5.4792e+01 -5.3847e+01 -6.3316e+01 -5.5053e+01 -5.4796e+01 -5.3840e+01 -6.3299e+01 -5.5024e+01 -5.4800e+01 -5.3833e+01 -6.3280e+01 -5.4996e+01 -5.4804e+01 -5.3826e+01 -6.3262e+01 -5.4968e+01 -5.4808e+01 -5.3819e+01 -6.3243e+01 -5.4940e+01 -5.4812e+01 -5.3813e+01 -6.3224e+01 -5.4912e+01 -5.4815e+01 -5.3806e+01 -6.3204e+01 -5.4885e+01 -5.4818e+01 -5.3799e+01 -6.3184e+01 -5.4858e+01 -5.4821e+01 -5.3792e+01 -6.3157e+01 -5.4831e+01 -5.4823e+01 -5.3786e+01 -6.3129e+01 -5.4805e+01 -5.4826e+01 -5.3779e+01 -6.3100e+01 -5.4779e+01 -5.4828e+01 -5.3772e+01 -6.3071e+01 -5.4745e+01 -5.4829e+01 -5.3766e+01 -6.3042e+01 -5.4712e+01 -5.4831e+01 -5.3759e+01 -6.3013e+01 -5.4679e+01 -5.4832e+01 -5.3753e+01 -6.2983e+01 -5.4646e+01 -5.4825e+01 -5.3746e+01 -6.2954e+01 -5.4614e+01 -5.4818e+01 -5.3739e+01 -6.2924e+01 -5.4583e+01 -5.4811e+01 -5.3733e+01 -6.2895e+01 -5.4551e+01 -5.4804e+01 -5.3726e+01 -6.2865e+01 -5.4521e+01 -5.4797e+01 -5.3720e+01 -6.2835e+01 -5.4490e+01 -5.4790e+01 -5.3713e+01 -6.2804e+01 -5.4460e+01 -5.4783e+01 -5.3707e+01 -6.2774e+01 -5.4430e+01 -5.4776e+01 -5.3700e+01 -6.2744e+01 -5.4401e+01 -5.4768e+01 -5.3694e+01 -6.2713e+01 -5.4372e+01 -5.4761e+01 -5.3687e+01 -6.2682e+01 -5.4344e+01 -5.4754e+01 -5.3680e+01 -6.2652e+01 -5.4316e+01 -5.4746e+01 -5.3674e+01 -6.2621e+01 -5.4288e+01 -5.4739e+01 -5.3667e+01 -6.2590e+01 -5.4260e+01 -5.4732e+01 -5.3661e+01 -6.2558e+01 -5.4233e+01 -5.4724e+01 -5.3654e+01 -6.2527e+01 -5.4218e+01 -5.4712e+01 -5.3647e+01 -6.2496e+01 -5.4236e+01 -5.4696e+01 -5.3641e+01 -6.2464e+01 -5.4253e+01 -5.4681e+01 -5.3634e+01 -6.2432e+01 -5.4270e+01 -5.4665e+01 -5.3627e+01 -6.2400e+01 -5.4287e+01 -5.4650e+01 -5.3620e+01 -6.2369e+01 -5.4304e+01 -5.4635e+01 -5.3614e+01 -6.2336e+01 -5.4320e+01 -5.4620e+01 -5.3607e+01 -6.2304e+01 -5.4336e+01 -5.4606e+01 -5.3600e+01 -6.2272e+01 -5.4351e+01 -5.4591e+01 -5.3593e+01 -6.2240e+01 -5.4366e+01 -5.4576e+01 -5.3586e+01 -6.2207e+01 -5.4381e+01 -5.4562e+01 -5.3579e+01 -6.2175e+01 -5.4395e+01 -5.4548e+01 -5.3572e+01 -6.2142e+01 -5.4409e+01 -5.4533e+01 -5.3565e+01 -6.2109e+01 -5.4423e+01 -5.4519e+01 -5.3558e+01 -6.2076e+01 -5.4436e+01 -5.4505e+01 -5.3551e+01 -6.2043e+01 -5.4449e+01 -5.4491e+01 -5.3544e+01 -6.2010e+01 -5.4462e+01 -5.4477e+01 -5.3537e+01 -6.1977e+01 -5.4474e+01 -5.4463e+01 -5.3530e+01 -6.1944e+01 -5.4486e+01 -5.4450e+01 -5.3522e+01 -6.1911e+01 -5.4498e+01 -5.4436e+01 -5.3515e+01 -6.1877e+01 -5.4509e+01 -5.4422e+01 -5.3508e+01 -6.1844e+01 -5.4520e+01 -5.4409e+01 -5.3500e+01 -6.1854e+01 -5.4531e+01 -5.4395e+01 -5.3493e+01 -6.1864e+01 -5.4541e+01 -5.4382e+01 -5.3486e+01 -6.1874e+01 -5.4551e+01 -5.4363e+01 -5.3478e+01 -6.1883e+01 -5.4561e+01 -5.4342e+01 -5.3471e+01 -6.1891e+01 -5.4570e+01 -5.4321e+01 -5.3463e+01 -6.1893e+01 -5.4579e+01 -5.4300e+01 -5.3455e+01 -6.1892e+01 -5.4588e+01 -5.4280e+01 -5.3448e+01 -6.1890e+01 -5.4597e+01 -5.4259e+01 -5.3440e+01 -6.1888e+01 -5.4605e+01 -5.4239e+01 -5.3432e+01 -6.1885e+01 -5.4613e+01 -5.4220e+01 -5.3424e+01 -6.1882e+01 -5.4620e+01 -5.4200e+01 -5.3417e+01 -6.1879e+01 -5.4627e+01 -5.4180e+01 -5.3409e+01 -6.1875e+01 -5.4634e+01 -5.4161e+01 -5.3401e+01 -6.1870e+01 -5.4641e+01 -5.4142e+01 -5.3393e+01 -6.1865e+01 -5.4647e+01 -5.4123e+01 -5.3385e+01 -6.1860e+01 -5.4653e+01 -5.4105e+01 -5.3377e+01 -6.1854e+01 -5.4659e+01 -5.4086e+01 -5.3369e+01 -6.1848e+01 -5.4665e+01 -5.4068e+01 -5.3361e+01 -6.1866e+01 -5.4670e+01 -5.4050e+01 -5.3352e+01 -6.1904e+01 -5.4674e+01 -5.4032e+01 -5.3344e+01 -6.1940e+01 -5.4664e+01 -5.4014e+01 -5.3336e+01 -6.1974e+01 -5.4653e+01 -5.3996e+01 -5.3327e+01 -6.2008e+01 -5.4642e+01 -5.3979e+01 -5.3319e+01 -6.2041e+01 -5.4631e+01 -5.3961e+01 -5.3311e+01 -6.2073e+01 -5.4620e+01 -5.3944e+01 -5.3299e+01 -6.2103e+01 -5.4609e+01 -5.3927e+01 -5.3282e+01 -6.2133e+01 -5.4598e+01 -5.3910e+01 -5.3266e+01 -6.2162e+01 -5.4587e+01 -5.3893e+01 -5.3250e+01 -6.2189e+01 -5.4577e+01 -5.3876e+01 -5.3234e+01 -6.2216e+01 -5.4566e+01 -5.3860e+01 -5.3218e+01 -6.2242e+01 -5.4556e+01 -5.3843e+01 -5.3202e+01 -6.2267e+01 -5.4546e+01 -5.3827e+01 -5.3187e+01 -6.2290e+01 -5.4535e+01 -5.3811e+01 -5.3164e+01 -6.2313e+01 -5.4525e+01 -5.3795e+01 -5.3141e+01 -6.2335e+01 -5.4515e+01 -5.3810e+01 -5.3118e+01 -6.2356e+01 -5.4505e+01 -5.3826e+01 -5.3096e+01 -6.2376e+01 -5.4495e+01 -5.3830e+01 -5.3073e+01 -6.2395e+01 -5.4485e+01 -5.3834e+01 -5.3051e+01 -6.2414e+01 -5.4475e+01 -5.3838e+01 -5.3030e+01 -6.2431e+01 -5.4465e+01 -5.3842e+01 -5.3009e+01 -6.2448e+01 -5.4449e+01 -5.3838e+01 -5.2988e+01 -6.2457e+01 -5.4431e+01 -5.3835e+01 -5.2967e+01 -6.2464e+01 -5.4413e+01 -5.3831e+01 -5.2946e+01 -6.2470e+01 -5.4396e+01 -5.3828e+01 -5.2926e+01 -6.2476e+01 -5.4387e+01 -5.3823e+01 -5.2906e+01 -6.2481e+01 -5.4415e+01 -5.3812e+01 -5.2886e+01 -6.2486e+01 -5.4442e+01 -5.3801e+01 -5.2867e+01 -6.2490e+01 -5.4469e+01 -5.3791e+01 -5.2848e+01 -6.2493e+01 -5.4495e+01 -5.3781e+01 -5.2829e+01 -6.2496e+01 -5.4521e+01 -5.3772e+01 -5.2810e+01 -6.2498e+01 -5.4546e+01 -5.3763e+01 -5.2791e+01 -6.2500e+01 -5.4571e+01 -5.3754e+01 -5.2773e+01 -6.2501e+01 -5.4595e+01 -5.3745e+01 -5.2755e+01 -6.2501e+01 -5.4619e+01 -5.3737e+01 -5.2737e+01 -6.2501e+01 -5.4643e+01 -5.3729e+01 -5.2719e+01 -6.2500e+01 -5.4666e+01 -5.3721e+01 -5.2702e+01 -6.2499e+01 -5.4688e+01 -5.3713e+01 -5.2684e+01 -6.2497e+01 -5.4710e+01 -5.3706e+01 -5.2667e+01 -6.2495e+01 -5.4732e+01 -5.3698e+01 -5.2650e+01 -6.2492e+01 -5.4753e+01 -5.3691e+01 -5.2633e+01 -6.2489e+01 -5.4774e+01 -5.3685e+01 -5.2617e+01 -6.2485e+01 -5.4795e+01 -5.3678e+01 -5.2600e+01 -6.2480e+01 -5.4815e+01 -5.3671e+01 -5.2584e+01 -6.2475e+01 -5.4834e+01 -5.3665e+01 -5.2568e+01 -6.2470e+01 -5.4853e+01 -5.3659e+01 -5.2552e+01 -6.2464e+01 -5.4872e+01 -5.3653e+01 -5.2536e+01 -6.2457e+01 -5.4890e+01 -5.3647e+01 -5.2520e+01 -6.2450e+01 -5.4908e+01 -5.3642e+01 -5.2505e+01 -6.2443e+01 -5.4925e+01 -5.3636e+01 -5.2490e+01 -6.2435e+01 -5.4942e+01 -5.3631e+01 -5.2475e+01 -6.2427e+01 -5.4959e+01 -5.3625e+01 -5.2459e+01 -6.2418e+01 -5.4975e+01 -5.3620e+01 -5.2445e+01 -6.2409e+01 -5.4990e+01 -5.3615e+01 -5.2430e+01 -6.2399e+01 -5.5006e+01 -5.3610e+01 -5.2415e+01 -6.2389e+01 -5.5021e+01 -5.3605e+01 -5.2401e+01 -6.2378e+01 -5.5035e+01 -5.3600e+01 -5.2386e+01 -6.2367e+01 -5.5049e+01 -5.3595e+01 -5.2372e+01 -6.2356e+01 -5.5063e+01 -5.3591e+01 -5.2358e+01 -6.2344e+01 -5.5076e+01 -5.3586e+01 -5.2344e+01 -6.2332e+01 -5.5086e+01 -5.3580e+01 -5.2330e+01 -6.2319e+01 -5.5087e+01 -5.3567e+01 -5.2316e+01 -6.2306e+01 -5.5083e+01 -5.3555e+01 -5.2302e+01 -6.2292e+01 -5.5080e+01 -5.3543e+01 -5.2289e+01 -6.2278e+01 -5.5076e+01 -5.3531e+01 -5.2275e+01 -6.2264e+01 -5.5073e+01 -5.3520e+01 -5.2262e+01 -6.2242e+01 -5.5070e+01 -5.3508e+01 -5.2249e+01 -6.2219e+01 -5.5066e+01 -5.3497e+01 -5.2236e+01 -6.2189e+01 -5.5063e+01 -5.3480e+01 -5.2223e+01 -6.2158e+01 -5.5059e+01 -5.3461e+01 -5.2210e+01 -6.2127e+01 -5.5055e+01 -5.3443e+01 -5.2197e+01 -6.2096e+01 -5.5052e+01 -5.3425e+01 -5.2184e+01 -6.2065e+01 -5.5048e+01 -5.3408e+01 -5.2171e+01 -6.2034e+01 -5.5045e+01 -5.3389e+01 -5.2158e+01 -6.2003e+01 -5.5041e+01 -5.3364e+01 -5.2130e+01 -6.1972e+01 -5.5037e+01 -5.3338e+01 -5.2102e+01 -6.1941e+01 -5.5033e+01 -5.3307e+01 -5.2074e+01 -6.1910e+01 -5.5030e+01 -5.3276e+01 -5.2047e+01 -6.1879e+01 -5.5023e+01 -5.3246e+01 -5.2020e+01 -6.1848e+01 -5.5011e+01 -5.3216e+01 -5.1994e+01 -6.1817e+01 -5.4999e+01 -5.3187e+01 -5.1968e+01 -6.1786e+01 -5.4988e+01 -5.3159e+01 -5.1943e+01 -6.1755e+01 -5.4976e+01 -5.3131e+01 -5.1918e+01 -6.1723e+01 -5.4965e+01 -5.3104e+01 -5.1894e+01 -6.1692e+01 -5.4954e+01 -5.3077e+01 -5.1870e+01 -6.1670e+01 -5.4942e+01 -5.3052e+01 -5.1846e+01 -6.1684e+01 -5.4930e+01 -5.3026e+01 -5.1822e+01 -6.1697e+01 -5.4911e+01 -5.3001e+01 -5.1799e+01 -6.1709e+01 -5.4893e+01 -5.2977e+01 -5.1777e+01 -6.1720e+01 -5.4874e+01 -5.2953e+01 -5.1755e+01 -6.1731e+01 -5.4856e+01 -5.2930e+01 -5.1733e+01 -6.1741e+01 -5.4839e+01 -5.2930e+01 -5.1711e+01 -6.1750e+01 -5.4821e+01 -5.2952e+01 -5.1690e+01 -6.1759e+01 -5.4804e+01 -5.2974e+01 -5.1669e+01 -6.1767e+01 -5.4787e+01 -5.2995e+01 -5.1649e+01 -6.1775e+01 -5.4770e+01 -5.3017e+01 -5.1628e+01 -6.1782e+01 -5.4753e+01 -5.3038e+01 -5.1608e+01 -6.1788e+01 -5.4737e+01 -5.3058e+01 -5.1589e+01 -6.1794e+01 -5.4721e+01 -5.3079e+01 -5.1569e+01 -6.1799e+01 -5.4705e+01 -5.3100e+01 -5.1550e+01 -6.1803e+01 -5.4689e+01 -5.3120e+01 -5.1532e+01 -6.1807e+01 -5.4673e+01 -5.3140e+01 -5.1513e+01 -6.1810e+01 -5.4658e+01 -5.3159e+01 -5.1491e+01 -6.1813e+01 -5.4643e+01 -5.3179e+01 -5.1465e+01 -6.1815e+01 -5.4628e+01 -5.3198e+01 -5.1440e+01 -6.1817e+01 -5.4613e+01 -5.3217e+01 -5.1415e+01 -6.1818e+01 -5.4598e+01 -5.3236e+01 -5.1390e+01 -6.1818e+01 -5.4583e+01 -5.3254e+01 -5.1366e+01 -6.1818e+01 -5.4569e+01 -5.3272e+01 -5.1343e+01 -6.1818e+01 -5.4555e+01 -5.3290e+01 -5.1319e+01 -6.1816e+01 -5.4540e+01 -5.3308e+01 -5.1297e+01 -6.1815e+01 -5.4526e+01 -5.3326e+01 -5.1274e+01 -6.1812e+01 -5.4510e+01 -5.3343e+01 -5.1252e+01 -6.1810e+01 -5.4489e+01 -5.3360e+01 -5.1231e+01 -6.1807e+01 -5.4467e+01 -5.3376e+01 -5.1209e+01 -6.1803e+01 -5.4446e+01 -5.3393e+01 -5.1188e+01 -6.1799e+01 -5.4425e+01 -5.3409e+01 -5.1166e+01 -6.1794e+01 -5.4405e+01 -5.3425e+01 -5.1138e+01 -6.1789e+01 -5.4384e+01 -5.3441e+01 -5.1110e+01 -6.1783e+01 -5.4364e+01 -5.3456e+01 -5.1083e+01 -6.1777e+01 -5.4344e+01 -5.3471e+01 -5.1056e+01 -6.1770e+01 -5.4325e+01 -5.3486e+01 -5.1030e+01 -6.1763e+01 -5.4305e+01 -5.3500e+01 -5.1005e+01 -6.1756e+01 -5.4286e+01 -5.3515e+01 -5.0980e+01 -6.1748e+01 -5.4268e+01 -5.3529e+01 -5.0955e+01 -6.1739e+01 -5.4249e+01 -5.3543e+01 -5.0931e+01 -6.1730e+01 -5.4231e+01 -5.3556e+01 -5.0907e+01 -6.1721e+01 -5.4212e+01 -5.3569e+01 -5.0884e+01 -6.1711e+01 -5.4194e+01 -5.3582e+01 -5.0861e+01 -6.1701e+01 -5.4176e+01 -5.3595e+01 -5.0839e+01 -6.1691e+01 -5.4150e+01 -5.3608e+01 -5.0817e+01 -6.1680e+01 -5.4125e+01 -5.3620e+01 -5.0795e+01 -6.1668e+01 -5.4100e+01 -5.3632e+01 -5.0774e+01 -6.1656e+01 -5.4076e+01 -5.3643e+01 -5.0754e+01 -6.1644e+01 -5.4052e+01 -5.3655e+01 -5.0757e+01 -6.1632e+01 -5.4028e+01 -5.3666e+01 -5.0774e+01 -6.1619e+01 -5.4005e+01 -5.3677e+01 -5.0785e+01 -6.1605e+01 -5.3982e+01 -5.3687e+01 -5.0793e+01 -6.1592e+01 -5.3959e+01 -5.3698e+01 -5.0802e+01 -6.1577e+01 -5.3936e+01 -5.3729e+01 -5.0810e+01 -6.1563e+01 -5.3914e+01 -5.3783e+01 -5.0819e+01 -6.1548e+01 -5.3893e+01 -5.3837e+01 -5.0827e+01 -6.1533e+01 -5.3871e+01 -5.3883e+01 -5.0836e+01 -6.1518e+01 -5.3850e+01 -5.3927e+01 -5.0845e+01 -6.1502e+01 -5.3829e+01 -5.3970e+01 -5.0854e+01 -6.1486e+01 -5.3804e+01 -5.4012e+01 -5.0862e+01 -6.1469e+01 -5.3776e+01 -5.4053e+01 -5.0871e+01 -6.1452e+01 -5.3748e+01 -5.4094e+01 -5.0880e+01 -6.1435e+01 -5.3714e+01 -5.4134e+01 -5.0889e+01 -6.1417e+01 -5.3679e+01 -5.4174e+01 -5.0898e+01 -6.1400e+01 -5.3645e+01 -5.4212e+01 -5.0907e+01 -6.1382e+01 -5.3611e+01 -5.4251e+01 -5.0916e+01 -6.1363e+01 -5.3578e+01 -5.4288e+01 -5.0925e+01 -6.1344e+01 -5.3546e+01 -5.4325e+01 -5.0934e+01 -6.1325e+01 -5.3514e+01 -5.4361e+01 -5.0943e+01 -6.1306e+01 -5.3483e+01 -5.4396e+01 -5.0952e+01 -6.1287e+01 -5.3452e+01 -5.4431e+01 -5.0961e+01 -6.1267e+01 -5.3422e+01 -5.4465e+01 -5.0970e+01 -6.1246e+01 -5.3392e+01 -5.4499e+01 -5.0979e+01 -6.1226e+01 -5.3363e+01 -5.4532e+01 -5.0984e+01 -6.1205e+01 -5.3334e+01 -5.4564e+01 -5.0985e+01 -6.1184e+01 -5.3306e+01 -5.4596e+01 -5.0986e+01 -6.1163e+01 -5.3278e+01 -5.4627e+01 -5.0987e+01 -6.1142e+01 -5.3250e+01 -5.4657e+01 -5.0989e+01 -6.1120e+01 -5.3224e+01 -5.4687e+01 -5.0990e+01 -6.1098e+01 -5.3197e+01 -5.4716e+01 -5.0992e+01 -6.1076e+01 -5.3171e+01 -5.4745e+01 -5.0994e+01 -6.1053e+01 -5.3145e+01 -5.4771e+01 -5.0996e+01 -6.1031e+01 -5.3120e+01 -5.4791e+01 -5.0998e+01 -6.1008e+01 -5.3095e+01 -5.4810e+01 -5.1000e+01 -6.0985e+01 -5.3071e+01 -5.4829e+01 -5.1002e+01 -6.0961e+01 -5.3047e+01 -5.4847e+01 -5.1004e+01 -6.0938e+01 -5.3023e+01 -5.4865e+01 -5.1006e+01 -6.0914e+01 -5.3000e+01 -5.4883e+01 -5.1009e+01 -6.0890e+01 -5.2977e+01 -5.4900e+01 -5.1011e+01 -6.0866e+01 -5.2954e+01 -5.4917e+01 -5.1014e+01 -6.0841e+01 -5.2932e+01 -5.4933e+01 -5.1016e+01 -6.0817e+01 -5.2910e+01 -5.4949e+01 -5.1019e+01 -6.0792e+01 -5.2888e+01 -5.4965e+01 -5.1022e+01 -6.0767e+01 -5.2867e+01 -5.4980e+01 -5.1025e+01 -6.0742e+01 -5.2846e+01 -5.4995e+01 -5.1028e+01 -6.0716e+01 -5.2825e+01 -5.5010e+01 -5.1030e+01 -6.0691e+01 -5.2805e+01 -5.5054e+01 -5.1031e+01 -6.0665e+01 -5.2785e+01 -5.5112e+01 -5.1026e+01 -6.0639e+01 -5.2765e+01 -5.5169e+01 -5.1022e+01 -6.0613e+01 -5.2745e+01 -5.5225e+01 -5.1017e+01 -6.0587e+01 -5.2726e+01 -5.5279e+01 -5.1013e+01 -6.0560e+01 -5.2707e+01 -5.5326e+01 -5.1035e+01 -6.0534e+01 -5.2688e+01 -5.5371e+01 -5.1059e+01 -6.0507e+01 -5.2670e+01 -5.5415e+01 -5.1083e+01 -6.0480e+01 -5.2651e+01 -5.5459e+01 -5.1107e+01 -6.0453e+01 -5.2633e+01 -5.5502e+01 -5.1132e+01 -6.0426e+01 -5.2615e+01 -5.5544e+01 -5.1156e+01 -6.0398e+01 -5.2598e+01 -5.5586e+01 -5.1179e+01 -6.0371e+01 -5.2578e+01 -5.5626e+01 -5.1203e+01 -6.0343e+01 -5.2553e+01 -5.5666e+01 -5.1227e+01 -6.0316e+01 -5.2528e+01 -5.5705e+01 -5.1250e+01 -6.0285e+01 -5.2504e+01 -5.5744e+01 -5.1276e+01 -6.0242e+01 -5.2480e+01 -5.5782e+01 -5.1336e+01 -6.0198e+01 -5.2456e+01 -5.5819e+01 -5.1395e+01 -6.0155e+01 -5.2433e+01 -5.5855e+01 -5.1454e+01 -6.0111e+01 -5.2410e+01 -5.5890e+01 -5.1512e+01 -6.0068e+01 -5.2388e+01 -5.5925e+01 -5.1569e+01 -6.0053e+01 -5.2366e+01 -5.5959e+01 -5.1626e+01 -6.0055e+01 -5.2344e+01 -5.5993e+01 -5.1682e+01 -6.0057e+01 -5.2322e+01 -5.6026e+01 -5.1738e+01 -6.0058e+01 -5.2301e+01 -5.6058e+01 -5.1793e+01 -6.0058e+01 -5.2281e+01 -5.6089e+01 -5.1847e+01 -6.0058e+01 -5.2260e+01 -5.6120e+01 -5.1901e+01 -6.0058e+01 -5.2240e+01 -5.6150e+01 -5.1954e+01 -6.0057e+01 -5.2220e+01 -5.6179e+01 -5.2006e+01 -6.0056e+01 -5.2201e+01 -5.6208e+01 -5.2058e+01 -6.0055e+01 -5.2181e+01 -5.6236e+01 -5.2109e+01 -6.0053e+01 -5.2162e+01 -5.6263e+01 -5.2160e+01 -6.0051e+01 -5.2143e+01 -5.6290e+01 -5.2210e+01 -6.0048e+01 -5.2125e+01 -5.6316e+01 -5.2259e+01 -6.0045e+01 -5.2107e+01 -5.6341e+01 -5.2308e+01 -6.0042e+01 -5.2089e+01 -5.6366e+01 -5.2356e+01 -6.0038e+01 -5.2071e+01 -5.6383e+01 -5.2403e+01 -6.0034e+01 -5.2054e+01 -5.6399e+01 -5.2450e+01 -6.0029e+01 -5.2036e+01 -5.6415e+01 -5.2496e+01 -6.0024e+01 -5.2012e+01 -5.6430e+01 -5.2542e+01 -6.0019e+01 -5.1987e+01 -5.6444e+01 -5.2587e+01 -6.0013e+01 -5.1963e+01 -5.6458e+01 -5.2631e+01 -6.0007e+01 -5.1939e+01 -5.6472e+01 -5.2675e+01 -6.0001e+01 -5.1916e+01 -5.6485e+01 -5.2718e+01 -5.9994e+01 -5.1893e+01 -5.6498e+01 -5.2761e+01 -5.9987e+01 -5.1870e+01 -5.6511e+01 -5.2803e+01 -5.9980e+01 -5.1848e+01 -5.6523e+01 -5.2844e+01 -5.9969e+01 -5.1826e+01 -5.6535e+01 -5.2885e+01 -5.9953e+01 -5.1805e+01 -5.6546e+01 -5.2926e+01 -5.9937e+01 -5.1784e+01 -5.6557e+01 -5.2965e+01 -5.9921e+01 -5.1763e+01 -5.6568e+01 -5.3004e+01 -5.9905e+01 -5.1743e+01 -5.6578e+01 -5.3043e+01 -5.9888e+01 -5.1715e+01 -5.6588e+01 -5.3081e+01 -5.9871e+01 -5.1687e+01 -5.6597e+01 -5.3118e+01 -5.9855e+01 -5.1660e+01 -5.6606e+01 -5.3155e+01 -5.9838e+01 -5.1634e+01 -5.6615e+01 -5.3191e+01 -5.9821e+01 -5.1608e+01 -5.6623e+01 -5.3226e+01 -5.9803e+01 -5.1582e+01 -5.6631e+01 -5.3261e+01 -5.9786e+01 -5.1557e+01 -5.6642e+01 -5.3296e+01 -5.9769e+01 -5.1532e+01 -5.6689e+01 -5.3330e+01 -5.9751e+01 -5.1508e+01 -5.6732e+01 -5.3363e+01 -5.9733e+01 -5.1484e+01 -5.6774e+01 -5.3396e+01 -5.9715e+01 -5.1461e+01 -5.6815e+01 -5.3428e+01 -5.9697e+01 -5.1438e+01 -5.6856e+01 -5.3460e+01 -5.9679e+01 -5.1415e+01 -5.6895e+01 -5.3491e+01 -5.9661e+01 -5.1393e+01 -5.6926e+01 -5.3522e+01 -5.9642e+01 -5.1371e+01 -5.6956e+01 -5.3552e+01 -5.9624e+01 -5.1350e+01 -5.6986e+01 -5.3582e+01 -5.9605e+01 -5.1329e+01 -5.7015e+01 -5.3611e+01 -5.9586e+01 -5.1308e+01 -5.7043e+01 -5.3639e+01 -5.9567e+01 -5.1288e+01 -5.7071e+01 -5.3667e+01 -5.9548e+01 -5.1268e+01 -5.7098e+01 -5.3695e+01 -5.9529e+01 -5.1248e+01 -5.7125e+01 -5.3722e+01 -5.9509e+01 -5.1229e+01 -5.7151e+01 -5.3748e+01 -5.9490e+01 -5.1210e+01 -5.7177e+01 -5.3774e+01 -5.9470e+01 -5.1191e+01 -5.7202e+01 -5.3800e+01 -5.9450e+01 -5.1173e+01 -5.7226e+01 -5.3825e+01 -5.9430e+01 -5.1155e+01 -5.7250e+01 -5.3849e+01 -5.9410e+01 -5.1138e+01 -5.7273e+01 -5.3873e+01 -5.9390e+01 -5.1120e+01 -5.7296e+01 -5.3897e+01 -5.9370e+01 -5.1103e+01 -5.7318e+01 -5.3920e+01 -5.9350e+01 -5.1086e+01 -5.7340e+01 -5.3942e+01 -5.9329e+01 -5.1070e+01 -5.7361e+01 -5.3964e+01 -5.9308e+01 -5.1054e+01 -5.7382e+01 -5.3986e+01 -5.9288e+01 -5.1031e+01 -5.7402e+01 -5.4007e+01 -5.9267e+01 -5.1007e+01 -5.7421e+01 -5.4028e+01 -5.9246e+01 -5.0984e+01 -5.7440e+01 -5.4048e+01 -5.9225e+01 -5.0961e+01 -5.7458e+01 -5.4068e+01 -5.9203e+01 -5.0939e+01 -5.7476e+01 -5.4087e+01 -5.9182e+01 -5.0917e+01 -5.7493e+01 -5.4100e+01 -5.9161e+01 -5.0896e+01 -5.7510e+01 -5.4111e+01 -5.9139e+01 -5.0875e+01 -5.7527e+01 -5.4121e+01 -5.9117e+01 -5.0854e+01 -5.7542e+01 -5.4131e+01 -5.9096e+01 -5.0829e+01 -5.7558e+01 -5.4141e+01 -5.9074e+01 -5.0801e+01 -5.7572e+01 -5.4150e+01 -5.9052e+01 -5.0774e+01 -5.7587e+01 -5.4160e+01 -5.9030e+01 -5.0747e+01 -5.7600e+01 -5.4169e+01 -5.9004e+01 -5.0721e+01 -5.7614e+01 -5.4178e+01 -5.8974e+01 -5.0696e+01 -5.7626e+01 -5.4186e+01 -5.8944e+01 -5.0671e+01 -5.7638e+01 -5.4195e+01 -5.8914e+01 -5.0646e+01 -5.7642e+01 -5.4203e+01 -5.8884e+01 -5.0623e+01 -5.7646e+01 -5.4211e+01 -5.8854e+01 -5.0599e+01 -5.7649e+01 -5.4218e+01 -5.8824e+01 -5.0576e+01 -5.7652e+01 -5.4226e+01 -5.8794e+01 -5.0554e+01 -5.7655e+01 -5.4233e+01 -5.8765e+01 -5.0532e+01 -5.7657e+01 -5.4240e+01 -5.8735e+01 -5.0510e+01 -5.7659e+01 -5.4246e+01 -5.8706e+01 -5.0489e+01 -5.7661e+01 -5.4253e+01 -5.8676e+01 -5.0468e+01 -5.7663e+01 -5.4259e+01 -5.8647e+01 -5.0448e+01 -5.7664e+01 -5.4265e+01 -5.8618e+01 -5.0428e+01 -5.7665e+01 -5.4271e+01 -5.8589e+01 -5.0408e+01 -5.7666e+01 -5.4276e+01 -5.8560e+01 -5.0389e+01 -5.7666e+01 -5.4276e+01 -5.8530e+01 -5.0370e+01 -5.7666e+01 -5.4273e+01 -5.8501e+01 -5.0352e+01 -5.7666e+01 -5.4271e+01 -5.8473e+01 -5.0329e+01 -5.7666e+01 -5.4268e+01 -5.8444e+01 -5.0303e+01 -5.7665e+01 -5.4265e+01 -5.8415e+01 -5.0279e+01 -5.7665e+01 -5.4262e+01 -5.8386e+01 -5.0254e+01 -5.7663e+01 -5.4259e+01 -5.8357e+01 -5.0228e+01 -5.7662e+01 -5.4255e+01 -5.8329e+01 -5.0197e+01 -5.7660e+01 -5.4252e+01 -5.8300e+01 -5.0166e+01 -5.7658e+01 -5.4249e+01 -5.8272e+01 -5.0136e+01 -5.7648e+01 -5.4246e+01 -5.8243e+01 -5.0107e+01 -5.7638e+01 -5.4242e+01 -5.8215e+01 -5.0078e+01 -5.7627e+01 -5.4238e+01 -5.8186e+01 -5.0051e+01 -5.7617e+01 -5.4226e+01 -5.8158e+01 -5.0023e+01 -5.7607e+01 -5.4215e+01 -5.8130e+01 -1.0000e+01 -5.7596e+01 -5.4204e+01 -5.8102e+01 -6.0000e+01 -5.7585e+01 -5.4193e+01 -5.8073e+01 -6.0000e+01 -5.7575e+01 -5.4182e+01 -5.8045e+01 -6.0000e+01 -5.7564e+01 -5.4171e+01 -5.8017e+01 -6.0000e+01 -5.7553e+01 -5.4160e+01 -5.7989e+01 -6.0000e+01 -5.7542e+01 -5.4150e+01 -5.7961e+01 -6.0000e+01 -5.7531e+01 -5.4139e+01 -5.7933e+01 -6.0000e+01 -5.7520e+01 -5.4129e+01 -5.7905e+01 -6.0000e+01 -5.7509e+01 -5.4119e+01 -5.7877e+01 -6.0000e+01 -5.7497e+01 -5.4108e+01 -5.7849e+01 -6.0000e+01 -5.7486e+01 -5.4098e+01 -5.7822e+01 -6.0000e+01 -5.7474e+01 -5.4088e+01 -5.7794e+01 -6.0000e+01 -5.7463e+01 -5.4078e+01 -5.7766e+01 -6.0000e+01 -5.7451e+01 -5.4068e+01 -5.7738e+01 -6.0000e+01 -5.7439e+01 -5.4058e+01 -5.7711e+01 -6.0000e+01 -5.7427e+01 -5.4048e+01 -5.7683e+01 -6.0000e+01 -5.7415e+01 -5.4038e+01 -5.7656e+01 -6.0000e+01 -5.7403e+01 -5.4029e+01 -5.7628e+01 -6.0000e+01 -5.7391e+01 -5.4019e+01 -5.7601e+01 -6.0000e+01 -5.7379e+01 -5.4006e+01 -5.7573e+01 -6.0000e+01 -5.7366e+01 -5.3988e+01 -5.7546e+01 -6.0000e+01 -5.7354e+01 -5.3971e+01 -5.7518e+01 -6.0000e+01 -5.7341e+01 -5.3954e+01 -5.7491e+01 -6.0000e+01 -5.7328e+01 -5.3937e+01 -5.7464e+01 -6.0000e+01 -5.7316e+01 -5.3921e+01 -5.7436e+01 -6.0000e+01 -5.7303e+01 -5.3904e+01 -5.7409e+01 -6.0000e+01 -5.7290e+01 -5.3888e+01 -5.7409e+01 -6.0000e+01 -5.7277e+01 -5.3872e+01 -5.7426e+01 -6.0000e+01 -5.7263e+01 -5.3856e+01 -5.7442e+01 -6.0000e+01 -5.7250e+01 -5.3840e+01 -5.7458e+01 -6.0000e+01 -5.7230e+01 -5.3825e+01 -5.7473e+01 -6.0000e+01 -5.7208e+01 -5.3810e+01 -5.7488e+01 -6.0000e+01 -5.7187e+01 -5.3794e+01 -5.7502e+01 -6.0000e+01 -5.7166e+01 -5.3780e+01 -5.7515e+01 -6.0000e+01 -5.7145e+01 -5.3765e+01 -5.7528e+01 -6.0000e+01 -5.7124e+01 -5.3750e+01 -5.7540e+01 -6.0000e+01 -5.7103e+01 -5.3735e+01 -5.7552e+01 -6.0000e+01 -5.7082e+01 -5.3721e+01 -5.7561e+01 -6.0000e+01 -5.7061e+01 -5.3707e+01 -5.7563e+01 -6.0000e+01 -5.7040e+01 -5.3693e+01 -5.7566e+01 -6.0000e+01 -5.7020e+01 -5.3679e+01 -5.7568e+01 -6.0000e+01 -5.6999e+01 -5.3665e+01 -5.7569e+01 -6.0000e+01 -5.6978e+01 -5.3651e+01 -5.7571e+01 -6.0000e+01 -5.6958e+01 -5.3638e+01 -5.7572e+01 -6.0000e+01 -5.6937e+01 -5.3624e+01 -5.7572e+01 -6.0000e+01 -5.6917e+01 -5.3609e+01 -5.7572e+01 -6.0000e+01 -5.6929e+01 -5.3588e+01 -5.7572e+01 -6.0000e+01 -5.6953e+01 -5.3567e+01 -5.7572e+01 -6.0000e+01 -5.6976e+01 -5.3546e+01 -5.7565e+01 -6.0000e+01 -5.6999e+01 -5.3522e+01 -5.7556e+01 -5.9990e+01 -5.7018e+01 -5.3494e+01 -5.7547e+01 -5.9914e+01 -5.7032e+01 -5.3467e+01 -5.7538e+01 -5.9839e+01 -5.7045e+01 -5.3440e+01 -5.7529e+01 -5.9764e+01 -5.7058e+01 -5.3413e+01 -5.7519e+01 -5.9691e+01 -5.7070e+01 -5.3387e+01 -5.7502e+01 -5.9618e+01 -5.7082e+01 -5.3361e+01 -5.7485e+01 -5.9546e+01 -5.7093e+01 -5.3330e+01 -5.7467e+01 -5.9475e+01 -5.7104e+01 -5.3297e+01 -5.7450e+01 -5.9404e+01 -5.7115e+01 -5.3265e+01 -5.7433e+01 -5.9335e+01 -5.7126e+01 -5.3233e+01 -5.7416e+01 -5.9266e+01 -5.7135e+01 -5.3202e+01 -5.7398e+01 -5.9197e+01 -5.7145e+01 -5.3171e+01 -5.7381e+01 -5.9130e+01 -5.7154e+01 -5.3141e+01 -5.7364e+01 -5.9063e+01 -5.7163e+01 -5.3112e+01 -5.7347e+01 -5.8997e+01 -5.7171e+01 -5.3083e+01 -5.7330e+01 -5.8931e+01 -5.7179e+01 -5.3055e+01 -5.7313e+01 -5.8866e+01 -5.7187e+01 -5.3027e+01 -5.7296e+01 -5.8802e+01 -5.7192e+01 -5.2999e+01 -5.7279e+01 -5.8738e+01 -5.7191e+01 -5.2966e+01 -5.7262e+01 -5.8675e+01 -5.7190e+01 -5.2931e+01 -5.7245e+01 -5.8613e+01 -5.7189e+01 -5.2898e+01 -5.7229e+01 -5.8551e+01 -5.7187e+01 -5.2864e+01 -5.7212e+01 -5.8490e+01 -5.7185e+01 -5.2832e+01 -5.7195e+01 -5.8429e+01 -5.7183e+01 -5.2800e+01 -5.7178e+01 -5.8370e+01 -5.7181e+01 -5.2769e+01 -5.7161e+01 -5.8310e+01 -5.7179e+01 -5.2738e+01 -5.7144e+01 -5.8251e+01 -5.7169e+01 -5.2703e+01 -5.7124e+01 -5.8193e+01 -5.7158e+01 -5.2666e+01 -5.7099e+01 -5.8135e+01 -5.7148e+01 -5.2629e+01 -5.7074e+01 -5.8078e+01 -5.7138e+01 -5.2593e+01 -5.7050e+01 -5.8022e+01 -5.7127e+01 -5.2557e+01 -5.7026e+01 -5.7965e+01 -5.7117e+01 -5.2523e+01 -5.7002e+01 -5.7910e+01 -5.7106e+01 -5.2488e+01 -5.6978e+01 -5.7855e+01 -5.7096e+01 -5.2455e+01 -5.6954e+01 -5.7800e+01 -5.7086e+01 -5.2422e+01 -5.6931e+01 -5.7746e+01 -5.7075e+01 -5.2381e+01 -5.6907e+01 -5.7693e+01 -5.7065e+01 -5.2342e+01 -5.6924e+01 -5.7639e+01 -5.7054e+01 -5.2304e+01 -5.6945e+01 -5.7587e+01 -5.7044e+01 -5.2266e+01 -5.6965e+01 -5.7535e+01 -5.7033e+01 -5.2229e+01 -5.6985e+01 -5.7483e+01 -5.7015e+01 -5.2193e+01 -5.7005e+01 -5.7432e+01 -5.6996e+01 -5.2156e+01 -5.7024e+01 -5.7381e+01 -5.6978e+01 -5.2114e+01 -5.7042e+01 -5.7326e+01 -5.6960e+01 -5.2072e+01 -5.7090e+01 -5.7269e+01 -5.6942e+01 -5.2031e+01 -5.7152e+01 -5.7211e+01 -5.6924e+01 -5.1990e+01 -5.7212e+01 -5.7155e+01 -5.6906e+01 -5.1951e+01 -5.7271e+01 -5.7099e+01 -5.6888e+01 -5.1913e+01 -5.7329e+01 -5.7044e+01 -5.6864e+01 -5.1875e+01 -5.7385e+01 -5.6989e+01 -5.6839e+01 -5.1838e+01 -5.7433e+01 -5.6935e+01 -5.6814e+01 -5.1802e+01 -5.7480e+01 -5.6881e+01 -5.6789e+01 -5.1766e+01 -5.7526e+01 -5.6828e+01 -5.6765e+01 -5.1732e+01 -5.7572e+01 -5.6775e+01 -5.6741e+01 -5.1698e+01 -5.7616e+01 -5.6724e+01 -5.6717e+01 -5.1665e+01 -5.7659e+01 -5.6672e+01 -5.6694e+01 -5.1632e+01 -5.7734e+01 -5.6621e+01 -5.6670e+01 -5.1600e+01 -5.7820e+01 -5.6571e+01 -5.6647e+01 -5.1569e+01 -5.7905e+01 -5.6521e+01 -5.6624e+01 -5.1538e+01 -5.7988e+01 -5.6472e+01 -5.6602e+01 -5.1508e+01 -5.8069e+01 -5.6423e+01 -5.6579e+01 -5.1479e+01 -5.8149e+01 -5.6374e+01 -5.6557e+01 -5.1450e+01 -5.8227e+01 -5.6327e+01 -5.6535e+01 -5.1442e+01 -5.8328e+01 -5.6279e+01 -5.6513e+01 -5.1451e+01 -5.8448e+01 -5.6232e+01 -5.6491e+01 -5.1459e+01 -5.8566e+01 -5.6186e+01 -5.6470e+01 -5.1468e+01 -5.8682e+01 -5.6140e+01 -5.6449e+01 -5.1477e+01 -5.8795e+01 -5.6094e+01 -5.6428e+01 -5.1487e+01 -5.8907e+01 -5.6049e+01 -5.6407e+01 -5.1496e+01 -5.9017e+01 -5.6004e+01 -5.6386e+01 -5.1505e+01 -5.9124e+01 -5.5960e+01 -5.6365e+01 -5.1514e+01 -5.9230e+01 -5.5916e+01 -5.6345e+01 -5.1524e+01 -5.9334e+01 -5.5873e+01 -5.6324e+01 -5.1533e+01 -5.9436e+01 -5.5830e+01 -5.6304e+01 -5.1542e+01 -5.9535e+01 -5.5787e+01 -5.6284e+01 -5.1552e+01 -5.9634e+01 -5.5745e+01 -5.6264e+01 -5.1561e+01 -5.9730e+01 -5.5703e+01 -5.6244e+01 -5.1571e+01 -5.9824e+01 -5.5661e+01 -5.6224e+01 -5.1580e+01 -5.9917e+01 -5.5620e+01 -5.6205e+01 -5.1590e+01 -6.0008e+01 -5.5579e+01 -5.6185e+01 -5.1599e+01 -6.0097e+01 -5.5539e+01 -5.6166e+01 -5.1608e+01 -6.0184e+01 -5.5499e+01 -5.6147e+01 -5.1618e+01 -6.0269e+01 -5.5459e+01 -5.6128e+01 -5.1627e+01 -6.0353e+01 -5.5417e+01 -5.6108e+01 -5.1636e+01 -6.0435e+01 -5.5370e+01 -5.6089e+01 -5.1646e+01 -6.0516e+01 -5.5324e+01 -5.6070e+01 -5.1655e+01 -6.0595e+01 -5.5278e+01 -5.6052e+01 -5.1664e+01 -6.0672e+01 -5.5233e+01 -5.6033e+01 -5.1673e+01 -6.0747e+01 -5.5188e+01 -5.6014e+01 -5.1682e+01 -6.0821e+01 -5.5144e+01 -5.5996e+01 -5.1691e+01 -6.0894e+01 -5.5100e+01 -5.5977e+01 -5.1700e+01 -6.0964e+01 -5.5057e+01 -5.5959e+01 -5.1709e+01 -6.1033e+01 -5.5014e+01 -5.5940e+01 -5.1718e+01 -6.1101e+01 -5.4972e+01 -5.5922e+01 -5.1727e+01 -6.1167e+01 -5.4930e+01 -5.5903e+01 -5.1735e+01 -6.1232e+01 -5.4889e+01 -5.5885e+01 -5.1744e+01 -6.1295e+01 -5.4848e+01 -5.5867e+01 -5.1752e+01 -6.1357e+01 -5.4807e+01 -5.5849e+01 -5.1761e+01 -6.1417e+01 -5.4767e+01 -5.5831e+01 -5.1769e+01 -6.1476e+01 -5.4727e+01 -5.5813e+01 -5.1778e+01 -6.1534e+01 -5.4688e+01 -5.5795e+01 -5.1783e+01 -6.1590e+01 -5.4649e+01 -5.5777e+01 -5.1775e+01 -6.1644e+01 -5.4611e+01 -5.5752e+01 -5.1768e+01 -6.1698e+01 -5.4573e+01 -5.5726e+01 -5.1760e+01 -6.1750e+01 -5.4536e+01 -5.5701e+01 -5.1753e+01 -6.1800e+01 -5.4498e+01 -5.5676e+01 -5.1747e+01 -6.1850e+01 -5.4462e+01 -5.5651e+01 -5.1740e+01 -6.1898e+01 -5.4425e+01 -5.5626e+01 -5.1734e+01 -6.1944e+01 -5.4389e+01 -5.5601e+01 -5.1728e+01 -6.1990e+01 -5.4353e+01 -5.5577e+01 -5.1722e+01 -6.2034e+01 -5.4318e+01 -5.5553e+01 -5.1717e+01 -6.2077e+01 -5.4283e+01 -5.5529e+01 -5.1711e+01 -6.2119e+01 -5.4248e+01 -5.5505e+01 -5.1706e+01 -6.2159e+01 -5.4214e+01 -5.5481e+01 -5.1701e+01 -6.2199e+01 -5.4180e+01 -5.5458e+01 -5.1697e+01 -6.2237e+01 -5.4147e+01 -5.5435e+01 -5.1692e+01 -6.2274e+01 -5.4113e+01 -5.5411e+01 -5.1688e+01 -6.2310e+01 -5.4080e+01 -5.5389e+01 -5.1684e+01 -6.2344e+01 -5.4048e+01 -5.5366e+01 -5.1680e+01 -6.2378e+01 -5.4015e+01 -5.5343e+01 -5.1676e+01 -6.2411e+01 -5.3983e+01 -5.5321e+01 -5.1672e+01 -6.2442e+01 -5.3952e+01 -5.5298e+01 -5.1668e+01 -6.2472e+01 -5.3920e+01 -5.5276e+01 -5.1665e+01 -6.2502e+01 -5.3889e+01 -5.5254e+01 -5.1662e+01 -6.2530e+01 -5.3858e+01 -5.5232e+01 -5.1658e+01 -6.2557e+01 -5.3828e+01 -5.5211e+01 -5.1655e+01 -6.2583e+01 -5.3798e+01 -5.5189e+01 -5.1663e+01 -6.2608e+01 -5.3768e+01 -5.5168e+01 -5.1696e+01 -6.2632e+01 -5.3738e+01 -5.5146e+01 -5.1730e+01 -6.2655e+01 -5.3709e+01 -5.5125e+01 -5.1762e+01 -6.2678e+01 -5.3679e+01 -5.5104e+01 -5.1795e+01 -6.2699e+01 -5.3651e+01 -5.5083e+01 -5.1827e+01 -6.2719e+01 -5.3622e+01 -5.5062e+01 -5.1855e+01 -6.2738e+01 -5.3594e+01 -5.5040e+01 -5.1878e+01 -6.2757e+01 -5.3566e+01 -5.5012e+01 -5.1902e+01 -6.2774e+01 -5.3538e+01 -5.4983e+01 -5.1925e+01 -6.2791e+01 -5.3510e+01 -5.4955e+01 -5.1948e+01 -6.2806e+01 -5.3483e+01 -5.4928e+01 -5.1971e+01 -6.2821e+01 -5.3456e+01 -5.4900e+01 -5.1993e+01 -6.2835e+01 -5.3429e+01 -5.4873e+01 -5.2016e+01 -6.2848e+01 -5.3402e+01 -5.4846e+01 -5.2038e+01 -6.2860e+01 -5.3376e+01 -5.4819e+01 -5.2060e+01 -6.2872e+01 -5.3349e+01 -5.4793e+01 -5.2082e+01 -6.2882e+01 -5.3324e+01 -5.4767e+01 -5.2103e+01 -6.2892e+01 -5.3298e+01 -5.4741e+01 -5.2125e+01 -6.2901e+01 -5.3272e+01 -5.4716e+01 -5.2146e+01 -6.2909e+01 -5.3247e+01 -5.4690e+01 -5.2167e+01 -6.2917e+01 -5.3222e+01 -5.4657e+01 -5.2188e+01 -6.2923e+01 -5.3197e+01 -5.4624e+01 -5.2208e+01 -6.2929e+01 -5.3172e+01 -5.4592e+01 -5.2228e+01 -6.2934e+01 -5.3148e+01 -5.4560e+01 -5.2248e+01 -6.2939e+01 -5.3123e+01 -5.4529e+01 -5.2268e+01 -6.2942e+01 -5.3099e+01 -5.4497e+01 -5.2288e+01 -6.2945e+01 -5.3075e+01 -5.4467e+01 -5.2332e+01 -6.2947e+01 -5.3052e+01 -5.4436e+01 -5.2379e+01 -6.2949e+01 -5.3028e+01 -5.4406e+01 -5.2426e+01 -6.2950e+01 -5.3005e+01 -5.4377e+01 -5.2473e+01 -6.2950e+01 -5.2982e+01 -5.4348e+01 -5.2519e+01 -6.2949e+01 -5.2959e+01 -5.4319e+01 -5.2564e+01 -6.2948e+01 -5.2929e+01 -5.4290e+01 -5.2609e+01 -6.2946e+01 -5.2898e+01 -5.4257e+01 -5.2653e+01 -6.2944e+01 -5.2868e+01 -5.4221e+01 -5.2697e+01 -6.2933e+01 -5.2839e+01 -5.4186e+01 -5.2741e+01 -6.2921e+01 -5.2809e+01 -5.4151e+01 -5.2784e+01 -6.2909e+01 -5.2780e+01 -5.4117e+01 -5.2826e+01 -6.2897e+01 -5.2752e+01 -5.4083e+01 -5.2868e+01 -6.2884e+01 -5.2724e+01 -5.4050e+01 -5.2909e+01 -6.2871e+01 -5.2696e+01 -5.4017e+01 -5.2950e+01 -6.2857e+01 -5.2668e+01 -5.3985e+01 -5.2990e+01 -6.2843e+01 -5.2641e+01 -5.3953e+01 -5.3030e+01 -6.2829e+01 -5.2614e+01 -5.3921e+01 -5.3069e+01 -6.2814e+01 -5.2584e+01 -5.3910e+01 -5.3107e+01 -6.2799e+01 -5.2549e+01 -5.3924e+01 -5.3146e+01 -6.2784e+01 -5.2516e+01 -5.3938e+01 -5.3183e+01 -6.2768e+01 -5.2482e+01 -5.3951e+01 -5.3220e+01 -6.2752e+01 -5.2450e+01 -5.3964e+01 -5.3257e+01 -6.2735e+01 -5.2417e+01 -5.3976e+01 -5.3293e+01 -6.2718e+01 -5.2385e+01 -5.3989e+01 -5.3329e+01 -6.2701e+01 -5.2354e+01 -5.4001e+01 -5.3364e+01 -6.2683e+01 -5.2323e+01 -5.4013e+01 -5.3433e+01 -6.2665e+01 -5.2293e+01 -5.4025e+01 -5.3503e+01 -6.2647e+01 -5.2263e+01 -5.4036e+01 -5.3573e+01 -6.2628e+01 -5.2233e+01 -5.4047e+01 -5.3641e+01 -6.2609e+01 -5.2204e+01 -5.4058e+01 -5.3708e+01 -6.2590e+01 -5.2175e+01 -5.4069e+01 -5.3775e+01 -6.2570e+01 -5.2146e+01 -5.4079e+01 -5.3840e+01 -6.2550e+01 -5.2118e+01 -5.4089e+01 -5.3904e+01 -6.2530e+01 -5.2091e+01 -5.4096e+01 -5.3968e+01 -6.2510e+01 -5.2064e+01 -5.4098e+01 -5.4030e+01 -6.2489e+01 -5.2037e+01 -5.4099e+01 -5.4092e+01 -6.2467e+01 -5.2010e+01 -5.4101e+01 -5.4153e+01 -6.2446e+01 -5.1984e+01 -5.4102e+01 -5.4213e+01 -6.2424e+01 -5.1958e+01 -5.4104e+01 -5.4271e+01 -6.2402e+01 -5.1933e+01 -5.4105e+01 -5.4329e+01 -6.2380e+01 -5.1908e+01 -5.4106e+01 -5.4386e+01 -6.2357e+01 -5.1883e+01 -5.4108e+01 -5.4443e+01 -6.2334e+01 -5.1857e+01 -5.4109e+01 -5.4498e+01 -6.2311e+01 -5.1824e+01 -5.4110e+01 -5.4552e+01 -6.2288e+01 -5.1793e+01 -5.4111e+01 -5.4606e+01 -6.2264e+01 -5.1762e+01 -5.4111e+01 -5.4658e+01 -6.2240e+01 -5.1731e+01 -5.4112e+01 -5.4710e+01 -6.2216e+01 -5.1701e+01 -5.4113e+01 -5.4761e+01 -6.2192e+01 -5.1672e+01 -5.4113e+01 -5.4811e+01 -6.2167e+01 -5.1643e+01 -5.4114e+01 -5.4860e+01 -6.2142e+01 -5.1614e+01 -5.4114e+01 -5.4909e+01 -6.2117e+01 -5.1586e+01 -5.4114e+01 -5.4956e+01 -6.2091e+01 -5.1558e+01 -5.4115e+01 -5.5003e+01 -6.2066e+01 -5.1531e+01 -5.4115e+01 -5.5049e+01 -6.2040e+01 -5.1523e+01 -5.4115e+01 -5.5094e+01 -6.2014e+01 -5.1541e+01 -5.4114e+01 -5.5138e+01 -6.1988e+01 -5.1558e+01 -5.4114e+01 -5.5182e+01 -6.1961e+01 -5.1576e+01 -5.4114e+01 -5.5225e+01 -6.1934e+01 -5.1593e+01 -5.4113e+01 -5.5266e+01 -6.1908e+01 -5.1610e+01 -5.4113e+01 -5.5308e+01 -6.1879e+01 -5.1626e+01 -5.4112e+01 -5.5348e+01 -6.1843e+01 -5.1641e+01 -5.4111e+01 -5.5388e+01 -6.1808e+01 -5.1650e+01 -5.4110e+01 -5.5426e+01 -6.1773e+01 -5.1658e+01 -5.4109e+01 -5.5464e+01 -6.1738e+01 -5.1666e+01 -5.4108e+01 -5.5502e+01 -6.1702e+01 -5.1674e+01 -5.4107e+01 -5.5538e+01 -6.1667e+01 -5.1682e+01 -5.4105e+01 -5.5574e+01 -6.1632e+01 -5.1690e+01 -5.4104e+01 -5.5609e+01 -6.1597e+01 -5.1698e+01 -5.4102e+01 -5.5642e+01 -6.1561e+01 -5.1705e+01 -5.4100e+01 -5.5668e+01 -6.1526e+01 -5.1713e+01 -5.4099e+01 -5.5693e+01 -6.1491e+01 -5.1721e+01 -5.4097e+01 -5.5718e+01 -6.1455e+01 -5.1728e+01 -5.4094e+01 -5.5742e+01 -6.1420e+01 -5.1736e+01 -5.4092e+01 -5.5757e+01 -6.1385e+01 -5.1740e+01 -5.4090e+01 -5.5773e+01 -6.1350e+01 -5.1739e+01 -5.4087e+01 -5.5788e+01 -6.1314e+01 -5.1739e+01 -5.4085e+01 -5.5803e+01 -6.1279e+01 -5.1738e+01 -5.4082e+01 -5.5817e+01 -6.1244e+01 -5.1738e+01 -5.4079e+01 -5.5831e+01 -6.1205e+01 -5.1738e+01 -5.4074e+01 -5.5845e+01 -6.1161e+01 -5.1737e+01 -5.4063e+01 -5.5859e+01 -6.1118e+01 -5.1737e+01 -5.4052e+01 -5.5872e+01 -6.1076e+01 -5.1737e+01 -5.4041e+01 -5.5885e+01 -6.1033e+01 -5.1737e+01 -5.4030e+01 -5.5897e+01 -6.0991e+01 -5.1737e+01 -5.4017e+01 -5.5910e+01 -6.0948e+01 -5.1759e+01 -5.3998e+01 -5.5922e+01 -6.0906e+01 -5.1803e+01 -5.3980e+01 -5.5933e+01 -6.0864e+01 -5.1847e+01 -5.3962e+01 -5.5945e+01 -6.0823e+01 -5.1891e+01 -5.3951e+01 -5.5956e+01 -6.0781e+01 -5.1933e+01 -5.3978e+01 -5.5967e+01 -6.0740e+01 -5.1976e+01 -5.4004e+01 -5.5977e+01 -6.0698e+01 -5.2017e+01 -5.4031e+01 -5.5987e+01 -6.0657e+01 -5.2058e+01 -5.4056e+01 -5.5997e+01 -6.0616e+01 -5.2096e+01 -5.4081e+01 -5.6006e+01 -6.0576e+01 -5.2128e+01 -5.4106e+01 -5.6015e+01 -6.0535e+01 -5.2159e+01 -5.4131e+01 -5.6047e+01 -6.0495e+01 -5.2190e+01 -5.4154e+01 -5.6091e+01 -6.0454e+01 -5.2221e+01 -5.4178e+01 -5.6128e+01 -6.0414e+01 -5.2251e+01 -5.4201e+01 -5.6163e+01 -6.0374e+01 -5.2281e+01 -5.4224e+01 -5.6198e+01 -6.0334e+01 -5.2310e+01 -5.4246e+01 -5.6233e+01 -6.0294e+01 -5.2339e+01 -5.4268e+01 -5.6266e+01 -6.0255e+01 -5.2368e+01 -5.4289e+01 -5.6300e+01 -6.0215e+01 -5.2396e+01 -5.4310e+01 -5.6333e+01 -6.0176e+01 -5.2424e+01 -5.4324e+01 -5.6365e+01 -6.0137e+01 -5.2452e+01 -5.4336e+01 -5.6396e+01 -6.0098e+01 -5.2479e+01 -5.4348e+01 -5.6427e+01 -6.0059e+01 -5.2505e+01 -5.4360e+01 -5.6458e+01 -6.0016e+01 -5.2532e+01 -5.4372e+01 -5.6488e+01 -5.9969e+01 -5.2550e+01 -5.4383e+01 -5.6517e+01 -5.9923e+01 -5.2567e+01 -5.4388e+01 -5.6546e+01 -5.9877e+01 -5.2585e+01 -5.4391e+01 -5.6574e+01 -5.9831e+01 -5.2602e+01 -5.4391e+01 -5.6602e+01 -5.9786e+01 -5.2619e+01 -5.4386e+01 -5.6629e+01 -5.9741e+01 -5.2636e+01 -5.4381e+01 -5.6655e+01 -5.9732e+01 -5.2653e+01 -5.4377e+01 -5.6681e+01 -5.9732e+01 -5.2670e+01 -5.4372e+01 -5.6707e+01 -5.9731e+01 -5.2686e+01 -5.4368e+01 -5.6732e+01 -5.9730e+01 -5.2702e+01 -5.4360e+01 -5.6756e+01 -5.9728e+01 -5.2718e+01 -5.4348e+01 -5.6780e+01 -5.9726e+01 -5.2734e+01 -5.4336e+01 -5.6800e+01 -5.9724e+01 -5.2749e+01 -5.4318e+01 -5.6815e+01 -5.9721e+01 -5.2765e+01 -5.4293e+01 -5.6830e+01 -5.9718e+01 -5.2780e+01 -5.4266e+01 -5.6844e+01 -5.9715e+01 -5.2795e+01 -5.4241e+01 -5.6858e+01 -5.9711e+01 -5.2809e+01 -5.4216e+01 -5.6871e+01 -5.9707e+01 -5.2824e+01 -5.4191e+01 -5.6880e+01 -5.9702e+01 -5.2838e+01 -5.4167e+01 -5.6885e+01 -5.9697e+01 -5.2851e+01 -5.4144e+01 -5.6890e+01 -5.9692e+01 -5.2856e+01 -5.4121e+01 -5.6895e+01 -5.9687e+01 -5.2854e+01 -5.4099e+01 -5.6899e+01 -5.9681e+01 -5.2851e+01 -5.4077e+01 -5.6899e+01 -5.9675e+01 -5.2850e+01 -5.4056e+01 -5.6895e+01 -5.9668e+01 -5.2848e+01 -5.4035e+01 -5.6891e+01 -5.9661e+01 -5.2846e+01 -5.4015e+01 -5.6888e+01 -5.9654e+01 -5.2845e+01 -5.3995e+01 -5.6884e+01 -5.9647e+01 -5.2843e+01 -5.3976e+01 -5.6880e+01 -5.9639e+01 -5.2842e+01 -5.3957e+01 -5.6877e+01 -5.9631e+01 -5.2841e+01 -5.3939e+01 -5.6873e+01 -5.9622e+01 -5.2840e+01 -5.3921e+01 -5.6870e+01 -5.9613e+01 -5.2839e+01 -5.3903e+01 -5.6866e+01 -5.9604e+01 -5.2838e+01 -5.3887e+01 -5.6862e+01 -5.9595e+01 -5.2837e+01 -5.3915e+01 -5.6859e+01 -5.9585e+01 -5.2836e+01 -5.3942e+01 -5.6855e+01 -5.9575e+01 -5.2836e+01 -5.3969e+01 -5.6851e+01 -5.9565e+01 -5.2835e+01 -5.3996e+01 -5.6848e+01 -5.9555e+01 -5.2835e+01 -5.4023e+01 -5.6844e+01 -5.9544e+01 -5.2834e+01 -5.4049e+01 -5.6840e+01 -5.9533e+01 -5.2834e+01 -5.4075e+01 -5.6836e+01 -5.9521e+01 -5.2833e+01 -5.4100e+01 -5.6832e+01 -5.9509e+01 -5.2825e+01 -5.4125e+01 -5.6828e+01 -5.9494e+01 -5.2817e+01 -5.4150e+01 -5.6824e+01 -5.9473e+01 -5.2809e+01 -5.4175e+01 -5.6820e+01 -5.9453e+01 -5.2801e+01 -5.4199e+01 -5.6815e+01 -5.9433e+01 -5.2793e+01 -5.4223e+01 -5.6811e+01 -5.9413e+01 -5.2786e+01 -5.4246e+01 -5.6806e+01 -5.9392e+01 -5.2779e+01 -5.4270e+01 -5.6802e+01 -5.9372e+01 -5.2772e+01 -5.4292e+01 -5.6797e+01 -5.9351e+01 -5.2766e+01 -5.4315e+01 -5.6787e+01 -5.9330e+01 -5.2759e+01 -5.4337e+01 -5.6774e+01 -5.9310e+01 -5.2753e+01 -5.4359e+01 -5.6762e+01 -5.9289e+01 -5.2745e+01 -5.4380e+01 -5.6749e+01 -5.9268e+01 -5.2731e+01 -5.4401e+01 -5.6737e+01 -5.9247e+01 -5.2717e+01 -5.4414e+01 -5.6724e+01 -5.9226e+01 -5.2704e+01 -5.4426e+01 -5.6712e+01 -5.9205e+01 -5.2691e+01 -5.4439e+01 -5.6696e+01 -5.9184e+01 -5.2674e+01 -5.4451e+01 -5.6676e+01 -5.9162e+01 -5.2653e+01 -5.4463e+01 -5.6656e+01 -5.9141e+01 -5.2633e+01 -5.4475e+01 -5.6636e+01 -5.9162e+01 -5.2614e+01 -5.4487e+01 -5.6609e+01 -5.9184e+01 -5.2596e+01 -5.4499e+01 -5.6582e+01 -5.9206e+01 -5.2622e+01 -5.4510e+01 -5.6556e+01 -5.9227e+01 -5.2648e+01 -5.4522e+01 -5.6530e+01 -5.9247e+01 -5.2674e+01 -5.4533e+01 -5.6504e+01 -5.9267e+01 -5.2699e+01 -5.4544e+01 -5.6479e+01 -5.9286e+01 -5.2724e+01 -5.4554e+01 -5.6454e+01 -5.9304e+01 -5.2749e+01 -5.4565e+01 -5.6429e+01 -5.9322e+01 -5.2774e+01 -5.4575e+01 -5.6405e+01 -5.9339e+01 -5.2798e+01 -5.4585e+01 -5.6381e+01 -5.9355e+01 -5.2822e+01 -5.4595e+01 -5.6353e+01 -5.9370e+01 -5.2846e+01 -5.4601e+01 -5.6322e+01 -5.9385e+01 -5.2870e+01 -5.4602e+01 -5.6296e+01 -5.9399e+01 -5.2893e+01 -5.4604e+01 -5.6300e+01 -5.9413e+01 -5.2916e+01 -5.4606e+01 -5.6299e+01 -5.9426e+01 -5.2939e+01 -5.4607e+01 -5.6297e+01 -5.9438e+01 -5.2961e+01 -5.4609e+01 -5.6296e+01 -5.9450e+01 -5.2983e+01 -5.4610e+01 -5.6295e+01 -5.9461e+01 -5.3005e+01 -5.4612e+01 -5.6294e+01 -5.9471e+01 -5.3027e+01 -5.4613e+01 -5.6293e+01 -5.9481e+01 -5.3048e+01 -5.4615e+01 -5.6293e+01 -5.9490e+01 -5.3069e+01 -5.4616e+01 -5.6292e+01 -5.9499e+01 -5.3090e+01 -5.4617e+01 -5.6292e+01 -5.9500e+01 -5.3110e+01 -5.4612e+01 -5.6291e+01 -5.9500e+01 -5.3131e+01 -5.4605e+01 -5.6284e+01 -5.9499e+01 -5.3150e+01 -5.4599e+01 -5.6276e+01 -5.9505e+01 -5.3170e+01 -5.4592e+01 -5.6268e+01 -5.9548e+01 -5.3189e+01 -5.4586e+01 -5.6260e+01 -5.9590e+01 -5.3208e+01 -5.4580e+01 -5.6253e+01 -5.9627e+01 -5.3227e+01 -5.4574e+01 -5.6246e+01 -5.9659e+01 -5.3245e+01 -5.4568e+01 -5.6239e+01 -5.9691e+01 -5.3263e+01 -5.4562e+01 -5.6232e+01 -5.9721e+01 -5.3281e+01 -5.4556e+01 -5.6226e+01 -5.9751e+01 -5.3299e+01 -5.4550e+01 -5.6220e+01 -5.9780e+01 -5.3316e+01 -5.4545e+01 -5.6214e+01 -5.9808e+01 -5.3333e+01 -5.4536e+01 -5.6208e+01 -5.9835e+01 -5.3350e+01 -5.4522e+01 -5.6202e+01 -5.9862e+01 -5.3366e+01 -5.4509e+01 -5.6196e+01 -5.9888e+01 -5.3376e+01 -5.4496e+01 -5.6190e+01 -5.9913e+01 -5.3384e+01 -5.4483e+01 -5.6185e+01 -5.9937e+01 -5.3392e+01 -5.4471e+01 -5.6180e+01 -5.9961e+01 -5.3399e+01 -5.4459e+01 -5.6174e+01 -5.9984e+01 -5.3407e+01 -5.4446e+01 -5.6169e+01 -6.0006e+01 -5.3414e+01 -5.4434e+01 -5.6164e+01 -6.0028e+01 -5.3422e+01 -5.4423e+01 -5.6159e+01 -6.0048e+01 -5.3427e+01 -5.4411e+01 -5.6154e+01 -6.0069e+01 -5.3426e+01 -5.4400e+01 -5.6149e+01 -6.0088e+01 -5.3425e+01 -5.4389e+01 -5.6144e+01 -6.0107e+01 -5.3424e+01 -5.4377e+01 -5.6139e+01 -6.0125e+01 -5.3424e+01 -5.4367e+01 -5.6171e+01 -6.0142e+01 -5.3423e+01 -5.4356e+01 -5.6202e+01 -6.0158e+01 -5.3423e+01 -5.4345e+01 -5.6233e+01 -6.0174e+01 -5.3422e+01 -5.4335e+01 -5.6264e+01 -6.0190e+01 -5.3422e+01 -5.4324e+01 -5.6294e+01 -6.0204e+01 -5.3422e+01 -5.4314e+01 -5.6324e+01 -6.0218e+01 -5.3421e+01 -5.4304e+01 -5.6353e+01 -6.0232e+01 -5.3421e+01 -5.4294e+01 -5.6381e+01 -6.0244e+01 -5.3421e+01 -5.4284e+01 -5.6410e+01 -6.0257e+01 -5.3420e+01 -5.4274e+01 -5.6437e+01 -6.0268e+01 -5.3420e+01 -5.4264e+01 -5.6465e+01 -6.0279e+01 -5.3420e+01 -5.4254e+01 -5.6492e+01 -6.0289e+01 -5.3419e+01 -5.4245e+01 -5.6518e+01 -6.0299e+01 -5.3419e+01 -5.4235e+01 -5.6544e+01 -6.0308e+01 -5.3419e+01 -5.4222e+01 -5.6569e+01 -6.0316e+01 -5.3418e+01 -5.4205e+01 -5.6594e+01 -6.0324e+01 -5.3418e+01 -5.4188e+01 -5.6619e+01 -6.0331e+01 -5.3418e+01 -5.4171e+01 -5.6643e+01 -6.0338e+01 -5.3417e+01 -5.4155e+01 -5.6667e+01 -6.0344e+01 -5.3417e+01 -5.4139e+01 -5.6690e+01 -6.0350e+01 -5.3417e+01 -5.4122e+01 -5.6712e+01 -6.0355e+01 -5.3416e+01 -5.4107e+01 -5.6735e+01 -6.0359e+01 -5.3416e+01 -5.4091e+01 -5.6757e+01 -6.0363e+01 -5.3415e+01 -5.4076e+01 -5.6778e+01 -6.0367e+01 -5.3414e+01 -5.4060e+01 -5.6799e+01 -6.0370e+01 -5.3414e+01 -5.4045e+01 -5.6819e+01 -6.0372e+01 -5.3413e+01 -5.4030e+01 -5.6839e+01 -6.0374e+01 -5.3412e+01 -5.4016e+01 -5.6859e+01 -6.0375e+01 -5.3412e+01 -5.4001e+01 -5.6878e+01 -6.0376e+01 -5.3411e+01 -5.3987e+01 -5.6896e+01 -6.0377e+01 -5.3410e+01 -5.3973e+01 -5.6914e+01 -6.0376e+01 -5.3409e+01 -5.3959e+01 -5.6932e+01 -6.0376e+01 -5.3408e+01 -5.3945e+01 -5.6949e+01 -6.0375e+01 -5.3407e+01 -5.3931e+01 -5.6962e+01 -6.0373e+01 -5.3406e+01 -5.3918e+01 -5.6971e+01 -6.0371e+01 -5.3405e+01 -5.3904e+01 -5.6979e+01 -6.0368e+01 -5.3403e+01 -5.3891e+01 -5.6987e+01 -6.0365e+01 -5.3402e+01 -5.3878e+01 -5.6995e+01 -6.0362e+01 -5.3400e+01 -5.3865e+01 -5.7002e+01 -6.0358e+01 -5.3399e+01 -5.3852e+01 -5.7009e+01 -6.0354e+01 -5.3397e+01 -5.3839e+01 -5.7016e+01 -6.0349e+01 -5.3396e+01 -5.3826e+01 -5.7023e+01 -6.0344e+01 -5.3394e+01 -5.3814e+01 -5.7029e+01 -6.0338e+01 -5.3392e+01 -5.3801e+01 -5.7035e+01 -6.0332e+01 -5.3390e+01 -5.3789e+01 -5.7041e+01 -6.0326e+01 -5.3388e+01 -5.3777e+01 -5.7047e+01 -6.0319e+01 -5.3386e+01 -5.3764e+01 -5.7052e+01 -6.0312e+01 -5.3384e+01 -5.3752e+01 -5.7057e+01 -6.0304e+01 -5.3382e+01 -5.3740e+01 -5.7062e+01 -6.0296e+01 -5.3380e+01 -5.3728e+01 -5.7067e+01 -6.0287e+01 -5.3378e+01 -5.3716e+01 -5.7071e+01 -6.0279e+01 -5.3375e+01 -5.3704e+01 -5.7075e+01 -6.0269e+01 -5.3373e+01 -5.3693e+01 -5.7079e+01 -6.0260e+01 -5.3370e+01 -5.3681e+01 -5.7082e+01 -6.0250e+01 -5.3367e+01 -5.3669e+01 -5.7086e+01 -6.0240e+01 -5.3364e+01 -5.3658e+01 -5.7089e+01 -6.0229e+01 -5.3362e+01 -5.3646e+01 -5.7091e+01 -6.0218e+01 -5.3359e+01 -5.3635e+01 -5.7094e+01 -6.0237e+01 -5.3356e+01 -5.3623e+01 -5.7096e+01 -6.0270e+01 -5.3352e+01 -5.3612e+01 -5.7098e+01 -6.0301e+01 -5.3349e+01 -5.3601e+01 -5.7100e+01 -6.0332e+01 -5.3346e+01 -5.3590e+01 -5.7101e+01 -6.0361e+01 -5.3343e+01 -5.3578e+01 -5.7102e+01 -6.0390e+01 -5.3339e+01 -5.3567e+01 -5.7103e+01 -6.0417e+01 -5.3332e+01 -5.3556e+01 -5.7104e+01 -6.0444e+01 -5.3320e+01 -5.3545e+01 -5.7104e+01 -6.0470e+01 -5.3309e+01 -5.3534e+01 -5.7104e+01 -6.0495e+01 -5.3297e+01 -5.3523e+01 -5.7104e+01 -6.0519e+01 -5.3286e+01 -5.3512e+01 -5.7103e+01 -6.0542e+01 -5.3274e+01 -5.3501e+01 -5.7103e+01 -6.0564e+01 -5.3255e+01 -5.3490e+01 -5.7102e+01 -6.0585e+01 -5.3236e+01 -5.3479e+01 -5.7100e+01 -6.0605e+01 -5.3217e+01 -5.3468e+01 -5.7099e+01 -6.0625e+01 -5.3199e+01 -5.3457e+01 -5.7097e+01 -6.0644e+01 -5.3181e+01 -5.3447e+01 -5.7095e+01 -6.0662e+01 -5.3164e+01 -5.3436e+01 -5.7093e+01 -6.0679e+01 -5.3146e+01 -5.3425e+01 -5.7091e+01 -6.0695e+01 -5.3129e+01 -5.3414e+01 -5.7082e+01 -6.0711e+01 -5.3112e+01 -5.3404e+01 -5.7072e+01 -6.0725e+01 -5.3095e+01 -5.3393e+01 -5.7061e+01 -6.0739e+01 -5.3079e+01 -5.3382e+01 -5.7050e+01 -6.0753e+01 -5.3063e+01 -5.3371e+01 -5.7039e+01 -6.0765e+01 -5.3047e+01 -5.3361e+01 -5.7028e+01 -6.0777e+01 -5.3031e+01 -5.3350e+01 -5.7017e+01 -6.0788e+01 -5.3015e+01 -5.3339e+01 -5.7006e+01 -6.0798e+01 -5.3000e+01 -5.3329e+01 -5.6994e+01 -6.0807e+01 -5.2984e+01 -5.3318e+01 -5.6983e+01 -6.0816e+01 -5.2969e+01 -5.3307e+01 -5.6972e+01 -6.0824e+01 -5.2951e+01 -5.3297e+01 -5.6960e+01 -6.0832e+01 -5.2929e+01 -5.3286e+01 -5.6949e+01 -6.0839e+01 -5.2906e+01 -5.3275e+01 -5.6938e+01 -6.0845e+01 -5.2884e+01 -5.3265e+01 -5.6926e+01 -6.0850e+01 -5.2863e+01 -5.3254e+01 -5.6914e+01 -6.0855e+01 -5.2842e+01 -5.3244e+01 -5.6902e+01 -6.0859e+01 -5.2821e+01 -5.3233e+01 -5.6891e+01 -6.0863e+01 -5.2800e+01 -5.3222e+01 -5.6879e+01 -6.0866e+01 -5.2780e+01 -5.3212e+01 -5.6865e+01 -6.0868e+01 -5.2760e+01 -5.3201e+01 -5.6845e+01 -6.0870e+01 -5.2740e+01 -5.3190e+01 -5.6825e+01 -6.0871e+01 -5.2721e+01 -5.3180e+01 -5.6806e+01 -6.0871e+01 -5.2702e+01 -5.3169e+01 -5.6786e+01 -6.0871e+01 -5.2683e+01 -5.3152e+01 -5.6766e+01 -6.0871e+01 -5.2665e+01 -5.3134e+01 -5.6747e+01 -6.0869e+01 -5.2643e+01 -5.3116e+01 -5.6727e+01 -6.0866e+01 -5.2617e+01 -5.3098e+01 -5.6708e+01 -6.0856e+01 -5.2591e+01 -5.3080e+01 -5.6689e+01 -6.0845e+01 -5.2566e+01 -5.3062e+01 -5.6670e+01 -6.0834e+01 -5.2542e+01 -5.3044e+01 -5.6651e+01 -6.0823e+01 -5.2518e+01 -5.3027e+01 -5.6632e+01 -6.0812e+01 -5.2494e+01 -5.3010e+01 -5.6613e+01 -6.0800e+01 -5.2471e+01 -5.2993e+01 -5.6594e+01 -6.0787e+01 -5.2448e+01 -5.2976e+01 -5.6575e+01 -6.0775e+01 -5.2425e+01 -5.2959e+01 -5.6557e+01 -6.0762e+01 -5.2403e+01 -5.2943e+01 -5.6538e+01 -6.0749e+01 -5.2381e+01 -5.2926e+01 -5.6519e+01 -6.0735e+01 -5.2360e+01 -5.2910e+01 -5.6501e+01 -6.0722e+01 -5.2339e+01 -5.2894e+01 -5.6482e+01 -6.0708e+01 -5.2318e+01 -5.2878e+01 -5.6464e+01 -6.0693e+01 -5.2298e+01 -5.2862e+01 -5.6446e+01 -6.0678e+01 -5.2278e+01 -5.2846e+01 -5.6421e+01 -6.0664e+01 -5.2258e+01 -5.2831e+01 -5.6416e+01 -6.0648e+01 -5.2238e+01 -5.2815e+01 -5.6426e+01 -6.0633e+01 -5.2219e+01 -5.2800e+01 -5.6436e+01 -6.0617e+01 -5.2200e+01 -5.2785e+01 -5.6446e+01 -6.0601e+01 -5.2182e+01 -5.2770e+01 -5.6456e+01 -6.0585e+01 -5.2163e+01 -5.2755e+01 -5.6466e+01 -6.0568e+01 -5.2145e+01 -5.2740e+01 -5.6475e+01 -6.0551e+01 -5.2128e+01 -5.2723e+01 -5.6484e+01 -6.0534e+01 -5.2110e+01 -5.2701e+01 -5.6493e+01 -6.0516e+01 -5.2093e+01 -5.2678e+01 -5.6501e+01 -6.0499e+01 -5.2076e+01 -5.2656e+01 -5.6509e+01 -6.0481e+01 -5.2059e+01 -5.2635e+01 -5.6517e+01 -6.0463e+01 -5.2043e+01 -5.2613e+01 -5.6525e+01 -6.0444e+01 -5.2027e+01 -5.2592e+01 -5.6532e+01 -6.0426e+01 -5.2011e+01 -5.2571e+01 -5.6540e+01 -6.0407e+01 -5.1995e+01 -5.2551e+01 -5.6547e+01 -6.0388e+01 -5.1979e+01 -5.2530e+01 -5.6553e+01 -6.0368e+01 -5.1964e+01 -5.2510e+01 -5.6560e+01 -6.0349e+01 -5.1949e+01 -5.2490e+01 -5.6566e+01 -6.0329e+01 -5.1934e+01 -5.2471e+01 -5.6572e+01 -6.0309e+01 -5.1919e+01 -5.2452e+01 -5.6577e+01 -6.0289e+01 -5.1904e+01 -5.2432e+01 -5.6583e+01 -6.0265e+01 -5.1890e+01 -5.2414e+01 -5.6588e+01 -6.0237e+01 -5.1873e+01 -5.2395e+01 -5.6592e+01 -6.0208e+01 -5.1851e+01 -5.2377e+01 -5.6597e+01 -6.0180e+01 -5.1830e+01 -5.2358e+01 -5.6601e+01 -6.0151e+01 -5.1809e+01 -5.2340e+01 -5.6605e+01 -6.0122e+01 -5.1788e+01 -5.2323e+01 -5.6609e+01 -6.0094e+01 -5.1767e+01 -5.2305e+01 -5.6613e+01 -6.0065e+01 -5.1747e+01 -5.2288e+01 -5.6616e+01 -6.0036e+01 -5.1727e+01 -5.2270e+01 -5.6619e+01 -6.0008e+01 -5.1708e+01 -5.2253e+01 -5.6621e+01 -5.9979e+01 -5.1689e+01 -5.2237e+01 -5.6624e+01 -5.9950e+01 -5.1670e+01 -5.2220e+01 -5.6626e+01 -5.9922e+01 -5.1651e+01 -5.2204e+01 -5.6628e+01 -5.9893e+01 -5.1633e+01 -5.2186e+01 -5.6630e+01 -5.9864e+01 -5.1615e+01 -5.2162e+01 -5.6631e+01 -5.9836e+01 -5.1597e+01 -5.2138e+01 -5.6632e+01 -5.9807e+01 -5.1580e+01 -5.2115e+01 -5.6633e+01 -5.9820e+01 -5.1605e+01 -5.2092e+01 -5.6634e+01 -5.9835e+01 -5.1632e+01 -5.2069e+01 -5.6634e+01 -5.9845e+01 -5.1659e+01 -5.2047e+01 -5.6634e+01 -5.9851e+01 -5.1685e+01 -5.2025e+01 -5.6634e+01 -5.9857e+01 -5.1711e+01 -5.2003e+01 -5.6633e+01 -5.9862e+01 -5.1737e+01 -5.1982e+01 -5.6633e+01 -5.9867e+01 -5.1762e+01 -5.2004e+01 -5.6632e+01 -5.9871e+01 -5.1787e+01 -5.2028e+01 -5.6631e+01 -5.9875e+01 -5.1811e+01 -5.2051e+01 -5.6629e+01 -5.9878e+01 -5.1835e+01 -5.2073e+01 -5.6628e+01 -5.9881e+01 -5.1859e+01 -5.2095e+01 -5.6626e+01 -5.9883e+01 -5.1888e+01 -5.2117e+01 -5.6624e+01 -5.9885e+01 -5.1955e+01 -5.2139e+01 -5.6621e+01 -5.9886e+01 -5.2022e+01 -5.2160e+01 -5.6619e+01 -5.9887e+01 -5.2087e+01 -5.2181e+01 -5.6616e+01 -5.9888e+01 -5.2152e+01 -5.2201e+01 -5.6613e+01 -5.9888e+01 -5.2215e+01 -5.2221e+01 -5.6610e+01 -5.9888e+01 -5.2277e+01 -5.2241e+01 -5.6606e+01 -5.9888e+01 -5.2339e+01 -5.2260e+01 -5.6602e+01 -5.9910e+01 -5.2399e+01 -5.2279e+01 -5.6598e+01 -5.9953e+01 -5.2498e+01 -5.2289e+01 -5.6594e+01 -5.9995e+01 -5.2601e+01 -5.2300e+01 -5.6583e+01 -6.0036e+01 -5.2702e+01 -5.2310e+01 -5.6571e+01 -6.0075e+01 -5.2801e+01 -5.2321e+01 -5.6558e+01 -6.0114e+01 -5.2899e+01 -5.2331e+01 -5.6546e+01 -6.0152e+01 -5.2995e+01 -5.2341e+01 -5.6533e+01 -6.0188e+01 -5.3089e+01 -5.2351e+01 -5.6520e+01 -6.0224e+01 -5.3183e+01 -5.2361e+01 -5.6508e+01 -6.0259e+01 -5.3274e+01 -5.2370e+01 -5.6495e+01 -6.0292e+01 -5.3364e+01 -5.2380e+01 -5.6482e+01 -6.0325e+01 -5.3453e+01 -5.2389e+01 -5.6469e+01 -6.0357e+01 -5.3540e+01 -5.2398e+01 -5.6457e+01 -6.0388e+01 -5.3626e+01 -5.2407e+01 -5.6444e+01 -6.0417e+01 -5.3710e+01 -5.2416e+01 -5.6431e+01 -6.0446e+01 -5.3793e+01 -5.2424e+01 -5.6418e+01 -6.0474e+01 -5.3874e+01 -5.2433e+01 -5.6405e+01 -6.0502e+01 -5.3954e+01 -5.2441e+01 -5.6392e+01 -6.0528e+01 -5.4033e+01 -5.2449e+01 -5.6379e+01 -6.0553e+01 -5.4111e+01 -5.2453e+01 -5.6366e+01 -6.0578e+01 -5.4187e+01 -5.2453e+01 -5.6352e+01 -6.0601e+01 -5.4261e+01 -5.2453e+01 -5.6339e+01 -6.0624e+01 -5.4335e+01 -5.2453e+01 -5.6326e+01 -6.0638e+01 -5.4407e+01 -5.2453e+01 -5.6312e+01 -6.0651e+01 -5.4477e+01 -5.2446e+01 -5.6292e+01 -6.0664e+01 -5.4547e+01 -5.2438e+01 -5.6270e+01 -6.0676e+01 -5.4615e+01 -5.2431e+01 -5.6249e+01 -6.0687e+01 -5.4682e+01 -5.2423e+01 -5.6228e+01 -6.0698e+01 -5.4748e+01 -5.2416e+01 -5.6207e+01 -6.0709e+01 -5.4813e+01 -5.2409e+01 -5.6187e+01 -6.0718e+01 -5.4876e+01 -5.2402e+01 -5.6166e+01 -6.0727e+01 -5.4938e+01 -5.2396e+01 -5.6145e+01 -6.0736e+01 -5.4999e+01 -5.2389e+01 -5.6125e+01 -6.0744e+01 -5.5059e+01 -5.2383e+01 -5.6105e+01 -6.0772e+01 -5.5118e+01 -5.2370e+01 -5.6085e+01 -6.0823e+01 -5.5176e+01 -5.2356e+01 -5.6064e+01 -6.0873e+01 -5.5232e+01 -5.2342e+01 -5.6044e+01 -6.0953e+01 -5.5288e+01 -5.2329e+01 -5.6025e+01 -6.1045e+01 -5.5342e+01 -5.2316e+01 -5.6005e+01 -6.1135e+01 -5.5395e+01 -5.2304e+01 -5.5985e+01 -6.1223e+01 -5.5440e+01 -5.2291e+01 -5.5965e+01 -6.1309e+01 -5.5483e+01 -5.2279e+01 -5.5946e+01 -6.1393e+01 -5.5526e+01 -5.2268e+01 -5.5926e+01 -6.1476e+01 -5.5567e+01 -5.2256e+01 -5.5907e+01 -6.1557e+01 -5.5608e+01 -5.2245e+01 -5.5888e+01 -6.1636e+01 -5.5648e+01 -5.2234e+01 -5.5868e+01 -6.1713e+01 -5.5687e+01 -5.2223e+01 -5.5849e+01 -6.1789e+01 -5.5726e+01 -5.2213e+01 -5.5830e+01 -6.1863e+01 -5.5763e+01 -5.2203e+01 -5.5811e+01 -6.1936e+01 -5.5800e+01 -5.2192e+01 -5.5792e+01 -6.2007e+01 -5.5836e+01 -5.2183e+01 -5.5773e+01 -6.2076e+01 -5.5871e+01 -5.2173e+01 -5.5754e+01 -6.2143e+01 -5.5905e+01 -5.2164e+01 -5.5735e+01 -6.2209e+01 -5.5939e+01 -5.2154e+01 -5.5716e+01 -6.2274e+01 -5.5972e+01 -5.2145e+01 -5.5698e+01 -6.2337e+01 -5.6004e+01 -5.2136e+01 -5.5679e+01 -6.2398e+01 -5.6036e+01 -5.2128e+01 -5.5660e+01 -6.2458e+01 -5.6066e+01 -5.2119e+01 -5.5642e+01 -6.2517e+01 -5.6096e+01 -5.2111e+01 -5.5623e+01 -6.2574e+01 -5.6126e+01 -5.2102e+01 -5.5598e+01 -6.2629e+01 -5.6154e+01 -5.2094e+01 -5.5572e+01 -6.2683e+01 -5.6182e+01 -5.2086e+01 -5.5546e+01 -6.2736e+01 -5.6209e+01 -5.2079e+01 -5.5520e+01 -6.2787e+01 -5.6236e+01 -5.2071e+01 -5.5495e+01 -6.2837e+01 -5.6261e+01 -5.2063e+01 -5.5469e+01 -6.2886e+01 -5.6287e+01 -5.2056e+01 -5.5444e+01 -6.2933e+01 -5.6311e+01 -5.2049e+01 -5.5419e+01 -6.2979e+01 -5.6335e+01 -5.2042e+01 -5.5394e+01 -6.3023e+01 -5.6358e+01 -5.2034e+01 -5.5370e+01 -6.3067e+01 -5.6381e+01 -5.2028e+01 -5.5345e+01 -6.3109e+01 -5.6403e+01 -5.2021e+01 -5.5321e+01 -6.3149e+01 -5.6424e+01 -5.2014e+01 -5.5297e+01 -6.3189e+01 -5.6444e+01 -5.2007e+01 -5.5273e+01 -6.3227e+01 -5.6465e+01 -5.2001e+01 -5.5249e+01 -6.3264e+01 -5.6484e+01 -5.1994e+01 -5.5226e+01 -6.3300e+01 -5.6503e+01 -5.1988e+01 -5.5203e+01 -6.3334e+01 -5.6521e+01 -5.1981e+01 -5.5179e+01 -6.3368e+01 -5.6539e+01 -5.1975e+01 -5.5156e+01 -6.3400e+01 -5.6556e+01 -5.1969e+01 -5.5134e+01 -6.3431e+01 -5.6572e+01 -5.1963e+01 -5.5110e+01 -6.3461e+01 -5.6588e+01 -5.1957e+01 -5.5080e+01 -6.3490e+01 -5.6604e+01 -5.1951e+01 -5.5049e+01 -6.3518e+01 -5.6618e+01 -5.1945e+01 -5.5020e+01 -6.3545e+01 -5.6633e+01 -5.1939e+01 -5.4990e+01 -6.3570e+01 -5.6647e+01 -5.1926e+01 -5.4961e+01 -6.3595e+01 -5.6660e+01 -5.1928e+01 -5.4932e+01 -6.3618e+01 -5.6672e+01 -5.1959e+01 -5.4903e+01 -6.3641e+01 -5.6685e+01 -5.1990e+01 -5.4875e+01 -6.3662e+01 -5.6696e+01 -5.2020e+01 -5.4847e+01 -6.3683e+01 -5.6707e+01 -5.2050e+01 -5.4819e+01 -6.3702e+01 -5.6718e+01 -5.2079e+01 -5.4792e+01 -6.3721e+01 -5.6728e+01 -5.2108e+01 -5.4765e+01 -6.3738e+01 -5.6738e+01 -5.2136e+01 -5.4738e+01 -6.3755e+01 -5.6747e+01 -5.2164e+01 -5.4712e+01 -6.3771e+01 -5.6756e+01 -5.2192e+01 -5.4685e+01 -6.3785e+01 -5.6764e+01 -5.2219e+01 -5.4652e+01 -6.3799e+01 -5.6772e+01 -5.2246e+01 -5.4618e+01 -6.3812e+01 -5.6779e+01 -5.2273e+01 -5.4585e+01 -6.3824e+01 -5.6786e+01 -5.2299e+01 -5.4552e+01 -6.3835e+01 -5.6788e+01 -5.2324e+01 -5.4520e+01 -6.3845e+01 -5.6786e+01 -5.2349e+01 -5.4488e+01 -6.3855e+01 -5.6783e+01 -5.2374e+01 -5.4456e+01 -6.3863e+01 -5.6781e+01 -5.2399e+01 -5.4425e+01 -6.3871e+01 -5.6778e+01 -5.2423e+01 -5.4395e+01 -6.3878e+01 -5.6775e+01 -5.2446e+01 -5.4364e+01 -6.3884e+01 -5.6772e+01 -5.2469e+01 -5.4334e+01 -6.3889e+01 -5.6761e+01 -5.2492e+01 -5.4305e+01 -6.3894e+01 -5.6750e+01 -5.2515e+01 -5.4275e+01 -6.3897e+01 -5.6738e+01 -5.2537e+01 -5.4246e+01 -6.3900e+01 -5.6727e+01 -5.2558e+01 -5.4218e+01 -6.3903e+01 -5.6715e+01 -5.2580e+01 -5.4189e+01 -6.3904e+01 -5.6704e+01 -5.2601e+01 -5.4161e+01 -6.3905e+01 -5.6692e+01 -5.2621e+01 -5.4134e+01 -6.3905e+01 -5.6680e+01 -5.2641e+01 -5.4107e+01 -6.3904e+01 -5.6668e+01 -5.2661e+01 -5.4080e+01 -6.3903e+01 -5.6657e+01 -5.2680e+01 -5.4053e+01 -6.3900e+01 -5.6645e+01 -5.2699e+01 -5.4026e+01 -6.3898e+01 -5.6633e+01 -5.2718e+01 -5.4000e+01 -6.3894e+01 -5.6621e+01 -5.2736e+01 -5.3975e+01 -6.3890e+01 -5.6609e+01 -5.2754e+01 -5.3949e+01 -6.3885e+01 -5.6597e+01 -5.2772e+01 -5.3924e+01 -6.3880e+01 -5.6585e+01 -5.2789e+01 -5.3899e+01 -6.3868e+01 -5.6573e+01 -5.2806e+01 -5.3874e+01 -6.3858e+01 -5.6560e+01 -5.2822e+01 -5.3845e+01 -6.3888e+01 -5.6548e+01 -5.2838e+01 -5.3813e+01 -6.3916e+01 -5.6528e+01 -5.2854e+01 -5.3781e+01 -6.3944e+01 -5.6508e+01 -5.2870e+01 -5.3750e+01 -6.3970e+01 -5.6488e+01 -5.2885e+01 -5.3719e+01 -6.3996e+01 -5.6468e+01 -5.2899e+01 -5.3689e+01 -6.4013e+01 -5.6448e+01 -5.2914e+01 -5.3659e+01 -6.4029e+01 -5.6428e+01 -5.2928e+01 -5.3629e+01 -6.4044e+01 -5.6408e+01 -5.2942e+01 -5.3600e+01 -6.4057e+01 -5.6389e+01 -5.2955e+01 -5.3571e+01 -6.4070e+01 -5.6369e+01 -5.2968e+01 -5.3542e+01 -6.4083e+01 -5.6350e+01 -5.2981e+01 -5.3514e+01 -6.4094e+01 -5.6331e+01 -5.2994e+01 -5.3486e+01 -6.4105e+01 -5.6311e+01 -5.3006e+01 -5.3459e+01 -6.4115e+01 -5.6292e+01 -5.3018e+01 -5.3432e+01 -6.4124e+01 -5.6273e+01 -5.3029e+01 -5.3405e+01 -6.4132e+01 -5.6254e+01 -5.3040e+01 -5.3379e+01 -6.4140e+01 -5.6235e+01 -5.3051e+01 -5.3353e+01 -6.4147e+01 -5.6217e+01 -5.3062e+01 -5.3327e+01 -6.4153e+01 -5.6198e+01 -5.3070e+01 -5.3302e+01 -6.4155e+01 -5.6179e+01 -5.3072e+01 -5.3277e+01 -6.4152e+01 -5.6161e+01 -5.3074e+01 -5.3252e+01 -6.4148e+01 -5.6142e+01 -5.3076e+01 -5.3227e+01 -6.4144e+01 -5.6124e+01 -5.3078e+01 -5.3203e+01 -6.4139e+01 -5.6105e+01 -5.3079e+01 -5.3179e+01 -6.4134e+01 -5.6087e+01 -5.3081e+01 -5.3155e+01 -6.4129e+01 -5.6068e+01 -5.3082e+01 -5.3132e+01 -6.4123e+01 -5.6050e+01 -5.3084e+01 -5.3109e+01 -6.4116e+01 -5.6032e+01 -5.3085e+01 -5.3086e+01 -6.4109e+01 -5.6014e+01 -5.3111e+01 -5.3063e+01 -6.4101e+01 -5.5996e+01 -5.3157e+01 -5.3041e+01 -6.4094e+01 -5.5978e+01 -5.3201e+01 -5.3019e+01 -6.4085e+01 -5.5959e+01 -5.3243e+01 -5.2997e+01 -6.4076e+01 -5.5941e+01 -5.3278e+01 -5.2967e+01 -6.4067e+01 -5.5923e+01 -5.3312e+01 -5.2938e+01 -6.4057e+01 -5.5905e+01 -5.3346e+01 -5.2909e+01 -6.4047e+01 -5.5887e+01 -5.3380e+01 -5.2881e+01 -6.4036e+01 -5.5870e+01 -5.3413e+01 -5.2853e+01 -6.4025e+01 -5.5852e+01 -5.3445e+01 -5.2825e+01 -6.4013e+01 -5.5834e+01 -5.3477e+01 -5.2798e+01 -6.4001e+01 -5.5816e+01 -5.3508e+01 -5.2771e+01 -6.3989e+01 -5.5798e+01 -5.3539e+01 -5.2745e+01 -6.3976e+01 -5.5780e+01 -5.3569e+01 -5.2719e+01 -6.3963e+01 -5.5763e+01 -5.3599e+01 -5.2693e+01 -6.3949e+01 -5.5738e+01 -5.3628e+01 -5.2668e+01 -6.3935e+01 -5.5713e+01 -5.3657e+01 -5.2643e+01 -6.3921e+01 -5.5687e+01 -5.3685e+01 -5.2618e+01 -6.3906e+01 -5.5662e+01 -5.3713e+01 -5.2594e+01 -6.3890e+01 -5.5637e+01 -5.3740e+01 -5.2569e+01 -6.3875e+01 -5.5612e+01 -5.3767e+01 -5.2546e+01 -6.3858e+01 -5.5588e+01 -5.3787e+01 -5.2522e+01 -6.3842e+01 -5.5562e+01 -5.3805e+01 -5.2499e+01 -6.3825e+01 -5.5530e+01 -5.3822e+01 -5.2476e+01 -6.3808e+01 -5.5498e+01 -5.3839e+01 -5.2454e+01 -6.3790e+01 -5.5466e+01 -5.3856e+01 -5.2426e+01 -6.3772e+01 -5.5430e+01 -5.3873e+01 -5.2396e+01 -6.3754e+01 -5.5391e+01 -5.3889e+01 -5.2367e+01 -6.3735e+01 -5.5353e+01 -5.3905e+01 -5.2338e+01 -6.3716e+01 -5.5316e+01 -5.3962e+01 -5.2310e+01 -6.3697e+01 -5.5279e+01 -5.4022e+01 -5.2282e+01 -6.3677e+01 -5.5242e+01 -5.4080e+01 -5.2254e+01 -6.3657e+01 -5.5206e+01 -5.4138e+01 -5.2227e+01 -6.3637e+01 -5.5171e+01 -5.4194e+01 -5.2200e+01 -6.3616e+01 -5.5136e+01 -5.4250e+01 -5.2174e+01 -6.3595e+01 -5.5101e+01 -5.4305e+01 -5.2148e+01 -6.3573e+01 -5.5067e+01 -5.4359e+01 -5.2123e+01 -6.3548e+01 -5.5033e+01 -5.4411e+01 -5.2098e+01 -6.3518e+01 -5.5000e+01 -5.4464e+01 -5.2073e+01 -6.3488e+01 -5.4967e+01 -5.4515e+01 -5.2049e+01 -6.3458e+01 -5.4935e+01 -5.4565e+01 -5.2025e+01 -6.3427e+01 -5.4903e+01 -5.4614e+01 -5.2001e+01 -6.3397e+01 -5.4871e+01 -5.4663e+01 -5.1978e+01 -6.3388e+01 -5.4840e+01 -5.4710e+01 -5.1955e+01 -6.3402e+01 -5.4809e+01 -5.4757e+01 -5.1932e+01 -6.3415e+01 -5.4777e+01 -5.4803e+01 -5.1910e+01 -6.3427e+01 -5.4739e+01 -5.4848e+01 -5.1888e+01 -6.3438e+01 -5.4701e+01 -5.4892e+01 -5.1866e+01 -6.3449e+01 -5.4664e+01 -5.4936e+01 -5.1845e+01 -6.3459e+01 -5.4628e+01 -5.4978e+01 -5.1824e+01 -6.3468e+01 -5.4592e+01 -5.5020e+01 -5.1803e+01 -6.3476e+01 -5.4556e+01 -5.5061e+01 -5.1783e+01 -6.3484e+01 -5.4521e+01 -5.5101e+01 -5.1763e+01 -6.3491e+01 -5.4479e+01 -5.5141e+01 -5.1743e+01 -6.3497e+01 -5.4438e+01 -5.5179e+01 -5.1723e+01 -6.3503e+01 -5.4397e+01 -5.5217e+01 -5.1704e+01 -6.3508e+01 -5.4356e+01 -5.5254e+01 -5.1685e+01 -6.3512e+01 -5.4316e+01 -5.5291e+01 -5.1699e+01 -6.3515e+01 -5.4277e+01 -5.5326e+01 -5.1717e+01 -6.3518e+01 -5.4238e+01 -5.5361e+01 -5.1734e+01 -6.3521e+01 -5.4200e+01 -5.5395e+01 -5.1751e+01 -6.3522e+01 -5.4163e+01 -5.5428e+01 -5.1775e+01 -6.3523e+01 -5.4126e+01 -5.5461e+01 -5.1829e+01 -6.3523e+01 -5.4090e+01 -5.5493e+01 -5.1881e+01 -6.3523e+01 -5.4054e+01 -5.5524e+01 -5.1933e+01 -6.3522e+01 -5.4019e+01 -5.5555e+01 -5.1985e+01 -6.3520e+01 -5.3984e+01 -5.5585e+01 -5.2035e+01 -6.3518e+01 -5.3950e+01 -5.5614e+01 -5.2085e+01 -6.3515e+01 -5.3916e+01 -5.5642e+01 -5.2135e+01 -6.3512e+01 -5.3883e+01 -5.5670e+01 -5.2183e+01 -6.3508e+01 -5.3850e+01 -5.5697e+01 -5.2231e+01 -6.3503e+01 -5.3818e+01 -5.5724e+01 -5.2278e+01 -6.3498e+01 -5.3786e+01 -5.5749e+01 -5.2348e+01 -6.3492e+01 -5.3755e+01 -5.5775e+01 -5.2423e+01 -6.3486e+01 -5.3724e+01 -5.5799e+01 -5.2496e+01 -6.3479e+01 -5.3693e+01 -5.5823e+01 -5.2569e+01 -6.3472e+01 -5.3663e+01 -5.5846e+01 -5.2641e+01 -6.3464e+01 -5.3634e+01 -5.5869e+01 -5.2724e+01 -6.3456e+01 -5.3604e+01 -5.5891e+01 -5.2829e+01 -6.3447e+01 -5.3576e+01 -5.5912e+01 -5.2926e+01 -6.3437e+01 -5.3547e+01 -5.5933e+01 -5.3021e+01 -6.3427e+01 -5.3519e+01 -5.5954e+01 -5.3116e+01 -6.3417e+01 -5.3491e+01 -5.5973e+01 -5.3209e+01 -6.3406e+01 -5.3464e+01 -5.5992e+01 -5.3302e+01 -6.3395e+01 -5.3437e+01 -5.6011e+01 -5.3393e+01 -6.3383e+01 -5.3402e+01 -5.6029e+01 -5.3483e+01 -6.3370e+01 -5.3368e+01 -5.6046e+01 -5.3572e+01 -6.3358e+01 -5.3335e+01 -5.6063e+01 -5.3660e+01 -6.3344e+01 -5.3302e+01 -5.6076e+01 -5.3746e+01 -6.3330e+01 -5.3269e+01 -5.6084e+01 -5.3832e+01 -6.3316e+01 -5.3237e+01 -5.6091e+01 -5.3916e+01 -6.3302e+01 -5.3206e+01 -5.6099e+01 -5.3999e+01 -6.3286e+01 -5.3175e+01 -5.6105e+01 -5.4081e+01 -6.3271e+01 -5.3144e+01 -5.6112e+01 -5.4162e+01 -6.3255e+01 -5.3114e+01 -5.6114e+01 -5.4242e+01 -6.3233e+01 -5.3084e+01 -5.6112e+01 -5.4321e+01 -6.3209e+01 -5.3055e+01 -5.6110e+01 -5.4398e+01 -6.3184e+01 -5.3026e+01 -5.6108e+01 -5.4475e+01 -6.3159e+01 -5.2998e+01 -5.6105e+01 -5.4551e+01 -6.3133e+01 -5.2970e+01 -5.6103e+01 -5.4625e+01 -6.3108e+01 -5.2942e+01 -5.6100e+01 -5.4698e+01 -6.3082e+01 -5.2915e+01 -5.6131e+01 -5.4771e+01 -6.3056e+01 -5.2888e+01 -5.6172e+01 -5.4842e+01 -6.3030e+01 -5.2854e+01 -5.6212e+01 -5.4912e+01 -6.3004e+01 -5.2820e+01 -5.6252e+01 -5.4981e+01 -6.2978e+01 -5.2787e+01 -5.6291e+01 -5.5049e+01 -6.2951e+01 -5.2754e+01 -5.6329e+01 -5.5116e+01 -6.2924e+01 -5.2722e+01 -5.6366e+01 -5.5182e+01 -6.2897e+01 -5.2690e+01 -5.6403e+01 -5.5247e+01 -6.2870e+01 -5.2659e+01 -5.6438e+01 -5.5311e+01 -6.2842e+01 -5.2627e+01 -5.6473e+01 -5.5374e+01 -6.2815e+01 -5.2588e+01 -5.6508e+01 -5.5436e+01 -6.2787e+01 -5.2551e+01 -5.6541e+01 -5.5497e+01 -6.2759e+01 -5.2514e+01 -5.6574e+01 -5.5557e+01 -6.2731e+01 -5.2478e+01 -5.6606e+01 -5.5616e+01 -6.2702e+01 -5.2443e+01 -5.6637e+01 -5.5674e+01 -6.2674e+01 -5.2408e+01 -5.6668e+01 -5.5731e+01 -6.2645e+01 -5.2374e+01 -5.6698e+01 -5.5787e+01 -6.2617e+01 -5.2340e+01 -5.6727e+01 -5.5842e+01 -6.2588e+01 -5.2306e+01 -5.6756e+01 -5.5896e+01 -6.2558e+01 -5.2265e+01 -5.6783e+01 -5.5949e+01 -6.2529e+01 -5.2218e+01 -5.6810e+01 -5.6002e+01 -6.2500e+01 -5.2171e+01 -5.6837e+01 -5.6053e+01 -6.2470e+01 -5.2125e+01 -5.6863e+01 -5.6104e+01 -6.2440e+01 -5.2080e+01 -5.6888e+01 -5.6153e+01 -6.2410e+01 -5.2036e+01 -5.6912e+01 -5.6202e+01 -6.2380e+01 -5.1993e+01 -5.6936e+01 -5.6243e+01 -6.2350e+01 -5.1982e+01 -5.6959e+01 -5.6282e+01 -6.2320e+01 -5.1985e+01 -5.6982e+01 -5.6321e+01 -6.2289e+01 -5.1988e+01 -5.7004e+01 -5.6358e+01 -6.2258e+01 -5.1991e+01 -5.7025e+01 -5.6395e+01 -6.2228e+01 -5.1994e+01 -5.7046e+01 -5.6432e+01 -6.2197e+01 -5.1997e+01 -5.7066e+01 -5.6467e+01 -6.2166e+01 -5.2001e+01 -5.7085e+01 -5.6502e+01 -6.2135e+01 -5.2004e+01 -5.7104e+01 -5.6536e+01 -6.2103e+01 -5.2008e+01 -5.7122e+01 -5.6570e+01 -6.2072e+01 -5.2011e+01 -5.7140e+01 -5.6603e+01 -6.2040e+01 -5.2015e+01 -5.7157e+01 -5.6635e+01 -6.2009e+01 -5.2019e+01 -5.7173e+01 -5.6667e+01 -6.1977e+01 -5.2023e+01 -5.7189e+01 -5.6698e+01 -6.1945e+01 -5.2027e+01 -5.7205e+01 -5.6728e+01 -6.1913e+01 -5.2031e+01 -5.7220e+01 -5.6758e+01 -6.1881e+01 -5.2031e+01 -5.7234e+01 -5.6787e+01 -6.1848e+01 -5.2022e+01 -5.7248e+01 -5.6816e+01 -6.1816e+01 -5.2011e+01 -5.7261e+01 -5.6844e+01 -6.1784e+01 -5.1999e+01 -5.7273e+01 -5.6871e+01 -6.1751e+01 -5.1981e+01 -5.7286e+01 -5.6898e+01 -6.1718e+01 -5.1963e+01 -5.7297e+01 -5.6924e+01 -6.1677e+01 -5.1945e+01 -5.7308e+01 -5.6949e+01 -6.1636e+01 -5.1929e+01 -5.7319e+01 -5.6974e+01 -6.1596e+01 -5.1912e+01 -5.7329e+01 -5.6998e+01 -6.1555e+01 -5.1897e+01 -5.7338e+01 -5.7022e+01 -6.1515e+01 -5.1882e+01 -5.7348e+01 -5.7045e+01 -6.1475e+01 -5.1867e+01 -5.7356e+01 -5.7067e+01 -6.1434e+01 -5.1853e+01 -5.7364e+01 -5.7089e+01 -6.1394e+01 -5.1839e+01 -5.7372e+01 -5.7110e+01 -6.1354e+01 -5.1826e+01 -5.7379e+01 -5.7131e+01 -6.1314e+01 -5.1813e+01 -5.7386e+01 -5.7151e+01 -6.1275e+01 -5.1800e+01 -5.7392e+01 -5.7171e+01 -6.1235e+01 -5.1788e+01 -5.7398e+01 -5.7188e+01 -6.1195e+01 -5.1771e+01 -5.7403e+01 -5.7199e+01 -6.1156e+01 -5.1746e+01 -5.7408e+01 -5.7209e+01 -6.1116e+01 -5.1720e+01 -5.7412e+01 -5.7219e+01 -6.1077e+01 -5.1694e+01 -5.7417e+01 -5.7228e+01 -6.1037e+01 -5.1669e+01 -5.7420e+01 -5.7237e+01 -6.0998e+01 -5.1645e+01 -5.7423e+01 -5.7246e+01 -6.0959e+01 -5.1621e+01 -5.7426e+01 -5.7254e+01 -6.0920e+01 -5.1599e+01 -5.7428e+01 -5.7262e+01 -6.0881e+01 -5.1576e+01 -5.7430e+01 -5.7270e+01 -6.0842e+01 -5.1555e+01 -5.7429e+01 -5.7277e+01 -6.0803e+01 -5.1534e+01 -5.7422e+01 -5.7284e+01 -6.0764e+01 -5.1514e+01 -5.7415e+01 -5.7291e+01 -6.0726e+01 -5.1494e+01 -5.7408e+01 -5.7297e+01 -6.0687e+01 -5.1475e+01 -5.7400e+01 -5.7303e+01 -6.0648e+01 -5.1456e+01 -5.7393e+01 -5.7309e+01 -6.0610e+01 -5.1438e+01 -5.7385e+01 -5.7314e+01 -6.0571e+01 -5.1421e+01 -5.7377e+01 -5.7319e+01 -6.0533e+01 -5.1404e+01 -5.7369e+01 -5.7324e+01 -6.0495e+01 -5.1387e+01 -5.7361e+01 -5.7328e+01 -6.0456e+01 -5.1371e+01 -5.7352e+01 -5.7332e+01 -6.0418e+01 -5.1356e+01 -5.7344e+01 -5.7336e+01 -6.0380e+01 -5.1341e+01 -5.7335e+01 -5.7339e+01 -6.0342e+01 -5.1325e+01 -5.7326e+01 -5.7342e+01 -6.0304e+01 -5.1302e+01 -5.7316e+01 -5.7345e+01 -6.0266e+01 -5.1281e+01 -5.7307e+01 -5.7347e+01 -6.0228e+01 -5.1260e+01 -5.7297e+01 -5.7349e+01 -6.0191e+01 -5.1240e+01 -5.7288e+01 -5.7351e+01 -6.0153e+01 -5.1220e+01 -5.7278e+01 -5.7352e+01 -6.0115e+01 -5.1201e+01 -5.7267e+01 -5.7353e+01 -6.0078e+01 -5.1182e+01 -5.7257e+01 -5.7354e+01 -6.0040e+01 -5.1164e+01 -5.7247e+01 -5.7355e+01 -6.0003e+01 -5.1146e+01 -5.7236e+01 -5.7355e+01 -5.9965e+01 -5.1129e+01 -5.7225e+01 -5.7355e+01 -5.9928e+01 -5.1112e+01 -5.7214e+01 -5.7354e+01 -5.9891e+01 -5.1096e+01 -5.7203e+01 -5.7353e+01 -5.9854e+01 -5.1080e+01 -5.7192e+01 -5.7352e+01 -5.9816e+01 -5.1065e+01 -5.7180e+01 -5.7351e+01 -5.9779e+01 -5.1050e+01 -5.7169e+01 -5.7344e+01 -5.9742e+01 -5.1029e+01 -5.7157e+01 -5.7335e+01 -5.9705e+01 -5.1007e+01 -5.7145e+01 -5.7325e+01 -5.9669e+01 -5.0986e+01 -5.7133e+01 -5.7315e+01 -5.9632e+01 -5.0965e+01 -5.7120e+01 -5.7305e+01 -5.9595e+01 -5.0945e+01 -5.7108e+01 -5.7294e+01 -5.9558e+01 -5.0925e+01 -5.7095e+01 -5.7284e+01 -5.9522e+01 -5.0906e+01 -5.7083e+01 -5.7274e+01 -5.9485e+01 -5.0888e+01 -5.7070e+01 -5.7263e+01 -5.9449e+01 -5.0870e+01 -5.7055e+01 -5.7253e+01 -5.9412e+01 -5.0852e+01 -5.7034e+01 -5.7242e+01 -5.9376e+01 -5.0835e+01 -5.7013e+01 -5.7231e+01 -5.9339e+01 -5.0812e+01 -5.6992e+01 -5.7221e+01 -5.9303e+01 -5.0788e+01 -5.6971e+01 -5.7210e+01 -5.9267e+01 -5.0765e+01 -5.6950e+01 -5.7199e+01 -5.9231e+01 -5.0742e+01 -5.6929e+01 -5.7187e+01 -5.9195e+01 -5.0720e+01 -5.6908e+01 -5.7176e+01 -5.9159e+01 -5.0699e+01 -5.6887e+01 -5.7165e+01 -5.9123e+01 -5.0678e+01 -5.6867e+01 -5.7153e+01 -5.9087e+01 -5.0658e+01 -5.6846e+01 -5.7142e+01 -5.9051e+01 -5.0638e+01 -5.6825e+01 -5.7130e+01 -5.9016e+01 -5.0619e+01 -5.6804e+01 -5.7118e+01 -5.8980e+01 -5.0600e+01 -5.6784e+01 -5.7106e+01 -5.8944e+01 -5.0582e+01 -5.6763e+01 -5.7094e+01 -5.8909e+01 -5.0564e+01 -5.6742e+01 -5.7082e+01 -5.8873e+01 -5.0547e+01 -5.6722e+01 -5.7070e+01 -5.8838e+01 -5.0530e+01 -5.6701e+01 -5.7057e+01 -5.8803e+01 -5.0514e+01 -5.6681e+01 -5.7045e+01 -5.8767e+01 -5.0493e+01 -5.6660e+01 -5.7032e+01 -5.8732e+01 -5.0470e+01 -5.6640e+01 -5.7020e+01 -5.8733e+01 -5.0442e+01 -5.6619e+01 -5.7007e+01 -5.8742e+01 -5.0412e+01 -5.6599e+01 -5.6994e+01 -5.8750e+01 -5.0383e+01 -5.6578e+01 -5.6981e+01 -5.8758e+01 -5.0365e+01 -5.6558e+01 -5.6968e+01 -5.8765e+01 -5.0382e+01 -5.6538e+01 -5.6954e+01 -5.8772e+01 -5.0399e+01 -5.6517e+01 -5.6941e+01 -5.8778e+01 -5.0416e+01 -5.6497e+01 -5.6928e+01 -5.8784e+01 -5.0433e+01 -5.6476e+01 -5.6914e+01 -5.8789e+01 -5.0450e+01 -5.6453e+01 -5.6901e+01 -5.8794e+01 -5.0468e+01 -5.6425e+01 -5.6887e+01 -5.8798e+01 -5.0485e+01 -5.6397e+01 -5.6873e+01 -5.8801e+01 -5.0502e+01 -5.6369e+01 -5.6859e+01 -5.8804e+01 -5.0519e+01 -5.6341e+01 -5.6845e+01 -5.8806e+01 -5.0536e+01 -5.6314e+01 -5.6831e+01 -5.8808e+01 -5.0554e+01 -5.6287e+01 -5.6816e+01 -5.8810e+01 -5.0571e+01 -5.6260e+01 -5.6802e+01 -5.8811e+01 -5.0588e+01 -5.6233e+01 -5.6788e+01 -5.8811e+01 -5.0605e+01 -5.6206e+01 -5.6773e+01 -5.8811e+01 -5.0622e+01 -5.6179e+01 -5.6758e+01 -5.8811e+01 -5.0639e+01 -5.6153e+01 -5.6744e+01 -5.8810e+01 -5.0656e+01 -5.6127e+01 -5.6727e+01 -5.8808e+01 -5.0673e+01 -5.6101e+01 -5.6704e+01 -5.8807e+01 -5.0690e+01 -5.6075e+01 -5.6681e+01 -5.8804e+01 -5.0707e+01 -5.6049e+01 -5.6659e+01 -5.8802e+01 -5.0724e+01 -5.6023e+01 -5.6636e+01 -5.8798e+01 -5.0741e+01 -5.5998e+01 -5.6613e+01 -5.8795e+01 -5.0757e+01 -5.5965e+01 -5.6591e+01 -5.8791e+01 -5.0774e+01 -5.5932e+01 -5.6569e+01 -5.8787e+01 -5.0790e+01 -5.5900e+01 -5.6546e+01 -5.8782e+01 -5.0807e+01 -5.5867e+01 -5.6524e+01 -5.8777e+01 -5.0823e+01 -5.5835e+01 -5.6502e+01 -5.8771e+01 -5.0833e+01 -5.5804e+01 -5.6480e+01 -5.8757e+01 -5.0833e+01 -5.5772e+01 -5.6458e+01 -5.8743e+01 -5.0833e+01 -5.5741e+01 -5.6436e+01 -5.8728e+01 -5.0834e+01 -5.5710e+01 -5.6414e+01 -5.8714e+01 -5.0835e+01 -5.5680e+01 -5.6393e+01 -5.8699e+01 -5.0836e+01 -5.5650e+01 -5.6371e+01 -5.8683e+01 -5.0838e+01 -5.5620e+01 -5.6349e+01 -5.8660e+01 -5.0840e+01 -5.5590e+01 -5.6328e+01 -5.8637e+01 -5.0842e+01 -5.5560e+01 -5.6306e+01 -5.8614e+01 -5.0844e+01 -5.5531e+01 -5.6285e+01 -5.8591e+01 -5.0846e+01 -5.5502e+01 -5.6263e+01 -5.8568e+01 -5.0849e+01 -5.5474e+01 -5.6242e+01 -5.8545e+01 -5.0852e+01 -5.5445e+01 -5.6221e+01 -5.8522e+01 -5.0854e+01 -5.5417e+01 -5.6200e+01 -5.8499e+01 -5.0858e+01 -5.5389e+01 -5.6174e+01 -5.8476e+01 -5.0861e+01 -5.5361e+01 -5.6145e+01 -5.8453e+01 -5.0864e+01 -5.5334e+01 -5.6116e+01 -5.8429e+01 -5.0868e+01 -5.5307e+01 -5.6083e+01 -5.8398e+01 -5.0871e+01 -5.5279e+01 -5.6046e+01 -5.8368e+01 -5.0875e+01 -5.5253e+01 -5.6011e+01 -5.8337e+01 -5.0876e+01 -5.5226e+01 -5.5975e+01 -5.8307e+01 -5.0872e+01 -5.5199e+01 -5.5934e+01 -5.8277e+01 -5.0868e+01 -5.5173e+01 -5.5892e+01 -5.8247e+01 -5.0865e+01 -5.5147e+01 -5.5850e+01 -5.8217e+01 -5.0862e+01 -5.5121e+01 -5.5809e+01 -5.8188e+01 -5.0859e+01 -5.5096e+01 -5.5768e+01 -5.8158e+01 -5.0857e+01 -5.5070e+01 -5.5728e+01 -5.8129e+01 -5.0854e+01 -5.5045e+01 -5.5688e+01 -5.8100e+01 -5.0852e+01 -5.5020e+01 -5.5649e+01 -5.8071e+01 -5.0850e+01 -5.4995e+01 -5.5611e+01 -5.8042e+01 -5.0849e+01 -5.4970e+01 -5.5573e+01 -5.8014e+01 -5.0847e+01 -5.4945e+01 -5.5535e+01 -5.7985e+01 -5.0846e+01 -5.4921e+01 -5.5498e+01 -5.7957e+01 -5.0845e+01 -5.4896e+01 -5.5461e+01 -5.7928e+01 -5.0844e+01 -5.4872e+01 -5.5425e+01 -5.7892e+01 -5.0835e+01 -5.4848e+01 -5.5389e+01 -5.7856e+01 -5.0827e+01 -5.4824e+01 -5.5354e+01 -5.7820e+01 -5.0819e+01 -5.4801e+01 -5.5319e+01 -5.7785e+01 -5.0811e+01 -5.4777e+01 -5.5276e+01 -5.7750e+01 -5.0804e+01 -5.4754e+01 -5.5235e+01 -5.7716e+01 -5.0797e+01 -5.4731e+01 -5.5193e+01 -5.7682e+01 -5.0791e+01 -5.4707e+01 -5.5153e+01 -5.7648e+01 -5.0784e+01 -5.4684e+01 -5.5113e+01 -5.7614e+01 -5.0778e+01 -5.4657e+01 -5.5073e+01 -5.7581e+01 -5.0773e+01 -5.4627e+01 -5.5034e+01 -5.7547e+01 -5.0767e+01 -5.4596e+01 -5.4996e+01 -5.7514e+01 -5.0762e+01 -5.4566e+01 -5.4958e+01 -5.7482e+01 -5.0751e+01 -5.4537e+01 -5.4921e+01 -5.7450e+01 -5.0738e+01 -5.4507e+01 -5.4884e+01 -5.7462e+01 -5.0726e+01 -5.4478e+01 -5.4848e+01 -5.7474e+01 -5.0715e+01 -5.4449e+01 -5.4812e+01 -5.7486e+01 -5.0703e+01 -5.4421e+01 -5.4776e+01 -5.7497e+01 -5.0692e+01 -5.4389e+01 -5.4741e+01 -5.7508e+01 -5.0682e+01 -5.4354e+01 -5.4707e+01 -5.7518e+01 -5.0672e+01 -5.4318e+01 -5.4673e+01 -5.7528e+01 -5.0662e+01 -5.4283e+01 -5.4675e+01 -5.7537e+01 -5.0653e+01 -5.4249e+01 -5.4678e+01 -5.7546e+01 -5.0644e+01 -5.4215e+01 -5.4681e+01 -5.7555e+01 -5.0635e+01 -5.4181e+01 -5.4684e+01 -5.7563e+01 -5.0626e+01 -5.4148e+01 -5.4686e+01 -5.7571e+01 -5.0618e+01 -5.4116e+01 -5.4689e+01 -5.7579e+01 -5.0610e+01 -5.4083e+01 -5.4692e+01 -5.7586e+01 -5.0603e+01 -5.4051e+01 -5.4695e+01 -5.7592e+01 -5.0593e+01 -5.4020e+01 -5.4697e+01 -5.7598e+01 -5.0579e+01 -5.3989e+01 -5.4700e+01 -5.7604e+01 -5.0564e+01 -5.3951e+01 -5.4702e+01 -5.7610e+01 -5.0550e+01 -5.3912e+01 -5.4705e+01 -5.7615e+01 -5.0537e+01 -5.3875e+01 -5.4700e+01 -5.7619e+01 -5.0524e+01 -5.3838e+01 -5.4695e+01 -5.7624e+01 -5.0511e+01 -5.3801e+01 -5.4689e+01 -5.7628e+01 -5.0499e+01 -5.3765e+01 -5.4684e+01 -5.7631e+01 -5.0487e+01 -5.3771e+01 -5.4678e+01 -5.7634e+01 -5.0475e+01 -5.3780e+01 -5.4673e+01 -5.7637e+01 -5.0464e+01 -5.3789e+01 -5.4668e+01 -5.7640e+01 -5.0453e+01 -5.3798e+01 -5.4663e+01 -5.7642e+01 -5.0443e+01 -5.3806e+01 -5.4651e+01 -5.7643e+01 -5.0433e+01 -5.3815e+01 -5.4638e+01 -5.7645e+01 -5.0423e+01 -5.3823e+01 -5.4626e+01 -5.7666e+01 -5.0413e+01 -5.3831e+01 -5.4613e+01 -5.7711e+01 -5.0404e+01 -5.3839e+01 -5.4595e+01 -5.7755e+01 -5.0395e+01 -5.3847e+01 -5.4575e+01 -5.7798e+01 -5.0387e+01 -5.3854e+01 -5.4556e+01 -5.7840e+01 -5.0379e+01 -5.3861e+01 -5.4537e+01 -5.7881e+01 -5.0371e+01 -5.3868e+01 -5.4518e+01 -5.7921e+01 -5.0363e+01 -5.3875e+01 -5.4500e+01 -5.7960e+01 -5.0355e+01 -5.3882e+01 -5.4474e+01 -5.7998e+01 -5.0348e+01 -5.3889e+01 -5.4449e+01 -5.8035e+01 -5.0341e+01 -5.3895e+01 -5.4424e+01 -5.8072e+01 -5.0335e+01 -5.3901e+01 -5.4400e+01 -5.8107e+01 -5.0328e+01 -5.3907e+01 -5.4376e+01 -5.8142e+01 -5.0322e+01 -5.3913e+01 -5.4352e+01 -5.8175e+01 -5.0316e+01 -5.3919e+01 -5.4330e+01 -5.8208e+01 -5.0310e+01 -5.3924e+01 -5.4307e+01 -5.8240e+01 -5.0304e+01 -5.3930e+01 -5.4285e+01 -5.8271e+01 -5.0299e+01 -5.3935e+01 -5.4264e+01 -5.8301e+01 -5.0294e+01 -5.3940e+01 -5.4242e+01 -5.8331e+01 -5.0289e+01 -5.3944e+01 -5.4222e+01 -5.8359e+01 -5.0284e+01 -5.3949e+01 -5.4201e+01 -5.8387e+01 -5.0279e+01 -5.3953e+01 -5.4181e+01 -5.8414e+01 -5.0274e+01 -5.3957e+01 -5.4162e+01 -5.8440e+01 -5.0270e+01 -5.3961e+01 -5.4143e+01 -5.8465e+01 -5.0266e+01 -5.3965e+01 -5.4124e+01 -5.8489e+01 -5.0262e+01 -5.3969e+01 -5.4105e+01 -5.8513e+01 -5.0258e+01 -5.3972e+01 -5.4087e+01 -5.8536e+01 -5.0254e+01 -5.3975e+01 -5.4069e+01 -5.8558e+01 -5.0251e+01 -5.3979e+01 -5.4051e+01 -5.8579e+01 -5.0247e+01 -5.3981e+01 -5.4034e+01 -5.8600e+01 -5.0244e+01 -5.3984e+01 -5.4017e+01 -5.8620e+01 -5.0240e+01 -5.3987e+01 -5.4000e+01 -5.8639e+01 -5.0237e+01 -5.4005e+01 -5.3984e+01 -5.8658e+01 -5.0234e+01 -5.4052e+01 -5.3967e+01 -5.8676e+01 -5.0226e+01 -5.4098e+01 -5.3951e+01 -5.8693e+01 -5.0216e+01 -5.4143e+01 -5.3936e+01 -5.8709e+01 -5.0205e+01 -5.4187e+01 -5.3920e+01 -5.8725e+01 -5.0195e+01 -5.4230e+01 -5.3905e+01 -5.8740e+01 -5.0186e+01 -5.4272e+01 -5.3890e+01 -5.8754e+01 -5.0176e+01 -5.4314e+01 -5.3875e+01 -5.8768e+01 -5.0167e+01 -5.4354e+01 -5.3861e+01 -5.8781e+01 -5.0158e+01 -5.4394e+01 -5.3846e+01 -5.8794e+01 -5.0149e+01 -5.4434e+01 -5.3832e+01 -5.8806e+01 -5.0141e+01 -5.4472e+01 -5.3818e+01 -5.8817e+01 -5.0132e+01 -5.4510e+01 -5.3804e+01 -5.8827e+01 -5.0124e+01 -5.4547e+01 -5.3790e+01 -5.8837e+01 -5.0116e+01 -5.4583e+01 -5.3777e+01 -5.8847e+01 -5.0109e+01 -5.4618e+01 -5.3764e+01 -5.8856e+01 -5.0102e+01 -5.4653e+01 -5.3747e+01 -5.8864e+01 -5.0094e+01 -5.4687e+01 -5.3726e+01 -5.8872e+01 -5.0087e+01 -5.4714e+01 -5.3698e+01 -5.8879e+01 -5.0081e+01 -5.4739e+01 -5.3670e+01 -5.8885e+01 -5.0074e+01 -5.4763e+01 -5.3642e+01 -5.8891e+01 -5.0068e+01 -5.4787e+01 -5.3619e+01 -5.8897e+01 -5.0062e+01 -5.4810e+01 -5.3629e+01 -5.8901e+01 -5.0056e+01 -5.4833e+01 -5.3639e+01 -5.8906e+01 -5.0050e+01 -5.4855e+01 -5.3649e+01 -5.8910e+01 -5.0038e+01 -5.4877e+01 -5.3659e+01 -5.8913e+01 -5.0024e+01 -5.4898e+01 -5.3665e+01 -5.8916e+01 -5.0011e+01 -5.4919e+01 -5.3667e+01 -5.8918e+01 -1.0000e+01 -5.4939e+01 -5.3669e+01 -5.8920e+01 -6.0000e+01 -5.4959e+01 -5.3671e+01 -5.8921e+01 -6.0000e+01 -5.4978e+01 -5.3674e+01 -5.8916e+01 -6.0000e+01 -5.4997e+01 -5.3677e+01 -5.8909e+01 -6.0000e+01 -5.5015e+01 -5.3680e+01 -5.8901e+01 -6.0000e+01 -5.5033e+01 -5.3683e+01 -5.8893e+01 -6.0000e+01 -5.5051e+01 -5.3686e+01 -5.8879e+01 -6.0000e+01 -5.5068e+01 -5.3689e+01 -5.8863e+01 -6.0000e+01 -5.5084e+01 -5.3692e+01 -5.8840e+01 -6.0000e+01 -5.5100e+01 -5.3696e+01 -5.8816e+01 -6.0000e+01 -5.5116e+01 -5.3699e+01 -5.8791e+01 -6.0000e+01 -5.5131e+01 -5.3703e+01 -5.8767e+01 -6.0000e+01 -5.5180e+01 -5.3706e+01 -5.8743e+01 -6.0000e+01 -5.5230e+01 -5.3710e+01 -5.8719e+01 -6.0000e+01 -5.5280e+01 -5.3742e+01 -5.8695e+01 -6.0000e+01 -5.5324e+01 -5.3782e+01 -5.8671e+01 -6.0000e+01 -5.5364e+01 -5.3821e+01 -5.8648e+01 -6.0000e+01 -5.5429e+01 -5.3860e+01 -5.8624e+01 -6.0000e+01 -5.5512e+01 -5.3899e+01 -5.8587e+01 -6.0000e+01 -5.5594e+01 -5.3937e+01 -5.8548e+01 -6.0000e+01 -5.5674e+01 -5.3975e+01 -5.8510e+01 -6.0000e+01 -5.5754e+01 -5.4010e+01 -5.8471e+01 -6.0000e+01 -5.5831e+01 -5.4039e+01 -5.8434e+01 -6.0000e+01 -5.5908e+01 -5.4068e+01 -5.8396e+01 -6.0000e+01 -5.5983e+01 -5.4096e+01 -5.8359e+01 -6.0000e+01 -5.6057e+01 -5.4124e+01 -5.8323e+01 -6.0000e+01 -5.6130e+01 -5.4152e+01 -5.8287e+01 -6.0000e+01 -5.6201e+01 -5.4180e+01 -5.8251e+01 -6.0000e+01 -5.6271e+01 -5.4207e+01 -5.8216e+01 -6.0000e+01 -5.6340e+01 -5.4234e+01 -5.8181e+01 -6.0000e+01 -5.6408e+01 -5.4260e+01 -5.8146e+01 -6.0000e+01 -5.6475e+01 -5.4287e+01 -5.8149e+01 -6.0000e+01 -5.6540e+01 -5.4313e+01 -5.8159e+01 -6.0000e+01 -5.6604e+01 -5.4339e+01 -5.8169e+01 -6.0000e+01 -5.6667e+01 -5.4364e+01 -5.8178e+01 -6.0000e+01 -5.6729e+01 -5.4389e+01 -5.8188e+01 -6.0000e+01 -5.6790e+01 -5.4414e+01 -5.8196e+01 -6.0000e+01 -5.6850e+01 -5.4433e+01 -5.8205e+01 -6.0000e+01 -5.6903e+01 -5.4449e+01 -5.8213e+01 -6.0000e+01 -5.6952e+01 -5.4465e+01 -5.8221e+01 -6.0000e+01 -5.7001e+01 -5.4481e+01 -5.8228e+01 -6.0000e+01 -5.7049e+01 -5.4497e+01 -5.8236e+01 -6.0000e+01 -5.7095e+01 -5.4513e+01 -5.8242e+01 -6.0000e+01 -5.7141e+01 -5.4528e+01 -5.8249e+01 -6.0000e+01 -5.7186e+01 -5.4544e+01 -5.8255e+01 -6.0000e+01 -5.7231e+01 -5.4559e+01 -5.8261e+01 -6.0000e+01 -5.7274e+01 -5.4574e+01 -5.8266e+01 -6.0000e+01 -5.7317e+01 -5.4589e+01 -5.8271e+01 -6.0000e+01 -5.7358e+01 -5.4604e+01 -5.8276e+01 -6.0000e+01 -5.7399e+01 -5.4618e+01 -5.8281e+01 -5.9996e+01 -5.7439e+01 -5.4633e+01 -5.8285e+01 -5.9965e+01 -5.7478e+01 -5.4647e+01 -5.8289e+01 -5.9934e+01 -5.7516e+01 -5.4661e+01 -5.8292e+01 -5.9903e+01 -5.7554e+01 -5.4675e+01 -5.8295e+01 -5.9872e+01 -5.7591e+01 -5.4688e+01 -5.8298e+01 -5.9841e+01 -5.7627e+01 -5.4701e+01 -5.8301e+01 -5.9810e+01 -5.7662e+01 -5.4715e+01 -5.8303e+01 -5.9780e+01 -5.7696e+01 -5.4728e+01 -5.8305e+01 -5.9749e+01 -5.7729e+01 -5.4740e+01 -5.8306e+01 -5.9719e+01 -5.7756e+01 -5.4753e+01 -5.8307e+01 -5.9689e+01 -5.7780e+01 -5.4765e+01 -5.8308e+01 -5.9659e+01 -5.7804e+01 -5.4777e+01 -5.8309e+01 -5.9629e+01 -5.7827e+01 -5.4789e+01 -5.8309e+01 -5.9600e+01 -5.7849e+01 -5.4800e+01 -5.8309e+01 -5.9570e+01 -5.7871e+01 -5.4812e+01 -5.8309e+01 -5.9541e+01 -5.7892e+01 -5.4823e+01 -5.8308e+01 -5.9511e+01 -5.7913e+01 -5.4834e+01 -5.8307e+01 -5.9482e+01 -5.7933e+01 -5.4845e+01 -5.8306e+01 -5.9453e+01 -5.7953e+01 -5.4855e+01 -5.8304e+01 -5.9424e+01 -5.7972e+01 -5.4865e+01 -5.8302e+01 -5.9395e+01 -5.7991e+01 -5.4875e+01 -5.8300e+01 -5.9366e+01 -5.8009e+01 -5.4885e+01 -5.8298e+01 -5.9337e+01 -5.8026e+01 -5.4894e+01 -5.8295e+01 -5.9309e+01 -5.8043e+01 -5.4904e+01 -5.8292e+01 -5.9280e+01 -5.8060e+01 -5.4913e+01 -5.8288e+01 -5.9251e+01 -5.8072e+01 -5.4921e+01 -5.8284e+01 -5.9223e+01 -5.8080e+01 -5.4930e+01 -5.8281e+01 -5.9193e+01 -5.8087e+01 -5.4938e+01 -5.8276e+01 -5.9157e+01 -5.8094e+01 -5.4946e+01 -5.8272e+01 -5.9121e+01 -5.8100e+01 -5.4954e+01 -5.8267e+01 -5.9085e+01 -5.8107e+01 -5.4961e+01 -5.8262e+01 -5.9049e+01 -5.8113e+01 -5.4969e+01 -5.8256e+01 -5.9014e+01 -5.8118e+01 -5.4976e+01 -5.8251e+01 -5.8979e+01 -5.8123e+01 -5.4983e+01 -5.8245e+01 -5.8951e+01 -5.8128e+01 -5.4989e+01 -5.8238e+01 -5.8961e+01 -5.8133e+01 -5.4996e+01 -5.8232e+01 -5.8965e+01 -5.8137e+01 -5.5002e+01 -5.8225e+01 -5.8966e+01 -5.8141e+01 -5.5007e+01 -5.8218e+01 -5.8967e+01 -5.8145e+01 -5.5013e+01 -5.8211e+01 -5.8968e+01 -5.8148e+01 -5.5018e+01 -5.8203e+01 -5.8968e+01 -5.8151e+01 -5.5024e+01 -5.8196e+01 -5.8964e+01 -5.8154e+01 -5.5028e+01 -5.8188e+01 -5.8948e+01 -5.8156e+01 -5.5033e+01 -5.8179e+01 -5.8932e+01 -5.8159e+01 -5.5037e+01 -5.8171e+01 -5.8917e+01 -5.8160e+01 -5.5042e+01 -5.8162e+01 -5.8901e+01 -5.8162e+01 -5.5046e+01 -5.8153e+01 -5.8886e+01 -5.8163e+01 -5.5049e+01 -5.8144e+01 -5.8870e+01 -5.8164e+01 -5.5053e+01 -5.8134e+01 -5.8855e+01 -5.8164e+01 -5.5056e+01 -5.8124e+01 -5.8840e+01 -5.8165e+01 -5.5059e+01 -5.8114e+01 -5.8825e+01 -5.8157e+01 -5.5062e+01 -5.8104e+01 -5.8810e+01 -5.8149e+01 -5.5064e+01 -5.8094e+01 -5.8795e+01 -5.8141e+01 -5.5067e+01 -5.8083e+01 -5.8781e+01 -5.8132e+01 -5.5069e+01 -5.8072e+01 -5.8766e+01 -5.8124e+01 -5.5070e+01 -5.8061e+01 -5.8751e+01 -5.8115e+01 -5.5072e+01 -5.8050e+01 -5.8737e+01 -5.8106e+01 -5.5073e+01 -5.8038e+01 -5.8722e+01 -5.8098e+01 -5.5075e+01 -5.8029e+01 -5.8708e+01 -5.8089e+01 -5.5070e+01 -5.8062e+01 -5.8693e+01 -5.8079e+01 -5.5063e+01 -5.8094e+01 -5.8678e+01 -5.8070e+01 -5.5056e+01 -5.8124e+01 -5.8664e+01 -5.8061e+01 -5.5048e+01 -5.8155e+01 -5.8649e+01 -5.8051e+01 -5.5041e+01 -5.8184e+01 -5.8635e+01 -5.8042e+01 -5.5034e+01 -5.8212e+01 -5.8620e+01 -5.8032e+01 -5.5027e+01 -5.8240e+01 -5.8606e+01 -5.8022e+01 -5.5019e+01 -5.8266e+01 -5.8591e+01 -5.8012e+01 -5.5012e+01 -5.8292e+01 -5.8577e+01 -5.8002e+01 -5.5005e+01 -5.8317e+01 -5.8562e+01 -5.7992e+01 -5.4997e+01 -5.8342e+01 -5.8548e+01 -5.7981e+01 -5.4990e+01 -5.8365e+01 -5.8533e+01 -5.7971e+01 -5.4982e+01 -5.8388e+01 -5.8511e+01 -5.7960e+01 -5.4974e+01 -5.8410e+01 -5.8488e+01 -5.7949e+01 -5.4967e+01 -5.8424e+01 -5.8466e+01 -5.7939e+01 -5.4956e+01 -5.8437e+01 -5.8438e+01 -5.7927e+01 -5.4940e+01 -5.8449e+01 -5.8409e+01 -5.7916e+01 -5.4925e+01 -5.8461e+01 -5.8379e+01 -5.7905e+01 -5.4909e+01 -5.8472e+01 -5.8350e+01 -5.7893e+01 -5.4894e+01 -5.8482e+01 -5.8321e+01 -5.7882e+01 -5.4879e+01 -5.8490e+01 -5.8292e+01 -5.7868e+01 -5.4864e+01 -5.8492e+01 -5.8264e+01 -5.7848e+01 -5.4842e+01 -5.8493e+01 -5.8236e+01 -5.7828e+01 -5.4820e+01 -5.8494e+01 -5.8208e+01 -5.7809e+01 -5.4798e+01 -5.8495e+01 -5.8181e+01 -5.7789e+01 -5.4776e+01 -5.8495e+01 -5.8154e+01 -5.7769e+01 -5.4754e+01 -5.8490e+01 -5.8127e+01 -5.7750e+01 -5.4732e+01 -5.8482e+01 -5.8100e+01 -5.7730e+01 -5.4711e+01 -5.8474e+01 -5.8074e+01 -5.7711e+01 -5.4690e+01 -5.8466e+01 -5.8047e+01 -5.7691e+01 -5.4670e+01 -5.8457e+01 -5.8021e+01 -5.7672e+01 -5.4649e+01 -5.8449e+01 -5.7995e+01 -5.7653e+01 -5.4629e+01 -5.8440e+01 -5.7970e+01 -5.7633e+01 -5.4609e+01 -5.8431e+01 -5.7944e+01 -5.7614e+01 -5.4589e+01 -5.8422e+01 -5.7951e+01 -5.7594e+01 -5.4570e+01 -5.8413e+01 -5.7970e+01 -5.7575e+01 -5.4551e+01 -5.8408e+01 -5.7989e+01 -5.7556e+01 -5.4532e+01 -5.8443e+01 -5.8002e+01 -5.7537e+01 -5.4513e+01 -5.8478e+01 -5.8012e+01 -5.7517e+01 -5.4497e+01 -5.8511e+01 -5.8021e+01 -5.7498e+01 -5.4515e+01 -5.8544e+01 -5.8031e+01 -5.7479e+01 -5.4533e+01 -5.8576e+01 -5.8040e+01 -5.7460e+01 -5.4551e+01 -5.8608e+01 -5.8048e+01 -5.7440e+01 -5.4568e+01 -5.8639e+01 -5.8057e+01 -5.7421e+01 -5.4585e+01 -5.8668e+01 -5.8065e+01 -5.7399e+01 -5.4602e+01 -5.8698e+01 -5.8072e+01 -5.7372e+01 -5.4618e+01 -5.8726e+01 -5.8080e+01 -5.7345e+01 -5.4634e+01 -5.8754e+01 -5.8087e+01 -5.7318e+01 -5.4650e+01 -5.8781e+01 -5.8094e+01 -5.7291e+01 -5.4666e+01 -5.8807e+01 -5.8100e+01 -5.7263e+01 -5.4681e+01 -5.8832e+01 -5.8107e+01 -5.7229e+01 -5.4727e+01 -5.8857e+01 -5.8113e+01 -5.7195e+01 -5.4778e+01 -5.8881e+01 -5.8118e+01 -5.7161e+01 -5.4828e+01 -5.8905e+01 -5.8123e+01 -5.7128e+01 -5.4877e+01 -5.8927e+01 -5.8129e+01 -5.7095e+01 -5.4926e+01 -5.8949e+01 -5.8133e+01 -5.7063e+01 -5.4974e+01 -5.8971e+01 -5.8138e+01 -5.7031e+01 -5.5021e+01 -5.8991e+01 -5.8142e+01 -5.6999e+01 -5.5067e+01 -5.9011e+01 -5.8146e+01 -5.6967e+01 -5.5113e+01 -5.9030e+01 -5.8149e+01 -5.6936e+01 -5.5158e+01 -5.9049e+01 -5.8152e+01 -5.6905e+01 -5.5202e+01 -5.9067e+01 -5.8155e+01 -5.6875e+01 -5.5245e+01 -5.9084e+01 -5.8158e+01 -5.6844e+01 -5.5288e+01 -5.9101e+01 -5.8160e+01 -5.6814e+01 -5.5330e+01 -5.9117e+01 -5.8162e+01 -5.6784e+01 -5.5372e+01 -5.9133e+01 -5.8164e+01 -5.6755e+01 -5.5412e+01 -5.9148e+01 -5.8165e+01 -5.6725e+01 -5.5452e+01 -5.9162e+01 -5.8166e+01 -5.6696e+01 -5.5491e+01 -5.9175e+01 -5.8167e+01 -5.6668e+01 -5.5530e+01 -5.9188e+01 -5.8168e+01 -5.6639e+01 -5.5567e+01 -5.9201e+01 -5.8168e+01 -5.6611e+01 -5.5604e+01 -5.9213e+01 -5.8168e+01 -5.6582e+01 -5.5641e+01 -5.9224e+01 -5.8167e+01 -5.6555e+01 -5.5676e+01 -5.9235e+01 -5.8167e+01 -5.6527e+01 -5.5712e+01 -5.9245e+01 -5.8166e+01 -5.6499e+01 -5.5746e+01 -5.9254e+01 -5.8164e+01 -5.6472e+01 -5.5780e+01 -5.9263e+01 -5.8163e+01 -5.6445e+01 -5.5813e+01 -5.9272e+01 -5.8161e+01 -5.6418e+01 -5.5845e+01 -5.9279e+01 -5.8159e+01 -5.6391e+01 -5.5877e+01 -5.9287e+01 -5.8156e+01 -5.6365e+01 -5.5908e+01 -5.9294e+01 -5.8154e+01 -5.6338e+01 -5.5938e+01 -5.9300e+01 -5.8151e+01 -5.6312e+01 -5.5968e+01 -5.9306e+01 -5.8147e+01 -5.6286e+01 -5.5997e+01 -5.9311e+01 -5.8144e+01 -5.6260e+01 -5.6026e+01 -5.9316e+01 -5.8140e+01 -5.6234e+01 -5.6053e+01 -5.9320e+01 -5.8136e+01 -5.6209e+01 -5.6081e+01 -5.9324e+01 -5.8132e+01 -5.6183e+01 -5.6107e+01 -5.9327e+01 -5.8127e+01 -5.6158e+01 -5.6133e+01 -5.9330e+01 -5.8122e+01 -5.6133e+01 -5.6159e+01 -5.9332e+01 -5.8117e+01 -5.6108e+01 -5.6184e+01 -5.9334e+01 -5.8111e+01 -5.6083e+01 -5.6208e+01 -5.9335e+01 -5.8100e+01 -5.6058e+01 -5.6232e+01 -5.9336e+01 -5.8086e+01 -5.6034e+01 -5.6255e+01 -5.9336e+01 -5.8072e+01 -5.6009e+01 -5.6277e+01 -5.9336e+01 -5.8058e+01 -5.5985e+01 -5.6299e+01 -5.9336e+01 -5.8044e+01 -5.5961e+01 -5.6320e+01 -5.9335e+01 -5.8030e+01 -5.5937e+01 -5.6341e+01 -5.9368e+01 -5.8016e+01 -5.5913e+01 -5.6362e+01 -5.9410e+01 -5.8001e+01 -5.5889e+01 -5.6381e+01 -5.9452e+01 -5.7987e+01 -5.5865e+01 -5.6400e+01 -5.9492e+01 -5.7973e+01 -5.5842e+01 -5.6419e+01 -5.9531e+01 -5.7958e+01 -5.5818e+01 -5.6437e+01 -5.9569e+01 -5.7944e+01 -5.5795e+01 -5.6454e+01 -5.9606e+01 -5.7929e+01 -5.5772e+01 -5.6471e+01 -5.9642e+01 -5.7915e+01 -5.5749e+01 -5.6488e+01 -5.9677e+01 -5.7900e+01 -5.5725e+01 -5.6504e+01 -5.9711e+01 -5.7885e+01 -5.5702e+01 -5.6519e+01 -5.9744e+01 -5.7870e+01 -5.5680e+01 -5.6534e+01 -5.9776e+01 -5.7851e+01 -5.5657e+01 -5.6549e+01 -5.9807e+01 -5.7828e+01 -5.5634e+01 -5.6562e+01 -5.9837e+01 -5.7805e+01 -5.5612e+01 -5.6576e+01 -5.9866e+01 -5.7782e+01 -5.5589e+01 -5.6589e+01 -5.9894e+01 -5.7759e+01 -5.5567e+01 -5.6601e+01 -5.9922e+01 -5.7737e+01 -5.5544e+01 -5.6613e+01 -5.9948e+01 -5.7714e+01 -5.5522e+01 -5.6625e+01 -5.9974e+01 -5.7692e+01 -5.5500e+01 -5.6636e+01 -5.9998e+01 -5.7670e+01 -5.5478e+01 -5.6646e+01 -6.0022e+01 -5.7648e+01 -5.5456e+01 -5.6656e+01 -6.0045e+01 -5.7625e+01 -5.5434e+01 -5.6666e+01 -6.0067e+01 -5.7603e+01 -5.5412e+01 -5.6675e+01 -6.0085e+01 -5.7581e+01 -5.5390e+01 -5.6684e+01 -6.0098e+01 -5.7559e+01 -5.5368e+01 -5.6692e+01 -6.0110e+01 -5.7538e+01 -5.5344e+01 -5.6700e+01 -6.0121e+01 -5.7516e+01 -5.5315e+01 -5.6708e+01 -6.0132e+01 -5.7494e+01 -5.5285e+01 -5.6715e+01 -6.0142e+01 -5.7472e+01 -5.5256e+01 -5.6721e+01 -6.0151e+01 -5.7451e+01 -5.5228e+01 -5.6727e+01 -6.0160e+01 -5.7429e+01 -5.5199e+01 -5.6733e+01 -6.0168e+01 -5.7408e+01 -5.5171e+01 -5.6738e+01 -6.0176e+01 -5.7386e+01 -5.5143e+01 -5.6743e+01 -6.0183e+01 -5.7365e+01 -5.5115e+01 -5.6748e+01 -6.0189e+01 -5.7343e+01 -5.5088e+01 -5.6752e+01 -6.0195e+01 -5.7322e+01 -5.5060e+01 -5.6756e+01 -6.0201e+01 -5.7301e+01 -5.5033e+01 -5.6759e+01 -6.0206e+01 -5.7280e+01 -5.5006e+01 -5.6762e+01 -6.0210e+01 -5.7258e+01 -5.4974e+01 -5.6765e+01 -6.0214e+01 -5.7237e+01 -5.4940e+01 -5.6767e+01 -6.0217e+01 -5.7216e+01 -5.4906e+01 -5.6769e+01 -6.0220e+01 -5.7195e+01 -5.4873e+01 -5.6771e+01 -6.0222e+01 -5.7174e+01 -5.4839e+01 -5.6772e+01 -6.0224e+01 -5.7152e+01 -5.4807e+01 -5.6773e+01 -6.0225e+01 -5.7131e+01 -5.4767e+01 -5.6773e+01 -6.0226e+01 -5.7110e+01 -5.4727e+01 -5.6773e+01 -6.0226e+01 -5.7089e+01 -5.4688e+01 -5.6773e+01 -6.0226e+01 -5.7068e+01 -5.4649e+01 -5.6772e+01 -6.0225e+01 -5.7047e+01 -5.4611e+01 -5.6771e+01 -6.0224e+01 -5.7026e+01 -5.4573e+01 -5.6770e+01 -6.0222e+01 -5.7005e+01 -5.4536e+01 -5.6769e+01 -6.0220e+01 -5.6984e+01 -5.4499e+01 -5.6767e+01 -6.0217e+01 -5.6963e+01 -5.4463e+01 -5.6765e+01 -6.0214e+01 -5.6942e+01 -5.4427e+01 -5.6762e+01 -6.0211e+01 -5.6921e+01 -5.4392e+01 -5.6755e+01 -6.0207e+01 -5.6900e+01 -5.4357e+01 -5.6744e+01 -6.0202e+01 -5.6879e+01 -5.4323e+01 -5.6732e+01 -6.0198e+01 -5.6858e+01 -5.4289e+01 -5.6721e+01 -6.0192e+01 -5.6837e+01 -5.4256e+01 -5.6710e+01 -6.0187e+01 -5.6817e+01 -5.4222e+01 -5.6699e+01 -6.0181e+01 -5.6796e+01 -5.4190e+01 -5.6687e+01 -6.0174e+01 -5.6775e+01 -5.4156e+01 -5.6675e+01 -6.0167e+01 -5.6754e+01 -5.4117e+01 -5.6664e+01 -6.0160e+01 -5.6733e+01 -5.4077e+01 -5.6652e+01 -6.0152e+01 -5.6712e+01 -5.4039e+01 -5.6640e+01 -6.0144e+01 -5.6691e+01 -5.4001e+01 -5.6628e+01 -6.0136e+01 -5.6670e+01 -5.3963e+01 -5.6616e+01 -6.0127e+01 -5.6649e+01 -5.3926e+01 -5.6603e+01 -6.0118e+01 -5.6628e+01 -5.3890e+01 -5.6591e+01 -6.0108e+01 -5.6608e+01 -5.3854e+01 -5.6579e+01 -6.0099e+01 -5.6587e+01 -5.3818e+01 -5.6566e+01 -6.0088e+01 -5.6566e+01 -5.3783e+01 -5.6553e+01 -6.0080e+01 -5.6538e+01 -5.3749e+01 -5.6540e+01 -6.0114e+01 -5.6510e+01 -5.3715e+01 -5.6528e+01 -6.0146e+01 -5.6481e+01 -5.3682e+01 -5.6515e+01 -6.0178e+01 -5.6453e+01 -5.3649e+01 -5.6502e+01 -6.0209e+01 -5.6425e+01 -5.3616e+01 -5.6488e+01 -6.0238e+01 -5.6397e+01 -5.3584e+01 -5.6469e+01 -6.0267e+01 -5.6369e+01 -5.3552e+01 -5.6448e+01 -6.0295e+01 -5.6341e+01 -5.3521e+01 -5.6427e+01 -6.0322e+01 -5.6314e+01 -5.3490e+01 -5.6406e+01 -6.0348e+01 -5.6286e+01 -5.3460e+01 -5.6385e+01 -6.0373e+01 -5.6259e+01 -5.3425e+01 -5.6364e+01 -6.0397e+01 -5.6232e+01 -5.3387e+01 -5.6343e+01 -6.0420e+01 -5.6205e+01 -5.3350e+01 -5.6322e+01 -6.0442e+01 -5.6179e+01 -5.3314e+01 -5.6302e+01 -6.0464e+01 -5.6152e+01 -5.3278e+01 -5.6281e+01 -6.0485e+01 -5.6126e+01 -5.3243e+01 -5.6261e+01 -6.0504e+01 -5.6093e+01 -5.3208e+01 -5.6240e+01 -6.0523e+01 -5.6060e+01 -5.3174e+01 -5.6220e+01 -6.0539e+01 -5.6026e+01 -5.3140e+01 -5.6200e+01 -6.0548e+01 -5.5993e+01 -5.3107e+01 -5.6180e+01 -6.0557e+01 -5.5960e+01 -5.3075e+01 -5.6159e+01 -6.0565e+01 -5.5927e+01 -5.3043e+01 -5.6139e+01 -6.0573e+01 -5.5895e+01 -5.3011e+01 -5.6119e+01 -6.0580e+01 -5.5863e+01 -5.2980e+01 -5.6099e+01 -6.0586e+01 -5.5831e+01 -5.2949e+01 -5.6079e+01 -6.0592e+01 -5.5800e+01 -5.2919e+01 -5.6059e+01 -6.0597e+01 -5.5768e+01 -5.2889e+01 -5.6040e+01 -6.0602e+01 -5.5737e+01 -5.2859e+01 -5.6020e+01 -6.0606e+01 -5.5707e+01 -5.2830e+01 -5.6000e+01 -6.0610e+01 -5.5676e+01 -5.2802e+01 -5.5980e+01 -6.0613e+01 -5.5646e+01 -5.2774e+01 -5.5961e+01 -6.0616e+01 -5.5617e+01 -5.2746e+01 -5.5941e+01 -6.0618e+01 -5.5587e+01 -5.2718e+01 -5.5922e+01 -6.0619e+01 -5.5558e+01 -5.2691e+01 -5.5897e+01 -6.0620e+01 -5.5529e+01 -5.2665e+01 -5.5869e+01 -6.0619e+01 -5.5500e+01 -5.2638e+01 -5.5842e+01 -6.0611e+01 -5.5470e+01 -5.2606e+01 -5.5815e+01 -6.0602e+01 -5.5434e+01 -5.2573e+01 -5.5789e+01 -6.0594e+01 -5.5398e+01 -5.2540e+01 -5.5762e+01 -6.0585e+01 -5.5362e+01 -5.2507e+01 -5.5736e+01 -6.0576e+01 -5.5327e+01 -5.2476e+01 -5.5710e+01 -6.0566e+01 -5.5292e+01 -5.2444e+01 -5.5684e+01 -6.0556e+01 -5.5258e+01 -5.2414e+01 -5.5658e+01 -6.0546e+01 -5.5224e+01 -5.2383e+01 -5.5633e+01 -6.0536e+01 -5.5190e+01 -5.2353e+01 -5.5607e+01 -6.0525e+01 -5.5157e+01 -5.2324e+01 -5.5577e+01 -6.0514e+01 -5.5124e+01 -5.2295e+01 -5.5544e+01 -6.0503e+01 -5.5092e+01 -5.2267e+01 -5.5512e+01 -6.0492e+01 -5.5059e+01 -5.2239e+01 -5.5480e+01 -6.0480e+01 -5.5028e+01 -5.2211e+01 -5.5448e+01 -6.0468e+01 -5.4996e+01 -5.2184e+01 -5.5417e+01 -6.0456e+01 -5.4965e+01 -5.2151e+01 -5.5386e+01 -6.0443e+01 -5.4934e+01 -5.2117e+01 -5.5355e+01 -6.0430e+01 -5.4903e+01 -5.2084e+01 -5.5325e+01 -6.0417e+01 -5.4873e+01 -5.2051e+01 -5.5295e+01 -6.0404e+01 -5.4843e+01 -5.2012e+01 -5.5265e+01 -6.0390e+01 -5.4814e+01 -5.1972e+01 -5.5236e+01 -6.0376e+01 -5.4784e+01 -5.1933e+01 -5.5206e+01 -6.0361e+01 -5.4755e+01 -5.1889e+01 -5.5178e+01 -6.0339e+01 -5.4726e+01 -5.1844e+01 -5.5149e+01 -6.0316e+01 -5.4698e+01 -5.1799e+01 -5.5121e+01 -6.0294e+01 -5.4669e+01 -5.1756e+01 -5.5093e+01 -6.0271e+01 -5.4641e+01 -5.1713e+01 -5.5065e+01 -6.0249e+01 -5.4614e+01 -5.1671e+01 -5.5038e+01 -6.0226e+01 -5.4586e+01 -5.1630e+01 -5.5010e+01 -6.0203e+01 -5.4559e+01 -5.1590e+01 -5.4983e+01 -6.0181e+01 -5.4532e+01 -5.1550e+01 -5.4957e+01 -6.0158e+01 -5.4505e+01 -5.1512e+01 -5.4930e+01 -6.0135e+01 -5.4479e+01 -5.1474e+01 -5.4904e+01 -6.0112e+01 -5.4452e+01 -5.1436e+01 -5.4878e+01 -6.0089e+01 -5.4426e+01 -5.1400e+01 -5.4852e+01 -6.0066e+01 -5.4400e+01 -5.1364e+01 -5.4826e+01 -6.0043e+01 -5.4375e+01 -5.1329e+01 -5.4801e+01 -6.0041e+01 -5.4349e+01 -5.1295e+01 -5.4776e+01 -6.0059e+01 -5.4324e+01 -5.1261e+01 -5.4751e+01 -6.0071e+01 -5.4299e+01 -5.1228e+01 -5.4726e+01 -6.0083e+01 -5.4274e+01 -5.1196e+01 -5.4702e+01 -6.0095e+01 -5.4250e+01 -5.1164e+01 -5.4677e+01 -6.0105e+01 -5.4225e+01 -5.1133e+01 -5.4653e+01 -6.0116e+01 -5.4201e+01 -5.1141e+01 -5.4629e+01 -6.0126e+01 -5.4177e+01 -5.1159e+01 -5.4606e+01 -6.0135e+01 -5.4153e+01 -5.1217e+01 -5.4582e+01 -6.0144e+01 -5.4130e+01 -5.1275e+01 -5.4559e+01 -6.0152e+01 -5.4106e+01 -5.1360e+01 -5.4535e+01 -6.0160e+01 -5.4083e+01 -5.1461e+01 -5.4512e+01 -6.0167e+01 -5.4060e+01 -5.1560e+01 -5.4489e+01 -6.0174e+01 -5.4037e+01 -5.1658e+01 -5.4467e+01 -6.0180e+01 -5.4014e+01 -5.1755e+01 -5.4444e+01 -6.0186e+01 -5.3991e+01 -5.1850e+01 -5.4445e+01 -6.0191e+01 -5.3969e+01 -5.1944e+01 -5.4459e+01 -6.0196e+01 -5.3946e+01 -5.2036e+01 -5.4472e+01 -6.0200e+01 -5.3916e+01 -5.2127e+01 -5.4486e+01 -6.0204e+01 -5.3878e+01 -5.2217e+01 -5.4499e+01 -6.0208e+01 -5.3841e+01 -5.2306e+01 -5.4512e+01 -6.0211e+01 -5.3804e+01 -5.2393e+01 -5.4524e+01 -6.0213e+01 -5.3768e+01 -5.2479e+01 -5.4537e+01 -6.0215e+01 -5.3732e+01 -5.2563e+01 -5.4549e+01 -6.0217e+01 -5.3697e+01 -5.2647e+01 -5.4560e+01 -6.0218e+01 -5.3662e+01 -5.2729e+01 -5.4571e+01 -6.0219e+01 -5.3621e+01 -5.2810e+01 -5.4582e+01 -6.0219e+01 -5.3580e+01 -5.2889e+01 -5.4593e+01 -6.0219e+01 -5.3539e+01 -5.2960e+01 -5.4603e+01 -6.0218e+01 -5.3498e+01 -5.3029e+01 -5.4614e+01 -6.0217e+01 -5.3459e+01 -5.3098e+01 -5.4623e+01 -6.0216e+01 -5.3420e+01 -5.3165e+01 -5.4633e+01 -6.0242e+01 -5.3381e+01 -5.3232e+01 -5.4642e+01 -6.0283e+01 -5.3343e+01 -5.3297e+01 -5.4651e+01 -6.0324e+01 -5.3306e+01 -5.3362e+01 -5.4659e+01 -6.0364e+01 -5.3269e+01 -5.3425e+01 -5.4668e+01 -6.0403e+01 -5.3233e+01 -5.3487e+01 -5.4676e+01 -6.0433e+01 -5.3198e+01 -5.3549e+01 -5.4683e+01 -6.0462e+01 -5.3163e+01 -5.3610e+01 -5.4691e+01 -6.0490e+01 -5.3128e+01 -5.3669e+01 -5.4698e+01 -6.0518e+01 -5.3094e+01 -5.3719e+01 -5.4705e+01 -6.0544e+01 -5.3061e+01 -5.3769e+01 -5.4711e+01 -6.0570e+01 -5.3028e+01 -5.3819e+01 -5.4718e+01 -6.0594e+01 -5.2995e+01 -5.3867e+01 -5.4724e+01 -6.0619e+01 -5.2963e+01 -5.3915e+01 -5.4729e+01 -6.0642e+01 -5.2930e+01 -5.3962e+01 -5.4735e+01 -6.0664e+01 -5.2891e+01 -5.4009e+01 -5.4740e+01 -6.0686e+01 -5.2853e+01 -5.4055e+01 -5.4745e+01 -6.0707e+01 -5.2815e+01 -5.4100e+01 -5.4747e+01 -6.0727e+01 -5.2778e+01 -5.4144e+01 -5.4743e+01 -6.0747e+01 -5.2742e+01 -5.4188e+01 -5.4740e+01 -6.0766e+01 -5.2706e+01 -5.4230e+01 -5.4736e+01 -6.0784e+01 -5.2670e+01 -5.4273e+01 -5.4732e+01 -6.0801e+01 -5.2636e+01 -5.4314e+01 -5.4728e+01 -6.0818e+01 -5.2602e+01 -5.4353e+01 -5.4724e+01 -6.0834e+01 -5.2568e+01 -5.4385e+01 -5.4720e+01 -6.0849e+01 -5.2535e+01 -5.4417e+01 -5.4716e+01 -6.0864e+01 -5.2502e+01 -5.4448e+01 -5.4712e+01 -6.0877e+01 -5.2470e+01 -5.4479e+01 -5.4708e+01 -6.0891e+01 -5.2435e+01 -5.4510e+01 -5.4704e+01 -6.0903e+01 -5.2396e+01 -5.4540e+01 -5.4699e+01 -6.0915e+01 -5.2358e+01 -5.4569e+01 -5.4695e+01 -6.0922e+01 -5.2321e+01 -5.4598e+01 -5.4690e+01 -6.0925e+01 -5.2284e+01 -5.4626e+01 -5.4680e+01 -6.0927e+01 -5.2242e+01 -5.4655e+01 -5.4667e+01 -6.0929e+01 -5.2199e+01 -5.4682e+01 -5.4655e+01 -6.0930e+01 -5.2156e+01 -5.4709e+01 -5.4643e+01 -6.0931e+01 -5.2114e+01 -5.4736e+01 -5.4630e+01 -6.0932e+01 -5.2073e+01 -5.4762e+01 -5.4618e+01 -6.0932e+01 -5.2033e+01 -5.4788e+01 -5.4606e+01 -6.0931e+01 -5.1993e+01 -5.4813e+01 -5.4594e+01 -6.0922e+01 -5.1954e+01 -5.4838e+01 -5.4582e+01 -6.0913e+01 -5.1916e+01 -5.4862e+01 -5.4570e+01 -6.0904e+01 -5.1879e+01 -5.4886e+01 -5.4558e+01 -6.0894e+01 -5.1842e+01 -5.4925e+01 -5.4546e+01 -6.0884e+01 -5.1806e+01 -5.4992e+01 -5.4535e+01 -6.0874e+01 -5.1770e+01 -5.5059e+01 -5.4523e+01 -6.0864e+01 -5.1736e+01 -5.5124e+01 -5.4529e+01 -6.0875e+01 -5.1701e+01 -5.5188e+01 -5.4554e+01 -6.0909e+01 -5.1668e+01 -5.5247e+01 -5.4579e+01 -6.0942e+01 -5.1635e+01 -5.5300e+01 -5.4603e+01 -6.0974e+01 -5.1603e+01 -5.5354e+01 -5.4626e+01 -6.1005e+01 -5.1571e+01 -5.5406e+01 -5.4649e+01 -6.1035e+01 -5.1540e+01 -5.5457e+01 -5.4672e+01 -6.1065e+01 -5.1510e+01 -5.5508e+01 -5.4695e+01 -6.1093e+01 -5.1480e+01 -5.5557e+01 -5.4717e+01 -6.1121e+01 -5.1450e+01 -5.5606e+01 -5.4738e+01 -6.1147e+01 -5.1421e+01 -5.5654e+01 -5.4759e+01 -6.1173e+01 -5.1393e+01 -5.5701e+01 -5.4780e+01 -6.1194e+01 -5.1360e+01 -5.5739e+01 -5.4801e+01 -6.1210e+01 -5.1325e+01 -5.5777e+01 -5.4820e+01 -6.1226e+01 -5.1290e+01 -5.5814e+01 -5.4840e+01 -6.1241e+01 -5.1257e+01 -5.5851e+01 -5.4859e+01 -6.1256e+01 -5.1223e+01 -5.5886e+01 -5.4878e+01 -6.1270e+01 -5.1191e+01 -5.5922e+01 -5.4896e+01 -6.1284e+01 -5.1159e+01 -5.5953e+01 -5.4914e+01 -6.1296e+01 -5.1127e+01 -5.5979e+01 -5.4932e+01 -6.1309e+01 -5.1097e+01 -5.6005e+01 -5.4949e+01 -6.1320e+01 -5.1066e+01 -5.6030e+01 -5.4965e+01 -6.1331e+01 -5.1037e+01 -5.6055e+01 -5.4982e+01 -6.1342e+01 -5.1008e+01 -5.6079e+01 -5.4998e+01 -6.1352e+01 -5.0979e+01 -5.6103e+01 -5.5013e+01 -6.1361e+01 -5.0952e+01 -5.6127e+01 -5.5029e+01 -6.1370e+01 -5.0924e+01 -5.6144e+01 -5.5043e+01 -6.1378e+01 -5.0897e+01 -5.6159e+01 -5.5058e+01 -6.1386e+01 -5.0871e+01 -5.6174e+01 -5.5072e+01 -6.1393e+01 -5.0845e+01 -5.6189e+01 -5.5085e+01 -6.1400e+01 -5.0820e+01 -5.6203e+01 -5.5099e+01 -6.1406e+01 -5.0795e+01 -5.6217e+01 -5.5112e+01 -6.1411e+01 -5.0771e+01 -5.6231e+01 -5.5124e+01 -6.1416e+01 -5.0747e+01 -5.6244e+01 -5.5136e+01 -6.1421e+01 -5.0723e+01 -5.6257e+01 -5.5148e+01 -6.1425e+01 -5.0700e+01 -5.6270e+01 -5.5160e+01 -6.1428e+01 -5.0678e+01 -5.6283e+01 -5.5171e+01 -6.1431e+01 -5.0656e+01 -5.6289e+01 -5.5181e+01 -6.1433e+01 -5.0634e+01 -5.6293e+01 -5.5192e+01 -6.1435e+01 -5.0623e+01 -5.6297e+01 -5.5202e+01 -6.1436e+01 -5.0647e+01 -5.6302e+01 -5.5211e+01 -6.1437e+01 -5.0670e+01 -5.6306e+01 -5.5221e+01 -6.1438e+01 -5.0693e+01 -5.6310e+01 -5.5230e+01 -6.1438e+01 -5.0716e+01 -5.6314e+01 -5.5238e+01 -6.1437e+01 -5.0738e+01 -5.6318e+01 -5.5247e+01 -6.1436e+01 -5.0782e+01 -5.6322e+01 -5.5255e+01 -6.1434e+01 -5.0849e+01 -5.6326e+01 -5.5262e+01 -6.1432e+01 -5.0914e+01 -5.6329e+01 -5.5270e+01 -6.1430e+01 -5.0978e+01 -5.6333e+01 -5.5277e+01 -6.1427e+01 -5.1042e+01 -5.6336e+01 -5.5283e+01 -6.1424e+01 -5.1104e+01 -5.6339e+01 -5.5289e+01 -6.1420e+01 -5.1164e+01 -5.6343e+01 -5.5295e+01 -6.1415e+01 -5.1216e+01 -5.6346e+01 -5.5301e+01 -6.1411e+01 -5.1269e+01 -5.6348e+01 -5.5306e+01 -6.1405e+01 -5.1320e+01 -5.6351e+01 -5.5304e+01 -6.1400e+01 -5.1371e+01 -5.6354e+01 -5.5301e+01 -6.1394e+01 -5.1421e+01 -5.6356e+01 -5.5297e+01 -6.1387e+01 -5.1470e+01 -5.6358e+01 -5.5294e+01 -6.1380e+01 -5.1519e+01 -5.6360e+01 -5.5291e+01 -6.1373e+01 -5.1567e+01 -5.6362e+01 -5.5287e+01 -6.1365e+01 -5.1614e+01 -5.6364e+01 -5.5311e+01 -6.1357e+01 -5.1653e+01 -5.6366e+01 -5.5336e+01 -6.1349e+01 -5.1691e+01 -5.6367e+01 -5.5360e+01 -6.1340e+01 -5.1725e+01 -5.6369e+01 -5.5384e+01 -6.1331e+01 -5.1755e+01 -5.6368e+01 -5.5407e+01 -6.1321e+01 -5.1784e+01 -5.6361e+01 -5.5431e+01 -6.1311e+01 -5.1813e+01 -5.6354e+01 -5.5453e+01 -6.1300e+01 -5.1842e+01 -5.6347e+01 -5.5476e+01 -6.1290e+01 -5.1865e+01 -5.6340e+01 -5.5497e+01 -6.1278e+01 -5.1885e+01 -5.6333e+01 -5.5519e+01 -6.1267e+01 -5.1906e+01 -5.6326e+01 -5.5540e+01 -6.1255e+01 -5.1926e+01 -5.6319e+01 -5.5561e+01 -6.1243e+01 -5.1946e+01 -5.6312e+01 -5.5581e+01 -6.1230e+01 -5.1966e+01 -5.6306e+01 -5.5601e+01 -6.1217e+01 -5.1985e+01 -5.6299e+01 -5.5621e+01 -6.1204e+01 -5.2005e+01 -5.6292e+01 -5.5640e+01 -6.1190e+01 -5.2025e+01 -5.6285e+01 -5.5658e+01 -6.1176e+01 -5.2044e+01 -5.6278e+01 -5.5677e+01 -6.1162e+01 -5.2063e+01 -5.6271e+01 -5.5695e+01 -6.1147e+01 -5.2083e+01 -5.6264e+01 -5.5712e+01 -6.1132e+01 -5.2102e+01 -5.6257e+01 -5.5730e+01 -6.1117e+01 -5.2120e+01 -5.6250e+01 -5.5746e+01 -6.1101e+01 -5.2139e+01 -5.6242e+01 -5.5763e+01 -6.1099e+01 -5.2158e+01 -5.6235e+01 -5.5779e+01 -6.1127e+01 -5.2176e+01 -5.6228e+01 -5.5794e+01 -6.1154e+01 -5.2194e+01 -5.6221e+01 -5.5810e+01 -6.1181e+01 -5.2212e+01 -5.6213e+01 -5.5818e+01 -6.1206e+01 -5.2230e+01 -5.6206e+01 -5.5825e+01 -6.1231e+01 -5.2248e+01 -5.6198e+01 -5.5831e+01 -6.1254e+01 -5.2266e+01 -5.6191e+01 -5.5837e+01 -6.1277e+01 -5.2283e+01 -5.6183e+01 -5.5843e+01 -6.1299e+01 -5.2300e+01 -5.6176e+01 -5.5849e+01 -6.1319e+01 -5.2317e+01 -5.6168e+01 -5.5855e+01 -6.1339e+01 -5.2334e+01 -5.6160e+01 -5.5860e+01 -6.1359e+01 -5.2351e+01 -5.6152e+01 -5.5866e+01 -6.1377e+01 -5.2367e+01 -5.6144e+01 -5.5871e+01 -6.1394e+01 -5.2383e+01 -5.6133e+01 -5.5876e+01 -6.1411e+01 -5.2399e+01 -5.6117e+01 -5.5878e+01 -6.1427e+01 -5.2415e+01 -5.6101e+01 -5.5875e+01 -6.1442e+01 -5.2431e+01 -5.6085e+01 -5.5871e+01 -6.1456e+01 -5.2446e+01 -5.6069e+01 -5.5868e+01 -6.1469e+01 -5.2461e+01 -5.6054e+01 -5.5864e+01 -6.1482e+01 -5.2476e+01 -5.6038e+01 -5.5860e+01 -6.1494e+01 -5.2487e+01 -5.6023e+01 -5.5857e+01 -6.1505e+01 -5.2493e+01 -5.6007e+01 -5.5853e+01 -6.1515e+01 -5.2500e+01 -5.5992e+01 -5.5850e+01 -6.1525e+01 -5.2504e+01 -5.5977e+01 -5.5846e+01 -6.1534e+01 -5.2502e+01 -5.5962e+01 -5.5842e+01 -6.1542e+01 -5.2501e+01 -5.5947e+01 -5.5838e+01 -6.1550e+01 -5.2500e+01 -5.5932e+01 -5.5835e+01 -6.1556e+01 -5.2499e+01 -5.5917e+01 -5.5831e+01 -6.1562e+01 -5.2499e+01 -5.5902e+01 -5.5827e+01 -6.1568e+01 -5.2498e+01 -5.5887e+01 -5.5823e+01 -6.1573e+01 -5.2498e+01 -5.5872e+01 -5.5828e+01 -6.1577e+01 -5.2498e+01 -5.5858e+01 -5.5860e+01 -6.1580e+01 -5.2497e+01 -5.5843e+01 -5.5892e+01 -6.1583e+01 -5.2497e+01 -5.5828e+01 -5.5923e+01 -6.1577e+01 -5.2497e+01 -5.5814e+01 -5.5954e+01 -6.1571e+01 -5.2497e+01 -5.5799e+01 -5.5984e+01 -6.1564e+01 -5.2497e+01 -5.5785e+01 -5.6014e+01 -6.1557e+01 -5.2498e+01 -5.5770e+01 -5.6043e+01 -6.1549e+01 -5.2498e+01 -5.5756e+01 -5.6072e+01 -6.1541e+01 -5.2498e+01 -5.5741e+01 -5.6100e+01 -6.1533e+01 -5.2499e+01 -5.5727e+01 -5.6127e+01 -6.1524e+01 -5.2492e+01 -5.5712e+01 -5.6154e+01 -6.1515e+01 -5.2485e+01 -5.5698e+01 -5.6181e+01 -6.1505e+01 -5.2478e+01 -5.5684e+01 -5.6200e+01 -6.1495e+01 -5.2471e+01 -5.5669e+01 -5.6218e+01 -6.1485e+01 -5.2464e+01 -5.5655e+01 -5.6235e+01 -6.1474e+01 -5.2458e+01 -5.5641e+01 -5.6252e+01 -6.1463e+01 -5.2452e+01 -5.5619e+01 -5.6269e+01 -6.1452e+01 -5.2446e+01 -5.5597e+01 -5.6285e+01 -6.1440e+01 -5.2440e+01 -5.5575e+01 -5.6301e+01 -6.1428e+01 -5.2434e+01 -5.5553e+01 -5.6317e+01 -6.1415e+01 -5.2429e+01 -5.5532e+01 -5.6332e+01 -6.1403e+01 -5.2424e+01 -5.5510e+01 -5.6343e+01 -6.1389e+01 -5.2418e+01 -5.5489e+01 -5.6350e+01 -6.1376e+01 -5.2413e+01 -5.5463e+01 -5.6356e+01 -6.1362e+01 -5.2407e+01 -5.5435e+01 -5.6363e+01 -6.1348e+01 -5.2394e+01 -5.5406e+01 -5.6369e+01 -6.1333e+01 -5.2382e+01 -5.5378e+01 -5.6375e+01 -6.1318e+01 -5.2370e+01 -5.5350e+01 -5.6381e+01 -6.1303e+01 -5.2358e+01 -5.5323e+01 -5.6387e+01 -6.1287e+01 -5.2346e+01 -5.5296e+01 -5.6393e+01 -6.1313e+01 -5.2335e+01 -5.5269e+01 -5.6398e+01 -6.1341e+01 -5.2324e+01 -5.5243e+01 -5.6403e+01 -6.1368e+01 -5.2314e+01 -5.5216e+01 -5.6409e+01 -6.1394e+01 -5.2304e+01 -5.5191e+01 -5.6414e+01 -6.1419e+01 -5.2293e+01 -5.5165e+01 -5.6418e+01 -6.1443e+01 -5.2284e+01 -5.5131e+01 -5.6423e+01 -6.1466e+01 -5.2274e+01 -5.5098e+01 -5.6427e+01 -6.1482e+01 -5.2265e+01 -5.5066e+01 -5.6432e+01 -6.1495e+01 -5.2255e+01 -5.5034e+01 -5.6436e+01 -6.1508e+01 -5.2247e+01 -5.5003e+01 -5.6439e+01 -6.1520e+01 -5.2238e+01 -5.4971e+01 -5.6443e+01 -6.1532e+01 -5.2229e+01 -5.4941e+01 -5.6447e+01 -6.1542e+01 -5.2221e+01 -5.4911e+01 -5.6450e+01 -6.1553e+01 -5.2213e+01 -5.4881e+01 -5.6453e+01 -6.1562e+01 -5.2205e+01 -5.4851e+01 -5.6456e+01 -6.1571e+01 -5.2197e+01 -5.4822e+01 -5.6458e+01 -6.1579e+01 -5.2189e+01 -5.4793e+01 -5.6461e+01 -6.1581e+01 -5.2182e+01 -5.4761e+01 -5.6463e+01 -6.1573e+01 -5.2174e+01 -5.4725e+01 -5.6465e+01 -6.1563e+01 -5.2185e+01 -5.4690e+01 -5.6467e+01 -6.1554e+01 -5.2220e+01 -5.4655e+01 -5.6468e+01 -6.1544e+01 -5.2249e+01 -5.4621e+01 -5.6470e+01 -6.1535e+01 -5.2278e+01 -5.4587e+01 -5.6471e+01 -6.1525e+01 -5.2306e+01 -5.4554e+01 -5.6472e+01 -6.1510e+01 -5.2334e+01 -5.4521e+01 -5.6469e+01 -6.1491e+01 -5.2361e+01 -5.4488e+01 -5.6462e+01 -6.1471e+01 -5.2388e+01 -5.4456e+01 -5.6454e+01 -6.1445e+01 -5.2415e+01 -5.4425e+01 -5.6447e+01 -6.1419e+01 -5.2442e+01 -5.4394e+01 -5.6440e+01 -6.1392e+01 -5.2468e+01 -5.4363e+01 -5.6432e+01 -6.1366e+01 -5.2494e+01 -5.4333e+01 -5.6425e+01 -6.1340e+01 -5.2519e+01 -5.4304e+01 -5.6417e+01 -6.1312e+01 -5.2544e+01 -5.4274e+01 -5.6410e+01 -6.1279e+01 -5.2569e+01 -5.4245e+01 -5.6402e+01 -6.1245e+01 -5.2594e+01 -5.4212e+01 -5.6394e+01 -6.1212e+01 -5.2618e+01 -5.4176e+01 -5.6387e+01 -6.1180e+01 -5.2642e+01 -5.4140e+01 -5.6379e+01 -6.1147e+01 -5.2665e+01 -5.4105e+01 -5.6371e+01 -6.1115e+01 -5.2688e+01 -5.4071e+01 -5.6363e+01 -6.1083e+01 -5.2711e+01 -5.4032e+01 -5.6356e+01 -6.1051e+01 -5.2733e+01 -5.3991e+01 -5.6348e+01 -6.1020e+01 -5.2755e+01 -5.3951e+01 -5.6340e+01 -6.0988e+01 -5.2777e+01 -5.3911e+01 -5.6331e+01 -6.0954e+01 -5.2798e+01 -5.3872e+01 -5.6323e+01 -6.0907e+01 -5.2819e+01 -5.3826e+01 -5.6315e+01 -6.0861e+01 -5.2840e+01 -5.3780e+01 -5.6307e+01 -6.0816e+01 -5.2861e+01 -5.3735e+01 -5.6298e+01 -6.0770e+01 -5.2881e+01 -5.3691e+01 -5.6290e+01 -6.0726e+01 -5.2900e+01 -5.3648e+01 -5.6281e+01 -6.0682e+01 -5.2920e+01 -5.3605e+01 -5.6272e+01 -6.0639e+01 -5.2939e+01 -5.3564e+01 -5.6248e+01 -6.0596e+01 -5.2957e+01 -5.3523e+01 -5.6223e+01 -6.0553e+01 -5.2976e+01 -5.3482e+01 -5.6199e+01 -6.0511e+01 -5.2994e+01 -5.3443e+01 -5.6175e+01 -6.0470e+01 -5.3006e+01 -5.3404e+01 -5.6152e+01 -6.0428e+01 -5.3015e+01 -5.3366e+01 -5.6129e+01 -6.0416e+01 -5.3025e+01 -5.3328e+01 -5.6106e+01 -6.0420e+01 -5.3034e+01 -5.3291e+01 -5.6083e+01 -6.0423e+01 -5.3043e+01 -5.3255e+01 -5.6061e+01 -6.0427e+01 -5.3052e+01 -5.3220e+01 -5.6039e+01 -6.0430e+01 -5.3061e+01 -5.3185e+01 -5.6017e+01 -6.0433e+01 -5.3070e+01 -5.3150e+01 -5.5995e+01 -6.0436e+01 -5.3078e+01 -5.3116e+01 -5.5973e+01 -6.0438e+01 -5.3087e+01 -5.3083e+01 -5.5952e+01 -6.0440e+01 -5.3095e+01 -5.3050e+01 -5.5931e+01 -6.0442e+01 -5.3103e+01 -5.3018e+01 -5.5910e+01 -6.0444e+01 -5.3106e+01 -5.2980e+01 -5.5890e+01 -6.0445e+01 -5.3105e+01 -5.2941e+01 -5.5869e+01 -6.0446e+01 -5.3105e+01 -5.2903e+01 -5.5849e+01 -6.0447e+01 -5.3105e+01 -5.2865e+01 -5.5829e+01 -6.0448e+01 -5.3105e+01 -5.2828e+01 -5.5809e+01 -6.0448e+01 -5.3105e+01 -5.2792e+01 -5.5789e+01 -6.0448e+01 -5.3106e+01 -5.2757e+01 -5.5769e+01 -6.0447e+01 -5.3106e+01 -5.2722e+01 -5.5750e+01 -6.0447e+01 -5.3106e+01 -5.2687e+01 -5.5730e+01 -6.0446e+01 -5.3106e+01 -5.2654e+01 -5.5705e+01 -6.0444e+01 -5.3106e+01 -5.2621e+01 -5.5678e+01 -6.0443e+01 -5.3106e+01 -5.2588e+01 -5.5651e+01 -6.0441e+01 -5.3106e+01 -5.2556e+01 -5.5625e+01 -6.0439e+01 -5.3106e+01 -5.2525e+01 -5.5599e+01 -6.0437e+01 -5.3106e+01 -5.2494e+01 -5.5573e+01 -6.0434e+01 -5.3106e+01 -5.2464e+01 -5.5548e+01 -6.0431e+01 -5.3106e+01 -5.2434e+01 -5.5523e+01 -6.0428e+01 -5.3106e+01 -5.2405e+01 -5.5494e+01 -6.0424e+01 -5.3106e+01 -5.2376e+01 -5.5462e+01 -6.0420e+01 -5.3106e+01 -5.2348e+01 -5.5430e+01 -6.0416e+01 -5.3106e+01 -5.2316e+01 -5.5398e+01 -6.0408e+01 -5.3106e+01 -5.2281e+01 -5.5367e+01 -6.0395e+01 -5.3106e+01 -5.2246e+01 -5.5337e+01 -6.0382e+01 -5.3100e+01 -5.2213e+01 -5.5307e+01 -6.0369e+01 -5.3092e+01 -5.2179e+01 -5.5277e+01 -6.0356e+01 -5.3084e+01 -5.2147e+01 -5.5247e+01 -6.0335e+01 -5.3076e+01 -5.2115e+01 -5.5218e+01 -6.0314e+01 -5.3068e+01 -5.2083e+01 -5.5190e+01 -6.0293e+01 -5.3061e+01 -5.2052e+01 -5.5162e+01 -6.0303e+01 -5.3053e+01 -5.2022e+01 -5.5134e+01 -6.0326e+01 -5.3046e+01 -5.1992e+01 -5.5106e+01 -6.0349e+01 -5.3039e+01 -5.1963e+01 -5.5079e+01 -6.0371e+01 -5.3032e+01 -5.1934e+01 -5.5052e+01 -6.0393e+01 -5.3025e+01 -5.1906e+01 -5.5018e+01 -6.0414e+01 -5.3018e+01 -5.1878e+01 -5.4984e+01 -6.0435e+01 -5.3011e+01 -5.1851e+01 -5.4951e+01 -6.0454e+01 -5.3004e+01 -5.1821e+01 -5.4918e+01 -6.0474e+01 -5.2998e+01 -5.1787e+01 -5.4885e+01 -6.0492e+01 -5.2991e+01 -5.1747e+01 -5.4847e+01 -6.0511e+01 -5.2985e+01 -5.1701e+01 -5.4808e+01 -6.0528e+01 -5.2978e+01 -5.1653e+01 -5.4769e+01 -6.0545e+01 -5.2964e+01 -5.1606e+01 -5.4731e+01 -6.0561e+01 -5.2950e+01 -5.1561e+01 -5.4692e+01 -6.0577e+01 -5.2934e+01 -5.1516e+01 -5.4647e+01 -6.0592e+01 -5.2913e+01 -5.1511e+01 -5.4603e+01 -6.0607e+01 -5.2892e+01 -5.1512e+01 -5.4559e+01 -6.0621e+01 -5.2871e+01 -5.1509e+01 -5.4517e+01 -6.0635e+01 -5.2851e+01 -5.1503e+01 -5.4475e+01 -6.0648e+01 -5.2831e+01 -5.1497e+01 -5.4434e+01 -6.0660e+01 -5.2825e+01 -5.1492e+01 -5.4393e+01 -6.0672e+01 -5.2850e+01 -5.1487e+01 -5.4353e+01 -6.0683e+01 -5.2875e+01 -5.1482e+01 -5.4314e+01 -6.0694e+01 -5.2900e+01 -5.1478e+01 -5.4276e+01 -6.0704e+01 -5.2924e+01 -5.1474e+01 -5.4238e+01 -6.0714e+01 -5.2948e+01 -5.1470e+01 -5.4201e+01 -6.0723e+01 -5.2972e+01 -5.1467e+01 -5.4164e+01 -6.0732e+01 -5.2996e+01 -5.1464e+01 -5.4128e+01 -6.0740e+01 -5.3011e+01 -5.1461e+01 -5.4093e+01 -6.0747e+01 -5.3026e+01 -5.1459e+01 -5.4058e+01 -6.0755e+01 -5.3041e+01 -5.1457e+01 -5.4016e+01 -6.0761e+01 -5.3056e+01 -5.1491e+01 -5.3984e+01 -6.0759e+01 -5.3071e+01 -5.1533e+01 -5.3979e+01 -6.0757e+01 -5.3086e+01 -5.1575e+01 -5.3975e+01 -6.0754e+01 -5.3100e+01 -5.1617e+01 -5.3972e+01 -6.0751e+01 -5.3115e+01 -5.1658e+01 -5.3968e+01 -6.0748e+01 -5.3129e+01 -5.1699e+01 -5.3965e+01 -6.0744e+01 -5.3143e+01 -5.1740e+01 -5.3962e+01 -6.0741e+01 -5.3157e+01 -5.1780e+01 -5.3959e+01 -6.0737e+01 -5.3171e+01 -5.1819e+01 -5.3956e+01 -6.0732e+01 -5.3184e+01 -5.1859e+01 -5.3953e+01 -6.0727e+01 -5.3198e+01 -5.1897e+01 -5.3951e+01 -6.0722e+01 -5.3211e+01 -5.1936e+01 -5.3949e+01 -6.0717e+01 -5.3224e+01 -5.1973e+01 -5.3946e+01 -6.0711e+01 -5.3237e+01 -5.2011e+01 -5.3944e+01 -6.0706e+01 -5.3250e+01 -5.2048e+01 -5.3942e+01 -6.0699e+01 -5.3256e+01 -5.2084e+01 -5.3941e+01 -6.0693e+01 -5.3261e+01 -5.2120e+01 -5.3939e+01 -6.0686e+01 -5.3265e+01 -5.2156e+01 -5.3937e+01 -6.0679e+01 -5.3270e+01 -5.2191e+01 -5.3936e+01 -6.0671e+01 -5.3275e+01 -5.2226e+01 -5.3934e+01 -6.0664e+01 -5.3279e+01 -5.2260e+01 -5.3933e+01 -6.0667e+01 -5.3284e+01 -5.2290e+01 -5.3932e+01 -6.0704e+01 -5.3288e+01 -5.2316e+01 -5.3931e+01 -6.0739e+01 -5.3293e+01 -5.2341e+01 -5.3930e+01 -6.0773e+01 -5.3297e+01 -5.2366e+01 -5.3928e+01 -6.0836e+01 -5.3297e+01 -5.2391e+01 -5.3927e+01 -6.0912e+01 -5.3293e+01 -5.2416e+01 -5.3926e+01 -6.0987e+01 -5.3286e+01 -5.2440e+01 -5.3925e+01 -6.1061e+01 -5.3275e+01 -5.2464e+01 -5.3924e+01 -6.1133e+01 -5.3264e+01 -5.2488e+01 -5.3924e+01 -6.1203e+01 -5.3254e+01 -5.2511e+01 -5.3923e+01 -6.1272e+01 -5.3244e+01 -5.2535e+01 -5.3922e+01 -6.1339e+01 -5.3234e+01 -5.2558e+01 -5.3921e+01 -6.1405e+01 -5.3225e+01 -5.2580e+01 -5.3920e+01 -6.1470e+01 -5.3216e+01 -5.2603e+01 -5.3919e+01 -6.1533e+01 -5.3207e+01 -5.2625e+01 -5.3918e+01 -6.1594e+01 -5.3198e+01 -5.2655e+01 -5.3917e+01 -6.1654e+01 -5.3190e+01 -5.2721e+01 -5.3916e+01 -6.1713e+01 -5.3181e+01 -5.2786e+01 -5.3915e+01 -6.1770e+01 -5.3173e+01 -5.2850e+01 -5.3914e+01 -6.1826e+01 -5.3166e+01 -5.2914e+01 -5.3913e+01 -6.1881e+01 -5.3158e+01 -5.2976e+01 -5.3912e+01 -6.1934e+01 -5.3151e+01 -5.3037e+01 -5.3911e+01 -6.1986e+01 -5.3144e+01 -5.3098e+01 -5.3910e+01 -6.2037e+01 -5.3137e+01 -5.3158e+01 -5.3909e+01 -6.2086e+01 -5.3130e+01 -5.3217e+01 -5.3908e+01 -6.2134e+01 -5.3124e+01 -5.3274e+01 -5.3907e+01 -6.2181e+01 -5.3117e+01 -5.3331e+01 -5.3905e+01 -6.2226e+01 -5.3111e+01 -5.3387e+01 -5.3904e+01 -6.2271e+01 -5.3105e+01 -5.3443e+01 -5.3902e+01 -6.2314e+01 -5.3099e+01 -5.3497e+01 -5.3901e+01 -6.2356e+01 -5.3093e+01 -5.3551e+01 -5.3896e+01 -6.2396e+01 -5.3087e+01 -5.3603e+01 -5.3887e+01 -6.2436e+01 -5.3082e+01 -5.3655e+01 -5.3877e+01 -6.2467e+01 -5.3076e+01 -5.3706e+01 -5.3868e+01 -6.2489e+01 -5.3071e+01 -5.3756e+01 -5.3859e+01 -6.2509e+01 -5.3065e+01 -5.3805e+01 -5.3850e+01 -6.2529e+01 -5.3060e+01 -5.3854e+01 -5.3841e+01 -6.2548e+01 -5.3049e+01 -5.3902e+01 -5.3832e+01 -6.2566e+01 -5.3036e+01 -5.3948e+01 -5.3824e+01 -6.2584e+01 -5.3023e+01 -5.3995e+01 -5.3815e+01 -6.2601e+01 -5.3011e+01 -5.4040e+01 -5.3807e+01 -6.2617e+01 -5.2999e+01 -5.4084e+01 -5.3798e+01 -6.2633e+01 -5.2987e+01 -5.4128e+01 -5.3790e+01 -6.2647e+01 -5.2976e+01 -5.4171e+01 -5.3781e+01 -6.2662e+01 -5.2964e+01 -5.4213e+01 -5.3773e+01 -6.2675e+01 -5.2953e+01 -5.4255e+01 -5.3765e+01 -6.2688e+01 -5.2942e+01 -5.4295e+01 -5.3757e+01 -6.2700e+01 -5.2932e+01 -5.4335e+01 -5.3749e+01 -6.2711e+01 -5.2921e+01 -5.4374e+01 -5.3741e+01 -6.2722e+01 -5.2911e+01 -5.4413e+01 -5.3733e+01 -6.2732e+01 -5.2898e+01 -5.4451e+01 -5.3725e+01 -6.2741e+01 -5.2880e+01 -5.4488e+01 -5.3717e+01 -6.2750e+01 -5.2862e+01 -5.4524e+01 -5.3708e+01 -6.2758e+01 -5.2845e+01 -5.4559e+01 -5.3693e+01 -6.2765e+01 -5.2829e+01 -5.4594e+01 -5.3677e+01 -6.2772e+01 -5.2812e+01 -5.4628e+01 -5.3662e+01 -6.2778e+01 -5.2796e+01 -5.4662e+01 -5.3647e+01 -6.2784e+01 -5.2780e+01 -5.4695e+01 -5.3632e+01 -6.2789e+01 -5.2765e+01 -5.4727e+01 -5.3617e+01 -6.2793e+01 -5.2747e+01 -5.4758e+01 -5.3603e+01 -6.2797e+01 -5.2724e+01 -5.4789e+01 -5.3589e+01 -6.2800e+01 -5.2702e+01 -5.4819e+01 -5.3574e+01 -6.2803e+01 -5.2678e+01 -5.4849e+01 -5.3561e+01 -6.2805e+01 -5.2649e+01 -5.4878e+01 -5.3547e+01 -6.2806e+01 -5.2620e+01 -5.4906e+01 -5.3533e+01 -6.2807e+01 -5.2592e+01 -5.4927e+01 -5.3520e+01 -6.2807e+01 -5.2565e+01 -5.4947e+01 -5.3507e+01 -6.2807e+01 -5.2538e+01 -5.4965e+01 -5.3490e+01 -6.2806e+01 -5.2512e+01 -5.4984e+01 -5.3469e+01 -6.2804e+01 -5.2486e+01 -5.5001e+01 -5.3449e+01 -6.2802e+01 -5.2461e+01 -5.5019e+01 -5.3429e+01 -6.2800e+01 -5.2436e+01 -5.5036e+01 -5.3409e+01 -6.2797e+01 -5.2412e+01 -5.5053e+01 -5.3389e+01 -6.2793e+01 -5.2383e+01 -5.5069e+01 -5.3370e+01 -6.2789e+01 -5.2352e+01 -5.5085e+01 -5.3351e+01 -6.2785e+01 -5.2322e+01 -5.5100e+01 -5.3332e+01 -6.2779e+01 -5.2292e+01 -5.5115e+01 -5.3314e+01 -6.2774e+01 -5.2263e+01 -5.5130e+01 -5.3296e+01 -6.2768e+01 -5.2235e+01 -5.5144e+01 -5.3278e+01 -6.2761e+01 -5.2207e+01 -5.5158e+01 -5.3260e+01 -6.2754e+01 -5.2180e+01 -5.5172e+01 -5.3243e+01 -6.2746e+01 -5.2154e+01 -5.5185e+01 -5.3226e+01 -6.2738e+01 -5.2128e+01 -5.5197e+01 -5.3209e+01 -6.2730e+01 -5.2102e+01 -5.5210e+01 -5.3192e+01 -6.2721e+01 -5.2077e+01 -5.5222e+01 -5.3172e+01 -6.2711e+01 -5.2053e+01 -5.5268e+01 -5.3147e+01 -6.2701e+01 -5.2029e+01 -5.5324e+01 -5.3124e+01 -6.2691e+01 -5.2006e+01 -5.5378e+01 -5.3100e+01 -6.2680e+01 -5.1983e+01 -5.5431e+01 -5.3078e+01 -6.2669e+01 -5.1961e+01 -5.5483e+01 -5.3055e+01 -6.2657e+01 -5.1939e+01 -5.5535e+01 -5.3033e+01 -6.2645e+01 -5.1918e+01 -5.5585e+01 -5.3011e+01 -6.2633e+01 -5.1897e+01 -5.5634e+01 -5.2990e+01 -6.2620e+01 -5.1876e+01 -5.5683e+01 -5.2968e+01 -6.2606e+01 -5.1856e+01 -5.5730e+01 -5.2948e+01 -6.2593e+01 -5.1837e+01 -5.5777e+01 -5.2927e+01 -6.2578e+01 -5.1817e+01 -5.5822e+01 -5.2907e+01 -6.2556e+01 -5.1798e+01 -5.5867e+01 -5.2887e+01 -6.2533e+01 -5.1780e+01 -5.5910e+01 -5.2868e+01 -6.2510e+01 -5.1762e+01 -5.5953e+01 -5.2848e+01 -6.2487e+01 -5.1744e+01 -5.5991e+01 -5.2829e+01 -6.2464e+01 -5.1727e+01 -5.6024e+01 -5.2811e+01 -6.2440e+01 -5.1710e+01 -5.6057e+01 -5.2792e+01 -6.2417e+01 -5.1693e+01 -5.6088e+01 -5.2774e+01 -6.2393e+01 -5.1677e+01 -5.6119e+01 -5.2756e+01 -6.2369e+01 -5.1661e+01 -5.6150e+01 -5.2739e+01 -6.2344e+01 -5.1645e+01 -5.6179e+01 -5.2721e+01 -6.2320e+01 -5.1630e+01 -5.6208e+01 -5.2704e+01 -6.2296e+01 -5.1615e+01 -5.6237e+01 -5.2687e+01 -6.2271e+01 -5.1600e+01 -5.6265e+01 -5.2671e+01 -6.2246e+01 -5.1585e+01 -5.6292e+01 -5.2654e+01 -6.2221e+01 -5.1571e+01 -5.6318e+01 -5.2638e+01 -6.2196e+01 -5.1557e+01 -5.6336e+01 -5.2614e+01 -6.2170e+01 -5.1543e+01 -5.6354e+01 -5.2591e+01 -6.2145e+01 -5.1530e+01 -5.6371e+01 -5.2568e+01 -6.2119e+01 -5.1517e+01 -5.6387e+01 -5.2545e+01 -6.2093e+01 -5.1504e+01 -5.6404e+01 -5.2522e+01 -6.2067e+01 -5.1491e+01 -5.6419e+01 -5.2500e+01 -6.2041e+01 -5.1479e+01 -5.6435e+01 -5.2478e+01 -6.2014e+01 -5.1466e+01 -5.6449e+01 -5.2457e+01 -6.1988e+01 -5.1454e+01 -5.6464e+01 -5.2436e+01 -6.1961e+01 -5.1443e+01 -5.6478e+01 -5.2415e+01 -6.1934e+01 -5.1431e+01 -5.6492e+01 -5.2395e+01 -6.1907e+01 -5.1419e+01 -5.6505e+01 -5.2375e+01 -6.1880e+01 -5.1408e+01 -5.6518e+01 -5.2355e+01 -6.1852e+01 -5.1397e+01 -5.6530e+01 -5.2336e+01 -6.1825e+01 -5.1386e+01 -5.6534e+01 -5.2317e+01 -6.1797e+01 -5.1376e+01 -5.6538e+01 -5.2298e+01 -6.1770e+01 -5.1365e+01 -5.6542e+01 -5.2279e+01 -6.1742e+01 -5.1355e+01 -5.6545e+01 -5.2261e+01 -6.1714e+01 -5.1345e+01 -5.6549e+01 -5.2243e+01 -6.1681e+01 -5.1335e+01 -5.6552e+01 -5.2225e+01 -6.1645e+01 -5.1325e+01 -5.6554e+01 -5.2208e+01 -6.1609e+01 -5.1315e+01 -5.6557e+01 -5.2191e+01 -6.1573e+01 -5.1306e+01 -5.6559e+01 -5.2174e+01 -6.1537e+01 -5.1296e+01 -5.6562e+01 -5.2157e+01 -6.1501e+01 -5.1287e+01 -5.6564e+01 -5.2140e+01 -6.1465e+01 -5.1278e+01 -5.6565e+01 -5.2124e+01 -6.1429e+01 -5.1262e+01 -5.6567e+01 -5.2108e+01 -6.1393e+01 -5.1245e+01 -5.6568e+01 -5.2092e+01 -6.1357e+01 -5.1229e+01 -5.6569e+01 -5.2077e+01 -6.1322e+01 -5.1213e+01 -5.6570e+01 -5.2061e+01 -6.1286e+01 -5.1197e+01 -5.6571e+01 -5.2046e+01 -6.1250e+01 -5.1182e+01 -5.6571e+01 -5.2031e+01 -6.1215e+01 -5.1166e+01 -5.6572e+01 -5.2016e+01 -6.1179e+01 -5.1151e+01 -5.6566e+01 -5.2002e+01 -6.1144e+01 -5.1137e+01 -5.6558e+01 -5.1987e+01 -6.1108e+01 -5.1123e+01 -5.6550e+01 -5.1973e+01 -6.1073e+01 -5.1108e+01 -5.6542e+01 -5.1959e+01 -6.1037e+01 -5.1095e+01 -5.6533e+01 -5.1945e+01 -6.1002e+01 -5.1081e+01 -5.6525e+01 -5.1931e+01 -6.0967e+01 -5.1066e+01 -5.6517e+01 -5.1918e+01 -6.0931e+01 -5.1045e+01 -5.6509e+01 -5.1904e+01 -6.0929e+01 -5.1025e+01 -5.6501e+01 -5.1891e+01 -6.0938e+01 -5.1004e+01 -5.6492e+01 -5.1878e+01 -6.0946e+01 -5.0985e+01 -5.6484e+01 -5.1865e+01 -6.0954e+01 -5.0965e+01 -5.6476e+01 -5.1852e+01 -6.0961e+01 -5.0946e+01 -5.6467e+01 -5.1840e+01 -6.0967e+01 -5.0928e+01 -5.6459e+01 -5.1827e+01 -6.0973e+01 -5.0910e+01 -5.6443e+01 -5.1815e+01 -6.0979e+01 -5.0892e+01 -5.6426e+01 -5.1803e+01 -6.0983e+01 -5.0874e+01 -5.6410e+01 -5.1791e+01 -6.0987e+01 -5.0857e+01 -5.6394e+01 -5.1779e+01 -6.0991e+01 -5.0840e+01 -5.6378e+01 -5.1767e+01 -6.0994e+01 -5.0824e+01 -5.6362e+01 -5.1755e+01 -6.0996e+01 -5.0808e+01 -5.6346e+01 -5.1743e+01 -6.0998e+01 -5.0792e+01 -5.6330e+01 -5.1732e+01 -6.1000e+01 -5.0776e+01 -5.6314e+01 -5.1721e+01 -6.1000e+01 -5.0761e+01 -5.6299e+01 -5.1709e+01 -6.1001e+01 -5.0746e+01 -5.6283e+01 -5.1698e+01 -6.1000e+01 -5.0732e+01 -5.6268e+01 -5.1687e+01 -6.1000e+01 -5.0717e+01 -5.6253e+01 -5.1676e+01 -6.0998e+01 -5.0703e+01 -5.6237e+01 -5.1665e+01 -6.0996e+01 -5.0690e+01 -5.6222e+01 -5.1654e+01 -6.0994e+01 -5.0676e+01 -5.6207e+01 -5.1644e+01 -6.0991e+01 -5.0663e+01 -5.6192e+01 -5.1627e+01 -6.0988e+01 -5.0650e+01 -5.6177e+01 -5.1609e+01 -6.0984e+01 -5.0636e+01 -5.6162e+01 -5.1591e+01 -6.0980e+01 -5.0616e+01 -5.6147e+01 -5.1573e+01 -6.0975e+01 -5.0596e+01 -5.6132e+01 -5.1555e+01 -6.0970e+01 -5.0576e+01 -5.6118e+01 -5.1538e+01 -6.0964e+01 -5.0557e+01 -5.6103e+01 -5.1521e+01 -6.0958e+01 -5.0538e+01 -5.6088e+01 -5.1504e+01 -6.0952e+01 -5.0520e+01 -5.6073e+01 -5.1488e+01 -6.0945e+01 -5.0502e+01 -5.6059e+01 -5.1472e+01 -6.0937e+01 -5.0484e+01 -5.6044e+01 -5.1456e+01 -6.0929e+01 -5.0463e+01 -5.6029e+01 -5.1440e+01 -6.0921e+01 -5.0438e+01 -5.6015e+01 -5.1425e+01 -6.0912e+01 -5.0414e+01 -5.6000e+01 -5.1409e+01 -6.0903e+01 -5.0390e+01 -5.5986e+01 -5.1394e+01 -6.0894e+01 -5.0367e+01 -5.5971e+01 -5.1375e+01 -6.0884e+01 -5.0344e+01 -5.5957e+01 -5.1352e+01 -6.0874e+01 -5.0322e+01 -5.5942e+01 -5.1330e+01 -6.0863e+01 -5.0300e+01 -5.5927e+01 -5.1308e+01 -6.0852e+01 -5.0279e+01 -5.5913e+01 -5.1287e+01 -6.0840e+01 -5.0258e+01 -5.5898e+01 -5.1266e+01 -6.0828e+01 -5.0238e+01 -5.5884e+01 -5.1245e+01 -6.0816e+01 -5.0218e+01 -5.5869e+01 -5.1219e+01 -6.0804e+01 -5.0199e+01 -5.5855e+01 -5.1190e+01 -6.0791e+01 -5.0180e+01 -5.5840e+01 -5.1155e+01 -6.0777e+01 -5.0161e+01 -5.5826e+01 -5.1120e+01 -6.0764e+01 -5.0143e+01 -5.5811e+01 -5.1087e+01 -6.0750e+01 -5.0126e+01 -5.5797e+01 -5.1054e+01 -6.0735e+01 -5.0108e+01 -5.5782e+01 -5.1021e+01 -6.0721e+01 -5.0091e+01 -5.5767e+01 -5.0990e+01 -6.0706e+01 -5.0075e+01 -5.5753e+01 -5.0959e+01 -6.0690e+01 -5.0059e+01 -5.5738e+01 -5.0928e+01 -6.0675e+01 -5.0043e+01 -5.5724e+01 -5.0898e+01 -6.0659e+01 -5.0027e+01 -5.5709e+01 -5.0869e+01 -6.0643e+01 -5.0012e+01 -5.5694e+01 -5.0841e+01 -6.0626e+01 -1.0000e+01 -5.5680e+01 -5.0813e+01 -6.0609e+01 -6.0000e+01 -5.5665e+01 -5.0785e+01 -6.0592e+01 -6.0000e+01 -5.5650e+01 -5.0758e+01 -6.0575e+01 -6.0000e+01 -5.5636e+01 -5.0745e+01 -6.0557e+01 -6.0000e+01 -5.5621e+01 -5.0755e+01 -6.0539e+01 -6.0000e+01 -5.5606e+01 -5.0766e+01 -6.0521e+01 -6.0000e+01 -5.5591e+01 -5.0777e+01 -6.0502e+01 -6.0000e+01 -5.5574e+01 -5.0788e+01 -6.0524e+01 -6.0000e+01 -5.5551e+01 -5.0799e+01 -6.0549e+01 -6.0000e+01 -5.5528e+01 -5.0810e+01 -6.0573e+01 -6.0000e+01 -5.5506e+01 -5.0821e+01 -6.0596e+01 -6.0000e+01 -5.5484e+01 -5.0832e+01 -6.0618e+01 -6.0000e+01 -5.5461e+01 -5.0843e+01 -6.0640e+01 -6.0000e+01 -5.5439e+01 -5.0854e+01 -6.0660e+01 -6.0000e+01 -5.5418e+01 -5.0865e+01 -6.0680e+01 -6.0000e+01 -5.5396e+01 -5.0876e+01 -6.0699e+01 -6.0000e+01 -5.5371e+01 -5.0924e+01 -6.0717e+01 -6.0000e+01 -5.5342e+01 -5.0971e+01 -6.0734e+01 -6.0000e+01 -5.5313e+01 -5.1018e+01 -6.0750e+01 -6.0000e+01 -5.5284e+01 -5.1064e+01 -6.0766e+01 -6.0000e+01 -5.5256e+01 -5.1110e+01 -6.0780e+01 -6.0000e+01 -5.5228e+01 -5.1155e+01 -6.0794e+01 -6.0000e+01 -5.5200e+01 -5.1200e+01 -6.0807e+01 -6.0000e+01 -5.5173e+01 -5.1244e+01 -6.0820e+01 -6.0000e+01 -5.5145e+01 -5.1288e+01 -6.0831e+01 -6.0000e+01 -5.5119e+01 -5.1331e+01 -6.0842e+01 -6.0000e+01 -5.5092e+01 -5.1374e+01 -6.0853e+01 -6.0000e+01 -5.5066e+01 -5.1416e+01 -6.0862e+01 -6.0000e+01 -5.5040e+01 -5.1458e+01 -6.0871e+01 -6.0000e+01 -5.5014e+01 -5.1499e+01 -6.0879e+01 -6.0000e+01 -5.4988e+01 -5.1540e+01 -6.0886e+01 -6.0000e+01 -5.4963e+01 -5.1581e+01 -6.0893e+01 -6.0000e+01 -5.4938e+01 -5.1620e+01 -6.0899e+01 -6.0000e+01 -5.4913e+01 -5.1660e+01 -6.0904e+01 -6.0000e+01 -5.4888e+01 -5.1691e+01 -6.0909e+01 -6.0000e+01 -5.4864e+01 -5.1721e+01 -6.0955e+01 -6.0000e+01 -5.4840e+01 -5.1752e+01 -6.0996e+01 -6.0000e+01 -5.4816e+01 -5.1782e+01 -6.1035e+01 -6.0000e+01 -5.4792e+01 -5.1811e+01 -6.1072e+01 -6.0000e+01 -5.4768e+01 -5.1841e+01 -6.1108e+01 -6.0000e+01 -5.4737e+01 -5.1870e+01 -6.1143e+01 -6.0000e+01 -5.4706e+01 -5.1899e+01 -6.1177e+01 -6.0000e+01 -5.4675e+01 -5.1927e+01 -6.1210e+01 -6.0000e+01 -5.4645e+01 -5.1955e+01 -6.1242e+01 -6.0000e+01 -5.4615e+01 -5.1983e+01 -6.1273e+01 -6.0000e+01 -5.4586e+01 -5.2011e+01 -6.1303e+01 -6.0000e+01 -5.4557e+01 -5.2038e+01 -6.1332e+01 -6.0000e+01 -5.4528e+01 -5.2065e+01 -6.1361e+01 -6.0000e+01 -5.4500e+01 -5.2091e+01 -6.1388e+01 -6.0000e+01 -5.4463e+01 -5.2117e+01 -6.1414e+01 -5.9989e+01 -5.4428e+01 -5.2143e+01 -6.1439e+01 -5.9927e+01 -5.4393e+01 -5.2169e+01 -6.1463e+01 -5.9865e+01 -5.4358e+01 -5.2194e+01 -6.1487e+01 -5.9803e+01 -5.4324e+01 -5.2219e+01 -6.1509e+01 -5.9742e+01 -5.4291e+01 -5.2244e+01 -6.1531e+01 -5.9681e+01 -5.4258e+01 -5.2268e+01 -6.1552e+01 -5.9621e+01 -5.4225e+01 -5.2292e+01 -6.1572e+01 -5.9562e+01 -5.4193e+01 -5.2316e+01 -6.1591e+01 -5.9502e+01 -5.4161e+01 -5.2339e+01 -6.1609e+01 -5.9444e+01 -5.4130e+01 -5.2362e+01 -6.1626e+01 -5.9385e+01 -5.4099e+01 -5.2385e+01 -6.1643e+01 -5.9328e+01 -5.4068e+01 -5.2407e+01 -6.1659e+01 -5.9270e+01 -5.4038e+01 -5.2429e+01 -6.1673e+01 -5.9213e+01 -5.4009e+01 -5.2451e+01 -6.1688e+01 -5.9157e+01 -5.3979e+01 -5.2472e+01 -6.1701e+01 -5.9101e+01 -5.3950e+01 -5.2494e+01 -6.1713e+01 -5.9045e+01 -5.3922e+01 -5.2514e+01 -6.1725e+01 -5.8990e+01 -5.3894e+01 -5.2535e+01 -6.1736e+01 -5.8935e+01 -5.3866e+01 -5.2555e+01 -6.1746e+01 -5.8881e+01 -5.3838e+01 -5.2575e+01 -6.1747e+01 -5.8827e+01 -5.3811e+01 -5.2594e+01 -6.1748e+01 -5.8773e+01 -5.3784e+01 -5.2613e+01 -6.1749e+01 -5.8720e+01 -5.3758e+01 -5.2632e+01 -6.1749e+01 -5.8667e+01 -5.3732e+01 -5.2650e+01 -6.1748e+01 -5.8614e+01 -5.3706e+01 -5.2669e+01 -6.1747e+01 -5.8562e+01 -5.3680e+01 -5.2686e+01 -6.1746e+01 -5.8511e+01 -5.3655e+01 -5.2704e+01 -6.1744e+01 -5.8459e+01 -5.3630e+01 -5.2721e+01 -6.1741e+01 -5.8408e+01 -5.3605e+01 -5.2738e+01 -6.1738e+01 -5.8358e+01 -5.3581e+01 -5.2755e+01 -6.1735e+01 -5.8307e+01 -5.3581e+01 -5.2771e+01 -6.1731e+01 -5.8257e+01 -5.3601e+01 -5.2787e+01 -6.1726e+01 -5.8201e+01 -5.3621e+01 -5.2803e+01 -6.1721e+01 -5.8144e+01 -5.3641e+01 -5.2817e+01 -6.1716e+01 -5.8087e+01 -5.3659e+01 -5.2824e+01 -6.1710e+01 -5.8031e+01 -5.3670e+01 -5.2831e+01 -6.1704e+01 -5.7976e+01 -5.3681e+01 -5.2838e+01 -6.1697e+01 -5.7921e+01 -5.3691e+01 -5.2845e+01 -6.1690e+01 -5.7859e+01 -5.3702e+01 -5.2887e+01 -6.1683e+01 -5.7797e+01 -5.3712e+01 -5.2930e+01 -6.1675e+01 -5.7736e+01 -5.3722e+01 -5.2972e+01 -6.1666e+01 -5.7676e+01 -5.3732e+01 -5.3014e+01 -6.1657e+01 -5.7616e+01 -5.3741e+01 -5.3055e+01 -6.1648e+01 -5.7557e+01 -5.3751e+01 -5.3095e+01 -6.1639e+01 -5.7498e+01 -5.3760e+01 -5.3135e+01 -6.1628e+01 -5.7440e+01 -5.3769e+01 -5.3174e+01 -6.1618e+01 -5.7383e+01 -5.3777e+01 -5.3213e+01 -6.1607e+01 -5.7327e+01 -5.3786e+01 -5.3251e+01 -6.1596e+01 -5.7271e+01 -5.3794e+01 -5.3284e+01 -6.1584e+01 -5.7215e+01 -5.3802e+01 -5.3313e+01 -6.1572e+01 -5.7160e+01 -5.3810e+01 -5.3342e+01 -6.1560e+01 -5.7106e+01 -5.3818e+01 -5.3370e+01 -6.1547e+01 -5.7052e+01 -5.3825e+01 -5.3398e+01 -6.1534e+01 -5.6999e+01 -5.3833e+01 -5.3426e+01 -6.1520e+01 -5.6946e+01 -5.3840e+01 -5.3453e+01 -6.1507e+01 -5.6894e+01 -5.3847e+01 -5.3480e+01 -6.1492e+01 -5.6843e+01 -5.3853e+01 -5.3507e+01 -6.1478e+01 -5.6792e+01 -5.3860e+01 -5.3531e+01 -6.1463e+01 -5.6741e+01 -5.3866e+01 -5.3549e+01 -6.1448e+01 -5.6691e+01 -5.3872e+01 -5.3567e+01 -6.1432e+01 -5.6642e+01 -5.3878e+01 -5.3584e+01 -6.1416e+01 -5.6593e+01 -5.3884e+01 -5.3601e+01 -6.1400e+01 -5.6544e+01 -5.3889e+01 -5.3618e+01 -6.1384e+01 -5.6496e+01 -5.3894e+01 -5.3635e+01 -6.1367e+01 -5.6443e+01 -5.3899e+01 -5.3652e+01 -6.1350e+01 -5.6388e+01 -5.3904e+01 -5.3669e+01 -6.1332e+01 -5.6333e+01 -5.3909e+01 -5.3685e+01 -6.1314e+01 -5.6279e+01 -5.3913e+01 -5.3701e+01 -6.1296e+01 -5.6226e+01 -5.3917e+01 -5.3717e+01 -6.1278e+01 -5.6174e+01 -5.3921e+01 -5.3733e+01 -6.1259e+01 -5.6122e+01 -5.3925e+01 -5.3748e+01 -6.1240e+01 -5.6071e+01 -5.3929e+01 -5.3763e+01 -6.1221e+01 -5.6020e+01 -5.3932e+01 -5.3778e+01 -6.1202e+01 -5.5970e+01 -5.3935e+01 -5.3793e+01 -6.1182e+01 -5.5920e+01 -5.3938e+01 -5.3808e+01 -6.1162e+01 -5.5871e+01 -5.3941e+01 -5.3822e+01 -6.1142e+01 -5.5823e+01 -5.3944e+01 -5.3835e+01 -6.1121e+01 -5.5775e+01 -5.3946e+01 -5.3840e+01 -6.1100e+01 -5.5728e+01 -5.3948e+01 -5.3846e+01 -6.1072e+01 -5.5681e+01 -5.3950e+01 -5.3852e+01 -6.1043e+01 -5.5634e+01 -5.3952e+01 -5.3858e+01 -6.1014e+01 -5.5589e+01 -5.3954e+01 -5.3864e+01 -6.0984e+01 -5.5543e+01 -5.3955e+01 -5.3869e+01 -6.0955e+01 -5.5499e+01 -5.3957e+01 -5.3875e+01 -6.0926e+01 -5.5454e+01 -5.3958e+01 -5.3872e+01 -6.0896e+01 -5.5410e+01 -5.3959e+01 -5.3870e+01 -6.0867e+01 -5.5367e+01 -5.3959e+01 -5.3868e+01 -6.0838e+01 -5.5324e+01 -5.3960e+01 -5.3866e+01 -6.0808e+01 -5.5281e+01 -5.3960e+01 -5.3864e+01 -6.0779e+01 -5.5233e+01 -5.3960e+01 -5.3862e+01 -6.0749e+01 -5.5183e+01 -5.3960e+01 -5.3860e+01 -6.0719e+01 -5.5134e+01 -5.3960e+01 -5.3858e+01 -6.0690e+01 -5.5086e+01 -5.3960e+01 -5.3857e+01 -6.0660e+01 -5.5039e+01 -5.3959e+01 -5.3855e+01 -6.0630e+01 -5.4992e+01 -5.3959e+01 -5.3854e+01 -6.0600e+01 -5.4945e+01 -5.3958e+01 -5.3852e+01 -6.0570e+01 -5.4899e+01 -5.3957e+01 -5.3851e+01 -6.0541e+01 -5.4854e+01 -5.3955e+01 -5.3849e+01 -6.0511e+01 -5.4809e+01 -5.3954e+01 -5.3848e+01 -6.0481e+01 -5.4760e+01 -5.3952e+01 -5.3847e+01 -6.0451e+01 -5.4708e+01 -5.3951e+01 -5.3846e+01 -6.0420e+01 -5.4658e+01 -5.3949e+01 -5.3844e+01 -6.0390e+01 -5.4607e+01 -5.3947e+01 -5.3843e+01 -6.0360e+01 -5.4558e+01 -5.3944e+01 -5.3842e+01 -6.0330e+01 -5.4509e+01 -5.3942e+01 -5.3841e+01 -6.0300e+01 -5.4461e+01 -5.3940e+01 -5.3839e+01 -6.0269e+01 -5.4414e+01 -5.3937e+01 -5.3838e+01 -6.0239e+01 -5.4367e+01 -5.3934e+01 -5.3837e+01 -6.0209e+01 -5.4321e+01 -5.3931e+01 -5.3836e+01 -6.0178e+01 -5.4276e+01 -5.3928e+01 -5.3835e+01 -6.0148e+01 -5.4231e+01 -5.3925e+01 -5.3833e+01 -6.0117e+01 -5.4187e+01 -5.3916e+01 -5.3832e+01 -6.0087e+01 -5.4143e+01 -5.3905e+01 -5.3831e+01 -6.0056e+01 -5.4100e+01 -5.3886e+01 -5.3829e+01 -6.0026e+01 -5.4057e+01 -5.3866e+01 -5.3828e+01 -5.9995e+01 -5.4015e+01 -5.3847e+01 -5.3827e+01 -5.9964e+01 -5.3974e+01 -5.3829e+01 -5.3861e+01 -5.9934e+01 -5.3930e+01 -5.3810e+01 -5.3896e+01 -5.9903e+01 -5.3882e+01 -5.3792e+01 -5.3930e+01 -5.9872e+01 -5.3835e+01 -5.3774e+01 -5.3963e+01 -5.9841e+01 -5.3788e+01 -5.3756e+01 -5.3997e+01 -5.9811e+01 -5.3742e+01 -5.3738e+01 -5.4029e+01 -5.9780e+01 -5.3696e+01 -5.3721e+01 -5.4061e+01 -5.9749e+01 -5.3652e+01 -5.3703e+01 -5.4093e+01 -5.9718e+01 -5.3607e+01 -5.3686e+01 -5.4124e+01 -5.9687e+01 -5.3564e+01 -5.3669e+01 -5.4155e+01 -5.9656e+01 -5.3521e+01 -5.3653e+01 -5.4185e+01 -5.9625e+01 -5.3479e+01 -5.3636e+01 -5.4215e+01 -5.9594e+01 -5.3437e+01 -5.3620e+01 -5.4244e+01 -5.9563e+01 -5.3396e+01 -5.3604e+01 -5.4273e+01 -5.9532e+01 -5.3356e+01 -5.3587e+01 -5.4299e+01 -5.9501e+01 -5.3316e+01 -5.3572e+01 -5.4319e+01 -5.9470e+01 -5.3277e+01 -5.3556e+01 -5.4338e+01 -5.9439e+01 -5.3238e+01 -5.3540e+01 -5.4374e+01 -5.9408e+01 -5.3200e+01 -5.3525e+01 -5.4429e+01 -5.9377e+01 -5.3162e+01 -5.3509e+01 -5.4484e+01 -5.9346e+01 -5.3125e+01 -5.3494e+01 -5.4537e+01 -5.9315e+01 -5.3086e+01 -5.3479e+01 -5.4583e+01 -5.9283e+01 -5.3037e+01 -5.3459e+01 -5.4627e+01 -5.9252e+01 -5.2986e+01 -5.3437e+01 -5.4671e+01 -5.9216e+01 -5.2936e+01 -5.3414e+01 -5.4715e+01 -5.9177e+01 -5.2886e+01 -5.3392e+01 -5.4750e+01 -5.9138e+01 -5.2838e+01 -5.3370e+01 -5.4785e+01 -5.9099e+01 -5.2790e+01 -5.3349e+01 -5.4819e+01 -5.9061e+01 -5.2743e+01 -5.3327e+01 -5.4853e+01 -5.9022e+01 -5.2697e+01 -5.3306e+01 -5.4886e+01 -5.8984e+01 -5.2651e+01 -5.3286e+01 -5.4919e+01 -5.8946e+01 -5.2607e+01 -5.3265e+01 -5.4951e+01 -5.8909e+01 -5.2563e+01 -5.3245e+01 -5.4983e+01 -5.8871e+01 -5.2520e+01 -5.3225e+01 -5.5015e+01 -5.8834e+01 -5.2478e+01 -5.3206e+01 -5.5046e+01 -5.8796e+01 -5.2436e+01 -5.3186e+01 -5.5077e+01 -5.8759e+01 -5.2395e+01 -5.3167e+01 -5.5108e+01 -5.8722e+01 -5.2355e+01 -5.3148e+01 -5.5138e+01 -5.8685e+01 -5.2315e+01 -5.3129e+01 -5.5168e+01 -5.8649e+01 -5.2276e+01 -5.3102e+01 -5.5197e+01 -5.8612e+01 -5.2238e+01 -5.3076e+01 -5.5226e+01 -5.8576e+01 -5.2200e+01 -5.3051e+01 -5.5254e+01 -5.8540e+01 -5.2163e+01 -5.3025e+01 -5.5282e+01 -5.8504e+01 -5.2127e+01 -5.3000e+01 -5.5310e+01 -5.8468e+01 -5.2091e+01 -5.2976e+01 -5.5337e+01 -5.8432e+01 -5.2055e+01 -5.2952e+01 -5.5364e+01 -5.8396e+01 -5.2021e+01 -5.2926e+01 -5.5390e+01 -5.8361e+01 -5.2013e+01 -5.2887e+01 -5.5416e+01 -5.8325e+01 -5.2015e+01 -5.2849e+01 -5.5442e+01 -5.8290e+01 -5.2018e+01 -5.2811e+01 -5.5467e+01 -5.8255e+01 -5.2021e+01 -5.2774e+01 -5.5492e+01 -5.8220e+01 -5.2024e+01 -5.2737e+01 -5.5516e+01 -5.8185e+01 -5.2027e+01 -5.2701e+01 -5.5540e+01 -5.8151e+01 -5.2030e+01 -5.2666e+01 -5.5563e+01 -5.8116e+01 -5.2032e+01 -5.2631e+01 -5.5586e+01 -5.8082e+01 -5.2027e+01 -5.2597e+01 -5.5609e+01 -5.8047e+01 -5.2022e+01 -5.2564e+01 -5.5631e+01 -5.8013e+01 -5.2018e+01 -5.2531e+01 -5.5653e+01 -5.7974e+01 -5.2014e+01 -5.2499e+01 -5.5674e+01 -5.7932e+01 -5.2010e+01 -5.2468e+01 -5.5695e+01 -5.7891e+01 -5.2006e+01 -5.2437e+01 -5.5715e+01 -5.7850e+01 -5.2003e+01 -5.2406e+01 -5.5735e+01 -5.7809e+01 -5.1999e+01 -5.2376e+01 -5.5755e+01 -5.7768e+01 -5.1996e+01 -5.2347e+01 -5.5774e+01 -5.7728e+01 -5.1993e+01 -5.2318e+01 -5.5793e+01 -5.7688e+01 -5.1990e+01 -5.2290e+01 -5.5811e+01 -5.7648e+01 -5.1987e+01 -5.2262e+01 -5.5829e+01 -5.7609e+01 -5.1985e+01 -5.2235e+01 -5.5847e+01 -5.7569e+01 -5.1998e+01 -5.2208e+01 -5.5864e+01 -5.7530e+01 -5.2040e+01 -5.2182e+01 -5.5881e+01 -5.7492e+01 -5.2081e+01 -5.2156e+01 -5.5897e+01 -5.7453e+01 -5.2122e+01 -5.2130e+01 -5.5906e+01 -5.7415e+01 -5.2163e+01 -5.2105e+01 -5.5914e+01 -5.7377e+01 -5.2203e+01 -5.2081e+01 -5.5921e+01 -5.7340e+01 -5.2242e+01 -5.2056e+01 -5.5929e+01 -5.7302e+01 -5.2281e+01 -5.2033e+01 -5.5936e+01 -5.7265e+01 -5.2320e+01 -5.2009e+01 -5.5942e+01 -5.7228e+01 -5.2357e+01 -5.1986e+01 -5.5949e+01 -5.7192e+01 -5.2395e+01 -5.1964e+01 -5.5955e+01 -5.7155e+01 -5.2432e+01 -5.1941e+01 -5.5961e+01 -5.7119e+01 -5.2468e+01 -5.1920e+01 -5.5967e+01 -5.7075e+01 -5.2504e+01 -5.1898e+01 -5.5973e+01 -5.7032e+01 -5.2539e+01 -5.1877e+01 -5.5979e+01 -5.6988e+01 -5.2574e+01 -5.1856e+01 -5.5984e+01 -5.6946e+01 -5.2608e+01 -5.1836e+01 -5.5989e+01 -5.6903e+01 -5.2641e+01 -5.1816e+01 -5.5994e+01 -5.6904e+01 -5.2675e+01 -5.1796e+01 -5.5998e+01 -5.6906e+01 -5.2707e+01 -5.1776e+01 -5.6003e+01 -5.6909e+01 -5.2739e+01 -5.1757e+01 -5.6007e+01 -5.6910e+01 -5.2764e+01 -5.1734e+01 -5.6011e+01 -5.6906e+01 -5.2788e+01 -5.1702e+01 -5.6014e+01 -5.6912e+01 -5.2811e+01 -5.1668e+01 -5.6018e+01 -5.6941e+01 -5.2832e+01 -5.1627e+01 -5.6021e+01 -5.6971e+01 -5.2846e+01 -5.1586e+01 -5.6024e+01 -5.6999e+01 -5.2861e+01 -5.1547e+01 -5.6025e+01 -5.7019e+01 -5.2875e+01 -5.1508e+01 -5.6012e+01 -5.7039e+01 -5.2885e+01 -5.1470e+01 -5.5999e+01 -5.7058e+01 -5.2891e+01 -5.1433e+01 -5.5985e+01 -5.7077e+01 -5.2898e+01 -5.1397e+01 -5.5972e+01 -5.7096e+01 -5.2904e+01 -5.1361e+01 -5.5960e+01 -5.7115e+01 -5.2907e+01 -5.1326e+01 -5.5947e+01 -5.7133e+01 -5.2905e+01 -5.1292e+01 -5.5934e+01 -5.7151e+01 -5.2904e+01 -5.1259e+01 -5.5922e+01 -5.7168e+01 -5.2902e+01 -5.1226e+01 -5.5910e+01 -5.7185e+01 -5.2902e+01 -5.1194e+01 -5.5898e+01 -5.7202e+01 -5.2901e+01 -5.1163e+01 -5.5882e+01 -5.7214e+01 -5.2900e+01 -5.1132e+01 -5.5862e+01 -5.7222e+01 -5.2900e+01 -5.1102e+01 -5.5843e+01 -5.7229e+01 -5.2900e+01 -5.1072e+01 -5.5823e+01 -5.7237e+01 -5.2895e+01 -5.1041e+01 -5.5804e+01 -5.7245e+01 -5.2888e+01 -5.1005e+01 -5.5786e+01 -5.7252e+01 -5.2880e+01 -5.0969e+01 -5.5767e+01 -5.7259e+01 -5.2873e+01 -5.0934e+01 -5.5749e+01 -5.7266e+01 -5.2866e+01 -5.0901e+01 -5.5730e+01 -5.7273e+01 -5.2860e+01 -5.0867e+01 -5.5713e+01 -5.7279e+01 -5.2854e+01 -5.0835e+01 -5.5695e+01 -5.7285e+01 -5.2848e+01 -5.0803e+01 -5.5677e+01 -5.7291e+01 -5.2842e+01 -5.0772e+01 -5.5660e+01 -5.7297e+01 -5.2837e+01 -5.0741e+01 -5.5643e+01 -5.7303e+01 -5.2831e+01 -5.0711e+01 -5.5624e+01 -5.7308e+01 -5.2826e+01 -5.0682e+01 -5.5636e+01 -5.7314e+01 -5.2822e+01 -5.0654e+01 -5.5648e+01 -5.7319e+01 -5.2817e+01 -5.0626e+01 -5.5660e+01 -5.7323e+01 -5.2813e+01 -5.0598e+01 -5.5671e+01 -5.7328e+01 -5.2809e+01 -5.0572e+01 -5.5683e+01 -5.7332e+01 -5.2805e+01 -5.0545e+01 -5.5693e+01 -5.7336e+01 -5.2801e+01 -5.0520e+01 -5.5696e+01 -5.7340e+01 -5.2795e+01 -5.0495e+01 -5.5699e+01 -5.7344e+01 -5.2783e+01 -5.0470e+01 -5.5703e+01 -5.7347e+01 -5.2772e+01 -5.0446e+01 -5.5706e+01 -5.7350e+01 -5.2762e+01 -5.0423e+01 -5.5710e+01 -5.7353e+01 -5.2752e+01 -5.0400e+01 -5.5713e+01 -5.7348e+01 -5.2742e+01 -5.0377e+01 -5.5717e+01 -5.7343e+01 -5.2732e+01 -5.0351e+01 -5.5721e+01 -5.7338e+01 -5.2722e+01 -5.0322e+01 -5.5724e+01 -5.7332e+01 -5.2713e+01 -5.0293e+01 -5.5728e+01 -5.7327e+01 -5.2704e+01 -5.0265e+01 -5.5731e+01 -5.7321e+01 -5.2696e+01 -5.0237e+01 -5.5735e+01 -5.7315e+01 -5.2687e+01 -5.0211e+01 -5.5738e+01 -5.7310e+01 -5.2679e+01 -5.0184e+01 -5.5742e+01 -5.7304e+01 -5.2671e+01 -5.0159e+01 -5.5745e+01 -5.7298e+01 -5.2664e+01 -5.0133e+01 -5.5748e+01 -5.7292e+01 -5.2656e+01 -5.0109e+01 -5.5752e+01 -5.7286e+01 -5.2649e+01 -5.0080e+01 -5.5755e+01 -5.7280e+01 -5.2642e+01 -5.0049e+01 -5.5758e+01 -5.7273e+01 -5.2635e+01 -5.0018e+01 -5.5761e+01 -5.7267e+01 -5.2629e+01 -1.0000e+01 -5.5764e+01 -5.7261e+01 -5.2622e+01 -6.0000e+01 -5.5767e+01 -5.7254e+01 -5.2616e+01 -6.0000e+01 -5.5770e+01 -5.7248e+01 -5.2610e+01 -6.0000e+01 -5.5772e+01 -5.7241e+01 -5.2604e+01 -6.0000e+01 -5.5775e+01 -5.7234e+01 -5.2598e+01 -6.0000e+01 -5.5777e+01 -5.7254e+01 -5.2592e+01 -6.0000e+01 -5.5780e+01 -5.7283e+01 -5.2587e+01 -6.0000e+01 -5.5782e+01 -5.7312e+01 -5.2581e+01 -6.0000e+01 -5.5784e+01 -5.7340e+01 -5.2576e+01 -6.0000e+01 -5.5786e+01 -5.7367e+01 -5.2571e+01 -6.0000e+01 -5.5824e+01 -5.7394e+01 -5.2566e+01 -6.0000e+01 -5.5862e+01 -5.7421e+01 -5.2561e+01 -6.0000e+01 -5.5900e+01 -5.7447e+01 -5.2556e+01 -6.0000e+01 -5.5948e+01 -5.7472e+01 -5.2551e+01 -6.0000e+01 -5.6021e+01 -5.7497e+01 -5.2546e+01 -6.0000e+01 -5.6093e+01 -5.7521e+01 -5.2542e+01 -6.0000e+01 -5.6163e+01 -5.7544e+01 -5.2537e+01 -6.0000e+01 -5.6233e+01 -5.7567e+01 -5.2533e+01 -6.0000e+01 -5.6302e+01 -5.7590e+01 -5.2528e+01 -6.0000e+01 -5.6369e+01 -5.7612e+01 -5.2524e+01 -6.0000e+01 -5.6436e+01 -5.7633e+01 -5.2520e+01 -6.0000e+01 -5.6501e+01 -5.7654e+01 -5.2515e+01 -6.0000e+01 -5.6565e+01 -5.7674e+01 -5.2511e+01 -6.0000e+01 -5.6629e+01 -5.7694e+01 -5.2507e+01 -6.0000e+01 -5.6691e+01 -5.7713e+01 -5.2503e+01 -6.0000e+01 -5.6753e+01 -5.7732e+01 -5.2499e+01 -6.0000e+01 -5.6813e+01 -5.7750e+01 -5.2495e+01 -6.0000e+01 -5.6872e+01 -5.7768e+01 -5.2491e+01 -6.0000e+01 -5.6931e+01 -5.7785e+01 -5.2487e+01 -6.0000e+01 -5.6988e+01 -5.7802e+01 -5.2483e+01 -6.0000e+01 -5.7045e+01 -5.7818e+01 -5.2480e+01 -6.0000e+01 -5.7100e+01 -5.7833e+01 -5.2476e+01 -6.0000e+01 -5.7155e+01 -5.7848e+01 -5.2471e+01 -6.0000e+01 -5.7208e+01 -5.7863e+01 -5.2459e+01 -6.0000e+01 -5.7261e+01 -5.7877e+01 -5.2447e+01 -6.0000e+01 -5.7313e+01 -5.7891e+01 -5.2436e+01 -6.0000e+01 -5.7363e+01 -5.7904e+01 -5.2425e+01 -6.0000e+01 -5.7413e+01 -5.7916e+01 -5.2414e+01 -6.0000e+01 -5.7462e+01 -5.7928e+01 -5.2403e+01 -6.0000e+01 -5.7510e+01 -5.7940e+01 -5.2393e+01 -6.0000e+01 -5.7557e+01 -5.7951e+01 -5.2382e+01 -6.0000e+01 -5.7603e+01 -5.7962e+01 -5.2372e+01 -6.0000e+01 -5.7648e+01 -5.7972e+01 -5.2362e+01 -6.0000e+01 -5.7693e+01 -5.7982e+01 -5.2352e+01 -6.0000e+01 -5.7736e+01 -5.7991e+01 -5.2342e+01 -6.0000e+01 -5.7779e+01 -5.8000e+01 -5.2333e+01 -6.0000e+01 -5.7821e+01 -5.8009e+01 -5.2323e+01 -6.0000e+01 -5.7861e+01 -5.8017e+01 -5.2314e+01 -6.0000e+01 -5.7901e+01 -5.8024e+01 -5.2304e+01 -6.0000e+01 -5.7941e+01 -5.8031e+01 -5.2295e+01 -5.9967e+01 -5.7979e+01 -5.8038e+01 -5.2286e+01 -5.9883e+01 -5.8016e+01 -5.8044e+01 -5.2278e+01 -5.9800e+01 -5.8053e+01 -5.8050e+01 -5.2269e+01 -5.9718e+01 -5.8089e+01 -5.8055e+01 -5.2260e+01 -5.9637e+01 -5.8124e+01 -5.8060e+01 -5.2252e+01 -5.9557e+01 -5.8158e+01 -5.8064e+01 -5.2243e+01 -5.9478e+01 -5.8192e+01 -5.8068e+01 -5.2235e+01 -5.9399e+01 -5.8224e+01 -5.8072e+01 -5.2227e+01 -5.9322e+01 -5.8256e+01 -5.8075e+01 -5.2219e+01 -5.9246e+01 -5.8287e+01 -5.8078e+01 -5.2211e+01 -5.9171e+01 -5.8318e+01 -5.8081e+01 -5.2203e+01 -5.9096e+01 -5.8347e+01 -5.8083e+01 -5.2195e+01 -5.9022e+01 -5.8376e+01 -5.8084e+01 -5.2187e+01 -5.8941e+01 -5.8404e+01 -5.8083e+01 -5.2177e+01 -5.8861e+01 -5.8431e+01 -5.8076e+01 -5.2162e+01 -5.8783e+01 -5.8458e+01 -5.8069e+01 -5.2146e+01 -5.8705e+01 -5.8484e+01 -5.8062e+01 -5.2131e+01 -5.8628e+01 -5.8509e+01 -5.8054e+01 -5.2116e+01 -5.8553e+01 -5.8533e+01 -5.8046e+01 -5.2102e+01 -5.8478e+01 -5.8557e+01 -5.8038e+01 -5.2087e+01 -5.8404e+01 -5.8580e+01 -5.8030e+01 -5.2073e+01 -5.8331e+01 -5.8602e+01 -5.8022e+01 -5.2060e+01 -5.8259e+01 -5.8624e+01 -5.8013e+01 -5.2046e+01 -5.8188e+01 -5.8644e+01 -5.8005e+01 -5.2032e+01 -5.8118e+01 -5.8665e+01 -5.7996e+01 -5.2019e+01 -5.8049e+01 -5.8684e+01 -5.7979e+01 -5.2006e+01 -5.7980e+01 -5.8703e+01 -5.8004e+01 -5.1986e+01 -5.7913e+01 -5.8721e+01 -5.8031e+01 -5.1965e+01 -5.7846e+01 -5.8739e+01 -5.8057e+01 -5.1945e+01 -5.7780e+01 -5.8749e+01 -5.8083e+01 -5.1926e+01 -5.7715e+01 -5.8758e+01 -5.8108e+01 -5.1906e+01 -5.7650e+01 -5.8766e+01 -5.8133e+01 -5.1887e+01 -5.7586e+01 -5.8773e+01 -5.8156e+01 -5.1869e+01 -5.7523e+01 -5.8781e+01 -5.8180e+01 -5.1850e+01 -5.7461e+01 -5.8787e+01 -5.8202e+01 -5.1832e+01 -5.7400e+01 -5.8794e+01 -5.8224e+01 -5.1815e+01 -5.7339e+01 -5.8793e+01 -5.8245e+01 -5.1797e+01 -5.7274e+01 -5.8791e+01 -5.8266e+01 -5.1780e+01 -5.7206e+01 -5.8788e+01 -5.8286e+01 -5.1764e+01 -5.7136e+01 -5.8786e+01 -5.8306e+01 -5.1747e+01 -5.7063e+01 -5.8783e+01 -5.8325e+01 -5.1731e+01 -5.6990e+01 -5.8779e+01 -5.8343e+01 -5.1715e+01 -5.6919e+01 -5.8776e+01 -5.8361e+01 -5.1700e+01 -5.6849e+01 -5.8772e+01 -5.8378e+01 -5.1684e+01 -5.6779e+01 -5.8768e+01 -5.8395e+01 -5.1669e+01 -5.6711e+01 -5.8764e+01 -5.8411e+01 -5.1654e+01 -5.6643e+01 -5.8760e+01 -5.8426e+01 -5.1640e+01 -5.6577e+01 -5.8755e+01 -5.8441e+01 -5.1626e+01 -5.6511e+01 -5.8751e+01 -5.8455e+01 -5.1611e+01 -5.6446e+01 -5.8745e+01 -5.8469e+01 -5.1598e+01 -5.6383e+01 -5.8740e+01 -5.8482e+01 -5.1584e+01 -5.6320e+01 -5.8735e+01 -5.8495e+01 -5.1571e+01 -5.6258e+01 -5.8729e+01 -5.8507e+01 -5.1557e+01 -5.6196e+01 -5.8723e+01 -5.8519e+01 -5.1544e+01 -5.6136e+01 -5.8717e+01 -5.8530e+01 -5.1531e+01 -5.6076e+01 -5.8711e+01 -5.8541e+01 -5.1519e+01 -5.6017e+01 -5.8704e+01 -5.8551e+01 -5.1506e+01 -5.5959e+01 -5.8697e+01 -5.8560e+01 -5.1494e+01 -5.5902e+01 -5.8690e+01 -5.8569e+01 -5.1482e+01 -5.5845e+01 -5.8683e+01 -5.8578e+01 -5.1470e+01 -5.5789e+01 -5.8675e+01 -5.8586e+01 -5.1458e+01 -5.5728e+01 -5.8668e+01 -5.8594e+01 -5.1447e+01 -5.5666e+01 -5.8660e+01 -5.8601e+01 -5.1436e+01 -5.5605e+01 -5.8651e+01 -5.8601e+01 -5.1424e+01 -5.5544e+01 -5.8643e+01 -5.8600e+01 -5.1420e+01 -5.5485e+01 -5.8634e+01 -5.8598e+01 -5.1453e+01 -5.5426e+01 -5.8626e+01 -5.8595e+01 -5.1486e+01 -5.5368e+01 -5.8617e+01 -5.8593e+01 -5.1517e+01 -5.5311e+01 -5.8607e+01 -5.8590e+01 -5.1541e+01 -5.5255e+01 -5.8598e+01 -5.8587e+01 -5.1565e+01 -5.5199e+01 -5.8600e+01 -5.8584e+01 -5.1589e+01 -5.5144e+01 -5.8626e+01 -5.8580e+01 -5.1612e+01 -5.5086e+01 -5.8652e+01 -5.8576e+01 -5.1635e+01 -5.5025e+01 -5.8678e+01 -5.8572e+01 -5.1657e+01 -5.4965e+01 -5.8702e+01 -5.8567e+01 -5.1680e+01 -5.4906e+01 -5.8726e+01 -5.8563e+01 -5.1702e+01 -5.4847e+01 -5.8749e+01 -5.8558e+01 -5.1723e+01 -5.4790e+01 -5.8772e+01 -5.8552e+01 -5.1745e+01 -5.4732e+01 -5.8794e+01 -5.8547e+01 -5.1766e+01 -5.4668e+01 -5.8815e+01 -5.8541e+01 -5.1787e+01 -5.4606e+01 -5.8836e+01 -5.8535e+01 -5.1807e+01 -5.4544e+01 -5.8856e+01 -5.8529e+01 -5.1827e+01 -5.4483e+01 -5.8875e+01 -5.8522e+01 -5.1847e+01 -5.4424e+01 -5.8894e+01 -5.8516e+01 -5.1867e+01 -5.4365e+01 -5.8912e+01 -5.8509e+01 -5.1886e+01 -5.4307e+01 -5.8930e+01 -5.8501e+01 -5.1905e+01 -5.4250e+01 -5.8947e+01 -5.8494e+01 -5.1924e+01 -5.4194e+01 -5.8963e+01 -5.8486e+01 -5.1942e+01 -5.4139e+01 -5.8979e+01 -5.8478e+01 -5.1960e+01 -5.4084e+01 -5.8994e+01 -5.8470e+01 -5.1978e+01 -5.4031e+01 -5.9009e+01 -5.8461e+01 -5.1995e+01 -5.3978e+01 -5.9023e+01 -5.8485e+01 -5.2046e+01 -5.3927e+01 -5.9036e+01 -5.8521e+01 -5.2107e+01 -5.3876e+01 -5.9076e+01 -5.8588e+01 -5.2167e+01 -5.3825e+01 -5.9125e+01 -5.8665e+01 -5.2226e+01 -5.3776e+01 -5.9173e+01 -5.8741e+01 -5.2284e+01 -5.3727e+01 -5.9219e+01 -5.8816e+01 -5.2341e+01 -5.3679e+01 -5.9265e+01 -5.8889e+01 -5.2398e+01 -5.3632e+01 -5.9309e+01 -5.8960e+01 -5.2453e+01 -5.3586e+01 -5.9353e+01 -5.9030e+01 -5.2508e+01 -5.3540e+01 -5.9395e+01 -5.9099e+01 -5.2561e+01 -5.3495e+01 -5.9437e+01 -5.9166e+01 -5.2614e+01 -5.3451e+01 -5.9478e+01 -5.9232e+01 -5.2663e+01 -5.3407e+01 -5.9518e+01 -5.9296e+01 -5.2706e+01 -5.3364e+01 -5.9556e+01 -5.9359e+01 -5.2749e+01 -5.3322e+01 -5.9594e+01 -5.9421e+01 -5.2790e+01 -5.3280e+01 -5.9631e+01 -5.9481e+01 -5.2832e+01 -5.3239e+01 -5.9667e+01 -5.9540e+01 -5.2872e+01 -5.3198e+01 -5.9702e+01 -5.9597e+01 -5.2912e+01 -5.3156e+01 -5.9736e+01 -5.9653e+01 -5.2951e+01 -5.3109e+01 -5.9770e+01 -5.9708e+01 -5.2990e+01 -5.3061e+01 -5.9802e+01 -5.9762e+01 -5.3028e+01 -5.3007e+01 -5.9834e+01 -5.9814e+01 -5.3065e+01 -5.2955e+01 -5.9864e+01 -5.9866e+01 -5.3102e+01 -5.2903e+01 -5.9894e+01 -5.9915e+01 -5.3138e+01 -5.2852e+01 -5.9923e+01 -5.9964e+01 -5.3174e+01 -5.2802e+01 -5.9951e+01 -6.0012e+01 -5.3208e+01 -5.2752e+01 -5.9978e+01 -6.0058e+01 -5.3243e+01 -5.2696e+01 -6.0005e+01 -6.0103e+01 -5.3276e+01 -5.2640e+01 -6.0031e+01 -6.0147e+01 -5.3310e+01 -5.2586e+01 -6.0055e+01 -6.0190e+01 -5.3342e+01 -5.2533e+01 -6.0079e+01 -6.0231e+01 -5.3374e+01 -5.2480e+01 -6.0103e+01 -6.0272e+01 -5.3405e+01 -5.2429e+01 -6.0125e+01 -6.0311e+01 -5.3436e+01 -5.2379e+01 -6.0147e+01 -6.0350e+01 -5.3466e+01 -5.2329e+01 -6.0168e+01 -6.0387e+01 -5.3496e+01 -5.2281e+01 -6.0188e+01 -6.0423e+01 -5.3525e+01 -5.2233e+01 -6.0207e+01 -6.0459e+01 -5.3554e+01 -5.2186e+01 -6.0226e+01 -6.0538e+01 -5.3582e+01 -5.2140e+01 -6.0239e+01 -6.0615e+01 -5.3609e+01 -5.2095e+01 -6.0249e+01 -6.0690e+01 -5.3636e+01 -5.2051e+01 -6.0257e+01 -6.0764e+01 -5.3663e+01 -5.2007e+01 -6.0266e+01 -6.0836e+01 -5.3688e+01 -5.1964e+01 -6.0273e+01 -6.0906e+01 -5.3714e+01 -5.1922e+01 -6.0281e+01 -6.0975e+01 -5.3746e+01 -5.1919e+01 -6.0288e+01 -6.1042e+01 -5.3815e+01 -5.1922e+01 -6.0294e+01 -6.1108e+01 -5.3883e+01 -5.1926e+01 -6.0300e+01 -6.1172e+01 -5.3949e+01 -5.1930e+01 -6.0305e+01 -6.1235e+01 -5.4015e+01 -5.1934e+01 -6.0310e+01 -6.1296e+01 -5.4079e+01 -5.1938e+01 -6.0314e+01 -6.1356e+01 -5.4142e+01 -5.1941e+01 -6.0318e+01 -6.1414e+01 -5.4204e+01 -5.1945e+01 -6.0321e+01 -6.1471e+01 -5.4265e+01 -5.1949e+01 -6.0324e+01 -6.1526e+01 -5.4325e+01 -5.1953e+01 -6.0326e+01 -6.1580e+01 -5.4383e+01 -5.1957e+01 -6.0328e+01 -6.1633e+01 -5.4441e+01 -5.1961e+01 -6.0330e+01 -6.1684e+01 -5.4498e+01 -5.1965e+01 -6.0331e+01 -6.1734e+01 -5.4553e+01 -5.1969e+01 -6.0331e+01 -6.1782e+01 -5.4608e+01 -5.1973e+01 -6.0331e+01 -6.1829e+01 -5.4661e+01 -5.1977e+01 -6.0331e+01 -6.1875e+01 -5.4714e+01 -5.1982e+01 -6.0330e+01 -6.1920e+01 -5.4765e+01 -5.1986e+01 -6.0329e+01 -6.1963e+01 -5.4815e+01 -5.1990e+01 -6.0328e+01 -6.2005e+01 -5.4858e+01 -5.1994e+01 -6.0325e+01 -6.2046e+01 -5.4898e+01 -5.1998e+01 -6.0323e+01 -6.2085e+01 -5.4938e+01 -5.2001e+01 -6.0320e+01 -6.2124e+01 -5.4978e+01 -5.2005e+01 -6.0317e+01 -6.2161e+01 -5.5016e+01 -5.2009e+01 -6.0313e+01 -6.2197e+01 -5.5054e+01 -5.2013e+01 -6.0309e+01 -6.2229e+01 -5.5091e+01 -5.2017e+01 -6.0304e+01 -6.2255e+01 -5.5127e+01 -5.2021e+01 -6.0299e+01 -6.2279e+01 -5.5163e+01 -5.2024e+01 -6.0294e+01 -6.2303e+01 -5.5197e+01 -5.2028e+01 -6.0288e+01 -6.2326e+01 -5.5231e+01 -5.2032e+01 -6.0282e+01 -6.2348e+01 -5.5265e+01 -5.2035e+01 -6.0276e+01 -6.2369e+01 -5.5298e+01 -5.2039e+01 -6.0269e+01 -6.2390e+01 -5.5330e+01 -5.2042e+01 -6.0262e+01 -6.2409e+01 -5.5361e+01 -5.2046e+01 -6.0254e+01 -6.2427e+01 -5.5392e+01 -5.2049e+01 -6.0246e+01 -6.2445e+01 -5.5422e+01 -5.2052e+01 -6.0238e+01 -6.2462e+01 -5.5451e+01 -5.2055e+01 -6.0227e+01 -6.2478e+01 -5.5480e+01 -5.2059e+01 -6.0210e+01 -6.2493e+01 -5.5508e+01 -5.2062e+01 -6.0193e+01 -6.2508e+01 -5.5535e+01 -5.2065e+01 -6.0176e+01 -6.2521e+01 -5.5562e+01 -5.2068e+01 -6.0158e+01 -6.2534e+01 -5.5588e+01 -5.2070e+01 -6.0141e+01 -6.2546e+01 -5.5613e+01 -5.2094e+01 -6.0123e+01 -6.2557e+01 -5.5638e+01 -5.2141e+01 -6.0105e+01 -6.2567e+01 -5.5662e+01 -5.2188e+01 -6.0087e+01 -6.2577e+01 -5.5686e+01 -5.2233e+01 -6.0069e+01 -6.2586e+01 -5.5709e+01 -5.2278e+01 -6.0051e+01 -6.2594e+01 -5.5731e+01 -5.2322e+01 -6.0032e+01 -6.2602e+01 -5.5753e+01 -5.2359e+01 -6.0014e+01 -6.2608e+01 -5.5775e+01 -5.2394e+01 -5.9995e+01 -6.2614e+01 -5.5795e+01 -5.2424e+01 -5.9976e+01 -6.2620e+01 -5.5815e+01 -5.2450e+01 -5.9957e+01 -6.2624e+01 -5.5835e+01 -5.2476e+01 -5.9938e+01 -6.2628e+01 -5.5854e+01 -5.2501e+01 -5.9919e+01 -6.2632e+01 -5.5872e+01 -5.2526e+01 -5.9899e+01 -6.2634e+01 -5.5890e+01 -5.2551e+01 -5.9880e+01 -6.2636e+01 -5.5908e+01 -5.2575e+01 -5.9860e+01 -6.2638e+01 -5.5923e+01 -5.2599e+01 -5.9840e+01 -6.2638e+01 -5.5931e+01 -5.2623e+01 -5.9820e+01 -6.2638e+01 -5.5936e+01 -5.2646e+01 -5.9792e+01 -6.2638e+01 -5.5936e+01 -5.2670e+01 -5.9764e+01 -6.2630e+01 -5.5936e+01 -5.2692e+01 -5.9736e+01 -6.2620e+01 -5.5935e+01 -5.2715e+01 -5.9708e+01 -6.2610e+01 -5.5935e+01 -5.2737e+01 -5.9680e+01 -6.2600e+01 -5.5934e+01 -5.2759e+01 -5.9652e+01 -6.2589e+01 -5.5933e+01 -5.2780e+01 -5.9624e+01 -6.2578e+01 -5.5932e+01 -5.2802e+01 -5.9596e+01 -6.2566e+01 -5.5931e+01 -5.2823e+01 -5.9569e+01 -6.2554e+01 -5.5929e+01 -5.2843e+01 -5.9541e+01 -6.2540e+01 -5.5928e+01 -5.2863e+01 -5.9513e+01 -6.2519e+01 -5.5926e+01 -5.2883e+01 -5.9486e+01 -6.2498e+01 -5.5925e+01 -5.2903e+01 -5.9458e+01 -6.2477e+01 -5.5923e+01 -5.2922e+01 -5.9430e+01 -6.2456e+01 -5.5921e+01 -5.2941e+01 -5.9403e+01 -6.2435e+01 -5.5919e+01 -5.2960e+01 -5.9375e+01 -6.2413e+01 -5.5916e+01 -5.2978e+01 -5.9348e+01 -6.2391e+01 -5.5914e+01 -5.2996e+01 -5.9320e+01 -6.2369e+01 -5.5911e+01 -5.3014e+01 -5.9293e+01 -6.2347e+01 -5.5909e+01 -5.3032e+01 -5.9266e+01 -6.2325e+01 -5.5906e+01 -5.3049e+01 -5.9238e+01 -6.2302e+01 -5.5903e+01 -5.3065e+01 -5.9211e+01 -6.2280e+01 -5.5899e+01 -5.3082e+01 -5.9183e+01 -6.2257e+01 -5.5896e+01 -5.3098e+01 -5.9156e+01 -6.2234e+01 -5.5892e+01 -5.3114e+01 -5.9129e+01 -6.2211e+01 -5.5889e+01 -5.3129e+01 -5.9101e+01 -6.2187e+01 -5.5885e+01 -5.3145e+01 -5.9074e+01 -6.2164e+01 -5.5881e+01 -5.3160e+01 -5.9047e+01 -6.2140e+01 -5.5877e+01 -5.3174e+01 -5.9020e+01 -6.2117e+01 -5.5873e+01 -5.3189e+01 -5.8992e+01 -6.2093e+01 -5.5868e+01 -5.3203e+01 -5.8965e+01 -6.2068e+01 -5.5863e+01 -5.3216e+01 -5.8938e+01 -6.2044e+01 -5.5859e+01 -5.3230e+01 -5.8911e+01 -6.2020e+01 -5.5854e+01 -5.3243e+01 -5.8883e+01 -6.1995e+01 -5.5849e+01 -5.3256e+01 -5.8856e+01 -6.1970e+01 -5.5844e+01 -5.3268e+01 -5.8829e+01 -6.1945e+01 -5.5838e+01 -5.3281e+01 -5.8802e+01 -6.1920e+01 -5.5833e+01 -5.3292e+01 -5.8775e+01 -6.1895e+01 -5.5827e+01 -5.3304e+01 -5.8747e+01 -6.1869e+01 -5.5821e+01 -5.3316e+01 -5.8720e+01 -6.1844e+01 -5.5815e+01 -5.3327e+01 -5.8693e+01 -6.1818e+01 -5.5809e+01 -5.3337e+01 -5.8666e+01 -6.1792e+01 -5.5803e+01 -5.3348e+01 -5.8639e+01 -6.1766e+01 -5.5796e+01 -5.3358e+01 -5.8611e+01 -6.1740e+01 -5.5787e+01 -5.3368e+01 -5.8584e+01 -6.1714e+01 -5.5772e+01 -5.3378e+01 -5.8557e+01 -6.1687e+01 -5.5757e+01 -5.3387e+01 -5.8530e+01 -6.1661e+01 -5.5743e+01 -5.3396e+01 -5.8503e+01 -6.1634e+01 -5.5728e+01 -5.3405e+01 -5.8476e+01 -6.1607e+01 -5.5714e+01 -5.3414e+01 -5.8448e+01 -6.1580e+01 -5.5700e+01 -5.3422e+01 -5.8421e+01 -6.1553e+01 -5.5685e+01 -5.3430e+01 -5.8394e+01 -6.1520e+01 -5.5671e+01 -5.3438e+01 -5.8382e+01 -6.1484e+01 -5.5656e+01 -5.3446e+01 -5.8391e+01 -6.1449e+01 -5.5642e+01 -5.3453e+01 -5.8400e+01 -6.1413e+01 -5.5628e+01 -5.3460e+01 -5.8408e+01 -6.1370e+01 -5.5614e+01 -5.3467e+01 -5.8416e+01 -6.1347e+01 -5.5599e+01 -5.3473e+01 -5.8419e+01 -6.1349e+01 -5.5585e+01 -5.3480e+01 -5.8417e+01 -6.1350e+01 -5.5571e+01 -5.3486e+01 -5.8407e+01 -6.1351e+01 -5.5557e+01 -5.3491e+01 -5.8398e+01 -6.1352e+01 -5.5542e+01 -5.3497e+01 -5.8389e+01 -6.1352e+01 -5.5528e+01 -5.3502e+01 -5.8380e+01 -6.1351e+01 -5.5514e+01 -5.3507e+01 -5.8371e+01 -6.1351e+01 -5.5498e+01 -5.3512e+01 -5.8361e+01 -6.1350e+01 -5.5475e+01 -5.3517e+01 -5.8352e+01 -6.1348e+01 -5.5453e+01 -5.3521e+01 -5.8342e+01 -6.1346e+01 -5.5432e+01 -5.3525e+01 -5.8333e+01 -6.1344e+01 -5.5410e+01 -5.3529e+01 -5.8323e+01 -6.1341e+01 -5.5389e+01 -5.3533e+01 -5.8313e+01 -6.1338e+01 -5.5368e+01 -5.3536e+01 -5.8304e+01 -6.1335e+01 -5.5347e+01 -5.3539e+01 -5.8294e+01 -6.1331e+01 -5.5326e+01 -5.3542e+01 -5.8284e+01 -6.1326e+01 -5.5305e+01 -5.3545e+01 -5.8273e+01 -6.1322e+01 -5.5285e+01 -5.3548e+01 -5.8263e+01 -6.1317e+01 -5.5263e+01 -5.3550e+01 -5.8253e+01 -6.1311e+01 -5.5234e+01 -5.3552e+01 -5.8242e+01 -6.1305e+01 -5.5207e+01 -5.3554e+01 -5.8232e+01 -6.1299e+01 -5.5179e+01 -5.3556e+01 -5.8221e+01 -6.1293e+01 -5.5152e+01 -5.3557e+01 -5.8211e+01 -6.1286e+01 -5.5125e+01 -5.3558e+01 -5.8200e+01 -6.1278e+01 -5.5099e+01 -5.3559e+01 -5.8189e+01 -6.1271e+01 -5.5072e+01 -5.3560e+01 -5.8178e+01 -6.1263e+01 -5.5046e+01 -5.3561e+01 -5.8166e+01 -6.1254e+01 -5.5021e+01 -5.3561e+01 -5.8155e+01 -6.1246e+01 -5.4989e+01 -5.3562e+01 -5.8144e+01 -6.1237e+01 -5.4956e+01 -5.3562e+01 -5.8132e+01 -6.1227e+01 -5.4924e+01 -5.3562e+01 -5.8120e+01 -6.1217e+01 -5.4892e+01 -5.3561e+01 -5.8109e+01 -6.1207e+01 -5.4860e+01 -5.3561e+01 -5.8097e+01 -6.1197e+01 -5.4829e+01 -5.3560e+01 -5.8085e+01 -6.1186e+01 -5.4798e+01 -5.3560e+01 -5.8073e+01 -6.1175e+01 -5.4768e+01 -5.3559e+01 -5.8060e+01 -6.1164e+01 -5.4738e+01 -5.3557e+01 -5.8048e+01 -6.1173e+01 -5.4708e+01 -5.3556e+01 -5.8035e+01 -6.1205e+01 -5.4679e+01 -5.3554e+01 -5.8023e+01 -6.1234e+01 -5.4651e+01 -5.3553e+01 -5.8010e+01 -6.1256e+01 -5.4622e+01 -5.3551e+01 -5.7997e+01 -6.1278e+01 -5.4594e+01 -5.3549e+01 -5.7984e+01 -6.1299e+01 -5.4562e+01 -5.3547e+01 -5.7971e+01 -6.1319e+01 -5.4526e+01 -5.3544e+01 -5.7958e+01 -6.1338e+01 -5.4492e+01 -5.3542e+01 -5.7944e+01 -6.1357e+01 -5.4457e+01 -5.3539e+01 -5.7931e+01 -6.1375e+01 -5.4424e+01 -5.3536e+01 -5.7917e+01 -6.1392e+01 -5.4390e+01 -5.3533e+01 -5.7903e+01 -6.1408e+01 -5.4358e+01 -5.3530e+01 -5.7890e+01 -6.1424e+01 -5.4326e+01 -5.3527e+01 -5.7875e+01 -6.1439e+01 -5.4294e+01 -5.3523e+01 -5.7861e+01 -6.1454e+01 -5.4262e+01 -5.3520e+01 -5.7847e+01 -6.1467e+01 -5.4232e+01 -5.3516e+01 -5.7833e+01 -6.1480e+01 -5.4201e+01 -5.3512e+01 -5.7818e+01 -6.1493e+01 -5.4171e+01 -5.3508e+01 -5.7804e+01 -6.1504e+01 -5.4141e+01 -5.3504e+01 -5.7789e+01 -6.1515e+01 -5.4112e+01 -5.3500e+01 -5.7774e+01 -6.1526e+01 -5.4084e+01 -5.3495e+01 -5.7759e+01 -6.1533e+01 -5.4055e+01 -5.3488e+01 -5.7744e+01 -6.1534e+01 -5.4027e+01 -5.3475e+01 -5.7729e+01 -6.1534e+01 -5.3999e+01 -5.3463e+01 -5.7713e+01 -6.1535e+01 -5.3972e+01 -5.3450e+01 -5.7698e+01 -6.1534e+01 -5.3945e+01 -5.3438e+01 -5.7682e+01 -6.1534e+01 -5.3919e+01 -5.3425e+01 -5.7667e+01 -6.1533e+01 -5.3892e+01 -5.3413e+01 -5.7651e+01 -6.1531e+01 -5.3866e+01 -5.3401e+01 -5.7635e+01 -6.1529e+01 -5.3841e+01 -5.3388e+01 -5.7619e+01 -6.1527e+01 -5.3815e+01 -5.3376e+01 -5.7603e+01 -6.1524e+01 -5.3791e+01 -5.3364e+01 -5.7587e+01 -6.1521e+01 -5.3766e+01 -5.3352e+01 -5.7570e+01 -6.1518e+01 -5.3741e+01 -5.3340e+01 -5.7547e+01 -6.1514e+01 -5.3717e+01 -5.3328e+01 -5.7522e+01 -6.1509e+01 -5.3694e+01 -5.3316e+01 -5.7498e+01 -6.1505e+01 -5.3670e+01 -5.3304e+01 -5.7474e+01 -6.1499e+01 -5.3647e+01 -5.3292e+01 -5.7449e+01 -6.1494e+01 -5.3624e+01 -5.3280e+01 -5.7425e+01 -6.1488e+01 -5.3601e+01 -5.3268e+01 -5.7401e+01 -6.1482e+01 -5.3579e+01 -5.3253e+01 -5.7378e+01 -6.1495e+01 -5.3556e+01 -5.3234e+01 -5.7354e+01 -6.1532e+01 -5.3534e+01 -5.3214e+01 -5.7330e+01 -6.1569e+01 -5.3513e+01 -5.3195e+01 -5.7301e+01 -6.1604e+01 -5.3491e+01 -5.3176e+01 -5.7270e+01 -6.1638e+01 -5.3470e+01 -5.3157e+01 -5.7238e+01 -6.1671e+01 -5.3449e+01 -5.3139e+01 -5.7207e+01 -6.1703e+01 -5.3428e+01 -5.3120e+01 -5.7177e+01 -6.1734e+01 -5.3407e+01 -5.3102e+01 -5.7146e+01 -6.1765e+01 -5.3387e+01 -5.3084e+01 -5.7116e+01 -6.1794e+01 -5.3360e+01 -5.3066e+01 -5.7086e+01 -6.1822e+01 -5.3332e+01 -5.3049e+01 -5.7056e+01 -6.1849e+01 -5.3305e+01 -5.3031e+01 -5.7026e+01 -6.1876e+01 -5.3278e+01 -5.3014e+01 -5.6997e+01 -6.1901e+01 -5.3251e+01 -5.2997e+01 -5.6968e+01 -6.1926e+01 -5.3225e+01 -5.2980e+01 -5.6939e+01 -6.1949e+01 -5.3199e+01 -5.2963e+01 -5.6910e+01 -6.1972e+01 -5.3173e+01 -5.2947e+01 -5.6881e+01 -6.1994e+01 -5.3148e+01 -5.2930e+01 -5.6853e+01 -6.2015e+01 -5.3116e+01 -5.2914e+01 -5.6825e+01 -6.2035e+01 -5.3084e+01 -5.2898e+01 -5.6797e+01 -6.2054e+01 -5.3052e+01 -5.2882e+01 -5.6769e+01 -6.2073e+01 -5.3020e+01 -5.2866e+01 -5.6741e+01 -6.2090e+01 -5.2989e+01 -5.2851e+01 -5.6714e+01 -6.2107e+01 -5.2959e+01 -5.2835e+01 -5.6686e+01 -6.2123e+01 -5.2929e+01 -5.2820e+01 -5.6659e+01 -6.2138e+01 -5.2898e+01 -5.2804e+01 -5.6632e+01 -6.2153e+01 -5.2861e+01 -5.2789e+01 -5.6605e+01 -6.2166e+01 -5.2825e+01 -5.2774e+01 -5.6578e+01 -6.2179e+01 -5.2789e+01 -5.2759e+01 -5.6552e+01 -6.2191e+01 -5.2754e+01 -5.2744e+01 -5.6525e+01 -6.2202e+01 -5.2720e+01 -5.2730e+01 -5.6499e+01 -6.2213e+01 -5.2686e+01 -5.2715e+01 -5.6473e+01 -6.2223e+01 -5.2652e+01 -5.2702e+01 -5.6447e+01 -6.2232e+01 -5.2612e+01 -5.2726e+01 -5.6421e+01 -6.2240e+01 -5.2572e+01 -5.2748e+01 -5.6395e+01 -6.2248e+01 -5.2532e+01 -5.2769e+01 -5.6369e+01 -6.2255e+01 -5.2494e+01 -5.2791e+01 -5.6344e+01 -6.2261e+01 -5.2456e+01 -5.2811e+01 -5.6318e+01 -6.2267e+01 -5.2419e+01 -5.2861e+01 -5.6293e+01 -6.2271e+01 -5.2382e+01 -5.2926e+01 -5.6268e+01 -6.2276e+01 -5.2347e+01 -5.2989e+01 -5.6242e+01 -6.2279e+01 -5.2311e+01 -5.3051e+01 -5.6217e+01 -6.2282e+01 -5.2277e+01 -5.3113e+01 -5.6193e+01 -6.2284e+01 -5.2243e+01 -5.3173e+01 -5.6168e+01 -6.2286e+01 -5.2210e+01 -5.3232e+01 -5.6143e+01 -6.2287e+01 -5.2177e+01 -5.3291e+01 -5.6118e+01 -6.2287e+01 -5.2145e+01 -5.3348e+01 -5.6094e+01 -6.2287e+01 -5.2113e+01 -5.3404e+01 -5.6070e+01 -6.2286e+01 -5.2080e+01 -5.3460e+01 -5.6045e+01 -6.2285e+01 -5.2042e+01 -5.3515e+01 -5.6012e+01 -6.2283e+01 -5.2004e+01 -5.3567e+01 -5.5981e+01 -6.2280e+01 -5.1962e+01 -5.3612e+01 -5.5949e+01 -6.2277e+01 -5.1918e+01 -5.3656e+01 -5.5918e+01 -6.2273e+01 -5.1875e+01 -5.3699e+01 -5.5887e+01 -6.2269e+01 -5.1832e+01 -5.3742e+01 -5.5856e+01 -6.2264e+01 -5.1791e+01 -5.3784e+01 -5.5825e+01 -6.2259e+01 -5.1750e+01 -5.3825e+01 -5.5795e+01 -6.2253e+01 -5.1710e+01 -5.3866e+01 -5.5765e+01 -6.2246e+01 -5.1671e+01 -5.3901e+01 -5.5735e+01 -6.2239e+01 -5.1633e+01 -5.3932e+01 -5.5705e+01 -6.2232e+01 -5.1596e+01 -5.3963e+01 -5.5667e+01 -6.2224e+01 -5.1559e+01 -5.3993e+01 -5.5631e+01 -6.2216e+01 -5.1523e+01 -5.4023e+01 -5.5594e+01 -6.2207e+01 -5.1488e+01 -5.4053e+01 -5.5558e+01 -6.2197e+01 -5.1453e+01 -5.4082e+01 -5.5522e+01 -6.2187e+01 -5.1419e+01 -5.4110e+01 -5.5487e+01 -6.2177e+01 -5.1386e+01 -5.4132e+01 -5.5452e+01 -6.2166e+01 -5.1353e+01 -5.4151e+01 -5.5418e+01 -6.2155e+01 -5.1322e+01 -5.4171e+01 -5.5384e+01 -6.2143e+01 -5.1290e+01 -5.4190e+01 -5.5350e+01 -6.2131e+01 -5.1260e+01 -5.4209e+01 -5.5317e+01 -6.2118e+01 -5.1230e+01 -5.4228e+01 -5.5284e+01 -6.2105e+01 -5.1200e+01 -5.4246e+01 -5.5251e+01 -6.2092e+01 -5.1165e+01 -5.4264e+01 -5.5219e+01 -6.2078e+01 -5.1129e+01 -5.4282e+01 -5.5191e+01 -6.2063e+01 -5.1094e+01 -5.4300e+01 -5.5196e+01 -6.2049e+01 -5.1059e+01 -5.4317e+01 -5.5201e+01 -6.2033e+01 -5.1025e+01 -5.4334e+01 -5.5205e+01 -6.2018e+01 -5.0992e+01 -5.4350e+01 -5.5210e+01 -6.2002e+01 -5.0959e+01 -5.4367e+01 -5.5214e+01 -6.1986e+01 -5.0928e+01 -5.4383e+01 -5.5218e+01 -6.1969e+01 -5.0896e+01 -5.4399e+01 -5.5222e+01 -6.1952e+01 -5.0866e+01 -5.4412e+01 -5.5226e+01 -6.1935e+01 -5.0836e+01 -5.4419e+01 -5.5230e+01 -6.1917e+01 -5.0807e+01 -5.4427e+01 -5.5233e+01 -6.1899e+01 -5.0778e+01 -5.4434e+01 -5.5237e+01 -6.1880e+01 -5.0750e+01 -5.4441e+01 -5.5240e+01 -6.1862e+01 -5.0722e+01 -5.4448e+01 -5.5243e+01 -6.1843e+01 -5.0695e+01 -5.4454e+01 -5.5246e+01 -6.1823e+01 -5.0669e+01 -5.4461e+01 -5.5248e+01 -6.1803e+01 -5.0643e+01 -5.4467e+01 -5.5248e+01 -6.1783e+01 -5.0618e+01 -5.4474e+01 -5.5243e+01 -6.1763e+01 -5.0593e+01 -5.4475e+01 -5.5237e+01 -6.1742e+01 -5.0569e+01 -5.4473e+01 -5.5231e+01 -6.1716e+01 -5.0545e+01 -5.4471e+01 -5.5226e+01 -6.1686e+01 -5.0522e+01 -5.4470e+01 -5.5220e+01 -6.1657e+01 -5.0499e+01 -5.4468e+01 -5.5215e+01 -6.1628e+01 -5.0476e+01 -5.4466e+01 -5.5209e+01 -6.1598e+01 -5.0455e+01 -5.4465e+01 -5.5204e+01 -6.1569e+01 -5.0433e+01 -5.4463e+01 -5.5198e+01 -6.1539e+01 -5.0412e+01 -5.4462e+01 -5.5192e+01 -6.1509e+01 -5.0392e+01 -5.4461e+01 -5.5187e+01 -6.1480e+01 -5.0371e+01 -5.4459e+01 -5.5181e+01 -6.1450e+01 -5.0352e+01 -5.4458e+01 -5.5175e+01 -6.1420e+01 -5.0332e+01 -5.4456e+01 -5.5170e+01 -6.1390e+01 -5.0313e+01 -5.4455e+01 -5.5164e+01 -6.1359e+01 -5.0289e+01 -5.4454e+01 -5.5158e+01 -6.1329e+01 -5.0263e+01 -5.4452e+01 -5.5152e+01 -6.1299e+01 -5.0238e+01 -5.4451e+01 -5.5146e+01 -6.1268e+01 -5.0212e+01 -5.4449e+01 -5.5141e+01 -6.1235e+01 -5.0179e+01 -5.4445e+01 -5.5135e+01 -6.1196e+01 -5.0148e+01 -5.4435e+01 -5.5146e+01 -6.1158e+01 -5.0117e+01 -5.4426e+01 -5.5176e+01 -6.1120e+01 -5.0087e+01 -5.4417e+01 -5.5206e+01 -6.1081e+01 -5.0057e+01 -5.4408e+01 -5.5236e+01 -6.1043e+01 -5.0028e+01 -5.4396e+01 -5.5264e+01 -6.1005e+01 -5.0000e+01 -5.4375e+01 -5.5293e+01 -6.0968e+01 -1.0000e+01 -5.4351e+01 -5.5334e+01 -6.0930e+01 -6.0000e+01 -5.4327e+01 -5.5397e+01 -6.0892e+01 -6.0000e+01 -5.4304e+01 -5.5460e+01 -6.0855e+01 -6.0000e+01 -5.4281e+01 -5.5522e+01 -6.0817e+01 -6.0000e+01 -5.4259e+01 -5.5583e+01 -6.0780e+01 -6.0000e+01 -5.4237e+01 -5.5640e+01 -6.0743e+01 -6.0000e+01 -5.4216e+01 -5.5691e+01 -6.0705e+01 -6.0000e+01 -5.4195e+01 -5.5742e+01 -6.0668e+01 -6.0000e+01 -5.4174e+01 -5.5791e+01 -6.0631e+01 -6.0000e+01 -5.4154e+01 -5.5840e+01 -6.0594e+01 -6.0000e+01 -5.4135e+01 -5.5888e+01 -6.0557e+01 -6.0000e+01 -5.4115e+01 -5.5935e+01 -6.0521e+01 -6.0000e+01 -5.4096e+01 -5.5982e+01 -6.0484e+01 -6.0000e+01 -5.4078e+01 -5.6028e+01 -6.0447e+01 -6.0000e+01 -5.4059e+01 -5.6073e+01 -6.0411e+01 -6.0000e+01 -5.4041e+01 -5.6117e+01 -6.0375e+01 -6.0000e+01 -5.4024e+01 -5.6161e+01 -6.0338e+01 -6.0000e+01 -5.4006e+01 -5.6204e+01 -6.0302e+01 -6.0000e+01 -5.3981e+01 -5.6246e+01 -6.0266e+01 -6.0000e+01 -5.3957e+01 -5.6287e+01 -6.0229e+01 -6.0000e+01 -5.3933e+01 -5.6328e+01 -6.0193e+01 -6.0000e+01 -5.3909e+01 -5.6368e+01 -6.0157e+01 -6.0000e+01 -5.3886e+01 -5.6408e+01 -6.0121e+01 -6.0000e+01 -5.3864e+01 -5.6446e+01 -6.0086e+01 -6.0000e+01 -5.3841e+01 -5.6484e+01 -6.0050e+01 -6.0000e+01 -5.3820e+01 -5.6521e+01 -6.0014e+01 -6.0000e+01 -5.3798e+01 -5.6558e+01 -5.9975e+01 -6.0000e+01 -5.3777e+01 -5.6592e+01 -5.9932e+01 -6.0000e+01 -5.3757e+01 -5.6619e+01 -5.9888e+01 -6.0000e+01 -5.3736e+01 -5.6646e+01 -5.9845e+01 -6.0000e+01 -5.3716e+01 -5.6672e+01 -5.9803e+01 -6.0000e+01 -5.3697e+01 -5.6698e+01 -5.9760e+01 -6.0000e+01 -5.3678e+01 -5.6723e+01 -5.9718e+01 -6.0000e+01 -5.3658e+01 -5.6748e+01 -5.9706e+01 -6.0000e+01 -5.3632e+01 -5.6772e+01 -5.9709e+01 -6.0000e+01 -5.3606e+01 -5.6792e+01 -5.9711e+01 -6.0000e+01 -5.3580e+01 -5.6807e+01 -5.9712e+01 -6.0000e+01 -5.3555e+01 -5.6823e+01 -5.9713e+01 -6.0000e+01 -5.3531e+01 -5.6837e+01 -5.9714e+01 -6.0000e+01 -5.3507e+01 -5.6852e+01 -5.9714e+01 -6.0000e+01 -5.3483e+01 -5.6866e+01 -5.9714e+01 -6.0000e+01 -5.3460e+01 -5.6880e+01 -5.9713e+01 -6.0000e+01 -5.3437e+01 -5.6894e+01 -5.9712e+01 -6.0000e+01 -5.3415e+01 -5.6907e+01 -5.9711e+01 -6.0000e+01 -5.3393e+01 -5.6920e+01 -5.9709e+01 -6.0000e+01 -5.3371e+01 -5.6933e+01 -5.9707e+01 -6.0000e+01 -5.3350e+01 -5.6946e+01 -5.9705e+01 -6.0000e+01 -5.3329e+01 -5.6958e+01 -5.9695e+01 -6.0000e+01 -5.3309e+01 -5.6970e+01 -5.9683e+01 -6.0000e+01 -5.3288e+01 -5.6981e+01 -5.9672e+01 -6.0017e+01 -5.3269e+01 -5.6992e+01 -5.9660e+01 -6.0033e+01 -5.3249e+01 -5.7003e+01 -5.9649e+01 -6.0048e+01 -5.3230e+01 -5.7014e+01 -5.9637e+01 -6.0063e+01 -5.3211e+01 -5.7024e+01 -5.9625e+01 -6.0077e+01 -5.3193e+01 -5.7034e+01 -5.9613e+01 -6.0091e+01 -5.3175e+01 -5.7044e+01 -5.9600e+01 -6.0104e+01 -5.3157e+01 -5.7053e+01 -5.9587e+01 -6.0116e+01 -5.3139e+01 -5.7062e+01 -5.9575e+01 -6.0127e+01 -5.3122e+01 -5.7071e+01 -5.9562e+01 -6.0138e+01 -5.3105e+01 -5.7079e+01 -5.9548e+01 -6.0148e+01 -5.3088e+01 -5.7087e+01 -5.9535e+01 -6.0158e+01 -5.3071e+01 -5.7095e+01 -5.9521e+01 -6.0167e+01 -5.3064e+01 -5.7103e+01 -5.9508e+01 -6.0175e+01 -5.3092e+01 -5.7110e+01 -5.9494e+01 -6.0183e+01 -5.3120e+01 -5.7117e+01 -5.9480e+01 -6.0190e+01 -5.3148e+01 -5.7123e+01 -5.9465e+01 -6.0197e+01 -5.3175e+01 -5.7129e+01 -5.9451e+01 -6.0203e+01 -5.3202e+01 -5.7134e+01 -5.9436e+01 -6.0208e+01 -5.3228e+01 -5.7132e+01 -5.9421e+01 -6.0213e+01 -5.3254e+01 -5.7129e+01 -5.9406e+01 -6.0217e+01 -5.3279e+01 -5.7127e+01 -5.9391e+01 -6.0221e+01 -5.3304e+01 -5.7124e+01 -5.9376e+01 -6.0224e+01 -5.3329e+01 -5.7121e+01 -5.9360e+01 -6.0227e+01 -5.3353e+01 -5.7118e+01 -5.9345e+01 -6.0224e+01 -5.3377e+01 -5.7109e+01 -5.9329e+01 -6.0218e+01 -5.3400e+01 -5.7097e+01 -5.9313e+01 -6.0211e+01 -5.3423e+01 -5.7086e+01 -5.9289e+01 -6.0196e+01 -5.3446e+01 -5.7071e+01 -5.9264e+01 -6.0181e+01 -5.3462e+01 -5.7052e+01 -5.9231e+01 -6.0166e+01 -5.3476e+01 -5.7033e+01 -5.9200e+01 -6.0151e+01 -5.3490e+01 -5.7014e+01 -5.9168e+01 -6.0135e+01 -5.3503e+01 -5.6987e+01 -5.9136e+01 -6.0119e+01 -5.3516e+01 -5.6949e+01 -5.9103e+01 -6.0095e+01 -5.3525e+01 -5.6908e+01 -5.9064e+01 -6.0071e+01 -5.3530e+01 -5.6866e+01 -5.9025e+01 -6.0048e+01 -5.3535e+01 -5.6819e+01 -5.8987e+01 -6.0024e+01 -5.3540e+01 -5.6773e+01 -5.8949e+01 -6.0001e+01 -5.3545e+01 -5.6727e+01 -5.8911e+01 -5.9977e+01 -5.3549e+01 -5.6682e+01 -5.8874e+01 -5.9954e+01 -5.3554e+01 -5.6638e+01 -5.8837e+01 -5.9931e+01 -5.3559e+01 -5.6595e+01 -5.8801e+01 -5.9908e+01 -5.3563e+01 -5.6553e+01 -5.8765e+01 -5.9884e+01 -5.3568e+01 -5.6512e+01 -5.8729e+01 -5.9861e+01 -5.3573e+01 -5.6471e+01 -5.8693e+01 -5.9838e+01 -5.3577e+01 -5.6431e+01 -5.8658e+01 -5.9815e+01 -5.3581e+01 -5.6392e+01 -5.8623e+01 -5.9792e+01 -5.3586e+01 -5.6354e+01 -5.8588e+01 -5.9769e+01 -5.3590e+01 -5.6316e+01 -5.8554e+01 -5.9745e+01 -5.3594e+01 -5.6279e+01 -5.8520e+01 -5.9722e+01 -5.3598e+01 -5.6243e+01 -5.8486e+01 -5.9699e+01 -5.3602e+01 -5.6207e+01 -5.8452e+01 -5.9676e+01 -5.3606e+01 -5.6172e+01 -5.8412e+01 -5.9653e+01 -5.3610e+01 -5.6137e+01 -5.8371e+01 -5.9630e+01 -5.3614e+01 -5.6095e+01 -5.8331e+01 -5.9607e+01 -5.3617e+01 -5.6054e+01 -5.8291e+01 -5.9584e+01 -5.3621e+01 -5.6014e+01 -5.8251e+01 -5.9561e+01 -5.3621e+01 -5.5974e+01 -5.8212e+01 -5.9537e+01 -5.3616e+01 -5.5935e+01 -5.8173e+01 -5.9514e+01 -5.3604e+01 -5.5897e+01 -5.8134e+01 -5.9491e+01 -5.3592e+01 -5.5860e+01 -5.8096e+01 -5.9468e+01 -5.3576e+01 -5.5823e+01 -5.8058e+01 -5.9445e+01 -5.3556e+01 -5.5787e+01 -5.8021e+01 -5.9422e+01 -5.3537e+01 -5.5745e+01 -5.7984e+01 -5.9395e+01 -5.3518e+01 -5.5702e+01 -5.7947e+01 -5.9364e+01 -5.3500e+01 -5.5660e+01 -5.7911e+01 -5.9333e+01 -5.3482e+01 -5.5619e+01 -5.7875e+01 -5.9302e+01 -5.3464e+01 -5.5579e+01 -5.7839e+01 -5.9272e+01 -5.3447e+01 -5.5539e+01 -5.7803e+01 -5.9241e+01 -5.3431e+01 -5.5500e+01 -5.7768e+01 -5.9211e+01 -5.3414e+01 -5.5461e+01 -5.7734e+01 -5.9180e+01 -5.3398e+01 -5.5424e+01 -5.7699e+01 -5.9150e+01 -5.3381e+01 -5.5387e+01 -5.7665e+01 -5.9120e+01 -5.3358e+01 -5.5351e+01 -5.7631e+01 -5.9090e+01 -5.3335e+01 -5.5315e+01 -5.7597e+01 -5.9061e+01 -5.3313e+01 -5.5280e+01 -5.7564e+01 -5.9031e+01 -5.3291e+01 -5.5245e+01 -5.7530e+01 -5.9002e+01 -5.3270e+01 -5.5212e+01 -5.7497e+01 -5.8972e+01 -5.3249e+01 -5.5172e+01 -5.7465e+01 -5.8943e+01 -5.3229e+01 -5.5132e+01 -5.7432e+01 -5.8914e+01 -5.3209e+01 -5.5092e+01 -5.7400e+01 -5.8885e+01 -5.3189e+01 -5.5053e+01 -5.7368e+01 -5.8856e+01 -5.3170e+01 -5.5014e+01 -5.7336e+01 -5.8827e+01 -5.3151e+01 -5.4977e+01 -5.7305e+01 -5.8798e+01 -5.3133e+01 -5.4940e+01 -5.7273e+01 -5.8770e+01 -5.3115e+01 -5.4903e+01 -5.7242e+01 -5.8741e+01 -5.3098e+01 -5.4868e+01 -5.7211e+01 -5.8707e+01 -5.3080e+01 -5.4833e+01 -5.7181e+01 -5.8670e+01 -5.3063e+01 -5.4798e+01 -5.7150e+01 -5.8634e+01 -5.3047e+01 -5.4764e+01 -5.7120e+01 -5.8599e+01 -5.3031e+01 -5.4731e+01 -5.7090e+01 -5.8563e+01 -5.3015e+01 -5.4698e+01 -5.7060e+01 -5.8528e+01 -5.2999e+01 -5.4666e+01 -5.7030e+01 -5.8493e+01 -5.2984e+01 -5.4634e+01 -5.7000e+01 -5.8459e+01 -5.2969e+01 -5.4603e+01 -5.6978e+01 -5.8424e+01 -5.2954e+01 -5.4572e+01 -5.6993e+01 -5.8390e+01 -5.2940e+01 -5.4542e+01 -5.7008e+01 -5.8356e+01 -5.2926e+01 -5.4513e+01 -5.7023e+01 -5.8321e+01 -5.2912e+01 -5.4483e+01 -5.7036e+01 -5.8279e+01 -5.2898e+01 -5.4455e+01 -5.7050e+01 -5.8238e+01 -5.2885e+01 -5.4427e+01 -5.7063e+01 -5.8197e+01 -5.2868e+01 -5.4399e+01 -5.7075e+01 -5.8157e+01 -5.2847e+01 -5.4371e+01 -5.7087e+01 -5.8117e+01 -5.2826e+01 -5.4344e+01 -5.7098e+01 -5.8078e+01 -5.2806e+01 -5.4318e+01 -5.7109e+01 -5.8039e+01 -5.2787e+01 -5.4292e+01 -5.7120e+01 -5.8000e+01 -5.2767e+01 -5.4266e+01 -5.7130e+01 -5.7961e+01 -5.2748e+01 -5.4241e+01 -5.7139e+01 -5.7923e+01 -5.2730e+01 -5.4216e+01 -5.7148e+01 -5.7877e+01 -5.2712e+01 -5.4191e+01 -5.7157e+01 -5.7832e+01 -5.2694e+01 -5.4167e+01 -5.7165e+01 -5.7787e+01 -5.2676e+01 -5.4143e+01 -5.7173e+01 -5.7743e+01 -5.2659e+01 -5.4119e+01 -5.7181e+01 -5.7699e+01 -5.2642e+01 -5.4096e+01 -5.7187e+01 -5.7656e+01 -5.2626e+01 -5.4073e+01 -5.7194e+01 -5.7613e+01 -5.2609e+01 -5.4050e+01 -5.7200e+01 -5.7571e+01 -5.2593e+01 -5.4028e+01 -5.7206e+01 -5.7529e+01 -5.2578e+01 -5.4006e+01 -5.7211e+01 -5.7488e+01 -5.2562e+01 -5.3984e+01 -5.7216e+01 -5.7447e+01 -5.2547e+01 -5.3962e+01 -5.7220e+01 -5.7406e+01 -5.2532e+01 -5.3941e+01 -5.7225e+01 -5.7366e+01 -5.2518e+01 -5.3920e+01 -5.7228e+01 -5.7326e+01 -5.2503e+01 -5.3900e+01 -5.7232e+01 -5.7287e+01 -5.2489e+01 -5.3879e+01 -5.7234e+01 -5.7248e+01 -5.2475e+01 -5.3859e+01 -5.7237e+01 -5.7210e+01 -5.2461e+01 -5.3839e+01 -5.7239e+01 -5.7172e+01 -5.2490e+01 -5.3819e+01 -5.7241e+01 -5.7134e+01 -5.2521e+01 -5.3800e+01 -5.7242e+01 -5.7096e+01 -5.2551e+01 -5.3815e+01 -5.7243e+01 -5.7059e+01 -5.2581e+01 -5.3832e+01 -5.7244e+01 -5.7022e+01 -5.2604e+01 -5.3849e+01 -5.7244e+01 -5.6986e+01 -5.2625e+01 -5.3865e+01 -5.7244e+01 -5.6950e+01 -5.2646e+01 -5.3882e+01 -5.7244e+01 -5.6914e+01 -5.2666e+01 -5.3898e+01 -5.7243e+01 -5.6871e+01 -5.2687e+01 -5.3914e+01 -5.7242e+01 -5.6828e+01 -5.2707e+01 -5.3929e+01 -5.7241e+01 -5.6786e+01 -5.2727e+01 -5.3945e+01 -5.7239e+01 -5.6741e+01 -5.2746e+01 -5.3960e+01 -5.7237e+01 -5.6691e+01 -5.2766e+01 -5.3991e+01 -5.7235e+01 -5.6643e+01 -5.2785e+01 -5.4042e+01 -5.7232e+01 -5.6595e+01 -5.2803e+01 -5.4093e+01 -5.7229e+01 -5.6547e+01 -5.2822e+01 -5.4142e+01 -5.7226e+01 -5.6500e+01 -5.2840e+01 -5.4191e+01 -5.7222e+01 -5.6454e+01 -5.2858e+01 -5.4239e+01 -5.7218e+01 -5.6408e+01 -5.2876e+01 -5.4286e+01 -5.7214e+01 -5.6363e+01 -5.2893e+01 -5.4333e+01 -5.7209e+01 -5.6319e+01 -5.2911e+01 -5.4379e+01 -5.7204e+01 -5.6275e+01 -5.2928e+01 -5.4424e+01 -5.7199e+01 -5.6232e+01 -5.2944e+01 -5.4469e+01 -5.7194e+01 -5.6189e+01 -5.2961e+01 -5.4512e+01 -5.7188e+01 -5.6147e+01 -5.2977e+01 -5.4555e+01 -5.7182e+01 -5.6105e+01 -5.2993e+01 -5.4598e+01 -5.7176e+01 -5.6064e+01 -5.3008e+01 -5.4640e+01 -5.7169e+01 -5.6023e+01 -5.3023e+01 -5.4681e+01 -5.7163e+01 -5.5983e+01 -5.3038e+01 -5.4721e+01 -5.7156e+01 -5.5943e+01 -5.3053e+01 -5.4761e+01 -5.7148e+01 -5.5904e+01 -5.3068e+01 -5.4799e+01 -5.7141e+01 -5.5865e+01 -5.3082e+01 -5.4838e+01 -5.7133e+01 -5.5824e+01 -5.3096e+01 -5.4875e+01 -5.7125e+01 -5.5778e+01 -5.3109e+01 -5.4912e+01 -5.7116e+01 -5.5733e+01 -5.3123e+01 -5.4949e+01 -5.7108e+01 -5.5689e+01 -5.3128e+01 -5.4984e+01 -5.7099e+01 -5.5644e+01 -5.3133e+01 -5.5013e+01 -5.7086e+01 -5.5601e+01 -5.3138e+01 -5.5039e+01 -5.7069e+01 -5.5558e+01 -5.3143e+01 -5.5065e+01 -5.7052e+01 -5.5513e+01 -5.3148e+01 -5.5091e+01 -5.7035e+01 -5.5464e+01 -5.3173e+01 -5.5116e+01 -5.7017e+01 -5.5415e+01 -5.3222e+01 -5.5141e+01 -5.7000e+01 -5.5366e+01 -5.3270e+01 -5.5165e+01 -5.6983e+01 -5.5319e+01 -5.3317e+01 -5.5189e+01 -5.6965e+01 -5.5272e+01 -5.3364e+01 -5.5212e+01 -5.6948e+01 -5.5226e+01 -5.3410e+01 -5.5235e+01 -5.6930e+01 -5.5180e+01 -5.3456e+01 -5.5258e+01 -5.6913e+01 -5.5135e+01 -5.3500e+01 -5.5280e+01 -5.6895e+01 -5.5083e+01 -5.3544e+01 -5.5302e+01 -5.6877e+01 -5.5032e+01 -5.3587e+01 -5.5323e+01 -5.6860e+01 -5.4981e+01 -5.3630e+01 -5.5344e+01 -5.6842e+01 -5.4932e+01 -5.3671e+01 -5.5364e+01 -5.6824e+01 -5.4883e+01 -5.3712e+01 -5.5384e+01 -5.6807e+01 -5.4834e+01 -5.3753e+01 -5.5403e+01 -5.6789e+01 -5.4787e+01 -5.3793e+01 -5.5422e+01 -5.6771e+01 -5.4740e+01 -5.3832e+01 -5.5441e+01 -5.6753e+01 -5.4694e+01 -5.3870e+01 -5.5459e+01 -5.6735e+01 -5.4649e+01 -5.3907e+01 -5.5477e+01 -5.6717e+01 -5.4599e+01 -5.3944e+01 -5.5494e+01 -5.6699e+01 -5.4547e+01 -5.3981e+01 -5.5511e+01 -5.6681e+01 -5.4496e+01 -5.4016e+01 -5.5528e+01 -5.6663e+01 -5.4446e+01 -5.4051e+01 -5.5544e+01 -5.6645e+01 -5.4397e+01 -5.4086e+01 -5.5560e+01 -5.6627e+01 -5.4349e+01 -5.4119e+01 -5.5575e+01 -5.6608e+01 -5.4301e+01 -5.4153e+01 -5.5590e+01 -5.6590e+01 -5.4254e+01 -5.4185e+01 -5.5604e+01 -5.6572e+01 -5.4208e+01 -5.4217e+01 -5.5618e+01 -5.6553e+01 -5.4163e+01 -5.4248e+01 -5.5632e+01 -5.6535e+01 -5.4118e+01 -5.4279e+01 -5.5645e+01 -5.6517e+01 -5.4074e+01 -5.4309e+01 -5.5658e+01 -5.6498e+01 -5.4031e+01 -5.4338e+01 -5.5671e+01 -5.6480e+01 -5.3988e+01 -5.4367e+01 -5.5683e+01 -5.6461e+01 -5.3947e+01 -5.4395e+01 -5.5694e+01 -5.6442e+01 -5.3905e+01 -5.4423e+01 -5.5706e+01 -5.6424e+01 -5.3865e+01 -5.4450e+01 -5.5717e+01 -5.6405e+01 -5.3825e+01 -5.4476e+01 -5.5727e+01 -5.6386e+01 -5.3786e+01 -5.4502e+01 -5.5737e+01 -5.6361e+01 -5.3747e+01 -5.4520e+01 -5.5747e+01 -5.6334e+01 -5.3709e+01 -5.4537e+01 -5.5757e+01 -5.6308e+01 -5.3671e+01 -5.4554e+01 -5.5766e+01 -5.6282e+01 -5.3634e+01 -5.4566e+01 -5.5774e+01 -5.6255e+01 -5.3598e+01 -5.4574e+01 -5.5783e+01 -5.6229e+01 -5.3562e+01 -5.4582e+01 -5.5791e+01 -5.6204e+01 -5.3527e+01 -5.4590e+01 -5.5798e+01 -5.6178e+01 -5.3492e+01 -5.4597e+01 -5.5806e+01 -5.6152e+01 -5.3458e+01 -5.4605e+01 -5.5813e+01 -5.6127e+01 -5.3424e+01 -5.4612e+01 -5.5819e+01 -5.6102e+01 -5.3391e+01 -5.4619e+01 -5.5825e+01 -5.6076e+01 -5.3358e+01 -5.4625e+01 -5.5831e+01 -5.6051e+01 -5.3325e+01 -5.4632e+01 -5.5837e+01 -5.6026e+01 -5.3294e+01 -5.4638e+01 -5.5842e+01 -5.6002e+01 -5.3262e+01 -5.4645e+01 -5.5847e+01 -5.5977e+01 -5.3231e+01 -5.4651e+01 -5.5852e+01 -5.5952e+01 -5.3201e+01 -5.4657e+01 -5.5856e+01 -5.5928e+01 -5.3171e+01 -5.4662e+01 -5.5860e+01 -5.5904e+01 -5.3141e+01 -5.4668e+01 -5.5863e+01 -5.5879e+01 -5.3112e+01 -5.4673e+01 -5.5867e+01 -5.5855e+01 -5.3083e+01 -5.4678e+01 -5.5870e+01 -5.5831e+01 -5.3046e+01 -5.4683e+01 -5.5872e+01 -5.5807e+01 -5.3002e+01 -5.4688e+01 -5.5871e+01 -5.5784e+01 -5.2955e+01 -5.4693e+01 -5.5865e+01 -5.5760e+01 -5.2904e+01 -5.4697e+01 -5.5859e+01 -5.5736e+01 -5.2855e+01 -5.4701e+01 -5.5853e+01 -5.5713e+01 -5.2807e+01 -5.4705e+01 -5.5847e+01 -5.5689e+01 -5.2759e+01 -5.4709e+01 -5.5841e+01 -5.5666e+01 -5.2713e+01 -5.4713e+01 -5.5834e+01 -5.5650e+01 -5.2667e+01 -5.4716e+01 -5.5828e+01 -5.5671e+01 -5.2622e+01 -5.4719e+01 -5.5821e+01 -5.5692e+01 -5.2578e+01 -5.4722e+01 -5.5814e+01 -5.5712e+01 -5.2535e+01 -5.4725e+01 -5.5808e+01 -5.5732e+01 -5.2492e+01 -5.4728e+01 -5.5801e+01 -5.5751e+01 -5.2444e+01 -5.4730e+01 -5.5794e+01 -5.5770e+01 -5.2395e+01 -5.4733e+01 -5.5786e+01 -5.5788e+01 -5.2347e+01 -5.4727e+01 -5.5779e+01 -5.5805e+01 -5.2300e+01 -5.4721e+01 -5.5772e+01 -5.5822e+01 -5.2254e+01 -5.4715e+01 -5.5764e+01 -5.5839e+01 -5.2209e+01 -5.4709e+01 -5.5757e+01 -5.5854e+01 -5.2165e+01 -5.4703e+01 -5.5749e+01 -5.5870e+01 -5.2122e+01 -5.4697e+01 -5.5741e+01 -5.5885e+01 -5.2079e+01 -5.4691e+01 -5.5733e+01 -5.5899e+01 -5.2038e+01 -5.4685e+01 -5.5725e+01 -5.5913e+01 -5.1997e+01 -5.4679e+01 -5.5717e+01 -5.5926e+01 -5.1957e+01 -5.4673e+01 -5.5709e+01 -5.5939e+01 -5.1917e+01 -5.4667e+01 -5.5700e+01 -5.5952e+01 -5.1879e+01 -5.4661e+01 -5.5692e+01 -5.5964e+01 -5.1841e+01 -5.4655e+01 -5.5683e+01 -5.5975e+01 -5.1804e+01 -5.4649e+01 -5.5674e+01 -5.5986e+01 -5.1767e+01 -5.4643e+01 -5.5665e+01 -5.5996e+01 -5.1732e+01 -5.4637e+01 -5.5656e+01 -5.6006e+01 -5.1697e+01 -5.4631e+01 -5.5647e+01 -5.6016e+01 -5.1662e+01 -5.4625e+01 -5.5638e+01 -5.6025e+01 -5.1628e+01 -5.4618e+01 -5.5629e+01 -5.6034e+01 -5.1595e+01 -5.4612e+01 -5.5619e+01 -5.6042e+01 -5.1563e+01 -5.4606e+01 -5.5610e+01 -5.6050e+01 -5.1531e+01 -5.4599e+01 -5.5600e+01 -5.6058e+01 -5.1500e+01 -5.4593e+01 -5.5590e+01 -5.6065e+01 -5.1469e+01 -5.4586e+01 -5.5580e+01 -5.6071e+01 -5.1439e+01 -5.4580e+01 -5.5570e+01 -5.6077e+01 -5.1409e+01 -5.4573e+01 -5.5560e+01 -5.6083e+01 -5.1380e+01 -5.4566e+01 -5.5550e+01 -5.6088e+01 -5.1352e+01 -5.4560e+01 -5.5540e+01 -5.6093e+01 -5.1353e+01 -5.4553e+01 -5.5529e+01 -5.6098e+01 -5.1370e+01 -5.4546e+01 -5.5519e+01 -5.6102e+01 -5.1386e+01 -5.4539e+01 -5.5508e+01 -5.6106e+01 -5.1403e+01 -5.4532e+01 -5.5498e+01 -5.6109e+01 -5.1419e+01 -5.4525e+01 -5.5487e+01 -5.6113e+01 -5.1435e+01 -5.4518e+01 -5.5476e+01 -5.6115e+01 -5.1451e+01 -5.4511e+01 -5.5465e+01 -5.6118e+01 -5.1467e+01 -5.4504e+01 -5.5454e+01 -5.6120e+01 -5.1483e+01 -5.4496e+01 -5.5443e+01 -5.6121e+01 -5.1498e+01 -5.4489e+01 -5.5431e+01 -5.6123e+01 -5.1514e+01 -5.4479e+01 -5.5420e+01 -5.6123e+01 -5.1521e+01 -5.4464e+01 -5.5408e+01 -5.6164e+01 -5.1528e+01 -5.4449e+01 -5.5397e+01 -5.6208e+01 -5.1535e+01 -5.4434e+01 -5.5385e+01 -5.6252e+01 -5.1543e+01 -5.4418e+01 -5.5373e+01 -5.6294e+01 -5.1550e+01 -5.4404e+01 -5.5361e+01 -5.6335e+01 -5.1557e+01 -5.4389e+01 -5.5349e+01 -5.6376e+01 -5.1564e+01 -5.4374e+01 -5.5337e+01 -5.6415e+01 -5.1571e+01 -5.4359e+01 -5.5325e+01 -5.6454e+01 -5.1578e+01 -5.4345e+01 -5.5313e+01 -5.6492e+01 -5.1586e+01 -5.4331e+01 -5.5297e+01 -5.6528e+01 -5.1593e+01 -5.4312e+01 -5.5277e+01 -5.6564e+01 -5.1600e+01 -5.4290e+01 -5.5256e+01 -5.6599e+01 -5.1607e+01 -5.4268e+01 -5.5236e+01 -5.6633e+01 -5.1614e+01 -5.4246e+01 -5.5216e+01 -5.6662e+01 -5.1621e+01 -5.4225e+01 -5.5196e+01 -5.6686e+01 -5.1628e+01 -5.4204e+01 -5.5175e+01 -5.6710e+01 -5.1635e+01 -5.4183e+01 -5.5148e+01 -5.6733e+01 -5.1641e+01 -5.4163e+01 -5.5120e+01 -5.6756e+01 -5.1648e+01 -5.4142e+01 -5.5093e+01 -5.6777e+01 -5.1655e+01 -5.4122e+01 -5.5066e+01 -5.6791e+01 -5.1662e+01 -5.4102e+01 -5.5040e+01 -5.6803e+01 -5.1668e+01 -5.4083e+01 -5.5050e+01 -5.6816e+01 -5.1675e+01 -5.4063e+01 -5.5060e+01 -5.6828e+01 -5.1681e+01 -5.4044e+01 -5.5070e+01 -5.6840e+01 -5.1688e+01 -5.4025e+01 -5.5080e+01 -5.6851e+01 -5.1694e+01 -5.4007e+01 -5.5089e+01 -5.6862e+01 -5.1700e+01 -5.3988e+01 -5.5099e+01 -5.6872e+01 -5.1706e+01 -5.3970e+01 -5.5108e+01 -5.6882e+01 -5.1712e+01 -5.3951e+01 -5.5117e+01 -5.6892e+01 -5.1710e+01 -5.3933e+01 -5.5126e+01 -5.6901e+01 -5.1708e+01 -5.3915e+01 -5.5134e+01 -5.6910e+01 -5.1707e+01 -5.3898e+01 -5.5142e+01 -5.6919e+01 -5.1705e+01 -5.3880e+01 -5.5150e+01 -5.6927e+01 -5.1703e+01 -5.3863e+01 -5.5158e+01 -5.6935e+01 -5.1702e+01 -5.3846e+01 -5.5166e+01 -5.6942e+01 -5.1701e+01 -5.3829e+01 -5.5173e+01 -5.6949e+01 -5.1699e+01 -5.3805e+01 -5.5180e+01 -5.6956e+01 -5.1698e+01 -5.3780e+01 -5.5187e+01 -5.6962e+01 -5.1697e+01 -5.3756e+01 -5.5194e+01 -5.6968e+01 -5.1694e+01 -5.3732e+01 -5.5200e+01 -5.6973e+01 -5.1685e+01 -5.3708e+01 -5.5206e+01 -5.6978e+01 -5.1677e+01 -5.3685e+01 -5.5212e+01 -5.6983e+01 -5.1668e+01 -5.3662e+01 -5.5218e+01 -5.6987e+01 -5.1660e+01 -5.3639e+01 -5.5224e+01 -5.6991e+01 -5.1652e+01 -5.3617e+01 -5.5229e+01 -5.6995e+01 -5.1644e+01 -5.3595e+01 -5.5234e+01 -5.6998e+01 -5.1637e+01 -5.3573e+01 -5.5239e+01 -5.7001e+01 -5.1629e+01 -5.3551e+01 -5.5243e+01 -5.7004e+01 -5.1622e+01 -5.3530e+01 -5.5248e+01 -5.7006e+01 -5.1615e+01 -5.3509e+01 -5.5252e+01 -5.7008e+01 -5.1608e+01 -5.3488e+01 -5.5256e+01 -5.7010e+01 -5.1602e+01 -5.3468e+01 -5.5259e+01 -5.7011e+01 -5.1595e+01 -5.3447e+01 -5.5263e+01 -5.7012e+01 -5.1589e+01 -5.3427e+01 -5.5266e+01 -5.7013e+01 -5.1583e+01 -5.3407e+01 -5.5269e+01 -5.7013e+01 -5.1577e+01 -5.3388e+01 -5.5272e+01 -5.7013e+01 -5.1571e+01 -5.3368e+01 -5.5274e+01 -5.7013e+01 -5.1566e+01 -5.3349e+01 -5.5276e+01 -5.7012e+01 -5.1560e+01 -5.3330e+01 -5.5278e+01 -5.7011e+01 -5.1553e+01 -5.3311e+01 -5.5280e+01 -5.7010e+01 -5.1540e+01 -5.3293e+01 -5.5282e+01 -5.7009e+01 -5.1527e+01 -5.3274e+01 -5.5283e+01 -5.7007e+01 -5.1515e+01 -5.3256e+01 -5.5278e+01 -5.7005e+01 -5.1502e+01 -5.3238e+01 -5.5271e+01 -5.7002e+01 -5.1490e+01 -5.3220e+01 -5.5264e+01 -5.7000e+01 -5.1479e+01 -5.3203e+01 -5.5257e+01 -5.6997e+01 -5.1467e+01 -5.3182e+01 -5.5250e+01 -5.6993e+01 -5.1456e+01 -5.3157e+01 -5.5243e+01 -5.6990e+01 -5.1445e+01 -5.3132e+01 -5.5236e+01 -5.6986e+01 -5.1434e+01 -5.3108e+01 -5.5229e+01 -5.6982e+01 -5.1424e+01 -5.3084e+01 -5.5222e+01 -5.6977e+01 -5.1414e+01 -5.3058e+01 -5.5215e+01 -5.6973e+01 -5.1404e+01 -5.3027e+01 -5.5208e+01 -5.6968e+01 -5.1394e+01 -5.2996e+01 -5.5200e+01 -5.6962e+01 -5.1385e+01 -5.2965e+01 -5.5193e+01 -5.6957e+01 -5.1376e+01 -5.2935e+01 -5.5186e+01 -5.6951e+01 -5.1366e+01 -5.2906e+01 -5.5178e+01 -5.6945e+01 -5.1358e+01 -5.2877e+01 -5.5171e+01 -5.6932e+01 -5.1349e+01 -5.2848e+01 -5.5163e+01 -5.6917e+01 -5.1340e+01 -5.2820e+01 -5.5156e+01 -5.6903e+01 -5.1332e+01 -5.2793e+01 -5.5148e+01 -5.6889e+01 -5.1324e+01 -5.2760e+01 -5.5140e+01 -5.6874e+01 -5.1316e+01 -5.2725e+01 -5.5136e+01 -5.6860e+01 -5.1308e+01 -5.2691e+01 -5.5165e+01 -5.6845e+01 -5.1301e+01 -5.2658e+01 -5.5190e+01 -5.6831e+01 -5.1293e+01 -5.2625e+01 -5.5210e+01 -5.6816e+01 -5.1286e+01 -5.2593e+01 -5.5229e+01 -5.6801e+01 -5.1279e+01 -5.2561e+01 -5.5248e+01 -5.6786e+01 -5.1272e+01 -5.2530e+01 -5.5267e+01 -5.6772e+01 -5.1265e+01 -5.2499e+01 -5.5286e+01 -5.6757e+01 -5.1258e+01 -5.2469e+01 -5.5304e+01 -5.6742e+01 -5.1251e+01 -5.2440e+01 -5.5321e+01 -5.6727e+01 -5.1245e+01 -5.2408e+01 -5.5339e+01 -5.6712e+01 -5.1238e+01 -5.2371e+01 -5.5356e+01 -5.6696e+01 -5.1232e+01 -5.2335e+01 -5.5373e+01 -5.6681e+01 -5.1226e+01 -5.2300e+01 -5.5389e+01 -5.6666e+01 -5.1220e+01 -5.2266e+01 -5.5403e+01 -5.6651e+01 -5.1214e+01 -5.2232e+01 -5.5410e+01 -5.6635e+01 -5.1208e+01 -5.2199e+01 -5.5418e+01 -5.6618e+01 -5.1202e+01 -5.2166e+01 -5.5426e+01 -5.6595e+01 -5.1196e+01 -5.2134e+01 -5.5427e+01 -5.6571e+01 -5.1191e+01 -5.2103e+01 -5.5427e+01 -5.6548e+01 -5.1185e+01 -5.2072e+01 -5.5426e+01 -5.6525e+01 -5.1180e+01 -5.2042e+01 -5.5426e+01 -5.6502e+01 -5.1174e+01 -5.2012e+01 -5.5425e+01 -5.6479e+01 -5.1169e+01 -5.1983e+01 -5.5425e+01 -5.6457e+01 -5.1164e+01 -5.1954e+01 -5.5424e+01 -5.6434e+01 -5.1159e+01 -5.1926e+01 -5.5424e+01 -5.6412e+01 -5.1153e+01 -5.1898e+01 -5.5440e+01 -5.6387e+01 -5.1148e+01 -5.1869e+01 -5.5476e+01 -5.6357e+01 -5.1143e+01 -5.1834e+01 -5.5511e+01 -5.6327e+01 -5.1137e+01 -5.1800e+01 -5.5546e+01 -5.6297e+01 -5.1124e+01 -5.1767e+01 -5.5581e+01 -5.6268e+01 -5.1111e+01 -5.1727e+01 -5.5615e+01 -5.6239e+01 -5.1099e+01 -5.1687e+01 -5.5648e+01 -5.6210e+01 -5.1087e+01 -5.1648e+01 -5.5681e+01 -5.6181e+01 -5.1075e+01 -5.1610e+01 -5.5714e+01 -5.6153e+01 -5.1064e+01 -5.1572e+01 -5.5746e+01 -5.6125e+01 -5.1052e+01 -5.1535e+01 -5.5777e+01 -5.6097e+01 -5.1041e+01 -5.1500e+01 -5.5809e+01 -5.6070e+01 -5.1030e+01 -5.1464e+01 -5.5839e+01 -5.6042e+01 -5.1019e+01 -5.1430e+01 -5.5869e+01 -5.6015e+01 -5.1009e+01 -5.1396e+01 -5.5899e+01 -5.5988e+01 -5.0998e+01 -5.1363e+01 -5.5928e+01 -5.5962e+01 -5.0988e+01 -5.1331e+01 -5.5956e+01 -5.5935e+01 -5.0978e+01 -5.1299e+01 -5.5985e+01 -5.5909e+01 -5.0968e+01 -5.1268e+01 -5.6012e+01 -5.5883e+01 -5.0959e+01 -5.1237e+01 -5.6039e+01 -5.5857e+01 -5.0949e+01 -5.1207e+01 -5.6066e+01 -5.5831e+01 -5.0940e+01 -5.1178e+01 -5.6092e+01 -5.5806e+01 -5.0931e+01 -5.1149e+01 -5.6118e+01 -5.5781e+01 -5.0922e+01 -5.1121e+01 -5.6143e+01 -5.5756e+01 -5.0913e+01 -5.1085e+01 -5.6168e+01 -5.5731e+01 -5.0904e+01 -5.1051e+01 -5.6192e+01 -5.5706e+01 -5.0896e+01 -5.1017e+01 -5.6216e+01 -5.5681e+01 -5.0887e+01 -5.0983e+01 -5.6239e+01 -5.5657e+01 -5.0879e+01 -5.0950e+01 -5.6261e+01 -5.5633e+01 -5.0871e+01 -5.0919e+01 -5.6284e+01 -5.5609e+01 -5.0863e+01 -5.0887e+01 -5.6306e+01 -5.5585e+01 -5.0855e+01 -5.0857e+01 -5.6327e+01 -5.5561e+01 -5.0847e+01 -5.0827e+01 -5.6348e+01 -5.5537e+01 -5.0840e+01 -5.0797e+01 -5.6368e+01 -5.5514e+01 -5.0832e+01 -5.0768e+01 -5.6388e+01 -5.5490e+01 -5.0825e+01 -5.0740e+01 -5.6407e+01 -5.5467e+01 -5.0818e+01 -5.0713e+01 -5.6426e+01 -5.5444e+01 -5.0810e+01 -5.0686e+01 -5.6445e+01 -5.5417e+01 -5.0800e+01 -5.0659e+01 -5.6463e+01 -5.5386e+01 -5.0785e+01 -5.0633e+01 -5.6480e+01 -5.5356e+01 -5.0770e+01 -5.0608e+01 -5.6497e+01 -5.5326e+01 -5.0756e+01 -5.0583e+01 -5.6514e+01 -5.5296e+01 -5.0742e+01 -5.0559e+01 -5.6530e+01 -5.5267e+01 -5.0728e+01 -5.0535e+01 -5.6546e+01 -5.5237e+01 -5.0715e+01 -5.0512e+01 -5.6561e+01 -5.5208e+01 -5.0701e+01 -5.0489e+01 -5.6576e+01 -5.5180e+01 -5.0688e+01 -5.0467e+01 -5.6591e+01 -5.5151e+01 -5.0676e+01 -5.0445e+01 -5.6604e+01 -5.5123e+01 -5.0663e+01 -5.0424e+01 -5.6618e+01 -5.5095e+01 -5.0651e+01 -5.0403e+01 -5.6631e+01 -5.5068e+01 -5.0639e+01 -5.0383e+01 -5.6644e+01 -5.5040e+01 -5.0627e+01 -5.0362e+01 -5.6656e+01 -5.5013e+01 -5.0616e+01 -5.0343e+01 -5.6668e+01 -5.4987e+01 -5.0604e+01 -5.0324e+01 -5.6679e+01 -5.4960e+01 -5.0593e+01 -5.0305e+01 -5.6690e+01 -5.4934e+01 -5.0582e+01 -5.0286e+01 -5.6701e+01 -5.4907e+01 -5.0571e+01 -5.0268e+01 -5.6711e+01 -5.4882e+01 -5.0554e+01 -5.0251e+01 -5.6721e+01 -5.4856e+01 -5.0536e+01 -5.0233e+01 -5.6730e+01 -5.4830e+01 -5.0518e+01 -5.0216e+01 -5.6739e+01 -5.4805e+01 -5.0501e+01 -5.0200e+01 -5.6747e+01 -5.4780e+01 -5.0484e+01 -5.0184e+01 -5.6756e+01 -5.4755e+01 -5.0467e+01 -5.0168e+01 -5.6763e+01 -5.4730e+01 -5.0451e+01 -5.0152e+01 -5.6771e+01 -5.4706e+01 -5.0435e+01 -5.0137e+01 -5.6778e+01 -5.4682e+01 -5.0415e+01 -5.0117e+01 -5.6784e+01 -5.4658e+01 -5.0392e+01 -5.0094e+01 -5.6790e+01 -5.4634e+01 -5.0369e+01 -5.0070e+01 -5.6796e+01 -5.4610e+01 -5.0347e+01 -5.0040e+01 -5.6802e+01 -5.4586e+01 -5.0325e+01 -5.0011e+01 -5.6807e+01 -5.4563e+01 -5.0304e+01 -1.0000e+01 -5.6812e+01 -5.4540e+01 -5.0283e+01 -6.0000e+01 -5.6816e+01 -5.4517e+01 -5.0263e+01 -6.0000e+01 -5.6820e+01 -5.4494e+01 -5.0243e+01 -6.0000e+01 -5.6824e+01 -5.4471e+01 -5.0224e+01 -6.0000e+01 -5.6827e+01 -5.4449e+01 -5.0205e+01 -6.0000e+01 -5.6830e+01 -5.4426e+01 -5.0186e+01 -6.0000e+01 -5.6832e+01 -5.4404e+01 -5.0168e+01 -6.0000e+01 -5.6835e+01 -5.4382e+01 -5.0150e+01 -6.0000e+01 -5.6836e+01 -5.4360e+01 -5.0133e+01 -6.0000e+01 -5.6838e+01 -5.4338e+01 -5.0116e+01 -6.0000e+01 -5.6839e+01 -5.4316e+01 -5.0099e+01 -6.0000e+01 -5.6840e+01 -5.4295e+01 -5.0083e+01 -6.0000e+01 -5.6841e+01 -5.4273e+01 -5.0067e+01 -6.0000e+01 -5.6841e+01 -5.4252e+01 -5.0051e+01 -6.0000e+01 -5.6841e+01 -5.4231e+01 -5.0036e+01 -6.0000e+01 -5.6840e+01 -5.4210e+01 -5.0021e+01 -6.0000e+01 -5.6840e+01 -5.4189e+01 -5.0007e+01 -6.0000e+01 -5.6839e+01 -5.4168e+01 -1.0000e+01 -6.0000e+01 -5.6837e+01 -5.4147e+01 -6.0000e+01 -6.0000e+01 -5.6836e+01 -5.4127e+01 -6.0000e+01 -6.0000e+01 -5.6834e+01 -5.4103e+01 -6.0000e+01 -6.0000e+01 -5.6832e+01 -5.4075e+01 -6.0000e+01 -6.0000e+01 -5.6829e+01 -5.4047e+01 -6.0000e+01 -6.0000e+01 -5.6826e+01 -5.4019e+01 -6.0000e+01 -6.0000e+01 -5.6823e+01 -5.3992e+01 -6.0000e+01 -6.0000e+01 -5.6820e+01 -5.3965e+01 -6.0000e+01 -6.0000e+01 -5.6816e+01 -5.3938e+01 -6.0000e+01 -6.0000e+01 -5.6812e+01 -5.3912e+01 -6.0000e+01 -6.0000e+01 -5.6808e+01 -5.3885e+01 -6.0000e+01 -6.0000e+01 -5.6821e+01 -5.3859e+01 -6.0000e+01 -6.0000e+01 -5.6853e+01 -5.3834e+01 -6.0000e+01 -6.0000e+01 -5.6884e+01 -5.3808e+01 -6.0000e+01 -6.0000e+01 -5.6907e+01 -5.3783e+01 -6.0000e+01 -6.0000e+01 -5.6929e+01 -5.3758e+01 -6.0000e+01 -6.0000e+01 -5.6950e+01 -5.3734e+01 -6.0000e+01 -6.0000e+01 -5.6971e+01 -5.3709e+01 -6.0000e+01 -6.0000e+01 -5.6991e+01 -5.3685e+01 -6.0000e+01 -6.0000e+01 -5.7010e+01 -5.3661e+01 -6.0000e+01 -6.0000e+01 -5.7029e+01 -5.3637e+01 -6.0000e+01 -6.0000e+01 -5.7048e+01 -5.3614e+01 -6.0000e+01 -6.0000e+01 -5.7066e+01 -5.3591e+01 -6.0000e+01 -6.0000e+01 -5.7084e+01 -5.3567e+01 -6.0000e+01 -6.0000e+01 -5.7101e+01 -5.3536e+01 -6.0000e+01 -6.0000e+01 -5.7118e+01 -5.3506e+01 -6.0000e+01 -6.0000e+01 -5.7134e+01 -5.3476e+01 -6.0000e+01 -6.0000e+01 -5.7150e+01 -5.3446e+01 -6.0000e+01 -6.0000e+01 -5.7165e+01 -5.3417e+01 -6.0000e+01 -6.0000e+01 -5.7179e+01 -5.3388e+01 -6.0000e+01 -6.0000e+01 -5.7194e+01 -5.3360e+01 -6.0000e+01 -6.0000e+01 -5.7207e+01 -5.3331e+01 -6.0000e+01 -5.9995e+01 -5.7221e+01 -5.3304e+01 -6.0000e+01 -5.9987e+01 -5.7234e+01 -5.3276e+01 -6.0000e+01 -5.9979e+01 -5.7246e+01 -5.3249e+01 -6.0000e+01 -5.9970e+01 -5.7258e+01 -5.3222e+01 -6.0000e+01 -5.9961e+01 -5.7269e+01 -5.3196e+01 -6.0000e+01 -5.9952e+01 -5.7280e+01 -5.3170e+01 -6.0000e+01 -5.9943e+01 -5.7291e+01 -5.3144e+01 -6.0000e+01 -5.9934e+01 -5.7301e+01 -5.3118e+01 -6.0000e+01 -5.9924e+01 -5.7311e+01 -5.3093e+01 -6.0000e+01 -5.9914e+01 -5.7320e+01 -5.3068e+01 -6.0000e+01 -5.9904e+01 -5.7324e+01 -5.3043e+01 -6.0000e+01 -5.9893e+01 -5.7324e+01 -5.3019e+01 -6.0000e+01 -5.9883e+01 -5.7325e+01 -5.2995e+01 -6.0000e+01 -5.9872e+01 -5.7325e+01 -5.2970e+01 -6.0000e+01 -5.9861e+01 -5.7325e+01 -5.2939e+01 -6.0000e+01 -5.9850e+01 -5.7324e+01 -5.2908e+01 -6.0000e+01 -5.9838e+01 -5.7324e+01 -5.2877e+01 -6.0000e+01 -5.9827e+01 -5.7323e+01 -5.2847e+01 -5.9965e+01 -5.9815e+01 -5.7322e+01 -5.2817e+01 -5.9898e+01 -5.9803e+01 -5.7320e+01 -5.2773e+01 -5.9831e+01 -5.9784e+01 -5.7319e+01 -5.2728e+01 -5.9765e+01 -5.9763e+01 -5.7317e+01 -5.2685e+01 -5.9700e+01 -5.9743e+01 -5.7315e+01 -5.2642e+01 -5.9635e+01 -5.9722e+01 -5.7313e+01 -5.2600e+01 -5.9570e+01 -5.9702e+01 -5.7310e+01 -5.2558e+01 -5.9507e+01 -5.9682e+01 -5.7308e+01 -5.2518e+01 -5.9444e+01 -5.9661e+01 -5.7342e+01 -5.2478e+01 -5.9381e+01 -5.9641e+01 -5.7375e+01 -5.2438e+01 -5.9319e+01 -5.9620e+01 -5.7407e+01 -5.2400e+01 -5.9258e+01 -5.9600e+01 -5.7439e+01 -5.2362e+01 -5.9190e+01 -5.9579e+01 -5.7470e+01 -5.2325e+01 -5.9121e+01 -5.9558e+01 -5.7500e+01 -5.2288e+01 -5.9054e+01 -5.9538e+01 -5.7530e+01 -5.2252e+01 -5.8987e+01 -5.9517e+01 -5.7553e+01 -5.2217e+01 -5.8921e+01 -5.9496e+01 -5.7573e+01 -5.2181e+01 -5.8898e+01 -5.9475e+01 -5.7593e+01 -5.2139e+01 -5.8877e+01 -5.9454e+01 -5.7613e+01 -5.2098e+01 -5.8856e+01 -5.9434e+01 -5.7632e+01 -5.2058e+01 -5.8836e+01 -5.9413e+01 -5.7651e+01 -5.2013e+01 -5.8815e+01 -5.9392e+01 -5.7669e+01 -5.1966e+01 -5.8794e+01 -5.9371e+01 -5.7686e+01 -5.1920e+01 -5.8774e+01 -5.9349e+01 -5.7701e+01 -5.1875e+01 -5.8750e+01 -5.9328e+01 -5.7710e+01 -5.1831e+01 -5.8722e+01 -5.9307e+01 -5.7718e+01 -5.1787e+01 -5.8693e+01 -5.9286e+01 -5.7727e+01 -5.1745e+01 -5.8665e+01 -5.9264e+01 -5.7735e+01 -5.1703e+01 -5.8637e+01 -5.9243e+01 -5.7743e+01 -5.1663e+01 -5.8609e+01 -5.9221e+01 -5.7750e+01 -5.1623e+01 -5.8581e+01 -5.9200e+01 -5.7757e+01 -5.1583e+01 -5.8553e+01 -5.9178e+01 -5.7764e+01 -5.1545e+01 -5.8526e+01 -5.9157e+01 -5.7771e+01 -5.1507e+01 -5.8498e+01 -5.9135e+01 -5.7777e+01 -5.1470e+01 -5.8471e+01 -5.9113e+01 -5.7784e+01 -5.1434e+01 -5.8444e+01 -5.9091e+01 -5.7789e+01 -5.1399e+01 -5.8417e+01 -5.9069e+01 -5.7795e+01 -5.1364e+01 -5.8390e+01 -5.9048e+01 -5.7802e+01 -5.1330e+01 -5.8363e+01 -5.9025e+01 -5.7843e+01 -5.1296e+01 -5.8337e+01 -5.9003e+01 -5.7876e+01 -5.1263e+01 -5.8310e+01 -5.8981e+01 -5.7909e+01 -5.1231e+01 -5.8284e+01 -5.8959e+01 -5.7940e+01 -5.1199e+01 -5.8258e+01 -5.8937e+01 -5.7972e+01 -5.1168e+01 -5.8232e+01 -5.8914e+01 -5.8002e+01 -5.1138e+01 -5.8205e+01 -5.8892e+01 -5.8033e+01 -5.1108e+01 -5.8180e+01 -5.8870e+01 -5.8062e+01 -5.1079e+01 -5.8154e+01 -5.8847e+01 -5.8091e+01 -5.1050e+01 -5.8128e+01 -5.8824e+01 -5.8120e+01 -5.1022e+01 -5.8102e+01 -5.8802e+01 -5.8148e+01 -5.0995e+01 -5.8076e+01 -5.8779e+01 -5.8168e+01 -5.0968e+01 -5.8051e+01 -5.8756e+01 -5.8187e+01 -5.0941e+01 -5.8025e+01 -5.8733e+01 -5.8206e+01 -5.0915e+01 -5.8000e+01 -5.8711e+01 -5.8224e+01 -5.0889e+01 -5.7975e+01 -5.8688e+01 -5.8234e+01 -5.0898e+01 -5.7943e+01 -5.8665e+01 -5.8244e+01 -5.0918e+01 -5.7910e+01 -5.8641e+01 -5.8254e+01 -5.0937e+01 -5.7878e+01 -5.8618e+01 -5.8263e+01 -5.0956e+01 -5.7845e+01 -5.8595e+01 -5.8272e+01 -5.0975e+01 -5.7813e+01 -5.8572e+01 -5.8282e+01 -5.0994e+01 -5.7781e+01 -5.8549e+01 -5.8290e+01 -5.1013e+01 -5.7749e+01 -5.8525e+01 -5.8299e+01 -5.1031e+01 -5.7717e+01 -5.8502e+01 -5.8308e+01 -5.1049e+01 -5.7686e+01 -5.8478e+01 -5.8316e+01 -5.1067e+01 -5.7655e+01 -5.8455e+01 -5.8324e+01 -5.1085e+01 -5.7624e+01 -5.8431e+01 -5.8332e+01 -5.1102e+01 -5.7593e+01 -5.8408e+01 -5.8339e+01 -5.1120e+01 -5.7563e+01 -5.8384e+01 -5.8347e+01 -5.1137e+01 -5.7532e+01 -5.8360e+01 -5.8354e+01 -5.1154e+01 -5.7502e+01 -5.8336e+01 -5.8361e+01 -5.1171e+01 -5.7472e+01 -5.8312e+01 -5.8367e+01 -5.1187e+01 -5.7443e+01 -5.8289e+01 -5.8374e+01 -5.1203e+01 -5.7413e+01 -5.8265e+01 -5.8380e+01 -5.1219e+01 -5.7384e+01 -5.8241e+01 -5.8386e+01 -5.1235e+01 -5.7354e+01 -5.8217e+01 -5.8391e+01 -5.1251e+01 -5.7325e+01 -5.8192e+01 -5.8397e+01 -5.1266e+01 -5.7296e+01 -5.8168e+01 -5.8402e+01 -5.1282e+01 -5.7268e+01 -5.8144e+01 -5.8407e+01 -5.1303e+01 -5.7239e+01 -5.8120e+01 -5.8411e+01 -5.1362e+01 -5.7211e+01 -5.8096e+01 -5.8416e+01 -5.1420e+01 -5.7182e+01 -5.8071e+01 -5.8420e+01 -5.1478e+01 -5.7148e+01 -5.8047e+01 -5.8424e+01 -5.1535e+01 -5.7107e+01 -5.8023e+01 -5.8427e+01 -5.1591e+01 -5.7063e+01 -5.7998e+01 -5.8430e+01 -5.1646e+01 -5.7021e+01 -5.7974e+01 -5.8433e+01 -5.1700e+01 -5.6978e+01 -5.7949e+01 -5.8436e+01 -5.1753e+01 -5.6936e+01 -5.7925e+01 -5.8439e+01 -5.1806e+01 -5.6895e+01 -5.7900e+01 -5.8441e+01 -5.1858e+01 -5.6854e+01 -5.7875e+01 -5.8443e+01 -5.1909e+01 -5.6814e+01 -5.7851e+01 -5.8444e+01 -5.1959e+01 -5.6774e+01 -5.7826e+01 -5.8446e+01 -5.2008e+01 -5.6734e+01 -5.7801e+01 -5.8447e+01 -5.2057e+01 -5.6695e+01 -5.7777e+01 -5.8448e+01 -5.2104e+01 -5.6656e+01 -5.7752e+01 -5.8448e+01 -5.2151e+01 -5.6618e+01 -5.7727e+01 -5.8448e+01 -5.2198e+01 -5.6580e+01 -5.7702e+01 -5.8448e+01 -5.2243e+01 -5.6543e+01 -5.7677e+01 -5.8448e+01 -5.2288e+01 -5.6506e+01 -5.7652e+01 -5.8448e+01 -5.2332e+01 -5.6469e+01 -5.7628e+01 -5.8447e+01 -5.2375e+01 -5.6433e+01 -5.7603e+01 -5.8446e+01 -5.2417e+01 -5.6397e+01 -5.7578e+01 -5.8444e+01 -5.2459e+01 -5.6362e+01 -5.7553e+01 -5.8443e+01 -5.2500e+01 -5.6327e+01 -5.7528e+01 -5.8441e+01 -5.2541e+01 -5.6292e+01 -5.7503e+01 -5.8439e+01 -5.2580e+01 -5.6257e+01 -5.7478e+01 -5.8436e+01 -5.2619e+01 -5.6223e+01 -5.7453e+01 -5.8433e+01 -5.2695e+01 -5.6189e+01 -5.7427e+01 -5.8430e+01 -5.2777e+01 -5.6156e+01 -5.7402e+01 -5.8427e+01 -5.2857e+01 -5.6123e+01 -5.7377e+01 -5.8443e+01 -5.2937e+01 -5.6090e+01 -5.7352e+01 -5.8476e+01 -5.3014e+01 -5.6057e+01 -5.7327e+01 -5.8508e+01 -5.3091e+01 -5.6025e+01 -5.7302e+01 -5.8539e+01 -5.3166e+01 -5.5993e+01 -5.7277e+01 -5.8569e+01 -5.3238e+01 -5.5961e+01 -5.7251e+01 -5.8599e+01 -5.3302e+01 -5.5929e+01 -5.7226e+01 -5.8628e+01 -5.3366e+01 -5.5890e+01 -5.7201e+01 -5.8649e+01 -5.3429e+01 -5.5851e+01 -5.7176e+01 -5.8668e+01 -5.3490e+01 -5.5813e+01 -5.7151e+01 -5.8688e+01 -5.3551e+01 -5.5775e+01 -5.7125e+01 -5.8706e+01 -5.3610e+01 -5.5738e+01 -5.7098e+01 -5.8725e+01 -5.3669e+01 -5.5701e+01 -5.7058e+01 -5.8743e+01 -5.3727e+01 -5.5665e+01 -5.7017e+01 -5.8760e+01 -5.3783e+01 -5.5628e+01 -5.6977e+01 -5.8777e+01 -5.3839e+01 -5.5584e+01 -5.6936e+01 -5.8793e+01 -5.3894e+01 -5.5541e+01 -5.6897e+01 -5.8809e+01 -5.3947e+01 -5.5499e+01 -5.6857e+01 -5.8820e+01 -5.4000e+01 -5.5457e+01 -5.6819e+01 -5.8827e+01 -5.4052e+01 -5.5415e+01 -5.6780e+01 -5.8833e+01 -5.4098e+01 -5.5375e+01 -5.6742e+01 -5.8840e+01 -5.4140e+01 -5.5334e+01 -5.6704e+01 -5.8846e+01 -5.4182e+01 -5.5295e+01 -5.6666e+01 -5.8851e+01 -5.4222e+01 -5.5255e+01 -5.6629e+01 -5.8857e+01 -5.4263e+01 -5.5217e+01 -5.6592e+01 -5.8862e+01 -5.4302e+01 -5.5178e+01 -5.6555e+01 -5.8867e+01 -5.4341e+01 -5.5141e+01 -5.6519e+01 -5.8871e+01 -5.4379e+01 -5.5103e+01 -5.6483e+01 -5.8868e+01 -5.4416e+01 -5.5067e+01 -5.6439e+01 -5.8864e+01 -5.4460e+01 -5.5030e+01 -5.6396e+01 -5.8860e+01 -5.4541e+01 -5.4994e+01 -5.6353e+01 -5.8856e+01 -5.4620e+01 -5.4959e+01 -5.6311e+01 -5.8852e+01 -5.4698e+01 -5.4924e+01 -5.6269e+01 -5.8847e+01 -5.4775e+01 -5.4889e+01 -5.6228e+01 -5.8843e+01 -5.4851e+01 -5.4855e+01 -5.6181e+01 -5.8839e+01 -5.4925e+01 -5.4821e+01 -5.6132e+01 -5.8834e+01 -5.4998e+01 -5.4788e+01 -5.6083e+01 -5.8829e+01 -5.5069e+01 -5.4755e+01 -5.6028e+01 -5.8824e+01 -5.5140e+01 -5.4722e+01 -5.5973e+01 -5.8819e+01 -5.5209e+01 -5.4690e+01 -5.5920e+01 -5.8814e+01 -5.5277e+01 -5.4658e+01 -5.5867e+01 -5.8803e+01 -5.5343e+01 -5.4627e+01 -5.5815e+01 -5.8790e+01 -5.5409e+01 -5.4595e+01 -5.5764e+01 -5.8776e+01 -5.5473e+01 -5.4562e+01 -5.5714e+01 -5.8763e+01 -5.5537e+01 -5.4523e+01 -5.5664e+01 -5.8750e+01 -5.5599e+01 -5.4485e+01 -5.5615e+01 -5.8736e+01 -5.5660e+01 -5.4448e+01 -5.5566e+01 -5.8723e+01 -5.5719e+01 -5.4411e+01 -5.5519e+01 -5.8710e+01 -5.5778e+01 -5.4375e+01 -5.5471e+01 -5.8697e+01 -5.5836e+01 -5.4339e+01 -5.5425e+01 -5.8683e+01 -5.5892e+01 -5.4326e+01 -5.5379e+01 -5.8670e+01 -5.5948e+01 -5.4335e+01 -5.5334e+01 -5.8657e+01 -5.6002e+01 -5.4365e+01 -5.5289e+01 -5.8643e+01 -5.6055e+01 -5.4419e+01 -5.5245e+01 -5.8630e+01 -5.6103e+01 -5.4471e+01 -5.5202e+01 -5.8617e+01 -5.6146e+01 -5.4523e+01 -5.5157e+01 -5.8603e+01 -5.6188e+01 -5.4573e+01 -5.5107e+01 -5.8590e+01 -5.6230e+01 -5.4623e+01 -5.5057e+01 -5.8569e+01 -5.6271e+01 -5.4672e+01 -5.5008e+01 -5.8548e+01 -5.6311e+01 -5.4720e+01 -5.4960e+01 -5.8527e+01 -5.6345e+01 -5.4762e+01 -5.4913e+01 -5.8506e+01 -5.6376e+01 -5.4801e+01 -5.4866e+01 -5.8485e+01 -5.6406e+01 -5.4839e+01 -5.4820e+01 -5.8465e+01 -5.6435e+01 -5.4876e+01 -5.4775e+01 -5.8444e+01 -5.6464e+01 -5.4913e+01 -5.4731e+01 -5.8424e+01 -5.6492e+01 -5.4949e+01 -5.4687e+01 -5.8403e+01 -5.6520e+01 -5.4985e+01 -5.4643e+01 -5.8383e+01 -5.6547e+01 -5.5020e+01 -5.4600e+01 -5.8363e+01 -5.6573e+01 -5.5054e+01 -5.4558e+01 -5.8343e+01 -5.6599e+01 -5.5088e+01 -5.4517e+01 -5.8321e+01 -5.6625e+01 -5.5121e+01 -5.4476e+01 -5.8294e+01 -5.6649e+01 -5.5154e+01 -5.4435e+01 -5.8266e+01 -5.6673e+01 -5.5186e+01 -5.4395e+01 -5.8239e+01 -5.6697e+01 -5.5217e+01 -5.4356e+01 -5.8212e+01 -5.6720e+01 -5.5248e+01 -5.4317e+01 -5.8185e+01 -5.6743e+01 -5.5278e+01 -5.4279e+01 -5.8158e+01 -5.6765e+01 -5.5308e+01 -5.4241e+01 -5.8132e+01 -5.6786e+01 -5.5337e+01 -5.4204e+01 -5.8106e+01 -5.6807e+01 -5.5365e+01 -5.4167e+01 -5.8080e+01 -5.6827e+01 -5.5393e+01 -5.4131e+01 -5.8051e+01 -5.6847e+01 -5.5420e+01 -5.4095e+01 -5.8018e+01 -5.6867e+01 -5.5447e+01 -5.4060e+01 -5.7985e+01 -5.6885e+01 -5.5473e+01 -5.4025e+01 -5.7952e+01 -5.6904e+01 -5.5499e+01 -5.3991e+01 -5.7920e+01 -5.6921e+01 -5.5524e+01 -5.3957e+01 -5.7888e+01 -5.6939e+01 -5.5549e+01 -5.3923e+01 -5.7857e+01 -5.6955e+01 -5.5573e+01 -5.3890e+01 -5.7825e+01 -5.6972e+01 -5.5596e+01 -5.3857e+01 -5.7795e+01 -5.6987e+01 -5.5619e+01 -5.3825e+01 -5.7764e+01 -5.7003e+01 -5.5642e+01 -5.3793e+01 -5.7734e+01 -5.7017e+01 -5.5664e+01 -5.3761e+01 -5.7704e+01 -5.7031e+01 -5.5685e+01 -5.3730e+01 -5.7674e+01 -5.7045e+01 -5.5706e+01 -5.3700e+01 -5.7645e+01 -5.7058e+01 -5.5726e+01 -5.3669e+01 -5.7616e+01 -5.7067e+01 -5.5746e+01 -5.3639e+01 -5.7587e+01 -5.7071e+01 -5.5765e+01 -5.3610e+01 -5.7558e+01 -5.7076e+01 -5.5784e+01 -5.3580e+01 -5.7530e+01 -5.7079e+01 -5.5803e+01 -5.3552e+01 -5.7502e+01 -5.7083e+01 -5.5820e+01 -5.3568e+01 -5.7474e+01 -5.7086e+01 -5.5838e+01 -5.3584e+01 -5.7447e+01 -5.7089e+01 -5.5855e+01 -5.3599e+01 -5.7419e+01 -5.7092e+01 -5.5871e+01 -5.3614e+01 -5.7392e+01 -5.7095e+01 -5.5887e+01 -5.3629e+01 -5.7365e+01 -5.7097e+01 -5.5902e+01 -5.3643e+01 -5.7339e+01 -5.7099e+01 -5.5917e+01 -5.3657e+01 -5.7312e+01 -5.7101e+01 -5.5932e+01 -5.3671e+01 -5.7286e+01 -5.7100e+01 -5.5946e+01 -5.3685e+01 -5.7260e+01 -5.7093e+01 -5.5960e+01 -5.3698e+01 -5.7226e+01 -5.7086e+01 -5.5973e+01 -5.3710e+01 -5.7193e+01 -5.7079e+01 -5.5985e+01 -5.3722e+01 -5.7159e+01 -5.7072e+01 -5.5998e+01 -5.3726e+01 -5.7127e+01 -5.7065e+01 -5.6009e+01 -5.3730e+01 -5.7094e+01 -5.7057e+01 -5.6021e+01 -5.3734e+01 -5.7062e+01 -5.7042e+01 -5.6032e+01 -5.3738e+01 -5.7030e+01 -5.7026e+01 -5.6042e+01 -5.3742e+01 -5.6999e+01 -5.7006e+01 -5.6052e+01 -5.3745e+01 -5.6967e+01 -5.6983e+01 -5.6062e+01 -5.3749e+01 -5.6934e+01 -5.6960e+01 -5.6071e+01 -5.3752e+01 -5.6895e+01 -5.6938e+01 -5.6080e+01 -5.3755e+01 -5.6857e+01 -5.6916e+01 -5.6089e+01 -5.3758e+01 -5.6819e+01 -5.6895e+01 -5.6097e+01 -5.3761e+01 -5.6782e+01 -5.6873e+01 -5.6104e+01 -5.3764e+01 -5.6746e+01 -5.6852e+01 -5.6112e+01 -5.3763e+01 -5.6710e+01 -5.6826e+01 -5.6129e+01 -5.3756e+01 -5.6674e+01 -5.6794e+01 -5.6180e+01 -5.3741e+01 -5.6638e+01 -5.6758e+01 -5.6230e+01 -5.3720e+01 -5.6604e+01 -5.6723e+01 -5.6279e+01 -5.3699e+01 -5.6569e+01 -5.6688e+01 -5.6327e+01 -5.3679e+01 -5.6535e+01 -5.6653e+01 -5.6374e+01 -5.3659e+01 -5.6501e+01 -5.6620e+01 -5.6420e+01 -5.3640e+01 -5.6468e+01 -5.6586e+01 -5.6464e+01 -5.3621e+01 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/example_data_about.json0000644000175100001660000000041514743453644020554 0ustar00runnerdocker{ "filename": "example_data.txt", "delimiter": " ", "timecolumn": null, "units": "mV", "time_units": "ms", "sampling_rate": { "value": 1.0, "units": "kHz" }, "method": "genfromtxt", "signal_group_mode": "all-in-one" }././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/example_plot.png0000644000175100001660000016252614743453644017256 0ustar00runnerdockerPNG  IHDR59tEXtSoftwareMatplotlib version3.6.0, https://matplotlib.org/=S pHYsaa?iIDATxuxWdKf$I[fH2n[fnw˜2Sڤ4Ď)f&Xy'%fF#itsi!B! !BqdI(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(BH(B8v  CB!A4Z:t^>$ HNN>ڻ!BÐGNn aaaB!!99;I78}%B!39}}v| !Bc !B3 !B3 !B3 !B3 !B3 !B3 !B3 !B3'dO0fLnn.~:zdwT!(8!3\p={6O?D/_Naa!W^y%'|(B!đ4M;;+~!wy'UUUϙ338x7)--h4kjjZB!}vȊ+߿+6m555l۶555QSSDWmԜ,:^kֽDzEa=1}%?8|{M+_ak6_dqb.u[?d~m׽HfUޕ*+ŵ/RT_tHϳQs|f͜9m^{CY<{_>@A]A_ @}vZZsgl6c4۷/7n_P!' ؛j]WX1MFzz:GcB!vfddkq 7+**"!!c9"ijj߉N՞84y7'Bl-9&WD~]kjj$B!q ∋;e8q"C>@l=z4=yٳ'QQQ^@@@{B!Gq|9ܹ3?<y]zFfΜɶm/yW-{ȱ27y yǽ7|Cddd˭XW^y^xk9WȀKhkp׮] .7zhFbi]B!]_^^!B9>KY`/6!B!O"|M 2e ]t#//B!'`PPW^y% .d\q{t҅ӧ_KB!QBiiiJZZSLwyB_oZ!Bxᓩf3}> , ))k4_lR!B$L&8 ~gM^zB!~$׿W\A\\/V/ M<5/}= 8zd>'w⾺:v}ؼEVX q<Ң_6++O?""""**H|i!B :]~hOBB:rB!8|nڴuѳgO_nF!Bv>\B!8wo$??~a0<0`/7/B!iXZZJff&W_}>Tp: !B/|^s5 !BcIݻ7>,;vhxuu5^z)C w'W_η~Kff&NJJJ ֭?oOG!X9/槟~^$$$Xf̘֭[IHHh]஻rF}qF^|EzB!ı'@:,:,Xl999444!BcU6l8trE BqTyp¶^B!hC'dB!h]\fc}7/Ddƀ#R#DF6/1cưc{, ۶mcDDDrB9a>]rGO'|^z+Ν; ܹ/7-B!Z033O?H}}=:~ۗB!iEmm-;vd֭TUUa2|i!B ?~<ͣ\pq,Xy1i$_nZ!B§믿Ncc#=˗sy˗mDO^ c!hS|FGG<ܜB!8m{ˉc&5N^ NԤ<<>=nr9&yEaa!DFFzv4 Nfk !Bhp_X! \w֛҅B!utBiii+**ҥ/7-B!ZЙ뷯:}i!B Uw&88fcժU 4B!pÆ jܲe Fhd{セشB!8ѿW_}5B!8t&>p9G!~SRRnx|Ϟ=ܼB!§^ŋ+HJJ1E&?o;r,ű,>> ̙ïرc}!vX qHh#>N\݊C$!Bͧc=ƬY0L܌I"O_x233IHH 55}y!BO>ۗB!o_^!BTUURQQ|_oZ!Bx͛73yd"""#::\>c_n^)8 ĉD+s#ŧHcO[nf̘ݻ tid_nZ!B§5kZ߱cG|i!B Դ׮]rB!> :,}Q, rsyrB!> _xꈏ &Э[7x'|iFd!Nl: dvȧ#""7o6m!C0yd_nV!BO?.c2vXf/+җB!^ ꫯ\}վܴB!hO@MӼݻ_nZ!B']Fӡ4il6>}/6-B!'g ƍ6mnjF#RF!(IT."iB!QW]u֭cǎۗrB!b?|ph""##bĉ|2B!QQvl۶ ***غu+555~ܴKSS BӱqF6o̸q $99g}BߐMA21ɧ_zO>̙3ǗvСCkjj:u*)))[{?GdB!vv C vݗ`Μ9̝;oE9{lf3>F}qF^|EzB!SN9;}u]L4ɗ뮻O>Xc4]M6t*++}oB!GO_RSSڵ+]vK.kl1c nF u"am5O=w]SSCrra!By饗\{͝wyXqqqU;W_w.((`ڴi|嗌9ѣGCaX\U͛GϞ=ހAB!Ƨ9>}:aaaqqsiol;w_~=zk׮t K/̙3ٶm_~%G B!ĉȧ-O>$/zocOr-rܹs[:t(̚5KJ!ӧԩܴT# ҥK~!B ||Yg߷3妅B!D+|اOx -ZѣXr%sk#57B!D{#**۷}v{:N@!B#ħ`VV/W/B!OsOww@S: TOh_$B!hg$B!hg$B!hg$햷ȱh#>.]_ѣO>aٲe޴B!§~˴i bÆ 455P]]͓O>M qd%_q4|y7yw0 ǎ}i!KF!0==Ƿ?""*_nZ&m|&&&e˖M q@Rȱh#> :VZNٳgsrM7rB!> n3i$L&Ǐ' {wn͗B!ix衇?IFFuuuӇP_nV!BO@'H>}ĦB!4駟f`=߳g/7/B!ixײxb dB!19s_;v/7#B!ODEEM!BCc֬YL&_nF!Bv dff@jj|,Bq4<}z!Bq|B!aiB!8fK/W_lx—B!^G_䢋.ロs=^_nZ!AӴ i8{lyKxw5k+W妅8 9ɵ9B!]mħ`QQ 44j8 ~W_nZ#8P'cK4$@:2UkSNеkWΝ 5k妅V:L||~s1ɧ9x޽;W^y%\s/7-B!ZQO?./_N93}i!B n~.]0j(FM !B.`~ q8[$/8|xg?rB6vXcʼn6v |z!Bq|؜iRV!ޣ_~H~xw}Y!B vϚ5_|nѣGb .rssyG}y!BO;\r%:, m&B!Q.`°aZ?tPV/7-B!Z+_~m.2_nZ!BOү_?ZZ;#^'t:O?27ofܸq̳>}B!8y 6{lf3>F}qF^|E BqB;b~s=1dŊ?oڴiSYYu}MMMxHg|?fyaZn[m-G7hN{+Lގė\ww|]@$ill^c…`=_~϶}3dY|9> ѥK$$$jΧzGyg졦~+qd rMǟ槟g&O/27;229oO6]d1mt ]umRS切痣egΣ mB4>ڣ+d[\s2*|x ի]l;49s&sgĈtD3w;vЫW/n} h4r 7SOpx|c555$''ֺh,ʚ I ޝ+?mw=ٷk[;GTC~~ͮ::.Z}S~]:|K.呱uZ,oQ&o^>m*f ϒG֯{~=ڻpȞ[7\+_Ὥ﹖99䣴w6?g]4;p4>gVUNvġi/o1v6Y=Ì3LZZGj%;;={Hqq2ۭ vxHrW–#}uf?wnf}F=w|3\WXP/ܿ;۶oo^"ےi<1ZܲDͮL&+y{kPT_tNe e|c^:F߻Q]}f86~QIH Md'Eg`߾{?,\fk\I@@lG:2wcG\\a=wƍzՏѣy衇X,?ͣgϞ^ ww G2Wu{~ =gCkhG@Z<Ȳ-ϝv6ڛ#Kmu/_;v+ncͻ/ckVXfMDx\J6Wa1^@^] ª]Xlv f]s>^3'1$mTo$>8GW,SmֽDn|ֺ6nbs;*?-]l]B|vwt /ONN/7Š+xٴi{au]\~K/h42sLmƗ_~+{h tT"m?ɄiFBƌ!_iޓgʶQoqtss1g{k6~] Ǣl]tEyZ,:՚y O&<ПFWf[xhC&F$ !؝/Z'=G/,d~5ǎ_׻چװjVNr7'*+@ [/d'.%.ц+]q~k]GVxu0ġi8l0IKK#,,h_| ۷/O<wuo`ܹdee1tPf͚ulhqlvG~ƍД(.upy&ubСΝ1v @S78`Ee1D4 _[z40}~qXUMkK60\1[,ܩj7zAㆼ DDg19QT~ տ6mu".xsoKFe>v[[bS1с|s7 @L` > ";EpcOa+5˙@u{\kE>dÁ:Dy5yɝ[YT>Q=^^li%\B~~>O>$ m<C a3 0͛ԏ yá6=_m䇍\?>N.?_?YR?-4`W; AEjw/o{~ֵy-t;v}C_Qo\NȘ1l[EFL9%JY]ɕSi{f~Cn'&(~~HQ4~ޤ ׎ί%WS{:%ϥgtOf6ͷQ~J Y[z<&淰kvF'eɖ@ .)fZ'T(0P#owVIymNy~C˗_s3c *;0/D Ҷysq&?l,_K>* =cW5`*]USowߌJuXkpvGZqXK1g 4ӔI-bre ؆{j͵2v?7kK Ds]~Fwqc'uSЋKZk(i(!>8t,ߤ[wSz:L|O6U]n"˂{&._No<]/7rgi<k5{4Zyv+vЎӞ=*\^:Fgu\kh`^FSCB y)' wQo}m*@d@!?yy7pWd22L*+W p.x_\FO^zC`)H?v;c;Q7d2 'u94oOӟ3t8[iکjRAU@75)39N710k,~f%9,y],8хÖzK=K.fxa/MMUI4J}wn:#LQ7>? 2;*v9ݢ[J)}crc΀~yfcGElF+ w6sX_ٕ״k!`9[M $~z\ b|gCFioͅre;* l~.'7yG.X.RU |"#:]4>GgQ4v޶]RՅg(]YYlM)Wyvm/~ nn`>6n3C̝^] m n_/\t,P5 CFp-z_y7:O?4s-΢q<|§ԛ@:FRP@u׷2Kv'qN׬;;w;z?FusSRЇ56ҔiGV?ɇ>*Z{/ض&[*sZUղ%l PC6 z_W-/sf&M|S~,]ʃȉ:?ri\NVŋi0ؐ[Z?wetFEc+pY-^CF$NVAyݴ5ίUكŎ^GJL0pde9s޲,bom~K-Sg~|vT 6[m->&qo/Q]zLHlx\U _BiF wQ֭-% %$$XoչmNeǸl*>U1޴vk+0t$%sf+Gױ:=$5s??gM';סo 0z$dHv}*z3Qvsjv ?|#SSz}393a2ug厊5|sl_XM 3vKw+nt us!*w1QZjI O夎'w;ذnUjKJx v9)/n\sv6w+qC*Wr8Q[2.L}4{LCw맦i|駲q"֧Ƴڭs:sޗwoR=P>Ih@sb|.\ `wepSi+",ѻV#"oTȣhƺJ*OՋ-l{k!QвUF4r'yvv6lijFORS>li?-)o_x u 2_*>AokkVY vUcwPkK~Qo$ V3wn֗}U|!ZSAmBK˸73=zvZÿd@[u TGWxvlL"h,*?rfPVQ/dHzt-&zg7`Ѕ o?;=KF j C]E-Hx[qveitl L񣏁BܹjUۋ\ϳ|=b}fm>as`Vv78AÝyhC4X0iѺWGze:~:?J {hӯc8iqffH5oaz&jJNg;?csfz#/2+a++C3( g7*kPFv=c/JCpлQFYIֿ[]K >|N0aw(CxmSWڝyNob֢"ռʹ8oHGRbZvgo"XkڵkI S PWkZan[raaAySd ֢"y=n/ٻ:si^XAo cTīu?wvim3ܭ1XD}rDz#c-,ac?J*?S#/cnCb"A%aJ~McWI-{+un/illNfURýZ.foo\a]!3~Aa}!^XV%xHzi-yyew0VΑu*ԅ]mDD&TwQO͎Bp0eo}Eo> 'mw}WQS8/$ h`K NM=`fZy.*S\vE+}C](?eYcZz["aVluC*u}w1JTP虢]gUMU65o{}=#k8ALW@UPpɢmҥK3f O>eY-#IۧPj<Gklص+vCU,]^mto\*i,R'=rMӇug#`9;/9mU|f^am;*?V\#?}`˼*=mnuVM_mm3[)jk\*.}w'Uvs#:yx6e E>Jczp|d"W/BO>DlzC\z{=LIM*R3c~5\1RnFW!8,75ߨN ?厉:5qzO-^}oBYi{v.2kI IiY)JJ: ?:д6阭vtadk5ײN|:[LJt!,P-@TJþ(oxj-Ե-?᧟Ncz 7*]lot޾w>-%f-+S)Y-TibUot HUS݂й3XVpͱfBBJL0sO'd{|(f_6yLLw `]+ڭL [MFPPׯI'8>u3{wWZ3AAn?w ˕g88l[ __BNRyFٮުƥyLp0}&< vtֱd樀Ҧ4G>z"T1+S;ԗ1_/?l SȣM&j~k ҝ{wOMgr^[l(t:$;~7bEY> q|My|cǎewggΖskˣa: ?,pczƤz}Ox@Gj96Ea^ɩw6q"5?⺯䥗juu˜Cg55Q⁻ShhP -C &S+ڵki6IObf tɯ^XnV㯪%~5Buyk[ݧ²OuY]1TBgxS'zu~|}c׮MZK"ԧS+(phf3׫U.eqÛl3p%:F{}zsM& 4 b9r011 /5-[FZZۍ '*; 5*w{g޿QQu&wE3s&A[8l~'.8o1ՙB9Uwh I-n1U9˩8Fhm0֬DvQ'ebQgI OTT`ZNЁq(/&vD-͹l~+l ?4ײh-@C5 ;ǯMesic`Em]$!a4^ƙz{H z P?\=xW<?ٵ|-:>0 d <79*6o&I&!Qßc4YJ g I_ WU^q[=5H C;TBAC 5R;)49aKyt*tSO64Mp\;z G"Gbyy`?œJGB(6A*9jj\샆?Nctƀ{*^4^D]8U:C[B^B} Ak0|(y=~3[]G*:F#Q`aFBVh9){T}5{o KA5 o0tꄭ_s%ݼ揹h Ν1xŪF',tJ>Jixuqwj*t:̞={wnɗ>iFWW 5œ aS< :i+SSOuMđ JW#vױjve;fk}vXL&z [쭺vkCX6~0lrqMxw뻀lTV%=kz :=LyCjZy|].0f[M oo(XM@.۩Nֿ 37{?r,)O\w-:wy\MŔE@ռ-œ>4/DZt/ߗ3$CctQ IDS=~a5C.cX;Ui%2o^{E#]1T5U]M$J GloIQ9;n火!ʌ3)+ [uyǷYYC WgUF_>*yVV'3c$rh2}_Q> x.R&MD]]Ǐknn妏k-Z48u[IW Y@z _gSO{d1r-{mkyns>v;;@g]7Yy|ؐ@ߑ|1zj)q2J H;blusƺ^hQOo.Ē_ddT'Pb=wlt):9#1S:G1;[?[u5Ʈ]k<|Rj`0g8_/[Fٛob+-ÿCgBU"QlܹsvG]r1~5t71*i#og][u-*XrNН:kwn52Ϝ?YF[#))|oPqIxwޯfS-֭cgVh*珢 RXxn^ﭢʈhNA2N:Z|uǐH ~:[>,ޥͦw](iY\8uT-9;쩾1A*j?U Giԯ\EMlX8^OָN2z0 f068R' :q[ץ<>qUPs^rt~cy5%Zh iy!ߚ=j[j^ć@s@m\ }r5B&LOQ_@PUJۓޮ7+kʢa=8VRS>bD8ZF*j%gӗ[ougPCQQQ֭[Yr%<sWY4f?5-gT}ڡ+-jig7^gz\**c6B2y{ɞ ;}eDw~ )h^iܱkeeT~j9ݛq/<\Ϡe?ݴ]#?;Ng7kx-*? `lDZ^Z:sjr3<-E Ƴ_uw ,oS*m*ʧ#UTpM_I٬:'!Giq((Sz:g{CCњi?4_` Oveݵ?W ĐRwRxAh6kz{|MGzzͿrwQu~2~TngeC`It:%ct/v)y90^y^l٠cM?Qj&Li޻OgZ j`].%wv;᧝J;opZ1~ 6Gl"c4 Mw U-ѹ垃]WwsU=2Cа?io &`Эc:6yyt35"t2*iUU Tn8ұ_x4:9 t:tFGUЯcKa!ː\c/Gy*;[qǸU0y4=Ʃ\P[YvDž4t(~ :u"Sjm胃ћ$U@hՎBƝaߚO}pt.TѸu }1b_6wJLqkAAmRi~~M 5McV=Zw:MhVÖ-Un r_Zo`mv7gHJRpv;F:-^L# :}2`vݗ^βeuz}ҒFTbs΢2婑:]uZuӡ1A1t 툆2ی$h cTmlE!jXF !8ŒaXVrD~t8Bƫxo?vrt8q;㱌]qys ֿ!>zsR;؈U%v^zox ykOȧq/EvX#I ,eJ䰲p%zEcM]\pDžVܹӸk ?w6o?_ gYZnkv;y3) aAJ6`m Y}"ާWsvO…t:F%bzv ÓOsr]0D].^DAjͪqOךϿnB nFoװi?on\:fkޠ!xeJdzРAwWNb*K(\wyy'C?Z:4Uo0Zǖ-X9#?K<7}95OeG:A# $>{ 5fx=nSSS=Y©K sWCƎZũD1E)}Jŷeyrzl3cẉ}g~&SO_slJLVR'0pO5ڟ@'߳XE#&.'O7$%aO!s[,bMՄBۏ3Ϥ~r =xm4ɢ1dhW v z%Eہ [5}&_ŵ [st~V[QS[;c+U/=..]TV7R\HBj:iشK/EZ=slLNsv+-?puӕ|ƹe :SGq݄$eb~$>tz=F670%zW[ؑbMv%!,\Al 5ʼnDnd`"J(|xa˖b-/6=8gXjr} SL@ұ̏(*k5 L=ok:],LQ 6؁f615:sJq_i`?h@4M㞯6QRĠ`X %LK9@bK][GL8*+U NGEkEEF#! bhPJ9o`Tц<ڍB}݉lGJo[ kI ~QQM< A-Ed;5`̵3r -OZ?C.\HUU,6X5ljpr*y6 fv{M κ*~v5pbR86l)z16u*r~v\c/lq¿gj> )^k\|9^>enǐҙ.*q0a-)VQhk"@Z) fsQ*H6'fSTU[YD֚冡=rtϯ{~%3Vugt nӯ>zV?;M 4[Yjy{u5{}Օ- VU& ׷#ԱXakHfרRHv[5Fz:ʲ˩sA8NǪUXVR~6nk%'[U:^)7QRj>rjq6`k3餳\s'&ͅYwz^=-]-q II$D_o#C`3iB4ԮW}iIC> o&bĉ{|- Z/V]Y=Ulu#SZsQ$G!ܿ<!Lv;;j)3lss9u)>ph|8g?3*"^w_2/wQᇔ2ݎiZUSTjw :@-4/A?~ӫЫK<-muw +CV|0YOeR(^}>qLGְvMɤI1r\ΑϭxSG|Oi@aAM4rA]uե{YjtX{k;&!?-f:x<7s~<24Mퟐ~p7oh|ũ~z9*x}7vyŲ{o~N]<:rlv2ʰkjAv* Ȧ.[iZb/]TFZFMsl4Z;LputѺ-[Y}g_`߾F:~NgobvLػ7$vHbcW=fKVg\c3Ƙ ֶ,.  "N?}X\zMg{vn̫}[߹DCaF-R2_rlMR Ӳ7ޠd.B㏿5{{ BgUl(/,2z41--HY bhzujذb?1ΝQcx7>*XFD uFbU,?!{C'u<{RoLUpFn̞*nAY1wRXH'j提`kV|=:m q bF_ R>Tk37+s\hT av<*-kM~~4㻺t0-uo$*7ɿ櫜](yz{emA gJ_UN]L:5d@QiZȑ}b8-҅Sof؟e 7Ɣ[~ 5@{r !t|E$ɃH]=KipfhRt'D]~'M]ٝݑ3oQaٹoQ&,qw÷ҽF~'#AZ"ڃ%] [_Mئ.@CƎq:ٛشG"BؘJi>+ "u5*ICBkVi w W}SO#2Um!lTWόf!pte]` )%꼣ODlH@@\r cۗoT.<4Uدu%`,U5MgZecDwKԘk ahV;r$U6Y1бh51=v19U+d= GGE֙-˳WWo0YMtYdWVN 7AQG]F#իɘx ߂mcլ͙rdW}ڑĐ릸|& eZ0^Q}+p s,_6[;*ZuAl8 2blg8˩nt: >@wh?]AF*+ ӇfFw8䘔9id 2ձe{.mÆWq9jE Lke&dWpyo5%Α:F@j_ou2A>iF"m$5rɯ07{.sѸ}; BEcxhz?Ĭ9+{mN>8Gswɯ^[iEl ]tz5bn SVsMWjWƫɎ::;Zך]pkza윌5$ FY 2>/`*b-,??#6hKcwGУ87hZZӜ7Us*4g7[zCǺ/"wUaXlGAk<0][J9uWqҲys΄ bOlKң-[z˽KD2[8ަD9"z=:MӰ|%޹u4VpK:~SUKӠ5nތ9']P׌r97zvǼ_8Ŷ=!Na\3aըR#l,>=cm<:3G.S}ۅ, ͯ'7?}H~. ר:zTPJuRڃwq=5qwj$_TOK"dTf=OkeaBvWq[nh[VSe2c;شF+A7+yAYDcGW@h?S;ɀ&+C255ӫӿfS&B !21cqϿ*?SCz TJMӘ]}&cE7wb8A2Ђ*-1?}NwHk Z6G֬Mص+qqć2z-F#[|(zVr}` #TɹٱZ, /L,]_ d zU̗3'sם֔t+ Wޗz*KGx0S} KWɓ葠ZwGCz{6W\u>[,.?Fc3B:Cpyi5ۜnoVqԎRn}s$@>n]FhwI-+#O!!(PC[CgNBmOU>]YP >8:Ӛ5^;3iDJu4?^Yu ABRy,s7gȤ-OM0b E9MO&ӉV_}WVFɻ .dgs` Q,ljj?gʔ)у-[믓+`ghQ_ŌpLVd)M{ܣ_9eFgeOZ]uBҸE vɮORkzr) A䰫r:NWϱlKhLVЍy9rf3P`c4utM Cs?1s>㭁6sO d]:n_x+PwٻU{jmm)ח1󣵮ԯZ 0tor=z镗 >>FAu}i׍K#臦i'L$!\x=:hKs Rrrϸ^YiW,2ݪ<1ȗk9nn?}_mshƧ۸FB'L@q-Z&܃qj]٣:s-~^acӲ2Ąݍ@MYC"xgZC XPxD:* :s8wժUH<ڣapvsȝ\HYl@욝meQx@ LT-lV.bd&Tbxk]uKgaMbot*hżs\<ϹC:9ȯtGfHu'͌j!k 2xu>rv놌rw=WD{[ ulCǹEsrR7U1c @۶J4G cG""Z?7:+e{vX&znY]ͺ#%GH5?ԅH'+Kvd3mXvgٟM%lHTcq ֶ&ZI4oNZZ/smOx;KRtE:5ݔβnKvzqr5ꪹ k vz^&E?&+Mf9E\v&6 UڍgXp14%s^xe+M pJE%KۭΜj}XJ8G﫯1?mgps[5}#]Jrl*?ǻJećrŨT-vfriUI >nj Wǻc߶yo]zEFǘ&?wQgg@s0-5YK3z%9[kZi<gm:VDA~Ul2;mF\/ @^ tD[ xDg^p}:۱e+`++CAȨl+FT(Ƴc`+sq > =MӘM]LJ6I,9V- t TgTObC l!WXwW Py~X0t|k[V7SGjCmkLu{~Fima\9:NQb-rt)ҐU:*- W^y%'N$22V ^tZ;xv衒hJO 㩧LAsu!:v;*6q7a>y\:5o۪w5ju"j=R%GDtd#kz;ܭ6z澬+Kwo :W3<@gaH[tqih~-mt}6j-tKNS%*Z_4b\ڕ>I*gpE^x!:Ք<,fEٷgSּX{geb:ldsF7 LETњƐn qMF['ѷi\}Z7l3xGj5f;T%&#}ɲ}v'A%#=0]K`^f&t -66FtfUV%M^ Gwrde8AξLѐ#F)*n(`RW{JN?dƈeT:y !wv.S* 1vAH }5VB?~׹ ~Re6n:+7Uls_V2?_S'>ۈ@Jx ՙdTe+ s*a0oXJ~Op/LSGR\7tw~[sN]]-kd辢CĆ)ѥk^} _~8+0aMh.=?'cr3/AÆZt1;̡d?wx}|sZ/W)$@~z+s2|9Qt{X$dn;3u}zv+I!IQ[tnزfm_*w1a^!C\u7zcӦ>]sX-I` B@淬H?糱ҿ-Ad+}l[Ћzyq Nc8R=#FK/tsލݻaZm[`vЫFR.':t@nJh$h Zvևއ=*t~N|!ղ|c2Hkk6cѸ".:ѽ]=-N2ԅ(ptd3<5F Aݕ8. ۫B׸;BQGƓҴU,1[ɬdGw=IB1Hsd,G.]w "=󆪫@TWlh5!uiaRA}>%/{wcc]@mX.N m|3%`{A IԽ}ʀXu\Ҙ6U_+1Ǿ-66U5 xK AŒk-klnYyA-P6f]%uszо"D\\_޺uzp ]\; ʮZFGcc4hly'oDz5L=I}N0lxU;Cw󣩩#R^s tx9:<)jѩ0dipWT[^j7̔U)]T+vh@?]6:5^u- #F޽c)#cͪe3<Ϲ]N?m*`>#TWgU/y_wbmPA>Put s>!'m=Tp6&Bj,ݒXk ؃ 3yrsi*fe[m,0U˫3ٕ/gAcgkŧPi$rƺ?+U> ptZ0]unU-ͧ 6{t 山y|VQXN;ceo5.cC41tлCevh?:!}meԅ`wgTO TIx HF ^Ú]s]ŝ-]c=&gguVF?=1 |6Rrե3905"l8q;˝Ga}!a0&u3R:1*/TJL4=NVc]Fn:G|+9*L>Xw՚9#\O!Eyu2cr"jt9Q=]k59ڴ]fVⓕ9L}i sč/x _ޫEƲ u2Ww@׫ڸm?vGtDy~BLM'wopFƥCxZ Ȃܭ9} hnKՏ_|KՅ^i.k߸JЂ >"8bd6qu\ .z{%V^|~/6"_U?O ǒJxrI6Sr֐Y⾐4bq92gpAtY`-6H.y,#ynuvus?uЭ<2~=WzFx|.u16S$!4tGQMb:Kz6bQD_.wz{uߍ%TisftF !Wh[( yqURKY]A?ZlH&>,a)Q̾vKT>řigtӅuQw!#G8uzW+_pv@f5RUoޗ9`]bF4Rf@orAhUd&$S9aM zy/ݒvފMFIoPSgd+]5sԈ:_줬uyo^k`[\;G~̍mίr~ qǀU#F,=k0;KhI^*+1[31:Rӏs%3`MT]G_{Q> [8goThĄzvP)959) VU`P6缈jVjCZNt]k9d|߶z3r܃ m/wWk׷`9e e|[}/u]3l +Iw%lJt|kSYcHaa|WM蓡_fmjPV'iEvߪC,K1|n/S_R-'u%詺bBf?"_{XY.$Jxa"/x"=~#x:DZ$tꗩVKƠ}$҄f}Zl oeBv-5C:@פ<0JTl 㪝ؚ-e[\@jȞ$Tܝ_OcFwgcwhU:y5rE1xl fԿL\3vT9&,65zkV#r!hZE~N}ŕiy]5jdfIߓeR ".Mx--}@; ~zhZ]n_+Z[`Z[E~<5s07)]܏Tz:MhQLDLaOSzSbΠPC(#G=j}$r&7Pe2{̚PhaA:g pݿ~`.L!:tWжv1r,!Oى_\NNb95;Ν۷ŌbHJ"k(}5T L&h $үc8^^ͮ109mEhƟ;T9(FBoz/.Z Յ nx=}$Ddv:9&vY_3KޝOGl󂳸wC4?ȃ'#t_O>> g3s|}Rb?LC8:ʇX9ؙA٭Wрb??ׅX]A]Pk~Z#ϑZBwK@CD z?:Y%;!]Ҧtzs=KS9)rΟ^Y̪jN =V< E+SA1iJpZ3w45wcBxvL)5>^ѽ1M\sYj O|jSc]!|h:jJӺFP'G `+] k7R!w7֘kUwxTeڇ)CBHB(6X *]׆YwYu.6Xz{xϙ3${_W9Sdr ^eq}0'&08dvgK<5TAKm>~sW[8qU?/ srFS3ڋ&3}@8&s~o/i;&y@~z`с^\{c1 (#FfX.E߉ߖ cdO` QVR?3NH99ã0%0/m+a-vV* պ 5 tF'l)}ǟY ONϏ+wN(ی-YWr`21ibцB@P]XTP]~_ב ♖<ٸ5 )#wa1 6SψRWbE͙:? fZ#Y)}œwFkG+"eܝ~}aWc`m`VqRF9XYLϢ L}룞k.t-U\EIe->F;-8|Ls)/ oh=T[ WDUmD ѽ &s𥬬qߏCm|{4M*iyփ ؤE5s+,x9[N#%xy38d040<4{lPpk_o"Qf ӥ:wPHݕ0Zm]jwʃ)ۼ:jaTҖz126>a>2whu".%S=,['YM^!xWPlz+3Gfͩ%jƌQV}Ri\4HPؿ5/z ~Eߡ,dLqdJ*zZ%?AJVg84:~XLѶ9S.J@H_HiF}D>0}t6Fqo^XO'[gB񋷟.ix4"@FĞvznOltT-xP !Z<45t`x=ڭ1.epGԧTNƒmDn&YE'O _SP[ 7|_X^tFȷ- WʸKF9CUoGmAS̆F|H8^?>Ҳf1TE}ؾ_/XơE*s+rVmE֬%jnȠ#bn|ywO^ܟˆEӉFgB[w;"5hSi[x}8)\4y37ZSv(ź"9sy9< `沙v{Q\]L^؟7*}#o |Y<aMv9_?W QP6E5<>~[*u3l>H`WnAF1ۀ 4kS~b(L_sQAMaUM !TpUcmí"m3k:e_^ M(Q.뵚CMj8[Lw,GpԚkqכxnb6,"5s.xuv( gTl ޔT2/t _S䁵QލN);"?#f %ԙYXDZey:l[+jTﶓE'bͩ5OK1S\qz=ZL g^^Ԫ醗y+6, ^O/ɍP-\YIO1+ȯgi&km͔ZCT^cF冀2(x  t6WOfrpaeh/lj Y9]Q.<甈֧(B~@$W-ZN:oz1q5,_'ފ#`WDi<'õ*%qg3 F_r{M16.i1z֭`6ާw4&c/, 0vSa2I,Owk^!U:{߹wAc9vvyX ˎԾPoeo,8Kr취v|H+`!*?_h48NQe' lP6rj4H_6LRTRi',WYNZ?[S ]D:$ :0z(:e[=[Y]  9T>hY8QjzdW$`]㹟DM'iQHJNZ%3:"[rH G*J^Gc 'l$G .ZXF-@ҿ;vPUWEWSSQ _OG >zߩ[nQnnrw73F9nH-QRWC>x dWQ+d;wRy3' [ >e||F_O oH8c\63[含{3 oLbL:, Rg>ȡ"iMu'd+HK# wő/8TDZKym)ze_14t(w \a9K="q׽\F&Zu1M]o'r3[&F۟44歧 ^t0bQS\iʉE|'6_ʔcU_ڕגSCwdHTGY9Eg/"R[: 2_G< s1qTN r!0Mnll-0w+b!q\S ֙-V#`J×)ePݿ{Lt"`Ց#Mf-MW}BJIT'ͱ:B1W=jK)AA}P f`R[IKVpjmTCγ18@^uqV  $68T˶ϵ16A-z-LuExQZ,z 6jZK}|!̵O)0M,RRag~L)˨g#Xɦ4k#\^M E5}alXWI:n ~N'Fڢ̽P-R'kaۮ=$KꠗM.~ ToN 9$*;ɗ4L8EEc鸥͞('"kZHm-T򮈹N3C۹G<:?%rz2uͺuml JK`e(z@@fų| /l]yl LIGo;?߽<4KϷ_Ń"psb%ix)i &+}6%70ʯAo鿑[KGpVNϴi^-7c$,bpDDt Džu(8)!`jSLQ=KΫ޿'NR -jucxz x, ZSg&5XFԴU("ҿCbikUM=۵2!Ty7sP#8Q}bӒhbPLe>CG"I[p.FZ̞eߙqPиiJ/|0xD0 n`tj[!xk';"ǵW"ҨcߋhL@Z lvsEMlbM!%pgOBu5**ѧo>3;oH/'AAlgvӰc7Sd^W4M6< [甈A2e=3`[M+&' :t/_ /"|p rѱD܃ײ쨛xq$,S"P0%'+ J*k){\NPZ).cK֬9E{|;μSki]@:G*bӱ\} )vVD}PĚN#.Ļ}_mhaJ8T)z/kzn6pLs}Wߥ'1U.du^:yyԚk+L:,1n,#Yv:FaK,:ɫ^඄+AO"47"B*rSVAF2G(I= 6݄o^}2^Zg価GJ) نPRýJemWj͵<9VhQzKmÇ|<%DKa^Wv3BH&,l<:siS=\Fnh;E5e#RyrboH>[99b2.L()'L}n4SM-`Sy'mɨBb|n*SS)۰t:p)Mo&L?/X(Rgvj.S ' *u;7,NV,Z'tni{NpAs 3@]5;!1,m))L:t[h(\1@/7Ge-q(iRvA.|I ތTe:d{_>JkP3]>=q!!M,U߲½.UFIq V8BRࡌbm&e2k~zpOz! s "C<~4E"r2uTҵkzNLx&ZE*];C(hV=ق%rXiZ}Fvh&ޟ Rj[BA} l;lxEl*֬Ҭ "5`2S5;V_SL+kW wE~`رxzzȜ9s?ufˋ0yjkwv4cҋ(3x4ELЪ9촘ivo5e\y xa`<3ˢwq=jMKWD?4ڟkGp(+&ڔ0:^WM>bgkV9WM?[ЙL=PSXhl+ěI}T<-fQ7rFikwLq(N)("j{sh[,Q½&u/Q`nytbqM=1hEqyfY+'}餬BRM䋿; V\Ӿkuk6\8|9mcx8>Fj}IIVnִsj`N۴afO `tu%͢[ /y1|ƍ YfQ]]ͦM裏XlY'ڞ oճRE.j]^CD OWd 2G⦀_@ETPSgd1 }x꡼v]ٿ0x^X,C]am;/C1k}ELfp8A/"JDmv2t^Z-K#< z7vl͟ѪZl<˫tcc0eǕhuN41zq^Cρv< @XĔ刿_ۡt)QN죝,6;h{W#RqekbM_gvt  .zQFAf1L ܂E]]ԙNjf @>6Qf!3q%~(Of)X_䮻o߾ 8sUVqA2|p.z)/_NucϽNA-hߏ ̲LFQlg8?pRČCZͼ6`+Wu_IYWNK!vzE>UHMc9eUnԻ,*qR3K+D.$O~vkΊ12/Q=)6?FMVDSH-mjcKtjpMJ6kR1uZލL8І{9v$yeAaS|]a=Gy/NT]PkĝgB0أ`I&>:f 5ܩY-⢥2" lP57Yk)*j+@v)`ȉG s纅 q%N= q\VocPUa>#ƺkђ ]vqz=DFFr%ͺyf Bxv9s&8pkWUUQ\\lӾO,9ˢ5cށQXd!ʆ֯Y)Ʉ'HS{3|Bٖ`kYXܼ4}Pz -;T&T*j:o"v6yC5ulQtoRvjn֨3WgFpqXnz}o^{2)aRP+BR<ضIF?«Άۆf3?8+W$00S/vdvtoi~XA_G猊M5k 2ú焙hiuSTymUQ[:!+ #fՋN ,uAL'fMcs^ǕPp7 <6芺̣ͫ\M/T˝PSa:qZ3S2AOdϯ+K㛎H jok.koٚ:g0o\^YZ3:nꟴ+t#g5&#i[` M >{揉QgĂ{TP{zYP-LҦ Dz%#Y843e w1<*¼л{_(.%N_(/O"&kwAh*E'swTL ڨϘ QgM^Y~lb1~Vzp9A81^d ?|9tf^㪫?$::?y-^ã>ŋWcflZË9ЃLU5uiUuU4U;yKک >5h# WaeL:IJf bxepN+;qi䃐>M>tֺ((X^aZxxp YG~C1>Bf3*Q!W O"r}>60=*.tM81X]&NSb]:[%3L\z]?Vll9^+aRKa0})hesA2%z O&=IAUQ i ^TӽîZB8Cz&<nk)WDem%Fx5;AYQUE]a:iLm^Oo|KYW͓ßD<=av6{]ȃY08jhj yi^Oҁ=㤦3IڗsF>Cz뭍>&>> ŎcsHEDDm6f)ŴVwg/o&~) s]/{/?s|v3y/`??&84G+Mnv3;*FQvaGRt%Ky8WP^cff ߃oKR1<5ny` bp<ŎH^|@z}|(@nqSS: Q!Ct^gvlܜ(:%b̜R)ְ_iHųdԁoxxi~h=<[(\IvIQI$E%?W)("bRm  c<{MSjfÝ>}\4a"K_bz9)—үZ|xk!Av]w#,0:9ĥݝslW O=ӟhY\)/gLa1w&p8wmyDE:*qU_Kv3)PdbȑpIbq`Ǐg߾}dgk2qm #ZP[Rg"0:Hۈwʗs\C*e"NU(E\nW]ͯR{-0aek;1NmF5 :؅Rc@+&Ҭ̎@Uj)e$Q`)iQL^EbﬖK.qV1m-i5ppN:|6eG=qnMo@ ~(жVi:S\}'V"E*^kD e .z4Ohun9#]Ϗ'xUVw 5ϧ3f0p@͛Ǟ={_xYpaF\1v`F- L f}Gp(e2ZGfa;sZ^c3ڳ׭%>"s;).$,Y=(vj |Q#681&afKZB3`Kй Mh4 4ܑ0'!, 7@]g}X|VDuӖ0]4"E WpU)C'?="djzu5Ӗj*%EeQMkmߖ4I*us:ViA'%݋n)x饗ʢիW3hlX~Gᥗ^h%"|-g'=M/^tw-] LuWF4+DA-(,ANH_0ztRsjLi[Cj|`Re9YLV}4W<@:0eIsK%оWiB*uvOt&.,ϳ.+g\Nkٯx)ua[x[pܳn\*Q*߿Ҿ@Ghu7wi3j$txl | AkO{,f8ECߋؿ4],ڶm  CUf/g VjS_7ΰ/Q Q|&MLN;,xH(uy"r*''Q8~5q,&TI[,kۿ >X4x_y".eA suDt:6ڨF3Hu&R D'`R;ml}mfҫ'>qVaphPO+8~cڦw"w. ޹U;qqlߐxBX|>I>^J7_h9k4pYVD\7 6߮:D%l]j@م Ss[lOpzMϺ8 >3hho%ePrM]TeyZdzKvK=R+m k8;'Ϡ̀]Q#UZ?P#^F#Vh RCD_U89|~#`cN/DjsZJMSOWJM95r>JOMM}EEolXNwp< "LqoVTY{T1( j'qnff|z<5XQZ')uHF킇?qL}.{n^|l_JHd:dTQ'Y#N0Zfc1>oMdWb?ZYՇ7+VHxcyιl52n&+G"ec?Gu,9%&F#Ug.Q`:m c&-זi=(rAC_Գyi;@h_v}5$ ks2MEvZ+oXZ^-UGZ NW$)'uU" hO3GzY*n^͏|xCG 񋄩KDGdk,Nm8IƑT+CKm n0Aq]gٯ5'$p*^#NSV$D]^J=R+`Rs{q6pluԳ}"-xY-PS{ykOahu)A#01M1sפր`Ӱ`\/Y>H4zOTmWdW4`TSwMaq5-չ͡-`)}xM.`C›ߓx.cݰUt:h:RӺg > lHE:KFw(x#$/"hsN2ss':Wwst{-`4A;gkcB`vTjKkp%ul"Q-o+/lMA`ZꉗsH5ES&*>J$#(eFP;՚T5ҢF~?)ABӟiS(Omj_KTUTɠ9ۊs(\ jVsh|m fkz#\&x`E s!W:q$+3,kJJzuOXd.Gvn &ҏMN=6)<g:}I-ćV9,O56]4NF25F5SN(N[Uk :z*XNs}mKKQ#M)g[\Au@:Qj7_mnRt߳յ [!Fp؉|G所so͖$!uPct_x5¦Z&k 7BZ(mPD]ިD}T;ئ63킓6zGho(bXNniGd~bќ0aS@O'gw #d[!JMpc%YZ5î'׋poj9mZuFw;S[H+<&Veo6!pBL[*DeGӷ5TTC70Z*u-M耖Ng#P /Nok~cG0qR7:CJV[t$*ƾUCĶi'ZI&:[Dk"cL_ =Ƕ5m񋄾6!i8j^9ܛNnOz&wSXWkt:Rٺ;oQaI[ԑ;*-}bQȻ~\rRRDOڢ[}X8,W C$R~$䗮@03w}9.@5mZYm|ML0 Lۖi`uvz\X$=䶔@'umQKk_UH»{fVVHn*b`욫tTݟ-:X󤨥r:kԿX:CDl| ޛ.,{"FS[;XMТNyGDWIQ87vB睻j+@fRߜXz-j-P6 --o GAvCX@v>X\uUvr#t0RJ:qjʴO}'M0[+uf7ljns'98CMk5g#oB$=Dखc?_+}&Ut.JIힶ?dmԯ-jD`QJk`^x}&[~;ֻ>)CaDfH(xZ™eZ=2yÂj]:Ծ3M룊E55A|^G!mt_s$*v6/c v}#{^\ދC[nN*Oi.- |v8)I/jUZ@~p~M"itj&}V?M"`\C8C`]iZ6뫶N޲?.FW&+V8i)~mhrܞQ*t{w aOm]_>-ǡH Z$\Ţ:7^O_iu3*F?əD"C @I a㫚uV@c< }m@@AsyCcE\=1  5u{sSk7Tڳ=P`akU& saW`1CҽH$NP9>6MckGQF,%ݶ 1{7Ey=bfNZL#EZ_s=..p"] g2'8sM:bĨ:+:ՔH$AoK^w8sKsۊA,HG6 %D%4?/PA$ŦBHo[ V`i8 jзԉj*^AbDgђފ]cmc>ʞk0!?|Q;{UIfH$N4G;|v?.Ogh^[̾,>-Rl= =/Rsil(Jl&fWW#*ESek"9ps~"Eޙ ػve 7Nnh/|gRd<ӷBu x@d7{H$J:7T+.c/r*HDxxs褭*Ѵ`11HMY M?2`E a}.m@\Qh#ۆmkt=^-3s<%I@=$]5e2”[k[8^q;kx9F ނu"iCR~Mݍ7ڛ(v>|W-q!\S[+%yAIZ'N.mk3l2ˁsQ*nquNobv}r< U6mu5A}`SA7 \!DwϝftAnxU4 ӐP5/$c!MfSa[pV4C@le*^;?,fP]&$:@CwWW3"½DjN/ӖD"ir": 7}îkC`pjP:-?\H9>SA쀊BNe[P 8ܮe SYE״OrMK"tkt/jeZ/:l'(ǵg{^{Z`m_4q?&߾tMTTP"H(^#ژ۸DS@1.gYϘ;_ö 1,о&D>OFAYkRg cfŷGV+5kRW%<Q#!:dY{#3ZI;[+Hg^Fw=jl2Tߗwgw-H$mDFw(X }Lh?9X"RJ$IgisOI$v@ @D" ).O߮zH$nD#.ӷoϑ&P"H=F:(8"="I$D Ҽ7V&H!RJ$IWqy6Y\,.cur$IE @D"*D:q;#H3RJ$IW!Z>J)n$H%R[NgݻI&ALL /B'Z"D&OqEEu$I[ $222~,X@\\F3fΝ;y̻ɫH$-z=\tZ$I hL&555|w}QJ+V>ĠAHNNW^;謥K$!WCAX2y"D |w1|͛73ydL&u̙3IMM3)H$ փtgF"tCe>>3g$:Zۑfffgp} ^*vZD"9lH$9\d'%%9O_~c>'&&կ)H$DќSz[o .AVV6m->(/..."P"H$99%CCC u?o777Əc=FMMիWӯ_?_www[$D"HT 믜8q 4nd2?kE$D"H#T$%%ѿj*.\ȑ# aٲeF"H$IGgX,sb)**ϯ#H$񻛧%D"H$ P"H$뮻W{n##]jvɅ^hݦ ټys'{STT@PPP'{pBf͚e-}Fk!,,D{^V#))5kpaÆ K:yeݗ'NigرJFnn.uuum'%%Vս1,Z &0x^N>c׮]l߾ҭ9~8o6/O۷od2q-t K,c0+7xcg/ے 'iRJk.\ٰaCg/ۑ<իtkf3Fg 11;H؆fŊ_bРA$''h",9).DHH,YYYDDDtҪ/{/+WdڵDGGwr;w$;;#F`41oF:{݆Hhm:uV=yGXd ]wC a޼y<<쳝nzŶG .dbȑYƺl6fƏ߉+^X,^k~W:{Iݒӧo>?Fo$99K6L0ÇuOI+aw\,..f֭Jd xbnFŘ1cxW)++cn… ׿ŷ~OON^]׷A]7޲yIJJgaܹl۶w}w}֭={6_ٳ' bݼ+vmsR=j} gϞ,Z~>}ҥKv KZEx7,={L&˘1c,[l%u+?~ag/3e<|[-nGqqaxxxW_mwٳZH$I3P"t{>cBBBضmww}7\s IIIڵ3f0o<(,,dڴi$&&c~g;w߱w^5juێ;y'IMMfv3f ۶m}޼D"8@ @D6l?8}GÃnvòec޽$&&3пXv-v;0 Y:u ooo.RbccILL{^TTvmD"ioH$ݞCZ 2du[xx8ـhXvLJp1wwwF.X7o+VFU<==lH$D @Dqss충l6PZZٳINN9rHJHHTWW[k.>S"##YlÆ |BCCJ$+H(H$1bW^sF.B^xɓ'_߿hBBBH$I}H$z,\|zoαc_?>uuuʈ#ذauʕ+yINN&--O>L~Y~=3fh$H$H(H$bƍ1c ¢E@w\`+V૯bڴi 0wyO?APYY7|I"HlFDFTTTЯ_?>sƏ~mkVZH$ H$6ӓO>Qh[x7yUDH$D"9ϐ@D"H$ )%D"H3H$D"9ϐP"H$>' safe on PS Level 1 devices /languagelevel where {pop languagelevel}{1} ifelse 2 lt { userdict (<<) cvn ([) cvn load put userdict (>>) cvn ([) cvn load put } if %%EndSetup setupLatin1 %%Page: 1 1 %%PageBoundingBox: 36 36 1573 1573 %%PageOrientation: Portrait 0 0 1 beginpage gsave 36 36 1537 1537 boxprim clip newpath 1 1 set_scale 0 rotate 40 40 translate 0 0 0 graphcolor 14 /Times-Roman set_font 731.3023 3.8 moveto 67 (NEO 0.10.0) alignedtext % NEO gsave 1 setlinewidth 0 0 0 nodecolor 728.5955 758.11 88.5 88.5 ellipse_path stroke 0 0 0 nodecolor 50 /Arial set_font 674.0955 745.61 moveto 109 (NEO) alignedtext grestore % AlphaOmega gsave 6 setlinewidth 0.49087 0.82022 0.69804 nodecolor newpath 352.7627 600.03 moveto 161.7627 600.03 lineto 161.7627 559.03 lineto 352.7627 559.03 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 169.7627 572.03 moveto 175 (AlphaOmega) alignedtext grestore % NEO--AlphaOmega gsave 4 setlinewidth 0 0 0 edgecolor newpath 652.5345 712.8639 moveto 603.2533 685.1746 536.8933 650.8706 474.7591 628.42 curveto 435.8123 614.3476 391.4265 603.4978 352.9522 595.6353 curveto stroke grestore % AsciiImage IO gsave 6 setlinewidth 0.49087 0.82022 0.69804 nodecolor newpath 354.2934 1089.2 moveto 151.2934 1089.2 lineto 151.2934 1048.2 lineto 354.2934 1048.2 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 159.2934 1061.2 moveto 187 (AsciiImage IO) alignedtext grestore % NEO--AsciiImage IO gsave 4 setlinewidth 0 0 0 edgecolor newpath 659.687 813.741 moveto 609.4897 853.2129 539.1346 906.396 473.8597 948.24 curveto 413.5139 986.9242 339.7605 1025.4811 294.5439 1048.1978 curveto stroke grestore % AsciiSignal gsave 6 setlinewidth 0.625 0.71111 0.88235 nodecolor newpath 444.1588 1161.5 moveto 280.1588 1161.5 lineto 280.1588 1120.5 lineto 444.1588 1120.5 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 288.1588 1133.5 moveto 148 (AsciiSignal) alignedtext grestore % NEO--AsciiSignal gsave 4 setlinewidth 0 0 0 edgecolor newpath 667.2622 822.1972 moveto 582.9133 910.3334 435.4885 1064.3777 382.1426 1120.1188 curveto stroke grestore % AsciiSpikeTrain gsave 6 setlinewidth 0.625 0.71111 0.88235 nodecolor newpath 1030.7122 1147.2 moveto 807.7122 1147.2 lineto 807.7122 1106.2 lineto 1030.7122 1106.2 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 815.7122 1119.2 moveto 207 (AsciiSpikeTrain) alignedtext grestore % NEO--AsciiSpikeTrain gsave 4 setlinewidth 0 0 0 edgecolor newpath 769.2538 836.7297 moveto 813.7551 922.7807 882.2652 1055.2565 908.4934 1105.9732 curveto stroke grestore % AxographIO gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 1130.9214 186.15 moveto 954.9214 186.15 lineto 954.9214 145.15 lineto 1130.9214 145.15 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 962.9214 158.15 moveto 160 (AxographIO) alignedtext grestore % NEO--AxographIO gsave 4 setlinewidth 0 0 0 edgecolor newpath 753.7016 673.1924 moveto 778.122 596.5498 819.0533 482.0474 870.6849 390.07 curveto 894.8463 347.0285 987.2454 233.2273 1025.8329 186.3151 curveto stroke grestore % Axona IO gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 658.7173 95.789 moveto 517.7173 95.789 lineto 517.7173 54.789 lineto 658.7173 54.789 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 525.7173 67.789 moveto 125 (Axona IO) alignedtext grestore % NEO--Axona IO gsave 4 setlinewidth 0 0 0 edgecolor newpath 687.6549 679.5073 moveto 646.6392 595.9789 586.2797 458.7624 562.4721 332.21 curveto 558.5773 311.5065 552.0531 303.1198 562.4721 284.81 curveto 573.2088 265.9418 593.7279 278.7282 604.4647 259.86 curveto 634.4535 207.1593 611.4701 131.9981 597.2651 96.0262 curveto stroke grestore % Axon gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 601.2647 256.66 moveto 516.2647 256.66 lineto 516.2647 215.66 lineto 601.2647 215.66 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 524.2647 228.66 moveto 69 (Axon) alignedtext grestore % NEO--Axon gsave 4 setlinewidth 0 0 0 edgecolor newpath 688.4492 678.9258 moveto 648.2398 595.2021 588.6758 458.0854 562.4721 332.21 curveto 557.1665 306.7235 556.9504 276.6316 557.5911 257.0113 curveto stroke grestore % BCI2000 gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 439.7513 341.77 moveto 306.7513 341.77 lineto 306.7513 300.77 lineto 439.7513 300.77 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 314.7513 313.77 moveto 117 (BCI2000) alignedtext grestore % NEO--BCI2000 gsave 4 setlinewidth 0 0 0 edgecolor newpath 681.5621 683.1014 moveto 639.23 617.8565 573.6258 522.1214 507.1485 446.14 curveto 472.2999 406.3092 426.1421 365.4686 398.1272 341.7804 curveto stroke grestore % Blackrock IO for single nsx gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 1527.682 650.86 moveto 1157.682 650.86 lineto 1157.682 609.86 lineto 1527.682 609.86 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 1165.682 622.86 moveto 354 (Blackrock IO for single nsx) alignedtext grestore % NEO--Blackrock IO for single nsx gsave 4 setlinewidth 0 0 0 edgecolor newpath 817.2658 752.3913 moveto 901.0665 745.6438 1029.8345 731.7896 1138.8255 705.12 curveto 1194.1162 691.5906 1255.106 668.0115 1295.8353 650.9453 curveto stroke grestore % BLK IO gsave 6 setlinewidth 0.49087 0.82022 0.69804 nodecolor newpath 1080.6989 347.29 moveto 967.6989 347.29 lineto 967.6989 306.29 lineto 1080.6989 306.29 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 975.6989 319.29 moveto 97 (BLK IO) alignedtext grestore % NEO--BLK IO gsave 4 setlinewidth 0 0 0 edgecolor newpath 778.7406 684.9424 moveto 847.9233 583.9968 968.7751 407.6598 1009.9725 347.548 curveto stroke grestore % BrainVision gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 542.0459 168.26 moveto 374.0459 168.26 lineto 374.0459 127.26 lineto 542.0459 127.26 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 382.0459 140.26 moveto 152 (BrainVision) alignedtext grestore % NEO--BrainVision gsave 4 setlinewidth 0 0 0 edgecolor newpath 696.5826 675.4633 moveto 648.8349 552.2989 564.0602 334.0709 559.6866 325.94 curveto 542.6598 294.286 531.4005 290.7741 513.0647 259.86 curveto 494.8164 229.0935 477.2354 191.4183 467.0422 168.5212 curveto stroke grestore % Brainware DAM File gsave 6 setlinewidth 0.49087 0.82022 0.69804 nodecolor newpath 847.6721 329.01 moveto 565.6721 329.01 lineto 565.6721 288.01 lineto 847.6721 288.01 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 573.6721 301.01 moveto 266 (Brainware DAM File) alignedtext grestore % NEO--Brainware DAM File gsave 4 setlinewidth 0 0 0 edgecolor newpath 724.2772 669.5519 moveto 719.0504 562.3619 710.5881 388.8177 707.6863 329.3088 curveto stroke grestore % Brainware F32 File gsave 6 setlinewidth 0.49087 0.82022 0.69804 nodecolor newpath 784.1087 1161.5 moveto 518.1087 1161.5 lineto 518.1087 1120.5 lineto 784.1087 1120.5 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 526.1087 1133.5 moveto 250 (Brainware F32 File) alignedtext grestore % NEO--Brainware F32 File gsave 4 setlinewidth 0 0 0 edgecolor newpath 711.0125 844.9937 moveto 692.7945 935.0155 665.5719 1069.532 655.2644 1120.465 curveto stroke grestore % Brainware SRC File gsave 6 setlinewidth 0.49087 0.82022 0.69804 nodecolor newpath 279.9184 733.43 moveto .9184 733.43 lineto .9184 692.43 lineto 279.9184 692.43 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 8.9184 705.43 moveto 263 (Brainware SRC File) alignedtext grestore % NEO--Brainware SRC File gsave 4 setlinewidth 0 0 0 edgecolor newpath 640.2212 751.3217 moveto 544.8937 743.9992 391.7919 732.2389 280.1302 723.6618 curveto stroke grestore % Ced gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 1031.2428 1219.5 moveto 960.2428 1219.5 lineto 960.2428 1178.5 lineto 1031.2428 1178.5 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 968.2428 1191.5 moveto 55 (Ced) alignedtext grestore % NEO--Ced gsave 4 setlinewidth 0 0 0 edgecolor newpath 799.5175 811.3729 moveto 874.1728 872.3351 987.2169 979.8053 1033.9122 1103 curveto 1041.3789 1122.6991 1040.7961 1130.4898 1033.9122 1150.4 curveto 1030.4065 1160.5397 1023.8154 1170.1735 1017.0843 1178.1495 curveto stroke grestore % Elan gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 1063.3029 543.14 moveto 986.3029 543.14 lineto 986.3029 502.14 lineto 1063.3029 502.14 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 994.3029 515.14 moveto 61 (Elan) alignedtext grestore % NEO--Elan gsave 4 setlinewidth 0 0 0 edgecolor newpath 798.043 702.9027 moveto 862.3375 651.7918 954.4926 578.5332 998.9135 543.2207 curveto stroke grestore % igorpro gsave 6 setlinewidth 0.49087 0.82022 0.69804 nodecolor newpath 926.5337 1363.5 moveto 817.5337 1363.5 lineto 817.5337 1322.5 lineto 926.5337 1322.5 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 825.5337 1335.5 moveto 93 (igorpro) alignedtext grestore % NEO--igorpro gsave 4 setlinewidth 0 0 0 edgecolor newpath 746.2666 845.1413 moveto 760.1505 917.6171 778.5543 1023.718 787.3087 1117.3 curveto 788.4619 1129.6277 786.1065 1216.9603 790.0413 1228.7 curveto 802.4587 1265.7486 831.3826 1301.1349 851.3294 1322.4647 curveto stroke grestore % Intan gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 843.2339 243.46 moveto 760.2339 243.46 lineto 760.2339 202.46 lineto 843.2339 202.46 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 768.2339 215.46 moveto 67 (Intan) alignedtext grestore % NEO--Intan gsave 4 setlinewidth 0 0 0 edgecolor newpath 759.9079 675.1695 moveto 790.1092 590.415 833.6951 454.2846 850.8721 332.21 curveto 853.8074 311.3488 857.8117 304.7009 850.8721 284.81 curveto 845.451 269.2715 834.3152 254.7103 824.0134 243.6243 curveto stroke grestore % KlustaKwik gsave 6 setlinewidth 0.625 0.71111 0.88235 nodecolor newpath 925.6681 69.231 moveto 761.6681 69.231 lineto 761.6681 28.231 lineto 925.6681 28.231 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 769.6681 41.231 moveto 148 (KlustaKwik) alignedtext grestore % NEO--KlustaKwik gsave 4 setlinewidth 0 0 0 edgecolor newpath 759.9079 675.1695 moveto 790.1092 590.415 833.6951 454.2846 850.8721 332.21 curveto 853.8074 311.3488 851.1934 305.8742 850.8721 284.81 curveto 849.6557 205.0645 846.1292 110.2196 844.505 69.252 curveto stroke grestore % Kwik gsave 6 setlinewidth 0.49087 0.82022 0.69804 nodecolor newpath 597.6474 1233.9 moveto 517.6474 1233.9 lineto 517.6474 1192.9 lineto 597.6474 1192.9 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 525.6474 1205.9 moveto 64 (Kwik) alignedtext grestore % NEO--Kwik gsave 4 setlinewidth 0 0 0 edgecolor newpath 672.238 826.7979 moveto 619.813 895.4922 545.3523 1006.5827 514.9087 1117.3 curveto 509.3233 1137.6128 507.4845 1144.9849 514.9087 1164.7 curveto 518.7937 1175.0168 525.9674 1184.5715 533.3426 1192.4358 curveto stroke grestore % MEArec gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 1135.6255 701.92 moveto 1012.6255 701.92 lineto 1012.6255 660.92 lineto 1135.6255 660.92 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 1020.6255 673.92 moveto 107 (MEArec) alignedtext grestore % NEO--MEArec gsave 4 setlinewidth 0 0 0 edgecolor newpath 815.3413 738.8569 moveto 876.7129 725.2355 957.5276 707.2988 1012.4038 695.1191 curveto stroke grestore % Maxwell gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 1179.204 905.96 moveto 1054.204 905.96 lineto 1054.204 864.96 lineto 1179.204 864.96 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 1062.204 877.96 moveto 109 (Maxwell) alignedtext grestore % NEO--Maxwell gsave 4 setlinewidth 0 0 0 edgecolor newpath 812.8092 785.7431 moveto 885.3766 809.5546 988.5002 843.3925 1053.9989 864.8846 curveto stroke grestore % Micromed gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 724.5785 1469.4 moveto 577.5785 1469.4 lineto 577.5785 1428.4 lineto 724.5785 1428.4 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 585.5785 1441.4 moveto 131 (Micromed) alignedtext grestore % NEO--Micromed gsave 4 setlinewidth 0 0 0 edgecolor newpath 761.0957 840.6734 moveto 789.1259 923.9483 820.3114 1055.4634 787.3087 1164.7 curveto 761.2835 1250.8413 709.9326 1250.2862 675.2004 1333.3 curveto 661.9856 1364.8848 655.7468 1404.4552 653.0062 1428.1514 curveto stroke grestore % NIX gsave 6 setlinewidth 0.625 0.71111 0.88235 nodecolor newpath 940.8849 434.27 moveto 873.8849 434.27 lineto 873.8849 393.27 lineto 940.8849 393.27 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 881.8849 406.27 moveto 51 (NIX) alignedtext grestore % NEO--NIX gsave 4 setlinewidth 0 0 0 edgecolor newpath 769.3893 679.5431 moveto 810.7173 599.9473 871.9563 482.0037 896.5668 434.6052 curveto stroke grestore % neomatlab gsave 6 setlinewidth 0.625 0.71111 0.88235 nodecolor newpath 1271.107 774.29 moveto 1116.107 774.29 lineto 1116.107 733.29 lineto 1271.107 733.29 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 1124.107 746.29 moveto 139 (neomatlab) alignedtext grestore % NEO--neomatlab gsave 4 setlinewidth 0 0 0 edgecolor newpath 817.1551 757.2873 moveto 903.4558 756.4855 1033.3776 755.2785 1115.8062 754.5128 curveto stroke grestore % nest gsave 6 setlinewidth 0.49087 0.82022 0.69804 nodecolor newpath 470.6597 945.04 moveto 397.6597 945.04 lineto 397.6597 904.04 lineto 470.6597 904.04 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 405.6597 917.04 moveto 57 (nest) alignedtext grestore % NEO--nest gsave 4 setlinewidth 0 0 0 edgecolor newpath 651.2359 801.8375 moveto 592.9649 834.7753 515.6847 878.4579 470.79 903.8347 curveto stroke grestore % Neuralynx gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 1227.3337 543.02 moveto 1076.3337 543.02 lineto 1076.3337 502.02 lineto 1227.3337 502.02 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 1084.3337 515.02 moveto 135 (Neuralynx) alignedtext grestore % NEO--Neuralynx gsave 4 setlinewidth 0 0 0 edgecolor newpath 806.2239 714.8992 moveto 897.7436 663.956 1046.0621 581.3964 1114.7463 543.1643 curveto stroke grestore % NeuroExplorer gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 1354.7776 978.31 moveto 1145.7776 978.31 lineto 1145.7776 937.31 lineto 1354.7776 937.31 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 1153.7776 950.31 moveto 193 (NeuroExplorer) alignedtext grestore % NEO--NeuroExplorer gsave 4 setlinewidth 0 0 0 edgecolor newpath 806.5815 800.0123 moveto 870.764 833.1758 964.8678 878.8073 1051.004 909.16 curveto 1082.4086 920.2264 1117.4555 929.6989 1149.2948 937.2655 curveto stroke grestore % NeuroScope gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 357.0501 945.99 moveto 175.0501 945.99 lineto 175.0501 904.99 lineto 357.0501 904.99 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 183.0501 917.99 moveto 166 (NeuroScope) alignedtext grestore % NEO--NeuroScope gsave 4 setlinewidth 0 0 0 edgecolor newpath 645.3674 788.2275 moveto 552.1226 821.9697 403.4878 875.7558 322.746 904.9736 curveto stroke grestore % neuroshare gsave 6 setlinewidth 0.49087 0.82022 0.69804 nodecolor newpath 380.1704 805.8 moveto 213.1704 805.8 lineto 213.1704 764.8 lineto 380.1704 764.8 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 221.1704 777.8 moveto 151 (neuroshare) alignedtext grestore % NEO--neuroshare gsave 4 setlinewidth 0 0 0 edgecolor newpath 640.1467 763.6779 moveto 564.0067 768.471 454.9211 775.338 380.2349 780.0396 curveto stroke grestore % NeoNWB IO gsave 6 setlinewidth 0.625 0.71111 0.88235 nodecolor newpath 471.5591 672.62 moveto 289.5591 672.62 lineto 289.5591 631.62 lineto 471.5591 631.62 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 297.5591 644.62 moveto 166 (NeoNWB IO) alignedtext grestore % NEO--NeoNWB IO gsave 4 setlinewidth 0 0 0 edgecolor newpath 643.9013 732.3175 moveto 583.7394 713.9959 504.0351 689.723 448.1308 672.6981 curveto stroke grestore % OpenEphys gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 351.7952 442.65 moveto 178.7952 442.65 lineto 178.7952 401.65 lineto 351.7952 401.65 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 186.7952 414.65 moveto 157 (OpenEphys) alignedtext grestore % NEO--OpenEphys gsave 4 setlinewidth 0 0 0 edgecolor newpath 655.878 707.4506 moveto 580.6807 654.7799 460.1456 569.558 357.7485 493.54 curveto 335.1156 476.7377 309.804 457.1348 291.3951 442.7261 curveto stroke grestore % OpenEphysBinary gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 1192.8616 1426 moveto 935.8616 1426 lineto 935.8616 1385 lineto 1192.8616 1385 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 943.8616 1398 moveto 241 (OpenEphysBinary) alignedtext grestore % NEO--OpenEphysBinary gsave 4 setlinewidth 0 0 0 edgecolor newpath 799.0474 811.9658 moveto 873.0045 873.249 985.1737 980.8144 1033.9122 1103 curveto 1037.4794 1111.9427 1036.1258 1180.0032 1036.9 1189.6 curveto 1042.7035 1261.5349 1055.1337 1346.3115 1061.0719 1384.7245 curveto stroke grestore % Phy IO gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 508.9356 1234 moveto 400.9356 1234 lineto 400.9356 1193 lineto 508.9356 1193 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 408.9356 1206 moveto 92 (Phy IO) alignedtext grestore % NEO--Phy IO gsave 4 setlinewidth 0 0 0 edgecolor newpath 682.945 834.0757 moveto 618.6189 941.119 504.9515 1130.2698 467.378 1192.7948 curveto stroke grestore % Python pickle file gsave 6 setlinewidth 0.625 0.71111 0.88235 nodecolor newpath 1330.9169 382.41 moveto 1089.9169 382.41 lineto 1089.9169 341.41 lineto 1330.9169 341.41 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 1097.9169 354.41 moveto 225 (Python pickle file) alignedtext grestore % NEO--Python pickle file gsave 4 setlinewidth 0 0 0 edgecolor newpath 786.1678 690.6511 moveto 835.2449 635.4198 909.3642 557.178 983.1029 498.94 curveto 1043.6743 451.1014 1122.2965 407.2009 1169.4174 382.5651 curveto stroke grestore % Plexon gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 556.4866 370.14 moveto 448.4866 370.14 lineto 448.4866 329.14 lineto 556.4866 329.14 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 456.4866 342.14 moveto 92 (Plexon) alignedtext grestore % NEO--Plexon gsave 4 setlinewidth 0 0 0 edgecolor newpath 685.5339 680.3185 moveto 632.3593 584.2574 545.1261 426.6691 513.9815 370.4058 curveto stroke grestore % RawBinarySignal gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 478.6193 1375.3 moveto 233.6193 1375.3 lineto 233.6193 1334.3 lineto 478.6193 1334.3 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 241.6193 1347.3 moveto 229 (RawBinarySignal) alignedtext grestore % NEO--RawBinarySignal gsave 4 setlinewidth 0 0 0 edgecolor newpath 689.2196 837.6163 moveto 641.9054 926.6174 555.2426 1070.6542 447.3588 1164.7 curveto 428.7283 1180.9408 413.1762 1170.5011 397.7356 1189.8 curveto 363.4066 1232.707 356.993 1300.3671 356.0522 1334.1607 curveto stroke grestore % RawMCS gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 503.9485 490.34 moveto 360.9485 490.34 lineto 360.9485 449.34 lineto 503.9485 449.34 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 368.9485 462.34 moveto 127 (RawMCS) alignedtext grestore % NEO--RawMCS gsave 4 setlinewidth 0 0 0 edgecolor newpath 665.0645 696.2689 moveto 598.4416 631.418 497.4798 533.1416 453.8136 490.6369 curveto stroke grestore % Spike2 gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 786.4004 1377.5 moveto 678.4004 1377.5 lineto 678.4004 1336.5 lineto 786.4004 1336.5 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 686.4004 1349.5 moveto 92 (Spike2) alignedtext grestore % NEO--Spike2 gsave 4 setlinewidth 0 0 0 edgecolor newpath 754.8987 842.9616 moveto 777.0674 925.1932 802.8798 1053.4543 787.3087 1164.7 curveto 778.3328 1228.8271 753.2933 1301.5794 740.3592 1336.3552 curveto stroke grestore % SpikeGadgets gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 937.8168 1528.9 moveto 733.8168 1528.9 lineto 733.8168 1487.9 lineto 937.8168 1487.9 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 741.8168 1500.9 moveto 188 (SpikeGadgets) alignedtext grestore % NEO--SpikeGadgets gsave 4 setlinewidth 0 0 0 edgecolor newpath 746.2666 845.1413 moveto 760.1505 917.6171 778.5543 1023.718 787.3087 1117.3 curveto 791.9216 1166.6107 785.4236 1179.3897 790.0413 1228.7 curveto 799.1938 1326.4364 821.8809 1441.7043 831.4493 1487.8235 curveto stroke grestore % SpikeGLX gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 1192.1 1186.4 moveto 1040.1 1186.4 lineto 1040.1 1145.4 lineto 1192.1 1145.4 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 1048.1 1158.4 moveto 136 (SpikeGLX) alignedtext grestore % NEO--SpikeGLX gsave 4 setlinewidth 0 0 0 edgecolor newpath 789.5694 822.2758 moveto 878.8742 916.2556 1040.6936 1086.5462 1096.5332 1145.3088 curveto stroke grestore % Stimfit gsave 6 setlinewidth 0.49087 0.82022 0.69804 nodecolor newpath 956.9219 258.6 moveto 856.9219 258.6 lineto 856.9219 217.6 lineto 956.9219 217.6 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 864.9219 230.6 moveto 84 (Stimfit) alignedtext grestore % NEO--Stimfit gsave 4 setlinewidth 0 0 0 edgecolor newpath 757.3457 674.2726 moveto 799.6086 551.0317 876.0597 328.0959 899.7359 259.0547 curveto stroke grestore % Tdt gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 852.2413 1225.5 moveto 793.2413 1225.5 lineto 793.2413 1184.5 lineto 852.2413 1184.5 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 801.2413 1197.5 moveto 43 (Tdt) alignedtext grestore % NEO--Tdt gsave 4 setlinewidth 0 0 0 edgecolor newpath 742.1661 845.7137 moveto 755.3554 925.7062 777.346 1046.9035 804.5122 1150.4 curveto 807.5061 1161.806 811.613 1174.2976 815.1708 1184.4506 curveto stroke grestore % TIFF IO gsave 6 setlinewidth 0.49087 0.82022 0.69804 nodecolor newpath 1136.6452 1043.8 moveto 1017.6452 1043.8 lineto 1017.6452 1002.8 lineto 1136.6452 1002.8 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 1025.6452 1015.8 moveto 103 (TIFF IO) alignedtext grestore % NEO--TIFF IO gsave 4 setlinewidth 0 0 0 edgecolor newpath 799.1297 811.7752 moveto 876.5098 870.6489 996.7912 962.1635 1050.1168 1002.7357 curveto stroke grestore % WinEdr gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 782.6328 141.68 moveto 667.6328 141.68 lineto 667.6328 100.68 lineto 782.6328 100.68 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 675.6328 113.68 moveto 99 (WinEdr) alignedtext grestore % NEO--WinEdr gsave 4 setlinewidth 0 0 0 edgecolor newpath 759.9079 675.1695 moveto 790.1092 590.415 833.6951 454.2846 850.8721 332.21 curveto 853.8074 311.3488 851.418 305.8696 850.8721 284.81 curveto 850.3788 265.7797 855.9811 215.7295 846.4339 199.26 curveto 831.2986 173.1507 803.5361 154.3213 778.3872 141.7034 curveto stroke grestore % WinWcp gsave 6 setlinewidth 0.5 1 0.50196 nodecolor newpath 615.8696 1395.2 moveto 487.8696 1395.2 lineto 487.8696 1354.2 lineto 615.8696 1354.2 lineto closepath stroke 0 0 0 nodecolor 30 /Arial set_font 495.8696 1367.2 moveto 112 (WinWcp) alignedtext grestore % NEO--WinWcp gsave 4 setlinewidth 0 0 0 edgecolor newpath 672.3922 826.8406 moveto 620.0823 895.5667 545.7048 1006.6803 514.9087 1117.3 curveto 511.3386 1130.1235 512.6852 1223.9059 514.4474 1237.1 curveto 520.1171 1279.552 535.2138 1327.4667 544.4071 1354.0739 curveto stroke grestore endpage showpage grestore %%PageTrailer %%EndPage: 1 %%Trailer end restore %%EOF ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/images/IODiagram.png0000644000175100001660000156514314743453644017631 0ustar00runnerdockerPNG  IHDR[bKGD IDATxw\Y\Y TDAX@Q&j&*[@hFMkbObbѨF TTߝeYa)yϜ9sYWzHTBBBBB¿a3f3Ȉw}%K%%%iJII3fϝ;SNիe˖=z2t.x=P}ᇣG]?nܸ>˗%[e˖ƍ/Z(w suy̘1YYY%Ӯ'ONNN6t.j@}?qć~]|)r&M~YZv!Cju1eU6,XΝ;@ (>k.;sLlllZZZfffBB¹sΝ[n]lٲgrqq)(/ZHRjՑ#Gڵ+444111333>>>((hժU|Ν;W^]ŋPz\R{uo}5j011Xbjڵk7cƌCJ.\n ԩSf͒U*… ###7lЯ_zjժ+V^zf;ˣG^|iӦ%3g|!r5:uر<Φ7on׮xÇDFvvqrrrի>}zʔ):rss;wxs??b()Rӧһ=zQ͘1C:<{l1&Wٳƍblllкu\XR[VXQ<ܺukq8j@)emm]B1%;weGDDhW( QFbKPPOF-,,4i2r'wܩ7oDDD888HO_x)Sdܹs???OOO???kkkީShpڴi- `ĉcǎ}w'O>}LҼ33S4éSzxxxxxwW ;v:ٳgϞ=>cƌ9s|7ZGHJJٽ{1$$$$$dݺu ,裏t'_nݺUVKk߾}~Sor~<|ϟ7&$$$$$ܺuϯaÆk׮ܹ@J#F'O}ݓ'O˖-{o>?oGXXػ+fΜ0o}ի3g bM69rDヤյ09~={/_^jURibbRN>}:thȐ!bϟ>}Z>B``ѣGŸE7n5jJrpp;vlpp>o>1nҤɍ7ƏRԩ3rț7ovAɺeddرC}}}gwwwkkkRYFo߾}b{I7ŊP9::^z/6eggmذ˫^zן0aիW9lŊ6lnggw^J%.]To޼ٱcXke˖ R:$yHv!͊&N:z笕O^t,#G˗ٞ={@ kժ*00vyP[TT8 ݺu믿{.l5k""",XЪU+/_ͭ[nw}Cusszťb|9iqFΝåKVn*]TѣG3g )))Rljj#3f(^?_r%qћ^SSS8..N0`i Çz*&&FKzFJ*'OzHnnƦM"ell(Esd5PvS^t)..n߾}'Nl۶F#G4o<00PhCqO>bem;w_hф S1ԩ۷o51iߋ[FFFPP֭[Gٮ];]ٳg: ^48qB_~:F8p"ɺժUKjjÆ DiLj#۞~ҥǏ߿b~B>E@6 +PZL_k׮Iw>?Rlmm-ժUotsݾ};<<<<<<***'''w7[{WWW##Kq^7DUVuttQך2e4ʕ+Fuܹ|ХK]o0wyg׮]pB֭W^9Rz, ^0F|O^aժUΝ˫sbbbA=yDQȏ;w6jԨUVǏ駟?AfffVJR\Ǟ[Et_kԨQ'|DEEmٲeРA5jpww_bE@!Qʈ6mڜ>}M6۷O:gJtUBiu =Q(cƌ.6la$=A>'Nj޼yjm?~%Æ OCCCsٳ%Kt1P(K/ XZZnV7z/)K.=vXǎ ƩϏ?iFwܑ;wn>RTs̑z>}<7## 6^/[޽;c ̤8$$DzV^-]!{ n޼Y:lРڵkO8ѣL8Q'U\ _|{dI|zO<[LG^fMAGQڵ7z_+ggg)ɓ'y-$zEk׮1b ϗ/_ݹjժR\7nܤI1NHH(III+߽{wGԩ|᝗/_jVu6AVK;U^] _F|!I HLLrʒ%KtTߎtӦM{vPYZZ6lPO8qƍ|^(›+/_ 1YfhźuX\(5'O$ƍYfv)I& 4([*'E/_´Nhٲw-_nZl9q?322Rڲŋ*n@?Ro߾bV}||? ͛7ϫc]vJСC~>7/ݺu8p|ڴi#믿j] '?>qjjZׯ_.ޥK#}XKOBBB4FHMM߿LL/.ɓ 99o߾ 233 r#&K{ ޷_~Y///yq 5>}zϞ=-gϞ:uj۶mLLL*Udoo߫WKRwL{#G4o|qqq[pa-"""|h5tPi!۷oϞ=[~iӦRKNNȑ#{qС'Odff>|AT[Nz-7a„%KO/CuqqT*ժUkܸ'|v{/ڼyѵk*Uӧ~?|0##bb5M0A>|تU9s愅effm߾ѣ TPA ҥ˧~*׮]kڴU"##333ccc-ZٳG~ƺ=Ermll޽{~~~ߏr_xի͚5[fMXXXzzWbbbvݮ]Ǐ}k׮). hz-߱?̑#Gיyݻڵ+$!C}ӧOB;wJO8%tqq_W*.\pssΪ/rڵvJKM;~Q4fdd4hР~VZ6os+ʱc:tHGE(@1իW^._|K.Ʀ* +++GGVZu#d4TPa՟~uΞ=c333gg={>z-ꫝ;wᅡ ϝ;wܹ صkןyʕd u뺹ӧ{LT1c|W^=|˗ܹKRimmԢE;vMZ>/cǎѣO8\re[[wywҢ=zXf iiix^odd4k,///??#GfffڶkǧCRVVVcǎ_N8ѣ4;;{/h֬YrrA sU*ӧᇀ*UKm۶?>444))IPԫWk׮k) k%4m"_ Ν;5*Eyoٲ>3h:+ BP(3'4\rE@_jȑ#:\R LMM]rEjzjݺs*\\i/ mmmk֬id?Q~~HJJ?AhѢE73l P(O>D BBBuw޷o_FF*Jc 6mԭ[W_P>ڹstl3qƏ>_~yUׯl߾ ޵j211ҥO?q˗/׮]ۧO 333nݺ-_<111j۶1mڴ-ZTRRJM4>|ԍ7vԩv*f͚ݺu۾}{vv{%Bff4h`eeejjZn.],^8>>^K.=¢qǏ ϵ(Q(vծ][NرcHHk 9;;('GnݺC׮]^ѣ .q>}ÇqXXإKv4hPjr˟6k֬uֹTXQzS]VK3߰aüTTR̙3ḸӧOU4888Ho6D KPxzzq-/_,[oܻwb[YI˵iFǏgȐ!R|I}~m֯MF+++1Ȑ@Nt'پ}{)={V!G}B@+WW @v ~TQ|).Ҭ !!!RѼEƹ/ `d*-ܵkפ[|@ X݋SDw"B˖-KPmmmXc9Iq D\bb#T"O}z˖-y睱c˯MΞ=[srrF٣GC=y$33Ç8pcR\n|Ex77 &Ç[j5gΜ̸۷=zT7B@=$Fiʔwy&>>^j) SL AHMM.cccsaSSS=>b͚5 +VXb֞yJ>}Ǐ]V<<|ÇT*~~~F?qoom۶NHc򊫫P1(UPAZH}YPlܸqժUyi߾˗4hGT ZZZl֬YǏבFR(k֬ٴiS͚5utkԨѱcǼrR*w={Jzq.\X$٢$!0 G _/I/2""bժU=z733355utt[*%Ο?.or {>^jd҃7^ 5KKz*P:Rg碣 $AN˽B0T2@A @SP\\P\PX7[rrrxx قrrr-xs]4-Y(]lͽ;-3Sx\x\xBx\07Z6tNB@JI&JܹO ҥY@oo%\PhlܸqcC%*|\ ? 5F 5U0P*}-y wu:7I[Sw,iӦNʧk^S(BBBRSS-$@ZkMhc3[ުP' 4ȰZj*UDFF(N:ժU3T2@i<͛70@`CrcD˖֦@JHIٜkv54P(iU G k`X1116`X7f G QHLL|򥡒4jJ(4B0T2(m>|qO>y涶ƖٳܹsoݺeKB__x!!!E>~IJJz355Yf۶mǍpΝ҅w(*PhA2\Xwׯnݺ#FسgOPPǏ_zC͚5ť]vG5t(.^jժN:yxxP/5@jլ-aaaJ\rrrxx V;gg~MV?xxx 8ٳg%ʧGlْ9P`4h ?C ɑ0KOO0`ٳՎ;ڵk]|O> <RBc! RldPxyy޽[Ҵi?Ǚ/^y?!ҩSr2\]@κ}^zt݀=zHoݺnݺ܃ 0@ťP0PJhlܸqcC%[bŮ]C;;iӦ5k֬XbJ vȑWjJ>dC$FTZYY5hРw9stjӦML PnQ@h>|06$::zҤIaN>#B%-Z8C[5kߺu+))ɰ!j(Zؗ(ٷnݒ!pydɒL1vqq RkR*[lҥ"e(J}a||OP0oF 䅄[Pn%%%I7nFFF?xxΝ'N;+ BѨQ#%((ǧQFM49r?8p` LMM֭ۥKŋx4,Gl~IZliccRj׮\˗TEp·~F&&&;w^~}o޼/ooo>{LR{Ǐquu666qqq9rd@@@vvvMTJq54ܹS:7oޔ*ڟ={|hmm]b*U899{ҥZZ~XɈU].]ƍWT?P@X[[WZUB %Oc! y-:wܦM]ngg7|ppϞ=::/^~ MMMMIIs玟_v>cݻ 4lpȐ!;vwދ/ӣ;8wܜ٦lrѢE׮]KHH|ǿ:t@_H消6nذaiӦ]p!>>>##'O=ztƍ/yg7771޳gOJJw-12288cǎ[믈gϞݿ֭xb9nz˖-111ǎST9Ŋ map7nܐ֮]ZjJu))caÆIѣGl2__߼^߻wozz޼yy 2k֬?0===>{駟j}=w\^#Gsgcccuvy$''۷Obйsg;;;1~䉻u\ڽ{w.\*jS?uThbŊ:;!!A˫?Q@i,t]Cer+88X~B@gF߿Ç}}}A077;wnXXXzzzddeˤQo4hP7o9snnn{Eq{֮](}Ull3g322FU;"999{1c^z/@CI铓 AJW_}uW^EEE۷{Ro6##Ck׮] 555]tGbczzjp:tH~*?Kfaaqc[ppOh"T``j!CnGZn<Qϡzl4[.<Z@?.(A>}#yKӦM ɓ'b`iiidɭUބVTb jݻWRK.]lYZZ *СCNNNG633۱cVh +W޹sF %@"geeoIS1$ӧO^*?+?\/sTTЭ[7~<'Oy>nŋ➺z߽{룏>kp)Ϋ[˖-?P@iA7H&(4Yf.-omm8ҋ 䵩СCO5lQ IDAT_ϝ;#jZZKT*ѣ̙3Z 4(Me}])냊E|~Ç姺vZfM1ֺ̕+Wܹ#%)oڴIm"ccN=J@ݛ徖~?Ko~Kvn]vqJPr !qI B_z8 i̴O>ӧOAppӧOX8[+{ڵk{%@ۢA /OR4h?JoשSG~kժ%=oժՆ 1}tׯ=HAAA[n9r|wM6yj(J*iymC%rHc@ƍ(QިT*1NLL{iA!A*WRlժKJvЩuRk1yV|om  =*T5ooo)޲eTvvΝ;xȐ!Z SL+W5~޿k<<={.Yĉ39ŊQw^^w y 5rNOxl޼Yt颵k%vo-xV^)yݖ"4p@m %%%00Puuz5k2IJ%/]o…? ]ĉ=;pĉu,T 9Ň"?b[` j^='O,ք 6H}ɓ'yىAժUF/-EJ*zcǎ/RRRA0660`lmm}||\dɒ.]_6m9$u֕☘BOIII+߽{wGԩSZ/_,O,(gggX%C`mm]ϤC//֝-;;{aÆ pC]rE5k&5O<Ϭ ݖ%mEիuVgϞUT8FFF-[8q)mŋSN2ǏKqq̇Ң&ME '@~@}XZZ֮][B % ۴iӤ<ѣk^222[|W7m׮]bR:t mڴ111_533Yq-Ek׮5k{Hk]yf BP5fڵ-Z$״$++kΝaQ-Z'yD⬬|hA@ =-0 ƍbzo[[۹sJ/_vss qޝԜ?nH^b"e eķ̌e,`n0/4c0A۔-"$TBY7޶|u~3uޯם; ~muuu6G|駻wf/=ظFg5kkk޼ys/] xuQ1%^ ɓ'k@[B ?sŋիy暚M4>}ֺu .Tynݺׯ޽{JJ `޳)]tYjmO:ܹsYYY/^8s指g}VVVF ,l syyy[hsc-={6yQFϧ;wtu׮]III%%%iiig߾}/_Lr1!!!~\jjj;v:ujLL M1$o...,~XXӧ_xQTTSׯήukuP^ ÇݻwW|!%!8rHWXAW{@@@uaaaV3===׮]+޿tҌ ???zxWzPPXd'**vԉ-C[t7hgϞ͚5Ko߾]&3?[l)UƍLBF)>L]]}Ŋ/^q!$!!lllx3䍗UVʚ Cjjj-wJOE_ BfΜYKt#GJv ]vݻJTǎ/^|,jք D";?)E"љ3g )cBٳϝ;]/<<|ذau?Un߾]J>}XUHS}5:@@}8RALO33[SSe,,,={zy*ձccǎedd(k2x!JLÇ !ʞNC^A j***bbb5PyH$j׮&GnnMh{cYUA jFKKɀ`DDD<~bll<Y_@}1@ihht9**9{qQ !2eʝ;wxJO>sP'C<rR^^A !^zرJ ǤXkke.:#NFgQ]Grss5PU)))Ç߽{ٳg5ѣǼy I5\:3>&- ~qsS,@V~1X{{{eT/A [ٳw9>C. ]jhhp{3 &@ D$p{yv|DB 1Z@ o ?T9~ƍ{V___6ѣuہ 5PI <ëaHHȔ)SѼyΝ;|5b@bqqqzR|@Ǘq{hh;&*DSPA+GҲM6?&DDDTTTI 8uҥr55OfddГB "YKb@|'BDGG#2K$5P_+{ %PNNNݻx)#]VXXHӣ=QQQRC\An!С'&&FYċXYY+k2T[4'UasޤI^gz*%ی:J#^:heTҽ{HPMGGG0͛RFІRl|.]7o^׹VNܿHY{1UF#/wɋPPccO>,x0`ÇJݻӶ24=z޼yA @դr: "JΝSTb*IJJz-p" OٝaiiihhhoqFEEm+NCЭ[7^)[n)k2bbccy=]vUL@^so~?;T7,Q!CڴiceeE{$asD"KC=zT/ގ={Ҟw~&&&"E޾}{NNN=_uȑZѱ8tPIIxv;v=ӦMرԩSIWT666ܞeMT /V۶m5b{HISPABeOdACCP߼ysȑ.]meߟH*O[[+((;wn@@ۀOIOOOOO|ڵkZOnٲeo߾?{ٳgk֬9t/ ƍ-ZTVVz<<<7n,>}pjYՕ5S^^ʞ(ԣ'[9f hh({ 1Tn޽oܸA$l}vvv6mTC?~q6mo)((e)**5jyBȫWƌs{{{NyyѣGҷoJlٲe…~Ʉk׮KGO>099͛7*y`6M=Pc 2ՃprrQQQŚWYz]ҶP(,--%\paƌܷ?,M*޿ jݺ… fff͛UV={R\\!$--m˖-=$yyyssK.uЁvZZZΝ;wرNNNt… N3fLǥSN7Qi NF @g{1?A @b۷WLTj޽{uv^ߺu]\\/񡡡M\M5:z(cbbl2v(;^}b_oa& bɓ"n޼ҷ~Q2ȠD@1Ë u>}n߾]^^}'P{4cllܼyseM=uG,;eN&3آ9e8p /~=4iBS_t-GGG+LIK133cn_ao )zƌSQQ!eɓ:n8Vr ,,l„ Rx)޿}Tpyջcd {TmdddJSjjjW~9SN浞RV$eeev; mkk+iU d8166mw>11155͹Fuyb`` %nRJ7+v233YYf&\%mmmX[< hԨo1dnx.=z{nee$T@ pttmh2nݺY~"pYPX܃ * zEEEP}ƫ/#VB @$%%q[nuzɉe%pdΡZhaccCn:::޿?;;1p@L[܎kzU.뗖1܋Ì'OqSg }Tv Haѣr/!ZW=b2a9 B!K/iќD~yNKՊ###֮K n#t֮Kׯ1Դ.gyh)!')VPzr6mXZZBJJJ޽K ,8KdW s;;vdwJOEE@ ˗/罚c)of]JjѢE֭=( Ƌ )// 1sM8Qٳ#2Rprrڻw/!yyyNJy^--gϞ,)vڷoߴiׯ_BN>rJIgy-mW|_5|Io?vmD"*)))15T[jj*$A @i[5nY@5 h)%s!DKK?w !7ٳg[%θqh;wT:lallqm۶/4>HۣFǫ`H5TTT{1KDСRf @鈈^Ң6VyԔμyi'..N|̡CW_})>瞞'OxxxBԖ,Y"}5GBCCv YYYD"^zM>=((Xs8z_߯K իyĈ-[Dfff+VPGr{P1-ZPdTU2׬YΝ;B?|@166.'-+i۶5kh;33O>/Ͽu֔)S&MTQQA/ZHҩudff'''_{,=΂ TK IDATաC"bbwnժM"""RRR󋋋_~}={=bǎ RTRRl2 o>(W\\q5kִo~̙EEEʝ'/!SNJ IRR]v@YPUm ASSq…iwUy͛7ӧϜ9s^*gf=QM*nݺ KV\45C՝;w֓Q,Z? 6tMWWWWWO>; ?^[[ғ888B'OܼysHԮ]%K!sڵg=T@ }ƌGzjΜ9C ɑꡢ"WW׵kJ.++0`@-# "j=b@CWRRqF~q 9[nرcРAO>U>T-KϞpKm۶u2Vm)vc)j׮~~~3gά%==ȑ#Bd4hǩrٳg?ʕ+eeeR__x:#oݺ#H*W1y@ Rt.\'-l 0-4 jܵQ̚5+%%eǎ:::VVV-,,]]]}Ν7nܘ8qfFׯ_ɓ 4,Q;v}ׯ_eAA [Ye˖lիWl"xyyUf'޽/^z۷/999??ѣG[l133cN8q%e̔T]AA/=ȃAZȘ n|,,, ? $! b{nҤ mW3OGG(׏JZ+iȰښ#M&444XӧO~ʷDb~)7nأG_~ѣGyyy };v۷oepz>}J,Y?;uT&Mtȑ>>ŋ .ZfMY7CCC==vP@@ @N(//gKI@}U beeոqc ##6mڌ5jo޼:t(6[nM!UXXKڵ?B 4k֌lshϞ=iݻw[[[[HԢEo߾=''icvM@#ZZZC3g8߾}+ 6Noؘٳgw@KKjĉlرcxZ×rqq^zH/i#++k:-[.\KLϜ~`Y}Xݽ֙޿6I1ǫ q邂6334 7p^z}.]JIIy]ii۷o>~ĉurѣGLKKW^z}r .u} 99ʊtP;;;}}}nmccK5իW5k^x+Uhc4% \e5ڱsŋJJJXYYYlllll={!mڴqss4imuNԡC^ɓ'{Iڼy1cj7;994?}@ܖ-[z"ܹsܘsȑ.]u22IwUOOOI jjJ6Kĭ\%#M̩ ^2?^ @MM4;@^zfJyyyߟ׹{/^'Bbѓ'O?† BǸ@hhhii>g]z i[R $$hll\?~K4332eʈ#zI:߾};))e uVؐpܺu.`YœϰL|IU!M^nݺEkZF=֚e˖CV{ckk+i)KT^^NW:t6<<|)% Ҍp2ԢEŋGFFfff~7} ֭[PP7nktwuttdYRrg4HUsb;v5j (Rbʚ ( b:::+W _B%DFFҊOrKKKf{ !zbY6*++ݻf͚M2v^zwfF*렠 r4qDI ,UǏGJ\ -inMIIYnݧ~ZiFGÆ O*]ZZ[222sWYZX\=zӦM]bŊnݺǏF% ?S)>"[)SdeeC@Rh7W U^'OHFqq̙SVVF{f͚k׮ގ ?(TE! ?!޽=owu߿ԩ}el5"\]]i 4#c>}hgff&w //e{ %%eҥ;w)kQwޒ^ 'N7=`aa!}Kl7r]r?~}YuNXE+/\-ZZZV`K%%%SNTHD[[[iMLLX\nBȎ;$޼ySS0/^888b @f͚;v"p{:u꤬;;;=Jۓ&MZT;zhBHaaadd˗O>B)tSmhhh5SHT&MRԇ/ER޾|R. [eOA\]]ann+W ;,,l41]||k(>"T@ ꫯ˧LrJ?kDJ3,,lܸq,zw^//]HVyҲ=zt„ ׹sgjٳg&1GMMMOOf*//?{իW92bĈ*pn5 2DKK,44tԨQ! b1rG WI Df͚5k֬w_7MW_ @Y|\7򪍍M= !ǎ۶m[xbff&mKv- TK޺ukΜ9M߯N\%խ4i1U^InsrrXϙ3gdHHH`bV^|K$^ٙWrYGLݻKuu۷B-[·\:::C)5i߾}_~eii)= i뎗ұcGD<{$b\@ ڌ36nH۹cǎr劔eeeSL0aB&&&#FشiU~IBoݺu֭ !/]zʰƁ,,,aHHrCu4AcO*b޽{}!ne꼑e՗mZ}RG$v꯿4-Z`jP666b3'8o<_!VUr͚5ռTե*ױ RHmSDžS ua``W\w^5]FbeZQ]v6MOOߟiFB`^К^kϞ=g_ 6mZs2^ m۶jjX) dΝqU8ݻwk׮m &&&޽{ƌ 255e#Ĺ$%@ӦMJ yptt2;s5lْdr*c>###n܅>u]O,M}p{ϑLL>-GDDb߹s衾% ޶mۇ*})&&&00GU֭[YŸM6"+H$ 6H9Պ+]y;BH~~Mv(++KJJ9˾brBH޽͛n޼]:t={Ya.-=$$_&4k֌a]NA{ Ge "Ï\\\7oN'OLKKcy%UZ.>y򤔑Σ/!$9pKsbɒ%0..O>߰aí[Ҋrss={v[ZZhoVJ瞞O=yãƝ@5mtʹ]VV+Jw߱tV |cǤwpp KLL')"{ܹ3=<|+JoԨ{=:aڎT &&f޽׮]KMM-..633;ƎK\9sΝ;+=CNNqŘ7oޔt[:h)B7RSSWZ[ccckkcN:&M"tÇX??k׮=\ lٲ_~vvvuPRb19C g߾}pǏgˣ...FFFل0;;˗6m˗۷o_PP/Iz"#Fؽ{7!$==>`;gub!!!mU矫?d1VMϞ=',jҥ77nܸqFתΦZCN0ȑ#.],],;;ʕ+k׮m W\%e})jh %ɓܞ9S-!dر,G !͛ϟ?555|X[lrJ__*Ow%ʕ+ϟ/VZ^zR__ߨ(l!D ڵgϞK,R)cǎv< WG^^ެY>r1coPQQ}+WӧO/_o]t){>R>tpp !iiiiii|ȍ7.Z:!!!!!! # quX)- cӦM&&&]\\_ӍTTTȑ#-,,ZjX^^jժ~anB6jԈ7=@YYYIگWkZZZg˖-e{Z)d1ֈSN={2n]egϞVܞ={X9snZ$N8;6^ /!?ҋ1je8ul/v۷oZյ}BPCCظW^3g|0p}I*?,F4!cܹr+V1BdFb rBȖ-[.\Kœl0ٞJ2kd„ "Vgqn=}tyZlo={Y}}'VP(\j?z7"R|V==z4+A*[n;v?~\ٳ+Ξ=ѣߗ~֭[;w>|zNhooԢo޸qcѢEe\^^^ĨGFFa1Bϑ#G߽{WZZݻ{b]VQ+mUѣGE#mlle˖gϞٳܜyEIg:u* kijjΙ3֭[߿ˋYx}tGikko޼9===+++((/{… !k֬IJJ*,,LMMݲe U?qDIQ*/$;@ &p.^ŋp>\pa=5j$ v:k֬K.?}%|D2bP(&c @SSȨ]v}llmmmrZX#FFF \%o#""fϞmccӸqc--mN6-::zŊJR3g𶋎?^Y3f 0<<ʚ 7/^WX.ϳ_ukk{͝;UV"bԩ߿3\|U0j޼yDDĶmnݺ[Ν;Zc?.|͛gjjjdd4rȀހ2sse˖mV$YZZΝ;ݻl]… t!=D @P@e%''}* m-Z{{)=wtR>R޽{ݻҗXԔR}RΝ;w*ԱcǸ76n8nIhΜ9Ji AC144 ڵkZZZgXlm8q{c:tp̙O?׮]]S)Y444SzӮ];eMs YiӦ)w2\ZZZ@ T삉fm^.s{ƌꝂ֭oRNcċ(fOZZZXXmHZ422JOOѣGKVΝ?sNJJtKuf>y=zH'mK ]H=@QX1 1t9K To]g]Po>}WJRA!(55UIsر"rd}Y/_f*M4ikV:FSq<'O* 7 rTB2#Jae 1!77wӦM={JkE* K|#GT:f׮]cǢxGxРAʚ (w]RQQ!}hhx1%cmI&MXYY?|\޽;{F ~{хd~G/ЬY3}}}eM@ @eDDD<~bll\Z3c >}zdddnnnii˗/Ϟ=?WVLA޽{wnG Jt޽sܞ?CYzN/hCWWWOOO`R7oІZfͤASSȈn7n,$mmmX (7R15e;;po``܉888̛7ӻwo}}} SSS777V@[[ZR\Μ9C T2n%TIHHs玲&DVV[wϧ KTA>І@ $KTJJE"m~{@" @ @e'+Xzرc26o޼yf[/{qMggg ɓf͚ 0@Y%8q"/{zۻ_(B0jsi~[༼+- w#iY)--ec|G)w /P6m515|mjjj 6… ˗/W$7o^jjmFaaaިQݻO>ŋQQQݺuS4NrssyƌlsRe^1 -6mڔ6 ߽{'}˗/;4iB*((Φmnʒ:5:RT^nnnff&1뛔TTTy!C({FUhҤɜ9sΜ9ٳҷo޹sʞ =cƌQd@&M=|ŋ5xd۶mKڲvLL999lŭ[_.**EdhڵkN; \?@ $00{ؤI*i.|cǎ W@=z=Td&S)e(2@h 77w̘1!!!HU\\PL:1 m19rX޽{]KYYYmjj* 7={vMO>}5z eooooo/ x=(jWee){u%H\ pkVo =TsZZZ@ YFʰhVpb@&M asŋ$"ؖW+^" #F(k2P BuBHy9ybjjFR^z >lbm)NʒHwq{066NKK#/_\Ұ۷ӆ'|Ǐs PTTnmRM@***N:qrrjܸ_|aÆr=ٶĉʞ8^E JCCCSR^" @=Jy#G&L >f׮]c60@]@ @a -(iSn֭[D*i:4i$ׯBr555[n9̘1O[ZZ˳gϺtիBsb^qs?**l7fX&HMMMY믿><;,++۹sƍ8%g@W6BEE@`Ԡ++{n,hXh45bG(A>*eagߓYߧݙۂe90`ڴiݻ~|nݺRҡCYf/)[nݺﴰ8x`Z d @<oLȺ 03)R)~AЎ=JoŅU3gݺukҤɝ;wԕm۶2lmm 7*`ڵkkԨ4o|}!0OǪ࿩S999;wd C8Çj0?( ڬY>}~޽{רQR"7m:sh!0 d ɱcǨJ`` N@FLV~WϏZ.{nVL&v ap4}Ǐ?A@,,,&{YBBBxx8~XJC !+111IIIѷxo:Ó'OC,0$dB++++66`|ԩSMMMY55HT;j31'իǪJX[[S2v&'NV̀P8DEEݾ}U?4k֬qdňF2*U8::ju _lllJNNN*Tz-ZjdƌTeڵL:aka\\ܵkX5WTƧ(99ԭ[U3u/TL&$+"U? ZjӦ 9H*44lI1bݻwlْaKz#⃀g̔V$Xl$%%Q~`!!d`߽׽ }7d W^yf-[ǎϝ;۷o͚5&&& ҇8Ԕ)< !0 0 _qC++.]j_~^^^d?HMMe+^l" [/*Vf*!dbfffffFV(Jj3nݺG,ϙ3duֱꇕR޽U3zBm 3%L{u#C;T@m f[_¸q\]]ʆ *~~~...d%44U3@WNx.-hIqƫ_R* t{WAT&%%d wC#Fŋn"+1335kYںu+~H$_|Y9w\zz:~tNR&K_J_Uix7|2JKK'+ LH+m* {{{0++U'Z8zR$+}a W_}rLue͚5SLdؕ :_UNT;T}ʔ)~Yo~xbq͚5Y5P9a =ƆW D^tӧz%j'Y@s믿!C6l25j1ZPi!GGGHDDL&#+{f ?s1 IDAT3g̵kײꇉCJr!*033Qf4f_{P ;XuIѱm۶1{l5kddd7nܨQ#ʪ2OOOF b˖-;> P9Q Y59RIVz)b!(;;;jիWꇉo߾>ftx>(<<|̘1Ԟ瞞ǏfQ2ޡ2㲲tP.oNMM%+={d ӧ7*Ȋ#\r/(..&nnngϞV/???== 0}ZTTDV>V͔!'''00zĉެ ju, '''j2࿜K.=zjɢEȊ\.*mȐ!zg`jur|w%RtڵcPI#f*-dcbbbccCV^~ͪ 9sF.l:7rȆ }]xU?Vzۓ}꧂ WΪ1cٳgu 8III!0 *iii:5ѱe˖c%H~'T*̙#BJMMnBe8悃lB曩S2@u2>|%N4ti{0`5cՏ 4Ԕwm3Çϟ?*kժUL(j?dL #d ,w}9Yf'";wn~~> Ϗw~ C" 0={۷)${V D=lccsIwww&- ;:vT͚5ϟCrss/^HV0 iTq2I?3p@P&߬)jD8YH$رۛI? )111m֞={j*qƵiӆŭ]U?ѡCUÇj\;0vܹqFxAC}ζM֭Y5X,޼yT*%K.MHH`ՒH$~j=?Q.]4iUׯ… Q2l2dggjར:j*9ooﯿy#Cm Y59/O-cjҤݻE"0VTA@ !)*x&33Ν;dK.8n>[laՏtܹJ*dEfr|Ȑ!iiidȑ#VVV=}<]6F_!;w52`fÆ Tq޼yIIIL1THVN:ǪM( Π33gRK҃bP )ϟd !)j4RlQ8995jԈU3*}:t(Y7nRdՒ 8*11}:YQ*ǏdՒ 8<Φn5e˖Qŵk6mTOWjXCk| yuׯ_l.$jC`TΨ8dXZZR60wOOm۶r@2wwwTʨ8daRRҭ[X5F9ƍGmx0n8j  a3>@ 8 d`xw&+l޼EdE./^`ՒNO,׿y YɝYf%$$u/?3hGiT2@Qm۲j@W:TJ_d2V]U\jZjEV t1!ԩS۷o'+&&&@;2˗dP@rr2D6QQ4ibooϪ8r䈉 Y5jRdUۗ@ 4055%+NV9sȑ#bPPЁSqkذ!Ya<{}Ò'Nj3X'NV&uaƌZtx0P[ܽ{WЛU\tdgg?| #֨QHRx}d2V]iG$ȼ}J'F˖-ëW*jC`jL QZ~}߾}7nȤ혘ٓ?~mP]ΐ?qDʕ+1<{  dAeׯ_/..f T J0* Dwһ_̜93,,IKڡeff^|=P.\3yDeժUc FV|jV۷o 6رc~%%%#FYϞ=MMM C3k׮dtǎ­$''5kĨ.@ -[+-@ߨD"f J*ԣnbUڶoߞ+(..4i5hؘo?N֬YU'@A @ߨ!wttd u9qℕY|m^XuU. 5!\ի//y1!d @Hq@=A@P9h"44 ;55{pngeeQ#4-[FVb֭[FTPF VP߽{U3`rss=zDV0*?痝ͪ+ թSO?%+D ʓL>=//L6m۶ tIPx` *BH Btuj7;R9rʕ+;w_XXȤ%QKbbb ]O:uQN- HKK+**"+4kĄ`KwyFX5sΝ3gU۷L&cҒ @.>}0899}S2l̙Tqڵ: ta 7aP>37nU6lXqq14;;;6p@ppp\\YڵAt2>C 00XVѣ6 D"֭[OՏ92n8BH$dɓ -CM2ϟZnذAǝP@*U,--Y5d矓x.2DұcGk׮ӧ3iI8K.ԟ$6mٳ4h@wb3^A 0:t*111L:F-,,,۵kG7m4k,&-}T=ȊaQw?:$""jF}g;:d @`֭K@X5F O>a YYY8qYfT}ݺuK,aR٬@AAAff&Y)`QQ_M׭[x!ۓ@ yb1/vvv~)U 5ѣGzbrrR$+eظqcBBY+MyW!?C KMMe 7n-Z` URuԡߘT޽{Sp^5eZt)Y133۴i^:)((x5Y:^A <7pNXl!nnndQTN2eǎzڵk7jԈ:uJW2~z Y>}zz˵ ԯ_Օ`͛7JVf3gPwJIϪ'\]*H'OP+'͛@Wtx k׎}P* L *jKB0&Tejjʪ߿hh(}[n7odՕ?yx…w* /_NV,,,,YN@^~]PP@V 2jܸYA:Aen߾],?{q=V]q(**U de/^ +SLqwwy'?w:Y@ @D"Q=JDDDII ~8rjwPd_^zեKQ[vtt$+DnZXYY͝;Wm^o gVVvAKHHdd5f̘[Rfdd>zIKϏ o߾]f U;;oF < @lmm۶mKV@ݿ}U3` t+((h…T1>>[nn$666''GW'Ƞ6Qg֭.wa8@2akԨY8 К\.OHH +tnɒ%sΥwٳok{\.tur ;yyy[l!...SNueLxу<嬚A{>Ϟ=*^vGk9sFW'ƃp3uVjw}gii!( Y@< @-޾}{%V̀Q8kذ!Nի'NH/]ԷoB H:wLVt8M F._;::?^W+!!d׵kW333q@*psssttd qD[l6lU۷/5I_Ǐ'%%޽c8}tkkk\ H$A xVVV۷'+ᬚAÆ$w5h 9lذb@Mt7ܔJ5kȢ%v4j777Tʪdƀtݸ8V̀p=|- &[@84h}mueϞ= , W`0V&&^\ĥjRĄu <#G|٢E+W FOOτu%::z„ ڝC@.]4h9o@(CÇܹӤI}\+hٳ83RKq-"wpz~]9i…_^~=Ym4ԗVjU///y;H$9RA@2#4x`KKKsNV̀ d{?-NClmm#""իGrAur ___0::'y:6mԩSGg2#dkkۯ_?rĉW^/;;<[YPJp'''͛oݺUޓ7"#Ceά!0NG&˨="77,-?^`^zaaafffd}-**;u$HȊJ2558p`:2WWWjC`|}}k֬sueǎ3f0-MLjekW+ J%Y[@k6vzlXuz=k߾-[ƎKcbbMV-5kv5u%::zΜ9:Irr2Uݻ7vZA@| 8QF-]T]{nlll6m pu+] p!(fBRzP76WgFw̙o?>3fǏmۚ6m:y䊜חbbbLMM5?ݻwʈ#*Pu:, 5vX_o>SP+V:UvnݺEDD+XfM*Uv<ɨ҂I'9H$$$ܸqC]C ~ڵkgff&#Xj۶l"?׮A65H2A`&MDf2l׮]gfP @daΤ(KKǏhт̝xE msuu555]v޽,Yr}],.*Vzf̘A`}/w= sիW?x 5͛&M;w&ccc5~ X|`?>C`$رcʓ'OC}:yP(6l} L&{˗ǏO.e?G>pYiܸebcc_|YTTs޽;vtޝ|ۣG:wjjX?JJJF+ ,Xb>^C QkԨ `&&&sqq!O<7ngk߾=yx~*++KQ2שS-Z?3;;U?D>>>۶m;x:8~8aW=zoݺرc#""n޼ٲeK|xƍ=UׯSϟ?/@u`ӦM=z077wǎgfQg„ !aaaC aےn%''ϝ;W}عsC9::MƎ;V}c=<< (@qqСC:,^8((HW:u?oEɇcbbYCiԶ׼Aȓ3tQʓssYw!0լE:WWWw R2dȼyԕ7Μ9z\ȍd6sk֬)PF=zJWzzӧUE- SW.]`^H .pٳg\>|7nk|ܼE/^TW4@I"Q!z0.@S?ƯWy 1 @X0 R033ꫯӧO<Ȫ-|'"H 3+==}Ŋ[VyZ|}}ݻ'1cƔ}7oޘ޼rJ,lr۷k;v7{snPQQр`ʕeݺuSzxx|=˗/Wر),,RgӦM}w^~ IIIjR+ I,ٳz,711qԩ:5ŋݮ- @e1esssb RɪH$n|P}ן?˗322d2ٳgϢ'OܰaCX5jԼysCTO#FTC8|~~굯O>NIѐd}7^灁ϟ?{C FGG=OZ{Iǎ={:?~ppp WUVݻw/k޽877֭[eך*''ݻwd!,TBݶsɓ'YS^wUVڇ޶lٲ &}_MKKٳ7Ȣz#GCHHꅯf?~$Ǝ~ 9}dNRW֮]ߖ3gμe͚5Qm߱cGE-["'0;.^*N2Eq=*ڵJ584&&dffj!T?x@%2o<ХKjnݪ~]Ζ...˗/QAAׯ<ClǏO~dذa7fΝ:g^5J{O˕zVCUVUNLL-VUxP~~~޽4bڵf=<<7nz … 2L}!C>}9ǝ:uR駟~駊Ν;Çhqkkkooo-*dgg*+ԟUD )`O`CPԭ[z˚lܶmȉ⥵i}͝xzp֭>att{ڐ0"kkWGDR^^^ڝDAR_RĦrssm 2224ztOtttA@!J/KHHPHN:u/_h"`xbx׮]d… gQ(eիWmrU*&j3TZJV&T.Wʻ Q Fѣ9=""-Z`ϳgϨLlR~+ GЂtr&FJJ =znܹL Tnܸ^:A@baa~]ޱ,  s׸qcFJrԨQo.PZj8}t۶m_TmIZZc;vSgPowڵf O8o>uE&9fرX,&iԨч_ߖ/_N.gebRUeɀ^|Ib3CP|dT*9D"ټysp׮]}:R׬Yq\||KZnMA8F| "#]rdKKr}V{DM61;))㸴QF:uG$kǎǝ9s4**JW ==Ç㭴nݺ5sLիW#۲eKll,9ݻ˗/cÆ ߿\paʔ)}L&S'ZW*mZ>|ؠA/!?d`lG>}Q *SN:E=CM40aBoЗRzzcƌQ믿/9rd.|ׯ>}>[*dΝ'O QGFFzիWlC=׷jժuQΞ=4ޞecǒ?Ԓ!߽{75jlŊgғ޼yu Ay*...: !-[FUt!Rѱv]v]`sn߾]6jZOj޼ɧYϜ9zA@*͊ 8RTܡNu'F:lӦ_]`k>*)))^t҅#;QhիTzG*ڰa-+:tJQQKJJ  YZ IDAT|R6ݻwlUƪ2ʨ}@s C>r<33311̙3K.|{ro߾U͚W Q_M_os˃kjժeccS+18DT,,,;ֿԪU+k\>dȐ2Nbiiqz'ᤤ$Lڵk׮]8u&tyoqH$:uB;vlAAg˗׭[\reeSNTŋ}gyw":API-],\I'1l0vR;z>pףGk_w֭|V(I%ZҡC"JCBBK4'MTyE.]Ts^~W~SSmhH,oݺuƍӦMSUFr۶m4E}~իn\tmpɓ'{yyY[[[[[7lp̙?O8!D"QddrF8ɓ'?s~իgooobbؠAÇo۶?cԿO6h'//q!?dT6m"""XlT7LMM Z::: 2^zuV! Ǖ"jNիn:}2SS㢢T_R/RJ&MTϝ;|}}˷yfն˖-So/nݺΝ;{p?a„268#]@@vv}||~=zhM4Qݻ{zzΙ3ѣ o߾-..~Ǐ;qD77 .5FZ!dҥKBgϞ]\\̪>PǏ8nΝJ޽qQ[[/R}8z茌 ?[RR2lذ\a˽ qǏ۷믿~чڬY3눈R^yjzSEmVz˖-ת@.?W^?Be'7V[իm8p_-**o cveݻwK,i֬ ӛ "dWՏ<ߜ{q^^^ރ-ԫWr'upϞ= zѣ~A'`\92gΜ} {w[0bĈ^nٲ%990))_Z*q۷o/޽{v޽ޮ2ر#9yfBqdכ7oVGn޼ٱcGr]:6:㜝OuJqΝٳg **J=[JT[8~Zhꪫ׭[zfU h$+?ߤIuHq@ѣg6mzΝ̬VZ_ݻw6 SPPp uE*0 $$Ço߾YYY/_^tzq)))4@T`oooaa2JAlJ>"yѪVR:t^;sLr/_߿iӦ+WvZzzƒn߼y+Wgm.\:h'Gu{w> ؗ,I%-JmQZ䶋M7%K m";)UڴhDPʭ$*%K}~ә1,9,q>0,,'O2d 555AAA$ ӧOGS%''MυHHHg322.&`<7 sttgΝfUUU 2,--=mڴ={|q۶m/_8pQ!^ryyy0SRSS2e :ƺ#p̙3+WdddڵKSSSAAAPPPFFFMMݻeÇOHH@K[tY{;qFSPjjj \t):; s!vaoASSSBVV;{)((okk90m[v='PRRtjժ#F]a.z/_FDD`扉***P(ܹs'6JFyz#@'//OR[[ʫxzl+jرXV}}} --mݼ*kΟ?Aظ-jRRR5XKԈ#ƏxA=*** 襶lgRSSϝ;Gw1!PUUCXsf` IA###D???,} ~&y{{O8WWW_t!rrggg ԩS:3ի) vn:]oΝo߾]r%_'MϘ1֭[7owk&L}?#4P&lRVV@ǭ͜\C&9B"/3g$-s)V0.?a„N HII ֤D"3LJQPP@|9cccIIIaaa%% 8pkxZMMMLLLLLlر?~d# W^0-[Жz' ```.\zҥ+W3FJJ_LLLYYYOO+33ӧ'廃|@m۶ ODŽ5 e!L& q( ԩSqff&36 %%%tr:=9G8E*""2`Gzwb̙ӥ gK,ˏ?t2njvƂD''#Fxzz2hڴiYYYuuuuuuه?牐8p Oz 6?~<==IOO?yM8q9,211a6=V߿SXy <ϼy:AlmmmmmYz'htT7>:tNa]2p-fj*Nf^[A7VWWc37o5ja3>>}D$IXXb ?r>(л%%%a v||| xyy2111BBBWttt_𚛛sGT*aSzAȑ#;wwF~utlii`8N- xDBAA?BAZdee655q"nnRzƋ{Nd; jܻw/urrz9 777,, ۂkccC{,X[[O4 ?MxY~Ȍ3RSSp  dn{8ppɉGP.=>:}vG٪BBBӍ砏Aly;w.}q_ ndd@qdddvIO:b myӧ!~̙35ê\ٳghkk 덌 ={]]]MM [kllnnNbHSS[0a;6ц hҤI 6*$N[dɨQ/^Џ! *onnnZp(|S A [©Szxx|ٳ&L@;wtfnnǛ}ƅAOGϟ{cyy9:we|;^DDdݻa@?w U|5k}{ZUUKURRLOOnll;wܬYWӚоWTT#33ׯ_---%%%ǎcz!!!###tLR~߳#ʕ+޼Gu#ccZ>}t3KA@$%%### !*gg}||֯_/(((++;lذ_b/|}ѣGoڴ)""=<~x~~~DDȑ#/++r 6caa1l0B?A"???WW׎鉎ϟ >ziiiӧO}oUUUHHHW?^ZMz脯233" a]ZЃ ʫɫJ@>>xܸq'Ҟ={nܸARDBz##"?|BC`r@tBHH(::ۮzCx`1 'DDD3>>>hBKW^w!<118lիƣFP( Zx#G Aݸq= ;:nooӋ-//onn.,,}1~L&cغu+:.,,:uǧOKJJΞ=;a„Awfz/蜚ag<t s~Hn@mly8---3_~|2 SLggg#***)))'Nd-jjjO<騗={6oތ-]TVVB :ڵkKd2g&ֺ=B(((dee.B@@@@JJs; )[nEbZZZ̐:~c$"0 mmpZ\Zd^rvv&<~*:eB/_"#GLKKۿ RRR^5jTGkH$ґ#GN:^@KUU511̌%2|ewww BvvvCe! ''GQ rwܹ'!11NSN<~22oxSgX݀J-=5 %?v6-`1:(((n8}#FC7 ɩΝ;fRTT0`ڵkO:UXX.(( "##WZ"))/))nffvLꚓ2eqqq 2|5k#IIܹ'E~^E XT:S1vVYY!8𐃃CDDD;.S8w)S|!  ǖ }ҟIJJJt_-..Qz/ l'OJB޼E8=ϤIС͔"<9Z@T߸S}30)8R,/-ׯhk*t5۶mKMM~:~R066d3yUϑ=s%mm،hjj<k,]=IÇQ 'NxIXT%1^@wl߾͛!J ^j~McccVVCpUyy9r@/9]C">|M677;_ɓ &0@cРT plB`3gxbKt _>`mO{ |/ ͚5kڴiϟ?f222x{jkkdoHK#H;O#A^ZX: Š.OVWW*ۛpܹs?~̣p:A߿ æ . >?[ආ^n}CMM͛ ,׀.((={{FxNZZwƍ J}Ɠ+ 11۷o+))'>XbΝ_~ff̘o ٨Tj*C7,w[kllu&ٳgGEEo"͚5+>>Z~ɓ'={ͼȑ#i{Vl޼˗;wnҤI d;;۷c3doGt! ;gg|}@t/axܹ}1.!HG!݈98;;oٲ0YYY`/$bҤI;v*to@jj*`Ŷmǐ066dee*A:PT^C&W^mjjZWWǓz///B_JJJZZZ3f aspښ0'ȅ L'67ST^GnVH}:tgN2%##'0ikkK{[]޾fB`+W ?>@0aMMM !=T*"99ȕ+ȁHZo"hnju> = ~z lMMMkkkIII^+QQQOٍB0{ǔcxAۘ\~]ϿÇ:ugύD %K}}fb{`fմ?yݻcy 1;~ӧ7lm۶իWS(D}VVVLMMsx}555Vj-$Gaju{ѐ!Æ co mmaSΛޫD^ OT^Gc9t3@9l6lذ$777???ڿ333wmccqƁ$H.z?oذaܹ< |O-[|?=%9Ywݻw ?Ƥ@MI `ЫA- G&UTT.㇋.\UIHH&{Hs`&{FEEV>}ZJJzuu3g2MD/]?200`UT*gkiiy董3F!**JP555nܸAt /^$ϻ+1xuuu*!!A&Fdoowz*C[hQWcx vd'O/>>"]]w߿_BB33.Z((((++ArͺufϞ U<fTWW[YY&]]]̙=%+ٞhnny&~fҥOSp]TjDD뛛ӏ=:4$$ JJJ>ѣšwﺸ?^[[ѣGdҤIءMqq13otvv~5:vppF rrr6lLcc{mۦ6tеk=z4+++**UH(f8::g\\\8G244cf%۟{nEE~ȈDNDn- xeiikjjXnvcT^T]]]VD(C[߹s>400 <Я8;;WVVv]aaak׮Г4|||gΜGcccO<`бHtt 'pɈ#:TPP?|pfR^^~]v͞=[RRrƌ۶m#4] pÇyB HÆ7tww?011af{s o 5HTR[̭["sqqq4}Z@JJJزǏxiVZEs,XXX\tǏ?lnn.--}MHH+/^ʡ>nݺ˗/tW]ϟapp*ps^^޻wvA!@KKKZZZPPЊ+GiiiyfvF-[(B //?m6Yϟ?xNݻwk2dl|Z[[?~c;;Yf? hsI&۵Zj9 رcG]]U''_e&&&455ʈPX) N8QpRCCC|ii/_ܹdffCEE,eɒ%aJJJļ} ^~J\\<**jҤIӨ(dddN:}vڵh"OUUիuΝ;ד9j)֮]{رׯo߾}̙LiooOJJ2dƍ_z逻m7o899$R>{… ڵ+Azɓ'wdc-_~g ure˖ݻ0wǏ3vHKKc@0+ ;wD"H$7o,--UUUEEEƍgaaٳE{KN~~2777;wXEEERRRXXXIIi(eؕȑ#x֭Z]ٶf``9Z3s/k֬[_ׯxϞ=g\9=ܲe8ׯe˖ d'Ojhh̘1ҥK,!^ѼmBPTBi&Nk֬a%^?[`N@xbLkkիXmJ@@@EEߺuӷP(fg/>pƱc>~X___WWÇǏϜ9sŊO9s`7wOcƌYvmtttnnnuuucccAAAbbӈ#<==cn<~k׮cǎ}5;;[JJo1cƠW^= Oٌ3 t EKK999)NKK[jɓ $z ???$Op֭/^g̘all=1&صK |||ϟ>|8~xݺuLg lyy9s=z 1AAANNNmmmt_zϟ?rO>͙3=ܻw72///CC/_tt:WWW\i||<Ʋe$%%ƦMn9{,UAlc W2***111eeeϞ=۹s#捾 oOvZLVVVpp0à[ -D jRRRf]9TTTg]%--}%B}D& l KKKl+tuuG蘐PSSEEE===?}˗ tMVV֚5kX>~STTzxxxxx.ܻw/z9QQQ''ϟrss°_\cccmlloG;zņSbO;::bO+++,28[O>;}QII 7dmպEyxx`[JuVzz:~rʕL6+ų'0 SN $L޽;##@TT4>>~ŗ̏O|= HAAv[ȑo޼ٿ8B9ruff9uT||}:arݺuWI<hA@_۷[n͛7'/_z1.555BsZGGGn@[ ?Ƿgn- bK֭[EAogFFF&cczod!zAFի͛7hkk{ѣĞ>jԨ[z ܸqJ2dիW{NGG=ܿGeP(FDD$::,aСݎϞ=>>}}wޙӮ\dɷo߸!-EEEŋݻǵ|B @]]kzO:WْHJJ*--@! X6ḋa}JBBȑ#>>>SNS/t_?~djj_Ѿz]MMLQSS;;;*;* BQ 9B6~~~([>}A``ӧO>L6ɓ'ӦMCg|*~~~N~(H$uA{{Ѯq~A'0a6~!wyyyQGO>m޼;>eVXAw~B@3gΔeԄ ---]/uB>| xzz2. v}[[[5bbbL^wP[[[t&''ŅblM=].\cbb3455aEl2|A9Nq9/WNKK\Q]]w9D ?a ́;@G8XWBrVN ػw/ϻw=J{~q~԰qII 5c7:2dWGmڴ AooaÆϞ=],##%dرƍCeeeGyk~t,))@$!!ü y/nuQ@k/gMMMsss(SN=zSpp01=y2 5|&b1p `/AA'Nhiia{]r~%+$$$ƌ Ç߾}0FmᯩQ::˗/1_d @_/VUUƏ=ZxqW/BǮFvMlptt4_CGGgΝ;͛O28:p0DЗ!QTww`%n 4iǪUGخ}fV^}۷cǎ0ۦMfaaTVVڵĉe,rY|zKKv.HBc7on߾W/](ʬY4ŋ_pAl777iӦ {.\%((؍ [/\Ν;̷hE`i{yy%&&466Yŋ:"O:~aRHHaG 8JMMm˖-z'''.A"0Xu PTܝg_ۊ///BϟgX xZZڌ3'Yn]ll,z(..>OסCk׮e˖u@SXx*B144DEEE~~~ NꊵIHLLĿ$$$=R\\w_~1ӧ آظ=400]&((xy͛ݻws40 @@&7bIII7tuuGh|ʕwvEteA9@CӪ}xyyg3,:t(offg͚󢢢o߾ݹsgÆ ;s ٙA;߂###G7 ѽ|||l-'' ?v؁ݻwww?~8DGG#7nܟIX8p;ljjRTT4119{kjj˳cbblllTTT]d177txԩV7U"00_7A@7ZM;55uС9s|񈋋cM0jL ɢ8q-@_/;vZnO6g0i&MMMLJJJ\\v>AٳtR%v5}!C 6L__?00jsٹs'O8ٳ%%%͹&MG8:: qVV;UuuulBOO/66ۆh2N֭[<󦦦Ǐ ɲcǎAIIH{oC___tw|'dZ[lYp!:RO.q5}t.U%Xfܹs3>} ĵh0e2 I@veKZZZ~R' IDATݻYt)??_pp0᱀ݻwcY^ի֭һ,Yr2Q#ٳg#cjj@PTTTvލ222v䴎=3FdϞ=7o.]*++KPj``'"ǏGk۶m :Ƿv>u鍝*--511*hw0HH,OPXXHpN c?~1{섄.*=5OO/_BUUU9uᤤ$&}}}vDЌ3-[y P} >}֭[&Ltɓ'ܹà *,,ƆKbbbь]၎[[[H$ґ#GN:$ަ?߽{LSt 6}̙3 # )?~SNd捃 :vvxҥgϲ76555 fܸqvvv5...Lh1GH{{{ϟL"lquuE鳾7zhMlll^^v-" MIIYfͰa|}}9IWO:gff 777ˋ\j$??͛7333uttB=<< TTT)mLLLYYى'Zbbb.\˗cx$6_%],x@?$KaT*߇ E"9%NMMرcqqq/fUDDDmUΞZWKԙExi@/_[c9~GqwZ)w%Kv#N@W>}?sY[n_?eoHKӾzpܹkע>r纀^1i3yР܏ vn&ɤJ;9,#H222wgʩT;JKK8@-qqcccݻw( [.O ʢL jEu n۷o_tt4~׬YÖZ@бs3gq>xڵk}\zj]]]Lnnn`` ] ڵ%≯wa… aÆmذ?I] r}&&&wޕ ̟?~9'$$bWUsm':ݻo߾uTXi230He )))&߹sg\aܸqzGGG\__L@?ⶶg\6|?\^Akggg azzHѣGy wPԈeee]]݃777=z:thHHlÇ?{lڴiYfp:qq&rM'466<<$$dܹ .+#Fxxx$''?Ĥ3 :966ǏɞGM_L(PF&Ν2e~ӧ<l9@PSSsU̥Kx544X[[R;;p'iߟ7oa>;;{֬Y999`ժÚ<9SSSi'V (!!a,>U ۻ5ϟ4iRqq1Wjkk 3gN]]~|³3gΔ@PN! j.]Gdʔ)ן={qq;w_C6΅ܹC ׯ_gϞBCC ́JwZ]*** ]m...otׯ_-[F7O`oo̵?nff3&TVVg///(:dbbBUUU^tX!9s踇Zj| AK.aKNN...nhh@kzzz*))a?~ԥ0@WQ(+WKJJΝѫ;?а}˗/twҰ`…T---UUU999ׯ_><<+Az2/DDD`o _˗ʄ|_ϟ9sp錌cǎaOͭollcPP" &&кklo} 3߿OHfCC`xEPPĄQ= rrr"3g믿9}ו'>srrܴ($$$ ++;sLlSSSl/AO޿˗/_~%0i=|(3tsO6&A?u`=][[Vaܹ kbbb:$##٪{_OOAd0%%rܱcQQQ{{vly݅dӧ㱙t b#&3f9}҃gr"F,MRYw77WW`,!@9@O 766Fϟ?9vX9B###Ǐ3fLXX.ݷSp+۷o߮]yy }x***ܺuLNN[(JsssXWWgkkF$?????… ˗/?y$3ihhppp8~8<߿O:oe2//͛...]9DLLlՄN p( boo~la۶mׯ_g$ݘN=-- 2DRRٳgEEEEEE&Lp맫_h۷o?~3f 9e=zD7c4>Ny~my}رcϞ==P]]VjnvϷoЁ".^}6;m #*I `ۭETTTܺu 㟴D999ZZZǏ,Y%ioo733?06mڄ̙cQuuӧw6]pjijjZlٱc::OiiSSSi_JJJ֦It!˸oٲewޕ o޼*k߸q+hީR/q'GtL7ݡƘ.|t[__x?1:6ONy244h uuu='ymmqEE BBB]/~6@$''G@ 63ȍX*zϣOH$[[[K6668""I6ׯ_RQQR\\lbbdmmM[~kH@&RSS_zartmmʕ+nj ***ÇGvttLHHaxXoLYY٠o߾=ztȐ!xMLw%$$ 2|𰰰'Obu3nJxcmm c )))?liiihh@Y`qss!ttt>|Hc#<<ҒBDDDPL޶+))v6rW^]p!ֽ@NNM? ~ƍ7nTSSCӍ/aÆc>HCݻ௿&Q3E$22r޽WϫsssF-UsMMM^^^GF3#G ݱ(s?B ǠKJU^?:= "##ŋAa__CMMMɓZZZd2ygϞAw0yyyث> 9s$B4i҉'8.(** bߢ.\(--=qD++(r2)..ڵkxܸqo߾uppPVVP(CxݬY?E޾}kmm,((~tO> ?<}d+KҦH jt+ҪŽҦv5K(DTYgq~31yu3gc~13ѣJuppFUZ,(!Fz5! \lZeӧO'F:cy$ڞVTT4007o.֭[XX?m\驭ݽ{ٳgqQ~~ZF{?hXa ?_5/ϟDaVV_5vX%%%fhhsybjhhhxRFFFNNnȑv aC}9s^ddѣGC1 ѿx|Q&Dp Z^(D |+).\=@ \YYY/^ׯ_~Zu`0P"r {7nأG4 J={ㄸ5~ 33s͚5VL&3++̙3}ׯgff`ς+((ܹsG[[tʝ;wtttkثckjjPx܍7{{{,' *aϟ 80%%1oHH# Oшf׮9>;ӧ'NlLDd>ިϟ?>}Jz SsPq'}}}b~j_#G??i4Ztt4ǵ (GbM'//%X͢/\_DORO>-H$ }{4)[eO4`0 K 舠'0@rM @D#GuV9ϛ#++f`nCuuuŗ6yh ee'On߾ҥKo`/)wѣGN>رc%%%h:ٙ޽֭[9`H,Y­)S1iƳg-=j*iӦ;ܼy4eFFFFw@ Ds玾"3ID=v؞={aoff˗/1 ZbExx8a']5 M UsX/ .Gݽ0 KMM-++ٳ'?#lW?1bO={`0={ٳǏ߹s+b5|0ndѽUGG۷oiii=Dp#F ERR3aNNN&LZW^mhQcccnn˗/>|H,Id2XꦦZYYegg㑑aaarrrB|]vp\xxxTTG2L}>$;v }#x9n8/Ϗo bkkaXBBfO> S_𤼼<''gZT"z|Ç߾}WTTın;[HKK+11*++{3"##KLAAСCI~ҒGws涕-a/#btzeeORSSO<7铥gP3Rv|VjϏ`o{{{<ٳ*D_(p=ɓ={_5//*ņa + ~C@KKٳx[fן9sE<<<2{nrΞ 57H h/֭ۜ9s3llLݿ[i))ndk;_2$@d&!@y~g:fEFF޿O[TT,%%ejj`KrB0-- *L,''7yɓ'>}txm7=ËC=E[nq&HYY]pv;OсhhhܿBdD IDATߟ9sftt͟?ƌwELJCxBXкBh4-----qmذaҥx߿YGQG\CCLNNFtP :u*Y 8"W˭BZކᴯ۷0 9r{]x޼y[B޽[XzELrt au0A6ډu11XutYV֮]{  u䦩 _r/!!c3GoĻ}#Z;7n\JJ [RUenP}pyyOgݺ`kL+/^q*SSSäUj\\IiӦBq1RHېzMڽڒ̥Ktuuqqq9lx#\#[AA-yNHH };H[ZZwݿe5}y+v/ѣP(NNN1N'('JII5jJˇt&w3Ʃ$ I^ c\\)|ramrItҥ&V";wc ,--̙þɓ(BMڜٳghwF7>|ϣP#֚Os0u###WWSN%%%GFFzyyv *** YVVVB\`kddD*P7v>UF-Yd5hƴio޼yaثW:={E󪉉\$|$gO6 UMKK[h(>$,..FvpE Z%99B@ڛ%]Fk>"a0ɛ6m?~"F;v۝;wH]ڃP^pUVVRlҥ"0N\_.Z\|yTT)$%&: DhqMų߾}8|5qdDQԮ蠝 |. <K񠡡444D𯲲r߾}̕+W޿>uTmmmtϟ?c"ieeEgffZZZVΝ;I5#""aX3!Q񦧧4!>?7]hưac|>9faaA*%WM&b>塧N!0m$Q&i JC҂ ӧÇ;WWWwccct>j޽;Dk׮] #eeIII^9>"3//ϑJdd$*ep:ܜBDD̙3I/_N:UXܰarCqI^zXJ7|* <<^HdT]<~-m x1e;sƍ 6ǣi%wTq gѼ7*ϟ?bWF|frww/ekJ[YYu;1;t;z9M6fffaaa@G9!,^̝;M Çs{ΡCMTh'""^x֖N01s3w\bY?D#F!ą)0|ێ8GimmLzvD۷ћyܼ>9::Θ1'~6 iiinarJ]SSqk:{5cN%JKK e֬YU7NNN? A 6 extNJJ eq>Ϟ={αT&~GNOKK#+B@ׯ_K=RSWWwe!>DqqqYfxl߾Ϗ7nݻwQLӀ@_~?333QÏϝ;277^z EV233y)Fz^'O?w?/M%%%/UJ544pD aΈGԋ/<Ƀ7{‚T [`k4Q(d[ LFF\R:Qdɓ'y}||HGիj"{4?.))9x }||J|/ UTTDٯׯ_s$Nwkjj{ꜝI.))UVED&&nӧOInЪ)So: /h"TpȐ!|ޅaXLL ð^zeeex-ٳXG UUU%tfNNӮ\"aKWcTh  C*tH*xѢE IT,Xfʼnt޽{ciii60-vvvEzK5kyݾ};mjj:iҤ>}(**jƍ1 ۲e 5Un̝݊;6=N_l*$t BV޻wёiMZZ:88X ݻS % Я_?b% ׯ_~&q]r,ݻwcƌ @w988cbbһwo ~HMMMc4k^޺u+j^0~46Ai&t|ܹaÆ={677ϟ??~<*EPИq#:F NMHב ʶq/=zO0}Cys@0 >qD---999uu &ܹ377wpS2ێĉ;v r"@! ܔ)SPCHXUUMfff6ɓ>|hhh`0%%%7nܘ0a⢣.ۯ_={妦YYYuuuuuuO>]bŲe%۶m`/hǎvvvHZZi޽䔔 LҪX[[//zO>#G޺u2>}:_+%%eō666ď?8 Zr%);kkkfo#9DmGDJJJQQxݺu#_h)SHV4w1 W=tP___4իWFGGNO/ROF͢4ydoߺ8PQQQYYy„ 'O$nصk׸q͚SN?P@=>rǏb ٳedd19455nFz 񕔗pJ!neuŋ7l@ %$$S,CDr RXXYGP-[n߱c-PTTѿyyyYY޽{/\0##wҤIetm۶q]]G۽pԌ!u>?C3gFEEt3gۗFikk/Y۷aahE(ml?>{l]]]99>}̚5+,,YZZwĉi/A4Ξ=N~zmo,//aR/'997nؔCr@8Rtg``=ޱcǚ5k͘;;;uuu?~J $6'Olذ͆BBB:qXD\?HU@CCÓ'Oq!b2hԩSUUUP [n}]X% ~r--Rv܉nvʍ@:G ,,lʕ],@_"@\xvrrjÉ Fd_yMDR׭[>OPΝ;wqb'>ȨcFVV6888""G+cDOO/(((***@Rll%K8KR}}}Q$ HߟGj4%%})?^__/aB9y򤛛)kcc۷6^ܹEEE1lZ@&NCRV(iӦ8W;v2qN?Hcc㄄:W$##s___R]޽CCC=JVwVn5j1O1ڭ~h@cccpp0JLLtuu>|!CV^}m~Ԝ;wn}WPPwttz**׮]CM^~]jjjt!=-,,ЏҽW\dee+**vmРAW~1m N\@Dӯ\ddd"//gmmUZTO\\\zmmm}YGZYYtpΜ9~~~~Jix˗[l111Ԥh:::?lKj+FNNNo`` Q9`X-Z+,ߗb```NN)Sz)'''//onn~\M<<< ?nkk //o``tһw簾v-%mT*^wرk׮_bUzTTT\ɓu >>9!Yn]nn͛GJRՇ q޽Ǐ lmmbՎB:uՕմiڞ8vi&߿G7yۧ0lݍf͚deeCшMIpT*X GvqqϿp¢E6iiiC:;;ggg;Oaa-,,z)++dhhhѢ/q&z70 Cȸ/_X,REAAXΟ?())UgFG8NђYZZ={իW ͛7s^q;w%%%U]]-Nɓ'VVV555ĠBllI5*@`t]rrrr#*E֢P(O^|9)eiir;v۷/1n6@ xNjjj"%B,tU<@P<<}t~%Kھݻw({n .ڵ :EE͛7?}SN.k׮mx{ŻwJKK~Ν+W@MMҥKJݰaCZZڷo B,7"ׯ@߾}O:UPPH Bwt'D]hnn&mz4^%%dee t]hqm8;'Y^^UΟ?Oh{e[?n6 /+xsb$&&T _9 .3f ^p!~|mnUCCC͛7QT--'^|y ?~$G$%%>}z„ ***4mȑΝCU_JJJ9Wkhh">|8|ڈ#.^ӧV]d;##cΝh˗/bA!rrrQaڵϟ?i}CCìkرJJJ4=;;?+Wxzzjkkw}ف讀b֭[G533ѣJuppFTUU6ӧzݽO>zZbEzz:W.|=2J[[[ 222nݲרуt]hӣGdɮ]/70`)޻wF7ׯ73954-::@BCCQcډ ;ƍ=F/@?`׮]֍\OSSsΝ&Wʪt钽FK.]ٳ({{{'())qܒOH́O9ѣ9> + PYYI*^OZ>i$**qM @D#GǽϞ=?$Z|q]]Xd ǻ }idU/))177'k0rltnkh9dss3gƍ$##moo+//Mii`4xbW644ܴi1ظn:  ^ð5TUU :!'(ۂ`\z?^n^sݗϱ6rʘ1cΜ9>~p^!h#oogϞyyyFHll#86z%boZC4|t,@/_ZXXTTT7:ģf}vv6JX| T*u̘1~8&!RSSkk׮3~;{lbbOyun-eeenwK0`<H:;;;vܚL]`=zX~}dddQQQmmmSSӿyiKKKqˑ|2{Ç\sΜ9́OTjZ fff)++m8痐`nnΞhnn~ofhh@\ZAAqƥ"6o߾}3x_JZZ7BYv-޺yŊܦ+++>ֆ8`/Dd2WXxwޱ߫iggwᤤ6CX55}vvviiiڵkҳ Hii/U/^$596go!)]xGn倄UҥKxEvލnr[}~SS:wiAΜ9s <;wr4~ǏܣGtܮ%r߾}̕+W޿>uTmmmt-DID6\|yTT)>wܠ Rb  %##s-n̷nZrumX]]L[{q@31Ϗ2.ѣGhKWcXݻwڵp<`8))իW|>8m ϟ?x\$##6ϧFPknݺ>}?+7%~mٗ{KH*lٲdng Mt !rssv)nmmU~Ād}FUJ?-haaa3fHII!ƃuvV]M^^ȑ#s!(ХU]@> eXn Gs]f 4&&HOO)44ðaÆeeeq|ΡC&ϟ?Ш0,""6/^aqKΝ~ X,{[|ԟG7rFg3fprr 0,77'ðq!!!{3oę}kkkg VҪ]1rFMΝ;G ZXXK@@ ߫K|J[>a ӦM{91~ ={qM 9|m0F9::^zðpoeeƱ M_NXq/^D7tzt^MD6v 7Ν;6H@WI0rHRȑ#0=J}jZg[OF,J ,, o;aآE(|X_qPPO,XuvvF'{ŏ]zK5kִq=lSSI&}ǥ*~9lذ'O~𡡡`ܸqc„ 9...:::C+MMM>}bŊe˖vm6^8ю;HmҼMMM{-''oooG\>eʔ;bĈ˗/?8p`ȑ 6mG˗/Ges޾}KwС(ܼzj[[߿HGGG'''&aJ=}ZN>NII?~|DDDqqqcccaa!>Trq ޵455E6'N7߿\\570ɫj͆XHɥ?yd4ۺukn֭[/_LIBT$@AWb2E| úYNp0k֒˷XGaaaRR~llḷ=; l24_ر#-- o<[TT"&MBU}m۶aVWWwAijj?zjbU͜9뼛N<9%%˗/x… ؔÙ3g /?t萣Qн;v ^m ðסR'OZEII^b~gf?MZZ'!!!-- 0Zr/ /^ܰa)гgOяpIYQ˙oo=z MetilQ y[#CZ:^^-t:_ /^DqrrjÉPrFEFF\cTu뢣')ʹs?N@2qϟvGDD >œ􂂂xT:ujڵ֭ۡCBCCygZO>7CSS fB9yyO'$$8;; q`pqqviJJzמ?^yIx0`F [r%iNrr2 "@5/*;vU3Wڭȿ{+E. $ 5n,ڵk_ޞT5?d0%&e?k;$ FUěkkk={F>`0JKK, o[hQk`hhzXgϢsrrLҳgO999yyy}}}ss(;QPPpq[[[}}}yyyK޽{755UWWn˗/}}}mmmﯬLReddǎv+V;AZZĉiiiK,חUUU533;p@~~Mo 63?F{5 .,ZHEEEZZZEEeС& bnݺ͛75JUUJ6޽{?0aaӲ`0ݥ*~qqqNNN  ЁPھ)Ѵxg"|QeR_&ˀe\Uqu^z5uTR`YY;w̘1ϋ4K'*ڴuDܳKnPqW=Y|KRI3t O>ݹs'go ;?\l28''XqQ͡+hSCNq=yBc$%%64烊Jbb"`H3Q)=R_tuҗ`dMӠ@Y6lؽ{MFH&ME7oLj4gН?W8kr99&a"FxS1 ѷ.%jkkmV_W., q#a222 -Z9uQ۶mӧ2$?KKׯSkkk>;msB"HS?߾}`xojjj***#_@kPTT}÷mֿR944ThCԈ# q Qvv6)bddDApuUUUӧO!~ tJ?Cw1`0͛w]q iׯ'ݻxsk Šo`[Rd+qm%ҥKYXb=jbbNX[[kgg^_nǎ+"#FDGGw֍KIIר9pBR->f٤Ǐ68}U\¾РA#D4x] 3Hq{3?><<\NNOOOר?._ߟ}"ޤP(~"MMMϟ?md2 q;;x:1 {# r8'TWW[[[xB\uĉI}߼@ s|s߿ 1债 RS_w,G 9$&*:}t?\l⃹s;wNJ /Q=:44tMMM(XYYiccql7(ss/_[lQSS_y<ҥKn"FJJJn޼9v+(ȑ# 6a@TQ)B0B>|xrr2olY,0-h؃oA33ݻ Y,Iq*.Q\988?ٹs.VVV)))bMEE%::zĉ(b#:::%%%Ġ3xT]ѣ9UVVobs0`17\$]5֔ceƍHA ;w-~f:,[,00B%%%SN-,,ר?zꕐM 655-Z{Wᒒ!.))!U^mm-&^[`ҤIH]]ݿ~E]'RJΛ7O}RԔC9-XbѣGI"++2 0..[իWa#Grrr?DA[`@Ӊ7utt09'r@W"VVVZZZB|={|xtt4ArZ~ݻw>|X4th<7RUU5sLnnzzzx)":nݺ% Iy&(ԥTVVX!f9ɨgV)&ExǏg_A_vM fgg[ZZB  gjjz R3[[۪*}lB r455yxxܿTYte}Ш@ٳgqH@dJKK7?{@MMm1ԅ| :RJx񯢢ںW\)Vꉉ Ž2$ɓ'_|u͚5 ᩩ׮]k!%wccc ØLHw{aijj"F|}}̮]H;vvJR^^^]9BЧOR|ӦM׼yN{l…L&sƍUUUn aHkRd|t@*$ׯoܸA 2jt_~%STTtrrRvvv/^ wܹm6VMHHի1bCCC5*777ţ׮]{H;Ci?+?NݻwСC1 KMMe? }eΝ*O{!m֭[I߭ .p}}ÇIq13/))IKKd2˖-yF~R̙3G9s&1bH !;իv"x "y#iii'9ɑA5jf o߾^Nϟ?/rرa0`@\\\݉A&tҘq B9sʊ߸q1cHA555ͦ&ttttz_|!ޔ=z~2i]9i۷o'H߷oAGt庺:bd-DGG⎎AAA= @ȆD y/CFF֭[x-oKUU+tjj*T|zHUTT0 {=)7}BZZZ||<1bfffcc#ۻw/)￷ ,ՕðYfJKKi|ݻwA,,@B(++GGGݛ'lnn =vƍ`HV]]MOs9=;]v" Ǐ%%VbXk׮ "-,,_.###Q ]ݾ}T8.33S\-щ֭1H:-%%eHYYݻ}|@ZTUU@'@qiT L&SOڱgmmmnn.ۺu+)/ ӧIASSpYĂ@-`ٺΝ;ojj"544߿?h q ݻf"qDRRR&&&555(HR?N&rR萐ŋk<]Ց{yxx?~ȈcX&.!!ښxBEEz;ӧǏMMM5 Jjjj E(JYY)]ݻ  ><99I"F@'eML99s愆.Z@r̘1ԩSWvBsssdd;Qo#,--޽{HFF:+M]eee6aׯ_! FY u:t0l̘1' vP @7o޹sHVVV>}Ӡ@VZi&'yyy 8LKK iFj !+RdС<A[`bX \ +c2ǎ#>oZZZmrڝ3??X_999q77784sP%EFcntޝtׯgee# ,gXi0 ! (bǎ(ZKS  ʪ`v,(E"}^"ED=?<$%$ߵfNff0gs؅ N:5K.-]HHH޽ @KA (ZjH0==Ĥ@h4 pСƆχGG2d,pYYϟJշo߈222***III?=L&15X,d;N'uR lذ)_nkk ԩS|||߾}"ZjDmӦMHFFF$%(yyׯkiiq}ɓ޽]vIA1rH$ J2–Kܕz5t:QQQ!B *gΜIKK#F.\zR+1"''艉sA V@tm۶~z$͛SShTǎcbb:vH~Ǐ8g80{&F`$B<*qT&'F SH7$2|%%%g=~x̙Ġҍ7.:P RAAA˗/GO<>}zUU%)FiiiEGG#q6w^ tuu/Ν]@ 퀠 Óh Pرc3K.ׯU+Ksss7n7NIdNQV=ҠTg!"4-$$ݻwg̘qu999r|7̙3sEرcͲ4iuYXXo^1˗/Y,/tH[nͭ@/ UWW#}@yyy!&LгgO>| i`0&M$$JPSf0q϶S0F_x7o^dd,zGȽuٳg„ 666)g80ghSFAܭ񣎎UaEʕ+|NAfc H #...TD(22 "'O'tٳg"@ߊHիȓ@|lܸqȐ!Hp߾}gϞl Oph>o: ddd zQ"((QRRڰaUۻw/2ѷO>|<1gae Vj0HCCC$tR'+n߾DlҥK߿ߵk-[_bX+Vf[ַo_bFH$IDpm5j۷ׯ_Ĉk.]XMMellI hC-YD@P2qǏG'O\f %)Fuڕ<+*==}ڵpत$*ЦX`D ;w&r +(ٳQUUٳgov͛7fff?~DJ5 1ݻG#x)5… x߿oK%&&"Ojه:''',,ZOO{L&SEEo߾[nMMMjGQQ1&&]a===)I 4_ӦM+//?tcÆ Ţd$7oJCFFqFz$:qk׮"bdݺujjjTDfoݺ XB^^|piiׯR@ H'OwCCCY?իײe.]ۼX//S$QUUu@@%)V\v^ZZܹs>>>"JX>P \.DF cuP`bD]]Օ|ݺu+++\WaVUUM6H|ժU~~~BL5 ._L\x*"f}||tttlcSSS[[?&=)~Ν"M6ڵzzz\_}w^ރyF$c^^^qWAĀh:2 /eeeĈ2U#߾ڵ+{CHgPŋߜO*++4s6EDDAvv2;wNHH@aaX#֭[_|<xʕ0PUUEZH)Թ qWEE-۔@CCCyyr>|֭ U{ MZp͛7ٳB/dM8lmsK@ EFF#۶mKNN˫---}MMM}V4FBBB݉A6r9\zUKKkȐ!`RRҙ3g0XqX,⮾>RkL` ÐӁ0#͛7+**R=!C9aَ{` æM;b j@|999m``0}tvjjG]^Mx"M6wڕ`(++888ŽzTFF… H\R޽{R􆆆ŋ 0aW9O0-CF}d`#M{{ȧ[VV|r)F@9~qbwK.* z_w%r8qr?sEd0ɓ'O>y/;;{Æ ۷oOgaÒccci?--۷o{ʱTe<==ZZZ3c bׯ_^^^B P]]{E;v,r7_^^|rZ |}}Ou]@}kڴiĈ,}}hsPb# ۷oߡCNҥKeݻkkk9ۃFnLs%++{)kV) 2d͛7ᄵ'UƏOA۷?~ CBB`8p1by cƫWJGzj"dր-ZDU>@>|@Kqc䘡CƶkN)@]||?8۳flYԜ:us玓СC;td2;w}z>}{={sqmnpA|R9'3ۦM _-Yij*++ {!''׵k)S={}}}סCֿ3fٳф_~jժ!Co W8+WBmmmxxTUUzebbk׮_~5@;v HFFJJJݴw >E6z踸8cQUUeaa#KKK$yb (++kii#0@jyUWWWEEyjۻڦ H+W-~/aڷoС(R07IW|*++rUUUꜸV600󍠭}^744:tϻ^mm/^ gEDD4%60lȫ[Gnhhسg$Dт8~0aŸ?߽{7qD>4 vV^^nggǫmάY3{l. ٕ+W+%%%???+^:y\W+MwTUUq_|!vߪȜg N@+ KstttZ& Htkð{8qֽ փu@]~moo7wrrlo±cSԩS/544٭Xϟ?|N4i0l޼ oVCf/^qƑq<|7Z~}pp0I&:ui+W򹾿ٳ333yPQQ5m4a<6H㵊fqppScddtd\IIYjj*UYfn݈|r;ϟ=www>?T@F{&J\>ruuVa Ŷn݊| (++ ;wnҥ[w r-v9 nr+VϿ aÆ,ζWTTTWWG(8;;#1 ۺu+>@VVvIIIկ^Zd VyyMIIIkM tuuókjj>|@laiiYQQѭ[fffdddl޼Ns|wW.//_`WPPPWWWUUuʕS{{{}۷ꬬP Þ={F|qIOOO!JJJׯiiiiuuuzzzHHH~8GƮXGޒǷ Cܹ3gׯɬ>}zDDҩ`?~*+G"rrr#G$FK0@j)))T%3˗׮]#FFm-++ܹsHpڵ׮]C*:u۷P HV6l uԩW #???/ׯ_۷ė222V>${ntooo<.^@1 8ϟ1ضm;w/EGGs  //_?~@-..F#O\ TTT̜9­[x u=8/ȴx<[«Wxu)={թueeeȧFQQ177!t>@:TTT%gÇS}9v95m4BJ"w!goDsvvF~z}kom}qxٺ'NpHVVVUUg{ʔ)\;vF ߿sQp#dE@UUɓg萷Oҥ r9S KKKrOގ ðlK;vl(**FGG#B8GGGoߟ|bDD>XBΆJWHZx1pőmll h׮^娬|kאNӅ, )8p@bK}9ƍ@#utmbdرfffTD///HɩSN?9s&򭧢~_'Olhkk7ى 6acsr8q1L&S#>JQ(?>>~}Ȑ!F"`0EEEė={hݻ7]YYo>|mggk;חlӧ9s敃^xϟ?$,B|A7xim+Vػw/LOO%)M6!xm5 IDAT#F?7;V7qo$>l  [lA"dctG޼ycnnTPPv j@L +WZ K~ujn[#G hJyyyYf9r֬Y\\ ?{֣Gu*gkjj޾}{iGGGN_o߽{)`fkk5%tŸ70 =K!^[f'铩)R4sL%%%b˗eee .tss57@*!#RSSy@B=ϫcǎl .ȝFơ p'F'MDM6 ʌC3̨(  ͭ\<N=<|xkIBЧOqb|&-ң/^;99WQQQOOرc?BȭDǎDx( y}9~迨'Gپ}֦0oÆ H۷SN-++$%@,,,β;w"JP YPWW ^#:1AGI&*wF4mΜ9&&&HN={\ @bbb_|9\uԩweرQE ?kԅ 8r5k=zΝ;MܝPRR"b<*k=w>Mw1F4&VDxEHk)S@%Ja&##_9Ϟ=brRCEB; Ig^/1ܲyM_ڵkOt!ޞ&ubu prr {?cbb܈3x1>M|dl?/333|ٳ-u5h1vȑs"񄄄sh˗#ޓ {S2~&e" C"##߼yCQ?8p *))} Y@j@ #NPN;ydYYY7osݻ;99]z˗w611!i&!t555<])S\\m66#G {x^ԩg'Iv`277@C5JgΜD̓Hu055pa,0>|]/ѣGg#10  B0ٶmym 'Γ'Oaa\ۼ&#dddvL|lii8ďGBl555ΈZOOϦ$ bbb?6l0|^GfddĿ؉}ʈ?kBBxb|ή ekkֆu`0.]4e$~ҥK$SRR"0ܹs= b}d@jӫW=zM }G={Gͱ`AQG6zիQ>Pb>e޼yM9e֬Y7o$ܚ:t({sN|?~u> ~ϟ?mb'\ID)7mb &ۗ/_s+Wlr|xw6lڴ 92<{{{ooo, L&ҥKį:SNRR[F.ر{С#G:ȑ#0X* 2`$WAA]X@[# m֭[}mggo> A /r{5vئdeenhh _4igݻw)))@8*ښ+>cPWW"ު d=:}4KO>xwӧO#pAAA\_={6g;77700O^^^޽;O/^1ի|NyĉX-C|A777JRjL̾CNNp5D +V;G^^~\| ua, Y.ׇ@s!,Yү_?++0xNh ˕+WJJJ8sm[RbϖǏ㏥fst:^60lڵx{k;;;UsΝ9sd2x믿={p8{l}:Y?hyyY~\v…u M__cǎq=,""bx(Y8x6//o֬YÆ |y~~~]]]QQчBCCN:bĈOݛ J||aÐ޽{gccCeHnݺ]tt/^8qBX`;"@n8Dw!//yf67}dxiA# 'ӇǏv_W rС/_TWWFFFܹss=UMMM11clܸ۷O>uppXp!5MMMŇ> Çׯ_ɩ{LLٳMMMEEE]k]]dffÆ tޣkhhptt477-,,dbkk˙8*++{a>9s͛75k׮L&cǎ:::˗/u}wYYDo߾Mteb/ lȷŋzcƌ9|0++?@d,Ǐy bǏ\rrrB,(B\aUKMMsх 2w j@|ݻ5\pB|ȑ#͛ 9YYY+WRPP`2s;?Xd g200POOOIIIIIi̘1'O:w|Mŏ]/^L>gϞ}6mڕ+Wtq8 ş_zu߾}u6>`!1 ۼy {M uuu99={r2$++{1rGxAa0$6mړ'O ԩSBBׁ;g]#a+Vz"hZ-}u |'87h=>_5@())qˋϷիW[h ӧ&=(!!*''tR>ʮZ*66|F8p8'1nܸ/^ 09'{{=f̘zyyᓖ_xQUUE>Ԕx?ڷoO>͛ŋ<==,1 * zCQMM͇vM)@:h4OThCtuuO͞=;..ڎ۷#^p}ѣGmyxxp`isII Uɀ)..ܽ{wbkE/ x> ;RĖ-[544YP:gV|>ZA񶶶v>*6[n "F***h"GGGr׽ l6T%Z&99k\__ 5k2bCEE|%&&޻wܹsBBm7~xFrrrDDc<==R{#G>bϞ={7?a#FHNN655YV͚5kǑ~211zK Ķmۚ8C__޽丛 X"-rPOO92YUU5ꈻ>jjj///db)))_Ç_z5%)@@ ,k׮ ٳ"No߾aÖ/_ ===mŢE;ܒə4iRVVUYI7 qyy9!...Hbҥt\k6F@Xsj|rbd/* bH'( h4ڱc(I bj!رիcbb***իÇQhsȏgeey2p?BBB}E]+//<,UUU | }||Fdgg_;w.),hC\]]-?ljj =Ia޼yHOϟ? // f@C#0Xk//P(55ŋĈܹsү_333/1F+hSm@޽322*..$%)&##pB$H#u4n*++1c"c%Wrr29عs~P-[ ["oT*((\a0emٲf# * }*++---,rssڵ(Sm5'OOq]-)94xbb9s.](((h„ HpppSR~~X,x7p@ee岲2<  SM7rP5XDIIIqqqرc̨FmmÇyn:Qo5: a,N: Utٳg룢ׯϛ7… p+JPƏߵkן?⑂ccc'k`ÌK?^(!{u"//t jkkUMw}Ӑ˨[n$ 2,kns͛UTTD$HVqI?5TVR *t:=<<|ԩHK.E-Xv-ټysSN&68r`2"c%yj۵kG>Y:AKHH>1bdddhhHQ:@-Z<ݻR@\f\lUqDTCed2/]4i$$~իWStZj$F^xǏFO9<ի"d,pVV֯_J4]U˷0 h^^^HH768???999Ѥ5c).Kl7GD:J k׮5 :t:hKKKbfocq5rH;;;$XWW7w߿䁱(77?a&ׯ?yU=441 ,M>8P55W/2***ÇGCу۵k9|]]]SݹsΞ7oqb0ZZZah$.=z4׃ rrrT%&53hР4Oѱ%WTfXXNJhN:O81##߸q24h.oos#۷ooJ 0''SN={ >|ƌM:G$2j(:Bnvٯ$***4Gb|}}:CQ:@N8Ğ A'ė ixcƲHIU>~WN ?pM?1svxSZ"lϔѣǽ{&Llʕ+LҥKKM8::̤c6z̡CFVlÐ!C'p csssuFU>Q߾}C"ai5>ÉK0 [`AUxxeː9L&9ں)FЖӽ@l:W^nnn˗/~'LG p1v\={q=z/[,,,1bDRR||׽ IDATK#111F@|tرr̙3c|WOO\,--EFܺu̬J~0ShkkkdZrYYr$LMM$_aBj 7@Vjw `j@(++gddx{{0fmmG";D;v$Y,֢EbbbJ:xzz"Cr AAA˗/#φC; 1G\1j(^#g)u?~X0 R)!!aܹțXUUU&I>͍kjɣé3w''@%;t@ YYYݺu@MLL6q&k:bHHHxxxk" LX`qV__&UTTѣ A m۶#7o* <3gά!UTTN|gaֹsgfI5ر#AffѣGY,3NOO͛ڵ#kkkL@7Z@AAٵ !F/_޳gOB333䫨xK..jɦoߜtuuϜ9,cƌv횼<1XYY9m4eb:::HMMMpppO ʊ|W!d,p~~>rd$b``^@MQQQD())'%%eԩH&yҥ#ӳ1 :t:N:^: رcjŋڵo4MyI4yk׮M6uUZZjbbrΝÇSھ}Ӊ]v7sĈK,9v߯^` Vu|RCCdG"fs<jO^K.T˗/HNőOٹs'2_F $XnecX yhl6@rrrvyj^zzzZ[[21 Ѯ^jcctԩ/h:u*(( F8&^TT\wԩŋ6E d׀^455322^x0 SPP >qℽ=#L+A%%%#UTUU~ʧ$NvvN Ȝ9sZWW)ӧOY %xq )WOe6Uov'O! zFppϟW^-'';w8= fΜyI߿MLL~JUVmݺuHdӦMM?]MMߟ׫o߾maf@Te4/^*:Ns7k@޽YWi/ccc@BBBϟgrdرC9@A z'GGGYY}?~ldd4nܸ8= ,X4544DtMfJ+,[pપ*270XR wꕕܰƚ `6"R:vfWPP0yd4 ''Y+WIPH޽{-ZWԤ'ZZZyFcooo>$ellGIJKNNnΜ9HpÆ Mg80oϟ?;::sΌ3{7$Ь2225ð,= T:o߾Q B~yY{B 573A˗ӧO#ě@Blgg#qcc .rv]]]טL&Mg/^w544߾}i&}}]2 eeeW^9?>##c…T$@A ֍7 Çz@ee555=<<9} }mրe-BnͺȈ#?n: `,{)3~)@/ ||| >>> b 6lpQ$h``pU|G|||TTs"h 6ໆo߾>}:9dÆ KNN&m[ )aFFF/^~СCP^^ԿRN?{9r劃CCC%YI .7j:ujMM͜9sWѣ[nʳgϐH>}/n@ ð .#:::ͣ* (vBzzzJJJݚիWիS{n|=KVVԩS&&&xSX)hàF|UddSTTۿ*gɌ244DgϞ]lYzڴY֭'Fӓu:l߾...-g?F"ZZZOiM zaԏ8mڷo?MLL$~||zpp0^'⩸رcnXXJϕ9~8)NKK{SжI222֩Oׯc <<<;0LAAƍǏG'NXv-%)Iyyyru5:|cvܹSN5@5 E^,X/_&F>sLB~3y; &&&3fn߿_YYٞ}4==Y9t\2--%)@F4$55 UWWyͲeϧ8gϞ]jٳgBB Օd2/ |#***lll9r$b I/W!@}}=,G$%%#SL*zW^%ܹsBB2Z#22͛+(`@l`H^C`~\0A ꚞȫUqZZ>l޽;p@$qݻwSٿ?kLLLAAAsm6>Á1 {[ѥK bjb<d9i 6_ %w$!!a޼y }r[o^z 7KЩS'ZlٲE4i?~p6dddȏ4~"`20 4Qv322yz?cll 3-۲Ν;#a~GR߿ÉՂNJ:t̑#G"""{e $0X<4zY5ֶg'&&޻w122"O"))i̙([no{yy/%Haa!gCEEC?!ր4OFFcGill;o݉A6|y'NhA}}}8;;W€^| CV(W]]{$/'CjjjjuDE~~~dZٳgSL 9s (:t|,AY:thu\ _?@+A M]]=00ώ"$&&6ׯ"NMMͻw"c$-ZEUVwHuuupppsC< FvKJJ̙S[[۲T!7>LU2͛7uuuH'vԉPC@-mm۷o#X p8mۆDvb{Ç;99#,`#ϟ?FS`\0X q݂K# ٌڵ+&&}2ȝ2%%%&ZbjذaTZ,;;yCFF̙3\%feeqCCXY0`g:;;W`))) 5GFF&%%M8AAA jAss F}-d_UUGUVF_ nٲf7Rl6if,YǏ 5g!JXRPWWorv҃b#t:חt@h!!!\OqvvFZq(`ID%&& >|*yh%ܿ?!!{EEEZZZG%? رc^*''G VTTXXX\]i݂K#O./o[[D  q`0ڵkļ<.P0,<<<--?ALAA?'$tÝ?kcS(`Idffo={W8y$mbb"x"22ޜ''=zAJ_p ]RR2eʔ>PؒsqqAMABCCyb9@?~*K򯧦 E@ [#  _IIYjj*pڵ丒ҡC">sssJz޽|whh(;k,`PaNMM !33iСQQQ"NPbƌt:ɓO///&IdddܻwEì2dr֭[Zp} 7F#F6Cð?4?~<##qpp߿?U$[f'֮]/r|}l@4TTT/^qsblmm9ڰA `8::~e߾}`Rmll8MDUXXt̤()1L[c͚5-ۑ{O>522"F͛WTTԲh%55}#)B\kޛ'2Y>۷o'F7oLU>jkkgϞ#$g^gݽ{7<<9r+"M6KnnnG㪦ޞ8B)5.EEEWW׌@<~իW"N]pp0666nmJ@@lݻw-{6\EE'77MADi5 qW ȳػx?pgc+KJJ+I) di%-RT[7RPm-mTiC%Yo~1f3>|Ι|Fsϧ[ne'#>\^^XdڊNgee!qggn}}ˉ]cccO= ]郯믿?S=z4qD|iӦ-XYHiisrssGX\\,$^x{`IIɓ?LJJSn݈} h"sss|8t̙cǎ w "-pAAN'EUUםIfffH\ի vZ@uuuaaaj@@Yb2nnn.]Bⶶ Ȇ?͛7y_v3|Ï?ٙ=|t:ׯֿ90ĉd$@HvXXXQQ+[X,VJJСCWXAȌk >zjH5N.22ݻ_b( r9p||3W^ HClRpa?YTUUursssmm->ҩjEGG#k֬ٳ'Y6aXNBOF>h>|M0zAˌ$GGG|`ƍzhݺuc?mټʇ"54]]gϞ988p*Nccc. !'OX[[#bY~NX,oooF366Gjkk߾}\ɩYA[{ݻ666d' @QMȒ^' 2$88AY`0.\x$nkk§p瑟?f|DNNӧOXɓ'={JKK:ӧP[O___C%%?~Qyy1>{t9r$#7""gΜwΤP(͝7ކ %<<|Æ dj*$MdL&sҤIn":rVqu3E ̧ NUSfH>R@G1mڴ7!! aSNհH#99Ǐ\p 6`6z!C# C\>ŋn IB766>d:'^/ƭ>j?î]vO>y򤲲2>y믿"-Z033D:^]]PnKPرٴi Y?~ҥL&ٳgNN΀?͛7[l!i4Ç2táhAAAȌ$JII:tRH)fnnIIC8p >"J۷yș~~~|*tRWW700G%Z7n'VTT 3s~ˆ qww'+  ׮]344\&OM6 {l| uh L"r$ҿ>緩lضm}˖-dq;;;9tVo߾;wC [53ÑcbbwرsNRR8lll t:kL8),,GnI.,,\~mx)fbj>YRooSPRR 4͍| ߿?cƌ:|ׂ=ѫW~H%$$$ @ ={ݻZ1lqqqH5 ]t钕EgRR8@\\\mmp+((uNOOBM5gϞLgëP-O1 {=a=h4;>`Lpp0t(O>F>bh4Zjj*?Leƌ#Dk 5Ǝs=ݻwfff׮]pn@z葝0lÆ Ainnz@́}}}MFٲe~C~W999|K _~iB@ ˗/lxԩSСC,X@V>UӧOG:ɝ8qbƌqmb0((HT*KT*ȑ#JJJb@p'H*Z\\֥K=ѱTCJp0L77gϒϟ߳gO|)44T6d2ǏWSSdz8 -0) ǏBøj>^ϟ?5Ύ|'O~>HP:$֍77Fu֍?^<RQQ/--zOJIIҦ}JJJ^BJݽ{733߭QSSceeUXXCCC}}}4v eeeQ ,߿ll'Op== Dajjihh5k֭[ʊDT*uǎH?VCZ 0СCHϟoݺUkV9R^^ H6B@7oF".ƆS( |y{{O0A,Ev c]ghΝsΕdV@D666̂&YY`ٳܾ};qMpFFF>|3332QԜ)S}9߈#/^ѣ$7ݻ# ?͛'NG޾};`^\СC;wژ͵GNKV>ٳg_z\m۶ b|O>E%`͜5߉}ԉq ->54?;sڍ)3$k X,Vjjj```qq1sƎgϞqI21 /t|P[[ƍC%++uR#jʔ)/_$++Xk׮H]]]xx(c:;;O<)..0,""B(** # ޿سgO> Xt%d`֬Y0 WWWܹs=*@SS+qð+Wq0롩;@>X^RRA'WTT#:::(=  @NN.88tw6m?Yff|}ɒ%L&xhʕHS΃PU}0҂ad5DSSSݻ7~x'~nرwܑpnM|||p^~miiWRR"gnF n޽ zyy555QԤ$d;wDC=z4!h? WemmmAF(++?0`'c2pĉ"|iȐ!dG,cll|uu6 I|Kc&|Ҍ^^7%RU]yc ` :33[n]xQOO ߇v_HH?|7K99;w"Ca.\Hl{ѷo߸8rE@yeycK˺>۷o555HT,2-֭Co0 ?qDߣTEAdd ð6t: Klll6o\YYe NOO_bEHHH.]HIk׮ژ|3f̸zjHK"ᦦ[FFF2FI9۷ϟ?_WWw޼yn----UTTD(C0̂ & %r^zhV"-=ZZZ,^׊;$///$߿'Ŷi&333!S}5 FϣVe\!RdF_GI,Ω2)X:j^ٴpd2-[FYXX444=zߧh_~qX⍢C߿'rYF555!KvRiժU~;vէ|+Wğ|@v@gcO~ŅBr]qJJ v0 G999.ܐ7l"}GRSS3331 LNN=pu0 fll@[v煝4iROGtESSH- YjpadÊ+U@l''' :ڟG+**&&&*((:)Bݻ7)`$%%i\\\oݾ}[¹䒒lllxzz %+IR{Aqqq"Gۻ ðqX,ww߿rQm%OC`*ʿ?ۻw[m! kuuuHXUUՀxׯ_3g7fVV_xuV%3tz@@0mm+W! LMM[mlnn;3f ԥK2LR$''>}#t:3YaLݻuHHȈ#G׬Y#Ei& /^s=!@&ϟ?#k֬iky߿okk؈\t %#&'''d4)Strssp1c<|JY+X)**޽;(JIIH҄1qF[g455댌#G޻wS(//۷o%YF& ^.9::ZOO/<<\Ȣr1c GGG▖ ,s2dHHH+W~Q Æ@9 @___ڴ>{"֭[׭[7lӧOG5sݢ~ͨ(8  Zjii 3gƙ3gh4)XS׮]]t5j߷o_hh())I B!N͜8q"uV9pZZڕ+W_"/-Z?SPP>|8>mŎKjbbkkkyiuuudd$>ҭ[kג`+++>(''H#_.\ky=[[[ggg!*_| !&&&=rpp %1kZ킥K.]69ܲe í;w.R|d^ZaՉ=9́TjBB:hvv_%umYKK 7B@Xk5eeemmV޽ǏȆ IEEɓM* СC ,nLOOOʽz$oܸ1rk׮ܾ}W7)Kݻggg/H< СC$1/8%%%'[Xcgii)ڋ/x̱b(//?߿?MfRӧOGz%#Eee%񯑈˗ 7fLL ^/G,X,Vxxiӈ㓒TTTH 5m`ccŋ={tڕx.xȐ!6l@nַo߼>$jrww}d>́1 [lh]]ݢE ̠-pSF 2L/@*ܹٸq#LfƌH|ǎׯnϟ.1sLᆕUUUO4##,Y 8X6ׯ/--.)""_~ PdXO&++ HHH@"yyy";d|?t={O{nDD @9 1%Vi\YYY\\>AV>~֬Y7ڵk7m$ܘ .cF__X)N<|p̘1YYYC .6l@[a.g̘1lW^Ene0.]"+fff}A86ouuH@ss5ѪUvZm3?&Ŋ?~<퇢bdddrr2F  .x„ \OxIlllIYsssMt:ޞm}ѣH$??_jjjލ̙?9:3^GZ?~TUU ~~WRR 8͍|:9:>o޼W"qWWh=wÇڱc#wp?~?|||C y󦷷7)@8@T7o.8##c$#G|2rbssyn޼IVVxHpٲeL>70l::: DtJFiljj, A>`I>`:l۶FOgߖΝO oj'3qD t|?5jTJJ ٳ?~,t(@|HVV8իLGFj}رc\zϞ=nҝ ݕ'NsŋSN# , +ΌbXԩS d2]]]8jkk>O>Ba544,]͍C_~7n nݺEEE=|m=277!vj'ODnUQQYYdJx ?˜vBʩyf͢_R#GG`XYSQQddN_^^'a16xѹsÇϝ;|:M6+++ =[BCCZzٳz򥩩)aSL7nvabbrƍ/*1dȐZ ֙=z`KKKN5ѧOggg$"***w&̩?a7nҝ;&^G{) Ȝ<Y3B@[lAvܹSV+td;vصk>|+WCm7u .Vrrѣ?)NNaIׂ &HQ~\\\/d;'M;j'{A&%+++cccE )--<5j&xbX˗/d%#( mӗ}w޽r >bjjjmmMV>ց^%+VitIQt@MMM...uuuȡݻgee @h/_twwZ+Çfffwܑ|zӒ%Kۇ,,,>}DJJD[[{ŊH0 ^́wڅN4|p o߾ݰal-oyA鷴#R8k.(.aH_ tttrrrz%111gϞzh޽hHwޙGGGXZZJ>+X {} ?aGGGٻc AŖդNBCC?ܹS}||𑆆uqh$?'666++Kw*5]A})%]5772e YtNΝ[l}o߾yyyHz왯/Cseŋ&&&<@ +77W&QFݼyŋģ,+%%$ϟϮٺuk@@|왅II=hhh7#""~*[nE.\o2sL^@{~mSS>5d_b˗/q*(TxĉÉb믏=#%1+X@eeev޿6vXd]DD;{ܹsRF!cǎ>Ì3ݻws'&&"Ο?/;-pEEǏJFڕWUU:]⥸/HWQuV|BO't޽9s L***.]B~?!&&ĉ\O:U;ׯ=ݻCwޕ9n@|^ )sxx1*ELɓ'Յ Rd0UffoMUVV~9~2%<<)IԻwϟkii@gPRR\ti֬Yd#mmmy>|'OZd9޽{7[[[ZKIIqttGSRRʧyɔ)Sn4ŋӧO}~k~8 c۷oG(`7|Rgkt,5Cw_*d'=z[RSS Y,ϝ;L ĂJ&%%td>+++̙3RJ=t萍 >xgϞ8ڵk[ ֮]Ήeddܾ}5kxy zzzZZZ|Xf ׏~Pt #88R~zBjj tɓ2PYY윝M<4xT+)(޽L}}XRJvU $@MMxB]]]HH4 h'rrrHܹsK.%6(f͚LsX%Ke-[ /^yHR9?ɓbI@A[`10j(Ai@ss3+]k'O,,,G.\8|pT,,,>%%%!˺Yx1@FP_͛#G⒟ @gk: /^ xByyԩSSڊFN4 '%%KBB}d́}|| w܉m^>$+i#>G'N( mZ())iQh N#rrrdөTTTL4 BP:$5QQQiii\_~Μ9_D,+**jڴi:]JJJqqqIII*** 5ӧݻoq=!//oԨQM)++gdd?ǯ[t„ HpbY᰷'6G񑪪իW~i犊 ^Hc i|_AիWHDCABBBii)>d)ZÐ^X|?|pÆ \رCKLJN# ߿/tDw9{(<~aTTڝjFF2يaXdd$r':v?}b<::iC*z1uuu9YT> ID񯡤$Hb󵴴[JGhM6OQSScee`0lΝׯ}߿C]v=}4F*dMLLΝ;G<4wC%+5I@PPV߾}=z4*fff&@ppp0rW4_͛wJ aРATCCêU_ƕ+W~Edch RxMydNJ9 E7>|Yb Ԉg͚E,ZiӦ7>> qa ѣ*d߉waaaΝҥ )DCSUU ~ &掎4 Eݯ_N۸qcLL ));"##2͛K.#+V:u*XmHZ    H3~!RPWW(++O'0k,UUg޽ϟzhڵbΟ?Ãn݂w/i ],YS(JIIںuT8z왓cnn[Nb^ZAAAsժUQQQ`PP+++VիWO:zBr9s挃q=ztvv6!ro5 cС Ҧa߀߿ӧOW>}ʧ3鎎yyyH5::Z,xjNcƌٵkX"yEEEI͚5+11QKKKYhԩTVUU{R"&xd0WUUq=A__?22Z‰ɪss?rrrǏ_`YYgϞ Ç2̙3\#111Hݻx{bA&;wY&y׮!?jjj2L^'/YqF/gׯ_u놏 2ijjj޼y?`,\̙3H̙3thUUUըQnҥˣG PRRg}}= ܺu+|;;[Z@eq4 2^9u$|)@PTWWW^yyyO(..9s +ڠAz2 77/Չ-9RVV&񣢢&aaaȭОHeeڵkŒ"z1 &O,8%%% 0)o>aׯbVXA\6A{쇁hZ[@Evt@w>ߥKy7nܻw/433pႸ-\3ס󦦦&I ?77wޤ$H1 +((Opss6mZQQӓ%cǎpႲ2>X__?{͛G&́5kիW#?~\nXrIH9|n%8d `WA_ w MJ;~!O>8p޽;ҽQhhhXX>|8qYhnnn\Wt̙34M,&ooo;;;dGaW\ Z/VQlyֲe5Îoذaa꒝ƫ@ZgϞϟϘ1 ׮]1bwmms%SLpRǏӧOYYH(--M,ϝ;iO]VV{n|J;v .dׯYH&d:Y! :@hhhSS>Abl2&7//OGGG\W?uԠ q]ϙ30FCC̙3QQQUH, @(++p=!//oȑ?pnȑ#bEEɓ߽{GVVB۷/vmppoڴ)CR93=z433S,9h ,d @UUB:ϟ?߿P(V"EIIɱc]]ELz{ٿ򋸮?s=ԿӧOKK/_XYY K&"vttt= 咶mVmmmAMMͬ,1=r6EEŴ4mmmq]]ݸqcĈ׮]#rqqs玞GEEYe'O.((:UQQ6uTĚ5kBCC`qqӫIIIh[nErlmmgΜ#_~HEEE@@Xr%HK ӧR ےJ9Yȅ^zu)|pd#ݻ7gΜF|PEE%##cԨQJKKX,Vxxi>}RVVOJJBUhjjr>v˗IL` SPP~%@ׯ_1bB``MgϦM&ul}}}{聏0ŋk|A+!+ @zU}}=>n`` 8.!EkHP:ѓ'OO[ee匌 dTD7ozh…bV;@ޖ=x`ɒ%$:I&͞=6&T5B߾}rssG٥ jǎֵ3gΔ599"[ne|===???|y͚5iHJ 4dCϞ=뇏@=zD> ^ #;ӧOϟ?ّLzӑbgN+jiiთc677''';99kjj*++XZZٳ˗/IxVRR9 iravŋ[II_~ 111sUSSSQQ՝1cFdd$Ĉ`;cǎqN355ZINNf9y䉇ڐ!CS"G  ڢjMMMH3L>>555֭[g͚ٳ5\lRǏb-Zݻy5ٷo[ZZۺA\ULLA. 5Q~Ξ={E}566 6,;;[I#*ij,Xْ9 ]).9s̚5 )++ CN>|?>`0.]J괐Hsb REEE^B[g5]]]>{HqFVF C*++---# ٳl21^d.\W@oGQF͞=Ǧ Çw֍Oe eoZUUU??񣱱$&&_~ayUV+yǏzJYYy޽>|p²e87ﻻsJh4//=~xƍ3338OOO+++/^صk_z^߳+Rn߾۷|s .\|'תo?^G&lAAAHV<O>thjj9s&5tqq]3r>a>>>yh4mF?Hm&4d޼y\H#߁ 2ΩSq@~!؈Hoj„ d'%;>j(®]~-bsSbHܝa|XXJҁNE,ؐ_ΝCſPYYǵ$W]]ܹs9dff⏊[ZZrss9ѣGs^|Hs1'WYUTTp3hBv=͎kiiUTT Obׯr^ W^Jo/Z@@>rppy}HII122yphbkǏ/_ՖHԣG#e|== 6#\+**#e[CCC;-mm#bC`d}tڕەl޼쩫5k k8qS1si^UIаtR777b~ݸqvr͟?޼yՂ?}߾}췷˗RQQ9uꔾ>Ν;EKQFjDKMM511!chhx%;vh#Ӈ3ܼd&Դ`Ç{)((\pX)_~iii{0+V|)}2LOOΝ!bHYY9##c„ Hѣ>>>$Vl ]\p,p6Ss!ۙ.] QlHKbY4ڵ+>y1y),,??_SS;||[kkksss% fͺ}6_zWY xVRRJMM˗\L2%??ܸq Cq:~Yr=,+11Z=aoݺ'SZÇ{;w.aÆ-]uqqĞ$ɉ{ݻzj 3>g> sNEEEMׅ ` Ν[TTDшGݻ7foo?~H>7)r%\;a[n%%hH0++ ð]v!;ݿbIC/@Ϟ=&N(8> ~>}9r WP(`ґ)t:ƍH-**Jתյ%&&f̘1⽢$''=H\NN.((('' Yw~A3gΤ gϞq"Ə͛mOS fff\׮]|yyybI׏ƍ9ZGG>ՕQ _+^x]OEE%88םw---FFFIIIMhjjfffݾ};ʬZptvvWEٳg#)ˉ/J\\R"00T,iH5d˗d%!XuE&M ---HUkOBReRGb<<<Μ9ħO~Iyyy^LJۀmԩ⽜X{nĉfXZZJ>+ӣGוTZmj9&:pRR¡h*bڴiWG֮]уkq |bZU[/@gk ˗\{]|yСȤѣGNN_\\)) r>a޼*NՀ́1 ۷orR^^ѝ5/.vo l>Ç r9qӧO''aXWGSLp礸$&&p=4`SN}At&&&Ċ +77WOȥiNaXJJٳg?KZTTQQ* qe(#F"xQWWW k"O 5'--ؼOMME}} -\Wpo߾]v->RPP[oiiyk%2VL8ɓ'\&.,,8q6K==}/Ȉ,ۮSc0ɓeddk֬111 }rTTT5RtV:G.APP0000fee1kbrh&!!q y?VJC9 & {ygg'fɒ%C&}J %%Şe lquuի&0qFl" @OOPy,===>>>zzz@ȑ#oݺũ!e˖Z { 7o&vMw#&ёztoܸAױ… 3.#7O+904iL&oܸY@ //o^ S$ N GA'g`CC%1_~|xVV+;L`Š@SSyyyv2vCkspٲe@kfd2yʹx\B!??I$,, :p֬/[W=߼}몱S-%%8ƍ;VU-ZhLXz^+oJ?“wɍ p02@ H{n||<Յ?622laeeЩrurG>|0`LHHx9 =u190_HHD9tPii)<@L $%f1K蓟I_h}zǎqO<;v,G\OVVq3uPP֭[GGJII emm liiQTT9s~pK^^^ /^`>>>F't͜9`HQ__?eu O>QçO-ZDjyyyoܸakkˊO:sNUbbb/_:u*+e 6ܾ}X%--~ i00JB\ׯc? f̘Y%%fD\ʕ?2hnsџ:U+D!DO:u6##CEEv↥e퍍GE=3f ~jj*޸g{{{11/((%Cٱc =r`q톆dwttzuހÿ>}/_W:Wȑ#paTUUjH`RRRQwx*SSk׮q@ !@0% 8&D$Qi/f\ >[BBΝ;aaaPÝgTl:55 '.]4eJ[[ێ;]Ɣ/_~=RUUu???%^{aϞ=W\a'``Μ9{UUU޽0?~xIIIZsssu,~ UKIIpʟJ}}>Qɓάήjs/^̊q'<<|ӦMoT!@@ oܭ,?>vG;)G;]jនsN6(r9~~~---.\_xadd8;w#""vءʔ!~YN>f@Ag>zr~UV2œ:///~0''(ʻw3ftvv-t?XE@@@IIQXO[<($$)"MMMEEEرc۷ogň @ ݻwoذ2H{{T7oޤ#@ ~@8Fwwٳ?i_8 D:wӧO-,,zJPP(J$##鉷J<~0nڴ  0-0 eee?[ ,`+`?A+))q6Y^^љ4i 778pˋ#vuuY[[R544"ܸqRZZJ nU0P񯩩,ijj[={vCooo`áC8πmٲe^۶m;|0ݶmǏV͜9֭[̦;w\`s $3==}ܸqq @ 0@ *((pss# S(P 쐂7<<߻wޞ$4[lV^1gΜ;w"Ϗ71wNǏF\h~ol2>DFF-gimm׬YȢAO:BJLL,>>^TTECӧҲONN`p@ 0@  x4447nݻΝ;Ra@8ׯ_O׷[.URRڽ{7 f]]]UC - NAAA_(@1931DOOCRR`_bEXXDbŠIII{Z% 3m4V+:::, _&~sA p0@ `0::ZQQ1<=y򤓓T%KN۷o>ʕ+;wXYY1eݻwGDDdffFEE-utt]Y~~x̙30, /. 뵟BO 9(dECCĄS ,{y=uZZZͿ}F>uuu+W|!j֬YьdԀ@ ` @ a>"m AeZ{{{oذɓ'@?֭[w֭/0SfԨQ<)**s{{'OSL, ضɓKܽ{7..nٲeQWW|2߀3FOO~>~ڊO\\\̞=w_Y9vP QUU599yĈgʕҘ+((ܼyv322kjjU!!!BBp@  @ 瑓{qHHTeeERR255uɀӓ###FO?ӳ[jjj9Bl)&&v yff9õK{zzhM)s9sH$%%^!V $3gNᄇG-K.33gӧ=E'&&R7nGŢBPuuu!!p@ 2  H$kjj*POw^|yڴi#L81##cѢE_| eׯorrrΡxc@@֭[(2 %%}iℬ0ׯ_ עՅYrrr,XA81!ӧO#G2?~$/_Ŀ`B`bj pU8uG;Ec۱>ׯthtuuegg'%%=}[TTtҤIg644466ഛȀaҤI)))ћ6mjhhjTUUw=t2[Ȥ-Z$B1(N>}mr,/--o߾c-[`pY;;3dذaJJJC6%@OOϻwUU՘EJJ:_z4ZLxѢEd`qggg@@iĉiii >-@RR'*7n0~ȧz!+/$tv"UURR粵C S *?2BBO4iɒ%'O|ϟ[[[;;;_~baa!--4L *밶~KWW=KMMIvZ lFXX8((0!Rf k׮ӧ-YYYo&4i>Z Lvuu !(--D ,ЧܹsP(@ʆD"},g @&DC 0~x`> DdcaB&:My>|xbbٳY4hKKqUUZ .hh"gϾs<77Ɛ _FGGϙ3gܸqݙׯ~#@  ٙ"J-RRR>>>YYY555mmmӧO>O㖑1藠B1G-**ВQQQT>}?Dbl ,:fff999 c̙΀… ߿gO ` ܹs7n܈mذB, -T?4D"͚5~JPPfg]qMg{{{:q gbbĶX4hww5O-AnݺǦuZZZ(߽{FO ?ҥK&L9s̛7ozA::#@@jN{18s V633+))9x… ǎ;l0~~~qq 8pk|1fib@ C 33w޹ wSFFF@TQ(+++fͼɁ[Rѣ'N[?~|Mx…(++-C3%1GEDD~YZ~~~Z{bxyyov0x?F~~h֍BjܸqG(תU֬YTM8ɓ'Č)++|܆ _^ѧ||,s@ \ @.XիLL8~ Z!MHHʕ+ ,@_666&''Kd02z萐?>{!!͛B߿/]!!k׮ƢPf s3f-YYYĖ"""-ʎ;Yxhll$VTUUkkkiiiFb tS(R_>|[֮]`!Hii~CCabbºq}}}ϟ?OJHH޽{xTK,~B oߢ]]]L2uGDDRӢ2e 8:"{ &Yp)le p!::: %>>}RXXȞGFl- ρїٖuԘ绹'/ /_3_aaak׮gE̜;;;_~]WW)!!1c }}}GGGIIIGl߾-Ӛ$*--CW\qrrª7mڄ Vvvvyy~!..`eeDDD~L&KJJΜ9`մ|=z4///иkd~~.A>L_nݺW[[K"$$$̙ciiiccCGOL>]>w'OTVVH$ ]v}ݸqcժU...@g|||vd8:: A233`ѲJ{{ bccҿ>eMM͡CN!>>Ŀ׮9 [l2 ru;"..Qx<&&fҤInÇ?tPOO@|zZ|\pj***Fߵk֘L&Y9bZR(X]]-oL>wkӧOɡuNDD?B9q9+V4669?>!4NO"SC묮Zrssw=k, ))KW:::"""M&""2l0iii=='NzxzzʨQ%$$7l 4NHHuO:DUohAZb?~P2>0wD.jqyyo߾q1]SUUU___XXxEKKKEEGY¨QBBB(ϟ?WSSuA%%%yO/vvvaĉ[lBv۶mߛ7o W,Wji ߾}b{ gtv|Q۶mծ S__?77{{{{zznܪ*cccZLLL.g.qqqjjj +$-==[ C7oIHH9s_㭭CBBKJJ.^t嚚`-\rFg^{/_ϟ2e 2))i˖-rHnnN:׆{9;;cKK\\\01 77/_677;77w޽h׮]K>(**Zd]RSS[ZZÇc*L|||7n|iSSS{{۷oׯ_O"뗍 ?dOj >?~loo///?}4x~ժU5OGGCCCNS"RWWgii c'РE #ჱqzzz/e{}A3,^v|||Xxyyܹܔo߾0k;v̜9oΦ咗7$$޷o >8iUUO>- >"jjjZvttv [FsN90Phkk3775`߶m-~بG+y۷̥"**zΝ@jS Ʌ666bbbsJOOdl޿ׯQQQ...p@ ]H`Jdd$}E_ S:ujii)q߿uN߿eݻw7n۷om6W^%ԩS)W^3@$+\ϟ;::dddZ b'/_Џ n:uk\ ]]]hʵիWcӦM700@k͛%b@RR"""/^d蜅L&o޼x ,\e!c655Qm 4vpp`'AiDAAp322ML>  1sbPۛm:::NNNd2u㶵-\8.ʔ)SjjjX7:B\`X::BP>}bmm-*ؼO8}*dBYbckر߿ҏ`|3ymmm|scgϦ7;;VaÆ-jF777o޼ʩSzxxy@ S|mZͰ,mRRRL<4???h3---|U>Pmjkk6\u?c-wѣGcP(MMMt2TVVNA&12P+** -(**g0\]]@2{:8::-?}»5֭[@.SA$%%8n.ӧP`RRm(‘X?_QQE򌌌:sNlV\p QQѐZRRRBCC H.\LT+"""D/^1'OPAAA6 ʘ1c M6utt0n@AA 9 KKKhkk1GA}fTX? 9zh> P(...р͛zΝwܡZ%$$d\zzz|||jkk#G޺u+$$ۄ 0L_RRŋ_|a#FTVV[@ ~c!!!q9۷޽ȁXɿ~c̾r=|+ȮN0a޽^ٱc&ߪݻwbjԖtĢhn#k{DžwYj(ժŋc庺:X ~j @w=Fssׯ_v횹9`W֭"/?qD| A[R}ׯ_(c0.U[NZ``'O6T5a+&))I58/iI0z/7A$$$x yf@ AK޾}"'O{hz###___2 T͜9ŋتԄHHH` .;SWWLKKkllLKKTWW'w@ cmmݴiS}}}Gbkג2w\qYYsǘ0aU{qq1V'5k6?'O|yss'O)lll\ԅgu<=>>>9 K ߿s?tK\?ێ}u TY$F%..NMNNVTT$iGGGw{ܽ{ٙ8%R?ܺu+߾};197-I$Rpp00w!:"C6-0@UURG\1zus{߾}#Gd//`8{a **jϞ=j/_΢333҈U999 ,2thmmMOO3g׬YF[ZZrrrtuuabj@KJJzFV}jhh{.xU^ƌa-Z뛛 l4GY <=IIIL/*؃s~)S===X)///͛7N6MVVvڵ7o[X[[$`4559:: ss~[ ʵk8ҴiӶm߾}˔vdRPo;v0.)// tϟR?u!W@LJJ sqDc"k֬pݿ?ßx(J``.q۰aBCC٦R-Ydzzzo29s֭[ccc4@ @ 8>ntt4VO 3,_\h)- 3Snmmcg͛=^+3N+yyyv6}GDDV>cELlܸKQQQqUV;VKK+00pMJJJDEEaa0<ъw B(Ν#>@>^ beeŬ -RRm|!`Xlllbb"S<u e(EUUXJ5 /_}tb  & |z{{ӏ)Μ9C|O>,͗PPP`iiuìÃ"//K!^iiiٰaĉNFrJuu/_1@ mbiiiggܲe ^~溸gϞoi-jmm dG EEEjk>¬X˩StttA#23SyyyĪ:KKK''f;:DDDRRR"c,͛7ϟO>ͬ!#G֭[,g8ˌ3P{! ҟP^^~UeҤIk׮e+WxxxƩS>z{.ϟ h)_/^d7o444U^RQQaMYYYhhĊ+.]T]]ȁOVVVmm͛7Zp @pY߿c)FVw:kB@sL&rD0vLg„ ?o4t@ Zt444$ූc~!TabEWWUUU˗/'.lnn޴igrp0q\vꮗk׮WkAeQU7oޜ~:Ɓ?#IC0-01!pvv6FWW~O `W\qqqqk׮VHJJN>Nrt)'..NoF L^a]g;vHII)//٧. YYbZH 1&L'LcYYYBlٲҥKlvF\\ѣ155L韏ٳݻƴvڅtvvsP fN:;;?|-t2` !Ç2n?8p@ww7rȑ?P|5sL֍emmMk؃o3<2BaKi3wܿ;++)--ӓ@ . ?-ӑ\bZӧ7ٱIOOzlmm-~Wdeerll,BAAAxx8Z/۸q#6ŋ_ҲfL`ȑh۷tfΜ9ŗ.]ʬ ͍A˗/ǤTr!Xʕ++Og~j„ 'N^VVVkY!aAH$۷oϟ % \dddP(7޺uΠi'ի}`E->>>T۷$NuZmAr@߿>UUU탌h'!ܹsrO)(({.ޢ}e?naa|2⏡P()))Tkx=`;x`\\^jGtt$俴njcmmRYYC-\!21&G+|x"fOt"ESSƆV5ٻw/Z鱲,[ 7r饥ۇ,(({euuuGGǯ_***w)++Ϳ#g`۱swrr*(( t ͛7c?<@YAVX&d>ŒZtttB~~>g  2#  rrrYYYDn  e99 === 􄇇'&&*544`hӀٳg _xxx EL[B@$IYYlS`PVVNOO;]]]VVVg'***k֬gΜ\ɁnJ5ehh|r־DL<x22xB`^~ d9~ A޽{ ,sEt=ziU$)$$H]_XX秫N 2`I !-vQÇGe˖12ʏ?ׯ'6#ɛ7ofMwbo ÖS[VVV9e˖1⪖Vcc#N:::X166niiLƦ ))YRRӉ,Z~]]]Tdz!>C@ZZ<)>O_碢"Z(jXqbb;::*++d~ p44ٳgKJJP۷k]844ӧO_|z"U^i-?9--RN={FL ,, <0́ӧO'L鿫 H 5ߏ5}-S< @ &p#$gAIMM}}}!FFFZb}(<<< L=' oZZKG~>~۷ozp:*y/smD"yzzvww3w85--ͭ L斖铀@ %H/5֊c<$ܹs/_7nf3fHKKsrr"V)++L4ꁣG}ur.ǎPXXÇY W3OFF&,,,118B".]Dk8A.\#''NJA9-[V1ĉT?!~D|rr9ŋ@PgZغuĉmmmկ ...Æ :uMG&yٳCCCә?~\\alsCXX(7|Rw9`nϞ=TߏMuuo8 ǿTUUYxq08++ RII"YYY>[uuuY7"SYY<|n: q={ܹYcutt[ZZ''' `C߿ 333C~QBBB&&&_|S``.8 @   166^v-#-׮][VVv;;;999QQQ^^^QQQeee'':CCC&L ))9o<b&;G"Ϝ9cjj*+++,,, %%ehhPQQK033^~kbb"///""LJj͝;w˖-IIIeee֭5֭[?dbb$$$4eʔիW߿?++KZZ{UV 5JKKرceeev ^gEPP0!!ٙα|||۶mKJJfϞ  ~? Y%K ?קVE8PUUŔڃRmk.`ׯ/_O8I \]]wEUUoAӧO>ſf?BSo뗗%#{+˗/h%_j=}BGGGDCC׆ 2ਯ733rvvNLL$""&&U[[*##o!,$Z7 'L'0ttD!A_f̘YqIH-bjB{.\|}T} 0x1ՃR$okk}vJJʛ7o~5buuu ccc50ß={Ç&$))9ydCCC++S:cƌYlեm ӓv)!᧺&t|RRR֯__]]M "6664ē'OfΜjjjdeebuuufe1c~,//oNNqVVŋ njS\\,!!gB2INN61ϖ2|ةS'&&KRYYI5Ǐ[nu Qrr2~/bo={t肂ŋ0LLLݻG[q׬YCLC"mv d{hR^^3g3LbjjjffìG@ @ Yzի{mrBBBNNN4c ,op>|C:g, 6m TYXX[. `ȑq)XXX\| xS__9e60n8۷o޼z*Stƍe{zzlْMꡭjժׯc}1"ǝi2uXDDDFFx##AnB@+P(___D" X:PVVf``@+0(̮vww9rDE20++X&&&&$$0>˫ifffnnζ>@ @ B11(111b˗UTT /ח/_・"`ܴi ҟUTTgϞ]vjwԨQxKXXسgϘ Gؙ1ϟsd` N +bܹ,imm577'>nnnђSPPHLLf@Y޾} CB%%%//O>|iHHHuuuvv' @ c@hbmm;SSSbUyy_~ǘ0VTT԰$loo T;x Bٸqŀ}mm-U1 IDATPUUMKKN2LK ;!+ooo tvvZYY=y]9\.]ZRRBv„ LI Fqppx)>ȠL&geeyxx*)) N2qĭ[#!!eرl@ @ ǸqCBBFTkiiњ%>~&O -L$$Rl(++ !!lDtB@OǁfŊFFܽg6nnnIII@|ٲe~&6<{ݡC޻wOGGGUl6_/_!///* =;c &YVVSF陖VVVvI;;;@ @  J˳655={ٹs',,,|-\ۧ ) U;9s8"%%uI)|DOW3f f5,={с`#^S< /- 9t:::"gQ%tvvzxx Z-Z 4 Kfddp7i$W]`Ì GV\)ICOUFL4N}d؈@ H t ]]ݴ __~tAC .F<Db||<аa?bGGFm#baaARFd"~PJJe%//#F?~|w /^W0a(֒dlM._ ^*^^wzWFFmnnu77CCCH&o߾e0'ND&L4׷666b@ @ .$Ngdd޹s(11Q @`AG-^Eԫ[FEE xPPe|!555l$""ѣGBD x[`0~x"܌ }A7@[[ۡC]kI8t:ܹs@pԩ7nܐݺH$FEE͛7O%Lw[rrrAAA d RVV;vOqq1RRRhǀxR@ dk͍?' nbnn^PP鉿USSLѾ}&@ ={8qŋ:'O6  ŒD":u h5ؾ};Wσ!Cۯl6{xt?'x?iӦ񟤳|؈BBB޾}P1cƈb-I700ߺu "\t:/7"8///AHǎ%0AZZ!44Çt:]D-G@ #//d2Fb١怴H@JJ*""uݕ+WtuYY٫W>{ Pᨫ:x͚5H^^ޅ 8S+ISr HH`099+HkL&ޱ099yȐ!"]_~EMLL]hѢ|shh3tttme3H ֯_?|p @  'O8::oYYY… BdΜ9K,L&8ykgϞ##%%uiHvΝ\$QFF!@MJJFLC`nnu}J&{q8ydee%6eMMM/$\p~Ǐwt-tΞ={n^w)="""@D"ܸqChmmMHHpwwҢhiiil6SLMM߿OREs@ -  x¶n |޽{QQQcǎ {Lll l<""D"?P..]bXX#E|ؑ꾾[nNiӦL䦦/^DLC̘&%%q> A2+lDEEy3]]], P5k?_~=v6m6"DEE_3bX#Gׯ_߲e 6m<~JR񷴴.u ȸ|rLĻO)-[OC^$!}(#Y@ ȏ@ @ROyє)SN:EP$!//_paAAA[ZIIҥK˖-_~`0v)[l  '}ҥkgr93g/cfflH 9bˏ;ǏؠN5@C]]В2k֬n}?47lݺhܼys͚5@ב=zHNLL\|9-777AJ...z+W{=9yիWϟ?!y2|8b`C淶r A*LLœ: 5$ʒ"S@zĉ333 lLϞ=vzƦ-U$|r}DEEΝ;]j: ȃ\\\x/^ŋn_vD"q{zC D<|ڵk>RADE14D@ 55d! }G"Sb.~@s@HKK͛7͛7جpQwܙ5kC/jׯkiir"/[dd$'RWWwӧOoٲŋؽYLW[Y ؎.={ב k`0[ ߱cǏ%K`QRRwޔ)SDtffEZZZ޵&zcKK N@0|˗/bZH|˗/߽{(YqECCcɲeڐ#Đ@ X@ n#ȤI}HO% L:5??-f2[[-[aÆݿ̙%%%Ν;edd䅾ѣGU .p) XsyxxXXX#I$RPPМ9sm۶9::4HLĀȑ#_N$77ťS EEELNII͟?<ɓěǏ@!jذa7oLAA… ,E^^ֆ͛7z1]\\Ϙ1#::ZCCB·FFF^z򎎎 e_O3bH@ q @ 8}C^F\DٚA \s%%655}i չpo۶-,,Ltn޼i&@wrF90bkktRlÂ!69a k` D?P033)..F.tС/_`#dRXXhgg-!"##sڵ3gt钒 444pkhhԻW!.._ ɰЏx;F5}P4˗/899@ 5QX`wt$8 E23-Ÿ⒏G*~u@%??ϳg,-- FhkkX,`foذ!Z6 IKK˪U2͛kߜ/r| ``˗/[-B@ׯ_c#x<@ ЃopkUUU!!!؈F˫W͛WWW Ĩ zi[[jwǏ޽^,Yj |5&ɵ4>jcccddXٕIo߾rJ @ ?@ 8xOBAN@\A:eaa9QF=x ((PUU'?x@]]P("ZTGG:bH$>}r鵵;vFڶm&xhhhxU_%#,aF]kǏ?۷o?|1>TSS0aB}577c#{쑗Iyy=V A*jŪ {{{^ohsȑv̙ _i355駟z.Dttt$''kjjh 㵵=== ?NG@@$ ؑ@ WF{;%%rb`L  |wjk,777w̙L&sر} ^^^sYj^b-ZO&L{-vmРA":{lݽBpkkk gΜޱcǥK޾}ˉ$$$ܾ}[甅^N=77WWWOϞdžL&x?d ?` ݻw@ѣb}!ۿ{$gΜui4кVX@RO<_`~X/]T>gΜ^!Dvt|mk,  @ Ȏ˗ȓ'ȫWf$'A22䇂VO|<11޽{}ş144 >~xb rEEžʰݺukܹX򶶶e˖ݾ}ĸ)S`O666R(7o >#Gz!!!Wƛ;v 8xdeeDkjjbU,rss/_އ) @&1'jZZZa/ $\! __߶ Z[[[oA_UK;88yttt߿xϽL"zψ.#"++kool2~dekg0Q:  @5uLmuĤ*o^Ѐ#c,[Eup'3v v ڂ^o߾u>IO̙3gxHkk>IXYY%%%͛7kxhdd믿={B]]ˋÁ@%K888ܹsyUPPN0 1`ffw[@ΈL&ߺu 6gdffbN:!V^|ylDOOOXKcc?vx?qܹ\*++'%%M4Gs~qժU, kҤI="P͟K.ݼy``mm:~.@ _A~h"j?Ϋe H={6BYt)`90()y + 55I'|0222::+ eeeggg !ݺu+C`;;ǏdqfՇDDDlڴeTT  ͛...Qxɱ>9;; 8##cUUUKJJ m۶cǎa#V< XU>zjC0bĈ&NPOO3%++ POII1c~6vҥK?ccdrAAA-tI[[ŋ5k!,iiiqrrJNNzW^^fl6;88x߿n_BDAcc͛7###߿VBGYX5gk:RRR666!!!555111*744DFF:;;xyyj Ǐ7dE211Xxqtt4-ǹs~׳z~7->>^(ȧOu6rʕ)\m$3FVV[@Z D""Cg׮]|puΟ?/@[[+7zTstt`@rLOOh AAA111NNN}x_zZeommUQQΐ(lAAAXmmm7oA Db!Dtɹ$$$|!$$K` @ZN0`,rڗ/_֬Ylٲϟ?IndٲemٳgwG]At&uɑ#GTTTP0eFl͛Icذa:::@d;XחL&sÛv7QdggfffB\twwYhŋEZksN"9o޼Ocnn~m%K<~xɽ"T***?nܸӧРEEE999^^^C[ݧٳg톆@ H R/^;/^hjjtgd"--kOOOP__chh'xH$:_?zj& c lbb"Prhlltss|r55}a#90pFBL>yYXXi{޽ et85a?ڵ 8|aClƍcA^aK7LJJ*""ťZ[[}]~k"NP_WW1cݻYZVV1&&/֣HW^]&` @ĉJKK<==*hsȠhjjj< ?< Ce2Nzuԩ&݀277Jo͞=ϯ$e@AW^͝;NkQRڸq)SG @pM+?W|Pa244DIjjj=\KKK@ήs#-- ХN ӦMy󦜜P(A ٳgW\پ||r5j?%P)//g0cǎ!sҤI ..."E nT@ 5"aɬwqq3966c ᇝ!@__?!!b̜6m"!G IDATkYYs3 믿6663֭[w={fgg't9#@ ^DSS;w亳obbvZl{0bff}T\\WӧOL\(TUUO/r~e{n r,ݻ700ߺu`6lz@ srŋVVV'c~~>VhmmaȐ!T*5//t:}bS&N^wS(>>5J100afH<@ GVV)&&c_٠*88x~~~ vvvyyy!!!]Alvllĉ}||~O?R㙙fff7nV۷o , '##s-]ׯo6m6'^-J@@P d333O-! YYY]]]鄗8 @EE$pTD"͜9gr#)))55qppHPP LNNNL8 >GÛ7ol/^$7..˲DDhkk|~D]LLLuuuHH%XXXpl] Yl҂@ ?k"BcVo߾ ຽŋǏG œ'!HT*իW\E! ~hh(W}frrrPPӧO?o$.a0+\hQss255h@0!!A(51dl$,,96goQUU3f 620jUUU |oՓ0TRRY8l6 J&.\غu+?~ݻwEj:u;w׀CLҲ~z<555;w•_^paڴi'Nd0?~3X__?00bHKK-O%@}}=j2eʔNj63@$Y @āNeNN'kaSllŖ*QTT+))P(\{G*++i4EZZU{ddyAApiC/^*ĵ544@́Joذy!TrL۽v GunrƍǏc#K,@'**j@UL[[b9RK3g{;wvg/_ZZZr5k֓'O >^^^F_P999ŋm۶-I1...x_#k@$@ bԔc@P niiILLtuu1bFKOOӵ!2jԨGM:3f899yF̹ss<~: EEESNe2!%%uҥ߻woŊB4+Q('߸q96H$2L ;vHnP(((wl6LΝgBՌ!pjj*P|÷(2III 8r5k[jjj=zH޹s'~ޝynܸaaa t:=99yĈ% &&&ffffPߊ;;;KKQF]B(;;~رC VUU7nŋ?w谲"|w\!GϡC8?iii4h:mmmQQQ+WUVV5jܹs=ZSSӽo @?l?f^!⠳3&&_222}h%=wB[[#>a77!.a*ׯ_|Ǐ555\/_aϞ= u{A,F딹S>|ϳJzl6~CN0kjjD" l6;223OBB~ӧO$ KΙ))G'/++SVVF(((>F̞=3fժU\$%%qƔw_Χ8hР}qdr ΰ?v@hn.}]|KTTTY,&L|qq1j`ffd2Ǒ  ŋ7d%??kWĽ{ܹ##--%**jݺul/kjjA ""9b``AG^D_rl}hhh9s&ިGtttD"qϞ=)<|pɒ%@ 266uw֭GrYfoggg;88%{'O<fumD[[{K.}۷o{uvvnii5@ X@ @[[N?{N'OQPPEEET*b]]7LuGNMM,X%i򉉉ӧO/^*$ 7J=%00,?#Y---\G23k***QIOlllc***{{ҥK%%%ի&ǏWDAA!!!A;G-s>vX$&&N2N <==322D-dA$77Fijjh4***T* ''J***-ɾJKK #W777TD"D߿onn.++~ 8}}} ߆ 8ϟ>|{ɓ<@͛i&ZGGL&\kiii؅^|Xh6~E'AAm߾=++իWgΜ;v,:֭[ 2`>pbQ(h-/TTT( !"$''gƌ|~>}i:lnn^ZZ s۽{W_%̧N555mooǏljjV ,--:?}w>3τFEEᇅJJJɼu̘1 ߼y#ȜӧO 222o >ӳεԊ RllHsssxx @ X[[455uEXZ@l6SJ :nddFha3n޼+ν{n*/^jee%Ys휗8w0[U-((87oߖ,Yy: d D!vvvUUUᎎ$H{{ѣG-U8155MII7n&&&4mp611K-III@9AA +w6lFrss[AoooUl˓ @gFKK x#ɴU^CCǏc#RRR@HSS~}lD]얖J$''sNA(?| JIIEDDtG\>> M}}GXBhBA{{{]AC+fΙR<a24n̘1 ƫW 8rE K.qD0r@?nhh9B@jjj7vPrr2񩢢\Yߛ7oA k/ 05 5j_bG$33sڴieeebM3̿cǡ޾Or3nܸ? x)ZJo>ls\B:t03?z(p>,iB2e 222;5ӧ+**86o %eAE]8z(l333Fqss()UUU c̘1dPgϞHKK35<pU}}}sssoo{' 6oތo|jrrrtttŜ9sq~… -3@ @ #//⒐Ç[9X***Lb```0.///$$D]]fN8G҄Y租~*((ccDg==w ±`Ag_s༼PHMMMYd߁ӧOy8..cggg@HIIi>bACZ~JMMMNNN޽{EѣGl6ɴ䂂"##Jtvv޺uiԨQ>>>x/Y,666QQQ':%!?zxxr"HSSS06jaa!!w677;:: H`8$ ֮]|yyÇc#l6Kr*Owjhh@w|8Ob#rrrJJJf{vv66! --^I6 e˖&9tttZ*)) q}]x噘\v kѢE@wh4 ooo47/LMMCBB*++CBB.9r$z͑i 赴tTT˗/ϝ;aÆٳgsG˗/]IP߿P(|͜7w!r}E`᜞-#`kk ,~A5L&">>K=Xggg//< FxԩSə1c*//---L3mڴ7o`VV_;6l6x666H^^^TT  }}}l_?{ 8O&ip ''h06"H]vw|m>Nŋ/^G_p u"""lll^~ I$R@@7TTTG[[[llihh(3999CR1_啖"2y &tgzǎ|t;JG4͝;w…gvkf mrL=}kb@ @ GNN)&&5 >*88=XYYeddj`OLL8qWCCsW\ Y777{{{O>}ܰ]z(544888E{J@@.ܶmѪFlMd{v @_F (M4 DŸ~1` k3ldȑkfl իWBȑ#>>>[.$$kׯ+W}kiit. x\]] ***bbb[w@˗/ 9ϝ;H׮|___zȐ!.\D#ǏǑ{gP=&%%ggg`6KKK!+W k0d0۷Ǐ?ŋƍ N4D!.../^z-88xܸqL&s )Aoݸq-~-Z l 2ԝ;wRq~~>ϋbbb|84cwH> t:Jr$&ɷnz"B__ѣG[lo-//ݿ+/]RSS3w\;GիW|Wsݻw>| |  w@X_9xlÇX[[+++8Wy݅ R߱{G)Sܺu x$D|}}t_W **ٳg@H$޻w{}|:yd{{7o9r$N+Wf̘!$r@NBn !:~8K.~`x^|Y~-`DKK A/_pLűB@ 4 2N) ::СCIz]@ kbjjd2) ---a#h4Gҏ y1mbGGG{{{ 99wE;::;gΜ>ɍGpp0,//0m۶AA533_^;vF?@"QYYY@2e | >Z8*bqC9d%R%}:o>^wׯ_9|ˋB7+'R낁JIIFWX[[ļ> ޅΑNFqppPUUESSSN_QQKΛ7h9khh9s{ĉ:l^ę3gc8{L R .uV]]][[[EE\`HgȰ!alϟ) 3? mE%%%@EOOxJB8}47tujeƍ'| 3f̨]|F~[\_u|@ Q˼PQQqwwgX5===㋊uuumllL&! p|N0`?=v֭ 1?.\˫ouKJJ͛' XUU}^8paٛ7oƫ(st8#\ o2 =z4#]]ݑ#Gc!#F4UA0۷O~"%22r˖-@P[[bῇ‚fo\(6l8u~K:..¢OOdz8 cر:p` x}HHLg?2D"# ~fXfMpp4VVV{p7nD7mXsJq屰PRR<B N>}|+$}}}zj>c 25hkkgϞttjIH&^^^_7W__chh+@JKK;v,pfϚ5OrCٷo ȓ'O,X )ʕ+ RRRz=' ׯF ϝ;b I˗/ P,?WMP# w60 U3' L:DqƍkU+555ſ"l6ӓd}3gN{{ϒ%KCMLLd2|6:!4m>>>|wrttdX!Cę$OjlR\\}vSSS4lذɓ'o޼999ѣGu6p\|իhPWWǵk׮g H$@ʚ5k޼ys˗*++Deee2z길Yfu9@;> A~zw6Ȇ BP{y?}y :qnj_ևl6{ӦMgϞwhccPHPQQ)//WTTekaaURR*..Ɵ377ǎ,))jdee?Fղ_֯_Qаua#999իW瞦윐9;;tIb999PÆ  D(UHc@lQbbbƌ#D(mmmqqqL&hz 6gԷ a0qeYzޖא~MX^31 sr># D".""2<<ёH$ӧ3ǧTlBz~BB%_9m4WW׾=)/|ʕpVCC+F+$sؙE$##cɒ%JII =~q7155Rmll#MLLVZTVV9/)3ђl 7wr,X@s Xj{gNNPM433s{=\DWXv-p}333* ݡ`?Օ4$$۷@ D5teeewww{gffd2?~(nnnO:uyرcAOOO>]xΝ+Vh333$ɓ'b#i ]AQ敕vxRR=KЩGϯG390@8sʕ+Eoߜ޽.Hpڵk9:GG}4uOKfCE]Q`cAU!b\u+,,,kwP }3R(ܹ3L{cc#+V(('&&;vLBZ޽{5c:X {^vmJJJZZN۷[l177wqqPI ' COOۡرc hiii\~ߟL&WTT(9*}}w9~QT"~)33fh755EDDDq8?t*֭[\CСC-$v ǣ22!ވI&>)))Ȗٳg*ׯ ̙3gرjL25-88 |UTTܻwOQ"%ly/r-ls>{lذa 㪬 ߿K||t?2h` ~YP0@___Bgݻwo//8kE ȠR".--:t͛7̙3͛7+PLLرc_~ P;v8x 0`6K{zzݻe 5Łǎh"dKvv'dY`'dQ-ҔWVV>B>l!kϟ?g̘j߳gO>ɓ'"jjj^zuɒ%–0GG/_`{2k׮((ǏVM[[{ٲeo߾#5 ',PXXfdg϶^v\桡Ϟ=Drqqyc++$:]CBBԔ`sȖ? ={>| c8ܲePɓ؞BݻҠeʪC <قl%''S[\prrG˗/}ٲpBT r,/'OFmщuww|YUUhѢ+W644zZYY=|P!UJJʂ |) {EΜ9[(ЉrssGhhh ;6j(AlC*IIIl6";$&&9rʕEEEJM.P\ܹsʔPUW^}^ s8T*|쌝d@8q*Ν;߹}C+ j ;p8 {P333-Jكl!v ᑜj9r䈂ԩS_Guuu[1ǍwlOk iÇO8bIM.Hcbb @ݩTjJJJFFN7,$(`aa1a„* $sss`2"P455 4(88XUŋ"w<Ǝ9255UXYYq8={"W\)r~P=z ڒ|ԨQT*RYYelm۶ݎ?gِ!C-,0j ;a=c q&LZE~ܤ… #޶_AϟT;B9}4pN8#`hhpL"2""_~&)RSS鱱ݻwWDNqqqppp~-p8 2/^xyyIޕiU xF,OMM]rق :nNC]]}ڵYYY4Md劊-[ 2b)?>NGMpɓ'|cccs]TJGP[{5//ɓ'/\ sC|!!*JCCeWf $ 0iD[UU+dKFeaa!el :*ye󽽽Q̙s9UOӧO'NyG><___b ooZT7@ٱ|iڵ}ٲeKAAnfffǏWf*Wr6[@.{XiՋL& &(!< ه6m$a&zGA!(s̊+-~5Ф%L|}}E J ;ᗫVp8=ݺuy۷]]]-Ϟ=__ Hӥ㨴Nk֬9~Pss J%/"p^zq8pO>͟? 999EEE)N|ΝG&&&JJ `Uc۵Y]ׯQ~-5tk6h;XEFF޻wOdw߾} 11q"p8?CX{{{߾}{,""Bܳ؊ɓiӦf~uttn߾-\8svvF5;ӧ'Ld#Ė-z-ƍ{rsyx|蘐Э[7EsWWגG铘(Ȍw5lmj<y}a%u)\.ʕ+S k׮|*!n tAGGFFF^^^'''`H4`AJ _zڣGfeggeqO.[7od2҅3gܲe5~7nhii!kkkZ~ԩY`?=zTQӔv>ӫW6sYϟ?iPPY&Nf_ZYY1B؎?J!oߎ]3f۷,n.%%\.wڵ[n1PXXhaa-a@WWJ@R]{w2NYW@kVVVd, IDAT>} 9,,b*RSSRYYYt:5I-P[[lkkdm׮]q󃃃%$S޸qťSvgƦM=]ޢQFj +|!SJ."=x`o) C`:TWWK.PWWl={0A՛u:9ѣG-iۃ'N[((OQQQCm=ztbbi\\܈# x٭9޿Azz- ӦMS466644[N8ٙ`ϭ522B{dIOVh.^dɒ*))ׯ[$;;[AݻgFՙ011y!}M6a -Y)))"ϢP(r=:vؙ3gP)PGRW\ihh؀8111W^}q8ccEگF:5 {ADDQ"yyyM:UJ v}qO:th֬YJ-"""VZ~~~VªFPPP`` qذa<>Avbb qҤIʥzҥnGٰaeQQQ Z|>9o߾m۶)gtq+ǎCe7ݽ{wȖ'O7NmېɚDbaaSrׯG%:|p{N:}d{P9\ٳ:2Cm߾<&xb֞|2$$$** 988h4OOHYXx髧XY[ „^vv8k`e9t.jkkI$3VVV?~Tu]7ݻw_[[[w%Ā|[h̘1_{cǎϟ?{ꅺQݸ\.*dP'"G7o҆'::aٿxB乨 ~dꂓ4!} pz^jjjpS$E r%g (..F-vzm=f SWW_t˗/U/h~=N!ۗF%''|Ut]g2J8880BUUl ^ԨTjz;jkk-[&^LMM'ת*)hii}/>,[HΝC]m)+W?^iF֭Cmeeq%ȐP5{xsWdӧ#fee^#GH:ɓmOy-v۷1\uuQx<ѣK.VD`PuuuhhAĽ\yyyL~!O0 k_}oW"ufdTd{;  F}}#VxxFx|@@S|>ŊѝꤼHff&HD]O>MMMqalOlmk׮0 .^ZO'ʧL*`ll,ĚT#;9ru>}j1e\|V>}f1\YYjICC#**d"2 iii1LEDNՋN:.M7 ޞN:vXеxd**eJ p=o JJJh4M VuJKKy#J $2ٳOߋ#ʕ+e EzzznO}DZ,t i0H snhhlSH|>?::ZˮAy~ [YY=yDAc]'NHs:,۳"߻w-** g֬Y2 *SNEH"=H˗^SNaOGuCfmC%G |mԴh"sܹxHVB&M*(({0*ҢR?~Tu]EMM`_WWW[|H$Rxxx;25^x!}:]Ѳ=1 jjj LL&=L&S]]&Tи<iiN;v,6`_pulq`>]*pfff Noߢn|֬Y9/,2eQG[LvC9m+V`?ӦMp"W„DV.4xl6[d$A_(!©nݺI~_S?TuP,Xd$(@PZL,н{w*;|**\[[xU)?#.mȜ9s1OK.xnEERMMMjE,|AT3FU21d"ODpF]t)򨞞^]]0n߾ crͶ۰aѱZ555a1͛Dmll$xϞ=t~p$r J$mmm?SXڪ<<}*l[0Ǝ+ `ǒlDt:Gʐ!CBCC%-+--L3/`꿪J@` <),..VuFՏERSSR¡ /rZZZ klr [nx?6ڵkQYhϛ7oP=*|>5˹sN%9s1^M=+==zFEE ޼yuիb&3goUVG~ZZZ*߁%/4DR[,Qdgghw9::ln%%%D244P(r{}@@4kjj t #hhh`2g "RÇ)z,Y6?~M죣bwgkk:߿1HY[Ud9\y6mr3g*n,qPVϟzvލ=?D)߿Aył"Q(6 Zijjp8p9Jh4 $666ѪS"РA޾}+ݻK__ٳgOD=== K-wѫW/=Ӻm6X&&& H:ԬQ:*##c֬Y^a''W^:L|>9ݣ*$ _|)Xlcǎmm|>ɨEuEٻwokǒիWQc*h,^~ (:@ԄvZQg՛P[=DbFFB^]ݻwVV|z C.BoJl*Ni4Jew) p8(O~~>9r D:tז@ d%J={6B׮]N8%K2{Tnk3EEE>zzz EݔrwExH$(g͚U__l400w^3׭r…+V455I,kذarA\+Wݛ)ې!Cy@[dggűXT)O3gLnՂ2XT?~8222**g:u*/ d2\vZ|9i޽{AMp8==ӧO/\PÝ;wn =zdmm-\FdI^^pF[UUU߾}C6޾}{ƌ/mll~!lPܴ۷_N6-!!&--999_|khh611QWW'x}߿4iңGp8gg{ ?~ǏNJJB%\P("ĉKW>qWK*dΝ;w&N(ǁl"}s?^B5ĉǎJ*0a„-[;rb_|))0zuuuwܑSKK˹s >\ uyyy;vx_~F}']bbҥK T*ǎ[v-&))W^ [r%D"ŵj/fmll޽{rq???d  IDATѪk׮={nbbҭ[l>niigϞ[SGo@ׯ9˗/%%%8NCCGl6 yݻ [v!\3PWW/,,D^&??_آiaaѪɩ ٨\%j#{))kjjce:'OLGGGgddHyJ߾}`mDD_tR?noo`0~;'O?^KJ"^\~*Dѣ|"DZvލeС%%%Κ9s&sεjhŁ} @ X޹˗ǎ:u =@߿G``իW333~ӧaaa`ʞH$vޝFXag|KKK䡙3glذAw*ǏPQ#]}}=L]&Փ'Odggh4tDz<޿O[í_~4-99Yձ35=JKK}fH$:;;˽Zl󣣣%Рhаn:Or89uV(#F(++wJ]] 55V -MqK.0-ǏH$ѬYv=;rH"z길M6!_--:YŒ@BgΜy*Ta]]]$͵BO$/]$QZͭT(۷o) 8B񣪃$S666t\5xT*U___mmm2fU{{WSS`0ĽL&Si}K#66V\ xj(<nmmݫW/B'$EEE")$ceݐbx<>,,LHTMMMN{M9fΜ)9~@@Ul'; R~p79ձl2zJZsssKUST n޼0>}6lPL"G|>J1uTXdݪ+++{۷}}z}}ƍ=ŋ+ؠ6mOtt˦8!88ڿw._Ǐ;v꯿ymP=ݫ***F,۷Oͪ%( rp\&i`` 422b0WW^[K1[.;k,)>nRi4ŁN<#OOO---===*3^… 8xܸq"c>hkkk+@8n͚5rܹsK ܹsGC+NCCCxxA$ߑCttt(zs8&Q$ "(훪@k@gP__/(!ͬ1JpFI"i1rCd߿o'O^G4"FR;+M&|УG˗/=Í3Jwiii֭366ZboP{Jzꥒ0 $ c^![e̘1"Z]]%6񮮮=Ru$BB"@)ЉЩ;;;KY0ΎNgee:v'##C#BNNN^Ru|>d,{ҥQ]]-27ڵkExvvvqqqZYYinn­[} sε&$)55Mׇxggg6ܼj*x Դh"FBjll\boj!<O~j&NA D`ڨV0/o?a rss ).))Qu :t׍L&:椤$q)T*m+**ߵk%%%r*\\\,֭.F5-x<ލ7&NFbmmlW|>_diӦ+j Y,\UJ&ٳgO 7"`;?8ZZZ$)<*8ϟ?U>$t MMMB`HP0JG #1k t4Pr)mG:$˥1-- [Xr=ڣGnݺm۶weo8N]]R^wuVdرr%P(ZuPB:.9/&JSuFYYYxx8DE[[[0/(еTTT`u@@@fforss)n*+a<U>}` իҏa7n0` rG@ƍ %??_iݻ 6lu84u\uuu2"h4mmmɷ@Zn++--L#7H#W/777KK:W^p͛7wppP({u>}*D ׯ2B߾}=4eʔ(33\~@ DFFzzz:YZZ"544%2+((WVVH? "..Ǐ~~~;v>l?,bcc#ət*(-^r!!!\.W\==իWo޼{ʌ#*--y&JHHh!`hh*} EՋPH9㦩)xFՁϏ`DCCF>d]]݊+Dfaa\ÇU"휘9ѯ_? DEE ?~!%%- ߯kmmݪu`XYY|>NK3mҥmQ޽{GPDMLLtzyymO*`K`ddDPlvkQ0@' ) jjj Wؘd |`0r7o`:иy&?6] mjjzy]" x9s^իXss󬬬_R(iii1̶'w_&ɒӵ1.ۢ<&,y)X0РrGDDܹs>>>TBxPAAݻϜ9Ev;t萫x󳲲Ν{yiiӦUUU!oݺ5yddcss#_\`ɣnڴ)22L&o͛ClllG+%%%88X&uV\:ׯX,'iN1119s&L1c9@'k۷o,+22˗ےkz=z$ѣGUsիC 9ӧ uvΝ & +**,,,P=544,,,]6l022:uꔋlA >M۪ WWW4sLxUЉZbsrrZL$(G,((-򨚚Ϟ={z;i&lL]]ӧO/ZH+s87773"tP|733tŊ{(ͫW-[cǎ?:O>uqqF6ܹsgĉm nnnݻw͒3(Msss||} ݆q%KHӦΎcXRbee5g2N> $DXx<^rr2Jӓw AVefW .d2%$122b0ʏÇ?ɜGhMMMP=7mڄ -11䮱Ny敔p7o} ;w=7nPdaa>1"::+]t:U{Gi4Zrr2j`Z>..."""!!P9>rH%N޽ɓj*۷L&+9bOODѣGX[[p٘ExM4 kH$R [f%SNCK.8pÇ9::)-A/-::ŌOB}ussЕdTVV!eAoooqw>>|ظq͛7uprr:|WGx<ޞ={ك-bljj,e/\ѣG}TTTXZZ p秧:tJP?Z˛7o޿4&M7d#HxI$!;vصkjˬ{nAAASNUZ``?~~H$2M*##ʕ+#{yyyzz*!|ǏY,]ZZbmmmDPfΜ&455;wnΝEEE";twǎ\x-L>{9aTAiXmvD"Y0h,%A.X@GGڵkC٧~æm9ts*7!M4J^]Crw.((ׇ@ 5JOJcbbۃ!_hB` rr޽b޽{ϟ?+dl`0L&`nnk׮˗+-iI}}ٳgxڵ۷o߿?q<@>0>f̘ϟp8mm׷v,Z߿_`ׯ/\0|џ?N2իWoݺ-~U³x<СCm-AAAWWW_hQe3 *rLLW E09p@СbEDD<~X_99}UBxm۶X,qF}ȑ'*-$A^삍ٳg,X n޼qݽ{WJ3ydYB)i&a{mmSRRPm۶o߾cwwq.^ږQB ڵkʌxOz!CIffy޿=&/ .ttt7m`0.hO~䔝-2=eʔ7oʼիWg.((aٗ.]ё1\TWW={fEN_~]&A72g] IKKp4U"555]\\U\AEUSSٳg^|+Wlmm]fgg'jkkg̘͛͛7@WTTG{{d]]]ٮs֭EUUU߆H[M0U׬Yyݻ+36ժwźvZMM4̙Ӊ+x|ظq͛7uprr:|ȑ#CQQŋ߿=4y˗/Kxwޭ[*.B>UTTL2ѣGz攲2bŊ0(QUUɓ'a_͛,+!!=H$CCC777777WWW95t$ұDB?K]bb߽{'(@XdIppӬ2hjjڱcGpp0ELLرc^hѢ[޽[Av~III-V̜5kVffȣjjj/V@hrq}[l144TBH*TRRr-d/EL>}zg:>K.d``0{^0ܹs;w,**١[n;vP\˗//_[ASS388xڵ;w̞= t&M211y'9ݻ?}T i_jUk~n:&ɫСC3fQ^ZZ:wPS 1bDnnݺ%u[h/={6n82Q^__a >|X}Â/["ncW^mҿ#A:w]x100Mv6 EW?Gt?~lٲǏ`kkojj*wܹa544455eddbcc;. 8&glTii)Sx,##s3f.wϟ?7kK.FF D@Dmpo߾5_^^յrʴ4t |}}E|y޽3g62 O}Fhvܹ~0;;ϟ?\{?xO>"p೧ʕ+coFFFFDDA]v:u |#@GVUUtʕ&L>}كn~~~eee\;hjjnܸq\KFFF#,.܉Ø7oޥKoOOϊ }#HhѢ˗"qy-ɼx[nvvvXhN044400Pz掎siG7ĉ \;իW޿?A4رcБTWW3555\;8;;bk{ΝEEEtrIII^bjjjkk8zht.III!!!gϞcF/(++Ax|`iiw޾} wޝ;w̙3ѣ:KII DǏ߾};[*V^^^i\?w\rr3f46h3@'s7YNNJ' ]DDҥK?}ܹsLWVV6b:+///1c{%3+JJJW^?~p'9}͛x^bo JdddhhhJJWKNNNfff" rЩUWWߺu+((ի*И>}Ǩ9|MJJJvPWW^t)h\gϾqύ[9t5kȿGuvƍ^z q_꣫`"LfhhhffWKfDrAAAAo޽{Ϙ1Դ k__Cqгgϭ[:::xK.9::^zήŃ@'hgg? 6jjj6$$חύ𚚚/n_&d2<\wqqѣHIHKK 9uԇLn@ijjAx-rk׮?޽{РA9##cNNNl]: @(644\ti|*+++{yy]VUUU(=j… |v8`EYM>P@@ cr}@0o۷AAAMvf0'Ntss:u*NoZ &&f \JII9;;ܹS___&N XܸqcΝsrrj8ƍxQRRZhzkDDD?^% Gh`` @! |>%hPC4$e񪯯{n``˗˛쯮jaaA f;uƍy- ***.^xÆ JJJMsNǏ㍌ZpycccddϫW<STT7o޺utuu[xTUUEGG3p^{gΜ'@! |@ JJJ^d2oܸQ__d]:99͟?_+nرc߾}\;mܸqRRRILL4h͛E)t  """{mLL/xu`0g޲eK[ a2W^ PK򋎎#v9C%##ҥKOs1!CΚ5K[[[Ա5Ǐ׭[d2yu:t={ƌyaܸq߾}{왬(ÄNƍ 9sĬ[ٳg:9slڴ}\RZZ*%rrrvvvӦM;9hwhrÀ3gdgg7ٙNO4ܐSJ?~xٲe?ԔСCK,y!CD#t /_~>ܰaý{xuurrڲeKn݄TTTܾ}d Xvҿ#v 9CZѣGAAAΝ+++kۄ $dÀЕ+Wq@,X뫪JDfff>},X}:o߾gĉNѣG7nsRRR۷o޽h&ͫ6yy &8::N6MYYY@{!rBQYYUWWdccYfի kREEŁxe24557nܸxbw޽~Z^^-,,!&&fl?~uH^ג~~~}H&y֭A.QPP?~?,Ȗ$9hwL&d2ccconn6g]]]Q֤kמ;woÇItteԩS?}K%>>Ϗ꿯Y[B׮]c27oެ!;;;EEEQGr+0TCk~@ NMZYَ}d9s&55?W/_SƃrJGAJJJ>}__P^hɓ'4lׯ3L"B]]~颎:0WݴOmEa@HHHiiiUTTNhcc#--tO>Q-&&& SV:q?;;-[Hzz˗###555mllB! 9񪪪 r e@ ̙#UΚÇoڴFxzzܹS\@gPZZڣGz,--n:lذ6L@iiiaaaL&ѣGemmhee%+++SA@(,, lֆnnn)WPP{֭>% @b! iϟ?dg))#G͚5KII cѳgϿkѢEm<5tB)))ԣF0axf-O6qԨQRRR:9 Kpp0tvfff7oc\\ŧsCCCllΌ3"""0.[nљ?~ccc%*۝;w=tҥM&v?x˗/GF8!C 2?uVPPիWkjjxud2L&S__q" ˗/N:x DӧGUUÇ}d^x^ҭ[7;;;GGG &8! ) ]QQQDDDPP۷\;::Ξ=[nl˖-nnn+7mڴgϞ} \?|RRڶA?$: pZZZHHɓ'ݖ-[r'''!nǠ'Ota )S 2իb \?w@VdBnƌ" @@H.]x{{{{{?<00󹹹:.Y^VV1ݻK.έh4ƍ߽{fK = dndff& 9v0`Ϟ=w tREEUUUӧOwuumq!3gرCZZ޽{?.҉ȥ&)UY;bR%--miiyKKK+ǎ3f͛rA:>gΜ 4mɒ%AAAYYYÇK,1223fIoڴ)99۷7oF$r폪[tt/_7`lңGC 2KuuC5@K̙3G]]СCBZ744$1HIIYXX۷/##\ѣC$Bpp0FhC%[^zz0 CCCKK69ZMMMppYz쩪*//ߥKI&_|H۷_|ֆ>~Hu;}4#GG&"55]___NNhҤIǎcСCӦM311QRRRPP011޷o So0`:N۷GXXX}}}rrro>rH]]]9999rk={e˖'jhht~Ϟ=>P-@g`lldɒW^y[WWϟ/]Ύd\TTh" < cSJ@111K,100 srr_"--M.SiVЦ@N|0 ߖ7/y]DH2ÃWmH>_|Ą׏o}}={?99zdﵵf_r%չa߾}BURRjccczzQ|^j ޿q^1EGGz>!//k.kB5k~s r9HhWWWWSSsuunhhmnnnmYe0Nj啕ᮮ|~`C-gee shcx@TWW;vkܟ966Y???T^㗗L2J(sUQQaooNsppXtiII A|||lmmNXXXd\yL'O|rڵ 7nz괴4xܹ>,,,~ yz…uuu &BOOo۶mL&wd]UVV7 ddd,Yʴ˗/P7mT]]ݲJr;::FDD۷oܹW^Ǐ733@?G޾}dOΥ_m> ѣGȥ! nb~#jM- Uii)[cccχXϦ˓wGY˧MFp ֳBDtX{gD7ONUUUQUNm6k׮b{GvyIIIϞ=>޽c=k.ԕ+WxPT[njהjtf/_\|>!:`0+GK.ա,(79ArrrgΜ)))i-9vy::::6l>|1ٽ{VVV`0]ֽ{wΑBBBmօrs指בzJɑdee=z-)[__&7n޽{---uttȥWKO[t`2رgC!wY˗Ա;&| Аk{bb"uk2h :Nmz5k;ߟ?s t2~'N4IKKK Yog####--Mȵƾ{.%%%%%%--ׇH^( @G .}IQQqĉ ݌3쩮nkkO?6 @2! qTh1r~~~*((hمMRWWN*%%:Aa u>|`Ę ӧO>}ZJJjĈ3fpqqvJ=9?~III- \@׻w͛7oذa C>}EtИ}||hE%,OLL ksrrN>ݚPvjaaA($$$F"ǍG'$${uů~CX=x̙3ԇ-Xהs6o۵oۊk֬ٹsѣG/\p'O$%%TWW77xh Z گԠEO={Ғ={Xp_~-H:##͛7~wHHe}}_[HHȶmcsss-G!--Mٿs׮]Y-((1co]֖ ӧ_~}РAl}>|0uTΪUdee3f,[V4gΜ;w]^SSGKKKSi3773ydcbbf͚Ś(//o\W5C2y|#`0$@ܺuk?~֒ -^{CCÌ >^vS'--݂XeggʔѣkmfȐ!:::QQQw,9_~[lٸq#A W\1brnn˗/O>}eÇa ~A3fӦM&MNKK ȐUUUoq'O7oɓ' 1b… g͚ջwoii/ScǎߨVXŋ^zҤIҹ-SGqkkkgggǟ>}ʕ+lP;7K뿦54'3QUU%Hg2a ///H@KK [HwޥOE5YJ;uDǏmi&HIIM4֭[Vw,9cYYY"?~:IFFcǎek߱cǽ{t9rԩSqWQSSϵŕ+WX+&b>$wMKK[x1ƌքFYY;w.a\\ԩS9IKKDGG?| ߷lMh(k gM49֦ z?Ν2e̙3dill|ky~ݼy%55󬺺#Gf̘qԩV`0vܹ}v^ +W\ngat'NBFFf…[noelVXQ[[˵È#v=jԨ\2WYYقHZ5壡H2 &9=z4b3fEEE...U__YOr=C w,Mrwwwrr"u}ynnnYYR.] 2m4>;aaayyyjjjݺu̙#8i4ښ5k<==oݺWWWտ+++>R***?~|Ŋ=JJJ*..h:::ݺu>}z݅-~mGsNJJJYYرc'O>x A/_vvvnt4aYCyECy4[>ZssjSQQi,66EQ4pܹ7n`ݧJMMLII޽ bffFqќW=} lx((*l?D3.ETUUq%0#b{@OOO=$YNN͛7'M$XsO`VEZݱcGXX ZZZ#nlN-%9h- Ț(rT@]]]P={fnn*@UQQ+B}}?̵ݻ̙#`qذa/_~w8'rrrzy.]P9rڵ_~544w,3%k3 444DzHc0`FG@҉(g@eD|5+g ''Ƕc CC{ᅨ;f󳱱a}a͜!!!-˟:uJUUu߾}l?~0wܖ,"jjj@r!r" Ȭ9 ,,Caaׯ_/@˗⎥_h„ .\h޽{ ׭[訬 @!]rd€mc^ jjjDk0́Hay5APPP`kLJJZj-ׯ/]֨",ݡC={{ƜYF(SK~_.($r@& Ϛ*h2s_[[+[O(t]%A||Oψˎ;.]~С)SL4I,Qrzw^mmmaMxȑ~ȑ#WDׯ_={)%^60A^^^]]Ho%!n̙9ՕiGrrr޽Eƌr?͛7b ͔5I;.""˗/ׯ_\ѻwϟ?Kܱ4ÐrzpBoV~ 9 " frssE+ 1g9ӓ%ϟu&(DEEdzgffzyyqw07n(++ck\h(rA={Vrmjj*rо )l"(Cor rp7@fp](Bfi4HC w=禸ϟ2e/"g{YYY}fff NSWWWSS\t"e9˔K 544_|111wׯzjS-3fQG6bbbZF&f͚RPP^D3Ijj\OP"zhjj2 /v bŊgk/**rwwuV|#777##qql9 ߿/i9<rm)(S˩w.g@ D|5+g@& 8:JKKN(/_ѾrRRRgΜ߿ii)۩~K`" AnaÆ)((TTT6^t3Ço劊l[ly%O>N'''CAՖՊ; ҬAee%׽*,,/QȄYSMfeee а%ϝ;󔷷ĉ>*gc߾}E7lϞ=_~ȶC4G Umm޽{oݺYp@2a.x΀m> jjjD)F |QYYYrj =<<ʕ+l핕h={ٳg8`BB5}B@4Xpѣ[ 99Y36V~~v ,x !S+ J] v!±cߜ8______D%"Dҥ [K䡩YYYYQQ XٶmոBHՉ4­oۖO8aggyj۶m'OH}ECCCԓ*))VWWK΃#woAAr\!B3s[__/)m3(Ο?ĉl^0KÜbɉzRAuY$v 9 Ĝg ''eIIIA{sΧOړW\y!D%t\tQO*%%(yG~; $z΀5sM-JII)++h JJJcǎL>|xʔ)VVVb LZڠTee%gD}Ð; bb' $Гc_WvY9Z`ui1 իWرܹs߼y#B UZZ"##5'###%%@;JĐ!Cxչsbbb222JJJz=eww&555/^~grsskjj&M榣d|Ǐ oܸ˗Zcc#G.^xРAUΝ;{ 4k֬YfIKK ٳgׯ_aJJJQQQYYz~Ǝgdd$fBO999QQQQQQ'Nz ۽{?}t 6\O-#wڵa%(**߳gˁ$_hGM@WSS1rt:=883 L&-oSSSfCNʶrDD=D:c 0 <Ouucx’?r=6N)//2e A988,]-ֶ'~˗sM666z{{_p˗GfM9ݻ7zh%x6V߭8W^% ?~|aaa tjղ>}l۶mŊ/^?}TҧO7oތ1BD3666&$$5[Dӵŋ?~yVEE"gKNNs:(--Y hқ7o޼yCDnVZemmm``e˖4 jjj-[Sk6nH+**zyyM>wt:=##֭[קOvڢEN<6GXXyL,Xlff&##Ç/WTTq www^۽yɓ'A~IIIٱcG`` g͚5ׯ8uԎ; tR|||\\\}F̢ETUUN8quMdf͛K"fvNN"BSSsW\'ŋG 9N<@ZlYDD?^RR2gΜoӷo_Ƹ89077t-&++-@ZkW{5JlKtvk˝;wJJJDOKZG%Z}Cs!Jbς\{9;;z\긱̙3̙3{kp[ IDATp˗l=== 2338ӦM5B߾}͛wA >}:rHg;kjÆ #++۽{wr >g$vJ잞\S5AgΝ#":::?? rZι]UUڬƆ-PYY$G>|8i$ ,m(-C8*V7U6H*Ҥdq5>iW{ɻI Z?ѣGSߟ1cAoߦ]\\J{.FP>|8),ۿWWW'&&z*666**j'/466>|^@'@!sA=z4666;;ŋ[li?[[[6޽C:l۶qE(jkkMLLɪӬ9BQTT&@KccCsg111uJNN:f]\~%u.\AI|I ~`ς5Yk Arqqq޽KIIIIIIKKkhj ]+gg0 3>o߾mx!Щ1_QWWylhhʗ@@HL]]]ii)[ccc#[f8xL's]Uufy&uӧl*++b2l@@3מ6{~~>\Kff&u`9 '~^^^]]]Ưiqvaȑk֬aܹ߮_ekرcºwނa/^50t$V#+# ŧy@6) ##5SN\-.tR̨wZ[[7w}RO<L\\eѣGsj*1zj^KAPz^D)j>v?{:2dH@@\D/ܦMnܸYߦ?{nwwfD|r\_"UUճgJl6`p"&`5DO >\NN\>wNocƌϞ=?L=I􌌌9jYVXS_o:{Y`|࿐2 YPCCYM X<3gPr>4Fem9;ennn޽E;99 '9444PR{q6;RAijj|򥦦 /{޾}e˄8ٳg[+++KOOyyhKKxγqqqSL3fL߾}MLL3337np$%%uСԑhKZZZ\K566!!DQ'>|Y)))===CCCL CM ![l,GDHHȶmcss &P֮]kkkKD}}ӯ_>h ?|0uT*j*YYYQ|:\S{>l/_899***'$$/d~BFFfʕ 9wHΝMS)I__F ̄Fڵ%KDDDܹsG܁ݻwX+;yɓ'[08>}zbl^Ph4@?˫ ~Y322pXX8_zŵk!w _~[lٸq#A W\1brnn˗/O>}eÇYkM@N>ݯ_q"4[rC8ln݂x(?֭[/g0||z '',4vX_z #XXX\rsܹsNMZZ'::ÇA A矫VjIFFFnnn\xxxx{{ ?]_p(77ks ĹϹ}}vuuw $//A++ dffr4))ŋo۶?()TTTTTTlP__OnEͧZ}ׯ\*((######.]冄E ߾}6SvM,ҥK @t}!Fڵkjjhc...L&S܁s΂ --v>}=\7e~R2p.[njԊhA͜HQ#t͛7o^NNÇ?ŋ⺺:UUU 8p̘1zw-g LLLHkihhhhhs=Kr ,&(f+A􀩩)v'(O\Z:~9gϞaaaLWWA܁Pbb-yyySSS^& =Nkjj$茰+X!>>モw ?C@nMW>@PSw\Sg8F e9EED1 `m+ZWb2PVNS! {C @B~O/,B`\z^'g>1$uꫭeL8qڴizzzӦMC200Յ!02___,bྮ{:͝;A\ݻwsw/F4------4(JMM 4PVVƘCG!ŀ;::Y73 12eb}Q=v}MMMmmw9;;/ Ann-[݋J^^SA__c@UUէOjjj***@gbJ100@A 3#9srss Ǐ$++nRBUUU?~jnnxOPDjj*Ӧ)S0E>+** aSNUQQwO?,,, 77N%%%-^xź'--ǺM@'*))F@FFz9 /)  g.\RRRw_Izz 1SLbDLNNBMMMh4P]]]YYǚd; _]]]g XY뎥}]]]999q=J}򥣣OH$Ҕ)S۱5D"H$""--=w\;;;++++++333 gZ؈ `===@>|^^^^GG)i`0xܯ)O`pD-'Ni+JeM&L nndddtttttth?   <0f̘add4c MMM@d `t}.--Mܽ'%%%uuud2R`LRRRӦM6m=ӦVb`KtqJJ zyyyCCC333ƤIIIA@/@Gɴ1@FBB~,z{{O?zN@:400Y`#H&L_222x?J"^h|pjjjhJF4o ?  sW*((´i#:tOY `pof  ޼y37o̝;W}`}]IIIrr2&''D"fgg=] =X :u*S333S=]}v$!PF3U f`Ovs̙FCC`VLjooWQQw(::ZSSҒ!EN[[[[[{Ō+fϧP(?c__kUU3f3͚5KIIi1xܯwOyCccctt4HBWJHH$$$[N}+WQsUFFqZ! ֢a3R:t8q%Jd  d6ƕjjjh< ̞=/  /??H$4,YY٨(D"]~}M )E@[[R6iiiFÇJKK?G $D"ak̚5k֬Y?g G> apQhD"ѣGw4iR}}=<^ F;wxyyM4IxgN#Ht:ӧOL2,M<M055511111Ɖ;@HIH =PT:ʮڸ2_[[* EZ[[ Bddd{{;>Ixok׮퍎SRSSn R5??+0P\\LR~"###L"$bb12h `\nl2_SS&}MMMq08QgΜ|P; :;;͛7BJ055lWf N6LFFFhi,0)! t<hO/w f0^~M D"S%I VX\]] O>4|W#Ǐi4ښ5kNU".TXagggle[[[ii)+PPP{;{[#--7opP%'* B4>[N?f50C"kjjx*** .\~e>ݹs/@sss۟q?55ӧ$Jʕ+,jddTZZ:ddd544 ݗ,Y2>zD"566deee---++e˖}Cmʕ+={ǁ\޽]nll^O> Хx>`8BDDDzz:|jhhZ ǯ\ǿS6mڿ'N8 H222֭wGx"--meeeeeN@]]H$,,,,,,W`޾})JKKKKK?~Ag255Bg211yoGsR( R__X"44T___'N 9r/_ :tжmۆm<11̙3vvvӧOcǎ2G߿֭={ڵrrr7VLht"~!ȿPzyyݹsg@X^_y `""@"xoɓ,X)-c.ڊ>JE[@TՆZvxG IDATaiXKK˗/_}Y䢡aǎ?~H$;;4.۷_vm;;;9h===utL-z~gq'DBBbҤI&MИ---֕@Z[[ @}*3))EkΚ5ﳫlذʕ+#DZZZ~~`@}}=" %%5k,H\ckКÌ K VVSS ͝;WSSs!i Aww/_N0Aħ#͛y `㥤ۓZoodN;444fAA]JJ x3C拻^ҒG%`<%}3c ѧOЗ}ٝ;wXw۶mttt 9s&6{{{8ck=zA^h w; ƒD ߿Z SSS<oii)ԁ/8pR]]]xg`PgϞ Th4&*** ,@ Zdx~W?|޽{ ƧLLMM!d bT*{JkOT*UYYTGGS500dɒ4֯_ϴ1A233-Z.O:i ban޼ʕ+fĉ+**)<1:=9 3}E$x|Ν/]5776ݼy A++lA޼ys֭v ww͛73_bE\\ zzz3:~8իW;}(ʤI?YMMٳgXۛoZjjjRRRhQ)*!NNN222w^V N=¶^t GAikkinrH7mw7cc FKOO'?~=p8<l2@m߾uַ~+nܹs%--mfffff~N@{{{|||||<)`x]#[XXݻj>Rh [c``0?ϟ>}`.CDr`` ##]:u .]؈ӧOΝ퐛}/^0ZVVɓC>|m Y^ڵʕ+Ŏjjjjjj?~ر;|YXDLiwwwMA^A=z?WTT0 ;x ТOD"aI*qppGU0䄄$uRRR-k֬={P{;/߼y3 ы+WݑR$''7o޼yǀ\,_|H******xw˗[YY#KUUqb,$LsAH@P(^ 555'.~A &;v?KII!ffftuu}Pm<<}޽{WZTYY H__ݻC-,,rsscƔ kjjvF֬YUs{vo.+**7n411=sLYY O>ݶm?3A__˗/ RXX4sLww+V,^XH <|茯/IK#nc#""DWP뻺p8WWWYYYp,,,6lvZ ,X7H# 0V)**⽚B NWKDctZ[[8RJJ /]ĸvilǏs:?*66q۷MЯ+Wvvv2\__x~qq1 _YY{[//_fڇq7oy|{+++'L3cƌ>C&׭[5ͩ?\Θ1;wylmSYd,Y5mij.osЌ`99O[WPP} W\\z_r ZE޾}ېAf̘㽼,--z 9::avINN{Dd7RMMMQQQD"1&&ǣq8ƍ3!?s7F1?SRRb@ش"0qą )jjjº0M8q *ZYYdgg Ͷ6,UUU333,K1)D2ͽc-V|WF~円ly…7X@ss7omYc??#RWWKM8:p@XXأGrrrXS;KKKϟ?+W^puPPPػweddXb3 inH7"eee!"""==&MW\9ܺu[}B``%9@ս|*PE!B:A}}Pd hkk hhhi W\yѼyiccGEEEo޼!H111zGk6`ˌ߀%$$V^Nmz9NGiѢEB%LNIIA<τ涴˃Ş@$99ӓ3_צԴW^1R7oޭ[֮]߉0:::nnnvSPP@ҏQM,7X4-==H$>y򤨨 q8_lXzdhӦMp wΖ3gW_}u)x@y)@N:uT4ZNK>BuuuO>ŒL{@ՕqE***RRR믊 A*** 95c|vv6D*(((-----dhJpǞiǣ1v,IKKѢK.t_5-ڼy͛9aXn:Aggg4] ))N#ڜ jNo/C"rlll233)((xŲeˆ?@P)컺6n7o^\\L"xA{{YF#!#GcUzzz+Wp+VjG2;vSFF>}tiM.\8}XM D"0ܱM;|cH稕ꫯїIII|$˟8qq(|̙NNNsΝ={ٳL$x<klyt:)??ݻwʲU+((`EEE\J򭰰]>|oQrrrvuuE_H$>b޽ݻwׯ_Gw͚5/_={6۝O>.?x`ΝC:W@@@~~> iiix3N7 %55@ niiiܲ]]]YYYl :::RSS_~=|ϒ9s&% FMMMQQQD"1&&8nÆ SNjG977iԖ-[^~-###nzѪU\]] ĉ億wx cwFQQ1,, C6//o޽le:cQ}a/===GO zeee.\pqq2eʦM"""x L4ƍqqq;woGGG T*̙3zzznݺzjGaaapp0RFFF032yd<ё5ªιjjj...Ex㊤͛/_͛{yy3IYY۷wڵ`UUU{{ex!ҡI*z쥾P[`^b=љDÄ>{,//A333j‹/jjjКLmll[n^qH֯_.t___2Q'OĖ͛7޽{sϞ=X 55~4Bwڅ.@DFF@0*h7111cƮ]yhhhcǎ{y{{O8QQ}}}.\vSw`, hhh|2J??"drPPqhh#TTT"eff}…?0EEE{{;w})222 ٙqnU^dtIwww 333__߰0Op.@Ѷoߎqqqj#Or-%%ƍKeb1ϟ?{ ]G-]~+ajMdW-''atӧOX%<֭[挌ŋc#luvvnڴ - K>|xƌ2Nپ][l^^rՕ1$ä>믿5>>>|ĺE47L&K,9ydQQѠGIIIYYY^py|wuucl˔}||EU0}OeݪƮlll8Ůh>ܜw Svemm=p )@*hRK{{0M6xzz,; `NTUU%''_tئuihh A, իY嗌?\y|\,--NZ]]y9t%D@(**.Z(99A/D@hh;AAASLaܾ}XM6Eۯ^qԩ---޽KLLvcc߾}Ù 5a„,ぁ{>}:>>ÇYf]: IDATvÆ .ёjiiy H 5k֩SU gϞXC NNNx<~͚5zSk9ݑټyÇJZZW ag.^ @_ZL9ϝ;gnn.ASioo%ZU855uHstttH$444Ī ϟ?L F8zvtt{-{Shii-\-z`999a]1N "pk:\HǏtCUUۓvttcY[[?y򤪪BTTTDFF_ c#o62n 6r~llݺRRRL1u?j^^ԑ#Gqss#MMMUUU鰭/^[43\9886=ԯ{7eYY|Qhnʔ)\n!\]]vk}ťض/Q^^^ppݐ񉌌P(⾂"..̌˛Çrrr b938{h7nܘ2e VZZǧNbDR~_dddss Mׯ_ϟvf3^(**:99vvvbGEE6 ;)їK,alA41lԂ XCA y ㏃Aiik׮qiM6ro9mmmÇ!!033+))}@zzzv1 ~~~)))>ǧ,.uRRQd2yǎ>JJJb0$''KII .N傱3 [#J[[VE@UUuH zyy?>;;FՕG ύ7***}MF4Q<ۓHUV͛/^(##itsk{zz>#/_u 2Vd;JW-!!_~={v\\C"++{H\?D"q1RWW?<2--1RhƌN4i6UUU_zedd$hn氰0OOO---/VWWz竪󃃃XRUUmcc ;L6-$$$33)H5o޼/bk>,1 XEEE傻rPvlc"42*VEYHZXϏ@ 466fdd={vڵ7XB۵9QJdee&Mdbbbiinݺ9s ۷^ ]]]:::K.]v-6ھzj:kOOÇ៚wrrr...?F_2@IKK;88%"޼y~gϞ444tuu)))YYY[mx<Ύ*))PQQ144\`+ɒ}7oތB_l-ۻw;cbb޾}[ZZNPTTT,XDsweeeH$&%%QT4i[v-cZ[[Ov-!!o߾Ǐ O>>|hlw6mѣG9YGGGVV"@"Z[[nJ)'*$&&͝ӊ+\\\ ;1g CPRSS Çy?p8;;;QUUѣG }۷o׮]l) %00&9!u[neff wy*xpիWKbb",Xp̙K `l)˖! %ZLEUUU &|“'O:::x}SEBB??~8L:~}nuqqv횮=ijjUQQIJJRTTE1.))u߾}}ww77nXn0NR_NrGF#%%s)/X1 NMLLLLL|P_O뱖NJ+PÇGDDpACC_~ٵkw;!!obݤwƍe[(Jjj*@xbNLMMx<4ǏǏ2O?tE;vxxx\|ym>} %$$d˖-l:===V*,,LNN5k=֭[WTTĴ-p1@jo lwr@xZZZ222222ӳ8u牆2obo#✏D"H$kjjx?PMMf `9!!@ (((lݺUII/~`۸qc~~~RR gܴiz`tɓ'333ݻ'w/̙3'OP(L;FDD a/ʰ¯_Z@S¡5|PRRx</4>>>))Jr?5"""""BJJjѢEx<~ڵ! <,ќ쮫'^ƈO!@ /^xq8ܚ5kTTTL&Ǐظq'N_reݬ[mmm ^QPP 08ӳaÆϟ^N:uzzz<tOUUU=zݻwAV39ٹ<NP&LĤN<[C ϛse;}} ^LLLtrr^fddwґo$~hll|YTTTlllss3ZXX,XRa$ >^4] ~@ DDD ixp|B' 㴏Sϟ?hk~mTT&onL&'$$0622d?L&YիW111333jkkcTYYdɒ˗/oڴIL6 jϞ=ɬ;TVVnڴ>s 'NG+"0u**,, wTTc@]2$$d FMMͯ믿hQQQQQQl ?~\GGg͚5֭[l|{р+0~uww___]]]kk렠 ^VVV٥.\pvvpE#""LLL|}}9,X8^>433c011 T3<~Ϲs"0b%%%-Zp8\ff)z 77kk/^DFF!33sҥeee (CCCoo .dggp *-Rܹk޽AB"%%ekk{W^߸q2UZMMͥKVX)x1`ihh \3L0ÅTWWggg^xkkkOOR;߻w/33qN:;;}}}7l/!!㓝K...LN`0^0~@ ˨TjjjΝ;O"tׇyxx(**Vnn-,:(%%%??R???YYAR'O\d _ׯ[zpVL+WVRRb\?޿]z5B`IKKIHHHhy"ƴzҥ@N4(55bN[ZZoaag,#… <`mܸQXAqqqZZlkkft9???55U|ԑ%%%gϞ]l 5)i4Dڿ N<)'@ ZZZ"""544,YrŪACǹ󃃃yy Gaaܹs9M,++SZZD˖-ۿ?!!!<nʹѣG&L`=dݺu _^d /7'"""jjjmFRU,,,~w}}}<ӦM \d JJJ`6. Rٳg̟?S ddd֬YU'|ω bz8N޿Y```aahz c… ...ڞqƍT??3gח˃Ò#g+,,lΜ9$uMNNϰsrreZ>|v3iiio߾`(Çg ---m۶ ,FFFiiiBCCjkk{F.,X9c ;ddd{zzW Çi.;::X]s}*8@<<<в|)(( 255E"*1eaX{G檪 _&D"1''Ox#G\~x<7GFFn޳gϑ#Gߺɉu!OOϛ7oz3fmذ644`߀tttx{{?}TQQ[/s)))ݽ{_~aC"߿xb;<rk׮:ti+Z.ɓ'[n=|:lll*++wk #ƉXؚty肗ӧO~={p~A;;ԊV SSӍ72Eݻˆ>MMٳgXۛ쮮;woKHHhjjZ[[_s|0a-NOOxO q8`82< d26ѹY}Tcc#ʢ;;é\SSS~-l/yoOBBǧWBRTTdjj3;?yɝ?^g䮥ONNӿI&ý ' 1 d_@b"Czzz[tӦMt:}Yfq9WCC  IDATX;igb05_с]6ӝ1.]-,,d/0CN>L8n``௿bn5k֠_o=Zh} )u֬Y|#& aaaZZZuuu5aR]]wPό-)mYBYZ-KZL[H Q]mF;J } [Y893c0fT>x95 ^^/>L&OqRRRjjys{{t(o߾%H} +mذҥK=C uֵkׄ;w5*''g…ׯ_y ={6NNNM!\pcc#R.X@ }߾}˭[LL ɄDȦ7Xΐ!CT*|\RRc~ֶtRk"_bEee%q'b]v˖--SeDcc㠠}M>ǫ8Aъ* ???((t111=^%//`0bcc]]]Էo߂&O̱xEnwI6۷tzz J} sɒ%iiiuuufJHHDhoo߼ye˜?~|hll} } {JOOonn(++;s挚3>>cAzMҚ:::֯_ ~ޞbN?7{y󦢢"88D"qaE+..ԄkDκRRRݕ{wJJ utt7KCC#22GnLfpp02ҁpځxQ'6o\SSӚ5k{{{@(;;[KKkȑ,=#Fx1}|rr=G<CD (JEE~>f===nYtjjj3f-|-}}}/xdmm? `7npɓ'.[ gˑG3;\-8o|NE>|uϟcbbN< MLLD"g p]]]jjjT*ӧOL4),,,77ɩk竪,X /D2dHpppBB@[rrrΝOuFqҥ訨(}}~6bll\__moo3eʔ8tׯ_9(- ֶ088xȑl6;&&FKK$~IIɛ7o?87odggHm{Κ5 ),q xDJJ*>> СC^$?x ɓ'wضm… s/eҤIpf>'233===MMMCBB~)`KKGEE364j( А=m4!D bbbb455T8QTT ...vuuU|XLL޳gtuu_z13@YYYd2}a>Bdee=ȑ#9;v쐒믿8={vtt4]][[kmm# veddaڻ}||⹼IHHxxxs+ p`3g|̱|իWd@$"""uuudMOOoܹsظ\yx/f###? %%5!yL >|c̿&eeex2d2Q,+--s„ t:Eh `Dbeffh4555OOϤ$n#khw#prr2xy=X.LNN.qd_:88S9}'v@?NEEɓ'{ݳgٳQa2Ǐa2pA,*W~-""3 omm=@ O>ݰa˗I$vp=:00077Bp+驣@Xb|/ P^^AЌ3Dࠫm ݻx[<",77 x]/++C6qjE269үCQQ#11ϝL&3))yرt:]$3@cccTfffWD}}}??wޅr_RR}II Ç#{%99YGG@SVV~qHH%RSS͑q}}}_۷s񱱱3z-xrpp4|rժU]JJܹsaaaoٳg'%% s1uT ıCqqD[ZZ|O5`^,'8Emݺ:;XXX" 0ߕ...344D:{>(,,Dg͚c$@o)((;=~;::✝bccYs $t:^^^.<<TOZZL&WWWgddh4}}}!D /))ҒwUUU``lpšY 3o޼>ܙO>'wΝ;d2Ϝ9s}"knn޹sDNNNttƍeE1viݲeˀD A>z_qAAA FFF))) CMMcG󈕕 ?ԒlO!-5bԨQlC7n\燔g঩)**nNNNIII"7`9XAAAƍsvvg-#KLL@?Λ7;HKKo۶"00BMLLX,Ԉ# Foޣ++o߾ ɓ'#USSsN>X[[[[[ e,QWWpBHHȳgϴ :~8f}}1!!Wuww_pwn蚚z82Eс4:owzE[[Fy{{+ϟ,--b‰@LMMQWWIKKgm;\JNS(aÆ !`^xakkkffƱ0/AǎSlvxx!lyyy}9?ݻl2Zo11 .lݺu ۺu+2ŋKJJtuuTjgܼzD"QT;;͛7ŋO8nw#.]"ɘv__ӧO :oĉϞ=Ɵvڜ9s"!)) 8"1 @Mqy<:?УEEE3 B" v```uuG6n8zhkjjN|xNNNXX~jΜ9۶mCX,+%%%oܸ1sLL͛7** xQFQ(ȆTooouuu!D ٛ7oMLLl1eʔ>>'OĄ 犀dպqqqRRR.]9 @WWRYY}vWQQA72Lη蘚:i$Lϟ|||.XM 3gEEEd2f D"It JKK!>}Wy%R_Bxڵkc~*ihh Ǐ?x#ѣGygZFLLL&O>ݽ{QFF%111 @̤hjjjT*5.. UTT\]]޽G1+40zzz<䌌ӧYT*B zzzyD^fYRR2&&f͚5h[}}=aϞ=Ȫ6bmۦvY0+k׮Լu{GGÇy\"%%E1lΟ?mb 6qıcǢmll޾}۟УYfedd kl6;((hҥL4ccTʱCrr2\.Jȱ&dIIInn.`TdH*{5222d||ʕ> O6 Vu]=|sbȐ!t:`HHH8{{STP=^hooR=^E$222***lmmU [[ۙ3gp{L&x"11q֬Y|˗/g͚?5nܸ(xyLe))e˖ a ^y={7ot:?f24 ?}`dee999ihhucGGG$dddV\ XRRR+Vkkkyt%Wbb"Ҏ|޲x4>y$| ''gaaP>:t(Bcdd Ɨ/_̴h4h t{{cم=^%--M&322h4"77Аghlluwwh4SSSVXommϧ(,,Jb :466nAPcc;رcJJJ^^^<2|̙3nnnN4iJ-..`<,+66R__?//… eeeGioo?p[6m*CChLZkkkd\r?V\\lddt֭ OH`wwwyN備L#~t@?L"LtMdΪU:;;#.\CIat=sqvՃZZZA?Y^vmnn.˗/#ܛ7o+ElNNNGŗ(**:uŋ[ZZ'@_~5yyy$W FKK_o߾P(H$RRRXXXm~haaazoOƿj^9Ŋ}d2lvss'&M$&&tҸn?h}ȑ#ӦMVdggs̷C  QTT{͵fllǏ! .iooGK=¼ۇt!yᇷ7r+zvv6GrMWWWI@@:0kk븸߿WWW߽{2 H\\ӧ;  :'''˗...)Sq_ko0l2dB{.?DNII6mZRUSSswwOIITH@dee-]yɭ$qii,Æ {,a n߀[uuu]vM[[@ (((VUU L&3!!aʕ#GܲeKAAۅ 0Oc!!!F/ܷo+hgg'ٚKKK"xGb_rr2p`Q @twwcjx gYCCt "X͛78#ׯcǖLIIquuE K6awwLQE`J&/qD}j]Eb}ERw~S-b#ɫYS[(3j2?DT7o8p<~5"H޶zh]]݆ bccw޽w^yi%((8r?~SSSnnnnȷ 6.]rttcccmllgutt|xp}×$᭼|ʔ)1@(++SSS ٳnnnp{uu"DDDڵǏ:hhh|! ʕ+JJJQ*~C 8ZiI}{֭Ê#}:ģ/A&&&`G}||N:0GG3gك/;vӧ '=zD&џ))lMMMڱcVTTsӯ]622H$VVV1Ν; Ça޼yVVVVVV",tϞ=KHHsλwdddLfGGg~~ IDATǛYfG4Bff&D4]x"##=uTvvvZ[[''' ¹sɘ!EEE˖-Co@عs gΜ uĉ~~~ׯl uu;R($@r*dgeFMU14Xg␪>  jkkK"xL߽{炝x̙3O<sNO7.99Y7n|B߯ӧǏ?nYxcllOFo> 55͛7߹sA /jXPѣG/Z(,,ݻwq zG 0s-MڵkWXnimm]v-}͛7g̘y(Jyf %K`lvPPϟ BBBrss-J>}ze000 񿊠577_pT]]F^hq@M$g.QLjTtUI. A=dy晙3gNBB‹/;d2LMMKJJg-Z;;;>6:~G 9Ν;k AО={ZZZx\+++q\իmmm#G:;;GGGgddPԷo._\^^~NNNjlWWWfffHHرcutt|||ڞUVVv/^𸿝C||gz 7nǎBYY{M4 d2RSS{\ deeoݺH$b2JHHN$`0III3gء۷B "&&F&t"##d28%%%jjj111]]]B _\@`Z_@b1Ǩ(  $*~~~=GUNNN)))S҇rwwﱌ0̍7FDD`ڕ‰s3338a=LRR233SGGp+ڵ  CCׯ_#;FB<---驩iiiiii#F2e̙3zÇyyy߿0a)D2449s7o&MTUU|0\r…;=zʕ7o809`0heA =26}޽t}}}͛71[r\n``p%a&g2֭vd555EAP[[̙31$ٳ ++2?zޱcǑ#Gz>++۷---a„ ***Ǎ7f999ޥ [ccc}}}MMMeeeUVV~ ]]]]]3f۷]6@ DnxO03771%))¢y_͜93==_իW򼊊iii<5\IIɲe \]]CCC{F6na222[nݳg Bƅk̤W\'͠ѣ 09b׃H}D MMM7oz*Hܺu#G!&|2iӒ lt3fxǏ{pLgAɓ'-|x׮]U0EE7n -*,,F>r䈕0uÇQQQϟ6IzM6 |hmc%sZUڵk睃L&8p`:::h4ڑ#GcQ(#G9ݻw1ZZZIII&Lf0p<={@{ ~ڵ?;ڢkM;::s. ]v:tH$q4)Œe``3AWW7''_5? EL<9'',4F02/3ݿ͚5_|2=?E+))iǎ<>Ǐ 3*`q_Z233ï\gH$;::R(iii A3hmm QSSsvv6@ lll^z8pyyyAAA #G^|`y?SO@o>ݻ!jooǏc;vp'''66v  100"77wtnZ[[1IIIrrrB7o`*Ùp;V]]+V߿ѣG]hc}pU000PUUEXf<8޻wowww :ʕ+ڹ;>}xҥ?;ʔ)S^xq)<<ǏBD"ɩ,00[;<<|4]dee yKxxY BBB'? 0jذaz!Wutt Wmذa@#3 . f}~ԩ ,Z^YYyƍׯ_ͿRYY뫣3g'cxSS>t:]SSs@㉉9sǏ񧴵_xO.ujjjOݿ_VVV<)Jc??YYYY,Vdd$EGGȨ_f0{uSKۇIOS\h4tKmmϵIJJ޼yӾgϞp>o"(#11qرS~H5qİoo;PTCCC%!!lٲ`ZtFPPPCCTWWo۶MQ I&M<>~%|Ȁ>,))>O>5kJfi4vLLL9_xhѢիWPEEEׯ:uɓ'86l+++tԩS4f*joog)9s/_,ZHyfBtZDŋedd *..>|7믿8?xanpI&HGT@`j)WUUa-p#!! 'wBDFFYTC޽{3{fbbb͟??##3AߩTOmGTff ,---}M0۷(**'%% p?Vԅ V\xbQ"xi0}SSSAAO> hذaϟ?gdd3x…}g;;ׯ_KKKV|H"b,aĈRRR.^9UPPpMeee!G[d29;;ҥK]\\W ~t C{ x2qqq܆~zT{`s<6lؐ?bQ"x|iH4sHkkd8Çy -Z_ .??p{~~=;֮]]jՂ TUUnjtΆTTT`ׯ_5jRSSx߼yȑ#RwwqBbʕaaa"ɶAЧOd2~%ovula:z-&MB2?}466Ǜݻc{CCtRyykmmm]Sl|r@{{9s0sׯ_y&NiӦ'N -3gzCwzΝ;\AΝ.ٹrǏsL 5 abbuVLML 9ނX"44+uuu_re>>>"ӭ[EEP( իm~~~vvvA0\@\[[{ݺu YYYgF;::\xŊ5222331\YYIф3ݻy'deebbbD5GsssBuJJJ0l~g̘aeeTdd$&UhABA1o<6m=wڅ P sݻw1exҺwҲx" n&''/\0((H$Qwaa!r߾} uuuV^^~M+++,--O8OV Cx"' &''7c @MMMAA|ݸ9vXgg'|sm~k_x=- _~qvv...m֬YѥB[^__dggghġCRRRWYY`2LիE244So|ĉr鎎={rWSS[r%?3~zK`AHֆ1<~8 T*fׯ_]\\z5aaaqE̲ǚkkkQpTTT|)&/_655zP}˱CFF---ݻD |pww=;;;/]zS1BZZZYYy…Gsx̙3˖-SQQ6lСCUTT CP/ V%Hnhh8tұc:99q|ķobbb- df}VV֘1c]$鉙 ĉO:iׇ#777___Lczze0 ѣG&L766.^G)qg.!'z{{߹sƆ?-@SSWс9~k֬Yt)!J/4_b-vvv^bׯ_۷o666=#&## ysy5r[$ rP^^^^^=33>g" :  P%Ot.+V֭C͋䤥m8IRR1//ƍB0??8((?i'//m:.^DAA9~4v0'K8:wE^^رcȇ0ӓDk0B sd琐a IDAT566';\?ޫիWۣ[֬YM wss4&%%_^ukI$RFF ds?xhn傛|||MFJRABLL.66£sqqۑjŠp:{lJJJcc#A?~?._ۛDDD edd6o޼rJMMMIIɚ=zζeL \]]oݺKJJnڴi͚5%%% #$$^~}!faa APFFFgg'&qgbFsssqqn>|vy2vӇ,ӧOYYY(֭[{{7~!fff}Ì3Ǝ @xݷoD;bXAAA/ ްa֭[c%%%ņ`Ν?9xĉZvv… żEZmm-f[^^>.// CƔ ha_1cЕT3!###C AOddvss;qDuu5rYOOOUUU>;s̳gЙ233>O[hhϟэ/_1bӧ{u+8qgكvZAA[ {?EEŰ0WW;v++ "/ ᥱltA/^`ΒH$+Gh)9999- oÆ KIIϧDVwƜUPPOD&ٷG,Xyǯ/bɎjo즖>> ''(8?~hmm1!C-$@Z{{{:46fX/FP}?NaH24%BL?s_0Ə/0`H%|8={, 6*qqׯ_vvv]ݻ8:qѣD]%&&p{ AdccSZZ*0>|knnC@@. ~*VBxqssĉHT||ɓ}zթS񹩩Ia2i4sQQn***UUU4ܺuK[[޽{S/_m}7v@tܹt˘1cI_xqmtѣG3HHHܞi~5`fh7 \aCCt@7o֭ѫ-B'U7nܘ3g= ѣ9::+R|G9L&ggg8..NKKJ 96 &) p]]]SSӘ`0slY&>}e>/dّuuun=)))HZ> Um-[AUz`Ȣ~@rr2$⨾4c5jT^cw!䯲?>k BOO˥Cfv˗{ff3DZJJUss3@ ?~f&ZUUU;v4:u @d;v`o&qNNNܒAuvv^t bll<}zÇI%K 3m#!!na2Ul!!!SLA`nˏC޹sGSSӾsN_sQ5kVFF9f-]GŠAK\\Օr", pD$d2طo"iiiS?yyyt:7nsann.#@gdǏa_> ϟ?f(33A`XEEݻuttrrrrC4N,iA܈jO_H$ݻw333W^-..bE_9sɓ'ƍ"%%%0d0D*** a۶mt̢cTaD`ᘟϟ?ǯLGؚzj---t˵k޼yl222/^T=z(?11 lcbbz{7{AFFF4V?aÆ!9n ( 0)((ݻ*11Ɔ~Zdii ~ P( ͍ȱ 'CCC3\"1Y`zzzh;/}{id@ڑzȪ`>FDijj^E Ǘ/_9rPYYYI&ϪHII!by,Ezyȑ#Od^~ **[+IIIggoߦ $T߰XSSӒe˖s+ d߷ 7PwwwQEq LNN]ɜ#WF/]3⌆,##cooǠ 3!}.ЧOufX/^bbb, )'yX, ǏG72Ldz[T/_0...622uH?\pzzy8vxqjjcR-''ǭ'JJJwz6!-Ȗ 3g<}-[0 ޗy\5H0!))9zh8P~KC̘1CNNɒJ~n ˗H:ϛԸqƍgdd͛7c2ԩSsss!訮]6  )?țÇر_rrrBh҇~Tǯ\BLLJWYY_aO>xԩ2tYfeffA555I?KЂ0@dgg'%%N{^@@˗ݾ};==oC%&&!-^^^=>iyԩSKKK9njP@ ~7toKIIt###[:<<ή{ntuuݻG&eZ={c+p̜9׿{bb".wҥA#r{(`=x<֙ B,6SQCPFq˞ݝ۝ )*BkBK ?Y,\r˗Z p˖-4Esp _lkk'["z`@_#LAAA[[>K$$$ϟ߫y%`Cxb8**w@U ''6mZPP 3fDFFVUUh0hooNMM<׮][z5f@BB"::zL@d ( ¢7al6N[yL`}ǧfs,ܹs->m==]vabظq#RWo߾hii3fK 9QHHHq,F 0%K![[hX^=@?P$DCCH[W;X,kZۑaW/ FFmOb&&&RFm)8&Ǐ{;\U_;&OR, P;6DQAT]Ak DذmEHH ϱ@/ رUӧ# W\\sΜ9˗; 9=0 _FbgΜIPKsܹS___^^s׮]C^¾ w^da˗/˖-c'8 ]}B˼}ĈUUU?^x8%%%3fů]t)66VAAA 1󮮮4adddeS0u-^qeԨQgabu?~ǣ[,,,Ը`*++o?vۛq9rӸiӦ ApttXPPl2FPXXX`fffL+-NDVQ/_3g-wU !wwhh(iӠYmwBBB{ ƍ7ƏN\LB4v,dom ? Ӹ vzѣG & Kٳ겶^ZZjaaARᗞ\+?54HD?6 $8w2~# FkkkIIɅ N^{Zb/]Q۷oVVVzzz 5554^055G+;ihhtџWhhҥKݻjINDD8111// SSZZZ:88ࣀ%s "HΝkllDCaÆ!s333{Պ+޽{nR󏐔R y}pÇHGYF킶ݳ_t>F`۷g/ܹs=.\/yw̙:::Y-̞=;>>+6f…o߾E^.^mmCVVV"-=ATll#zbpqqW8pFy/\t:Ç)))Bjjj۶mSTT58J8qiTݹs֚Ł ߟ:u@L"Ƴg<r9D 611?6oLpFLl8DB! hŊ7oFh$?xLL >:tM>>>\oذΝ;GGǏsC)**zҥ?"}0QQQjjjĊ舞;Lhhhqqqll@l/#F޺u]Θ1ԩS\$>B"d,LnIhyyyV>hH$ҙ3gÉK7.;vA](SC/+V3fȑ#9:);fdd,]#cz捭mF3gLLLLHH1c,Z(990eʔruΘ1PVVNHH6عs'c!t0UrttD444`&%!!úqFt9A .=z47@x0r@w% \__Q\---{{{tˇ"##9 f5$22209%!!!ohhiC4Aݼyiy'O~Z ӦM{Ibb"LCCC[[۲^ |7ԔXcӧOWҒqttLHH(((,!H^^^? 233АPWW_dI@@@yy/5ٟ̼yz$M)m/IZ|O~~ӧOU%#ƍ~zEEEppرcEEElٲÇ<Sq!CxxxZ*###;;^h) F``>F1f'tq IDATѢEyyy˗/}Èa0Oƴ=|PGGG V)~vر:t˖-[\wψر7nhjjBC5`@dmm~WA8bܹ1077/**".|***ݻwNJJJQQqĉӧO8q"'ӿ|)++;|p___ >EPgXhs#";:Ѐ@!>>>˗/'vL>=&&ׯ Eqqq'Nd8qbff&LB@WW3#ttvv:88`6l yyyyaw@sNb֯_/ H̙n{. BSSSuu5GA9rÙ3g06Gb(!C<|Si`lذS4X3ŋLↆqzi\pIID?~սqFxJԼ|288x&&&_|Qa.3bĈ?͛߾}h~sJJʁg͚133S__ٳ%%%T*>??`=NOKK9r/3 gϞeff[N/ݭ~E"oߞ=i$FLWW^<]SSѣG t (:t'0rss^n\n]XX~%K[ЄaX9@Q0Јӌ3s*etKmm-&3M1Gy!1"55S\ΎP 8 _ ٳg1Ј~ٳv())522ey)S>}$hCB 8q7-yⅉڵkI׭[W__E|k -OCCChh΢EnܸAXTSS#ɟ>}e#l~zAAA])))¶ CVZu%Lرc={e»w0A$),, /?vXXX] 쌉AL:Ux03VVV_~p,N&eee-ǏxӦM8hc>O!~ ! ׯe4nnnb׮]ӧOq .=z̜93..ԴtB;Ç#~WhhYʙHHHL&3jkk=zt`` G7ҲLNN޿?+<<\ׯ#/ wޙ3g4hĉə:u*Ǐvvvܝ(H$ЯsuuUWWwuu'9vX>w{ ===SNsww}ؤ<11>eʔ4PQt D /y`SWX1k,QÆ cZ޽{[[[1‚$yY[[[~IPTÇbMǏs:̙31t{{D066vݨ[xTKIIEDD}ES(>º:P.8p@CC.,,oݻ ,Ϸ {9z?%%_]]]X&[@kkkdd̙3BCC1QhŭӋv1x޴wlmm d29###!"Tb RSS6q 6`./^[Ď9r֭G޹s'qJdd$x#TB@PPRR?>%!!Mm۶aΜ9SQQ80薊XZZFDD`,X ...iii.^O VZZZϟ?5kŶƹl111CCC%wYb~ɩS;LmmxvP"##7\dgg>)33:L7WǏ`jŒ9ɓ' E/^644LOOr̡C- ߓB`Ə,++Lp^n?Ћ@ #TQQG͜BZZ BR1##))-!!n }6wY~}pp0|ѢE555wΝ5m4L{gg d:3fxYll,bp/_m} Xx&~wѢEFRPPoܹssEDDѣG222螃 NKKczd21!P(=2I033C[hgg'hS__YOwssCHIIqqvBǏ6y8GPVVz@!4i~PTVy0zzzeee6giooc!ɍKT77C>>?'Bgd2 kرpaÆ;kkk޼y3o|UVr}\K....TTTY Ukeeϕ+W/lق>}qmMMMV0`|y4sȋ/##<bVp@#;;Q!詢B&߿jccC͛7@!''wҥXaϟ/~%޽{B6 ۺu+FXw^UUUa۳iyW-qqq˖-c՟Jsz }[h4ڡC8kΜ9ZWWWDw^LA˖-#U aaa!!!wASNeoZ[[A`@89vXII ͅǏ ?~Lܭ300N;::nٲ'PRR2ϟi͛W!jmmŴ#U;;;W\t033kii}M5b@g>x6/_n?c׮Ԕ;vKKP߭222𻚚ϟ۷o 9+W3---X|9JחFKKɓ6N߸q#恋`8::"Ǐ#T.>~~~ZZZĚ!!!?P(F5#{h]]]7U3gY~}[߿?ׯ1}|}} -#Gd 6lo޼@ hݺuÆ #8uCCC||>~ƍ'N;!𶄄_|Ғg$^ݻNNNSv\^QŸdҤI***Ot nDGU#S_n?޽)YٳzV]]S䁨͍ /۷oaȑ#Ϟ=[VV^YYy#F}:::L999eeeJJJO.++R!!!W>tKDDuxzz|J~ٳnJJʖ-[8 /mɒ%vaac{y+^fA@ @ /Pgggbb;Q޾}{aaaMihhXf ә|QUUEܓD"-X`ƍ+VÇ#4ƍ|2;ׯ_.\{LmLL0/aTΝ;ɓ']LCq.]:i$b/ԐH/Z(99i[|9ݻw&LDVP(H͛7ssse˖{!-6lxI$Ѫ%$$8;;GFFcGvuڵ۷oTn9sfFF͛7wT% --M__ݺu~~~BEVL6-""ߔXx‚U7WWW 耷CCCƛܹp |||X۷ .Dʐ?~ӳYL2ʊ.$IBTT͛L+ǎ4uT8Gȑ#ׯGje Ǐ,׿>_4bomdҥL_NG3cD^^ڵkxMK}!2ZZZ^DSFF&>>S+''ɎӧOLII=z4իWuttgGr;QWW?wܪU pvvȠhk֬AF>:wB> $Zn["iC"|}}---q$NB AG;wn܍FLLڵkwE_tILLŋ{zII@}}M6!0SNzŋe^@"lll̂;.]uֶmۼKojkk5448{;444ml&E8q"F+D^UUUXXT͛7ƈ?Su<%233+V̞=6l8s A߿% *R -I)|4h^F[ϟ?["!!QWW0֭cBCUVV>yvttD }Z]]ba.\[[ۄ+W@_RRT[~=+Cx~Ctgbiiicc/_P((..>}/'??>aÆ\Ɛegc&MBgm3S D"H yFKKKLO>)**~@ 3f@$''x :t(̣gii)cy&>v2""Ã/!={^755֣&?~ܾ};X\qBCC@/PVVǯ1󣢢\\\f͚?|7x8 `>gdd8qӧ3mOOOG-s;z!$j)&#_Dwx4X}eȐ!ȯ|LLԩSCBB<€BG<| p>AvZN)((}p044DpҜ9s)gϞ0x{Ĉ10>>>G3gNhh(qdrYYYjjpDttf…yyyBEIIaYY%44T8EE0oذQ IDATLsND%~d2qTu[[۵k-3f S5Z[[1.+!4h %>>=;;szyyq7&ё_K222III/!Lk###L{WWN~b``۷oYEUUUũt:Jqw@WWWcc#GL<… h]G1IgggD E1#ݮ!ȁB2A.DLyaG,//ϫY3;M63FCCʕ+xޤwv> h޽޽C; sI$ ?8qbkk+aܼySliVa# } έEa⶞}׮]ȯϏ?qvڸqNgґjjjmUUUNϋ汬n%Bn͓@ʇ" B2A@cT*0 J4+9.`EhӦMu֩Ξ=;00թAVV.tx m Uyvlp&p@4[nEرOh4ZRRkwՓ'O [llp RHzzɓƍKt7w\|gOOϳg ⊈HXXF@2p@8-ŋLwm FHNNj 0$y-_T\\LPj | ///^iBBB0Dee$۷Ά@LLB\|PRR2cƌx&cccYc'>|8;&׬YSRR߫bffv)V>fDqP Dڲe |kJӝ1XXchjjBlc^GjMKKbw!7| ```Tt:G>\IIu!/_6|XUUUSSsN|Y#Y6 p}2&b^kk+;>r4fH('H ҥK\l,^6?z󖖖F777=\3m,.. _3&חS^8QRR,66ׯfXSTTĪrBBB_) h"|BIܱ{ߣ[ƍ˴sQQQdd$E]]y~:rX6mv<,, %B@P hժU RØ{ Yy+*>|xjj*&=`lٲ"L<׋-´3 ??˗s[!.7~xP.iЂLC@444 Rl111ϟwss[`Z]'Kwng9r ⽢"Aӫ;!URUTT ! 1˖-Cn=zľgߴQ/MWWW}ԩŋ;?JݾA⿗t;;;̗F#d.sT}зhkkĔad;׷[v-r#տ޼y3`cc㨨(Y!ٳg˖-Cb>-#==ٳ11(t,4;wDV>|ܜ@:,,,X`0D͞=1ܹsw,~mmmd˗iyeee!JOYYY$8իWlwuu];v,x4=Ȕ)SLsJ++W^AcO@נ% GaJN/ǟ={o/^X\\Κ}-ߴ(Ϥ-gfS]]]}yyy6˙RRR K6rǏk$ӂ63^{Wd0gz5_<1|1fh222>Wqq1&?h}U[[E`?~L0 2e w܁^4]ٵ{nh_2=)nmmM`pqqA: ;"x{{;TVVBUUUKR O :]|4|e͚5?~+88i'h"V#EJENCmoo'kx|x40999HC-"""Oc:t?xCjj*^ YVV˗|?WO@) <ѣGyF Jd СCCBB`3 8˗/Y455 ~JR?heefsqq,B$##啗Ғ$39@GAg.u`6l؀pwweSSSKKK^^޽{Ѫns# dЭLGGwFYRR©UZ@0<^h1ngĈOiii[[[GGGEE7nDsZ@0 UUՠo߾]|ƃٺu+pV0;mSS人_^111b0<\TS]]L0nvijjvڪU +3e !t:=$$d}/ru|Km7X[[c2sL.| 6*++n-A hȑ%X03zzz1WԩSy9]ee4z!C8 6uTׯqXܻwrrr+--%hɻw>SL~$Bw;!rΜ9t:z1***]"/++CIJ]RT6+Ξ=P( >u1/_^SSÑ=xiRw̙3aiƌV!ر}8No޼EDDpp}i߿?/:UMMǏh[[!C^b|wAaze˖ihhHKK5jweڿ0yىH۷oE x}}}PPl%KB5Av`?MUUUppرcEEElٲÇ @+hϞ=SSSИ?>BCz:!33s۶m'NTPP3f+9vnaZ[[#""V^%'''***''蘐@XH .MLL 2A^lCCûf6`0 ӧ7n<_IEEŕ+W͞=[c{*J&o D?O>~)"44 ]q 8B055w>%%%:::`>۷ouȑ{بN133KJJb:bʕoF^^~]pʿ_>z(hb::nddknnL qss|ihh~RϟWQQauJݷoEDD-r)ر[{1ACsas $` [[[˗/_\h/_xF777x!Cbz.@˖-7o^׀)++cvUVVΟ? BaNBCCGCR{Bzs"7t:=$$d 2dyrr2WZZƍHe`@/|޸q^IIiΜ9~~~D={6By=R"}U_UUՔ@III; cǎH jzzzUloo@7:;;[YYQTCƖ%$$aG+uuu薾R  ZnF=.$%%n8z(XYYZ BR{HڞD"oڴ ӞgllϞ8i1,L{{{+ ߟ8F__&&&f @0999))ŋ?rKIIZ 2 #((L&3M hq- ;^/^߇|ޙCFJDEiDJQTӉH$ZPhӆC˩=f)ThITHJBvc~y=`3\{,}]N#LoN[P(--lĦ˧O+WJ#$`<h"oDZZZ޼yvVU @ʸ:tիW,DxU Q} 4wFF̙3ʽ{KOO?IAA}1l0gg蒒ׯ__x}f̘qq+`kkގ7:99u^ ڽ{7ŋ.n:99tU@@B@`feek3#%H\YYY0}}-mmm,`PPM0,55аM #F E!E==ׯ_.*111&M`*""q̘1'O޵kWRR3ŝEDD߽{wdOPMMMSTgϞioo#j0aBJJWbv#ޢe/ܹs^D:::BBB)Swٱ@n1c444wv O*(((Twtt5{̩S]^^Y5>AA+W %''/[Db͛N@okksuua_@ nnnT`eeG+b@-##}̙#F-WȈ#lllÿ+\$==]UU̙3S#Gww'y PĮ$++XE||K2Dwo߾())^vׯĎTE.C]}~倊ڰ4{?}˗/{?2abbbAAAjS}tڵSs)..S}111ww>888]SSꪤ|p}"___ aÆ͜9###*jjjnnn_~ 177m} =gΜϚ{nɒ%wPnB'N|葌 Wb555֭CكlFP(;wDz=z_ۛؑD"1YpVVVt;Saryuuu'5{?)DrwwGnnnʜ9sEk֬!oXȀ"##{\\%3l} aaab733S]]/ `&++㓖CAIIFrr2g]?B@*)))115K `==K2* o߾=xxJTTӓ׫Sill믿j||<38+V[f̘S7nܸaii̛7{t?]zUUU%++miie>ŝ;w-[455 s˟ޣ_5jԬY޽KJ̟?ӧxKRRܬ7d|F466?z]~KҥdÇ]\\U'11q۶m޽cӊ T44|QBHe$''ϛ7o3gNJJJGܝV}o##Ǐ#vss0^務ً/V\7p@{imm CAAZT`%%Gb}V_JJj֬Yw73}EEE˃WZ5īWNJWWNN.))S__?)) kkk߿\ttt .rѶo0`'NЍm߾D"u[jjjnn.޲vZ}DHJJ.^os玡!=yݻYW55kb0Opp0QT<++K]]XZ 0L\\ &\0~h<mኊȊd'(((888DEE#!!EMMEgPΝlbff9|;jkk-Zs>{J.aOF KJJtOtads֭[񵪿|rubGii+W2, `kkLǾ< q1jb;sL%##Ν;,02L\}63k}:<2dDٳtoڴHe]:7AjGhҥAAA[neGAG߿;啔 6nXZZʪ)1dȐϟ߰a.x_~c}3g>~8!!AEEn4mmm@BBBW\)//g;ϷoFV_ 8ُI9 =cxKNNNXX0)vT[[n:KJJ8|}}mƣa)) aB*QQQfW^ff4111'NܲeKmm-}CVZ5zhEEE[[[___Rd WWׇ@n`jjJܿgƏo.\ؗ/_~m89p@zz:"##s.;EDD- 6l[VaR)4|pcccf:A20kkkæ&F}ƪ|8i$}v8dWhhS߿daA'*{A---gΜQTT`z G=???555%%= JJJ.\HT;XbEhh(Ȼ<{l޼y4 D500貯6R:22̌BL4)??H"޼y3u.xݔ)S;v8qˎ}UV]r6YYي E__?++tۛjk- \v-"&&əgyyǏmN<ě7oLMM?}I$ݻ_^${ e#}GY|9lXKmS'-LM7cZZZӽ{dO ӧO ӽefffwkeemXF}}=qɉ6t_3/fCbn_gQܸq#=b6m_gРA,yw=z߿Y8BhiivFUZ]Hjjj y*m7% +!!MOOǥQhܾ *K 8v|AVVx +++744tٱ< .3-Z+޽{̸,%%逸Փ3/g׮]e<{ 7ݻOC$a7 ǧP(߿'V:vkg~ ݨ>~wqA **˃ D277/,,䶛( ˗/jjj=Nէrō99s ϧ+1a> ܽ{F2 fz{{#}-,,6999|&oܸu%&Ln{J̙3;Qf_|AKIISP(bzaao߲vN(--UTT$>۷ol",,LLLxi wAKK73`gggȮK Oikkʺt钍<]2a{{W~tAcc35\mYOnnQc wbt%隚Ç#KK?~D988}8{,N"i,_0Țɓ'+ٿ?rWZ`vBd e|3,))رc|`YYYt+H$> ?~0݇aСCV@_C/ W#B2nM~ZSSӃAΝ;g999 ++oO92((hŜݼyF__ ޽ѣ\q},_͛xυr1M99A,eeex_|ˎ} _~\|ItXf ֋N\\UWWW+((^IIɢ"sԩ%%%x}:Y:TGG\6?~XYY=xxի|LIIɾ}: 0aÇ9<¸vx5X4rK***-gffvtt`!!S͙3gܹP(/_޶m߿g-[vaÆq1vxj؇~ZII˾eeeJJJdAAKN0oy&3}& EHH K,G]]===PQQn 6\x_3?x 0ÇEd29%%ECCuBII.1 sǏs v@P;g7qݺukʔ)\qIKK۱cGJJ 'O={6'11ӛ@]]]VVVjjjJJʳg~ѳq A];wnŁkOzzznٲ^qgϞwS9x ӧӧ#{…72}ժUW^[N8cUAA + L:::>L(++1amll-ӧmۆX[[#/Æ #zJE\\PZZ`y-o޼aaZC| ڵ IEmll~-,,m۶BgI$ˏ=:vX;@@ߡ#''ݺu***ڮ111 =ٳYYY zzzQON70y䴴4~ $''/YY'H'O@GGǚ5k߰a3333yy͛7#""" Ì ``H]G, 'ʊL&-WWW"zΝ;zv,;v zTXXH7}=~n{ݻwsv`bbˉ'"+V8::q1^$//qBP"""lB ?<y<򴴴W^|2==ٙIΝKWEݏ?N@";։ OcccdqD">}ٙ[^OO={-ٲt{!B˗/.\D+V=0`@YY3},Ǐ[ԸXxq||<Ǐ6޻wÇY8{cci?2 gϟkkkc$Ja *&uuuo&?~xx83<?~;vt 6l6mB"y7  x1j jeb`6mUWKK/ s򬬬޼yC<5bĈ@Á IDAT{LMMFtM6q+҂7^~}ŊtZt)2k֬/^H$ZZt***HcTWW=Jenn (o޼QUU[޿l'BBBlmmKKׯm,##_g Νsrr[6nx΂a؞={<==ѣGgggsX:::D2D?y󦺺:W]>~wHF?핔:rПWY4ryY߿Lǜ9sΝ* 7ҕ]xqPPȑ#9g]|ySS(((ggg%HSSwFfO6-''o|6ƍ|||sԩ۷-qqq^͛p60bĈȈn1 H$Ro>Ң/$$ܵٳggddvvvK8 ;wumm-bpš5kO;v2j`'N aK   47,)}YE]]]c>rݺuS"""^^^lQ"##J傂WWlb*''%))L/x˲enݺ4+//;v,!CJKKĘkڴio߾=-..do_x˯_O#ā(//K3gmxmPPkg0,77WMM 433c\S\\K xxx8pΰ?"QL*ΝW< Btuue-J >v옼֭Ç5kY444ȑ#+kooԩr7p5[[[$0`ׯ/[[^)SWn ߷oߑ#G͛7={io99j.((XPPNR˗/ 3IW2֭=CĨV*e޼ytJuYEXXbaaAJU/})޸t;w|.񣮮.1 K|͌=:22 Lҥ\rOmJAmmʕ+mmmST߸QFq7qɍ7"11h}}}nyn w܉?hG6,d;ѣLN8lذK2ٷ80---Q(_,] sv̵aϟk׮J% &vX >|faagg$%%p|ɎOWe øǔO>]FFf;vCrrr`?b\GϒMLL$%%HJJ2e׉&NsT%sر;v q ,W즭?hѢM61?Ȯ]'݂QtGزe sٳgx ?2{y$iʕx˛7oTUU6nooOLLdĚW예D"!j>|xyvL%JJJ?E'Nظq#h !={6}Ǐs/~D">}ZBBؠ#""bҤIH|/@CnyჅ}dddVVׯ_[[[ꊋccc80yd--xn;/ !HPikksww/++#IOO>}:0t aKJJ1*w<((`OHH[OxRRR+V`r:???diΎɾ}#v%##svL%ǏONN&nt߄0 sppHLL$V''hg[l),,tqq[>GUTTf7bQWWwMƍBPUTT"""ŋ[YYp=|i޼yğRRRQQQ!!!-K͍wȐ!H>ٳg/bx"EۉǏ9uO 603][[[hh(ޢh:*ð'Θ1oۘjT:X\]]ٴnmmmaaʪu|RRR c »̛7/==}֬YƦ+Æ cR.8&&þ& 7nܠΜ9W\_}&KKK6{iii12uTeR~&&&P(;v+HKK?~X]]+^qz;;;$coo|r [-kjj~t 9::29]TTԷo~R0 [jaii)NKK TF̙TUll,;0#G[222?Φd̘1III}ڵkBCC̙S\\q %%G!=yyy&&&YYY 1ߠ?… P.<<o2eʑ#G={ז_~{f ϟֶj#aBBBnnn< E e۶m'OD#FxԩSprr#ޢ1?BCC"((EQn0ssѣG39#,&&|!^`fmmM&111F'W{a֞={ش=|p___ΎANN.))iܸqޞo""">>>Ī5>cnzzzxx<3fXzׯ_9b_ҥK999)))o} CYY;wdeeٳg#G4hڵk^~][XXhcc ?ŋ3f\vxJYY˗|/aBqrr"Jɓ'OWAAAx L ֮Ǐ#+8***Ėmmm.\;3ӕ?xoWВ,XtR!!!ҥKQZZ{nC]]ݬKv'3ll,"ˡΝ;x*y8O{{uΟ?ة;aǏ8Ɨ/_%~PQQP#i4"##}`r@reaV:$ WBȑ#ٷ퍔uwwgt0rGM4 Y`ܹ7=<(DEE]\\ \*T`eee___ bB=Օ2dmZddduu5+---ɓ'߹sgС]"AAA}g`ϟuttJJJ^~=$$D{{ڵki!^?&V3(/uu[۷Y޽{7q_-3gе3@P%%%---&PðKRRo֭[䆒ʕ+> 2,D\\<((ɻ:~ӧO4#3P\7nX[[S`я?&D V}^Çf$GGǩSOv1 N۪܌GtPD",GGGeee111qqI&988ЕdDEEٳG!"""//`K.vիW C :t_uɪ*jkk/_L{|Yښc^^ޣG hOm֧O٣:tAM4iݺu^=zȑ# \P++KHH-Zĉ߿g233N:x`kk넄˗S/g͌F].>}:޽㿢hmmwiL0!99yر\񊓜>}xիWiYn̐|l߾nLe222fffLѣBe$.3@DDۘ:!rwwu`9sݲe agg(TM)S +Wr+v ,,L|eees1CYY9<<<11Qann۷o9=}p_kG#~4ׯ_Tcccé &t>©ShSW\ڕ(Ǒsfff?~ Nð˗/KHHaȑ |;=~8۷im,XSJ tƍt/PCCɓtHGRdff2*1o޼FnܺupabbbloogԽΎjiMM mkӦMzs⾖};v?~j*(2 hnn^lPVV.//w ''GTTc`` vvvt_b~Fdw6LkwWWo޼m8ē'Ok'AӨf't.\`tMMMM6l`ߌLwMMMŤ/soKnj[@@Ɔ/πWe ?w^Gu212I&!)7hLNOO'zcw>}?<3O,›7oh#(**ҽ@ .T\~םW2133áCLjddHϙ3gvw֬Ycb wb/^0l3vgϞqAiӦ}qiӦ!_uw$g ðSm\YYIw7pEE3 SSy>>1]Dۏ=Obccٳgs1no(Į(%%8̞={??n ѱsNI*˗v ڛ\roK5`P7zH$dCCqq6u>Ix"H8D-%K0jh+/tGfv O۷o#*i&innf'Hel J\jbߌ(Аn~$J74x۷os;>$//\0@VVMi_ƶmۨNHHΝ;JJJ]VV͛ԇ =99xjٙH]uؘXfΜ9=:t(W0UUULebYilltss[wE51sTRRZhyǗ/_0 WVSS{j+Vmfgg'##C~}YYTZZ5vG/oqSS- |Ȑ!9_ tX[[Ӥ50 :uYmhz L=^b1CCXXlHNNӧc;;;FrCZNwh9:: cǎoܢV__Lj}޼yg^P(k׮+8ydjn-k֬#?np$0@,'..Oa?~`CgvBb[L8È}"qqq rO<1443'TUU;B9zҥKYz^FFFpp0q? 3f8::0|@kkիWNNNbiEEEŋO8#̝;Qw|ln}477gee;88hii,%8 IDATgɑv̨/C'J%$$JٴTha]*BS-,,:neeta.4UUU___)EEŔwww~:͈Ex/Z(..lxbtt4",,JW*++0 d/v^^1ð!Ctx.#k>`fii'Qa:?",g֭:::xKuu]/ = RRR,X@K  GwGLLrKV^]PPEwܸqH b]UUE=޼y3>>>=L&+m$NJ}zzرc8}t;;˗/+ ӖhXnۆQEi|N%.}=afF7 >àzOIfAeذa4mN] H<==+|utt^z ޽K,,ƯRe?~|ڴi {?Qs}g%W5`*HL&$$$$Bd![nE"gϞekA@@ 00IQzAN11hb ##C__7_&^^^aaad>̞=͛\q;881a 1! vItt/_z6tQmFqe3וշnb&KҪ455H=B3*C maBLLr R. CCí[ |ʕpF5>b…o߾EƷo{lmmT[x͛;ii;v0j_WWJ lذyB@<[ÖFe:Ib bbb6bܲeKAA[eqq{-^gffjkkp_ٳgĝuuu &ddd|||6(++stt 3@ m}^mmm:t _PP _Ox׮]rJKKt9PNLLxyyyFφPreV֘S(H[744d^QP }r`Y|ƍx˥K>}Iׯ_$C444-ϢQQQh\~~. fԩ^"F>D%L81&&&!!aԩtddd?`7xt> F4hmX Oz?~ =z˗۷wRhhɒ%+WtE~~>iΝ;GEK`Fhqijjڼy*LvwwOMMPRRM,fiiy5vD,x D 9rdwz (0qĵk2jOP.^HԦMH5N&O&LL&[ZZ-5vvEDD݋;0ajj*E N 3aܹt :Cqg͚jX^fffr 3x ꁔTkkk ,/))w^f;>ٌjkk9B= åK6nܨM(addD[HJJn6nee%^JԴ[{ɰahǴBJJzeV , @#//OSSķ99G7_*:::'kkP2Bee%QG \  eΝĉ< D"޶6$6}t&(P RB0*o>v;n:$@7uHKK_t 1ٳlv&AAAvvvϺ?~SD"ܹsX@KK+""+r?~dF.@?bŋ<걹93 F?=S|TFFQ&l}E޽{5x\1R, neeE[PRRp28))#̘1vW&..3gfeeOR+2sޫ5:CBBUPB_:ՃѮ^v҅,i&+"[ yM2oay5:p~!vϻlٲ+W-ͫWFrqAAbrOii6711yĉ{}}cfJt1 ?~/|[v1dA~w1Ԕ޽{%%%=ݻq@XX{5cbbh6{=?622by͚5x 77 4ik׮%Ud޼y7ov֭[t=Xu@mm-"aӧo޼9tPuաްaOSx .DEE-׮]A%&d':gYqq *;L~.4@ 3JknnskkI&-aaatc… ޒIK HgnݺWTTz+^%%/_'c~C F[Fh\'O8+lhll͙3^bbb˗/wtt`joooډeff޺uz_p9މYrrrpp0!q\FF.==]MM۝Lq;DrvvNOOL Y{‚!$$QFqŷ>ӧO %jYjDöPYYiggG[l122ـvBG%$$:钒AKKK2?5L&| Пka&&&F賏V ;S֎;𖎎k2R"7n$*777qqp///srr̙39P6 'KAiiӧO9x /ى/m$4 a ۭΝKII3f̀$%%̙YTTsNiZ:99ڵKMMMRRL&>|ԩ7oNLL|aU)++߸qٳJJJFFF~왉 .Y(00rSL{nvv/^prrRQQ2dȸq3228O=&..< UXۈҋ/ݻ 7?622BVKI$֭[P(֭+ިB2./^@ݕ;uyvGGG+V͛x yM?azKXommm===%55HM۷s`boodJKKEhh(b7Tyb_yyX?dƌ=JHH`ի盘p7'H4b"?/'mIyBCCmllyyy`+?FGX΃o^=#žyCPΜ9{nd5 .MMM$ܹsL?Ν;䄷|g*2 E[[;55osҥK;WyyyKL&IVVىqw?P(!!!GXXX% e񅅅4pss33g6>k,55W^oYf!e7oV Ǹqㆍ R _PPϏnV%PXXlٲl)g"ep ֬Ysa)))|@ޙ@CDDD"HCu _=]***nJ\E>~'N ajj ;/leeI700ظqcly T83--DJ\I!DYR"K"MnVr[%K(R)K E&0?39xqL؈7hVSS6ܦpdSGNH# `qqqie'#((iȶyfn}kׯ_=<!DEE}}}GIInBɓH[ qqd?~mI݋G2eJ럕ZQQA3F__g?|0CwvȈ `aC A{r, ddd5>'O"""111ٳ'N $==]ZZtW\0`ჾ~HH%Yu[C a SݻwNNN$tRPt#Ŷ˖-u֏? ƧO̓X'k֭e ӧOLI2t`*n(!!`III.\ػw/>Bю9UUUaqqq^kqrJޫ 2@ !1-00t0 ömۆPGDII8{Ŋ߿'0''GNN:;;#ػiӦݾ}{ҤIH`9::"@GRUUx­[MfnnCFMzrɓ'KLLlРA鬣RRR)))N4xʪdڴig%>xb䮟DjjܹsʊrNNNHhsi5}xyy)))Y%%%^zE#55 Yd @/ y#kKȞ舏x<ʕ+MLLjWWW]V?iҤA!X.fȐ!׮]㸥)>>^WW۷gݻwxBzz1c<<<~Jrn@'5@jM Yff555NNN!))ӧOۗ܄́<<xʕm3tP$~I++^RRѣܽ{WSSի$֝|ߟcNָѣGpEtsPt;o޼033:th=DEEedd&Llٲ۷oS& {RR񐪪͛7J8zzz"7ӍJر#77NLLDHem_֢9Ah|%~{n C=xBh.kvt&lÆ sssG***gHpڵϟ?''6PQQ'6055;%Y=;;{HP pC@HJOmn|naK*4| "6hK. $7!B\ާO_nݺtψ&)kjkk9r'O~YTX244ke M wޝ0aW폤;3UU'O?8AǏF';ү_/_:552eJ~~>DZBϳf"6n̔$+TTT,Xxȑ#ݭ)<׮]{5n'L<944TWW̬a۷o ~;wP`XtR7/TWW/\)X[[aؚ5k۩!!!*8y IDATtyv4R7n\w+`}㪣ښ°AX+a G CCCIK  CN~m}} J"sss.]JNOHHӧOԴ~z$JiK.^-2 XJJΎO2@ 0`֬Y< 伽={>аxFrhd+++$k==GQ oLMMCBB.UXKKK}}}9 nllTRRq9aw?~|dd$Ј#8Π래Lq(Jxˋ*<%%%oΎSWWg+))!CêUo|dȑz3\ndңG3gS{kiiIIVUh 1@OWVV9޽ Dss3eĈ999P0,##cF;zh; C7/^xUQQlyyyaK.  sI %%닏ܹvڥzfaCvinn~)J"٢E_>|p$w+++??*ӧDz=˫A @wgbb'䐈ȪU_w666H\EE%??aV^^l677o57nsM72 N/^ObHMMM]]sɇuW^Ǒqx"i9oxx8Rlll*+2M03̐KKKL9ָgϞJHHO @A @SZZB\hܚ .7?a3fLNN)J899} 8q;y咒D|d/[^^At^F 9sڹSCf>n\\\~yΖ-[HO\\FԴm62s@#0L77*2h3//X:2 '''2+PH^^ŋȋȒָಲ2nタ}秦tmPнjjj͝;޽{si,XpY$~ڵAQٶm[vv6>"--} vZ^sN/{Сfbʊ;F%K]ѢE~^-..&'q+WS~:q}TTTys]zZp!/`09+ MMMB^@ə~N]]ׯ_ɇMTT@ft:=N2##X quue0dE2[[7n9 ,cΝ#X,:::666):t EEE&L8y$񐪪[:K2֚]rkjjfeeAɄYnocc+777oذ ܹIiiiĸ!iܹs޽{+}%p.\8~x|$%%ywcnݺ ._8Fh^pO>H<&&ήH6~bccc$`ffYZ|hyyy`6w\|㶧bhh FHKK#3vzѬYٳgͰShnn޶m֭[b5̙3;%]vsTm޼yŊݼ kݻw-~:񐼼|tt9Yu &&&7oDꙍx^LLڵk?ˁtƌ˧|~#x}~xLNAA144Du7UUU}G.]D\ BBBZ9FQ/eʔ)EEEHAA)SǏGL;vݔ{/Fff&s:s-^gϞ֔dyƍSSSQQQٶmp:;:uꔺ:MUU̙3L(=z􈸠~/`Yl 񦪍 _7RRRO0+7b2QQQGlGr#Fؽ{7z-əLj#Ց;wM;J"͛7߫pB//n2&PVVNNN.((x³glllf̘Ar0@`./22xNoܸq˖-""P˗/FFF>Dg>u2;ɓ'ȃԨʧS@HD***ghh\zd2.\vVA.]}|ٳCӧOOJJ߿?YV0T??W^q}244$O> +V ݵi&|ð 6X0,99c`̘1|GGn^`@r˗/Ʉh۶mHϏR4H{F\r Q__׻wӧO"jjj޾}74ںq---q߿'?C=dFDDL:xݻ'Y^OOHԩSd%vAߏGj*ޯpqdt/EGG#wB]]]Bm0 dl+'0 b1r蘘#$@K,$$$RRR+/^HIVhΝ#Pf"/qqq///_OgHHRDDuЉ@ @QYYiaazꆆP޽bcc>]+޾}k``@hgg &&FIVnnnHpڵfffΝŶ=zXhi0 Il >6k 6 QPP2`Æ )[p!>R__x⦦&3i'QQ#G]ZZZ500 VP/_~( ӣѣGױcǐfffFFF_!!!BuuuaTTTdff#666$vC>D qFr2!RQQAqu(ccc `0OSSS#CBBV\I~%cUTT9r/Ӈx  {ӧկ_N<4s̒YfURRR2m4 a>>>C;99!3ry [lGDEEr!+Vuf|!`[lJZ2D۶mC6766ɞ={lO>E?t"{FsppV MLLԐxCCҥK=<<(y^Zָ1c:t Pj:z//WUU!$$$/^8p@JrD޽kddTYY}}}wEIJŒ`?ZHHbH=͍8IEEEH"^z!F[d2cbb~MWW+tm m&˗/_HKh۷oX䐖AƄ呟@L>=;;_~H<11[ӵ)))ݼysC244$𐓓xoe>|PSS8 t2O<Ҋ$RQQ),,6t3g~ v$X~}AA>ҳgd)))\aaaiNNN|ݧ~>Bؐ/o(a2Ѥ%C޶mϟ?DGGgHKKK]į^jllLyԅIII?~bbbȡ7nhjjRJrrիW'LOϜ9$pDC,66ӓGGǨ(NjׯϞ=x#)((f,33sΜ9oMqqqzK"͠nݺyfޯP]]=x`;}:n8(((IKK~pooob\GG nG͛w)ޯ噛<888QO{uq;Jөm_YY9rH|T^^˗v$w6#>==}Μ9'#(UUUfff* 1qDJI55Xr2VQF+=}[/w^| y8 .iiazz=dH! It6*@'PTT4aMMͻwBG/^455%"##QKKŋرc#"",k֬0 a_׉J"F@VL^^?G*++_w&L nZti#++{e$'}}/Req8 =!?11LWLCY~KJ"=32mڴׯ_#h4ڪUnܸZt .XYY!wEEE=rJr'z!Gƍq\d+nܸb\NNDǎ8xYfu.3%//off %Ñ,>_ChB 6L<񣻻;%tZZ=㇥eBB%YQFL 737;¦M('=1sslrLU &^߿744#ׯ_zzzDD8%u:ϟ7o^}}=>(**BUVB.//oǎHp޽ǏS ݻw"w~%$))uKJJWWW~`@$??L8?񑚚PJ111ȤӧO'u5獍T$E) c?Ѱy}) O^/O|p( a6a„k׮͘1g&?N*99y mS+**zq~כw_|onnmll'66EϚ5ؘ←ѣGh4''' f6l?~@ -[zuϟ?Sѣe˖ShOa2Vjii*7j(*bؐ!a2 91 0 '; XP t뽼t˗ DInQbbE)))-*+!|pԨQaX]]VDDdΝ^'!! S]]ݱcxƌJJJ!_m"""έ@\N={"-jkkSPVZe``TWW2LRUVw, ,@u}{c؜9.թ0UUlrN@5¥T[[;22x_cذayyy"N9̛HII*+|e|DBB"))w|w#...&L:}6~7$%%UWW ɬu IDATG`@,Y6S'O$3/_>"Ja),&2o޼>} 3g̞=ؤIFu@1}}lѩN?˗/G,Xк._УGgΜ9͛7CCC'N(g]))6}~۷޽{; %wܹfСFFF.]xǏ$C$))qFOOOvqǎ$!C_He?4445j%) oܸajj{|<77WWW733sСT&pp^V$Pw|kjz[SCu P lٲD!));wzyyUrJd;tZZڌ3JUUU"VX!';>ӆ\VKKK~gϞݸqqttkp7Allɒ%jL&3--ҒK, }%;fJquu8}4;R[[윗fw>x 8ZTg!T R::N"K|*@/Իuĉ9TUUoݺ~޽{ŊHgϞPhtvvFz} 6,66&ж Ϟ=;r>ҿ5k{ԑ#G7 t@` %2wlbbb[lGmFU>8p`ȍ7CU>?|```p5JJL&3""BWWʒFZΝ;;%u^!!!֭C222YYYӧO"N#,,ܹsN?qℬ`hݺuVm۶a@jjjUU1>n8 ~2x|DKK,, @/v޽{d&͢Eډߧ*~}4`n5nnn6466~|DEE񑖖$B2KKK|ɩKBBĉ˗/G $+ jαAIIYuv6mںu+߿nn%)u14k L&񚡡t:S^|GKIIu) --mkko>hnG7mDf2̟? ~̙7oRa{UTTGݻDU>'**o߾pDܼrJ///wYWjX_CJ*ABgϞ˗yzgst.P@d1at:?++ky1իWo߾0իƍ$΢0dȐXtĉ۷o#ӧO3gN.uaw,XWrMu>e@PJJ pCш3)IO>GEܹʄyyyĈ!H'''&BTgt  UYYɓ[ZZC999y1UVEDD fgg@_ p>Я_?>Q}}ƍ6\`r+A@#pttv411dZACyݻwoȳg֯_OU>477HҥK:::޽$+=zŋTgt ÿD)))~}R[z1$>|𜜜QFQU'{{{Ι3Gc0 ڵk>"))Il0#nӀ.]m*GW\ye{ a @s{QrOOOoƌȍ7xo#zD8kS,**B =|P[[ݻdѤ|BP!ݾ}{ĉCcǎy󦗗YuNNNĆ0[~~ȑ#)ɪiiiqttz ?#'2ՓG+ŋu) ..ʊl>2}t^zEn.ٹs'aÆ 2e>d2܄1`ʔ)HǏdիWS!1̈/^:::øڶillNHH@G2d%Yu.[nEh ޯ۷g#Ć>A6YxL4 sNZZU?)//._ljjaeeu!J]>}؏cbb222(L PQ~jffzFP>}N<ۣGJrϜ9ǎ@IVKNNݻ;߁wL&;7..=W膐^@@P՟\]]IN۷oP6m"N'xBB$>s)R8={<+8-,,WWWSC\zu.\ ־w… Ϫk󧹹s Zm}yѢERz UVu!ww]e&&&|]*&&!CfΜٶA]\\8qɴBMMyɓ'ʇEUUu˖-HϔӡDEEc0 $N800p̙#G۷ܹs*++9~V||䗁x{{{ee>}HII)**~gۗð/^OC~8p0͛7... 2d1qL^}=zN۷t* `{TZ5>MKK ]066#rHTTڵk#F$."++ khh\rE^^:E!O%%؎d2׮]t  k91ꊌm͛7߿,Y+tO㸻bV__wf۶mt:ojj*___===|ׯ:,u^^^)))RRRHԩScN>]KK+ ʕ+_f0UUU^JKK[fbhhhש8qݻݻ>\zkԨQcg+-rGG/^|YYY>>>#Gܶm {VJKKbbb>}PQQs z~w VNNNNfmqpp JTT4..x޽EEE˾=Gqqqȷt蒠@޾}HfȐ!m ~affvU$^Zyfk(!!Զ>>7odxETTȑ#Ygfdd'[н{={&%%Ço߾={MUU諏g=n8[ŋOhӓ;w￳Yg͚ա/:///kkk5II3gΰmPUU5k,ӧ_pV"󨼼|&e˖u3ݻŋݔ)S|hq~g&%%!U`0}P,KKKSkjj}F~> 6 8|0Uyzz#555v#Gqㆾ>(J jkki`OсYSSSutttСC222ػ^jjjZ/|ʊuNttŋ?Gރ ۷%۔_}}pAdz/s޼yܮֶ7ѣGٻcoS㲲2???v~. jZZZ>lG.,,6Ǘ/_O~-$njjz#akkSVVvUUU;vGŷn <~w0HNN퉺dTNsIu1iƍ]Y(|Jю9zjTTU)o߾.]Zhohhptt "N 99ܼ9߿vɓ'cvakk;||U$!!q^=Y"'ĉ^쫏`jii֎]?4sRPPؿ?qcckKKKCC{ց8c2="utt}:u%?1cƃ9sN>MCJJJ&''w\ ށ_{ȍ{ŋ#mIZWZZZXX؞+tgsMgiŠA&_~ݷoU)((;w[|!!!ęLf``%K(,nݺd2Lfom~Eqߥ!߯_?ϟ?+d[,\.>}jGa!O|ށslt|X󦲱g=.** [rݻwYkk_K 6Xz5=h޽O8m]ѧO %kk3gHJJRUgq5ׯ_#weee;Ǐ)))Hc=:p)**Κ5ϟϧH1$$|؈~LUJ$hbbbȡٳg_jhhݧNʎŸ|l/;))ԩS|Çc Z?YWWWL< ՆWAr?,;09`С|ڷo{9zoENNzzz:ФI޽kggG~V]̻w|ÇvdSU4OOϯ_ݻ~---ɯ^llDn111C'Od=vttl_h;T222ǎc]`4-&& ? cFFF! `y捁2N0{{8:NIVQSS-ғGUUCw޺uieȑ<^w@ZZr/i>1g| dZ"„ۉC;w(ɇLFFFׯ_WTTD=__kjj;w.qŋàm>)ڵf ii3g0%K466R0޾};뱘X|||YYف<==  >(nb޽ `=ld|[0o' r^}pYYY}gΜ0L\\_b---?‹/LB충\TT޽{?~D⾾yc޼y߿:z\kkk\3##C555P_jiiA=Z[[=u7L'PcĈÇ;n'_tuuWZt{ 'mhh( (qyvWu-Zۙ/_d?HNDNNO>ѣGEEEُvvE#g#kjj:qq7#MMM۶m*Dpp*>+dB啜LsƍS>}kllʙ sJ[Hcɓ'"8q& IDATmLV T7nhH{MLLO:UQQ0эݻz,++}qv߶0M 꼼,X@q&%%"##CIn]ύ7 $uV(ADD{ F۷o3>|ree\۷o8NR4`qqq !P ))d~'$7%$$bcc ?~AAɓ'w)uUUUNסgi?edee><ϟ?#Eګ/**MQQQ J}};ᨨ>|iiiqrrjgK%\ON<922xhر7o"?*??ZC6oLUVWQQѺu될y:yˑ222lϱk9s۷s#sׯ_;n}gi~~~Hލ7' F@NNN^%46}$8p.1.0 [p񑔔{Qb> <k׮777755QG4rqv7k׮M2ܹs o߾=g͚Wgu9/kY[ZZ̙۷r޾0:~}Κ5zzzG}}}}}YYYhhk!WUUd=f:Е+W˘G3d#Gdddt\& T|ɉҧwމv233MMM4m޽@8::LHH%%%ȜÇG8@w}tt4áC![a 8N<{v,zۖC>|ӧ[ZZDEE٥8!ioE_q˗?p႙СCY_X!:~iӦ!Wf=~뗜B 2fvU@પL&cǎOӧ~۷o:(*PݹsGCCɢy]FZ ͫEEE=m޼NONNvZv-~'&%%4wdvvv_Zȗ˗WTTXcӧO˖-|@x@ d2#""N F[jՍ7(ɭJII";BK{v>իW--  cM#,%dPQ a֭[PMv>}:>RYYNQ:T&ި}ԩS)ɊdGii N7nʕ+\RXX8uT ̙:={6|\\\^zu1[[[ee>}GMM9--ÇD<CīWuhEE7ot100G=AP޼y3n8u,***,--ܹt={V\ٞ{"\ðffr7$+$X[tiOQ1S8?&֩_ttxUX^>(X )J@α0}(?<}ƚ,6W,%PҢr-Iq/]ѭm$ke) -J|}3k9̣B<K. ;w S__h"0jԨH.# ,5 tOF`p9J(++gf2޿|~i޽Hݝw^ ><(( :;;z|fiiě7mtTuu5@5 F@@ٳ8AAA//dEEEJr"""8 w7nDp'11QJJǏH:;WUU]r˖-ЭF@rrr]JyTQRR"y 1sU![f R㇃2פӧO||lnjjZ]]MIb ƛ2@oTQQabb҂\}\|АǏɇ7;;;.w}zxxpm5}SsP-[OjjjH{'OS|XXtww)%K޺u )`V\\AIVG}޽{&&&>crrr֭:5轠Hss1s0:um1l pqqARRRn)|۷o .'1AsM<<s aӞ={u<\rҥHCC}SSU)QNGG'??ʔ)H /YYY#G$%%M z3@oQZZCE0lذtoooEunnnHPZZƍڔ0 GGGde~Ξ=˝F7?"F7ȏ8qeNXX$&&~i]`0iӦ; "wmvuuuHy8M`MMMJJ a/Rjll*2ii]w\R^^^KN={b޼y#G;w͛7wj;;;/\ׯ%QQxJr ƶmȋViii,76zzz"A///$p5dʊ+8rׯua6edmtfH# pYV~2l>|1[j]innݙS;F>}u]uuud:rʗ/_644TTT\zȈ@ z/^hii/;Ϫ7`0[l믿o߾=i$J>~b ݻ@KKΝ;``` ZiqjǑ ກIII OM^^^bbbĈ/2ȄrAAAF"F 95ᜯZ*55uРAHǎ$+XQQQ="_˛'Nx 1bfffhhȑWUU]|Z|9immEj 'Nj~9pE'&'''bÇG*sIhpp;w(ʈL>=//ܾa͚5NNNy2=2ð}DEEӇzGGÇ#aÆ"-AGmݺ5++Nuuu>>>Ĉ?rGYٿKKKիWw5^Pn,r&k.䟊?Dӧo۶imm]reMM U)4GGGp g>@O55SN/=xCA\ɓH|ᩩ#F"ԩSB!!!\! Yz5vi)KHqaaaN+GnΎaXnn.;qFb2$$||۩ʇ?GB.eff)q4Au8&<<|}4mӦM'MMM˖-GcƌIIIQTT$ȌJ;;ͻçOFI\(..&ϟ,'˗RYY9x`K>}#IfϟƟh&5L'OFq1ro߾)++HII׏¬ 455˗/;edd,^_TTȑ#H)))nnnO>!c{gddndd'gc0!!! )a4mÇ"ϟfff/_FSNMNNW׉SN)++s3۷777#}>SNUQQa>ĈsPݻIHHHܹmk1tzLL … TăDEE###=JY B|ӧO۲eKSSrI^^ڵk!!!j!:<99ߺuKVVz .HoܹL#55ڵkɓ9m 6 Ӏ8go۷/UrӧOgr !Oٰav' +++*1 o<*֮]$##( jn߾f={GUR]]mddtm$kы/ 1`d/mwkmmuuuE'{WWW`&,,l2ddС]`xF[=cbbL"|}}ʧ6mB۷UV!ߐqnnĉxmmuNd$bPmddDBӽn޼9p@Jr=}fll|]$w5IIIJIpšbp̘1QQQ4DEE!] ̙A&3uTLL N Ӏ9V{+.'QV1b1rqd@d[=JUJo߾,V\aQ0.^XUUEdaaqqrSZq>}244| 7o^||(%Y0{IHH Fh4ډ'ƏL8PZZJ\rʔ)|W^ 011a>O<%Fa"9aiiR@@O]bE@@ӧ]]];4;퓒jkk9 gh;w7n-r Zk̅ )ʮ'nҜ#ڹ ic4=2tаcǎ}[TTٙz?>{ ʼnPUsy浴*#GWsĊ w&ǷoޡȪǍNGG';;y搐 ~V N0)u筭KKK#*++'NXQQA رx\qqr6,,L\\YfCCC1cܽ{ QVVG.X[['$$@#޼y|r`ddryyy!9]]]9[0,㶶ߤeee'JLLdyrrrr?$7zy/EGGzYkhh<||6//OUUYBo߾5kebbb G֚>|xll,N;v߾};g%778w1HBBBee%1Ӏ9 &unllf2E#cvvvHCC!SHZZ:))ߟ`ԩ$^ jꜝKQQQo޼5kyުUN:E|XjӧO11x999'cǎ&bחcbbXƑ_BKJJ.^iVsZ6mjҧO-y1r4i_hhСCGٳ|xs<[mjjj/^>0xǏ,Y )S9sfϪw***={wڵk9" u tuuE'O~2iii3g$FƎ{ZZZG$. ~zȑxdݺuGX0 ǟR]FMM-//tTFFRȠ*tuu)̊[[[߽{|IOOٳ~Vm`xQTT6mVV\X~}XX8%55 n϶ IDAT5V9~#%%\0L__CSbF@ݠXnR~~{L'̘1cHff͛7ʧ}g߈VG@ <8==}ΝKYYY \oNJ+\ILL$^@__H4z%K477::: 9s)ߨF@+V`&---QQQȤIջ Aa0L>!!!\ˤߏ(ٵk3f 1ի]vQwfΜŋ?{B**1at:]BBcQ{wjc1b3gϝKIJdްaTgrssA44667䨩qH!**Çv68#͉vZ)++Cgee [nnF[WtzIIIPb/_&F-,,ʧ}F4ի&&&f/-Zς "##za"""ٹ?Q!!L\ðf HMfӧO[`M|cƍH@HH0 &0 xð/ _HӀEEE;tPnڴiH#,\ss#G:ʕ+ckNMMmǎ~~~x`^ɓ'222&ƌs޽իW={tE I&Qz6^%6?~Yv-yeMSFV_ 0A:tYfutt(ׯĈowGUTT\rYpa~` ?sѣzfҤI/&F={v%oooػwlBU>EBB̙3BBBȥbmmhJ@5Xaa@===0 %KQ/bbܶm\v5k(0oo着*bd֭Cՠ.q9.##3#N}D 0 ..C+ꊬ{yyuӄF4JOO1zj! rt:PBYYYPP<{\˧Ӽ~ TK...Heeڵkʇ]zˋ}H[[;$$o@t^ؘ1T'ѣ0UV=|:{޽{ѣi=4++6lX! Āsw_,6 iUZZzQ%'N _.] ܼ@WW|'O~VI~ ǺuXnbJ;{ 17nߑ  qydcE7][CJ-[֡ `pBbj8|ppp0RAmذ!00|СC4#._|U/FGG8Y>.\@að -] ?~X0lʕPVp)'Or%.ݲe 17?#;v~Ą|)99YUU֭[ jн~acccoot0LNNʕ+!!!rz˗?*+ þ}o>bDXX׷ޮ< 0kkkDd&0)˗/kBBBZZZLm۶MVV9pOʇ˗/G755Q_zjpp0sPnTXXrۯ^AA:dȑ46 KJJ*++fddtG2ݭƏߡ;444HKKĪ٫W---G%---$$ԯ_cǮX"""Y1Tmmmee>}khh[… wqwFTi4թJi޽_|!FGMo^VVF(?vXx;_~Ml[ϳ\]]?~TæÇ4*~Gќ322K--->>>߿$7#@w?MMM߿ujjj``kVKaaӧOիW;#Gtuup¿[]]עصk***zzz644n #,,lAAA{ϟ??{QKK!CȨ@@^ rss[t)%^~}AbDFFͭޑ#~J4`.sLXXXTT/ B2]yf,//*vʞ}yf##0֣G 1hll}vi<==Moؘ@[XXTJJjѢE]M q&LkRRR?~̅dHLL 9P__~aӜ9szdss}}}=U).]:pypNee ; A 8ŋ>QEW;wWֲðO>8qL?~Yeʕ'a۷ϟ/|pZbpgΜ*+߉\RUUE[XX\RRFXB\\v!>}P `iݺu,443''' LDDDII U)88xȑ===ʧgh[nFl1 c0AAAjjj|Qt)#%%h[CCCEEEZZΝ;%%%ƍc>x.]<=uuuxN/ZԩSMMMUUUۻwa𗕗[YYܦwճgO322>~XWW;tPew믿dee,Z7!!AZZp...鄀{G4:v648V^N:ÇN넅wM455ɓH7((\NPSS_lҳg455CBB8g4448;;"[1#,,,//sLѨ( 4 |ͣx# ++_⒓?5kVX1vXIII:.##{m۶/ $ߓ#ܼKWWwBBBrrrӧOx|y–-[ܹCƲӲ%$$ C555NMM ZؼIsssdd$12ySr ?+0Sihh8|0:1c#хT&gggbuʕŎ7IJJFFF~oٲĄ/J\>}VOOeaɓ'YYY%R>;#}v æLB>bO?]r[FEDDedkss35RAAt;qәOxFdd$yϏlC.kjjrwwG4KΊ#Ǘ-[~uի܈kr 9+ 9>L AAANKKUo߾}'N$F^~JU>=ݽ{XVo޼9eʔk׮q?+8@W%&&w3h]vpOijj2OO/^ŋO!0 ojj_&@w:99! "S.V\\L,^XWW[ߔ#ibbb˗/RZ=uuu8ȵ=5o^tRbܹsT&(k>2iҤ;w WTT:9910A :{ѢE%))x???:NInڊ\###eee!!~1̙Ch4K>b߾}A:q}aСC,_e; 6UTT$&&2h#GfI@@o]v _-GZo޼yqqqo޼Þ={tϟy7FHg,S-,,jlBB/:p_EE1oN>rƆȉ'5@` **ցׯ__p+u&1rwRvޭA|aƍT#/jiiЛA :#55U]]ekfgg+))q?xzzzפLTWWG޺udggO۪mN:dȐ=~?,F@Oظ#-Z5k0|E__O_0y"}㕕ʊ&FIll,eؼ8q1{`W@@@fAHðL:NGFFOF.߿K"##Ʌ777ccc0^j1 # Ǐ% ӧO=zTXX:$))Q]]Ʀ0:윙YYYTWWWZZ0o<^^^x7aÆM4e ##:Hv&ʂ Դ|N; /kϟ?qrrw=͛5G޷o>r`YvwwGZ$޽Mׯ_1byePPu"##߼y7&7{{ 6PYAA6mmkӫ 7Adt;;.: 555d^K;탂?#ػw/qwwoSγf"F}j*H7^^^EvvvA ؕ;mڴׯ/M0YqܬY"""q|Cy;Keeec߿|^ \r`ذa***x ѣG={amm0 c~0LDDDJJꗯeelذѣG:88())9r֭,"MuttéJp߾}""",kt:{LSSSH}s4G[3… cbbBx%%%7o;vz0!!!ooׯ4|5::Z]]g#n5`Kxx.y;hppptttXq999Q.]j&Ħ+d>y&C|RPPa؀;w w;?4}tEEEcGN>|W ځ覝z}MFaثWΝ˲Q>~`dway/˗SRR .ygqyhL2 Uɀո5883⌽{"b/$uVl,##ϟ MMM777d<z</X[[;990 6,==ٙ8EAAaaaaeeentv444f@-Z|L ի< TTTi...|PWWw{NNNEEEBB¶m۴kׯ_WUUpBe!3IHH\t ٍKwww$~.oВ%KؿljO8w.:9xaYXe:ydeee7gjjjȓ'OʧC.\H:88sJtӧ###怀]]/^P(5hOAAˍiӸ---߿&n~:ujPPS~ؼm^^^HHCDDq-ɩx# yyyeeeSb;d`iii===v'|y4`&999Z.ꕓ {nuuuZZ*:kk묬 իݻG :ujTeElƷ000[J-$$daa>|H8::5t Ç#_ @#G?)سgrÃ4eʔ$vp̙cN6m˖-)))o޼aH###QQQ ZZZ}ٳgc$odjj꧎0t@\ IDATTT·pÇݻ755]~~~111Hߟ\Ǐ={#t:Ϗ o/!Ӏi4ʕ+9d8SKKzM0aٲeHqq10o߿ѣGݻRzz}Y}}ۜ9s|葠,ׯYa;wvɅ."j?~}v;oiiqtt\lEpyyy33vn"..\^~k Ô0 344d^sݡaL4 <@<ӧMm #1nݺs᭻]4sLbQ p/x9\;7>}tԩnΈcك"*M+V F%>EӽYHII8qbxx87A PŚǎ#_5kV^^[nupp`>nhhX`A;a Q>|WTT\|y۶mędx; ?̞=Y_doyqyy9a&&&,uF8aX'/{yyZjܸqrrrx?lJDDv@vvvӧ:»wY}[3 DEE/_:o߈L _~w$Çv^/Q퉑o"#Cx١C B<|;zӧ?zh-,555NNNA ٳ?F$nrA|/?/^̲%·o_хN:U\\~Yf 4e͙||͛70/Gg*thMWW _\ @JJ833i޾tQ;„ ㊊ ?>~8|;ʰaEDD(I-HV|}?rܹsN4FseH׸vN]r ooo111bdϞ=cIJJ2}߿OUJxHHȵkאfYLW^UUUp@ f77KW^lߓ'** S\._\__|c,?ѫWm SNe>~:樀/2v˼/_0lcƌa>xy斖v>yǎSkkk$۷e)YDҥKȼG=~8::QTTtvvλwPqqqFF1bcc#..@9C,Ncdff냂9#QPPXv-1Ç0(CCu#2?}>}diiimmW'ns޽{7s̀iӦs?+ܺu+k+sin]Pnܸϟ?c6al|$@ZZsrr0 hgs?f'O?}vR~_6`0[l6 m۶>`0m!+%*jժ{NOoWWWZ~"_$:~82CёɁs|S˗/>--޽)D߿sx<%00ŋ]vQOo#--}ԩsαNyUUgD@ tuuurkuy{{1b1Xz52xlaSS@JJʍ7Lzzz̙555vuuu|Za3f qqq=z͚5ӈcccbi%K:t]n:QQQ{ikkw{{{aE߾}͛סϢ|}}ccc`@@@'3ڵk7o$FTTT9Y޽#uu)Sp&?Apxzz"tv>$88;3oܸ *?y$^Yg ŏ.XxgXKKK ߝ5@`0BBB ?~\<{lHHs1g;z(p߾}(8pEwdzqԩ0Vb# 飥|"h# &b;2W'M~# ܟ9rHirr1cN>իƏ?^~}ƍ#G$n3fpȐ!mO<Қ1c߽{ǏҤ۷6(c.oFNHHA...L---;wD\kF@IIIxFL!8w ,1}/;v#UUUTQHV;;;BMtҡC' Fxx8,,%轾nmme˖&䒊J~~~Gٳg;88Os ~`<==][[ҥK o߾|E}pm-F޿a>9йF׹Y WB/_|ȑ""" ;wCjjj 4… ,[޽ق5x`QQѾ}6ĕ}}}77N|C;;;z;N8b1ݘ0}ydҥK95a4Z iii\uuu`` UtD|T;h 6<}TOO|P[[ͭ^xw!&%𙮍k֬{ۗ`!C>| >>>̗|#ԩS ˵'N祧̪tugԨQ?a„cDz* oooߡ4͛D;Q]Ç  ; ""µ4TWWWZiii عûw]FX[[L _022B"Ν6m1࣭[lA~ÛcccxL'NHHH*^KIIjjj7QWW'PGGGsgj(ׯrvv#G+W jõ===yyyuuuWΞ=!))?! v@M8yv1޽{񇬬l|A$aa'O^tFLC Ҳ۷K'#Wt XN:ɓ4chDzb#_ܚڈnόC$$$g*N0aiݺu|T1wܙr̳gϦO5@fccCnU?x;w8;;SXlq̬;q-uӦM/^puuUSSrrr'O޸qcrrݻwOa)uuu,w󉈈g"t:APWj7wœw6n8c >} oرǏ///asyAAAnnѣ%%%tovʕGGvzYpXj2X@@ &&fҤI\K}>} "F$$$@KKKbb"9.--=gv`0N)))Yt)Dt* #vpaaaHɖǹ͘1Ur'N2N߁SPyݻKf:}UKJ"תoyQQ)_lm ټ7 BPk"xCg}RSSYmIIIAzaر3+++:t(1,y󧉉Izz:&&""b\Jˎ9abd͚5T %%%***H-::Ɔ@VVʕ+_|ID]\\y ŝ;ws[n`j;wia O8A(((p9[Ӏ4BJt:ֶi.s\?/jdP4eWVoYEEET -7n,--$aΣGv@ĉ322( 5@`0 e%%%ɿeff#uuu¨J\\\___GjmmeHNNo߾]p1774hg `@"gϞ]x12SK>K+$$Iݻ|:gÆ s%FWZg)$&&rҿ;sL''?r?7t=\MMyOÇ---)I ^VRRh"dxjjիWI&s3ߓVVVȚc[I0 rsPcǎEzf"ˑ-~~~|lcc3n8b$66T 4-""BFFLNN>rU)&mm<>ydbs-&zSgkkvWtz/_̝;ӧOĠԕ+WOUVkmmuuuE'űehbbմ@א@/ >|jhhC$?y͛7' "}Z[[ɝxbHHtuu-..$dy իWfrrr~n`=֩Sttt^zEDD)I ^dmm ?~TeKĈ17s`0HΘ1;#Щr9:.**JU2HhhE#MRRRȉrz^fee5eb$111''|:vϟ?hl:p@ii)1l.6=s 1b``0bd9 /_H_gϦh`@@2SSSҨʧs==zDI>LKKHII$7j%55U]]HFܹ$1xߙ3gmYYYݻ|gdyowc0,G oll?17{lbO>FBvAI&]1|bqȘz@!恀,M_zedddggWUU=044Db&++{Ud' `0iӦEFF7t:d.q},Ӓ%KDZXXp&95H/ 8wtuuȡCkjjJ &$$l۶a0ՅfƌH#33BBB F<|Ϟ=TX,((B.1'xz`SUU[kk+riԩ&&&$_x… A%%˗/좢bD^^~Ϥ ޽KYݻYSS؈܉}UwgAG:ڵ >IIhAUJ%!!;w檪~aѢE߿~n =|pڴi׮]#_TRR~V/_̝;tҀʊM;vhjj"F#))LA%%%uuuv><<<@# , ̐ogϞuuu%FZZZ/.$)ӦM333#F/^HU>6cƌM6#HM{`4y䨨('-**JGGFDDDEE!~DgN %$$L8ؔ~%bdرV~&999B-YYyd1&&֞0a]zdP]]]KK91~E###7???d$G.JJJvIU>"""˛6m/_MLL޾}a7oތa:th\\_Bz߿yCu}DzlbFEDD ypqqAt:i1>L!zӧ_|9z ,YBʕ+...+Wă^]3i$++sgϞ9sff QQQZZZ^G133;w.L<9;;СCwﮭE޸qc񞞞...dZ4 ZYY/FGGp?p4?]RY喭2avڿ?rLJ:&&&Ɔ9sfjj*%Ɍ3 ػ@qg7J hQR6)T}AhAۆ$rU$EZr[RTDqbg|?zۘ33ysfz>o߾mfff7o$w F044|@c>RRRСC>}ZSS3g?^[[ܾ}O>))) .y^mm-ݻwVV--u۷uu/_bk;PuvvNNNz(88'!!A__: !!'6SNQfϞCG:MS]]uV4d2KK2/_1{\l j#Gb^~M̙3kׯ_((ʧ%n݊,((Xf ]իWbbbXXס<ãJmD 6mڏ?C:uzV@u,hbbޘ;x V$õ0A666ɓXn($l~0B# fWee˗,Yҹsg4~N|||dddȶmD񖫤dXX)"""::@c0 zښzС=|n@w"Ãӧ'N%1DϟgΜY]]{uE솑pㇿ?*E1mm6xmmmӧʯ_@O`0|p,rI LMMtϟ?߮]UV"U砠 i~m۶ ._|@㩪FGGGEERfff[<cѐ:t7nP999hjj <)DҖ-[JKKшkװIB-Mĺu444hIǏ/^ƹN{JHH(((@#K.OfOl6.N"BBB '%%^ZQQ͛۵kFoߎׯ3f )..vrr+$666YYYNNNԵuuuѹx"-mD@PPȑ#?~eeeCBB tӧ]4Inn'HΝ7nHW>111\-rrrvvv|H OEEE]]u"+Vŋؘ܇Z%L IDATZ;O>RSS[|9ѣGʧ%Lfhh(6JWJIܹƗ/_,--@UVV.^[B'OiI `0BCCǍGw"x{{csuk! MM!C4xׯ_]FNu #=t =ty 6l ++ GݻMDBϞ=W^CK>Fŋ7JHHP^reF^r 6Mwﭬ222,--Õ]ynÇtgAvv/_ n ~m۶e:jG9ҧOL)))Z)**RWWܰaFՎ;=z4?S-ӻwo4S SRR͛7MMM X~8SWWwvvjO:U0 󅷷7VL֭tBSNMHH@#&&&/ Dϗ,Y!C  ` >ѝ;wxx=SBŅ!_l@6oތΝI-+LLL'NpqqSRRx_f}ysh͛7:::tZ"((̜9S#F@>|xժU:::h#F<?jiij_0q8pڵkJ 4OuuΝ;+++G6lذuV999#1'<",?XݻĿ7(yyʊՋ'ri# Haaa_q]~]ziDEEa5~DBBBFF666衔O>Rfzjuuu4rȑ|i3gΝ;TUU-\@iii%&&FEEuܙz477wҤIgs ȑh}N>k۵k׫WV#Gs ;wnvZU||/6nܘfbbB=ZSS?hР7o >7@t@&xMIIﷶ%lݺcǎtÁUPVV;vlb݀L=:1s :::QرcGYkfgHF]]/]ӧApmDݻw:uD=;333KKKmm fӝcAwգAJK K˥C> lҥKR3AӒRKկ_5W^OVZD111w={6/ëVl޽G͛7C3fDhX!C|777fFF؉"773gp=rJXNc@|70W  Z2-1lXp޼y;Q$=Mj;w`9\2eמ8q̚5rpp8}4 c6b#F@#ÇgӧO={D"mٲe۶mmM`<}K.͜9XZZѕOUUU| .]4((ݹsgٲeXCDZk &>L7n\hh(bÇoLf_՘^ B.]XZZ-3 @ >{KD[tcذaHr{!6k׮I̘1ch$>>Çtr222h0888!!ߍ;6--]JJzŋ+V(嶾AHҝ 44tڵXp.]rNnڴ ݻW3\B N2EVVhޞ <Xj߾ϟ?]_yΜ9?&wsrr҆ Bĉcƌ " X:4p@tNNN&kϝ;ͭ~!W fwyܹ3+?>+(-xD?wksL#[ZW7pu <==o߾-[ŋeO>IIIgΜqssvhѢE!!!ǎ'O뫫KKKo߾gϞSNݾ}WNPh.MMMA>7o;w̙3 '%%ҕUKHIIܹ|P/_edd,,,x_XQQqY42f̘}39 0 o7fll={,9:ydXPtttfff$jz w" BIJJk bo@ 0 yfL&wS($$URR5k2% Gqq1kcc#)?ESϟ?On[ZZbϟ?/rk{ s%T;.Fv5 V1"_'vժUht ~" %%\G󭭭---?}$cATVVΝ;+ٳgG s˄ RRR.\Y^^F6mڤLW>x$&iii·o޿,XYWJ)~ܹ)zBTT! =ZWW'$awOk"8yd`RRRPP])&))f͚ׯ_[[[s=ʕ+zzz555 0A}TT0`_JJׯ_-z͸qjyyyv}OSL~ FppɓiJ^xF455W\IW>F`߅'Ob ZӧO".Vݻ ޽wKiNtggݺuۿ?ܰav@lt5::֭[\픕]~] :֭ۥKӽTUU/===GGׯ srr,X@G6ߓ&MJOO-nnn, ܹ+A?ܺu9s& ȰaDXSB' Ć98k,4~\d0Ѻ: HYY=qƥ޽'l ( mP^^;;nܸ .tؑ%NIIqttT/_ثW/p@~gֵkWXAmV^^?>|mZiiipp0{ p0̐yyynVVV#"""`0 *ezzs߾}tuu>|ؘVTTИ8q޽{\s:t(' ww!Ctԩ/ GQQѮ]t"++ijjzĉRLqpp?~᜼{n͛7 ԡCiii;99JsJlmmܹs9BKJ|+42c '']F7X(//͛hdܹ[ѣȉ'3f8r@AX[[if>}:VjѢE ,--333׭[')e'Oleeg6Ν;mSSÇ7nݺ.\{},+++88xȑּ ,Xٳ߿Weee^^^RR[^oߎUЦpvv2dH@@Ͽ^]]]PPp5kݛzcQZp~X߃mݺuڴi<>VUU͘1#((fs=۷ofzA}Zp-]ϟ\ZXXA{{{Ɵ?.^ݺul۷'OƆh!WWWj} SS˗/A5[B4쬫KW>Th=Ax\bN>F7bZoX,A~*Ϟ=\q)ۀ )**:u W޽{7o:::7n܈Ƅ8***|}}Oˌ(@0` i-QF5 ͥN$"??L^^~ٕ?~TUU}%$$(\]]nݺfӒĹMs7oTTTGGG׏sBmm-6֖,V#pB2NvttWSSSXXx=r@UU iܿ?1bĥKdeeiI 8F-[ЕWW\\p5€3? .)))q?U LIHHlڴ 5ͦQPP +򘡂$\)99}8%&&Ƣ呷3lذKFFFKK˗MSN4iҤ MMMiiiuuuGGǧOvޝsӧOh A}ּ3rtOOOYYYeeekkGikksNx:cǎ۷oW4""30k,Nٳm77cc:HJJv̙3;w???jG&$$ǔ͛7c<==tBW>T999o߾ƧOBl醴?3 Kfc?deeMFⰷy蠑|~'K,Wk?mFX[Uwwϟs׮];iҤHoϞ=Kh#}||^|inn+WAi @VRRh߾}i&RRR.]¾ѭ[6A$$$hiiQ]vgϞ%w7Ν;GNzQ}w{YPR RIyiiiQ:s G8VVVd?ϟ?sEz u o߮/sȑ#tK 铘رcGZR⯌p4ҵk5kЕWqqqԠ1VVV:usr5ac ТG"X9rla'"//ox"wwwrMmIIIc$$$:tzXv$$$#GnܸJ\>}_~ܹ]RrJq(mWee%9C~999r .$[bO~|/_8l6T3gr g޽{MƌCn'f,{{{uuuƍGncs&MZ(55\:BGPN:ŵHtqq1fb ,,z7\CC#))Iɷ)Ν;۵kGW>\q-}].]:T߿q5[[[l@QQڵktew'ASL133+p-djj{J8 XRRrѢE| >XPv-LMM lr@[nE#uuuh\C@>}ܹCV'=|LJݽ{`dšK>5Ņ2KKW^yxxp-KURRvڑ#G>~X-cM._|(@޽.dgΜݻO_gcM2e yswi߿ $wv nݺq6`}%EZ^>ر#3))33.66 iis~uuugg}M8]o% w@l\t!h3g yŔiii*I NIӳgO,zϟ?ӒNfff/^8x zeee L-` i۷G 4Ww֖S:߿xTr{}۷o72+Ҽ555Aq"SN%5d2d7n#٢ׯ_/Ç؍'ii阘}yf֪]pjw!Ǐc?@`0 /^`0 Н;w $nvs͘1uvv6=vڝ9sgϞ}mܸIce˖a[Y_cfIIIY͛7NNN\ fggO:u„ YYYOhmӧOSLkWUUU988-I²(r̨Q8ÇlGFFVWW7i_&M"|֭[]lmm v@64hkҦL]sFeeeUPWW߰a]PPP710n Z@ OʊX9 C=mҤIcƌA#M]l_'N ZJOjhhH~X,WWW"555C} ɓ'n@߿?tP'$''<ˋ"@HhշoN>{Z6fټyx\rС_~q=/rg̘A_lw̭[2ORR3J3^?>g;11رc, N:Mٳgw?~|~l!м9{lϛ7OJJzٳ^?S]]M~󗐐 *## +h#(}իWȀv<"ӧOٳq,8bH@\aui|Lt7%%ǏLLLpNpuu0חbLPRRR]]oeeekk˙o"))yq*t</  {ɹ\ DV,IKK8pѣG+++kjj|5rț7orqppڵk%D]VV9v`?~֖ZrssÂY+]F.*++b6[XΝݪ*alvtt43w܉nڴrǏ'̢+VIߣL}$$$Ջ W\Vt1&ᑑ1{]|1+8vX}Ξ=-B|ŅZUEEdݻ|tuj‚0A|N  cNNNX^NVfggs=sǎG-[M-g{˗999Wn'm*sss콺vѢEtDWuՍw @}?>??={)Sv˔KK?đ#G߿oggףGiii%%%cc]v溺.MCnnnhhܹs%$$ `oo/_b,ұcGr$G^^>888++s̘1rrr=z;vݻ߼ysa. 1c`Aݻwʕ$3Cں?^rLo2@yfܸq;w%%'quu޽;]4իԠr}`т@:1WWW 쑰YYYM^p!y}XXX2mYfVX7>>~UU՜9sߠUVM0 Gjhhp%%%S Pb;h<wijjRrZzxxOK mںHμnݺa6;`4JW>T)77E# v`x333"h]-Vr@Ax{{coߎɥő#Gt...o+WWWҀu`aaadÇy[h׮]G#>|pww+ 8M|}}۵kG=Z^^ﯧw9MϾ}8۫V@ b6 kjjȶmڷoOW> ns ¾D6OSNNkg 6._L Çgϟ&(++/^#4˗9ٖ;{,ytر6l w=<<^zŗm90LS`` וaЮ][fgg;99a9>E#cǎQQGH4 XNNn޼yO vCwl/fbbFxW޸q#6{$:t@+7YD]]ԩSO߿J$%%`dddTT])Q`0lll^~{nJ>uСZg-1@3y޽{KKKXXX$&&nٲz߱Pyl%[nE#L&s޽tHyyyYYYXPNNnܸq\Ͽq={RkMkr@yyy>deekע?~~xԨQ\OxդI&L!7ѣG%%%X|Ϟ=mdǏh deeoNW>ǵ@}X,VBGG@:6HNN˗Nԩ)QX_~57YQRR nYyCCF۫ϟ?sL/&oJLL +% N ޽GPʑzj}ΎhQ]]i&4`0`0JII&q=kd2-Z*ibqa@affE9|A~ZX 5fg.\Д4())`@ڷo1̺:ޗ\ѣ䮤/_TTT|SN-^L<9!!ue봭w_eNM`Xcƌ>1cFll#99yÆ X*Q@@  $` ॼ|ƌԩ:::ݺu%+aP[[;p,4x=Rjl}_|]]]Ӛ5k!xػw۽{ϟ?Ә<}}t4WUUUܻwohĉ >244LKKC5ø]cAcd"""h X,VDDׯ\jg`0wڥ% jĉonA?~ n޼I-˵PPP6s3)((Е Vܟ 8W&&&=z@#,d2fZZZv‚+Vˣ%`2 .fGGG_|cw?~8qݻwhJHHIIܹ|#""Ȉ# ԊZac]^\z% h-((hәtl!6+V^o彽?|qFiii UUUѣǯ_!11cvM,"//O]w4݀Ah LĜ9s]u…F>%%%Hrrr#`0'OСLNNnpЩSݻwgddpm---*g@` }yԨQԊ&MqFiJx>|())m޼|-;;ÇXTFF 9;;4(::Z YYY&&&X|޼y111d%T^xF455WZEW>-qmj+MDHH7 =X8q"9vXWa886lh@x?~\UU<|zYZZzСC;wz«WfϞ=zhj7, 4ssb,tq& &L7o]4VSSúhjjbՁjkk555|BF !,M ={F6(//OCCRPիW䮁߉?hky|o>r_~ulkrd޼y9DW9ctYH)MMMr$::pW\ITWW/ZHDFFJKKHe9 rl6bfYZNxs߿?|}}sb"O?k( ϙ3sJ 8wH;wr,A&M܎+ "g>{,qH޽{o /K "o޼۷/9ѣaÆ* Z!FCJd>>>H[޿OO2NHlڴiHϞ=srru&"6ytE c?_|(}K(TE{0 %깝=EZ8z葖ߓ'O#={ZICcǎ%|1yd"` C766655D'''*J ðKBqyyÇ#%%%tA)ZGY:J͞,;כt?!` @R^^neeĵҌD[jrkΝL&ST_FFFee%DN}9R\\Y)##C:u*66VT))тntLR=GEJYh+U|H|kit rdȐ!G n޼DȇCD+sssC"gΜNNNbοA B6 nk?@ uV$hѢR@{P4tiPJ'?=AQ=%=:''>Ν;"J̱X#={HII  @>x :1urr|]2 ðL;}tFa:::+/fXm ي+,,,ȑ/_x{{*IZZٷ:S("J+DHgx#G| ?~|jjHYYY䈝݄ [mmmzz:P(ahh(Q)))a$d"qAW#--M>OTQQ?~<9vdk֬#G߿LJJ*<<)&v刈eҳI:v}W(tro߶,++CgϾvnIMM͖-[*k.Q#(>A䁍?":(⺺:ޟ*--sN[G%UbvڂvwHpٲeEEE"AS7*x@Q''03x񢭭?E߿U>D( yӧ[02bY#`HSNe00 @v&7o^[77I&#?~pssjNBmGJ<e5N<؈׬Y w{#$;wjjj!RHEE^bڴiׯ_'G"##:-QRRt=x Nf۷JD7oތbe/$$d_~%"w=xeDh_M&,i}@:SPP;2@PaU7nDBZ~U>R__---c^!c#mE@𑆲COI w?k"tٰ5k,_@N8#$ŋ/uu+V*zQuu57n>~8(L킐0Xt:J%GRi988ɑ#0lӦM#G***,X_o@f͚Ι3AT)1JSS?g2.] 8\Y?uV J3oԜ9s1c  ؀uk9ȅ9Ϲ99>L\rGjhh#O<yTWWO:arJJH,o߾z*9b``iN8ɏn]C>dX߾}ʤ$2QSSCk0lѢE?C 4JJJaaanduG*%VjjjTl=O>]QQYUUUq^|9HgߨgϞC'AV/ӓ޽ŋ|ib9Y0훵˗͛7G)$ Zr% @`H"Af葢02bN;#5Ӹ4i"9w9 mllȑ/_tm28w\ׅqbjkkʞ>}ڧOt:e:488իW߾}Ά]\03(,,433wݻݻw "$ΩS233KKKkkkQ#XYYYs޽K~Օd )9 N`Ĺ*Y2ŝɓɑ˗/#Mmr1dtԩS.]C 4۷/9 ___Q:ڷoߖ-[ddKKK2dȚ5kb:f ?@ٳѣGs.s׿wI!%% |N733ۡȇs///!e r3aD"/^hSH9+W𝏦Ν;… w@8"""vwUJ@>)>w"xRPPz޽?~TTT竩67hNh7oN:ǏH2>>^AAs>|CGf'I_;rD{؀ooEV9L]8LMMO:E~hذaFFFLHd8QWWG~MO޽;Y111f;E;wÇׯO fff˗/'b<<<GRhiirlvCCÏ?޼yЀ?f͚3fo<5kV{^;%̪-1 cH( Ο?Z[[ħMviO]l.\ODZ`ȐqfFJ`B@/^,--%?we4KUU8oӥ]]wb[򶒒 144$M#y8GP6QxٳgCyy9O޵kו+W222޸.铟ȑ#{!##miiyQ^ :u<ֶݿ/_ZzVTT1TիW2={N0|^".Gϟ''''//?p@ooٳg޳k`344A[[[VVdjii9::>}M޾}M\z͚5m>**YWWWQQQVVVSSjϞ=eqwwǓٱc466b<DŽ90@̙3H\^^ŋ"ɪR1SSlRXԩXKXr\OOoȑBK deeEf>@5666ƍ6 wRF%Ϟ=+QT6`?tPWUUťsHIIFhhhׯ_^VVVWWWTTt֭ 0 %%'젠^z-^8!!())ǧw۶mCr?q@@@VVϟ?|lٲ} drϞ=C=~W^x2jԨӧ'Ԝ7oޥKjkkkjj޽{wWWW6 "pwnSwss~?jkk񵭫Vӧ/?t0@bZXX$%%!q55;w؈$N:W1?"A|3$ۛ X@8[ZeffEt2r … ߿/|w~ѣvww?p9رc޼y>ZZZjkk]FGG˗\ ~kooe$nʔ)Ǐ'CeeeӦM~k_ 7[jpysss.b/^eիWcǎ}eX~~My<ھ}caaaK'TUUNqϟ3g2RB [nݺM_ixxMBNNnժUlׯ_?311qż[0 6 FkSBvѣGvvv?FÇOLL_{F.>A>|>90f*ZZZzer|ڴiu.ͳɑ'O.ZM899ݻ8dXqqq˖-kgnCYxѣ[l@}2߸q#>>dAAΝ;񶢢˗GM\WW醋iak***nܸ%Ĝ޽{===Ҳo߾ _T\\ѣSNݼyxhȐ!&L XSNɈ}j B"@6|p$3>9s&0==KqdQ(nݺ)))t4GGGrݽ@(͡RvQ555l9/^m[X:n8MޅÇx{ԩfff-uOL=EQQه,,,v{633g2gĖ۹sƠAm2bÇ͞ZZZ_]`` l6=qrr 0 w+DEr331kLm ֬Y.---dyRd%''~7oT q1@wcĝvٳի"@9rg,a߷oBRɛh4 !r©SF^7ܼcQTVInnnD֭[͞3j(^r0Ɍ3vZZZ~ǏxiӦ yӧO---|7ۡ$7s: @555-X`ڵ[*z]vAY 333iiir}^ h4 @b#PRR"/OӮH̙CՅaXuu3:7+yXƍsrrD'%%͛7GFDDjjj:{,vssk[_--hD˗/ O$CT'!|/|hKK?j Ì W␼ޢMG+Q#F N.((;yL` ة2e `M555\Tl=O>]QQRo'a~!]f>}x"98eʔ~My1wH c6͹_=/O}ڧO:ѣGH‚s7&聮8Jo0L^  ͞@ښCJ2 oym V;$anNכر؛a@sGP0I+/Й]b!66ֶO0!--M]]]$Yq2pUWW?CZZxʚ5kOt@887?~< uUČ]`6{ldw0L^^>,,  }:~ȑW^[NTE pe ÈY#BO[]cb/߾}v`Z-| yZD})3l2צM8O033GxE6m,ON֭[?Q$7s: zAAAf|~UEEEd7 BUTTLLLBBBbcca24$2dȐK.#9DV!ެUSSԔl8 rb3vb2T*|II͛7C.x)7rӧOs?غ0ssʩ58 _6ELc5jnmmm˗/7oj&} *\r331Դp˗X,rBl޼9<<<^B988a2]ʻwT*577 2XZfمu*((va``@^$ȑ#W^Ml///E@QTWWW}ƍ`ʤIZzʧ#"fsW$z .\L3Ɠ'OZ:xCEEev~6޽{^0`8::풒]vq9ח?<^Hnt&0@d~pQ$N###oQ$!ϟODIyАԄ݀q!䅅wNNNDo0`DDD .\p ^t-[ :)))믿D8xoϞ=lbZCԞjjj>}zVV9yyyZUVpNqq III_}||hwwfl9}4'`ѢEȋm~@Ƅ5kc?[lA[w܉DG4` h|"11//^tssIV_~zVUkV}}}TT՞={ݦԔDlٲz N1bDcc#9SN֖g2ڶKK=GEE6 <}tƪ gϞ&L8p2ZP8by{{%&&~/_vtttvvwhhGA6 N;\SS'O ={؈$CRe O߿[ttׯQ[[[\\jժ>}l۶ gDRO:EL;tPzz:g˗/L&ԩS4| իŋjjj|||zyuN555766s}}RSS-[ַo_Ѡ+{!F#v ^z!e۳ )T\\9~~+V@L.3:ٳgg̝;nnnH077W)1x???a2ݺuxfF&B]lvNNQwf+RTEEEww/;:ft@|||8xzz=zT{MIx3~i^KRSSkiiqO ?>U''' 2߿g};\~]GG鼺ՕS5҇ 9t:ӧ 0,//\YY9''J䩦vUsܫWllloBDDyZTTy_XFYYٰaÊü<.ڷokyISS6dGq/qݾ}y6EDD è)))7cϞ=%@ qqVTTt&GΗsƧ[hϘ1#..0++ׯ* B~ N&%q%깝= ,_P(7o @aX?~͍?~7U2ž}{ #11s0&M7߹s'r#Gv}}'Ū={69aG,qFAR80 ߿˗ w؁L'())={sJ*q! Úݴ?nB"y@:# $woӦMC6}r@#JJJ`QDXp-9RQQ :+Wm@` @,h> IDAT4i`DEEIn1⢢"Js 4ѣUZ~~>Rp⢨C[ieee-]222< f~Y...Hsܑw H\\\d2O>T p‰':r@`jjÇE3g{;ihhE1۷FJNNFݺuKJJ"MwzT*588rrrM&ǍdsssyÇ֭[G8$BhvzKR}SJ_6W0.e0Z*%V5R P4sH2)au\9 VXrqq@\\\{sP Lٕ555666o޼0LEEeN @gc:̙S]]ć ؉gah4EEEǷ:ӗ/_ׯ_O0aɒ%$">>>-%F\]JJGܯHӕD-]]AAg {<ګW/+++\t2:& 31AK/x1L;;sGʶۖHIIEFF2%dffn޼ϯ#(A?֢o]ʲ~|Wl/f%LqzU$j39]13۰a-ɓ'9ssL*,,Α lyǥΐ!CȇHMa?~ &Ti F*0h  .7lϟ?;DvڴiڕeCBBNJO8Ҳ.*}|LQg yȁ;c}*%e:Vf6S>}1[N>]TĠkll\p9.]z…1јL&~%g0LJٲeӧO=U]]|/_]bٹ-=J<== :\pIkO&MBuh9 æLFcXsiiEC'g%KP0AT)>L4o߾t:]UUƍ6muR:' HGET*AAA0Gݻw'͖olhhpssruᢦؾXUUߛ7o,u@;!~Qe2ðWCrʕ+{T־}ȑ1E"({{oJ;N;"Nn@<<<>}tՉ':#J̃A^)((033y&OHHXdHP1njgoD|+++;;;ٳ7rO322wcb+¾}3{G۴33j.a999ɉ|X]]}v<}4;… !!!z]~R22*c a~AHOO9r/xϞ=E211gΜ绫͛7nݺ8q"22 x])G&ڧOTT677;OAvZKihh3 Y2plC;;8q"y0 366޾};\tї$3POqnsfM1giiYVVć ndd$$ptt%%%vr/ֺC={޽;1Ǔb͝;eff߿ҥsrrNyyyaVZZjjjpBggPs^njvස7oK455,ɐ!C^|Ip&ƍSWW'zdd&ǏpvvKnt SYUnle7 ݏ*ХxWQbjjKIa66_Gj̀ss6l#qիW^mL2f"R^^N ֭)!!!3r)Çŋ5{u33q(C0hmbcc돏oԴi:DDRRRTUU-/lmm}||E9w}ugCE;*y&tP 0΢+22 6b((ÇO84==ddEJJJŋ[`cc鉷KKK,X@~`)((ti&뛚 0Jjjjq b:&H 233mcc#ޫڵԔprrjϾ@` 0{D0wwLGGD uZfUTTR/^;v,)O>{,o^zӧOP(k׮-,,TŊHϼ1c9f===;߿SZ#++fjjt۷oޡM;S⽇e˖s^lY.B3f044TWW {߶m[nnnr@` @P(،S]ݥKn"  l6Æ %GVwС#?vqqijjfImmO222<8n8kkkT6xh^^̙3555͛džD___}}QFݸqC3:=n4߂ĝ;w8&M~2@ ``ذaHƓ^XX(y!##s&I޾}{׮]BˡsqㆱqAA0 c&"+W +߃ mÇRk `?@'nyfu1ϟ? nGaҤI;%%%͞==;99ر8d111k֬i<4h޽{.\Hcǎ533Zطo&O#YYYbp"vZ??bmmܹsϝ;צgEGGgeeݸqW^ICrEA<trUUE_: TMMM_8~T*S$8+ggg gA y ð EGGYf=}{DX[['%%!ƪD<{ȑKiMMMN""6lؾ}{^0005kָqzݽ{wedd;wi/_7nܣGu4LeME9@gɹ!I455E8JJI#93pVV֋/9{Mݽ-F)**N2ʕ+6m":qℨjjjrss#lڴț[hhh$$$dgg_~ȑjjjҿˠA<==0 -- Z$Ih- $RAP=#;B3|p[+V~2F377'ʄ@CC̙3}}};{ ʭ>FEDDXYYB ])USS355]t۷Л7o3uT]]]%%%iiieee===^& )mܸ˙eee C]]}̘1db.]Իwo&0p@77dC zY`R.WcXxC>d٥)˜AuλիWۓ#uuuNNN\h3_=yzGGx"k׮ 6tuB*((\))0999ŋ7o|@O>eddbUWW}D]_uɒ%ɡޞ|<00P+߿OGGC !F mpAk`cccUUUYYYnnnhhhbb"=r_lW555{ff&hSN:t:ɬKII ! ~g0mJӧǏ'Gh"sssuuu))WRRR&L@/q8{%K <ׯ_ ?4ġA~\ ڃ׆ъS'c+Oc$45L_!"?}$ΝVXA>|/-[ݻwΞ=a3בM-pႊJGaϟ?31EL4h 4Of ,?S1hFSTTTTT՝2emN8ʕ+pܸqǎ%ӭ[7+W_œgϞnFXjݻ>ׯ_9s;v<аgp˖-#Ǐ?~xuVOOOnЃt444ma/~|iR@| h[x%-d551cܺudsmdd"ŋyEGG ?5bĈ Z666iݻw[ZZN8Q9`Wo/yS%^jiif?xdff=z8HNNF ޽{׮]KD۔@ (++_pANN?DJ'&&'NHNغuԩSvqqqZZW:kjɇ2*/G>llllH9?x@ɓ'{gϞ UJ -m$X<  6=gݺuY{ew` xE͉f?2ڵj桡yڱc!GLL YUUUX[[sY~޳gO;;;]^^^]]Mp@5|pzހ*|%66ӧ }%I&ҬY3jMX+nnnmn @p!kkks>})^^^S9;;+D YbEbbbBBܾ}Ą4sJӻwԟ@ӦM7o!ֲ 5t%((UV-B:]|K$B|>kXqaa!m`` P/Ԅ#|@O<(JM]V&Jp]O4-]]a~> //h qqq144ͥ#|~XXXK!!!&޿OoSl„ ][spphѢ*ebbO?رz8f̘7oRooo~@i޼9(^QIO>=x/L]GcuY_<.))ќ#@u3g]Wzw~gbiiymmmf044t߾}\JJJ5N-00nݺv^^WAAεpB+gggf!D±c2G,]T@A @-jӦF~9e۶mÆ :uYX0huW5󪫎gJ|*h>TY!999~Y~ݽ{|4\ii_JJ P p8GvAAA%̞=[E粲Zr%;v}zii)_31[Y`9GC(Ι3GڳrvP.-%|fJ?KXё)((;%Vs"(//ٳg;w޽{7ASj3p@???Ν;'kƌ#FͭCk֬uVFFFqqqvv'Owƍ 48zrPZXXtuΜ9ɞSYYYӦMcϜش@5zm^i<oʕ۶mnFv3 ;/Ԅ#@|iϖϟye׷֭/_\7}n-mmGZZZ2`RĹs$~ [h1i$##חڴiS׮]ۺukq޼ySv!Ԕ{-XK.:::jjݺ)SX\5jty5y CY[[Sϝ;jkggGo_zUGFF8p ))[nW\a3رŋK‚NKK}p 5PM|mɒ%2vS*[PPqƍm۶w^Rʼn*eff>zĉ~~~̔0QLAAȦt>}P̙3_|) ޞOy*Njw)U,--=*> 004^XX ׉==G-?}M%U.@p~M *ׯ7kL)Ty(@WWwԨQC}###=ҥKǏ߲eڵk{Appp~[MkSvjk92dBeмZZZ?O?Uۡ233+\XX|ɥKk׮f!66V7.\@O>OvժUrnݺIII>}*))IMM=}E4;B @%%%̖GgϞMMLL:uP(}LH4c w@0k,Ez/w͛7A+WJۍ%r/\W*|SSӦM6́P666}YhQJJ?OO.q]Fm;88#a?~PJ]tsɹй-}'OTq>}XYY1#baa!>ɓeU@ @^~~~)))C@0`>͚58q"000pcfffzyyرL4I [^^ޘ1c@ZZZǏg ggg+Vt'NPpΝ x}sii]x!.\ Ν;nj,"(//ٳg;wf^mquuy| %.\h޼X__&M04o|ݺu&믿>PQ.]ׯ_̋s̡@i [r%蘛V ={5hUVՋ~m6:t۷Y5HDDDVVB п#TE5*ojGWG|^z۷oG)$P ƜҴiD;;;ٺu+WhBd;V$NRnH]] 4Pɓ'..X@ݵ$ ^755sRRR.] ߽{G#<|O>]tYlم RSS?\RRӧ/^u=vXcccj[OOovrr>Ϟ={éF# Uxjv@BP׭[7+˗/?<'TCȢSfͦM,[ VWWwܹ޽;}w}geeehh]f-Z=o߾]|{D(Efͮ^mkkkhhgccuڵ2jxEX;w}V|}6Ba^^^jjjdd/^Lԩ+w}왾ƍҲ'LкukBȷo|||`|>?11Ǐ_-]̮GQ5jsT~ӋfΜIAm۶%%''F:t(T⻖%-Y*~Ν;ƍԭϟ?߹s'?~gY_GekӦ tQj c}~guV~}j[F; P N:*2{lE(=Z.TIw̤D9HZ潴xP5Տ3رc;ԯOɏ "ϞFFFQQQ9r5tPݻJFDDB9Ϸvuu>L˕+W ; 4(<<Ȉzhee5nܸ~SNo޼!ܺu+%%BM/))a? F@<߬Y3>m[S} }%ܹsq#SN駟|||N8A9pǠAd%9BeР jcuJ'Nჹgl޼j*}޽{Hi߾җ^թSG-Z$17EPR"1Zμݸq˗9?~^Çgo9ahcǎ]P(k^n!Ν;7jHץK7nP3iegJ2dR8 B]WYHH]k!hs _ =cAt{w-˻iӦ|BK3008~8}{Nto߾I,ӧ@(..ȉn%|}BCCBG@0%m+'zDr4v)qXX>3x r@h Vp۶mkVVVȌBHffftttnnn{ʸ͛"H$J, 4 5jŽ{?|@owҒfʺw!bܸqTˬ#X}yE"m//͛K;ԩS턄tY))Ӌ7o$CzEm*^zԶ&Ǐ6Xg+}DEV~Z(e˖t+!ڵqHN>P3mڴ?2##!"9f-jӦ u5\]?xI85UQ#0 'ԍGw0cx"uѱ[nT0##<777!!ږq?K9޵/Ç}>/s=Ǖ+W̶>LoP\\|QjOz)/NmI۷guytaK$'iK=5ݻ@Pq'NdN&Dc2{ҡeQQQ̈1=4==yVn݊z"1B ==ׯ{m|/^q@Vkn߾e˖ɓ'߿QFvvvcƌ d6)m֥v͛7|BF@$Uf; .P|U]K2DcǎԥKzgJ'zL| +-yܔ={(=7%%UR4Lo4qJ(/_Sg+ CsܹΎd!@04˗/g͚ nܸښNIIB tuu-,,,,,vC:5mڴXiQ샇,[LJ͜¼u}zzzÆ t _~}RJMF=E7rvvf(]K/++(իWt# ĤGVVViiipeYUImau7o޴hѢ|iֶcǎ79~x@@NWqaaa:uG?x޽&VOzu Wye7VPM! ǎ˼0Dqrr?~WRxӦM'OsK.edd̚59Wv@Hz@߯_?_Ǐ?&W=NJJ j"ksά:$mPl /PUZ@a($)z 151B'S<==}}}YS9d5… Y;vK|RƆ~/3}۵@ 8rHrrݻNڷo_{ɩx3dbJJ˗/ !/^BԩCn|%Xhll=< %_^Vu Qŋ۷o$BBBj׮ L8*{SLaMW޶mxPOOLUɉ)))&q =O><' йs=zD`Znܿ͜j?LKKy&!㹸wݵkW===jرc͛G}!|>_9Wȑ#9]:s @>WTEDWWTtR65+ IDAT3!ߤaaa@ >z(3uС5k,Zu.(--G (zߟ>Im!pAe5/;wڦoՋ׀N:YYYw;|pjݻwk֬s@@_U(((߸q#2e P~~>}ƦGݝ ?8q"""ڮ25}og-PKK^z1#j^9T> Xٳg'&&r@TbJ]Nӏ8 +$???Vpn3Lj ߼ysʕ]vݽ{~ՕBZ7n,… xboo_~olڴ i uF aoDϟq8˗/[#Ǐ;jՊUިgϞ]x188#Y/ ->U~"yڵ}vjG۶mF# z> \/۷o^wqVXqMfѥΝ;jPUUܬsf{*h\www֭}]@@H(:ѹsch8ѠAj֬MrJݗ,Yboo_NGGG,w&B{ڧ_~T NXb @m۶˗/_d դIM֭[7cc>ܽ{7888**ڟڵՓD~^Rchhx).hDݻwÆ iii111rÃ6"z> |iOa!cu3ua{{{ %==Gjެm|RP PL:H5>,㢏H$+?酅ؔƿq㨇oߖx\[[; ..jAU!CP5/]~ظq6m$\AS^hwI= ]300PhPf~={m޼Y!ܲӧqҥ%K0ghGkS֦0ؾ}Ç${ĮxN:JN,={z}cnݺU Hہjо}{*r|H~ ҥ P}:5۱cǁdjѢE\\l^U{AΝş=x ]V? 9_F?lӦM-=SÇA$}pi9X^^^̇/_Vϩ+{֬YCrC 8pٳgs̑q"/ԬYiӦ...˖-~BB}痔4w܎;ڵkk… !ٙ???_tuuC%iAǎŋ#F4mT[[Դm۶cƌ9yÇSˠedddeeս{ &>|Ç[nDtCBȈ#=-=CX$ݻW2ozh*0=3BfΜɌD1c$%%q@ ,po*^,222:u[fW^/^,mѣ9 N0rE_5qӀ tVFϙFIJ!Q}^M?QFzzz^q߾}ڵm۶ׯ_WOK%* @===Y ǏӷZb#I+BׯDX>}ty⌌!>4iW)TZW\aF|~XX|;w$N ˗Ç/**b;th{333KKK`E(O=ծ];ufBP(dE=ZT0'WbF-ZPs2>ʌfgK\x<^PP'77|\PUwѣYW䰟?fE>}zΝ܄k=z.V;hN28cc㰰0{͘1*@%222\\\r{iaÆ!!!ʕtСC9&@ ܐLh}aM!m۶ dI>K͛7̠qLLLڵ+x</_.%_Sss*x^BHvQ!+"**gϞ=UdZZZ[n#.]ჹ9W)UwBBݻiӦoޞ*@|}}/fDKKȑ#mڴ%9p$$7/+~jqb 5nݺ?PRR9uTS[>xڵktUh8%[fYիW(Bl">.@J$/ԟ { 6dF*u; B@  a-&{ȑ#KKK @tŋG?N!q!իWWY$*.8P0x<f$!!ݻw\!!!`\\܊+J @J1;ug%EZ rY%@ 5A?///CPU2ү_VpժU111P| Z[[+D2jJ<>>̠~ddrŪ|@1b9ID'QܲeKf0''-''4jԹsg5A=xd"ۛ!QQQ&&&`RRҘ1cD"WYh&OŊ+,Yә0ܴiS@@1rm馥ՠAߙ0~rK۶m=zD?{.(щ'aÆYfqB *ɓ']v3TqF@P˜yرǏ}<==FkpO|xff&W)h@1s̹s3QV-5]v ~!CyfNO&FVV>3Y`b!zzzua߼y3b5dj?cǎ;:v쨞ʬhkk8::v{m~T"T6mY(ҲwHHHP(* K/^UJC uԩSǍd׏/--ݾ}{fͶmۆ{Bܾ|"^ i:"(--ի\%:Vb׭[I>C RRR흝 mvÆ Luɓ'?=}t_~۷*-[|Yڳ{s3RQ͛Dq=~8eٲe;F ՙ5B߽{ƍY׼(߿_vWXXׯ_+TE۶mjԨZ V%Exnݚ훛ۗ/_ +@ٮ^fVpΝ-ZPs&(3gμvZ۶m%>[TTUN''7޸qJ^eپ}Ǐe?CX233JFLMM~Ic5jPo߾3uT25Gq;v{Ν;k׮-mٳgwq/_xPelٲ133cS\\ƌZUUB5kvA }ϙ&Mݻd ,N[[{ԩ)))3g,yQnnn||5k5jTNA-\%زe &)**RcF1114h3 WСCVpű B N:t(3"믎;r׻wΌ~Z#dgg޽UؐSݺu{ٳg}ZZCf͘ MLLڷoܭ{׮]S{v 1b3?p BgggE5k޺uq\eN̜4i+U@Yfٳg?{,66v̘1uQ߿_Ibbb:TF/fM700`VXXƤ6d###f "hii=zu?;;-// @*wwHfSN׮]\t֭.]0#/^hԨQXZZzSN]t޽{ihh=u:;dر#s$ErrwZjܳM6>T{ 9rdHH8##>iX}||>UJju ÇYGrX Tmm=z]֭[>}[t?Hnnn``ñc@e7w\ַիMLL'k:BaNNΙ3gJF=ڷogVȑ#v$u:ǏZdw5eRܹsՉ(%%I&8כ7oם;w222|a˖-WZ榊@N8}%W^7AZZZ~xxxqzL6u_ \tgϞ\̈Sllmjv=VgϞ5kL ~իW^2o|۷INNɓ'N(~*˗3#:::k׮w#0`kIhh(Wɨexx3xڵs1sw1#}?~ʌfggs:98808͛73#T% fF ۧ ](hp-[ٳӧC ҥKNNN(T.x"3R~ŋ3#WTv@\%f3f駟XS޽{|T 5B???%_q\$Nڞ:u*<jYV-f˗k"PBy9?΁įs"/q O>>ϟ?*%B ə5k+m6CCCNM|&!|>?,,"##c\2رԩS̈޽{y<+:"H(q '9ҤIfnnnU.T7˖-{-32tPM|wܙyYcƌqtt01`yyXkJ{@/cֳ*|F?\gwpFNQ,22yÇ'NwBuDFJyfSO۶m[By򄔖B<==n߾x,RuLN6: lJ2?tdУ}{nݺ;w\rܾ}aÆP!X{PMIo0p "E2,-(%HMMݻw/YTwo޼M!3fpvv.kf&0΂ևk5ұ! ,,ښ:t(@@5u5oN4(ET!dŊ999\gP}><33lӦիy^@*VuyYh 'O3<TTG>|Xj3W(ÃL@&M"ߟtuBeO~-fDOOرczzr5C{a6lI>@ux/_0#?Mj*ؐ]ԨAtuNHȧ{VVWTgAAAoޖ! XF Ο?ٳPշ#@u޽0#SD9UJ͌3|m۶e˖q@ut}뼓&M?~ (/Or \O|e̍{zɦM=zte:" }||n޼ikkT 5jgƌj*ccf̘gt:m۶9sq@'777z;;͛7+t)$@GRhxGDDt955fgg]vP jKDDğɌٍ7.&%Ek@-UAI ihh8wٳgӑ`[@JKK_x ֮];::5 LEEE|)rUVdddϞ="j>pDDO'PF ͛ n޼Y[[[K:YY>\yUYO=PYf2#ZZZnxSb XB*#j>ѣ}ܹ\eF6li@qwwݻ7WTg'OfF^|U>n \rРA8A*..3gN7nlhhknnޥK)SDGGK<4޿=zT˗?s-AZN<)gzߚ @e@un:fDWW~*cF֬Y#Iq)SC]`A(PTH$ڽ{wÆ 7lpԼ[nٳz۶mB)?u :");vsgϞdgg߿_WWתmܸO>̈P(5j?STjży~ʌ̙3I&\߿x"WTyIII^^^)Z:x`{K(t>K~~ԩSdÇӧ0 ''G>W\i߾}VTpԨQO~:5QF 5VZի*5j>z(3baa!>@)y 7nPY9shic;w*-++kȐ!?fk׮cjjZJYPرcO>-.]rqq)--ի>}ZdT… d;&&&~˗/)))_VV(f[PD"_ڵkMLLTq ={,UCf\\\s@UUPP0lذϟ3zzz1117ȑ;̙3C++e˖%$$S^rJz˗/oڴ1b_mڴ)_DoĄZyz,vvvѢ֯_I>rB 믿;(KNNNdd$3ʺ|}}KJJ9j GNLLdy<޾}uV+V}:+`M@W\\xbfm޼ՂFYBCC!:u266&>|X6mʌ97s̈VpҥF ??nhh(mg}} avv3gqRn-tttT[I6lзo_fZe9*vͺ01bĈ={tt#޽{׏F; x<޸q㘑xbVX+q&pvv6}/EKKYe-t]\\e uB999+3rJ.99ڵkԶC6m !?NLLT]ᡲ;vl@@yH`` ]APTP8o!d\404k<СƋH_ P5j֦n/))%鑚JO>=d7nx' F 9r$|!#Gq]v~:ugϾzں{:t_wرG&''F:t֦w3fB||k*Eѣ1cDFF2&@ *[vmFF3kkkыH$/N޽5i,,,\\\sN8YNK(]~,4@r2 !"柇 ]melLm(q@ hڴ)5&ԩS-ߚD͛7/s=}ӧAAAk֬7o!޽{)))>;y򤙙SU;;{0'NXn @"6ǒ-\PE+--=}}533QRѩ &0q @BX5LMWI;xĉFVVV޽5-آEf͚%D燆޽{gϞӕ+WX?媀QF .jC Ztinn.3`ZjtϟOKKܨ !088XkKKKuUZpp0[.]$ٹskÆ 6l8x͛7Qڑ9Bw5m B4e-ٳP(Q2٢dYFFEk, #[Ȓ]F%kv;wUvyݳnt:׻wo2˗9r׮]_Zԝ=;8ov^~6ܹ"Ϟ=1bw}lٲ .A( B{{{2ү_?-AAAAt=**<ӧ3f̠?~|iii۶mwޝ^zj*ЩS>|H#""LVZEFTUU4JJb'7[v۶m www 25{FFF .8@ON[lI'XEEÇw&O3~ח>|qH(ܹ;...;;<;;;11qɒ%۷_~hslݺ>|˻xŋ;utٯEBAAՕvZ7+h8b(bH eeՕB-qlm/_$o4Y[[ϛ7/222{=d[nt922rر>YYY655UQQСÆ oN̙3vPTTsLq?DjMիWݻ3.lX0ØmB+$=z49~ }o]t{{{33gNll,9VQQYhѭ[JKK߿b g͚%.Ǐ_p ٳ'33憇bee%K$zzN8Ѱh![2l@bԩCBB2337mԧOj{Վ;z5f̘z_6ܨ]t={=z۷>Դϟ?K)CvYYY߿ۼy3+0BFp˖-TSfi8x 93f Fv۶mNJccc߿/?mڴrr{2\z59PTT}***ظq{]]ݣGjjj2W0 eƍԦP($$ /_޾}[ܨWJ%i+++ /^PXpb N^qW6.;dȐ!C޺ukѢEo&ϙ3>]M!#|!ӧOFF$u떶6@3^@MJhh(Aʹiz%+hr#u#;##/AHH19^bEXX9n׮ݻEx"5ŭQlkk+pjjBbT8n޼)ac`W뗜L5y+Wq! ل@QRRazDEEE>~H.\bA |N]]݃優p85>sj,'5gϞTCmt_}ֵ}rppoVUU+ S$6':H>}jՊILLl@hyFFFKڵ+5fVL>d׬Y-4޽۾};=XuUUUxxWwoR7E}צ9(++q%%LRPP9r$=ry&))zZg[JJKKzр5mmm r|ҥ@zyѕ́[l=z4="O3R 5&bӦM{j+VhѢT/z!WO  ;dee1 |A;Sjl>fPt=}͛7ODJ ??_r?&zޞqo 퀠HNN駟JJJΥ4l `޼yԊ#))) u떄gΜIu;v,cI+o\vFz3d3ahPh ~g5k֨I)))T[V޲e˵kȱݸqǏkOҭ[7j,AZ:uj΍M6={GOhX6mjJP$8uSdʕG?x͛7ߺu+77㕔9sfҥ_|h/ jUl2dո>p||MX-˗/###K }5iӦgggչsrrrDڵkɱށ"##HppիW <GGGK!**46i7>F;7o֯HyZVdժUȵkVXѿccc.ejj:~jC?߿edd+wM6mҥ`@@3gX'^@@UTTzcǎv 86GihhL< 0m={hтzR ̜9EԔJ 66xجmmn|Æ o k+((pqBSN͜9NG;̙35NƢO*3gر#-/5SR5ѣǏ#]vS"&&~mFpFߟ-Jnj3k,rX. +Vɓ'߿_鎎䦟r-ndy q qi++ܮ]3gΈv"yxx0Mcqyyk;v ۪U=ajDG# СCq^^^BBRRRҮ]ȱ={n߾ؘQ`ƍߓ޾},--mժU666>C }ڍLSS{j2H\ gb?w 7nw}ܲe˾}z{{={6##KBVUU599y͚5ݺu#``` bCZxՕZ@zPcwaݻ}%rliiimm]c9w^rPPP) ̓ѡ/8{O>w {eeΝ;맭ammiӦRՁ)֫SGaWI`KTTp8{&#|uݻǎ[1 ѣG޽{o>%WWW苫NdiiY㙹\.O or҆ ȗZt[5=z cTkπR59O4'mڴmy-22z8_AĂ rssɠ聣G"ͣ-/^ddGMb`]yyܹsmllnz>TVV]xqŝ:ubԩG 6o߾֭KJJ,,,*((Ȉ_tiv~W$Io4=˗/g=J>| I5j+ #""Meuؑ- M177߲ecMLLɓ'r8]v988=zǎ999u͹ <A; <i߾}$* IDAT{ʕA]rEn~~~;wd%I4&lӦMP({.[)@sgD6lp8Tsszڵk6oFm;PGG'''Mt===R{ŋhBܙk %%%ju}ׁ)=r]?~| ڷogϞL,<<]v>{{{2ү_?[ɉ  %%ŋ_vǏ|><'''&&fرi׮]*zWPrT)((9rK.`yyI>|VV N>}MzdܸqC a+}7'4yGe|ڵK4mȟG2 wqqٳ'[X[[7 JMGGƗJ߿_޾}ti d5rtjZڨ$?3#{4mșjƍEEE60h2VKԸ"##̙Czuu5Ihh_b WWWF[r{+zPb;ϟ#;wf+cc-[~qFzDYYy͚5l֣GK.Qiii,&@á[ѣ֭{E}2j$kc|کS*;GGǫW4% O8:uĈ?@@=V|rq ^zEk\(ш(/W x'夠bVo!!!/^HNN"nnnoAP'ȇ0V7o[@hݺNQQy%|#b ;vvvNrj\UU ՏyDv 5Jd8{*XPP0a„ \|Мuؑ5D(2^ ĝիԦUy@F֭[ǫӃϞ=1c]@ag0Y vncp&!ژ߻wlo~R.]qppq㔔$%%M>~?T:JTUUt6ԇMhh=~kײ;d_.lٲƹےZP#Ʋr?cƌ\%%vڍ=Z__ $''0`͚5666ZaDDD\\hZBcqG߻wo````.]\\\ zȺ0$ 4$ _~ntoѳgOjLLL޽c+oacc>y̚5k׮]߿rrr@@IMM-//R_Uc/ SSEEhFd?~d++_4IޘЬ1"yyydTUU׬Yӭ[7mmm%%%jϟKWWWIIe˖=zXpaRR͛7mmm 7nyyyLL ;oF<ƭ[zKHHYYYӦMT0+P(d;Yeew}ME\WQ{|"m,k(+Q---z$..Q yAQY]ah\YAr͚GE?z^SazfffhRhhݛ |n=Ӓ㝝k`۶mc+%GX@v1.a@3U\\LErssY(詨D @f͚@z088k׮^^^lerdTee%c%uuu???1 ?o߾e+`nn@SvZF۬d,Xкuk)])Str`Pp괿ы/M #Drkx9p=zD+**ܹlP">uVzDCCCjj:w,÷`@ @FTVV2":tPjy>}| }˪,rȢN000`+`cǧO(|>ڵ++@fff()7oΝ;@ s~zD]]}ٲelӣo~LRb}mL99r$w "##CBBXj2':::##;w.&4g@AA[Et15ˋ|2+@ @JK.e+@QQ@ `+ PPPa%h&BBBu*ƣtȖ'N|`++AȄ˗/_v4i~mC ]97oVUU1eZM__:::`VVs6Vܠ D$c[xleA_QVVf%h:wɨ_vmɒ%l51~^z F`ן_bTUU9+@3n:FpϞ={e#9fD0 P!WưhծE._J> SP`ݻwQFڲ&F/ X .b"s޽{Ӄ|>%##@F(@s$ իW ,&g+}Y4QAQb"s-` P:uo߾޽>}rvv~P`Ӌ/bcc[[!C,FmAe˗EӴ{n7oj| uڵ1b}4'O2 i˖- `+۷ia[[[ѥcccׯ_J> P`͛7o+++;;;Yy[xqQQWQ?~|uf۶mȪUpo@'NG dGMBOOϻwﲕ5v|9,,ر3[8 ,` @<ѝ:u'M{;w#lZ*##>|)=}}z0;;{ҤI9={#mڴqwwg+}X-III;wGTTTBBB***AYcii0/vڼyJ X BCC?~HH***leЬ~ܹ3@3&00 g}:sLrШ~s I6Hُ?x zDWW (2`PF0..Nt`hbNpݻwwwwSSSy!Z<9rHHH#￷k׎A/ lg!C~>*\~mm1c jD-kj1 ,[d@2"HIZZ?zzz2 Φ/O1:˗T@(XbGz:@f]51a; 'H._LL8K.lra%`ҤIeeeRP }| @@#ٲeP(G~'"Ze%&L zӋQWW@^ӧ agG(O@ӄ@cx͉'葡Cۗ|@1"VXq9zDAAȑ#:tqF/ yҲ%1y2AqC̚EtvN -4m۶|z+@1`=eF000pobșNÉ/S )B @ꊊ8@XXX;|@0@JLL7o#rJqxa„Ѓ'<<_=@^ EΝ{ =2{-Zȩ7[nV&MCeeɓ\ˆoٲeڴi9z@ @~WEJ׻wleTWW;w-[V˓ ݻ7=2y;+PGzM ̘1ĉӞ={jjn._̡uSTT$)):իkyԛ7o\\\ UTT۷o~zƔPƇ5e֭Ȓ%KXϟ|>=@ 9r9rT? 9x }344_~l%#==}'O 8/..:{l@@֭[gggVaTdee:u6l@=0P/;44}_zF|f@xwGZn=}tyǨ xSLe---/^-SjPh¨I#FpttTVV&#{e//`ׯ/_Nm><--ё;gϞ7nܠ?{,c B EEE}Yx1֊zC ~|2vxF*99[NΘD2|p]]]===;;;2rO>`۶m[nqqq_=JII)""CĚ5k"P( G444̙V>Po߾6lإKq/jϏ^@ą ȱ39x⎭߿?_/gDD[߾}k\fxϞ='N433TWW7333f̎;>~Xr}=zhkks:_䫓'O&Xp!{A5k֬mr\ccc;;}1.tΝQFuAOOOYYY__cǎNNNⲍ"/diiIFΝkii٥K9sܼy6oݻnݚ嚙1b޽? ]aaͰ0mmZAn>{L @JPhHgϞ})=?Ի4@={lgxҥLf|P(ܹsw\\\vvviiiyyyvvvbb%Kڷo~z@ .Yfkݏ=*..xG4iR-?o߾</77z%ãG ַou%%%effVUUddd/]]vW믿k߾}/^(+++--}mmm'O\5u,,,V\{}w9))6o.++##Fׯ_766͓'O#z@ !1UTTa+hccc )))C fć ry 4?>}495k9rs%/_wsss@0{l>OA(zzzR[lPUU5i$___RW|2lذPX111_|w~RYYӇqOOOrpkD- IDATʕA]rEyv)a۷UWWS $yƍq_1cܽ{WrnҤIu= ///j|…z țm7oV4-sƟ]#7e+%9VUQ,dNFF#Ү];V2 nnn;PB 9&;v޺u+޽{.$?}tbb"AO< ^ߨ0ތ̙C-j2o<777KKK%%Ǐܹ|2f:~8 fJMM%-[\jS۶m߿׿y_jk6nꪪz3gtڕ wwwbiiSUUÇ԰sΑg[vyjy损A&&&6l `x[bbxhӦ͢EMMMKKK/_3 fϞ-:[HׯSX ())Ԭy5&h+E7 FavA @cǎd vܹtRg̙&pspAr0fsssKm۶:uÇ }󄇇wAlܸťsAS}(/^rhӦ͹szIjmmmmm=sѣGgeeqĉș3gR;w.&&w%))m۶䦉ɜ9sN:~WkEHr|I*Nĉg̘A~ъG%z r6qRR5+w pBll,([[X߅N<ήw<{%jqQ]v%kB˗S)A/ RP@<{HK@+fV @SRUU+Z駟BCC@yMOZZEDwXd 9 wr\YY%x<޴iӨ9+{544dzjrxo[XX$$$PU7ҿ lBEGG'..Ψv؈N??~<@P"DVSVVcE"ԩSԷ[pp38qB0j*j޽{P#ryzN+{ub:A Ç6 &e/h"5N: 铝ݻqEE͛7KQ[XXىгg!CO2e pJJJpp… ...C5'N8p@q'֭˗/>ӓ1O?IH2zhq/ݾ}[( BjRcjq]Q3fիW/umԩb-zzzTHM܅ڨzzz?ޔ%j %&|} ȈhْZf}mmmEeЈ3g˘^@M Ϗ&>>>SS222kHH+qvD+XA\xK>5.]DU&L"p>!Y~jKKK3g-qK1c 'K"àAN Hcm:T^hPD׮D׮DI !@1@w̙ӧ3m۶ӧ.yM[BBǏ…  (44^ UUUdDDD7{쩢BQL#jqՓZhѡCUj2(55O>}իWrrrnfN())I楿Oָ} Dn嫪r\GA>@athj=hS^@$PaGGG@^n߾-@SG5jXqF(',YޚˬкukgVQQ'-f'~-]*@W=zҲO>xbVVV rj܁ШEkTQQ!a= B!6#A@B @F?['@DQQѤI֬Y#zo%99"=Ԅ'&&feeEߤn܋ 9PWW׌M٧oZ$ BEEEK^^^ӦM{۶mtWE_Z&TՍQ{^2'%% O>;fff_} *X @'c%q=Ѧ%g6mҽ?h:D꩓UVIE-!@ 7nM2P2f@@mAAA#F&|!>ڧ64zCÇϚ5gj\k@p'Y=d.Tܾ@-={ٺu-Z ,8tмyq.^uM6%4%UVyyyJ_{~x{NNιsjM xxx0W|T2/%)//39ZjՊTTTJn=/U 7nH_v-9;p@dd z*Sh9п; D BO:%P(oK}j,R||;vҿJcʕ?wvvq޾}գx<ެYK]6<4d@ HOOGPfH(ܹwޏ?fvx==O 5&ܮ]( ɓ'c@ءݽܳgQ-O5sLF~SSS*ׯKѣGTzCCC[[[rlff6brUKmީ8{vzjdd$I}ADܹZހ111ɩ544\~=ګWX ܻwoС"#Ge AAQSSkӦM-Z9z(zswwNuzɉ:ÇT ,d<ҥ [kj֭kE7XIVLLLQQ9vuuc0'5]]]]]]1cEe333b rP]]=y;::RxW'rPRRᕕiguE\III&M ׯN*+##cҤI|> +W~KK#[gg={n޼Ν;޽?~ihhرc{EdjjՉ 5wݺu~>|}vv6II5i?~K QF5~VIz4" :̌%$$P/%%%ڵٳ~۩UmΞ=Kuܸq=9߿۷VZeccI3d7rݻoYYYGٳɓ'ԣAѣqrrN>0i${{{FZĸFև~]ee?ԳgO.[߯:4ez+V۷o6mTTTZhѵky?[/\@ 8PzpႍMFFۉH۷oOp#GȇzzzzTht…]W\yeCCCVr0&dgg_t[ZZi AmݻxzzR}H+++wٯ_?mmm kkM6QO80..NQQ[hhhw-ZԾ}{UUնmۺAЧԒ֯Jm:::p\33 &EE@j ȕ g̘ѦMUUUss+WR Nqƺـ㏠:}&LwI/1 &n8'YשT[uuu{w}ƆL͛7mllBBBDW(mӦ͹s6nܨJnGoiB$DFFRO^/! Aoo=z450??޼yWUUUccc]Z]]= ŋ5VJJJ6l_Q܅$5k֮]$߿rrr@@IMM;={k|ISSs֭ >2eWs#1X0 EqQ;?yg1[WWW*nݺ5===9"z7JǏSwo'OL.Twf`c@Ϟ=qTTT<65Bm|7.\.+@C &{-uؑZW(۷/::ѣd|˖- 611!'Od~A ۷o{zzn޼yō85w^v=NNN}|||_~%zm_7ocj:tP 3U 8*Ԇ{mqbȑ#km۶ .\pa]h`jjJRB_8**6TWWSuԩew2"@SUQQrʁX{L@~p\pG7jD>%x=Hĉֺ'O!'%&@1c Ah]fcc$XO?t֭.])$@6lْ$&&Jm׮]@MMMjPOZnxu޽sgd ++k֬Ym۶rvvvcrΝQFuAOOOYYY__cǎNNN?~1GrcKQQQdwd˗/100PUU5229r]k<**`AAٳge)**җ*ŋΝkeeb``Э[9sVWW@W\\gϞ'ijj3fǎ⾼DC|5kkkEEEŋ:trƍ͛74~n_@^ <ܸq?q5k\rO<!RRRȱ?>dȐ>=zCI)(((((Ȉ_z?lٲ%\^^~z׼/nܸ)^^^!!!8::zĉRXXxirq/X[[3g03;vjQF@>}8p ŋc&%%UUU&M|III@@Cii}uRRR+z5h2&LPcի\ P1dȐ%Kc@گ_?---eemێ?*8q̌\@jPZeeeN_z5oժ… %x/^})..n]v%˗/A())-^ڵk?~999111cǎζvZW?~| ڷogϞLޮ];rޝUQ."(.fj(+[B݈Rr)]bW#w KF+" (n ;|s>3}#%Ydgg"]Y_/ѣO>}#GF-Xqb!16228qS222Ο??}tY۞={[X9o#J777m%T`;w`ĉϟҥKVVTvm5sڵkwq//* T%zT۷OPffڵm&m7Fhh!CWCBBWA¤qA 5jԨQ;_!---::O>eE"oo?C;z뭤$AΜ9sf͚8jԨSO8!|eggK]zNpB#;;;;;]3fƍFԈ\n׫WﯿQަM6mڼ޷o?ذaNrFfFFFpOTLƏʕ"?mӦͪUMG?u z[&O}Z˞n˗eS4jԨ6.ѣ?z93}RoT*ŕ tڵyeJOT}ڵE6722JIIoעEJsdq݋"o~ӧVۈRbC` ?cͥ?Uxyy]r嫯ׯI@# Tgu̙3]\\.\~fǎ5~vvŋ7lGCzjLKqmE}mذoڴJ˺ ח۷_Tv@ddK; g̘1R\:rFFVVիW#ҮԀ wvvo,oذaϞ=:~P@޽{UJeNNNjj۷9|r}۷===O>ݤI.ؠA|oLḺcǮ\-I~?Ǐoϟϟ?SSW)U/t%:v]v<^D`hРŋGQʼnUz麿_ⅶJ_7?P4dllvU^@5nXݻWSSS̙#Ɔ!!!z /3P1sÇŸ<oߞr%KW3RSSKu111^)\T)Ν;k+@?mذa?ڷoرp''*έ tۼytP+ȟW?Se zjA>}ѯ_?Ch666]vȑ [xbs4hh"zݺuM6 4Hdie@Q4o޼nݺJSaN_VlԨя?8f̘lC:@&L~xhhhاO^DxHܑ#G *PΝ[lyUAZl#~TF@={k.]mժUk ,--KXyǎ+Lllƍ޾K.e G֘b̼GgEEi; [R%AW_}5qL^@!R|kVZվ}k o)AAAE1tP~QݻwK5j~)zÆ 7n\ZZZ9999?ٳ4W>};ϟ/<'>>Wzuԩe|pBqpܸqzzWN:SLsεnzׯ_ͽw֭[t)kРAi#-PxAN&Mt/^|ŋ3gtssu8{&LoBYP^YڵkppWKOO2eJnnn:udɒ.]>>!!!LHHHOOS} ԻwoqAܶmۨQ񱳳{xX݀VZ5eʔ7?~ڵk wiڴWV(ӦM  ݿllǏlllZn=zhW5&##ŋ &z@(JsT:秩kA}US@H'NtI[TgEEi; T4 7+YSn]h|`I>LMMeKWc3mT=uV^>}vH[Ti]Ы@ĥ\\Yh5^вgϞ?^>@!5-ϗP- zeC֭[k+Qne*G)w͚5%_xBfڵ%'Ϳ|8yƒE)GGG;ƍEBCC+T6z{uz Pܾ}͛W;v۷S9"sqq)cx^~Ψh#lA<<yRT3933Sz/(((PsĸO>K"z@P&x {+Wya1KڵőOĨ9%::Z[\B @k #.jBI퀤UV,|݀Ј#Afff2}v僲b?jZsܹ+CP̔wܹ{*Ejժ^zn5*{衭dWWW1VS{)GRɓϟ?/˗/1j-NPu[ϫv ՈJ }JZݻ A~Ǐ֭[xX3򢢢|}} rQia.A3*5ccc==ެ@E ^!=v ϟ{ <ݻ%KE>ЗGOOiӦM4y +;Hy{Occc[3Fvډ_p~{nZZM˖-gnn^^fO^n]tt;wAhԨW```՜(ѣGo߾={{>{7|w>* :Ee?6@5G @;ۗ"Luӽ{wCC\@AABo^^^?PRѥk׮=̜4iҪU $'''''GFFΙ3gڵ>>>\Y[ns-RX\\\?~,޻w޽{R;&PY@ Vc׮]úuvI[T7fff;v"8sӧOX/ *dff={V5[r=hР+W r=2dȱc4xY=~] /,XPu^|9h 7n\TjljݻW>ҿ}}}mS [ bbbr m#!mкu닱s-ĉA /_,^iŊnξwޚ5k7n,ə;v(g܆ R)\n*5={k+а[nbRuU,yyyay-Fz׊GR#D>#F4iҤi|Ai.RGzb~AX)T8Իw={jR={?j׮'OA*gϞc6uҥX1q:z)Ç.( z@PSή]TF|||I5'm |[n999En ܲe ƥF@-[lذ)9::}⦙k V oꪧWPRUAUC/ zT5F@ZnCFo5ɓ'W9Y Eqӯ }*aϞ=+3ߪ =tV*/_T?9''3zt 5*sNaݺu;t蠭d?'u/ H|_ sεk׮l|龎T**[T?S>㣯|M:88{…qC]MPaR ŋBmPMHqLLׯ_/qʊ^@-Ξ={GؒCj+]!-8s挴sj:w]|2Di/i֣Gi[͛7}*:jU',,L~haa驭dtT8}ÇXM# ALLLw.ƻwNJJުLH:u}åTOU׫[TݻwG|}}i$R"ϒ?t=3gT( qqq*^|9|{i#u-5oA޽{?.yw;߸qC666nnnϒƊA5 ##CQvӦM_]v'Owo￿~zNNÇWWW n[TF@5=}+K #դPQ,X m&߾;v7A:uVӬisss#@5G *dgg~7KI~3;99UpZZe``uٳg9aĉͫj>믿~뭷͍FL# !@ ՞BTj;߸qtXvG"OUxիRRZ._^xuUOKJJjܸ|ĉ:uV>@XPrss# xE @MB/ jϞ=H!sT~M~hjjگ_?m%@cC reddرC>cff|h:d5ʵcǎ ȨQ t5ʵi&P{5JG fll|ʚ###m%5JGh.^@(%jHPN/_?jƍgΜ=ZPh+R`?j%44TTG{=m%C C777gggm%cj'OG Xť_,Pӵ:@XnPOOoJzuڮk״PC/ ͛7G<==4h|Tz@Pxaaaϟ?k+^@9*J# +++___m% :@uÇ##G411V>* sTk*JPc@5=.S*o-_.0qp옶2Ҋ!-[v@ct5ee]TY7gٮ]}.Ůvvﻺj1TNt5 u Zi)b`7v@~jw&ME @MPB΂";'4kT R%a?jFWI0JR>B d*.%+\`?z nb@u=.nZDʆ5jdoX[k; TGvffN".^@EdJ9uꔶ3Q"""{_w^wmӦӀ~ᇿRst@֭/;vV2”J|<77ŋo޽{Y:wwW[yՙ:===###m%@{_Ȗ-[RSSϫLT~wJ'Nxyy9ٳgUCTj B[D T-[z-sssA^|믿j;WNVVֈ#fϞW~.]$%%U^b.RTV-me5PF@=zݻ/5nܸ[GZj5gΜǏ߿?''/_^f|Z\\\^X ^Lң*X||ŸK.b=zT{yrl"6lpǎ/^1cFΝիghhhnnwsεo^0fm$TS &-044544GBBB׫%))/{uE___5۶m{qsݻw]D T7q^ԩciiٷo_q$,,ɓ'dɒ1vqqٱcUg_^%7|SY)F:j"߿?99Y "ҫׯ/N:)g7sҴ:/VX1x`GGڵk:::oҥ)))]944T[o%\p/tss566nРe^xQ½3g̞=O>M4444jڴAԤQNVW^maaQs֬Ycff&^z"]D Tk׊ȑ#FW\YܹX?ɓ' OKJJ4i J288QF~;ܹyΝ{N<~(((P[233-ZtǏ$''GF IDATF~gݻ;766gϞ:t"""nݺٳ7oܹsʔ)7^x4s!aGǎtzÆ ?0,,"tJ ^@ @y]\MLL8>>>**+4kLz,^PP'(qƥ .l޼|B^^СC'M$),==}֬Y (nNvvAV\T*ѣ!C;vGڵÇ(33sԩi@C R }.*̦M b>S###1V3p``͓O?Ii>S?۷ĉO:qӧKW\/_};99X֭[[fMƍ9999'OV91==}ϟ?>;zhJJJnnnfffbbm/o +ݺu b| e.*̺uĠ_~͚5T~Ç=z:k֬63gիW8>>~ڴiblee%DFFJ9ԫWɓ:t055mӦܹsϝ;(?6lؠ&ooK.:::9sQF3g\~]~JHHݻw8,,lҥ&&&5aÆI[ T*J5BXb9eeeeeeב?TqPt5Prss7m$&LP(ENܼyĝf/_ްaC1>}իŸq ϏѣGԊG(ҥKq˗ <T#;;ŋ6l裏/n!f7_eG2oL@t5AxxxJJ?^eC"/^^^j&ԩSgݺu}U*yyyBX~}Iqǎ{۶m'I&>9vؕ+W OS$MLLĥ? H ASNd8jE@^xxxrrrrǏ駟ɓ'իn===;;;ndddeevYXXw]"o޼ᄏv4*IfbccAJJJv0.=R)^A`E&z@ ׃[ֳ֬YS4WWWUq3?.5#333hD~~{WdvK,9x/%f\ʕ+RMܼb2tJ u @ymܸQS&W.7ٳg_pɵk/_fPtKg޼yU͚5 Xb>|pR믿jpO(rgU5j֯_/uUC_wق1cƼxB>;f̘󭭭&?jdff>}TmmmK;K!55uΜ9blhhثWK3U~W*"QQQ*?_!CT`n*`^@ @/,e]PfrtmgQs$JQ9rIy3z"52rmf,j2j@s۶mKKK#F_E`͚5f͒76mڕ+Wˎ1B'>>#EDD9R'##4iҩS6o,޿Ȑ!mڴ>|x޽7nleeŋ9rdΝ{쑟Pr Tg+Š-D?|2%2Ĝ;\^C=̩T*ziHԣGGGG1NNN>XlۯXB~ իw->tiҤIO~˗//^8sL77[nsw>a„ҧ]"ooo+++1ܹ]޽}ΝCzyy=~X~;q۸qa#.\>}zիgdddmm_%.?/KeDD+eB hΝ;-ZiӦ*1cH!!!bٳq)Jpݺu_{5~'O/_+999;v033kӦܹswء_Kdnnxb0&&׷QF&&&ܶm[AAٳ}M+>o޼2u8pɓ'xJ E5=ZZ(j@C6l֏9R|7o 'ܻwOOV_>>!!!LHHHOOS} ԻwoqAܶm'T-Zlٲ9rŇxVZ666Ν;wuqqVˢq㶁(3 v,T;Sm=N>㞶J0w*~I$f e^[Ys#)lmg*BjzU/ jZA/ j&jL?x{{>L!gI-]TOII+##2.[7l޼Y˗/# j4T*?e˖I#'ObJepB___m'"3P=Q Rb i/ bJeW_k;(>`ժUȴi-ZŔjܹW^vP#n&-j&??ܸq֭FfΜ9o<-~3GK}/KnjK#|Ŕt7(ٳj; TGIϟk;T{/,,L={Yf P%uڮk״->|ۥq̙ZLIwq3P5@rrr*f=<^t)))Mq4mEΉ puu422uqq裏oߞ2?o>qԩSWرϜ93{>}4iʪiӦ R|qz3+PܜsJb͚5E233,_\ܼyt˗Cnݺ(W_tTjJ=hРpidѢEݻw===W\yҥǏ߫V2d5~lllϞ=;twEDDܺu+555//ٳg7oܹs)S7nx_S9p@1HLLV̪)*rΡC^|rM%$$Ν;3,XPkQNff#}ZLIwwǏsڵ˟Çvza233N\kjv3~m)>p@߇j5jԨ4 =zHJJ9s$˗ ؿ44yd-$/ѣO>}#GF-~'0@T*J///qcǎ 4HLOO=zA000ώ=m۶K|f:88jJ9rDI__Tk׮޽{ߗ<-==*t=z|䲳w1:u5k--- v믿Ν;Wp  {-]ĤQF޽{1c9iiij.XΛ)iB̉qp՞={&''so4*5ExⅷwN8 ,(U*)+rΔ)SŸ8ٺujHLЋ/N:T T޽[ \]]K]|gϞ<.\8}t.a@5bUVk;;mgki;JVZ T*ǎ{E[[[-&Pvm)^vmϞ=W%FFF)))]ӥ vfvС^zK=y… ܹSC\A @E.]|xX}B@ jؼ͵EP,_|ѮncǎݳgOU~w!44ի׿<==6mZ_w…cǎݻW/\oBYf ={QddRãSNÇ^ڲeK0##ȑ#bY … &Mzxh" :^@aÆ@ssP}}}q|߾}/nnӦMg~ǯo bbb<==LMM۴i3nܸUV(͔>}:--Myxx6iD<7 SNK f (֭[mot2c ә3g9sFK |Dž_EOLL\~Q݃Oj-Zh߾IV\y킂 .U٧OAUA޽Aիx(#510d9xnn~:v@jڹs!C䃳fС18p ?>iҤM޵k jkk;`%KAI֭[bO!''''''A<==ŏ:$-M(f (O?TOOOi[fT[{*fff͛7*5 􌊊{nHHȠA,--U&._L;o޼uI͚5 Xb>|VnHH[߂ \tIlcddT8R_?^5 5eЬYKJ7o^vm9Nzzzi`oo}g.Yo߾73fHMM-e>scCC^zկ__ŋR^Heo|o!22RHZ"Pn֭[LAZannY+V׿%œ9sҥKO8P5(?pРA ziG\A^|Yܴ2]VOO?߷o۷f;ϟ??|p)/%_~Q ŚPioo&{U*Ri [ܹS<,O# www1]?,bG ^VZ%ÇA?zim<;rHBP(\]];A-B@"߷o Jq^^jfJwǏ lgg'͑8|prrӧAP(,C9r}rYTjfݺucK.M2LWw_W/Çׯ/={J_[ܷW*@Vi\<ٳ.~ȑ 6H999TL7SDFF۷OEݻw722fo[oeooY-]Z,Y"P Q // &H+VرcGOԩhٲewQɓaÆ~ذaJqƥ?T6I?}T7|S|?""bСCFFFFo[Æ AxſoqPH33N:qyVnݠ 1ήP 8;;K*v԰vm͚5IIIYYY/nӦMttMԩ#,ܹ֭[/_YYYۺuk.]-s4h ܸqcժU7o?ܹ]޽}ΝCzyy}x$k eR9`1HNNA__G*sRbk ;VjtʕٳgWP!АɦMĶ3 <{lȑ<}fffb6nܸVZ͛7:uݻwA i޼yϜ9W^b8~7xVZFFF 6>|ٳgOul2۶m+}IӦMl"ŋOcbb|}}5jdbb8pm۶Ϟ=k׮⴫W7Sj$rssSiKQ&M\\\ʓ^~E͹Ν;W:G311UCϞ=ϟl2ssGGG7...k L0!..nԩڵSM֭Ǐqĉ.]#ܶm[)xqJs3#l 2007 }Y866~/fJR9`SϸWxܦֹ *aElWP3Qf@D 55j&jLP3Q똟IDATf@dTj; rk;W5r3[Y"f@D 55j&jL RT<mg5z&@D/ j&jLP3Qf@D 55j&jLP3Qf@D @ [Ν;ŋgΜU8hѢ}ڻ&(qK$Ҧ8FVA "2 +U,[A E U!.(jEtQ(mM^_tbl9y{6ovݡP… x\544۷wޅBP(rJmc,z?~VUUYz===555h3EF"/^-I 166|r9vح[ëVʵk cTUݽ{k֬Y#"O>ݿ:s挢(Tkz~oo`v3u-jC?- 8 X8%%%"R[[UUU"zjlN7u(gٲe"H$lvE]v9p?~`0`p:3u̡c,@ b {mE׋Ȓ%Kf500`+**DˑHvO9zh,koo~d2А^|w}0Of6޽;>>o߾d2xUUcةS7?{LDvH&"`03E:ח}'I9 Xuuu.]zչsfPEQѣoVTThMe03E")--MH>IN'fp\ʕ+ݿ ZJ>}4IΔϟڣh߿Ͼyb,߿nݺ#GhwDQܜ~`fb"F7nܘjH<O|ED*++o8$9)`޽{m={D*ڱcOye2ܶm[ 6GhFFFD6OrpRTUc|>ߓ'OpAEQnd|Ӯ޸ql6dn<|`ZDž_ 4$ '_4u%IUTT(Jqqq ~lUU^;whgOSZZxn޼H$Dׯ"rE8<< vttȇ֯_oXzh__KVWW{yáDd2yh4ٳgO](lһɠX E~w|AS_OvW,#[ð8WІI=ٻ X HND ,N|Τ Ⱥc4#2هa=!;3~""""":KL ?I(]~K)҃_U~@I'"""^hvk(pp 8x ̛"G"fJj0Odl3N6$b3[DDDDǖfa)wc;9lKzY#ϗHkQ7%% 4Ur,?__'U׉uk_/i7d׷e.ج`A3l#ϋ3$my7EDDD4&= d'Yzxگ&Dr2EYڹ 6cThzX 60Q oFrdNryXˁ"]^a8<Ee )~jڲ"KT#ONivHNF-p=eP -rUX= Âlm\GtlF6#e[q={ ?{]"""A7dػXp؇dKdeC,ˏ~  `S‚/S P2,@Ϥ }ڷ+ms,u]N';`ODDDD]3V3| VJDa6ͶkH1J,X}Ɂ.""""" IѯREDDDDz,ZYN""""M;Y,~D(@[DDDDD:-~A[$"""ze}CjojHQ, ٓ}a#"""ze}TMMƿ^PH [W_JR-b GA>!"""ұn@nN,t#C+Um4}o ݈l ݀? """/8jA6"n@C-""""c EDDDDrLAH)1"""""9 [DDDD$d䘂lS-""""c EDDDDrLAH)ɱB7@DDDtnSɥTrDDAH.\C/'8mwK8 q:~ѪIp\A@ vCAH.L`B#Z5Ieǟ r~ 8Ӗ-)Pk%d]/턂l\q-]Q >/EZ*=J":nÌѝ ޮB|caXpg2* `JY)i=1Gud a/PL~B5q,Pe 1})5@oB ]9CO3ĸJYC-NXcน\]Wjٓ8cq\ck`P-"K(IN-NJ? xj1 eD x <8v>qZ޴H^AHeʒ9 F3KF"vlCq!JYV{ vKj/9Nr2EabTs9+[#P-"[U)K1W}@`A %Ư{cό!G1jOC?c[rpu@z^q>!Au[0$eY p'p:!{kF3xxDZ - XPB:62p23Dc}M8c EDri3p,?p|R-&v%Yw~ *9篰~cyOG?   TOBmO!&zn9b³)=n;6L+y83,.@` 6p>p:S8Tcgc5P^+Կ^],wӁYzp6B,>jKKMdRK ~~%AJ9 iGbQ6Zls6>O?( wVŷmG, ? tgXVaak֯/_X6|uVd [ګA$ncX/kX[XP܀b`ӡg[_c?5}dqXbAX{6,^iGz{p?Xv1,XD{ARooQc%0G?Yv ? fL! ;wK}[Bb^qvc sxnv oorr7,0`!1Oa;&IBeMЉTғ݉]JH/= S`x9oPB >c9n `\=LϰύXֿx?K8{Q;aA{@ IఴJIYI{"X}Fdy"Ⱦ륌:o&p/PX}a cNin ƀ큽#{bM/60q1OJ'|aYVae;CL:=,~Egv1wqA <H`&&Е<}݉Uq)*uzHp !}$O؛p<,e2Ù58&Jr5GS{O?Qıj#b9yOb`S בڶ.òuє XJD&_"#`ݰ^X*O?wzAX]K=9?@`:/sp4d-uv:A Ə)۱lEsB 0p!qR8JSA)RspzlJiZ\1!qlvbeHPE)Ȗq,}d\MZ I6ˁ^XrA-ml#%b/Jl'\Lz?&Ich|};$EөB'qz]ơ M xPdzO|eW!]N8n38 OLjTO3p%<L ml<a=`=ٯ58obAفX5n@0>YI[ P^doMY,ʜ7s!p36e'&SLn#1|Hch8>q 0c8^wsE nUrؑRnXc:AC_/1p_DӪK{'VoDǓ=,&7xɔKI͛Χ2bLHocs$NK6t:VS,`m v§XQ'bXK86~B  .I^.3 + {ci}laؠs\j0vѕ,}0Ţ<'Uĸע?g)A8&r !Xƒ;ƹ^@|l&5g*Mj4lifa'v=;ʣZ,e.,`y}{9V#:I8+8+w#AsE.`~s& g,~?ލʱ ~36͑98vkMV]elPdBޱ!ynpl:6MX( Wڒ[Q&QBXgsz{k0l^%aJW;c8zj0er9P-4`?rš-ﰺԛb3UXɾK#m^vo?G?,Uc ,} EnJץOnp_Vu?ԷJv8VcRce`_?`7{dio[bRl͹] SE.2~a]BGPV汆mOR&pV)u،rIHîK>Nd و,`2|C )͋ѕ#cy 5kRՒ)0m!-gw.#KWaӸ2c4$GdK{r{_4nL`&c5 cVحeX[GX/y~]h wb=}+S:K_W_Wlזz?}ykm:N@$.,@x(3HL<- [6p1.s݉*38va-"~anG>z5OZU XJ2;;Mqr7aHctf(p!/u{/Iq3j5W# CYʀ.vuŸX ɟj@Ɓ'~FC6m\K<૥&72"4+q|sdn VqKRmLIBQr/B&:M:]ibK0x׀"P4PPWBkA:组|Y|ηS-"b,'j;C35c -] O?W6(q^'}v;Jf jgD< kq'T6seUI+`^/૯ؤ4).lYѤgrGLK]Q#^pج:X/avY{\4N ٨~[PcQDK:UHI)$΄@ [D$Eszt˵LT5G^Ȓuf!b7;xK4VbGZqB^3ql`VxX_1;\O)IuVȜy χ Q=oUAtYڀ8o`S6Wlҙ"ަ_%XM=PL7gXE0h*uiquS6wZBZ87YNc._q_ӻn D!""'nh)KhnKO%v}o`m*l>'`WeRKy5jSUY$rK#"1Tgc.LbwO|q Z0{nPv9]{8bfXR-hsֵ @n ED}:GV2 hw;j`w9$'cN_N)NA$`B7ͪ$1&ɧWHO:8q0[(c ЍhTv,08GPv X I10ƻ46$u@U)|y؅.-LhCWz@ QASI!9vvk1:B7]Q0P+~~ W߳76'j>;/x%U [D٦mR1gs09vΝMȦ{Nr5#}8\"i#T]DDDDD$d䘂lS-""""c EDDDDrLAH)1"""""9 [DDDD$d䘂lS-""""c EDDDDrLAH)1"""""9 [DDDD$d䘂lS-""""c EDDDDrLAH)1"""""9 [DDDD$d䘂vi|(=ws픻En 9~Pk3ڰ)sӆP6t|Ņn@ṳQ4^a\<<8ش^@`pWrЮ\1sUu<'mbO75Y 59-oCsU8R6t| -9Ѝh~j_bAAQ@[ hP0+@pp8@P֣ AAeۺF~\vmOd? t0MerXnuۺn@_p7\5?C᩟`RI'tսzAýW pP\V5AqJ6F..~"%i{xJ`kpkoΰ@^cH(ȮmL|/݁`Yx8N51p?@nn& ix{b0}HMp/o%^v&JoM;C8?*3r#ˇC|"H|/:._鏷#2@8vjCپ3h_C{_A@I0"iM | >}P{'Te <\$4{lqf؟f`s9XR?cH~ JoH>hcEEFN`<˙lyѹ6bKegF<?s}sĊ  7t EC9\k`vqv+SurM]>n '~@(1 a͵'>?Xpf\ \ m@o&oPB_luElxJ;6.<swAxe걂 3,},¿wv@@Ȏ݀X*xKymhk'l}x[nJ6v ROvvKu'C!wܞ ^mǹzT8 ~{ k!W Ȃ3`b.%,gFw{plY=e#9  ܒL )}!OAٵ^\'KW^ @,,Lی -VZrQ/ S}{W^ %Y*S:VW"WC}?;O-r\ 3 U l](j.0.&0tJ=wr]Oh.rb$yc)n\54?כc)g""L [n>_5-hm ̋H$(n@~ wVrѸAPGcu*{F7O}: P=X \ 7$+;&5a/07~loZ4}*@9ݧ@9ŠHk`8Bס~`M;VSGqP1X fMiX{ ,w `OaAP_Do澍;nx'&+>5 EDZD[ (ː6Cx]Oρ?0la !zEP=io#ݥ]~h;:3(b8` R>W= ,췼{٠ͨE6+"@Kn\1pT >i9ஓD[Ae[~+q {7n6{-}fP˖eӫ',GsjJPoN|"UU`P}t7GDRO͞|Y%JO•Clw%"`tedvXeF&qWb=W Ԓ!6ڎ{?1/`LaƑ,{Cx6VYz |RI⮀,| Nj6,¿zZxDѫOӃSBJqFw2¾os`J.(Z{c'3X" =YXOmB`?ЃMHM+ӎW_gtK0Ϳ D#@icDJ; 3 )p.oc] (.Rg{ n;ǤwrUv瀻4S \ִ6?6ܥx;4uEX ~/DߛO#!lޞD`wo>?Iwn9ɮ:HǤlk俺e-[yy˜Xd%K^;|5_oKnX1CiS+|NlھLlऺ\56nJu)B(}muezJd,9yRKf&L^9WLƼvn>G㱀.RiŽ]io/?iLnquM/Xwp;O7>xsXx=a1X{>\{<,2d^VG Kǚ9`{z=]ed?KJ~؞>]16vKuI Y.Άp7P4Ə$vy.1$wDD<٭f+XjŁ@_TveR>'Q.\ 8@\*!<җ }J71p $G%ߜu类I4.7+e9;X# ̶'`c'ބyߧ "%iEqħ.Xy ot8Ji5bi7C&u[vb6%w5 adt_C&Nzdu{ρ[{}Ia73EPvrueA`KP T.7Ḫ=tdoL|bB|6';SPs6MDW+a=!VXvIdK% {.0`,Xwl39]"o@&z$7mS> .5ED GA{ XncNd*1; j&/{  Zu˛;}$멿C4?dC ?&I̶)>_NK;ަ,X޳|7ؠɹ>>?%Wan7.a@7N2DswzlX}h)"(q_flqbIq_(M{@F ps]J]|c~Syuw:},z_|d}>e?A췁bq4c +[ُd>t`d2N{vc`0=TG%`}DD:"" <6 ܪ.!0%\ex6a~fuX^1 4601yX}zV'd`DOI LzfϮf.\Rv6}ONؠǗP}dS󈈴s E+;R 6y^{L6QưY{ ^$Y woH)6m N  “ \ޙGQ}>՝5 ]H"*(:"( ꨯ8::(a^יqm0À, "KP0Yed KqlNHH'ruwթsNUC~y 0]pY0ZGP:&"{yuU/E%DJk4MGlFSGDE@eX C3XQ).qUc :}z 6fCxnkf n@UVihZdk4Md.#mW>D x7{I~` ̘1C̘1HLL`Ӧ١Cj֥V| IDAT6vҥ4N\N i/;ɷzK8p@fddӧOb["[h".SPΗd-zlH)q\Frr-7.^l;aߛݞwVԢ(>Y$wMmq1w~#wLi+˓{kI8ӪrRJS(i4EFD8!"exx'TJ7hr6sXLkEq6b%%v]n[\lm\u놇ͭ7^Qb #sVdƸ Pr<Юj4FшcmiQYbZksfQ a l) [i#fWJf97)e넶6L~#iiċWSvycn :ihh4dtl"b/#h*hI@ƛ0pkn⚷ja ~#4M!@>\8$%(O>ÌҫٚƀF؎(<_UkM͘1c`öBDKh*cDBi&1 d{l.` efi9.I)fDY)NBb ,2Ř"π+dkL:={0tPҘ:u*>۷oL<o_ݻ#pys[[|,vmw}\{deetRNy;w.}۷oGaҥ|嗬Y{km6֭[ѣ:ubdgg?K/ʕ+yw%hZdk4 ÐrD}OCӸp^D:)))H)aѢE8ZjŶmXhFf#<¤Ixwظq#iŤIx% =z4> !oo,_,[!C @RRcƌGy&%%رcG^8,Bl! i K#/gѢE~Q]3~ĉ߿?ӦM{磻 ʬY())cl6pKnn.<ɓ4mZDf8us˖-פI(vh'h@xiHH&ef=N'5jfb˖-ߟ#Guq饗xbƏ7 … Kѯ_?:wtrJ@ Ν;3x`*һwo^x<v)%YYY\q|&\h^߳4z:[}#W/;n0 u]GiѢDoȑ#)))W^)ϭO>}ݻ /ԩSy'޽;;v`Ϟ=<=z4;vdL4yz8qb]F-5HGJ+3ff̄88odgDht 6EvHvʌ3Qx?ӥKs),X@裏xw0[[n3TnݺrXj;w &&{ a,^^{9sУG׿SM0x衇77pσSNp4-5Hgc..xG?0x<zqxMMtpN}ϩ!SOsL>W}3ŹM:G%bgf8 )+}Kk0*il(0Ԃ*q| KУ&cK 8&`~A,Ҿ iE "Nupb ~3gh~߰|rj]N]h4~n] 8r jbhpHTc%P x xp%U8UV =!Cid gJNijfI >VEh48죎DP lYS4uرc5Z:aU16s#LOTbT '${Mʪ %M 78%*9"H0;ZmŢkQsV$۲& ޞKA|o`wLP&uMHcnR&a/`t@=0Q 8} ]YjC-Utgᥗ^׿uDe4H@E4!pvG'KxUt$\pQV(axH n ,Y9[;$LoT4 pRw7C.JĚǶ]0Tȕp|C͡J$\a}Y B]6_>x^EeDY`q mBgCE~av y(6Xe*[|>4)< [Pct<~2t NTr(J:5~#Z+loNi;Wc&/|EEEOtt࿏]v׏+/V/+5`|̛7ɓ'ԩS˴D)M`v:K ׀xDߚP>b^ %5ӵ|/I P"ޕ%V'ʮD8#KD(+GǩUFEe%)P5BbO 3Un8saZ;yJ?JB~ؠQ1]E~ KMqDTN.+ E6ݾ0hWenFʰec"|JY>cloW_}C 0uqJ[L$`BɇxZѠBp뭷2ev466Љq:$ج'QS Bжmjgر#;vdر|<\wu2\^/mڴ⢋.⢋.vl2-[ƻˁh֬ݻwcǎM7DRRi4 -5njPx1Ɵ@7FAϟ[Xj7 9a>TDK*j+`oB q𝩢+ODve6`nl#DLSƌC^ӧitRFY QQQ\~\~mNb9rǏSTTt'Zdk4 ݈Й*6AE}8u{J1v{$%Fբ_g\~_p:'/N%ևIFN5 SSyRlaUU4BlSYk6pG&| ?a> ]YS|kå: `XL ` ['DJ`'we(x76m_|ij*.ZӬY3WuCh4 i$PPTfegʚ/CEI,"0vB- ݅]J8$f#|wogT! okEpB%jKX:kTdKku.jS2LNNe2g+f|}%]aj3h ڶmҥKO, TuCFSh4 &"[*qXBx3;+jgE:} J<\S p#lqVPn@MUXl|"[HwҙVv G/ա$lF*m9uDTyDT>ݨڇ`6lC a8>:tZF9h1%N5(H#K= G%M8G=cمJqx!S(JHK " Sl #[,=_Kvz X)jv^imWƌ Om?1СCٹs'ǎ[ңGj43dkR ?]!  -eqnߐziqnX4g7`)86#_8Rvđzq p๠f8x kC-\,j[ -Ā.&Kjsf|քg8*@ Qȶ b/(A=REpT"{myMUŦ0|T֜arm̥s2|nzZk4CG5qvw\R0b=DCN~:l=4r:zl3{aL5rG.5BE˾P/@eH*HS&G8@mQ*[@nB\u#] 8*&J{(̷| UT̈́ ;wn8p`-HќZd|c+ D3L|p#5C X'H9D*˯r$3HKGjةblFuEl"{"dy )pmlA"[2!!1:UUJ%J=fbb@$|.F"47NW/ʽ>HIIa۶mx5JIOvv6}F9#hَPiLnLPjĔ2oD.푿3r0J)zL1 ! L NcX ̹-a#EUsf@>0`BHKWjN﯏'~7!WxMP*('X)HNpUxR%c8HGÇ|jK֭`Fh}6;[ IDAT^/#+=@d %KTAnؕHaȱ FebOH}!G[x}Jq]BL>(յ;`̙@|n21+#﯏G46 ;!7RYesnmr0EH!F1sG,aH1!V[6"jX#a_K;cv1 $~ziu$[r0__XvUHJKKQn[8>TA3JwW0/[&$bb !A};kJ qdgT}aA -υC4!ӧ7o&%[nGg`V:HFR$G6hM < [h> rsqk{Dl ˜:%u(@fטU"gϚ$h4uMCCnnY"+6p3y'%|Kx A (^,SE50\,SO04Dw"۵>%ٶmMEF ' /I[lmXRT݄/c@3 OpOKS%0 NZWH4}jm.FR=uw֫5d:4phB;;PV2 pBņB =ތ8 Ȇ)$< )щ@@f0JNgj>kj@֭9z(Y~$&FIѠEF0tF^V9DYV< x4]ġ׷MAk{U U 0Nq~'uarPԂ !ftɨO[&< F٨c]PnᩦуC*))!::Zh"-5HR V(0e5χ&Vjf@t`@XPR 0HBd;!XK$d,U3UZXYSzdf{7Hy v$? xx!_AzVsj+ؓnl$:}Z 0JˈNߧD.Zdk4 EE1f +2} OhC+΄+gq@el`.*-Th[Nv[}9^w8a *ʱ"fVQ]IJld)^VdTSX3"rpDm3.7|_l"`5FkN;)zW@Z"[_$;F|`߸ƙk{Bp&\{le4~vP֐ֱ2 t{lFr1}ڦoe^'V(U~͛7ӫWJk4Ah*_ {PްDZ,.x%JJ1R}p+m TM8* 8WAIp\wdӊ=J%S QD 4np;(&`9UeNhsXE[HX|Lu &9֮ sGU=MQ?؟Vt|RE" }^VdxȞ /" 6HH0m$x`K]b]{( 45XLqA uNrK%b%pWY|5!-'p8mJ;+'c T7N턲nBݔH1E~8~\d?ךs5zuڄK,ow(+j͛STTDqq:6l %%TFShOF6;ɡ",v>0Д"*F"#|Ru.S{TQV^vCB(TR/0H'݊S7:. ~ae\?O( b8PszI6־(s/T *m}X%p~ʉ-w?rp{qlq@S}H<ߦ♦GIiPosk aiȋ`РA^K.lF4HEG5FLe"{_P|TShu4xF> 3H˻ ٖ8B J 0#iK;z9CP1"ˣ"2L|^S`8-²v$Rr/8P$#^=A ;n6A~n;yXyJw,2D;Hx =k0*,V9ЦX-TW\_|QnRk4z@l&1 jT%Ϭ[E,h,Pߥ)ȼY^%2IGz e(_Z L_q#-s_`ue7N bZ\'6Xm66UՄ}۽EnZ!eKim$܇$iƩ58=z4-*}޽tԩ#4M$"M#̓`Q d%v/NREb[_o-T , =ښ˙B*[EPmaKE/JLNu7gg*/4GmFY"T=.|'I +2,|l Q&-׬H }0(rZja9r6mT}ѱc&Бl&ⱝ٢&G.Exf ULڲ8 >.@Y/R2 5e`Q$R; Ɯ0Eˁ?],kB:|+b޳ѣGW9-~l&"[tZ~i ȮQpȇETg]U4XRL'4@;`ᶷSUi6PqިXSk0*l^L0dlÇIHH ++A4Mhbv.٦*^.ZV&KYS&lXOJ%0ن&2Ιdڴil \-!a2\/h_A<ϹӧO.Ko%#IIT+uBX)/E10 URG Y5:1 $ӧO=U"[iT*:R-*l j]}}ol|yC/to4D# !ȐRry;}󄄜 ǎWu놇 B4O5@)+E^qYrN4ލӧB_KƁM#2-KT쮾4z6xPTTNq0h,#9p`TTO6wúFGy6z!ZFv5^ *V?mka^[\;q%nlMXx"u2붦вsK:DG{h7t-5FLev 0`C*OW*D ;#B>@kQ)Xy0FSBH)r<;))'zPI'lݞ#w?׫57)}IcwFy<5s*,t(QEFӈ.bh] ?4@*`k aݨIM#٠l#RJsaKgKlv(eq)mۅÇ?7TYTXT\ω92]ԢwĬ] !Z"[iTVB2h')U%"#N$`'-Svd鷍ῇ<!IPI%,qup>A{ 32^ԅAJӔ.#br*/=qMw<Yg4fh7^BDC< aP׮hSq0e<m#Y`Pv#` HӷI11mO~dPE2 x NÚ7e/<Ӕ"{/- U C*t0~ᆠ=x}65FP`pğ'w xZg9X"Bdw(rO9DC6˨ aC ю,Ggx|qy{K]ɸak;Mgwl^\5 IDAT}/"|` p]hk̀CpBC(S} &ThWL"US2KbۺIxètqu\' <*`ki(6k$cϗatK5W#_8MboP3y@}!_~w3cGlIc0>+7  =u/|w_Ե,{2]72fw K>74?0VEUk \hJѺGb"0W6Ҍeu] |0h#S >k)i{C,w]K$;_A$Jɇm8vO;`;Pֆ(ʍ"#.b)Lpxʇ6<:-.ļw΄Z nXHKh:t`ՒjjgޫHt;M~VmbF)>(Ozj " 3ho / qx7XXI5p9IͭdBRk*Sw6<  w{ݱ-pkZe fJ\j<=CgfAIܠp;Cqf_k_0O.rIj*y`~yD(V\ Od{7W,OSGᝮrF@L qn1ƨy3&K-0Zqkȇbfg%7Q0b¬h{,H;0i|Flr1r`l 0vjw)\$f\> X5vqF.٘XUPYm]p:GqֹmUd]j6$ 䨱 P*SV/]kHa`T HvKF§fPw =CcW<_ >b.{Ͱ=giudiDkC+̏3W "-+'&.j JdwcJCajã"K2D%Ѿ0~#/), DS? Lj6&bD|40SՏZoG0"Dr>n1VL}bzjQFM IvE ?h>ꊪ +lZņ-]e2>uL߷ TWٰ4χ,;m&&n'~6$JR303 mdhY@[ Z[n$ۉ }L_0߿qac W Yb1m"/8Fsa``0#|]%l^N";fU~Ou0b !f`r9r?z0L,Gd6u7I/ų7|'=<*"߈+3ᷱ~-|U}&2F&3>87NGp^ /^ gQ^ۈIs] %5~XxO/sh1&)L)0rWF_^kQL` #Zb ,΁w-h }-&cQ9 HuOr1x P 6bG8p(F_/}OiqPnPH|o4\>R220fH"Źᘄ6y?~52.3hvW!w ׈ZkՍKFDw"76&wCcK)ȔC2Lj:Sܚ71o8bs4e RFVg5\fsnB^JCC0ZOd{ W aA>g`>ނ#DCDub+yūZ7".VZ8aCX^PNsN%X5펩QK] Z&1䪔PX!1ۙ32H6]*Eɐa% :NWpg0t._dZuzaae_ϙg5V+ёpc>[u5Qf (̵ EDm^_{'ö|O^GXG^oDD},DE0WIHԭIw-3,^e1߻e\7w}#.n>[/|sN@ޖ8% "Xk A,yy*A\ llKn}?Lz#n3HAWL-[p@`´\G@D$l:q!']`W`If,mčNH\*I WYDl5Q{^wv[{!*0ajĻ /5nwg9f|(-p6>[Mc saH Ti&,&fpQ yyyy0\DGp.1S⑙0؆~p7z §myptpEQaum5.2Ĉ˻ _̠Ts:kBO #D&7jaĚؤP fx!XaQBaW`n)3-#_̈́@O1٘ن;Ğ lh'15xڂ#\—bqEv.+Rdsٿ=,Bdc$t,w x_+= 5-@ qOq߰'O^YMj~:޾&w[rNP=8RrGGƆb"Iw,Uj`(vnߊV -$h΄cӌ$E_dc`VdQ_^Mڨr"GӍb|۟ @f@J4K/@bH=n_>1֝ }>"L?@Hql!Wdk~19֒#f}q,>m):nXjD;e#@.xx[F_eՓ`6awҝylʰkos<'=܄3W\Z.p"ĸ;5& .~P ?ؕ֒,S~Y}8ۗ" Ƴ X Exoj|1Mc);pm'D6e]gh}6Ä978DG}x~TDY Gz@a(ƿk i\fw^ V+&Vg;JB!Kwer:1\7 ad׋)$gL-5!QLkŭ0Wo*jB+ƒ=nXu#T];%+\|x_?+&M3{C1<\nNLUbY6cJ;2g62}l(n o,QOsՔT2}(&Aۚ"-]i>m+,rk[g r{ܕ3_}ѽ&wYoR{(zvj%KaOd{5T0j`,scݤsHCV6,u˘mWL緁wx)"yUlckVn2 jZ~RY;l'7(b?е$nhn+XD-XͨkWه-p?͎q'c=5΂b&un^uLD/:;g rD Nx# >ȅggB~l& +6:P3|6|'s*av'A \H͎GtǹlHx!8=x"#Ba-b LLqw[:W&cJȭZlA,x$NU"W-rSF/Pr]<j*>ړ6f޿PjHiAe9x -U Qri[v̽wlɿbQt aenƻiRkvvteo++m5^ !ieuw%gIWDǁBEtjyȸ e8K+</Yɣ3>&-JhkSVV] @\א]+SW>gesdɸWKzT.<͔5=7uxf&0} Od{xxpPPheU<'y81]T_Z?u]xT#iub?O¾%w3醦 -^Yqj쨏F?[sWSg!x|)#viy1<[K{C '=<<.6ܮ]6]ˇV7I'#O?g <9-DQc]Dls=՗_-iŐ`=vl ABB5;&B'`W@HxsG3EYǢ:7-v;i{׻fJ[vfg ?v5nFCZhes׉AǒcQ:4_ Cc y׼<ӹ<˹v={ͺ|6댝$;-Y\Y,_DzFVt,:Ǫh%>zxx4O,:ͅr?-DJh"WeS\wt,F7uW<2qxڮ&9@kGV6@܈}j2<Dq\2tVnEiL~f1#:4mr"j U∬zfX v6红izg\7&~1pt UvRwgչz$B@P!Lݳtړ_݀^*U~Wi~ _b~Gn`s qx2)߀(ck;*9;}LyH 3x"c"c]Ѱbg@St,a*|Sڋ]x7/fұ Q3:-cۙF4=culY`=Wg!YPP)#3WtSc}EyxB(ϤWwe ऊcoȟ5l^'YNgA>WX$[Y|y0vbVع縟ws耉dlqB^=։33!*1XnO"z!_pU~p' tEXXb ?s0H0UnB&4Pl{B IDATy8:ou,_3ܡ%#V%/f"j1y(O 8eY$Us@놪ΝZbK/dqqE)pc{ ȰƃV("}QnUQ>llLMN/g62X<m%悛wcs/GXf^9YQ!?D^Nh M-4a8lr{zQOh^@ˆ~?;d b[8, hl@pnH#B(p&aݨqPŸ^ʩA(?bf3&;vUX3ȣ;TlN xA@ PeK<ᱟ#YũAMXa-u,suc_-_?ÊayQt6?w5܇~`Cr}w ~A&?Àc_WK0Q,pfaknZ&&b_dGԺm[YB"f"Ti7pAb* o+Mh䚸Sjp@ËӒP_1>E7X$D{;r6;k_±(Ԛ(y}!0i~R *!BhL$t7BV9"#“N -tΈ‡şz/P,/ qH~UکsF?CcQV@k{(=,T}}M_ pW(w>vLȮ\[if0Y8BU4V#i,Ujl^f[ .5aE{*#,~1rUCZm""O,d,z<'0wj~mV|UGirx(0O`pMN!M``PZpB-v9RZ&'!>\-@qhyF s`f~_n?ly Lq\0$ɕLA)\յ$b"=W oV;RSaDhG!H?撃1f8 *V|" 5P아&B]_PP;^py`%1QEǪUkZ!ZE8`#Cনha}c{=8lXAs2lC?dI~4SDZ(p8hXvp? ܗyy8rΑ=Q۳+);2%lUٍ {G`(?D{m-eUV9C` %? kddKJ q l1sXlI(78.s?Х"" 68 :( dDM#8ܸ2LAL̖:1i9Y19&3SѦb ˁׁmbU8Vy|%ݲx?Fk/?s8]V\`2>[ޏ}Od{xh^:_qӱD!RJuDE& Sah> z\9jQ#Z[E䊅z-LwDlQ,dal%DxX#Sv^Xl+~cqW1[!{yI/;'ZifZ^al*EUa3?!L,d.ǭ oW_qP6e|cu3͙,~+IW8n?O0%ߵ QW@, •,<їg ρ9 q$%pG5S(v몋8rX\r0ߢElW fEl:cS9ʂ.39@"hd-P9;VoePV>Ľ c8Sɤn(#Pg7gjf %(Fj9< qQņ Mڀ3Z90B.,-aILwU?Jo࿁7D0i9PD~%Ap9ְ(g!`52  | <2.$ɼ(ٴx-Qp+%fs;5 *FەQ+t-l]h]pRY:L&8 aPdrLz<AI|($[OUy_6EnMg 8|j[_^bf<γ#Yγ[:Jg~/Q9Gڹ!ͤ^x|@E_"A?goN;":% [U` |U"XdpU9kaQ(3Y H;@0ϛ*T+JY~o3T8c[IJ_ =1Ζhb w1p!ʺ_:optZhTƍ"[gpӸ)gygs^%p*RW jm58\o)n \'n"}JF,Sʼnv~0nnY2W#WjJ~)|> qr^׿?l} ]J@A22(#,b~0%ʀm『2#In')=^GaCJ w8C}xK7TNA}ˆ]bm"Β0,Vj奴v\8"qnS19 r$09lJ(?d~8媠PNrgS `AV7|A~tf+YžLgr~m1+ԩ~x.9ہGUaJi?KUchFl(2HMA8-0q޸<+ ߬.7٥A3nZKY.=ٔ: >/uml0燸RVT&V$t3fP.ʏ(FNJh6Ny56/ 0P.cgMjR"tc'(OPح[]IcK}[|leV%bc~cTkxrAS{sq1"@!_` n.fj|vx"]uyG<: -JOdNUvW? Q|R>,хtE{e/-S@pl,F.n+nH崵(V5rZxY˘`'dmIu*"ar[|(@e/`SDJQIzv0PP塠U [4*v{D2YW&˪~SfgHe2@=d*.2WP Fs-:!e$OBQND_?2^u&z=g' \s'0?F _+E?DoMԜȎܴVaK筂!)7=3Uֲ\ÓSh*S1Yn~M2CD9K5W.$PdR!2Zs0YNV?Vwl|HȎ6Ŵ39LM B~ScږDvn4)@h`PҲ/H"_$EVX`˙E82EK<Ѓ5 %D2ͨvF`\A&G&'OTJ $‘Z06q#Q4` S: XRdY\BU][IO.Wt]ժ"TL$*Ѭz--=(B%ޏm6tFrAnzrZd[0QA F+?eqcWV[UȠs!Js#XֆLBþ!   K@ @e)nk}eAX)>`f|ǗN A ;t ئٖe& Z<-HyEYGiSA*K(Q^oDg:|qPm@mƖF`EYS1OPxs!"*Y8c r\  "aFeV0:Y@:xx-!OF'*Ea d2I^huM$I rr=&ZrDG<ōȁY7ԝ;n%,p,F]܅5Q YdDj9^R bSS`M'@"ʍ}Nb% 2zIgf * CLj^e&"]y|*(*&Gϟ&jZ* 'cPKؗA1YՑat Qnڔҡm -ub?E"<<}}b1`<6e #Ulp?d6&jZnf {>Yڟ(k&0+*x*0QƊ0^#3葑v}=`E8Q~n;p(pIJW#coXΗPQkmtU{r \ ]|r| R[XMf( $lr0߉fY,sWōGgGޱR^eVc;J3:w ͋iz(wc)5|ugS} mUn#Od{xC82QpL^q!O!5@2ZUdDFj)3";$ JK9oXpJA9K5zU674G8eɢꊰ5l.kjcCELw/^P(dy;uLEbR:kD XP߀" 91"q8tDM ;gERY2-$T)E32'Zў=f:#$0iovn|~@OL42Zd E@+U/bj}HM53F]wm1wmQ;hH^ $`)kì{edШy|;GZ05S0p**l rD,e'}џ6BG =G&0 39Vn~qÑ8ByϹv6ɋ2^ 쇚)9A\TGT%\@ȹD'ZlT2=S|  #7_|y%1=Od{x#rLOmhIHlV6_:8Xp6К/ʙ:85c:Y,)v,~s=DٱX `:1ɛ1B%#Kj+j nzڟV&maX,6b~3But^*Ney@!H4pMD>NE*q֒ҁqCq$N_s;w>aGn{p*U:.OTx"" 2 %%1N̪lLIctYTڌ]"s,L΢*|C`ËTo$"AI5ϘRܥ(ܭ2d((L,ˢ#QN#"Io1~nd18밎~Knjľ>:G 1bAPHsYX)pI{'=<7u;ɪ4G,REͣ9r@e#r;M<,qF2@O,: fqLj*gu{[[\.W)/"K%>Q)0"-g@ ԳJSje~({6 KLDo/^/PT{9p%Nȶx>Apa k}ƻQ6 V;H|܇Yk-DX\;i!?XV:@!V3(eGT`1&j}Td<{Gri`^2-njŘAf`p7)465F!+yYĈlQV Uy#(a]mڒ)~:J#ܹܳ'3>H_B"dA9BaIE:hoxapa5P$J>&n0$?" Q-}->~](F#qz̝c~7O0u#w<ܲfg1Xʔ3}ӊ֧ &1]jVŠj*1+܀rw#ƯB0r |)eռ|8\&{}&fs h9m Ͻ%?%8 'TroM6\t¡$&Ⲙ˭]5ΌDs̲\45ف|VQF#lU,Ѭ”K|`4hNpgFeVJ Pfr_u'-Tu躑b ^ET ?R/n4GW yvU?yGQuq$U@tDz*7"XQJUZBQ bD feܙsgf;s|Cͧ)jF.n M!?&W)MLnrd?ZKnpKJΉ9&] _uBq I7,=@9_ә{\FuA)Bp3bVG8737N<pVtH'us-mX| ,I$ދ#REwφ'jbTKWzѿ[ld\nq<"zzGE,6?IڝbN*A !UxXe#:nL ٫ae7#agZ}NXiRa}S$RۍPG> $lЊlhe#;od"̺t,lXX]!dw[MJ׍1+!##≼HV"8QfxԿ_oMx f8ov 0<x$zw r_;Zo'yvϮq,pK݌&&&yQ&#{W'$88 /;x%(^w+% VBXxp#{Ko5$AQ(=V<#`UJ$܎&i^#sI3S%pc6s[#@dAI`$Ɗv;e3{6#PBmh2qds,+).k՜#ι=wR fպC[Nk.!]܇p:|yFd|:)pLHV$8|?M/fѣG-y 'gdnjqǥ䲂u&&7+iHPwo3*.y=}l}q @/!$QgI#Hzkv\7S3^woXj].9lf[H &&7+Km8c+.(2w/' ?hD[ܬz_ >y,X.h%m[_VbQk}IכLUmd˛e.뽜=&-*k,]ndݵ)Xe)!~;Qv$ "[I) 0Q797nv>P11ȡ8HʉؐW~F]<j٭Q̹j1W!!ӨaK0~:FA ulV4'Nu\:,TPb-Jڹ!)Br ʧCH̫[w ,Ch2uV{R\\b\X"(NwGH!_EM;rHx?_0_f] $XU>- :J|al_B|yZ2ڙjHtADPr,m$9gҩ.0 GCWG Ě4KcCWu:Et7 ߯~d"/18i~v\^161 yI'1_2Yщl%""&v Ikd( l<{e5|"e3'^]b=s\oB V>bXAotbbr͑)"G#1D#(/f05q,igK1y^ΪQ}c cUg"C2k0!~řXs*^ُqR>)K\&n588`O14g璦sIywa6!ȔïEՉ7-L-M\@lQ rrYc?)Ha"Kox\3'vDETh&J`y=&&VX*fo>G&d"IB+ HW=h9HZ6${}5ٟI Zږ #d˷OSEKV\Shn96M0z>.|ae^s2}&f ?[9( ,BNu3 "~^耇7~lN7o׶d %Xp#x | ~31z9qo0rV[z]ʀDfk)MnE"~ُ%YEb>;CXi<-uFBC n+h ?FWx>ΎYqDT011;Lmr! A7p肇2~GaIPH9׾(${q3ήw促'(!jHKI?-롘fɭg.\>>n}' I\ I>]Om㧜(@ p֠})"@.!$~l[s&C,8x mF)ޭ%Ư.+ɿ2;G^ܸ̉K611E0Eɭ@n6ɾ4]iم`$ruPq1C ȗ˾T(aAGW/{cG08+T=n00.ʜ,B]y=&$b{P8` Q$~%ts9.O)f*O ,W?~Hpޗ+'PCZ+MLn9(Bx\щAgPLLLn̘l[0>Be$x8B=|xDgc|2Q'g 3H@Xդ+A9R`amAAꎠ:[Z܈PC ,k  p[y¯oI6a3j垐`7:"xjVۣU6{+BygiH0X,D]M1'/lv}^#<] ln ll"fAy=<Eagrzf6q,pCuh$4w !CBN;,(3]U3"X CI[1"G327qڈ]"^tV06DGRDegw OF& 5=8`K8, \&nN;[V2x+,DWzr&ţćmE9x¿H`+G)kp.r.g qo(fO1Sy= Sd$yls9#N[?CѰP}^\wڀ!`Ń-QY,B~cy?G`2|LX^Wdɺ~gY.1L{mіNj {%E׷Zt$kw,[D9V]+WЮ @pCRbPz)/ 0/{w<ٚQ2:5傮kݘHVyP][a)P 9xN`V̎u!5o Ԧ޿oV[9q=l]foOj[9_ֻ&g?)MLL(;_6ҽj9 %a&ାBCXdmdYbҜFFhb8B1.:vzfP##xb%o$vtjjU-VtkAj5BX=b拴g(ڣM$q[lUqډ[7-vhI׆lu`^ jvA[lٙT,]^gբ#ٸnѕfDW[zf+,nu!_@Gjԧ)r#Vi+؃iHnjpPy|b nAͿhɂ6"8#??/ k+k,08<,=2+@)`l[.R Rp_[yy6  ,pG14-1v@e1~m xzu pI_[9`Ti oC"611KNPz`gMp#xd2{6Z2,q.igi3g&-8,j!E mQvv:;j<_8Cbg|!&v6`yf4V(ٺ"ވiP\88XaM^idbjyżh˻Ό紙 Vcx{{tm{&h^ }7⻮tYb^{ PsӚRhw$q]؃^1}J1ن 1kC fhMf'r',Cy\a,j盂1T3w!AĂa&igF[t)c;~ 5QrJTU΂цͼDq?OV+M9v1p`XY ʰ٘`U _Cic[ӘaYM?[b)崳jVV QEp)M%]r>9lQvFݛ0&c|F/Ea?[zޱ;lrSdQ(v^IPŒj!U|2%4KxjXiUMx_w,lNMݸEIpB2_ P"m]6F5xz4; )swp,t|e tlI.]g7k;egi蝯s{t4'/7Z'S*U DyjżnT8?oWR C 4&!/V'%DG~ۻִg.!DIO9JM\Y0Ňk7Pz: 96vjK~Qfխă14b|ީ!*4b)_PJ2E6vlCaQv]N:M|NV?pAw9lђ;,V"xm["mlٚhN;o7F;!Ї4pXv!;Cٚ6pϋUV8يr5im Յ`Okd{gưS ґvbDD9e]ZhrV+Mc|nbNjMs3AUGFC}76H;{v90XAW`xŝ6?Ԋ(-&wfi &"W=[iQpAx#;p _a -/MHꗲ0C'a{&#}|eR0% |1Ami (Yj ;UMjj^˚?@Joc/ɩ0c1}ச ,D:1-M+楄B}p2oqHLø8Sץ_ jD:"`ۻ)fԩL ɪ-PxoxF1}>y GA'˄AMI8%mH^GP6؜M{6WTro†+ :  E0 QugMgUC .D|uVn]Hd>-:*YQ[sC*xl[Iܺ|kt$:r~| D1eDh$6窎Aoa " XbؾPzϤ1Q;kݪt\nU7&/y>$\&ߪŸv ,ن/D.D;5yxdV ab+Y!hLLLn$ёlБ/ڥq0c0 |/?BӁBQ;3)X:K=#:?ւ1PghTO@Z3uV){ᥦy~|o:;|ᓪ (3aѫ?udshYڋ >1ꤼ5/GT[߀s^ϧ~px Kt#n0YhRSA{X]VŵnysXmv͸tJ˨H>jr#66B+WFfb4=(N;VEo#iOfү4܄'{m͛0BL*V,ýq51DiZPJ<"`8|F&";Ӟ>y8E;jLl:1o毛ӗoư-).y8Epf&·3^ffRRYˍƇ'Lhֵe^m)Ovpx'X3(N;I.jT)O4vၜLTzʭڋ];]Ő^=T;U.LHMz*Ee)lbx{3gJ\2?)MLLnY2Wmqa^8Óa`ggÏŠIR߽WK&o*#:=wa؟n7߇s;yZq._2( tbh\F^8fRſ3U ZQE*@o1&>TۇMS k[X=WZփtL,h-T'/Wfk5A"#ܣ IDATjM$Dx. 1~KÆVl"(eV}ؐؖO24U}^[Yڼ BCj!>lD2G~X%(LXaC /HDjbԌ3B)6l}8P|_AE֞ @L/큵ukN]P|ù piOc ֥qp[ImEON01v{ kԧ{~DQ0]`= v`(Wi~ !AЭp 靪_B"0S{{E!ld[kR&=%npǿk70 {6qP| RMMsXC7Ӟ1$"&&&7Kj+ s v^BN@~F<,/NϪ3;Lt K: 6爝 ٫S (tk3[ԟb~P[o #:Pؾ>1vQ7 qݲ*f/Ehb~F19]F'B0?+E]Xf?. nfaRm[M_#@Oʥ;_'mb Ay5!J(;K1pp e胚^\}6t➻6_P∏^&D64rĿRJ).ؚ1|;|@󾰡O4G^ A%BFI5u'&(+<:Q QyC7J ?~~E ;(xV V ׫eIYLmEM4 ֮#a .dX^rѩj$,b<:*5 _ËsaSreΩH}q{kk$޸=^2쑷Sd\,1WXFL;|R؏wP3x /{@?{X(YXU6^y3xͯ-Ug_ MjǤ'oļq8}N#ub9@ 8,~] .uꌻ6atmT&}X@NǯWPr 0X1Yk;yVC9|ѡ$hb7qM\ *3ٙ<zN#ҷҠz1-U03X?3{Ф'imM6KÆVO1 :QOl-\cϺ=@ؐo6(xֶ0MX7 :7!4[3}Կ!8H5uw^B|f~x>E5uo u H#5 ~ 5[Sh>` Jf9U:"=˳S5o;UVwo9<w;c4N.wϩ 9_F 3\z"e=eU!:qVQ8S;u*\٫/#//OkoAcG[?{ Qg F_c/go=LM|wbgX=U{*z]̗)V= un_GSU[ Fu;*ʷ41k5|~׃%K9(V<C`Dfݩ)Cs1 ;AӲ;U|NպP:nU 611"wI|fuh/}盽Z;]{Jԗ닺Z_ܼ|WF]'TNXWְ7{af٫h}32anآ^31UEdl9>1?39UCᔷլ${qux6UUS41kf$]o~wR+ 8Rֺ)Td8+ GdZ4d74ÆF΀>yaCOUr<7OnVǸjA! \`1j8:rkZԫu '`ͩV*}">x E.FNNU9;U&&&*a!%; Y`5ĉr-P|8MQx%% ÙVC%C,U?-ն'd ^u#$=fdkjx!VRNch^!Y +Zym:.|A$V LiAo%Cބ/++BS#kf|" S}Xf^ժuKBaʳHN53Tm%\*zlMX|3,ba 7et|2݂Ilq;%ONR`> H% @}йw"oad jr9ZUYU>!kq7vhs†*0 -&7;JCn;P }sJ(6y?ߠhT={OTa<mERfެ̥ӂx4e[ᯰ m0>UsI0 `ޟCc> S͜X~s_Cڰ֒ L̼eocmK,oѠOnM8NINC"iG.DGwUS~?NT}<@黊aY 3" B`Fl;\i;s +soUyvs]&Sɢ( <=I8Nuϧ ^݈w~FpzbJiys3}"K 9hcN 24gT-9|!ÊO'8F0pšq?4_*@ TW*I:/͂Eoiuvό+1J.j Ģ^5#IV~vnqf:Q+ f3ǘo*?64λҐrTbJ7qӍjB~7QԺ{8 OT>*Og/<ܤfdOTUTﯵ*2z[L]W߷ŨX&pE&$d@N'Ɯ611BT"C=xh  ek,Bn8P "@D;@4RiY*#D8u,WA9UWƼ&&&DM2.Ga%&@@$n@{<]A{!TZSkLMfװ2-r$T>2EOR<[*,Uك3$.-^%p<Ɵl x||=|{Y=e+ 'eͲո1\Gw=DdС|,nqْUGS~0gkDCwV(jWZ9'kڱAdH I;=*$k8%I48mp(Q#VC_rShkǑȲU 2O(M3`&e$XUD?@p8\R#EH:ݶ}U[-pZU/;Cu:5w @"'I%\7lA;҃D f/q4KZr4qE+en[C {q"ml[6ƺ ^S>@<(ߠ.@<(@<8On}}:h}% ˻2Wcso0C5{(ڶ瀖[y0:Mtm0JW2-íTa^aNڎjpRQX4 ~vH^NBV6eaڮ|fˣD^Qpd8}]NFlSx9Y{흌6OIK n&&}p$/eޖAvaxyϼo~>.ao^W'jjc+T+}o?Je3c1l[U5v Y}+%/ibԄ¢k4 Xl:3yz% im?$zۧ>^SZɳjǯK~ /mݭ(?hkbs&X>٠USk;z ~߯Ɯ)&삪Բ~z%3{eFjɖ% ,~6q{=`߽ٶ[ y.3ޛp!V>3&&r<'%7G Ar(T5Zh/j:/+Dv*!yNDb5)j1ZcѲޘ,uu$1ɔ08D4hҟ?29)W:-zESvk͜r B`X+*Kibbruxs1++o&&AD(.jp}GCeC3qC{md۾^ʗ4r `륆_!(ap{>[ۜt. RdDDjo٪~Mx۽/nX!(3l(+jBTG2SX(-jRRbE ltFc7 \Z0IA*~flu>j]É6zn›;n)HLbR4^Ԏ4;F;a i!dZyuGu[MsYT4u>ԈC^[W5e7wjr_bz0Kmp_SBI g~54Lj(VoAu ~8C:p`+e_j2ebz0^%g+5 4_{b)e?ea֚ X֮cA\Pg_Pm=4)8~-OmbϦp.#z{dJ Ő[ ?/kR}JLs[h0˼ :LX2e*Xt̊}9qLmb7r1ŤTfxnL-"S෼˕"w6HQO ~+aRmؑGT:&k5Ѱq_ ,( =]Ns>=zAy 7mĄЮA8éP.-j:Mj %LIE;A`#ܚE^Y< y^ړ9h#_j}Q4RdlqS)TGdZ "zENr0ц-8"iT88fu{9BT-y#J %U[ qyΥ` {ſ]HgKH8F6غ#_ݹ|i`#&Tձ~9AxKU$CBJxP&`7UGB8hJ{Jɹ`w%&4"й~8 sP~?S&â 6D&]:( $ 5e7eqw@ IDAT鐄v9s{9g|p" Vd+pr~.PZwLk%߫K Ps7,O(u|=}@36 8b•tnNп^ج@ז÷N"{;cs^3rMПSn;NCah;wNѹqAt& N.Zn ߠNi/4%1ྎؘۜՇk? ${橗8.e.uI<5gں {WWӽ: ծGڵ¢󙷭 AkY݂'jc`NځR{F>,s!M,HZˤ #gM}|{;nEϣNkZqԑE[ |_kޖ87W3tXJuOmRe.*7%s>H/>iWq9뙟6jr=]a91g8V ecz\g:4Mx}v,m b}`E4*xv'J'JG'o4q\BFWSE˟gNb*ugN=q+/tw% A ))t:il]xѺt|JGw%s0P"i2B~ )ɱwxb+f|Q\]VrL?JWw2{q0F}˼ޠu9zڱ'r'gTٌD<kN 2gYfB|kek{4#}|z^vd+VF͗_#v>ͳ>3R?PLBHBqb\6nChL$fUha\2zVZ,(&`t$ȭW_iȄlmi~pI"xUzGXDL3 ,KnDfoBv[F'v҉qڻ,Agt6j9w`1Aa42_Ng+P`+t$Z1 @8:+/bq6x )'/HaWKx"')+;3#9q&zf_]0>Ѻ^{LQ yx`A1btNѼ%<؈͛x𙢜8ٹbp90oh86˓g X \njve<*9ME犲㝸vV_OL12kdVul]~>m,zu-Z^SȞFqٜQ{pAp 7y}~08粒#ǒ&{} y,삅]P 3ڧ̡ތ2f_̽}MbU 5c13L8Ũ(`ZIW "\`Z巻Ӏ(:2RtbZ*rf8 %ޏ[+X,DqeZ=3$RU&)v[+yUXt!<5j)%tA ׀Q"Bs4Q$(0ᅒZ(!6EUsV% ~@80[Rc>xQ1}7X DŵjR |y|,_'UWNmåa:,[}= \Eu]}? [E^|f[dy(I;ޅ; >4IY)`plɯpz&B1ʖw}A ~<#]a]ߗ톃̰S#NO -^>Hn^>D`Vò~MwЕ!m7\2\n1l] akXJ._099zg3=,;z F%nqc;qʉpqbh,Gc59 1d,J r O.`*p (򖧫蛊re Ϋ<](+OW"]ef@iǦ/o5@}_3L,a65y҉[V(Cq$O: _%u|l!6҉#C%>(V5c^^$H1HBZNoQ%k#wRـ^j؁)p+٠VZj)1xf@[:KLsc:Rb$t@ N HGn$ӌJIw $1@ |< w# $.$R#)jxK;6s$qtz%AWfc΄>}k0B XZ;PX @$w)V縹l=zXuxV|?aWؙ3+{r0IaGަhTVeP_67ѫlzx*\?m&p1!cN;,̱_R*rwe(q Pf9|F̸^k#?F9D\EM?:opD6]VqV @AF&/59/eCO 0"[wB!AL)[v]2]/-Qn-Ѳo|,tgګP(J[zP;]=-p`0(:#L`@Q,lDn{^N6Qm]fѲ|Blpc ?^;3Go~ C6{3p뮲@$"..w bu?0"됇~?gqGVg&6jC~Zz,~@8 rT[1?@[L??³؁vs|.I\KGZa>^V+mP[G쨶|`j0KFb>(ҫ3XePEqyQRj4$d$^C[Q 0C?؇޶&QjptOPl(@sn~qs.` j`yb|;,=Ѻ2w/6DK};sySJtv";qC+2^welFںݹ (]jO{|.n2夈Y}X9%^Ż07GJ2K^|~d~&ܾn=C/*x>>^ڑg81̼=Ϯ3G;7#b\Z🃰ې+x}pP7mC 3Lʺ km蛹,"Ekງڰh!1|nCE<֕ .{wQnC3wr/.:$!xd_!b K^XDs!s;?Dt |g5dvX]:B/\6O^ >&+lsCh`D}̥do~!KheS]"Wǒ^XYJKUz& I^CFY2wݗM zY˘fUn~YeǦP<;aD~2t<֕ c؄_bZ[(/0Dٚܛ,N$ΑNt Z%@de)M>(NGS/$VOr z[Juv(q >ؽmsӌ2KR}7tA#l+CQPq"J9%dN1E/d繣y6n}PڝɔB/rVo4X]3ʙ5^T%; RTć1}-lyqT7hX-)2z"?AA|Si!7IofC)fGHW iq-pmp,k;ECtm/}qrW)9 Sʘ/gșoV*s |zJ܆vڸr<Œ&3/ αg_CnC%Aє,:BFgm(/n+%nCy : nCJŸ # 2滁=QbogxA/uBͧ+g@aWH^`<櫆ݡ~ZQl`|J8|:uWqS0hk;=y\Jl=5 /DzHW1D Vn<ۼ>iT)|=6\:\n1M~ G\`9RI 0z ~W*[CH,F؄_*8LE45Cq8:=JɬAq%DŽI˨Sn8'sب[ Nl.%ć߈6pv K5qaå%=b a)ϴ+sT3%)֥kPOQebVRQ]DJG1%k|9eߖSRz%SVeS8U&M PE2xID\ٲ Eϫ.L.}ZZiy#_A{_y/c6'nó'hl^+~ĸ 1.F-͏|VڬX]9%.J {9nC³}x7:Xi3ٚυbt 9o0e˂Ћ6WANmpVGc`ɖ;fm7* <~D ȂlNpvKWE `SmdxHq 07lo"3v>:“Sj+xeahl`T=5\eT8CoǼT}6LرKٝѱ)/Q4usC ()J:Ґ_b3H'~V˙48!%Żw*$_L.E8RU!0K~X=mA>Ґ&܋43$bw={xa) Sx65#r6& 2Q- Ƞ)'J'> Md |~,t`$quS/@A5D$VQxNC0ckֈ'+ψ3+9<6/ˏ+ 5n:<\BВ4iЀۊ&GVxbW&ͦuړC3 L5n;nCФHvœ#Krc݆&2bvYףyKa}9mц_hQ15i?帹"q)~[Yض"^vGym Ld[E#h ǂ\7FZ!!%ywD l7-i4#iqveӬϛ/UH34n*jBס(t~#dGBGVHL0 lœ4%9v9SE.\/SSf)Fl@/>=Ld$e`,r!A,o8lBxj,`hwd/KdC^ vr?! /:*/5tCXl~tb-Xb`+“!0y>?z\|`%¯$EXA:"RC1//L۔gs8d`{c8%z1G1=[!? jf?+V/)6dؕ Oa$7R!Ĭ2P"܆<<];e!.mȴ,nc((brn~1_';k5 /o;!w0Ӳo21ZFdEnT=9, 9QŦiqdJl/s<aw!>M(+R6恠i1 `⭼/:\QŦeqE ]51y/7Kwi^~K^ɥF<Çc$C}wDS9j5Gc҈V;GyuV][CKAқ ,-'97ֿ4-ƜG&+9X #IYDnGhb$yj #E$z qRL.![85, - ($s8qmv7{( x:V<(*g5PHhCwu7!A%2ֽ҆S1ՇQ3O^z x?-rܾbؕot포stդ~rY)h x8X :o>'WfMuU^QJ!*"XRz?(hwMPF2 +F8$C MI{KyE:+ %i+*=-w1JJϷJege]q;3֪Iãha eLB)֬rC[T{u}8q#zQ+0$Ȋ3~!a+RQtyFMENuekZuEϫnՅ.Mmdkmwq"9x 5-T05!Cᴻf"O)mٳ~{VkL(6Gl|5 ,h4:Gdk ґH+ 86s$|u]K*YP]3qs t郴C0~nj@2N9o^ lFgAdkDBQv,7hۃ iܜ%9XWT_e:UVWW}?~|Kl)'˻OZ|߀}-Yeh4͟mdk4:=}Jx&c뢏mNx964\q2?i4MݣlFSgM-x\5, QU/# |[Lh퓭hꄣt n6wu IDATEɬ0_1_ae`η秱!?C>Ch*Bdk4Z'!V OhuO(hf_J G_ ʑ]]K5@FFUN£vlg6"' k#fSm69zsoϭu3F9(hwFSk:$\RS-eSAFfV}GSO?b 0VK2֣Nh4=hjSSn:T%Ӟw4Ϲx঴`5_=hjL[!Q>n>iwo@\NFxRs̉`tMh&h45~WaOu:jW*e<f}4ࢍlFsoRBݸi9!C{z]ԳuaO$hh#[S6S'29nO㎆ b9|>jiK0WJ]X6[}Ih4C mdi%^,A61KpdwElXrs8DHK}>z$@Ȧ$?)x51}vKli|)Jm?bd`ܖ<6osN ,^駅ukH$S/Q/?i'S7(3w-uQI@ *8)HƢ&(TGmAԃ[X|!AV( yAVC[A:}Jt6vGM6 rz ʁԯkj: 3}1T{PW:Z j 0Gϫ<n察Sg#BW3Jm2QAd4+ԅNd5.HLX8JC+(%y׼]`wWw箽-19R3a:oLHfq 8}ꖞ@Л:'ws&ޕ)}z]累NgԡO ?OP t:YtOu$p dǔ¸֏]>Z5 >wm WBc4 2;;gK ;rֆҴˍFh49v}Zٞ]@Ĕ|Yân?S>%o(ȳ}.߷v_Iߟ Tc!?82$vH$CܪPO ^oI36D ArMJ֦QRSȣv)WLXl020$Nŷ ^S,Q7=@bJr:pJ=?#5mm԰P^s=46nD76>|}JJ]1Jrw?`BEBK)C7}MʵdY'xSWNF)5@,ILI6`Fj-}77k[ VM-IF.> B1a(5e\4Ƅe맔U?ݱ%*WIkȺj??>; y\{*zcͧ*RzkL6ۨmJ嵓qJYMaPR}șuU(osc -bh4 aP~qWSq~@B*{@Y]#j l \RNy"pV5ttQ6_`_IͰ_RC{qm=jbZWCx~gSE4n2 =?݌W۳Z.ߏ(QA Qb.Wω)+gq2^ eY 4WN>WҰeKnTpAO2VS}Q>݃ާ\BҔI!!⻕ծoSl.Q,LIo3nD`*qeӘ/+@ >0W~~>O>)h4FSh#[Smιn)?9 U^"?|9Nչ^bZmK7쀦_vP a3ޯVFX~@`-4(niGxd{ y**Ӡ `<V'` p7r컡vWQYf<W&p~@3p=U>z-.kv/+%ԧ}^lħv .`|Ϭ!4`n+_V7` lאާYU4g%" ZMpڃ:ˈ ꘐgƩQcht m7ꊷI69{|+0NsXFgЧG9 c0Vr pICи96K?@Ӿ! 8.Sg~|t]Һ}>$ =w|':dz:;́@]@a:׷U)U9,PD灣\L34JO+~+- H]Fh4*hbL'0,d( ƒ[L<@Pi.6S-prIGu^FFF` ! X "|fYl5M6F*NK+ vbe0%}5)r fgh4͟mdk4bF U#PDNfۛhD3 (J(D:)mZ( 35Tp4ۻ#68A;+ȶЇ>jgH9 r4Ri*"#-}ɿrBӠ2A?\wTB Gc(]""ti$s8[oTu{%Ydž]ǿYV7Gg ; Q_K " ͖B?"؁~ީ3 xwH9hl@Q<6tw`5󛫑?YP9RY➀SJ|HꐍŠB5Gs[IӀW@z.1 - _A#7X`B-'t;W[f-!0Dov3'dߓ36JZ7XYRgp}|i@jkrLŎPFst( k+h\Ԁ"tN[D1 .OC(gB`ńxpތ.8>6U R@3d3nہvS1U3Rpw|TUϹw2it(;X*$kqQW%D]wH]e FJ/i3L{=7e9s9tv`E?ؖ(d"cy5p63f2`;"f#~"23:6OuYMnpx>0M3i&&)Tʳ^\qp6iE)LvpsLxʘukpemkjWa _7T<DDDdԓ-""""gJEDDDDLEDDDS2OY6ڊۦ٧ TX[Krptf3+'?jG~ټԺ,Jx"%eqSbNn45g+rD:"5%"""cF с{7X[=ҍݠЩ l($=ye݄BP])f}b15%"""M.zײMQ6! XVּz[$[ڼ IIyoWX^x8m_gOjcbsme?ާq/ ^\ؘEDDy(ɖ6->`<7|ӝ IDATKNx̳gvO~gzW#Ɖ1#`p?;Nt1=ƻj+8Nod =8犈HgLn"+l$[6^ei=@| {&zs|yffPQ-mXO_ > 6@V/J竖͟ՁcgtuƙItegC4Xmn`a>abVt]@/sZVoNd!u< cYg`FsĈ1y<ՋeX=2{3 ;1,i.YYﮈV6qL"H`0 "sky͊8`N6n{0?p)pE,c`Ǘ@ǓO\X)03b"^sc⧴__d+7%";8^͑8r$qM+ b/?-}l$H[ t,HγlN v!]l}mOy-6/f>Fppppsއ@=Ҧ9`Y˟ϛo㘒/9mT3+z 9"ի՞NkJxagVx *zLs= ܇u!7K=)q8ʙUgg)x nWo[NHk5v;<d|yׇ/V";Fp^X @8lXi9Lb9M^ ɖ6-F_c[zw 3?tաV~YG3%_.#+g+M?({xj 0'%Q0SM2Á_G6.ؐۓU{{7i_kY(:6&gB&/!vQ`mY??#;,Ոɖ6||?.k nH_W=/vXg@ցYm$U}Z~*׃s|ycF~QU_j?nkm`7i:WaʮEn"U0tWw{O^:29>X6sH`r*#FnEO:nO[6plxik$[(YS|mCXuslp{ip(Ӟˀ'cg}ѤWzzG\㨬r<>hR;""֭:[%*DžOM:JeQG^Ax:uۑZ˞"djB6yۧs':նO#^k%kG/S2wvє6rsc_N~T΅򟭬rbݏ_:kmoSf7:d?|" dzsk/2+s#cXѴv8Itqø>gW6l?nR=k&}14:p|w8mcg0{S7\q* ڿuAmyR-""""gJEDDDDLIH)PWqK :JObԕ+Z$ƊFD$Rm&vKL@m &R3ss_)+[Yw Mh:x|٠sE:JJWUx_oY묍mx{b)oK*Z./_l樚"DW E/~_?{fzה6{Xoe _άzivqoS4 3%"""""q$[DDDD$4&[ͶQc>6ѱH맞l* e3}weHcO="Ues-DHfC &.8i+dT xMƍ 2t++zOC7]E*k=p,oֲZo$g?b6q\JR8Vks'DDD4\D xtsE\(+\ 8|MkDp||\eѡJubP\b<?xrSOH%^gŽ ufp$GI`/b̥`^:?1Sd"Ɲ]i=dTr$c@l_#`77j+lw?Y68Q:1s<1 4㉈Hk""uWbs+oj(5_526.?(Viԓ-RM0r{,䍸*㴡2Yߥ]':؆GRQ\$zE*zf&T5[;tx\a&أڙq5h ,U¢&)"""D="UE9ׁ9]8#F)>1.b8k#`W``\G)1 8FX6sp,N59Ӳ<Ǹ  (uH\'[ _xc: G_ Sc1Vc?8 `:3qpLFq\c74bCq|qp';i;!"""Ml| |c 7sk8ܦY&r|mH롞l8S-""""g."Ҋ \QOH)3%"e⛆9JEZμC4lUJt"""0JEZ'pa$%:?%"\8NOt,"""RJEZ;$: ?%" FWEDDDGIH+&RFIrgz>NDh]R!?!#TetF(lߤOCC~$;hawh)CYa hzd`xa5=: #dK=J;`Ųro 4ʲh٘]^5/-@-@\x҉`Aj!l >nMtmV%DدۼH>`D6.uկPEZorF;O+O5&[qa@6UqIvDDD$4\D r]Ʊ(kc9&0\$>n84JJwo,x'Iѐ60Ƭ^Ҡ#ٕΘY~N*D[3fTS{4ֹx`!bLųa.Z(QgO殡Izmו08k7wޡ'צrn^Rw_yuݳÏG4dΚ1V}i;m :kƌEVvۋ%[S1 !}eڌ xmΘ>AhÆ8yNcNL;1u;NyIߛ9~' sϻ3_p '_|wD/kq=zɃͳձXkg5wN8\lo]Pw !x}w1Os]^3~'|s15Z|Fi83Բ㊒ROʰWtI͋a=NԂqXQyeZn}š' [ӦM+$O8\NU6iݬrq'˖?m7)NL8,_,Xeth͹!!g'OV)`פXS8gTq'l3s7wx];a]${:8 82eگ E04MNNrmcSv9c Yr; XP2h[vv4Han^'f1AW!S^ #;~XZvL[s{&us X?U\\y8VvGU~_c.Îhhs,92a8U-B忯wt qdMmy{n84N+8ׯ(55 vn=lÝqqlt4.h.**J1v lHۺ(i܃."?6^ñҠ5W<?:R|2.Mr^8/| -\-vZ6 /]K()Z6 TT ^7>e׷e޸{ qRMeWVh ;AfR,Tg,xblmKKIʏ)e%{:  []Q禇b۠}ՐS~4\Vܲقڮ?}̋}{ډk*{ae'uDZʿA1,[R4{%`]'>+U˖vVwPt6V>_PPē3cxԖVjYu+#Kû[vk/[}V^XD]N^+\\ᰝ]bYs׌ ;iǮcMEOUيT !y ؙ +mSt kxLgEB, |vx8_–!J|Z.鼑0v$EMgiمԧ n.Lrʋ\mM3$wOad #y053꧚ .>TFPR-Ҍ2țhP1S oi]ARyϤP4LbX Wx%eOj%e(;2(?l*~jiHl?'V7*s6R(j]*=Xy}.9)tO)&2,p؅)\PNS(+ [DDDjl9, ȯMΩ竗u 8`5f=r]hBr8ݡb;%rL".몶BvݼɌbsNrpqܯXDDD$[i^($:ʼ_`WXvF$ur2Q[#-]DDDDFEDZ 3IDATg5qM +_D"""i~ i|V/K*OCl-E) o `*g(1bULMU+"""$[iM Ȫx(?ĸk|fL!MM{a)_x|<6\)3xH> ]=YìT ţ 6*aPZJގ>0sx`e+5\íka?;?w (AuX @{pEDDCIHocv*6p/DѪl`deɃXwҺ=Y̢jA*EWI_Yp1/#|hEUÕ8Ɍ貹v,Pv 8F0:;mɰ8Xނ2QšX N3\\$9\2X;v0l`e@cX7xx!}1*,@uí0la1WV VV `9uQ}5kVg/""RlF*$wpJu n'%W7d4[YLE2Xb4>LftP*5'U}PyݢS<܈$R:v}C{pNP\0ât~rndlu{a!Hsx<å%uura.-K3Ķ`\2-,u/k}#7i$-.b-l2xE22Һ$ Y v_27荡v~EyT }p>~F@m>AWPFk7)5TLlmv6v2X+нn <nnz"~|4%&!t:}&:P-"q}H7ky׼D#q c~ uvxv![2vF7)^n3X |S[L"2v `w6l_Cvl17aﯤD-q "f~p5pVcI>@l/"lfTHDǐ8M& ƽ2ۣ74u,,m!8aYP>>4<|Uɬ\!}dtwiOj >r &eݫÉDDQ-"ͪ%piC`"#8r/Tpaa,zpNj\774E\hʛoS* g|(;9CțVfp0_&A;D!PJEM&wI&c.{ewĻ6`]å69n7^sxuZݜ! >pc'Y-2࿉b3wri(%"" npnP'v|i(-."-y_`eV!uޕBR7`ܐD%""((d`D_$n}JHk$SKfpY,5VȨE /8nDDDI$P!bRڣl.9BFMe})>x j9Mẗ}k cIDdk$[DY EE,^l=B$($$QLګW($gDDfJE$ e:8z(y֩_nj2z(WS[ 0 .Jm:DD:%"psR`@l=w\KQI ,fCej;0j^@pAb=s,D$"Q-"-n<eC78 w7X0pcK61 Pt ػF nk`La@r{R^!->&g~\9>ϼV8JEMar{r-y.*:Pn;%I$ZHu.`c3v: O}Hp=q nD!mz6D$!^亹+a5ۤ3S[:BF?KHdZ:HNYL/Z{#$:$J]3ɟ= |#vţ.z)HXǝmx;PJ!e a\ϗEKXCc襡eM&wuKDօL{|O8 ɽ/1iCru \:ŧ.Z)˜`Gdp{4Wury_K(g3;V&"*MYW_ <Ĩl;I樂KgGs.>C`&sn;{w%׷e76D):HoOx{;h7^ie8ED*."" cD)[R>4ŧ"zl=3; ]V v/jj"9eCȻ# 6\DDMI$5pʭ\ JVüU+7ܰ1vNĹ2k!}Ӝ7nOMøD#R"/ BY*Mt,5'_^%:i<%"0u!= o}o 5k/|QFʗI${l2[xO3D3{]lيc F&:8 1ѱHiLHr/!ܝ;aOQpp, pNEDdKlInyFI E,8h t!&GCT w)t 5>ͼ{{#nۮ_l'itΠ7ة4^I,%"0yۘL樷pP^3s`i'U{[o `DIl]'M^kqRQjSꨪ,T֖oNAB\v)i>>!x>U` %drW',:'c̸nSN8#DD' A`bYMcqW]:"P3)-md44r[Mѡm5JH`4Qk|}.-[$!qlNa$:idL"Qڡ`B .Jts/6xhn.È|Dtz 86 LMt4NrO*p}2uDVkK ʗFP-"gSUs2|]Iߔ:0;)Y`2%+@MVDd$[D4]rL"Ņ^vr|ʛJX|jSXHy_ a`΃`'0WSZ)F41'NB"w`1H԰,w[dW9^SD-Ӄ""up9۶upxLG>^Ǎ':HcEDڐ*zd!'<¦{ M'l&2'vsIshԓ-"R]DɒD0ܿ6GtE=AŰ%퉈ld%F[YAujdXD&%3qo|ӑ-qgi֒t:Ҧ%ܖkK$[DD2"8תWi+C80Z, K}`~C>oK5Bz&dzZt N$Dl(8K4yiy;y;WlX>sKӇn mWD-S-"(K*]^~MfY˚co8뷼{^h""mdęzEDe-|=m;,77h[D$Qdl?ۯZ'Y"I$ 3%"""""q$[DDDD$Δdę|i=8P:Z,S Num&p,SXG )iyӉ\lr-kQT|ICE66YZM[Ktux8@DA j> -p")A(hl7 'ԓ-"fk6^Ko^Mt"_JE9lFEDDDDLIH)3%"""""q$[DDDD$Δdęl8S-"""nANNI` (3Pfd@2 e&L6l(3PvM<c%_N{:DӼL)XҏIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/images/generate_diagram.py0000644000175100001660000002305014743453644021140 0ustar00runnerdocker""" This generates a diagram in .png and .svg from neo.core objects Authors: Samuel Garcia, Julia Sprenger, Andrew Davison """ from datetime import datetime import numpy as np import quantities as pq from matplotlib import pyplot from matplotlib.patches import Rectangle, ArrowStyle, FancyArrowPatch from matplotlib.font_manager import FontProperties import neo line_height = 0.22 fontsize = 10.5 left_text_shift = 0.1 dpi = 100 def get_rect_height(name, obj): """ calculate rectangle height """ nlines = 1.5 nlines += len(getattr(obj, "_all_attrs", [])) nlines += len(getattr(obj, "_child_objects", [])) if name == "Group": # because we represent RegionOfInterest only once # not the individual subclasses nlines -= 2 return nlines * line_height def annotate(ax, coord1, coord2, connectionstyle, color, alpha): arrowprops = dict( arrowstyle="simple", shrinkA=0.3, shrinkB=0.3, fc=color, ec=color, connectionstyle=connectionstyle, alpha=alpha, ) bbox = dict(boxstyle="square", fc="w") a = ax.annotate( "", coord1, coord2, ha="right", va="center", size=fontsize, arrowprops=arrowprops, bbox=bbox, ) a.set_zorder(-4) def calc_coordinates(pos, height): x = pos[0] y = pos[1] + height - line_height * 0.5 return x, y def initialize_dummy_neo(name): if name in ["Block", "Segment", "Group", "Event", "Epoch"]: return getattr(neo, name)() elif name in ["ChannelView"]: sig = neo.AnalogSignal([] * pq.V, sampling_rate=1 * pq.Hz) return neo.ChannelView(sig, [0]) elif name in ["ImageSequence"]: return neo.ImageSequence( np.array([1]).reshape((1, 1, 1)) * pq.V, spatial_scale=1 * pq.m, sampling_rate=1 * pq.Hz ) elif name in ["AnalogSignal"]: return neo.AnalogSignal([] * pq.V, sampling_rate=1 * pq.Hz) elif name in ["SpikeTrain"]: return neo.SpikeTrain([] * pq.s, 0 * pq.s) elif name in ["IrregularlySampledSignal"]: return neo.IrregularlySampledSignal([] * pq.s, [] * pq.V) elif name in ["RegionOfInterest"]: imgseq = initialize_dummy_neo("ImageSequence") return neo.core.regionofinterest.CircularRegionOfInterest(imgseq, 0, 0, 0) else: raise ValueError(f"Unknown neo object: {name}") def generate_diagram(rect_pos, rect_width, figsize): rw = rect_width fig = pyplot.figure(figsize=figsize) ax = fig.add_axes([0, 0, 1, 1]) all_h = {} objs = {} for name in rect_pos: objs[name] = initialize_dummy_neo(name) all_h[name] = get_rect_height(name, objs[name]) # draw connections color = ["c", "m", "r"] alpha = [0.8, 0.8, 0.5] CHILD_OBJECTS = 0 CHILD_PROPERTIES = 1 CUSTOM_RELATIONS = 2 for name, pos in rect_pos.items(): obj = objs[name] relationships = [getattr(obj, "_child_objects", []), getattr(obj, "_child_properties", [])] # additional references custom_relations = [] for attr in obj._all_attrs: attr_name, attr_type = attr[0], attr[1] if isinstance(attr_type, str) and hasattr(neo, attr_type): custom_relations.append(attr_type) elif isinstance(attr_type, tuple): for attr_t in attr_type: if isinstance(attr_t, str) and hasattr(neo, attr_t): custom_relations.append(attr_t) relationships.append(custom_relations) for r in (CHILD_OBJECTS, CHILD_PROPERTIES, CUSTOM_RELATIONS): for child_name in relationships[r]: if ("RegionOfInterest") in child_name: child_name = "RegionOfInterest" if child_name not in rect_pos: continue x1, y1 = calc_coordinates(rect_pos[child_name], all_h[child_name]) x2, y2 = calc_coordinates(pos, all_h[name]) # autolink if child_name == name: rad = 1 y1 += 0.2 x1 += 0.1 else: rad = (y1 - y2) / 50 if r == CUSTOM_RELATIONS: rad = -0.1 if r in (CHILD_OBJECTS, CHILD_PROPERTIES, CUSTOM_RELATIONS): x2 += rect_width connectionstyle = f"arc3,rad={rad}" annotate( ax=ax, coord1=(x1 - 0.02, y1 - 0.05), coord2=(x2 - 0.05, y2), connectionstyle=connectionstyle, color=color[r], alpha=alpha[r], ) # draw boxes for name, pos in rect_pos.items(): htotal = all_h[name] obj = objs[name] allrelationship = [] for item in getattr(obj, "_child_containers", []): if item not in allrelationship: # this is to avoid having "regionsofinterest" appear three times in Group # for the three subclasses allrelationship.append(item) rect = Rectangle(pos, rect_width, htotal, facecolor="w", edgecolor="k", linewidth=2.0) ax.add_patch(rect) # title green pos2 = pos[0], pos[1] + htotal - line_height * 1.5 rect = Rectangle(pos2, rect_width, line_height * 1.5, facecolor="g", edgecolor="k", alpha=0.5, linewidth=2.0) ax.add_patch(rect) # single relationship relationship = list(getattr(obj, "_child_objects", [])) if name == "Group": relationship.remove("RectangularRegionOfInterest") relationship.remove("PolygonRegionOfInterest") pos2 = pos[1] + htotal - line_height * (1.5 + len(relationship)) rect_height = len(relationship) * line_height rect = Rectangle((pos[0], pos2), rect_width, rect_height, facecolor="c", edgecolor="k", alpha=0.5) ax.add_patch(rect) # necessary attr pos2 = pos[1] + htotal - line_height * (1.5 + len(allrelationship) + len(obj._necessary_attrs)) rect = Rectangle( (pos[0], pos2), rect_width, line_height * len(obj._necessary_attrs), facecolor="r", edgecolor="k", alpha=0.5 ) ax.add_patch(rect) # name if hasattr(obj, "_quantity_attr"): post = "* " else: post = "" ax.text( pos[0] + rect_width / 2.0, pos[1] + htotal - line_height * 1.5 / 2.0, name + post, horizontalalignment="center", verticalalignment="center", fontsize=fontsize + 2, fontproperties=FontProperties(weight="bold"), ) # relationship for i, relat in enumerate(allrelationship): ax.text( pos[0] + left_text_shift, pos[1] + htotal - line_height * (i + 2), relat + ": list", horizontalalignment="left", verticalalignment="center", fontsize=fontsize, ) # attributes for i, attr in enumerate(obj._all_attrs): attrname, attrtype = attr[0], attr[1] if hasattr(obj, "_quantity_attr") and obj._quantity_attr == attrname: t1 = attrname + " (object itself)" else: t1 = attrname if attrtype == pq.Quantity: if attr[2] == 0: t2 = "Quantity scalar" else: t2 = "Quantity %dD" % attr[2] elif attrtype == np.ndarray: t2 = "np.ndarray %dD dt='%s'" % (attr[2], attr[3].kind) elif attrtype == datetime: t2 = "datetime" elif type(attrtype) == tuple: t2 = str(attrtype).replace("(", "").replace(")", "") t2 = t2.replace("'", "").replace(", ", " or ") else: t2 = attrtype.__name__ t = t1 + " : " + t2 # abbreviating lines to match in rectangles char_limit = int(rect_width * 13.4) # 13.4 = arbitrary calibration if len(t) > char_limit: t = t[: char_limit - 3] + "..." ax.text( pos[0] + left_text_shift, pos[1] + htotal - line_height * (i + len(allrelationship) + 2), t, horizontalalignment="left", verticalalignment="center", fontsize=fontsize, ) xlim, ylim = figsize ax.set_xlim(0, xlim) ax.set_ylim(0, ylim) ax.set_xticks([]) ax.set_yticks([]) return fig def generate_diagram_simple(): figsize = (18, 12) rw = rect_width = 3.0 bf = 1.5 rect_pos = { # col 0 "Block": (0.5 + rw * bf * 0, 7), # col 1 "Segment": (0.5 + rw * bf * 0.9, 8.5), "Group": (0.5 + rw * bf * 0.9, 3.7), # col 2 "ChannelView": (0.5 + rw * bf * 1.8, 2.5), "RegionOfInterest": (0.5 + rw * bf * 1.8, 1.0), # col 3 "AnalogSignal": (0.5 + rw * bf * 3, 10), "IrregularlySampledSignal": (0.5 + rw * bf * 3, 8.4), "ImageSequence": (0.5 + rw * bf * 3, 6.35), "SpikeTrain": (0.5 + rw * bf * 3, 3.8), "Event": (0.5 + rw * bf * 3, 2.1), "Epoch": (0.5 + rw * bf * 3, 0.3), } fig = generate_diagram(rect_pos, rect_width, figsize) fig.savefig("simple_generated_diagram.png", dpi=dpi) fig.savefig("simple_generated_diagram.svg", dpi=dpi) if __name__ == "__main__": generate_diagram_simple() pyplot.show() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/images/generate_io_overview.py0000644000175100001660000000612614743453644022076 0ustar00runnerdocker# -*- coding: utf-8 -*- """ This generate diagram of the (raw)ios and formats Author: Julia Sprenger """ import pygraphviz import neo # from datetime import datetime # # import numpy as np # import quantities as pq # from matplotlib import pyplot # from matplotlib.patches import Rectangle, ArrowStyle, FancyArrowPatch # from matplotlib.font_manager import FontProperties # # from neo.test.generate_datasets import fake_neo # # line_heigth = .22 # fontsize = 10.5 # left_text_shift = .1 # dpi = 100 default_style = {"shape": "rectangle", "color": "black", "fontcolor": "black"} IO_style = default_style.copy() IO_style["fontsize"] = "30" IO_style["penwidth"] = 6 styles = { "IO": {"ro": IO_style.copy(), "rw": IO_style.copy(), "raw": IO_style.copy()}, "main": default_style.copy(), "ext": default_style.copy(), } styles["IO"]["ro"]["color"] = "#20B2AA " styles["IO"]["rw"]["color"] = "#4169E1 " styles["IO"]["raw"]["color"] = "#008080 " styles["ext"]["shape"] = "circle" styles["ext"]["fillcolor"] = "red" styles["ext"]["style"] = "filled" # styles['ext']['fixedsize'] = 'True' def generate_diagram(filename, plot_extensions=False): dia = pygraphviz.AGraph(strict=False, splines="true") G = dia G.node_attr["fontname"] = "Arial" # G.node_attr['shape'] = 'circle' # G.node_attr['fixedsize'] = 'true' # G.node_attr['sep'] = '-100' G.node_attr["fixedsize"] = "False" # G.graph_attr['overlap'] = 'False' G.graph_attr["packMode"] = "clust" # G.graph_attr['levelsgap'] = -500 G.node_attr["fontsize"] = "20" G.edge_attr["minlen"] = "0" # G.node_attr['style'] = 'filled' # G.graph_attr['outputorder'] = 'edgesfirst' # G.graph_attr['splines'] = "compound" G.graph_attr["label"] = "NEO {}".format(neo.__version__) G.graph_attr["ratio"] = "1.0" # G.edge_attr['color'] = '#1100FF' G.edge_attr["style"] = "setlinewidth(4)" dia.add_node("NEO", shape="circle", fontsize=50) for io in neo.io.iolist: io_name = io.name rawio = False if issubclass(io, neo.io.basefromrawio.BaseFromRaw): rawio = True if io_name == "BaseIO": io_name = io.__name__.rstrip("RawIO") if io_name is None: io_name = io.__name__.rstrip("IO") if "example" in io_name: continue if io.is_writable and io.is_readable: mode = "rw" elif io.is_readable: mode = "ro" if rawio: mode = "raw" dia.add_node(io_name, **styles["IO"][mode]) dia.add_edge("NEO", io_name) if plot_extensions: for ext in io.extensions: dia.add_node(ext, **styles["ext"]) dia.add_edge(io_name, ext, minlen=0) dia.layout(prog="fdp") # neato, dot, twopi, circo, fdp, nop, wc, acyclic, gvpr, gvcolor, # ccomps, sccmap, tred, sfdp. for ext in ["png", "svg", "eps"]: dia.draw("{}.{}".format(filename, ext)) if __name__ == "__main__": generate_diagram("IODiagram", plot_extensions=False) generate_diagram("IODiagram_ext", plot_extensions=True) # pyplot.show() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/images/incf_endorsed_with_spacing.png0000644000175100001660000024142714743453644023371 0ustar00runnerdockerPNG  IHDR&O IDATxw|W}9q5Jbg$),PF3̖Ѱ -RڔR($@Mqرo˖={t X%|SoaX,D=^\kf' Ő\40??Vg794<0ok2"MIsnh/e$Y[s!ovS[la}~ݖ +3΅ua@e$l,qug ߨ-Hd[yVkB<5rY=tI;xCC*:&o ۆB^?eJ\<;星ЬX x$~Z)v5T$,,K$yh0@keM.?(&H) ,K[,"IKqj}C+K3$Yؙ(DRm   #WiB.jrXShDlwCAļE.[F,b$4Mh9f$_*d+f%g)?[;=,NcnRs,[;=^h6 l }P)J- S%,n(R*Ns*Et{}*EcRӜ48]~h-aM %kI|B)FAIy fm7]^l.4|HµGF@(ZȀ#}FYCZ <:p&Q 2 fۋF&n8Rp@>ం`x~PB)C3 ,UL\`}\ᒙGߣ1`@԰g@ݙ(TV^ʚr`)sLv4$00w7.zbH򱡠<,`{,5C S أ1`ޱ{BL7L^9 V(8Uat{͡e,E_(!cLm0vy&BwwUy=53zf,TZ)ʏϠ*_>얡 R/,e>=o"cw(0;-xD&d.Zi@SV4h* Z3}s( (g>vⷪF:FG4ƥmG'%QG|T ]AUl*߫1T:8TOhHcR G%LU?ѕVݷ"4R(.,DK `%k-AV<; 8`" Z,GqQw`m# >2Ji0@u>s?_ ohʅ(EipY2"e)ZQ(jxf9KDa84@.0Co(EȔPT^XQG<7 j`H}p1j49B,,NK-u_?ǀ!3K\Kn_< U Ơ#]5#N)1]WncCKR˾,f'-ZSVWќ49:G ]#q8rV#o3>?Ȑ>E,F""vC#Þw&c*?q3@UA2->t{G.:ug>\ N8/imPwYە* ! &BCZqxAW]`e.0XʍF>ʻ?`AiK*Ve--Vmf-f4ͮhU$Q2QyQq"mW5.TuL\CBSX.dHĶBHW1ϴz:7d:cg䟇zfmYܟVܮ%Bc@L>Ϗ^}e])3iq5"B@\0'cqZfUu6KSƤPu:`'\E1YGK7ǁeP! /*Ȕh芟# Q XxG7M 547i_~i+~`q`"$PMh*E/s; QKd) OTVɌ Xj'Y72`C[fUŅ ٜQcӖdCU#PfDžrpI$ 6/nKa#Cgxt8d`>[kzT V] .4\v&\s[q!!Ȉ/-(2Ndԉꪋye"D6ٜz%5z[c)j,11Vt\;?efbCBă}6u+PbW ƍT%H);n񃋶83Kh&G ] !D R@BsF_`^_K:bb (y5SHP^~kr8aeEB80GBJXqP$G"6s_0ߛ@WMUhCʠ`pZG}nQʺo' 1H0iPiHZ/{uSsA$5GS`+2Տ /oMX{hԖ?Rx?_! &B<mu|KW{Qo1j| +"^=5ks,&avRc8H9q*AVpZZZd80l]ǯKl _ڸ:E=I!Y.M\ZZ $qr!P~R%<*wW5e0;kWv9ޡU8Z=&Ѡb.oq0桀ۺ=~Y()`R>@_tź.8Y]c59 1I0L+XjHțQzp-BVT`*s2/hMp58:FFEp^Y 6XfHȭ%~vĆT7 C)[O8ֻ/m8܄$VX'-#Y#')V٬;)q<3FQjd; ї[ktP-!) &bF2&Gy8(]:D5Ae͸WMׄox$ R%#QY.x$ޞtyՏ_tbRdwg~sQzm꫶NL"DG(FqGuC%)Nٌ)wFimqydx8!%GCV\!1mw_#^T$ ]&:GK#4qiV`&˻aoo)jPFÉ !hU? M[kFViJv*dW#(wxv&8K SjlŚZϝ5S|oo+LyѿrX)ܢ-~OSKϫw+7n$im7+m3m%pH*Ï/ռť@"8fe7-H]~^G\kNerĐs3U+Ωws%B*$_v>!!E6Y4RC"ԕkPNyˢ_ڑ㶎bLT%H+u?7~lf'b`"48 ]ն5~N/si 4j ZxٌCqa)MRVوiNfk3˱׏+h(gO>#XTc_qUs32w艘$)bH/|lPq;V_)"oXӬddG=1踾Mfj/yzGxGc*+Z1ln.jχ?Žf3bX$)2Jp@`FIu/ \>*M 2g#f8G]K\ٚ;|oo @Y>Q_&"D ͮ>cpӟ㛖qUŐZ\~ya=\aQZ# nxj\+&ՅeE:q"!. C٭_|go񦭹 p"N &⸫,~x0|c#J* Ěn:+Z]I$B<]U56&ˏϯgIOGRց| p"7 &2@j6 nͅKq+FkI49yu|te)-/X!FG ~ya=oXZ=+WW,E5`-6섖qq^ք>'?W|[5.V 2keʼGVk\vi=tF{)rү~_vq#˅1g _/;s;\4+<">8B|,/-=I8fZz붎b^ߩNE*C#^<7uz[B܉|b擣8S7}ާ3hG9T/L x弔!lV-^ŵ)/+q;Ef- cziRv1$G~qLm۶7rBԊWݸ=n KY{f-g۲ ɜ3:V5:P !OVjfؐ~7}oYLcDbt3;+sP3JLňeuZ>%wϪ:(/Ж|xEϭcA֎WrP ,Fͷ[[gYNd`"&1Phwg.g*FsF \Xƴ;gԍSNx$?]=?[- ZBŗdܚZS;%'qQcuFMŊgNxF Њ^߻Cŗɱn7Y[gֲVz 1ݴ$4_[g2+mƊbU\p-D<#rf:[i88K{PXz|c&/u4ZᝋS4jl$iIj>i}>$5+ vzJזet4#DL2bo!Nkۇ3J11c#%ňŗdf,b&HhUm Z4ĽJq YK1ؙՖZ b%D<-6Wsw5XN+clĤh8kyI[W\Vfmqz o] /<5^݅}%]&`"i }}P$^^QJ.gq,$BlR_8-˵qTǎM 䨴H0OJ~򃛆s8X4.@<^ wr%!N- 'VfiY\[S;ƀ L; o`F 'ϐ`"TdwёaõaeS|g'@ _Tz۟dD<99ǩL_oh>/?0i5̓=o8e,&54&4ñpbÉo2(}`&Gd!8M8Hw ?y;%0CJm2|,%!ʒ R˙5Ic]b+b("|Ֆ,%դJQ2@7n{sl=i&n1;,- %B񒝅Ya IDATZ)laBHl `)|=*xv G- &57\hʔC\wJV %B'(xFG+$QcVQ]P70`"})fcJ(8ϸ`+XaĔ@x۲P"xfnB`JaF†c~IQZݿ7JOOK ¯.~aW j&f'asF>=QZ,4$eHc%)Yz_/B LCX_UkŗIcBѕVCŐ/p0U?9X5Qќ^ؚ8؈BïUG]9?d([8/9-u3ڂKe"pK1 iJls"0[ HB+·tyGJ_S@)3$,ܚ޳4Ejv{㟷 pgwŐr@7[zN/eNV8xCCl!Y٘̏XRco[?EDҙ9b'25]m^(PbNF\mgf(P{uVm/BR*42o`k.`!|vm+g'f|>arWyGB{\XH[J %3x?J Mjص2G\(Wfg^(YS#zY?X>. %ђaEVgYyQdݡ<7S,MRq(1 IcHZ~QEs \<'}r9Ł$T,>aFQ<=Y@ ( r9f͢8?ǫZfw>䧻uZE/~`Q~U^P dBDͦ[A>\hWN"l56uP,͚S)DZK^5* "&4Ɣs2ɓ4=~\<;-G@qBtwmVOww7 ()֣w?aڕf㊬͜ "S93Pd5[^l*4x`Zsىdž|)qȩrQ)TeĘ!meQKcςڙԔٸa>(]x۶ɣ:.k-OZN|RUl.|s = (3jn/Ξ‡KQ-nUHy'.i3tNc {}zڄ0iUF*vsGP$}>?kNJ,: O-.Zy6 W]~Ɨ3ʄ$ҩV\#Coݾp!ňs[|bUfwV"BcFGebʣ(jʄN9h Q q2oWՊLs m7_VI0O"gԂ1elټ;8$hY(;S1/ (+o^o_;GiY33Lhd&v40Dɇ|=wECr*' CiP4s/xۆ]cq$4q&y;aoGcBgt2@;wL谖bts,¶_Wr:Wyi~ڞ1+ +֣E&&.cJ̖È.[Tsb8)ڹAl{r/ *$ 4@ e8c Vd=Y,ZSPۜ\4æ~=$W8˻ƃ7wIkH6f&L$L [S+?EizQ,`vk81^? |V@R,JZ\ڒՋ\Ԛ#8 (P(%^ʲ'N=7ټ{Y>rA,YUrvK}BVc``0z5R|?,>#!$N_a0;Kc+6 ƔT(\ 2d])S,'0L&3i9]ei>q"5Vs`)z XSo[g+Z21Mڰ]q_pM!2 mY,M3$^#t>AL}EQJQ[[G2qr.Jhx$NB6gްUޖb O11DѰ#:lo4{ JXedB_*>]M$pd2yc ^9~@` ecmj(!Q89c&[[>c)q1 ,(&.[7Wg;$USބ%}h5׷^{OIaci)oZ";MEٴYsiX)oa9񡌙Vz룧AT*>Dڲp]d2Imm-jkinn 5 +Daz{ddd|.G.X,`bJd2Iҙ 444PsaȮ;XVZ.?\%)yd[7,a_}3,uSۄIAFLNGp:S/3%YW%)VdωZ3.6?a=(-Kd']_gMX$PRc0&ެвmeN5k,X NZ:::8x^z{}0DfOc@)RXBiHcc#gϦmf55M-[Q+]YwI(^մ8Ö͛<ɘ1( `˗/ǝ>Y[ƅ)n,LJd6~sO[Weo].S؄|I&Ǜܛ{~-C3dygO0y =ÇZf>nJ"<c Qk.imm}Z_Yn<+٨Dw+_*8qܱPZ) Ҩ<7c \Av͛Yp!O9+V'vg{.901۲ʽ@f @9U|ߣCLM ---̛;%K2B){xN ¸q%۶ٳg;v !UkjlyK&U5[=CM X~[ΪnkMvaeP0YWӕF.R}"ڼuQiֳdΝ_vl|$NJ뎨J)|gppÇ=`R*ioo'HJ 鈢^:4L<-[i}(yd⩮#ߓ}Jc/˲H$DQD>gӦMݻ{pι3q ۶ne]tv&lێiy:SՄi:U0]9Zў -cpht/Dik:|N_lĆ u]2USQJa^Lڶ=Z?p4Y+x-<dl6;z~!]u] ӟy\ҧJLlyd3gj2R(شi|~ty:acHW56 C| /;5@[RR;LlR4rR؀UY7$o^bz m`˖r9q&Yc nvcH%ShoW^9)!{/}7aufo~֚g)p?:Xb}kMȨ_rE|x*P0yǜ1ϻk6猍~ċ.|2t_S[SKh (Ls3.vbppgtn)=Rr$c 555޵ =E_}ChjxWFyҼeQ{;=AvyJ.FQzm&/꧆ vLYJ1/͇&^Zpͼ$Ԭ-x?D3`7Q30kaYV%v.< }X!{T_e˖p'69;>0 `Jvqsܲ0v+*/UO1M(j$APp͸yIΞΛ _"֯{Ƕo'/.mO#dž@{{3 &ׯg=Ǥw fdc d6m|6?ŋs ¸ {ɩEa؟blٳg?.Y[BIn({KNEgꮶctx;;=z( '  p:pA$#yXBiG.9ܝrw\vUuuuWefD|*2^+W23~_0~;=)Xhؠ3 }Nz(eGbOLܘ䐈{o{[<my֍Fk <Ηtݖ+d)%ò #H PTk׌ IDATdp{ ?晛 m/&g)sLk8 Hٞ}pjĄ{+[XP XMd`d{ /JE)qYXw,I*nX6 $o(܅w,tH~aw':7Dmxǰk.||4Ξ=ٙX6UXm^l#i?E{a`vfe%b{P( j$8ˈsN \asbsZB]D333r2Hm8tplL?xmT+0T/}{/gHT&U9꯼ohE8K1޳ՂE@߻Դ#;C_o3;D￿}kص{7>:}ׯ_G\F*ڞ;uVql6|[ LBT$*#"TUEq?DDpaѣ8t0 #4-v*N>۷n1|\kWK !N\*a MAAwW Kzxvk#W x ]_,63 7Dȷx+:71ѣ}Ϝ$Ll1c8l6|{Eo_rLD8;##8,\ Ӷe'g>?bز@ya0>:} B-u3q;&h ;ީ@}LQ/ʜK"4zf?V4c/Dp&NďH:8Ǟa:u /^[OQB BuEmCfmW0~رIIN<3–X~ZK͹GyST4\w&p:&³=Ñ?yKIKEybuZ,$aLZ .ĉ3\HS w+ǻk0vw|1FGs {sg}ˉC]*aRʡ#@{{;N>Ԓ=Cx,In X HxM@{zzd8ΊH, bz g=~xǀo{򫿺#/Kzx'l_V묯LͶ~f(-plYxIރSNgP+"Nuuu/ ;v sXAD;vZCll=XdpAq fgg1112.v؁e߶6ds93"Tdq - 0kC#c鄚=DL:Dt+d & <=SL~?qv ŦG_ʽ;:octttM )k]wR[WlP9 9 ѣGQ*W6 JСCfnOþ,ïM̆&,ߛqW?(%`Kb2 4Z<㫝$~n(9~8Ѳ򺺺{nܼyLvKRcftv.=Fc }}fpgEK*bBPeBwtɓGTg{F˲0<< {v>%h=2K6L+q&1秾mIWlm$ qx)` L8_rEo-A}]B@Vn6rs9d3LV*+"&j\쳕JŖVgϞQ/WM4 s;.z?*'MzMTߚbIJ9 D83=e{$tCPP+ dleYH/sVNbXk na$qLNAI' )o?Ⱦ;VBl, $g=wn9?u"vDGK68ZՃ:J ˶֤i*JKMGuqMhR|z"T9gfǪ'kЄ5ÒF=v3 *1tu?J`4/=vgq}kn^luS򞊈`-"r<[fݐR1\Y8 ?3.kSW |[O㽙?兕$|vo~SdƎSe*A Z'ISb _3$>&AS6tZ1SUk. z>~^HE䍮 DL7FR)ߙt2Nj5l@팖[lVw&b-VBU f, { ?#3Q2!%>v}^>I⭭ ?b|G8B`LgMr-]̑RZuZ.pwdXB c޽dH@mC&֝ `J@GT],/ުXU X1H.AbPIG3sE.+`$"Nr[lSˌ JB Xؙw/qƍy/s~g~GydCє`ؙ66H (/ |wƪϧf҃[֡!E' 6[%K7|ϒjE6vbeuiO>1ήx)ks6L\Y$Z|h8K4 xFga,k& `ogCI[}lYb" IO!$mxۂL,hɲuhOoo/,ۆ8-&1x۶]Nqnm>"ضt&SfB<z?Z@=Bڗdm,k#,1 `P~9zۯɪ]5O,O^,ՅY ˲pol SSd2"Bܽ;.8Us`mџbxu ?^g u>UW,oM86YiѺѪ  I[Dؽ{7nݾ `I1bK_\e-ÌݑQ?l {=C6COOϺ$K98eaY?دO_)}ַ̣9>1!iO 12 |sʤ:'3oю$v͋ [y,,3gpqtuw/):܊u] !--*$X> [S@!K\ggXmSZ10i3R#剉a'a3[ ڮcV(xƮlb-Iy}:44LNM$m۸{{]//iq9?} "8ݻYljɆBR߾\ sjh;/ FPHL{L2V-OLMީJp[c tL\&b~> [[ZE,A3@.'4뺸v*R @dJLl8m7Y`f"LZQO=AvV- lvĤ"k]m6`[cK[8=N8-0k~7199cǏL&w8 x?яP.JV\?Z`_qy iZIQ[n#8Bމ9!Ӟ(w; #!wMm%{UZHقXE >IX+}ve8 g KJ}}8t0N}aK&RJXb~K_|}`l1!055+/ctte!NdCJ I- xﲒUL*0QCWJYH@<1I l&gf׊bwp(T}-J47AEOs(-Z+ Pu|駐BF!`&4c \*cΝxZ,`h";3_~zs|kIiZ)1wա<3 *G\30ؓhxl 6&rzpoo/N<~́e9ΛV:G[з%` ^Kf9u9ٖ9C1&J"X]Įɒ@[lOn Cdg`뉎y,w |i\zk[ڦP}XZKP.qA9|fb-RM^g+N.%"E8^ѪU3[fҌˠfViPYJ7- {- Jj`_ۋө?c%GDj\>g{f-I⢬60N3T%.|y֌]ț4ty$A t[ M9HCI#"xYnp ;E8i"c+ +y]/7ހy";<sa}ݤYOtꊂ=[%pt_a,g nEl|) 2 aQw鴛 Ni.{I0ٖ~ۢ2$5ɓ(w߅ sj'|jc۶+mzlHu}%H`Y⢴QFU.)jA@|EG R{¥]YOwOI\l0^Ҋ/{N:a {őGk$J6D j+7;OیZ1Wm[t 'kEh ݢrg}0g?&n[`ul;5W_eYPT`:s]pqa|@6]&%X̛-iówœ+D5 ѿ &&.6$2Z6 eU"98f"q/I|l ffȷ eJH)yc8xW~NM^.ߚqsP9.gf(21!WK-n-91 mfMX$[Vqe2Ή6}2ζV$c?>uR )%8\gO?mH wFke>2+H7Tڄs@E"i߬C`[;'bhu*lKXgGyBpLOO<cS'$RNػw{ܹs[B[_6E ?Mӆ%s"s^WNU:L#H ݪ@1HJuzA3`thOKT;EsޒcB2s):!Vj842M5RWaY{tb޾>k8~8Ξ=7n8ǩ/E ˴Q *#3 yܱ< 9&-슿>Hl!:S;Lܞv @k%!s׊U2d0 1 ¹9`w k-k7 uz|Ɠ]!% $8k4q1qX6_J#eY8x ݆\>/}+h>9R#.!Iȣ.d1O1\="[8:eg)pW._ƭ7166iTպU*)|"i0M|==ر?|WpT+y£>d8iN+aT`KieIto^bMs5kH?XH%GmLO<ĺ~umC"B& /MY6lơÇqa)1~bjr9e8*\o1L)ۆJ!ˡD._gк!A<&p X5D_dϨ#̸V"Hw$9~m#!& L ` euX{`</LK$h0Yp]<8zo=Ny7g=0[>A Q#}:7IO9;-v%D̀- ,pv9}\c$BH15(.ru9 ز[o^sŒIu:Qg_ |F([AGݪ@UJ:r&*82ք+e'$`ba7jql s\xt[tJJL F~u%HP6hzUxUG:N86dQ1q2xEh "V A[ i @ ts4 W `"+.ߘQ;ǪLˇ-g'qa*.;JBKar*~lraط>#T.&XQ|VD/^@prJBKZ A 672aWZs~qG`FLf\ !f8FDRs\n|{Vqm9{`'nهz}rqI5AP$5ZQ Fb&pߕ3srzm0alXDH\O$H`!" \|F%.pD$`. yKza"^qUWT f)zݼH~62VŬa>|?4,gPS*jIj\iXT* U 3cd{-Ҍ:9Qӄ-Aq;r*5ʉLb$b u2`Vsl`7kF>jڸG2E|GUG0CpZ_ު H p:A*r;H'5uKHpaDD:٤\H،]qF,c{Vu_/wկâ1G+&JZ'IJ޸<k6Ku8r iR X$_xL|r @H&Nx޼4#7  AͅH)I`*p,'.>vqQ7da t@СNlkY, @Skos % 1 3Zer7i,0?t3HsTѰj$-n?e1v-u2ొX[d xО,CsyBV$H8ļ5dbYO8Spic"kK ܸe]FHz05m^ΤkV{0qlB~I{i㋗p}$[=f 0bC3@h]Pc 喅HGHj$:e#E hKE{Aceݘ1;Uv j3hؓ1f[V $H xR`*pyN̬O=|>Ec"O%93b2V_VO=J.4Q_87h5eBp\|t>a])q Tv:dOƜeVtoPXчiׂ?z@MűjqVo}e deEHvIdL@@vGMi7q g6`1HXW$HH+I*q|1f=]s,g0 [Bc-Gh.BGwE-D`%)[ku] H0Pq {蜭AUH %ÈBHk7C:DYOCG;Y$p"p1>+ Wi3q0ob8VYAD5 $> oWc+EyrvvylG8iS9,QSUD823]H c{4o\.&8FhmNLX2*lack@5@J>Dz# Ec;fȶ,@~TԯyW7.֟s%>r#E <7pv{r aI`KC' ƫ7K<|:qiRF /PQ(@FLܢG UII$=^_}R''!z[5BzycHiL2F(zOU eZ^ba !s*:vf JDkZ`#%o$) 탏mY5#e4 ,^d60"ҪWgfea,0V{im02'p$o]~0[[R:L?$1A>  ).y8JQNcQ|ANP<B'H7w=S5ɋ Sz(KLX>fWnPv8]@ G9?.y%S% ,h ">`C9I#e*LVm^?g׭BMi V`|T@h)ppqo>`Aa8˰/kH}9{3 t E B\'׋ (zUU(9&{Y@@4y5!R @%WT'$N?LFt&")]^+^Z-|&*ؑMcC1Xӣؽ{W˶&uX4j>%Vi4Q7QuB%T;dHGPz:ɐ1xjDm>u!ipZ]r) )r ;؝ax o]; T$%AC׿3hEvYzÅ"ǍͲiW0?-@}Đ Qqt UmMQ#$ e$V#MQu8~~vX$".oi &u &pxԛ!ë xQ %}CM ڣ146h|2Xtc\;40*GPp% U|!a33?ˮ Á}9i>!oK`#%&\{U̕Ւ#P$OpE@D`r4eybw>v]/'jrZӄueYC]*QEUG\KUOvZg[ABx-+nEؐ &x t2nTD HZGR XH+ }@nih:P7PsoNNRO BF fSwf8\qqxC!m;l4ÃYvf 6!g 63$P#| ǝ2ǝ}G`*0ֈG͂ ģ6.'ԘzB2P6Eȿ"dc3KJ3t Y˺󹜏Q6& Т^S:h&ctLэ,B7&<͈H3\uWy .I0wWڸBXYm [raq _.%~YF#ȓd @dSxmڅuJ@a鵂H LԲŬ:h ,zd ?v= avkyB75<ʨqaTOO^jHܯr\Q A#X$tC)ۓb=66a23 6(r f=2Qw*@q}K;<|^#M!G(צ%#|&1lUj|IeEPyΈ5GH"HD卨OoNӉFT )i3u #H2c ^O~Ti6pŦR7B?j`D-J(£ޏ,D K`\&/T҆(rsIW1:P0G7SYu'a#߽zi&R!o}6-2CE}6CeD 6II0B({%OI<)ObΓ$fIG#0ILc= ڲzIӍ |,U4 BP :~1Z7Yˏ!7QB&R DžRup]Y.ޏ+Ag+ ۗ$]) VƠ&0sEB(C)‹RxT;z?fv8bzqmP3VrujoPgGqPMq0QHRPmaLm K.1H=x1#MҦo0}4K LBEHn`3B`36?N6GԈ+Q%\8R}7YW“ӎSwNHL8U9O%f]iO`֓Q/%$4 !>֑Z#{rC8Nj?d>)kw\`.D@ jg$+T&cx5;זreD|%%{)k])611W.ZZK5cEM;&$ʊ*SͷP!&Eש l]COLZHic&BϦl q<2~kW/: 7]U!P  MHъTr3&X H1BIu 5`FIh7jen- Adꑾ\nĬ<9"ʞP.*R {Miʚ?O IʇZDž|L^T"}2t9 d:ўCvj5Csկk>h>Tڼ\ ՉH,ZN (r $9f?nU؀Dx/[m,l*b.Jw'hb4vxxTt wΧ+@5ډIK8 BehRjijcCjp!VEUL 4 +Jh!@p}ylܿ;v8P 5~9v>(}h2N8quP1U_=Ayv-IDEj- 9j)[Q F&DCC|XFTQo1Gd W۽`?Qzj]~)RN0 Bb]g1W>ib1[M{s`a.PvbñA'` (HOLhF=Ow܀^#/͐B@YȘ4F"ŵ-΢ ;j;u ɂ^^;iMD0pS3DM[FC}1<|}>祐JX%J6AoFɑ1mzȑZB}w IDAT?JICkqq-}uu>ZЗIG eŀ 7;m) XsKY$"Ac 哨qAWRNI (ARfU kFفަ(!a]xyd"U޸5HEXtᦶ)#^HT~z xV*PttD= rf.#՟-=6 eyHͣkOχNRݐOE65JC%%:_i. m-$G7ja c\l*G'y"YDlj(2I4~;. ƌ(ClݙX++otuq)OS!u<ܞ]dǦ%&@-"=a .s84vH١ feE m]8.P93P8ކ`_}/P ~p >}PUj=;W5VqJK/7P4l-6וED# z۴ )F~7Dtлo 2ϧ){}}j}=n/15za| GBi"[SVI^MCm\3Y$9A;lOB>ԟSZ_{,9F\ޜk#]?U9E]rr$εg%ܨw!t%ڦHٯiqqkDE tېCyʾ4q;rdoD`[g,&T י~/ew,Fo[aP~gqs\fB9f1vC!qvjA_HA%lrҟ)J-']3Eu?諊"ރ^lLPiXB zoSo/aTڨ6b)c!ʣ ໪4=gC{"}>?L\Կ/TD[MrE(qRŒ&PW hczԟG<_F7ȑ19Uՙr$PS.r%dCct2zݱ}0ۇ@'ԧ~w/CϧA={ $`p){'s{ e yglC[pwmE4p xɤ j8o_~}ES|u'{C] iU΀A/+) iuEJ5HqQWRPY}.j̯*O4(8ްnGdP}/JB-NQjYji#Z wb7iPj kr^ nBd שIQ}%O4:Eyۦ/H*2>URס^J0Ump2"BuqtSl%lTѲ,-Tc0!ȀIDc' '>{hKL3=_keU֪ZZv$F#4 8@ KK3B` h-BH*T{UVfU}w<}gv#=v3y˶˝S 2<34/'gepÿa,1WUV&uvoPȶqv". LPWLi>dVGjR ZU%0wj:z5ox,@jiÚ~b֫WdQ [MXӻIqĝ[`A<?u8.iS3nϸZu$;U ֗L:7N 4 !,&$-C[_ 7GO5W+DeKɭ;4 J)2V/[4;apTsLXӃNCkܣYu{٘rF16vS^`88m5 `Н`ցdتuECh rԾXLAuM jB=tXs,.˶R@VgoNbHOEy%.+K5e0cEVt\DZÑ,_vQxHsJHOOwٽ{ҷbhȄGxthRWU#Ȱ03liZag).9~鵕!sW+1_k~K/^fsin99l)1%ý֌P(G% Nl,^J暍tJ^4G`і3d0}m-f\p4~%) 7 Z`@H QcRx9BGJw?[VzB TRN^l'J7<ɿd|AkF^jn?hųO*Y4(VGIqDK8GdR]ZqD gY铿 ۍW$m^U1̸ZSD;GS[400;ۉy9+ͫ5m Ck6/*-%&a|0 GJ=l;Ntƙf20~uz82 =:>gK1f[ >x}gc.Pʡ9m=_U<Ub44G\9JЌ4.3 *h}=~L1Lǯfo<)7Xgv+v,-[cBO%/!d=]MP]L)`*1s-Cze?O{`;ZDD@bFLh}-~lm/QM/ydWnA p`dA X@hX0G; p烆R\äH}Kkng-Cg @wݗoJj%;- =ɸP ] :Rtp5g%oFp:/Hȟz*u3ٵ>$ ܤ/< ǪP=(W4hGx|^wn,RPٜ:JDWIO#2Kh:KHmr:e}:GoeRe!W51ۊdOb+Nпk<ɁaٓgI h'Sٗ^ z{3woNܶpKg.m,˫-[JL:TLs;ZS|ӻ^*Er4@0ph`~ʝ9٬i(kid练/m,] fZ={4qP3,L|k`ޤI `ޓ=`}sx701` Q< &{4Њe1R A&0tMNYjtej6]V_ ^& J}j^h2oGd_W#&4&W]A]y=\Vʋ* ibccAVPW:\iSBf$kgl/MC N̽=ػs san[MYC'17%:/6 rW_1!ga M' xa @`rBТ=rC8x?]̞X^Klng:ƙ`Uւ4X@.0h 5psG&M |OH8hRx^]yx I#MRdQH&i?.jҎ󯍍WQԉ`ړE81#2 ^ Tp' *vx"U>P6Y qIS/ 9N2i^ڋš;j-Cm$nn'fBwof_Xi[Y2BXH皝ӕٜ[;?_eKɃ:;i^=_Kd %xUK2D継giepT }餼.'3yHX T: H, łpwcv%^'squCivE%K.1=d3jcY7$~49HdrI ElME:ljp$G9]|-cEK-pڱz,2ilQ!ɣԓ~̚8"iܟ4׵ :>|j]ݵNή4sAJ_Ѯ6ЧN-%[LLF}I3+FO{}& ʊ/| X(prS){j¯@!#%cLҮ L2hLq4 uuX?`s0U#RO NRFw"\I^9آ6y6Rx=mkt.fO$(S BQa81Mӑ$Wcѧ/AĝHjēOqY'7SEW12dFW_ *c g̓=L#"X>8#'wوW /R K41%Q9 Cڈ_MX=K=v}60逌{ GҮݷRk7OL~7 ~SmÚďn[ 59xub A@M;Eèdș!F -d^Jص"J#h@|6ROxIE %Z0ĂFGC ףZ`ӵpBVYQ{]g [cuN'wF j֨׃9Vɢ}e I%ZJIG,bf!_>;3"|-%& ;Q>1|CGG{-|El}8%ÁsNċbT#B!SP ۸sycd"_OuuY6[W]X4Ηmy.]RprPO2b^W)ӟR' mkGqv@>_Z;Ɋ u@BuH{5Y#F0pDk,YQp#$ۗcs~b8̽ ;$<-Dk'v>/;݈Ɇ,@idbr BT"KnA0fǿbf&_i',[JL>zrpWz]`ۂhO5%ے_TO^95 ȳrI[0@JAF${Fl'_quD'B;LdU\X:< 8~#+V#/U j+@[KNE$B'U+$N4Y8/OՉdwLq~ HF툍W < ,}8иGqX2)hu8#2j6 }ߋمgk?>~~)X+W9SXib(~VY@y>#ɵ-%&\#`Tgk65{GF>@y yOdCՈ_Z1+Ðh"G6!,X, I(C9HG͎dIT{RѾC#qd$ IDAT/0U*s~=益c6!d5ds?qJZWϙvcs8]ԂvL7'&q4ܒ{3kCdqtG0NZ,jFĶwm: FF}t P踺!qո" 0Ǡ^ cy,/ۨ1"'kcA䎇9 ^"4 HX -:bmm,+$]ImODL)x Ere0F@7 1* SqέeQrgGЗꌻvR+"-RqkH>KaM(#OB8vMM3]-->\Z- oYzd:wt#/`og+5Ŧ/gGxbELa&Q$T<Q!b#x|#zIxO~Y6`Ab?JRkCO:?>ÿr-Nߍ w4m *&AE?_JS17eC7M84`&! /~2◞NnbRxs;E"K+5r `B}<[lAGْҴ|z4-63f??;2LXG?ݯOשH*ʷK4erX{{5bmr*v` +r4)H:)L٩Õ@iӮ?|dFo²S}֔BWtMn*Bj<~qrWBeULAq qAΡ9/ZK+_T.h4E:lL9=Y´7chYS(/nh"^0Ox)NȌRLhmyiO$Em/w^??ߞmBˍE'0=mZXl&ћg;VqwGS%&Gfxݞ>t~=0¬-m]kfa7S L+-Že&="ވN%ph |)./$F]T"Xnpg/36Fxd"X>4~d[ {xՒUW<0~g W^X[pyU%3썒v׍ ӓ?9l)1;"c$"yX]6oe^2k}kUebL_Ex@ шIޯ k{D٠D,`*e>1я:\`8Сږo_s,,Wl%?.l( ·lǻCl [z5s ϫw5K3Nh;;vBYg0+DLBx|gWϙ_dy4@W7e݇&|װ %9~1ȩ޳pZdW{jZbVBpBz^0O)p2-jFMՒk5P_u_0lˮidTM'ZC!+z|hizJ&":@7Ք-%&,zV:%!(D%?&!ASeueb/{,I 1G iPPu+$}.wF#1kuI% bkȎMՙ[\eae2^0ջ[Թ^ LZDp1_c,?ݽq)Ru4~l1{ oƿ#kWX _mi7k_0?Ab4!oq&~E[NJ:űnVsj3XK-~UU)L! $R<"c?pd %>0=p$.P_U+~XҢaPT4dۊOjHȣm:Dõ&ڊ<"SGfvg6H{eKɟOR?aHrɟ2@.( cIT4R nկ 7 ]M\h9^4eؙnx!įNλYߧc7`$ >^ljnnkWJ5?r ~ >({bzb0/o/1mz|{8bdӒ V.Ksxf#)2__7 LИ |LܢQ%78qWO)s+C̗6pbvM>m@M8W2<1ZO8J+};x~z~5V:|aEC%Ɵ/ʆ,5LpƎ"t趪~T6\$͓ϝ/xL*˖s0ۮ 99mtE?5EK6r[4mYOG\"&~O;O]U>W6m>HtKqڼ_M܊aQ6Icd U>nݼY- -Ҿ{떦{▽{{mTsbwBQdF w1ֆ}2|GgVgbITbԇo+ DEruaQc“$_b7TS4!پ,sz,2D(YBnteAS(_$l)xpe|ϡrMٝi_ {h>ܗ%! TpGMP^ ٌ^dr$Gf0 qw,᥋ ],ud'Gfpfτ%%Գ~ dp9h)C|< xl6 }~^-*7C#\# p:Ғ^jqsLM2z:^俀GÓh5$mIkA W+")yȲaF<&^ .}ml)19X5?1BgOμxm YTMT'dH 'IB,tkueE%H`_~-6[~O8kx|U dՍ+2gZl9Ƅ+ [, •A~nSm=-4[·ן?>3Z1q8ӳã7i#`+)6":-[&\ `yX71JT͖zӾ`+eg'`4vMN?OqfSvpd%Uђ"8$ }o66G$_uAE$g~ѯ$wL!u}!n3erRnEQ"&Z #1R --s7w-eKr>yzg8޵).!qST&65(Ssa|9|ERث14(rU1]#gD-`j%9ώer"K^PzQd\jw )|ԄVL,>zaNj%Gxz5"l9_-_9f_=/^l ޯ-nV솯܂.OoloNl[Z7P-f&f~wW8pP7%xಈdHɗֆO|m9V \ʱVxB{nJX ᾤ DճLL(͕^pwK:ƢG.\ꇻ_KRbr`~$FU=H b\ѱlҖe!܎vK 'ucPѬ 8('. x+‹* 凒Y@NhFu%lQJp'mq1̊6HBK7qbO֭50'/ pBO/e=ʒfbە~"YBxr#zjMrL~^oS,m˫70UƸAnYZXTi=4>b杌?WznxpRfP6jꇁÑxt': &*MY5?v'X0Q╊ћXi&OjU'A"EeLd{).gZ?m6v ߴ=kfbz[OIA=qZ,&Պ+C`2]?qy_"wc\^wNlgoS2J_[Owp_,)|ծ@a"?D|j0q'aӠt4qDI,V/)ty*/lg|*_Zv4%&U%2Dpx$rQrk3qb?y6{8X[]-a ^2Mb3n3r?pa3y \B<-*:&S#9 "G0>`| \J`nنו&CU{jWuS(?+Y`B MY wrV""$eKRCa FY|df221#pzU{^6Ti EZH5 _WtD} Pk i4KVAL^A5>LjUxI̋<1I{[hX J' N/K7YRbgG/]A6mh<Ë-J)c+\ }p}ɸ{X4́|n9R|Od%:N@9}."0$yԞn/Aw Tb}VttC~3GN@55(R6Ԩ4 E.庻\b IDATZP odnqFOMR כS?>;IsT[hHv6=QH==O_p4xz-ſ~`BYi_cm1ߙETX#aek8`|0ղ Z˃&_4 ~oXbGOF^/pw39`:uawU'CZOKD{S&I5iRb|%$L@0 -/Jq@M_ 򬜳ŒT%(խ ~_GI%7.8l0uv(X;ZQ1( [l Xr庺rWL*ZBc .h4/Aب2s}<4,*u1)`|u24;$0x)ܿ\.C(ۢOL.-.&KLԤeyY24 '. p^c2OCynw%;fdqɸەǭ@ .8>ldC0eĵFTi5`+l&'e#%MWILx4^$OձZ VK b@C|vhb])]y xx-|t]OLs~!MQ,{yͿz!Ԗ!4MA?iO D A@:Yg5U Vd[h.6e $HqF呉[mipL<(MlF9SG8E G8Z;r,$ +3`fN/4^Ꞻ6=sƣdS"gԦU/ 4wZ xʖyclgVvj6ċ70>AO&:,V$|xX&bKA#:6uF](Tq( ,Lu}1s|6^+L2 jRHq35댯tS[|x39^wpۋ0cKr$2C𖛧ld@fp(3KC]Maoeų [m.A ⮅;f} C[U+NW+>`O- g:vd_TvY/|'@7:^_sN}[ w&{{qTT u^fGOe.(6G72VޱG 9Ylm7bS8i[4{&nusSXL3qloU 88eҝ-x6P_vd9n4ڎSy 8;q/^>4-/T (YԂe $OʆW͝j4dD"Y5TUGRyza }&+[JLڻ F0 9#Px?Z%J۱4CX$k>$-Em6 iF(qB":E3.)--`[=L&@c{DuٽJ3@C\/'N H? A_ˑoAJɇ)~g%“%!/ۆA=Kѿf ]}S?v ֆ9%W}Xٍ}\o՗2Whb-tWl5E?ep\nYx8ו:S?X֔[Ŋ-V+nk7pp:)&PG =܈A4-?+#xuۧ{d+ ^#d&m_h+W%&Ұ2؆ĕ;"pq+6T}|p5(kBio,2Cr灊g-%&쑀֎rYVe}GD l *J<}j{5}0.W Y{svIS3{hs`:F9C_)<控UHז  x_MN.O$jd ;b] ȿX}iWEwVc⋫)i;b# O% }]8pR=B_T2X2̱<̃!1[f  Q1nV+1062X2pŪ~ -<#s SJjݑ#6s\v2 wM fff,z6ȱqc}K18"ǣ>Y؎j r(HG$&)$),6Ak^="&^?.!Z7(`ad[27y0yp[gs?%̫J7b3cM>"Abcw 'X:_`1D'#&mO!߁lqmV'A)@!کDBG Ƅ`N6AI0;Yː=yFׯiT% ?3i,?.UPHv]{+%}ܷy~דZqf֟M_a ¨-èl6j !ߞ.^g H"=K؟(/L f|08#d [2%D80h^ 1&MFЩBN#I2xFwQv*rJߩd0qVΑ")()J>{m{ wSRPk"zH)`Z2 瀴V`W`V`6@Z5P ‡ &`ɆN3lRXV&GGn^zOjSub^mn 2_~ =ө}:~x(IJ_:9"=ʪ]P@&f`:1iezuy@ 4V->#lw+D8~딠v(*3rF1(un'i:+%04#7|N৔:#@'T2[|"%VZ'V>fAoT> պdfIVe љ)C`~&i뭎#!.}SƲƻ1rwtԾy|Aj&0i`ԗaV@5n34Dxul;TgQuHV+rUdVͰ Y4dR%8ضxZ8#@I.(!X1ek+Q^I}3tScA(RhX+[!#?8qh?7=ɾp*;zcsB "KFmA:)Cj8ȔKiHFC.zeE:*tLrmܗ$:-(3~NN)hJLVI1gknB{7 W|U)ᛜS|; m7 JnJMTy34ײPWTHiTV 8=#~:եYBBDܦi:%" +PdmVaԗa6A  {alhlx*,+7 4$qŢębTqMȢNnnܱܘ~Ównƃ& S-A,#ӗ <K8<Rz5 Jtdop`` sa.C DGgQTZ=vӿͶ_aeVp/yk=&CЙ/`}vS KBtGd^bud"g$ ݷy¶d(zCmtRC *Q[+s*q&ٶVDmb*a]=St_hy8.#[Q&ra-yoD(u$e+AS-'U )Hw{CRfrD ym+;AGcLJ(ʠf+b^Z[ Sq۠"8HcXD(E0=l+jIjfQĉ$ѽymO! (xnŝ0Y9ؓԇF&Khx#S\_i TbJAdl%n_ QN 5c%RxY>p7AH؛~\1L%N+M$jnWfGe2`Ce$?M2( ,y>I(u>dJtCkPO/Iڎ:eKM}rԠDy+_Wz+ML(JWZx00osn1ܷ ,qI1O @8?ܲA ST7ӫnS{BWjT(g+rs f~<ɋ[oDr+KQeᖙ/꜡B b`{3-%r8N96pφ,< W9&>)Ki4v4Fu*UPަJDn^Tr4sU-)uk.2>gk^D2H) 3婾&ӥk\8}PNh?R>j3$*e4Uz$FgZa ܄yqy=yGD(OgE鉔Gp)pyJ@}&cqކnR}Qc"8Dr] (6H]k]~gѧ %bZsOC\`+5U;marc2\,22'1aγyV @/tNh J/0 $Rlr-8r$. 8bWӈMwv f⬃gXZ`WgXp6ǩ6}nPS6T*Ṟu:4u(/w:K7zRNyG;3(9YXHSS,X XwFdS!5tdS4KTxfS[*6$HU|7SyJ~3:cB]е\ʇZz~)VxGDykʿu<_QhQG-0P$iS\<`, RၪI ZSjFDI媧d$Ap !+kTq("&!#2C^K)p2?΁Tm32L>o~~JiEג 3"H#Rq\hl5t6b0ؔ51}6&mK'o^ n_$EYƻHU$dQ=@j*ѓd@d꡴g\uy6S63&3Epf/dH'9ONxKюjx,yOA oZn,> @;לS6ؾ  AH(,JY4E)*eLfىҗn^}ae3']t{Wfy?S @ ^s8d_ @hs !?2_p92U/6@Q4hET[JM9ȰܴŌ[Z.B2LVl>ۋoq/Fz*!6U~pM"Xj+M S0jSO[Axl;YypnO>`Xv9JB+>$(u~0@YFI(SՑ( èS:ףۂ6E[N'7sFS).P z3CUu 6UΚvШh4@Ӷ8TtmI] D"j?t H$F% T X8}vU lPl+SL)ln sn70쪐nm8lt@bWEē>W-<{75re dԈ)hd2#ekj t60m.YWefEou 4;4NDA/wefܓ:LA`v ٩Q^qV뻆s\X:}Xsob YI)'t; &j1c?.Ic8f8Pg8ppͱ1 IlPf͔T2uSe,3N vr/|V|iK"tF]>U iӥZq>y6:í23 ʒn0)[zug$HԲT_~;fjs8O-q%IH!i9!\0 &U 5p~z 숖cِͰ qMW=4:{͹ 7{ZL Jp](B(J:MUd䱿.Oمwz𒍀*~Д#!ݥx 2B RcbW{hS20Uc8 |kſ: nww@$WUԨ,0g  m ݄%$JBuM|;%ݫF9:!"Y̵M mf͑aR1MK1(:Wxr'9%LD` (ayg*DiRئ Pp0|ٟƒYMpx/,ܡp¤ JgL` gUm#McM-cmeWt\6>0B|eD {;yQ ݄oWe+ёj$ʹj]A1X 1\l߬ddH:"rU*)TֵQU]S!Sw~duTHEcdJK C$Z5,`!3Uۣ݃ӕV?~ΎƜpñ6^[&teK7G @:4rQR?>n:gȈ2в5xc>QhPIAf @@p =j32LwЌeuU69ORGRr%d:dbG澒GA|tc)(KaZ>4A9hTa%\`Ԣ׎7S ȢXl0|+M }h(;vV;K@>XpCCe8f8d8b8f8 n@,nx9@fM)I cꔨL68&dsd>+yJU.0O[ݠ`-lrVyԭ8j9nJ25w5~g)0?RING3h`)sf]>d(WW; S>bG2Ŏ=ah)ftfBN?TߒH_߿꾤SBSOWirsaxcH(]RWɌNҴ-@IN 8W̬8@+β´oG)pAwȂj[@̝(qJ2 8>e%YIν!,Ni?5UaQJ %'˼n]> 0 :K>"5sYx)Dc"B%DE75y0 2))?/1`2uU._yF:p|ez򔨚O7#2OɫR,FG'51.<ůk?D%%O:+J &!2(A40YU V112Q{O=ֆHJ /m/}j3M3l]ʉKܡbە3bE/;MU=Tr3ս҅aj4Rh|ѓ M|`n1~Sl`H Xtyv ,sǒ1XN4 \9c,?)<%{W'YR "fU)T]UiUJB|@t RoѣHg61TVGFg=:H\7 IDAT%Xc6Ŏ2Tb*xbD1bȯ&/ϻ9O-Q/1_k#'Q,ܾMug`|DPUC5:r3"6tN6:hmVY-6x⼔ sJό&32L.=䳳-L\2~Jr7otkP04Vn\qWԆe}:}1*Sm˲<;C[wEܱ,kA첍[Oս ld;,3!xٶgu)6^4U/(ZQf)6|eaX8-yG`Ͱp̻ D;3hEAji %n_qF>54ȴc  F& H,4tFGޑ>CA)W^50A% h !UW)o]"x#ކ+ K&&%(8ٶ2Hb*)ƘG>| PY ]>Zja"ݤrXQ60"=)&أ_W^}UޕW+3ѳⲑއ  p!j.!Iˎᩦ{ɖ10ڱ>(% Gl,֥J7udF,CMG+2:6BY 87<0VyhL/z7~iO14h ׌X_j|缗$T =s.^NIT `(pecXt=O`aXphhy-&?ȋRi1 RIQ 3jWR:PVu華f˵|/5x_NZ"V.YWNI# A"U:eb&1>wį2L`F>&Jpb gEFlcPU  tڟ 1;YؖeElhltgO2Uݠu&ƟHf*Q~/ze$zo8z[!A&*>C3`O]9k v}wnc\\DO4_pYFTL1U?tj<F & K,2] 4J PKLJZC%qW*D_l&,׃g.;|2Q>tghAa`6qqoY5/m9j^yXu9]ucX6xHhA2UMdtM\fF*2Z $,)uFn03D^sLB<Z (! 9:#/b^tE^Éܴ{ƪ`cp羃bl`gM\&pa~A߿謅(.y.οD1p6 \Л=Bap5_`X#/Y /pδn "B;$̨2wƘ/)It4@\ZБZc%# i4a2DJH!<gfhle`6d`dm!b0J?hrQy<࿖}Q]pٰvW>h8d8bpG?>& >w#Фdh։K\ct*d%Cٙ:osTt&*ZGc05Ӄh*#moRM/}Zk[$6j} ,I ؔ@Sw|t'He`#(=`c;`,g &Ԡcسk;pAA_^бhG7uq׌kTMIr}w<l>Ǫ/}X8ּQwhFz md@(|?0,5dY"u:qH%"ȟxkGgP@c;IA:^NH Yr'"MKj;A2z j[g-"BaK0&E#AI8x(w9>|6qL.P1мvUց9dXrmsj3j?v4r'cQlƇyYk @1HTu}xbGopI^9wW?9_&2frVW_iΗmFBvXw1!8o2}(6Nf8PQ@Hi) C$ۙ 2H_:4?E$B+4'xS>'12R;r* vK \oa릣]R}&8U#m*p_k|c^ %HH;ӱ< &v!O_@լƜ}.^{ k O1Lg 4aLѯY~-xVvX_<Κrgg6%J.\p G-2N<&duLe8ھ@='O3_.@2rbe7gElI[OԺ:k$ɔR> %K8gmR*%(S2(6JP1z"cl-2p$%#t0CǢP ߯/+3P &f#e;*b.IQ7plv}== FUF01MB3 Q#$yFO9'QzZ94DG3щȔTM7X=4hK=cekC=.}984g [0A(.+퀯@3xQBVhtx>Y/`|ݿշޮ>7ܞ۳j=\g{,JuUYg޸d^m8Q1rux-e˝豚3ՆeOXh\4/֟4Bn{7}lajrº 0@ pQq'J{#D?L'h8>pgڸX7Q`d7G Cb4@XiG/'ZVj3 V۲=.!b@(BFR$ee#$KJY*<>v$8TM%JW2l(QF 1 )P(SAP5™AP@٠(jˣ|NW EMDC۠L3(2@Bg,dLouS[D6T:[#^ p\ȯӠC%ccȠMMUp`@cǾpgY4Fdli$@c`^6|6s1SI7q}uܽTkmsZ+[W.1zrmy@sF*%o60ZĻ:<⓶]_. 9=XbÅÎ8/DHi0L ,S to])璯DDpעk\܃bZ1 xF.gZL iCS2L!h21L"pAEx u_k/^1H2Ff7JP !0itR1ƒB&#]`AZ"4JJ&EնƒX6: >8pN KT &, Xyܹg%82\Z5\4o<ڐü@b|9?8os'M C-t E]\?TQ.t (wW|\jyQ(*_Q'G<s.q Cwp*垆Tctl0isϋf(ެΚ9AtL‹8aZIIH&ն_{Xߊi'Z+K 'Xb2_*۳[yީh90Bt( -J³XF1¶՚{bf$@\ bI@],?ZTSE:d}_l=U\+8b`}G_#ˣG[lJZlo8vPs|[+0Z>+۔mUzˠ^դᄉIIk-!8ګ\_nئ7cKvzAWx`>jЍfAʷ-tFZZ>8Gm߭{ݪ0L:7Ú/paǣ@D-_l (P@G+<|⸃=li\6d{_o3ܱ ٝQ線^pC ar0)^{Yk[fz_i7]ی(hfw}e$GWN6*JA (P ]7B 5&@E?|գg] ?!A!: N3BgmAPZ+5 ]m0qG;. u w*j^578GgGaC ŢWg%kG_~(,#ֲkW@gs;4q`@@cExz˷o93^LNC#bd 7(cN.x'c %%}f*E aI7~{tzp rJߘuo=. څ=Z@G|!mx~" +f^tZ NeBP10L1(b-@ę  g}B'[$1W"*lEe@@MH3w9<yܚ(>Qg1ɟV r//& xth8p#wZyULҶix)E-[Ō9FBZg^_.TK\E'@-f =&/@[;Y'Wj"cwΫgJV] @AVB15Ó"φ>K{Q'v vliЕ ܾm0Q/Pρqá`>>4_QY3MRH_x?&WYCnw%?{ܢcP ͠,PW]#,qՐ+z-o Bac!ΊA"+AkƭO>@3~ t .P@-6} 32~sWYix-[R9`&JB!q^z 2D2NlU70Sn>(P7p%Stjt՘ݕhڻ߭yAIPlTLQ|m!9B4("c%U`3y\zG)Jnx} LqY [@sZ M|  lx5l}qɣ ^.P9L}M<.7ۻ+o+y?^ߟ70-P@6? $7nY.&JO8EY'_|ǎD5 s.ŐU(PM\&Q&pW@}&1CBOgC IDAT0M61YxÞ*Ed GpW.[0L!L ؔ`W!з,|UdNvg50R"xt(PÆC-7S-^8SN 3I*ݽDzS~xWFzxuh?7(P1e7m/(% xD韟9bk^eFu_al-K9CK.A>r@&qA2mK>~\gc (XF -&@i: :b}r@Y1B"@uv-Q&SP,y\>I< p{0jľΫezOuTl +Oqvxh( ss %gׂ_lqa;L௞Џb@g66qo# nӎ%︼MO5%h6%^j1_sabsAa#&0(yķϛ-Q :t?O $;u u`R8)Pn86 j8crϯ9Cַփq09G)dGRDl`܂iCo:bxYai^L @a?n`eD(_.%=~BC!Yl 8Q _`帬]7^o0\lc}cx ,jl7wXuP"GB+u^O>h~b=>$}( Bc=]d?U齡#re\?- tnQq Y|wb0J ( Pjs<t{=xH['9P pOIw4w}w=)w GA^=błYaPQ&80\7^{{#y'ltbi0J l0))(fxa}aP(ALy}_[° xx6## cĤ>,8/NPH%1f/ĸۻ"x%4Nx5)./[;`+t7UGW;VybMEa8mM&0iot'xY'B"qrl#osP @ շoǝp;'3쩾M1W%aR@ԙUp^/}$K-@bx5@ KEp\m5` \t4/'&t'J߿Z}S Q&q'waO5WZxH\"[{8^b+PQZ pQ}փp;p|m 8]cް<⇧x 0L <(.Xp+sкiQRA0L <$5&/3~GlNl|ߺw %8dw񶽍0tIyL8d~]Qnax( /j׎oxw[t Xb ][7cmqRVρo-x7OZI0A؟t7,rǚ_\ࡡ0L +>gO7U*oV5NxYR5?⌝jgN:[77

%: äYC4s7|€#ObceS￿߸m(v(5pZjm0"9J3%*t綗yI} قy (Ax=kvp1u +sԴn_" (hy`? +%l`p(Mη(u:"Қ%GⱮ2|w.c cMV X6o/B{"LEG}~bkvC 8N NnP+o\bQpZ4rvzZ×y07Ykӝe,[ 5&j!2 RjG?{bG$l`pXϣM'[|IZ)Y-V ܱK;n9^󄱿g>r|au#QS) ۭIt|Gwu&쀊)^KYcD#V?dxF挏嫳M*q91 x`YGQY0@ g:Si듰 ;e#ϋ_vzP=P!`#DeC}.\=a Pϯ5YttB4:r[H۠6|l^Ӌ|vq0a@nBg6`-j~'F߈fxeY|mcۊ|euw`r[T%qv@D&w7,H^~Ru[7 `z_;&qձ1 {$$nPp_>sqJ&.h ^3KRMXhFLufawNM ;x89".%g~bˁp Pl/BGO&`o֭%\L,G ON *Uo=uQԠ)@6&lRvz=yW%c+ ;GGkLRe\Ln+bbv sqiG_~1g¨Yfo]\x9ɂ TO8Ns[2#zK @`ބĠX֑]^VR^cs1 bt;0Ҽzڹ+MT@&ďM:o^]\>||]tUUVel X >.G)WonQ"¦ Cx3F-L6Aa&/eHρM5?KfƐP@.% LTHƤ $-14/m=bvf#hg±-0`or /_/m+ջu+(`TAY3cMEMkO⽳bhq$?BQnQn7vdxoJ2D ) /\9'2#Aؔr>;.?~ak-{K%,@p"0<$)- MGqdR!87CY2=~5~DZ]G;jڐŤ(N +ĿY z6 d&e楷ԩ\ږ~OvUnX-y&Kaz%ݭ%oV M&ICa5Ma ,izO?3XbL (IQRB\@ ;Tq0al7-S]='~֝]^g}ǝCA<ܵvWpFsx֘D\ pFa5 zŮ vQ08j|u~;J"IQn\ ~(١ ;lhrY8-W8{Og]2@"\0&<Z>0#8F\1N(,P#vUgAڪȨ@Ǖ(N[:?T ~Ypv!َiqtm/~zDzk|B?@$6/k`K ?V->03cW+7c(d}ª~wܒ gjw Jm.aGƿo( @7LaK鎼Y΂׊3E=Čbo cUlz$-sbxgF'\Cʡb2>n YmjO^p^#+cOpM,pˆ8^涅)yoߺ|kVtBWS\ bpbr@wњRdz f:8CʡF|:r_+ؘp6ɖX'V Hb SjGL,^%sb0l-ZVc@R1$Wָsg w,)Ms* = Q8a#)>6ä"v^l̒fA-D&3ퟮ释3ld@L<&ANtV c[89-NhPoA"Y#Z4[xg|d@sT";{4v=@J5'kW~14qaup0a Abpw[L}ݼr ]k "|J5@~YКF g58u I)D,7O5h 95^xjǪA:jD?/g[54 i)dړUco J l413&lz'zɠ#6P$#yoӰ}].Vv"N[8[lh㨴X5HpXy#aDA ;X bE?a*2I@i 92jzTL90`߀T N[ksbr#=߿vY cf-Fv>e*jt5S0-i 6qiy):[@BvۡZC5A&W^X> -OTUs @B7DaaZ:kɍ#eMHY cOL{DUJY1'𗽘 hI# zʌGⴅNiNa^BbzBaOI`B(/(ȸ X?`SAcW)`Z!|1 DF  CF*b23?֜PogY/λ7"AՅܢSDQN ڿabS>v$Zl G¯I6Gɑ)"1\a~a0\ыLtg3l+jV]Phd<*!xnP)* ^{J"#VBHȮ&K:~Γw*&<{co.&gPӾM3c%d}>8% W$>ЍD3 ×)|Bؙ#GmD{\bNB-.aK4F%e $@\V42܇\&8/ȷvxP2& Ϡ%t{}e%~0ssyX- !z=1/> bWH)mZߞTOIo>U\C\al?`7ђ?Dj{ٜw 5FIՁ!Zup%@#d]m?W04u@+ eI(:q!@h%ld#T A |4ՄB@(@6 C"#"j/=gƞ=|k%F  "#$(iJ{ڸ0֜h?5f=!X\a`A ECxZN(|IR1xk%s̽sފ$!jUATvDc( ~cV:F]1VS;,SS˨WXmY/G=N2㟖LB@DB MOAbw̎5InooSyV&M"oOhǎN==!O҉enK5I!`H@Az+_>嘰2Q;il b3Qp;D͕$F?a*D4%+i%^~4kMwvi& &MbP !B-ɖ'EGzܓ9tfbIWu`0m4љCMNK Դ0Rau]͝Fc 4R 2'[}&{~ئ1&mc+E0fIDATƦUKKDdˣ?-|Gu^oaBl `D$D:#Z*]Iצ~\޾zYiD4#BaA(/͎JX=<{JڞR6s=qMjcS IN>5/!*5=1^wnG.{A3}kQT3򆚛,.H %*3f1:h>' {1Շ(HHSJEP昔=^u1mP#s?rw7)W˗-,Ʀ>&(z H#W__>;nan#=5D&{+`ZgRug^-HƔ:l)Dm!#c . =ܤnq1*w[w4ZCp -[Ke.3c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c160"z:IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/images/multi_segment_diagram.png0000644000175100001660000044074714743453644022376 0ustar00runnerdockerPNG  IHDRv7sBIT|d pHYsgRtEXtSoftwarewww.inkscape.org< IDATxw\U I(WP EA+boaW(( $)$PB ix9sN۝M3sgSzDUq<"28 ^MREyN^U]ۨv:"2 x.`,0X~"~!~"2 p.UӸV;!fKX_ /6z{cZU_-:;)  26Vb;OUͶ9 9*{k=E"oj{oc]%sc8epaU]Лms"JQUk sg;WUPkOȾ7c(Ezio_.zM8*6\UW vS88-`離RӜ~ =ރ}tsSbƩmTjD'𶌏+Tj;Cÿ x] v=@DJݿׁ>%zN5w¿Wգ\%Y5pzH1.X{x?6DU76~+oCb.›`S/Y ~@P 1Mxw5|]_EvFFp`"^n^8 4`26$89XtRU=;]NU_^ "[aWe¸8.oxw8.vHDdSѡTt \""[bJWl,~,U]#"+0`1`qt@ps{"Rْ8[2oT*+DF]sl͌w"2x'5 _nF}cqug1pىB"2B,U]ooehTlQ,x36KU~G`l6Ĭs[`'H3p4oY$|/aGcBuׂN/n+UPUC']5^U][ X?MsXm B_eJhI~ @όO3'I?~ P^M~("MQ~@~z;˞[ ߎ3K1ݵ3B;sy+B0=TzFۆWłl < \+KioLA6,=kn1r3X,;NѡsDd{l] <xXU*SߖXV%|j.*DDࡳ//+’'hxMk-εF`* ȗA`b(ft|L|KXo6Kil*0u,p{ՁlQ/E\-T}KU _*Ι~_/Zϥb%~^-Ǫ+T5 vUGI [5.e*찘j/e:,voA1ku/ `%ZYkxlzVqìܫ<2u1ER3믂ݝ5/mx x*"U}ZԶ&&J/$ձP֘kfRi`U<ؕ7 s& 藤eLpU`58;:?I|)ՎZ1XWStdb^¾1}Rv)k`;E|fO݃=c(){ +|6'ߤl5]W~xdoÔ"񵿊e U̵;kbT{=HߟI9PQ,=Hazw usLʾlQ_ҧg)Kϫ v=C)V,ĒԣyQݫ1A,ySlRz9#'bÀ,2ìy Mܯ'a<;[_,8w m] 4ncx[ˌ:P`Y#onyRe'9_W4;o|_/,l^J2XS`PSX)מUL;pzrCTzU#iJb`_L (&ZORB解+Q.JZnBB2QKsӚj6U}j 0an^YNAߊ/%nD+% vcjW#)حD}㾷Q]5^lL߆bo( v-KZN=?+J>]73-X(d#,o.e|+&)&bۋQ(6x<]nv}Dى(AA iSTwT KR}1k,`]J[7_*S.^sg7k PW}aZr 1-ϙ&U w i(s_TӂߣZ.S+n3yYfnnLr)҂w+Ѩ2zS;+\<(*?)N6̲Sm RBߞ%9Okqy+bZWRߣZ%J%Ўx)%cUwD_'cAFWڏ)(*үUֹYph]J*Ǔ2=nPoZAE0SE~?7(ʱ¢xU3Qյz!OQl|Dq ܭJ9RetW[.~_?a)}/"/Gm#taTu!fU'nO߿gdTh L&~'r*l!XBH=~k**PUWU(7|o¡"Gx_~ſE>JxnǩcIFÍeB\Dnz]TKZQZmf9łS͂&Z^2>$z ݻ_VڅZljkov% vu"""L'F~*"7j?ǣv2Fԗqr'~4^BuP D{/ >W:;ǩ!!BΨuG~0V-Ji8er&_;H dN&z(YBqZz1]Y>qj~>sS9sJ3nW&`!Nb4apt[u},"t^#(~q5ǰE֟¡] K(~ |XUX.9N6ai"rB!"CDX:X#צ]63W՛(^XD!"Et' ):`ڹo5"rj1k棕/ Keh<OZXD|%i:,x \?;"2*]Ot"rb~?XDĬKq<5:+]^Uo&ȍ"cV#B?MDYfy=Zo_y;>aq7xozیʯ)DVD `s"r?on\/ޟ."g EeV4an}"I-˪."{e6' oaUXB}/ y+{/1Ԍ:H|L)"'l/>/FNwff9\D.b2 V"rl{PL `{zv^q3xx!"Tk[UA0ŃocPP5grŮx ˀS(^Q_kEd W B #"a5,@|nو'vˌ28sjMtl8nJ,i>?SUd8pzx_b}Dd /~& 4^}|h"Ҋ}{q6p<ݯdjg[o{0Ů>Ѓ˼b,>LlE:yCDb&XL TN9 a0 w" =!aJOBJyd|&z\7>?UD^ x0SU3ÃOJ { I!՝ZQ;8ۤs~u`j16YU0!R{u8 |pZq ܔ:܁eJqH'\c5%[U99κ tMLWn! g?/B"I.9΀XvޘP׎%Kׅ 9:lm!5xcl%Xj*ug`!(/g!mYx)$)wTUnႝ888]1qqq8.988 p\sqq`8883qqqqgゝ888;qqq v888qqq8.988 p\sqq`88HL IDAT83qqqqgゝ888;qqqNK88BDZ i0ר꽍nD=q4@^UU88N""Cn4o݈z""!n4/wp#";w5`NS݈>n1W63F7q́)肝>l,7)l ^KDd|<4ӗd\s.\_kt#/Kqqzϊ8883qqqqgゝ888;qqq v888qqq8.988 p\sqq`8883qqqqgゝ888;qqq v888jDDF5 8881.N,D<ٱ rqqg HP``(pJx!" -atqq, 8IuAR/bWaB]m3K ž888pa<6CdF^`WGVQ柽 qt?Df4tr"#q;p~R/\J2`v_4qqH@+ptw6=4mqLXge`W%b+MU/8NXdFDLğ{1u qu06oB\èl0g=@`\xuhBp~::n~Ⱦ>Q)@:jr"Djt[g]co8κF> #ټ-.UO%yU}OZ8NC ;+MDY~RZ8}7SԶWB`FYh9MJ@PЮT cۢ]h` Z8@N䨜FnGo7n~S9Nd 8@bqZ®W{p r훻80vw\)źbɩ0)\.x7ܽ`,P+rYJdeȇD~M4r"r"m4۞03KwE&H8jMȄԎOx$Յ ;u걡+Ye"5Lg!Ip;@Pv;6j=Ql7s=SO )~VyX6(\*|.ꓖ8}¥"C~}/^`k`j[ C#R_T8 u}] 6o v-j0D\g醛dx(ʌ9v_ij9u UdHNdvȷzZWp5p'v{q)5.ɛ+ @ZSwEvɉɉ}߆9 r"_'2u`W1kmqaJ5X*Py@lB&^#Iۗ0Cdu9/5j!$p7z/8G]!a5n AOS} XI?D?]Fc=d+̕gi0)g vk4Yد>Y>]fT/ `h&I Wנl/iJ>W!=+,~bjgm~Y-F1b뀻0j25"_Bt `o\F&`ٞZ*2dȏ&r0c\r@ E${؅8yMC-v9^ z\n@%-}}Wj0e@ pH]!2ôo.̉LxGeM=삫RW޴T.uApL56\&>nȉ[zek bn;x,U;ޖO1vWL`d̽IOđ{-CނI|h(;lQK`9ȔHuYfiZ#=u`ZB1Kmw7:`nNGhKT_+&roE2`Q,$Uסy8JTC4鯼Wp0cApEp7wbwId݈Gxd 9#5>  yrKTD?>)lwhNkEƻIǗz {0>jH0k">'rqNڜHsx6Vb9kncb2Op)滑!PUOZ2@1zTȽϦy.k,0:FxpV>D՗%jq\c0:ZȖk&lF9D>ӛּA0 @F3=ʰaLĂr`F)]74ղx[ A?ړ0Tb?h1:l vŔ'ZU/_{<&䳜Ȗ9 _iʉSYJܼ&i\_{PPE9 9F,p } t''i\\g:Շ˟Q 'n"oL"W0G1-˟|Y5ELKaB-5h+VՎ7rl=C q V-MM).0[L%֌;Oawaa<е }ٸBOݹ3Se]_.rXNd~NSQweDyym[&Jb4uTr @&A-N]ެFT17U50Uʓ ꋳ HhU]{^ˉ^-ow/8B6.\K±nͿ`p*CΈ.Ix;"2X)+4=%[Ӌ"r"ˉdzB,|Ǹ`W}|\+Pw;)t`~͖&-U`uYmXgjU=Uͅj6EadU'#Z4r" s"ɂ,'F̝ a ˱ aj5l1p@~ <|3>~I;fs}dK{< u_t KR W7r"cs"ײhP4ST3UUJWZn=Ki]棘yL٪,FNx[UyZrYn{)<6ƶqd/eKM<յXF vok `zOJG\X> w%-vAP.I\xܡ \3W"!6 4ѪjEBȫEv̉Tʤ92qX:'U8`P'pb#eU+,͇qY)7~ݡ8]N`b^$k ^WjXg٪0%?օgy-3 F:.ؕԀud`RNPPpQH4i 90sJYZ6QfY -k\)d{$)3ɉdVC#w/0a*0LJveq ;ٴsn;<\&#<<}_I9;r"1X3Kvglxbd\Z^vA 5QC^C@Vݡ:9]k9Oዱ=M`x#0)FS`TVL(X3;Ou3߱ʤMiѤLt:D9TH쓇Dʥߏ±cc~ 7KȾ&iQnnsmJybVR&]x~.pZnU)``y}e..rN*l/+ L`W`I)K[)*rFdSB,vMpTTn)Z_[%٭)/VմPO`Zȉ|='2Mg k.3kf9\+O%έu$IWKEC܍зiKa`B. ?&y{D?i.rH X`PjU-P,6bZ.mTaw ,'si"{'`yqe#k 0;emƽB|zhlp~;U<&RXOk76oɋp\n1E>U lj+]H!Aq5~XsEX,T.d^p(eXؿqsX蜚,v!AiD7)"NadVFB))h0hY"]iڃ=t. MĞes,<յ!DNY\M"uZyVO6 1K jDž 2;eNdgbw&ۊbW_%%d.asͰ|! !L)_ y\iml>MdDN Y|U5?EĚa}+BS[\-\}S &=v9}6]9a(J-ݚP['@a|!]&B{; ư9$V۞&El_ܬ:HL J *M.,*Jjÿ$oeƖZxDیcCb쮕fE)"8 ecPK@<8@`תTsλM Q0t#`֤T ZGnjWΉ AApb-T۳4t!1Xem"Dr"r"[fo&'`iMANQ}pGcڪzկSXN^ D 4hSu[v%5!f8TMB8F *S+l-UX삖}tD.Bdp~ _( 1cNĂ\0ND`W.Kl|E'D llcuv[;U#K\7q63v5)psNiUiTIE~&"mSܹ"mO\iI#LI,0KwWtQZ-^?)1ـ6c?4; OJ)?hTV,` h\I vyͫk"#6'VB|Y6H,~*3SX2Ǫ֌}r";+ *|\Ҝȉ2G)|lOSxB Vd:3ؚ f)DڿcJ`>Dl8kL9r";L@0E筪c'>pZ rjP'b {Ë)bP)U4([w8lo#eS:TMH,4 q48dԸ6y2LspgkDSU?hU=hbΣO[ FeqL\ _d}PIwv[H5BZS^i3'ˉ'@ {CQsYE` h;=T}[1p vjyPn_NΜ'f,iNU6>:?`¼ .$f>C4TYvΉl&yM6hw]⌋bF*KP]!2[+|ZB8‘e k [a&MI؄P1ZNМc9JUNo?B:jnp ^]NdpEm"gޣpS*,Vڂ ڼ"7?-ԉ~nV9/D&8_X.ފ-fNV}kgea_ )(-DZ\]*2Â(tg掶S!/&%$!<0ʜQ' IDAT$0jL\R"xbJv%(L0!$_H|>HؾUufzo 3:‚-͖0&W}+dK-̀N$j6}Ӫ`.[cIٖ7غk Y&prDAiT?NUajGppHE!G&Aq9/kI]Kgc 4[gV֓T.U &x%%&T.\i/lU=UT\PLjƩ ZZAQvJ=9MmR,<)*s` Bio;y cCSks>Sq ]li-rb#Rt'nz5 [*3+9jݢDؙĜȗn>,_]"jG1%vi7 3g5wgL!Z\W$3o%7R#xLӲH%aRnSTƄI9#Rq`[3;).o'~a.fW ]x5l5R:Y #2 y[mcc]P-K+4lGߒG I/B>(ZB"&.xe}6XҪ:U0OfNQq#ɾs)kM t*1Iܧ&-'w`ApRbW6qKjs0OLi39o$K})&S1`t:5WTNa;^#^Ύ+ U vA6>=BbkcϪ[u/5iНZn`PO>Z<׫):`WJ\#6)YH=.)[| ɭ`7NU]okw~L8H ! Am^6 ^0ǘ즕d"N駩I?D&}7^7P&s8XZN-!e̦^ժujgb'[OkP0<6?T8Щ :-R HHp0dD W2t4xHHtu?H q)Np!pa[jdoŦ*\1cܟ- 1˙9Lktr` ,n1kSGbʒ *pc)2 "y;hJֻ9u SM cJ=sRcX'⦃d\Sh0ks> ̉l9Y']+4-%%.VJB0屰`ɝMf8VKu <~ $,$#=4SU; [TתvZgJN<$JJ7+'._uKkU}|gNRǶ&˶e,}iUh"̪v)W僱qI d,6#\,cj՛z8؁)Q&6ܢ!Lf%')X/¯ aԧn`WJ;wÌPޖ+ v5-zՇY i1MWTk  TRnٱ &`iS26ADBj0l7:寫=?h7)\$e+Wӥq|T!J[*-v ")R.Ֆj{ !S2j)`g5½AAtXֶs ~{YusD@v,6$ s%? 'rdN´1jdS;+<bJd&\m-!,ZDXAҴ*xeۓa., K-XZB:]vfc8"-a:8l}!hvsz&p%tC¡jLϨ}m sauAr\T:?OjP7w>$ ]>va;#ރ[S[LJ fy Z9aL'QB" oUMq `(ࡳ@y`gT𺞐LX%SӋ-xX>bޯT߄8j^a9!mdϩi: DB3|Ek2T-@FaW+a{m_JHf2_*4wM$&0!4 a99 2LpkVSBKXuޖgWY\UAyp3@NOb ф]5BÉ -v9˲>` YST3Ed{lNdps,Tvڭ8ԝSzJڴ bؑyZU[C]WbH5E'⧝-vIѼ)yvWȾp&<:-!w-kGm$:.oMҸ*9$-y6$;6i+h̃v懬i͂Uй% 𦹅;h8MpZ@5x[9 w2EUYQ"+mwI?A؝ R$6dRB ˧$ɠK xhϪ`SSrH  C⭗8j]1WmzY{ݥ_]0#|'  V:'bt.1ց v]I/keu/BoAUluEӷYu6͛kSGSՒ[bj p;fхs:H1;O9GyN:wc]rߞ@ lkưGW㞊)q]!sUnBltIz_Ni3'mbf!f5wxVH+nLsv{s;qoI,lqa79WevWrpf7]_fSwz6~9erp:xOLO]eBG"VUq!Duh&Y*s˺IvfDNvL7Z] `ڕ"j )r0k -m!^' em oNM{\حYW-6RefS{|^/ӒvY>laj jm8%G% QҀ0avXժa4Bjޜ,+hy[,Y~!$ݿK^T< p—#zW'a.鯓f.˦3m{cpcqbb׮hsEϳn_2 D{cMeEZUݪ [Gn)`܊ >`hHSŪwx ~(ҀhMN"vZlbPwcCl vt:ﳞ]p;0TQ8:bMJ]d߉99ʹd;"Ǜ$AUF!bיRF~[2Ebm/_w #m=g'Epju@uS=9%R}aF@Gtn "V|%1r~[)uƜAkh2fa<}::jq7 WcnL߀;3ayOCܰTGcѐ=߿WKyIp:EOD#զDoY DzW߰$3f;'d1?:Bcs}x-XL?iTkPo' ?"v6m/y>ؤ֐`Rx*6=#Ykg)5a]L3.(orG z/"V[w pgjM fssx& j]Z,G ®2.oEǣfl?UDNOb!XtG՟i6)z@9I}Eb.cG!IހApxmu;ք mwbK<ߤysCwh,욊vytnLony}l1}o)|;(眑u]Ex0)eYt?]lrpN߫Gfu{01y&cZAC䉞E2ms3˦;.W3bCQ/an~7LdZ׹ jb~Nx=}v(?ko Xra=`XJ?d7Kyu~-LKu>"u Nun+WrBG=aG&hXxo.2G;pDJ,unf{1[Nm?K>'Nge3#<HZ]ejEBfXO`8SwC*a_q5W8BAMZk;%au| hbiS<">\Z`U?h{A½qI}. 7R6/IoU)R`jW{0u_8K j2[UoJ¯< o83NkciO Lc5գź+֨ä :#} }ZI; g6o9p?A>K Vg#J v~a͙Ae]7QUTqV~҈5Fh@Y;3Gc[{i`ڄ/"vK?Z,]TYS֘zsm[U^7[ }ȠQ!bU&pX-؂Ywҟd1<8bȳ$mbZ*ޥp R_, өV-h5K`Hu)pn# _+ip0J:JhQjY5v/T>$R]:O䨱~JgI-Ký>RcH`h|QS/"vRfp~79']++ zLv iA6/v"9f8Bmo\Ww@`'R]M:Ҕ*|ONj#إ+ V՟Us;l` \xNa.XB_S ߈Wkun]9Ӱ]FY f_K /QV?f=YΔ: .'/y@%ZU7"_Q @ [ rqL@. Ev[1vY@ @aWN-aX@ @ U+V*0.@ 7+V.a@ ~Gva@ AؕS+3@ @ ®Zr@ @ AؕR1@ cH_@?#b@ 0tuR  A9"qXv@ /Nݗ'}IH,7ߏ @ 'y8'uȾ:@ kBĮD:.ħm؞&@ 0h  t @?1 |Շ}Jv%B.#\@O ®Dv@  ,m{v@`]b`Sy' IDATTН@Pc1Aؕ۬mr&@ a,b  &]@ O2R*&X:fv@`@ ?| ߷jXdpusU'g"v%qv~/D"?'r\_K {F@qnu'QDdwV`]5+gh.}}.`&q^et_ do.#3.n|c& @kDjz GXXXdzJ\o@Ӝ|'2N"vAQx{ϱ@X䎅"'U_M̩f_'?*,laWV<@#pk 拜@RArHhs`1 >Ir-NӳMga7 j⼜唾>@g~#2 x-0ٔLNR5Tf7?)| $98 XfGK  gW9d Ƚ5:~ $v,'P{Ӂy x?c  5T>N !b!Jt`,R~]]No?y|M !cO#iNzCm?&d욇]Fn^e mY}zXd鈘mm5~ST`%p/D*u^4"0gpH8 @a-B*f!baDt:X.p70j %0>Yu[ ]f??ə1 wq^3vi^mvFq^_ۀkb"¹D ?Ԅݣ>uDoXع~<@B:ɘ{ZB <h ®_] ?ޖX",5a9"c3LZ0/k1׈@s8/=@ݼؗ]"iA}ybyDMDUM Q x:paGv"o/>OG`sp^taW"Dz*"gDZ$RV<K_f` ȩȘ>+3Dvt=|} )R?K61ׇL"<VЄι;^@s/jr(aHdR,njݿVd/ \t>n TDl!&pt̻',̧\-r 恻 6)P6 =_䂟Iǜ)9vky""?3Od&}.ebrA.:(~q0fWcο~)Ox=zqR $awɯT{%_gͳv$b'v}&6 L4 uZv{c)y{:a9sNӸ[k5AO( ]f2PȜM<}f4n֞3f5drKYL.)¿4J 3WYu#fjpvIĆYyyWcQUQAwwZeL2`8\Ϲw,F'"⼌ iP؅(o3YqvP.&"yR__~ m`\QtÖ_d|/Yo'e0maf_G{Q>݂/lTW(Sہ)D>Z B Z"b/yyw8s2Ӑ#6f;0"|kl *uni=Jqq^^bB)% :gP_ځ <~ m~=WK:F$좂n8/W8ߐh8/yBsg0)k&gڭTNUT0fj5glyfz@ _x'g5~-$'(,\1A ed>_#aW?AՁAU;\v'l3"q]U1ͦp(L_ZUF+ 0v잾5kIP*"W:A,:`ElسA(@5%R{ > t}8`yYNɛ;tzw.gy%pra⼴y9FTNME>8/)mf1IJ[}5Mf.D.c a gW/š"+6'{ԥQoWo;Wu+Vou:b29M"EnRXZ=^)ۻXdoebR'=Rn5OFx '@9ߔX*ޫ[c\Mh |ZX p%<}"2_|KfdXEzaQ5@qNU~.h&Jp &c캪̈Wd(lw(\9}[|˴x18/?),2=82D|i<`g5a}{996KE&i ;¯ÎkɭuMY; &p;c X6{hz 5"ݔ)6㞞B"O-JOyޫ\6}RVEvֲ֣4AO\)E}d fXi g^zorL_ԍe7R:"vS8>8W~b262`o)h/U}x"'"tRn'%5wp5dw"vIO=AŔ{Jѕq^> wWxܣ5dLB5~VVpHoy92u扩}#/e(%!s$FzӰ*ܾRcf"4=]Vj젂C-ë0':΄ndߓ/*{zĎ6(j?9gb}tբY1'mV046.rVwTvW拼}56f+Ad@Hu#`9`]$"W-k ;=b僰+ R[ Ϗxv9UKmq(6n3D$` @ \%28Ylza`ӀC-5):1=YB/s3  MnOR6~Z.\fv:ߋ0BԮ؟R;%\[\Ǩ@k 4Flz8/S)/6)(zMo(<-Ą]j ;IzqfTiq^~e6&ao595* ,VC' =O?sBimdzkݎ'b%USF`y,L%;3-D@vD^EoN߾֟r,xcExLAJz]"Mau+붐Q8K Zv6 {*xbcń`D%!Px¼ 19WPn/9}ԝPAOv{(E8@kw]s.`MAAdx,ro,r{7k> (%44`yi@ܹ5Vk|"%aw gY>K9:{"-~B3ߡE[=Bv#&b؆.ҝ)k\;׬Ō1՚k*#qL<}OuM8xam:,JAA3nIGGbDNn'vxMbnþ/E] tNba^}cT;x'|)]q&^إך%~[r%n zDT$Iﱍ;xy9kдRYʅ]=5ZD68B;$)u`ϫ2 ^%)c|)sTЫmtNk=]&bjqfNaW֏xȁDf&GvAkIjٷ2iw#a%< Lw{+wo۲27A`,\)9_GZ/y;; )j`xe!-F]:4ʜ9lVAU̧b Xs 'D ENGRh H;T@䇱ȓDA{@`>F s"enȑț+y|=i %6ocQ sh0,7+1ҕ0dDVdσ>X%_W^x FWEnEw᢬Vdտlj~\խn[;|_w-A'')2M:{'c\/ `?`=m9 X#uF&}6&+ ۰&/$iKJIJg=F)EʞnwWÜaۀoD"]EN6aV?yOh!!XRдW 1 9^Zcj+Kl.q}aR_UXd "HN")P`IZH)l]>xAK'#kpGta.PHvCݩs,9.1یEi#r,GMe<n5P&s,ag1sF͜\/&#d +Kc9 Uj)w#"^ _oKV)K΃R9|P֎gH,w2*6V@n+e5bMK;,[ +\0M(a-{7OQAD}-KRl󧨠GyH֒JdL0%iTe)I 6#I7J"i߿R !*hc3*؆x`[Gsl f]֨+4ܔR2j0|Tǫ_U,yBji]8Ψp_Ro21WyI6s9ul0YyP)bvIM2ݏꈢ{6DE^᚜ك>j\]+SL՗yCޠ&>5'*܉j]kվ+ZJ&IYE޿@vi6tb mnZA f߹xDX%:qOu|wVkdҸTAhUq:Ow9,s;9#Zd瘍%%8y 7ic{Ԅg&? zVԌ4]zL:vpCEWnq˿黇Sf9a܉EVvĨXt#@TXs$jppzQ!F=9lt>Aq^~N;?MQAtֽ-룂ޛJ'|L*kV, ! +F~v+#bɜ8/z8/?TNȌ2C\9> T^y%IJATe T?u`. SXFiB˱ W7e],~`vGz>;Bo]]2:-y_<e޾rOZxI7amRPE36S=: qj IDAT Brg6b \ |t*o;ނqdi3aisT ۈ $nTy~5'bX cUujFCk * #>u/=BU`W5۰ ??2*&jθËRM_DUއgAvh~q^fyv],=8Y1Ycln޳yБ`jM|#fo:gRo.a.IV.{۰>ԟQ>xI-/pSq])b-CMKjvx)0KLs& dR?x p$DbaC2ӝşw.< ;5KJ_h/9Nڵ$Xjߕ=\Ifd츚cH* rJ\-2Y oVݸӢdC93yOE %jBDƈA?/ d7j/txk*k܎kFc#MJMyĆXߤ'mu#V<\l8/Xo/I4n)gQӰ;Zj97ufWSń)j:pOL#RT ]ST Vy5((Q4C4 x GR6C/G&'\t=])Z0V\?>dI˭LW@ۄ߫oInGip DΘoy; O?"m|jlja5@aH;R{~=Btǭ +|Τs]պ{ clcU|}^y9KNF8/yy;%@pNOb_wyʡE'.lҹœ>{lɚmo'| Z๪a7tVi ~9}8!ooЎ{[Hi舒X*he1jv6X6Ʉ"?T_K:o8Xޣjv;-7rAM:b@zAd"xGKkJ9giH.>Qu{,J9]9xRq,x.e dz+DNڢw{p~8jj :ONrҺ®D N/f{<S] GIl%.<~ C2)sɦ}Kmc 3wGj5;,` ]4‘ZfSľU:Nۄ\fFNbF/3%(Qrpf^,_ r.ݣb)^/UK isK"vE{yƋS3` )M3 )˔mW=~ 9_]b>iL/z,$RĎ7`Q͐ͭǮzZؽΈ2?K'Ǣ6KKb]}djnIzOq(^Oa .˗;QA 5V( ?$ vJdc6PCE%H>߉px9LeYIeٵaG'8KJةő`7}߽A1Gqr;hs ;F(s7`߻\v& bNxe;s>6˖y X҉4cH0;Q_׊9J.E;5 ǧxiGҽto`ZE%*w;wb/+nW dz.kǧhf'p[fx4V)3!R}IjYwhOx~l/ J= \W.VYuczW7"C[J)ۘ֋ $m# н5`*mkpZWxJiL^6kFg)EP/szgZkO)|'3 2-EIKȷŒ ؤŏݐ ѱhb$`ݿ+/By׬1"E켦rT8.s![a3y1..UM\'utn0vN:}h8yK!D> zlfDQ P.fV`Mjپzx KyIrl]zN\QaPdϪ0n:&$7n` [foi6`)Lqޜ_q^$]K;ּL? tq;xPiC\ kTFw/m:higy&vJ:H9[|ToDKLuv 놏;ɼ@uΏTj7:{ӑWMQԜ>z ®D- u,5QpJN 1c@۔DͱV(^8M{3^>(&:PR9 Ύ;ۜ4"uV/F j}jnHWk)*VPoTPxx?||SyWfNc 0)y {BSEei0h%O&c\p(kB9ˑyURw(>DOlw~)(v$Ud&D+잌 8/cүJ{'L2NRK6y<˻8_55w9*ϳlaBr1%Az*x&DV,iGQmJ39biU֥R"ЙKM֋Zn$8/bQ?LeR=y֪Ww;,Z*׻vܝnMP :g3ypHC.QK@A- 5**qj[s).%[XlUcow3]'^vu"N\]Y2~aG*#veQjIUAɉ~0Gj;,itN-] 1c[U] ݛͦQ\ ΐIG Q`F~V1n,X`.kpZ>d3R#D~6=~,YVü.~#bmI@Ii@ yBuWl+t@>a E \Fص{4^v,R5b'a/AAqb>/Dm27*WN3-)96'1pB#S5#U=}oR~c^o ®ITp%C{D%uv{:92.L*ˤcǢZ_jP?Khf0|{&t\IC:oޗڞ5 I2&|l|X*DTИrSvfljceinUX *fj!Y=mU9R&[UUOS{"S\D $R=7RtLRAzs8̑IC65c]`.fQAS44ջߵ+]VjWAb; <\[]K],®Dv{&FL&sRf\cP 6…[UYpVՋ#>{xu:bZf Uav (> ٙ1޴dzk ޻#_1jożOGD[}Tݔ2> xX$O8 I7]f3mshFC%A[7}Jc"!R!QFT:4QAwzwF0a7zT?`0y7ƉX󣛱Gk1r7 ˕XW6jJvTJm4)|&J)}J0AM/v>*g? ZtHIfXF ~!*ajRf+Of,:4&b .s;DfnV9cn_<hj0 ՎH 6.ܢ(lߊmxG~Fc 뉨`a,uz6LCF X0'Fa !=Ez %_ѹV0:P @V?SjrgJ&kY|nX?vchE;]_g`G' 9*MQAo bՋ !Y<r>nvvzMѮ,4GL=JҐmV+|tz)ûv ϵ84i]x\57qNJ{W:OV#C#ժ㤺j VYAؕn$R} <nmK[&J}.@APrіu6eRknTI |} 0>mZW[.n^c+adCt׋UVzV6E‘`jv޴&~ɗ\Ek] JM2ꪛQ3QAS^ ݉m?FD)h26QJcYS߈y{gqlcekYz2ʅݱt*cZc嵩'N0hrGTG\-ټއE#nZ8xFM }QA. nN. x?ǢzF?!p$}XEMM-lpϸ Όݓ?EAaޞ3rkĮZw+| 8C- ~m7^YmAr;!w'(Cj2hG؅Yvm`Q,}f`W?`>xhCMAw3OGjt5QSXyŔHu|jvxNRɶ}0W[ *X GVO3jzEB 8/_Ě u!JwH^QAߛ3*q^_ܔݓ/Ŝ,,B4*Q|Hm_JDz)u=k cN})EaS_^{pT貃zs&5x6O0w=_怓ͩqcWQ]\TyӪXfWAun Z(7W^`Ӗ#d^$vX,])=M-dFL5Cؕ=L16p~5,i9ˁ >:7 ?b)Jۥ0[:e)UR9#՝jFG+窾/R==šc3hjjFzH$oN/4JIX\?u`YuQTЇ. O뢂ލEyEX[X޴,{nq{MXd,|6SN &n|f]ݺ1@RCly@;0 KND\Z1}g؎SǓ(۱U՚HvD]8>ǵj)ȽZ)b A|=X D:2~%lj߷A{2_:tOZՠp+p}c ~0ˢ|kgRn؍D Lo&asܺjl%KQRTq^ձ7]9>厧j;ĜF.p.Vc<*h1ˇڞi vY/ ~ENw&P5T}6dѣR> luU3#coQ ^v=#s5X$in^$;GUH]'A @S~D6?/ZG% ߓToţMr3Vϲ+W{?U?kҍiaҕ"Y쎀AMTЇdP#nT㼤UH6'SKR(? f]{9I[ߊ ,u<3*z5R[Jë{$b[3zj]4H}7$i)6űKi9GB*f9vnl~wrj9:4(f #V/4 LSƁ@3$k{VcL&=H=4ϠN, pX<5:{f7٧˿/WaC@7Hu{j9sN_(r$4 RwCĮXv5Bn4̷)--Jр#PU}} xB .}=QA;Oyل XkD=OfHg1)?wqVU{B[(K7(Z@fҲ)(˫⊀(*"B'-TdZZBnR(-]qL&fLrO?<<7Ͻ9`7<-'\]zٚd75XMZOaw{ؐJS{<}mn'ioZyf,,&c}19f˽bstwP!~54xx:>^٘\eHvx<{<#vɧ0`y[x% 2zЅ-Eb,SX [dHwHm/xx 7zyם.]w | xWЙSrw[iSݍ+wq_=v| \Y,x7bΛ&(\-w6b#asz4e種PC bczJW=k=@"""GTܐ̀8P`i ;j3x"0,\՜vϜZvRzڏaЏumW7װZ9T)~)|HLH:^oD@Rfj9^`:0IiQ^ʼn 6`bHQxu:w L]  la\;]kˆ`4l6h D 2)#oud9lT'C$* p7.w![y<0L ʕpQ KI>XCQ8gN(z\Jij_b eBah+;:TZtu<=.˧xQ"[p7v.Jx?tՂqH@d鍥T<4{?zWw*ްKZ˕ oإADJ`0|[x@$Z#rK%xL  D x4-U8'݋pe.p%i ;+s$`6|!>x+r@U @ds &{<[GH %:}&ɴTX(6q?5亂ˇxX үsy28t)r Hw8a`#;x 2FρHsg`Y+I EsF/n^71U:01 Fm0X|>^""WvӀ29TP `paS 4b ;1Eylv2KD҆ۓa$I׊D[[ pMH朣e9 G" >l *U My*4D_O+Sqnn{w!DFCd@䫳Dkmk;<+X/灃A,i__A"]F| rW.+#m c2Eu1X> wwWE]$p?mH=-"y88"eR"GaY9,M`>EZ"{PM1hy5/.6\glǻy8@(ʣgɌ2m-H | ؼ)y.Ibx9xNX^u76ToR@E[QiްL.99^ yZˀ17&y8D"l D D Dzj G-""n_vXmBgI?Ěz@a.xRӀWb[s05<-gcw1a9 >Q10CJ8:$3m߼@dR r9 71p_YIX!^@'#ΰKStlpz)d[MOy1]u,{l)ȱ 9b߁%r(p{wZ_s 2a4.ZXڤBD\S#.#f$4'pR 20q Xq:4E.V|U@"=ܹ1u§9ucl2 Zo"@䦠foe&W6Qb\lB||D%b|%p}$ppe%9 8BܹZ#acEʛ])`mFyͳfLxSUyO DAx d}-UߎTi̹S&[=f+(sr~>35b׼Z{\}qÞ EJp0+bso>9:oELuSvQRbκw\ELLۭ.{r{gzƳ gV%>'z{o.ra; +>S0ްL]/ɜUx NV?.Q՛ [)@/"pB8 ;rH ^T-9cd+TP1q"eAȷV 2mH?]^]7ULo plj#QܷIODæ5"t?8%4Ⲹ%fQJ`RRcO{,|n:hlBݡ|[~sjma] R{gŌhLYa(:+[fL.;$v',t" s$5b )C18fX[mw+dߟn,w'7aG[JHD`lOZ$"QO *mՈ\RE~T-1F.Gm8V̨g9]ȉ?q¨}N*[Bڲj\mnr8K8Ql<6psvNoǹ}oKC_jJ*ǺS@LF2bFmW0ްˌoyU T,/ȄbUY ޳ErT8BkTg%nݤpl0oR —7fV#r~ r,O< |@7ְ1qf$]WLfDB+CFlAؘ0BZ`r.jk[m6hAm ~" ( {5nTXKsU7NUMH4a 9D"Y#rqsEn )eV l3'λ +ӻѾF"#"hE Blo nN˱KQRݜW+Nm#7)z;h8qR-E@6K' şcߝdI1bsR[1p`U7+ЈkT1xL=L^vZG9*iHv`oO~Fǁ )#Ĝ-8Yl I7pO'B-Gkb2θ.=`]=X {W^^oo"90rH`\WcK7)P}ΰ[{dtdG[wCsNv?)o7S/>7N|(ީm8cKv-ZзX)@@H$͵Y o˧X.yvj#pZ A,_)rFn93UO:lyxĤˀus9 O3rRpAhعRŃ,w~*jOC}uŌ^ S{yMO=._ܵŰSOW. ē5"6y2& )7(R4p݆ :9z+jv^ 7rlܒIw~e8'5$R=/ ;3E9FYhF8DayU}ƊFrLۈӄ/yszYL5t$ Bb\+WEഘWw84ۄ\L_Z%.؞HcI& jJzw 9=5"b; @srsm3RU>Kx:bpzXv84ʝE_%OU}\LGӋp $Ua^;imo\`q@!5K2sC\C!GD<̔:*իhqVFjOGsApZk ̼o |=TR6b=Mʍ DF`7~ (]=b2#իUXz9 a\c-?!,i({+nSվ $H< bû#yF=E.ziwʟ6CiX2E Í{4ӧp_nZz<}"..'㚫p˓O ;wMHscǨ=<)ܚ WigS쬇-rgNF̑s@~U7nrĊw Dw~3*XM"y69/:f'*=Hf_eSO"yHٸ -s.pUSo)wQ!xmJ릪.s$2 O""ֈ䬚$GaZ{٪`Ժ`$%bWpT<(G47p:a3}'wr/$fIV`$1 l;NGFc#5j ru0];dvf[j{J:r;w)ž+{H !Y=w]% 8}oYq簺@N<3n Ŵ$:v NpD"w-H}gJco `XX)q3&~0#b BFî Dng@}.հ)ᨳ2?Bب"UU3\DD 59\nΛN3)Ṽ:/:Nu(P vW2,0IV-5nV!{6qsbx [D>osngnYg-Sn\n!ȣV1O?Iݞݙ|ԙ D6FCLt*pZ1^ɲ]{RӍ9[`1w}N~ U$lU`K/SŚf3'aQ*UœZb"YF0'ɻ$4#r<@`.Q25U-cEn DB_)5yҒc%ԯIbgU^Nq.rf`pXaud'vYk30- 5'_b;1ja-wy mqϽ Pe^FT8's>+Wb09:rvJ׶åb9G;q]<}s! ̍lŶgT4)'(Է/qn s PV8Sdtj E>QW9_&a`;;dk386%8s4I&mΜ%P"#D ãnX_(MnR#bQRh+9:AS}'<))`E>S}=ec1n+ћ[J<{O>ō\'&I* sP P=s\BTE;wMOq.dgh3C ]y#J; [vw?f&Wx]'laj0@k^>5J/W_ <nj' y>!\b Jr)3)$<>4`WWgNS}L } 3ab`I5#v"S;YDM&t)TK[lQ :#EDT^U\.J[> /& sFtczm~iX.'FE1U:hxE9_՘ hq<:݂ cbM"Ʈ=Xa?d)̿|X-9IU9SPzS(3&"+\"0}V`сDC_.3ɯ]~;0<@ϭK"'E`Aޘ%R/nyoI2$IUpuŤ-H jf#0b*4:kN̰Xw/o3;3IᎳUr@D,uВ#VXI)SS=GπOhzg\28LyQڂ  S#X}wKF>p{ߗ"bqNy =SK6E^)VNd(T^WCTnpT ֯5"'"EU\.G;H#Ŝ)2ߛ$ k2y e^'"Ven^kzT}<45A z,"2Sd\ؾmEjS=zj6rj=TҭE!CvXxIikCA/&(_Ddx6K\"Wb_Tߋ9M /:î[\g4p*m\X#IKYu$mEN D %C$aLy"i</b_^qF4I?Wjϝ/aWg im4r[Fn=pn!$/I?D[ Trlǽ.=iZBT>*IClM{q|`(H?첬 `j,]t:4SuVd)`Q~T4`c,#yvbWPթ//.JF3D$&^""Jj^dgu0\NY߈w=p͑48/'?$o%;瓡ޗ QE-ڣ:qS bGJ %[ ׄkTUWT~>H,=`f̌lcoÞjR_Q(p=21յvs.Ʃ5>/]DAZ`:@ ߸YRd#1ՙb+Ί7ݏ'"âgbs`ŽdйSAژ{.pWŌ=R#v. 9q\.x̜;Ii!R6"g8y<)ީ,4VÁ])ۥpslaTwZNLΩښ2'P8g$S12N:~)TAL*zYa @霆,M6GJ'0CX>XkL,]#rP(L:_ukRn1CWݪpŸ"ً'"VCMRݓ$Ȉɺ}ckI-&{XD^C)"2 #wl9{ob!lʘ\J.3Jއb3"];ؾ6bTٍVߒ&,Sg ‘ BLJ[# g9YS]/XXf]Tm^>dtuɎocŸqI>EHk"^k9&9NR',i~HZ5"3g6a &eؕ%Usǯ$%/Zzkr irq "syQIs6 :X7Kd,Kz4ҚLW]Vtlj'SqRװO 'JjN=GA`oSU';dW&U|^(߱290I)4 I}VNu9CN,rwgs%YD׍a{.ތTs,³e@Ģv%r.R}~ܥ؞'Vb#tRUCxjw_!EA?cܯF}%Eu6 0]DDh7"22ÿR:hmSݴQ"ӷ?=bwb!HawS>"IYhfVSmWn{J{$BT~qcd9⟧pݿ]$DyT/SRZLuh=ईiR!$CRlmҗv ;B@KS}R)5TZb֚exO_P=!{LW]S=JjlE)rhA7I˩8`2Gl] 䑒;~3<w pQՅ:FTR^U}ݳV;.d,45R,;(TgD0vO*nlp pO]E'LMw?j\L^CNțVPԀiW2x3 O2l]㲜6|DG Uܐo%V;mr(<"e]tlǔ b]<9[(&#jpQ[SA"nM,)٪\3Cx 8MTtR̰U}-m$âVFv/cZldƢs4/!1mqgxk40fv}4,":/E QYb Pb-srdڪ4M$L~YPnz< K\5@dradͱS˳9SDsOO][OK^QjNDɷAW4JW(Mt*B #8K)hRNAJ.:,x,I7u&5akԪ^u'0Mgc`8f ,sm_su&b9: 9qI2U82;M*.JS1d//[0dv1La%@!_g>c1Uu1%Ty+Bs<Ψs5S䠈DndzX c O"y-%ֻJ#Y*NvIX|*VJEV+ (2˺Ri ,$]YUaks\.q0Bf[ޛ*q6XɘY{g'Ŕ2H_=^vCibqtw'JD^/Q~3oe{#|Cw"֐Aͳ+IT-J"ԕH bG|qYrHԵ<9XV/+ C%%t|A &\,pqd[ Tω_"vclT` pR9|c#؀ 4!$z]Z ŮX-xLu>p|$M4O6b\}L <~U1dp=ζ $`=p!~e b7͚$gkL}XU;Uجb/{',tH_,RLo;QpD= %ofp:-Zr=2Lt%¨EVC\ܽب_+S")br9$GTbٸ?]}0l3ȫ"ٚvʘ(=Zܨcš6qȐZל8eApaE<-WO\R<* u]K &b)bޛt.TNKUUDRS,q9tddjP"`{0&مn">ir;;?8d9Ηky<C";a ?-X<6dy&}Lx9V% /٢kvrv{Hvx<0UU)X<'_ _1 qVZ\U]jPW kX COE2x:Awx<Sjr]P!7{,DG` Q\])b=[i||zٍªz<"TwJx<OXZ쁔"vٱ]4>b"U*[kU@mc|| +ѷx<Ǔ?A|G1Rjd2 eekdG}na VjzEüaB *d0=tJ C~u:^ Wc @"r!9ډH9p!㏁MHԿK[x<`y3~Ax<xAd2@9Ndb]B9w+8`0`xc71"[x<X9\x<O)뀝u OQո\<LPW +"\qa{pmț~$We=E.x< ¿|xJp؁_ "SULTuTc۟綡_7Y8r 1v.g("Pnk_ɧ2ʘOAax<] hE@{[. wPֵ8; ӱ-` px<S:{S ;8!S]=MUj_`,p 0BzC0zb=}S< ;tzEbs49hy5b*뒨j${K_)DIP#rLr%xgGa)ٍ7x`֜6SDf2Ǹg=DP!9cJА/6O Z:a x1襘pQ |9[d8pL5}c߻Dvp"SSt1ZxڏX^Y & 8RǽGA>i-lzx˵[< 6GOI{;2=vdE!Ei$TtjT?p%"4zfV$rHF0G|m!:yXfu] -l3d5V"lԜ<oC](w 9.7\ٵ|ɅkTdîhL]OQ qatHb IDATԡ;{\1CW5AEιXsbj;0m{)ϗڂPF'٠w!q^_I3".b<-FQwz',FNbP>3H=3T?z./u4?bo)6w.xtA։vQKyTALؽK4, 2Okۂs XRT0<U7@*ZBY *dBp|[Sۅ5- aŬvt|u+sNFMCDϋEd6rTK9t3oO..TH4B===A t%-NyT X x01G S6V ޔMEhz&`4(d@ V,,M /'}5#7 < iym_ ްMg<T1ATahwarUeBI/:((Rs)"]ATT EQ@tJ ;mw6ٽgvfn93syۃތ5y*ዧR۰0/gv1fװoNޣ"o¼ rHkR5qWa0/;6ʈTNU _yhiϜ|p1x; ?(TT ńL[;:g)Xp ƪU7玵NE¼Ե0Ia^.nɞa>ʋ*Hyj~Mü r>3DFw)V zyh-ǪދS;oc׉LE}QL\hpC&yjhߙc Ɓ\o&C (ǁ:5mnP]DͻU wrapbO¼|a^0/#|T紜楱3cǔTn$ؽMmr|4K̩i%\A =+?Yc&Cz#`Re0/W5Y \m|7pp;֥̞0/*e0/'y,VpH=PN tgo¼TR.G`fj TQ' »? ;וeͨZhmc8N"^m0'glN[OI\FD!qYť=̆AnP:v4|@>ѕ"Wp"۟v}׋u|7Zȡt9scf^tNA(;,׫IkįErQr0/#|s89KX4&`H9PW|y=h-rpf\I}} >Q9d]362(U4-Xd˵_TeqCc/u2lb6D:|3W+g;ɉ")"R~>]L<' v0/[y0˨0/H}Z XуjzIz8>yvBSΈƬq/s!aU-^ l3秅y9,}v VVvr/AaBl wAl"v?;LQ{E2hSERz*<[c];U-r+v)P/V0b+EY~jS5ZzToMlӣ8f)rc:eB1ټw ð "dyvI#oFbիq-r{ <Ȼao\a. K #qm/7¼lֵ.7cckK픠b]|4PT&_o0ݸJü\y#HSNMU/VoɪUTU5X8{*;ADn.g31%i|[SF>{e` ɘ߉tzfN2 D1˱ZcѐzLY"g aCzcL9 =/vXqDc%n6Vrs¼\rJ{;u]#~Q>cNR]VaӦR](i" %Z0H$IeyjjR~`K1@E BcU ܮm-̭L'-v"gn>ye՚F(f ,srj&x)t*ke {Tp@k<D>gPdEFP!a^҄gG[ 0/,;:x,N`e&<6&UV{=BWm6b`PB.b&>C/4 =)8SsXJLcT-{+$wIuIc7ДmqJ_X߶Xc'co5(v-f%ؽcƨմWrc:&~^8LhݩpFE6Ɗ뉷"E>\ZtyX6߬9O踲8+rt Yb5u EfVsXŦ{` ƅUMUNmhd7FJ)4oKfLcؽ;sa)vSr)4 |Վ#DWW8fe~q|d K`aP(sa[ؔx5Pћqލ!^Ӿx\Sj~ tʜ5W:aoa ^{/(ܠ-<{}L^*mlM H{`/'cs,Iݿ1׳.<*v/%_ ƍqm~]3=뽴ϱ[{E` I8(s 6]0_2u!'~_9|~jgcPcm] {a^u57/5qSn,|XQ93>Ѻ;⠠MdD^a]l,+W Cݔ*ՔlU;@76Ƙ"{1PUZqD!}r!}YP@H.wmSOa`CI%VW|F^l7]"W"R8҇,î T.F;_$>W* ᭋ8y/)9SZ"%Wq3̐ Rl\ ;]SESS}(vDN&rtK]`”@cTvyϸ 7{ )k)\x&\-{YoEgw\Wy{;>W┽;m𦵈߸=."!Jx"(_4JPw~$0Qw +Ds7,OAAo%j/6 +[ąF~n-̚ڏ+mW̅,Ei¼uD߮p >\ܔb0^ ,r]- rL!kՠmYA{`+b,#Xb7V5[- )pkhpa-=8Vj2 `_d; 4M9%u"ۋwJq`KD-{8 |ؽkYV\MV{JRtlps&1Yg`fK"伐Oӵ"\,~?zV2]hhzm=5/ڶ~&r )̓ib.=iB1'%B`q^7>a)#}D`sOxxρ ˽b68VS]+h#?&֤XxX\OͽJ ֿ'I݉$,J U+C0!vî^!v EqȄ;5WFDk;0E.-k6 "EgLkp=7 LEk)=$՜Qg-v/8ƷW@L&xz2>i5 {@u 6} ۘ:Jlȭt d \r|~PЃ Woz d_~\lV}Q[xPEBzg3ǰq糀a^Ӟu6o~.(腉C%؏Vŭz)"=α`8:(MDalülh &w0pW 癏 Aa^F]'=M ?L+o0/Ga\Wä{6J‡>tumb XeeB%"RSgq2Jb ^ 3ob¼lyg5#p&n)vCn*TMWl^)rp^U` D]('p(cƩPd80@z2t/(\l)ܢp[O9Veig@_#2xOv.gokۀjsA+ }jS(SEv绋2}Vm EPQxVM/ac,IoH9H@LF{iXQYxql>}͛X*E>h+dm Zh>)XW蝗dPl_%(}͈ü|[VIev;EjBa^[˽~~f-IXZL"9.z%nmþNViX,8.3cb{]OP&`.#I|' RR XOyY)uT DdW(Ha^?B0L l<Y즮$2 -L&%E@YTa^>!m[Ra? DAAAA7eC}X" %(+b$Fyxa,`i d¼vUA!ۧ&'2P &(X#9iv,}E`pdފ[H7 )w4*rF;KT̮]^;Hw+t0,#ۈ/o6F8<̫>-pQcV"G};B79)4@kأl"oך$9_M4;uwH< ༄حoaqsO(2˅x=޻@Ͷ`oEŲ%=v)nUx;Au lX]lZkW]\\``H SJ{KsTRB1)vXL , Oi ppjI;(= )B4 [J9r,mhמ v& reO`ɉ=a^(y;* K2֏5M^idȔdn5"LJp x)0T' << @5$q/V,$ME @\0/ľ{9q^1!ѧ(ZmB(p\ewh i;^޳2=Vm yv-VSkTbb9eo@Ǫm귏RMk1K Yc~O3,):%oȱ_ims⯉,矻&[)rFQy~[LƼw9wKw{`i,OX, xȢM|RM,ӢO(]_/5 ~bVbRi0=(RrݗbQ@hW UszDjLQ>w$Vl i%cxC^,\] C8<2l3RK"Lm}?O`,"Z0/c¼>uy2qBz8$6trL³ [~-]WOleBoĕ*S(豪p|!׋ NdvqzoLFn,ܦ5̝.^~|9vnLr~#(h%oi`5>}'? j~hjMD b=)?F59<]gc缏̶7_4۷-W8 [pO@MlLU9߅Z[(| t [RFs<-^+cbYI*ܭb}ba:nnQFQF D╎[r]H޶tCi❆ۤV CiNܴj8PʹAA+a[Iz2â6kVs.m#cw8v ik@kbs m(n~Yޢ -} ȫ:ˑzX#"ZåN؋Wy%Q%jBIC@I (nCl@[ .y0@HzGݔno]ϫ%ҡ8A&a|5jBP̏n zYc\ (:'͓5ca_{byQs11&TS;g{!y/Ai ό/ < i.*}J{.kXqDeQ쉘bxC y[<yώpJ$rlr6_jZfΦb'= *MOʮ*+vhtm켙,sJ^1ع|Pd;8UrޚxX>9iK*\踁+' acs1E!nl C\>r;^ew&70N[Q N/-ʲA.sLʙρ,?D0>Дrb5Q6 삂ރyVRrbcyfj5 )v3V޶i}xgܠ{.f8;ˎa^>Iފ]\ &ѺT/8Iz}!Tu Mq&QŨvzN>J˯faruSE-yacGPЯ=DnV#u)@njX@ӳ0{X?y#1}¼ *v΢ &Ul*XÍA{p<3\۷ x[a^e0/Gt@(؁'wJOI9D7Ƅ3¼7x\3+5֏{4|}%lW@YU@ |P݁OBE.~k`VkX !VD/0f n:ÿzMuǁ]ONz1OD=Xa{]/F ~;I#O|#3|8R-wcT㟱*b_ך lR=L|-(h2*\u+69'a^vŔoqkX]a1¼ x7X*QX%rO=Nn ~&`lx&D/ USi >v{s = (_ދXnWhoǔxc9p\h7'R`ż~WfiY\,.= q6Cy=($ t -۱_N*0l/_s|eR)Wecjix9~^AA)W5(߂~3(_U<9)vt/-nC1E2'y</Z{T)~ZR%69ݘŒq}؄?Su 1l}?Qq*םe\ *y˪T`vwIXKL8&̷`a^;S|N@BWa[*aT/sǼ=(tJPcU-VeqT'UKNEmhSZLyhi-6^,l8>M*SΕ*>pv] * ݯ?hKʻǩ>ziD*¨dd =Ǫ^VЧU- hh:qV}ftQPH\CT ?a>\Šl׌Yg$Q{4@ݏ RSy`>wyxsycB&E&cax۶Ū>-+E:N# GV\>5*v*~b9Jᇁj1ǀ]=E)&p•, Hv@u50>ivev{'q},^~W)܆EBzo`.蠠 >Z})v6P>lt@K#(be&XF.M}(U:| G9Ӄ.s@ yODocU/L6k]q26rh.RߖfmR,}!?V{1/`,6 QKD٘ ¼܉-h-'_K B{{97(0/bWyy[x^;L+yXx_}ڠ(yDNmVhd(C,|QS쾃*]'pQmrǜk;"ɯMyNa$INIF9tu{Wb;"#hR 6"m w=|((?{8 2!(.2NPH\QH4*(屫g$62pHuPЧakBB$G}׀N-("zr|Wbbba/[x[\U{'(rח;; eIfb%}'ˋX?nk0lIV [Z➶XYetV`9@}.v%\Ɵbϫ]ɀ(`%3otj 3\ ށ 0 8SRk9VPde,ԱorPΣTk] %KF#t'4*2pՌߵ *Umpebt"˱s+MO,)(h1qꯘqp4i\E򬡾ﭻJ',x,^huG&/9]FqfbyX1ŮK==T_+'11hH(V-NT}7IBc"`SWFtYJ۔DOgO<֋XA4¼R-ؿ9a^6 >M -yy ++Qw._9ԛ%RշÈEJ|hEH !mD=yUA-J' y;Ȩ/n [3:gZg /'`Jׂ.(_4"y{]#QFxmSm l=GJWer?\xX*ɒ. ؝c3}F__K06_NGltV <~'g1JX<4='(0/7GbB)vRT"o`sӁf_F+VMϴRsF GGPUMFFwNgP.퓘)u OkF@y9w{," MͲ0̌uL dddddd}7iF{Q |\^Ulh"#3.#####c#([X1 | "bS˱V8X L"뭔XyH?Lz,UfjMXw +=SQW D"1FU풦݉l |McȈSV#?@3Qx<<_Xm.o " X6}GQRAc`z¼&X86n?~+"sw4jk?Ѷz)9Xۤ*v"2+7xWY<7lVU[DrYr6ա]ka]L>\hG@u3;, WVx8 t6Ϸ@6"\S._V]94J)v;hiTRRi @|LǸe QҊ,}DTR=vV?"2yvrTW-3##/ "׋ addddddd-J)v+)I/  ){cpk/"Xɔ^>ZB8o rKF2kIQRB@uLJ$?]iD ܈h N8QUafdd|_dn,&KFFFƺʵ"VdG=(`c'?Dd93d Er^E- 6;t_Wu8NFFFbk{ ]"asU]q8$)ମ8GFFFFoƅ" +Ѓ)݂q97"ϡS=XoeAU_^#"g]|7 IDATi.>OFF:F(2 lFlgsl$EvW'{E+W|ddt NnO8X-~Ks9/f" x(`wQ8*"K/ѷe8]Խ)uian|qFDxo2Uj|1yk^%6V*3$:>+pAKm222j$&)yUQD~KO+‡9Axm2\? ,C1TޤS\|R3hFFF ` >CdQ{\kkD6m0 >HCRqĔ¡ p$@}> h'уw$# 9қ;U@?S6UjFvqVۺ}"GT-P{ j p_hbh]]?lБjtizn,1DS[u8Q - ^iS8wRQRQOf AdPwcm2Sdr0J=)v]MwD]5"cCM6Qtuj|vv) S3z`ZƖl.~x^` _?Tz~OUQէzUq[ XG.rr(rT[bl=wa`q?8SDNu(r_(r\- &WUk%bדOMM{h,v\4 ="ESe垯 ΌuP!9]K3hʙAvKDu:CPLp؂e>W fcp1eU]EXGP&0YLl-6 `Pdx+@3&g@= jETO(\fe ᦜDh sOz3DFF@dJ50rpw >{"{HaTP>c(2" T׸D0C\nlEAعuOO~,uΓ>/"լB(w8YͫFl]0D7""]e(yxܵ©6TP O,B5zId&ˁMBItDqIk5w@Q99c7UdfR+׊l)Uume950:Mjq12EmKz0h؆Hd~tOָ"4)vvg(/%_l=֨?pS/`^]N"rdP$&ZvW;=j޻7JdX?F8MS . XB'DY-Uax"a7B&"#0n{ll-vTÀDSzy'QtJI\ jPk 새L T߬$`\l8| RUflEj;8ZG I+U-C("p{~T(/Ĝ=6jEa0zWS2f!@ +7gc2gA^j9XkMV+`cPˡ"zgiSB8 E6 Tץjk+vc۪IF Qb ovc=Y!0M,Pd@uuW&JǸHB7'"[`?3Cٕ<M EJ7{'CX|ZRǢڟcN~"^X <CGc,omêz^S 38 pp ""he 7]W&Å.;Zu$ ÝkvgMu˝\7+ٲ^`Գh(_ Wx%8:ip F+o]"sD* ߌ]uP/~Pyp7!2c'?V p @v}4Uu1iuH lpTGYXuIb' ; Ù.ZGT:;}Wk&rLNL*E6u67>3uWĢvCS TU+q Q cpf ?'5QJۑ~grWկyz~_Uq1Qճ_tתjQUݪgU=+)jD*nѣ8_hqVĬ;Vo+nP&ANtY("p7Č0P+sQSId}`d L`7컗U%|pم6~i;".r+M%rK)iC0 1B9W1-nP=nF\Aj8̋@SZD_(2s;SLR |RR"jb>l N,qэ~9qZCVyST0.,;G܉553,4 1DM08.Wرw*?"Cż`EZ EV$^r6<įB;y=jr̫~ 1KSNi zycD{[X(B6 6~e r~ +;籣 !l(Vev?LQDZ9Ju10;{In:v&pQ(2"U{LT^T n5CSS줃Ulo pt^bk)o.gޅ؂y\eS՝=$!$d$MYeVEHR ¨8 :36?ufqw܀ հd@vdsnꪮt]nUսwGL{E]$R0…j@D"\[Iռ_^E sTWmG%oJy)SUު;|)׌g 82)D"Ӂ0HYye*𚷁Y.P0dȌ&0OΩ/Ux6 ,%,sFMߞI"}N)9H<3؉׽O5`."kHdpciCG4[.?jE>u&|ut|$2 9;{(XoWyTHdP<BڀVĢ&Q}|15Ɗ(Y.~ދ{D"rJiBD%]YbLJZue!2?/e@e,j|.JUPDyLuk 3T_`cRj,\luH'"qjB1E00R찰.W}3_$DVD"9s.0S:[%\𪚇Si\\_|yǤMM 2 n THMRru1V(vzSv 5 ̨&Z*P\(:ެy&j'5u7|*t[EFP1}) k8L>»]bKQ},eafȬSްk YQE]4_/zّH<_"Hp|]bf d;A^+<\ԡ0fGNU+HQ`j"ִX:ip%!RحO8׀#~tUn{vpwMpe扜R#h{ٞb9_5;GmyŷOk;cySfkå{z pK}LVu"-g"'=9@?;$7yOݯD.,3DLPad/E%X(R+ _ph;=]K*b%jy|Eo=QW0&0KG 9FL8i.liF)j QH!kOZWt~lgkae(ikmN\H]$2^zwD"+x)?Y׸v9d\p5͛3׍)*{ bڦ>ƫK!֢'VDҷvŎ\Z*v-[kD1vZr9ԕß-bF壴xS}M;q9,I vxL9P1E:"vȕ"?LzZ}D8Q _CJuº]k^Zd3B |ɧyXZ9c1.= ]" N,m0T(q8GC55@c#45%ehlF٬}5 GR Ja {^Y_zV,gF [v3F,|fڂ+isb1ynݢmGkʵP(Z!&&xtHfxDFWKPf D#93tʄ0=iut>=M- Z^!jbIUT@M /}"5żﺴ ]'x{ۆ6o)ע^cZ1+侃'V&.f%*6 q{ emHnjIZՎ=2g%D0%3y߰r?O}^tF =ao`||{eU!~3j ɼĿ_U&j,ѫ*km6$on {RfIJ2&!pjwY,9`KZKRypSλ0 Y"NŔbO'vaT M=X&uImHz6u$⵭%R(R6F =kJHYGn<4qD7$Mz*22\VvNQ٤PH]ͺ{~(^LF#K">X*,hÀsA>sT_ȨdG}#90F[NnyF"mB7- 7`-rZ]DFEW}ᑻott<U]厕⪮KoDD..Gpƭ3ODVE"X np ٪by%B"E qvYzu 5b9fɚ [־E Z$IhQFiV(ҦPF"w>klpHRiؕn{5灳] r,f.OrV)whgyk>Í͝`-|1^ҁ}X/+X@{dJUߵJͳ~\- w[8GKNRl/](ppM"-ʏ{6zJAx} Ixb߹n$eirW*"(o~ @bZ6WD^r73dO IDATTN6[|z X= u C&ޭغ\ pKŠ8vlQ٪fz{5'0s^"Cx zSZYZHz8X~UO`Տ WPi$HdX$ʣ- d TJ~ G <~jV廴iN^tp 0`a*2<_D"c@/eT z gi8,mT ÔG^/2*wH0O+%oS~5Q½(Юb0UsB E+29T]' N'?xW &㊝[;@&͋q][ӖÎ3)u #+)z'fy \ܣey)C0%X V$'׽2kDR+ \#ͭ5Q 5EI xOH^lٵx+߀׋ /'NYP!54V-`ZZgmfjDE"Q,>N՜d6,~+24QI#{~}jEڸcq)Z>&1!}okA7Q~0 ͨK=X8 ~1K2*޵0\i/#`i< VhaQIa1?AhH}^I9MF>[E j؍. hO,֪!Z7[5nJڬdKc 1P^bxkdE2߲b g[4&7,.-jB4y#oz8^$G)"j/gݯK+iz Zl]8Eoy ve{)إDb  4X Ud5yq'/ E7n󈫸֘%&tʺݮb'"DJm^&e< f -r yby=?⻯*B{#sTdpD3 b7wwœ^L{\ɞL@=\eZF-W,qI|vb'H^d߶` \ gܴT k.-l lyaNNdPʦ!*a2<6 ~ɰ_>ԏ<  Ƽ +kWK鱋<8t=Տ/Ps(car P?%_jS# =px2S.~8߽vwmb/\98(*APbc==Va(/QdW|f>0vjUɨH$TϖQ]?K_=w%z(X:yTCWkm7-UFE8=uKT؝{*aS 95 5?`YKca?k搛sCW$DBiajOI"BM$KnXanJ,^[y/ ^XLɺ`Ͱ0^A0X%';Xhu >\y 4`asŊ^áy~^83KmN}[OyH A=p o  m}-9'han;W&IyT>KwsPZ'oY5~,gTeT*vZ02).ُ@,9[m٪'5{X]/y^]٦RZ]QEܑrA0I+XlkDR",VS1B<1dn Ŵ:,rܱ<61I垌E,7z5Q1w)bsT˺ak5}IuҺ]PHzg g^,[ ݪ3֟+_ORnNyCPx}$k""r!Z|W឵$rng alղݤ{H>:\9$W-,$6? _h]Ku)b\Y+,}r^y7<[-Ɩycxc;?Y=*4aR{7'ȹ3}{'iin.c硘1AKGZc^)V&qAx$g٘)vc}ҹ꫆´Kq [/0 (ZXpgؕ#H0  ^ >$p$>{V `C`gC/xɋDDm!QKU_񛩺( R^5kl s#&L\cC̨.+y_ϙMj M>&lQg"؛)Y_aAUa)j}uRVt7BNZ [4|ͻf<=[ Wzᜱ\ʂRSv=l ]E 끆f8^PYɻ["N Qj!`>v+TwV-~Dn [)͹<88<3Qis67`GE)3ZNn]zMf0ɍD5PD 6 -7(f0|bŸN#R֭֯TPPbw,E*i~G{>M}ڱ7OIX rQ}#*0RaU$) {$Ш }իe͚ظ]DU è`g6-'ʸ}jRI'; GA= 9(|Gl٭hBIq Bw Į{-uWbUMF n! K*2ҍ* %s(2!l&U;\/)q-Vy h}3U<ry>g(gjkVs_)KM.puТmN|[Ej֋ׇ4Cl`U ;"ǁS]YxeFwD3x"g+T5SYkV:!#/)A)Fa]Ǎ;arhˍwF`&2#ͳy٭"#cZ(iB v2RՕ7nqܒViHךM14ܖonOg `F+vUZPr-^Kg 8cBtGR_ۺE MLx n{WVeM{h$B^ [c&(Z~t|ODmOÚM5"L)[ xjRzyyί`{+pn<66p¿c!sUR AJ67Fyx(Ej=F9/ ȭO6gHwHn>g`?d`ժfxH5%=z4EYg;ӓzQT/W1քbW3E54x K!*=M믁 ׮Ob{TuzK{jݎ OcyTϿL򜓙մ]b^v U V@`5\<{_9>qN*mf-imE`oM(3T_j |a•#ԌEEYwk8ʣ,Sr? nEEp v~|⍟y؃5rCZ~(.roN:N 0b-9 ϔdKz`s\G/ꅳT+yF/+ mglCzQDHUlun$)]yƬELTP;I^Qz1;7'& j֥x nd X(R+tK"sUSL{Uן)'"{wH8$`( ݜ5-KBਸ[_T=v˝ ׉ "7g% 0:ۍ/ 59yu/U][ԍ!eդL))"4j6W䰁eTG"6BB.Hb }]. |P h[z KlʔjCEez?Kexa#lXf_pȠ06 lR }FATiT"*W!)vS %aҡ®ٴf<"f.axا?+v WhCOdO" tpu8"JA%-E#ۀ vhvp4mᬍjy6iHǦr^MFÞNFu5#}7r7U|>ǥk#b==B64NW\Nb /m{ɨ6GVXVdTq\f#?S)6Tr{dvČ <6?,<ܸR ܯYJ˱B$\1LTv/s?O= TXO8w1W_\n'!@$GNx!J>W){+mqMD|H&(v}z{n}cܵUMJ5dQ&;ا}^Q@ ~O10^]Rw~Y*  .f.c^$@ -)v3bt@RkTu!nxTu`!1/1.@  )vVE|F-I;Zt {),;@ 75lޠ콯J^`@KCR[T5-# @ bWkG UfLjZDv:#l{" y˺c=L)] @ B1@\RUxi1IQ;`$p=3 =.wo.(v@ tQd\O#zb;id5|>yTaS׫4$x@ a:9x @PPSշD'45N-swF"*w=>=CqJ)vA ]QxpO$zb;TSE%"Ӂ9]づ}zC7B1@ A:Ħ~KQŮ=TuNB1@ i&aB`:0g=G)Bn]7#H>4PWrV}"5g6zM@/ZqP^"{SFe% 诊]Nn9RյQ]t@lտXmd{˃Ǯc>Չd' cwAD" R"DeTۤv#1MwwY@su)Vcۖ|os|>Bؼ.~-~c<]$D=,<20-(L*X`x Q\4{bBSpDpD'_Cd &|w:QcpCGQ\PL@.\Fc#]T'i.$\GUp+ʠa-@>L cJ@@!,wt]&oeYg;5[o b!׋TroW6 }JDR|CMORoVP$fص "EPHa+QQz $w'We:%/V}xJn*/J, _w }ca`\ >c8dV;纟J#T5hQTl[Jy wp%V|})X~9,U0:/eQ!9Q\ImT'bC by]zcw$V%oE]T'87qƯވ{ <;[_|v5#[5L'sx |3}  u<΍_2t$2=Y_My߅-G{XɸQ>ɒXI7Iz0g^bC <)zۃrjsynw , o->૘0p@oYn9!'rzGS݁ %֓r>p5& sqSF[DFcN%嗮qT)3v|8)إNýhi!t.̘G-Z{5YdPX? ^DΨ2XuKrHdi^Ȩ6+;cW/,ώf( إo=v}:p2FOcȔ[Zg\,"wH HdRHEU]}AX Q]cIg6%Y ZGmodJ}&m/VĪ^zVXo.؉iOppa#xnkgzl٪_^UhS( 3|1#nDz˫tpF$%VX3W(,l^?+ޞXU| Y9X;ߧZyJaUܘ[duEs Sg] " pTmY6*Zq֋Te?~FL^@uG<PIصa%y'& | Tˁ+\EEFy5щNeQoycy&kRmwz״ޅM}JGVH6'`ap2|]R`bGFuw^$XF6XI0\Soȕv_W2u' 8N84r*LoCNC9 Luw%f*Q|8+(< 3ք#;4>ÝQ|%I+Λft9o"!m:=V*buw$4Mk}L㩨ZB7_LaLv> pR֧TO2Er:8c:9WДycQ7cQ}`,H e ;ϗNdPw"YǨqre0PEr3~vev޲Zg='Z< "ب*D`*xx) l]$r|nBLüf?{fUy-w#TD@FQKD`i7I7ݛ5Ǜnbe`IFOFMLP)*EQ)*E`9Z{>gi C 3g)߷Zqt$oм6zxpkW EzE'PĄfƄW' D \'6E}链EG(7@' wWĢCY >sJ?"ZO8&EQRQ1Ų=,䛡 {Z{bOu`5\밾F93lk8 s $|3 =R̈)x ~,ꖄǣ̙NZۏ`)i> p,PBF15v k,8ky(UϣD֒fu> 1 [AVgY4j| rZ5(a6ʹatF)L3+ O`<+lhs=_Gn_1bG&{*۽?*PH$ ZAg|Tx 詊D҅U b/ęf͏);Kf؝JnxZSX[T7`㑡[ilK~;`Nw nd.93OSŵL9IM"L,M"_~,C`)1^.{ ( b0bIs=a$4s~ofx.xgC/"D0ƈș"SD:?)3 onȠm(>.eVBU7wUuiUU0'10H%-.AaۻRΙE9hKjC{#;Ol)UpWh&DU}oGu{C{PHx+E4+EB|+B] 'sPdd(r@s '?E:7t] eJvn~ ,&;|-X@Z4S9 IDAT,)Iޘe/_wOSՖ2زŰQ>6F9;lQ4`]AV bW=AV \b EJt(Gb`x̀~W5TQzb9 v12GrB13XAVWY,=0?u$wBen0~p"eWKD:ki&doS1 gK復I&ǥS1YԪt$fuBݤa}Y;hO9Ee7ܞ١HAԿY1UST?I#Ǣhz2IR$]9$G;qZdع?Q,5}} fFW7o#N.dž-W0z~#l6yKĤ1kD/ףJa,EVX35m3Nc(O?Ja4?r8Bb&φ"W'u:RTp .-B{4K5(;a!VoYa [N,]@#HX^Z$f/χ6f37.M`iaĮCtЯ?tV)|NC@0 EcԢut>zwc/ uDLǔS x6qAV:ar#j ;sa5 (װQί 8AV :1бdɱAVnmD.lX+I9`NšX[ܘأsQ&a])eb'3t#.I4사*:r(=aԅ Zٟ#`OIJ`؅"DyH'>l*z J7[`&b&;N`fKYnxڛlGeJttFF{n?~(b8uĤ5?*"m| J d\ˁM A3G cT!ՙg99xpJ{.߉LGnUX);,{Ium"5=j;sd,ň<>oǾ/SN9Wp߾_ Ad>hB..@53Rî#O:J]"=:V^0Lڣϑ7]dP"g! -=B&9@5qnX+ޏƪx?ԅI-,u&[[0DmXuEB)B='S$rYIjEoE7֫E2jJj Ta\o}f/&.XsfT9L\F/hj9u+MڥxM$D사~EK>}ǠVc\Bd, 3kFG7RMP*-u*2p6R,c8J]^sNë10a$= Z"Pa !"yѴȰRQλ{ ̰;{ᅬ+B:QFE=rgÒS1"7 >GG} Bq#6 /SNCe+ՌrЖB<2Cۺ酥Z^H"CBB'\fdFLpxC65ï!Žç E7T~bYb,4;sX .g㣝:p U`S=54$;fc>0wvKuQ:FG:2q[w63Yk1=p6E@gh~TO~͜.|V,#F8og'n@U-T2PU{Jt;[`YaܹV7I DbP(2(5gkBzAqLfzl9fߔDcĄ|+H==ȯEp!N$g)Dbh_7Oߦ6oc0*1~HsGpmCAnB\'bd:2L3s]!ƔxJeԢ5փS`Džr`+2ki.`Dؘo#cqXKB.l"VP,^C>v(1h 11,: s Dd}_Y}9q`߿}'F5; m1#d(0hr 18 ō:½"n]MRuVۏ>[v&WsLUsF x Q ׫pz/93,֒ɋXoFb~,:d.0>5l,p>\3sH{*:fߌX 0Kdx`GԹ,kxXK6_avrFcz\G9>{@m80^EeZO|Iٗ4αUu~B^ϲkW:X25tOݛR)zF뒉[+1۝ 89booyYB7mo}!8SaF3Y(Ȱ#ĺ]A~U㩊1|tMҋNW/1QaZlgcߣq!]x<:rD(I aG"D}1EAV٪Z̢剄NJY]~LaOkOxb-g({`5~"CHX3aDM1~B7Z Rkr:NdxupH!Wݲ<6Gk=@~Qy#*T_Hb!7Vc3\ <#m?wjO$p%XvA4lp5rYz+pܷ93D̙t"F:XaqZJt#)m\&z*e64`~Zy:G7h}+0\VHh[[I)9hoaAo\3ZQÐw8\Q/59-i#uID>#ED^DއüW&c{pLa3',ϫ |nER"u&K3]ssۜZr9 Ϩ{yOzKy"՗1sXJimSΐ V g"aJૡH,8.#>yZe1QszxNmO! &YdhԶ9V2[{bϽm"qP--gm[J\+TK4;[4켉ET\_!A5||`mն:v_1"RlFs s⩷AXZQ. lf\ȅ j#cվ)pFVY]Os )7(܅틇R{=I݋Nng?? 0fص*=;.<EXx: G,2DQ_#\"վ,ߧ;<ޏjλ@@Z5ciW4-l\toFr{ E,I2X/]9ۛ_, XK;8<48ZԌ-;[/nOEejvc=jwe ;w?9 #5&WyӼ̑*G%d:E/0(qQhKݒTjbba)!^ub1am9+ji=aV`Lጷ s\U|ѳqoUoPu%[ Nv.S`Z8Gᜍ^ P"L Rk~p8|J_0)O^ P+0S>{RuU bĎmbu/AEamw}[95:6&7pl&vE=yZ:_]~6O5%)Z5q(\*fd]g& U̠hA|u7<2Z߂6Qs60;3Ha}xgN>*RD~ |%VQR?{~~]~xSX45̀[ߋ ˀ<5ueso.1k*Eg/i^lyN#isY`h`y j{ttB(|/T/m[9o ,E)r@7dՅ93NT[ }0ⷱZ-b=`TOa驇u'q'˔038VQ!זs+顑YڪEbuiw#G:4#{㩩Ź,aWjFJbn77뀩XU֕~ c As)^5K,娢å]20)'M.Jet65U nKᛪzwqJ74^STZ/u-ֺ[ߣ:o[ yXIK̰DcLXXoNd ;]0EdѵBU .Hpϰž3~=2t?]oSLh^]t2p:Os| nM(`6d[3̬ZyS/ svQyAV_υ &xq{ vza뮌Aȃ ˂du["vQZqJAV8 W7F?~d l?zm路n$U^E}*qJzXE|w6 dAVz~E^v1n)`!õaqN@Yhz 񌠓rV9SdkeK4evbN~(jk0}Y oFUJ-0?cv A[0.jڌ6a >Obr^҈]:H@UTԛ΋0sz,9ޔ~ 8nu`<Ÿ o*K#aׁɪ 'vP Kz^%µ _ŢvL:?o<Fn]1Pms9 f_h↨m, EM\%˘BB@1IaH X=ϣ-zhJ9mbO`IhG̻{m"ý`)`E0A+5ECC_UݜG7h I[`43ʢw3 Ƈr+?+!f]I>Τșta9hvj`E>Y2EsѰ(b较d5[Cޡ$Vz9lPa̐ x_Klgs nx0pP(u,)Yݵ#E{x˒:VaV 4}/GMY&+n`u.#q\@OQ=|מ?^Վů3OPnH ;F<c$=ŝJij6P=|jAEQJwֶYpZSũ@uE:Q5]e*vT7~WAU_Tտmz>5F2zHXrbN5߆)O3]r pL\%2IuTՒ,|n|4zۃ,=_\;ώ٬p).Xiܗ:8d W(ܛd)dbN(R1#vGSBᮂ轊cvʰ+C==;d,73 .j}U|bGHէ3[sc0sZ m Z"bd>4gwgazJqGgΟ3~l<Ҫ~!ܹ*E,&\, 9u݇eJ N;zba^_34 Wwz1Gǁٓ: ]eQK2nU\`X {Gu2xz8OO=r۽> {^c)5ey(>>F=؂9@:Iz]wcw.ߜ,IC= Xjvbڙsx%tu.E֩E?4ǘ|tndǘAy:Xa(bFzéf?H&2s԰l~˩ ߭Zob N}iSlNKxX(ؘ$ÎӭndPdGgHN#gѴ15J8 |"9QXow"lJՃ&ʺ@uCNT8P~c?#窾~-P`=WCs2Q<%#騃]倚\8T:MSX4hmxgVn7gSmgT׆ <ޛ,P)֎m}vTK=8"wglC Qp&ӛt C |jM{P{0GPKTՇ T u@9ƫElRݓXq}9G/[Aa| ko4;%.$Ώג݂9."k{eYc`iU}Fgroo`6Lv=e) תcMow.O5)^7p*˜,69JHV <]{f IDATg"e"E:=V# %%LS}&y 5v{xs%k|"6.pt1b\q.DuSJSj-t\ z>7[:XfM [ NUՠ{d`'R8KPP}ZMcd5G*oAVT샬.LJ0'Z"#NR ?b.%g[o uf_5iFap}Xô԰+O5҈NrX9ֺ: z=nP'r63@L+zR,90k{t+G+R8&6ӎmSRe#؀57,-Al}RDqe7U*V3z4 w?]p?w==}]"XMڦv{ nW[ ee)Qs^ МG> M)sltX72ovRî<騃]{`6)Z> t=lxmXF| 'gzyZ3j$jBMd-AV5l'ὁبK|Kڸza; աLQ&OD~ ;]t[/"rR/\i<Έw޿O~-Sî<"voj* vV@riT]ZǴLV}I x+HqOJJ F$U Q Oc1gulkAV7̰aW?eePF/z.U]W8'j'pmOq뎜Ts-ֽ)3U -wf9}NFSR+_ Ͽ Mkn).)~kwGAV;=*%%e l͵J+O%.m➩];ҥ.ѺNd-9Sa5~ w`|YXoO馩aWtAJJʶ0z6hKJ @_dux~xwJJJ EuDaW*v)))% ln(|'eg90o"%%%e'}OQ-Q}G 5J:HII&W],rA^ICZ[R>P}7 5ʑ:HIIfkOGJJ/=t4"vI ]i*:P))))))))))))Ljؕ&툙SvI ԰K@D+v)))))))))));aL5HIIIIIIIIIII԰K&uӐvTm^7R԰KRn˝To`%툙S _'%%k]dVSoSTFY.RR[EF4\}|7|%%%hoS"}z~Rvٍp腽/݆~ԝII-REf7Vdq{*ة+]J}obs_xmW)՝8M.kuaבJ e.wE(TWwg.g^6nT 8ln]}pCUsZǔgtZ6ҥz1Q+ }%9;Fvbe,(U]G* .e (R<u0n');?jk;S/N tc l^԰K\n6b'fؽ<*[mm <mGovP4̔T#םʞ+wo^vb_˩ZsApmOf~@u3ipD$&=b7|G72:Kh ,L&ߙȘ^|K {ͰU;,aבJB05RvFKLc7WScKtȨf"uΩU݊yR.e{0<ʟKPY$(" Z?̹f7dW.A~m40go2H"'H&9PX%w ݚo{ښ/w\ۋ԰HK}{~êI䋡n;X-bfDX7*N=}{)iHt @}#k7o^׹g./V;E}I[W Sh!_LްxHB|AӵtZo 5pZU1+ Kް[ 97rWXE|asBՕ\֜.gˀw"%;I!28ҝ5&pwٵs{ ryU8, :qcf(bag4 x Y߁X{L^1/> !֚"ż"G$G-LS`Gus8$67&lWi=ε" ?Uŕ:o k25a@ \Ԑ"[l1.,ry(Yk34/z El"f Us_dp;'U|̭"#sE$DB;cJJ%4N2u.ǝWwr.aWȾ@%.0Ff'뚡ȄPdiINNUn\/ǣe>RxWȆ[(ђ8j&* ʞw(|IW(2(6'g^¿.SݨppwfmCgJ n w" c]:qu8"'5ĢU5&W=%M=,Z2 uv98k%u`N(2%~"CE~ p& {cngC~ eﮗ\g}Ϋ9"iy(2Y䃷Xs>&CG4ơvp6|>|t!E&\/ҧS "a?ȸX?%ql`Zx@-7 x4iX EdC)"C=@kJA= m@DDdSDRf_ԕE"O(R7CZ$/>ۉ[2{)TM"kZgf)~ s5.7`i x^o̝ڤp?=so٫YfEN6}?V;X)]B=>c@Y YkȢ"'T\O ]8wd|*LתnÕ;l""&3[mjlRZ/PyE W"Sfw9Y:88U *kgE끥 k?TPd‡nh6$r^Y>odh|v ;*S){2old &>,rR1m}}Vgs|TuT{[lM {`oumSOm7 dŜC; aWH5cSî)"7bGۀ,Լt͸Qf3+p5U&rX:?ўM93ۢx,ZY %O4Ô(Dm+ 7T*V +g@M |2oh T( s^ ~rT]g!rx(\7k}njRaj? \ ,@MUw2lk^7a=ٿuWH^Ka6 Pd@5}g(o/nm쿵G2YSŰ+3.jB>@^&=Ǟw#r-g)+,e3V७E8W "G5ܸoOڀWuRs\csBJP?kXQ[7U#'>ϵX E; 5qZ ,S/iJ/p$ ̋~n؅"_\`ibx34R 0;gUQ`MOJexX'c;6Zn#1h}xtaFpCXT"ÚD}Hz>Qm{j24T[D"7Ԝ*mb#jm" ,T+0Q{ `J~z^OL .xjܩ![a셪++GoBaT=ҹRb)aWH7o.w "08MXqXnGqT0/=jZ#KV|]+P"wf$K3T܋=|נ*2I䗡Hg3W?i'= [a.@]༄#:z5SU)Ģ)\ |8}Xu5eP`SCw.YJn 34*z˻T_?=0onIuVsfUC"׊4"n΃"^Պx~1۳Jkp| osMlij4h3Z)->Z 8>Gg*}o8-ɬɸphMS},P}T[>Z|UNv"D~$jfn"0 xAa^3ݕ͢DH8F.?}tB(sç30I9slŜ5qCn_U5G |V#!g9m=ٯc59WipV0W;E|B\Ϸ}c=  T9"ߡ݁1"eVˋ[h:q4 /0;}H gC=ҿ )lU:_cv5p7|UEU;,B,W /V @U7D<i`u~C^! CC?"Ko~MS)j<}:rMiX,P㸒2Fao/0s0YMXhL O`euJx={-d@uC@ռ0 J١PPsEuz}әb:n[wf^1AHCzHCȗCEE񵞱UXXzɪ^XSZ՜bW >"4GfӋZ0h=C+P7xV#E[wn:֖\^jF$,2pQ:b920ѕX4&i 7י>c)ՕI,5xX$Pn/ok1hv@[l]-O%Qo2(IF1ԻexW4fqڑC 3DĚ+z;ffb n&dldrV߻FS ?EJ/c#`"< A jiËrPaWH%%(MtDX5L? (; 9ۜx;{|Ȭ&GkpeOcIbże7Fz"ȘZZrOߍ傗lkDSHhm%5r` x7…۱ f>V}aog^]X {Q'`9$8>QT_~+0iw4(|T Xu?ƵvT+vAd8l:FK.&zrc=(pȑE DDF|SYU({ꆇX~j ,/[ >)؜1ڼaGyh=/ܹɔ1s@] AƍH huBD/l6w~3ALƛ<«O[GUpE Sj• @>BK~ ߏ<}|/i/zn ۛuWs68e*{@(GMۣ&El]F_"Ux`ilP2bϺ8"։r&(ֺguyl R!p60w\{E#D{TY‰O P}[cѤ IDAT-4x#f5Q* 9ؾ2x12$;- ]s9 hw^:c ?&`jI" )9K v~l.;QoŌ=e;q*XLwD)K> TT/ud*vnT2UAǵ k[<[F-hq5'7>Sɔ@OZ9DQFwI#<Ҳ`G T"#G.P}ԋ˙?uܛ ǝko׎gdܡ{bk}֠-JC88WQl]! mw1\Uu D'""^!Bؒ{W\N>^}ܣ%=O:zȉ9ȴ6}% jeSTRԜ--)tQ;dP֋֕>MjՉ؆>=P^fAً BpPSmWo3i>, mso{*)b&pXjȊr£YSZՔU0"59 Q;+ +EZrz4QZU)6F'Rk;KF :loN1#bk6 kݣW |3/P#7c\`X7_#ek@uCE@QNґ '˂mD-tFB|QɪGWgQ7sC,jD:۟J e8I}f=Y 7a$!pGG]&f؉e됩];6idLF.5d]lEbDږ*"v^kT ?zTOƚ1- am"u!+uj7Tk3 OӢH\DB?:ߜ k0=È8ndջ n3g" 7ٲ&foz*Kѵs&DM ~jLiyX%^?5 yE}{ؑQ0n̏j Xb]+pjk}DBӞbXP);_D*yQ]iwzsNh m S"[58zqZ]u8bl@*!0ش1d@  PDBBq|{kHTQuuuuw==kcs+-nUV`' Rjl\z{,J1$s^LQVKV5iy0݊U7džOkBہeU;|ں}Izf[U?CUy osU|yMJJ/X6c# KUQ6UG1܃>_vɊ|$4[dOTBU_>O!Wa]owo'Mb0ZOK,p6Xm4I,\%'FÙx , "6F*v`#Df^U-y{*N}Um>7[Z+>ƌKZZYԅ<+G(Lbfޅ5 /2 Ʋ Obyi.P'{e8ʻEl626%ِPd,2Toz;2*;{`++'wY\P+MF`Ed8{mNЙ #rVR2vs -=Y?jV`Umna=ƾj^rs"s$NJR{A({T_9O\Ά}pB<LMq=v3&Le.x;7T۬z=lC׫$p]70G9"W _2U n Oko26jUVԺ $qk}|WYLMV?iPc߫?VY`5Y}7zQ/9k>j(\X@ PG0P-5(};9R{=lٞB ,|A)p`rT?^}k /X`O<3K7IF`DŠ]O٦p[:hϩSݖv''Q$^s?+ܠ~%Tݘ8ƣ(2n{ށn 5YmVt Z j67~$+5֏PuZ@7h} hr]}O|5WիT3X&g^>!=w=9{[_2/WݾNz)ip#^S'ßsQsʡiڞ\!"4jCk8gH~֙UOEC_=!A"QB9֒h{ [+4E{qcދknR=GZ >{jÄ:! B=sܞwXPU3:>'jͰٚ|7Mסb\tT`W+9{UOI3GKs.9E*Лc?0_TIΞ;G^n.{D RZיU7+|INl-X\g<=o\/uKrRBhMpybUZ2?up:#Du\p^ZH]ZX+[H+ >a0xXcdlTDO pv8BX5y5[KF#U,.D& \蒕07Hvs*ģ ?Q|8'2_fV?ukL'ozPydx'/- lEn< hUR&L^@ZH7 ܬ=q^`츪7U`&^k<\2 W;>/2QRѬz,Ou3Q T^\`zRj-68OJC]c=?6Mb+)ƱB?fn &@VTSye'W[+GI |U9~`&DR l4M0uO^M|է8dᣆXjTKמAooB<*\S{y`jJh j**B,L_kRD>!}^r*܊IV/JFSzA܄)%8I`mA#M = [Q2AOH J6Il,Q`e`@LlZ1'\%  TZ ;|Z{b5-(z7/.g9F MXvs^f{jOe{POPC-rXnUl. и'}M\,Y9Qm"T1 1s5AzGJ0S`Feb,9hC>~#koY1:TȨ+TKHvWAP PbQIBm2GjD&uNجi p%:5JxS!´_DWa#>|Hdm{`V?pOdA͇9EaϞv=āݞAKE"Rh?wj]SUF"`LSzWb]cbRVVgCpz2gU?p2aծ#y:UᆄnuuĨwe=>KXd+ p4j!A0*\|~)T/xN a5pNJ,T8K7[,sG-ww-Z[XPw yaܽv=-5D :^ (K6}_.kU>/{6Ϸ8{=SĵG,XUR۬Jͩ^%8f[Ll#;Wp Q6oYrԅg05#j; N;ͪ*|BL&Ē,V%7ƝnJU6TH9"?8IۊUPSZ`:_='D)1Rzio{{ۃY֫ O2 ~A8 17թ{{ 'b)F*J !:5#Y $nӁf՛};q]7v1]c zI.]tˠ,N+le 0"BJ٣_lWZOLjj-; 65%#|B6Zwge{@Smp5"uth7ýR벗!(v&)%=ΥrbMj_ymR`89Dkw,Cnʬ/T_RySSCw _(=^p ֽlzVݸ=+@VOJo^}S~8 NpMׄ.;;ǫV` 5y`Tu6S"r iU]*|vl^jGwƒZ%&tť jgR}%F±zUU`7bw '9#VzdI`˹@i_;;z ;w3]\aNj$;pHbB,ze-{1CiKUz)ؘfz€RVJ½;CfgB-i3KnѶcJꂤ*vb3gu% Ur:iU73UfK#";.F5U..MbhԁG~R2AGwsBu mN^O/ ;{հ%= bWY"3pP{Y%=bj-!T5^H 8Ybݬ]0ƥt03S}ϣ'#4JW< <ڗqXLKpFc1 4ۉ{i])1jvt+G1{06 !ldjCS} T=%TtU 7|S۾AVa\U L^N6N{!FmI>Oc{`Pa'8 8 !n *cLs3k:zzz:Hћ NYMTj'ոIpP)Vn@gtNPdxl;)+v1jvyf43̑#Gp893aBl|ky.FS{ԌP8wc[A p ^`9:% Hu]{ (| Wb#Gf)U.(x0TryŮ~HW@lP}psƆ7r#GU;$78ذF]9z6)'G"bvÐs\\Z\ {J#GoSs=o +yȩ#u/g9rBR܎']}9~1G5#G9rgX9r }a]b#Gְ3}9n4WMi6ȷY;=rȑcXv)9r B.fŸ;rHu,sč";>99G;Es]26 d>Àân#N "G^ˑbp;W*pf{0GH sA^^vhOuF*pwWnawm'.FN!D> Q 0nSNѥ'/?p3p"+"2S9/^pLWn=Q Ϸ1Ev#s!]}!Ǟjua@@ߗ_M < )^/K}\ ja,Q8Od70\6,vbǁG. WHP^|QQ9Ls 1=] @.>w/oIVU^T#4aNcHdxn{,)@ԋp#(M#a>ގ(-ߥ3j0.O]55Y7aY]}"!|` *(>Xu'PR+6P`#u@ARt<9d݋;9zU0PN D4G|`1xmsS$ X[<녈)DLC}=B9vʨaQtՏ{XȨ>CJI͇]O) P?csM>9rX.(Adf{"2G亹"턣Mwj[?cN9Ǘcb4qm1=uw<$x>wz's;x:xgV';r]9##؁=%#+f[H䞹"hI-.y} ^?si(pnڸ U_^+v51XkDJz_u:_TD?<,$}!>a8P/Hl{ctQNŨ 97/gFLn1waN, |0IXȒu{ILLĪ  lzDJw'c ^q3BյN@EFv AuȔHHՆl< h'cIUG̑ o GBúx m@ҭ9 95LWcwQ DXu tWDz('6')1":7y1,蘣7dOʽA+BյrCz|`ۥ.<4`sJpJzy"{9-ډ- 쾃w:͖iOLv^Ѿވ(o_Ol[iN| 'Ix>/A@3Q[Ճt8JӠ74|vv1 z/Bǀ1on.0"1} ]5x?z 矣@^ y aX ~o< B5]G> V``粬_Yi0 UT1p U]J5%q/JeX?CzZB z ;K)<1yE;uo:T zJSrH:W;= 4& dpIQ 'SwEwvqQ #_v֯A˭ίA@a:,Iۈ t9F+v ^z Qѽu6,o @2> MQ 並__,9 vo;؜/P6b*vڦc1CUqOkb]_1ÐȰ"gԤ^y\O[_3Kݡ16j_ڱOQb* +c 4P}nkD2cV6N |)T]OD!F0C@ +*,A6G}{IB6 Q`Tf<_oݕ,=TҳaUQO@Ox8KzER7n>g{b̍iQqG@%2W y`{0c D kxaQ^z3pB7}(7P'`XV ''GW1Fffcs֋ٞTL ly/0ЀCF>WE"DInK;Iv`#^LԷXE1J`7F|EY$0XsEzW|JSU+J "H+KnpZȻqq;â.I ,F,P+;'$;gUany]O)y~t'On' 3@ׯ[˓ânl. @p: =螪iju+a{]_W|mo @EҰ_vEރw$^ "{ANXE/V]MX[2^-Gc*NGmcF NC?[=nèo!Xxؑ_'%d<]UnUl7@$fz0& Һ5B`F9a'3+ ȅ`1_S"-(6sFZP0s.Jwo`GSyEv'Kl(]8 vZ`;;9 beج ׊'R9߂M@`7G,T&qes2"ujDaUӋw.PmlRpC؊* DvGfr}_aâ@>)A]{{,6%xwY`%1K뇰{r6RPr^_\%0y7aTҗ'(xn1wÒmӰZކQl[¢~8,"L) 'Y1pb;kry8L9w%j́=PKݛx _UVx7sZ:7;S8S;iLwjVQ[9* o|lc_lQݖ{ܕrlXHka9u=%2A8kH:~Q#T1cl犼WԂɒNKTx&/-c*p=pk4/Y!0_i3 v&qIqFgd+ARJU"p ˲ y`W?^ O[ݾIu9^2id } $,/¢),jȣG-v/#4`!ð }OVEѓ/FL*?Kl>O3* fKyDOSb@$ *þK}`wnHPf(3g`3[L_o i3mkų &IsUE %p3<m`[cᕏU% ,*|:hNaR;uH vQ2 )M=S߭1 `ԛLrLa &0_H%Kkb;$ع@s/X(}b{Kb'F.$.?X.{PSo(o}Ǯ?(ގ{13*aF(pwHoaAMWm2- &a> X`{_ߍ97 w%c1=aQu{Z8)Ƭ ϯ 4~fƽ/Kmwb?=cԍ<+G-*f9%:?̀mԦwj,K6hK\%eac P􊎞ѕWRۮU9 uf$zA[ȑQ wp6M,kNw+_L`5\KԧU/9,L_,bA{y~ v 90=' x'⨅ KJM~&r2p-`HdY:1:;uqZxpU:wv 0-sF8[IbgZ[@qμ;¦^S߇+.T} {2@Vd@(mG-xu)Z+vWt` ܡ>(`o/nKzӳmz+S>XWEݎj3xXw8[xpϦH;ގovS,5HJL ǮGO;[4X>ⰨJ j*EYc@i@XxF caQ$+C 'Qs$%xRkD-]9]\ ]y"lâ>57&sok}\JSe5B ¢ sx ^x?`A C6oŚ}?߅آ8;,aQEu)$tӀE}; oL*9@LdoGX/Yafp(Yקmlv>v}8SbV/ ̞#j):nU:>MNDƊu)(S_XD[7PGt5v@ܟsQKj=n*_c '\ne*zӱA` nV1-\@GI[^YcU?';Z0Lb:R[DwcYoQrR⩯Y\`F^"{-_i YY_:=!~,E6>>0|bd@Ni?ِ:g#ȪXc",ꚰ 'c uv ZS>u>jMx9; Zn6bI ؚyG5Pn!NTQ`e8JZ2UF q(yE=;,i2 |E}49bQ {cu,ǰ@2ΩA{S &W3c\gb[$qp@X'310=w;&3*60cx̗i@uVuަ "S~ ,N((V49Ί_wm%Ke/pVna]j U/U UqXFuZ~> E >SpVrDD{=xV*Nǂ|`8' ivOw*U3.jQ\R/OWI*b߫H*?]/2E,q]C-.h}3M^fmlț@.-cT0sH)Kv~V[*GWy1X/9Z@H#ġ膰pյpJ/b6p8Z\~{8Ӗ@~ ?p#>6itf7'%?c)y}kbjغu(ua3VX[+_opuւ}DUݭ &C}՚4m IDATaQWSNF20),j2#[ 0'/\. d (>d, :(7pQK",aQâ>_8>q"nZ!9 @eaUAG[̯"'`N 3aQ4*og,JZ¾,c#ICtz_eU07tں.gA[P]A Qdt$2sIηs:Yp4`]n8K,8-q?P#X!p>CCP4:o( Kl|hN'pؽST8zZ,>)27& & ,rQ08}ʿG;XhwpY N> &lbE]'|է]uM8 p``f* ^QR 1۱deXNx-x=xd3KȼLS$]o~Q!  lfxAm`Zk_R#g@,P861 ?f,PX͐(3\9KR:wkx Z\_EM‹w1Z)X\xW]9jU cփct?&A'5XoX <bSk{l;fVӵ7Jkh{m)}P l3<v 9, 'dR0=LXlۯZ*p#{jUX%uXH;W \@<3o0;F;XŰfH6{c' d J_CvA!J }O$,(}5X)y:'C5hBLb& ?~VAW)F[w^JMhIR}^Qf8j'Ᶎ^`FՏq+-Iܚ=}u-nQzUb+i9U_hJNnY9GwjGRgpfM۹X7 U7:1_oֲA$`C;`1J B2iIa3%}+~pRHӈF+v/%*h{v*V5TbFâVR;=ドC4mDJ@G1 )mό{K/ÒLor5^`XL]a>f,lXAӷGԎAv]x# pߵ1 ,=HaQ TbZ|?Xo46i_y:h,)>G)M`Bf`FڰX c׽%^r`/)R\09`jwKvFXԍăGa4}'U+݌9ə}> Q*H\{w p'^v}sƜ;m!ArU.hAYW'Udq4oVep,%j8Uukzv' %8V}yU6Y"BDݽm&RBL1<Zd5S>)P>:7X /W;#'.#2'oZlG2z"{}Ӷ̭hVAGjpsIv{{`7 KemnAuv|=?6R>n:q͟˴D Er,,ɑč'ߍ \X#hUvt;x8*-3iwc@è>?̾<%|?jv0;08iso} kyލH?^-#J{FQOĮxfLOwցb4`w4"11XN'3 UAlʳTIx0#c[==Y0)/cZ:f~x{cOE7=͐(k0Jarǜ>OJ9ߣ4XuM`T{=7m<^ ud3% s:f/R])𿹯5DLS08_m0YWYU7,q0R[ν]pAAߖB_t\TwP-e%$MK叉# Nvݤ9ڋ̕G7:H6Q+jt߿OJ/@`'D29*z XX1s粎{Cȣ06F2=Ķq.)LT[.ʱJWC>:7U;ߘ 뉀  z?:@lIxƶz0b'zjh *Q8ypR>KfL[%V~T9${/&32v( Q ~T،%j6n7sրrCQ*T)tA-WQO)BoU8_uQzhXNd \PܛU?=KPKSr B[Ĕ { uɮ7 -[9+z\ZXrU}_=>Ӭt|ŎseY(|U?KV]!m%ks,8Cgc TLv<,3uĴh0oS$.ٌ_B[CpSQ @)5f(h8Hf K&0`mtµ=kγX8Z;(̯&obׅ0¢~6,[R=MXn+_[,&PTc<1^sQ ojN8aQ5C*IXd?VbV,ˏ`g]KBQ G\ +5L_±-!nWO%P`ǜ:ԇQ W^6IgA\gd$ Tx]E-E$mZ ª-f(v.x\p7Rb X \93Ys V:4Yd@K矰x`5 p ,X~U"}ͰBMJLY09TUGP%Q-oq꺌{{>)N!윷g,5;ۼYYXԟEw%(3=Bl8؎YwZ r{]ztOUc. }V-,YikYƽJx hHXԏE} =:vKvob}[}hOľJT|Oހ0_N%\wWw0Ov&-jVo#t+O Ɔ\< \5̀SV:3,_ |, d<=g8:YX8i~`\,?ө 4}cb|Y1ct$ $kel¯k>KE',j=Y;d"~L`BH2PaQ?zo&Invk=1 &P_V`N=aQo zaXKâޅM_#v&j ]I]ex棪ڐ8u/baQVKn.SXQ~" _E lr1D+LgcD@zD݌~t^`;?s3NCI GH[JDl!(.:]hR/%49, sb߳Ie.HƩApNsQo >uIxGXaQ g[[``g띚9HVAs4\ _T8:XãUnW)E*B'Q, ԉ,4Mpͪ @᳎Fyd/1*\Əp^zvUgハ~ߤ+qX&bRIʊpAAꅛ"/лouϸJ}b=+qc`U~ؚ4mXԵXs C6, lR&q^YL' /&"1K~4OEV;=H+؍_$]3E}oy)x"qO(XXA,{/tvo_=dе(ci1,갨YT}(}}9,aQ5,İpϧ 7x}0P- 6weXԻkfNgw`;`@̙: 2@s55p;P&s֪&xk_'£q`vNַ/`k^ R*Ul<2AsUz36F%λ SNL"T]9{u]݉UFm]E߉%S ܚZ(v?<f՞MQ FjZ/ſm4xٟͬ_ H҂8c;05qX_aQ_y[xcοWZF-(DžE}2 X,HȚg;`MuAx8 X}d⩡WbE 5Ցx:Iu(0V U+%rPNTX+kb<֧xxwEm*Vc'vԦj_m ϠQB;8;O@h @#CY%R" ODQTQK@hRB -B$$8+Mr|2ͼSۄv PUKd;Ȃ:Md+ $s٭;9<2oYq±'맳 [ySvPh`WLkmZEÓx,R A;iXjXYA?j=Hb C[&Ke+wbAӖ53dTx}Ů3Vt@D F)B61BW]w~{jQJ+kQ|3hnn+LQA?/H2Y|T]gbU(_ 4}W?^E{`Xk^U1340{>ʔr,u}P{+`LW#X. W_RItL5nis9TuF%AEZU( ۩?b>`&c,B[%Q,WWUIk]1 ^님`9H5LhLL6l"Oﮘn7=c܌#+S.= P_(u L{=7h c汛p*lS39v"s[56 Jǃ:"0_Iȶ.px7;]ui'Zd 0?\F}@p^O-9liB( Ӫڥ,?V]osΑfN,ς^ݝwI 0|\] GϬ 9EYm KȒyf fbglmZzbHc<[aZM;;CZML[3βTgXfV\UUy" _H4ÜHޙǼv]tI9E4Iʽ!Ea&#1-0B*5}셰 sofc?V|rDkik1s Xz9T(N[ 8v `am-2 9ю x8ESZ~;aYc[Ryj,"vKJcXTkޘl3]} =>&E=3q.`W"4x\UiTӕ`,^[BɷHt(%厡[;s LLRkPڮsZqLn|/om7[|Bfk;S ゝSb&&}+U8?,r]g=IZT:]KzfUSZ24{KQ0ڮY`϶n4~aQ4 Iѹ/v]"$K׾ #_#X:ȗT_nyGH`b A[)#$RZHNxVkuTփdS.2f̎qM\Pc'030m_f=P*Ḥ{B߉(͘+шE35׉gȏ0wuC 9*̢5cEEz+vTs#FNS)n&> Zc!C|.0@|km]\鋙8sǩeqn.)ۮjmtھ( mW߹0t 1Әº(=.eSi.ۻ{ ], #TTcdr L= oWV,pQN q a8ky]VL{nE~Ņch\@U$ fTڮŵ`Nk{ Bvo[lCG88N6=^km++ty47y}q.O{.;gq%%)ywڮ&~խ;8NYԚ_YB)3;gq% v=^88NG$X|.rT~!ܿ,ND2qgdHLx8)b<᯳Դyoqi.9Y`O%)6;g1#pq888}$> qqq2`L֊ֈ888]1!`888Nq˔u2qqq\+܊888MbLqqi*.3);qqq v)gytqqi@RrT6m@qqqp<@qqq vy W v884 ʠOFqqq' *9f"ZCF888ʸL6b 888i\єOT{#888 Pi3eֈ888qrF)PDmHqqq`W9wUP1qqi8.U=2uqqq]e`888N,flWP U5 qq'Ymd!"#ÀO=|80x xHU˨;piX덈< |}S IDATRe&Zx]Uyp:[n v81"Q@U?jx҈^XUVǓDDVkSΣ!:a3"r*p oU} RiQ88pp49LZT\% Ȩ򆈜Wv]sB]q U =,Ddyl|w<&pU6pqAD&e]kOl<}آcu೔ϱ0DSsD~zglx̚-Nl]Ǫiۇm`PZHԈL_DVRSO'a /+O m[%M !`(`"2GUS`W:[DahrUgED/20o:11ak:"88; ޹^UǤlM[&`/ŪeB݀mDLjMB96">Ҵ,M m <ɡ݂Ffb fo` %̌p'PfeL 즪+ȷ0EkaF 28DU$ DDdUU-*\#)A4ݰC ADbBȖaj``ǰmۄ!h ®U/ foIFDyDŽ Ddpv pQ4F#كSt=uMђ1 LSؗ+؉H?,q-"kbVj*DsGY{wta!mb5u5W{0nV\60SvoBJTu uK0%ϟ1np0n&˿h{Ac^6PMׁ_DMߒ>ت7¾/IE5!6@w *Un $G:UUՎQ5VQUz5zwoi"A#0`mEd˂Oz"}&=)""6gx@-"@.|Ed8x"yuP." 4yAD~gZ]+|.SPw }>3E| LD3<܃ "7>|I"rKyI8waV9}x%wݕZ.9NA|@pd "mIͦ.PGUTU$$:QcIPlX*W4iK: 󊠩@D#" "WDfsDmYD6i;DD~$"ti<%"?ekA@4 B"hEz]Dve4*"Dd0OD&=k<;ȅM&g99H8c+@wLPvl~ED㙘glos.14a)aA4~[> xH,8Sňș zj0!@੬gc#Ưxr& q:v-#X{aY"~9¬ ~ Ӊ{oK-+pv mO mVf[AuLk,LCt3^{1֥ WN-øf%p6bSlڞ=DXXs~Js!9KpegRmF 3#v/x]9 \ U= *E݃91`Gwt;%ip(0cN uþ 6eӎ&fy(9ߊ|g::lpCyx8KI aϊSB˩v%5vpjpg;+a>e3yz."XwgbDZgqMƳ{&(paßLk*NlX-KWp>M\7-:%wRe&vO`ٌ+bunFP(=GNK<ʮNÞ$TM=p4Qs{hRFáldc M'ss݀D<,@(6#Ș`󉩡]KFl:*mڜYn=o=ykݘ+hsts 5j^&m[Sm&c2O`$(9=n*'+fEs_Rf텙w3 {Q+)0 w`177dOo*|?76Umޙط&,iyD`Dژ`3SN~_p]Gg]^$!5A& l:( Din`z({S}&y&lI &1"np;Fl=tBFoa=gW3ڹ`׍U vX:Ŕ&{aLr Wx}()%~/$wDoFUpJJ o'dlrd v3&Q^ ׆3&.(`wF7Q*ܜqrc/L TDvk:ӆiL)} `9L$E_P0ssBˆ}ޔ_ W1hǜ .FAɧ 551Ӗ6L ހ嚘~NjńOm>bYl5sz>{ څ&U (Y:,.LArt쯪O%OVPQa*oja"HX^JlMzI[fDU}4n.{uL@ _&++a"M\ݫS70!ocaQ`>fTcU 0.gM-ӄߧkT<، 5"Q0WDK4aX ~1ܶm絚 D-yUk13ӱU 8`ܯh uM<ՁTtU}NUg} ^_U}SaR'?TD6 ; 9WU~Ʋ& 4aMT/SՓX7Yks6L(|KD 䀙\LVaSR\ ?^"\Wׅǡں&DdWlE6/}w;@: uOuc+ybB;V](䘪UAre(r,Zp$\ߨ8 "{eT{;gQ5 K"5^[bZX)𙹢uEqzA"ذUD6&`fKP]7Kt)v`$N*&NT/ǼcL1X 'bׇ9XQDd*6YeXL=V$kRH{"r)fܟR"J[xýUvc Zn\N2yNJpw.)pP8X7^D `!aEb+cIvəeX4dU"+\?2^A?V{ grT\YAXUKaHPZ=_an!$],wuE{]DA" |kE"^^D)"Gԁ(9)em*.䰚 ,s]Ս ߁Y<)3 ;3}ۀzGWp(MW҅"տm+7~`|>P)G;ʱe a6vx$wn8u^%d;B)^ÒG;]|>cW&{ng4Y "[`fY7soUlwQT0&Dh"@&or>Y nTH /"%2WH&'' }JIX`w#fU.rWE^,[YY< 9&" }um0[X 1An2yw7ĂMfb.¢Q3m?_`0`B S+?Ĭ|G0ꟺ䳔vhcs}|l'I^G~5i]J]! RkM7Y_UKz?K "2ҋ&2$~妫7!"|}Jf^ήІ|6sL)CBi󔴿խ)iDG"2/WLM|(h_1qUU5m|1f p)"Obx[S-ˊJ6I""ȟE ~ 3>\UgdJlaYMDX,B~VW˱o%M-"7`DyCDw騰y)VL9J_6&c¾c:I7 3'& VLo "&y.jaNXaQ72WVKԊ= ~C 쮪ߧ@)f8`, ؽ9>$>K8#|33_UO>9nĄ}0z > )ob(E-_܎5ǁػvJ׺õ IJ(i&%Zn\EuȤo=y ]A?T n)hPojaX$e46Q{4`*ffkGlX0YCN3ńB .6]ö|ݰoa8/0S18nf]>6.&0ۡ|T\CuViN^a/µʺGw=.?^c V{ܫb#6L ~.[RaSaoþ {p13MlsH/\9i l]0^;IXLQ,d`yH^ sXopNWI;e7>kh]#|P>-l'l3s\{-;ayo8rǀ^]C0h @n>_7M l5{p^,[كͷިPLޫ桂@QlŰhj6Kn31- ](w!?]?JHc oPvژ5;xq{KZG` xM5 9*9/[9ծ&.oV,%L{w-k3 uߣ v=x̞̭Ա߁nnr^8)LX`2tΎ㹭3fF*p\tr?lL1 =`<{kIUvqJ"5AǠE\G)aqt.5+ʱtUZX-0f00FUg峹 i~wcQ3SDU?&"`wUMXd )U|{v4kc|sh|=jffgȏBiH*/0KUfc+E{`NUmclGM141ZF9ED|xJi֎^ {XM # 88NphTDƂĹ³XFADƳ<2fpdPl9BŬcRVV^Ĕ7o4<kv|sWW_,qqq"N.gRaZ5)x9ZDVP7Uq%U]("bQ~7"F+sh,a<{fq@wyJp׸XRqq":워}Σv5&Ё9~?RUkxgBUQ{z;q7u6V v䢪a+ zfOz9! Hqgg|IDAT'g,`8NEhdM%q88 a=Jѧgi v8ΒȾ"Rq@x" ;S vA"2كp~`tƤfqゝ4,<Û=qi4jMtIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/images/multi_segment_diagram_spiketrain.png0000644000175100001660000017432514743453644024623 0ustar00runnerdockerPNG  IHDR O=- pHYs&?tEXtSoftwarewww.inkscape.org< IDATxwumr %B/Bt# Ҕ""`ҾBQDE MTARN(i]r3ۛmw[.㱏۝ٙ~"?Z,Yv ``_9ϭ݁a@?^ l]9=<~&pE^;^>q]E5zM_s(|꿥nxa0X{uW{DDDDDDVj5NT:hpk\.Frl?Ci 5~'qb-ZFN9u41Q<>3հuw\WtXOb:5(g9*%hcemmt|,ADDDDDD -5f?RJ 띓,p6@  0"Q^-#7n#l<OWSF>#cm <4샮֘Yik LKXWp[yo7Xqׂ҃HB Je:<\À}cbur ;֛o ^!] m#-=ָZ e|+RW+[-2-ǎشAXn1b ~n;RhܝgMX>C=ݑƆqFa *e~weH[-`?ҾW3r+&ϗ)yܗ{]^X!RtuxW-¦Oz'',a/XOu+DDDDDz1 ^/ v]iwG ֓^ u?~H:|1<54V M1j'(f=e ts{adžߊH@چ?ǦJ'v1 ,,{h7`KN=5%]ys0 >}`fQ˰!`?? 1p=^e \f`$`PfR Ǧ+9OWzck`XvC1qqG..X΄Acc3|5u O;6 C*[Ėߦr˽ZdFljˤmz6o;6hIJ[ kP  Yi*1<^ ^jp16d`&fXOX#< ?sF (6` 2,[pKl(tu! ɸ1 Y%?#a_>wc3)5}5x$g_ߣ ,ZlHE7{CDDDDDS!DI$R@DDDDDDDH.6VS*^7@DDz 4K9@{6Kagm`0ԋyP` ]"j ;ƾE*0;bwQ""{}?`'Z+/L__ :Ɩ%c| o법R-Z~'3k}Ju\KR^#̠g+JW=n_Ju{d _;=noJUlD} ߘۛӅ/;J0nܸ*Ri&L^{$"0a:dE?zENv5L#&gbisu }XX:ZuWa`=Mc ŽgX:zoH/tpѰ~u,k(v\  mS͔^.CC/`yobYbt`u`?Tb{+`?v]U׼K.\g?~ -1.DDq%Q`p2p[7N nCil@#nYX`ava} p+Vm-.' , X` `Br  lEHIp1Qy_f9v}k#(ɱ?&,s?pDO8qhf,H`ZkS-^SDVj_ ~  z~´XRh0M ~_>Ⱥt'GR8`֋9  ڈjCv(`Ug{[2lHX୪n%c)g?`V 'A}8>RnƊfC {RԪlzo:{~PEX~m,3j8V@k>,8ȰWV,ǵ;R`Yۘd#mvq fRkE_bൻZ~pn#? J94o ,Ra0݉RO+KMbur?6ņ  64;XQ',/xi^ߒ2_sH zVP>v T{Ʋ㾄jڔ#~ nhv`7>;j18nĎۤ'$eWIc۵Qm= `Vr7`:(^6|CbglCN9,#~yjX@f"Eذ_&swlB_[(hPpj jNǂ;k'<S1ųV:"Xcs\DYqS/]lYk-†Xc\L|[,8CnRiX?TXeR]obq}'v uj3k4pέ}ru݄uf͚/E"ؓ'O; }XRcǎ`,Y~?q-4ilZ<{zذaz%8y?xO5_"'O ͮkuƹˍ5:sͳƾ/ۆEn3^(la|2 ߁Z^[~*X*bke?n7U> \G"lsvM9$75u^_8Xvw`3ce/wMh ND }`<\YFNsۍΆ0+*fc رaXFKaXиPmm[9«bv,cF,xQصW ,VH},./`ݱ6qs7X#$w2;бQŋ|_\`xwmpߵD(S$h7sn,*t+"d2ι+FuvRc}ɒ%`EA<kL&_|9={'N<|ܸq/ۮ/i޼y5kι9N22V5kT &3̊\Zٳg/pM5jԴ}qulI6hnȓ^3a„#}߿8ͮn۲eZs5Ţ/]~;Ο? M4eŢιscst \ nC~Z䜻aرc5~Kȫ`'wAXB Kٟ5ÆIBt,1A{s6..ž wU? ~kN5x ׉z)>Y!-vE/Yzn 24w;X.XVXdx%XiY7b cj1/>}";  Bbv|֫Uj:j!{b4pQWǮM.'b 7Æo]?-K0&2臍Nz&xovH~-`˱ خ ~_0pA,^]\C!F`D k}Ʉ!}XXoV& {s,s?2-ǹ؆J|Gbi>6l=ιbSO>}`3;[Mc\/|~c2vr/"#^xI^zͻ.>0tCιr538 )f*% "&L3gxfcl4c̭_~ySZVJ1(\UDןz/aB)Cz`v1y Q5x0qSظ;6!;SQK?<MXPt_)ިZ.6ƾo4,[`UX4:] {jO*';܅>#M9tv~h蒏'*Q0 هy|Xac ֝V{k7U,, p0t+v}C=(x+6f,a;k,#*t-$ &M%a!6c_Z,]PG`yg644l K{9ӦMK9#_u`Q˺˖-;5 .NtаsnK.ιuGk\'t:s*=v ,6jԨc,þjhh5xιusC<;(उ'vfRTI֘"y֝oOpsz maO\26 {,Xv`,Nc&Z}bAXa*uQa* @4cۏi,-P~9R츽2:g1 a{aRJD=Q8wv Ul]Fu'X%TV*I33zX[XEXpرC l$ʖk~nc姐m*X݄5?&бADem\tB3@Fav-v|&2ө"ɬ,Rk:%&͞ "2M}1sb'U-[i\4M8l6FLD I6d2>|eرsw:FlL/1cƼ3ylvŵgι7 y u-n0af_%v03iӦ-hiYq-k Btν;89wymXǿ, a=Y;KZh^Dιx/ A=sM%"z{ Rd]teXXtbKh)z˨l1N_7*OArxx1҆5@XV>Ū?SʻTt%h_^x˧XEX0*7Cg0b~' gK4ug,HF!mDYIZI8$v6/(aglӏ[P˰4{ vL5Iߛ{e y7bbxٝڳLJJ gCx!bWlz4 IDAT{ k5C(K<}? ǮR,0([d1FBN9"JGx}ܸqO7nKιgL2|ѹ s}0~ F)Vwuͧvʩ|\7a-1ѽz-K=Ň2Ğ},ﵱݗ`kat?wTk|^ -ѐ!|ǭTG[w#6{56:润c9^c4QCTA<˦9feς[9V{AkuVeܠ CӀT0D[A:ڪTιbD>n!',p Ɩ[}6` 5^`=pz~=EJ3c_ͷ.b:/%|Î-Ƃp:N؛ŎSKNӳkT 1AB<ϭݭQoթkY xX]+y]'a1 E͙3gwQG&S.6_Ѕhh0[C#y??~|)Uh^K>) /\7sC<@"ҳ,afUw9.ŦyH9E&cYv& ,Ž۸{ pr, Np`  ,[BT!(ggm/v(z:8e_Ͼn46Gx[H|~B4`WG48 OJ詣{~iAjRñ@}Dce};~_6>L#v} ߳OCup}#8{4 ~BE}oO<)67%KS]J[Jح" Uh?yމ߫ҋ+Z*&M&"5jO# \Z:M(-B!I{ðrò'~N^# g+ {&y1 .ze%6v1xQr1kW?:Z^Nz$pF Mc r#pYs X`?XfCOu{*v<Ӏ9Pq+ݗ†往}/ 'cV?<03= Hi5ڶɸyD=?6~Ifo}TJHYhiQ`=* vmUҬu)_F5XNצO^թ?1?9g„ gi̘1B|7mڴx\?=NZ`ĉa/H3s\{ƌ6,&L~?0Z_;f8ͷԩSrPΎÎ{–t"[$,V "&7"TWj:Hf1MJqtz-xN-ν~2Ƿ>]' 3 @;9 k/xٗ V[]8;&k$׳z0^WIMWc=Mg5tގ7Г ]5Hn^q{,wP"YLk.f,v#v M%j#ĝG4z;x:K7;&F4l#,!~ :]?FFaD:f`b3;a߉`*g jO}u(KNg:n tñH[;ƭ<✛ ٯ_Lfl6{'ONguw`ӛrׄ }.ʿgccy\`Ary?}ߟyfJ < 圻 }#N_0f̘JgaQA_C~Z|f':ٟq9Te.l husfn}?T*;Mp0{)>E<p`p;}+EF{X_:(gcߕGvp<)x*ẎM!cajrS)  aq>k9(['rJS,ƎaIO'a:@o3p DL nq;a5Yߋc6/>I ]k ^-P|X`v Ɔ핳[g,VS e݂u`blO}j(0}4Hj/^uɲR<[Z'p<\d~ieG;@eJ.}/X?ikkk ^>#Mi_ﱚY`,DZ$Ep-p{7J]yI˗E0s/\|ߟ](f@sǏKEDV8 8xFtlx,.`s-vy:(ñ05^NXW8".^es9tleBhm"{{: a9/`|l?Ctg_!DXƁXA0x*5H29' 11ebP,Yr236Mc<`0LZgkleZƿcac5SX'ұP,(Of#3 v hʵ NǀsX, ϶V(fvk|;+-?e#lM4]+c} NJK0⯿6n25Jb]u%5Ȟƾ**[c֬Yb)4s2 %Ʉ_sι_:p\ KƏȴHm,R%.~Rn$󱞅GlR 9؅UX$}o$=;oǂcE|k󵰆GJ%9 kCbL% n$]D.V,JQgshGc:^.:z4{= gbyR܏]eO딞<]=-Y mXv@xܖ3]c@ ? q"<13[x.wH8 \{=!aGHDץYv64@ݒh,#|רZV^#:n.ܻXXm8>ŽybmGJmetp; 57s\, zN ΓaEoCx}lW3o;f{bYD7,[XgXgcK~F_mϢ{(z(ک3;M4CU컨_PfvAJ=osn`T*5yL歠~@fΜnkkk-49jhh,ɬNg9NSK566ֶ9[l3glxW6}p6]2pw5iӦ24J5gϜsг,k4a 5mDG5:V6=*DC&2EDDDz03o "=D-"R@72)H}M7eaӾ]Č։HaӯOr4V'`)vf"R?a#<>K}WDDDz],Ŋ '6؏ίfHAD2-q{V*~^Pgw3c^PlJIEDDDABe+u"4(tkGxР`:mTQCEDDDzyX9X s;6$a96Xj"R bl;6$!͔6I "Ro`3 bXa>V`AA"LcǾ ݽ.f7vkwecƌ2Jd6LZ&JʺK?ϹH``kZo j`%Khjj"Nd;>IJjmmMy7zTjC`?yX.Bss3T w=[w+ɩ6 ?"""""M  ^J&);w.MMM477Դd2+Ruxp崴l24 JoMzp+pNm7EDDDDD"B,)SV Z[[Y`~) .dٲedNfh"̙üyhii}2L ;r] Qm>H% լ Ƿ["""""~%iP\vرg766АaWł444+`}`߄̯H1e,?0x 9f1  *cwh``LuVK{\ƫ]XHo0+{%*v~xx+ ІͶM~q<_sY/`h7+RM;k-'s-جX8~;6:@]ikxXm3Q߯~]+HA _r /9tĿH+p6}|?:NO {a>z˱\`\`O`S0I.`cneO7;h{ X.8 ӥj,s{k[sVf`~XH:S>vy m @92_Wy;v3| a-zpZ^@)*e4iKEu`aEu]%8jH47a~88x=^-Judc-a;V.lڀc3'`6w24Q181XՁ\Hop0Xk,|  <[~o:c$Jx<<*h IDATˀgސ<|lxȵOtn4'=PAl=m7Vdp=o{?!U+a{yKY>5`66:oK%s:' ϯ!x=ZXaJ=qt<~ufmDOSРSMMM^_,hp\FIZo)t_cvvc ~.xx oQsh a jVj' %KጡE@v*}fOT*uK&Y jnn㭳f<D[¾s] >$,= a|%XIt,Xiac&t4<+L 7M㒜DI8Xo߷c- Nc퐞.~,XA+_ n!Yذr Ə|ۼ xciEιecɛH+cY~GjJ}{6dhM]vVyeV(q*nCX)_:cUjt3HoX ],c5Ra#Wu |Os)jlKc{bSf^Ni30[ tC6]QChlc뮼:cvLレoe˱Fc7aLk2 V ~~\ z:]HochmZ9C8^\dzTbcNOƦ1a` VDžy^JAn2eʿ67wm`fM<I>BA=ϻ_~嗈 fM4 n[|qL7D (<Y%Nxl6lvs Sء]L }@rzm\2^3_=J Vx6ݫigIk}ݔJDP UQ!6Zo9b {y?Qv ;Hl(Dϛ\xi}76XczW18bv>|}*{X%l6$a 66lX 9YF߂y) /ayXjHc5N.Ǝ] \)~<犜o ~Dռ^: {{ܸq}f/.3.d]U6P{}]|li\`2V:<.m4M"ݵp 6>h*oo?v$QsKg`¸}aU&acE¦X< K!S .`A9X=ݰɷ1p*p9%X@n,ֻYM[cq7ܠ?ѹXFU /Vl ɉ\;;XcMƛ?X=DzXp`_=v/m[>I4T*uC&\R gF@BKOA&^K޺͈|]HdJXiX_weg`!vziަsA K\n\5Nv2&>ҟnWb3 Ky./ -ؖۀOP:kC¾;/.zo5kDw4m. ^:uG =`3- SX_H0 *9p̘1zwtSS^Ų 444FE⒂)|㱄rVX S;V`Dz%ؘXFk)QZeHoЎ} }PqT ,ܻMV*X!Tjhj*! x,DhK7~7Wv RР:~['L 8aY(hP%, 1`g?&B'""X FE (tD" ^EJB@B RInaΝݻev=;sޝݝgyNth\pAv"I>I(S@DDDDDNA*9Sݻ7/֬ R[!""""" 6V駟lMZ#,)h0$VHӥ hf:ufѢE'ἋWײ=ҰK([=V1K j: Cin Z6MDDDD: hܸqotIO9F;wy R7Q.X8й-8B3Q8nHx8!ฌ[%""""UxⳂ 9wq>u{!% z3nK2ǖ BV~#+6b8`lj:v08 x 8\ZHƍTb ֣ ~۱cuh* ~8 $_y86Mx$TJ}?Xܿ Nf0;^uCR0{.j,ve%Bqֺ >>K(0q 1-]3`7bGc}-pr,cG j Ogƹ\`Y` #""""R4 Dj4pllO.`67:_I -8O< D_~cl(8.5hk_>%|+wr\ 78U|݃R8~_X|*TF_ {;U}?c|;[eԪr\Z7C sՎc}ś}~~A|U_^+p[Kn"y`XFhHܜRp >s'3`X8pfJm{X8[q"`Rѵ9Cw .ZdeYhV,`_w*]VĞ_wAO_~C-ұ.TCG [l mL`bYjaU컠z@S6ֺ{lZ7$&.QWu7g'"˗~RES@1$M"=%Dc& a8+GAvX|ovė藻8 ;|$6W~9{<_N&r/sJtB yUH|YݺAB\?E [o|JoVdL^HP0l}z"bu{Y=Yu 4ʺQ~$w\+eĉʿ&z>vî\{EH= 38G`%~_ >IjYSp\l(Y D{ e]n4> Dˌ<3m4 DKKr DDDDDd 4e̴"""""4i.$->κ!"""""4i.;'Mei 4}ͺ!"""""4i]ˀ^ ݑq[DDDDDItuh`pMm^[ki_Or`Lcei TnWĺ~W ԳQ%yHJp ;ЖD_WqvZ7DR ê(in 4j)Y/` 6 z8vEDDDDc)6h  ,[k,`\?`K`06iڞtN:=1X=hIhKwjJ mIk6:Jg>0zCפ;!@ҵ1#w>,og{ `qumUD6ߏXЯ5R#v|V|l uN~eo9tp<~sԗ}A6k.1+-n IWuCDR0{?uCZ7B$ñVlc2 I`.4s`.IlYmX|~Wmf} |GRͱL+{D# «cAmDb`Eค-bIH&W }zIzdzҶ, a[:j]{X}MĮhǝ%U ўq!v;;i "o].~Xu{p{?6(}"!+zJ?^4,SJP;{yHROi&i 8@>ӠT VV/ Tp=ɝ{Ԡ>qz7: _Xr$? 9h C)Gz(v~6Twx<"(h DAơH}*)hPzǺ'\½ *y A_WVNF_ބJ k=ᗕ a1^c}ޖ ,))g pKDDDDDd՘rq_]g_VDrMr]䮲Zƾ b'yG9v=2glRlG?_X*v yY-1USݰRhtp'mElz_D^/b2ӛyrrX0HoI,6D+8Xs ,(WYKy(pM  {lրZζO-<\bXz>BG{픙Řl[~;4oJ$7]`ku.#"""""RPA Vfݡ4-D{gs|=I}M8YUPʛazH;)0*zb/{X1܄X(~,;jȱЋ\Bzo،IK`2niO+ѽ$7!j l4/7$7?V^glB<u/ӘW®-o/wĮ γw%;Knxl:BcRoWvIv0wEDDDDDd ˾X@`'`S,[haW%p?Blɾ-| 9XxK =8+e r'l]ٽH۠Gρc]GaX;+ƛ<`9:w#'`C8ɨ-ʻbWL\]'`] o]c&Y?5RcmL)Ўl iGoط,iw#}^coi|,xͥ14f"C= DS{Hum@J_Z'sej$'JKAЭR:ye i ԟ)}Vi5DR<-BDDDDDWk<_f i \3,l:g """""eP@PnHs4BDDDDD"ͣ0"""""""AAu>uCDDDDD9(h >Hj~9=pz(sۨ+I$[ 8\`$8:҂hڒ&gi24 f`]D>^ȳX)츙4́5R#6z8R_>_9~XJoJd4'1{J aS`^X-[E1ClXB,?e <>wuvfa6))=* %n8mڔ`C[ ^wr ~\]z kCbߵ^.<\NHݹ a{b3_a1-~ݣSoYkI~ZD\| [ĶϱM,bc7E&Ê> ҶI'/bݭ6krC$ ,?r4Ҟ݋#}]2׺!U}_ v E/~<~ۃZ9$]ñρnH `eTvN~{(X|6,}<-4;ߒ8..vP /U_!=+aۮؕr"C|=c=a+,J>YL7۠"[hKV= NJʱ vG!X0lKl7;ٕ}$O]8;xʗ 9euzl/bAcv1x+Ю@o`.y؉Owb]d[Kyy}.Ի m"p,g;ycr~ձvU_'_WocGa- cdž~/ŷ:,rK]m=}9= u Wn"Q{b(?z[ݯ-R/KzXb'#mI__:zg{= 6~!W$۷G<-RV).~?D.eYDۈ[C= ]z{S8<ӳƜYcgS^ñw8SOƤ:=]g r|[x 2X(>3>f0X\BWʟ>Anx"_jr,Z :T:% h ~="ZO(R+bs/1 †9J_Ndc#"U54 †)  VcC`7þ_o x1v ŒWbEB_l'uBAtӣ F.$:``JKPt-=GVceS(94$=L>EYoՀCcGؕʴ= ex S "f16H`,X.+"R]c`Nņ] lQ[vz.:sB,_PB{31IQ TFvN$W-.w)MsxZZ܏%fa}!H}6OT'hTa"GN\Ŏg D7?FJt,` [ ;!/>3 c_: )$#' /gaW$:QЁuE]u<+:1Z[/K([ܖuCt R|./_EEwڿPYD;?žaɪ4-a >FgIRt?jlᕴ4_#An̯s7"3Kݞgri; ;a,LXv/;0R͗p߄nDq6J#{ =26l[4_.cca};ǒO]cy;}$lDqmrMFTiER/&u7{`7±UlXNgžy{ֿ7fAp !-n &HkXw_aW; ; Ug,ꭋ%;ߎN40r:%\#Xr1Ͱ\Zb?)Ҏ{cJ Sðx ꌽWUXX >QK%?o-H$}4F!X. o ȟ04ݯ_Im6}uGrO uEogUVV,g_ Ub'lB*z\ Єm/nw{6RñIo#=Qp%v0{v"cc~W.wlTЫE= s s`}@ Lcѿ>CNڻaWKMN*6˕Xf1XDa`'? 74!4w|<",s.ac`W1ٮT"ec?"Kjq Q](bSk%=FNJHaX数lKco,YNB=Ow`ϸy{0Hi}xPb~V~r<s4vlUf>b`|)`iԓ)X'ر8-{>v3=8v۷'[7X P:VXx4lծ m]5,¾DWwmy6#c""}vB_p؏M@ۯa}f`'a]˵oC4x/Zf]݊qRmK|藵lԽb{4iYRz4}nTL= [,P&ʅlJi `Qam_?$^k`'P ~ @SH4L$c )h.z]J'AAƶuC$uP'63ʺ&ͪP*G]fTnwz!z7O" M )"v^SHm)h 8`ݑuCD<`P!"ٸ rZU\qlNn6x6[T(h 8F'͸"""""A(h 8F'=͈!""""": DC7,M#Y7DDDDDD: D@r M "a Y7=:#6/}x!)"VV&q#"""""!)h" '/e &o|QiC""""R 4A2p0 |c 6VNvμ rπֺ-""""ұ)h Rzk&7$q4p?֕K\º#c2mdp[kԸ9""""" 4U<q/fݐ<.soziA`%5i[W^^a"""""e "o[Y7$Zw  x'cuNuI[4)q xN"V>ԗ`iG:K.6T;X I}x>/J9%ת `.Y\fb88fI!=xu:uJk㠛}w;Ժm?3b_ٷtnrsp^~?]bNsn5++;.I]ecU<֏]RSmYђO좝7úGoմE9pf+u5p&FW|`/kq_>hxθXjs:TkT_V5ªck8x?}rpE*\PC ͯǴ +@i{?M[XC΂wF'[tk1 cS2g-[oG_vV}P+0{.?NYr*sXv|۷cHYkٮbe::NJG)b%f7+zԿ+odފd[SN5a]O~h"/:z]RjS LHRNt[,Nu.>\ f0QlRD&g:H  D_RWO2oE{pɱ^ AMрA(‚S<ĂcUطHf4%K  /+l(o|:a! l*Ȫ ,\,h2 HS@u&9ӧY7$pU<pVl{` _~T`#/IFA3`( [DDDD D[,p7=6Apt%Ay@On ؼǫ_VDDDD^)h Rz):Vw7p"vclFjX:8irU`)`YFp _fɁj ^N&lBĬ :_{}ÞWSj֢lI8N{9p/UVgTw:pizO٥I8>6b"ec' :li > D[AV'=mǰ򬳽_>IK( Q(P^ Ӊ̮Јb/J@\\vq# l"^q$XaU>v OnfVc,bP>?sjԜe:6,^-3i^qu; x.O_T˭*F980a="-S-5DDDDD!Է|AyEDDDDDRH}[HEDDDDD: DU e}2nt 4 Ԅ_"""""2 Db2n49 Dυdin 4)ʷ6˸-"""""4iLg.""""""KA4+|W`nj""""""MJAuF.Y6DDDDDD")քu#2n4! Dۯy 2n4 Dۻy Y7GDDDDD"tcC8V di"op4g""""""MDApc """""GDDDDDDD$"""""""HAI$R@DDDDDDD)h """""""4D H" DDDDDDD$QZ7@DDVw`[`$0xYom`P +auZ  f:YH#l l, >Ŏ~%?`m%n ;WV/wEj6@L^ǾuzJwQFv}/%9l^~xZF}""R%]Q!I6p%l.p_|&r IDAT%ݦن;WJ i%'1uCxGX/߭w|Ufi` 'ֺ!)=RO䣖n!{sہX0c"p0O2P<-~]b}AEQOk`oؕ`r};a ܇]l]oX7Ud;N;Y; \]5밫S@ۀ䮸4́`c؉N^ձZhG'RH0,pS-` p4 vt !:X Y]}oi{,N`kvboc/|^cXox?8 W`9Q=SI=)A@;{ˋlc\gĦ;Ɉuk$ɽq ̩Ai&`W}+'x|_G)Êz*d%= z$wruѩA~'6Iz`A| .~:cAb{,މKid,®`?5k4]{ =]݌]YZIE0 "`],t=lN5rrMGM$9oB g'#n8 eP-H>K9vc!IrR'4i|w*RĒ0u!wQ y9^6I/7i+;Uq_g'r,e$uJA|, e-&wE}4s_y<<4}1A Fu_^&ؘnbi,?C "'MXkڢ֖ڴ͗քQ@Dr[3n4_b{®7]@?œs<>+^zb'Sp%ti$NPz'bKh fV \FqSωdU,<`l4W-1g->i=,d2=LR mr?L KmzSV|1yI=zn~4IS"lL®$F "1n%BLrϧDo=%Blk{S{/Ti"$:_zP߷c|.J0\JJ("ksĽTN /_֯4hp؂8F~0;/Gx`7C:ypsJ>V61ekZ6Hx 'p//4qZ+h@%wr#IP@1 NtnźTӻ~XT+k~$fdlb~|>)QN+p19'r* 8ϭu_lWa}RG4iL<"Mg-] Sv<#=  /ق%w%x8 8q#Ҭc X?6EJ%v<ǻk/nȶi"%9sNm<cC!~܌盩(jeXܗ9CSj+֕4Z6JZ)9 뾏 Yt+ uȄ*ip:rzcYm:7A\ c=n#z끽Vӱ$cXm'9ΕeN~'ʟwaC,ݐZRNpc]2_T U=Xp=߱U/%F2 7Ju(HۃֲQRJ  cS.`m A?, Æd6{K%Rދ&~7ţ $* OFР' ۬G)S_x[6K49ߥw΢W}! ۻ m/?,V~v[f{:J ti3$} ܙuC)Mz%1Z\6XS$lse&GXま X/ߞh4XWzXMr)vL- )| $mmrKEѕ4`'ػ`07BؚFXN=h+F}{=aϱaQ6gjTl)l xZ6JuN4\lc'C ƤzZ7Dʦ 칟^Hj4HہWe܎<\7pঃ[n]n'.vw  >,vu dkz""%{ xmz\Z놈Hm/je/p~Rw| j6:JOC^vjili1ii`HPO&`= ͺ!mc[i~Msv/l射 KNv)#6GswyxC^M{  K :{Gպ!""Ҿp*mZ6 +l [ܿݓM \%5ow1HPODԶ e-Xq]sOAN` p5cu @/BJlUkbgC<e+y%{w#P8l% ܘ ng[`9-V¦>jb.zZ,@&i AL 5!Ҍ ߼F-,z%aΘ i6r݁EGU@_Ag _N|\7z}\Ku'Yw=p]N̏*}OV4iZ6ޑF!ҝH#I _:bE'rT)Kܸ{5sm'7mUcܿrzHԨAAi7ߪT]kn[ܽ]TYun_meNg;ݤL(?]ߩnNPO&aBYnBdJu.<˂5_as_uX}qU߂ ?pW!=}n3R[DDDD$"X0.ŌYI+'Br>p_;xpOaYoLm;cbNS`%n""""4{Hc؀Y7$fi,:# 8-0f?fx$0{)+Nwr:rw` ti"ä́;Y7$s>/A<M/ %|/G$6Yy^:18SWDDDD] VL({ ;ρUe<X2c}Z`)~k[F9p}{MJ~"~ ])""""R<4i +$MI(ZE{e3"'̢PUsWwp::J_7Hcנw 1XĦq(4ސ S崙!%eyp aC?h] 淳^-<YsO3X@ ,4j݀$9ʯf{p:brn<ێ3$yB\O9p\zF`SOb*9^7>u#DR0;^uCR0{.jO . Oi I?ӾX`:gg'\q[îC؃k  WG~O@P(B7α!m-"""""S@1$~3vN“_ŮG|]uI_ҹ\OR`$ֽϱm^|~N `"cp#]ܥXK{J<l=_6EDDDDDI-]kڢV\w?`q{|p;%VG(p3s=^p}YP$m{c}nf"1_%ԟVxI Of "CDSIQ:'ͺ!GC#+nn`VYX""<O8?x85?>$6W`&za%%P   C?]/LDDDDDDжe[ܺ^~?y&nz׭!M^^3L@qH}RO&ӒOTd2P0XvxjQ )EDDDDCE_ =G EA0?LA* Oi _cF%M(3 Ɋ"s`@l`-q׺"""""YiB"""""RU 4Oʖ˼"""""ҡhxHcH ,y+# 8 X L^=WbX+`?x 8x}vVf* \\iF?ӁW,`+q;%ns8wՇ߹"J"*رkb%jFMlQc͗b/+hDc Klvܹ3zggϞ={k[{S<93*/v @cqU<]hVt?E/`[`'t/\ i8 \Br\p`a147"3 0 䏀mԵGF31 }g(.dw灉H?Mjo8)LgXzM %p;RE>]Zg%"2…cS_w'kٟѤ6\+4_$5Ի#`[^6P{{CFא!3ڏ }7({DOG76_v+{i6O.EgTq@eF''$ճSFP 4XO%7=p/ZMĶMNA8ηq=R/vBGb+ C?FaF}v /dC::8^';9Oυ^<{Z9FoT= mĶ0A2NϠ IhЗ%{|;$U@?v.֤=t4)! O|Lqk:0:!+l4X2rseX#DZ5}phҤA˵rr"6hdhP:7yϽz)ÿ6szwmaFdm=Pr;|;؏\c'۾Bm$k$ES 9xtY >_8 Ug2ZNyhjq,LoVF39ddx̶ oy è$X8OHU\c'*+ ~Ha2t0Vx6OHX8yEUFP'H8 =*a@D@{F1a4h`Tȕ@r!p0zJ2K9>=VXG."ˁ F/{92]4 $mV@Q|:xXlM,uQ]@iC3h~?^MB1)CcB+R4lmF#.2M@n@)AO"e 1܂&`B2J␗5 8XDdjhD9=Q{h`s eaT吚H 5bT~-x2̺TPkSi VC"gϡt룰kֻyx'4!Xè&"#P`ol$ :V门a7t7d_ez8꥓5 0ЃOs:^NMA9r1=NWnצsVbqv[bCu(^'Dy'beUhȏeO(Y|_9ꖛ=!JS ;d0eO0NLC6uG1s pOǢt>Msh^+ehud (Qok_FRpko j2h`C e 9~;hf:\W9Ϝ4[9:ǏRxMg;qsqZE  &5PHD>ɨV RBBB=kRwc (f,Vzg |8*oaxxC1u9~_:l5VCH8Ǟ w;N%4_jxB` zH=|ܖ(7<$ڳaѓc{,?:eרP:$=Sh gq(B5ً"hڇ 5tLzrk>.V;< NFQ;ߍa4{gQƄ.Ȱ=x{p*NVAّ8Cv@EGQDO{"!gaaTiL:{DV/F\uZpΥfv"E6_AB+I^."\TcUUn3_g'E{UKAlg MbrQ)OI)}b6u2r$ A2+U4M!_*r= m{—+07 el1< h>qO8Odwp+;2αsl)[\Ǜs: 8׹ s8G}Ub}}n9z˜8?Wh^˅2b% g@v/H?Yw98ǐ\bs)t׏}XݹЉ0Ñ)[+~?_[CzE>y t -_jR߹Rh9[{h23Ze,D'@yXKaiN997?h_4G+r0z_QO#ᷯmvI(h9E[vy+Ts(/|ۢ~h!sH<+/?9}HWCCT~{b{z~.1atrl>yv&:G89fF-Rs\msb`GDs|rrk4?/r+k);ėW79t0Hys SN|=p|۫{n-pU}~sup#񇸡JٷsQf3f4ۮUSq˝*_J׺9&VRp3PCP!mr.q͍>W~?9WiA@1gF:ǘ25 0 01a4'JmSnR6T {CI<%Xm=\W, aaŌѼO(}xG'  F1桒uK_+fV ^%aa !Fʑ_F}Js<]k~/R8UGB1 B۹܉2w|˦8șaocR::.d,\.Bە |cwʿt82#X5s{ o 0 0 0 #'1D;O:]4K89>uyX'k8~sLls$b}H@&v1m<yk{s|+9V,y O0:`̓'Fcb q}BYH4W 58X8x@}-He< xpfyp+@H9z"Q};4GAc}n Ų0x , >V,}0 0 0 c$ǽ ng|H }xn>`s,ecqPӄf}K9Dz1Mљ0Oh0< ,a4?m@px|[uJu>UM1M)&RaaF]$(uG 0 0 <0:O2s;baaF s?ʷsjޣw3+FbߡmwRmߍ҆JXem"H iF ]xz H(ĭPtuDⲕb 0s:5Fae`/`M$~<@z$OeEπKE\3#(`J4 0`S:!:`zvhJB\(SD |,D/vtϙ("SK ńKc(7iD,`K_?I`7GI^`FibGte*?_h?i䜹H~-i6W@{F0!DX@yMʷEQ {ф ?!s`Gs&FCCH$DY;(Bd[Fg$nEi^@hs`og!cFy/W̛(.*ܮaT?Ǡ14 yB@o^\o"K;V#Oyhla x:Zm(`?΃h‘z8};kq(5%fGa͂y31X-K};?+/s*i0η{(AG>lN/e6^{e|s{+4h<40!D\- j }O!jߖpXbZ5%pmF37ȭ6ROtOZC pcp*py5JBփ ,*Ifw VFƌWfCFcF\܅M0w~:Ԓ>)+`*[d~ p< gGOu&g x]N5S(\!d02vLG3*5^0:l^1ۑrH /}9WBYVD,r<?W{fË(y!Hdͯo1x P2F~s8H 5uE y. M tB b\_"H `o+n?I } ls-d,x8`  9tDFoQxί(b3$2pNA㾯ow &O h4>F$.؏; /[bvԉ+%r& !~F:ѬLayx.Ł1 ~?'GèKl"9h"#`R$2(i>C|ǦŌ]GI`(Q9O;j;o'_g W:i&YҚHA 4D(d+D=lP6WLE10z,͘ ";3KU -h%-Lf}o~hcBaW _wER_'_)>G a";kitF^Dm;8VZF_ƣ4&^8؊B ;4g9è23? /(ChlFݭ/LzXYFn;(\r\oߦ*yӒhmda4:$Opd8 l̏WG0x x39u,NVV: [ W/jQS&zHaUgX;b 8+׻#F {aMhzi(4H]eS\ GqkMR }O"9uH)| p2|DG!h'\碇N1>oI 7eRk4N/L29(Gf2 g2~_dpi ;MQHӤL{cl({Acp[R?N>X+hJI's,'8?3`ᅲ\1s&=g#?.ILW'*mmkimml]nD&C_a&SQ;T>|SIF1Yn*~:̙";L6V6y2{dGW^gSY )HhpN;ΥW&ftdOɰt׮/8P.f2 DqNNW`=c:w橧 1L~ЁLO;y uTq `x:Usf2/rHBwv26OX*pGw(u!4I"vm"u_}?GDQZ(X!ݑ81C slb~V\w$9$? `1 /^4dr E#`R Ӧkih d2SƎe@&s1Jw,#4d2$IiP:RtʉN#_]ߌ5q&*'Tѝx≼R6͋͞(w7h,w!2N4=8-h63369 ^z; Og2v2 c0 0 04 NF.up; ȠƤ (g+ tp yN'=8}kߘo!/_'-4؟ NBG_>-J2d|@Ѡ7v(Μ;V,7+ UgHI&UsVs*E-qױOf6A㟌#ïg2,Z?*?z\&?Q a(A&C˴i\ \pj%;laaP`Y-?d4(*4sԘ+AO{/yB!Ų_Dz0~Òh g/4jQ^R,ELhPi=!` e^}QFŞ:F|ffn&w >Fe2Nhkc]L; #c48!kSHndX)"?$0 0 0jBF5Ѥ!8}XsX@ݫ-4(>B(U)`o4ۘbʰ.6&P)PT uK&OGlP>-` ZJ<ָq%Ta&Ϥ%X 3t9Ǒ=z1-aaaT i>xB oMÕר@Z^JY_*FQu%|OUFb „.iNCB&*bAcݦNe5JК90ԹBi8Hc2 z|cg3#1aaQ]J5̋W*䛐q00DOg^P|TA 0=:+}ЦCN< MO O~[5}T}c6Z PʳsDl4{0 0 0hO2ﻠRsR~/)Hi=_xt=t^~ ]DQXnȫ"1<J NU&@>~{R֒n>SA*0i>,V!XeeI|ʾ/ɑ* XFM'+<>W116&SD{0m<%w^9׽׹4*c״yx׽;UWN5&wL<@ sk[Zr?#:ZPepsUz [pm.z]MOCBtWq琱;X>3Hl1Rd+D,5|-qCVh5PxKVX^,L5{ ?C݄p:8;a̿,'~7aZXƄUzwuw&'LC)s Wzܶ2cnnwSrݓ2Lqץz {kqk߂GxڪF#z='ȣ(CZNƌ-!lU J;f $yDk7}<ٴkI??0(<7WH>q~N/ʝ~84MӪBhA'kDi'H=ܳ.Jtφ5Ȩv@7AA.AnAht݊:  h瞛jlA]O;иqpCvU}T&pɰiHs2~<]˻=&+ 0 0 $~NBK!%of0<`?e TOCVI@_dH8 FWqG]PƳQe"Ǔ_;Ԋf '}Mv3 P\j{׾&|@oH! `(En/0O(%_ZQyf!b芴%VVEi47@ҏ-T1c8?am۴igLF!; [Z[96\9;r {pN;ŦNb4 Kܮ]yyKSOV&0),tԓO檶6&3[Z뜄 B[Z8haaBղˀ~?c4 M[qiw}{-o4'X3iR IDATj$l?&h'-ʕ{F-Z<^@vE{W:fsxxoGL pUȀ6x2dRP(SxO9]>`yx'̝dɴ8x>d Gk+{D8J<8-9vORޛaaa4i+͗;"pWh}|\g?Muy)'y?|x Z}82OkdSBa [$_|ϟ /[(|桉h6i"Ҭ<B>I@^3|ݯLwg x.H+ q3Xf"|[wN`bCcrYn3Kdx ܑ#]p"YAWAM~6y<>V3*&>MBۆaaRjEcЃe0%lI55!gp ӷˀL~)dp~k6EQ軰G;b}oKw;a`$Ի#`[^r-F0b)fx̊# t|E ɝhv.E#?p)>B)ɔƫiaaBg74*,\<KVw$ Zajaaa EX~c?HHtX }"H==m( DʾSҡY}4wqAy|E5 "F:PsFTeAimߑK8)0j*(e !ұz-R{VW(>| d1&a}H\Kb1ghE;0at&>G^CX`r=;UaVC!-ZfF>@A7W=W%!݄WFm0at>VY߯i/ (`S)=?@Oj7ҟ$bRÅ(#Jh0$z Sx~ ZUPfaT!1ᝁS6y=Rߍ ڵ/p9Bp 履ݯ^$ܝEHYJB0J~p~ztB+yQXB @ ,#[%j`=55k-˾-6|ifLDw94n@+סr Hès]ϕH72$܎Vשq25^YB(Hh:IH^ y`m㝦\/4& Ⱥn SǾDY(?Huk?ht- }_Gmߧ p{+}J7}JV e38S,<Pfߢ0U~a;x>O$[}ak4zgmF30^_G~ գs%BFI{m #/w dZei8P ZvE%/(,`T`4X/cAhW*ۣ/w9l ]O)?ҥ#eWM{0x%u*p?2@Gkgk 3 V!vzSoл쳔0F﷛nhhR l<7HguzyT^3gtܓ i߅K_F۷d]S6dPH/uVk+4ZCEy !9wr e4b5 uG~H߯p hx4B#= {coJiDlf;:|[{r`Wҽpa!p݆i4 hkb)mKڮu^QQ\tFG@1?܏{P9'H8(wA8d4.abW䲜%)b [&< EF(P@!wPhѹ btODcf b$VydՠQ(B J}^ ,…jz^ː²msBcqX; Ax>b0 `)/m_>W5Eos޺6JE Y݅-j/ 8 G7( !W{Ѓu>F7߹'ޒ\AqH>V_YA6G:Z^l?#~WH85I%%\ZE{ێg`.Qsߍ\?+7ݷ3 '(}h&-|>Ӷ)H |H6bYsh!s)/[T^;,:C}}D=}_FSfTwhE%^O~,BgȝkZ}Ϸ;o0_my34|Om(Q_Q'YgB ki0R_aȕ(E?.j?p?> =GU7N e\ B*G3Gr4$R6 eX9?O; q)ہb6+F_G$^qښp&mQ67!-ۆx@|-w˓h5wwʦrZHl C+g NH'a ޫȻbd0ijh~'06_ǯDx-<^F_>@, eimXN=BAeDR lgvAaKgfK[4K* G{3q7NDz[h%C0b< DYC|y r/:{˿nQZCEKa-d"}H_˄}1G7Ӡ;zXp!*J;Mv gn);Xk=۪fi4.f4輼C;FނHQF'N/qǡ$MʼXȇ)C !P?^m|;$5W1&=?VC! ql<I Ǒ{s357 /"J0d ں9?կkMhUr|;bFl2 ,Ƒ>'2:AӠV&>m(Քz}\ѷXю\+d@^ OEo_N`q ^*-ϷFC9CP"sؓ{BٗվƘxԉw.Gsj$a@` dЪFi0j5Yzw0p@sr4&Œb]ž@V1ߍd4) >(铿JNVAh }?N<#?"aߖ4CHO$ffQ5/Y qVE^0_@9#R>ʲqM@p{AR =<)@H7qZ^G\]Np+=WJ<e jFJ? QJ jB=׻+ }|˖in yNL 3nE{o-Q*}RгٳpjIJ}oR|80 +] YIjJ pk|¢^{[^! iyAs[ IfoUmi v_y钎S/T\,Rv/)yi#"b`>yH[0Ca>zBP(0kY؅82`cc9mۚp9k}1;b wƏEdb#"5}uIi>gjZ9p᪕k~K׫չkQFmt1M8.qltvyw^;v=ϕ.$DwÕf89nu p9ܷ vd#pe4p5+W}*v#pp9 [뾕빴,p)kE it!/J-LEKz$DW/P'a2z 0eR͈-|)+p¾< / @<'(N^&^ vJe(2 Fo# xnUp: tqk_`oߧ=P6A~ɡJaaF!bL + Ge3c!Wzp7 0{`)C!hdDmE6L$*Cv7BFF47ɡ 7Q}~BZK8m\L > GSQ*Ѓ*د(g+"0+@xy'+aaQQhP8SG`V80uI'd-u0ֿ\- xyS w[aaaQMhP d3@NƎ+}_GʻQZ E')O{7GȪKU\+Fs؉ߥ/wiK{i,؛\ƻyCkJ}_unR*>OZ('|۵+wP&w1ZzAv'ӹ\YŶD.6#_xƷkѦy}S^M0r0\l;B/:\C|{c|ߑzQh_X1^/3sN{mrPwi?pм' O0 1)*< X o;% A["WA#K &&!\[w5Q݁($$56 H:_7( ׀:.NƖHtm ?=; (5HlG` 3|. -@my"3}B8o9'4Xexe)PTv}d1M,,Ac] .Dqό*(s.QbB熠߮ 0~d8H{c\U R1@㇣{(eWN*٦/z^{Ba nVw B4^'T`g9 >X(^vY}MJ翋ߖʊH+bvchӨiP6DF%/d_3K3o*ݴg(p ʎh(4`tcipW umM-ϝ RėBWwHmFu1OlPtnIu _Zczxf(}:f\`¨>Ey\FٲԂn4ɟP(h[ .FK߾̓KQ{hP$.MP*a4Xy5l m[FFe1An^mn\F0uE2Zz yM'F'fӄfTk<(pA"bb.Gj2K86 mB .htig@8z21ѱh0jA8ֵ_qȀR43FsÄk݉KyaAdw^ 5kMQHBQ2CtG 7"L|4F Hbi,'9vG¬w!h$BaEi,Ց? K"mѳwQmh`"/#5 o_!T5ߧ=h兺ȋ++q݆l8mdE֦/,G^,U~y$=(ۻ092ߞ$CAPAN!!QT4+bXvk=X $4JX@@ZH8$(x,N@J0to3Ttwu|?OOWWw=5GSVpN#Fn;i!rQ\]kUȼOIDd@p5qfRļg!>K{^ʕWW| Pkkq"` q`1HEp[UJN׈Dk);RnRޟ_")t( #M#8eD] DcA p!i?'M|@B<{4XmǛ2 <-^A| L#|/dVT<֡v%-kU%*Y.&e,*'5"beB|)h(2ؤ/X?/ZAݞ^\Iyblv*Rޟ%!jlؔ[A$w'>vքw N"c8+DFd>;pW. Sf@j3(lWׯj6I_q_(f{ZZ@ΰH5~SzjG?E<(6%"i"@c?_!F2|t;1¡$|G_|];W4Fdg3if8jvMk`woϸow`Kue[Db൬{Klad^(x•ZD~A_v$g+ف؟!3Dz]>Ecz7u3񇉂禮}Kb{u#33a~ R{؅5Y@$.^Ϻ A Ǎs{-C3VcH>w`G8+yAbZŶļkhTeVkŸQO(GgKux;Dq7UGL8GlI|Q[ h/<8HaGľXYB"97eg'cIޗ8/Sٓx G %b(sW?sY L.eIx,g)o ,'^[֚߫hŠ"7㽖_A߭OIKˁ=C?]^6'1ǥ%+/.^ we:>3skK-Fi7Q4Q~|۝/ه}&F ^G~ U}OۭI_ZGV'.5eDP]  O! 3(Vh8rfӓّs'I0.%ζBY|QWĄ4, xQ#d'b~o!IJuDٌǔXH7(x= btJ'  Eَ(&K}o9/>=ʏ'ǒ&.%jL#>#'Mt})1!&g|ΚJY:Ҡ#F~",O`nfEؾ+Ά-^cVٗfg¤"I׍@$p@,Kظ;z'butX*W`/3ab6Jzlsl(j# 4UE@_ҳ潟kO`Z >6 vH`^-Sw*=D۟0 vsMWzߴtۜ^IDVO椏f{:K0K0MV4"Snkn6jRXY ۖ`Hlb %pf"n̟Zo*5Oޱբ"|m зXK?æH=uK0?)©E~SL-qҨ^S째u6őR[^*AoC,(K:=6{"Gⵗ鋁¼ѰzP9n1IIc FN*ťeß2/ҳ)3ϖa^ے$IR-LHa%' Zfa=!v=$pg x'846e8XCxNc+;mk N1GJ8dziׄ Q8Vk{X g̓fGI$i g4xx PNswXv!lZ/nf'G[vRn6jl 4$I1i LR|e'&l&_&~<. L-eˉ n皊,(94n]iyX: Ξi:}pO+*zkq1|^Dp?ua//=40]$ n".s}4@tEA/hj4\w3S$NԵ{UN\Ym5 @ƲV`Zzsו𳳣@#]^1 vs6l~=xecgAԜhyfz{|g;ON$IRC9@j$: Tv)؋[u LGy#X (N8~P7~~nN{&*zmC$.1pۚpm]`q1b;S b\[˪N&ɂ/}q `HmI$I g@jԽ*wF: t̀% rZzV `qঅ:bXS[`fIy7o-{7zU\DI`m =KpJ`e ǤHJ$I }ܛlGQE\l_sn,F. _9W7$ Q `9Q>̱9gݖ} ^z.^/1DܿvKuu¾C$I>X~X$I424KVoC$I0i ylv #hxT`EH$IIAWxf$9-:|98$Ifr^VݒĈI$IR2cNO$IR4dwQ Ӓ$I =]l7`J$I4|4eD}J6;I$I×I== \|_`rS#$I4l4y@wӛ$IɤԾ'!ME$I0d@joRc$IaƤX&"I$i1i `"I$i81i f,_$IaĤ4<?/%I$iPFX h4p$I$ & "I$IuI$Iɤ$I$Id@$I$e2i I$I24$I$ILH$IL& $I$IR&$I$)II$Iɤ$I$Id@$I$e2i I$I24$I$ILH$IL& $I$IR&$I$)II$Iɤ$I$Id@$I$e2i I$I24$I$ILH$IL& $I$IR&$I$)II$Iɤ$I$Id@$I$e2i I$I2;I$Ij BII96;i:@҈v~HuMH"I7y!ZW4i I3By iDy= <4o 0$I =A$I$er$IRy#pvAHC4>$ IIֳ{z$)W1QIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/images/neo_ecosystem.drawio0000644000175100001660001356544214743453644021417 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/images/neologo.png0000644000175100001660000160576614743453644017505 0ustar00runnerdockerPNG  IHDRzTXtRaw profile type exifxڥYE^a9x̴-E"E32p w].Q+q$@:c9ydɻ'7iђe+Ϊ56l.gUV]m5q ~{y¡N>N?KnnΟY߾F7keJ7Yjk?r M)r{9*sʙ(Ile bG\dT͵K5sN)k[^>]DqO>njs3>G\&AĺA3vH}uޘkNl3xAc11pJ:ijo-( aRۊbJ!yf᜽Kwx}[u<۵eZ!ءmoV{oyfzyF>KS-̷ovP4nʅ9xi根I1Saä&VemUD- HlkB޽Z 2 5R3Rsl*2Y#%w >SVkSFHFwmf{z#ht L.@!ԧHoIs<J򎱎 5ecHw`v~ tΙ:zAݣxiO$v訧;-xg*DSsR1l.+TսB%H0mNr W,R!mpn8Z$ʭm̥J1XJʨV6j=WC˪|<,t%7ܟ`u(GM.V ܺw4)@fF۩ I3oI8S ͳڝ2?R/l@bX\KA-k2sCzˈ 3FAӌ¤~Q)ef}?-[ЎZY$%!ЃxhQj<%0ӧXG!u 4h@4PEfTҾt; Vޟ?>XP̲iN,eD0PXf}f8<]]a֗ jF6ԁM=hXZr.E8*)-5]!OWXn' E9!H@tA\sf"$NfO  d9ǘvG2>5z$7y7QttȀ*k(H1.ع/Lm rݖTg$XrRktD7@eFy`g6%A`>6-4,(L1&"Ҭ ǩG>lD#JaR Le9ڸNXqBcX%t֪&~mH01JG1+m!hrC#E& gNqMSL"iP|$~uIm,ыmEQGCgWf(e?ZY'3@6*; mK`WJA&jmҸV7 C*}Eu̴@ݥ6x7v瓸Bx+K>OOf{VA_\CD-кA 7 qki oK`"aH`4州$f t [ "@nfy.ƃ%P7(W,fmR3ͮxq"$Ɠ`'1pi :Y' @u1^h:\ygĤ-⪌b؀9aJ{"RHy|+@D&!=-1 ^N]~Y&N*ѹ7Fݤف |S"hfw:Uh)Do0ax a#V@@;dn1b/PF\ Ȏ! 7}@bRJGr.ڴ๘SR!OV Dlm RŊFmNyۘTE묦M'0f/¾Ӿ@6[pS jd1=\~'r}8іQ05:ɶ:B%P(RGl`Uc# T,>Eltt_qE3h۳Cu(C  6E ؒv-.-sco4 ` Ym'\C#qRF?$߮6tSa׎8A&1(6S!lDQQ״Y?LWDࡶݕKcdUh褤 "4+hH;czi# 8yG$Pu7+$ B $| wWͨgyv9umtҦܘ3&!248%X2RYG|kJjE"AWGLKJLtt<7jkՁ<ܒjKR`H){@&RvH &GP/7ptrSQ?: W l@Gh#x"8F \ : /bu`וA 2 apng45yuOU* @원ǓkH<6}4#qjPJq l  N$rS+^w IGVȁ]P17jy|m.y0 3ȃ3F5)<{cZk*N1Ni 7 LP'(j ؇1 1WB (,;KR6z 3`H&ڗ"Ƅ 8e(t5qi@J}t䨓[çR=0*&/\2@Fq4w1BK 9[:mt@iIu@:ExI(TP!D&/ښ!aqd勶p+ ) :hObןd0lEK*ʱHŖkȨPp&5YÏէzt4Tk륕r|ai3ڷL}wH3Ks~ {вSɝB.Jjԡbᔍ` iO ED;m)A]Ƅy82e{"e,7mx"DMS`>|018G {hҭԊB2w$ !|܎=>I@M"r(3D Nk^7#跨B(Ōky J" 0EʘV^0LAR 1:ڼFTkxہR^UcdC~*mg2et5 JwF:%n!H/[[WE^WIkKigU@6:Bg(,D Q&yJuS N#@ >HR Gi0#f1xɡz F0ޝV Mćۨ.QRk!B>d(؁\sSg ه/ZiCCPICC profilex}=H@_S"V鐡:Yq*BZu0 4$).kŪ "%/-=B4ktL%b&*^уA,cN_.Ƴ9՜H< & ޴ aVUs1.Huo . <3lSabJOGUM|!dg\e{s2iF" A*J(FV )ڏ{]D.\%0r, ZɉfR0t85>v Rf>I.ۚ\COlʮ)}S֚q pp({ݽ{r#c ziTXtXML:com.adobe.xmp &bKGD pHYs  tIMEχ́ IDATxkeWYƜ벻; [Z$!:JCX`$Uȥ዆XG\(ʃ! :I Ezt'PpTHMKHwtfk9a"ZA:Vu#" !TUx!pL!BlA=ּ3d+|=r[I߯gU&|51A^7qҢO!|#*!B!s6xK3/al:~.z~(ji$ay~dĨ*rB!Bά>ncfz^MƄlWm8Y:޻uޯ^6asek'}'z!V1^8Qb'U2 >@!B!vBdNl֛~؟NZ#W MLY cr!!!pvf\!B!A^C!sgj̯U_k:դ&Ozm#%)EUGS >@r] B!BIP'Cf+oD|/? k]߷Rl!}p.'B!BbwxO![´yY6e'i?k/Y]ym55'$cuutm@B!B!B!dej{OY.Ӥ[ +ymӾ^^r}cu&J^WN2B!B!BY-N:璭ry|i?[k^Һ]ABaZүd]V~72_O-VLc/9B!B!B!d?>~6Dί5Zތ_5)<'cB!B!B!Bȼ3BV +?鵭-q~])  !B!B!B!;4ג~=˼gVJ_~Z:^[ _߯+}YB!B!B!Bv*Ӵ[~5ԛ_jiue_[SJYO!B!B!B!BV F&zjOzm'Wa- !B!B!B!nHy]L{F"ג#)B!B!B!B3CQI͎_Kj'GS'B!B!B!eWS;t~t#b^rjъO!B!B!B!6G;"S_~ZTךy B!B!B!2t-9*b~=u5 ,!B!B!B! !~O'b~/yv0i?[uJ{ B!B!B!BV&$oD{ B!B!B!BNMC_mצ O!B!B!B!dl8?)B!B!B!B0fP4k B!B!B!B6 Z_w<yB!B!B!B!W%S'B!B!B!%l0-OAB!B!B!BȖ2CFS'B!B!B!ml84~hy B!B!B!B-,Z^ zǭ׮4_q8s˿(]t^pF!B!B!VDL׾?~O?4 EQࡇSO=DlυZ߈sDQ%J\q x+_~W8𲗽c9|?~_WOСCquUMyY5vEx]Vi_s$OOggS?Sxы^{⬳5\B!B!Bi%d >C8v|A<#8qEbteE/z.2۷8'GÇַcǎGA]Id\|xK^+q /N!B!B!f 4[>IyG#"N_]8CUU)"?O|~pUWᵯ}-.2}Bp}o|_=mL w:R'~'3?3qW+\pB!B!B Q9#y衇{ŗ%˿ yF#𑧕 'E/9~kykpUW/\@2:āя~}\GwN[k}@7~1_2Msτ]|z?_o&{B!B!BNUu4yc9|~Žދ~IQy$b7BsR,0=Iy~U`0^7͸^xao"}s|<;֚Qq.f)i;<ҚCQp׼ozӛpEqG!gp87M<Ӽ(B!BEQ[nv:%Ç$>رc-BU[PWC1Up}ZDs1,Í7ވ뮻!dYZo[sJs͵IBfj7QXnDWx_ ox.b널͡C“O>Çk8qGǿo?=qYB!B![L1ד~Gb^Dqhu vG{Gq1e +$~0[:d?q7c޽9rD>vm8t{4u$KG.|L^&ejYn뻟Wo{kkx_y2|+_|;O:tO=|AO?%9˜{馛wu |s{v/`矏?'ls<|=q B!BșL)zF)䓗rtBˉ'^/|Aw79|uזi\(ϣ(&|(V&DrǙ;oQ&!Hզd-,t>lЇ>ĨJBfz 7,c\K2lo~,{}DDsϥ0OI8qwyo\\ye4kywaki>aW~[hmH>khҽ /{w !ȑ#Gtin7E0!DY'"~笳 9CD."%=:N@(ϱ0 D[VD֭!/"svQy>5iX!1ꪫѣoB;7piegS6+wEiq饗wɹ3sYjyf9'I]\llllllllllllllMƢ7 ;X5>}O=\QIc_ϔlOɅkF~a}{ࢋW*PT-ĩ$$fϋ+%m\[fxS(73>=?\|f~VvR[ҿ]3H9%VϫnNԶsdW;k747׹TA\[͡Xwmtө鍟YoV;O,7z;l^9OȬ|`Izi"<1:xu/~r0w^ַ M}s[mn{^sY:vᖍi VNllgĸ9C2͏H6zqt:̉Mԛ;:: YGvzG HEQgPUۿ܃'NokBsGV{o_E{Bfz9?a?~"KȆn&kE=Dz+;<82zz%&| _*xeqkۃ@DoqvA ]x<;k[7|^ʎH‹ּ7t~~>#t맫wWju,}9#oYrǦ;ޞ|4u NIv> _/~Sjoi+ /}K?BN_7t}ٴ{FMrƸGB]䩧».կ q=oUDoѣGQ1T~?+q=v_4mA72(rfGIo|u߾}xҜkG\ Y/u!cQ3uW\q>q~'d򗿬\s^r%ۿR 2Zc<2Mg!dvD6v= uz=NmQt8@LhyY9)އ1vxYa5u>d+a矦;Z" PWi"Y;4E_WfYjgV3i;1a_,sW%u>{9g} ^0=z9su㹔e9wmZ^s8~-"zs%d|={hQZPZ֐bۨI[q}c=9஻ҫjXSMEd^fy8|/Ww\SBE)g6A9;(vvA*uv:u,%rT1|[k.MoYc~WSZ7QY6 M:G'?s )óJ!D@T.Z]+'g =~YlYoYM4/=;ާ_ʯJ8Yh#:f=j;J-UU}G?^x\/"E֑38_~{pw8tВ9:^@z>4i]Xy{>O-oy wBxǖ8vX+||,^EMe;ܿ߅i Yxʦ"Di59^BY;l~& Yk)۵yEZYgs60iz5ejŏ|}6xOl܂V6sIc`+4m`;_ λtMgq\KRz|s>{KH>ooN7iww;m_,vagi.~ IDAT㍻2﷮ XsPYjH pBU B+ 1P/ox{~Yy~-‚%s:@RB_)Y{@:Vͬ.u\5?LZ}`?Lkwq(H0/RRI:^D$xAD,-x^"ț%\0Wcӹx`B |[±{}AZ ˮ OMwƪ_ऀSƂT,ӕ犂]E<WZ|)1^Dl܉ Wxt` }e=/륍XOxM_`ŲZڌp._~sҙ_회f`~cw:fַnNsV 0:؎nu]w_u[qcH\}akgg}Fqcw7ߌ'|rYOx;AQ/1s^2|ӟ!wܡ{-) 2j5!0*X8g,uG-iY$ٺ\oWT& gd˅V` Іc3{TBcP Hrwy/fGUn΢`,&Bg"jG+30D]VZ̘qRkFT`gD}sUL*"}huɵw^֚gsQh񭒘6~ԭjN]k.C==]~'8 EU#ocUI}8~U[cFM߽9uq@곍-c8HN,)h wX@O5N'}VU8gANa.u1gk߾v =؉C]&I>Ww#Q'/ ٺ;-qE+@%]H|Z]oZ4l%4cX PԮ-}^R B$B.+h4@\ cc^54myyQķnm> (.F`ٸ?g TT9}Fwǚ*gp>T:Iwx&BK k n h^9ߝZWNcI{m^ &HOnq\Shu7f R۽(txRPcZ BvڌW!q?ZlST*:lǟ*_˜'οu`kSS[-K}?lv>"BtM0BӇq'd9|Xvt#5҃~f@&r%jmEۃC;=bRa2Kcmr<P3ò7~Q((PD=2c_ӳ  ,hNUM"PI2CINը+G"xINli>Lư&J,^/T hR_2[aq'ٌYd0L-{rY%Oi˙sEcjDtk}vsO&D6ƃ,[wy"щ$ i"F^Hv ܽtK\ӟ|v4N-1<J;@h5%>Y): R `{] Г r2D'-o6s9Tww4H~Ygk! DB6 ov  G H'y48(6q-~;Q>4dox^6x?X_vbt\ 򈢦|>u6T|Xi_& ^RQ&űHww|D.J36N6Q.I-.*IŎIZ. 8pc,:)Y+z.-AOLT״q.,)5')?vccsxrA! "S`CGHN)2jx9=5K#4J>6?w'ɼ鄔йCP. d\"#]W\ZGE MW;ե?L 'ǸC>dҷ9'lo<\4 U͛= _!q/:4Tqܪ"7ǮQtAT{UJ.R}*@48h5lzKDpjo @gKqE3Tw%. dl/9-٩O㳽oEso%ǐ)cpmdܙssӷӵ:&N?EAgsK]‡i`݉\P,ds T>ayf8~sܫyK?#0{N,?L݇~S+'/P_̭=L0D9t^~iE8pW_}'xÿ[G_WwA1ZJvEXw=ynV񄬓g}_b+ .u6NMD Sh遁~ؚ#9ƚRw .@!%Z"EרLtfvc` J4:3 M ^볧 `?Bhu8Y#;hԎ}ٽChC@'c)]TDa¼f4$Ǣ}ZV#tQ9vɣ+672u'sCPY!`[ ћ "!Ivh4NcԛS"Zq,Vtr \QotIuѥ}}D: Y5ɣ! >^gǒGr!\*ZQ >nWrAScEc(o93k(Wj09*wH<":?SX,"Mh fk!?:LEќQfR4aIImg*LHkEB6 ׅ_T>lv)'+S9*uΙqec+[*ptƉ WTҷE0K_f:hK6Et=]V51XfE.9}L0bVv{; Zz2g8fQvjZD'f9(`>Yٚ4Iυ> "R+s݀[`M_aM|j*͙0Fг:1v188uS6bXOpKsF-(v9`xp pȩ{C!QÆMyi[l! KjcOJIeŅ!3d4Qє8S)r ba7q m{%Ϝ$ ո.{!0XGGʩ EGaZS WK4^umgw 9Osmː@ ,9x1E vP/J'Z3Ae')W 8f(skN*ƽ@n;_h_.,̂䘅2p_dx.fE(/iz!)ߋd2'Eas u` Za΄Io ]v6Z#GNA54OM]CaMss6to~f{rSerH*2O @JsJQ`T #*Lp4DkiKkzѶ^w,su6KwPjp*ci"߽4zm,~R9ţqƎ&::=ϲy>sll0qg$!#Gt陓v@5S dZ{߷GQƞ'VS I)%[/?ܞo~S~ >h0WՊ%Yv;}~{Wd>O޽{y!Ȏ,@9zx_?7'Fx=Du+S5C~$']2)dC0F`G#[ Z]D}GfH.`+ >15m+z  dwV2 |\:;>RDqE5.a0&ha]X-CJ=U5BucoEiXtJ/С03 O83h(";FׁE{à@LPU`,Z<&hG(cvSg18`C ` t|ZKx{Ό"֩hMxvILɜEzXԯ^YIuO|f;UUmFj4c$FNu6vbPc58/V4DR̙@5M(@ jLE-$hL٪I@щʯF^iJ=4A.3ܚ^F!Əu1\{4#!7"pg tgu䠮NQjx Ҟ-o2Q: V"9%p= Q}I>F\9[CIEwsS ).;51ԣ  I=#/ldµFi6YTԋvQ6\+5[6ޥ Tu/".G!;:bECB2 ƶ7\"ZԿDsyB pØs2N\MJ28ՌPա!g~8^, 1WGM&޶/kjgQ!\ʡ,椉m.ب!Jo}p2Q(Ad_e%6 =]]NBd!DqAsq2vЪ"n|\!u~6UC7]ux_asVwoxaM ʇLp ,8r7ijz /\#DGEd` }M#}CXW BOx:%&lvSx),dΦ9 lAi5QY*Xa`{RCYi"1rГ (p%hNiXG{ʩ0oZBƗ {;٥ 1{dǀ!S؄BϪSBA>o5{ngsCu[/loN:6ONouZUY]Ny 輖ecZ@zafUoc8?PKRPWYcjebѬ ] -~JmQax <_3q59cY$t,(̻𬁳mx] P!M) ;=7לTtɾ"Xǒb}؜psTW4q=MbQ~ 粲ZR~I+1S|>(wgy9 mk.mg)Cﹰ/*L^5+ഃEw}bѾ_ ˰S &"eNKEJ1f+X Q:͞5:fYk:8a`Sn,xFA)O@.yݜ|F" ~/..nw}׽'NHN|<,Kutd&1{(pA\s5 AL2%[Nc߾w^?{r'd'>Qwէ3' #`>`u1`P t`޷:͵^5TKP0CR6͈]{R8 Dh))Ar#X}Vt$|B#h:f8qu-vU^,CNbuٹ=321|Oc^[MuT7eaiQF\15nPp]\/F_1/NyZ4ufq  R BFֱP p5*5zh<#y@, pW;LMT¢#b_1D פp m+D1%Bf5co&j͵ =3§=fm)5MT JS {j )K0HFDXq\%ŌZ4)QdW I ,Bƌ~ @ "#F8iah1>C*MQc`D1;DHZd@A5m!V68xZC=@Nu ):+W%QX&áhSC1,0>k Y4!Y4h:١UӞ>YX)SFv^;͘t1Z.DˤB~1QAG06," Ea}5ڌBYp0D.8Y~m kAdiW13CgB.ðď2{z ԙɢ52Ni>8$Ksw9pUѬ^Һ/հƠV6#MO,RCiNng1R-xu [Z!.+w47]%t!"3qHNeZx%= P7 9iVkYk8qvsbt侰`kfq3 K]m4tRZRTҔдOsu/3Ħ2Z61QYL7EV!r (enX5ѱNd&oB+-{9}]%_M{eAЋs[fg5}p@հ, $ӰXtc. !R@Uؚ1 NQגH@'Y=o1ǜ|>֑FVz> L{=Q,,oH3Ĭ,\J>blbNM(ҥ{ˢ疬~FQT]Rȋfaʒ$z2V9F\c 8떳ZN>q e_Ld^|#AwuAV1x愥>}t8{fצ)ё%_⿮mRoQRY|#]O7)N)Ux6@z`bf Y):$yeW$OpOiܑyJ9" "Ght UmbB a\`п|(N';1zq?V(B5IMcax^ձo +k#.O\F6v}О+Sz ,zso>F72>oUUwrwu]=Arɓ^UU)z!ݻW:D(y}+_|3i뺕)b^˰z-G|UW]|P/rLow7??B@Q8,>7Bu0HT?8R"qC IDATV8\5#.IQ=}c-v3~c1"98IhEa)<{ |f59 =oQf<37G[>כ1SSY 1ُ[tV/[R*L2 7QA,]} RkJ_SH0[F͵LWau]&SԌ1#ޛ YO-<ԙC fDbb#BߪEbNJ]iBd}fS;@7eH? q!*"kbԑs(_jeG,}j3]>ĭFg֯-8 XEFCuV[v(ȥg4c_Z]<n!d䠕GA֓DRgМ&+EwE>"czWx%K&>D;E>Kk1ղDb—WZF,3YV:#]VSe#±hƼTBT%+ bRbE$zBnJMuRDG%@g8|6ֳ{ gF(>OE};}hTFL;?Ò}01, 8esPPz!1Xop X4a`hR(f_gs8+C׏T^q"qַsH|rbޭ)z8`GM,*U"koxV!jQ`/F(=#b"_f5}va[4 /}s`;I$U\Uuƕ.(d )-Ε{E$+ip:HJhikjS]>wKe;eiEZxq͑~G"[i>j֙ FZ ~e(@߅  1L4kP\( k윜">"a |/v^Yt~c f-ԐMr)w=RvۜdeFkC`?V :Ԑ9dA2{^ꛃC2F,kBžq?S4. IsA.֢b2m0:` 8'ۇGq狭q料WPĒM"M\ɂˮ3>c[j JٚBWsД ڔ7@d!HVwȲwt [pV!k7>FWg0 =m]~(Uq4N yۇX#yh*Qjnm8g ?(dCai z*?eq7_"[bP'럠 B}UUpADp!e/Ӈ~b zҗ5v d'{~i\qԧ>7x#yB:QgғN]fkq۩@+3ЫqB ){C=)^&&Y-Z9e tbagcjg|J76nV-=F [vLWζs!U%V{CBg]lΰh^yQjSZ`((I,*.Dr#A!=52^L\6:1Ef4!#F(5'!ZZ1 q)HyK[oY*4lXŨaNp8Є\Ɩ$>A'i"L Ѡ_(34*BQvҲ/\#DF[DcD "n9F !Znz]hF~M<>EŭM%R}TK'NЙQ[FҬ/Itkll催Ex²H?JЂDz2 M_~ܮ3iby.bj\pu'Ql P[ !JHE,^Rh(bLJ,e뛘i͋O{cDORѡO3|b*y E@^D5HT[Z<}Ce,!K4.K[$5eIvl_3Dl~6j1U-gA42ڂeEB D<=fʄb\?5i Mљ b m1U}^9GV!$Jh>EzaG1%ک0On[̙ϛWaBk&"S>%)[|+C|$}[#u}m9ostp"_[~mRxA +D^=3{ϞK,<:`BL->d2v|mEs1Ϝn| 6Wb%:sݣqʎ+ͳT]܊}^Cri:( ];D^~W єɝc\Ol=i$e.z4ǁvH3:8=4a?$ew HNC&eAmc/9SbΩU].9 Ijt9xl_^Hrkm#=&[pZW@'f ӸWsYaΗT#:-SK%XRHaoV1[Z? YYl C?q@>_93BKy4r+l_zK"<S .Q6|>Ì'sω'^{ 7|=yO>eK杼$O̗{ 8Qx㍸;u 1W_$u!hCzSE? I +$L$ # ; X4MhlrYQMH~ Cd0wT!Yz-cӐj7Y5nQ;%{_,=c"E=GI4t[d,1v4OFM Daj'MucZ;/"D{eyҝWYJL jj#M-e8VwQT}omUI<Cp5Df' u]Z!>Wu!vS[ɔП|V֞ u EC<`50,e{fv,hFZuЇZ&kfBm`*p"fjT#ؙ!>FUe_3JհM8SVmR9 tMԿE3p_Ţd(hhI#, h!-G=Ap lȐR,Ko1M(hБ Z8‡:vKYE1끃AO)mL p!e=2 BC9rA*+0QPVئm/ct* h3ƅcz+ GAj!U5ճvB88[(,"!BYYx  dP[t bFЌ~MKCLa;'p!ߤwa,zq.')}Ę>CGT{q8^Y|axV{ }VaTd Y e#j52~IN)4'9YIqЅjgIǝ;ZE1ɇEW  d,AhDЧ|ш@{9ڍo2޹Ps<6ƶv[}$wM Vkl*ƌ7&XVS{1iIj\$ˬCtzwdǬc+[SI΁\X~cCa|3=5zJ EC1!f@ /EokL-1ͷ4, j+;hJHrtBV+\Z[&!5yomָ@]gٸhNR6g}'wn .(p.ITlMT:Es̊ǹ3^+aIg:HbBTm?R&;D\,B ,EYT}pIqkoh{0dX~]Kp~[ z9TVu1syTD|ElaH'8FP\DŽ~VaR&)U!|E sQn^݊oU-Z\ˍ*~hޜ$tw|}S q $旺Yb/pKHNnJөhE̹O:fL a>: ZV$fb|ݬ=`y("^oItǡ>hv-b3"ġVрTȏY+۽"O ;]c4zMkEU8k$rmm6Tuٖ8PzSVXU:9n$N,Al#P5͂zJ#B4nBV-mnT6@ECBm(3`P*CyK{4H9R{@gT=!)d=AvY]Ø_qDCeK0H:BF *u4SؙA'eFx"^C*mޏT[Ӝ%\:i6B|f*%TB0JfCnEwZGN19Eg| &|Kb\Ǭi{z5$ĠmVR R4̣1״OQxtw^p{ǽftZG ԁ8;W@9`,q|eS g$aj  AB8 Ҏ8ϼx:# ]m"$(>78L<8HgmoM tA6! /t[5ο*$I:&:x)pjluq>,y!ĂxX{0( 7*(6Nsl3,%kDUp ;Ğk?(_I`Ƙ!?5_7?OֺR؍v/]zzgÓO>{#r}O}}6s-鯯kQ"O?{{נ~m?cg`vwwaWdrޜ2bJfY fcVXH˦2_"Ze܀27 ۰usن$J a!ـ1sa=w1)oֈMP )ǎϋm,qE(-K8 S@B=#!-tfU%ȕwD1A҂S'~?C!`;6RmqNiˆxοJ%ZEb0-]p  ^#f\}|CuִA1R$nƦZ_0Vh ,I\2_!Mɴ,u* K_?.I̯glpXECI:ڕ*׺GϏڭ60kJ)B+PqUZlhyY57To+B3`EmckY`ltQvp`KǖJޝѦ_{s܆e0SK7 V6p&-ZV^-f7K Yc:ùE$q/?{e!m;_2Wzn3qց! R~4X" P ykW\x1G(|2SM<_d D UZ+-ת}~xqT!SF8+ou9K%p Me#;֥tWǜ76HXIڠ*XS>~?|) 8)̰TNS%9[d;PVl/XYL/*E0+q/eǫ4ǍFȜЧt<BDػYZ:d0?TAԁUth/3h'DBTkڂp~ cV/Yl+ Yci)q3Pޮ?x*bB{րtrmׁ@4q2>?U# ##Wy_ݶWjz;[19]vA}O ,<'hej2c7t 0֭kdM>Q(thZ5]r?pMmk3$#HsSD^a˲uBHaH8@g>nIM?6&d IDAT [T_GoHDwv7}s ȿ\<3Ԛvw9p __/c eT*~$ČkG>r^sg>G9rlAy΅ʯڜv0Q*'ršbp,:l0BS4_~FYrQ=mqJ1/ W 0Ǧd_4!_4toDCuqӶ!8T2Rm*>'IU5Th*N:h9;b_-x`Cob64+fgss[)8>79"-m`aul7\D|[HհRRt )l23si-[Dhfcl>w7C meC]b7Ndڔ-\MX&31 n*u >4:6͘B,?r< 7م$Za?#F B[r X3c[)>s}ӥ@DPZ8HJ߶zk-l'CT}nբm4U=A4&-A$+~tBb{|ږ0vEp1KHhSp?:*prC `BiTd9X1HDir.nG.4"R&!ADl\YݛHjLo' p{x$ ~yC;3IQS4=;mMC#)tpXHԘw9EM,E'%掦~Ѓ ' }o pC,ܚu.P ǦrQ`Wv4k;oÆ? %tO<Ӓ{"?u84"2(;F'h>5Yߤ@XYճJw#<[kNnQzT>z;žvwtr y$! eT\$2b$#>Y&3gg{HeHq(q k_OYDD<v,1P[}AٱFc\ Hqm8hd>,ҁ H26 4x{W ܒz8.{"vgeVDC@Ş^Š]:.ۂHd"W+hʥ{$- Wr>EiՓ48#vM , Gbgb d#p\4H1u|u3Z*bI,:HW@)F̆ɚ*_] N! ^ x=G~|g% jf}N%^("@Ki$k`g$XlN?_ + @Mk},Qd!I˂$pOƧͬtc}PPK{}ߑ9jf͍FR(<М5xƹD=Z|vەWΟKi`8#.TA ,L` m `|#IaFYX7Sq9ߚB<"hXT Z@*|L;tA>?{У2FL` %\F@wjR,E2l̷&6C:MA>8dBh6!^n<MgqnYB+I"(oϥ9Bl5֕hpJ,|"& c]ʒVe$#sJD'^B#MozS<x(Oߛ?>>Zv}]_ߪbf(駟?A?x \_/g__}c\JP>ku}a@xlG?kvlNurRP/ zaХ!Yo\p +YLd3Y&C6d=hf6Ett{LMY'*H`aOpp:+U!>% UP)pbN6ARcH䊦nyԮZYfB`yLPQV04G訏Zfֱ gC[\!%%ihC3 m1g\i{n{kn'5Ռ8H{U f۟BUifIB&T0>:gb vBj|SJ܋AISJD~eqh:`Zb:@<8;N\b<*h.3I'wocs U>i 318 ʥֆ@LPG Uҙ+"VH bkj8]GTYFZg* Te0PbF I8 T U&祕4rʏ5z_I Ѐ|SO=ǮUu}~2΄L'rr6e`iMѦ<\2[R:̏!PMC@ {2Џ=ʒ 295u|nNʖi-T[Vm  aWXm}hJְD;H< 6@cTNU#=T^)R4mȁ]> dO@q@ ߞ/ AWNh3VPgq4 M s KnFazS%#?ga}.T6֩b ,9rxY`GשH1`G;MZXy6Ћm!/4k4?deFp+̙-m 3>J,4}"a#^bq"cr !Lm9V[.أڛRMi[Dž!{$.57}н|eml-giNd4'E{6`^wVbN$DdlػF{*ҙ `$ On T1$ Vsy^XllΩMT(sBǫ7g U(>'Gl&G{lM hig_6Ü?<2ZrUz@rMH`KEoF,rf=B.\RHZ8U/ވ z$!Ksﱐ( hu-A0 #j8ދ4AX21>B(K(cJt3~Ph|@UҪ{1D̥NwsҋCU@$|= __O}S~W~WjϙBsVȬP W@eZMPlu x0OE`A:ځ'6FAqMV8KƻBRˌ``'8FrBS+5-cn(+ajjq@*5TvؚlВځCQZZ^kfJzI>`t@>]'weN)8_]:{ӁX~\s G)C5NKtfJat@lBrz' o#JP-sT"ڜ 謁ǺP~E4P=nQ?шugX|[sMCX dV ihߪUF5m{6ܶ9cYoj_':K 6h3eC267CҭBVm72C;[iAqSy@JZ:%LצDڻ?7K>v# sɖS9 1-}*eԈ=Df+]X2NA3Tb)V[ĞRP|xPc؍8e& p&ss{̞ļ6%cC:~8ʻtqq8t0',c=X?sO`jXd7։dym@ЍͺL Y~muY.IH?H gi%mK@R>::p \N_<3VMJoU$%(6“trB\?J.׉Q,xe^՗.!jvv*zD+_"#{&FaBU@#kuX4w;+k46e18$4D~yA5jtр`1vm> .x3ZeXjpJAޗc@Aj6z}N> w9k0V#kC }>JD"u}yGs:vS˙O_{$z]FBwE HyoO4ϛ_ {.'5 _;IRBc2`Hy*z> @~J?5xꩧ 4ֺqMlzu^|Lp3֊{~^_{{϶V`B^W!^Lqww>>>kPz^~O?( ʑM%d_m@MGc\h'T MMh>w9۳ƃbl8?IG+Ͷ?P"c>waM̰obYA,FyLR3@ IDAT!fS}X03]6I&8nfrjӒޜn*KU &،Pn0Sxٛ͠,uk4˽D? ;@mY3@QMIޭghbaSmT^;67;'{)⤑<ʦIqcl%0 ;6Zv ;sUy& 6 &2.@*\ݣCIPt*3K 4'C$r+6DeC#r7-rc/s|ț_B^ |_þ ΜzDַ&? Q])RiWY}}n.i ~p< ٤XsYb=wg1#5񹟣[?%;Д+pd}Y|9{;$}i7pjBSD,Cf,# :%*,ڑ5^ }x]2AAV'ށT3'4Q8qoֱBnj5ZQ53MWgGIAqmy[M3zL FD#mC J:U^ml-*%Z{:rHCOQDMlnͳ" K>s0yD@j e&[ DM>VMB]Y}2/Z ha9 AA# Dԏ),,V0 58PԳt563Z2IS=ukĖMAqXwQ6}b>^"U5]-ZpHIP:c4@?~qF^wi#py썂ȡ3 ٹ9lp!: 5,BHrktUJ6s{4hyޝBz}8Z,PPc;FTM+mQ_N+c7/Zh:Dt ϹeEq-D9F5e{׿g^G=d\?Z;aݦ I䘭SCs#q_yܜ"P 9_68ɖS[Z0|0O$U#Q Gƿ89ݏɏ`ҍu 13F'{3Cux>Cx= F~kZDžWSA;˯4)@o|Ch eY6Sq|נrZ noy[5Ps}_|gG#B^+OscI Wg;C޳K肾rLNkqlj>O~z^q}? ^|՗)}Qæa.&o3 Pt&Gk%tmD'bS65l&)A| W28Eq5Y۰yvDCQ6 cuYP):Vk(͉U hJ% ,.2ikJ 644ƭ5yV@fSAP{j*e7U1oltB-p6s@}ob1 ,05ޚhkr/ K䩦@;`2-N:v,0Rko(.)r V0yz3?7\R@ v=F" XAEPN Hh_CUn= e|QY:ru[Yvn[X5oi=~EЪGe3@DBbl)۳tbxt疭7JЊ(A/8_iG0L-ϩZ1E$UDր`"Y$g)\Ҧ$q+QܢR#pGo#6'$?JfT5&63*{Al#4FU},x-mj'Z XL #P=e&8kWƕcCkoT<7 ^速 _~~?_5׿+?xg|1@Z+6J%} Z[ʨ!"ovMoW׾~O+cU}# |:6@8>y{''3?3{8#8!\Kkg[E[h9EZf=G'ʥYqb\u͂G~N𪮑|:•{?Xο&2S,z!s9at2x&5 XI#K-F an,ց{fqӿEЪ l#&`VQ^ߤR l_ҕ}1e{(:zRSw?plBTDmGS4-GpB AhQ^=+s8o:vzs_)êj}:N XnpO ϳCfS5(`[_lXu$a?b ]uʦ0R{YbJeQWstx"#|HTcco@2YiIO;"MմI,C{ݸ#;yNWM}}}rzw'}۸9ەb9Pm%HPS:uxZϧ-P+X sEvy]`N耢aѮ9UVk ZՌnEgc|tH{1?zTFS5+PjSIVϑԺp+ȗP!KW5FrRkl 2hǚȬ"hs9.x6 Kpus0ipFKak?[op.{E^ y㤔PIXS0pskppia>4D1wQ8Edfp)t= -mN꣛n\;4$4\QǍGi3>9,HjP57{hO8y=<oO.I;1ꬡпBh>6<!df$DHL┵>fX"I|KV$m9nf`#wyR!O(fu?;JDi 3_de>;;tY!pCaVxNZ, `P7`zFۨ5aTgww~1RY/(k'-}34ŷ k|o ;~ZBZqf^{Q.E' dNF~g\8=4Ȫ$gOrH&>Xv׃xz3 d[Ox€GR:%M%ۇGDm=oxR+tBs g|߿πꐁT1YI_P<ĉ~ p[=/pWAq48P=ȃK3ssT"wx6Kic] ;֭[F3@rVRj;@9r`uԘBX8҆?~ ؋.p=qS_ \󇴸,~c̢'gpMjb>7m4ؖ%Bg{3I<8`7܉}P<6իzMo~[6ty54Pƃ;^CU_W;;v}_#S5sg?so|#~o}[񖷼?c?&_/=ooWW |K_s=Xdij>U׿mo?z9^ȏ[Pd`%瀜x Uj6 IQCfwSIuǡv{ ,Qrͳ=vǷu^ ɦ~>ǧ=)GU|)lTʫj䨦] T؜հMʬie^䳬s yzUP1gQiX`k lIgF!%*L`|X Q_a6Bm+&MJ*_wT{A(g `o`-Zs@(n ;6>op+a%61̑]Ũm2 {[}A`[7jT&W@W:<멶Yn'g࿊هeX2 d!G!]4n4pZMUsaG ~#sOfe5Krw8כ2:k+F-O'`Dkm{uA]-C}XmTb6W*アx?b;`+IIu&pFvhNL0`]A:˛Hrowm3ԏ1OjYJlD,";W2ynxǜ 7v3)\z;u&9@}8ެagqX\rB͊3ޔ~}?xrF@r+aC:;|ԥWAc* k-k|֕9@܃]r| j%/.Xč^ݒ@2Q&j:W9'iEo \N. hE8I`ԄTlÍdJwؒyNԍvą!E!gGVԉ~3@iBe>`K )( ʴTI'-~sb9So:8.OD-p۬'W4BY ZmJ:y#`}Uw˯]t]E{(k$Ds0 :gIUa΀FeQafHp}/;ں~ r!_c>s݊D`I;TMn +.*KϷ$Fsu$s:l1K'1o HW7%;#sWx{ӗd<N$}.Jœ ~ウ}A3$[^kjm8[a'ƨ| ~_ @ݻb+FHx; /{lB`5`_NA IDATt}Z_SO]M>6\^^<|[N,jS0Moz~??_~'?ɗwG }s?S_%y晕>SѾ~*Ӵq/?o寯Ƃ 1-J@r_!^Q{`aS&,u `^ rm*˲<2Kǹ*χ  PVfQ MYiD"/JAu@Wxre 6 㙾d(L |Fم ѕ3b8ރϨ D4w{'\A TCnR?uW ~w"DK+xCcKlARZ |3XLڷ/nQOTOAh+YT2]nrݲ9l"vNA{; _Bhx9 \R*$6L)pSY £a>ʘnkKiMo?,TFv{#X+"c&hߏTJU8XM6(p":bKհD^ULSK`7'< =}ZHߥndKە^p [.87V# n: PbX!mm߳pr!2jBqb覻#(Aҭ@& @xO mݦ 0[~+$?q)Ä̌yNthFC6$, %յ'!1UƃpN'EW1.5@-P- {1߲"G|ؽ8 Dh7L$ij} 7x邰.40*T>[FB E8qJ3֭-[zU9P8֦K/fQb wB @^nc: *wTѮl10ýal2xZXnř@-qg\8("Fn(s> MWUR3MRyrPH_B͸3@PX4u1N\$!X$]"%l7,* @9XTOMYXCx$Q䐳ps kZ]-p$k)P9n"剁ucV+ \\9^vNJpp&^0Ez!yrG EA/67j̳$-@|ۜ7ww ?rsQu@TPN>p>^(+IOQFP= 7sDw~F&~Scb5ɪ3o\dVA-O LT`#1 ҨFUF<ŀFcݚK"[KV´, .4{yV硌n:[J2n~};hSfIjXg|mtIi;W@%Adwe[/(*=ڰ+p@.Td/X٠(8bѨbFe0 p!)  k-jFd}k^i'w}&1xp\jUUx'c<_cQ@~4 ڶIx-??5׋ŕM҉rxJ <ߋ׭egM4/8R4ȊTyEu,,ͺ*O\<Ⱦķ&PO"{ϰ2I4jUX,L*i⽚run{SGCTuXo[<\ `L;ݍf`86tqRN(KB3l7QMUhii 4>.Cjl)&Oheؐ [ B=Agz epq[͜lZɐO@p'),{pucƳPլk؍5f2X69J(JP `||dAf\D US˚꼆P2680+}T\9߯4G鳄3 }㒑 3ZwV;|PGco j@GBP]J".6sF{kء"(2P@DX#4{XtI8leXPڂv'T;l}0_U])Ur(ly?~L6 5J 1l 5>OvBi!y1@Li Xg=KݭL`85`WAqg0`cck[g@SzJ̵x6k{sBIp&\'Vf@%'GLp2`U1 hMD eV (s@x>07U\퉎*MAJ}7>SJ(`uB@dA8@(lDZ&s,3G}tr--3xٟżj:Z-㞸@wXVA&呭8(_*0v$m7Z kE|N"+h"z* w d$+:#tPv |ҵiI!uYP@ogS!%сXW>)$ mʭϹ߾ȇ- FE>P—;8zbg^-Cw E8Hv[kEBO<):jnG׺>6D!4$7ܗJ"!s :U脀u{lS y!A.S32懃#ǎvlq|g6ǵ 5B ֶuaK$(HPN X I3;Bk+?1\sw1fD$F\ 3Ɣ"_>buK\|$5/ X$xB׿ t*Hso63Q'INE)._7Mg^p/?{uGO|xߏ}k9S޼?=q;}~=_tco|>15hg㰑шr.h_pA`wl.x>ⅼ4 9Ջ `2}6BP!ſ ţq)u|.^%lS.:|d:Ӿnΐ37[kjRדD˗/:yH)9y\p}sVqg?xm|sWWoo/} _o|sB~׾)3VT 1R0C} ؇G.~:CٕBdʆ9Iԍ$ĨTiWj"}Ny+{p",#21 ;w"X;p,H+qhK '>װ 9+eC!L1M{M(n(Ri@æI{{u[ĉP'-b,i)h7xla)}kќMVo>RH)^ 0qxKoo a%wY|)6(l6l^ĐJ)]=zPǽbn|iȫܳQ>@^:(9 Qf W^> rIk`#<0 Gt"czRXЍ24rk]kӍ2z߻>3smM]0|$@(mG{XOv񇀟lud' ~ E9J^s[]ʚ+d.֕)pmB`-Uja{[Lzb>B].b2 |g:B{c*bdV-wί9VKo% r8 \ `0db{ܐ0 (QObX^H ~`?rkp`^%C͐gkp@$]]Oy:u d[3 f:w mL:J!+fb PY " b?k =xuuN@˘csw2d.,ł4}llνwɑ Rz[hyהb=`4UnfU7qukR&|U.{$5 Gt.jX6{Q<Β/=N7 9t*i!7YAȇ}ԁD}.AKހT^ sGni!Jӑh 0Vz۔؛ bfP9~G0C߸v|b(NO 7 SBזFH@0,ZyT՘s{؃p ZN[zȹ@4QI 4{%~;߫Ũ yA.u2!J(nnqc `B +ͼ_6-(**s7HRM \S%5QLOj?G^>/*%;꣺ "+\X3l_ '9=gw}\ VF ٚuG+{]~_uHVH@W*G&[ r!X'e*g߽=Θ똧yE o 2rظ<鲂%ȧ!_ۥG8,#ޢ"*s &?Kfr3; ?p[ȱo5 9yYXL䝈rraN9 #Soeg SJ!s:*8 f}!k=F' Rq+5ky衇|MVg}?njnY]o :ߕ#^"\~=lo}蟲g<|;7#vO{mq/|WGqttt}GcPP)x;p+_yʟ"?ŗ?ZHSEA{OKNQ2pFP4`LYZն ?TB~4601~ޙP BpG*_V'&ِ|955dP5 q&ԖF{ "1+ uM6,|ou /{|3Oԧ>U΅W߲}K_G}W\?~?o">>C~$1 RiO.bn͆*.Bj(Ӏ fOB[\Qs%Ge`UTi\rl - (] U $Be,}:-+x)pqzV?o`qq:m^TdOkʜ84)%Lru'cNt$f0fؐN@׉5 SFOQ@Yhղj %)jsFR2Q^c+& ;(Qc1!PX\QU.-'@SUYRnUAvrBlHD}v ipk%U*UXwd"O>țRY)VqAF&o Z>WDrf N?z f|VBbOvʪ@ `hs?6g0 seæ* 6^~F VJ.p݄ 0cS2!J" ZE:5tHPr&pXZ*C4@eqP@ZJB6rtU3Q8>p{$T*@IA @U?sO׮]{^*\~y~}]gkvNʰ} IDATv뮻7??,w}7 5Ї}/z衁`x6xHϽu{_=?#?>x_??+WrđwܙӤJήJ //({[ּR S6BKU4,[g>*νEtKu,ʑW ~)i8|?Ҳ #1aQ ys4@cE3{|4 6ev%Ҕ;rME[wH E}(P˅]#(vІt!`.H|RFP01a yܠ^U Z1^%i0"1@zu% `cmU #i-E҈*RCc6^uj\bZa+ Uȴ쪘sGr@JZi o\5:cO )H_ttO&{ RK0̖+6Uj؅wb`jG" ;m֕#$U( VYYƆQlPO.3o!"Tjt3qkQgqA2FPQ,Nut+ZNiځBa`biZkE 4nwp8So&HrTҪ gy#X.Dy֙F"T0]I[^X/8 q%CàT|zІ2"3Ɯk t0r-2s͈.*APƙ y)w|>i:dpq3 ;Z 9L#2X۠#_c@k Y`(.2$xI)PYT072Ō2A-/dAiT+ln(x@xGBZ2*¡@rр$#qn3$L3kRGSN[ɌdJ^A0h *zQ W}?ؑwA A<3N2D2*\W:@@H薙d㞌cjʘ`Y& AH5BER)dw<[{x  ؄`>`PJn;|]]X`bE NY먪<l@ӅE6 |pr˺6 Q 1ͰZ;vH+;uGU'ޫqN}j(pdxK}(j@v0F ua g yZ>.rpWϬ1R *% ϔBgaĥo`EUk*T'g]@:@&\cvCȄ? DjaK!Ո~IhA@ro`{kԐGXe[nr2~_8_W|9(>Q;?|DkYgޙuPpw=y|>Img>9Mg5 {s+{q o<ϓ?b? $2gBwjM!TX !(s-Jr]*/K|@*F C9N0èƑ~IHnP~Cot)ph*؂/I&@$LƓV+;˥C3nIUHMB9˗/;˗WB~a<÷|:vګ\}s'???YEMpפTlǨ~4Q/ב\ EYDBWa/POrlQ5.$PBޘRb" 3! ۷m(ml{K^{/| ȏUX6 GIyWl%|@FUd&AgB; :zpi&r @Ixf_n}TQY[z )FBǔ̦ @Wp`#FnGOOOjZ,EzeyhZL"^8\Ff8-0 +} 6Q S`e^9!s.j+f0-vRRxؒ6C|cN""WX'vetUy2q<6`4HB:|h]+PY"[X.Zڻ( `1O5A$K5`IPV! IJV$`yH+#vrIX/ǚST IgH\C(:I ʵ'h,?:@*6S*aMmQݪoVuh*co wؚȌ%8 L",Esd:RV4+CC$ H9ĕF3 BA(٨XD6r$ k6);kB.S6EvJh󭷵mx>F'$·bBKi8$#s JqIu%zghl>:\FCNPQ UWry-lll:l2yuǠB'q}cmX;/MdPdMpCN07X8AÞD7 /m @f1 V&̡$qLr& 4W>3193ب@j-qy'9ЅtDp9#B!ž.3IJi*G:!~kxDwҟ\s8DINyi8$rm #Bck[d:hD]b^š*j ị)H8%‹Bw%@8= dXyAӡ VZ6&T04yGBDH" 5ψhex/4Q]"b~NUWBP 1"4Gyf Ǽ^D"\lM0rSJ&azC,#~l뙷 XyQo\l;&na-O 4c|MWQ%h8qPR5%X_ʍch8{Ҥ64"EK ) 2# `l8G@9$I`2d6pҹ >7v$WD ovr{&:ym_ϵ[_Dh/&񭠒;c of6ϪW߷gFD?/zի?{bs/| ?z_׾ X? |q߹w>^ʕ+ _nʪ=H1Yzn{k0>>|EO:Ly"~?o s{jQn7ւ7]W_pȩFdcM:pA HYa}SAؚ:>͆ FUf( Z%eA@|GtRJ|miNxS׼|+׿|oG}x?\E^NT"ԜK8+ȮP/U]eɈ]oXc5Jr3Ffp~c6$z$c@uݘM{I!? Y4Y1c~vl3iG Hv&׎ cT$H-26P#?\p#ǍhC;\Lrأ封/2A<u)lR-,sP-Ȉ|Qm pDRC,j A Th'S,icMB[uc%Plp m=TG>F65hrX??V9V5~RhӾ =r%*ԏBGDm9$ZbvKŬ耯dӨccvLb>?':!8Mvaߣ{RNd⌯@nԴ: HB݈ "4&F<sHT A ;@ǐ]EU$>R /- #dж}cFޅ|0J{aU'~hѐ], =&%q}z<:#PF ~RGN8dL5O25 9Q !jrvqMIĺ5<7C:cJaho^U5w9\W?gq8xEH7pŽ_OT d:?ч@T>rP. ʾXs]ls^™؟c=Еz(rۉILW"{83:˂ x'|nˉr(t[Z SZ藖Uie[2!+j%Όس\ANDUveT[%Wx̡t+_*Z[-@#<ӈ04k@s_3UEܑf$!zg 骅Ή^B!җTRJ&[,ٶ?;]g=Y75`6|ھ^%_؏x_>Ї>=u]/ozx_W~O} [uDfvVn:l+ρo= W\?a6_5 r>?)%t]7أ~wS]/_x~7\M@}zo>Ӷ0#z׻~w>?_'>C KRXp&ڈ[õK1GvSx9J52X(|ʅL4Th(}"g3DS5P[\ks6cldup)<+@\2+*5A/k|-_x/ދO3oC?돱ShX_tWgFBH p dGkq,m@j# ٔ^~*.Tki9P$A h8Fe #59(u~^mDAѵb>v 0'OmpR&;rB aُIvC:vQzc}]4 WF01XoCwBosyml\J Y|( G6J$x&t{Y馨9I K .U>y) %92o|LPji3[@L1% }}( (VhqP,Q״'#XUАb -UZ ohmRm0n215x}E< PYpxQ|І[5V*fTWR:`E QY _q(]X%uti:0|L.Y ^9tzcD T1 U&' 4ȲMfm;ulQXc* PQZbvYO{)0q/@X*Z[ e ưZN,V`k &6D16fؘpÃUr`, ƺi8Jڙm]_:Ϙ+d-Hp6Tj gbĖ*j Es=sn%cpY>h@ir>I }\-Au"<$A7u0DB\acMYIb`|J8!60u"yr -V ;,$$I8{PhKUzdDY@v 6v._<7x(ɨט%l8wD&YArPFR؂,ssn&G:Uuz/ y)+NQo IDAT3 DUg+FuLX $rm(ްg$5jHPb*d1Z k dm?ʴ< @NG ~3 U6}3~3?3qPΪTrg3m}k?x,?~|?@zֳn>ooCn:ܴo{*|m__wÚVfu鯹*ss={yƝw)o{կ~mve{?|ws=QB;ƩvGyLtF&+lXhRr[ ^A^C֙C 6ְ ˑҰ9Z ,\aXcͦsMdͷh8ݨٴ8*H  ?gX9K5x҅'AM$`W//?+Yf|舕QP]P M<"`EРo ͙&'JRei4B2b}2RU5eFҳWL6 +dl'U('r|c+h鲦 а"E%6S)`˄ ;*@ TLʌdT ;8#6묍{GQo!1&;X )ȃ(luFP6<0aA&iZ3:$;J]2PAF,H4{U]ڽ{miG{LPӸT܆w@hOO뇡dU:-BAlѰbB8'37*V# >f.څZ]4]gN2Gz{괴lWյP! *UreN 5tS;R[oC+Baga6#@\cԈV ,2(-hF[?l%Etv?e+^AN' *N?Udӎʠ6=SpV*1e䠓AKqb?>Hx(L%Mnq,8C8O eݯ xƀvG8'<)#nFEr>#_V;~b V`G$@Gz,aUjn BTzܗeJ?c3Quhy`6*vI*$sjxL6Bﲰ> d1m*J yϺC= `}U G 4@[z*:"/k|]GAB7R@AQ_ ܉*dRh_4Bx w@"~shi 1C9Aqmf]u?WHR `]|)NoNkrKl̼l\F 8!AZQ&>9T_g F?hC;̔X=!rKa,Y R.=>(, t$PetOAb5I>`QuZQSb1J=|"!:|ɳ+?xu=. jĞq}ENRBBDl$@p5:A_ chzsv=G&Q&u@*J+;-r >(^G}#|/%j^uG$E_{pȍ]I{r#7QEpOq\rD ]2`b<1+䋂v͹TlL ]" |XpΖc/킀X$bw1'溸B \,"q.@D/{@ G3F}vƹ`H22=2A $? BaLy[IW\yor= }?XDmx[ނ׽u?rpp߹eʹ__<0MPH>@!@)5Rgy ŮBi{-KΦt"|{ZQWxXz(hV>: i(&wX6F%()$!V<8 ӭ5'@W3uo eEQjQ0d#x^H&7H 3TJL4J瞃uQ\ԘTtx6f'HHn=gO -,g ^m~y?jQyl_&ȍԊFvZ팫k>t Y"Vpi!OvƊKu5:e92+[f./Zv iD}$=' F@B^7 vPBڇHYg̞.HeMtÖ"{Va~ј.^ EQH6?cj*2+d=㩡ϪVHcqmD2QہgU ݁|JX5ĊoQӇr*,1yBe?A(}!M$5 A6 ֐>CeۋzKaTjHFC;3)VrK]1h"YG]:ɖP{embkaǑн=ۃV%4k#:G; _!IŔf=B#yL6XYMi罠uV뽑rpvE{ "^zg(u|PKK|nx +N&mOh.2Ս`T.{cǹH6M_l{IU,-r;w 1a)ٴVl$m̏tES.hLwL܈#>1Vz<1xe8*93P󊔳ŋKAq Xwylj9rfIW3*;3{Elʐ9 /n{VTRnO{^`&I[g8ϦK/aEt9U7%)߽ˡC{Unvp7!+={|… =zϳŘɤ yG5yYOO[ngw/N&b{.`F?vmR\>yG?Oι'Blt K'?I>OBz1^qwC=dTqbӰ+=Fko[X5yʖt@>{tGL|OQw=w1nsŀ'AN{i F[2aS;N "yd1K8gֹE"bzc%ra>!-?z*{7-_x”^q\})}Ro7̗ï?u g`xEž&C8ȭ%5y+/zvyMlpd1vNIN()#`g d;DH6jk{Qwс}Qi+K6pe7lgt#Xmٮw۹d5p JOę>'Q+@]ܲg'%%י#X7^6 Bu<u+~(e;Ew {u@3/(uz4YI+H Xn{SENhjҵ](×\C[|&XDӈek=F^@!n yUP1l=}q@C6;+XցmNXa#*;m{M%5€yi׉/tIHfۻ tIMJ&3wZ]ؙ )X & e%A=OO΅cɘp5u%ly QEw[?iTDO F@=+ށ nI!PHBXeyǥkl l99VedGg<8qȆ5m7]p@j7sXϮ`L@.|B.Z蒽 16aUADCm;Fo `A4 V([NBtI t,jl&ҦZ" |!u;E^Eϝ{%19Rev8X'N\Jb'#[B!zxLjv$oAIDm8YNuln"D+`tWeqݻuGk&ݢ1L֞1.Ž x@Wa@:5M&)71w"Vـ)lB8,sܺD\*HsPA yT+1{VmAuCKF[ @Hދ>R騯Z42Ieݷ7r9[/q)|>ǧ~bwD9Ltغ馛xϏ3g~ceLE>Gudq(@//-&c1o{]0~^7oVVV_mݶ0(EEg;{vy9hwf)L} xAJI%j83"Kصn49)@CƄҹy.|=ΉiD!zynz"Ǻ%dm2.&Ē]C!ց+Ԁ1Y{F-Y4%~M?7wo_W_W #.Wȵ>#'%}|>SO=\- 7Sw 6ѝ=%'nb] fIȚDױ6"KTEC;&JdYRn45D 뉴m򓷱nBڀl0`M2{2s-YJ(OO T"Fw]Q/e/ϝ9{Zr9fDɞhHmY=@޵595'@.:[eׁL\.m2{!UX[jggp4t':T@8oZp]?6нd#+2`V+aӼBlk#ѡ;V63>`QkĈ4!K* {q}=oVȐJȕk'KܰL Hm6LԺU0|&⹈lC%3bZ zОٶzc1;VDeJ0}!Byd=HYI6]\ $G3*[X/&ѠjTՆ PԑDPLaǟ*K=;h}DםÁ R]6 \ рGįr]M%8ej*t{)Jҡx_F=Tk礝L]lfgmB?v,'bxb) ]uB$JLwYA #%'4Y_(%lG;| H͉-*5fPz&#s,؂z}}_f&V^еJFyCі'mŜa(y#[斃c1u ?l9@ggF/ {ɻ)i{(Wea N3Mķݎqہ 9q`Mm8;S o̫jA6Lr@Wdo{$4*A,ռ dNn FڋvEaIT5_uX?2qi`ߵ9F 6]:KRKnFz`: Y懝?Y҉b2.VԕXJ p>";!OȕSnFeeul;@-Z Ƶ"K-© ?7Fzc]qf;s_ZJ0Xyb)R]"'tu`C?mQ5!͟&q6rbv s1$=v eY(N Kw%IihJn#tnr\X4gD+$SfTSËx*c+veeuZV&:7sD.a] DY๝(gh*[@c1 6VY;ݲB;>]Z&MnBXʮ9Q";J"\bz71 )AMR) i%jڇ$䜚N=?DA-XK̨=EHP{egk"JQN̷S{YR kؓ-Ƌ+jJ%v>`lK ]uM ' asnMuغNRθ'.O6ҋk]jK-k] IDATB0& 2z [䐴;1,HUY*zlF+*! ,mǦ^()~E}/7|bϽD|gxr$K7BخFM`T1hsJF$Gt[9b9 _ִ*:QƂ *X@;߆|.viGZ艊6N.nj}B8. LaQ[ɾ -}Ԓg!S4MψM'3At+QyuDn CXrsc߂ph RYY=QM,j@ +B, o*TF3TSp"SLp8,\y')V2qߒyjIS f_jAt: Nс n9A& FJUy U ݆t!/xWB/ "N_)mYBSE88kΖ`E\A;ߑ6Qhn^LzC"98ȣ>!>pmדEۙj򒢧2\L _ ;L&;7u:z(XGF'J Zzkl@k:<  둔YɶWk:63K \?AN Hec6`QL56IbIPt2~߁LVo``iEx`VQ QznB ݽV[daj 8f.3wun@@ RvU69cvqUa $GVX]C_´=!3- 8 dDO9{6 1z$sǭZ}%WVk L+醚 z=z=l_H2fE^ɦ>+YVE<ץ@3`x%Yv";͘0B LԤM*ZQ+WfrjB*<nFj V2w~K=Z$Fpu- &ygi].Iz=_*֜axq}|Y!4ՃP-ws9vgC51F'e`%cPMc.]+|^\y*Z$,NiK Ac9Wvn_ܥDžy ',)Y5لе^aeMc@H}zBҀN?ħ?i~|aNjOO<;Q1Z=Ȁtrk(/%g6QU6Q;z޶BWDZV=KHvZ9b,N)0~m! t)m75t:ӧy͝w޹(z>C{}}mu}|?,zB:5JFzl.sFRm9͞΀I֝Ju(^aRwL!T45:M;82!*Kq ^-P4Ǵlf6Ԍ.6* M1Q^JU;t!5 M^Im?IN){We[ _Mۧ&P~$y8rRГTz|ۺw5K-IS$Wi'|m~h8 Q'NW \XJ'Ӆn.QGCdv:^ȼWiSOmNGBzR])~ >ۓ'.󰋱rLy"r 5wvFXg1D"A_)*j$-j~ʨ5c4`TyfW'8T gm@KwvrGZ[Frي-&\~ B<X1F~tօ,N=c hhsstSznuJm\fc{oԀ,}Xg5m56#߱8]h_C~V̱js_^U&tE >ゞsJS|m2_1U5{8FK_6箞q)h> SL@-Rult֝W#v7KuMJT*3 6,]hHM-XzNϮ>/w+ jk [iXWݤ3]O`Zd?;v[wMk'D/5oNs=w)K~`.m| $ysyߋ='[ɗLMF3J;~Rjcœ{9C=wyK޺`NFl67x#wߢ#9??_gh)/0bOv~%| .W|ӟb}ƅ z2 9gF3g0^|^ywa%q㮻҇~3x;(|.a -H y<PIh?I$JF*%/C^2 {LNj9s!ZtjKg; sIVU;'0 ı?G<W^XKճ?{є9~ǟ¿?/T61&AQE G:a qa\s6V rE sxBy=p@$إSx@Vڒ|/:8x@1hhޖ|]SA|s|%Tt! h "gt)[+PAO(ZjZq=k:M"*[xE8D\_z:9g~KR7Nǜ\ez hi;OZm; mթ%2G]8wttPp}$kT +!^WAⓁ {7"]`Pp Lpi1̄".*Y ^pM$,+YI!=ȷ]ynٯĤ<]Ejat$t: ֹ1chլ/.IQaykZՉ)Bj4CpBkarHs9A=*/N)(]?8a0]z~T%/vc`h^00RtIs}3WYŏeoǞyb\YKhtRH:_yӛ$_>s;Wѧ][O¿<\^g(/6,2:sCj Z|5! 1BBfiE<ǀӂR A@ѧ0}[57 䓙P]4MMmhO׈hDL"x*QN+{B i2 c Ph5]% ]M/~:lEDc ;s3z#55dS-jN/;.g["Z8;µ=Db >щ릪6]OOcI$G8T"zZ+.  !ynԥQ$8PF @㌎ɮ{,N5C'ciJRӠc+|ApNH{N՛‹vd"%!LCZƌ:6gQ5Y$` FXѵhL_\sZW2hZUG~I f zm0nN$kϑ ;ՙH}8$ l9gri@-{!BM۱L&VjRbNEV"r >Y)(Z.Z"|yh x7}{n| ?K*+i|ߤ`={)+S >3>}˫(&u~,'y<>N|"m`mhP+KJٔG?=zX N^ ?S?6g^ҝe7榛nZ$^c]wCe1Ǘ%nօ=^u{~k_k5.7 ֆG>{ŞƏ ۹PtD??o|¾[[z=v6avNFb;4."YKLzA_: |1F40ڞX;//wgO9 K4_7|Ǝ*x޳0>" EKtui: ehe㊥>Kr37<f}S8-H1Je^Nm %8%yjL5x7uְt,WͅZqDh`)>:vYZcLC؛ _ =n%slRS,~tW1!瘷D۴.08]tɨ$ BMOPAdZ^# 3-~.Mr7N'\FXC٤4ʳv}1jZ-A+a;jPD/IO@(xoaK\Cmʶ~3 .ElNW!a{lc}5k zov)!^׹`ևgJ^i30'2\ \Qۯ`y̨XkžR~/HibdYtQs_vṇsPg,D;T2qhO:_K^΅{Cgbه@qHls[x`~glHp`)kI#MJi l!/@~H0QČH ǖA ;y.P34>>gp˾-4svҧs>3v{~/#NoziE2AWHc_ίz?Hϗ«{-!N8gnEGy)K.[]^=yO㫦mc/WQO8_wqGo~p:yvm _Cǃ>80}ٖA'μB9"s`/1?~\޹ƣ~]'ֳ sHЀ賂*Y*A4qQ{Ґh6/*sN޿M^eϕ ʉ寡kQE92%4)TDY{yQ;"8s?xv.9_はᠬ QZ_k4u Az=o{P_I ǃu ^:4*|:Q篬Aq[F~qjݙO7g|Aqwv<r6*(ˢDhx5Kdϻk~ 3v}Il׻CWwc{E|2߯w>[#㛩n9~bysTΦP_򞁘Ϳ ?:Q9((gdH{~:cO"^}}2}[Lhg?vߙs` \7 ;ǮsJgmS{BB46{~#i yqMk,byM*Vi} }^˽7+~k~VXr*9{"Ϛk>~^ڷ_:캾w|+9x.^4e6~XI[lRu~Yo}b}WU=uTF|xe||s[e8~~g^飏>?8sf_N=],l}1|33`48]N)<,/;*QVMmS`AH'~R>WH/6M{BJDlsɓ#o ¡bN~5:BoK *`+PF崁a$JM5*! V{j-k* Bj[(doI~\J,9 &u=q^@p߽B0\lAŃ4T,` ((hYT}2(81X@X FB97̟郋?3D2*ǂge t_9CA8cSum_/xqB'4vf糽Σc޺Vv)jS:F." LOkoÔm0i>ZA 5׉è>h~ጨ,[,%(14f2]4K}t9~O=?5UȖl̡W:01;ӁE,/ ?ϥwk?x]C?ugЌT5,@('>/yNA<[Ȍae =ktHAws)98'x53 /-~~zhr]gΜ_w߽.??]hwlSD}2MM~뭷/}ia87tϝ;_x_WՅ_㡇һRZN _׾ozӛj$1T7v(?M)ohA. SthcQKAJQ_=CR!bt"->1^-b9[>{/Ne&v&)Tn(=7߳óXs0 dQ`bZU4 d2;3GR\QϧY-enzb3_ϋ;s*]scu_WݢK.d4׆УK(1bbT"4ғv( ifErHM 7.IAk3jxvh{\<Tcq$ ]|T~yۜгޔ>x?Ir! [2+|A$@ze#!cطg4lS ű{wI3B$erDν3*4֡~-=mv=P-7'RDȢ]C /cv?{jMfBJ{'|јgz393FyXA^=Yl" IEV/ZZ}(Pe<6fl٣u>#aX%*] f0P b>Oh;Ti) u<⼛|͎Cf"֑mqd ^T|Ӛ) I5Ugbf%a|qqRCJAb{RzEY]߫2eST\ܼ!_Ϝ"j`q sH5:jitX(yu g@=uIoE3+{ωYh}Z9p`\ʚl P9/Ta ӾZDpU*eqO@ԁoPY@lv"ҹn[Ê2JX5oBucDO D2 ;/ŝ$im csS@RiUЂ(}H7*.L&*ŷ`fEMZ+ħ3fx*7ASHE`~cuzOzۥ$aeIaу GUoq̈́f~3E.P.C3,*iңPLaCȇNt58MNMՇvt<=zpe$.AJL>@wuy9{(H԰e4ܰt X2!هxV eP+m-6rP^ I_i}$E28hЙR^֩)xe/~}5VԜkH760PzDvAv@r$'A4D J#ϴƈԛF˘ĞGXK2:$pB ˶@9ՂDsɌ<]?unD "S{9:HnmbPή`Cgf(v"#d un̄kL ԏ < %9#{d#0ٯg9QG=[ [E!b1Ec`\zBzʢF`)ZBp Wɶzl2A\pDcb!/F̢^a*1Bԧ +t,l\<7{2| 5JVnL[`&2pdۣE֋O1ͲlΝ mG_xvH,]Β&WWW>Ɲw޹HDƇ?ay;I8⊋If\#oo裏k^^ aLSI~ 02s|CBs1U%vF/̇>A,?ڣkP- MI7`a%Wf;a:ܗ %ɷ HW'tI`+#OhB sk5x<&_z~W7͋sa1.jp kk^Q*Y#BEj4X[DĊN:Խ3oMtyϜJ:f$-O|5"iz`:;fSڒywO}0G>aՅtSvcfNjK=8yNmwup0ސ #nG't2pGzGPi] i:Mc؃4{eJgz2 Ŷ[T'U1dBqTA!i/:tE& 2rJ@)A Q4~N] }и~!ƔjGCw#qE=`M)eR*/asz^=C%۽̆X+8"fS gh_a?E[R:o>x XAv $vN0% _aUtz g\mYo3@J0kYQod8|O`SS\3dbX6 G=':-'??.BL.o>O7a{;C~w~Gof꺥ù4"Bzha0x;V/a|t#oy2宻҇~sS`ۜ RWm@c䡇r=S7p%Ӽ<ѝTDμF:CRk~AL@`EUׂ'0Eu+{?(o~zO}S32¤60~029wCoPTs}DHF0ߦn]l[6m%?0DxWZaWǀ j34Lp,b`iH'=[ .Ƣ9Ҥу?0.}UZ[Fh(BƊ0d)}>[[|S7~Kzk,1."12z*õqVȱMSd(S"cdzYda~׹נ}%?F~{m`4ٹSRGc4,ɍQp'w5)<`IZV[/̉i$QN Qt豌^D@O Kj+ǐ_+ZJs?#;H@Ng]eqSm2=#~uJbºkj7GG7a1I/q˃>sQЀ-;_RJ|_%<>{^KY]&/^΃K`e}r~.OOW"{8 NXYmUs;sǑ1<&Ji,$$TP<  *<*:p-/HC$  =}v910\k{IG\7ow]p7Dn#ߑ_wZY?^ay%C>砸<Ȧܩw'lYG C[2+*==Ç1"G` eR]dJm$%^<:/jo=+^,z'{vat)}.U[4$hu[gz/$mmNC6>TM@S;~ز#7UcO4 Uf)5T[hַ6;~PpOf3>!>]ԷJ?%^bH`\a37P!s3Aw 0 ]GN<NS 3y2{W1zj2~J#ȷa'`|4XтOR!%B];$pm~ 8xր[$D0 b7@(ݱP7osWo1ؑtV]:x +l /\p)5sa\cq i|3H_3GSh3>2{ktw{Vwu >cŋ ;׌T +fTNp(r:U?KEE@H$&uR=m3 W\x XRY+56cqOț&)O{p=?e>O~k/;$ 0z}faԌ']X<ٸd@QNEǐvazk7x ,@jΝܛ 7јlPktr8>O-v<7Vd fYU ŧB麝ۣGmCfOv/E#숝ڱW={Ԯh@v8l^:zx)ȡৄ*Vy6$b ݃qö8JX{6¥gYBcmvtS_q Jܯ4 lؘIڼ ӑy]!$kcS3IהPՕ9z S:I;Ӽ>'lut!J'e6E®#9BxfP:d"6O p`?gK:BY%ſ9MXBi\$]|Lp5#R׹V66bq}q`Z/&WCA{$5K5IC:#2zmk΅ЪGJ IDAT-HS1Bi=zŠ~(?^ΐdFhP(]}F6I|{L*Nw6=x~,fkMԂ) Jס6M c W|QcW3^L {__9N:Vĵw ;! 9gp r{8WXږW%?썾JIh3uǘ%bibAK> dHA(j=Kª|/WjwV]G7]7r!/Y[K&>rc gTxM5:tk$MJT2"hSکRߨ\'|jjeד6_/ b82JXUT3;I2[WXq^ɖ!_EXzrA7NB/Ӂh8lN7MHƇ, ?:6mᗂ_ Lf> ?}&!/Gzo2`{D~YDF YWs Ҋ8+FK_~>s{Pg&9?y{\Y2*ξ6DTw<۽yܛ 7݆*;ɟsxprB><ÍÁo%Uq| ;G͖E>r xԮzy%g&h>I\&wkk=Jxۿ]R+cK:YU:n>(7}H>ޠWAG>U@fMj?ތ'pβz^&"ܝoooK{7͜oð?<)c>n'khoCuc^.`YG3$mS4%OP m# 6w u~d` lf.Z5aP95l@ӯ#v?\F9]̜h̪[K<^%*A PeP ҖՍ?K7NI+ ֢(fPSdrH:4GT£ 42ml4hl#~~%HX9J ~\)Z,YZ%i(}eVm0&jVh(/f ,Jڀ( Ch 9*S^= +h~4.1+{^9p <,p,â zj*3 1'j k;lu8TܥHCq:ЬBIlؠ,ӊ c?ȗc8hDۼGr\=<,чpͺWkzs vG_|%@c#Q_Hpcu\yɐ_nߛ^f f {9R꽰MӰD=dShu'.DY}Ӧ`HCI,ؓ"Dnrlk .^x7w29rn~۶NkP./]v6YrA,L?Y#qd 6Jp PMK]P]@4-s v]JmC Ruo :9:3H醹Q¾YwB<qooE>]`IȒ+(B]@j'jQuxNUT#~d!aFDf1*&9 MԝڇK%H#%U5JEbQ\/\ļ Q7O ]4 rHصґkِUsGY=4$4v|e\i(۝X+/ |Itlޒm/~wa$s$?Ǵ8sA:s 'I H>}{~4ʠ=aIWibo@uf(!I^/:ߢ-l>d߰ʱ68܉31OADžZ*~VUEDx}elpXk{C< ~{&fO>ȯcm%>3 QeQ#":κ.&]%X>'5v59^O-Efܩm-\ - Ul| ߎ4^|{G?fޫp|#w^g>꫾v~?!cݷx_n|/97ȧ>)o&6 ;'%C~>Ķ |޿kv< _oj}mSN?^FU1}u8,^_İM?aMո@+4c\vM ͆T^}e(}ϣ T8C&(/oo擟|7~D>۷|+Ѵ1Ou *W\4ܝĿD**ȵ`?u}5>rΛ̻U@N[Jl֢tUx_QU" 52܍uKXgkʪj;ߊhuLqXO.zbVӆ:A!p"]|Q4J+DXK .H@uPf^쿓TJ9"aGp%xa))})JAI+5xmhV)aKBm(9(C@N@*|ЕFSBY9U88R2Á{[ cy(S MgSKkîڳjT "8Ucb,-4՘8 c{\iʦ*+ >Ԧh3JD1Fm)މjzQ)uD>pCucZ M TL a[~3yC3aDijޚ5 4w uXvp$P̷;|-RJdV@YGoU@gaD FFn+0l"w.Q_JEr k'Az 2D,Hm) ПÆ tJs)$)QWaꔑP;VtYQ5V~A徝'"9znu?lC MEuߏmͦdD,(5'鼰1|e~&|STIi Ҥ%pj>Syd]Ǟf:翏b{d_~ӍFFR..:7Nk7d$Hi֧%*I|玞 yc#ސQ61/,Z ،A+ulj y4kՎ#/%vwï£gVj"iִ w}}lGnj:9#P[GlWpv:>H 2:2"M}EJPڰg\@SoT.TuR`w *94&)2W2e/u?-*Em^Vrd]aAފ_}m mr]AG<)G?&jSFD 6hsAMŘQa)|_$?h/ݖp"0a[$Sb=b}k+GǠJ?LQ+]ydGl-) g(lmW@h$رTkD2$`:۽v:[,<;w~Ȫ*hLw^Qy>TYF*Ԋ_%,FtJ~$hakJ]Mi cô ٠!̻T0kl Wan4a<5(e4N ?Š|22 v꬏fnR K Z+"_P.zo ekQv$ռմ6#ß5~<$#:#ÎKg9Q.& ǮJ^gt_e jS'}ؔXdSp>& @5д ظǖ%~nl<n ߀ TB-NvOio8E,-2Mʦ: KLbJ#ƆM#c=46w1t9#-EB}X\;o*2O ckOiнg2d /2ϻ^Asu{LSKZdVԱÁME. (T7@w/ KfAh;}Ԃ)!I5K4yrH?V:0 k  ;1g5hh: $\t RPqX7L*2nz\3{Y,X׉J^T5eL;:6Q]0nUTorP;i%]:=îߧݯW4΁뺳odE(VMP*A=2DǕwuM{ik|Nqn{$ر}%Cy 2Xy^\V=B-6PG\N:MS$X-j54.fbب1cݩpӑqjo'o;ғkkcB$9>.aoQlkIx.y4Ba(AQz, oA0X6Y%h7: MiY_Rkd\" tVNGI @ t r_ S([ȗY6uv V w96t@gQUZ@΃ش-}r akdE`pKsЋP~ %BSUeGG)S.@V5k U {-jhDCJߦFh'q+=*E1+ߥXHtm[*YsM;5҅^ǹ] =d@()plQYsZc] ]8ȴEŞ =ujr 9 ꆫߐ$å@A׊} {'FSU8gC`!p6JuqNku=/l weZ:! O:t[YXD΀H:lwj7e$(viKTP* r&* 2*~>+jXmKu[i۶l6-w W899oǸKOm3w?-Hbѓ0uRfm_P/]'bְv,'|L#L6v GmZݰrp̱.G%l鶖}!&aX˕zpl8fO#,mkn` u:S'Wy};_~'~i} u(5Tar_9-@> 53iy4DD4[=Rz {GQ+#)8-6tn$Q2Udl4֣p^0aF>"QqHBZ`JF A^%ežHKd KZZ8ȶ_H6 _UOpag RJX?{DĶ}Xo('hEK7?~*؁s -(A]y&4 PfGZEP]r76ȕR;{jx5;G( ɘ,oBVw56sXA<,2mSDIa!Qw/3 [UXı@Sþȝt9 =Y>XqA[I`3]Ts|UaEpTQ 7~$Lq{F<1G{µEDK >EX_bEpuy"A>˛qU3PFKɒь7Ƚ.=‘jUcXbX$r~^)GI;8U/ 3 $&I]wز:҂(ȵsp%75'FjyB7[U8'Tr>{R'; $ѬEELWDԑ MKn\ބ˖`+H=4@~k&FXKVhvݼ[E浞5;lI&GD6r7:I]ܭW²ƭO| [O(P\W3>U)ݴ"mAmC2V:VQo(u!$@s~suAo _ecr9‡U| X5pװs*Cc$&GoP)Q=sL`RaC/}Ο)b: h.Zjڶ}s9i zX`d=j2NhQ=v6ت# 5}*iY=>u=FVAơcYϳļe{{3 5!pmȆe}IKc i\+ez>pR%+ǯ5p[OcM8L~&Gj ym L=uU*=RjB:© SӤa\?qk haIJqhdɊn &Jb $+ئu g 7`&MW y&>_n nVt'k)`{Zj 8 Duu~eB#elJYik5l$B$ uópRwq N܃Mjә$)5( _bXRΎt'Uqn!KRԴ8dzwk}Zt0$GFN&5W-QTq\YQ&/}E4ji$D畒&A,+ {$QHo=^3F}*qζp( <u5Jk\hH)w" r0:uki5 3'M6A,E\7kz_n~Rg%kȱYϭ52vycS:3?((Ͻ%|wl{p휲lFpqO^8+ך1%E't vz0g-jڄP:dt΂:a/>ZC&A@ǻ(#NLP[MLܫg~Xicx]yq ߎ?s Jôw|~mC o}[G~G <O߿~3y}7@'\񖷼fߎ?899{ww.moo}οv __cK盰Æ)wlP5ye |DӷH#a=KKDzkJj֌Tv zNxj>$)6T^`ЅmZs]*U*|mԏ ӷsvo[_|l&Xb4ӖF3v ؑ)tTR= K,9E2k=OzM]vgvԝ*l@)T Kfհek4rn,1VODSyHbsC&׉e:. #hU|a86f^< jrIXF7sMwG jAٺO A n!^CnS*pd%YYu@8N+v;q.x a3u`= Ji;(]#F26jGVfuBm M"ڛ`;Kf>(%|i{ٻk"-}AJI枤e`kY,0gF*A588ޗ'yF yCC}Pzg^42!uKvx9utfG $)ZZCúL%># fYz7dجL/b6RUz| u_ZvQu`Y9esO=.PPɱĵnL]]M4AGwՈ9n2*ajI#4bA5.*P*R\vEfscKё"5^t$Xx#f~?+bjXLJF#g9Ag5(EaR@e3R;U8.6:K`.%JgG$Ud"״ߗa˼yJ)% 8wCE:U468@50m>|Vi= *Eق4]Jt.8N;bH`dIl$UrʽE% 꼢y9csf(M('qDfhfvϱgNm$pd rQ6f2!2ɕXIQyzEC,B`4]:Hcx-p/fz)\<.rqA5r@(zeǂ9PkFy3A5@Şs2pxI+lm$P'j/f K 5-.=Ё1 z8Hг&[IFlc54>[.y;N {:T~A&}vXhIDrTRx"8b 8φKW; V}fs9W{E/HP:20r9lyQ+}­'CJ ٓuqTّ\<&ycG8:~uE<}Z w$+x,^4qV>a$XQcj‘P:<GIjw>e\rCu 9- ;af[0wя~|7?-_+~'?y;9^cw}׍۟CpWp~ϻۚ};Bo||k²~X]O??z; ^}Wٷ]5~? xi6Wgd% EdGqMpSgijGI{EKT&7UPe,roeCh2Z8_g4랟  ݏ M17l֊}*g$Z)UREN4J;8tL=u1U6:->T|ѨjTc]6$j#,o 2[xL4@RZz6&g-ˊ_gw,D3 vo5Ei8rzT;ѩȣGA;ݪϬ ,hT:i>pQ h]U79 ;i$>%; dʱxHnDzu2y꽑>-88ڄ5w9 a{?~`Dý GYJd`u"TX G(=z~|X^ k=&_g?BS-iߣ`.0iErPTKD٫.cȟ&|ݴF>ͳhgݭ8Un E:,d] 2iۚP@i٬rRPNCbgk<ߧk*BD}K~9I8<02DRWPg@?NƷgwt` 2/hg릺-M"Ae\S7yEfޣr goA24QMcYvv8 _tx;V~6w]Eif/6$hcZtL|}J"&f<EorΌ~XKYRa;RwUEs6I9dsuWJ@nDdrYu$O,i$ݯ$\! 1~WPE}z8Zv)}YIXg$m7V~8/6d@P RQ9&%H_P0\=w3(fhs%r藎>8G<=&څڿ|\Oo+9X*oox>|O!J)[P__oo}}7E~4ɟ9{;Rggu{ _xM я~??׿U:֬^pU_:*- blYΣq#FQl vԸh"u{6g`0N;:hԂy~rB(ҷ`Olk&Mlzˇs{.A P@ ͔_7_nsɝ_gGG+_`N\QEͧ DN9/##I >@c9:.l>rR & 0] `uDTtNÊA72 uj4pF)5^fv8+08I$1P-a_r`֎ V]#¾q֣@;X:v2>D9 |\C97ˆu J>U}iwmJ8cnSЃM&80+ܨ_ K Ddg>|=rcTX7JJ!6L.{v"y恝 \ȚdJVL׵={|w蜛hj:?DvIK2,eAPv׹p( آj=8ͣ%WN8܏P;& ހT n\`!>0; a|u;G7x ~UaV:;C=Dݦ*3g!>ĈZ(1h_Hxۂ]$V^GMsUF<0 ֚OPOIMSJI[LVaIN3בJyj>ETeFmGL#i>Dv#6廗P6ɘ:z`#[Xj-`@ Fp].%[`뛎靲1X/ٻQNciʹD6] {s(s'GP_ֳnv*5xJ#Td5I z#^13e#2Wܢyv \'G=+[2Eƒ5]$;)l &a-"S$30^-'JS{L;sEp!wsƺn)r L{̋g>eݴ'~P=X`Zg3ݜ(:;w|g,rS~C<;wOu-49I Jv8Z"q! x\0؍dM+ X涸IjCb!i r #"lc6 +[ū{ܫ읤f"7MQQF̃rR(=g1A sAw|w}y//oof>VO??z9^я~4>Qkا?kwn{7NdR}dɋ~/|?^;v&ZИX:Xeaэv+=@Yf!4/RE5^Hd;ii9oQ^*2v*]Qk!~?ox8{ K^]XuTߗ{ '̱ҥ۶&W 7&kp管C9jǙaJECfܵ:eZTwN[J qtsf+o=AFYψ,Q8E//'؛*8h4c aTF%ɱW^2YTrǕc%s C: RX3^Jm]%Rȡ+ ̗B}bkĮRFǚc FJ?a>ၙH"Ƽfs<ᏂvްaFlj| qs |tXISS<ĐA'& xR)c=tOvIxboo'I@(M`J< ʧ "r~_'ʜhE v{]"bʭ#PA>Ϥ.}!I9L>$aV5RsO)gtkgcO_M  v.g|D&:5*\p jy!^u-F}P 0<`x ɕ&kkۃ堬=hg=@g%9oi*JgUd3΁}+ʊͰVT ;R" QT8Y[Stʼc\%53)Bq:RN vafQ8p*di9cp`_cԣrGT,TvC_f}PCc=4uDsbhBc!; &b6^9Rbxk^r#%jiw\V[y#kl%ɺnF{%|i rاm#ڥiZ%  ZOӍ}7[ HrÂN})˕9W&9)`O?f S L*^DH]@ :kY'Pׯ9o!3yɜmdC.δ$qϭ+XCsWVXO6۷˪"m(ꄡ rB)}<1c@1Y'XuQ{x}tŌ6н[b<ÔyZ}ֵs9(s$ z^E1:kCx{8YP㙜nbicT=4C^bces*г ڻ<0`v٧iow/H۠k2@?D['sryM~$eQNݨy>v9Fs&2]X9kdHUqr5"eSd>r69Ԥ %v (IiڨWn%_'xz9K"on.~n5=E*JwZ(DﻂhF4FK'= v)ȼR0b9R=.h(4& lm`4AiZ; -yu6hNh(2f e&Ux ~p2Bo [j%<4a07e?Ҋu(Gr0Bc8 . -{%MyW촣i؃'mttN7ڃQ%V0`/VaeWF3'62kS"k]SwPΔ/?-mcUѨ)x`y sS3z+W.. ^ fá8k8mi m鰰 Av>7UۗΰAnFqOM@]iKcj[EWU/#1OE=*(ٗdAwݨJ[BK- v9Ǝ5Yzho V)n}LPm٨߆igq&uS0:O@|qm!vwƽ\x"xP㏤ N` [?s T]Ŧ( &Z%A`CS{ܒt&`WLbۘlm#8o[gjo:hkrKkˊhO۹n5WI SU9l]%iȚ=Ч*|t=Wݧ#Ck&9I<:'r*tq- y wͥ 3X I0M.\~"8)zۘa =r55ƛQ3KwH}pxPfUl{!@fJn;QL@!N]Q-?We\Pk'V91Z@hk[=9Ѥ.5W 8>T߃^-oZ6mtW)F| KUҧjr$TKe}+z\ lNG?=)d(d Yտz^O?ѽRG<̰ZPm|,@"Qc7ʾzmfì(w*XC^N߉Mr#<Zyp2[*tg?oۋ꬞|foUeqԘ,7YE@@qKzّF0%ybR5nvMPז#[M~ T;* bʨ2rRs}eB;Gy5ls9q35itS.Q>rKQ*Yrn m9HoB66T.=>ƉTi*z]?d-nxyM#S!Z`+ǗNܤt)fuO,U\5* )&6 `'N܂=;7XHc^;*Q$ _TPݲѤ%`Pl< [5t@{gRRGZZ@2=mJ'6l K+kҊ=M֤xr_6-RH)ؤ@CLVZSDj,LeZOv`ct<uӺLq 07Xg"+ty)ZC}u55JBJefuɑbƂٍe=TSqJY@<־ TiwU௖8V3ow;2jYvS'n웁] N ,c2&%@iBv* MՎHFeT1ZځJ/#5Op$Aw (ۉl)e`A9MYF>[f\Mze S<) o\]-5xtB ̈Y?ư}"ƭž}5D"^LD|EU-Lnn~:fP*PЀUh;gᯟxFR"P0m=R$!tj}4[a^8q%g_0;i=_gɵ Fin/'8U܋]ti~бm٫7*uAcfgEYJ')k3cser.U[,M:փ>qF=}&@5eڟ8yO<(" vNٟ$a$׼9:]m=&_@h9{oS`hvyr+ƋoՉ׹>9oyω1 Xm83.B!!iKCǼa0ݫ~i q|m3:E-ݾn9bKC&;?݃JA m eNsưO)!/dl6@]Oiጝe@lqұ>mt~hMju>[)G\=}Λ}7=z(noo7z;V?/Ho=uNs8@{̔wwܷߖܟ{w|wӧO?yϦ}dn0:k3'̩Oe".Pg?Epi KKv r8|k&\r쁳m3ʘ|D . аHqq ve"-M[ger$*/deF"F~ޤșAvf|.7rP쌝T.iNc͏ō58=,?:",GAuN;u-W[!;DzrZFiC>}fD}CWnP.QD 7MDu|"$NϤ1Yw"#,s "v{bUqO5~")M~iB)Q IDAT)3fz ˎ2 Ckq PC?+c|ao|h6`}wX$ ~U$8aRr \2L!CGc"/t3X&"!Ʌ֪q3&T])ʰO\^쪼Fu-+qʮ#׾;o!c;OG]uperͺ.ڏ6C{UsȿXOO `|{GֲS^Jx=s_xo|~+o灥I ?~|.C@:R]`i 8x&1Zgpfb)~,Ԗg'¥Sf pWYUp=K 5e9@`}6* j~^f7\v+)kTᯐǞMl>bKu5{cmArh݊Yekun^cta͝qz?UE9}ڼ.V8hl;i kُU[M;ߩUfBzqA$`d. /(-U 'J+.C*2wgMe p@5{mei/9P ;M" اCe'8[kmozLl>74&9aV"mHI #v%UdGŽ=0_zhS]ʍW[YeW3Y63 4kL(~ >pMoB-̉ ?bR h|{V/mA`sƮUQ{!-@LF:l$%6[Np ՜G,G6.T`C /??HaN)ʰӟJVZm 7Z-'Am'N*=drJ6lr{uZQFA:z,OCYfqP9o\!=V.Ir"`o}^gNN<+nE"T9Oتj.zћ:qc>$Sfo“p{]rn_k:LluuYk$ vۂϡ> {UG4h c l(֛st H{Npcx67#փ?8}x{&ߎdw,r*- %YvJhke"A1{j5Y wwC(yT e=lTHǦQiv|oqsa{@W NYf\d%nZyt" Q h3 | nMDī\[MׄQVp|ۛ[޲lUHYLÇU -~~M7>^`Gw8u;@ 'Ѡw}moo}k/rӲ~Om3{&P|;e^->B9~2LXfqr <6gg; ~ej+r]YӚ\-ŲzlcXDcڛNƒP]vvé]+w۾7/?K/X6hW!+y*RncR}N}(c;U? ez  ]l\wR&0ZT l dY6*_ $sY8M2CzaR^&}NWk,0b+?<ب/Ef]˺6<}&nZ$8VE`Eakn9vF wqS4DZJۘ(]QE )T ܏Dko ,ei"c&BP=]_8wwI Z{s"ЖMyR1pjp0.d=bhDnmݣH3ZZq4`4qW+^㶘.eK+‹S\])#E Ҿu4+k*qЦ95rтl N y^ԾcA."wMR :*i2o8Xxhh'K۠>pd1cFsì 8lTR! |;s?X _@{2x*gq{檃s;lA_w'(r8x8/Bs8ǣPZh]涽{y,uo=93r!!#T m+|Ħ&:W?LyG8Q~oaRc&RRaBrDrx}TvI\|մWNYɴgc9 ." |ZHho"K{t-,r`uLG>{}|}ݛf )%0?z{l|I??R>eZJ)|w=kk/Erm8>bw~w|^} N:I 버o.rs\t(˂ߺT'0v|XI]w|+{il?'$-~[$^z'nw~X`VO gӖ1i֔/:\N"H8YjMu] J5w*z@Ujf^ ʮPJe܍tˠ- [lexӮD+Y),!S>~>禛Ï-_<.E栤86N J`L]WWqP MקC9Wd;Ȍ{lѦz5d{fO!en*KN*z_"A Kkr[) :k^'p㩚K[XHdcYÓ]e\JͨbdpS7c~Oڣ8rpf4Ǧ§9 /ꋙ\Qk|pn -X^P j^&bk;˥nl,Nk\$@=6lQN˘I`Yklb(#qJB c'Di"t_o}&x?}6MB^HMnl3֙)#ٓ˼+*4(nI0⚼',ߙsJ{[Zy՚KhGAݷIEl^M UI>; X[SJ. "I"YOn Gc|S9\ } E;i{qw8\C*C=K`ݵpLQ,"SiqH${}ځ}$>Rχݿ#׾擅g8DzU%lG&⥺AGD܉ ?׹$Qb\d{@=Ѯۃσo6e>;_U_?b}Ӿk־K$?o1x+?3?s!>7}7QN= ²~ZջIT_k{{ko}[_oq__}/RdWێsea և"9ꏲ`k<-2U3#jHѤr]>-j_~O}ooo>מR fgyGяY!;ьG#KqlBJ%kmgOg q3eqęSN*uS'%UZ7O`_dMn*W6^Cv'ϑ _zKz2 6n\&ߑYəKt|㪺틼GR*w4@:N͉ «@Se^ejq ,wAYfJJ߲W!@8!sg(1Z:S9{FtF󼦊tgiv4 F#X%cSTİe8&ظpӅ:/? Lt4'i ?yo3N"gYRNA{P?_eɹ G ̲t }PuZj'^?WxDJ}yHlTQȽkȹce,Rjn wRg[a~#o@Ԕo=]sS$[ZLX4ET`Zk;ΎRP:;5Tʞ~D(`u7QԃpN}/28e!ǔ*s<TE^.H`V汵$V">ݶhTͦ2# 41$iz`x4UŸ}߯MOVJg~=AY0֭vQ(`A~; x[E&i[Ѽc'~j{>e3#N ;HC_d"1)0夻[׌=ݙgroi~xk3k8 'UiԞ׿w=%qw_swÅO8@v?F0~1bVl"g;N?t aL^ݳOX΋Ö$RMu >zr_c]óW.czv0絩&R07 ofw꛽MXkf}ᄑnG>7Xʯ+g?|O|HxXgo}[?|ǚ_ou<_9~__//?Oۯ/ǿηV NL-FTMֲx?烶eϜ|m]FK;iudUQdY+o{0y?v_xj}cFe$5#E\qӵlOβWyWRp8ȹ>LqOaa 1hkHlb /;,oRA~L7j2loOlHLf1@;Hgp፤fSP,R nv%p];K`u{Ee1#q:.VNs޵k_  vds:_: p9,Zs]Q`%`x4J@`b<+6Kh˞,UC쵧y X&eε=Swb) !Ic( :̕1] xйU V+ґ@Q1<ciN{NLj|6A۔mU}7±ˬy>>=95ؤ ڶǽ3o@y# AA+Ī&׊x-Ȯ9ڻ[[$KɖK1bbTByCrRT.~  TB"R$w>mm|us0Z{F-%nսZs9X?2Ț5czʚ5jI XLce`0n+"#6RijBeEqb*F wccf$֏zGSWOFA^45cܮ>I'`WjvqWȌ4&&2-P0b\`k.<sv7N:t}]z +gK!x7M5fb%'u?╄;, Ю+T5? ҀC9:H;cq ՠ59$qQ NBlJٯTj2,њOzJl%"-"SAG#JTPfJC܂*=n4JSpƐ>t"ǔLfcH7M$̡1w=p3NJ&_  ۚ:<5M~Cc39.ǣoΈ\M5MPӪ&m}uCiݱ-4Kp ]y@<,Ʀx {Y|~gg~ꪫ'\ƺsG+}77_@,=UUQE#_03s6s2j̥ @XVuƏṗ_@1SY$@rޛy䳏^=Dwvޛɿw͡C\-PzoKs["J[2:^KwQfxEy)( IDAT#d?q1F?y$XDgǓvfQtV81,KcdvWA88 },< 8`AqL9xWexN7R?hHd$_EGȡ z!!Ё2R.:2!p@C5/L]0>l եMa)UVF%zazt?G:eeJp8+8pdEbU#bB ro]a1b{Z7h A Xⷓk)gd8т^η \jYs^3ղofhfXCqXOD iN}l}N;jsTh񱪐ADS@BED-DC'+(Ǩk0*" (cTG <nTtBX3'cTHQGa_0%3 +` RY~lM*$1]X@ʝ giT!CA^t MxJ=aVc_>8N>@1ܑ'uëψ6D.qn ʷ8F)fmVhLtlNQ%&W~^qyWmp z,EfOXm2%ȋG#I:\`R@4Lτ‹Ga=EGڐ EIGmkѾ9x\aWX$DJeA $ c\ -Յښe'qo~VrA@[(s A C iVNɚ7k Y鈇Ê+x;-ΗsP~Q]"F':%Ud-Gi3b@OϤzìHOy%d5 (vUqj9>ŠipOuWI(} Ɛ"0?_3id'ȇ?a:=VkKuR{A|aO=~_`|ODx޽{Y|́kݹ#t>MGl;]jܪem۶a7˝u6i|3!@Qk.@ 3nX4GplwNB5`DMWdG^?f4&|m/pP1ww1 }k_ԗmSǯSutkQhHbW1.wHeOzRq$KHv4TF}:lZP2ךn;\ *C($Aw;$:$ֆ V#=Eo h0OFkXhewgp a8n\>i˛/)Yi?2 ltUdPiﳷWk,c;p ρ<-= !cq#D4p\DA rpX3!-VY@BxFY/GFdj|$zz\VdGN0!G=QKo)9I \(osx Y/9OJ/ T2,)Ygkj '.+zu:[ ~9t\V7:gX'O|__&ua/,'M:'xB^׀pm`~r.|K_o:;< (~֭Q! !Nd]ؚ D=.9:`^?(js M UBdZŬ Rns[!Z}dD@JFFPUՈjDd%l\Ta=|WkQSà!w0h7pތŦ+. 8@o]bfy H)^NMt[ԙ4~5/;*i pբN)S#8qPE1BI@)!X1FrHs'A* _愊˾8R.Dd,*z(^=HHaiϩ8|/l>0*@ )pS )z.pf/x>&u.< ܂UH:v{:9$W *ϲ @%E5A`OY^MtFУTZKT=.Vl>E3;pr>դuc{w r^'йرc|K_xX׉=CTUh4{?Qx}sp;$~V^B _U]Ec˺%^!'AN:<Ӓ5`1[' Fas1̋ZS]2yoҌ5D󸚂bz ?(99L=LuUIJQp 'QRm' `!d蚡B%傓42&w8HB.3e. Z:A][_@nA.`#&:s YEi@DFtb : x/:V 544P%w»4w !E1Fbɯ d"FQBBØSM|X?OIn#H "I\ Pehz 5dzX+h*Y?_;GX@v&;yB}֔eYu`_seYRl]ô^{^~guJ?'b9>ǒ.0>w6;OTswjΉK̗w>d1dKc692Nuu~/$xޔELx gK]H-o'n:,8ĉ1AGpb0A~1d$ @蛠<~'XuD U[6:V&Ԁ)V bűaB%HN>RM fsymYh~3HiRu5b>T(}Mc쁩Qd埭eUJ> IT cPEd,Ӣ=HMRl-{ڊg(5J5kN^/f" &gs$QAWb^xqYggn¶`WW{GxTUuA{Pf!y|!tC&ug??![n UU&~//㜣*Bz皔B`u 7/|C;:U؎;~ؾ}{b萿D)P.ӽƺ#md{M!\47ehloE[ɇ5^#511T=:9R9Xt+ } D<Ѕu ޶>\:I m:= 8Ou0;<"c,'y uzj|yQ[@TUcz4gQ"D XhIJ:.XHµPd74 no-)6iswRB^Ns" wqui󅲴)Y??ӯ}kyH[Fgͻbբ\{UtM޶m=X;nM>OvLX)o?7Z|`,[ xi-)TZ>9GKH%Õ]mDגUsօl:X_Nv@~{( .:yKoɳ#}Gr~6Z!Sl}o鼤eZO|ϥRp|wJsW~p M%:&GxSB.]3)nFVܔե%F̞/KGv %Pa+ Ɏ{=|?E{9sBZ% q85Z4c@OԎW?π0Zq3}p>Wx-ɞ'RՈjlzrj}a( \hWfi`s@(2Mku*xy%*nuN%a5ܥ#Dvv8zut#x56fkbs G+T#EմL^[6B҈{{@gA,ZJ<._ 2oh9EH\ҰXQNHږn֘+l Z;^Mxm^\Pc23!K]Yu;.Yf"ꨑX/VRt>>iNTztw-S6.ھ.m['A¸I/"GMQZ;p Ex CwN#fp SoK1yu~'OC+דSguRJEAJԧAps^k+O<9Yеq&] S)U`7靭[{{;.:_ڱ{g>nrB8s::B8><)˒Ҋ:5xv)ػny衇&K8yZHvul9!^=>b$;8|tT;E\>wC%`İ^+D1TE^ACCs4QwDFx6@'J"Q^j+1`ЈDRAF)El^3o; eQ |!d@4h[1G"H"zǨ4H@%(F.t#:CiAU@l7 vkz{ xpK+(h (f 0)QR"55*ISGNKT(I%eќ7m>w'k ؖ}1;IDbq%|.u$R9EK2w ;!#M3ed`k1EbaI/[A+AP(|HbdGL H -[W}`(zġ>3(TR[{5Z|=iB(!m [>å c.̫@H]l$ܒ$rPѺ ,εYyJDKh#E(j  -&dڕܮL&%w}A/8?7PWA.u |,pZ`%)#֙B(炪Lx 3H6ي˱&F[yuPؽ{w})ݻe޽8!ཿ :ۀWΒ};8p=,W;哟d;[vmݻ7έod>>S }Fϫ| ita7~7x:;E?.o+8q: 9~OOL̸+PfxV>%#A2}fj-YEgKk F`ݩQeK: ǭalcA+,'Juu6 =+E0- i 6 u6pBFE'Q~Z(qS"UҔJ8;69_Jh4𩡺iQ1dqQ iKePXt7Gu޺s WCtl- T]Xeم1GEI3Pk9W&WR[3ӵK0@} w[5B,k 4A/yv֥$2i @cq*G9eOdǴ'<5=\ *^;bxd"q| IDAT4,C =i2S( p2X;Zef oL8pqJ ͥQ%QG8.>WfC]D-VZGs M:i۟fܒqbS&f }s"ݕ.٠В$ܡ\bMֹD" ~*xCE&Bz3RHF]Ud 4hp%c^&ɼw-TfҾiJKBMMP66 vp͊kC k@bIΡahɜZ~P|Zsm|VkycrOtnmb'A}3R+d#V|HP2{7A#W&b,sC@sf'+$,4J:[pt4/b*5V:Nя6mgGȔ@o=~:[#?=Z#g)%wM3NGu\7ӫVv*&q`n|  4F<9k $*>>nQnFz<6 ]XBz C <~PJ DE2Q)Psvﶕ6P*B8~xׂlhJ:D"R}`gTM +%ri oc`f^=RSGp #0&Mۤ54 a8!Zݐ186.92)ePOuگ*flcd`ejrIPVWJ&g '.܀ .[2YFsnW6y1_u0 \ zI&*ahE[4;I"T hG%CAz @ ʧpk~\h^*5VhyH @ 6FNH[S."Z^dL( u=Bq-ˀ d"@̵%6>3xbTVC^Qj"H^grb1)*PFpEك*N%Rc>"!!j\'*cp[.+lVJ&HtW4@ Ehjqy|Eo*3(A[Nf}%&I8 "Hu݀Bku^mIhBRT6xҵ=O7p A]~Ί9ûf< ӯGqAXHVB:@/sQXPI$ rwx.j`^ՏK#ۀ= 6*֍Kc/ ߁;"\e%# S$FLiFes;y^! L׉eSZ7tzhjo}+{:[{;9qu!v`:y`UUEh4|ֽw}G|}ZjMG}Ty 3Rh}o2V[ʼn`ERs9:~~׻'/b_+uBXdtu^]vm2f FYԔ:>|tuzR=O@IK5ӳ&7BC~:?4>f2|(.ݱ+l J9Dr3..{ K=Ԥ_: %o%N7@ę / ܥ 96+z"9FmV˄wI=U v^:#kQ7ZG? R㿱R7F2JH[K@ aøkՠ$i-_ z[WQf4K8sc(\ք_:\R#\trO_fjpf<-}mKB;ʧ"kB47ؤLu>:FpmwwW ,M%n-@^1t`]!.|!–@B=D XK*pOQLoߋ$(L][˺X@V1|m7iAS:Nt.@ҟ>%zGpC'! e"*a!i*w-Qjgtlni r7,zǣ~ ֨IClnVo= e# V)^\"E[ 8v{QPUˡI '44"ട,Ymֺ?C :g4#_T!*Fp#nJ(Z}C~SڧSv@ Mेl+asIW(4AZG=.Ew?+PS<ύӡ¬;qQ{x Κ)查:$M;\A 5^H7x-m@ǁC5 a-Q,) q*7+\7yx)G6~B <ӜÒS-/'iG5L0'r[7zZətsi,. B|1ps.1S^GZGՊ-ᬢ}8cyg 180*o,x{FY kKvvNtv^[['֪;;P5m(r~[ߚؓj95Ui@ԎRM]jKx`;ؖ `Y0fhe AeaqYAf;PܹG$ fn'Iȯ&jeUik.6E7UF1"SR;\ rA?%vA5 RuAqE8ZP`=wHl)JERݣnHYGz> J{-Ap|U5.5 ~rAf!&$- ?oOuz޺͔ œ#rLq15++T,erAz2\EkJF4@KuaDfQ1PU+tSGE-Gv[m&#uUy[doy`aHMZb'p#\aN}b  >\˄#\7;O( Le蒁=y(qY!^ 4Z`<` G WBXbS=!9(biPS#ؑ+`As >p^EoOtEJz"}%2erV`p> 3!BZ0_w$o$t'k#rKa]GSXj_,lf8'8aZ:ysb?[Hӿ`xGy#&+ޠA:>yEIGѥSŒ%ඏH≒j1خ0WP\53Зi* i*#F(v;b?-E^6ey0Y>._q)LUpY2M Y1/2/J+qzݙ+HLքv.Ka%J^ /kSZA)<$x=ȭb۷ŤlF+)w3_Qoh[8PuMlE ,o/(ƴv'd70cP$ GaqUP1CG%dnGMKF6"\&*:.z G(1)iC(Vk!>We|H< *Qtɷe9o G>< Pgkjw[t\HkLU Π=SgϞedպ}x[ځ53~Ykz~F_W-oyKNπ;jyv<6",Ht HG*(N`J,׿Q+4iꛢ0uU9xCx`4붖7HMN1SP; S%p׀3ڗRJhOh:7*R{P^>"~ћ.I^8 Ɓh`Y]Czv:tbekFYݵyRQ`Z(7)#|F$fJ(/+b#Jr=[! *(vTW)|j"yΆS⦈b10uQ`cC&j4@_qDnI:` M=\oD њ`DQ8*uMY85@d*sk“%[mŽらdOD#[zA~OAq}P g~Cb@8zLט܊P"3 5GpP}F Cp,!ԅ鲈{-rۻDjU H(vxL"> k@CTxFE4E쏬*+rM@@\?G?â~Tԓp8Zj, /K=RiSQ_YGH]0m74n \*ޕy*||}&N|;;}h"_|5 Kq%% 2RK@% %mv H/B$>tb-ₒ@E1@M۫HR=}#wvzp pMZ [4 Dn^@fT)*t1J:D$1:H3xmby~K֌IvAsATxrlaย/)K#h+x_ۆ +9% У!Ԋ N\j. 6G>[H%C0Y31GX[4pDHx&;T B8i_Ү> m-HSbi ?2U 4lMU| cxc# m]\Gh"hIc0|>2+#q^0/gal $6H& y<)@U<;@i&X’ J~ I6c|ul倮+ g=0lPC[H]؜! w3a"6Fᠩ)4UDS 6R%](,X.cW IDAT:Fjhcj"a|׻6A1uO% ^&AIXft"B >Hh6XčD'6ENB] GZ1-)=5'8`{<}gx 0FYQV qY'V<?u}c~sTK}K__?u8J)ܻw!_iq(_ţFo|a 菎.*$i.vb$-AAZ}s)02G x+zW|.۱ t_@{C8d츰WD Or񕗎:R}+_??GUzFqlm3#LGh1 k>+J{;+n|wU #ZӈP| 0 H$(U @F0GOwϡum WБ)Vd?S X aL| TW^)7RJhim܇0<ē쁶-.dB!cb; kxFE`;2mthl!@9|uj9hws"9s-Wh6z-! W4# a a> #<}Rx#F\HӇ-!GoMA3S\oplGl" *~%ʾ7#hPCY.s&mHH[(kR b@'ZAEicfjʣϺG~KB456>CaHSy۠=!h<G>:__=cOOG7ڶ;+Gsvҥ$?4Tٟ.Q}׿NJ^ľzǏ]?=O/1PaQ4rh4WdX߬xUtd*!vu! P. J֧Uj8^{RK6Ypx_(O2\eDE=SZ_x7њᨎ\ۿkCTL?tnnňge1FU a^;(}(#rN@T OcֹU@C|1x;WbPzA뵄i!f#oLc.> {0:QId˚FBg\ܽ=%$0 19}6X"\Ni=W" p[QݷcKfql"ncpߐ]wr$Ą-55$3&!3{H8.^"ֺ0 :+؄>fF\4(awM]3U`4f\ؒ- 9R5M`,Fob{7؎"&=9#+zu 86 .6@q*&=CHݧͲ7>ȚQf ^^2tABox>n9&b%矡n9yb3y 8g,S&p8؞:&])oBPH v/ó7 .8(XVrlp UD e/spk^xBۙ$È\Lk(9]Y\&% W5нpq*`( 9Ѕ\4N<3isBCSû=k*A@g LŠ.ƀ3?/ިs`}XcGnx.&fFP)ڙpc?a'ʽov +t"cI Vu RMs%u/EU ctoЕ@K#l-74)oΰM@=i!F8?WYWACGSd"LFy~] +?/+M߫ >J^o;<\NEx!?S>p%w2N::"rQI1{>ݕUw~'lxCö~6nwfpm}H1,y73#>]{B%v/@9攰PAa1]GRM`ʜK'Ftk7^ 3aʯ3+eY 4nega&Q,p?r@:9`at%` E lN7=qp"+PmC ͮZO+o&0TZl x"Req* _lh74)(adlz, ='Ѽfy”?(%2nع.,Wt(_)b#49݄B~^a)8#>k vאn(6 <JhT.F8bs0\lKI}^pY)FI!ӂ6ʳ]J{ <+pbڦx\pfq8)s7SHW>[V!ѿ1gg)kYJgyӐNy=u"XOZB m-2'0R}._sz3,$+*`䪡':oXG4STu/MɼHlc7f=_&#.**h^r '| iP栽HMZrx sV. )%dQIi:,;DDf*f,B\`/C<]g  N'dEM s~vyC}o@K?("n@ZdAGR.kF~߿Mfxć41Pnl[{8R_/FdtѱJXХ9(`6A3 ḡl/s4.6DMl;2؝˂{>o-5`GlD΀^}h0c d"tѐ `olRt =0ʴTG1ゎ;ABvAݑ^3w|f!ƼOcs+-Wten;**l1qa'0gE)E=8U04BӭǍ2?/ l|F5`t } ^¶ a;`MlPA3.8rEUyC O*t Ҟ8"8.,1̈xLG7c65ox&~O6@QN>?xF8u@g_CxEl(;ʍʅ㐞$r+I#HB3 DSp$(6o!i)iA@Pl+-aJ1 f9j"O5؂,%w=y:1J8#Ȩ mo|!yb-FhPu-SLFm.RDž@&wJ*!w. A{qHrp3Ug🽨L.T( PeJ(L΀0cSp\\& TikN&#SRKh2|9`(; \y =eٍ!Hgk ,k ̰lj)Zd^9v: oO[v[۟xB8Mز;#o-pDcFN{~OVD)RMs`KyCYC_ OV loQn`5@ V[F O\ 1.mtqzZ c~Fې(tad%𡰾y;8xD O\l/S t$E 7B#IӊNB v0%LE0cBIQi#6 26ǣH?32,$l]sG qt.)p -w(]GaI}?Hg"qBDwW BYNأ WО8u[ws=R:CG&˼2DQ< _ם O"n7:;W^V8k9/:l,j IDAT}{MTIHJ ހ(b>Vp~OT#LGo1lSС5lBELF8p1 e; R q*2 UH"[BۣQ[e OpYnzF7[YW#q1 PC< .BMKs[akȓ4ABB Υ6Zd:NL]/ {jK4r-7B3J-i naM^Cn͟WkP DEGB2Ve7:pџ)Za\05PgG.Ѻ`J\2 ys }kZx!ɰQ Dho)u3Hi7&֌f{< ( - dN kxnK hTzoC](|* Ϡ7۶~^֭[h;>7a?3?1z(RA> sW~W_ Tg>ß>8"sO__]􏡶|Q-pX D} m+&"Lc*H'qޅf쳠e-6`(P/Vၺ `n}9DžpPQ 1q,6yʫi$7 {8WOo.Q?ao_CbRau'5Im -#"hp"opG ZCQ$4=$eBSVI]pӀ6\!(Lh2LC!4G{Bf#Y ErB>p N/]𨏽7U Sg/F†P˾\XSaX$ԍ00J$ɌQ.6Z<ӕ^Fx˜P]ws#A<ܶ^<|`1/$(&9EN[Gli-PX*.tFN4,VX\ 2SzΥ3}粞Q%QK6 E|8n; ]mN"또n(e0HH9`\!>R3h]N s9PSf E9*%L `OlB܆2,(eE.3  ='afV"lx;; vLddA̦X(PȏGBc--.e.!mA\i%7 Ɲ[Qg tAٛ3p;,w QpQՖ&A٢fܵ[b4Rq|,bu ¹{G!DB]sw3V`&FJ߰}u~F8zZ!*|R6[l JKT P^0ʫ95,Z5 R !5]MjAr(}xzV]` y7r_Q@ˎG!X9EŚ sQwqgw .Cxr D򨠥 ہ812УCOt1ϯjK8I'΁kaF "XOaڱD@2V`B\6`Չ̂MsB\Hd5ǂ>ƭ{&Rwlav]<[0ڽbx+ki?Pyc֐ ;qFOX)o. 5!n$.B0"B A=(Hȱ]pBa 5ek Cc8gW{J gẄ́1"hn'->|A^Kk+Л4 b7y"].'V}f͉󠛞;_bg`׌~3q,`7a@g#vF=Ef;).ĥBI`7p i7l 0,b r[:=AԈ7l{#ǴBƝ7@[NsFk[J!$+ o7#v ' ַ T3B\UxGP8"C_SA"p>TcUr+84 o64}{z:xm\VD~!#6|wDu@u'28[G\wNjWt@~Iw p&\ma :. 6ْqC ,ewׯv C!$CoP=NN;.pmIAn SNң@z\a;D6Ȕ68#(ZB32#ׂNGx9ÂPx`j -A^8 N7WQ (J`Du9ʃke==6i{lA| L6l,:L87B TB^RbWr/#'!FuMs A:?QqW^ɓGN_2XŘñQQ}<} 2ӄ73RJ6Q}R''?$O 8NC"__]􏡮\|/bCRs0T%a> Fl 3m&4ލ|͎Ln4j=G$wۗoE^C;VG FUE6j8Pw3ioo8Q?mO/4iIđL; YiE.(1ns a׈4g%ٝm'`s =nUP}3u-?VFnM1`%Ѭd{Keu[߷9UUU]Տnv7MJ(Jc:k$dQ A`%7$ qd۰I ZJ`)փlWߏsUl*~\ k I^{_g!Vp.[TlҶ5P"ۂX)zC6-Nى; .{Pno v`[Ap 2l$l]<9ArC3҄L99Nsuhd^l٢n=#C6|?_Q t8`G!Dȡ]3]#z+M#bq`(zڕeE ;U a:2YRH?`CZ!\@'䬑g'! Z /X29+ =b̋cI"㈍ItbA F AYmJCxN8 8X>+X@dJ𝈍b2jW@eQn/9بћץYE&v#Y •t[GJa(HCv3᳅r)h}͖Cg*7vB1< `{Yg:/[ ;yװ .z`3  ,(%>/WA3vHeJ`/ysrθ ,$Ȃ!?h b%*T'*'o$,ݖ cg@}1`"F fa#EDM P/GE\a X-@I)'"s<$u' ^Q*ìCCHGWBм$<DBy7*Ȩu5 }`3n];R+恋>,;]X0RE.&'WQv5|(q Ju @oC[AZ)q1.6]Q.4PkaV~͂=A&nAEc7b~ aBVLELFo;R65F>4_ϗ{"HzqQ'z_Cx=G __? O'RosPrVc[[['\͋(o{~闸q AחěR_}k_;?(KzM~-9pu(SCqrP,p-E% ߁S?]pzPNN5" j#?h +dck} Ju ߅=t26N~Jww;;;FSuZWjʙ_\qs%z~'\6,!$gkԡ!=0W^Hp ~Pќ-ՕHrXL癛^1( 3CНۃpGM*%A ؾ`Q@(%!Fv(`-BH~UQB;F>(}1%,= V3x^'BXa6Oޅ)H5AYkO2\q lzK4]#) Ƅ Ǫ&\%+ ߃(ų߷AZ عH9+y)n_> 18Ѣ?ٌRD]tO#,ېσH[>olx܄=]V:f47VDeX9*c@oTK{yAȓgV(lVC!Lx gp`K):%4.ăHQTPr0)4+)FcUP\GFxp[0Ȅgi|"DUz8pv Y!"c_PGS`@ GmSF¤N9 7 54cPcP xMt+%;[BE34@YcRǔr{l# /ijOq}ŮKWjtWZ`%P?+ifF>v#N g᳑ό3)<0vZMckFcFF-c1AD cꔘ C \=uב{S|T`IHR{:AyӁpl8ᨍ )2SA)Th[R:h_1(y%+N P 6xweП7x 1 !|.BNf`;Pz!.P %3&%x\+9ȤжJ+G -l pH{ 5ЎC-q%u Lyf"|փ< ![03-p'PX죇84" δ0CIh@)&.W20梓f@ ܂f*ر?::~rR? EB</SUeߺud曟?RCmoɃ׿ \p &ktpzH~M:$<ot! . :nnw ~'Tm\sYq༒/ySDG2Ax!j0TF`7^?NIOI[[]$+ueFg t'\\*0RMp5bA]ŮRqU>qEsFgn8𐭂jĆ^e[P]X 3[a~_>U(#Dy(hc ("d^WՌDG&`lg ᵂBoURe }#cHd |dbQMNrG(cTIU-e)> y'{C!ͶT7W'P}+ YaaByYhnvvw ǭg\\QzlA8MZ'o+9ׯhʂRRjlAR' Tˑ/\KxPM6Vᚡg!LFNW(u1PT1yzy;CA栜PնMPk$[* [;FS\&*qd/Fres@[,aSG#Vne_*D3Ui*\E0 TJSO&LJ $a%,%_fbn7|6ZخہцP2?\QV&zc| *Y^,f&{ %i-a`+e%c°5*d:rYU!ZlDe vih?-H*3ԠH'ݭ`+S);]Ns aK=t"5Ҝmȸjp`&nҎz /a[ O3 Q+9a8Cׁ /Ї#HwXEۮ-_AL(v%(C5j. IDATů4?s`n@iA7>!Gg[mFTHq(/C80<1]èAm  L FFoov0vTT,ۏRBFr$v=߸S˸Q0)N~b 1f "TV x޼M 6(im aaa5t$8X܊Pi?iB3*fȒNDrmWh7[,x EZla ڥDج z9ËM8͓z`S^2ҵ!`#!X l Q Z/n Ϸ] @RW"Og⁐ !"s?.&EyNĚB &$ ыgu;-FXQxծIdHJ;xTWt#8KXB@!=ңC!@82$a? zr&z/G4Jd;PFb?BkR[k]r"(Bz2qf/ *r NUηK *;T{2h"bPb'BT%F"\BM=ID.5y?Q8[\ѿ?FVA :22-zڎ}Q碥|y }}i*jMHzC쪑@G{ѭ}@y1A) y"1C+%F`=F_9D ߷/H^gWcTPV !ldAvԔ,08a~ sCҭm_|;}xS6 V"}w ¡bA ֎|) TQ9%)eԝ D*m|~ e,gJ@TWMS}E[؝By)S~ΰ;Ӈ3!2\o+ . ꤥ^ DYj;NΔTQ#ۈՊ҈0vlŏzA(8]JT@}C_q# 1A<,CF Pmv`cE_/ݹ|]dJ[AɄIﵰ a1"B "7O.U/՟O9 PuTURbuuuܹss'G_\σf//~RC[h[Cl2FP{)F| ]U6$n])܁jJ6 ׺^KrS`ʠIgkL!NzSK E;g<剫r=J喥w/<9Iooʵkn#5 UnTu#zH?נ duhtmutreGxqz>ŵGatjV뭍6@eIIHmiA,b fӠ:Nni5}D4t+ K0W.Pv"|Js88j7܀1&e"U~[KBmXH7 w\`#!El}G.R%0u$=Ș\U5v=!P*!*kZ-Hq=A#@IV8QZfA]#"duLM!W[N Jwĉ5 #xUE! y@ hQW|w6ˬ"HYHPݞU}Fl!0 &R#y܊H?>|:ؙHu]wRcRЏs,uQ-0Tl(; .dB56pt`Ul)s=:4ٿAOdlR]=UJpC=dL1!TUPݔFʄ˜@0þ"[ݔ֙bMBg+ شQ& lI.I#3%lq-_r 9lvzqJ18tY8bK01 S62dx EeXhVMGx⾑:X3nZ({Fx̝NWą2P+B3bݧt=2؄xTgag! < 7є$Q`6A| L3@}mYc4.F_*)$cA!5ae'S?]lF. {hZ/z~+mcn-|v]-Z%? NjGɗcxF%c*$^KͻWZCH #A$d(:Z<Ղ6ɯ%GƑ)6=,Ǘ(w NT2@Z7F캟 eukFqP- N+'e1vbF۴<0tԘJQd'a&rN Ib5.tGLdTVvl-";%%lt緗3m({C'$?'B{tq]00*w` [=I7V~~ЁX;ٿ<;{){̝+}P(}vhOq`tI)~>$(gM񸘣w#+3mVGMէjqCby;Ogv$fwV+8KDhۖ;'7~b/}o~?s&g3޾}{dxۼ7ܟkn~DJqk %#^>_y :?y$Q -٣sh08x0t :x l[\P#3i+E_XLAb;5Wߋc* zN0Rugaρ5>S v1~jhLGnBN%E@|`} 0cYWvHSp J9aK qB#EM[T_nxZ|ӽdVnQ<&kk;t2 u+ zJn)jx`{wkMp5.>gj\8LȳG n|_쪡 spXSk! ?dWȄn]2)`w;# j rG|Tmt|Ƿ?WoX_sQ*!OPZ]]=y?z[-"BlIېh bDY6i׌*fX[^xr5헁!%5-t/PԔQM.$ hMỐ5HP~103'ON꧳˛oiwi : R}uƥMww@w]s,ʇ2(+ *ru rvΎf  w@wPށ͘Eo3r;ZC) Zh'a:z3B 6rJ5Iv"q8t\#)[`YpSrPBPH~i/.A;Έav\IwڭAWr77@:ƬSx7@*8LktFUV ;;~;VE4`O[_LUTTG Fm6~\O▬vp5s0ʵTL'Ib Y Xd7%#VZAΜiWY~ 6<0X\f̳>BK(sWA^ UgANdSN1\udW Z<VoVw`q÷ mR)LAl~N[!o 6/0`F!iG5a+UW_jd.B2|5CSըy@@X0PL|44v#aq%m44?UQ# \dcpRc i\Cg!M@;(T8pŦC"Ŕ0R䉐vH;\p' s`Z5qO.{o^71G8Ȏu9)kr^*>e"(Mq5=;E)[BQ(T9YEW~E#_gxjȹW QmvP$^[c怳DŽ2ٝO\N|閦020i ؄ e"B$!< '$螟uN{2#nuN*چ)%CO  չn6,j^iWnFʨP2; ;N;@tQO|\srH$ۊ}9(< aOqxvȰ,m]u4/j _O;3Ln>P( ׋|9 D7գ]+FF!JB@^σ} }U'ha(OnC0A%!a"6]Am0NJ#)B8q 5 |G@KC̉8xL? cJE$wFFNPL1I8JX:>KXeHDzj2IHA<ޏH"p{ 0bHShyj [6"Bk+aM@BDuеtQ(&F5,f_G >6?G#kXػљw nBԎOz XTlA|ko' |r0%E 1 M7_"cȾb*"&zLCmU¦9Yྟߤ*Z$lum<X1dЭsɺ' u/ ʺv*K<_Q.&`B\  ݙc@έr)"s HGFdtro0xaɰMq{Չ;(l*䭄:! Ŧ ܽwy*1FկcOnܸw.σBYkyN;H<__8y'o?3i'hVBQu%'}z!/F[0nkM~+% a/ [n|g=wH,n݋uM=9q+W~2N~/"^@[EB. f“݈=D<`=PFBHYr k=!ivυWRA7w\ҁb34O4z t LO]9T'dו6/Ȇ-AjoF&+Va^QddpNtnv,G^AN%XrG){Bl+4Dz1#%=l-#O!䂶FL`EtO;\=jZ DxjT-HKk1 ܊gWjPGKb+L:YfvpWNfCMK:iYʙ 64x#yXLq.PIqKat1Ȋ>V?|'ެj.bWwujʛq8jĦ jx&dj뙺i>\w9f q9.#ȓ rЋ5lBv95@~8W2+.dxF-{=Xts`h}h*5vnB mR?d?"ȦLXO1mD{LJɁCJ6L}ZGA:aA+RA XR¶x2!EW ]I. m-@͸J<ͶNE%t1 AAuDw.8*]weRˆU;YuB^78a}.ED5p=v><\~P0o,AzUL3@B&7Bl" $2 ։! wع8 %xRNHM A)>m3Ź IDAT{j휼 aPG{KvPn[p00dҖ:AM>!5.}{;IlHbdS*K^ȤS-@u8z<ț5V P팜_(8&BhEnjH3'DsP0+У55 :1lըҡx9Sv"ϭOw&ZBV8( ]e-h7)ܙHlD=NF_.JmqҞ̈́¿tEj\\Sr9i>I"v#x!]>[3l"NYB̌Nt? 90 >9aa*P`[%à eO>#?3?s=xzO%h9D9`-Ea?Ofo}k?g%3J0\hkB)֟ohDC3DHo\^s ; ȖeB\[ى:q\x5_~/}K\Ԣʿ'ujAt xQy|- krOԚ~!ʰW֋z"kG+ހjF Ѭ)LD1萯3 BA{Aف) VaͰ{Bhڌ= ,WQTGLx*$&9 zF.w!۩^A\ezpv`J7- Y2X裑O2*RDqZ4-"Gw N+ퟀ {:#v%1OnX!9͉Ō4iAXVU2K[m mV\‘DdۆwUUr)}j#"FLx pYi xP3`'' lLjXs :eBWGs+qlːYؽBˀ6 lBX =n[{CdQ?0{Lnk&$zzlp GG*'m`/ge0Z;ÄQ݃]y => >Os)EuYFs ĤU@Z`AaoymV O|;v V /LunIYGA563B)yajL./sT]:U#qg@~av;KKF,<;RpD .:`ۆmߋM9a:"m!s,SFx&ܣ>Xm{,4{E;B ;kS`KЦ"],דʲ3ߣcqb :4זt VъB㤞RƮV{C B**D*N2[2߁Y(Dz'`EA#3~٫ip͉]C6f^]IP8)æ%nd+x&"ܖ=|K_ZHO䩏}B4%ew a'W]aِiB-*` b>?tFXZ+lMLY[7: )QtK"֔YP$bF2sbB0W(Z1|Nt.%E2x48w7P v=ނ\Eb I%76ZrVd~dn4돀kXj`}MW3z[=$"DgV]RN3PI3-!&%>W#dWZ^i;D uśηpB]#|S8AAx0lS&8%3M!\x |8c `kXKgjFP Wxn[;<\x"nGˊ*_ ["4n #PA}Z!myB(ʽ\ZHn).*!?pdoSltc: :#lS~=g F c]Mm׌Q@,p-E` tʰM*fv጑72KVȓ]"p'!/[!/V4!nL5E.GW*GHZ؏\|<Е`6>ˤiha=)m~,ȳ/ 5 ]8OTU TM .c?"X2v{]b X!rT@Y"Z:~O 'PS'AFnLumc1|R^wf/q8]w"t?2kc/t&?.ÎAc* Vd4T6 ;=?~% t7x LFvj&xS ҁ yH A,S߈4_?۽g$= (9e刾d(ڃzHPsBY۷4jU:_v {8"vXΰ ۆL|*7_(%δNyBݽc:ͯX7yD)9F 8Ǟp,P=ˤûMMoA,n~'\x4HwA 7ecSqXFl,s@RurY2 d5|#$^I v]6F}BtW6M- < +͑uo[`0'kkg0¬ugx3ÜgWc}L:x`-݁ƎWȩD/`ZR O 5=ܲ\]*jMsuG) @~| uG'C~_Bt]GUUxYUost{?Fb/hE>s=b'~>{aDF6Rĭd<ͤ"GdsKPޠϙfwS2l#Q@z+a7P5C1N$:b+BE}P꩟||~1;&lGc*hCtip8bZ2F$x/!Lꄵy:&#TD_U~׻ y#9.א@كaBV*]ET&5 ftS`+NBacrU@9WOŒKXom,G"B$j;PS a;WÛSqcP;S, mJI4j9DPw!PW/tn#<18".噰"p`0\Nv\+4 =I ikD4@DTL? աHZVvqv[+:8tC( gl9?K 5#0?WaY<|dekM'Rri&WM*6%O3a" բBEZvb,~on W& @)G3p5AHR ] 5t\oʰ2VgVu|Jf*yx##KЇ:C6`aN#@  ќKVJ9AycmWсLS؂qUuXhj*v WZ 䶨 ~M?x+ŦW!d<@BZ̍f g9kjyK4Ih?9% Fhh.xghq-_l)V%AtniA,xW|>V$3GN( 7鮪ǚdRgg* {c/Ygz9ZE5{Q'Y1H]V>B]Oى~+)2SXJ;t)Mrr*fr ё+zd#IqmgE4BT (tx$,AAkDgB.PVajU &yؼR,'Q@!ٜ4Ua!K4o ~G,]9i98 .x[AfR"YRds6q\8-l·^z{ŅPmTt:G .@戮4;8&zZ"*+5 Ax E}S!,Գ>˟ٟ G̫T{g?)淪So~{~?=uCԧ>PS.jձcdž5apĉE? !0U4)01g dj4}Iǩ7 j\QtbiMi&_E8v8_ uA7ꇁG IeCH]w!HQW1-P5n4`\^CYi]And>kt?exdGLW*՚ɓy}.׌t[-nYI\zM(Mp66AhTĨEi?ZTQg%YFϻvX{4:د#K<)b޷7v #vi1uu&kFک^%H 1D̰ UJ[B^h6W^Q6Bsj@ȊHCw Hy.hGʣ _j]H ŪTa q"V66vN.T;J;OsTJ \JsW0In%PmAΊE`/IgOO4mER$]jGCqPHCjo=tεwGhl:F=#nΑB挦<N@WTG+=/Ȓݥ#T:춴]d1_EHh(U!a݊2T&S0( ݞѤ% ΟO3?1$8H/ ʼs- ^GMRMﺔ2 BEn;sj.; ו9"Mv j@7ht%rLkP_.<.@+**d:lՖa  ,!]J= t"2Q;zDf%Cݪ@7GT]KX6嫰V \X.Li Q 0+S+0f|.Wq;"K^Q(ҝ7ɹ 2ghUڠ#aSB:Bs&uy0ũdblOC;Vk,1c>G OGمѥ4Ձ`Lm:%z,r?B[3.n]k%7mZ-D+W&>aW[f˘+RADej$2tӤhk:[k~s({ B5Xø> \n@ ݆(›es3[@ݮʿW7X7=ݞϛ&Gp󎭆rΜIb $ S*!tT*(ܶD Č%er,{ZJcx0O*íFB2.:ERZ-q0!@3bB+@H LkzZY݆Jvk{y{c|}yzs!wk|pC׷Yn c=S|o}ut2Bu%Y)NgHû=A_+Qӑ@O'K ?#KL7T혴0^1VF o&N܇ jנyAH=ztN{Ed> yˋƿo|c#~ɟ""/_}WO>$y?؇[[kkݦBxQa[n:QmcǓ|+|_\4<}6$Ļktcz-JƵݒAPTV#j.cnNaɉKZKn:EB:8ԟ!W3+wwU\-gvx㢺_H"w}oT#U[Kg|󆁜U[Yƭb l![" ʳʣB=]ѽ͕ݢlw]b\E؋TAw5^P9{cabul )uOcjIৼM-,!]$EH@_ A)vvsuQGc%6tg'+m &Y~?kaw"cJ*mcfx=ȑQ8P92CB|hFnyV51k:)K-)3'}Yuq3Qi&9`%5fG:Ed܌;0ؚg] %ŮL<HmEЌPh-O?noXƿui;~+a_9,M ~/j_?K.-Ǭ~DݼW@npؾH;xN6@]פ رc|_\1h_US K9X| aθqIdXW8!+e%ȕ@(maTvUv{,`sB|x 7Si%!uҒO^Ըd85M Vav'[a3y4bˆ\lڛ xۺaF!%繨$vsV3`=upДIm"ZUwLrsٮCu1c[bzJ:hHF A{hn`]<܄`M`H=wg!#i S͍[JJl)Pewh"bY*l"虖2Tmz2;v`t4wOy*:0VwSzMn7uzFluثV؊7oA:m+BP40с$EPwB!s;˝aDeN%Ygb༷b3ysr7XfQl-cB*F%<)lgt#p  [( ??'<.}BasN&3'urJ WKz=uF4gx'M7ɝpFTD['6Qѐ:g_7Pd%Z%}:†ua ;:>툝욢Kds { xfFk8i:;m7i9hHoLI65v$jKhuȑCX~z ]&G" V#w逑[%sw@V:-7,!-%EF" CVj ]$טF7ɘ]&D{yRڢr$`-v2wKGysF,lhb5d)<22#iQ$)dE@~:GЄ0:в v!U= cHKLyipA@fp*jFdUy^HoLi7A6#}> 8ڼfwBiz);Ϋ>S W>7Gͼa\L2FiHisC#< rWXT?0}EVtz!}d|ywہyǀ@0;"ˈ.̳؋߁JPe)g-&NG-w~ 6|-]H cF+J&+A)#?CcREg7 ]j"隇TG!v%zdJ TPRhN,^pęjZ#M$C bB%dCvX4mBJGa;M`=zE@;꽬 s7bQw}Qzu }?(~u{_WRJƲ/N}YO=!ޯ/.Ǩ??ܳ{: Loql'8|0_sC{?gEM>(r;;?\u"W@# X+> bwbAltHhnkB2H¤+彺F5#~l}C>YLDnFdNָgHsq9S;`B2 F #!adOOA-IّI-xf8"Y}a ۓo= ( !σ K#X \V(/'?w 3fd2@MAD瞆|{pOػ5%D[g~+v,eU&F&Dk@nE^Ȭc;]oBw$o6<L) cKdlrGEI_Ԍr ™v_f@ۊ|_=*4K5Y!~R1Mdqx nkۦ=Uk%^CF *6!n1Rc"A((Ӡ N&1UGA!/x%u 돐$d-C1[NN6"P+gH`lf,8zt-ĐV \aUHqHU>^ҥ)w4-rZ{^/c0C7NYLcaCT Ƕ$H@Mဏ񱎝9b4g+sFG+l i1B fT,GX[0KԆ YYzo&DG$$'%4? gZaITTV FjzgaQw>B%C~_Lsef{p¢oC8qر >E/j_h4k#ĉEɓvĉ6߾ nPܴ ƏFUPTtm,y3;SYuղ+7){'ÑwMF@l8(CUːo0B8$>>hskO1)B$7A^?ř=,Mňmh5C2 Ly?]Is@_lGB@x9s ! |Xw 3--4Gl0.sXh[PT<\M=vs/A0Ǡ3`O[{TH/ hAjr!h$A|GZF ֐bG3S:G(D=bP)̹&r)V{jГ%dAo`LJ GF)_;\!P{Aџx䂐زkڈo`2f9UT DNXD]DPaA,> :Hw"l47p-D"CxK`BT-Uqn'!I8ؚDrQJwC $MA'WCCXP2&F8`j1RH6wa郲$G;4JBX|L>~f0C̐{~#'C hƆZ"uPЉxM;[s*3fFUUCY};j_/!>O,}Q>#O^8{[{olPS2r 9sAMU__رc E-jԗȑ1u#}l1TD1*b÷jY)ކywk -\`Xϟ8w #(+]51\^*6ˆKef&GẂAIdso!YРVԿ/+PT5b*sOr!A0g "qED$ =-+ D !* sg8te!*sMHG03}\va>BOt-Hibc7f`n^U(S@[ћ3/ sdS]bUJT!plM{;}J}Ӗn͝b#UKYWuS2&d MSE L3}1AYM/4n׳"CK$)䶪^aNA("aو ]t4fQwʀ-:JLͻKDuX0 o:lsN /rCߛ*CpFg?Łh=3u=7`>缗y/շ7Ѓ9>b^Ծ㾉,/D4df={v=Ϫ+֣6~Ȍt1?E-jeB*@QT+?@ܟ>[䡩?7H߷`g^zn)%Q˱5Ǒ ˖ck[FA2A210 L b`?F`0 q ۲Ghd=$4e-]u9VufY}>UŪ瞽oˡL%k(+d* )p\~vJ F*Q8d1S@r}]Q Ƕ a\@W+Vp@!u2C ,Jݪ6cRiew#[; JRPs(#==WZ:m-J+-r:BS9I#?Ƌ'Zse$OtGWK ڢ[$ɯt @A6z` vSP`t#>A}V.BLOO"PY"L!(*p27fSػZ`<VGfjj$e-ڲP |6oޗ|O_9D[#'=\P7&Qҿwo맮9Ld΍߻g}PbXIF}\aEmRJS "<3x-Jgs=?cqM/΅U3f܁_3}WU 4oPWQ=J#gr. u2E2H$]'{9X1x++'7^뎉,PF#qȝQZǠ@q#Sإ|@ .ܞ( o;*/ߦЊl8Mޕ luBXƥ.+(ha\{x 4urBuAۃO)qI+^4kY6iP]6pɐ2)%(@w!!BCq<Li5ww?t?ܬ"2: 04525W0Z!-#E30u,Y_ ]. 쀝ڔbܟ `汲k{n:ͦܬWR0خ%dGY1h顊 erJ9IV८Rs`LUs@ӵxHOxFs+?TҠR#t fɚj7_.]WTYXStU|ēI$bSĈz ~ÚAikO<$jVTknBG>Wx!}qzƌ7x;6Ty}o;\#"W2kċ/ouNru~Aq… wd}O<1M~NOGιMcA1[yGx_ZJ#씎<ű|hT[ij7^U?15E^djW7P h'ͦ'27'p?8Ur&?Gsr{_"7E3!_*R^ WRUi߁ͧ&xH8V\!WF IDATH%Uu*c'lh7ŅI=(/ :TCpKē) MR9AV!&,+7IK7=9GGFm_%$y1x468rLiĜsfPNĕEvlDMU@aRFxm\g=#Sp'Uz_;2& b7FWД*ynH=u^*BFwW O(/%KxnD!XOɞ0@YI&H8WϚtQ>SIw:x`{u$>$Ɉ%g@.a xuQgƷ/I ;S2ղ)1sSxO&#!Cwo zI)jB%C?z;t99~~Й3xq=l<;Iჹo~F?O)mڍGCu0J)}| ?<7__=9rΛ.GQ13 +>L{i}{vB-ڣў^finFij 8OPd=N7<_^ |cq!E2_P|Vx.z(R +nms$ܧV$HJ{N3; q` Ŧ:+yӊTg[ڨHX ` 6ˀPA_HW&E#I>| +i)?5 G2nG$`Hg^Ws<j7''^׀1 `H:7s  }>:#IrHZ =JSOw,$7 Լ k~˦xv<|-?ޟ;(cJ>PdhNNO4WE  J,3Nv ZIkpD\kg ge+5W';ɌZ˸*悞~j+LdI; _{poxw*(k]Q$rGr~ mݕD73fIŤs:;{:ޣ;׌/~8o>:1ŋσ>r~yoq萟2(O/f̸C?rٗ)~z@=3{t[K=x oBMY@nĂmE[G^WVd-Yyg(AI%Z'r}}#Up g ##h4Q(xi:QODL騦TծqU(#|E|k,g BKumZ<ɭK)tjW_&o\.g4w*겻_5l?^<ntcBv~[\8&&=S4-XK*_oM=]$deܰ ,2$¸FZt}x-ܰ= B 7c?3ctP*gx裏~qt=J7~6qsz))uwx]-7<<7{̞|c.lYDyg̸я~eŷlݼ=0Ç@k;pl3CNH[^]wgԡ: X# d 퍤0x8Y{X r(9QțvCt㚃50c` b9|;VOƭD:VKB ,'!xꁬس Eɧb~C^-!p /(QN'z܊Z3vSZlZzz-"%r~ gTJ <NXkzK6Lr~?Τ`!:(ALo)8l!ҾERhMŜ d"eAW!Cl#?nC8HKRnj3#;u4۰&Q"[*UKX Jb%RsE/ԱN2L}?omobSlZ }Z"!(l҂{\V)@$rXY='o("oفfY`v= [e>8| p?o$Ν;e.òIG㟗uOٟ<7OէN|0c9r}Ё"0, qp4BI -[WcOG+ :as(,cE#,ȡg 4;p Q;H(LqF*;Βm= r98H*k-XEp2C]Ȍ~$i$b)rZEkݫ2Ei8< SIݩC^Ý׷ IýoTY}S*[*!Ox+-??D; E0Hy #|vpMxvGıK**d K5H3&k䀧Ĵ)OVtB*[@ cbt7E"Eggs V~ld v>Rƌ<T@WZ jTB#W+D`"#<o%_۰Oh{!ڔG\?n+0I#QsW)#ZheŠ5l[e C#RUX<n0L"l[hd u+51%UG,D1DuMyI0Zn$L^ҪC7<k"t:O,πk [` XrgHŖ#p"c0^YMkܽȁ$>Psn1*鰺lƐE=Tڒ(GNF˔!vO'ROƤJJ^Urޒ+D{w %p9ƛX$~<&x|(݆2 U%Uu"pH&"!X Q$aC?K&`EoIZ6W꟝{g).Z* w`Ç!O*# e`68C=i~:@.7N@Gm,3*]j[6tzSt%әBA'k76D r{\@nxmds65ߪ+ rUbL ̓)' v%S8]t%ЗE+Lu̸, &%W\h9)"ŭA`- P 雙AQ8)zPVmbGyI [~P) @7]zZBJF՛C冯t>6mi MHpnX-Qe՚ Y i8k@-R [(R"5НP(ˁĹ]% /°{X^]񮆆߸M5)&PJ!Fָ6L$걋ޢBz\Y$yp I@FpO T #СQC]]x`uEJ!%y_eoA$ `vwց3Vԁ}A?OÏ_˾0i>ѶQ_agr#pwU"(o+4S*oN\=;ЀGZ!M* %ˀHaMg0Ng e%k { @4( r Q[Yn| kB,S:l^|\ɴ/k5 D4 QM0r='<~fT$' LR}sJ+wFLϘ1ur'/w{F뻾kwb{RDpσǠ`c??=wӿGJ!YRVXFm^E'jqDq']5 *::YQFgD^* t>oQ%퀾 ((($-j_~ ӆJվĂi2dჸj^OȓF o3NReJ]1QR?_$x(@E Ù}CLF:B\Gv4ѳOrMf@;L!Pt|eDL?+V6Ӿv#%JJDK1AegXtxoEq Or10.$^ z?\XUc{Sy䦙lsUqFV%1nΑlT5+v@M_uorp@2ʛa}jr^ߓg>!ьdL1iyB~FMϦ*!. (,˔jU|Wb;,/$-Hr?x'R;'}};2(py25nȽ␷^G\_gmn;-J #!OA*QjĂF2),`bԜ+S;&+ W2E]t`F2Fw8a $wSmI*ўr&1FiVV׍@Nk10Cjr8[-NB6 I{kཅ>O -X;Go@>ogHo@bƶ Gy"1H@UPmk#RNa.5h SQjnm|K;lJD`a! f$==ԃp0Z[wHLϘ1uFqVq3x'jf<#ϸknnOd|38玍mpƌ ??PsDmn7(vVUOJ/H'4b, yӥ{,j=;n5$ىz8-%SOw سv!Ǵs~~wΑR<,X*9gN>?Y~ƌ ԧqX);z?FL,z`f(m$!7;$&c#^ᅌ8T)8rϙ2(H~s 2RV K#/n*u_C 鞺ɻMs16)2tQU·8X$l>Hd䛨ot"ҟ.u#!§ʾu׈9 bxw v mUb7J$iXPLÜ^)DFID@<8B"jD{Qɻ J{0 @v9n+TDoxA^~|t{dSBQjAxƭ՟Һ_'wDR™((ˈ[B'ndq5e93boJ` GP鹌+|6uVNd -- "U:Cڰ|ȥuVB>ъJ.+)Oz2/-9Vrbh~EXr`kpސ6/o<*BIŀ 3{aEPJaY:u@[Vp5 uQmңy4RV4G:+VVIǡ %5Nl;]X- #@6o C$ G K!)VrF]9{Jݠ@Gq^`b+^*.~7>h!CqXjVZ匍}zrQ. @VpX8Ś7IFMAX`qv?*ˆԐ,v(H5#Wϯd}g?PĴ7}ZQ)Tk.RFcSb09#L\UR puLUH73Ku3XdeW<7 dxs(P (P])pRZ U!Cq '-һ7uˬ 3fW눉3~%ɾaSq1;n2o|D3n?2]GO<6nC<3f܅G>"gΜ6Y獆xxF5I g|4dr /vQY7R~Uqֵ[Ԭ\@GdWk5]TnAr~"8 Udƍj**x莑-H\edҴW')CڜD|@N$ѓCc%G{etjZ64]u +IaHRfIo7n7UWa~0Y~Nœ6Ju(` LVU8ѺEw[>S貎"SԵa9BqJ+ҁCmb"%dkѱ7AJjLD\:9Bx#*\f"= ..k!G[N{\6v?7m !(Uܺ ,!>^pM5VD> X\ɫOJqij`4D¾Bt# '7lx>kXe\2/_ :V't$,FѱX+p \ ׀(uXdo(B~m֧ ?(.|c>k\QGv)tC"Z ELn!̬zr8_j',ֽ@" 'm |[׵1-*PIt:aZw2#ĝ6g+buXu,[2]jGរ0+-h(@u.z~S,^J YǺ~|p)6Lum8 tȋ௸Z|pZ0!P)$ho<#GO;$6 *-`tOe`9C.pPvRO9JF[e}|*ZXOg.>7~B?ѯᴱ>]fp(b-} & O(wd>:7]'>yg̸Ke߻]3Ӎ{5zir"|"mZJ<ia dV錜=,ZDD+e7(~W"txv\%yr=_pqokޫ1]vZ o պ׬JOM7op m%ɱlz>UžrRNa7U]2.(epԢX k2Y). ;p%͉U0*W|`钱dHm $ekFy`ەl l p AlI oA _m$n@PXR ƫC%&iFݓ+V{#.էZjB2YO\+5." Mjm74§x pW uv60g\ CO55JW KǙB#B.B1P,..@`{5W*j~+4lͷ֗ \lKH@ay{!aN16IIaGYEx.!qwlgx0Jqk@>ฉBX#ѱ,bJw@MaR-2^I#U|!J#0)XnBYoӃ#/o6 ܮ3J~v@@d](H!S%+9KuBi*@'9)|&_;+|7xpq,صw-|8/w>G#_ /$RcPv ^5Jhӊ.UY?1)I@jɂHCm46/ N%;3YrPQx6N(~ lvA@@6󃋩,*,'W/Z?R%31+@%գg[l>u~ m(`%z/?;j *B v#8[ҖY&|PzOM׮*U+[C~ƌ3nzpm3^ Wp1oz33fgH&L~8dLr=O?_6*)>T~Θqǯ[n/Sf ˀ w@\^"hjP57@Ѕ#`=ѓj`^I@&ڡ=^E/ dVXg{o{fzf4͡()h ZAɑB" H|Hv$0$r; 'bFE$אCγg{sUa9(sZf "Ȟ}{W]!mBO?+ 䟂W'`-#%N3y5!)j6(Oxq_:F:-Q>SOT&1õ%hlwE&)^8'Ք]`EŰ|uhqThvrOn&+4-TcZA8ΝAW&8a*'?ߎ]'qgfu0%0'  [YvkXAZwBrWC!=л9F_谇pŰ~?_U0("LA4![ހ \pA?ɚYU9~~ N,7(JbݯNpa^05zG)T5k  Z=@f$Fk >1AcNtHf3RK"~e/3GDNx`wnzrGΘz% 1bSMu4ar0B wʔ&/o/#J:sІNnL5/;XnF  `5ӥVJ' @8sys RƈF>_wJcG%C-xӂr`GxfGdVɆ/2|znl*ʆsP;@~W{t~뷾fNVjW1Jo2\31ݠo|BZo>E=(tM!r}4_X!?ȓO>ծMߴp*3#.rPY]Þ#b#s'}-kБ rp~$;2y<ҵF .:м#@<}#-R7?n}A\QgG# |9È6;[]g!6T~f=Bn~%Vʌ0aU%5Pu!2щ`E&{;P\eY @'Rkc(MQ`S]j(]{X=<3<,W`HJ$rPN>ݬJdvJe<\/[U\g3fD6\}t Ndm˃݌9ikɬ2оMkWϠՂ2 m!#C)AI{B||q]Y6*{w3.(0Bւzv'TN B uy"sk,⫁ne0Ll?ݱ t%L9@ >Dn*ːdiɂD0J@9P8ToH0x\UcꠜK+vD@MxDoBNᥞ6:3E,Ȓ`fy5AIP]Г2DK{ȓqyV>)DuT!9PըqjGق >҃eT٨d$UrJЙ2|a`UB;W!S&hFjG`` U / F0uwH]hz辚J'ehA 4}CCco}& /Nt/g K'mք33:xP::ʂU G8D L.+"J yT %賻*C OE$` +1"v%"kF"J(.o.?;Q~}&(I( c|DT0dfLdF>竉wB]jW۪nݺmaY]]fU?wjگd2)B;t%-QI9p%cf|jWuUy'ȊvḘ?W=^п&/g~g -_Snಢ8+`B"MM+$$!)Mw7:) rF2+9&V$buDPFʚ, ]6 jSq忋ܶ`Pk0r%?R(sPFm4G:zK'#) +if0)>ߵ`?=@<Ϩ)f#%$Wmm612}1cr cp00 ^ٙnU>?vnA8RmyZ#)⪮8 |dpʳ9XV`I+8x HFک،Z Z% /hP􊧱oMz?1_$+\ Så2XK;(7mh 9S#(na *fw7ԧ&D`B2"zV/hSsFHU91:Bňp> 7*B]fby7f_%֑ U ƀ^@%Vy l0X NtBL a@R@(+6*,_P2rG#Gzt}-Y{L85BP'pŢmU!XT=U`A{B :j sG8@`Dim'x kAp'K ڝ LVն`MEQeGЄO͙="eV 2H8FpS]Ō|*|>;QojGˆP[[zpg9_>DC.;nĎ͛MbhdX6WF(;Hx$H `|2~$fdz76sM+V5ل ]7V}'Q'LFJH1.ϐJ-Kn1DqoJdW$R )vIL|))ևRVJ'2Q l3=g:|e$eʞ;f4' mDFub 0ݛ{u^3eq!ة8& z4T8 jY{J,sJf`.u;}W 8z&#e^YLLQ'ͥN gVhya^) 4ĿY][/p 7':=BiEO|g!Ϙ]\5E6Bɣ+ڽ4֜4ul(*Ute巿GjWծv6__)w]#j^zC?&~#NDX&W D*f(0cHٟԧv7pW6~STaQm~躵fޛqS791RV1PN/OLYE\W~v0kTH0IupZ0$T7$o+D ˀܮ s @d}[=Ė4yz!=\H(t&7jZ)X4(ZmYŕ Z~g?}@xD8" Վ:oMpB'?F0[X c[ gkR\od=JJYi 2w5߸BՈ!>kF+ bT=%vžZwg0J>"J}l 4x0ϧrTwTN&Tg(9)3.,U IDATغR 6'&a1%L p iľ{#{l#TPXN]yi೜܅eu>ɜXtT @ c'֮YF'+U*&F"Z~;BXD/gB/ /l4򋅐x \eMkx}0>\*A%Ndm:$gta3Lj-Kxd?y^JPsfK X#;+g\-S#A깓QNb*8ݱM'OCy2c38W8Kuu'TNp12 sSL5DTqiM~#kn..$|xq>#T[ƞn~yy -} `/: z;-/[M"eQHw7QS=_jOr(ТR@}>gD  ov"]N`Bq~B>,^(,!VbRT3B[/NW5j+8?NWNSH/x P&am1fM(bDa'(pLl!x5BGk   n90[r# ߥ#V {6ot̨k]N\öΩ+}%0yJ^W.QQ}(#\27'bp57P u`y^;Q>;`&|Y/II7;hnBɶ@ߚwv]S/®vwBV} _]?>_ FsK|O4b02Ȁ&kVD)rBU?;]}{'?m~V-esQ kn>rsK鄜MͰ>߯M6VIW +:'6UEdc)\U!+ 4`Pt!5Gvegs+Bʬ6D!ne:\n6@Պ-sП4R3Pp)*BI1VNՁm6j:QJ6_~nSX(uT2Z#e<,N0qE6@n2sF( `0s 2f^ z^+C>l}a"֔']O\Cl+춭JDwP]S hr{0{|oש $]ܵւ^yB N.f#){@!:S}'<:wDkF*P=Rq I(!W\q9}n-38\[ onUȕp YfŒļ֕A3&ZːB=*la59[HboMx*"\H}YN`ɰ\ 9b݆zTG1蜊# +ɁPHңWS:5h@w3B#&/ (Y ejíedYYBߟ!X*̟ L**'+nDA_MtK *eO9SQPfܖ_k쭠?fV \ rׁ7:^O~nEb7 ncϘŮ5b iJ$Q5elSll~ e`"Yљ!an_o `%޷e@ H84ڢ5KL0 +]:ez>SE*H/8C7c6L)3tG݅!@ zZZ0TKᏡ x spx_Kz>p'64kicX|RόtU¥u0L_rԮH(F 7s'. $QՉ2m` ᾲh9@}xN曛OLB#kӉnI4C"{G*=*g &E]s6ztPB+Ē{^GI{—223,TwGFL+&Y?b3j3qvEG=ۚU"NJ*Т 2 &Qnv'̕|`O_ǀl.fFKxg@;@~Wծv}s9iW;TivD zt *[0̘՞` EbM~"sʧu &>p]ۻ>yO)-c~yd# t9$U~xiF]K+m dxp{7RuuPύ 'XiQJJ+mMG˦)eGoXw&l@Ȼ6Co1m;wa\LH+CW__qA(uFUs5 h h{^vu,g\~v,.(w 3MTK`cqDXhuTJVҴﯤr!trb (AE8oUwDžZ '4D$<vg@S2S{#4ut+7Ԉ ;X9< ]b S^w'uC=y=Nt!]mJh8@qDA~nfAG7Gܦ:ྙ yH'΀5%+?p@~PXQ=ܯoΔXһW:&֗&?OUB߻q#$*=W>}n,B:#ۭm=,ØLXUX{Tu{ 8[Olglb$5`tv.Nť 뽁Xi٢>ZЗ=&<๝8Plz ??'1A)!-6mSU ?E;(&V\;+/̘pNś.#Kf7Q7MuOvB#H#yY+*Tbt@ WaZ\G"R<"ۺ~dpf'$+N ͽ+=UNP;cWծv7n "]]jWk2ze.ԟ!-{S֞CZ',$LMteNO|]ׯc=7 ?LlC0|@ WdWIH|9:fQo`BP8Ja`2A{ +52#1BH!L,J ӿc4k ;:39ߛD]E#Bn*\nP? <^M5ye1FkN[1p)tOlDe[Olc \z=ꂷem&Sۓ _ar*υavnmJFݛ*NQaI,| 2 1~mm[5]Δe">A2/Jkw@PZu? YraP>hꈫۼk jdD1iXL1P|^[r_.F8(XsJ8_EJϊ#plݵFzC #aRl& rC BbG/D Vɘ xxG{߳)meyƈpej9rI}|~ @OGP(_T2\p#l ,5ew9rt2;Yo*RBUg ]jWzg>fBjWzGy/K7IyFS NRV" Unl~̬`c=;qv+~X~mk+Fkt bOk#,xVsswzTLJ)1qy= ^S>ăQ"Un:A;,ﱖ%kHtUss8.CNGQ^vr[n0ŵE;Udz/3nT|vF"!f0/2I2`W9/_݇/A1^Ogg7=vq_^)X-8kq#|"Ŀg*VՈHcȸbUJ.BZIɹ=g,G&f/ r'4[d%l<?'+\wxmHZٖsErSʹ޴PͲpוgtLC:>ߗ~^i'r 0'Ѡ('6a'!ީ릁2p`#Bx:fx$ h!WLk&LRpKsf ``R7zq9o_e=EE&'|;l`0NȰ O{VHOBYTVaɺE B x;<BlKL=`߶zR 617G_NvmkA|~a0kЗ57c7_ P]VROF|/N cuc[c ik`:/0Hesõհ"cm` 0 ɕUL'wEJ|}SA(k.d0IFBsRϘPYCXP(4c '*)F:)~%9H-5z X͙8N i-zFgR*8CJ. :ctw ALP);JS;`(]=`. cd"4 NGt`:[^wטGC/%mxrVYNyH( )A&<1goUX°%--C[vvQt&LwлծvKkVծvd$Yau)^wW ZSg{Gr!]ӑptE" 5^d=1L|]jW|eY~7Bu蜃<65L]ioY[G*]!=ElsЗV@ =ZQC`;:864Wp|Y="B ldpnb|ְ;=!}w]ͩ+sJazE.&FfAɧ(&0ⅴIT\ixf`m-JWijnbH mm N s1Se<Y 5 Wcа*f!)f%AsF顕ƦkYE:e̕|n M04?QW: ˄:T8ѧã $w}.|CM;d^Ef$~@ݙpSX_ '^7@*R+S7'DgM8L_LQ;Ԟ76䍆mye"OW2GOe8h;6(3CȦ޾C. R:7/!Bۈ4X)z9&1i"T.Z }7W>Hbo9}-}F$}}GF=1Հuis"i'@GR?`W!.z!Rjd`u ,V*cGp23:Pxި]+=Գ_v&*A#J7y|fx>%CS|#+Bw`p%+TF_K YT13FJa:P-Fˬe8)$uk*hX)b!0۵ zBa^ 49pzѶ7/C$FPE1^wծv]m3β~W;N[~>= QkP$QPthMc IDAT#s(ӳ=< kG2cBGq>LO.\='ծvO]iBB3D'x.1S`⁍DAP9g#9JODS+t X/*uEiz: LL53Ğn nI&׎z2"{F?yLRkpLH 7J0P!?{ɿې,- s;}P!DY srcGB4 rlX,g|dn+%t# #k"֦X(2#pac͔8zi,LDlJH{'B|6MB^Ct)dHEF6F oA}Hm\+0soQ*% _1.P'z:Бe+YjW FRi t(F}/ye,,(X+A@d g 3-`@@C 8ʉH%\E_(Hvu 3%*54f;:XX">(3|o/AwRRˊɟ3J VI?<MQTqa:B7q涹YG2!Ŗ41&`=9P:bI2e6>,yS|)bU ) : )-y)F?+Pog!JCvtˌa`Vlq~:HT2SGCa dzqOhdlހaCah{NCXڤ0H a;w^Z$BNk>5Kņ@(r.\-cG&,8Cp'9j ))5;4^6ͽL܋@8"`U B" CB͎ |6ujƞMiH)YgGR{Xɲ̛ϪzuUW{o鱙aB4,a, ix f4<#|6c vݯzf=ys{a툛&T|܌8qk׌8*REk~ /(}߄́c5'd$&b 6n2">_dIa1"hX{)lD :&&D zdwO TmfX\ĿDfs'x'fpmE:Ibn友9<=dJ5S@N;8r'*|1' g,n]51(,1N/:@W{ꥊ,` ϟ2NC"TeHF|AJ >]f JA%#TžcHU8ީ@Y@[dVw0F#H`rĨ|\(| oìr0>R^\H`WG+EUsZ;x)#5,( 3 -ec ,!%m#QV;iCh$2GH"][щ~L7(:G )eQ~p hA { w0O<D Fqk *%LF 9r<w]jW2^1B~Wծ덯f$>G"Bvʵ"+&N2Wۅk,W_He˗w}jW֧>)!K|.WPO&X(MTF`j*Q &~a*d9bEIHRvtYI,-+ JS9xyFޭp@{tV-vc):NfgޥxX6iv!`dr&^q@qO@O]. ! HQ⪤Cev>ʄj] W&Mg$ H X ]}XB]u&&e$G#KFX-SƢA<|*rh21؃P_"*)c`q0]ms[PA} ;O-VB."wYEyNHɌ)͢z7'R=JKӧGf2'Zun򇜙.c)2AEf8|_f':3.ۭ֓8\(Inj2]zX##̞M.0*;L L.&& I2u^Zt񱙛xs H{j,@! =`cH*!5ne jJ_m>Šh<`ճߍ0՞M"Jh$:9AF( K`P|-m샌B}}rKkB9?E0|\#2Jz2{ЃՏmlCOPJy"HSJ}AyAܚkؑyb߫L(@iPYԶ*ڀW!W.g'W4lxBT#HϦE"(iA%b3 ,3+BaJ+@SKfR5>L}ibXmvXVvQ!kNmbuocʮq)cWO"PŚҕHuؽ u)P1T Ut<Ф~r?ඃ"\ٛkR1g~[NA4r280Zyx r>]tMiȳ0|+1,pX}H~\mea0A+ r@!oy>-n%z~J& lI?w(0 ǜCe!0H&b~g#|l]9tⴏTz(q ["˅u.NwF˅,߁NkjCبyC@I+2K!;l">pD6b,pQP^4+&Qcωa ~L63!b<>!!cSf7g3y,~Cn%NJ}2~s#Bh '3ߟȯT\"^ }GoEÚcShA(q)SlQ/z}ㄡ/*zd&`2!@7\/TBǮn>T8N~ H`dj$TΜ`JCS7WYΤ:!~ՍpJL\ )9\NA-<-F5L@%w(אϦTra r973!r K{ȿW{xWߊnhpںBE#!L39+Q%/^`s; }'3w U(u"Ɍ"Z) ' $9Ɣxجr{ϾbXL? iJB4H&~=0 #:"-(~97+Vt3OlCig0+ O&urQ0%ĆOg,g` 9d Jp }w'>"Yl "#x_S'a\ @w2a!7ܗne n{‖I(` sH$Ꝃ=2QO48@3+Q+YvˇӶ7GQE<|a Tl :xӰ7@W/eb {$-wbA+ .VF+o} z"Rj?=Qq wd7qrوcL~SuJ)A1m~?qXrzf:8Px( v~ֳ(*vꃉp'BTBN1 du2Rț՚+Cʔ:9)LRɩhoeծv]}0 O]jWS]a!0^ )DBe& h_/Ӊbc*C?yG_jWz_+O9Cs 7A+, k?$lGX̸0a߰aF)-=Ez-ˎ<@ Nӄ!o?AW?PaiEˣ!BT!|Z;X[~߄܍B*Ӂfl}"waP:?? G..W{:"I/peyӱ\ZxQLmexoIL>_ FܛApٍQzV` %: /ׁ/PGz ۓ SWg\Ǡ3o|ՁK%SMJ^>Vdh);{o >\yM\03t)nC;]ΘΛDy}xASH?^dRLaΘv>—a۽r<BIP#w',y ?]ޟIN^=ߟ=2p$‰͝z- nKV5,BA*6Ul%(P=j',|TdU{z- bA!6Cb)΁`Cq -vՔzڂTq_Yr@@a_uDjDHpɯ\}NzD@xޑ VrۛTxL=35  _l)TmzCm@N3@ @Rud'ƆCSg86VaBݺh6s%AՊ.Ib>*ǥ B|`C^p鍏ǀ4P' @~ee?NsW#| aF1W*PԌlH8!ׇ,5W‹PHL3ooIDY' o>oS&#oד<7i.T=\bs:DdrX C)!c~miE>(s<ç90k㽑'C[adnig{#B2wX't58n|QǛ!YsS!S^zֵ@}c7~uvM,{_^g%Opۗ3o=svGUXʴL2jުCؐ NnƄ) gg>KSOHpEυB f B# r;\?'2QՉgfyj=H({5'm`64Ҫߪb=\? '91mHvC-SӶ,h-у^pO82 Dt9'nXGQ@, fpe:si^;@~Wծv-Q@]jW6rA"9>-Ok~AS>dsx8ف%ȹH}sŋϿ{xծW/21'ʐ ? LG\.GP@\G">\y#?Q){+!~J\nMfjnqYU-s@`%w="{G#Sg\t#gj*EN]ֶk|H a,`_ /C*=ns> fuF&{'m,0)wMC;T%^Vx±=t%W?&i26`I %?+/VʞJv%Je8N[.  z0g( -Cb3،\ u{-yRc&LJ@+ "TÝ \ ,O)#32h >c<}׌^ќDOӸ?B"3k8:a *~]`|pXt~qrbb͢B!1kO+ȿBSR7֪lmeku ~CMee|wwbt+*\CSH9!C; -&=,K# ~Y$YTq_λ| `61et |XSCQ*Kgg ;sbQGwuuٌ){+G W OZttK?a0%>|DJ[S+iׁXC'lNֺߵ\rL`nܭ67&wjztb$H:Z*eϳ)m@.Ѝϋ`)E [PJ+G0lDgLSb;&DiX';sh*tG\fFHX͙볹"jTBE_s"7:xHzH#6k(]Ґ`a{ G+GJ {"-E3EQlaP,NTQ3z:'N-c']$0lՔynpb3Aar;w[W(ڸmD +kF'P+nEx7#hҾxu7-Aws0\92͍4e"HDW)-V ;;֔ c!ρrBf$4'x :wd44n h%XǗ7Rۚ`' Gɧjs P0zۭX±K6T-X(3G5ʽA7;U u0'Pk'0Xf#I*>["5M,zHߑ,g&Wⱷ7>k% ٗqiT~ \XfLl <t]9uRS8JXPq- jzjWծ%_2ev]}g?9l)ԓËbd؎xurI2>pl y^\(:<]H{xծqVOB*Ukd~CЎzԻ |Ĥ`jp0¸0AFVLXW/ZGg'ҍ *!'$sN G s!^ۃqR`̟\R!"? ^7פG@Zmܯ9w e e]!⵩΂n2#au(`~Tgu?Qb3 3A S+N?T"0AйIp{TAUXpMͽQ&L4 zWҿrsd}<³sB/7]#9-e.S5z&2@`$i,zתJGxT)51 @}Qc2R߀R>pQ>_(vE/P?io& ~c*O` b&xhlXclnAbOb uu=}=puNl!.VN1pbB ` Ьwa7Uҙ-ylM9g[%lG3WO "EQEs!ѳ#h?j1OkwE+ MFρ@z[!TJW`Icu!7OµdiVG8Wx9'Sw7?eaS&?Zaa@=7+7,J~%g6Ts$ 01puC;~/=!FUT}+_oDt{i]sGWd*㵊_# B ;Mcҁ {0 }8a86=ި1c.x,RX=0O eg0̠ Qm öl\bޟV#wF/iX_ܼ!E3/M۬k@G-'cMxy{1ڷ9Sqp2q#wXMm뼻AZߝ&Yşծvoc_vծ}* ;wY£ ,>2lw<:Գ7Iƕz6pJe(wH2fxKxC>0u9(Σbv]'?'ۿ(Pu`x/tsԔCe^3Dx5'$.N[ /(9T 1UGჸ4z(c$ n&{_ZS*L9j /Bf$"G Hӵn՛?"oWgSRI9 (U2ZY2V'0:3:G!)8-9DX^3B~R=\޻ʚe]y3*]ݍɲ#@bBS3-y ,mw7eQ{}qov]ĠUȜ1o~8/$n(d;)!KHdV>| R_OF9B`TDkW?3+<!ê@B(H[B= 4Zo5B]nJ{0 cm~+:3+&~_-io..@g1 `A0TA[A] >H՝{lFHg0C}rp6 R2| Em.Ji5t)6[kZ]ٺdKiDD bvE1'nQz:b̤(S=|u] X:Oj(d\K ,9pEA,"m b^?Xdd*Q? ΨUC:9Z U3|Xɗ7 %' l>FsvO跏`Fc'kJ,U_3 4PS¦7 A%Zd]|BR}[#bD Db"/W|HY !֑EAN'T#W |_Ѹ& 8ڶ5hِ@8YCS`w*#uʭrRЉ`rj4 s~R! DƧקCB_hq;oFxSWǾ ,ꤚQFiDjsz*A@.Wk|1b%9"[Y 3 m到؟'PGBxpH} \}`tq 0hV_e%Be%q{@+QX+mqaaKr}u5|@%*GW| P>DFMlZ%\Ha 3)`GC,U@9vM 3^|WX|mptw`O*ȗG_)n{er2uKWb>o0eeH:z֯B~~&36@' &u{y dbCj+ݦۺ|k C&`c^ fu 1 IDAT[#>v0CY;p$8 qnhGfa`Ni}]>o's3+ !_ad3 fs:[.js҆uׂJ\ Jii6#W7ҝG h+-e=%#@p5u3>v 7Fq:XڜT1-[r`. ՟޼ 6AE?o?s!a"kSySI!<8!]tK(!P#м=%w%i (f@U*Vs{sE(;y4&Ii =`̟pAġEpuWއǽr54;jn{d4n6x/b+$cRFOZNf1_r1b M&ƹq*fж [Mݽ+m:7f5Z|{"茼Ǚ8 lb&1.('@L@॑*%4;J#03G0" {}۱p64kl LxcdϨNY 6Lb?  U9>y8;%lc~96Sޜ۳s30lA{ %\FB'_9о GjHQ!<1'ha*XJ}9): q% @ B@c5hSdlC P|/ aM?R v:tkBT$ r| 3qJ"Y=e )aئEs!vr@#.πMe~ei)R-S)|?);gϴN-ХOR To&Ѐ1 S?-TXF䮀bQh z'<7}k_O@ݮf׾\~" |F.gm \ҚRgg3R}&29L3or{Ng F@ 0f1x;&n)jV1qxmy׾~dOދ!DthqLywa|kI3Ȇm?oIm{IEvX9xՔz,%-6w3 xz[ȗ$V%o[Rpc/(F`BŁД05{su zvją"} G^Ց.PǨNG HAd{Ӄ `q{ږ`GFг41#t$oNgafz'~]d@Ѷ2­Ŋ,zL B8l`ށt>22V=ǕAL05AI2v-lɹӟoAq7Ft,a[m8(֚2q 0> 4FtTa :zGWSsE*YO'tAq8 .*A@fBTf3 N݁by1: JH=b۠9*͖z C x-/2z. +w}P)],xQ?p24ї\%G_Ixe l eˉ!iiM '@М4ɨҧg}2vh2xTPX< 7 GƌR%o@Y5bPUa5O a*U 9HUadŜ!Pn .j?=<] ck<ҟ_yĬppgyY=J^oХ;3q]#:en @;?3@p_׾SQPWk_YZ5W5JP{3.vl,llF-I/Y1T"jECގ. y}5iuqy׾~dw`֏ꗄ \)t#ËJ,~-aOκywg{M~ۆ@y1S0\p[tusdR_|^,pGJ)3FK9oN =OP#v6OQ/y}aR I qPXҨVZy2AҹG^1'-=jԕP;TqoX 6ߗAmo8\oϯhG[}'AW!0&0ʴ|ņc(KWD%e鍗>m(~Qk}_4% j*/sE> zh=XVV e، o6 4n.W귀s/@(@%bؘ5{9@:&n}a V+N]%, W+V+ڔp}WDoAg᪶aB{]v۴=gZ!|F3NjUghBJBW'!QxET+N )B5i1aHD7d>y/ЬBMH=[Uoz^9&ch&IsMsǹgIFo"ܮ[࠽Zq$l}V5N閻[**Čh#U%T]{E \Է=2@%D}n< ;6- `3.^e]m`ޞ` K(X rڭSj :v;#Ae&L ނpQ(?neykěӗma9J3!a?0mGH ͂2\Vh>WQ/oψUذjiir6Fw(].rExLm1ﳼfm0)~{Ѫ蝀 SBm Jym6Vcr?+/b H`p A@-7>˖@[s\ts}Р*@4V)R*Q}>9 BYtZU QJIЬwU SEV yI9n,Օ>c94I]dhs4doP`q`*Q8Cipo j=1AN !E≠O (щYxs+ߺR? !x'f+vzRo;qKF84wH{ ]?;;dp@Ai@ Gv%<зW>*\4k;mП7B 傞A5-U,ls)N uG9 6T{D}k_OE}ǧ0.Hq 6`b-,&ܾ BFD_*sw}0ص \+rÿG0cGZVXp x=\w޾Yk^㓮V;uEWRA:!{B-#lЁwhZwMu;+c:(Ip~sInIMX:S$CtO2np}/;?̈́W KVt;jPC4%{j-fWu%U0Jf\hs߼ 7[>wnNٔ&muggZ<@FþdWIx! 4EpϊfIPGq",)P_F!S]‹]~/?Ǟ+JUoD|OmAD)O3Ɇt>t2lg7=ڛsXk~8''|Z༐VYuA(З :K@Aʔyĺ& sQVt=bƦ /{Q߅v>3=D]l`ƃtIm[5ߣ aծB8SpǀU{.g@r Mk K!\Fҡº8HexsIϢs]bNF3NwgڅZpPX6㷋6UlȐT_/D!zXC4l]+ fjQMqVzVm-wSvA׍wE >9-E2-N0k%]@|<3wc![j[E\(qWl_z׀C|3_?s+ir6HB;1$+\mw ⥺=8c|},uU `>[X*6'JXϜM[r^n^:?B6da"@~nلV4u@^@'ET> w+hpE: FयQFDm8;^|9SS V߿h[nι#JдM2y -9>BTif'<] psNVlDLFI`Ґ/k 2VGMʼ*仆'};WN,UHVqGUH ȓB@?tާp,>WxN kZ4ST_SB$Y#5)NRg}CHo#!ͨ|1%^H* >J |qOP'F{u˩ؘ^%\,PGVP#VPϚp\>]T_z+'ezcGk#|)3nDuuSoMEW0=qwϭv 1 :@=Oӗ:Y h #KHD9ҭ;9)|"> O`Y%t>@: z)cY1׾1{}k_KD>u־QިtpGУJ |}hlZLUuhՁPؗڒ)LWr`3Bý/z2tW/K% `o/` }k_RrSF@u`\( Y7nyvU*þ3J3~N4. WVa1-\f]q cpUb[ .ﻊwPG5ng">)EVeDbTW{ͷ!#uX0qk׮3ˣF) lsȟ&pDVm⬥~A|߳HyI*ЄjX§]ɏR)ث3!;j%h W*Wnꪐn("3TXhu$Ld>9]B  xRsI=G 0<\gh߆Fy\npϯ!:88 Ϙ2< {3ҚE^pX%ow?8ΖDQsI/ z(O'QWpU]ĉ8`0Dʣ5Cqڬ2J 媍DBi-m*dcsϫDteR jDh\W^n ti+HڝPcupQX@tu =)n_L#v =Qx$OpQnNs B[ao84t# uKj!QP,TduRiF'FRvT]N@_Ksз0_Jo㟷C=6V/QXB+v? umA{Uȏer XÞe{o(fۑқJKS{ 3@4WizL%#pQw[>64dv.4d|˅ax 5pk3ɔMi>t a9O>{f{g BkƢY 2D=sΊſRM_F17/J; Zl$ prj Π|T1S&m*33mۥ}&;߻" xAc+SGD8Q傏eJjUrM[%nJ"oCF~AgD: `kiFK /ZbkjlHyvİh\0;p߉r tNʡ )wn8&?qFs +dx,CBmyAjU "?C!ԴsƎ ✋ G"\zWhL`͝:5<qHJA(w9>5' aBn@;121W%,z*T`JovCcљ*W#2LfګWk_׾e=|py׾޼ !p}QA\T6F_ˁpgK_HnX45 %#w&H3r@vrq1D}$Wp[Q3y]*,9}b׾?Q^"jb*_V|Y}  ьzLI;K{PW;t`PIi2pF4b (R.<{k5 ~A/6[Pk&4ҥ\ڈ5Xg*rzX[*UhSez6aosK4Bi3WuSh>PJ#hʡ/n~eTt/DD ݅E և IDAT[a5#HaT]p%~X>!5ҕFW%c|;vF3{Fc%!KE7j^b<Jy@\n a]aV Lq'$ga[0^XٳcMþ\rT Sm( ~mӿ mpPbZ_( kUYoCO/PY])8Y}[lٵoAax``L$S+.Ȣv6Niv\/2,ʶ`vSMX3̦=<*9+@33@E N.@an+v|.j'Mu.^YABDACcRv\|rnAL Z^(|R [m7<|, I$Dǣbo+ TGs}k>ŃyC ,;m)68{X_x L 5>Z@7;fւ\3 YAa̿8ZnYd< ,vmM5qޡg _g U 6k'@a2 0՝ekc#g9wM|hͰvR m޶B̷+J93cHNZG,rO>owG|rd'՝ J%UN.zq@|>n VwMT=s*,y17@Fhw*y v`Кث@ȼ qmUўM`$G!Cx]UҐi&Ul ss%|nE?P`տF| oMv< ]}c -<qax{ |o$͉ ku1+MHT#p6Z_ZGF8RJkg(3 "~w7Z/pyyjl $[l;PE{_{S˯_s#"7?,lL;nFS= Niϟ||i+pN/ #Hc %sfGB-Fct$:xDA56/3zɉfp82w= }k_o?h_׾ˬo< Gty,7ڥ^\&W&͒] k]';_~Y\)xbf:]_67,2/TIV~-*ֈ`ϭ[ߋ LX J@J2"bV'46BișPPjru ]m υȈ\¹D,>58{])nLR*^ҭ\iYr~q]+AY]>tGĴB"`3oXi2S`mL?`GR+B^Ŷ,=A|\isXiDr@MN\鵀f5ϞWHؙ@Ubc{99e}쑧AMufpiAyf@U8W$#1AZHs@n׮[j e<J%q\fcWȓN0 shY=0AހNva4m+n!IdưmhAa6Ўg sGCoNT$H?Yvi5C!I)&}yP*`pZwvfBhM}TB{ۚTX')T=P> }WQ=ɡa,1FjL42tvs=}3RٿϏ97  ogJ}A: Dxm. / Q("H!A{V]!Zh[H{@ Ѣ+QFR9`U hfwpCM// I'-ݚT1wu偐!}}$9jCGR/y~'HAzGB&P&w ~PPb_'Zx+V@ ]jWQTծ~ִS׏{w>w+rKx X dyBaډEr۰ 9w+^>H!|=sڀX$٨M!-WA5+rm9jW L02Gl!F>}B`u*r9 DsuV2#rIF&5$g7uEhMHd0F_KBxp!{37ۉ,up=Ido'\94uXB=1Y4jY=S  ~F{<85j'B ns = iJP){pY5ÂD ߫+W=*$Ol O;AR2 ͼJL8NXTed3hۥTG5M!L !?;%fX(Ѡ5S8p`LU,ũ 0<&gwZK#\!(FrbL,qe'-K&2 aFogq[OEcqK2_< D%X ᡃM|)?Jq*D AKԟ:uáw.!5ԿXܮ}t.p2 w&=[ZH+ŇiD N,0Pi6-.~, 0A-NQ3cJY`*ˇ .V`1X>؉oٝ OoV 2%ImĆ M+Qgl6 4 'B>(,6P! 0 nOtj!,|N8HJq3(*DF:P*FVhEhVD %D ՗)'awy`Á{'&  xvcM#ZD36 (,˾ϯaqwk#tܘ>`q@ |zUu;s}>Na@*65HW[@zm߇_gQ]r62%1hG3\dziB0~as~-h[.Tl5M.D(\֌#:D'~b$Ĺđ6s'b!# CN.eJ!_JXP;@~Wծv;%fWn-3`~W5,{kgV¾+ӣ&Wdw8瘫1/'*!\ fmLAb2`SÎkf;.y1W!عjW͆~KdP bE5 W$1zx;vKe%Kҹ=2tj`LC >/C4R\`L3peNԭYT_ (vob> / |v2y#|a= 54`G̫>Ф5u=,g׫l 4WW93EP:[.=5,y0rq3k<3&ȗ"2I݅%ORp>6W[ miTm VQq<U5W { F|\xffF=w5c}l!ai=ِ9!}Թ<`vU\IFi?ݿ78Y7s̽;iO)Pnoxvl*`ZH 2_'7P BieGxGxv6I\[1`rZq#a~z4= h{]P#' TiKHEmu0<ԮvF 66,\b:Qb3!^hqR\PtTrfy.>a(@n\-a V": ޕ" +Lb]_3cvA@*(Ty)AIgQfgUOF0*Q戔}D(6‹f1=) 'J kw01 a:G(K!TO)c@82x=N[WFIAL|=%31\a'Pk"C2 sMAnJgl<'RD<]DH 1Fd枩1-jfj«igg&9KD( +)F> 'FDƛ9|_Vhf0#nje2A#`0#"Tfq?|0 /LOD O{2 ZgكvVFd?yC/8\JFzћɪd 6h_ 8l斪ć} pR:f v]}Z.{{QqL@Z9-,|?0hVͰ$+eΓg0O0%@FVSOG&P_%'%g~f,S#օ@< Ӿ=?T 'o>uSp yܿ֠|D }X6g.3AAUhߙ|7gԎMlٛnݘ]2:˴ ""~߂[(d8gh9h?綯ȡ状G˯ YĞY Q- l 픴$90'" zA yqe",*kcmj_y9iό&B7V},HHaod %_;<tPRn8ˣse{\i\Z"MiRyӄ ~Bdh.x_Yu  "̫-M}d ;s )D>ўqj(#IY,}M1{>BUc'Ks~()/l0=7sP*X-H"bD]@5l Y-'ːӏK],,FJLB|~{,n8gakEO >f=#8md, - M_apaN<ЬعDxqF!"n]c`68B;IO+AAk|c|`0+X w}.Y":\10DЌ:ڜ7;[H_G_@%?VK*ė\'Û#v[17Eu?ԟ  FcU)2pIG 0%x )ųs!h90)x&K>P[EFǑв!CߨA&%X4;I,dzhh ow>%O$&Lf0I['SW=-a,$(]eRM@G;H UwF1;A-aH\{;?܃+،}u3  a^۔?NPz7 #ne1\}/= T%\po ֶ8x 80 PԾׅJSnzfaG@0_#܇TUnHoZĦFN?* X'l  ydݰ8 =B[ŭW IDATi3z" jľ>}+[(G*uRi]BSbG.Ss4>1oU1EK`yb8gUe:lp+G肽w!B:w{sgCd14ߎ~t-p䒐^\3a"y7 !e$x ;ğ3?՘ rѯU^rsm3ylsgL2NOoxF@-qMN!m$MDCK #+ Ji"-Êd,*֜F\9 'W M^8[l()bDo.@6VxN(Hh͆54̰UCA7"Pb8e864仂̉ x{U:޷`aXX3!F ol݋-̍\g68gB1Vu@2 ~m}N)P8O|Kb`cwzF1B|jG&JB\\zNr1,1gNhd|L7Fg…hC&`wZuizU3;]3Bb-7$xgwGr̢fa=Ʊ( Mg 2x qז2r gVg #E]̄D2^Z!B MaJYP/(<6B %?~6b)B\G ~ khpގAlFߩV Ϻe.y!nNs2NH 3A?_?g+񶻋wb"D(BRϜYӏ} k-a&]0)!Gl6S'#WǶ5@iNhxu*Fya Ux k8J(,f'7mчQ|RnrAb]„lкEu57FϤ'Cbk(6$p!a5B3<jXnne6?BP6{ɣ)Z.*>Cu=#m2d:F?Eeq삑ӂ҇%%3tRYރ}v租.gOvu u9Jh<b|"ؠ)RPjA+](M n {AaF,u%ք B X@۾Vkk gߟg2~J}km:.8@' zOi'@ksE^`p |wZL܇B-L.p5/j}7\ sBNx\=pG1 "{hb {e`s_ߝ#_2hs(G?lyi) lm@o g= %!_~)}"7N@|\bI?{sY~s>F#!m>a|bX4w<ѐ#$yI,g,,+|Z2|Ik@@4q([R⫉NhbM3k{udP v@xYC`@džkDpAZ;@~Wծv;vvծ~u˼@Ji!`vhc#]VCnE A+6!vvce[#I0R k<'_pg kQ jppB \K/nޮvZoDcf/072P X$xRz]Kberrt xm LPA&'q t0ox#>4C'T73`M]4.GsF:Vi7r_B܄wg qs&E"\=n胮 & M̄Q#>#28LN$Rr!!kz?nl'x 7U+nm3EI+R? X]>'+n=و2sSJkn6Ǎ<7.DʻT(b O#k7@Pin8g=*F%@ -Ns}X¨ ϱ"ď3z7{58n8gؕno} XS=H'#g6S}۰X"ʂ0 I4֝xa QtsPBd-8iH!s:x~墳96ݽ,SXD>tNy5l&P}]kB5%M}]X#2@S CChwFlxFJDmu'6_y xݽDVcYdSk[/A5N`ž s\M-LԜP{Cg. "A35!(<ȑOw ծv]ή~WLe^uDMsC8 -ԯ8`ԲElruګ^X O#|6P1!2=.YhGдy:^DkMyծkk`+ۋ D(D\|# X֧^HHe0< 4J. <2'#H-jx !]ګπHPTaǴXFT5[lD#-7#= } r>A9O$EZW歫_4aap]('QW sn)/DL++NEv \)'E F~RU8g7;` Q1Tnx@ }W?v'VڒB򨂦 )u9$Bx1ж|wi{hïc cgȝ'>V I~o}%%v'WkSb:4ZVd,w ;/(~jބA^VȣoV.z\C(pVcWYq =H0-'?^? J lBΙDiG T`tǖ! R:ADrD*<+ρp >iH3s[1݀1q}q 4а,RpqVd^̵ 1۷U_[d 6{{`DH3Ӱc U{sG4{3l`Ll﯈!sra SC6f>gqJ$0IQs^yӀF=țn?MfVL~l}EI`pu@RrB* "ȁZtRu \ǧr J8uSdUU:p#M`b}{k2{j4 #r"C$%lgڅ@cXt:/svqN;5ͯA_BSW3)_12#ba# $5y`dޫn͘:*6 ebߺj''5r#N\4j5ڗ[N`.t+͑trD@>4", Hs %Q+V#?!įh o`jnPEiK 4:qG-gN>8̍)lss Ma{d=4kjWծ|+Z;S۞v]/b9{&FhHi+- yif7NW}D!?ȏn q6`=VJ( ˱[V OGB ,[ \ծGUrᭌʼn5F/}!ߙJ mTS U@(ߢ7{*+S )H_/e" u܄폭)Mlޟb7"Ӿyct9e9`` wh{1! C-QDpT;>Kz!$PJ<h;h-v*Ԍr$-n tw{3h&@X )ʉAupSl7¥&anM"Ԅ(DXc;}ns4y d|xMe`[ A[BXMp!C6VY4 pܛ.euatZ$ъ`p!~zŷ &@n0I ޝ֞A#ԡ+ӆJ1π&,6 HSc\VƟ/tTq =郪 <If ~:!d䷄͕'L3!qE؊1ae 1-3>vd~zDq ɪ`y&G XI( d[!.N %\TOFЪb{^J&@8-iQWG'jD [=cXr 'DSȢeQSS; Aڰ+%H6Ȁ=ڇ6#aǫS'p7y a$Ipû/zL,e8 Ozdj{3~ Q0f*[F23uY`Xl46bIN8Jt?ݙzԆJ٨fثuklUB|s( |EBL"s{~տ͋vFvH9IA3 #1b򛐀Wb+&0w3<,BJ>p:1M{okYvo9&EJ;")N$=N(/A%@%/q HA@Nd@- eQR$ͩꮩk9g5|yֹUM $̦ ]}={0,G #C>= }"@X(TfɴaBm|#qCS'|ã 2i}*>v/G $C1?{BqgkoدBO\ TPPG@y*!_˅xl< Zţ_.Spדbw˾7k>#JK}?{`"g 4$³d% IC)ÉD*eh&ڱiԝB~Wծvn߾>kg[]%"gWkxzC& P^F"nǪ^No\&tkMf})0, hvBX<5X5閠,祿^(w7oW՟X%$VѰupE8~>E{› mhvۄ-.[pQ0)ҮUa= ]\+Zb=cm &qx4Zk276D0=[]+W]/<lQ'Wʹ̲}ۊixy܎+"ągWtV|8b­x*R2s`i.4a` n3/X`z R$_ ufρZK,^ G dy3"ul~bagDҒ:xyzbguܽwV乡kk?2V陀,ս_Doj# ޠ5U]Aޔ;vxb3Է D{>%APnH'j @`3#͋nǕ[1W90a gteĽٍoo\=曝R$',8 IDAT yTgPYwa$k݊xnL#P( d!w[J'!Nh!1>6X~A1)Rr15-n1?NPwȋL{u&e/ /`EY]_C cuUj3C!3kߋHn37%S0]{ lszلm뀕g=( i]? ,920H9%m~ӁB waX# BI4> ZboV%Ss<:v \H@ZӪNY WҋYgs夒9X';@ Nn\K#4ġP FD30@zff} Y=0mNlΘـ%D{vu0]9͏$#ёuȤ&F)Al pqx9蒢=Etb` L[[%CKd :+hL#0,hCl/{??*6PW!0 vyLv=|t i*!}|Cr4 0|&z>{vG\I07a*i,f\9j_KzU#Y\tf '>ZsvPQR=6T#=%-8o-T\)ZkpG،XA}y>6;$ uSRZ>PHFu|*@iwswP4A13đŕ9'%xr?e d}N4 3\GgLIPĵ! c܁h٨KX|K6?K_w*K{0`ܪ0 q.}L;?PE=<ꂑ^ h]|uȱ1PޅF}7#D7kP(4S$ >ެĢp0ؿ2cN`aqBR'̐5θ=7jd */-JwxGOs,^ZzLծv?wui9<~cծv/V[0ƏPu[ ;|tF+{hٻ%1XͮĻ; ` qfFyMނ>wb22Ua/C+À< l`N]O,UMǎ\akfF={3݁x/az p5bh%܆5eR̀`/_篚2ĺ6P!6`8e`ڛѹ-0 0IQ8ED" %ݱ۪.NnTuXbeѠ\ -SBf}4 {)Yl ыTz?Q W:BjД$Kze p(Մj9=eL4& |Ƈ\E&47X{} z?|g݋&"S BM}s| ԡ1QIcq5 `mmճWoz~p&(KkHD@lP%xb1od]+R%,E/+5W-0SMaޠKk'e<:`VHAT]-H X2ړa A<=[ާMi04okbp?p]|Ñe`V&CiX2 Z#'P̃E9>4 PA:$&]V:h`Zuhu+ 6rg+y9;h5/ k< 5359⡫BL=pHG' oJ?upo-2hFDU#D\6h$ݚ~j!gjB NϪ-00P@Ho>98^/Ba@fq^/𥀽šv+ZE(K sdcهf2+f![w̨?LP{ԏ&t̢k?0AD!P:`60-%z4²R<3|.O#\.5uXIF/ UVJ k䏜0FO3S[X|uF|"as1aR%52ܩ 脼;dVjnҬ[MOئLWkH;:QQ@ev>~6l&,`A]Vr=BFJ+ؐ˴_[Ű^#dhW 璸 %-Gl*&ˎ{ 6,4T]g J(dw&n׎`2mX"`zO-TT\=1,|ϯ`#LP"h H)m)\^}LE;Oc wyI)6E'ͤ'LRf_1d֊fH 4&wų#6?}.?OofugɀLY%?p׌'~,o;Eud}PП2>2+@[- FR#҆ HPFf6c.^= (,P)aA} ~( I<&&>| `]" -53BjW35 |MBAɛ^}i#oz.4+ݮAihq뙸P([H@4½MOl J( P k'ZЗTVxqWծ^m3u+sv=.%"4_{,2c;!*(. B]W ZW3: lw`@8ƤϬ*Ċ 1~d&P$1dDsojxֹJ*47٭~2aj}#T54{3>'м?g[cf+@Q<[ro =׾esL+1ʎH֙1 w=a@ȐlT{ׂN0HJ3qZtR/: 'ώ?뙧Hq`ŭҹ+-N k@1V7?LT.Be֮Onj̬#]9u ia<M +km#35ȊlT@vvnuns Q"pV `0{wD |[+~;vN/ )~u$w9~v13VdHm@B@O)uKkpr5&1j閳KzVS[#*4AsM=hWnj2B K߬8~*'mՇ 5Xw_[(ݍ>dg@# nsGHCrX L PPkY2>类[?\1^L=%=F܃!?q 7=WY늤KBsV˯Vʀ_s''ӊ^S} GF,y/_(e4{k2# v.Er4HADm2hfqy$8wR?;ûn̴D)ZrfGw*o4? )4ZBfxTJ@~(ݏ0$f7 (1astiN%ړvaQlzt%I0l?/}~ &= z9&]_as̏L֛ pCrC~GZD+{C-9(+Q2JL{7 *(Aez8{i +8 /,V׼A4x|/Bj xJ<᜸r2F@HSJl0 {%!'Jw@Wm턷*9(oBR< 6'3>!z@,dˤ}`‘oHw(~? ≀,1$8-_ 8Hw\v.U5&k֨+G_9b#!bzTH o?bC?0B\ p0FWF bk$”Dŕ5ߪ6B ˦ϸSWVQB`r{Ed]hl%woA^ hTo/i@~jvCa4e~" ȓ`2N_hiJFIh-sKF;Iwdj^nAs0Z#x.$iJ[fSE"=:ǹs\`+%>ޣԀ##Z9gQ5Z p7N6H>w"6x7<\5ʰ!1z4 ef&g ~?5'L,!^rw$O?whNj(7Yya4Ef>WG!>حnݎaRDsʜ8/ ip78I7?3 ic-:ɡ7{ySlAk>]<a[}.tw6JCzqd2 Ɋ D9SR[02Ef a Np$"N/xuڌ"f9~́=S$861G`\Nb(F@ ZhԔ ɝ&4–RB`?S W+LۊѦ0S B.p}qjWծ\w (9^o) AU[bծ ss.Tjc>LÚZ 8 b;/x#?]fb0VxW e67&*F[pu;%;0]vo`oQ1,HaCP]uv"٣D|H| dX֡hO @> !Di35XsDIdLJS<VM!!456g;;LSp{\ӯN!tmM73 pvى Ugț҈±PwY+WQN*zkG%M`\ Y,Tsp:Hԍ ~N]BqU"7^;0->{JK`"hVspZ n /\ccqu#w\pt ]ʦ򈈠bEkkL>r:0F 6O Gklֵk\A_ICVwi&@8Txh ){C'n!pRCjA\ů V_>n~컀[3 ٶFȧ]6|;;m*HϺRznvMkqf*><ù{"#NM0l({EbsA ']0%!ydfPSwޅ OUT  [3v\^c`%N>_֩` }U'/hׅ0s؈J?A^'4'̭FľcqZ[_ow/1F>.Tss, H["A] ɐ"f4C.\= 4Fd (s4VpdX|$a/%7E}*2W \kIP^6v7nW-6ʙDW<pД %[t!r[l)ؗ+˭9Fh<hѓ/ 6Ȃ $T$D$$ƹ8TY*` IDAT#Bۅ7Na8N]Ehxkc@Nog'\m;n(L>`  ]"[5ZMAG.fڈO% x TojQ% `p0~%mb lcq mqkA'}y gj;aFO/[!1<!%:v%Ybμ@ %_ҮUi@ 3ghn(WC Һ1W-F4V W2Q |YyNAod :cԇ nuvvs%!ح{ 013e%tmq[exUzw'כ1vΧL5n)S2DdڟPq āz`$RAJܺA6>`@R QMQ bMj!* e6GC"YpdpаxπwܷmWw10%Nٜ- iyF]Z}*"}T0ۇW%w%:>Jj/<2c3XbG!閐>~6sK!"f+`/9Ȍ` LʼW, 錉b5 F1ҷ|ҵvǕt`S#"9^\LQ kNwf{@PuD+$כL[?3M!{%uztv wqSYE #߽y@}{ܜE_OO|&F0 ~*2t-ڿ0F~i ^1R'Z:gW= 9e:཭e98Qd5?[^=!҆!4hU{X, z@+ǀdHXV{4^By9'F!l3,G'GD;c2qZ`suWA} ;d{,)x4_QwxOU! prHPYv?o6 }" ?jڨ\v>rj (App];h!2` ZPG{F8%r C}nw)Z3 G oܽW\.='n͈yB!AX6tªoVd{5E Xcd#I!x`O'5*3|0:_zuծv]v)6dCʷejW&~w!x@J!}6Omп4A=7j#bV;71'ZCe-@9Wbk3165EHy;ȶ]jW_oT΃ x7𹉇$FNC&%$ЌD=8ޔz/Sp8ũ}k?ёD.FM;q% <#_Ty?~  @Hs〫BA(ٛr8t6Rr5:(pPսҌP3M}Ejn5薿8kaz"93xSj6ɧݳM&ߚ1<>;ju_oP7D%P/2 2jӧ}o1ݞ(nOp32g9?? A%l,c.Tֲb#6`&DBis݌, %2`/z{9/k#Bì _n̏6!4mc&[; V$tmׂ  AYȀă0\WWtvjkUϺ0+I>w9SPD[H3Z=nUd!]ɹt#xyV|mCK蹥7+(Dv@΅zаفs (GΪ+ TZa[F 8p@ZDon̔F;pK.)u2n&Md.B;g\3>_r&B4Xq'LA͍m>,pg VH6Pwoܥ 2 2 3$ l^S͈fy WMEjL(h25ec֯ ml$:9C)I!TWa @LBx6P } a"- ̕F=*'"VdY bv `#S;3͛ "~G5C0k %EMcGOD xGXF[(#@Uh|@Kv1B}R]P[B#(|(5Rn_G6oseZ_sWy똰iDg;:Cߏe%S1dkEƊrb̝cIWWڐ⠫Eȇ'j "f ygPKB ! 'PDt,>窢wCKC7v _c]64dژBdn1 exQKO::t D1UsYft(Dasc΂<āҲo3 P1hkm!߯%f0};fT*P7"8Ԁ{ PڻU7\/r]?p3I To.HF.(S#u}G 9- #@]@eķ%2L#JѢ7G& _=ʹ2RII>.4`c kgGm|Xɷ ! SUU ug".q+A|ծv]}ʕ+x冀~G)c|ӟG=K)"n޼WUjgwoRS`򍀕gLP,uı.@i&BP, a'2>EU//Zɔ 彊;u7l@/X)icծv֊dO}ȃ*o% D 6LdL-%J񧌯, n#rOpU Y3P0D+D M D.eBš:  v)fLq C`B2{Tg#iv(s ը`]B' G3  VS%.f)SfoiĂE}.@K!{X\NפtÀzW#M\)8f* z#͍\ 4h0BP{]A}}=߇Z$M =\לzBO\Gk9N, 21G"Ӥkgb&~]]syh b@L]fLZ;QnwņBI2+QOxē|2BUY~Ml)nNPfPCuۅcfXG].7ь4t6`. 'uZV m 8#3`kH8w 1]VMA9}B'X4J,uaQ(wguc) {f#a)V@p@N.* pd -O +J%Sj?53O"3=NpY[; Iȝ\|eRL՟+[_ aB=,fcݭ>Ro㦃 &46#JnSbn{V^@a;!A# *q.T/TpKN>[l܌*H4f >3պ n!5IXl@։F rdgd^Re|" ^i)V@5Lnøi(I _R$4dsP#jy;g05|"g0:EƠfnVۜДEl|ūxwsRIbK8i .xxB4~@4($hȰ8`6*Sqcv}tLټ9ptVE! p1H R.q%֫C^o96[X̭n ao3B`]dSg Um*t{U!I4IvM&&43I_aAthP'"c<NL' |@sَ"Zc]jWշ^|E#\9s?sȏ믿ׯ_\ vt~ [kxI)/w~?6BD {_3J ?e)fE}n]4PwjXoonep}E[8t?k',ZDkcY/HXt 2,v7oWVȈ̲~Ni?P3T9?uda΂NL2suQa^Ys~FvHf Jk no  c$O(1]Iff߮sM&c6h(hH˜W PF3'B 9Pi** %S@=NgjBQx 5í|K@U%jҘ{^Ls yWVӞPAW))3|`j$hSdk0o@+n<`؟IhuChL,pW7G KF03.6?.ɭ^aA\ATwPZmB&FR N+Ehs#Hp?ZHOk@W]],NA#D#M@[p_()<72 D&7 4{c9¸+QV>C6$%r PvdjwȂY&Bg@X*%-r,GߊTSC^j,n>33>nX^^8Aԡj(nF1GR]~B∦ƔFkY*G BZ R<2p~'eƧWZU>?!s@[rG򡞿)l-m|+eο6@"ԫ2э_O/' ߣJ>X6kvx"&V:0w|,pH]"?AM5S2r-(QAˌ*<0jL|#Ey  n݈g#3+)(Kv1דա6#5k*B(4DzEN\fR yJTC|#5Ra}g^nCk'E5X:tkYs5]<7{;#VAGs'íGIܦ.TDr25ZC\i<&zʻd%>MWx63) LM/-P&FeF .%Fwʨ; IDAT,װc̸w]jW6R> /H< B*B|rq+d72í#Z {DVCe4z֭@ ddO:•HJ@ٺ]tnޮ0 ޙz@'u ӁM896ㄔ[g3eGG:Wc f( PndM- UϢxA!蟋_Y<`{?XF@85lghTkOcaңjIa#HV?8eT=Y=_Ig{BPGOG&7جG4O:=1o*Zָ+{4rnQ ]1](Y't ΈTk )!̝ :W?@) ^E U?,ȓ XP`"J.m;H; dU@4{%PfcZ~5l1Gbl?ԋJMTçӆH-/ˊ"y\ T۰HQI`_"6f*0E%u]FCbN!}wS`q5PSw`J#)yJP`FFJTKeXjnՔd HB+B*=GZ 7R?6m;6x1Bi&tGzCT`mPkN&$]m5tF؇|W4ZbFFFWvQ%MCG:3n=7mhݝ:u001xZi]FШjeGw\5u"AFr̬[A//X]kY8'14!Me!}/lףn h6.3y|n_ğ=Jţ~~qPSmh9I#4E.B]ȞG#.T n@߭ɊjYJ^l=ѣs$a!T#1m)!+,0]$V?d)H `Iwp\0RV,'RI ެ2pG<$gߵi_7rݖ$s߹Z[ZSpx_z QP# &F.|\{QihwӒZGZ/*}h/dG ,1 ]jWշׯ_]]jW1<~To0O(t8r.2kr[@/V0$Q0n[Ӹb9BD7pfޭ^8%f1,Av(>+&fY  v|v#7$L Bc@M*,߹@xMp3d C0RܱN#c 3Ogƿ(a,xcw1L|A@3ܲKƒWkq_mՌVh$acD $PDjs9Iz(|Ŭ{b!ƾ;21An *4Ĵ ה't%e,3< 47 гۭ{ϥF_L',<@x7d>vm0#;9 u Dpա{]VŚP"^hVxx:򢁢.{ {*۠P#P=8u:ǟ: (0TڔXY` ݂"h\L7ñc58{ă;?@NmoX>NU#4 |yUؼ׎?lَ{%0|wN0e>f 7&WwծvL}'jv7~WwL=L|mB\{]l]x3[{+`Vځ~fzCx@M HmMUSgT⋣_i/ծv3@-jq`eOO/pS< 8b٬>jmhw$Ԋ(m?zRܡp-0|[&8>Pk)q[y/[t qp~&܆-S "ٔS7?{k7 K#`Vs=5Ko o[rV^L пiHͨ3P uqOO,q+EafMVi0(~tԡ˰N1u!f{ѓ+Jเ,9ŃнsKX]A>꺮tNؽ(cFɈ62a%$vPnO WA=AIJhjꄠuzϸ=kw = x:Rpԯyp6͊*#LJ}33x ( ʽd/39ܦ61/H%dKIzn[acFBr N,n5iJrWOPi'/}9PkeжC@?a35Ixq|ș<-'=m^ ]'7rᛩ9k϶{Dl.f}lTCՀB8*y5*Z<_wCr8&;BՂ y`Q_OiZ@ڀhsL=m{h?7b^ׅp WW ; CgX95`l=- l̦S ݡ+лWi2zւܙI N[K0K  'kȣŁ8B!P )ppk ޮjCip]]f~Ra, 7>oL'tt 6){_\`3:@p۾HL+JP/NPɄܵu uʨ}Ml* v@_ V:F=ga4_t4Ao-Q#GY|6uN(ۂ< O-xtNOi@ɿ}3&{3Hp5[?$%,v^0!o=1ͭ'"uˡrzYe6 Iδ +`o_\Θokdhw a߳iPߞB N̩\jkuț\G< q!{ז`qc 5>fw]jW|gDmo{{{]jW[ؼ7#ஊF{!+(8:T#\jIphs ͛ZI|uhi'VigY]+ƈ`a_.&`10gvCμ^WY6n?@I5[kR-&h+!xja _/pj3v\)or+j $D3'j8L|e}4`3hSdSmdF/ f1q 79έ]/UY-3;1{EMJقc#D~=ހ6fYӒ S)rKj? =3|nRpk@,UXLJ_To`;[3.J@ʀ) [0IXylZOqe@R%` \ dIdIl#Eb΍ᕀ!=@@#͖ȭ!P@ޱY(~L#Q\dp=79vB EP8łyK Ts?O)=ȴuv{n>9y~q-DnkD0 ˼FxsONXH l`*pͬ׷V6ƚ4Y[ úlk]~u$8<} ["< ~&*_iTߝIZ(UGp rj#F'T?CYvݩ+Z +B]`6HKh ugX,tGs {B5-/~!19xL@#p~HO̽徹IsBG|qܿ B*pHx*!gc > Nv.cG?ٷu27L u0ЉJc67[K_zhgQZf p[-EC_Ĝ:NH55n^!j @I`E67 ([]5"'*I}9'Nqc][-T%_jg ngƒ_Je7C9}%Fzr8d'hlLa?tcG >fw]jWzS9jWY zBWDJ% 9 pҘ5z^Uc= 253)3EԛwCIQOծv۷D*Pjs.{>$hbACɃJ7k60@.9SΛH ˹+[@UJ('WXXUAUHׁS5Gzr+@Ѐ{\{ߙll/Dhu]7 aNNFj+1vhYFkht.p@5=` N%Q#H ؝e'`u(?OY3  |4p pMF4#KI\ 9Ka!5gt+`HHim F ߌLA={wB^5Lz"w*|%ьhfda^m2TxqBy-eui)f믕=dxו0QhZz&L`,(z[+Zq'H!cx &\{ߕۿ+.C]l_ZMaK6f ,њZ$Ba!Q@WΔ(p `DI8^ s].Apn4731uzKRJhbX #Աz}ES8=ҕg9! m(Z)jz@ߨNqGy,= K # "Zq E%/v[睗f$ڡFCr?-a^l5 $*6\Ua:;yP/=%|W%6W;Mm)iwjn}&;BСϿi޶5]Z__ˈ^7f|ݨ!DOM\ D namŝsC/nsհt9ZxdU-j₹C/" zp'=m8wYg[՟+@*lc}4o:m{$3C]2L"9h\q'vNbxK 1Y n̮v/}K$6u^\IM5+?}JqC ̓xBx[IWmJ=.o{? pkK IDATPZ'!S$# vC< H3W(8pJrSB'hKz$ `} LiJ^'!>>bW]};) MoWo2Ί&_-8F(sLMa~@ s\h])46*?Wp՟G#K)w"EGQLٸ/We7 1;RM%U#hŮ޻XdiZ29yU޺ntUMuu#1BH#xCB7F!5H`мjaZ3 f袺:떙Uÿpsfq[DRyx̶m?9WxclLD6 {L @%V{'_]E(ona>Owu(5'CՈOuH$0qX&vn;eώP$mRBwZ 2u$  0)]xjsmr!=Ƃ{CH)Dmn$ fp#^Z (z9{P[b|K@k{es9{=ÛyHzIŷ+#Jh<;.2ؽ=̥e_'=[kDlu+uNL^qQރ %wpֵ.2,C vvugNeliHW?d/QH&G : i+W}_+כ6 ?)^h+F0t%sp'{ 3!?cƌ3 P~WU^~g̘q__-;| aiId`QWz:lD{+>L Jx(b#>_n3P Z3XPWEM[|x掛1c{- n\y˝w:x215uAƤA t Ҕ?$cOK7g*"NNJ_PYɀ50l!JDcee!ktA?px@xw3g]M, n*<YL!c6:!:v+wɮdN Sq K@UEr4c:1qdWXV,֡!(C=*pvޞIpl1%VQ@R,FL~x0A /L9{z,$WVE#(T LO"SNn;L;a2@! ui Tbo/rLe!$=G(|`+gp;H?}oEo+ fAI:Zh!k\nq]cG&wE YVq>65қ{g'xxmbAl(_hG5[c%it奀Ŏc N5rG}+tsȤc,.#f@q),ڬ'>vSG+ H7AL~(PBwbDw&HlE ۊ|ω:Bbd&tl?(bpş|B@`lMWf0NiA;FѵfBI@3u~1#$B(FsE"Lk~w3+.RTE P%x;,aIk7mA4/c@Ւ  c"V?n3ԉf^ҝ EeLR^Ƙ7{ʈ(fc2jPU⹉߁g@a#%e|H9 ܄50QuL]. 1(A$bVF`a|j}c/<IF ` } ps`%kѕ_ FAB"aN.=L!Hs)0{ P.u`S?ۺU=f4G̿mrf{٧m柺&:R J(Z@nh2BPV7@JVѫx lZ^MˉjOn1cƌw!W*y!yƌT39G[uȵ5Dargo'OtLC?HIۧ;lRJyna~m1ckfSj/\됇# z>wf'j@D:jN"f=Z}*'ao"|RJčaEY"^}/+1e_I)!v*@^S QA.8՝`ȿ\i2J%שzyQI86[6t' M˥;!,} -cؤH#ݥ=I@K_^rw#jÄz)hV'sPa%E~y 7At/U .#;6Nϳ X!A+7O%@>iIП&twTPacBTaO{d9!l>!=bY+P!{V &##õV?\B -s3f3zW"r') (:*l{S\`I@%ٲ0)nR "+}m3f\K ŜWux"%Nnn{6S /mqəhF_Qj78Pr图Sn8hPܶ\ ߬wT1.wߺ%6N9Fȇa؞"R6'Nr!Dr{bH  r\d1_?]8!{ DT2d7,wq vZbt"jԂ fqw &x63Sg{(hSZ^F}`Aސ o-HP8QuE%^=+}YȍNjF-KT zFc+Uҡ n[o8C>zc\we/O YNc!<HaXOOw{'Dm󥉶,8}DLy43=LOeɂ^XS^k4|#|22kj6XIW}A&4J2`=n?,*q҂M7uߴ~@J2!=(JO"Bh[+f' BZџ ߣQm*צ\^+nM%?**Y+AEPk{{*J^9"U|Ja{yH͘1cƌO?NB@]&W~_;ƌ/;;y~;o nTy!%(O׍D F Z*KHgrlC9ϝ7cƌwśoIJ4U ez pvSmrTh0:%׫K <l=ˉ[xY?34u3< ^{:CR*@/$P(xtRT2mZA Cv6R] $&\I014yXo#wt|bB M^v.i^$ϖn'tdd8>GJzyJ !ǀ$Qr|Gn)Jz M|8[_ ui[V6bIbU01D&#>.K7Ƶ;m 9  mEMJL"[՗`'՟Fػ10V@ W.b3f̘1cG)!1c}~}"b ؔuU!C_&]y;l#̄1|tg! p9ڷߠW uS~fG@G#}`t*# 9d+][Nodm1u`@M|[ywifwN!bMP'}@/4R  'nk8k##oBc C+ D" vkU LS`BPô+,pal Z%eGzҵX=NSʜ?TE`xq$k[Y $ VVMq20r!<ѯLXvd"`JnxIVlNK~ =#]^8n^J$1R/yM E|I\!7nֈlݮybwp<&TP3`f n#b XiH K8G$|s0A0$D5*":(GdI\ogwmD?_]GorWX.3;f^}מB~ƌ3fx|#rB3f… 9R ;Dt 0U'A5QT ۠[ ' 薰;Q%Dùf̘xWRɱ՝=T4'[UyeWr(i4{)BtZ23X_9F#(y{!C ACz|P]7NiL5r5=!dLA\\[)) e;~ X='+stt&ۅp ]cuA]+UuJ=YZE EF̈́[د'?x)bP=[tƀދ ać.} ldlyPdg>󘘻(9KHmyc RBK87 f(0hdv5A*`#C%:+%m|B81-` HF_+t֑>WM0x~}`j7L=a]BbfO}51{y=6%ے 6nlH;REQP }Ax!bv-&pvUO֮-^JT)ok@|X{F?BpU$(Ghn$bm#*y?'$k0V@&X5xb6s61˿SUόhu 8b.1f_>ۣΠB MoJ)\a?R6޶&m3{>2U&Ph>= / o 6?\F~Z98XMF@@G>i Wʉ?n1H.)9{k I%RR4XO4B[7I1HUiVUB~ƌ3f;`ۑ2`bf|_3f̸o/~vsv{aJ|0> OjDWo_JD|:r3l*f&J2?fƷFj*p1@l<`Iʼnv*j}%:Wpt Ї  Nn~PѡeşXISȫI#hqoC[_hnF%%CN2! ,1H7D@>=nMlL' tmkgUܷ̐= Јꏣ X=ӆu:#bnh͊*H\_GlbA!ìRބHб$ {GVPW+u3% <+ 54wt@M24RlG`0F|o.^Vac ['Bk.i;y[ρ, U+g AkgX<#+ SbRRex,@żdRmx@z!:~] {X鮀0:B 33 Dz8XXA4v/O ޲1Loik>;) z_*pxs %1cH05x~E#W!Jn+9ŠM1T0eyi"Շ Rɢd*Y 3f̘1;! GuGog̘1~<d6sוD-tO`2e`^?%;0թּ6|Cc^ p)q8vlM&4Cc'*`NJPLP;`?=У %%]P%xD/ Hƥ &an_^+<Bם\O+Ջf?TthT o`E";a1MN@韫L9DdȘnVx ңP:&  vJ Ԙ R;(͏ =EN,Vmm@0Q*v1m>Im2FЀB/t\$Cb$7ԝ;1pͿs=WMG]g2) E:Apg$K;jI"7q=LgqRjad u1tDkM ) $  A7Us΄3f̸+Oɏڨck_<f̘q_ֺ+Ȳ3$+euO!p*I%@9Wazr^{n kRMe#>~zngWofݹf̘xwsD~y݆FQkb*l]: XfPj θf.TH e(kPgW5k>GJ': 8śU2}.2ysG=30tqiH,tup#kFB0aT )BZ3B!(hV\Mmce|OVϬz6ޞmы;U&@gJ>=Kl}bldDC4ZRCKh-wGĽ@/p3x#u蓙kW2KА]uWp _+es]ढǠ[a%jG +0~H[@pn"%aRvMDPeJ++5l!!pL<̤1m Sx '_U¢mr*JXjQș[}'hR[L8z3=5a8QX|JC%}Wɯ*3HOXzjSٚhޅ>G^}0ng#Cy'E'`:L}q;VJ\`ꎨ,#L XT>'l+.LB*Ɔ#oݔwkim2zK֧H`Bۗ}ħxM`B ; Ir2I`hT016 ۴QY@x);j1Fn v3f̘駟-A}?`Kl3f̘q?aKoڷb_ہPuJT+ %pmS c䎮,_|Źf̘3xm;-vOI>" =\彶wݪ0۳i6:!Gwkxk/ L9a7ĕ9JGnV\ mC(Ԋ0A`SR\ɹq9Q#78 L b~LŶv6c)ćю᠇+evTYp'@.Uvg|ON~8?B?}<*1 %x ҝKHФ (p@- &;6y;ht|9\b$ȈvnQ~]3N8y{y澢bR{Ǒ (tDܐs   2ucpi Pp%HNvNv@F԰bB6 w<ǔp 犽z`#hn?l oBDzfE۱:[dPZ7]LA '@ MQvW%Dr;DSrn_caئU0CuζʧOg x) D "yJ]ˡ9Ju~Q);&n@""M63ŧXj% *Z 6Nnl]\ b< T<9Q.(ܩ_Ig1g Eǁ" BDwT=ׇ~AlaF!/D(4i;V-iO`ExQ m}Ϸ)j@_(g #R3,8>B6t l \ ϢA1O1qW /EzԼ՟@ͮ&O{)۴ҁ<"lOφA?ˡ@؞H13f̸k/ş0+W̝?cƌ <Ȏ:뎒RjC B #zC N^Đ W{oUlMP$Qe:xq3f܂:3@gU 3g}v̽vgw$zR!c@*D> Է+A)A~A\ۑ)ؿoQ4{0'Ltg9j:Ga;HЇɈ^ CJe%FPK`ZS7qTjpSCw-=UK`3 _2x8Z ?Z1$pOj[ݭú { (6g&Ũ3UtGޙL.7lUK95o>$ zKacp8/%ΕŸnwtYk%Lы56ם򴘇~TW${jA|r ]kJ][S cit+R:X|Q%HjN$U`XFs{p9W@ڰ:v sL, D/b \, +yȨ ("fޏ& `.Tl߶ީ1Hp T"r'x< )/R+pk u`jPLq!n"h|y2ZE a?`lEQCłxLuv0  s~ѵ!5xg;D4-득~WB1pĶ8vwC9kiP:;dc+z0.;_?fs #o6̰TG3 ~sYZa; `3OE{sx=x)_4[ f|c3f̘1cǍ-!#3#}3fW_g J))+ ۃ0ǭ&E tm ]Y *TZIzOl-1B?y3f̸7nqqMtFp<4R<&ﬧxv&[uN) {0<]p1E,lo{@5bDHXC+x B:\ &ֱ)SHpS{ >+/VA]qW^k N؜UBʝL45*-dz!4eAd5"E>gZ*.>{_ :E Tw<}k-ѹZ5H hfU5JYW1=Om~Q=V[w?\^¤l+?yVd^wTe_D4LVGs׋;-f'?!x.%! >u!k]3NN@/k!. N h> kVз5$@RzG XB|Xg:x&`{ݛʍ7y$=_1KPz_]lkP7z0!&> #ON>Q~8xvl"DR,I, >+ _LvtsborgmПx.@˭@:'iC?]]XJ88{ W}K?>(*FANS4ދ qJ`ԡG`Lxs9})/GSsZ%g6޻'3BE CRbk'#zfa/z#utݭ:lˤ#Y$$Wy콖k{ QjD|%fFqٛ@d6vF*A![^dZ+fƷ͘1^xmױ;r pՖY["0]8:Ξ+JևkCY +/?9y+|o SYi1 I/oM$AI :Pj:dY~_ σD;8[$f:›ow \;Av;r"d%gik=YK jF}`aX-8:W:W;`#"@tN;pDe's{;4vf5KuENoBV)[B>9(/ MmGZH#p(`8<[ჲFqxQ_zKFy[J7@?F% ZGp,tA|1i޺X<VB<vSCÅ{@>&a+wޣ$2!Jץ k7:Ye<Ԩ+=K,a?+ \Ěn:G;g xj[U-F!L ĀJkS7ANK߃O^-T0jt < >TGJ48Iw,OA}vğ{! A9Glo1{;3f̘1^9$w 2k]Qk_1cƃqjB!NV kh䧡p6PRL'Q 9z3ۮI7͘1cW_}?ρ'&%qȷ~ߞq7 焑UMdywp.= 7gp UJ=Ss29~}Ԯ57H]~t=K_6jycbfa[p_#}.R!m6?<)-/@` nu3Az.WEwCqGI۷P)p ,,у;^™"D97Q&'BOUwJ(G)#rD.Xy W+ǖ(BuPZF7RY=[wFyp?hc{O^^vCO22ZLnfpSnзaEjq?uH!i;A7 yƛ(_HF9N 6su|{-[8~ -K>.R4G>[#f2=>S=wҮa٪HkבH$V:*u pJWA~>ρ_Y=bkO42CrG& ;.A?|CN#I-P[=#hQx:8t .-}0D3%9'| ~.F ,Z+b8 {I,[?չYkl: )#O <e1R.|w!>2 BDۭm)ahBSX?H I*WM=ҷ v x_+܊:i}c6s!r-$b=ڜ6/4ׂh|hC=𬢏ѴM{$!L:_@ڭ5=<9ek83=+|g̘1c=˗/dȟL?3|c)|Po$\B}+G:jA,SXPA.%N8cKE7aƌv?wW ͞=ӑ Bm{XZ9$NG[X8M9C ysgt d傒#,>'K[uAUw#4{mFS`& wh5lGǎOF [IO& U4(e8!'P;An8]Gv+ oIW &#dF)baH =ZNȸdhV.۰B3fnuM!_+|?^n/ M-q_ݐd[váQjyd 7yJ尴q[b9ycɟr+1ߟl& :R[[8Ѭq ~0<:Pڜjn `\ n#T`_&ee{)xjYR09 9^( fO`^R=}zxWH6ː7zfHea#zk*S8>S聹/LVg }کmx/É<296(p|o_6' xh^uHUy`"~vW##C# K_Y V^}By,[iݓ G|Ç`aaxtE͢(gHa<'Rb)ZS8$W75llY \SY&ё0`I*cn=9j QItĶBi5vWt\4tx[K2 ,+,Cs&X0E˄n*sw>RY%n]sQX_qA< q_ez 8ݳtcݾP'X'+Ywп_RuJya~A!!v_h ]o+E)(_U6F3 9>wq \- |J&ԷZ+.3ηK:E=>nG*lt*S ~ƾ #I8=&r52k߇j1cƌ3f>')%ߪ$*f6 Ϙ1{(zB+V8PC 8-l0o/>?3f} AUk"q%5{ ;5{`GҊ4GDr{vB-]7m-n'Uː*M% '5Zt&l:=ȲUzԈUJu. "8'T%rH`V`])qDC!֌rwDҩ[J@sBz({=Lq fu%A!yl{eR!62]wEFM_vwg ?NX>#J ;p1dzwch^X[ M^iнȦv:)hXϥ0 y2+Ok*c)1=:>|@KTP\#|jA 8}s}Kn[+ d$h5ߟDBiuD!rJqx۾xg* ǎtIO.Hk c=%}svKRhT{3O~)O8O`tEVDo) g~ wOwavx5&i\/l6cM#1%j^+CƄUfЅcIR ϭ#IǺNr hi_!`[~ 3f̘qOC?я>s:n~3fx[ NjZ*t<0t(WCM6=x{WWÛ1c/¶7~&:]܈҈ hvRԞPtl 'pn|7~FB wmP1@1+0>k p5AFZ odDz t}`^#ѰhݥO>`{~8;2tK65gGWP{:mo?^Mq8];nDžvd4:d&+i/!UK1$ ]ےhl]P t˥CpmoA1!G@Lnl *"mX&ah6MWz񠰮dhXa׊Kzl^ H^2xB- !tUVÊ9c+Nlw#gVCWd@MNQMHTaGlٍiFߍ*h'pqRֆHIu` s=j{/x f:$ ɐ5H;6>Ezd#By|g;c`n݊[ܢe Waǂ+P hź/g/C{+c_m?kro,!@ѐ RB1PI-X,{d5ԃ(]٪$[L]6+H}(ij"AŸ_4oo zǏ q1v$q7|Dkl ?g P@߂ԓ]㉀.J>Vj&T[|#z lXY )T(=C;| >Tn~!ELj|Qn?vSXxrF`0٨ njw􀪀^BΠ<(5y4OnpuA>ʶ3+< ~5\Ff3!?cƌ3)cñҞ/@׾S5,EQ!-ȅ&iw?Rw qTYl2&{kHcG4ysCHs%j.ݷkt hXoX5-T OxZA9)*ԾK㽑*GQ ջDƸ mϱvCAY]:G ]is[>mF}.ak~[/Ҽr#q_WۤyƈzC8@Ĺ4[AUQg{ 5Ҷm?b:AR' EƗxM9D@qԅ;!IȞ)q- `Ne41GWuVRZ:'-¥w1Y[. pv}}B6(adcE{cį[4!]% I VQ L& Gg\n{zъ7u:a0`pDFS4xW1<̘1cƌ{ ۿdCXO70cƌ?3DX$ zs M:pm:3bWK|ߟfx|*z2Y;Pp=w޳ezSЪom-5ĉVS8u%ϐ m;[ NT4r LqP'XZy$tX+ @_AEevRvQ\#lcSmݹ JRm^!ӵ"ΜaJP &C4/hdǠk*Lص{ K}<Ӧî=L?FŨ%ǎ ~n5(=Fϸm= aOV ]@WSoP JIc2d\QS!C*Џ0@zMY,5 "Qn jf*( z&7jÚ z6 )m^](F H%q7/FZm&"M\AϔqgfO4vDWo c9m89ZRACבi&l/CXMSI6;9xRPc%!UݑvCAٰΚ>Hܶ Zc):ozZ翏4ExʣN}c2;5؞$a*\aP/;\9NXְh=儧rCcKeܷ9M#, iq(US5(9c(ط=  O+9ID YKKJ+\nFD@V5?5l'tPT2u,#M)z_M=]gX6DIx,^RILjirK )<w~{[Ҥ9/۾amcS]BzX'z/Sw=wɚŬ1cƌ>OE"`/<f̘K_t]8^8o {ۡ#WuqO9?3pٟVa*[ D;_Aƶx#mpm֚lz [cnr)Oکxo;Rk,@;AF'4ќ2i t?og𳰀71`3gͲx"]+xS. F"k'>!t-㦡ص(Z.:+TpT.1Ԕ*<$1I&.=_>+\2O@S>Qg[]qkϹ$=}P+ <s:0=;կ~u3fxO}o~x/uԄd^%*; \Hڌ"T,u+;G4?3p|_ݒ9gJ PĻS໐^n;Oo6lŤP׍2:h!wB&Ҧ}u{oIxIJfE^BCU$mb,!TԽ_u `-T}u T8 87^行A4ٷ$Y(i%õx N/R :!G`/ )Bkc,wˉQ5NΑԈ$;?nr|;V\ n1h68,_)1DPS yk,mb=8weV{C|&/`&g̘1c=/}KAWɟ' ׾y̘1Eocfj4*U'csu4H],&I=ȵS_A1Ɣ?El ިt?[PX93w;/ j#7@(c*pT99;3^h㦠¡۝p5_>Y[p!Ń9c&Z3A%8ER"ȨLϔ)C t85ωp</kmxЅ\ g}]GXlށh@],;C>dT9ik 9zh tIxw{&(>X IDAT rmIW%Vx[uT.qWW  XZ+gp ф?tD*tt m.]jf,8@)>"5I0I89y?Q+5NYCs+J报h, _Xֿh)))k4\iS;R\䭑]o#Xֽœ!?cƌ39<3HA19^xy2cƌYXnDWNIז] Ï/?)M,qývKs1ƿ?O2JrflYUz %GFI^7M;Z+;&0{:z1~bOU조CNBF} BӕSY.x#]&'G '=d$#k^D`+pʆ%U/H1JÓ6B(2>&ԯ]H!H|K+ _q.r3Q6dﶄӟt0@@$\ 6ԕlϮ.u,%2w8y1B5ovhzBݮa\&EU#S YXayOarl@`KSN#.'G7u1|nd|#&9< I tn -O}C2Mv>]Iy8@ooYC ;; ?Sz۰%vd%OM޾=|۰S6GɉC|ZQ/Ba_[&߈!h/G g+V9ŠrurN7 rNؐ41mr؈C]=dXֱUu@tbƭ?3~n$Nfx$-VX,klhș5@ m^QZ6 e>bA)xr<7 yAP JꆟP[.;ulJ~QIНt^!ٚV%aaK*t֓UdĎ }q ȱ!lV`(ښ'tE8A\E:^x4=б= *K ay_GAOaF5mLK|rO0ʗJ҂J#q:rgG/pb}g rxA迮pXTz'>2lۓ R%l5. yVZ3(<`1 Ҟsl`8*g"f7j̳Na=)'i"T*^kƿ?,+óY@4ai_lD1\bmO_!߉(ic][D\q]ayJnڪLk2b5mVnttM*sz< ~űg > z{M3_x3;f^=+g̘1c=KoRO]etGf__`ƌ >l 'z_TXe JƾR (9h|e~3fѭ; AʍDm|OK BcZq, A[^k?ᷭL uꮈsSޑø"[ANJ:ls2,Pa n軦6 fgF*w5HBlD $'3s8R8tXTt# &× z8h^ XG"[u␫F U* ł (v} eSW8V"[ñK}&]4 A\喩=TNNn*+䷧{eS`͏Gẗ,٬+Uu6؄+* ErKC%eP:;#;9^]R3vr޹[;:|nc߁*c A^bP:_HIy?Y{o5K] 'hIXJ(4/pG& 6gG՘&v NDjH+V{R3q y@F??oDlC:jyenq5>dA/%Np=+YVwn%Z&}DN" ^D1|X/eTI5o a}dQ VG^q`kAZ\{!"""ݍ ]x&[IH?^v.>ܟL4R~bȞ[& ʲ ~x.`%!VXuԣ6O'a^B`5Ʊ8U+2l2%80Z?JmǸN :] HUi䰻a>ks1'zdOVk$z%Hܢ+̡}+u3TB/&hncg{iӨ1N6hy띒NDrnӒԦ ={ @H԰vX*Nj6=eAm=졗>u]0lԇ1f?kD} UVJ^QGBM KBgXgH!|jU˃O]1X.!]嫑yOttҭ5RT2N9`{^˲7Ɯk%"N32i;J4c[<o{\c57 >}6CΉ ı3bL^Mev[[:ooxAtKqH9Ӗ+2Y|v+͜T^ns_s̑<zE8wB " B =9r)5? F,맚jzlTyńE>_4jG>o}Jy3S8_gPt}vҀ/H'Vp:QGE]`OlC ;'3(.؁Sn7ȡKx'p{kܱY 9p`;^ڌ,3ʎ&9 towλWN6g`OGޣu`4B>Nw"9{\{.>n9 0y`5]O?Axo计du%,/(r8ͪFقz {3\׆x{=_k՞Y B5إlHx\]2<6`{\Hfq iV)ĉ$; ;4P[D-dݛXI 1*2װ<=C}eЊ! 2r6LVO.l?2mdɫ=X61'] [X5H#E#N{^|%Ea#)0o6P X`JxWfe}qF5B߮A`₤aҾQ6<^;%c׃p yg@_qpmx!h9y]yRGK>euJD].^I q~Ű?noF{7;c1sL`G[+fE k6 mBJ}-lA]Ԡ \#lV8]{\K̂AO*Y&V奢0,H>)s$ۆF //9Ƙ[2OL`1ǮV@1/ܭ1sl ר8>~Ppc $!ŮN8 ݰzz.՘3i֟ 9na:)䧚jzG?W01|hǥf!)ҀZ sԖ@jnīȪL *d|GE d;̞yH?f|Ynj0],L/cB6*sB (P9q;<# =#2XQlmT^0ec%A(+,c.GMl@80&DخY:P=Ğ{%']TBy5h!/ J`u=g'sEH5a^]Uf[?k,7}e 1*sqLic }6 ܞn@IAQ)mL5 ǵ4;"ͱ`;f5cKk (”HW'utTAj_T .nwG ޔڧEt {Gq=9Bv!v]tDԱD/N5zEL0i[aaY jQ1$LAmHLgr3ƽ1s=_(p#5>ǶKpW!CAyh8ުM'V53$Ee59F(l9rXem,@uz3йV#Eul ڔ_'D\3kl) qK"(6#%p< ]`LYPY^11,dJ\]J}/@LNr7@n1k׹punt|Z G-)'J-1l$HqR Gj4^G0OJ%Mkk7˜a6CpY;L-J׾T(XT')U g:` !\IA+dv}ZtE17@qkf\ ,A[8~p ]RF=g_֜Nºv&@~jeO??`7kQ⍜pVc_`SM5գǔ)YDvd*B҈!w^usλTS=g_gx W N!N1lpbj+OֲRE\; ZmEޙG+Ip㈐Dg۪\GoDl]cPڼFnc>%2|CْPugjX*@.wɔgxxp00zaqcUi@~E;pP VsCh|0ЏPAN/;ŚFSY5hyʽ6P-TG3 R!w E7J& 8?nsfV'.'@:m5[SKw$wׄt&QkAnwpU GCQ )@gO-6/q•C Hjk% |jǽg 69Bɉ\2952:VkfA,=Umx6dt:F+Xaѿ'>kȏ PE7Dy?%^!* ہy)%\cct 04ɭKXsƐ%P ''}&HO_,J5"dޯmRWkKpY;AC;YDb;Bm;rX,8)CƉBdž=yk|JPTNݯ9IP OQk}@՟_| _TSM؏/})=d]&"r8"g?ٯ7TB}S!2KB>2|ŏ֖0K#6M:CޫUҵw@GæX>=\Wp57m*v걸kTy/<ԫ ;> 3䪤=;c..\H + H uAmf|2xLO~Bhdʯϋ|K#<3RȤ./=1oq=CK|D,x=Y\oo!r4ݎޢv-"/&$X5fw^pI72FȐI(d#m{zN![1CA(kM*A`J[)zR(c}(O5TSMŦ^\__ꑨ___b|s(a* Gomԧ>5zW勗ׅ=vx?º@3pGK3o/lgQ~#38k= Fn{ xY`(>Y+ L|Q= cGK|8eߙY9}+PN{}GNaI2B}H0 ,FH=Gn.8\2x_ o0<,7`CnHAilݩu8 ^+0*B5z~0*#)c wJPhDw2] ԝBGrTq0:B26dlD3&%MSɸH .E+0j"fQi>?EeK Tp#g+[}G}c,@Gn1auv;Ǟz|!}*_9X8dtglY\2%C;ژ  , }.P`F&cȇ&ϥ ~O5TSM~izxxUA0TS=2||μg>۷LN5[Z^\[ bqhH+SPPȫC<ֲ bᙫS͠.(Λi%h Xf݇6aIKGPD:'pαa_|lxz l;w\=9 զ5k#l ŭ+ ەG5 遲mBƬلorVͤg{%\tQTP(T*~UdLb`.%ꐛ~f%[`H~҂KiPg|nNzl\WqUV^0.Yv ji}p ƿNSIh~{(w]eY8XȐ&v WH~axD.$ ~wūQGG#j>;R>-*Vd$\w\@ ׸O 5E}{")kY8DaBToo<)U,|@f`VVn>S8 rh_{PS^[wXD/±k7u zVW,YN}4[a ʞs5o ҥp$:rzz=oy.Ҋ_Pxџ.}(+yMTSM5ToG??_O4jG>򑏈*DRNV?O&zcsE"$@C,+p3[2%1)eu!ز@ bi6h'仱]vGuhs:< K0c "CED][|[(rݩz9Pp95voJ}ByRf(2!ԙDQNS ȷLg` RsCQ p6wZJMYOf[D#wۊQ9ui2ؚAQ 1iQ&A\~C|[-˂H_pRPfHٰT6  ~"7AȄ !]+2wnT -:fap~K(g=/aI 9 u|G亷!M'@$Hߞ#[.{]zUbGp$;>[ppv "9Ogכ26ǺIC繮Cc8qh,9֜2+\?رEYE;Jc Ak*USg#㰨0SL$"bR|elJ͆"@ZۯV2&\eW]5$&4PC=SF}W{+6w&rۑ/;~#6#x[Ny؏3u]9-yt^0z!rlh :Ƚ¶~mk+_ԿuySlWp㈐-B)xX FZ99򯷒il::iCY;CwA3Wxő{;8<k& $W֚CS'56W{TY,@ @ prl5G~лqdpPC<$S.׎6I'_O-%;SH~{u:U.8Jʢf!?Z=R]:rhP⚵]>rm|l׵k_0qMjo}nBV> Vtz\Qb6@ #Wuf]]ZzBO$M~#qR_߆%ȋPK; `/zOg@Wt%{p(s>=¯:+A\&2 \u*d`Kc\Z\tAg@2Mzpi{Lv\oK}ٳQs8RQ%.'?gZp# Di~J||>~ȏ)HETo Ro^ WAiDsq6#!ciKYaLNj JG:ʭ)b6nJٸ* ö4^kP]oC h r؃h܃_EsZ7$a< A:rDIk vcjrV98O5TSM~H)=? O~rSM5#SSU7)}3 >iIiz_;~c;ǷBʖc[/%$4;Pd"~OpСs/:F1G. :ut57lWaA Pî9\U+ p߁?rvfmï:<\&fLZeXvd k{AȽ[f4Ϥި `)nM @?:ހG :-n@@+P*~;rӹCC0ù=q&s)}w^^T86ؗ9tO- ~d`*ހr;Ԁx ~[jFf%QeFxI-S`@ްV˖??.xRj6ඟO|]h |dm!zh57p?9~MwAJ&ߨu׋kUk A,^IoKs`J:Lp8è_\'fąLִzPPc9s7?_1hl7{]mW|PC=i>JvX6phȱ]ѿ$AYcզꗰQz?zGaglV!;Հ~)'8f=*ԯ9`%辟V)l{Mm$M5:X:Q^^i19 vkXC÷R\5t7y)$/wA^СR'ThHoxj2߇~ܔjYSi9kc* F\FA#~$H{m,[5rg`SH$y*P ,!:ꤐ3@-׀ i'Sa\@ &e rl]f~DVx)b;Bn2EIȮ;ĥXoEնP8<.QT i'c@-pifar./T}&ԹA~{൑Gj޶}LDO%O!{4jG~|?Om0l}RO5YPql=Wl^)MAێ-9vaexdτ#٠{UB~);LSϝ5[;a^ oFuEHc}B|;kE%HeC+w diH %3E {^c2PF88 c.%VF ;0ʑ*ݩFX/OlJmU kk⇊`.I :'GB-/3p@-9`QӸ{%_a? ]W:C)U3#.[ m;"9)ԛ&w vC_(_y+Dd^ d)kPm zwqDrW!mNw_ o-k%WaMQNѰ^EANX0X0O ٿ(ݪc!1_ 6Wp4&(#p$sy+V<# _|2<8&Ш2&񋶟K`阅“uIl;EqE.;w[ +")BOY݈. ީc Ʋ>w-Gtc[)?3*b2O 8u5.^="ǎ^zOe=B}jˌw8a#Ckd!1FRQX&0ҴǸqIDO͍O]c{SS_&H w y4!S]@Mѥ*vsQWΘ[`W,#;F82B?SdaUE`~sd.K~‘*+vAR #/+ ,/@z2[c p}s < b:8y.'--r 0$$[p=<&@~ju*QƧ? ;'>iL5TLow@^Dҝ;w'>k6-'M5CT{viTD P%mIn:XL[2:~XYsvbp׀- _&Y/=%́}ʈWX2X,C H.E4퀬 i3`E#>$𗹒{fmǯv۞a{XI_UG77 EJAN*`"`h=p F40,qqr1I&Ie]K6u))M>TVkWiH">]]oRs㊽쩸CQ:^8(J1DC6-sZ-8fLdQsZEGw(.K_ACa KAt|/(ߩ6Nf̟[F7/h"iy\e n|:94c[+j+6CA Bv"V95(տ`WzwK-vɓ|T_~WA#R!:%Xl0K묢sc+lKXc0؀ U)?r)vwMhMDXx-GShn|1g۹PH;7 z;y4N@sqxS%;yk F`{t>چZ̧<篓-CBS4D7*TGt(Iȩk4ZZlo7⨯M,2~- مx A4Я#?[T1X 8,8 kZЙbgyLn@$t$8w q6YfcUEcܺlXff 6*|Q'^[!{r=N;xMЯv&"eQ hTW`&!Ymלr`wG؃ NMXql ZCFbq:1_^lؔdRaloH}@+', a{ BLGh3JC%| k;8Y9V`|V`$chkU`a S]h6u"SΛaZh`d gĥWҹ@bXi F4yA:wU ƄU(Ȝy1n-eBRe+!zY{K/dv`2!T9?EB lC`IY PoBah[muA/r('M'5@B4#&3QB!- 971+FӒ(˴xoNa9{n]7k-ݸH.J0F1!95f ˊ}]K ~ ^町53pAV=/NpTp &ky,  3e*#6ډ=">k0*TAM1 YeFh'RyZZv]jW?O}J}x嗷`\Po@ծvyxs`]v ,7Ql#OV<(!4X2*mL;6kRkۿ_rD]_ i;t՘ifOA|ЊQ/ NH+'͵H5ǂa"BXRy#5 o(9ŃtiU 2&u*J!+qh5V)Lk#6XX6* `)zEJ\[(e,R;(;픴9wsXdxC{4jP+cf2o7'Ӌ@` | yb`N[.}ZBoA.w||eLJʺVighi+_Tw ɱ f@Oor  T2Nt kg<+,FL:yUŋi/?x8뎭:8WI-"ۍnEW@֙GZ Q2~YH}ɘ=#l6%"sO[ rfXC=.4Op[Np-XL v~T;SrR}ۛ|1>"3+':|뺑s~lM%6k{`euJ 1׽}ASUjXI##"a&q * 05Q/kiހr/iSǗI馲hP"nF'V}*]d/:-Jc,CTÁX̹7"{߿jWծ~ӟ4/} ~ؕ"vL/"_AX3cNg6 d#)w#3b%Y6@DՕ Ugq6V˒ծ'֭?g3m,T9]LvZf\VOPJe>-x/5d rH"xox`tx2-vBy}q;Ј XPcLE 0l/ RFf2ۃKAB̃2+%%[zpz%ұ+h'iw< [S#{zհ}(<0SW{aW;@_Fo=Ň B lJ>rɨ@ JS^n;X;E2#h'd3ҍ:Bʪ $-P#[4tVF-qk,ܖۂgv`Dl|PJ+ _R**>WUZ!U;nH+~SiS*W?)Ft v7?/.l!] 7g@K޳i{HS 0hv\KCjs /P1:b ` . Ǽcy] k#pT;A@{#uN9fnQmv/{A=Tc #Du~t W)6tI42Z`]$Eux%~!@&E-)d1twU~CtfL gS fsZ M'.9Ec` ZXه7U+Jۆ>\ wqK^ky%ͫsچ}Ij JvPZ[^l'SU;odLZ·-WhM6_X[{8{pf922uWi97IHqc>HҗqQFyҮqjpdh(qM9rR"  }^}xzg5Mo}%@gyfsB*ȬCw{xl <9"sEZ2$?K:cujWծ~~?BXη-(>ծ}n _S} il]"܁cɇj9(`[@"U=X!/b<39{Wzן^w\My5ͼ[\}̹]m; Lȉf]^Zc, 6 D˘!i]n$ s"DZbP5'ӱ 'y |`ٌ.$7k ?yPyP 6oÁA!\(s"{GR?]> &IQ!&σM KE?9`TJ@ cݨt ԏ )OtUq6Y~KW$HIRiX7Of41^ c$s@0&λ}FTv$rx *2Q8W(-1XZ(bV,6KAn8ɵyqg-~8p(]zgF[g{mۡó<\_7\(yeZ"S@+\KobTǏI%]q79r!d;6.x%L'8W*˗m얄 } <8< FO#MѺTs,RMsSN4@v[i0xMA p֖B\cl$AܕkUYkܝіi"8OBx 3}Af%_2q.WX;~s J78p9ꯁDwh.{5zla 3zVK74(^Qh1!ToTN%ܬp+n^f $}\H=GƦKau>  đ7%u{8rQӮ^/L79%/XJγUF"p9?N*uwYB@{RE_ilVо. .5N|55 |e<_7J~FpDxxM"#uEn\މ3x?ulA;4"uDf#lɅ2lCq>YyaHI"PQ+o s!p*A\[Vؙ\.wB' L/d- ucY){5:M  נLJ{(0|.{6RO h27"T{_w]jW?OYU}bN])yj{ծ>S?SSOūڛ~JwYbߠj'5&} ~o;vMEn e-,tɅc.~7~cw!wxo&DdF9:U"M!>CAA*SJ|nvOt9NhU;FlJfGKȗ!j{xyže=G"pkE^TJ(Sd m+Imi#{-wyK?ԁxioAybq" D%mأ'I4Ee81떿W耆@zM-R %P@'kp{=UҏZ]a*&Q ׭bQq&-Țkd[QKSNA7] ." nS6eMRmy1;.p˻>2Sy*+O8ʤm†HEs乎Ӂ?c>oz+WLr9 ysFο^O?<8$cNXFs,Ȏ|׸ bjFVt~HI|l+ twK&)XG {Seq Nӭ®ϲ>'@ec?+qPf,{2!*z~=2{3:-l0]m{L93@u$&-dzdynsEt]@Np$C't6 9q:(I. IDAT9B =!G{ oZƦ4%؋ xu%'D#RM=,'= a =3]inPc7(: j ~s m߮E9 WJ$n|;)Ie!A>UA!؊7ktƑi "ТZ{H_Bﱪ@/9{>`s t";I z\O"L5ǹON1w@_{I@?U1>=֍5'K @xc烍 _<7aX'PI s0$-#S2b({:y8\gPB"3r ()凁AUS}xR(?x oYw7Dҽiw]jW+W 9Uʿk4X__Ww]jWg>U_wOt((:{0_s|_'OA AѐWKF6xz[R?3_}џ]]W{}N,ahA5f 5J-%)!' ظWZZ48unAOK.MWs2YD%pZʶA^QԄIT<.A&2qE6 36>yp3VZ}3#AAJTp)vn?8 {}i<`eEOA*q"-Uʏt; c #̀H+p`_v>-ț M41Qj jӘm JxR48Rڱ2Q(^S*\= ncH%_82t ۿ{uG6~h5V!Di +t%X <̀C|e-f*T X D(g)r1;ytqqɑr xE=֊'Gdügsܱz5(B[sNi }qQGa3و=f֜7տWM~=KteN~Xvcڰ+AπL\Jl@j߇uC2kۋ^(F:*Xb!Q2gA֊{K海ڂqey)J}k`:f _p̞5eqݿK ـ=X{Jq,hMiU9$kp Zyg qotm99r(Ƞ5 mr=(К%1VEw>~-.(cpt47.\Q3l^i'VS.=qt7_%1zmO'raܰ4 8S<͵TB0fφ0,xo[PR. =V=׈Y*!Oϕ/:T1T|7%Wmc&5U L  }7$xG=3Jkw XNf8%|tBI8?Υd%u'G$'&ME<Yfkێz$Ɍ$=>T:nD΍4WJ#Q!f$9gK<Ӈ%\):p(ȩNS`ᗓ5]myVfF>k$Q`ƅn]jW{~??2iʿ;ծ>~/~-]JI+l_4a[p-UOO<"pʱq*=2kٺݰmAMqRq_fw%wfoW=gtw<e%MQ-3_1N)Lw6 +5q5G4 ;g\s*̀l4ňo_M(zHU͕ni)Cf=F杭I^jnkOkeAom*2o왃LݒT!;B xeGGAnJ)[RϕU tNR}K @/)P u!^T?Y19N"R00Kˌ]f+ڸOkh SOd^isHUzr+\o]ѝ9^؛zJ %鄴FrL7b_ O]5>`D75[5C"LͿ. _<2?~/㞖ݯ/vgSW9̛1Md6$t|~95$U@fTŊ }:xW3d'cS`-ؤy*<<+r'R:V##[skMyuEwD+Sƫ>ϼ PIɰʿ 5[AD r3?R࣎_n(Ck!$5'~o9Fd0ǂr ت!pA9*.aA\b$~k޺C5/5h9+T{*;y ,U93u0|›B=bGF_sǢ֠cZfA0LK}B'hJcjSZ[Mkwޝ e%O ^ݰ}'y6%Z,s~S}\\=c p+I6#Rڣ5bODXtZI\gtAmcod| [!k턈 YIs$3],RkO$ [N-]Io66!6Ys[:'!ֈ[`A0$ ftK*`(?`~a$V~jsak_=)pl2£lQGtlkp4*>wq5rl$p/w73!TޠvRHthlהOSt9߷G{-j֝6nFx's ho8U#z_tc̸s$%`pdĬyWZ dsKSSO;v]jWs\&tk{}`/}W^y%z꩝J~W~gV>O׿9F!_h#P~sp*c >$𓂼 nfh)Ǧ۷իWծ;[?p7 {z!!f'PRg0h]mwY[)Ѻ! u;Ӎ*ذ9YV=cls~Cf<|n:_p2W8K9:*k1gEZܨ˂xlR~?PS]oNG>^唪cLL<2 e&잃/`^J7lap!U<!nV2W<.$P >lHTnJZ3+[W rM`2Z*:g0GI>mgwZ z+lo1 R \ 4AV]}r_i ^ys,XnJSyeFWT*2(qfb)p` b 4EZ"b9ǁn-Y(Q6+6 y6 m'!(3GbM"g+}Ot . l1*[Q;䳣'#vg *%ǜOY%a:P1nCnyKt/tA1,stAr/sY-x.}eZ]a!o{6=" *M7DX(:6D4I<ӂL9@F<zg@y oaȀvCo3!J[: D ޗ>ެ6YnowͱP/rV$=TZë7gƾ{j+ k7H/̳绉:1w9zx :IߗG$6x-P0Yo/:[ )&6%k0Ahh7 h=w`FH=EhI*< ͉c29P3 BiUfļ?̍ZAINX"c<]jW{~'~N:pw.~}7v]} WW?.xe4U>L/tG <7\'F= T` 26gZR"hJ2.#ݣ{|uծ~ <V8R 68ٵb/[8p^ؾ"`N Юͨw֩kjmƸ"X$+]q7zCH `̓+ǩAm*bNSG1 @tqX;>5t@σ:{N{`V$OsP#h52GNFߒ?:y< ''jTA5m:_EO_sL3%"}/JA &;Q7~^ŒxϽvЩ&N{+=0>HwP+l_u8s~Z1πQ`M0w/*UCx4u:py|܌vl箳q%{Eu-"Kjw,BNX:m>a;SYRELƐ"`oMlk?` N$>ZY8yDvv]=گn@%jn/®vD}3v>|נEFXTԘ_h*@*zad| ЅgO1̱E5T rF â~-n߼[W~]]?X7c ӑ~kM|ẋ?䞣ݚR;9&xo+S, hdT=}ʸ:fUy@nE)AA1T]"ml_X no:S[Φ@ ΀3gmgﲵc]K3'T9fmx[UnԕDb PA JJ9iY>6jS J1Iڀic1uǬ?vϣ xUf,_^3wxտ$)zzֶ 13XIFawkwֶ*`džuqa:iyN[n^·Szh*"ޭÿ+riʱUY-AQ~KE^IFlVYϴwdT{yF]CL L$xrD+D8Ӭij乳Q~qߨ7soC51vN E^I\o.nG-O'>$i*хňXpc18+e q2x0}.ϐM+Еm#$dbdls E"$0 Id栞@#P3 $dTsI.$E4ۦMSp3#,2P=zxO2s;zd%6`o™ G}툍4yNEǿ ݀o@";PO 7] p'N~REh8'U6B_RZ/?mj.a/LDCmHNc V+ `袿`c.J>(f Ej |"ϼpgu&`oƝy1& * ]P"ktDS(IiNtAy٧ܻ =mЙʾY_=~"pTڋFL5ǠKeuϹx;X/VDR2D#(j(P$H `t{ІIi ܖЂag64l_UEVe2232"㜽`s*"*wgYZtbߒ] ~PYC^Fog#gb;612>ـuS:쩼s`Q ~3GlQ=¨PKH4Аi8"X eOT>-r?|#??_ɶʶi:L,8JOBs +ூ$8(e'Lq.HEgQZhPJ.YK9䷱ >[U NVW?oC{6!,d!/ Q\<¾L x+rÕ{r*0Y6 \ x.'F戀!>KǠ÷ ~W 2DEqA掾>pN t;bQ(a [ v$Ƃ%>].Ӟn::Sv+P'#'RYF=˹Ws/9܂hLwgsb*p-96 (nZ823;J$VR Xǃ1@ .(=.^J,#s `^e m%4[{ pVĂz)$:ͫyNÎ~(GֲaJ.k Jlʋ| 6;zRUhHO@[N,˯կ1)Rev ywAWj;?Kxw%"f7HvklHcI֤ IDATߋM(ޑ}CXpt*7[9ʍYE49-БP(Pfa:pGyn{]`Â`~=9?ҁztw@7úwvzR yZByoAY0SV']3聢/,w~`fպ WM ]tncaH3K+/lxќ44S= ``}; Z/u3``,w6%lê,YA_H)6Sףd+?-k<y8 Bi1(o*r|jC] ;ཎ?6/e~dpelρwP-q\ 83\02dpwQ¾ȫѱá#f 왌ܨy61 Bq؉\j]բ\G0A} _- mlc۸o#gƏ(?|?/c=己mFɋ ] 뎈$N7[ F(])"~MK<In:3ЫN\۪@Tq-6%7@KV !@p*Z[eVEI VHgB뀥9. 7PR6 /)P8 S" 9u?m#5FC@f99@9pq1r-iA/׆ Yz2raqh;Y5W  \=~5(]7:bt9;< )`<, }ׯ %' ǟ&ikM\~re)Lm?׃4xržc ; bkQeaXhSXYye,rwf+K76ml㾊__Z3rlO~7s;m<Xz)r*[NAvo dOi2.j}-, ;gɰd~(#/+>/v bN! I˭sۋms!/.)jxI?*3Nw+-Hwx m*cq`b7<`+P i8 ֗v `0*+Iv'-06(\?r2W ւբ@*wB'+>Y'?)c\8IaZ>Ы|v iO'| 4WzX:6q]? @%~'DqpZBHsp^nGP>d}F6Z4sm59E j_< eQV*0.IWZ3,:Bm]]m U"u%C ,]B1G@AJ3u]` 6iP䙁rj¯ fr~A9K]X⮡F߰ق6 -qXq4n}BZX{m,"͓"TUz@P'^!y $VXO9smHwjFٽh8, HCay]Ƕ)\1R7YFآ37ǽ,F d x,h8 @uMIR% ' E{FDyt Е99\hn9(5~E"O, 9B h;~j'ߒ221|RbxZ4:f73ɄYY҈7Aa}B̻rocwɒ 옅5 f; PNO^!QMPI,^/7@fϪ2CJ]XhƂMN* 6kX`ݪߴ Esal!K~)ZU` (r%-IຨSAvkwjcIBhC^L%FTo=ǙH;3E:P^,T]sJ{ 'ீjz֡ ~!}@]4R *C5xc^# 8.4{m4 6qJ/vU!&}D#M5@4uo:jÚg*@/edxU{RRFL|;,V6@{yP JTuSXN6mWO|BΝ;viVfww/{-r{.XEA$i̲w [3. ȑ4W 4 =<D7_g6goc?gA`"4 @R`io*rAU)@k3 n*+{dh^!l|QCvl⩏D鵂tOjjm<ǠUcc3ʚ>Rn 0¯,h@^ԵJF.?4 Fx39&rUşIB <2zlxȬu!=P{(\MW{~cuoD$xľGNǠu!ߕXHq=k׀QƮɉRtFM+>kF`#KL iG5Or~e.#~~vCBMV"wD4@iAǶfOAMuт?acL#"Mͫ.-ǺG1eE$Xg=!Z ʌO8R4qBfj3x۔FԵƇ)ǟڈ:xX = 15})Ɛ%8 D,_(0OpMAa89c4NǐJ#@TJA:<@\;]}`'O9%-gT5EH o󺞮}Mg%o+;g)LCIUi& !'Xd8c׾|A.z6.>яGG9RJ+?ԧ> 6ԧ>sNj쵸.Y)~ F$)~bؼ0v%OO <-+A ha1>]gbncnHnl<| {,NS\NH2}-(/bzĥV?@C qeΏo09 O 53t&!+~z F e!ǾYy4 A._~Un+@Qtb2Q$Z;`{`Og@SgW[YssS(os0_h)ߍ )G0tx1<{M--uxX"1oo}[ƒlw A @y{J rxQ5K_.W} ƺi`ȹ_kTS-Z9v!Upl({q&;FRh4®`[ L!BNhLQ0O/TŋLct޷Rh:!g-?8b#6moOGsj|K_6 SO=%Q{.*T%eDQfU`k ^ ?c)$OL= _fUnC \Jp.dbǻ 6goc?o& (̱f!3`6y0x.?k\?Q|H#&D5kƹxS!H O Rx&ȊXKC5s)IfA!4!il@-'yCoHиҠUuhgо"_f_Y08{,[Z4V*x^ '! ŏB]nB }HH˅RԞP~PQ BZ N*h=@n:gIZW  QDb`. -l0DӶ] <;zaot`Xyef%AuLy >CqC3(4hw'έBzA73fDAnTtx°G _p:lÃ'0x P=[`EP(y9,@7ՒbZ^"GNkQN Y8>sl1EȖ!mlc۸'{n%R> ƙuW뿛O~r;!m֖HH9UbHh u[WMjX((.TJ&Mi%O őrGcFɝ)y&&9d~UФ8%z@ ٸG݃{%QՎ!dG!%<4 DK!ˬFA$d$誑BPQPw lKkerqe|LI ^4]gZpr[9׳Y"R&}\É໎;|q?7ry/8@<¾6}=\3ƥC48G%MAZ* IDAT6rh zFš?$]Vj1:Ogcg~qvQWZ@[B`OΈم;aOq{<8k:M'k<ST;zLN3,QGgv2<}s $ڛ#tN/d)43t5ZmS6r:V?~^81;#Lz(?tǹ6wNOx;kdndm93زZysː6mܗ|F#J)=h ,~|2.mS͝tchr0J(B~4pHS`7 : <06WRTߚ(,'>[%?ӆRD-cDc) JPdr );9BAbR4ׄlDCx؍%(Qe!`?r\qszn?=M!mnɯfJD~ ^|=$ܝ mC6gFYRP7 *W%I|ʕ͌{CcG.μ">Ph CֵpX?(MYd}쑜t{L*R=E,sZć}OCŲ~atb7 ڇt\W 8}4z|(IEGUrX0 yZ߷J(! mM%:RdCj}T]) w@FLʵq21g- Li[[цM$Ҽs <,ښK_R[*)*4Nfiﳇ~n\ \B;p]7ʋuec&{ +A*LP!ò䷱mlce|ӟ^1#$+Wlmlctovw $>$_|I7*@96刴>H;\'@9|z9&LZV=4lbst_rȻ%d[AR/=?6gocosK_BDH)m0俿pڱ۬Ȉ_dxJw\ o $YE7Y hg_ZTv/+u)@buw:Mg!+OoDWZ&`Df1v耨R̕=+@iyF\#KJ3oieT% &=| =&ĭM :ut7$nie4xCY 7Q8INIςTY G]-ݜIȾîccdž^X[ 7oil uQA 7HWdR?'`X/kx[YB'/=@ph$ѯ{D{#Дtnwjco XsJ|m)qM0%p]Cab&()^Ӳb`ʊ !栫):Cw( ?U PV$4t 1xtD; eb x? 8(?\NzYN ᯮ`p%x}hIku,O$X4_YVV7ߦp_W}YaM.k#mCi}7K!K03 .:V=:Cߡ/%:ZI"ц}M"˘ooSHM4m <Ę.',=W&#q봎7,#Ga1#d}"P@t-Ў;r >27rcVVͅ5mo_8{]i41`ZjD$>*, ?^=3 vxǙ<B\W G*>!*N\#kW0C.bNBC+ҀNPNPϪ(ShK±đ xSW!,Z>jJe dh0 lLnAƮ9 m)zt(Ymv۪'c`oʙm!r+V9'+-5? v!; RtCn $CƵN@ё`8rJ8QrO q1hD)KŎl;[PHOz t EgPfɊNLؤhBśVh@_SL2HWrlaWAab#nZ#(B ҂f+ǽ[)%dv5zA;01t/dqEЧ\ rRm? Wx6?C_ n j-180 j m#We|xȱ, 9GӁSsx}L/!ݸos_f5П_X`c.@_(cK\hO',?q F Ct^^"zR+XH=(g sgRWPP+H_yCcP ==652e;L̉R|*x_u)6-QHn9[kX [zehݓqmkE|geU {}bRK9^m`8 2uB]!e<6|Z@ jMhQm`սc,h2lbV)g]اq1oFҪ#oNFigٙI6VGM1k{ޣOrϣ追_k oc6?iׂj)OOe;3m<۴?cZ8T[} Mn@pg \VТ`8RFwmpqe."0u{w%~w@_Oom6ގ\oݺ7}C' GL ^M)adk4elр4[r+ 7+foU؅a}Bb1l6&=]t^B۔}`G`R%g07$RYX`WE<򆍥x`x[ڌe6p< M %z(R݄q=vwbS=~\+f11V=0}7tPv`G<.橎qW^*!>`PZl|BV,׹P}4HȏE).aY"F 0 x x^a3¤Gf.ED2>0kQRrXG+F-@iZgB݇tV"31~cNuͬH=lThj3M9 C]վ*Kc^q<<뤓 -FcK4x]@&;qRϋx{:? |pkO)r:iB8P~Fw`t<[t-u= ?tYx(q &LH_hR)!<+{ovXsyZmNmAY~%TJVIZoxԮ jժou^dy(v@G|wF6p2az}˪)&{#Dc2Yua/Tm-ɍsͫ}SAP?0i^Nhzi\I-4. H*(IsnSжZ,{q(\L|x1Lzռnjcik`{>&{ma'@܁;a1~CRYaԕh-nA9 O `?{"cB0SU kmkf;Np1WU#'5qt Ň}>6lLk ESlgGD(R7AK\:^[@~6q//ȓO>W\Y0[}ˆfǶbO ~,I(`)ׅ vh-Qjs1p@/vuoY^1B$ y73edp_. ?Yoا #~y!?&hAyx޲~Wk׮oAml-??~@qJ)Ի3@\:oCیd y\Q2v /8/Vvsc .CޱPد,*Pݫ.xA(ٳ Nى κ>|{ \ap\ʩ7([y-9EsXWӕ,z}{ǫrj E{Y'U7y5[uA${Uz ~RAʪ;VT{^R0$cw$>G Y@W,7w{Xs&bC]tŃX2H`gG^[=CZ*v%[0\Ox$&T^_THn.nKev/ B*ֵZUuL&eSBz"DJ;,TPiL 9T`hL+)7kw 3Kx?Fpy4TTXJQɰXSMih>q(\2x2d CFN7 VpwI[w9ݍ apN;~W.x F?Tʸ 7XV sD@T26P@6n}ezmFz;6^u^Lx>-;btK7*hU@j_Cu-E[ﵻF5u<*K9j)7Lc/5G!#R;Vq<A9h ˰O| W{BgJXNϤgmc-K:Zs_VUWnw3̌Be &l hCO3Rb^DH|"#< ~ `cRu꾝~ʇ}έr},wH  Y@Ű-0"!݋sד/?jn5 ucxU//SOZ_eȻ;|~];X:NdOPU}ߓs}[V8488%}=8""5R$i/'u4# &]azg9"_|m~?Œ SJ|I (`ή ?f],0&AhJmHu[[T5-3Ogd^$;bʎT$B_=s(@0+t)$>/ 2i`( |Z-}MBn)jbgGA5 *T,gfW_|Kb_!;h_{%]π9 E-G WV A.VpoqI!m"_a} ;!~@_S =~'/4mih:T,dI px0s5ǀocy ڦP[ӄ92)ȤMj tnc=I?vء6L^(er:~b`#NGA>l+IH$@{042#-l:]K~y\Fi\bMF^YI,(P y"5lA$an$,V8YWotv _\FᗗQ\[͗ku?tZ27R ʫ2o NF2/-/ 9|)uܣρ>QPfmP^VT4qoc(9J.~R5$IrZQwͣ2TP`lyjބuD4laۿޑ-% LEI9É[܉@y^:VLƥ;5*.ko<,U\bTT` g]\ axQ`23rLob=$S(eFFOZ( ;:Wz"g) J-dÜoϠUEd_ ok ˟ 9 _HjHfX:ֱ2~~Ϟ=̔w5ƻ;UUseVE~ZkXljG{6GI$[4;f4/[%< > HпZBM7#ӌp3S/.P(c2~!}[f6ˢwwuBSO}~ww6$w^&PTIETIE&]^w#򧆔t0_VaNt&Sn+iЉcGk{qU zqL|y-ԡָ MӊTVz s)_><V j,ۂxѳ'*l|ox-TvHgA )[~NrER Oi{;u,⓫3mE72Sd*+ઠMvM!pTQF-!ձH@67ӻPAARM8)h54hDbJpM 3 5h@HpF>/CyCJGAV+FZ &HohFU^ zP{uA4>Wmsj1Wi I07Y;y+[=  %!%𖐸ϛ߆LA"m. WA=iT'Q^lZU'` IDAT暍7ЇӞL=U}LL&h}L6+)6+s}<,C?;P&[-2/Az火BzH`)L݁.9f!>}RT"F PEk_~feIh\uY"_O+j OoYd\/NL V \.mɟ 7UW؁n:^)eǚrW7&ԽH(fY\DTW0Ufu[Q%SF?y%Ԍ*}ڞќjgHgPoT"p"牕"yFbR]r R"V&!='pX!SH%x c}oHOLs6/`"[3`;銾)gd+V(R2QHb~52T ؁[[ӏ~8T9غ$qt~ CAɳi<hH@_!0ŋ;l"r$[`^sSoV6۱99,P.橰R5d~ %%k*ft@+rm < =L &6yB3a9py]z!y$⛝)*EubrP\ə. LR<[4T`ȊUge=#m>0-Jƚ/^qd}]XJ#^$-I*BKEQi%B x+]ܩ-_  ~֗qQ}II*rӠ9)բ?C=c@{گ>dCޠ/{s[AoTclzAWY0Qb7덾VD (,OaG4&s8 G; <7*n`CѝD!{煡,|xBLo|˔~h6$[0l?|~sKH_8DI 3bx*Xؑ s pp1=E+k\!9>~n^k2Yk;,&KgյNܑJa,R elUQ@d4 Ch,n؍|/mb̠Q+Fr/@jY5;(+.k ?9;#qB*( GTa4qeT`WGW?o[ 5YZ Je-q ÖBB{X86: zd3¡GY.mh9rPB4Qj<$X/"L5t8OTrJ]Ozxwy{ 6C}"o6~+Vu.'o>^ױSo{w"',T]֡UNtgHڪwyt^W1m%W *Heɀ7aǁ\dW[j&(ݩN.Fa-cŠ. @A0A+t^fgAdy̖x"Gz1R+bIHێRy'7 I!eJs`o-V[Ȯ^ e,&AŒΎpI+=P|hNcAPQ9R> Q|c&`y-Y݁P"' *σjYA ,Qh'G),o\}VVW2ƻ )@BZ$b9O$"7v_3/@j䢐@%t@+y8NjNVscX:|u=J~X:Nl{O-? 0Kɛ=Z$PEfuSݭ:E- _a!5lO.jMWSL+jC5?OyOuǯʯx\@P6m /@ $T_ackXUS`bHevr{o -Պia"a^]5[_~-,d5ӹ*m-3`K`˱"ݮDvZI#\^>+,'v`}rDZxR)%̱dc\xxm">1|4^籸AR+oߍ˃i :ȁ75[KzJ! ղÇ"/PO@/X 2_akv]Α#kk10b9`ZXJ >$÷| uCNnYp  o&amReÃN99 u= v_Hg6O: )BerO۴^|B7WB}KQc},Ě|Ha.x ) ]mv cW6=60ظ%'?[>~Z٣\=I%!!3hC*}Pr =EGf2Ğ˳+1@(+PԄYBjHM#хK^Z*a,I?2TҌQ6j@ɤE Τ`޻‘:TL)J`9+vS=ǁ3?|/ԇ"ɑ<3=%^@DŽBۚ: C_dlpȣ08q@<~ ȯcX:NFozM$l}:ֱw{=K|^EpS "Uy.3ud;B$tџ~(oAR$f7nYד+bݻXǽ}c?zJY3;vX z OڊA h{}}˹VV0RO^>G;V}$ȾDz| 95Z;"ZBn Y`'=h֒g"!{ӟ3EU|VDa@>W+);%ڣ. %RaWKhO#>2b̨-0|Sh?__*|_iAЉpj0LA6)J)$~iuf$񝎐NfΌ ziK`N]۩ab tm{ Y[wKx~zycSaJׂ9] M^|;VQ`i pÉtny0,Z6*l!ݹGnfS,ևZ/&覑T zT}DSХ.֌=+R_nfCH;E s7(C{P Aa6*k3EA뫈zk(gיs|xuw3o>.B+qI_- PeA4tZ +2+E Uf: %"4ִr^Hzu\/u POZ3t1q]~)5 y`,,KŠmPy.W9.a\trq* ~O^*r3 6B .J.JP\\plF ,(ܴs]%+@/-*dr. 3r?(B}N.Vハ$JzE·[9HrF}1ž tzvGG(Xh;še"a(uZwX:qb IU)2ÏȏO~ַzc8I??t_KP?(-,H]1.// ^hz Azƴa넺;a0DRr ?*%]??sϯ{w|'}߻b͑!R!k G>}$պˍ"JK{r$\]d{U<Ȑ o޳"<\=/ ґu^I % 7pm"]潶Hv 5"mz9k4F򚼰_kM`jZ (V~\2OzxBiQᇥL)Bx׳ˆ"щНY}ye @Se3F^7:7 Nv"ucX:NDz|2{x'vGY9pw<658>z7<&x\s *` ҖDZ'Ye2ߍMHm0SBVL>lxV7uLDФ$ua, -G[ӻ/ }XR>{\GY>N`!;#VcOA( dȷ$qlb-=WF\$+m_L`Y &b*þeEb}9@Ā IDAT~zËceA}Ays 刲vz/˸X9h%^AhxWуTyQ\n*HU߃-eؑc [Sb/g8 `'4  ela=nrR-Kmwp(-ײ{J7Ʌ?\--q6VֆW`ڭFa|.[X^?5c`YZ"L$0Ԧ8; >&s/#[[+a_K< 7ﴰk:ֱuD?A~7~5"bs*5rXlj_z/əs{ʠ}+hr9 bޯԣt:EJFbBHQG(JVԱ ګ2"s]+Ȗ4]4Z>+ֿV6Y:Ї>0Q5(Dkp46`p˩*q~KE݁60VFBKhț{֭`.keᰀrOc[X+^WLvȴ[e@Ӑ$8 oV$HF`}IE~ 4Sy4hqEY-C JRR">l)skC)xVR1_)7v1H k jxM%H&b٠eȈi)9M/"c#8?nZ|4OT'|g./=rjþIt<{7okЛBΣb$Uu82B9 ~ ɊќohsMҏdũpz|GɗX컛`Otcޓ!~;.9C}XP v {-pٱ/F1B U(EG$י~`ubv|=s2vk@~X:qz~ w=CWCE䮽^g$x;:ֱS~l=&0s"ѷ^"]lȕ!SM#}!_h=R xBo*:fVE+,8D=Xq%5{x;;?r+KUb`uӇ3 RI`M,@T7<)M?_€$V=h\CyrP)%jZ0h!kaj3EBx 9Ӂz肢Q\00:AG"s#gy0r]Io7hl씇vd_fZI(mE`);;VSe{}E{~U5'L 7_*Tv =K$dP /̯h3Oj񣯡 *mRJŷ5Ղ(p$Uҗ؍\}ޭ|́=ȡ'}P EuAռg"V@Yel Z,vSo8D"YE&[ɕ^^L}I觎h[v/M"5kңtV^]_[(',u:rOep༇Z57$m}dC5@䑊Eb@ndT4҅LS8%σ}ԇJ-6q)nEzho1I ^``M_w `L?[*w`+UX)KфUɝoVee4*J2l8.V6B-e\I%>X ^C J$ P9)v~AH.+ػ>lʨ-E{e/2cz_.mm2@ > NCf1Aq\[#zAm IMvkR 5t-S=AyӾQC xG@[(r;Maڇ|rw[Sr"OC3W,RM>)T+Ԑ(pъ[:Gb`~U#M_H=#s؄qlVgoO^ڤP얲97  t` ]q끶={x' -&`E<ȎW jpF8WG>Mj_n /hB37QV̋W1J;TӚ@ Rr#Q !_ {Y[2 #lK^~kXŽ z!)~9W;k Qr(a^0Ǻ_wl>sԡ#R:ӟ*l{SAF.>%<u*})E6ʘ RT䎧 s= >MIa9w!O- y$nm8_t!|X@g/]#y7ekn.7ȴ ^Ac]/B#{pۅ}B®&hh؝ץHuY$*o[W بJ ?_eh+KܗlÚ~LEE3g/+6(C٪b,er@-ܴ=]Y83aISrc0 -px.Hi*ĺ8+tF r= QwJ y}wok8tVD+B>Jk!{c@c_?Gm+a*|8T~bYNG׊4׆Z42NTӆ{=bsBXǚh/pcN{y<- |r9r Q0~?q ~(xtl*ub!uc8q7Q>`wcg3u]ߓ+.$dO4 FqN"m6qSA Iѓt<͕weW LuHǵG2/AڃO(K|}\!y[x!:*F ?.Iש ќKm6<[雐z/Ke;)/lgކ`S VrzY/(P C_rw0r"duXTS"A#$~i(LN} N8!c{x!`B >'c $ J$4lԇ F}B> e9u'pERWb>T6}Z"}'8Aax? <0Kסi.(M(RPQ5Cb亴`(m)R{A '*¡*{^ /f! e9Yk3j=Lf8vWB~ 3Rsbu9 `W T܇ۅWCfR%(eKQ!c5GeۢM9)ܯp:L@Fx \}W|X~_<}qf{R (CQZ߾)BgF _0 &:qSOUE(:,b6?5qt qlQ{Vx.9}.qf Ѓ \E!e8 9`3 yy]303xo~, Gj`cA`gzY=TVI"?>m'7M!rpЭru]A% b_(B#HYl-r/b Pg^S3](YaTo֘,*䆆T" {5 uc8??~fW C~H\ +-ۜ3{5(u?O@L&})ӊ?Q],IFd6;idQѽ`dȐX89,4cg s{@~,f:|3P2eٖmYB)NobǑ !@w" HM_5 ;Un::H;r ҈jeږD}kZ{׮6yhE:5}oƧ]egg|ꩧ5)0 n 0-6ci{ǒg\5& Š6ST}4X+`f  Ǜ3F#zqkH?M<6'}mi/YyC[o|Fp \"W~N}:ُvw`tþܵj% H`Fx`.:BH_on&de]A(-/)?Sbw>|~X)]["g=n+si0G<9#hmϝ8ٓ 5FycoyBGAg̢(A) #vS{*ld~lHlG9p/F./?ޜyO0HY2f9YOPGΑ!1^9 |& 0:1ڳ? >(a&{z)D@5o L\jz:!_y:>_ml6^)k(+̔?r19]7“نðB}gTDe ECvT5/?P~sW2BiMV  ,ӽ~cg-!`F48,- (Ew SAr2X8NWUU cW4ar]ӆ+TigaYpffM9Ni<,yiѦyɔޕHc)؁,`Rc[i{}C/_d)hJY3lev/kTF@}.H ґ?ށ%r>.J0_3ȹ& _ %:4+8](C\a3j:м*šy*,O+`VF~}{IxkCxuy$4ipfp,--`zw?軣= uX:ڻ:~s2sZ*9EBr7t;lַHȺ q x`%%~9q'.ͨ8Rm@ I(H5 bMɂ+[~)v <͘K+auf;Зk\L5d$i=f ]bxƯ{x oneQIR3ۿw]i=yʗ`|5n%_u4?GyGO5$kLM%V<K:PlTݿn.Ň>!GO)ek[WiJϫ瘐t7dN2; hb4&O:cd{auF6Ay=|O{#3`ga9S%`do/[֓lg=ʸoXRdJ~ Ugyrn{ٰ!Ǿ! =ih߇va_`&c8/apIycrH?KZFrcIcס.JՇ@.)z8 [S;Puy1 ~f,y̸Qcѻ1M :+^4֝g|s|HSY]b.P?^[g1c,ۿ͇?ȳ]M?NAO4<]fW i~))V=6]\JIWbsMA @7 ݗ>Wo?7yv.vO}ſH9ZluZ6k*&/jIO*Pm%ĉKH{Rx^lL歽,CdŐgf`. & gGXgTvB`t!`>rƯw-6t=y51ml=kdP,r.$ٛ7Lw#WI`'2hIFd%ic :2ezk=ƿ7!|)mS7N"Y|Rxj>#F0*SŒq hӺ2)Yx:Q 4lj2R3G[XolD)/vn_@_^Pq9㊡ 8m, ClNn 5E?,{绐,1?4 Jt/(sZA+qe [6} >CW~A~w5XfM?+@ i'JS%,%|vMw[y(K=$~zGcSG ;ho%d.6Y ƛ;&X],l p5Ta&^c^ij8~c+Qv&i|Q'J}Z9Uڪx1*M1iXz&Q}QXh]5JRs|wH iClg9@JrM2#ϑk*xV2]]%Z$El^m$'R>ع~LQ^Ϣ&C^2)-vɜG\F1ψYcrjֳq,lN8oDbrco-,Bm.^ATrkYo ]bxS>InْoTus>(??[*bx^34 CC,_QN*!zv†?8XMcTgN Wr5oƾ`_>FnA@@.G}?LJ@f\́gtuc|}dpbO zym$*2kCP.wtz np ɰs ) {\0{0l'_\jT[L^HF< FYr責WXqeEGm{WhNz-nOYz 4_s2ɗ|:U^dK&@k=jmA%@9ʢAJѷX, ŢM-tiJ<Ļ3XOOh߬MΓvm3h_7O ?zTO:Y{)v<~w;aӾ `HOaCF}|9a4VV%cb K-v@Qj2ïtCBJ=`9RڂdSjPb$Amw;W*i_\OehRWJwGYu eYA9s䌐>?;!g-hQɚW"jͶU-ڙ#hZ\!BAԿ^(r1WW8,JXvI:i`ɰ%I1di~IB'IXfW^о X[h_Bu@wV93ǵRnilfC;]*e(c޲TDQT6mx"]ԛxX$RtSSS>PdװX+BWAI$Z (,}?;lFI'ru+Mz7X9zů9mei50cگr,3K5C\|J)tET0z|_:&zٛ6.0ԨcLjF0:v pfnW.v7{|~Q;_U/I55sV\!

yJ^FYy'}'x;m·Tz'5y=W<5({ԽנZFM& ؑ^Z'uQwĺL56]6/:8>(w2KIY24\g#hhËuqEG5jى: M1 9bP`6g~Ǭ&#rh )kl3ȼ6 . ]qR&O&mJJ6B)*D 9?_u7X$Y0 :AV_9/[ڂ֯n5n߬t40&o?%9ߦ.ZrTt_h놝_2Ysh5Qkp🖰OYIe|ShDž_yuX g#+5{ \ѯ XВuWEC;g ?\bXRP Ya2t{)RU~6./Fyv?.-B %5p58][O#žSL)^+ oPO*tEbA"spMK2L~A+)>ZxQ2gLo `dT8P25b&P50߃،cp=`T0P/QFsȾ([Ȝ1[ yr!b.F;-X~~$ qb)Rc7h' %$c_FQc}@)Vhh,A/^|j7.<~X~~?XMqcs3>??w]arƍƼWAQCӆ5UgTx1QSNul `&fܺu>j{oxG$:k$h3fncI_dg"Yo'HF+uX]"[(u;S4u`hM@qHNf|rqb)G`^rRZBYgϮ UgX=* Xz;G߬gqy}7M$5?ϛ S&NT:XdBC>S5xђݶ)xw-h*痛/w1 a:a=Z/{*7-o;nu0ۢk^fmݠ`wM?ԇOT6WѨj<ɜ1uBn:*pxvlN[U[ 8ze = HпѽYV'Ъ?-&Ǿaۄ|_dB#@Hʹ|;Ѩz f|/7C5)_sV- șq^d<Q[,IU90UHzH-6L$ٺMHĴ'/Om^ĀBYju7JQڙ! .YD>>OHHIAo;~D5DmBqAd +pnc3[!{Otg ]k# {^Ò&-Gckd3|TuJ::?>+Lll$}JکqN+Vcj`tGz.*딪Ր6R%6sF,}LRr= S)%x :x_ˤA. xɵiXAVi a3g?u8qA f>C;SEN:VRѥD_ӂ` ;@~.v__'|rdf:jo)ywUK)ׯ_?qG?w]!~Zk#'?ZEuȕiɉ rt'yÿ, 6VQuFHM)<}[&/lakN:񬂈mؠo?uDf9VvIX NT56(5 D{G%6&Yd0|phumpfõOPo${(|zRvsjʔ43`5X`ͱSkiURyv hxO1x'z.v[1> )sW(>$T6O h }[(, ;w[ @TIV{n;2%"<1`9G=Rm[_L,Y6e=Oz1#֘NIMyz*X ^EB8;My06moW:l*SDnMH!=T ?k@8@Z/g oCkYj VtVi-p os/ D*ahEhqAv2lm2r]; U9SO_{V E gSߚ*}zr :-g@{cѷ%ENt*p_ C>6GVUedSi-a`OV)+^ه > 3.IXχxx.O+oߤ(BGBЩ k3 `}] UΨ#Io1٥C[ASrGW2%Pj A-:KZSxڃ?PuSPU8Rn|S(Oz7ZyY/]U hFB] mŎN{|'lJyn41}sX$7z{ͫ6O L:/&s0>خ"e+=.\V W>ms|=>~ 1x*-!4Ұei=xg.%oa=Ҁ[7rG?H0Vsv8^@wڬCD12\ <Fhv;[=~y](692Q<)1^+zD*z9AxK zf,־R3O rZͯn7W]b[&ɇ?(Lsk|/TY[7ĥT30 <#/“gw.v7d/txbڽmxnÝ7#Bo)<OҫG)<%@e:w$u'~vc.#r֭/;]ݥxt_C,UcL%qU7bBn|!6̀{|gX~iօD(>ώa4Jƾ+rA"{z =*5IoH#*3=?%*5IxV%p -Y!,=A  E ><9+/HLg~Dg|pȖy67C2?^d_g$Hh7EdN,Q@hx GN=v|}@-Q:^]k AG\\sa^<٭[T*=-rϠ]QF!8uS*O@}R?lNWUJ j}\^y=} _#7H:ٱ:XWɝ&a4GYma׶Wj%:+x5̔& o7 Y"7;SjJ.Z!ߌB;&`o淒;̦(g/+UD:FR|_S : a(,~}[|Lh+2Q IDAT!;\ Y6~ p-V!+Oi[ TiH Y.c=T%w-hCJ0إ> x^.z w Za %2ϺX?^$Wmh^r0·>%Gx+7~>&լmRL RAIf|[7IW FFG F\c?lMB`R/7k납M\lI"ZoD}/D $iɣ"]/6fqRDgu +b]Ski$QwF܏.v]'ի6|#3Je1ʾ*={xGv.v7\|}W/<0%l̈\P߶NƐ>|S=-‚ɟاKI88WZ'P'~'snś.>O?̭[&Ri|'Pd'VD[W*H/"bKITqswY?&'U`uPsMĘ76"Yb\Lҽx$p'@@JsfC>1FF|cV&HJ PJd0oq|aq.aD!pc=m{ȋDpfcJͤ19צR6;,j" Ү4;+ +oB+j Yք\U F^+6ܶᴣX)5 f2ԯo_M0m۽16mpΰe~|r "7@k,fI? d0e&BcdT#A{u:/Wh{}P~ { }RN(;c?݁ bzO9R L O&rH\C v6DWAn;8AG6}v&L, B WqPb`r)e{hdOe?T7mQ$Aye'D=y;~  !Y1:eǜ51 a?f~?pa9&͍mEbɤzK)z-okvc\z&:L^ ^:&Es\&{{ʧT=>7ps-Xu9 &@jz'4A PY Np=Z%K9|[(Ot1uXG\[H\F&%C>e.^NhΧ50%FU+:|n l᳾67;-ŧdY zj @Iŕtvd@.7^Mb_zkI.(}L_kn$FxTW 6$JlN4?@OƑ{z͘Kkn`;z?ycOOˮwfw&!먵X,&b1y&n[9w 3#=-Z[Rx>dQjnh,_#^*g-2z|{XOcP Z;lpȡ {S jJΖ8}GAJĩEs&<bPF|@撿hyqumI'}Rf yTs^:pwv4=J&euf>/2 }sATY]΁;IfξlC$L kEc ɱE48n(џ( 2x>ׇotF uֱ=glScs%8A87W@q:* 14,f[x~rgi9xUXW8Og_dW ˊ2pA6S= 8岖gn*(ͣ|፮>S6a)5V?߅tnA Ƒkk=v!puHfuֽŷƏuC>l=H}v"F{/ΒF}sА,> 0^vx@$Y6f\d[bI*yf躧w}^CxHxj,hڽfG*e/~!SҰq\āülg'1~vH9 YNd`^b=c+f  Q]+-N5avbP%n=B{Rwbԡ)b%7 Oq|;ׯ_?=n>~7?яN,q""[IZ} yt<&:a5?:DՍz:f U)ƯZopEXX5gw cw>[#9˩lI<#/e҇XH:}%XwCup <~AC$Nj,;XaqL8vdUx@1%ӭN_w`Frpf_6q=puETcts)ԄbJq 9zyzOըP'XW] 2!}~O[v*PtȾ2]H%N}ELC*P"$By y"# "pQSfZj>S*S  np XŒtD*ג!?q-Wj\҅E9X6zX.t yg<$@.^(LsU-R }߽E]B&Y/Wc"B$bt*eO2fGiSRLͤΏc4<**rN@_:XVpׁwicfu,A4տ"BN&h(N]oXK/vvp9NR%Բ(m>`A h_ "ɢޕ˘[ ?3ZvE+?s?i=yJl3]bǐ.v]%#z׻[ĺ:Ͼz3: Tڽ]Oz.v=[[}h|u_vXGovmlDZH?JYCme{ef߽~]_܍ѻxCG>QaJZMjGe/4R32LGKZ2O4괮L`"Ct !婥;+Jd'΋OY0pQ[d=wcbxWf&tK)[%9|wGjP/j-g=J\L Q-:otuQ56Y!g/ VCŗ]l/m_.%H3w̸O,4[LP|a5Aل3zX`P*L$nK "qMɺ5U^{\gNYhhQ]&6bN0Iسx0V:(R@= LTWSdlm&`(hf>c=LC 9.5 ՑLTm%V$H{~l frMt\N Jmg ?" ~3ZE~+"MuFGA&%9.8HׄQ2,\k~ v<03)R]R*K7րXrzܩ`zΎP@;=?Bs;S; TzLt/ͤK!´3H`<_CY.h5.+(@8JPA+Xnr z/ RC4 8jCQ5Pआjs _ZyE=;zAc2B]]ojHVRíuA` hc=8)vQNun*wIb.vGydbK)y!"|ӟʕ+;&.v7D|C__}{Ν;|GݍϻxCs7G$IR?د'2d?I KxpO9f9ўc `oN-QkȲ`!%2',!jɐ p>~ϻ5u&ݟe2z HvIvLROظP ^=N3##W쬆`s._B&,xW2-Y>w9_wm2\'i`zj SVQvyd_7oy͒ )Y?^OJtjr8!g]#CHSо |YX^G͢I7' ]9V-@ ɨ<vr^9&=تQU]/[v]V$ m,Y0&IJɄIT3@a3fHjfؐ)U6CB 6U$`d aYllwך?[j[2YUOz}>{8mh*ns G(c:!]#q*I[Ntitw;G6sB 0r-8|ה22j  =IPw!öπX >wm~tF+luX%^ԉ?vEm6CS3f5= N>.aȸN@=Cm0B4hLM7x^ў ; Md.1h 2d.;}HPxIa \  i~}v≺ˑBk?^;]K)"h-9cs{pGTҳn)Ӊz U ?TSM5ճn6~+D)p7Μ9έjǧ-i_~5gC?CMo橞u~ 3m5~)/j|x3R%Js z04Tp$okxc]ȩF<^WWp2{%I}lqBc|=eWt##[uiVliLzI 8g ;I\5x<þFVny` MW3-=ҵ]\z^q{p+Ȣy%k+widio5ozꛙK+p`k6 4\O!o !R7¥!EYOi %i6V{+@<~N;7.NS=8_Fi,Ƒ=Jdg6ӜMp6|<ӯx-~=s$)aO|%E x:^I##"= ?DƛlF4^֨ E6msCR9+FG{cڋt! =}֢Mҕw2 `HJc 58b D)°^/\3oft.Ȗ?31WϬuЅ҆kUV }F0kzxJѵ{:nX/Ur`a칳  2M i|"`vkRHתC†Ȭ_Nj 2ZI'Y@XͯUݮ]ՠQ8&=[ip[C*-ţ(U l+*4م'pJN&\"'m5S~.0W;AKQ`W)=RGdrS-v,,,u5le<%|m7i}{:9#HhhF\gÏTbqL1ywOMdjguu]mmFmY!Tl_jr{シ/o|[5ӪN8z׻쮻T}ovRl-ǯ_?TO:_ sO}^}I4K#I/f6{7dkiv uPP;=QCilޫf\+*+5?9 DȪy)sa̐bV$%n Y & p UU}vo5 `tf$K4o^];TB4ȮRD6rb-lo¿ b6)4p  AT lk ,} YauQ8ݱ^zlcgl*u 2T\sMJ Ӱ_ja)C+79}Ѳ8a߰vңh9s#Y&=Ua"kKX0ݤ IDAT A@:E<#bHGԗD9klo@~~Cf]@6xGeupxp5sEzqŮ*$(k7ءz&9pV/TonEBܕp xy ?3%#` ҋ _# ҄6s 9 y6:@R.a1m-}3FNܱDRbJ{:֔!?TSM5ճ~7~[nSN jۖR;͸뮻޶-oy˴꯭|73O믟e^v{ӛބ4 m>qccr p7NcTOZ?N'N:Gr-OU==ݣrٳbW6'(a{UUD]%WF3%g;CךU!3~5Mj/&s3hcP1n_Qp78@ !7akmvΜ6C`45xclW-*f`K!켡d.dWQIx~ҳ_US.x2evol~9HAk͡ x kZC6 ൪^R"V>:R=m}bsG )_4ȬO00oj,⤥_ `,7iY 7!e9pr)`b (Ȟ kp'x8IdMpO?ƴ){w\᭝ ZʡXGqStZNK = {P'O{,$QA,{aW_?'9YOO} Ls֠3+vEmv<wa* *p@64̄&P. H cH|CuU p[$H ]taKN#/3N[:57K\h7[tU;ec]V s yŮʤ`I[2hh=eӼkT947>Xƿ߄tt jY_7po5+](-oy /| mo{??,McP vsUgFXd$ "{ o],\ $U;b(6S$>D`!n*eXx%RNH14~KJ>38딢tX/4w'2{V̱@~r`r"4`~Wrj׼F7>#J[T| Msx衇x ^7L ;W>]we//~1wy'=КyJiZ__/zы|?{f|Wվeĉgg1y/}?zAw Wn@C@zn+}.9@Ԉo"n~66ܢR,碏rE=_ lXǮnTkwnˡ vG~,!2XtρVeugI-#s(so{sA#?Va+WH_ۭ*}?කVb`W4c_mO) >9AN%$pdemm<{< ı(g9Ϩ]A=@ H[fW i;͜^>@O>| x`iP;>IHIzսu$lK@]}wx3tahlE."a OA]rSVF9P™#;*nq*xF0kP})*9t2DT@`] ~K`%Pf~}F|u#[s] `2"YENK($XGO"AnZ@d':F$& L>%iH6C.}#Hji]<*{T_S/jQ/>)\nCd453yrp{*{|)[^Wy:)NdXW0Sd&9 z5p̣DX@s Rcvkk%FL륺p'ˌТQ0Z2h:e bT=F38h(`VGz!{PN'񋻣赆\۾o1Q%';9ybV%=},fy-ˁ;A ^Mn tyIMB7xn (z%}<Rm(|5!69f ̰! 0O Gqk#am}ToP&hyg-G'7>=\}'Ӯ&TSM5TSEooᄅ1tao(뚻@im?̏ȏ?~~S=z}{x;oF>rdus?Zkw}UzNzƌcxLO4=cx}|n9x j ,2"s+pZ$'PC[\il/sKʉ [f*ٓ瘏cXCP乼 ::Ժ olܒQ,B$e XX8lW6x$r{_4bQZ.{3 JN~ɖQ >bwų%WPWGERlˬ9G(KЫdi>fTR= KR#M`0lOÀ. uvLÄ~h&;4 2+ĕډb@l[SU'd7l1 t ~3dAfY$ypU2=E<*>v'Ys{AkEƴ62Mo\$ nE6k0+4;8]Dz0І丞Kkjd I~y6 vMÅ ~%Dub"mНH l(lB +ǐh]va-P d' ΎAmb8p|0ʬvW+\l] FRi9 j޸A hŰB5dam-cyĄ_ѽ]`[F:Y4;TOj=s_gϞ䗵;% ~Ga=j??p'>a_5nᆋ?fƿ~jȩ.oYn;FsrXs@V=s W_}廿x_W;u FjIPRmxA$D{fvDKvflh9o4&L/I9cHiXB&fԑ/4)mjA .Aw^m Kw8(ѹP!eK D MXI]dSD6xs!l$PnS"9cVȒPMeN90NX=Y3Xz~ei`Sa[6 RrN fRI E,kgIPX9 ˩` [`%T͔vg劵aYdz 9o`JHڦ`r[%$O. yƄCAv[}Rj2hjh}ȴe 3X'"VcggwJ*XqP_SeᤆR(a/$oi +ۚ%(l=p |SYf8fɲXܔՈtLWx}m[ih:lyx\xXJ&4%V<[_`g \h_`m׮JM r%|(z[!%YG>?JA;-RJx6v*,H6,e!N\"sPJ..`;hfmLt G4W#OCB. ɠcr5-|`d4ۮgڹw#R![;hٹ KJy~q-u{Ng-Xmwޞni_cZS`Izc!@7 3Jג??<(oX5+*Q:O=.{{'Bep00$g8^84Ҿ#@œ,}]c'hELϴWZiTSM5TS?55aS]6wwwk VLUw"58P=߂lg +w9tuM"Э>dC!ŏ뜛yy H1}mq?ӏ¬_ IՌ ivj$6'թ{+^1 FF&#O†_EydϤe. o+Y۹AcjJ̈́,5? iCHan޽3/]D'̗ip졃k"K M\ee=!䢏.0R9=mP'ϭVb( Tb;hڞPVr88Mi4o1M刷mIB{`72w ;MFw$֪GiTJtˎ(=|c2o}[yK_jz׻x_>Lo{ƿ͜9wfgBz3A3OQ0hCT ɰ&Z:P%96J><ݏU}~z8jzgC{ PgEDV&<rܒy^=a9>\aoȮn4lV;)up]u&e3XWH{6\ G{Kd`2alK9H,ƣ2lje~`1#i0W׭t\7;bnǻlf0 bFҍk<@*[ -YflѕZXZ0flrG)܎^{F,:fn{h=oEk(`ИAHޓ^SI%zZ\iK+y?mtB|_ on!k9@kNtC|FIBP,E{,o4k7$0okN3 $pGZ R6j `FcDq]noyN:$5{8:owįpoc"Ӝd"+JBI$(SHTVT~)FXI-EVBnŠb>Wju+8xb}K83؈MsqmHFL ;])d蔢>KX%|6jܝ%-%q\V!hIjʃԾҺVgc$pBEAy>va>*H H4<.ta|$3srmG6'lvyaH&a IDATt4+زy_̞3cuml D@eYęp ʢ4GyG:QWn 6x"TC=A 6jz`GHoo[d#ÚZ7Fπ< Qzn,rc#6-_ [7`!^%]de6sn'3_o.؞ ArP9ZXqPgv㻯؁{Š\)i3Z$ 6iډe l^%v=a``^Uf5UBVq\蟿۴x++ImGkVlD,T홛Q*#]=C`UV`^em?VBu Q7dj F)EVsL>y*qׁ=OHgd3{:Ԛ^mi䁗-p4TKq c"nO]qs놉~+j} p*k #51P;Uwf4']`Cռ8 Z JqQ__99 YtE&=|!"R!]ܘ}kVr1w!Uґ;(4=,P 8aD\@j' V zЃ}feEh<as'J2u)#em1i,|C*9 eι(8 35ap҃-RJ<}ݼ;;yի^^ ,z#=[n>p5]](X\|``S=nvmrwL盦mۋ/?3?<_u^WNcT[]onx!.\@toAچ2^~\Sk*WLJ_#t&9Ց+e]?lIXk$+䬧Dw2&M`O8sgs0UC$i.,w:!G[qlXSY : j^LR ԥɢ. H2D}TrWtN&͍+c0s=2/{U F Hr~RƠn=]z%uE$}'88o 9mJ{q:$+bbRZ |iוĂX\4c8ap>"UV;+ kyydQN)`w(gG:5%:sBKcnstZR{#8Y/)*؞adwcU93й"s܀>x9 j}CE ;-?_xZ=4`8SJ㕯|%ox;㟙zTg?S?O=%Adnq{-3?t43ʼ=ha}?]>v72m`@`a 'Qd rTmA<6``3%8M:ɾ-ȎۺiRRm m#{vv )J8hoH &~qAއ΅^X?D QCRH]XFnۈ', ͺڃVU@WĈpp{Sa9DoGU9$-J Qv[[a'sc vXyB6Dv\u@۹ʬY@]m=1o;_F˥,xSoaս>'8 8%}qXg0% 1Mh% Bǔ!իj, UQ"8@I Vy-d\ɞH;gw n;F{.?*IH>"J(1eJΉLHA[3 rDBt=:!Y H$p^?Us%`4 e|4l|I Rqcl*'{Ug}]C<" W'!h7rң @olɤDȇ9Chg.56WV3ߦCE6gdmOIƈ j}BK%&P 1=ԗG'F󗙎/.A. @O@)WZ ,,/y:,)XWi qBw=c>PtP3k@V3 0$LQqק4@7Sh J>䶕a΃)`7 e3S:;DUǧ1X?5Ӧ&@~jnF?S{ի^ӧy@`T||__%ѣG[o[nM7My_~=vO||O|gm[ eT֌]*>FOJօЅY ELjN\\AW-fN; [%u[׽93i[I(J]"EP.ى]DzQH2㷨RqŌr5X6!Ql$K2+R #"($.93gF̨9g]{OXcúA )dd>]93E''COt,gdEC2; y{(+Jj-tҲg5e6;| '\kvtkќ%R6!lk=& u,,CZ !Sˌet޲uX.vCOnp!Ŵ1'3;`z_ BIhsJ1JCƥyAӏKOe}t=$/NIV֫$QDiiw2%,ZH.`!ϙvȋt7PҾ ͋ \h/E-E;xv'XA^`+6\DG" [Vo-rg̟79ogńW9I_Һ@S 7|Jrۀ&ݱ6}d~W7";l̀s1s\e/| ~_~ydT{7&a1W .fi~{w]zPzGMU߲\.?Ϲsxy[ߺ<(:N?σhOC=1 n8o{yf`OaKΒN$86&`.i޺,pvW,pY+1R3V<8 )iv3J/YM N=y#MH-IkY"l̤|1K!@*>~9ĥ׶m^p^F$2m"mէ%;3/{ c[8sr ĥ88aV fmD?iZa`=(S6î"njtL`'SR Pwlm`_pwFigb@}d4V@[ai6d^/^L&߃m7:fI; =~/>F1#wagsa0͆%?1v]<~gQ]eH{nBwcvm:F Vq^@BDJ+:/[ѐa2y_)ѷLv9%ܹD=ɇV^Q5j/Y9_̋f'KWk[su}Ha_uqcm]:g]k>rQ J6]Se3JҀ4: mkQn΋R ouӢ@xԚ&֌~G}.N}atb`بXQyZ0{5ApqdE|dvv7:\{K IDAT0h;S EX^n{{wW; C[Da zV[Kǖ 95; fQ6l $柫*޼bc9=y<\xq4ͼ&$,LU }ӧ9}4>e=}Ѷ-9ݮ>3/~<3t]ooX,ӧTO#tY9 㡇N<1??u=gqmO?;ݛw\PBs_;Q@$Ug5Y1(6V>JnZ0u$AZ }WՔ@MbJ(vO orA\6&Aas[j&OYIH!Zh ԮRp!^,\ΞQ*b{Ʀsݾ.!,|3 J(#-̽󲆴JN*4d(+&'\C&_1;p0ľy '\㪏#=RA do9e b$U?T[  =4iOCi>i"ѽ`!;/l61!/cIW.E s!= 8/p^F4w@5lpS̗NEAW6z8L:5dm,YTLVFcߵmZg4Mc=!;ݶu]]w;wV+Nwr J)Cxw}??^zR J۶6s=ϱcH)^yGY,~ Iգ}p^7Mïگgk'Oʻn{'6DumKu7ܿ=Voy~???ߠKK#GA܏yZnMmO 2K7Aj;lGHQ3CVղE@k"JH{Eϛ3|e6T"$n<q}'z XSXx$1,g,Hw$XiL(Um?a{MIq\vH;xF:(/ζ#E[}F %n&q1ms9 N״vp? Qu `E^2' SgTgЧoF1Q!6amȔLln )COS*oQƢ?gq h?:ȍF~V#KY(@9n 7k`[$h ,vouT:٘ǂ!srT|-jp=ฐˆkQ851?WY"aӱ|z9 *0|Y(*d C*n'^ΨƆ`\[eļW U!-+ *=~?c-mJv$}i+񂲽Pr uꮫvʸߨ\Ӛ-nH[2SK֕DRg_^ފ<~;*Gb!Kc'LԶ?A_X?B5!RRxYX=д]/ ؗۤ[2ͪ8xǞ$а, ygrg]sm&0k1g#04z [ \Lȟ8w')E߃]PFgacvߘAj Tlo .f3C~9c9ƽ+KdG}N`R%8 ٟWۮ:RJ>}g}UsX,r۶CAWGlۖN>T2zT?#4R9ǟ}z1o4+V?}C9:x 쩧{O+ͯSuZc?| @C?|#>'Pkg{KUFq, Rʐ ʖۑ 64^)@6|Bߦ݉)݁ 7]CZqOŁJ (/ 6 $kYU.c`޴mۆ`%_x@@DАCLµrdD!LfՇ6G5k 6z7d"i>״V|T@U+l8:P ubvVH732վ6m85IflX0#"e7@pO]D~#"[p:: Q?LG-+q>B=Jǧ (|qHXܫ=k|:d(0*UHQnNZՌj% wU }ͱ/({WD{ݣC;^z='M jZa2Ȳ!`qdG-kFZ*VS{")?!03q8Wk 5‘d 6E/ M:*Ed>[5=ilOx5hgH("{ͰޯǠܙ56` ɄRJB9c{^$@!y_3F9tKugŋ M5}2alSqF-FDo [ v#s1s1+|#r)ns1 _-~m) ,i՟AW0^Dnk>Q6S} :bP?Op8%r<#`ɓw,oG74ͰޥG}~3:Ow|A~$I;p*$h2Y2ܬݔ͔pz>#2zW'eLuq ͗ r"4\v0yKWF\ba~ Se̯xb]Vd?'Ctg^.K/㒵K5MWs閁Q}h3.m[nXϫL@j2*`N']VڐNDL@i\a/{`TN9ɀK×IG9m\N6&KH.!:Iڛ'kG`Ab -#^63vsq΃2 COb q]\$Ǚ] U(,6eU w넊#tk+AܚEj'>BG'γuMޖ-q(W1K/4[* u^w>_įk` ŀ54r^Ek|8zboj|%u}c7ob 3rp1JˡQ9KŰub8N\d2oLrheiqh(2ԽNimFu"aĞds93iنbK&mQ`^k!鋠gnRd fp}V4z8q1쓟c IGOBjҤQ+Urїqnt DF:Qc>>yPy*3̀s1s{w~w[69ޘ+Tao\Uy WjumN> u41Lj7`[ )d-hP:SՒÌ 9k[\E^&,`Q"h;YkבFkNPVA?&c9ȱpj sء| 8xPu;f@sUf ^F2}ŔNeR3Ö^=gu[ usA%$֊Tdi];1 ma%Asx!3t6. /h;-"¶a ݤZݫ/ 3򒐿9Я ^Ή *JH+!H דS _YxOkG'҅^yχD$3Q} t,)I}Oq.$X _s68O&5*iGq!i^ƹJZmCRztrސ}3glV,WWl;o9}^XeI(\$ b-/E d8oЅ|9&RL&Ԉ{2UF]eiv yr^u!i +n2]ԏh ol],$l(̇mP--f;#hH+?3tУ qGyA31$=lWAiWѷ^(%+&hْebB-LB@㻏ʮa{`mr}bCLE(K/B"o* 3IE7AsV'7H[̀s1sq?ș3g5)V%~M請)Xt{yC}`ܱW:˝ߵ|QWSpoF`Oߞ8N<)s=S,W3gؔzHyL`L;WrDze#8_. `s}>}!؏>{x7?m#^q-눉a ms[8p3vK2$ZJ.4JJoXl쀮O5\].DnNvY]*[ =_`;{A-zj Il{h,Kd3ҙmZ( PQ@tf ֵ=WHiK{H}FK㵣^O$о(9}'%g5mF6º@ ."*J[arMRv ?ilփ.a{&t iާOdmpmEyqEZP:e8ȉ"ePuJ/p`J2+h*>x"JET uQǡ Ǩ,W3R KSs+\}D/)ڢOfP+)m޽M䅠w억J댞s) 'DFo0 㾖cCdT̾AA% 37[ωB吪ov.+rn7 4%$ (B mm;&|pt uj4\5>YXR-(V(S 첸JFe~ƥB>R|ve?F.%/J.@2)7RIK/ڳWK up%C6 ˄-9{ޕ?z B:(lZL8(!C)Rn1`SR5`Q(ⅆ H/NnǐݎU t3O` F$m9hK/BƲWف⋊WQg+ŀv8fJCmU.9r01uuzX?ƏCMUrsXBJX+`}XZ7ZXC Ta⃂4ز{+[`v!@%촲/=F.@-B~nkrB۵ Muwag Ť5@#VJQE\@]^Kq^T!"M `0d!|k?\9s1sG}QJhOFt9fc=6ߐ9^UTŶ D]dz<,/.:S'b?oB)ڴ&[>ۯÜ k= %lO; ӿwm?}K_70x {;ﴏ~|󟿶 ldn=`Ү 6VO|7+z (`,M֘M(`|FUM,fKyS!+mhABI~Ok"3X)\4^K޿N8Rϯevۙ TVU%`ҟ%F7c:Z`|0Mƅh]@&-)kWyo%+Ym$ÿ+wQ29W IDATvٜxJAQ@OtgۃO;a߫G4l֬M)[_ŕK,rVgW9&?@`ku=DDΠSzdc3Y/WL^4 7"Ͼ4X^PX;﫱fxKxہaks2ˠg =s[+Tg_ow0qjy`o(DUM1e}>;dvHڰ!.&5"T:+.>#Ѫ+EbP;J8H|?2}uն-`8 l^<>T㾏sg=PG|̳Z닸 NWig vX5jӫs0ʢn_# nw z`}t}Vn am %) ̯^fX(qo;+_M73c95O^|ſ??ԩC_x9ng?;߄9^u;uԐ 33M&yA.sA*2$SʪC$A6lF/SzLeN qRx_'~C~̝Ƴ>k3>O== 1fVPVs-"a gK ڌÓQ+ib0E*-W ܔl%]ʖQ\k҄1KkUv傊 ݕaBHERߧ$~>Km7u>' Tx-'oHp>X~+B@ʾJ`k I[%e

    ߫m[I^4䝫'F~ijbdĹ68O:N-h1FBZXt:_U2n ]'lP` Wes}q">H6kƿ t/Ӂ%_*DiVH|Ň5|  ۓc=X#sru3nr\q~c=536hC6t=W`Md絭B;xpTRY*x*żt%9BY!hHp[(\&n ,rV;|dItbB==8a`:MY2Dž` \^4B*ZU_u]A@dGF抡G`I/R(qֱtj0Pm9/8@kFV#S uu_,gwW\ 9|AXdC=쇢P?o비tm.{az|W/,Z̘'fG{Ylq>}^l3 ?s1qq|饗?|/dc9 ?ϓO>i{[C/%,*8\]T/WelՓ{9:ҧAb5SO 4XeK 6R ^=a*ٳPŎ%H)XcLLҘ03pˢ-^+[uk()&,ӱ@z"Pԅ,y!&~ Ɨ١72xK }ح7.\Hp`F 0b[5KYt2F؄I( lאc;>"T}z-h`Z,$p^Dsz`U@f~RGmT,ZUuVd,MFl{$ }Z^ e6֤,Hq&.^WmL[s:efMz >ٙf/HEG1kN&*K:Dp*LBZ ijb2u閠XrAZ\t1& ;Z&^؈ZSZ[ "9ꢨ0ܼl rrX( }DŽ#)k"Ĵۯ{ü'q6)^/,}Tʸ6e`uKOTl`VQ!؋,\U:T_Jb{=^2uyk&?[x}mႃcCxۤHMDػ79i-pٞdS]Dde[aýS\u㣐qЦ/fqR><8)$cD]6 n|@WiQi?KsLXv> ŜJ\9%'(w@A JjŋmhXZʿk=YG3ߢ"2ljbӴXDa-̋n؃Cّ^nc9uoc?c 3Rs179FGyds&qԩa= u )CMQ-< =ٕKIWZԁ-VIrIouMRe)#H*:HJcL9[2$3Yտz>>>C|ǟ|^wo6ɓ?sw}`S*\KC}&TjH[WYF֪.lr) R:0T*aUTW~D$!w$Mi="#2!;$[ zIhqS2Lv˼acBKM5 l}`%N._!,ېF,|Bڐ̷iِ/-A+qhǍ" qkqUՋv)I\٭EMRIu.uMz@2 ֌|7@C`w%9 lxg(v`|ݩ@dN\rA,u})@ʱxjb%"Zb2 ڃDA9>P@^xԻxy(Z({\{4oKMs)n{` EW=5~d wtBlHخΛBj%ؗ"NmX## Fxk*ֱuAMeg?8PX\w6Q2x+uQeD= zrƾٖ_aBxXb& ݆}K'y#='蟨"Stru ՠkk:F~leOL}lr" ׯ 1s1 =}cMSVr!sگʯZ6X̒FHAj[Fx^d}Ό B Ry`/J I6  [X.(ɐēl$ʞ˛휒K"6io~{y{7?y[ ?{{|3 w`P[צkWZ@rpT*}gyCnm0*(Uz3E"6&ueu2Kl2gG%s j2g~ƥ5}h&AV7m:C_OmrXsįTL v 9oY}KۑmkD/= & '!Q<_Wlqoid,X}0}gw|$83i:T8L0~ lԟ'j '{:_WC`NqS[%Qh` €E/m4W$E˯ID!.1>aZUU+FIY : c@ _WS>j%Q&Xo8}X4F*dAtI4V%ʮ9ljRic.逥 S% HE]S((|8W8W%C,L_ lⰫ,i2mj1sukaR4TaMml}3gc"2%'>zo P!/xb-6¥/ v6y#yͭB"C!Edt(>B#٤RH_s]#)ltV5VSmɀW }&~سZT3^TI!YڒLB/^BX&jf"f~covDeAyu=;בWB~ 6)5C;6c%xn*y {OX8ǹ{ 1s1><}};wn!s~dWM|soi/OfF۶tU$~ kZ/;vԓj;q%[2ʐ^*ֆ_>7byBLȡ P4MU aŌvBrI|_}L!ix鞿ÿw?z/]GEihhX.m/ٹp|]<=#<#~URLM#OtHX_\vX &άMuRrH.1gV_P$μ3u%чA1@ؘ^K sk3[gZTO[bTU渎p0%'$3 W YʗAXX/EǮS PV}\yhi@*gx0$aİ6T*}I]H LrS7̪׬N <*0af˴30:ҿ\i$ԩiT%1*3]' + PY9Պ-Ȏ";T;2k!{ls+ V`h"sa9:=)db_!:=Y>?u"}R tB|Ixj +X+q6A=_T@*t[J ?vuAicl@u/g뫔P^z xYW{ N:Ȧ_bqEqJ'r-[فL~ *n(aou^ݞ\& ^f>(u=$|(dאVPȘ9c9x{ӧOۇ?a173!f53~aЇ>4ʧ>)>FuĎOi&9uMZi'c$ʪqZK CqeRXHnL[$1cǂ7xݒ{dQ}ICsNb}ޱ{~LzE(4EvyW\Ȼ/G'?oȷ;nhX|;}^LJ/vEsuZ?Oȗn;|_'OOcqIm&,&68۠|˴O_:2*j-uJ<*}aTcMH>Bji,豄 jAZY@6 /ޕ'`xJ#8&"s:kAU1́gÔHK4yDH&ngSoЂ:gd`>ԑVpC[w尺QFS ? ħ(!yمU$KmA8\`a;UAl*޻٤c O>UO"/ lO_>ٰA +B%>DJytCU`XLqo&:;lE|Aj[v;YzhM _sA:AЬ*H- n_6z@i) (!PhBtA^'(]HpV%ЏJ=9hj*ڇuKw~ D;S@O??\[#[z..lty:^+Gji۝7u7s1s]w%/ɟɟ衇6jSVvq$E>s1ǡs9ߔ9^qyG0gΜ)PZZ)|mf(vb ; 9 s]m s!؛H(I^' l^$1nW춞DIQ&9'4%h{؅НXCL)iSAJS'=w@v $ʢ1(mK '!nOƟ;y۷{nm]9O(2 &-r珼Q}'g#pYqz)UyiL GJG\= [G78ru ř4➥K t4h y҅" )(p/ WqoNWN3}| j !_Tʾ‰k츯- vT{g)fT4 9wBY{b>3 W#9 m(t +O~} ue!t[I2w@:huO !%OH$~ kヮL ؖI+ E<٭zxXWP9T V03kZSRIhnJsAqKJCXC18!S {Vvyٓ:\-}"^s}2?Yі'( m{4نu~"~:aKJ>D #1.hDVV]x%PioP)T"c_iMmV[A;}9eYlW\_n3LGop57Uߕqs/7F0W#J\>H$u^B>e#D2E^;;rdNW~ےH ; |o&=H|BvݧZ(i:Ι^uX6Ql?[%֯d -e`j@&+}*ޙd"HAXqfr~8<6}Kq}HKo;Wb5Hc`) Otz$1_ L6ǭqêu ^U|P|'ХdzS/D3gh kB LԴ!185\o@vz#g~eaHU%9>a}:yng=0uu'̌U2j3 y*{O?7ֈ#dFInڿ7t@ nЕc, ycqe-{$aFÖ$ ]+-u}/yTro9D jמ 4@0% -gsHԼɪ:ŎNB IDATddQ॓giuu|*h#bw%ew&^F/f@~9c9;> |Swx6*s 4F9x6[ߙoK|'x~~|+IRX,kJ}~-t`7,x6`Y7  ( M˄,=rZpm֐[?x8/EXHHgn!~)YxBP_; `&̝EwktLxNQ.t4+(; |Mn[Vv=%7?r7zťkϟ'̳>sԩSu52v-9H10љ!BhdJ2r pr\T8삺,q9]MαR77W! ~y^䎫 o+ȎaKknWs6WF a1:l&GwB`DFڻ}i \Nuΐu[[Nn,-͖BϠLb`|/>0c uy6v',،&*x["ca ; bK{Xٶ<k!X0`67!oLG_%р7_`18M$ż P& =HJ%.suҽ(lJʼoL]#5Z+yj @no>bҘ>{.whm]sO(N`SFzp$G 1r; xch4:\xtp_3Sm[k&rMmy_ݛ@6<zM="ss42ir^ ~]{sCϪDs8]f{w}[c Htτ)%,rR\)+ kk|+O|B~ܟsʯ }f\Ϧ\c5h`|K_ ~~lx|~|O>W9TQkMPR,drz!cG*p~3EAi ~ɈK@^'zO[|g6^GXt`Vi@K`faXD[7,{ ׂ ޷Q̑,>Aůz{wPQ mB7B{P6u\ ~?"sSCh?oVJ)4MGr>S!h&O:9M F\왒-]$ [5߂?^A "'j3s!ru?Lm^d1: rbLblc ]!- Ad![mR&,,{'Xn{6U|T\8K MQܗ^j 'P>MI0:} j b@<(iEoeɁ\%Ʊ.-j5V)fƐڽ:w7Ю1AeܒKCki v-gcג`H~uWB`lPF ߥ]!c ͟rA*a5)#ܑ)r*o5]J)X(Ĝ!GߌkgVO=ٮ6{&O@vGMD#8^‡CCnJx_OMWͼ}Q!Sr(衄sc qvyU%bW1'c틟kyǹt_ꘁK &y]h^Tdi-gHhr&]w[ \jW5y`6(hW[ځhh PZز1[Kjyڥ*>ZZ5n]H+&i9Vvy4L賓'hf{=nSnTPY7+ZtmpSio&4EB&qf {z'{f ԬJ9i\dgMf9gIM?QaԚ?fһ̖.g#ãFE٢DÆlk –-[١>ukkO==ܿ/1v[1BŽ[c)RrͿ^5޵xW 'lArj s?Y6l?m⸧61[`BC)]eF@1ZIsF5]DưQdR\8,lC<\3Gu>: `m6ecU/ZBvzꪊ2MӑLi#>3:@E+qC6.k\p bYҬV8x&RjcP7P8Yw XBU^x{l9%)PfO75@aqjǞRGD_|vT"a{OފH6lxY|5_g+2OyA%m!!p]ϐjAga O TklyþW d}ܪߒQ]^=;v`+&%AC_Qhv1u]yT}y43WI!אm>Eh*1Bi,˾2sۑuȤ-˴h\RM <w_w=O&Yxx7@~_,%oanGMZ߆h~!_iBK0gߚU@jXKd9"1*Yd>[YSZZzf"2۷" &|J˯ⵥ,m?$`]:D liA-swR–:M$EDU+Vi 1)xo2i 5"}ڏ6qgY6^f/nccGnN|=]ح^ޚ i\?w˺.&Tmp&1i@Fqov#νckk|k[5g u-H9nlӛK'f&d[F4GRYkPi){xR{L>Vj6ٶci I6Դ.y~f|:H~p ykxΟ܀l'G=Y=]#k/&8|x8v/>/Gz[[Kxvc]oM澱;~.4Tr&Z:p /[p%g&=S!9>j&n]=ӻh ׀_? ~W+ ;n:l2Ru6mh^uP*]yq홞>=dȳGYRX?:7[< ߃znKܑ ;W񭗦Ȑ "h)0knM;Az&}G>vQZ&Ѷe+C~5Xc5^G?_W0[}J֯w3ٱP?Y=~}}3Kzf@k^(Z`!dE )EQ PTtE% )q9rϲR>z(ءFs 6L2[3Y hŵ&Y܏(G?p!}'STUM2 J"l Y$ u8W9kO& E0R6N/j*ogsx@׃LvqczuƶcEq6ݭ3h> !]qr. 3X6\!Eg2&8pLNt1,{Yj FA+=}d4!GnkG/ *ܔ`ˤ:@3dn@~~E~7v2@e5=Җ-[Mx{+YSPd/,p1l ƴ4=` ef5XXSͫE:_c$uٛzl/GM'?7 34U7l`I!Hԅ}5XY-ӔeI,NB8$"5}Kl `~7ֽ.`rWGqRQ)V v@ NcqF$8[_lR ؆8%(I;3;o*4e 6fchkMKig-57I@f{ZcLM': Uoaw|]yQ{j{$(b4(~iBY a5XR]{jpݚ{1 ;\qdw"Ib>\jB (󨺻&K%a=sur- aŕ"i#(CO za:$W̜0-Mdž< ^?:۹ϥ֢)awA*%{%_(B4]`6Pql#"_Ֆ aqD`ǗAqj<[ݺF;Pϗ=dm1چN+C~5Xc5^y ^}ՙM7 ,w6kwmNo}m`k'G?85v:VJA"&O ikR ܩj`sɦ,e4=z{|*@% hHM5ˑ Y>d=\\2 Ay~]x7zⓀt0j؞mSI3݌PFSX2ǀkN嚹@EM[`QtlնYh;~0`XedH+ll|Kz5|uYLs3e.6w|r~+YJн"׊_˔ټr:OCŴ+'RKzGÇ{ &<^{# ޶@͐L[<ݻ HV|`OA_`Ak8^q֣ޱ rS+vKb=Y^N?Bi!1:wiW?<J]cߑ*1"ݽ#&rޟm`?Y#`:ffOct+ L)ݓA`!;kua0gvIם{[2Tikԋ1EU !d :FӘ$A2I> R(fDYax=.΃/E)h8S^B_/^s Z}W lVKayod_ LY_'ZfJj6Kb&$-rn9T߹cOZ4+(Jm*AˀACUz3x ]rl.;zt ):@}"}W^+:E%B_|ctq@0=qvazzE tQJgӊ*N(kLRcՐL-c oޮ@=X&e~ˉ廲~QmĽIixYHbz)-3qw@ӏ@uSS >õR7hK_ IDATxoTtT|#{GBKD-$ ®{&۶6^˞strꘌؑc\D=\*~btDS^X03XYPZ4daBZdЫ ^- yMA~-[CQ| ki]@b(Aɱ9VYڼ<nNhuCQm(G@Qen}U)\tfpj9B6Y& g4,S3bn,,0H;.7d5A Yy*Z79%_=\co#WGxodwjsS9V<=xP9m$r܋2oT{o ፭'9j<ɓ&=?I8QUF=L vTII"´lC-ָx|KCw[q$mX՚& 7ByxLE}ဝUGsXr([P':்?:TD^ g17pv`; -0(U|)tivXXT5l>ZVn oϤ|Ksn2`9QYDps6SaxRֻI+ܯc^, } =ᥗ"5Γ&H`HctdxzldxR;)]Q,:==e+CB0L:ӄY #X3t;Eفâ1~ M/)C>J&TrބsW4xj'*~_$1~L@;C ox,&5uL5Ǻt/r򲤊E6%C^m;O!ά2 D\`wϨ.M3؋/aa?Wzh 3.hhf&`){50_S:[~"쿛E%O|Kp{ΰKͳL4sotTk?_ofF(payuzY91DڕEB5T8&bۂ\D R-Dty-xg5ΆS|qYgfg?|RR-4#穓c4-5wft14XxX'siY1xzcXM 9Zy;[E*C l%fPxEҺ@҅5SgYq{H?\Py^.C dnMyfڑc-Rykл狚"'m؏* x>kuH$mؤŗEh6}#|VQik.}cKgs:)[ fÑV5T`V!ęh/Y 2+=b0H4?n-Zd;.NmodPRg>T+>Fz O<(Ɠ(R/?O}Z+0rV6 8l5&ƕ6oj3g~gO?ꦮ+<P'Cvt3"۠L[M= Vp9$yfu ě8+zaYzbdr`l5E'D r;}8yU~`~( rbH"DmQHB+va|1=R(%w6fș(BʨMzj2M>o>3=E}vPd"Vـ >7F{A!XCv]AM>Cnɼ6^07xŰE+ҩO}^;]RэyK6(`0)FbXȏˑOp2u/la>^4rR#;F܇=uދ̐! >Dsi/5\IO۽zezS@ . ȧm1"a_1dY?bʑW_d7i-2,E`[朚Vp&L(dY,;'2aEe@E"ws~ m#蓼 _LB>!Kїn5\7L#?YGj-3hƌG|H%; sVGV<:$OEXa`%Mz<"ofM}[l&`)- Hlv |P)>猪bX2Re@4@PJ!S=LJlbȉHuSn9GK?\W6>{7 1WpA !]oۮ~F[3:~;ټ1,x @^~?jJ9M 1ԢhM6 hhsb41uf.qbo, ar"mIdi]kߛVݖٗ֔w4ENk9-liha"T]\^y15T:6\{`_kkƊd5}Lܪh\ܱIRf|En\-N*~Dr,1ZRT@X`}}]?OKB:; lԷoҸsMh*X$E7ɀy)G?3aE8~\U>Vy6/U=- CW5zG1y0c&,幘"JTWmylS?EY YTF|E;WPWGlf)ym6p1Hkk X{)W Ygpë~^O%x1gսOP\citDx&|kǃ9r݆5s[e-J`׳0}*9h.xė)孿Ub -9^TCcًHD;o*1\ۼ]_5ײ̃C_sB*]S=i5_&[N/=>5qkd6 րTH):W]Gg>[țSL^mp:9}. 3"rQ/lh5v&.M` < ܃j!sDSʐ_c5Xc5޻ԧ>%?#?`Z1_c,S?2~~a@kş~2@Slys((BY:#'Z/ 0u"B )~&ؽ)M[!mr7m2Ϟ[Eǿ5ird*d96)CWyRUo;,~cۥRa>rɺo_,EMv#C'H&O }]K5yi]+*Vc݃y+827/bb$.I`r81;.}*@ GSlzMo9<||ɨ&$rv=݆OSIlhٺ!,K0f!Mm'փѠj*^_Ge8˿=+<@ꦺk` ȍNюOnts]X+Y^|Eg_crh?k͘ǔ`h.ml_GSbi9x?%/MELXKҘeNS,=8. 5!7>n;sxMl&+y{+'_kQ/-꼭[RϞ9w~~wZ Z}O_ՐEzcT5TXQuw [\c]Dq=|fCv4ؽ 4N.V0yz5 5YoGa@+(V;8:*ZK/{EF"bw``]` HԬ+5j+ZRLAdox +bfV`~/r2%S>k>vƂC3&XS\@Rb ;&@Xl`ޑk+k&zd=YbB R:u~jh3{h1r\VHB٢<Xgȁ!^CkKm26NSa//BC$ѢSUt'уU: sSxw:٦!9fyfPg];u4va3irtr fFyqqYkH7Q:s'vX W^@b/`3kRqzvbA,]t li H \sPvy}\;v6`cQf@oD j0=5/qmϢofk7U-\u~K*H}I;y@|&oIn]Ϲ`rcz Oe߉*G|3 ϲcKؐ'FrN}!LUXTlQ]X̷w{_6OtLuG=^WQwxǢ٦a'm>A5,ؼdЭAgH󽾇x܇z%,ZRݗtG4lР>f8L33 O.@{lxFî2-Y8릠rEDTo ~kު֗Mu>Ӟ{<7[@j17p.缢+/s^5Xc5x? ?s?o 򕯬 5xh@|;(6|;H?xzx!?k_?;ݿ?RGcpm:8o5=c6FHIb0]G@vv0;3S ~l:{#0,O & J:vc5lJ6Ҥo[Ѻgd56gK4崺϶B.GOoA;]_3{1= 0fU, ɘx͑7}s'`V⊪cOZ1% =NZOߓt%I-:%po:YX+ ٚlyg;фUcOKPо4d'Lnβ,P)íg$%ǎ6ԁbeDbǻϳjbmN UBM"mwnI/{wۚQٻ%[X-462v$;ˢ?3|)7^#~I wdh }D{zU02b5 )2u.4>:XB[)`5 Ygd˙o˖`k2?pY]Tl2vi(2H R)|nqAف-F\FR:YrCɵO Vcl{K 벎ZXzrj/ϗ1N*C;lkEEXG{?sdVZqoN7%i\9hn&Ml4.= ,ZߝG:NId9'4+1RdnmM}sh r ?ӭHm^oR-)"4[-E6 :e ["tr6-7Z?-&VZlcf~q#Yx4g>Wy/.@?u]VΩF!4 =Ml/{^5Xc5>1??ooe5"J)ZQA~G~?G?׋ ߤ/y?_E??_l`8#N [*+TtV?w|[×J0f@h.dKß´[vLFiuxzE0Boş#š|Qs$ q&p C=@\aEmtudBYp IDATӢ|pK޷&(M6_l7`_Yr'o0x)ls٫> Hiy4X TRb n~eb(n5ي7G0lM3{]V?|^2IE2޿<:6FfǦKJ/yϠLo,mٞ~)#0^~[W4_fl-[c2znj_Em7ZjcH ?*l5{oj0ЧN< FՅ:,|ه4?c*r ۏ=Ld)c' GNohVjlvb PS/_;y<5zLad9YU@EC@;^vI6(CR}n+機0;vW\kz2?%R?ۿxYRP2Na41cThbvM5J3k<8&&n@;ˢT%T!Hc9| jcGqnKc5hiNz}20Ṣۜ[I y׻sRFT=%'%$XwP/9gpxv*4޳iy vָtjm [A j8v]R[k{|y${S$˻vo1,cH۬7 i# tX:X}TH@^Nជl>dtԫ 70MF:ih+ZeY[hPػtߵ0x˞W@~5Xc5>@?_o <ު vySвzfk6ϛ }~/Gx=~ __ ǿ7?]~wlOqJ0xgY;'Nᄽ J"W0fYn(H2\4Y8(թO'x>cO_#.BKS!( KAz6 3 )L ݄_ DC^Vjnʭ%Qp?@'4MxbP b܀_ K5t 60*S{voL Ȯ5鯯| 5Ů J-z0h3ݼ]@ ?S$G5̏v + 5Iv5%U#:\.ﵿ>2FK^ H\{CF΅=;Ò{C>}xfI`33IFEkx;s CH=CR"N!T.1tj]w@mf/=@,;☗hM)%x}SHgg{Fg/T(.LcjY`M2Bۅ:C*QX`Q fOr, qq >^{#a2n|Ci Ie>*Ԝ!;6F1&M(kw o\\ǘ9f Vbl}8Wz6~7E .@R=gU~4E fomf M0,\iM5ǠBtB07gu lzuw8E]|sګVL]2&e*'@T0S@j͘XQ^c :%a3?cuVUudݛ母 Ԑoӯz 5Z_Ļ?cJ*fH!OBYzZ\΢d,aޞjJ;IB\F/n{& 6WE`?<='<`[rt}@ zQ]49_R1Kh,ι6CkZ wdPjc%J>^d9ki3\áj*F8hX̟o%a_9ɅPM\ba I5`q ZWGhxu߂LnGgiR6^ [ T* UTPcsgX,e|H%[H9]if^eelr54)~X5H:HW."'ԛCOb=Anrj zOжJ^E5X UWcO4ў8WK_\W5Xc5oo?y~YTc!6a&Tu8ڃkn0 í~mlqw>|O||_#?c?zůć^&FД ;q :Ml=A}ՙ>w}X1:K}65,wII kW OkS%-9y Id'`oZH?ɃS`O+>|>5}Vх.d},m&4Bתj)3kHBñHe)-ΝA(v6'kȻOb%Uރ[3s|pՄ@^#F((L0i4 BT~kk^.֚@EكR4tAL(w=N=eja?Sהk6C)bG+ Bw]CY+:o,0h`+&ﲿ{Hlc CuSʎyブ1S޴yeS:,7hɼQlr~uK^1k! fq :ԘF|4yK{0q[jblytdY;+edNˮ`%zeiȑ+z&Ɇ_ 9Wkz#v2nUfi" #  Eئ&lW|иc"|"PjFd;N teQzl)@I]ȐkpcThMn:NJ#| Ê<e'V~u[QkҦ]\W5Xc5 e?WY-([]lz,5h!cł6 8ib?g,峟,g׋K[Nw?Wk8n>Lz B]-cO::2ގ$,K90႐6Us\k<VϪsDy ^^BRcCD>Mm7Q7daIUPQ-sE  WY)W;v i yX ϖW +fa#pإ!C2; 퉚ĉzDO]C8eCG;ۀ\_7|Mum_%U4~#qA- q6ɂ3\FySGRFcq:UA^-WJ[;rdL`M{{X۲7Z{s}ԃL(N hb1nEH!l%b[rGE(Ldu;ےwpYylYK \EpYB&`Z8ךcs=0P[kH{{s&/aѦDQ®,,6ј-CXؽ>>]ȴjmL9iɚ )R!~V1$/=~#x "˂?r8oH'Ñ$HT=l=p^Bgfuכ5X8,<1@koB[rvOYL'ͰFNHU3>^g2-S2 sK 2hXKh֊v-nZ\ox Fx\;VF"u45GĦܗ2 `>ƐsP*iL>IAuⲧ]jS͡].Ey%C)WJP SY+✴= gn=9Lr2dp B/6 аeOӳ:=zB1ʰ/r7K]bm@ O7ol0HͷĘ kC&1&Zq-[L%$ r82 M5M(W 襘44]Cu"kh]bg[&ר] 1s1ϕ뮻`?}{ci6rd)@>x {M!,RʎC4t]wD+_J~/zы^''Ý94Xbz׽k>ƿ_W.lP B9zU}`1H?0-觌  v_ ALV]0l4;ZS"D.6n!4[=;o$Fj1u\KJ ?q|+MN^AꡮucC~#QX4U9Dѕ X;X EMeѩDqԶ=Yyya?۞~g|F#o3'T0D`Cx)/֜eG7h^3\qC=X=eG /)f{Z:2rN GlgH ϡSubјv ѢrQ|RiXё]Jgm|!*c Q5M\׵/6-{I@*W/"l.CPS6exBCߚ}7`|w)i7@CX(yK2-d4lLObҧGŠB>σHp @N@ v|B*OLu5ĨVa+F0c@6*!]%i%xUڻ023 0,xkIIv9NUd|tu8Ld"8^|D/w˥礡5Ry2_pߧ@kul( 7HSUX?q]͙jO_m# }h`',[\w eb_Oxp*3df?Mau>ׁG;PkoYlf^BOtĩ6Pľ0zKo9c9xE/{^wo|c6+_U| ?f|9=culN\)ead׸;9==wwC )ͽ Vo?lmx~}zKVKs-pdaX.FD9ĐG,I0fɢK8 `?b:Q+ \6ww c0ǢAGg14|j`ElD` &ԃ|S*#z&8:劏T.Wf jyJsMVb%C; |22v}eL O;4$Kk@ih}GR;|!ECAn';k&>9m`QpN@A?I|[xm^JP9C l~nubCŎZ8q"F4I89HiS,ɭl ~hL`"<}9ܲA"c,j9DC2/}i{kg~*&- 4 ú4UX'hx7"{B"}TɆ\2\OO#Of2![DZƋ+:wF"Ʀ g$XOS?iaܱ/VCdvJr .~ pf 'ڷ ,o{ob*e2>Tv42k` z-Uy"A&s ɠTo.2m~S䴥*bԼ: z*_v3g%yjk_gS v57G  /  *h&Ϧ,c]_}x3 ?!i=Y4o|,Uz4vJDڛMǩІGJg !{Ԇʥ#K5"b] 򏷓{8EN)q]ڈzE]z3][ )ľ %%sX^̀s1s<e/{ٰ}Mz8kLڀ`zWнzI֯uzի_%~'~WwwÜㆍ4_MaѶ?wͿG0GB۷lu,H\(R@㎯+nדq*I:C i㥀ZʴM<޷L tS=A*8im`O20ߣBW[AZmS-*܅m'(0t~]XSs/ #Gk _xHf,HZilBN#ʊ=ʓa :ܔf;e3/ C«[OUAʡV6 ]ezʳTT(M*T(7LA,bVݜA!ɞX FmZF"KoW% D-O`+#;6GRZ^iwt6Fa٫OoRܫvY2l2@"=VW{⴬$R3f 6dY:] H2:Xi++ouz!| ~n%XhfQj+R+:.8r @~x&IPad\+w69~9&(}m14ߛ ~LJJeۛlʀANjcׇ# ]D1~FmŠP2=o}gi`|XxehȍUIe!p|3IK WCd>`q= 6D9!\FΨMZAs׽u94D|xWʰzqJ*dW˫m밯h}l@kVE*םTi}Iymo|b3度@oAMD4-QBFg&g g8f,U~&{N1U ʫFIPUfN_;Xk:橜:r.&ϮBJX?fJFPk*PXf@~9c9?ooWUẀ=s'1?70 IDAToMoz/7.^?OϵGxyM/]ݿ? ^f CC(K]&ѡ<w=SCYBjzi0yϢX(ecn.H2ڭu*'dm(:vl2pMIMU(2tcJvs;(YwRfَXob$0AD98JUJnS |& Lp/giŹ`͚Pm`@z=7 ߠX_\M07`}.ř8 $xf z?_ox~=dZ\+TMj qd[(̞0ƆWYF%O}U۰ (fZe(Xd[幇P"\ے~ ˴5i*1м]I Rkuoy/ex~ OvIƨ$9i`ق2 \9eTI`{ #%@Z_a]е^"CkuPuW waaRJλ'M][U*C [i*eoiL?Pl栍ǩD 6ihY7.}8=]N2@ޡ9nɧB1E-r8[G6 ,ÊJ:F"25T ImOְ~mV}&VO!?Y;maW&׍ {Hw>ͽOЀylG~)`ϔ-GF0+4xoCVHYWop%ҾjOTYDjmS3 u\/YA6EϲL'~xۏC. ~HIe:{6ˡ}Rc/$mEjiRrfoms9մ;ZTJe6L4Hk^CYrg¡8d:?Ӿm209snPoZ 1s1q~}#垂s)[oGGy}m{Unw{{.}???C#}Wib4 A Cq_K&^X2ˤ? ֻ:aNڏbx %% Z^!Y8.X־M)߭D#e z)+B_&XguOUf3AC \id 6ƲHy*%6 y_RX$1 Qx1*#>W!D+}0˳{LܜI:oz*=w>uaXG~&lCZ|.]' '|^^ rSzU*]Zte,1=+DRKTD69^6 )$2d fV ȊoP9y[AD GYveGD[ANsQ̓*`glԫZJ~/bap>I/Ы"FnlR6>iVmpA5|CZ!4?_m,K<#Ub*_B۵x+}z7 k)޺y1VZZs} Sk4B~bhu? V;@|PZ)ȩ-WsqR}lj>uA7 ۲c92,@TE4k'mSIi "*b{k^uK.;sdX:uP5OD[JouA>M܌γia _FŰcڌu?AXʹ_6UuG`׮zZ'븪g6&RKp~J6/\#Fݖhڰ{I^8؎k4nU%$Qs&jfuV&ZAVjSerOٴD3a>USlYD,M C(ـ2\!%럋z8m~xMsos$?/~?|pgý]{O6ϛ|zgAkؘ~>,?3;+}~7mMo5y| _1S[{_w_/ RV?]J6%m+9O^|n5ȕ`i;wk+(p7VuFeġ`8 U@t!w\k`bDB``3;4$yZk Fghr+FAq}lY}/]/txb7[xS&]v*XWP9: m1(ІIud\k4E~O];g,У~;;G&ç9Uz2z ws{k!-QYJVRBN"IiOZ R|mwB[6詄MHHW_O> i4{&RlQ7iZa !^ֆ)M*Z4HT#Z?H.ӵ c^MyoM8F\#ưTu()lriba}/ϱKG?u[KiY6ت|tcN;%e5:,֤"*ʒPlD:sE QHӿ`:PL5²f ^R6M`b!@ũ7a!B_wEW`X;~`w.4WQz ZˉtS }kkD7JihV= 9m(M .1+%D^uQSZB t4ǐ %|a`4^d GZXr5+}\eI<+u`t-]`MElX9]l 0ӆ:ӢgUbi`p Y](P{xX*XvEij.])` ne;3{Π, Mb)fR!$MhzœrXECDoV,Hȫz֤G942FiߦxNeBmk,TRw3O`=w$ &1({l$3{'=CMbd՞Ugva':Lja"m \kT!T'"S,\BWi\'ls<,A r5DM:K +)P*@~ H}3c\ni:A9</}K%?>>\뼯 l4;_OSvY,sݴbyW}7-o|#o~)yyCcoS,|Q-?x"+1<v@6]iK`V0C&  06YIڤ$c{C]q\A% Ńއ<`{8 ֥/* r|pI՟*e}Ve(0 '3鳨2AJ4eG:9*gӷ2*Xp8 VnX}xtd_Tئ$۵1Ì?osx̴XgRMU8c) /)Hű|[` Rk{+ ~L$^/)kM0}A:}5գ*2d rqYӲGS"'] K/LI|Gi KQFFBzBR\8a5p|drs<<hʜ)Le qq9f+ 0o+kz'Ѥy pmc,ڣYg(^ΖRAp}*xM;vX¥ʓN4!bT|=} 3C׳!޿O fiF40wu???'D|A|Aw~9qz/ }Ѣ~9Ysj/K8pi{jE4<^]&^>L/IGFςWN23d^5 (d'0Mjdme`v&R7u@3x"g'g&0߅oS7kuѐuF VLwxWmQ)}YLvdpbG@kѓ }bZxt;^s<n=F#?]@~ Bewd|m'.V.->6%SysX2ˆ,. B7Lć(!xyGf 7Pz"ox6_sAș/;9je@ܙ4'L-8Uj C K$0[VŸxQSJ_v}dpKF>2YF= %dvzv#hi>/M6w]bXr}3C!(bcڂ%x,`Kac%n'F6QRz7m,9 =**m)u٬ 6ͱ}.s-~2@$8^&s꾁a-!;6ee9G\| \vrx1sDsp乯.6 eQpIJy8T@Fl9Q&kd& J kSua^<ԛP>la?JM]}|x $r4T55nn絮Yˬ;^<灛EN.6TlcTcm4wTBMF֡h*md9moEsY^;5}J7Iw}Y!+l\t{SyWhȱR:|5ރ19J;-!؁''ecvrx-(U4dyσ/ZUѩ8a3#lVO%7by΃fջzZqf1Ͽy1~N5{_5}ߟ 9Uab ~X1'+(w׿W-o;O||=@h[oCaq8?W?ǿg?(+,j*Vg?5`WnBkL>""xg޳`]8BIUpn"1jQӿK˄20:+ M (yQlAhZ;r DAQ4؝r,P'l&ijކ3Mxe,բ^*ԛ*MOj$ rސ >fB⺸.c9!:NJ.#~$E0c%'@W%䒮UX FNKi^-a} h`@Re5@D UJƑ g*#&UnG>K m:e\PFh|*+lR^eŒq$ R-6{A-l@8 >l~<>nyQvR \_ڱz۵*l-Y4-y>sQJw&sV~2x[r] v@H 9 UFAV8w,z6%+晤-޾2P*;KBj]H%[)]MW8זv\ҧ^pUX1##7uH?Zz3%W`hZdTU%EtL\BO/<vI$I9Z4B tP\wF.,آa\|nGFKs>N6=M[+ٳ\PCխђL&sYZy9* ~`qN>"Rjcy{.W+98 %O@7~F`{ؗ.sw~~mp1Ͽy1o}[9կ~я}c|_дϒM?3XX\tH_/ IDAT oxzի;塇⡇s< Vy{op j{ˆSt_xӟ|tvQUiyT0;k():ZKyyb+,~ŀ!#{+TKfNY<  lW^+kSB!,TiVr- >%/d >olre%XM󽂻ոfR,2dwGAFNA(2 9OPѕy:1G=-iϞCרM=Aݫe-MJh;A _BP,B]߆ $QeWJ:Zr[._l)l=*8y.{ LK$ q9ԃQ-՝ElirMJī&~*|v^g)2Jஷyj~y9[ f1Ókr9V?Xlbckka.-ply,[u*F~H4mb=ɷ<4~~l5׭M# w~l+R8L8N۳ [+s1s85ԧ>~/|L9ό_.׿Wռ5y wu|ss9 x+{fIK[!qG?>@uEOv)Y)i(C~YI *eɏIۥo#>itIP~G@! bQ {X# hI,(,Nd GB1t&(ZpD+Ѕ)\08/p0e`x,2 c˱XɆQ^LY,CӫW8YMi`~[C7GTiax1ǍofwMޟ СN4KXWdŻ(^r7'j%bH cq·>]QUŗ)ET$QhQ.vj%hSĢ=ȀW PYb,pY AB64%*"{-{n }ғ2jl+P~Vtzh,}z)cC~o9=ק!OM)miTRs~I?m(4e]u}䁋(-ܶ[u6^b^FeꛒJU;Ma[Š>m&0:ȅM^A\y5'>9ocu*hT$཮c2~|5ӫ'ykjn=lKQMX fHiu%XߍCb}0i\3sob-J.˸Ja }F.@S~pőVP7JmO?i>|~x}ŋ;y^ww[oo~Hsq w]*G YnŸg>;?A\2Lf-w}Qr lo*U*Y|Bc(ɴqemŋ:ŷ>:=="YiY饨6f#..SPNA5 ?_B/nVA @@?a.~P,Np$)QHqJ() xȢӑZޮ)P9nxqT|U4e'+w'9HB$uZT0~H%wTomJNLy Tϖ-mP{Jmc-hxs7=خA}Q`,s9 /'BW}Xs6EyeF7>U`곬$)ite,$XH*Tk!/S%̒JLw uⱦک6T*O\eo-Yv򵍱(_+O6ʭYy29H)-iZ#du<ǫ*7RK4ghCΏFs}`&SB5G,2ۻtdҤSsul,4â$}ڻp>$?JK9ߝ֧\/`|wT8on]/P1Ux|o\SN0+ `1V=:g 4ZIZiwkk6Z > lTt&. ]:n/M}"N]wu,>0[&vjJcsBS%֡=Ydh5$V3|5KPG?w2 UdƧܰ3AQWU i#xNtP64RF9?΀s1sƏȏ\++_ Wŧ?ioG}t|giN |*/?e-gz_?բL_^^}+ %"Rv~J͟D~xK^~rwr7s]wɥKxxA:σ{$я~~{gGNh*v qt"E7UAZl)E q 9u|l|FvA; cΰ%8XBYx_M0x)!z~p }xmnVYtpEÏh5k:J3p>;!R2QW E$%Fs*tJWvѤ01 \#=sԸͿɹr0謁X Rz ևtQ%$J1\^׎BϞ.y0 >НlWxa}IVt|UƂyJ*&h90;8 `*='vƅ6|W 9VW MS4d YW){`KǛnQ!*ƒ,A+4i^opOTx 77J6jԏ%TgXlPhm⃫ 婁p1ʮ7>ߝ \qmm mΤvfʰS@FZ ƽЧB_H|lr@,"oKgf6W[JEd26Y&YIƽ5Uv`d+^h*8 nK0 ZK[= JGL;;Q`׬PfMw E_`ZQ ?|*ٶ79EiR"Į_valm6 EBʚVv;neTbivסHrU0"-Bgl.6dMRR1⽫ZUR=(fybZ,bi+E*_x 5m5Pܰ$V9Ha$ʧ>)> <@v4HT{~o~MI7` _sܻ(&߶-] wx+^K^^җ򗿜o/xwy|+_+_UiRq)9I"9~FEpG&*OE)"+%Jn %')arHH]/ߣ@@cgUxJa[,ԖB6zOu=#,37}k(!!+J ~e3Xu@q~ދzt$lsɟ!.@VAeh+Nʔח|)WoMZS2E-orl̓8)a_D0eɬ?;U9_<@EL$; > ~']S,k!xKFieF@}53ӽ›\CձeAPQOUcm JJ5 ).;ZIu?Ahמּ2ŠjeHtG5\d:NS&7qsl)a ~lPqKՍqtJIh)eT4N%KNEhIq<9kFfvO=xU=Q%~4P:H M6kU~=ͣ3d9ddW omgV̩Fԥ]LU!ReSI\6JȽ(#y䚚]˸n Fy}45x*mk#VeK?ܯ/eyNз@Wbo,2c Ҩ}rC{3 ?s1s<'n{}Ͻ{>O|ӟʕ+8  G,EԑÁ-+C1Ezta)&<} ܧ X*WEd*Ր: &Q, p#cSX;1OAFۏ"`|:ɛOħMBX*XgǷlflv$Z++~o ,4do9N^#OmKHս1?$DY8$9V٘հ+[M[$;$NKw@D/odFCoHi$rrG)>JHg}WTUTJ~ ۰5C6Ns~imdo ky ^4 /m}?%X޴.M$stEEGϸ.R~feY<DJ}iA&A4V}AuK8lrmM}hރ\ z]gc.FO9  ,hq,$zmR}hx;R4gHVri f4,2j> _y }8Z4gtyOU|[s{U5au[ m(XAJoK|&| !yq6*l2Al,P*`d=s RuJ@'4h;_U\>z3 )Mox,>/M0+i]Ǿuu q=8Px&7agע(kƾ+CjmɏS4,H% ildhAR^Eϲ5cl%G%_ds1s1dz(7ɓ?yrk_?0] `E/!"Y.}kQ9 pp?ul[^W]]}jbrtt _*?c?&Ӎ?ﳜsl[^xOOG>ws_pqFV˴9k=Ee<ep& YꟌt H`wYxɚ B[-QdkЃn5$ }\ &|K0PNK\O~}x$I_ Qq(Y-e_K MGSIPIvjejl ckQ"+dvd{s}r{WZU{&զ}.Rol}ٿ6U稧ĦD}T fP!,l]R=ͭ0D_9 #F3 )oZ)*4J~8fվeaG&s4}̌+3K1gA&+]U_ŦUPH>AlW@ZKt41D{Oⵘ2 7btL^/iT7ge:3+ I7$67V29>yp F2S"F2a&963c>G9.D ~aСyPuzTi}ϗ—m,]#I\c\ÎsxSX'zW.y"""ww?n;wΝ;k !??ϻ+owxG"ۏ}c9-+ܪ9_xraopkTxV]e7ٷ*9w ;D H #*5rNlV^ -jGa+< IDAT 172\R4H_yntV#kSKDk]`lƃ.}>ƚ-EµIҞ"sYHX>=zDrK2ql)l1*pI[Чٮ^Lbz lM]nRA>?'\-`s\=*=~l #G̻ (Ya6T&hHjt5٢>+t`(.q<̅[3d`%+W#|&> *HU>F.S0\": "HFє $FPpYY8<[dj4F|1GxDjRꡙT| VQqb B7m~_ug:8S%ݛvɪ]r|k!FR/c4fi>U?= wv)،Щ͵@^ 'wr)`7$:KssvBdO sv *{dyYgu*ZB@E`I;Oi%c$'ݥ`xB|~?k@HBrсȁM%_` d_cN(xz~̱0t{EP{dZDkMn?M9|S0g8ik-yh)M4mNja@>so޿vO?яQޮ@Ό--knfкhiӼkr6r-̀ F/Y-7.Ѿph+#`XWEAW, e {4c?8Z(cVY*T >-A;~ќ`95aEr/֠{5n*,!7j4 %,|ל1x/|0}#>eMɟ嶃mgє-YcAy2}M92Fġ[V`^[ֈ561+4U2 Z&18Ε1`S 4)C-dP3<J$NMz'0D0|lѲ4Z{VNS˾4Eq![lzbj&fdwTШ!K.Y5Ll->*utxxZÎ)J]>]V/G*'@Sϱ 9v"ֽc[0k _:ABŽZ$,tٱarh:L ;u@`No*T` ̗$` L UmjUU6x4FwX$:. b8zv}XƇ`d%ɀMA|IKX7vI>QSw&=]Fvq}]$&/1 !A.dJ0Z8BTɯ (*Ya|{Ox횃<1f~Sm _8 @;AU_M PDmI\[ !54A6e%|YO9BɃ}ݏi٭g']dw8))1q='ʨ~K?_yL~~m֜x}nuÔ]_kcG5F`vq㞉qidPmDLCs_H2p%+xe@^|;OOx&H* Elb\xͩxlҦùh߬0(bzprehQDpj2De{d^)!g@И樔1{X.٣ħ>W-VFG"c7 *Z5jePXms3ǜ/é'g3hܟ?Y=BE uԝon8|TyU5͕ݳ+Hז l͠F(ϯ}0`_$aj;X/BEuePb6T~Shs*L+g">W}tLUWy!c>l<ߧuq LiS_6WMuV^x{8XCSrs;@.4ג@ Qj! 8`Nȹ \A dBqh]#\>Ŗ̂:8,@נ"q-1Hqߟ&o$-G]uaĘQW782VG?DTĈa~;(=ý詂{OYAҧfuUvYQ 2kDWsU `^UӚms+,lJeܢ^5OιsD<_lr吭DJm6X"Hd3T0C4XhѮK-yWLJǢy]!7OZ$LI'o@ˤ2/;[Y{[N9NwQVX7Q>d[Qb6:7 yqյ>>|isppw_Klj9$GK+@v)QX1_?~5kD*ot(/l/r=*RrCӧ@M4"٠!5TX>cWY==E\);D W7 #)m|?f!>E˵lbyۯ˜nVmMUkz-iS|?d^^!󁑏ZTO SCt ̣7v6;LΤx]   ?WY;h>vp?1R/Kn!8>e-m似$"`$0 ODDDDDD_H6_7WW/~x/q.~sX[a \N;T3*`uގSk}9,w4 kw }t4ZTmzC!;n#ӡۨ(E%m Z\PMVP."1p՛\x<,%~; eP hn9k˖hE];y*Ùs GR '"\/ 35Zk{D.bve6;dZ or}_ĦwFJ}K_P/q-9׾W`kڗ~$ʵfXvz_3v0LQ뫢I V ˑ d%MC;Q#&H ]tHc_8h5 (kAQU *QmI.Qe!߃APFG}0;>pmhu 4"qLzdϖco z110uKvQI+E#@>j6 W8S.ٱ6U"Zw _4f[aC6 x$SAtJ//"F'xI`{Z5xZ$+ M\ 䡠, 6 'KpZO:`ahfmC$hE`D2Y&2xzըn-aTF#A`lhjUGR 6%BƋv8-x]Ykv1Y薦L#ķ@\mL ltM{qi;?+dP|"PhSRb+P( ZeԪJusԡ㳁Qr4N}`s=g6g͇sԽ[M=rh7b&s \ a1V j ͼ6LO*|bd\>P1+g@4sw+ݻ˿bbj:cS"n=ܘoMMJs3 JTtm|-(w5W#Px;Az>(0X~jA=>ЃjOdUd,fRZϒ>?"rhmClrȘٺtHU6mUku'1 Cp,8^5`F^|R mXTQIXQ{Vef@h sbU- 6 t\T `}P1K􌈶EZoy6.,};|ij=_"Q-:`nsC'+ Pa}wwI$[cn/Bs :kjiQe,mVRܥF*N@LvP[b]FvwGXG)tb e5R wG6F}6P{cњc8evYgkk1/:CvStm5c)sRe;;{ >c^lw>u'DO3Jl}\צuV s+tThh>>[]<=?w lehkG[u4+xl~\1u<2+G=a> ]趂n`EP[6xWsX iSg|;]nXDGUzƟ~6yLDDDDDD_J 햻!(wn-wyK74 qK<#\X+ Pޡ@ y xF۷CX߳M*F1D:7C ߔ=o~w((8ïK\`[;Nk!7;;Ϝ> WCC+a5{]_>qoWˆpSٗMs$hb ,qnʫϬYv%>Lo|SL]c{E^$)Nq[>y~@KYkrx_p;w^ñ:׸םVvK!{wp%[tPG8=XW Fs"y_?z~xk@x#aP(V +,PpW~UO>wV%N#}>nѾ VXkbmn7|zoFz5y &(^=$ ?,(?hC< p*%x:v-żzpk@_亼 jG߭`QGB rH'׾'o""""""_%6r&iJXPQlvc=t$T#V ((X{G^'~w oC@v[p~g o X`/#찐+?.,6<}n}`gGoUT鞛@I*[#<VQo7^7^p >a)K3 Fܵrqs X~>k~75t8{_za߾Wt^?>[ۀ_$?77.>#[A{r}]\U)~ĴV*)DDDDDDDDw{~g~vnhw[O|wOu|P[w?=;?+}s&1DDDDDDDDDDDDy^^2ù?|C~| ?ӹ>uQ """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""䮁IDAT"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""/K@DDDDDDDDDDDDDDqw'""""""""""""""gOc@Oc@chi O|䉈_O3< Wg|䉈+?8(IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/images/neologo_darkmode.png0000644000175100001660000161604214743453644021340 0ustar00runnerdockerPNG  IHDRzTXtRaw profile type exifxڥY9Ds0AdnANRttj)[QF|agc(п'_տ\o }o{PNog[ Gr"tw*/-[jͺ # iF6Ƙ{N<\iUV}V[}knˮm=O:~3=:P՛w7>/Pnvǝ?m]߮Szc5^%褪g4 t:gb)IS€rM,g'ctxL{ҧoO/-{Ժع۟vg UԐS]joka9XDpۙu[m9MeϥIQ,W[mt ?%~AEJn/!ms@q(v;41Y@Cٴu-NtߣYѺqa6?$=e4^:0V/Zyop*|)^gΧ[xqiS/ifLm#=uq[Jpb ^g6VF!Bbu@BieQ*u}L,jr޲`}j^@vgzѡ6+̞U=ҡklk[c~̝ Vw0ob ܹpv|OJckeV[7LwUv-53eb̓9q-ڻ[#rR.r Ȟ@#%l!I4smI6W̝B\b, O[{3ӫyᕨ`V,FFF4BsVNQkMBt!SF˷}Cy75;je }ZSk[) ŸNLYegSmp6VL>g)X1-2qLk?Yi BJ=@NIq߾'̠?>XɵKkꇁoSۀDȉGGΡ6Dԃj6x0Z1R s<35ShL]@ȩ߆u3 `cI? 6[ ,p.({IB \Am:xM9 xAzbg A4Y Iigz|%cn9TWB#cDvSaS+*9LϢtBc[Ä".t<d. ZY XF쨉!%:Fzh=*2+*D79hubƃj>xŒԢur^|4oNPLR3 RF~_, -n; 0 t~'c$3Jko Sg 5/Bi0*@?Xa {壘Rf8S Jm ٨-;n=s"F?:ye ,$LG5# %̝5X$/83a JMNF o<`ù,P+X~%agAfr٘LPS|dL]H:n5 lh(E1\sʕ+o bhXҖd̨\3iJ! H҃#!.J#B`V0mW˰pC bjv38@bHzp@2c7" =}c2vubR);Q&#ǃ.v|@fK $\Ea +ᰙ 3OS'*8ފYDzJE kJp-jJ+߄Q(ˢ .29 Σ+@M£Af'3&3t9μ87~gX#T\*6&½-La]o ӘNFAp䦋q&)&0tN*C|ˀYANNqJ#!z쌡E /|8P%QRGɉY@@ɕ^ d^qJRUv .y3C@d."2H c:!9;Ÿ\he7E#{9 E2׶\~g^N h4L4~}7]O8)υxɝzcBp&1NTf&D'&Z% %<L~A+4b-Hr /*'O-a/h9 h"ߐ @RpBJc`tNsuc&yXUxB_0-cGsnA5"&! "qnnLU4p_[G0$Fȼ$&eX2^-UWRc FR,og):U͓, ]4ip@PTtĶ>aoɖK9E@fg:0;V, &ƐsuO-(=ԹnGA{iDx:5O|9"ѠՆps"AAZ.=0.: Q9@I}d1Gu=;-&Zh` 4n&ZXg 38|u#j.( U \7 :Ј'K~=Q&,<FU\%tR\2 >xk>O)(l)Lnd2(=,l` .gh: YVi`|FDDYP`[:G RFDlJU{LlY#RH)Y8cN8EnŧFy5ۈuVt|N 08]p['eCF7\#M`D dO:draL^׉`t2Jp𔄁3l BϪwQoo#laX~h|TuY2pNmA!٢{&`.jaW"eL[Yl-#>)jHuE0AV0FD"ߑTlOgQ*Do]*ZaL6ʕ""@E0sŭM,)!< ~W-zxUuxu(ŕ"Sv=tT^34cdr~ ~CQ[_zbt#ȅ攨d/4?OO'1Sd#>rb@pD觧O|`= _3i(}DfW[eD0|\gƘa/| 61?4<-z(g~W*AClxjGT :*LeDl:_йCJGX 46d;o՗x^8cО]0ܪuOe'ҹ91gSJϴjlyY2r?CGƆ.s'Y3xAT=@>g3ĕ"N@9f܀,h:cG}anTx*sA9ΉjZ 1#{"ՅjK_ 7eK%uPE4@Pc1೧0%~=Jo.%YiCCPICC profilex}=H@_JE*fqP,q*BZu0 $).kŪ "%/)=Bt+4m )[¯!qH jsGw1ѯ-$YV3m MyXd%E#>'7ď\W=~\tYIR.f%S'G5ݠ|!y^= #yce4G" C:ʨFV iO]L.\e0r, ZI/)z^c|;N>WF_m37:Z.;\CO5T\)HS(30x yqd pp){ݽݽ{r^iTXtXML:com.adobe.xmp @̛bKGD pHYs  tIME "H IDATx{eWUkGUw0. ƛ&v \"@DPu$ 8F ED !@bL&Ns^\{STuT?cT}9\k|Т;}kB*BB!}6K@Դ%͘c5~2 0i/n {sŤO!|#*!B!s6`sL3^ߗw"ڇ2~rx !|#dm6YU<_WYB!Bȡ7"/A{ݿ`^w>r܇6CO!|#s $B!B m!dn9.Y7fï͝<77BTMB!BY#!@6~GBZHU e?p7BuB!B!$CB6?{oz  P/>o6!B!B!P'uE6zP?@7i/yB!B!B!|B^[A>xjF%B!B!Brd3B`yM)B!B!B!A!5ԠhC6ې>E1`@M%B!B!BZBAs@ NtYK9wo؁B!B!B'(φߘSs_N ߜ1x !B!B!B!Μ bz܌DyB!B!B!C9sxtgB!B!B!BHF㵿/7B!B!B!B/=(B!B!B!B9L[G=ٗMO!B!B!B!?=B!B!B!BYEv !B!B!B!.9* !B!B!B!d%S&B!B!B!BUfB!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!BH/!BEZ~9\}!B!B!t3 >rm/m:!B!B!}`By|(Bh7B!B!2KUC /y&n6TUxЇ>{<~qGzӦB!B!BCG-g>W_}5nf|+_ 7܀;wX]d9hx'= ~'= ;v>s!eO{qu×e|͸4M7;x#>OySpqcx9!B!B!tΒM}K+2 ?7pC{Dd!Pu/K/qɟIp xӞs!kUW]/| KO6r(Pxa<1';80\OҦB:eB!B9̳OX)Wٳ~q%ӟ4h4 eYyL"Oː_)s`O>'tN8|>$ !dcSO; _~9>qm!i1if`tGO';??d6!B!ByenJ9rO+}pW`Ν #"*g!N>Mc ,z=,rUU=a8餓߿v|_fYz>wqGdžZڣL Q/"N:$pUWBB!B!dS@A~p(:f5~:>яK.5\iY39M߈=&mVp 9~Up8'?ؽs'n8 !>|W^y%nzCs}UJ6@?i˿&PUUzֳN: {p;ɽ!v{/TybX29y^㑐C}YWu?K/cS̲:B6b ԁt>ݛu=)Oy :,<_ɟЮB6ܩ]v;u]isN\1b0p뭷v֟=W"B!BȺ )o8;N=۷o4%՛9_ \r%xߎo^1eϤT D&9Բ'I?-~3~ /zыg>]'lȵf5Oƍ7ވƵ^]v+_ / P5 ֝f?ՄB!BY{yt)8&Q<>Ox>я/0[(_*fӮJ'J^l'<  7zp\qΝq%tä;gZԬj%>{3-ϥPTOރsE~?x^m;!@1xЃ>ɸkqqW,hsԴ\{*XڪjZ!B!B}m%{&eV9ypL3WsԝrKZLK{41g,_{q:zvӮgooe/{̾~O)2vyK.9:=ivd=f_X͞O~饗8Ok_KӶBrd3+_WpW[o6K_fZ{f)B!B!냷w6u۷yΊ%q7=7M|KAxMHNY䌳5\O:?lK[)B!B!lNX~cޔ?em"2wn鄺+Ov=Xe]658lq -/yK׿x׻V= 8lL O}3GG>y}Z2t^UBycđGs=Kv}vJɏu{ЃO|ԧpM7MhV/=B!B!ЀƼ)9\ "K/@?2+/>9Mozoga34$=C837qŒo8vA~0z-׿o+lNۭyOTf˗?p}xS'_|G>\ 퓽ߙ%O!B!P߸7&{i&3YHpT.ljO-攎8:֟2ޜq8;-&xC=o۱sΩ_y^w2\fN,NWзCsM)977pwef Tz"B!Bȡf{&9絇|ĉM{3: r˲LR0.d})%{~\r%mmS*)B_o~sZBgJ1~`x 9|\xoozӛ<zիf >i G=ۿ[\|ŝ}r4}}8=ߟfB!B!lzAe171t)ols98 =R|KןrNM- s=x_#8x;p0sP!^r ocX4Mun=ƃm>do}1i˽GYNo֭[׾ݻgGvB6ZR>z׻pa^&s}RP/t{i{} !B!2lzAtc2Sя[D00ǾW{sds?>z洬yr)Ɠ[os\p wk긡pCxހG=QSqis=3o)=o=٣9Yo'3'3Y}|矏G=Q8p7Z)xއ/w]pAUiKfLV_'nggCB!B!̦/{mzȗΩ2n]OVr䍆Cs1صkW,GTnLfe;ͺgW^y%d0Ԭ'J̳7!tM_Uرo}[w ;!`)ד=} U bӠW{_^{Ȳ*e~~[GB6*"١w~O{q2eʵ? >7mTĕ:Lf~\zǓk?lĽT"Պn:[ VyC {so;l^f-9M/s1'>̊y̰Rַx{ߋO5u,Q!d1;#g/2%e{c_~9'կ~58lu3? /<z :΍Zz?_2C_o l}O3'XMx} Y!̟|!ާ?rsn-u=e~]f_wH,֧^фg]6Vӯ_`zo+󆘪zJ7+&h_9M/ȫjQF ttmȷ 'rQG/|mb?] T}hCȾ\s9sO.M>!i:u[|m'dc!?}HG|w;13Cb%z}s&!d썬bgtZ̔lNXwYoՏ+ϛyK >t:뷷2IStll VY~=46ӽ=$Q\.!=FcSqg;̎;Br mejYD=a3eyV}}d?Ǩc> B^/ a ,ޗ5z꩸뮻IV|rQG;nxU#*+__ÿ|رcT1_ _t7!!O:>/#ć>R 2:srę?Mdz*?܍(D4_) ) KҧI I}]V>ws~@Cyz|\0Y@gLH$F=VAeهWS?+wQ4@h2}\Yxb]'JA#"*O3gYO:Sz%xsM/o߾=}hT\e}.`r-~lz۟ ]¥^םC|1̈́PUN8lxBҼzˮ 't>@Ά{{ SJp>"L!d?2[Ӌ@_}H?}zaY1 !C }Ub&y'{;φYK{Z)]PJaoWoZM>qW?Z%{@k/s`G5:狨Ou(/T~z͟XCnnǯ37ٛ1/HAMQM}i=דYۗc{|:*~΢ /OWj!YNs=wF4`0k\yv<y6V++/?suW\'?xO>yBȾ+ͥG>x>38W^yeg(jRUUu@ l5tx\{ɰP :wsK~ "!$aB6~BۧgW-*[OȤMv}mf|^X˟rIXpc='阗nJ6JJo{!Y^WmUdž ,}X;$;?&w_ʠ,2u>~sڸ5󥚵>AO[M,*`?}XTX&2}u5t+~ۯl_d5!Jy?v~V_X/ԟ2eNޱ2 Y/fcoe8F& IDAT,>@FGQz&hq4Mkeie'+;KK8묳pʉ'y;7]pA$}dm~x>4mC}Rն&ށ^e3EƵCn17i !]xq@ mQ z͘OZچqrckeV$Ok)y$VR/c}2[N3r|X?QP1O}[, lZvc IrFއl;lUzM\b7MCq&1}>;U tRmKsb  0ԪI0fI>.xq_Ɔ/a mW*Ӱ l\F@Iß29'u^>?väwOӄ U7B&e[0͞=hv}Lu2M\v\z+[;_r ~KgӼQfǯg/Y=qرcedf\mA:B'= ]tn"EX%^2|ߜiGK}Or5kMfZ/W_}5."^$VH ‘dN2?A\Zf Bi$m^#X1 UHNS z@1~~˜!RGŶ^)p@ϔƒ<xS'RI߭}$Җ4bdIHUݞx삤˕"$a[(\]v-c9]:վAtQ:SW'Q@[:>&dwsJGLBM`cPr˄ @/vn;%Ӕ: \{-ʿK{Z<\kA@mlNKLU?wYjw׳uڝ[ _d++WØʳCQmOꙶڎ4C.Ҝf" YU3JYw ߎ &}O/d*ªF5nA4]=@h$ʎ9NǢұKD".u9gk߽vS#8HH1@:sxg΂)jkqi=b s2nOCgK.uc#4vck,(I4؇fu5{z9:i}#z4Az2..^5R׮8X@TZA* VM~Q}-{M25q`)@y _ty*ߴi*ƪo$r~\ȟ]LAb;Cy[=XEn}Ԥ:*ϘXSWbv=NmO8C-f'IО9(I6U IC:v=g԰ 4/UfCծZҽ6v A |pA3hy3h\ q1&b5Fh[.: XUSV,oIA RTh 4Zw*)_fk+b_ Ҿ&|\ϛ~1Pı#}rOn4?x9Gl^0o$ǴVvU ߬ؤ; #Z;یjq=cY @ ^:o=P4- 8|Y\?"eef Y [C)"ڵ96TimV>X!VMyMbkxtKvHDzbֽe/eljHHy̐߈yS"Of2zpAgws]}{7}K#c4=YS3k^n)ڐCM\{cǎ!AMd)+]s58w7_@Oޯ%۟u pYˈO>)Z_H rgddNrwbM֜.8*˼0gx= Vf(XR;^EtZga􅳭(޿- n-YJrjs6qօ0Q%h`s;M(t^ /9mOKPIiVsjDXy%Z9pq8C*q`{~ֆx_vAyIJquB_L*D4,Ft:|3nlRB * Vui# Єd׊=¬=YqvU84#ߗEywImZX$"I@޳uҲSkK)`9)^njM[ؘз246,H* Spu8 vWt݋:s! r"Z1StJ\ AD$jn.*0&BҁZHYG:!ODl3žu﵁+6iiȕ?R7Z+dl bkAkb>BT,@ GRR1"ӼSбa+:¼praBvs`HcdZ(@/bكEy<@wv.k({-CMH ~+P! O'3QKWA*[i'cH,DMgThrPںآS0JCmh(`D*c}+ ;7> 7|˸ߋHܱ?Y׬$s :oַٷĹox>r"hĒbdo}[E!ri3u]xV2 "]vE/z^WぃAQ y<뿉ssĦFKUج"0E2D#: hR+hʬA'|NvhWNAؖsQl [3Bmz.)d7{3RKh&1KQv?U%e}MHM4m쮀e,/´5)9cgC6P%1Kj{:>=C2ˬ,{oP8H;BV4U`Vɲ LsStILάB0TY-\f0YyjQ@_}+$oEANgGEtG@ Hi,Dά-D|m%Xˁ"sՄn[ore0U oĸ h3 sB  RCEZh7g_&uaUlJl-M: -[5&{H6 VӌValXwQ{2xnYN0$KߙT/p Bz@SY֦GTp-t%4*;Y:c.=q1`V&ʽ׋i|MHc;j!cGڠl_b{ g [7LT.A66%g "IePzFuc#HG}8 X֩jD.PܾbG hT:Y&f6KB:%@F"vOڗT1eQi XPV@M=Oc؜ ੭LK."fd:NRL+P[h ;nT[`!])Kٓd=DC@,ָ[UX$S1W ) @i}c%RAQBr>*qk[l?,! Q>k1` MV P x0}C]:M)85DjMVpA z="RDcA!ub6nSczv^qc:M-m*[Bٶ|.( ^yxgLf3]>oYe3؞YNcHv+d^,?w27uhI$~W6iQˀg i *ݏi=*ojT =;c/{4<^^K',gsxPAǚiGgsF@voC6*d <'G( L)ȗ}A(3'{zMs/|a(g<'C^s8}رc~q>h^ im{Y(m9qM'L_3N} q_T{✧4@={j*Ӡ4;K q2dBO/%Њ)y˩" ڜeS@hi6tԴg9eܹ<%4nhFMnh"g)~aM8ڮѤ/(=9NbjIY"(NrM>ߎuHOCBW6K & mЖ+8E2kG:tt9j~AQdz6ədYP1g6&KU5 B TJr'|pž A;G4jͳhKa Dɑ[)JƓR6☗YX Ar,Y搓p{*ךK"k9 vm dta7rE$}ˠ9ecDp]pV, dA ){;]mKi.hN_б߱]w *JcdOH!˒Jc,ٔqC][lʊLFЌjRXT`@ vvG _k^ @͒ l\LJ^.=IO׌TQ@FIKU7@2Jƶ7q=C,"TͼR+RXds)X(mKLQ&&ӎw[\0҃VFIm޶? I/2vIEn%t?LXД%>1S (v$APmV/j1QED-)F$]#OPHH=WZ7_q![!BEuUk }}a ҤUfKc# HkjR?4XNw־B*Exjl* yI"}"<,N-b\p`:݄Ti 6-]!M,Q>y%huȁ2ک~!Lv6 @غivуuc"6>1 O(k )@4D# ^"&l͕=nFR(/G&U%EEz=]H1{؂݆ =ZؚTBPJvE PlBSv.T:V`wvk%ԡ-H)ڐUG0 ,-@SPj٦(U첈v}VNy^4qV=@ 47=7_C@z- Zr3 [BzhLE,FgI,y Rg{Z ?ݝ؋{01On0i=k8,&KW"~Os(EK_1,bu fZViҾ۷EmR8G4|+'PB:\[lR4.vòGݳzц"ر5)Pfn4*z7N?̐(sR:<,:/aii;ԧO:vܙ7q^u]c<iS&k6U51FTU/wuS!NTqַ+1%m+̶W\]vᢋ.¥״󄬲nx3GV4{'p@Xk,8&gRfgti6^?[%9趘|`}xf%^e(#=% @@͉C>t@{!ڒY5o]lE Q'=AtLu 41BB{b!\-U tk|#mJh\\n:]wK0j׋(yzCݯ61^>W*CA5c t)i$HBQ߳q=+vkз[1VHL:Dos̪ܱg{;W#&X2VC5YL.S0O/ǫ=X'{ !X(C|'NW*؊֎ZTEvHh/"0 .ڈ+#d>L{Y+h.ʏmQTv/RЛdPJMe b d_bU IDAT+iQ#) 5P۪$WU# y=OnK7Qr9jkIW`1t4S|H{=!9p1[/cB!YvTlkO!"THAsJj Jҳ6;]%݃%Y#mU [:|/<~u]_=pcn?yscp8eF=dG]y{6W_#^p)S.2bs8q]wiNymB;|> :p g?O~ ׌kƎ> O|翿2oTUFHzw5wkvΊt+eCM21[$ga>DU"%&ZT&@EChRE,Ry,C-1E[^#3Κ8vw$zJ.-&ԙ 6kD60VH?)CnK G$f02g_mq#9f0i=*K3zvߛ YLO"4XCS DqtV\1b|YR3_߱,m%=D@eoo^leXfg8{AoB$Ԅ`^_}[E[Ul%~@7=Jꢿq.I?ވX 0@r/8K|'`en=ۂHBt_`^[³CUi里 KNI$~U,ʚ亷1eZv?bOzV(y ̅.-DSΑʮԾIdp,lP-Ui[xadC9"dJsk -&զ)"ϣmn鱘e`NuMLIY[tߵb7}Eu_ f4n-L4UYAIaLKrW^yE,7EM!z5 E"g% 2MH +ʟgUm!Uߧ?9jAUsp-(3ڪ b뙋*u3ص7mlr#Tmp]Mp6uYۊ@Tei}}s5.d,{;ϭI\"*BkW4uW-8E$o I5BB*nA$v^k](^7KDw8*z[kȠ(=Qz9IlZ!*!}バ*T,nd0vKLn6($&T$ҵybV._v/ݮVjԌMϴn저5BtNKQ \>߂XYRUT*LaBvj m~~ۃ])0bXhЗo*S%&{غ~+ I <\ѠJXhB}8ڇץg{GM cFpg^\Ș,ɠSUqNs8g/--u<[_ !ZߓO:)ؐyV>xرkyp4M;]w݅c=|k~/uox.euXY[].YtmETVb9S&e|UJ! 4a9oa!ʔ!&wևםVǻ8Hrzu0x&XPKM!ih˖ $_O=#B!5,ju[\Js9eT7N\ !}ޢ|yysT}SčYCEk:;5m)YJ췥3tz}LVC=Zcd|>AZx0&;Wc?')sbֲZ TjŜ) 9cF*CV,bQбo"s!9xyHZR:?KZ fIBT/ eᓣز$Xg) {4وZ2Ml! %D;w3E,8R L2%/ڏVުh3uyBN5p R- Y|ʓ2 Of5swמe6%6J5e?KϪoB+DzQnSJ; .jʖƶ e_s O̙eqR[=9y֣" YQ?qΆ.2v}ɢWU *"@Ϗ&cm[Ŷ Jl?VxZH(c\h0]J&y-O\l I%}nTB%"(9k4L1aƅ+Y&F^T9\F%]9`FClPX﷾$aBW2ѠҶ+#ӞgT}m6d`e9)zMcr׌ 7:(lo,ώWMlȄj |E4VŅZ oKb*D4G.%bhE_?IL "C۽/{7H~d^K位־ߍ97hc>用xX0_PE_2avك (I8;R#Q8h|^1N@i@ ׶J=C mse{!xlEqHk.Z} k1JBGi+oꉵ(7h+*x0NoBؕIziJHG#jZQB@S y(*T 1!k7M-mSDŽ@+IzbHzsGǁ"#vH :Ƣ=4i?$={+@{M܁ܢ# ihZ5q6_\`Ls/Dz2Y܈Iɟ܆`V,8Qmr+! JmhBrp\+jLrl)h]W*UJb~:Ww[",R[bx*BbD jUj,Ue`^\IꘂPl3O|.sw N#<wy4J{R9Xξov.eo}|sk.˔`CIX_ :㿴1\y6;eK2@ |K^ /x#m<sa/nho4ruLDTRJD\UY z)`\7;42ژ+/FMهaa*+q9R)#XzZgkTj۬zOjZy-w +HlY3ql+.8eɒ9cGmO m) S1&hk%j~k]lj*w^ktJb dsT[1h{)#bZVER Mvq_SfFx8xI^_5q}oPxE[{vݳd*#T 2V}sE;Z=^2'`!^CALN/U-2@UDA Gp0Ggɑ$ɠJ j`Ot ڶ^9 tmֿe3t_ŲdA nhK+,:n*ĕ,6 VX|ER夹$T`"TU#_r 4m􊞘> À0LuQ dר y&*q<8)4@,4xuT[9 +=ID=A3)Pf[$b1*$D ;zҼ =A9)6k{cS@IGem!IzF:T a@cc0! #Kp@hZA[CXLeW'p!ؖiͬ)p.'|xztP )bY=lb8 mXY61u3Y$HVWl^+jY5*~A)'QYK)p0jg-]Zz2k2$4jOSEn"P~lhvcJƇжj,alkO O6$yh[tMCu/ iΘxc%msNLmQmM-:JaƍkA gƪTh5S&wKj1䁇X`W@ /U er ՞A@cmMR ɁNJ UH^DT6zEuƍ5Dw[ $W1[a!$G/͏ҞDT+#Y,<.*XA-XIzW4H5v^U2Q<$|} +*X?m(<q&0X~F׮%vE3.ʜT:{(qNlSԭ*lOt|,(AZ3s6&ʤ1[n 0jwшO6[z/cN.{ Bv~ϰL5 *!=}ј&L,q_՚ @%aC,i P-u Kuʆ0hW{3èrb58NAeA*Yj"_mlm3;*TR=3v"[ K\)kn]soj* 尥7o;V`bj-m.+EckI2^bk<pO}? I' {I`Y_BNк#[oñ i;te[.\77>b1GB\a^S`dGjB6J|Cu:hv-b="ġVрTȏ˽VX۽"<8Av>qmU FbzwhTvqmv-m-@R#_Z=0 I8dshnzBRz$ &7:A1O- =Ft˖`t ǀU&\it Nʌ"^C*mޏV[Ӝ%\:i6B|f*%TB.0JfCnEwZGN19Eg$!WM88ĸyQ}C?0ը|ppYK1HP 0>\>ټśw0~5Pת߸82P\kPY,uM\5ڂ d$H;"<錀tQ EIP|np*xp:#γE4 ӽcqRI]cB ` >a3Kс@@ ^; W&ţ0@?XUA uL?̆Cbqtaw _πk:1fȏ@/wߴ?9ZWN|O~>:5V?{M"SbZC8 %tfkWJ\??j8tì]*u@ jgUiu{β!cgPn coełQxF©-1[{G*ywFf~庶kqr["ae)6 V6p&-ZV^-f7K Yc:ùE$q/?52zz/R+=7 e} )ޮ2>n= )B`Z5juޘ Ar7OuS1y;JcZ/*d ph9לwNg!1ldǺN& +BC~6h )֔O_B6b #3,TI/%վxp%[KF4*{g=&_`%_Hf%ext{B("SH2;@uCF@ *h:gv8ļ`l K1Iq"?!@qbmA?X1\}/XjD3N4)q7PXFgfoWk ^1m ý@pk'{9y IDATn7= ?&:)|4NUxW)rw&{cih$Kn Jߏ {F:h<Sbq'5~\| /7whJJM2e9+kȏ8}Fao8Ik~|>trm7hd}~1JGtG[Wy_ٶWjz;[19vA]_wa>qFK.S=gz]_xNopC(74\l`yiHr2+W /)͢#_̖#T:E5m%y阑ٖ p{}lJŻJÙo@Kyfۥ7.[[B|Q>6A 9HA$,Bh-(h8qs)󝪦&"2C59WZ-2' ̙ȻA%JK6OPYJ4T 9mCh9J*#զsp_Z^Cu!\dCX/&b0 6&f)Irlv17@4GDc g63L6R@ ,^n*Lu ,!l`Î w,̶nfםkVBco5VA.!Mc|u릫:<^C c:@ٌ1,T3(kd^u.&1AڒL@Ģ_2H. 5'%8@RznX unעm4UD[ tpO  ^:!1Ͻ >mE}xv"%$lEX \{k1j'S;aTdd`Jp/m/EP{:̀->coH:cq$1lsx ]M~-H bԢpTz07CXqc[S*T ®\#Frmm'Ę.#a;5#+⎬m$&0ZYogKȶ`ok'+%`H|7w! y%2~n{c w0m\_Bb)<_Y܃RVsS;W5WN<{bod tjyJw#[kNn4d9}@wvw$%#$HB"ʘ^IqeĎ$#>ڙlg\c-dAϤ>?}!ʬPb}=I/񬏍u]>p|u9NU6eX;">=-c8K<{& mCA9L9V1rnal|}@#m~C>|s_ @N|;S{F?{#V( TD?x7Wg? U kDrVȟakHP0; //_j+U}FM=pPܳ|&\@5=Al"lz hwbxNN^RF&h߆H ,؛{l. ra&@\s5@Q,s!!& Ү xcoV`E2)MLms64͎|10?1w68x4$oYMwTte,ct@֘vq0, ;M63dfkXX5R"<}GMwP(ZXϙv%'uh-y9†ߠY8:N|!wA WNT^IS U>2x_B*Js$G%,g:l<,~AzVFb; U%̇Y^;/**  _-ˉч;Ismro(e/^ R(lΡ7PJSJ5 ak 1r-y< =0G8&ְ=n}։e6;mwCDƨcn} .YiPAXpXO.!Iآw{k̨SE,oYB2ԉEfǮ<esRit"#ڻӀ--*6JG/gc**{y(Ab&jSR)hvYAHcF Qy`AX@Tg;(Vzpv<#Q?~j8g\"N3ϫ7 $zy-t ,̾͹0}{l,Mº9"˞Ynm-Q} fQKX밶Xe[\% q-C"}pO%Xc uwQZE2 *Nȱ}#zE멠=mK wƭ[LPrܗ#)nF;G}@E, V{Es2݈0>YSK{6SH~-7,{|9#Upm|?c5>lAPky,CA45d ,aY/Af+[҈&\x^G4gYHҲ : j%Sji=DE3+x (%=^wd/mYsсJ 4g q.zQ`q]v>!3~"yq"C}ֹŚJ8H6A lm1od::)5(0)ȸoM!4~IHYG`- =!@4l)e׉tlr#&cBx︚Tyv" dd&6Cs,R}pHXx|pmCfx.b]\w{WD,Q@ߞK? b+]}lDWoe 7A,xX^5w)KZI-y&V"n/7 t<+Sd~Ok} xTk:__bf(#>` 9_py>򑏴})AduI x<[)oߊY}:e}<kA&%‡i6OCC68M2kdesiB M(d!h0!`g9۰mQӕu 05g򞨤" = WT-CC<#b TFGS;~VYBl‰z;I"+vz=Rkg= 1AEI[LT# _ p&޶lͬcA8.A4KH:Іf- Zcޡ3@P3'6S11Njqd30JͶ?97̒ .haJc|v*`'l7լĽ4@JZWƫ%_ģQ#3%r;#xg?>Rsv0ف\;jmX M̴ ?X/\qBjX\ST Q:L."T7r=SefƦ:-󄱄5rPHjYZ29/tg֫H`THyu KAb˾`9esUStC9ke(׹vUmNs,Azk B5t0vK` 3՚^n1 AHEVڨ,Il5kN7ss n`mEPr%I›*(cӜM}#Vշwʸ!}' yTXȁC[2zg`!=S]txڃofeZ$|\N>E2ޫƂvͺ1zz'Bj"w{M@srNIؔ =gĹ73B,cMoF шۉ 9=aB+~̱\]N{jhsB{= Ʂ,;3>O]o{oXglhw{g9p%xM>C>KtX{?6t&<@ B"ί[ ʟguߍ==m4 i0?^ GڥgSw)~2ש̖TN cԩ?dE .>cg{O$xN!`} |өeg~ ՖU[; -mu+i[ZR53/->Q${y EsBU,7p*>=hME!r s 8Pi,3÷KBU;>zŌ9c ;(yȜ’۲vfXTn64}f )u~Ah s'!fƨ,aVؑku*3y) գlJqXqf+=RMey, 8"7ޕ@K6QA0gƙE51ZlbC&c4@GFNi̤hYr= scp"F)CNUV/2c3@,tW߿"p_7=#gkwmsW{!Mʵ Gr\N\[\[FG\[GojT\ yoֿ/i:p}g \~!} gK_oXԧc?cq>).DN UB)/%|cÏݿ{jW`y}>[-g]=zN>FP{^os?_^ϯ _4(ш)kPB^CIIev>AВځCQZZ^kfJzI>`t@>]'weN)8_]:{ӁX~\s Gn)C5NKtfJat@lBrz' o#JP-sT"ڜ 謁ǺP~E4P=nQ?шugX|[sMCX dV ihߪUF5m{6ܶ9cYoWj_':K 6h3eC2ҊN!}Vr%+6Ai-DO_ %-ĒPkS`"] T;T[MhvUu9dKW)mvҘ̾ԲrjDa(J?`gPcL;՛?Њ+0=XJjԑ31~eĽBP1RAVf@mi+FA>'#)>"+CιES3{C['!TVѭujW9 HPqQ%J h  {[ b3Ae~ޚou4odFR ![ 5N80%\vsg4:Y k>w@A|_ii`IkS96䮨#(x4;F$eϏi6YDO2ڊ,D^{ӟA~3 n9rrk'I=\Qa< c!FG(E#kzڑ?^y?K|25!߭߿gя~fiPk]S渦}}6şq<__8? _w:5+g|'>Ϸmf+0T!sH1S~~?_s?_>}ûn|ӟ~JCQTQ%@#=KՁen@MGc\h'T MMh>w9۳ƃbl8?IG+Ͷ?P"c>w03ǙaTŲıD<&)ʋƇ)֊ӾS?X03]6I&8nfrjӒޜn*KU &،Pn0Sxٛ͠,uk4˽D? ;@/mY3@QMIޭghbaSmT^;67;'{)⤑<ʦIqcl%0 ;6Zv pMy& 6 &2.@*\ݣCIPt*3K 4'C$r+6DeC#r7-r9>//aHgl="ROBTWT9!sDV9h<cwDہKZ_"\&x-z6V\Xovx%~`|stgdsW?/1|`D;NMh?HZeȌ~{dk_*o\I[~Pڇ5!s$$1lxN5sLuf;(A+pXuhXZquvt $זuTxi[;k@4jmuTq?TbmckVI<,ч 3ol{E8\}< aJi4b;i~]+ę} :B]Y:o- ha9 AA# Dԏ#RX^&=9U`jqᬶRJ:kmh{dct¼73XgȌS^=uTiK2 C( *e f!!f-.|@TMn&IAtxlư• NllQwr?h kրz`Ӵ#lFe 겠LS<7uP#&36(K">fY&A] e֔l:!f)Taq1nɓ(BG2Z jڛVc.P)yc@os7U,f/9,ioM@bٗ%TA 0~AN~ ' {9,0Rko(.)r V0yz3?7\R@ vC 9¯ Er @Ý@ @:T+0a')z8&Du $ܷjz +@Br:ͼ1 q㋱HKofAUÚmZhHPW `5J'K|dڌ9?++qnm, _ k䋡kd~ H •BlR=V%'  PwZr @NCߟs#s$`{@$8`$kc)S83uD+* #Yi^i8Ӵӟ,K ,7.m!6VM$ 2 kCYOM /Aq>F| Ms"6p[ bPMK!) A4: ABeA̱,&vPѡSi[ `e.}>''-9栱_?υ /ʾ0ġˀT iS; dt@Ad""REbx ^+b+jaX.71 S P|Xrw/qUD \0!~N瑰wfC\ɰ@[`ԋ$P3Gn{.1J T7$NZj;M>a JcHzU8ҤT`!X /M* 8PX@;?YuiO԰(  6@[ضDo y~-~B,Q.fVSVΛqs9'G@H;P'l ;n8ׅ8\+ Xt% X>ݹe덼R6? `+c8ϸq.|^4ܖQQ"`} paQf49}(cFDtA E6lP㱉I$ev_"Q5BB.X3޿#JӑaDN#'qj%G#f \f&JbA0O; ao|N($9Wg%@AH3A[? h{f%mA?[TgTxn9-.γ* lb炄=ԍ㱅>#pGo#6'$?JfjPe(*|# o"c̊N},x-mj'Z xNW(Gz) U?xE8^#`cdOh9}}{~~ /Okzf___4pFt%qB>S*Kd"qR{u`=ljrDgi>W]сDZ߅7k$(_rem|YiR,3"2)<F'{RQpZZtM  ^@5U[r?t}+fNB3t[EE}~JeJx2_nǹ@roݸ%YGOj &EhŢ^Auᾎ$[Ś\lzs9-,PqU|=Gw[vq@3]}CJKIYmGHb@nU5zXZV=b15q84KN.2K6dr>6_NOKxutOu[VnY KEvy]`N耢aѮ9UVk ZՌnEgc|tH{ )?? zTFS5+PjSIVϑԺp+ȗP!KW5FrrX&d y8>Kǫ ^cd #Ay1˓`>ǚȬ"hs9.7 Kpu}0ipFKak5RvD@(v`ogL[ϭq]^UfC㼮n`KD-py9E^!HfB׃`.@Ę.~sr]VhF;IhX7F䐋#e`\C=Y;PS 5"i0=ʺנmoΑ$ { < V ΀AJT:B(=;\;LTk SYmiEj - (WyJ.JW=j&º?{ߗjqd17\p8fC BE4b$'HEb e+X,-0c:Jwx7<3vyf`+'NrͻeՃdd_Pl0f 7vAs),Jd2 @+RRq6E#XEU}N$Q` M^xpXnϚ+IJPc8N_ |Й.pASǒ[>&wS_Tajc-DPy vJFMRJܓp!"wqDgHOU_m ޽*/~񋿮{Ϸ}#cSjT,^J'gs~A?x>ϯWռFO] yQJiF;L~xK/^>|uͿa-oz7?{s=ԧ>|3_E/Ϳ7GG{>gOm^W6 c}{?uzkiwO>O`S&uA*|w>;]&/~N'Pox8"qfLCCGa~h/x@/w{ZGSo9`ٰ d@zT~_1zl|[FZj^u,Vxe4HvklWba(T8VY>䠧JE.0,-D >> p}ui_uzi)JKAx 7W~GxW9d'@"~<pju\CMh|:1xL墠~,c6K4r'Wh0VjQ<9}@v 4`h0γtJ)ٝ}O_9ȽvϜpu~ZuJ`l|WnVW4l]f $dwȭ޼ 5b 8d.  U0Aaz:+Piy^Aou"0轨?>:ѮI]mSF [>7l-bwy }9⪡nOɕm ˹7/d]U65 M 'P2:Żm.pT52/=8VN34Kv̿,2kO]缅+U5H$<sgO`I, @3 # aJV^D4קLC5SK.n#K7kR:%M%ۇGD?5xR׀+tBK g|߿πꐁT1YI_P MY{ߋoo-e}U3Zß>/o; 3/[=zo}Eon?gɟI|O&M#P{xk3ǏK/}3"u^s{?~V߂"/䒠@0W4d'QFO%sE7^D˱7Ca^x%`C$.ާ<Dw!Ï)lTʫj䨦] T؜հMʬi2X|g~Z^T`YTF*{ҙǺQF :g 8;V}Ad¬WxMF6"xtP0sۊ 5i)9J4wYhXKdV9 ;6>p/I%61̑]Ũm2 ·ѣ[9nw;B'M u y*Sm6 4)o7{쓂2U,{dM>\ VSչ\ѦvBӥYwr}m:γQh 1w^]PjqːkVۃe/)U%{o,ޏN:3J|aq Q2 rW%;R t1I>KS BESuIH]s!n"!bL&6OᾠK~D&\Gt ot9tAͦsq`rWBY9eݵXO;QsߩeQD&s$v#R@x+L{}tdװNOـyߠ {D^sY93@%VL!;9d= T:*\)+)Ɯ@`%j !n&.mz\Yr7`Q;Nb*\;wĨsM(Po`ͻ$v|tuWb3Rȿ1GzO _7s>k]H$ P;kNq e>GMo{bj7ggz=,_6R_kҗ~?6F0 &e|w| pkAoVKn xxk'S)7-߂ooz[^O>w;o쿽moû6۾ ??OOsJ {}rhzFiB\__o|#ʟkJp7~7T]VihT2G P84;)W|P'vߖtZ.A Wo9ڙ?fRU(T&Z:wP^h]\> JQU KO>E.Q[ګsL[g 2aKcnO}J=kWYhSv>&/C@tj+<BAXuE5w~a]-ʕ)x$G{ ߣ0w'e/kNX#wA@Vd.oSDGGngp'W̭A#`GHDTGy]wWSa&aBZ W Gp[^*Bhz O&a6iZ &h4EG@;~RTЯ޴ZhF;[ T0X+ygfO4|v/k8|kP`-jW\d|wz d1,P:Uz!P>pyZ8_o5ctD DV =؈6EjnSXB-y?8aBfƼk':]D4rpu!@dړSOޘUƃpI'E71.5@&P- {%߲"G|<8 EhwL$ij} 7x邰.4 ZlrZYsP! Mq/gl[[( / w spM=-^Ɉ.ƽF: &wD shWL^Tnc݃wKZw;tbfL LI 0G KBJ+Ŕ[X&*JT:0-RMhDZ>negcn߮:uNݗYϳ%;X3GP+Ɂ\5#8("&F}1 _þJbn= O 9P|l%+vk TfY^Jw^7 N1&eKv8䴨IHԠ>23zśA^Ѯ~K؆O}7[ki\eSX%\lgas7CA/l.-ڏ ҂Ɯ".*r=m|t+ α:^NJ`&1nZΗ!O{) >)c~MogiyN\aлxG|5cjDRTwdMU򬸓)?T|$۩븎4p]k*0S|0wdsXgd&إ &2]Wǟ~|Y(쬧Hu/U=sPdvwYL=^|k4w+uPE6-µzF=+Vw7:G[,Uo=a< N`5~ umFкV0 Li=(V/Pk`fkR3xsl6-M e\h<;X;g#9bLIdL xqJ{.;u8#@vSj%4ePey8)iOXä#b5y O*22H֐vARTlI;Ij[̜ OMsX{s|$|`Ts]5jmFK`67KB a'.hЂsj:(tyf+GT_!]C "Զ l5je|N r76:Pbz싂` 2 +zD4AV2rjIK:)qؿјg ĞB҇Cb-0hQ;Cs0 rrKo>qnuĿ%I4~᫰s8uϊADʽߠMѣ|5(P%kuzAö&H<596Ys;pt;fGT^YAXKIK!Xt<ym-3uL1j2KCT'/l#z*"Cmݚ-סϒ7pq֥-Q $\B=7H8 'nD/׾]#$"6s. w /s]G{ij `mx-x .B(IۄQ5>dӖ hdspbZ0 5A$Ϸ^k0z RcucD-]z:>A Q:,FOl]|&g\&`AtD`5[Nd㎵1.fu R"q+|QXB b+ H7o~=/#1DWǧQJaٌ}}xӿWW I_sq>|lC, ~kG?z1>g_znL&|u-o>Lڼ?>v? g=t_`_~rvYCǦFtdSpMjh.x@wBy'`udfIţmq@&u勱dm!pmaC3<3;̐ջ~a5kHr@?o 5c￟x _H)g>w}\v7ȏ|l{ŷ[TxSǾ%/^RyGx衇x{^>l' !z1wʞ3bvM6q1>N@P}[ġ/79<1fb{ڑ&ydhȧ2?oxsO~$)`?ump`^#c͘%g|AA(]&1>=mY pl RlcqN!8$ V6h]-Q9+:D b? kAk4A"ra~midTK"@$kl}pɑ¥ ЖnRwXW Mv뵭=\e{;Wr:?k$z؄x>I4n;ZԀ^2GBn{(iwYI`:lt 5xOC&q *N  Xz;6UFe [%U㹏_> 3!\; >7 57"kDP֑`2Z4{UĜ>cҥ%p$ܫ) L=֐IyDStAk~GetVY Q]H ^"UG'1mc˰q7ĕ`X-*Zg;ø׵UGzE ]@G[Nr!Q'e!/_X{{179Nɹp(>1dج~Mc$H{l>9sxQ)SYUN BDc? S, B:\!'iQH&aV9ZD9JD"kLyͺ TXaFpTpf rwH]#Z/utһ?M@_|ٗ}Vw7u<>u˾+@>[g?AK?}"W<)O;;o|~{?%OX@կx/}+!7pzzz}F3*Yhʷ _buu/7W>o@Y(,r`+i,S PNF G3k3*ڄז ef]5l/jl.%: rV<\Es3RN5_֖Mzl-ZIdVh&+Y`)EPo{%l7alG|TQixϳ,ԧE_E|~.?7yϟş;ł(}7}|w[G=ZF(C|=RPfeP5l,+Z*6ѐ KXK+ȴOhLY%穌g\Qs 4NׄLK撳.aIl5v5WC@AsHdeʣy~e6T&. ȹP7>&9JSѠL=~ԍ:2$γa)ԉ2I`1?뇠QZLphDEu dcńNi}jfBSpFl8rTȑ6Umva cy䞖MTOÊ5&T[KB౒ѭ!rCUiy܅#{#E +C&a默gaF¨@Ѭ: u YPc9',khi,A6 !"giNjºR6-f=Af$eDQg1U*PH[Ft,TnB9.iO/q?j^fAtRqܐyFl|lˉ r-yEJ77f620{Z#^MAM"Y\7x eE5氦 d1Sr!P uahpq4T"wB!i?UfJx;`G  Li Y(BjWCzn$\| :8*ҼDRvA0>/*y>!jAo'Hm+TK/.1$K4gҷ1OtZГ|.bQNhvfsub)''Q@a1ZwQ 8\j6i>zk>)vKZhDb+r=25c 16 ZP6z"p]EUYK$;'!v{HF}]Q( m>pF)ҔMg;<$oJ{ /ȤrZ)UYFioЬzTS}/o&`=R5 "ZG0zlqD~l4p`qX6MEIؘ{6UMH "h IDATX!k"$ }GmratЖ"A,#(fH,* uT UltM{t9}|{~~;>;&^lx}{GݯἮԸl\ Y$h. u%a!7*˩CofS'Pgٓ@6Q zl(KKyhRnO.)O9L7&7hօ+,+z֚*Ĵ%\T#kC]{Ph>_E|~!ysY=Cҧ׽n|AӞƳ4%//:|;y}o;aÃiQ Α ЗTQ{6mC h"(T2YmxM6mkeU~¥Dp;9UDôQU],=Ǥ`Ȯ$.Z3P]lێr;O\*eb( ѻPRpf} ~b]l ;J]PE%0ЩNͺ?bh z}h8Z( E!EOSn,A5Yn@9[:6m}=7f,@}k'i1 ֊ߌ5K6b !*b eԒ:uF(pѣوY;rІB镾 =I=iU#Cv:Ҽù(5ZGtK=d2QMęmʶ ҇j( B \҉ -^B`A+$OqZ_PT :vQ3z(>d\LQt2"`=UsM,lπӊ#k1ܷq&uH>Ѩ%}>@ۇ;"_M_k\t]` eب_ggkU^0hu> ԾPa3NnB dSoԴ]jy ӞW:q, VU.0..,PKX% d\4(2κt 2Z*,I]r 2ĭ5y$@NJXoӣ]RNPj4@D_缵2s#%e~4IWt(@Tyk sg 7,t>SZ=Ye[ˊ!mFhhhtcKO S丅]쭽` `Pێo*`bpXl4MOttiVk |ts˺尊 m[&hpXX+;:bwӴ%լ0"z1{ܧNUCn1 TZJ`X5pc7b9Ca .Lw%)d}#6Xxpo:(44MPdA&&k!2/urHI?ǗX yD"m4i%AF`7`j&>ci]Ak1 b.+l -;"FVPPݰyYeϩIسJ8üasb<\]AD٢K>PYf6#ìLJ9g_9 \JxqbOqb vE}S67947*r(4kXVcq]lb13o]R=pw1K{CR`Q]$*p/koݟ*yK"{-`hvdRMG']ݴ~"(~/k~7F X{?kffDwШ/g99<'G{x} OP/E/#~wqMvCd0>R _r\7;;4Id 08Ә]׍ue7?A>8/~1??~3#};C<{q-Y^ϻ>>i|&C󖷼=w N Q45j-Kr̍ m*ʺl/t[k4 P*F~5Y^X:Oj\԰1/54g~:ri}Cζ7av}Py_8r{N+לZ|׃%s? LFuf!.1"g&7.` iM~YYS>*g=ip鰩;'? OZEG.*.yl!,xd7>M SkωC ';%P[BW܌Zv k KxN1+,J,4ـlT `,8V$suҮNneIk5RI&Et%˘#m })5۴iݫowŷͫ$}S2/ܱM 33 $Xz.Sg&Sz f#8o|I6P4s5Ti9i;mC57jOoXF2 8Givb۬`Vڸ rMeMyQNH_xlm'q>KN(1IX.yi8EӳNWΓil ͐}ECcHDTQ MWc꒼cF6;E3ugTHBѪ;͂ DvE%Js #%db~fWtV Ђ++@ si RgЫEEYE*ƞ+mcd׾ ' 7}==x8{H^`>IDD>##wo}[#]n.7"v"VS z΋EEW`e(V}*Y2[`/F5sK.4^[~MZ#zf(4 +} ~ IdkB5M؜ofF=KsOx׿//ݿ+q_./cghm+_R^7+mo''yiȟjlP]#ORq@jShFnΕ"a|"6hKSy$$olk4XM$}MunID3l{~]]f,*zg`_ݤQ4k@oi (ٌٌn_tc5G$VhMg,-H/}$sL2V\>8혥Ҷ83GB&:?+^2Q{VJI>{=+\1*X=kHfJ$LFS%.2fKy3 ;eB3Sꅣf6Ԇr]뙫LeL_#=ZSm3c#4 f3wpkda[J୍ơEw, Ɯ{#a"eab. /LyMs:*}`888 t4=}(uw֢$]bo;@U-2D&` eLӹ![(ueDN6 0 rDMK>3jE~YeMg_f{*uȞXDӺy{l!9&hE}㹏^U3QDtg%^(L>Jxg% "$FH [oAy 2; ݧsQ#ҁk9)I1}E1[anFUXO˸ג icΏ,ytP& ;+se>PUHEoz`f"8Я ?X[ V^&3"0% 5K.ư1vkH@yfX?"ϜM'5"\0a`Df*fMb`tsH;;2亠4֛E02Z4x;0e]*x}m!橴IۀL1 J[Ŏluae]ORͼ:ѥT{s{#%q}FIy̝2OEmWױ S" K|繏:3&Ftb ˼i7gFܕTN-@)ȼP7%0ΣL|\mn68,^풨d[gg [H|͎\XN@%H4-%HkrizrXbXi ZZXvF^IzUXۮ8>|+ 8-k 4C)cXߜlGcJdTqZJlk*G]j1T%d>_cnωrߵQb22+pjbJ4\i;EZEZ^s G!1Od{vQUG`R;$<"n:܎{c1c(7cf Y1FkwL$#PN#I>=m pg ֟V|߮}<5ysֶ<wSnkZp__^1+N0xg~}/^:?s?S?Sw\o)ݎ+`>̌|WWnqGmo{n r~&̽[J)t]7ڣ]]\R_~ӛx>s i$dVGТ7C<9<+_-?OA @O^5ڿxϼ|8FsGNr51 8띾a[惚q@lPF/@NUǷm4%G KFS _# \ SEw;xhĺ,QK0c)Jgf|mqn1ĢyJ̃Dƪ,꒠P`>P/tZݐ9p\l]Ȩ8NP\M4P}JI?,[ LlkXRdP#h8@o ,~-yc!&=8 H@7 A&*#k;I9m1tl/y˨d-LJt M^'@SrZZ cKnh$n@?y*ZJES,KGN!YddA׸JbD6S-{99FLb'a.}Xz=! †\CjfbxQ".H&cTeYzp׆PN 2ɬΑ PӶ[Ž.vBXfuAZjVc0׿[iDBxKvѲsE|OySg<~AV>a3$[#/5b1 IG$*~լ 'l{!c#)*X$:tx&7^ YmpJ}x%+=Z^p+2C]J b10śvPg'ADAkF$ DIbt׭#S9Ovɓ T uY~@fs^R"~XpZj}5eN1-%>;~AΣeĢcl(hVvKsڗp)ThKbRbs])0`!ۧ8Ǟ[6ľXFTn0vkٜX+vd%"u$E 2}D9 >ߛr&q9=Hz #1^mN[gV rsHBJܘ|o86\-jjoAPޥYΣs~^UIJO?-}eGt? nݺ5m?lV{@tWwp?WOy_a5oco[Btu|̇mm|w~U1g}83v0ioV|rrǼxGZO~~nT̿5w~w'n;|>g|7}~+3ϯXŔoo+m6oTWiAg}72i+Ѱ~߲[ [ؐ*4 ߯_UliVS$Sz9 pKjY6tXxͷl8jiqZ)DX 9+y؂߿b<ړQS~' |oo>GՏm>Y.ET*2ɜuFh04F>2<=MD?װ꜋l0n$>x` Ǚi["ϼ,-9` 6M+dv֦fY޿LP"O/#ZNH T^#WR]'&49O*չe@N딼 \PPDߙjVU>4M'P]uL,s{Ν `@w j(k:Bb<3vZG%@@4.ZC""}d&'[I-CG H%j 8,sήOXu< |nԹvքjN c{.Q4"nVHgˊV}bDtZj okƒ Pʣ}EDžrqDI791Ϻ-O "ixMxdֻ_p plJ:wD}<NeViA@!A\"Ě*U>kRH)9^dP~ӢK 1C9w. tՑa_!5Ɖ5HڱP:.jD[,"vհNUگ g%S㷲[<< 1=al^ {U/3󺳦5(5o;r$y] W}v<f>N9j\: 9Td5"{J8|=K=uL5@ *aǽ/IbM|\"l}$c塀שXA,Tվ5|ؤ/yt/da+H\3R,=ëS$ X) Xc6 `.XcȌd1hXtV;ɚ5goAUjr[F}9#g-TVy?a~5o9l=7 + eȍ*% 3jX}i҃\q0`Vn/+uTw˼"M3B?\Ƙg_vI@1Lû'Ǻ"8'M =pt856Ը%JbOY_hs.X'h?DA zj!I-H&?O A2̡2;O5-Hx|1v_]J>,k"~>} ,J}~*4>Qkw[/B~m3z-~-ګ[ru|=U됻`J~<'2(4MӲ|}ˏ+ ī_C;pq]|>Ƨcf?}w|5QU/㮕23"=w}obU `7`RO $ n>pG̻?[8]\)>ޏ#-*)Ɇ.aSZ]ʲ1-a/G4ac*yZ%cMs#T*3:5{V~6H%Tp"0|MjM!N+nY$sV~2]Xx4f~j2 9lߑsoGdݙ*ck> @)c3~dd^,¼AOxSЋd`9)BwmLBW%]dopP4BW9X;ئscKP@=ot"f"(t۝ܵj N06)Om߁ ѹb5@l*R^kJ;,RZ/Sz`p0DύGR0˅U%L6JH.SNc5p}W[֍1EҵN A׬Yή_Ȯ=r+P9=*cb>)iO ox7x#|;Y__tGtٟ̅峟,/-1wn~x3z`|ޝXroVw7O`^76?#?'ܳt !0yqo}+XͿ~=z&Wa VHYtI+&1mYX7yVt@>ytGМ?29.&6] yq2/< ${K=6h20Hij+'c\FU Rs_FL'3n)qhW7;7 L~5O%G>w'+9^^'Y$2uZASnWPKbIS; :T$e8ȒК224/zv$Bm+MFP1_^/x: tx]"y;V01':,9~>̪AvIi/9g; ogg;oFζs?jSyjف$-c;?4\g⎘b3fׄ0 1lx2S4L>^MghYlIEdl̼ ƪ3#U0n;~%рӁV [ۋE2|A 4\r3}Vg`9뉆ez EŃ;Bݒ2yO``>L5x[kZQ}-3e(ldRev'-vnkbM]}LCr5ur]RXQL*aL7u[$k$Hc:"Tl]8LIc#!)a3PLb%g7a[=?K0, YW^6.1LqC!ZZ`-&%KΦa"O đǞnF l yA]A{. [f:C9{X:-䱱V#iWq-w[.꣌z}1;2P ;zFaɵ z >hk6߇hdPzl=:ne$D$ـH']f"m]-Vf2,Zn8Dm<&GMŚםcOɒa]gcrԭ$v2%Ү7)L0닩7.ڎ-H; 'ZjkF&(&EZN@vgT3:dp$@ȁ\"zF6Z' Z5ƿ@Z^pAY[sBЌ j#4TA00h78ySp.< ajit3>nԀ)݁8-,ˊ+ݜp:: f=;;>097On}m|ٵJȞ/͞-4@w$tKF'J)*"Z we{ak{.W?F%}ҒNIn-v{F"KceAQllRr N]1KfRo 5E!yҤՁCc<|6Hd݄8Mm059[g{K }IJgnQ'|i+ds†'>=jXW9a9z|֊ׂh8|W= uG'ͺEc61 끰#nmv(Uhml#YT|bcWu<|y6Q{ sv]i.]"ZNB@$չרMcJ57[zOm [J6Twql94nZ @Xn BblzoHQ_ZQYϵ<[%ilDm@Ζ.B@u_<? -0G`IOzx+9>˗D\{-?c?Fk^{ԃbq| 7տ1w>f{{wyl0oVVVg쟡=o/yы^ą 18xwfiL6ȏV%A o=C%Dgzm !L#{]cyMiw64vyKz: L LQB%dm1.&Ԋ,@njDyIKoWc֧<ԟ[;-g^1\?wN/݉\- 3Sw 6񝖱/@ZǮ :{/hQ.i)t y Ld^*1U4r@r㩙JXKm{߰@Ȑ ]z[k(`f$JebN [fA^ۛhu\"w]Q/e.ϝ]= I";#FҲ-kȻ&"pHr*d:vikօXGtWIm] НkP Ⴉ(j=vشB#k2`V+a˼Blkcѡ;1fULMA2MGvB'Z#C*EbW*]D^˕7nAI[S5jØ S1罙pGdꜭ=;kPj5c족Ŷ:XZyfcz|75DFLB5[ib 9ZpVͿf J&_m(yEAlvyq{SBrٷWh+x8K˦+!yTKLME.w$ 3^6衒='26v-&tlmB?vbĦKcB$͛JwUA"S4Y_)%lG;| }ͩ-Tjn3nPMG21,{؂zd`Ҟ߃f&VеJF9hדʦbN0rM`DLc`4-ƶiL0I<Nv~zcv2 UYcFL-ۑvqy>0&6|)[7U5剩 f9+BQrb:k45 ͹JpP3y5*y[hHTh,Mh"Ϭu0?/:K Re؋  ҀFs?c* eyeS(LS=D^s@ܰ` IDATR"gT<%W.Q_ 148J 9+Rwrjk$fB, t|X"26,0>ͶFXh 26 `khN䩱S TߋU†Ƥ陸JG~Nj~ wɸQ9]m1;E9&w ۳PBw%IihZ4`p)!:% If픆b=޴ĚrqmEa-@i2fFfhe3K]4xn3 eD,7zLqckLyEю-5$D7io>Vc!?#IzKe֚>tj{Wv175xQ7fHg]bFiAҧ) i-jڇ$䜚N5/"[ !nz`6,ĥR悽g^sZHi"@}UDZZn6J5TaO=^lSQӴU:A+O|y+_+] {~< SEz|tRX|*. |Cq8J.]3 ^%ʣgxK_ _B~`qZ_Ջ]x{u{]om+ ݳNC<aEI!ݚcX')Sgu b^תJE_L c A= [t琴;5,HUY*zl&+*!S㄀f6FL&}/4t"^?[Y[ͧb~|>Nخ|M`T1dsJFG4v9歋߇wMt ȕ/OpVkZ*5HAY@ ϰF&nޑQ1ٞiㄩOA3a5Ln/Meh(V 3b@әLjיo=  pm<1W,'*ܘ—!~d R @OTS+f!C1zU.`3"[EJd!<5,@XәLs`ʙl w—\g= yjɴ)S _z\A0kqt`-xZqjNp9ȵJ,Q8mH뉼ڙ3E)닂Wm#+h hÎÁfm Qm j72Mq)OH} 䳂~A!>po3ND;ۙtO=5@^yIѳp. ĝ@7 f]0 ƨTɻ^a? \ <^j!.К.yHJdW'u$mwg^+x9+#iM.v 4 )k؍m>b$Ckne@2N}0ZҊ©dE}6vGkeAzI{9lZnVvE}90 X̺@ ֹ<1J%lv' AHjGX,3ė0a,]uRA8ѳ^FMC,ny<)S_  ư@p}E:_b@gb= \HOؘkxԛN 36+J6/XpJb\jͤd,lM;FI#c͘\0B L֤NߛekhMugjgrjBS%|X !TPY^JjYY5`Wecwum !" V$`<56J߇okyz"rQڲL)`o>G@n9…,TJ0ͼe6C_֜KYߚ588l:bM`T ݬq-=bKϩ}<%,+nrZ:VANF’i"M3v0u!h 6{J΍Z}azY Nes>5ۄЍތam1ƀT)AJ:8{yx\wq% ??S?@g^D(@|{;xG?m+w7볓 ]=q||c_; /8o~Q<bu݌ltqUO:ڢ (\7=1??d\*"=,u7tbwlAUxk;A8M"j끫MV9zj/ML^N~$sqr+ݛ3k| SP~$< 9#A*cx%Q"_ݒ4+~:kGa|B>pR2VsQ!(L] / n=dv9^ȼ񒙯B3O_%'C#!=N |B yT9 {<|LՁd[xCˇd;# T,"DS <&P@&]S oáZ5)z͘yEM?1! A6>n+nR:]6fj"eI'7Wb !KX1~0Wš | wllt;[i]R[6^)n15:Ku_|3vOlF:~D.عJVkc<Ś9Vml]|xkȺw(Aϻ$@6/.EEg'`Uޏ~m5/ﮟqih_RL7@-`a֝e7%{F:W IJT* 6*ݸhH Cy6,=gW&Egm"(q7e|VfwqkG7n+i ћ#|͛2t%K}`l| $ysƼA޿lƇ^2 l6͸Py󧈐R*IcߓY<ϹUg?<\y.{SbJZ ˗[_F᭯kKm'btQT'7sz?7rKT}{r}/zыs2e"{U_UtMň?Êj{O$JL0bOq_x_ݿwoxycO|"oE^~ gg?BΙh޾8O~yo&󛿹qs/ロ7 L&܉T&\s . H y<#R"HTJ^dԙ01G]ZjBԖ&Tw ΐI֤U['0 ĉ~{G[x71e?'oԵ7߈1r#&hUrtNb )a\s6V r9E `"y=p@کsx@VR|/:x@1hxޖz=p5!^'M6?)A.X;+*W@HaKIAKLܧKwYz tCV8ռdZ$m):ƣMhm2GRikU)䳉X19oyKR7~ƜZUzhox2 \̰A[duuI+Q'*,6- Ճ>?tdMj!pī@}Fk{xg+!rg3(+-E?a`L&;6Z̺@@dp 5NHXV&B"wsݲCYyTP@GN$ª$t9 ֹ)ch_ܒ4szWgOR)}qZlN-&m(;Ȁ.뎈v P2J-Xܽ*,ڽ:H1Y{q J4K8HW$N]yg3zs*ps(սz۽F˹Q i}_W$;/tj}4p|D1qmua 5WAuP?Y#$Ʋ/`9>w~5_T7Љ#Z[~ӀCL/y__Qu/7qz|MCIl?h}Ю6,\uٔ<&aaJs=3WZ~܎r?Qkc!/" 3[~n|\۬Dzt:m~Wzu]s75O|"Š?üm<odmmmt܌:CΙoo[ 1/VAgQUUC|}?g/G1o}{ßɟ|^S8.1oM٪Z8r]8?׿Um~b0PO |#kbABRr.G9{xaFf{_;!kClv_45>٘uZleTH)B7uO~(X/燃c0{믾|3ͷY4j$0 |xq3Vs& Zw1@däel,aKmrMk!O$g3.]kk[$ŭ?=ICۊuQ5 EdvP*2d,& h#qPO0al9gId2h^luWaVDǹ^k5o>Su`HJ|K[PgOܯ=3pQ,/i"*ҧC2Jbc;9+8>I/}-u W:TPF@yLgve?v_[Ӌ7c)Q}V܇.?*i)uxU0lvMv"H&cS70IuΚ!O0PPĻV5`lD}uӫC jcXW\Wi:b3,s2$e0v4gJ6oijAp.{ R.7n )+˽2tnmXjIFW$^m$=!oۼdCY{c)eZ.QKm7ŎZ0aKf{ΝHNgY9]`+fqbseǢQ/283Ad +6(Dy=/#3|nVsr0p K8 *(ڳ^;2(7ydyQ|]-Ik5|HnT~BjAj͑$%jJ+ҾŊ[ _DZcw}S/sf{{wjf|.[oů+݃,/})/~C?O@iAkS âLa˚k Iqq#yݹKv$y?ҿ`Xs_Q85;6yfreNsE:y*Btk9@}ݟm:kF"%}vl~E+{gIlhMu쾧2WW@nj6colt0i 3izv}sFaԓNSc4{dYOPX&yObHة:C Ĵp/p/ĭ5`Ù-}KcvRw,4w^:s0W`> Pkp>$6|6X> J!o)̥RU#R_LDq9W, u ^߬+i_8][j_AIQP0#E \-@g_F".'xuϥ П:u7G>(=LEW__xxƣ!.w~woE,s}k{ˬq8bw]Kh}_ oxCsUOW\|3),b{1ou_p `C}}\#+nc3SgVWWy^-/; q?Oo}ۚت@] /7u\LZtえFa{X-0RX}fz Úh|9G|``R_FAV= )>A*!QP]o}y'xmH}<#$gE;Ut=c6i=g='ػ^ 庻QůYŭ#Y[3EzԼXcE>7ik|/jfҗpY$#1Rkb(c6ƊU@ Xĵ&~}Eh 3,?'P$2#Y_jw \9N5Izvh{I5U3 WW.]pW&o*47KNEmר@{<ܹpAapؒԽfC,+a5/˄M.*8Ӈ>]w׽ra2/2 ϙN=̼[0Up̹x~ocæ0~ˠb6h@>&IQk#V3Oz[\'=[+szG.O >e1_c86vYyEcF,71\\pNБNCc܀Z1G%fRIZS싩Dн6'tGmc 3ȽKv?2Wiq{<f\(t7F6h4 y|:H~kh)#+Bֳ9_/~qxpN5vϞ=ˏ.}1Gz?F᩻g%zVNZ)VGI}1%5Yȸs@0<0@*61hx}kyׯ7z^W/|p㌌{l@⑚[Jw6Yt׾0aoMGҁ;{.  1 l F3-לjʲ`msFh,Tfln~>֮y9ǯnjȶyt E>0IB\GSTZ;d,補4V@덻7c}fQvd{7͐a !E$y\t}<hGғ7*\{QoVx@b~JNG_; ݘ] "9k)pY@N Q3yWֱƷ /U8 }=A[ǨBT8 z. p!Ėo"PEVt0p8 }tĞDl(W2ˎAJHĚglhTf/vgspF? $ɜE8`~6>Q>.**sa ^uCe>)Omo{˿(=Bųn^j۰`Ϸ[o]1#ńYpE>&q_@nQ1s)"x+o/bΏ;?a *4[:b EșF<R = b>aQ*TV8԰܋rUexɓ/ԧ\97ছn:ta? Ǥ_ H*H.ceIlxה~CN xMnͲ -kRhv_67} S"U渌w[eS2@)5<8`Wc LI/8Wsm'4: n|+SjVJ @ӕr->"Q;V`l "2Ԁ-$INr`P.v%F!KF $IfvxqȍG Bt;OCҝgC@g *>3zq{ho6yȍ{u`0xhbߜ"JX83{y^ FaPa}!>t@J$̜`4 'mo" iEֺ{C*;)1;`X=e\F2+d& T05kXoKREHvUn ~%Ҡjڐȿz<_}Zb6H A=/Wi|'h}{f%arqqRCJЁ hQ?iFwUٵ\j$j@VѶ)w^VL `5D jt$U95퍘W'p{ HW"Pc{9{ڜVrirO,GI HoTϰԄɞɈ^j2; lԁ&o8U[ٍvɤ*4["3X#RgD;jE)z:;rs,M*5XTMBYn$ۓ~y8&Q6i"@_d@"l͎-q~Ar{*u_2w$6K|#hs6Luׅo~Ŧx#:);͠t[E!~(7rc鹺Zǃj.+s/9ù`7r+=+q--|iկ~5ku 3{r˱y7pOw74(ۭ!i)i󠝳 as m*vfDi@W#<:դw&覢9!1d2/2P_K_RY]=_̏~̛+ >9^rm5Rt ;"hBZ#6{"E\1Cq "a&fGyC~M˟]M@5Sk/2s}rA.Y]A|>#V O8'xj^ e< 07XA*pMY u;HH8<Ү1}^2 /OhLƨIG^`-p :Urǻ1m%f \$KUU۳ 8M{Ghy%q7f"󬙖P!i<Ebl(uѳ暃auec'gu7~YPVÛssuY= WDfvoOJmoNӠ&g);QM,r6 2묀eMb>Ɛz'X; jKYz1$!Z?))8ՉW- %j)uilŮGe,KfTI22, a0$] 4)O!PeOI^*ߺTQHJX6$Re/| d&@ʵE:<|3e[Z[iyСyMu<ԞdLX O Q:s3)AۂZVv/CiL\Tb֖_iy1t9%/%e;Spv rX}&>ji̬bemb%6_$弻VYޘt7V۵]&=.quMʜ٨ӌGkl-{?[)7Wr#X*A蠣r  @~q<+Y b*}kӟ^%U^,f+so|#g^oopJI>ϟ /6΁/~;zի馛z ue-/?16ݥt/̫^"X~9IM&Ft䤵@q݇jWga:[r 8 rHW%tI`+#whBs+jԧW=G5M|Ӟs\?lll HdՎmH u`]SRbHA47=4>S9sqyX 1YZx}+~>rs물|'ERC-^!$m~'C^(\"l +- r+!}/MH48P#s$N" i@emI^c`G*pY+k8 a}B:o'# (PРQnS6VSLQ/΂#;+!7>mkKݽng|p;`Xu- }̂-|yd,(`v(31yc]xkđ/bռeKYipY izbC43H=[ H:h1> SDrhRБ/6O \+]Uⶐ_d5<3 3MIGz_1: j^D~lrdW$D0ځ8M)eV*a!sz\oCrWNx X],&uOa/"Lް/6HDzsIM cE6]u$OB8 aUt| \eY/3@J0'ˁk+dp_y>}~܉A-M[jTCj`0QirQF >{ָ{Y~N)z@M-E  98o3i6 zƟͧS֎ U-l|p`n[vT}V(֏"59RNn6^Et&c(N[_>{}&]*1Ph*KyJs'}?zvߵ$Ny7f ^t5!L${Y(ۯeE,WȦ`can?},mRe2? OκOyӛԻu]7l˜:·c^^|)]fps y ŋ^&1f$˾%xM;_~ 'pUU xUIǽyCoWZ3\2dwRZWJЋ`sւ,{W<绿@0[nXGwO_4M]^iXKO,C4a1 FbU*9ۅޗ;ԥ= KblVp6x?E V>qTI.,co emCw^ K>/`=Ŏ%M~E 1d !4V'd}i˖-h Z9K$e&B➳Bz m*5\)ќ<.=V,\/+nI^I$YRˠ/j*'}N rM0b@s g,TCig^u \<+Sb!X܊ko.}sF +IM9NЈz8HծyRD)c+ ztEUIb=gs=%#KC00~W)\ \n@ /,G bc ׮XYXS +3|.[:@fSW҉2EoY.='p&!+:f{), *!F-B|eF!_+N !Eۘ &auC[ְ{+  !YE F)]gWB9˝@+X|_gc}ۮs{N S#)I MDn M"$CJ-j@< ENhФUq2F*X(R >s>{k1sϵ x/i}ǜc5/S?w1YR=ߏBd3 ") bԘmKH4"YkHy\7ՠL99|R~ݎ9)S.b>a [6%WRj{ڶLAO ]sc{!C& G)U|.?d33cm(pƚ{؉SϠQOdQ/O #Ey~kΠ́cEZEw4* >YW5ߊ{ưF&HS>Qs~Y;LNN^yf;N?ylW\z_vm )f5qh5D@4ΌzRIb x^ƿdm֬\9{h}Hܡ|IscFGd&yɽ({@)jE>Y G%I_K[#4<}yp8GMGYSr}!>/}%_}QV@ͥ>xn?$M'ο+v>,IJ)3Gpwj-oᯧw_Oe<\WGӞ{V߬ |;|9~kV^/ n3~< /廿7fUC3*R/әcq[+`{kݾtk&^Ms:uS\dSSI*5ALvmծ0~GYn/GZO4w7xsKgG` eR]dJ-&lBf`ĚwYO~oL=Ѭ2@}N]Uآ!Q| RȆWlS^mM4Ƶ6^NӲ\@zǯB[V68]cO4U 5V%PLqNۢYZ嚂%k?q<1[)[>h6W: 4=Gi -G:?1_sB;uXWI?-Fo$zAVm,h'V XYH|[NkjF"Zؚ|jw#c\þC{䶊xusxX‡ׯ^^DK݂Sjd`R~H SUNw| ~tzWN͌zn=ƶ4#Xb>;׌!Ra *fTNpAjLuq|T9p .M}H AhbOnQ'l/6O@2w}S-ϵ؈ 2&똻RcnGpj< B#AfAڏ}er1^agR}ؤ=fFr[XPd^й8B8܉L(giYE.Oq2%LMr}XOhUJOeGq*zEZXfJ]yZ5WQh0j 'vܧ?gym 7[ҫE&\b{I Azy J\K96$o} t TAZ5V $q^أ%y {;]ɤ`5" f  IDATqO@op_ࡧlc3Tc}ǂ<YԨ]&M?{!ܳ '1qD_9s.;wǻgV":A6LLwtO;=ܱk/5u@gm?=1&P)={ʗ#ثp35C`o2~軳w?52do{g ˡ 4-X7>UcyOH'ϤE RלiǬO%u 3Ʌȥ DPZQ#jK6F9nӊ=VMT `#Ub`'/uIxDT\s *ǂQm(b^LW; s|P `{ }7?o==|۷}[ZFT$Ф~L~Ŀ˯|kmdCc'DVU?qMY}kk|wY <\aboozGWDF԰m5cInj6.%Pԃ]qhڨ*m-[p] ] aXNMhxZ6RNշr q:݀7h-yy_Eu_u=h"I0ϪƐM)!ink=d+^d5?y]SQ@}] F/!() =xaXdVprt&iIRCf`y, m/al6oo<:<+C $m/#oB]$` Pry&m@3]HI`MуA;ʈtH %jVQ~/zyL>JM)ph[W\ KIS> ~[X`kX}Iv-nIdufa\Ir֌J]\VP~y\kp R\zX( I#kk,0w,S}tgն9 !p[Ɛ oxk;59O,k(wjT 'ZQ(ӭ$*siÚ*@66? fs$I$RMع f@{58qn?e2^T;w>߮_9N"p򧬏vBrP V. \%}~﯃Rw6mnýlA8 L)hޤSˋQYV{Rҭ6 [i[o 3d=Dl $GSy̳aq+ 8>k|/0 zBˑSm }[;u4cdB^~$CIνxgх`G&ε fwd<$c;>0H-蝂M %R0HnzF<3ҋ"ƃV<ݾ@+b=oLA@{nclkXY׍źW #=0ýp'隑{;d]]Em3F9nj^Ǘ^?9G=K׊bH3C`ø=. ,H~{_Zڮ;{ڼ_0Û޲PŌ| g{?rW1b1nm.4NЃN7]wYvhx AH wX[Q3EWOn_+_*ݯ9>~o|#rzzƿWx޶U@dMj?usC ox[q^_iuo ?S?k^=z5[o_7^|WK菌=f͐h6UϷi6K6A=yێ({:kK\V]vKܶ&*6ݥ"^b`%m@X9sek9~ >ʯJ3g2(R,<{G*~TYq*,meAuݿWgiQ{t3Nh݋LRx|}Awaz [}S #@`rK ]'sSd8Ͼ({` P|^ 4ؒ3mvN\Hy.Ċ# `( phf8  Q+RDȕGy1c`Q( Ch 9*<&b &c=E[ +{vy.x,âwCzj*31&j L{~^6*R$!r_p4P:6(n9⧎}# DLc{Z 6#Wy;$ X Zv<&ađc[v ܉0PïmKu{n>J҂|)ZeW.rlXγ&H-"zΈ]`IȒK(B]@j'jZFH]*UӰZuwXgB%D%"wn-}w>!]Es "$]!9 Y \۾cpQC28? -RC-hFk81'W_\eRJyϽl&ڃc# pe 7gu}A kOJL{C؏&J&Iz}W7?3y_5_`g-~V8 5^FFca7Rq*eY轾LQ2;6/ʍVhP GBսDQL?&P% P+˾/ϼo5o_K__W4mS sUCLI@bR\ |'Ju.0#2d>"V6Se7uEU SEn=օ[Z^=k>6hV&{~Kv6ON0Tmv >^@^&H;rDdž5 Õ@㡺LeP UM^FkC- yO}{pŌgZ 'w@ >q|lJx\q{U88R 2G:jW=JA$ vkîڳjT "8Ucb ,-4՘%r󂎕,MWԚ.3УcM j(rN=jzQ)uD^lr!ļұn&}n*d97ry'Ј{k֐F'М6QY=,`Y;fP(~CwT%ީ@6gƫ_ǢJ)?YAf ˊ?xwITM6Wp#׊W<`py5]&QZ.P[h<1lMS%LL"1&@"6w6)c $I C~W(رG5lk*vnUUj[/YEvXۣ}Vus QͣsAѷdv9Ca>QM煍+׎.{hT螒}H HS&-kWC-u9cwkYJ9>KEm2_wQQ䰋KtNSڍ- $xiߤJfNg0u|`*r1J/cSU$&D8P)/ c4җnK8V ~P-U})]1ɞoq>ȥcIC6B͈ɔL 豣Wڻ s|̆6go_՛f+Q~g|__O@~?xǖv̼ooقOr? ~p<,>?VxO4˷~n J+}-xkrw7>o3||7'V}45w6!/+J{'R-n:x.)1. Z<& @2sд lc?nl<n ߀ TB-NvOio8E,-2Mʦ: KLbJ#ƆM#c=46c(p( "܃CQ;o*2 ckO4_AڳXC2]A/yUkL3o#ZdVԱÁMEPi6)WCkЏ +͂ Ѥ5}Ԃ)!I5%mvN9lݬ<šBc΀Ea}vB4} QZmgm&QG=,QgAFЏ%oT5e ;:6Q-0VUTorPSF4뒮BuqN+fmݩ],\Wug/@_7ȊPk vT^yXGeK%2Q+%wuM{ik<'ط(pAߒh Z_vqd]:5dU#fN@[WF4M;4m(Hjv{ңYt]DMצRY̝Ch1.*`f + jDOS`Ț+Wjl@-:.s({!]u3`6SgC|CHd^? ]+o-@o;u OUAT$kFqx(B>օQxaT.[:eA?7j~wmeayk-&객m?fc>*M#A ʧg!?֟P7dz FmKu[i۶l6-?>p{7O$yk8??ݷ0?0yqyy$= {_<\g)lW}\~|W|2uP )]_ek͈9m+O?i|?:4tQ1Ժ峆*L(u9ZܧEgfqov}+0 V^̨h`\N ~$e]I9AfpLbJ-ݔSthȸFK{rQ|&pHIJ @Q `FC~T̓cIHbCU뫡XİTO^pyVi෠ ȁF> IDATr}:k=1FN˰Qު qNmAϔ:mT&%yf,5ȱ,2;.5_$rOyY= y~AE9VIte#t$u{mKk4CSI![W]e=T. rݎ4ҩˊh%?nǿPVSXV \t6cM>JSc>Q_Nis&B"cCys755"GJ&P6RZ-/C}g.EZ?,MưuCl|lHˊ .8s8s\A3 2&\9PQ&6è[Eh5]6+[DM{d7; e1(12XIk88g-:z ~ yXCѐqM XרF]Pd.p(ȸ#`/-m@c1 tҍg菦 v`\B|lt$uPW p$H)`Hhꢢ Az@fCAag] Fz"M(s.FFb iK>c_"#65(JDX u1{k7#q=2ql"԰/r'3nmhowjDED{(CD#V5vN7_UX9vj$UT͠ 2S|Ğ=DŽg27ŚpeR=pt&u5既X ܨE]HO,f`EL+RkA4 rKpr%sX:|X1#\  bp@{fɪm|D;lYUijf_ܿ9LE#5>*<"T.s>{R' $ѬEEsODԑ MKnr_ބ<-V{hFMh%\~|%aDlw +tr^Mi, 7F@k 6GrVLW|팘 A,,o-P7PVq_&.΀;B9jZi+~N|v=T%~"W0,ogP-?47vC?C7`3t[ʻnx t]盦ə/lӿۿ͟O W0_ew9=+z_?J9}{?7xY9%_E=_f#,]]ܛ^͇O_/S ,`[ S;29v@4U!xeN\Vݶoz,dc6UawrXd%C9WP >1/͑tU>^?m7{Їٟg|׽M1 QIe .5&hw@e./E\Îs!z` fgg쓞Sd.3v >ͮxQؼ֓s"r!2WM4FF]'|q: zI(,hķ-%r=yZ ec2sƧ 3P 9́bhPJUJx\_w75eR9hsn~Π.m!e6&י#|jYZŧ/ZKt]&thpă@1\y453x&<+A -`IUm7Ӟ񝖠@\6{i+ㄎyclg÷q#6X gjCʐ ;܍i\+ez>pR%+ǯ4pUcM8L~&Gj ym L=uU*=RjB*© YR]İGX?qe$a8V4dwYZdh%@I |ilӍ`}ֺQ[m V߂̃M0&A-Ê?2c\ZȈTMa;r/}K6*E-?#(-/ 8 efHS: ΤT_A2j:$jl!(b!ZA(m3{1L ߂64WKgxY fԋ9gn8.yN4l  „1082töZk4Td~[CHקu!37Ad# Yw3}[CY.Qbx Fw AA&5I!/M -D8CUe,WGfε{E-]8>Ѹw]_GpYG)@V\ 5$1o>7 /u=DO pQs)gfHy_%ne!^5{k )1?4r *n!㨣N^gg\0sdR~<5~K]G*Z(}[ퟏxnY/Im#rY<<*1~ sʲE΍zi03pZC&A@ǻ(#bOP[M`V| 4tEmo|]J+oz Jô7 o4{?;;xLu;>QĽ{ޛ:7]Upq? {oy[n.y;k_Ow.m#?#ďMxo|6JayKKÆ)lP , GrY5xMoF&zeה' +djM2jC9ֹ- ]hڶ:yKeJ%m߹ٻ(9wϽ__u6at0b#h`L[C`**4cGMR+K p,.=BYesLesێ8 b-hb?q;UXkHU˰dV {QF#1"cH P?MUb"U _'{lP1E ơq4{ B Ǒet0O}z䠉{ bP z|}j2-0ȎnFrvV#+A-?,.HinP`'iEot!l,P6ykXƆ5a[_ʬyN-IXD{L|b l@d5>#mO#{7yMdvRO HR 7ܓ̕`lm_9> H]%h&qyyglʩʐg̎04'm #n9 Leݒ]3^2A8A; `ʁEа.S90HA10YĄ Y(6Cy=4 A T$ &HzWֶhqG'Xv偄wNrS&pr,q[D%Sy9ruM*]5bJzXw xo1Ԥ1$-᭵zx6rYؒAtH5|M c|d|G"-.y>MЬp|h4rtX>F-eToFJScq`g %r@6G#`) EB (@L2=6ۙ7Y)墄<p]`\_;H&F!r:g\"Q[-HcݥzکKG PL,VFFiAPxW-,mP՘Om(WPkDP="l;b2qGKdFMmF`p&h##[=b1;pxL I$HLbjKbb&FSuұFr[g{4#NE1,P#7Z TЍF=#/U}H"}&ȼHsnX5IrmJ]]DӬa?}䁆%:Ё<7c/ 0Vlq=͸sk#%~a5/+52H.PJO@lGpIֳP8bPGqXx^9G}䋯.<渺볌.9q"[EJp+IBd)lG?Uv8u^>$ot]_ ~).HE::g\q\gJyt#P.!#8h8v3A"x{ A=u\9yz$_H5qͽi7zt{UǏwbuGDjEVz(x> Mu=pԘpd"6}d|As#$cX2.`JxCu |I)ދotVa9ox;wnzh\]'C~Oq?XO|7 W3?/<4ʿfPMo?!,uOu/cPm57n ^>ml2FF"Erʦxg8򩳴sL=h" I*y *ӏ²R6!A4kcp%xY 2v ZUu_0wٿwS`c= M17l֊}*g$Z)eRE_gl:E9~*ti U jM*hT5*EX ȱ.~Yh2dCC V;=z+Ι (UJ SC=U`aqů;|l; zA `QZAfG\Ŏzt* b#ܠngֆrI4|e*4TuMMᨏz>Z<מ&NZȦ|Iw5Vɔc vʹDzuq4?{#a} [pp kxr~2,{CȒzExsX )jQRI{~I/z4Z= M~2~n-iF{\`N :`MEW]ؑI *F>˽hgݭNn)~TM".AQvms=V<kp=4|kD6D=ԟPAOP5G%$gBew"]* QK3h'it=A;:i[=sSݖ&۱ 2ۛw "3Qd9D܆3ŷ Ĩ&Ʊ H;bf`/:>+(2,&""-}__SO @Zr}wG||@XD&XЉ=Ž%(37E(Q~HY80Psdk$p]0S 8kyKd`/s$AC~lpV6 | đi-W9~zЏ(= Gpg<@!־Tp 鬒 L59sG\Ѯ}ړaKTHWi$@u%J_Gz@Ʈ&{5MRy x*BȍQ TZz<$̒>NJ-@uwE'oaٞ쁓eYx'o{:&֣>pTʐU{Aq::1&.AA;7GI4KG-Cty:x\{y9Œ`|N^k ou)yo,&bJ*[`ᱯAn >푦k,a:I39›[ǤuG~C~:IUZtS-do>+lQ`Giұhnm5&N ==F8BGBƁ# I<*2_=6k}ystb%S!bch,ՠԩт(X4STKhR AV2U!VbR)w}aZ?yy{׺uT*n3,TO‚ƴ]Wxlpĕ\JZNJ1=<ڥi;͵R(f5[Ǿ~IG n+˫l~RR:x]@Cۊ洚.Ii.Ho`pK)Il#V{tť lgs6 Mңs9#-.ĐKyrO/fF ‚h==NmfAYtQTeڿi>曠qL@r"'R ywƿ d7Ǿٳg{Po|3Du\__}g߽4ox{{Xt ȿqͿ7B5Zy~'}'+%@y`?txۯ|WY5]^.,cŸI F+ f? RjBMȦ9Cwm~b?{)1&`b޾ͺAlzχsWC&B_6Pߺ[(''w7?^k#w&}뿴o~xPG= HE7|A߷6{dd{Z3v(D A9REl^eixT& p>9w<6 s'YԠ" td-ORH/41 R]a(rd֎ Vێ/\$ !z6/ eGjw_hRΝgC"S)Tݵo,'p.< ^n=Pl%(qګ".ؕP[],;QrqB1$ yvڒ1xEvwt/;aa.$zl+y^%eD2@B"pd<(9wM"o"mjTlOܒ >7i6KfyWJy3Q(+)A$ ?#Pf>5{g&UFs_&7iZwEwY+E1 U~,@t< ʇMi}0F`@w>@̜qsH#jJĠ:vI jUF<0 ֚OPOIM% IDATSJI[LVaIN3בJyj>ETeFmGxTc"]M%kͺQ)6֒ +jw%Yx}vY\ ͑)uM{YE9vL{AtqaC)ɱ1'12w|E=qF`r_͇K4b[(OEfQ>NhЃw}̇׿s~dO=|W~ϟ+ 2{$9Wп*&d-.5MژgMMܷ7ln(E*5y! pdәyWu6xcԜ3"𕚆̸k5u˴.='VzR;Y)p q&^^L7Uq&ziyl:m" HoG)"gvU1sʦ]Ton2ugm`K刿: 2Zi".*e 7lV(沈HUt&A-] VHMv1oGǓQNeTH{rhTmWgc,s4S`!gf@L9ؔT]*7ʡ@'Va{ΦHAM69<yY;m ; UevWE{n=k-S NJUqN~o7ekc aTF%mOq#F u5Cg'Y3Z!T26@*:A,'#2K3x{`QE^HՆhqe|L22kS4=YOw2I2ʵ!'߹nr\w5* 1-OrrqmDlC?'&|G)vW @=Er A=%Xѱf{ďb`hdx`&o1=h7l11EBe횁+yj1pTRAضO*e,ǃ. Wm$ UbP lQAa7ADuỷVb?A%"ܪr9x&evHpiC&o\C,U}"L>[D`8{ |$m'@Fڹ\~;gY jF{씾|T|,%w0dA2{wr[H|6{4howFBrYp3BB4P:X+OZ[)NQy~ 9v\Yǀu5Bv :llp:E,~eR=XjUY(s}Hmmc{>eqι9eH{9w(Y 4sE{{ 񒲢G36=CNH'v+j:tk5}`jR7u˴DP5I=G(g?5jӑ2vZ 4/0T%>ƾ~ȖHe{F~{E>fP--~95 :SsIT0eYĻ&IuN 3ޕT5{]{'y Ԉ.%z>2(㾅zӠΝ A9v [{AZ<ˠ\҉y_*j7FvI^i">d:FIĮe&zR}`ĕ||ifFwA9;KRlϺg9e 9@ ,R>&@z f5'W]A)jK7 rHuteOQBqlH"iEZ1+rH [ :kNl|OGV[{u̜!3J5|7kO`AeR  R9_gmo'6K\CcT)K39@<f2l]2>t޲Mѵs(YӥgFy#ֹWȿ81ُPyi };Ǜ9_k)37q?7? r||`A_E=>{<5MaZ?WɿqK?ˌO lvVʐR}_xw?"7;?'ǯ=?_{?%u1˼u$l ,zFis;Z m] /r*[ kI*dkSRgT^uY|*e_זF}jRe>JGi{ʨpǙ*c)ƮGMYOfʑ}[uc g6v:bEc7@԰aD)*v;m{N;iF{0y*Srv:#;GWX'mYƕ̉MF \w}p㏝Xukjۙ b J<Uҋׯ Pz80>oGr_e@n6,viv qȡoj{sS} `TT1՜*9F8ʱ[tZr:TԣFy(pKbЙm3_y0ۋFlcؗ#in;a렭:[7W39sm(k(/;!xڧ<r6rwALKӐ5{#OU:zpݧ#Ck&9I<:'r*tq- y wͥ 3X I0M.\~"8)zۘa =r5H |fT|>փN]8\JP(J*Cf= eelaFjӨMVn& ɐES.(+q. (O -B ﵭœhR+W}:WK[caM`U}ƫ_C9B:eD1# vA)iRYv3 `.+6s=z]90e0j 6,cڄW9]gqrEN,P00S#(\VJ9pm'5ܱ̐vQ{GI(:3ڪ {VPr 7y:tZ6kBh1X\AyȩfQ`0xF|,htomu9"M0{S)7 t?S8飻-DNSVݲj!KDP˵vlzWl5c|:Wĩa̓64bԞM0֪ړ$Z0oxYB]n`iokf8Œl[U.qSRswN]eOk 7xNeQ)}"m ʳe;Qo-OvfZg?-- 7|>̟3׼t;??;AW{Byؙa[h1 ـE dn} 0f G~ *c 5 {58}'6/afTC h|hZ|nݫѵVn ??r_7qޟs6?Ny^/|÷ Y\-5'K6o1v@@q zّF0%ybR5nvMPז#[M~ Ԉ;j bʨ2rRs}eB;Gy5ls9q35itS.Q>rKQ9rn mwؑ* ٸXRջLn[6F7/GF,(}V/IUR͔Xq+v7Kj61IURM~lւ8q Fv`!UsbFu0lnR|9n0SCu>G%B-hx8J^RnЩ*Y2:t{IIikac@^)T, ԮX銗J+Ă27Yr}DHU"`yBN Mdf֚'Rcp2վTOcKiϵw8y\ύ@/Vi>r.U[,M:փqF=}&@5eڟ8yO<(" vNٟ$a$׼wu`7v#{LдsަPvyEoՉ׹>͚Ud=sb1sLV:*j>ZS~2|>PQ6W/"~>^:=zf?~}w8Tw}2S~_: IDATmo{O>87 (LYȡajt)!(DzϚB}N:v+/srKnpկ#&{c]fa 1klKɱãQ#PY(/6WN3Ct!881,% ֲ@Vy3&;Uwg`ۂE DkEe@'I|9vFY_ (N'nOp*0D$ťKƝI[w&ؼPfRFƶR~_3ֳA]6sr4-:غ&SPN&&'Z{w9S/`A%(B\?FֺL!Kh^q|^+u;Ӻ_.I3(<ވW̷Լ [xaEd7|,_(*ԆG;LmM `1k 9Ic%%.:pW  $]fo&zpEj̦8D[_K텢$6í^cuTss3)TT|$<_~.=C9uf6˼Ic\/C}p-t+/-%(#K)s'1^Q{'"fpQEYh+ia lz؊5V or>ȦX7I{2+aPg&2e@(qV|76lE22'I~-|D$8aRr \2nL!CGc"/t3X&"!Ʌ֪8ޙ e'./vU^E[ú 8eW䊑kߝ۠lzN;QqGWƮ9\\n5}OЛj7k~ͯ~ {0>׽#k٩y~D/w?l=ox0VXԠ??~|y@U_u{ѱ[}Nd*8[= O>Q|ɗ|~Pke7p Zz>Sw|{vɏMK؀&K역MS5b ̈́(T-d(LeR%jYf 5lgp OYc~w]m0؏2JJ2:hcS.!mJA "δWRKs ƭGe(Ryvn]WuǬ3N{'d ,N I6JU5k+卶5 o LSò6j۷&&*`^ـgĢ`w"Zo>πPΪ.uq@.cZpgB*N3tL"\\6XJ"YIpim%+?|ǫlw*ѥrβ 0>5/sce;5*~sMl>cK 5{smAri݊Y娷`^sta͝qz?UE9}ڼ.V74&9aV"mHI #v%UdG֎Ua/=P-Trc+j++b2kf&wfr<O|ZgV) ӾR9Q2~G,5Vo^@b1 a.*"j=cRb;3Ӳ:rI|iMuc .dub{dc:yrN6TL攢 k]?1mٖPz)ܲؼj;uR s΍H0Pҵace3rz=0 ѣg7}0e[κqLTZ$ٹ$ &gf=̱bZK6DcMiEDSO-#fxVc݈"[ DЩrUU-zMVqpjr̸1]]Eo“p4~{]rn_kLluuYk$ vۂϡ> {U4FTu ]Cue6v Q9wmxq$ʽA_pcx67#փ?8}ߵ~G0v4%Gd嫴/zf{hlڝ+u^)O 4uW4祉J h{4\㿻s E ˠ*n(eB:6"4Nu*ϝ9_XZ:.8eq=O\$U>irwܧPgoeE{Yqk""^j&TW,XXxx;)t<|~}s GOO''r$O?1#]Zd$}_wS'w]OrӲ~Oi@/:='f|~g#'e6'cS~lyv6W6B+ٕ18R-/ ],6Md0l, )+enG<y_x3O%ɶ='I*y=Uѣp`X[λ}53] 6&J3&jTDxj(`Cࣲ~m ծ&K-F{ڸTbOr1G6]AlƩփ@=bq.^ڲiEd8 4R*]G6󦨍8z%˟;g/mx,.nj8AmY= ~qبB>F `{6|m;t{ੜ=uWU s9wr(e^?NP,dq8jp_j<ǣPZh]j|<gdY눃D=T~P3RV66-MF~tH/y7)a?p`4¤LCBrDrxUI\|մWNYɴ{s9 ." |^Hho"K=]vM{oI9x ݃bt&꫿?CwD OϾϏ|U_u'ul6c7-#X‡>}KKk//'7pOc?u|R8Y8a]VC-EQt|+wUՔXbY[J.}+qvQ{o3 R _q`x?,䕏G>!~? 0' Cɳiى4kv.F'Fcx&Nbq:]Qޮ%;5T= ZI?{~L53eW(2FeЖ- 2it"ٕr)w}_OrsPT‰>7A\ Q14{jw<q V;9Rl0s)dMe IEQPi#lPҚV5Κ x<\"=Pea 0{Ԑ0i;D3 U "D1;Vw?+4p2 u#v]ghߒAـq'm qܶ53<8]d\F._Svѵ!#ްQgYώA{ݯ u7F9v#J+ia"ѐj|Uƴ_f溗t*MgOp" Q6䜎Tsd%X$HX{Dt,["EuWw]I0|}",dOQE()pٽƆA]AY#zd\|=C4M0l+hZ;[ pkl!kxkK:)ѺA G; É8D=#gA>6`>L?&h,fFsAjCG]N$r||"bu{9"B2uz^W{o/uZ;q`UpeF9-c.Z8'ǭw}̋QzX_ĩ+ E/All}q#hHNv֊郶ivʦTZGmu'gSXgxgO.^.# :pDU4'a8RxOXa >SJ{[Zy՚KhGAݷIEl^M UI>; X[SJ. "I"a3 _}-D6(wo|wk)?9L:R_s|d.~w$qL;O;.2#|=3~l>Y~CW@Y^b? D0H\螈;DT:w$J#YLpȿAhA1e>;y{X}g1v1O$z׻y~L@x}__yG;0 o i:VkO؏wُ7Doow}:|J^n;R̕6ևoXg|?‹#EBp V6.Tǐm +G2fyt5#l}v'%_į>}֙㟟蟼Q>^3?3R6[=ϫ?8~ƴ!Qf<ה?RY]Z=cR*^h>|,m)6 ΜrRB&kAjl}u +e?#)"T镡xކhRoNeRC3S۵wA<+YD@H^^Gb;#bRwFib-pr 8Csϳ uWU` օK\t4`kRPϷgR 4jX(煶u˦q4^xl+9 >9d@DؾFI'n"YM݂qY'{ "jse4troꚢ)vcEJѾANlK"/knqT#̍Eu(Z5:;KŞC@8ZlR){*"(G (6xCelmt] R*|{ޫ?}{AR/3".|y߽Z9voyf`kk̼P[@ ^V^ x0x!f]zT;"lmh=Ty-2-|X\D`Nx$Y&%v!';yvXhϘ2gRRL$?W?抷~rQBx Qfi;5y702H>a8u3?=}̚BQ[8iGn"n?dF Iy9akwantg6M)יВd0#L>JQ%LEdV=߭~篈c^|uM v~G>z4㭯x_86}̇O A_[rgRS sH]DMG~i*-L2]y`jMc]] kJSd opݶ>عdGܽϫL{ IDAT^*:&4R.Ghi<]ةԶquV]cMu=Sli+*;Z>6]C[mn},!u]Zxܔ\``+A0޵.Wceٰi <6<[ؑk4:kE<"Y3^%0^1=eFú?zèa)E&%Si@1!̲"3AXh #_"`)Q18 55nG;X땆+\ =`Ͳlk"/&՚|ͅgw+ZC7ͯ:Rv˙}%^lv.v1V<fVuec2ʩYX1`Gi+3qRj >evM@ԐB: %cTU2)OCiXD{{GQP` Lc.+Z+PqWn} yjK¬45d\=e4?^XLݮ'೚u>Z/=8<lo]09ތ]-g194CNwkJmUԬs_K?ʇuclZ/ħ|3II+_t͍:k^1*6 gXW<}7n){U.Dift$(eڐϷ  EV}S⟾!7غV7hsυ㭕5/|] 03oװ_$r=)|qӱ'78J -`q'Z +dBtSsFYH`Sר{\2 K]+º)A+/bSYBa(&F"=SrMFhŠ'<E{%4WZ'{WXLԱ& y7h Ajq@*1緳k>>ټe2ӂ3].9j}f=w$A&Ӽ1w# ;cU!%ԁXgC[h!yAIN4ciʊZ8| N XLز8kƞLS )(84mS2@T1;) DX;Y-&@XRҴB&`O<-تnmf7q͞0gy_g)7F; $nx Qwنő% |SE|ZuŝHdcs͍O]]niSus׽^k?&sdj XJD L?"O(ހpFtH)hP 9+X`)9P^+SѾL[1k5UԓrZc"`%l&$08 h{ q-7k:!޾WrA@^xxI k~/jMjQX7ZgcxNƈYX%8`hi|2 cz-V&{/%R%>| zI@eHDjHZ8‰u~YhZ{^ ɫuS;'#8=V|Z'qϬ ;Yso3z/ۚ wfk%A\Lg3{f#A¹6UmBկ~v\G?J"Q1ƶCʹϾ/ pm>A/"ҮWS`g>Ws0te/_wC)jlUJ;7``睭[ş韲uVʲهyOnf[x(S ꈃNYבVyw1eu ,Ձ)!#<\5z(͚8%S=HOL֫%F{s_%J$.E{Y﫽3Oׄ/&#d5eH" 4 +e,`%#t".Ot=/jLHSl GspYǂ:ltLU"xj:}kΆ9מEr DJŸHU&Cz$=Gs<ۏF=d-uO_;a//UpvIo1!SgO$=Qa@z)H ;>)l/zH4mA K0}1+F Kh;MY˒,xÆ=a&kcyWOlCg׋)yz>QQ?Ii/pDgذ]e( 9 <>ت_w<]ax>!5AD퉤jR-v6{ Hz<5x rP<VT^VՄD"f$Cllh [C$*_a`;no|M6$p|zW_<8__l%J$NX_;{#lٲ弉ϫΰGe|j|gj{Ν|~jg;=Ӳ`4捅ƈSmfMg93ij6=?v2ˉ\40)uC &xir'hӀR8un'A}mGb{XlAl ƬṶDNPBGmI0QK2umI04<SIwD`w ShXhvGDGz-pώ6Y"e{Vղ"YX.B]~xx41Ok2 2oZk@~i2낓i'| v.*;C]!v]utK /R6w%Yn챦ٽ!K|S( 9}7=9 yy _KO"'TijnE8;7xկa?bĻ Pdybރ<6ue_$njSй@bG{/ǟFX6gVQr 9`|05#w}=h~p&M~.yg8C6ǽ{?;WH5΄=oM3& vm,ZYw7V͟۶m//5b`瓭?O׀ qQ=Y_tR0ptO5:)j W ftDhPG8za%L˶i빟jM'-$1P#x}SPC <HO(Xv(y.E$KHwF\i]98̍pAh5N,?cPAӠWc{A !L@֬N@ h P{L]ߥְ%ﺗ#}L=V/XILjg"}y>cQUn` aYgn4&ވ=wi8TPJky1rY3evHkjU_ߛ2xX>( bd*~. keeNH݅t P@9Ef>mQO' OyqL763GcdM%V0@6 vRm|窫\hH;0gުzVu=W+c>ukLJlC ϫ,Uw~wG86_}/?s?h4jA>06v5|7po~mAn_rkkDKbM"MlF &!T*!fZܕ V؍ODG i q*a1uEEKm7 8jh]UodbLQ|\GE]fy^t,݊74yVK 3ǤVW#XAELb%qԨ농s>wWa섆f3 Q3)bu;HH,jkW髄6^|hfY;&`v U#,$d8f=w=gn׹̎x9OAAɼcG1sL=0T&8ϡTG=; {˯:4r|?L=JϤD-"ǣ%rqcnok ,*qPpSK$  &my!:>|_a7}*)!Ӎȝ,_s`ٽw]uM0 Q4KZRUl3̜5107v^{vWy߱D )*#JqX)b,J6R.h뚢JQP ړ(c_{n(q|)?gtPrIy6禐RdW ZW, 9@Sؔ2R3lq[2 s45k7E FcLFC!bArLxk6mL Hj^%`++8E { Xv6NapJ>Fj"5Z*ĵAN~Z:iiVLϪق%EZBuB St vmؓwP%k^/71`}}~|*Y?g68‡o|[~,xێ;V6؏u]P֗eɯگ36 vz׼m|,KX=`$F~? [|?G㎙XBhg|[]^6ODF(8V'0hz"y.߇ t}f̣Z !@|<޽)+=$, {i ?iq8a榼z؊΀{>8,3 !Jq0YA^JrTPD t~q oAulB tW&4)VŻc3þZX"FM"5"63N]O= +.ςm^qĊY,^zyOt9LH+nl ^O=OTtdrz8biY/k_ Ei:fr3.gs$iAWF)SX`Ώ`nۚ 1سJ|}_ꫯn^UUcO9ΰχ?lӽ'|K_bŽUU''#lG>RUu]$6)nK/b`=}[| .hSq%KCL"p̎ iKegM^47Jm,sJp"5-${C>Hh Ụm" NؓP=^Kă [4yǞ@(!l-%@ FLa=~b3vz:8e8揱 va^wDXouF|\9hBF!f"aih拙ﲹy7~R"G XhIJ:.{'$1T" -nSbk.ǘ06“ yXQr"7OψSHFH$kA[/(QV,(K(LƦ- + 9b2Ĝ>T@ N|oiCEYts@%|Ȭzoi+udgL7Fs X>qbB vRa}kMhOUo!73-B0}^< C֠#zm3ol}\Jnaǎ!n!G~G$ {¹BY޽{apw3琾I^Fs_g~M4k.-oY{CloO} \1a|fyLj#`>*/Y> #EW֦۔._O"\LO k٬\v7@~֌ `H<f^!2A<tkhI bgh|1'5\KYrc% RRܗbTX*)L[ V3 5rY5,b+w%G̞/sc0bL{]E(ư,e\"Kݦ^aDI j%̭Ѣz qfy8@ofNr};=.DY'6ܝk^"[g_ D k|u,s`@(2MjG2)&}%*u΄¹Ě}z-uM #v4ϻ+XD5S#xbPzݎⱍ%Fk*HCbkZu!YDO. DV^Fk5|l~kDu!brR*e1ȟ#E`#iW"肯1-| NΧ'rk[["Bjuf4|e?uguﷀe#"Z=Ku(r% }/, hs~| %5IF7/DQH)9;'6 h-u#ht郝kM;6&)Ǒäaw3ZsXkB|ӟwM]קO'ަ5Ӈʲ$}9( IDAT~?Zl6o~3%-H{s(ޑ]N@iی5JQ <QBTBR$5iG!|ݐ 81lٔ`bwzb5@"Qk !A! LL$r H]{Lp1pKK7^7W-vE"gL})go5{{d-pgGj1hg&Hb=))(n3x3Ȼ"Dqs/&r' H,ΖGDȥNDB*E)Ê&_k93یQ3ֱ !`,?2~ߜBi NL!!X`%BS0ѝn 3H63غqsfF{yMP뮻 ?${O|[oUkBE|p8osۿI cl۱ctۃmXm⊣s?nV?GL(Y3<+ ЖL߯FK"s?gKoV`]ͩޅ'Pа\Z+,'FE;?Dr%4l/tU;DZ.INMu.P!4*b9g$nFZpP ĵzWʅ>E @H-սH!SAmU~}-# l|4϶uKi9l+T[eمE‹џg 64uN@ t|cRXח3[6ylUbߋ^\!n^,KI= 4C/yvޥ8$4@E4IA wӡlѝ@Fl][囧LnZ*&E2A%y]``uL#ԂJ'Hi&yoG7Lݑ -}cP^,4&K插qƋ͘7窬tw;%KNl\B[@a*vS@/lԀMQ\X+5 n/rMP--IJqU)d AF^#w_zK/^p;WNy0 IH:nCbf, (%md},L;'ʀ}*I2`?nσAa]0c|_m&-9kC\btp)Ē̝C˺tx#:<ҹ)~F4tf*21 d3^W$xݚXY/xg®JY$?I[哑=Oм+$,,J洠6Kf 4zawܴqӖA{^RJ*1ChK_ٟ뙤ŹeIhnw ]z1Ɩal澚z??ٶS]wD2N(7}6w<0 l:;vIM _@,9b-|zRr 6I8]=urLZy2T"'ON*KKʓ'&̚DFV à ,)zgg748[5HE/ "'wyPj4 bw +jN5Wܩ`t" HءhY)_CejxQJcTd3EN`]ށ9mGߝrWރ9BKX*HW@9K/Pp,%B.j1pV^ KeBiX04ǂ6@| ;Gu}64 B*@w_DHq1!.q)K/ 0QC4|3JscP sE/i^^R$}=wl{{ }.-)t3ȅ cgXH7/JA7Ҷ CKPw@Jp-%=l0{c [RTOl#~n˟g@wBQAJC.H][+rG'933t=vK np=[.8)b7+E\W.(F~V$3go"=f1 x 砼zs%?5ۧa`;i$vyq>+ouH@='?98`>_ W^yeא?-ho?cƫNOԌDN)O-PZo';1J^՜̌O||p?`}c3kٟN^1 muRjCV"l)THq~4;xI{FHRDdچ^Vb9d~ ʑb`v:);`*V+|SLFYAFHZݫEnW.o2xz]-mWXD]d֟2WCMB13YpokO |x EElWjhk<>~*7`l WCd@ڤWs&Do^(^pNI.U{g PAH&n#-9‰hȶk)Iޡy0ԋ9D:PFzN3| Yu+Y"NxK#(#gS~wVgh({>z]; wMJq";jLcwo0K*ℍK* J6G&+-䝇0 Yަ  HH C7ْKdskj=BE1Jxn.HPS;{ m02X* <D`9pj[ApR$.Pm$I}c[2PE$jѕY`;&|*?L0%zED;-Tp)oP~ `c.! &!Jؚy H0#+裑12v{BТ=h1EBPjy:\7; ۝۝r}t;vKΚ))KNN4m(ǮI7p3kdoC k\3D+ Q[ 5^p >6ǯ_ȞRgXN1EE)K\T%֚l q.yYn7/\<>Ӗ{.Mj!> 0,9KsQ1Fv*v3FbaðՀXm+**g0PZz!5^V2zkvnd'"(~#gi`uJn/~Cojo|׾FUU9O[dD|+''5r*'MVm_R?vzK 5v.9 +]zw ,8,5s>ak#C֧ntYē501j\" I,/5z& SP3?OsM:fY`d R9 ƂLI2p),iOJ tHU H} E8TPڻ-z(HaGH}(jîPlwBw(鱈M2*il  \5PЀ[*HϏS0EӦ䝞/n3JDQc~AŜ.; ]mp;Ob xk,Bsϻ y-9(U gxс^HS~-F2з8a;a?7L')Vi!A6+\+%?՗{?Gx\9JB0}#ەW(qGBT>Wrł)By2шmJH]E8(p)L3Ml7Kj y* qN P ; ]sg<~n[U|`NJk8֘/yph?WWknnm ?R w3kzK`:""o4Y_hOMXыXb zAI㘙c,KRJ%/\]=l|VOSbJQBtD M:BMmŐM8qGAc;pMWmb|&\%IęZݪl`% JHaK& @h3 +MN;z)X: UbuC R /ݩ ĵ ESFKPs[T).;d?8   JYP` vyBAGo@.8p}$FJXriפh_'v @lB x_ ׌;񢕅j ]b6#ޖڱ<hh)0*)i!zƔse7T,Ј}aIY>fcv4M<66#EFalPGyX] ,^bwa'1 \%% eWv"L  kmW<4,fST8m V5AǂJCM –ňJU"w2Dd9!+^D%B"] ʒ #I΍B> ۔Ec ,e@9pjA"\]gh0(Gv`s>,DsԐ{`SBM7/x}n^?!ݖ(uvwК$/)MP\0be)/Å\Ќ/B11q ;p,} E!HTF+n2vy CS.D1!ׄ|ƀi`q ;p1[ FxC#3AۖQ.$]\;aLS՞Vu%Ƒ3醀>F^u9|She -gP1gt${׭B҂%%ȴ oюCH㢟ÖyA GJo`Zi[Z=ļD@. nKݙcKcaAqG@KЫAvX25u‹7/m Y'[(-.RfpPE%l+?dx`{ -CuH|BxB#1Hח,9"\-#D5 IDATA~,bwQ Kc\ vwAF/ ^ @[;>@5:tȟ'$SJlݺG~t mO^>|uw?AɳN|3-`O | a;wwޙy ,ֲ,}kϹ<ōyȌ".(nll-,O~AF#BFJrȌ1cw眽>?|Ffݖ*-#o=gfggߕy`sr͝U}*ri!Awdw`%Ev1AkFD,2J]> OCL| m#wr}Zbm!?l~4y|S_?:/!,*JC%`4R#U3bKLEō{JOaTfP5RSK̝3]ʳ,DEEE\DMnQ@rj;=,C|(M>G򫅃Wv_kFlFj#kʡ6 CŽ3wPRRpg!"䁛{;"un`F,*.x-%x$H 9h>6; xN4Hdr蓞*l+ !އjNZBK``=1h'"Eud,<1TnS1c2 B>txV fJƪC^h --!lQ*E+B\NB|PQ}Y+J:6Ri$CM$ 3@{$F͑|1G!S@^3O0`86Fa#T-i O \*c2򆉛` cT: klA#l'@ՄЬet7P,m6Q8,4I}ڪ@i'5do:I&R>RҺQMj ![E9V2D47Rh2,z(uSL~qC|M-R.-H5hq`O!~B^n88:&ޚdgNFzd@7'~$aV>0/'al +'}n@L@h~<); =xvȳLh%b1 V3@mJ#Q BB=0({dؠC9C5؋τ9t|*+BC]E4ʨ`#D"2Br\Cw#51R5gTD֣`>gЋj\$AC=D'&rJUndvC 0SQf[oh / Ȗ\@qY9 v Xj>bwLyTkrzHuSeغtB"*,dF(葏) ?4K ;'7~C(qˊ 0!HQZ}~ xƷ|1~oFTZ~Į٫VĜ }8(t@oh{HʐGPm hϾF$}]7#f7!b߁c fu6pPV 73@- ޅYj;)\D=N4PBh3g~ LrIOB04dH$W{X /0.zlRVސ4h5߅(+YTؾ_?Bό\WIXQeT鴐gjlރx=ІtAI)~V@M@2#j 'K X(X0>DOݜ`L\ c $t,3:b@R> Kh6XDB"e~#tԞ'lwɳwg?(K#j!? ; 1bC?0G6>C8ϯùUJGݿ!ޏKE9777#h0|3ɟj^E!Oэ>տuuOȴڙb$-AAZ#]#ҡY[wzE B7%'4 B౑׶#sk׎q4OFD_(=Gch/|RהT 3Bv 0@ %Fgաx T$SJ b#X }(OxYG@_r/gUhh \.4m=іմGP C֏ .[PPݱ]-$,PK%O&"2TfrжxA2XYqʶ~XA4*;dXV9DCD"bn@#Z甖 eW =#| w\qE&"M(^`i-r( 2,ň Zh_G|S cvd9bR]eL|؉ b]od\X~ tGI6`X .ɏ ` DVA3<2T2-!k0b1P{gseJ校 <=0PfLe].0< \+fv6_#}! 6&v#.f>2;~k.|Aj(Z(ki7} H/c}s pl)6iTօ<⺠ V3, (#tX],4ȪaA>+OFb]Z,tdxpE!e{dإjkYC`G~X P3͡;C2!@0%`)%t(3‰Hx)R]Ut5n' q[XB4"珸XhQ_1f"FP#lVbB\p~^HD3oBf-$!]LE۱aA cPb?Z#W =CE=cǠ:TρHh9eI6q@>-q]kxQC T2Xm6VckUBz"*o L&RBKn+!qy%JH؃W`m/%t z` Q ;ֽ8c? lX-S_-$r u(N0pc>D"9s-Wh֡++0\0Rn)D<'{5qnBjAǽFz`SW4#k g?):fV5`hx$$QACr2_#7>PtHBi ЉtPgZ8$^o;1]ن4g>Li*o4'ĵ@<gG= sCiUdmx `#fُ5ݺ"f QS1Y+$4O ";VH q E+ǕR  ]W/Ԙ ࠥj/ +.sc-y\m"23F>`PxO P JD&#ya^&9oș [PҺ!7]k( 7 J0Ⱥ2bndw3(gyAK`!(F)-bL)%0rF ak_F( (*4 l2,TMĬZʒ8. WLj{;F?8 }P6G٣*Nh~f{+`wXafD[[Sk =Ё3Y)Es3Ԣh[E_eڋ &x)ie B\P>'U2gx,u`*L'BFz$߆_e7GE}<9/-ڵm?/=?/o<õ=|0bM??{OO/}9 ‹lDfƛoɅ_U}ͣ061~ K}\(5,. 94:RVEbcྡྷ#T +֝$@-<(YpRD_{ RK6YpxW([^2D"FR -/FG7h} z*Fg$Ec}GQ`#ж.ACysrJxn0&lK+a ԡ(wRB3h`0 l9i,!cY벦Yj:Ww/al`ɠ(I LC>r.>z ǁ 7zBLRگ+ܻ Ġ"7*pEϙf`!<$)PZE]U\Xh.LflCƯI9R5Zm,Fob{7&؎"&U"+zuKYA\tm,b/2a"w6 kF5xVz# 8f{E 帠@M Ezgt >Ȗ ؖe+txQfr@](+.s7 8(XVrlp8B'Q{utn +GlFnΔ&FFbU]Cə2d /LdXώv~}# {k,9F;]x0ZaϚ4: nAa! Q tQ  h 8 :m 6P Ĥtj;rs0!03J΄ ȾPuGFT:{ JxsBIpht6[4t%<(P05r #uzʛ3lPqwxlZQz/(5zV M)>r=Qh߀fDˊbSj'5Ok+NEx!SnAx?2N::"rQI1 Ub] *pذͮ_uh^V䕀M;l3BWQ~aQ$ɔp"VCw- D傾SBa^( Z|5ûg JgN)sΧv(pJг5Ǭ Y恶xCOvs͛$_'LIR!]H]{(O"k =֩*NFw'p Ki4oq ? Np}Cb'#,(5-R l`s9TMV:'yÖFf&eRQW즟Uړ~^96s0O {M+HY-C͝lxU5i;KZ;HY+ P2{cO=7%uEfky7LDSȓGq$ǡ(u"twGh|Ǐ |u|lуز(c]j r?JPňYgt,4  rP}bnCQ 4҂ ,ħ-\$.CZ*9h&RӠ0œ:^R-H'RK8Hӑ61Ӆj @N h%7 63]` )Pe`qAǝ ! _f3fwdhl1+{K aٰM`6Ø03"ؔAK"\*mFb֍fx#:?O>e/aۅ&[ 6]( N \lll(ȸ#ӫ <݄'? Kf03"Wf }cSy֔caI1  A|ȣ@8r+5мa}ネ eG="Z|V"y 67 ODa-ECTؼ.C|=W1"{49YW[u&0#cf5߂t#lyCzςh ȝ<Do%xel(]q[ Gоg[xJ ܁x+юex9S}F#vA (`$UgFrį@2 rv N) 8\ۡj!*FZ<*aK`ȧt3lyEA^=z^\tΓ7[&s'}kp[ pb8B9v1A"pR~CS_EZA>Ȟ; /YtBA;b0{;3щ$jj NӢruAkcGQPDK T 2|M !v.s$pQ2ah^ρl k(Gҋ*,Eм)@2yVhZ.iϐa# 6.-e&΃ ` CQO5ھbxQB ].Ti :x}뇹7]#$Q&N}sg6♾l4>%4!I3pewԛP쀝TdD()E&C|`.R_ą@&wJ*!w. @{qHrp3Ug{Q;]P, FJ2:jyLiss ,00odPf:{Nt <<`ROI-e)灡o v?r@+fd7o+7ʺf"B7鞝?'fsPfR{s%0Þ&5!Rȼ s=ֱc \Qr{>omn "4bFd$@7 WP:!3Y] 軉Sҕd ,"#o ' }3lV(hoQ `5@ V[Fy?ba}]ލ!(Q_l% q}, JCa}O>wbE9 q~%l^?Hoi݅(C!CkF$%v?a:!KJ%a!6Gl:#Oelҿ>"f?7vi5Ŋ2ӹDv2@6#n`HvA̞g}%!^zD8S(-$V' UU=y@ϹHu  .MDL2|sr lELo:"-wGJ ԁ2Юt % ]h{;1}F{A fvh_(6̌%9|k&ـpXp` 2 J}22Z*@* W!zoe ~?D1 os{r^@/4By<.\&/Tp q`g6 ,%BϩvNM@!O  go34;Zj8n 3-vI3*i7ēr367B7J-i naM^Cn5(l"l {5~%@L )Tgy D.ؼcB|mաZoMa /e o$BbK9 S0#܊{vCaihg+h/9g#,1.-Qjl>R.v*Q~* `۶ggWrݏhc7~ËbP?|?!//`>'>?8"s__>g?aGc}~#w iANڧy? (꘽ ҩD~ZwY$y X48ԋfx[/=*ʷkׇ!ƋE#m7`:?g|{4OO>xBNj&Z[FpEѱy|A_U3S ' MZA' NwM`sxY(#(+dz]h^kBr#IuErBp^/|ա(<"M[&[l{E]7%˞m\$ C(ۂL ;J^3o8;iWB肠g75LglCNwX"f=C1Gࢪ-+LLJe zE #̸k;ηi8xB5 = v'B:L,8fL$a0'pBTxul,WR[BXQ^ɮ!dDתIxL7yoPsMB؇ Kت ,A!#6\;*hrݑ(\PPi0ՉKywFY<2';!N$ Z Hs*=:1ɝ6t2204cZeND9 -(2X)C;8(P L_z:Yi`N Xu{"u`g[kx(։֑&̟ ֭IiO3zJ |hgwaܨVM%Yt#9w%L24AAbDR P) T9Zo+M6x]\|+ϣƈ(}Z]\MEF{[;le~ڗ].'V}f͉;_bg`7yeXÀFX1$zw?Q1]Kх!Sn+a'@n a$O+9 Hzw>uzN o$Fi v+i)l;yo ! p"BHB+:Wh/A6"oD&4[ 7!tBPx[P8"CSA"p1^TcQf`nu7Q== \WD~1#6|wDu@u/28W'Zw NjPtm@yI _V؁B JRn0. 6ْqC ,ewׯv C!$Co㔖P=NxN;!p"c;W O g n-}44Cl5L7rqOU dIAn SNң@zZa;D7{oYvν}_DdCdfefefYTHJeLR7 S)+;m4,-ȐaCn2nݐe"bƬ!)yxq^D ZDb**SE޻;SkB]%<7j3@~ou6 3i d &9g ``9)wDHZsJe'ȍn]ʟ6.P[m'+10N_%o#0hkbN^l?i,Y֛UU++ͷQqR?I{WUYsH'=j wcfzsHHD i{:B E;gيBKe]Э9םm_މrT+p۹i#)zp2N!0dm?ߟ_+~7~K;-5n[Cz񂜭IE9(1\ #}žkhO](]5u0rډ+ȶg C!Lc}oĺw!ۯ+ [}\MRguiR38 !B(†[öx13J:-"A|~U \u+Y{3؎pH7FIf REPPA@ Q*;F v>!OY TP)=dfo7 q ˞܇#|Jas=- K X4@1ޟ#</aJ+E#ׯDlPg?[Ӿ2tDR:e/U4lйcPFڭ.)v8LDVJH@^*{Dp^Cy<P-qr#K}-G4("2R<÷.F\A%< }Qf յˊ,:v¸+uJCʸgeBa2" jG;h`:>&g< &t3ꉝ}AYU2 BEE=x?{܊Dr:}t6To@+r&b/j_! ϐ/A}Mq>Nªf~.By|ρU^, gN|KJ)Dl'щY@ w)C0deR* T){Vĝ&p"C51ʋ;1``}w(=T"6+^#G=@`Fo&_wgIۉd-mECxPCZ+둂7d's>]((fl7tڨRzhw(Iɣ̠[ ӑ~39J)p)` {Oy\=༡AfV؊pO`d[))xy@k[pt2c\,>'p*Q&v*3'-芫r0+2 z_PqUct[.CwO aF9R4BԄH3,+3> 0D0odK W#=Jet`HJC=N“ A^V@l+B+u+P=>Zu7\9eRwj5/ L v!9rVay'T)՛xlz늾i_3WdBJ pްɊrP&!Z 3ki2qJ.(r3Xɔ[xZ{"o5p}f"]Ѝ e80z[^677L>ihskGyGسPO~ _fF)x|h9#"[w~/+'X?)JM~9wE(srPRj J ߃S?]૙pz3P@qHﶄہzZ վlθmz-ë3gC<:)g_Eoڟ3W#XSf pr"NK %(NXllI(q42اkԡ!=0?WўOp ~Pf䕖r$O8xMM}'«jtkx>RA5z(q$6(ij6elL/Ԑw*JȔGJHFg#Vˁ)`Zо<7c+DKi!L=p֮~m˃H0N)<)$JAs^Ft:t CL26h.^_; 9#l53`X9(&3#D{0(a8hau8e<ءjʔ^6TOA1jK~D/В`g#,H Dzoz{9 -?-F4 ~1i ջ={M#%Td8Й73\^wABƪvC@Aw=yfT(lf!Lx gp`S :%4*HaTPt0)4+ F#U@\GFhp[0Șgi[3=pp>>B E<ǾuK 0)-C1@VNqLB;0p\7dLjЌWtBB9P'@م5q:;=m`A"vP0 )g/h.)/j0d[|= Gdt4& v6^эBa,^GH1prWq::yitP J#_7$xUUU'v'R?ggՑ:7|W~d+o~c40__{$)7=FD= eǘa@8کhpSG#Vne_F*D3i*\E01TJSOƐu$a%,/3 Z u1>#-lGllp]({FR.EA _Jm( G yGn 84劲`KnxF ,ptERx]fz=O e1ׅ 5( `w*T y zS5T9Ҹ0`e/E3 Wc̄Эa^7jK4c[k(c F2>0ÍPBhcdO)`V}Qa TCp)~]פ!L'KvJ .F/ H!?aSCK[6#M0`Aڇ,D-qv%@>v qʼPV]L {ડ2<dz/G/Ց R2|dBE\o!T;F$w )=lУ29E 3 Ԉ%ttzGzt@{0mEF2&D`pu"b[jXLȃFl]  VdMj Fe g0O!BLQQ--c7kvbP)n\HPݹ(J!)%,v$hAU"0RH/8_(5t0z24ԥ&%q=CGh_/bAFqE@۱/\/sRRbab!^t+|@t!POPEBn >,H̐DdF^1N(ѠH}x2 u5vO e`r&gwAMG@?3 Ekqz/6pݰ_j`%n/;ta ߟ½@%SRݹ@BPF|DX oAokʝ) rʍL= a. 6ۇ2<\k .ꤥ^ DYj+NΔTQCY|cH;Ga=/FT % F]r ˞?߯P͠F>,Kz Pm?NJ>]6s6T< ka B$_-!F<?C['3^J^8?җķZRJ{ A}R!̵}r73b<mNꙨW^y_o~;sׯ<nXjςcE0v6++;PM4=:wZcm!Cn lC9laɚ4]ՂnCuю;Fy⪜LRei ]=O`u+W*TDaz+욑a6B3|ZlKAY,>|^sq86Y Zz#2u{pA@RvkZ*캂0(N}_'D4Ϛ>R"oB8]P\J988R/#AL;WmB/ mPZSa]SHn"{{(AsiȯdFpU]=j;Jx=A']E#Ha;{11TWjZBB {-e TBUW3q"f Y%SXn`?F?0ЉL&@*sm`U ʔ.ytrpaR.WBir I; Bϑ]j_랏8{,gx \`ƕ{E3'[,k}ZHX.[ ZdB2xRv=[\1q +0j4ݺ[G803mwIJ?)we{k#9:_ *CC7{H{jw/yV |Cw!}~̀b;F #Ej똚B(MMsJw5 KCx! 9@ hQW|w6ˬHYHsPݞQh/HѢt$\H]Cs+"Ca k`aZ#͙BXmSZ`ؖQs5\ k8h`_ 6 n,~mg y6=u0~hn $ظ{$%z"uS{Ȉ #B:)]O-0*1iC {&0kۭ?x\x&2Aet%tdD)k52s.RW048U"N/N)N" BW ad|t)v3 sUZ[/0^h >̊tn 1/ T1}`V؆0p᩟u\l&#Du4AOB=7o`ӕ6Zր7n-|v]-Z%?^v;sJ1@WR=H CA/'d /j<6ɯ%ơ)6=m,Ǘ(g NP@Z3욟 eeFqP-s |4wNn91mcSb}Cj(~9ty' Ib1.dGT0*I  ֻ /1[.pI,ϿG@;>]G.eld;0TM]GFT+n@iz@eXƕ? ]|n>LP( >rtc^Ad c`Er]TN_DŽ &DŽ /``hS<.Ìv˰,zڣS5Vg!1b{ѝ'}YBѝUsg ?ڶ_8k}RmoGgh~|Ιc#@Y"tyk_y䡟3'|s_Y~OKjۿ?M o& H%ăX` A.T*Ҽ/ӆCzRkdA{vϰ=(}(Frz)so?. +d'& HQa Y~pC0hAy[7]A΀g[7鲸!̄U) aZs;w"R[; ,{ 7<CGB84Jغe7]9k H`K͵1;M!P =־[  莹M^qP0!i@ 69pا |.NE(cQ.dS`I#rd{V0 y,pQR; !Z"v;x`]QH&qZ`ZH gV799KЭ쫾x$I$-r J7u~R89!% E1@2sCE9X,ԭO:Y;S릝aӾ( o_|V }6ȁ{e`TU~PsN`Nq'x|ͻۗ"\;a2 <ͰyTotF gH`e`"@s3[Lq ̺zIBzq%?]VMpu|g²9A#>Sp J9aS qB#㯋"q9 F]|{ ,C@xLՔ3vdk>W~hR(}oA- t׸՝9j\|Ըpg]%{j+Λ=`U| ݺdR]v$GA94U}&R+f.|-tk BKl%  @0ہr od5# ˆ qѰ%k/&Ҹ8xXl>!6=t2z ʱyfb M@Lg@.ۮC^=kM>~ÚH (-)!?GDTE?Iߘ`/ 5+K/n+F8Zڟ9?FNb ei+wq2lqW˂ q:辟}b@~y"1`[c#~"e񾠱"vʎ);'N ]]3\Et3T'3^GM}k|cMsR?g?ȇZGs9?Ouo>SX_UߺuOꙨ^zH(r<Q_?&`JނDM &n@LfT6"}Gm l a(쌑%l{q^j [oxp! Bz A!WC`yN$(Ww=h.Tr_]q1@S--s]W ^=,ʲB@q ă@y`2pv};; {N8nPJu*IV&+taCW1T cP!gF\F&3եIV^˂"WRB\G;<yu!M-܃8o׶]h&lf eFB  ]54,Yj?7 )nrCGLa'WF sSl l+@y%UA6p BlUvF':i%ڹ@ڠbCWlT)RL CEnzwr1uX| 'TP벺-Xs?Xs7#&s;'Ѱ?1%uۂ\ ؍BNPqVNWӳ\B@.N.ntJZ0u p !` *f!oE IV<4pPƻˉ/tF sUEBt1$C+2넄.nL[O;{Sȴ IxIE[wjBa?b3[+NЈ9–Q.5 *ك`JD\ mջaGR\فpЍPAj(C.2'F.y:2,pA*AB*Fʞ[bB<4rbIʼnVz,/W"4Y*C >wt PIN4EBV㌽kN*Lu+" 5` )Èh"y+OS-CJ IDAT+5V?1lbB]7 }m&"AYoDxtGְ}9Fro9YZގ[(uEa4W?>mA!t;$L D`ş~ц/6dOQK=&uOjtK!u6+XhaÜ,poRd56 : ,rحs' u/ ʚ+ꋙS@ꔇxE,<~ȏ0U$T8ɉcw&…d䙈x"j fp5@k> m#H8ef2vH ۑn{.g,`.iPJ $3pA9v] g&݂97H F7C2tUSN-zzYry:\<͌W)ĶBCd:U]KAE);H.Tw$n8W 4.3ہ4t2tNH_åH+\~Kj咹_^_(V8Ϥ:!\؆wpf= 5L5i&M VGbyMXdDqD⒢DŽI U0+ {&4裝KW0C"Jpԫ֚;d1q Hx|+aOf5H7(Hv0 `7@0*ut xn{2zGKe}O})'EĭYE PDUdpChF9swY:04<ҾlKڗit2Um @s] Gj Ep5`g y\G" #z| 0W00GB/^K^P–Yd180\/8xms\%mجϊ˳}r FM/eXrs4dU-zxEC,mx7<0Ӄ j]\zx~0 K^?_]t"L|wwL9E͛ݣ CŅ Q^2FH{@#%Bzqr85t [BOȇ! q&o)Rf7-ƣ%I .ZY-b?3?45 b  `Br#i"@;%^&vdpiuJ*A¥Nw;!\ۅc9'Wȶ שׁSSFDLp pYi xPp3`Bbհ5lu|ˈG|ΒR*ؖ!;ѽ{m@ل@z\]ο U-Ȣ~ٿ\%av_瞪$PtM:(I9`}?^/%inUq ^{K|% )ܭl&42nlk_N ';x/>^b`W٧@aqYFsŋ98IɫŁ4L].m{$`?(9v,XՒ/t>N0)ҹ$nՋmfRSPiK1:ԫuF~@/onG>C_lɲؑ'zM|?)pw tٱ6$]lJl ^3gL[V횃%B3ׄ)h8|.ˮ`wxA#NS#we/*>®+wcNDv%9#66 BH]%?#6[upF;ʜ(j\ijCȻy-$Bt&d󫃧Ze=e.KLVZdgӛ<!DE`(ffK]e2ŽN(5:$B0%]"ly\=p]yC(c( 9=[@519!ls= ,]F8YN(zODupm4u}+*PIAl!tĬH,zt<{wy,NlA'Ƣڲ4N"j:^^h熔+Xۋ{iJTH\AfX&;0 D3Xagyd/{5 .yaͮgݺFWldT;^aS]DLH73y]].R9.ENDY)4%S 8\m6Sz7 >ڄۀ L}Vƺo&7D!IQǙ|[?."\H}eV6tB^My u^PTrinmt5MOZO{nKV{+y5'#EW] n}M]eܷ]VSUp%|AΞ={Y=0\5]Ѷ-,F__@tȾ|>1^t"Tu]2/{&'?ɠF,/sE`UuGRE0$Ů r=7tyW!OWvR0!)?_"A'i4 є!!轆ݓw)eC T2y~茰 Vؚ"V .t[-zՁc/XSfCrl~w%sbB0g(Z'1|Nt!eE0x08w'P v#.B"\pn3BBvL->js4?[ +&v~T72/{[݊$z3IY+]Rn3PI3-!(eіz,FΖ½v`7ᆺF,8q<}r_oiئ Mp$JfRrE]kx6_H3 bV/tUՌ>(\᾵)s_M-Wx T &ݎyY29D"i t ;#PA}Z!mB(̽\zHn).*!jXߦ0ٜqr Su@~+spʀ)ئzЍ^*צmP3*R|YS`[,yuViʯUθ9pE7*#od-#4E.eW%JBB_C^kc9!i~Dσ$鄆@\&%C%Myn=XegGxU)SgꜾjjeWA >݂%kpFvEb9`srZDS{j?l=rwE4 czsoobwSMܾ4CwD~ĭ%d֊^~*]wT{ iplr3aOv87Dj$PÙ0hLՖM.@<+CUH&n^W#rD7L}3Ҭv6߶{HX{&9_QrT}ְhi""#ܾ}V22 53&hQ:n(l3Y3#Tn,8QP}aD:zs0l~v7`ݏ (/e ~}|tt)}20]-O+n ]P"/TW"=#CP΂{u 3{\֡ !:n _H`wxσ"?{.?́{1@fI4RɃPL\!by WwӢ Fs`]d@M8zNѱf+FVž~ XO2p g _oH'V+E kNV0uz(}i G@|7Id2XEmR\ۭ}@]v:&I_ / V?#jJP ܧ"8-m~_a^gC= n& a{`%݁ƎWD;`Z=r O u=ڲ\])ZMsu8xW'aq>af_4"ޖ裏L°>(}>!pSO-[_{YTu?;x&};phn={vK/F)** qr$H,WP`<PIf%KB,T̓y2eF*V*k67M 䚨0?E֪'OW?E6%"1XX0x9:luPA @oH I.~6uE`h 7ǰ ME$0Ƣ v1,"Z`c+ XTrU"-2D@A ~%#57;{"QSzF׀Ռ2L6zZ*NM (Lj*]""o!+V5Tہ4a:u{^F"FD])%DM=.g:`-ͱ#kKpJ}A .=ê"A2ټ{~s)#:q`IcB1'.qW_8m!w@wC_5ZŽ#"U7 ^#/dSj휱T$tG|ްG%N3qVB< qY\Qb4 f372T)yb_R |2cP=J'JRN خaM|@^Ҋ:1E4Xo7NGL~ BH/FɃҝGFP? Z:B MRgFzJ}AHx &b@z@!)Gpx h mPIhTZ8 45gC?F+H , y"Py k#t$soS`_RSY-Ec1q/0̔)@GHQ3^|jC{EfX ЌXsŏ<FxNV>fæAhمaIV*8{lޘ[+"y\90E#E0w@<IFa7EabPzgX2/vE2_钫T)צ+t mby R#s-T7ة|-zx(q,msƼ06 oB;Z%FƾplAx0t,}Vu7ANe"W 1WbY?XHҡ 6;'ф*65C>v#d8(qM0-6tmyf OE)\1BI/A;[Jvw_@%^H(.G *prz?,. ;E ],lj* }< sC0*cث}9U}(;A7PTE(5 m 5=]Ǣ%PJ`Z$R#VA (?j/B,E(te_gJ~ ݞHS3~$y 3'FP7J@=gեLJbo@x9PiWaʀ{12KZ.Cw%ZQ, ^eqoފA`Ag(8|ۮUޡ;̿Z&z&L`M< u=x! /hE|z $\vց20~bGo."\<#ÚpCD8uG?7~SuK);Zx&mWsrn{VrQ1T\t- *ZbiMi&Dx8‚E{A2c}H]w!HQg1-À˓iLO%?%2 tB|3|Vs]ޓ\MC|aΣup| ;]#q3jv&Oj)\3^md%Mr5ig66stTĨEi[XQg%YFfit_&K4ɔILt>K ; `zu&kFک.%?ba6T(Ѡ^ziD}>یx.:.hGJS_V/}pJB]H Va q"X66Χv6~N.T';ɇ;OsTJ \NsW0I.5PmAJ*is+cҙ){' (VTFp44S@\wg6Kgmdё)t.g4E~WH$b,߻\ IDAT83jC4"Kv1\XsKg2c\‘`"nn'lSxVUR13x rۡPix4فZIG3c0Ƙ4-\ wQw9 &XWIT&aeCOTp(% TR]&jވ4Ь$8nQ\ѭ*a*^kij\|Vjv:NF Sdǔfgv#̊*>W!_K^ܳ``8t er%o ZU%UTu$u~.Hx3˳)J%c{dU̅ ۰|9LgB<..W dX:>GlCF1Y. e{nnyϼu0KmZ;X=X6Q#&В7[ƴ\'*S E"ӹK+ uֶ}syf{=o!aLH#.Ԍmh7 }LGnCq6esgž= ־Gyۄy 1ﵖ3gRHt(RaJ%B#J Lnn̓t뀑̨++UbBlc ZB WFWa {KK7{VV!R{~<ϵk;7fP˷;~!ͿCᙇosg1H_W}^GJ9A<*TW#{F7v1Tf@*}/FMG= ,q|\,T3ݜRcrxUH$CЭ^I @5 7~c-q8=x ݹD佧 :ͮJកlg?킶:XU z>aZpk56+PV \NtxaږNSNRXΚn@{ &Ǜ>]UԊoF4!DAN0W鹠olJY}ͼQֳ'C }i'mYVpCD񮾩n?hZ\v1 ^q2VҭuV&\E{Tj*LʨReClI'ۃ8,|S ^G @%EBCĿo$.Ç>U3]J}yDw wV.d٭%^ #J43u}*2bt v뜴fr nij\[dł#'|FXm'|u=_~yoa,t"(y ~Ǹ{.`!~`|\|yԧ>uUN i}۩¨뚔Ҟb~zGn|x_mxR=fO;8޿w+Ԑw~hirzl2+^ኒ_Rjnd*^HUv,ֳ~!xˀ?QV[vՄ&!iR 8( K+M5Yq?# bubn`[7l127 c@ЉEH:d. H( ^_p\v6pYb1{Oq-AxoG*io=}γhλuOHrUāFG9b+:8h3j+o`o;[4]P; X3qu." fLrK5ROI )?17HpP1X7:\l0#l.{ܦH?H?;BYA<_?jٺό%*Aˮ2EJTD3-9*#ρL󳶧kd؁D#h4F\a6T$u` !lb"h2 3   nA: eBP5`CA]y륏˕aD JNśYgŸ"ފIZ]A3SF=V/|,Q`O`;FG[xn@bi#[bA\Ʈu+3],i`"={MɕpFTD['6Qѐ:7¡EvgDCF(;e$sӦ&yRYsA<nԅw"n#vF.~ 9!K/M4^ċCʨv#v򔴚aS#lGB浄\,ǎ[\.œO>Ec$t`<_w ݻs{70]c9@~8({\ʁ=˟/}Kۺ?Sow?[7RU;Ɠ u*3v]7<~ݫWECb?K^L֢N=ǺabFCC~_5;M5kBUW;.>JK~3k lܑ C*Xb.3[MZ ; ?0LGzVvA \b ipz;k?ZEBB(V|_J{8}x oehv`\K.dS­9YX:H7 ^yp'tȭRp9o0Up՟N E?1(c7WA A;7ԵH5&bf_>˄bB;@--q ǂ{ӯe8ݥ̵9펓~uX o29%-mRC!]ka$K}?w7f$MET; țo_0 E^в vw!U= cLJH`=l\"} .snp )CC{Jb@؀edp#9(9\m ;^Sv9G{SqPAK%s*ٔoExeP+@ߴŀ %ǀ;|g~lii5n!,ggn_/PJpldz' cq 9I+6rAAه/Xٸd4'Di,).RCĀm+܄琥AxB a2, bF2hAd'8|X]^Նx Җ³g tuQp^rXuSPY*W9dQڐ. ڹ"0[Xf F]?'"5ي[,72XHedvIK>2Ž &\t9hX,̭/̄/sg,*n3 O`B`VevU)peɀ=XK%O S:BV(5c#mЂt3L+> ڔq$^ǍDձ1)T[dǁ:kЏbZfG3[-g5D)RߟRfbZyRa߂"t(jRܯ+#`Ag-?NƵb1 Ց#|w=.4K5Y`ߩ&rH )/b)~ϳ\ a U`k$5zbv3**[AZG,x19P> JQrQ\IH&^2ľR<1h ;F$ia ilM]EWCJRom>W\t(&RFDc5 ]zG"GkHGxϬ } gqb$^%;;F2DѾPS8s|cIt96]E) fT,X[a~ ֳ0Yz{dY%4أaITTV 5sхK/}'?|dx[c?;;!!b̌n.\X OkkkPq~7OX;=F_(SN-:?3?éSA[ps3Ob:F"/b .T;]Efj{80m0ag2+ҵZ5sF 3&vc8f`d `9E! >wlo|aD3{:\{F LA׀> %gD@H4!!nfƖ#+eˀ2a)B t%2"X#^Q /08?QWd׿0S\žGs1r=7PEJ "?l*youa)t5 UgIhTn! c-XVU\1(QYM.E6!Eq?s V\-#kH#W[}B=doP)Ǭ̩~}Yy\=RГ%.; j&;#(;!PA<rAYXd5ڈo`2gB0^_A NXX]DTaA,]:Hw"l4tŸ}x"uW!\خ"U q1.cq4}y @HRc!&\Xna( ;C`Tzk" 2Q"a|?ظQh#] @'{K&TpQ9 ;! ە>( I)hHK+;I0}3`3ȉ"1ڻ7sԤ=7?~_!{'dXt"no8qb_x/{_3Wvo. }{WUu ?Cb}C!=zp6O.7_^m76FKk.c ϦuG?Q/cn]z9q.'{˲{gH$+$lJ$,)*(DQ"8B(Iʼn0&bp90( $)$3")dI EY$5Hg8{9{?>~o z{ȉo86hf_˘g"NDBfa_Պdrt x#I>qy#frZ0[BX;6 k <:hG7a-)k[B(0)X4?oTz-&DʆC7 :NJ+7FSOf A,֖-v9bPt=JBs4(.,=(J L; M3+ s`AZAǣO x&n9vX@yq?XD0bx(? kn6>%dB[WL,H:fr,uL&߈yBܙ?)4 ]̠3Vaue?\=DU8(P$<dWGg$|/U9S FbD7.έrӗ,~6JsgkgHcA~z R2Z\z,/ p  H?_k*׳%kk@im1mMq$Z`йc]8~ȵCۄm :ͦUʿ\Y*&gV~;aؼn2ja~K=^}PZ+?o.|;H)olN1_J<5IOx>OwX]a"s> N4B'Ʋ[!w __jnbp&=:K=Dp>/\k? 7"i]B@>-8״@!}j^x0u-t˿bP| ^lPV}(Ē42ǵG( BB*Sֺ.3R IDATH"Ii\gz)(RO3FI+x:-2Akfz9BbI~4k.WЬ+~#JW)N`oggq%wM}'U s7kB'F:lzgez4_R1_w}j--4Bm鎵/$6̡j!8sMWPfM'&Dk/D:jq HH|PKO.EYr\pYmF` cĴP:1!>Z!L'X ("#BBa4ۛj@)C-[[H}d#jj4y-ڲ`m`* ۇeɐks{o#FuA> *ſNO%*)̹{ 8XIF}\Ji!OǔNDdMP} 'Ka9}7+?s|:Ok}wMaF~ ?s?9J͛=|p;T=gܫE[bk2B}}BQ pBfdYF\2~0^`ɡ/:۷^}3Wi`3.32#'啎CW $R6U(vi:8h(DSNq0&^$0 q(+&{1ZۚS]\Q+@S%oP- yF(J25 嗍x@Sg]34#g}\ EA~?1A8: *SFW2!;bSbI7r#k m27(}Ic*ȋ 1pc*йAnwґ#Zs<19B5`+Vpb5ty^ M+-^I({mHEVЉ~E ۬~%'ZBjl~:ӌֽlCU)'kUj._9'E}ūE`xHw#T9CVGIg)Zj`d77_!_QTi,1]TA8dR(cS[o"g=ӐYQj?VpO=)9 DDN~֛ n5򖷬&ߤw(FDǑ/˛xΟ^qmOK)x߾x\pᶐ?/{G7ݵwQGa]doq N ǿn_R3;vJcm?Mсx[Y]j7^9TvE"ծ蠞ֲ^OM^O p/UB<F}Gsrs"EBvUR;#+Jȍ{q0ͧ&D\đ1JTw3,7ŅK=(7*R $B<!VMR9UpB eEXiśG }') }x:FdF$wHu 0lBVF%z$+B=< ?!VC>tBAy@;3\EH߷u@W<b-ٿ{dL<KSfX9P"&ZH3(^ S&!C S`G i24˧@Z"P{:ˌ(&Y.W  A`$&q࣑?C^iZ>I6UBHخr5nAVG` +8eHrݣZaڋW{BL܁8 |?ߏHnpoH[wt3;8+7&!+|`O t ?G(^1~w~g'1SgIS=f78]O<g?c!?ud>SA` j;Q:7@Şn)Nj' 6y[\+xceo?Ky@ (d% сqRU&jղy(ӅKp2@fp!ge$8P\ ࣱ}$gk EY#067/ N-u^ 7nS51:zMDtlppגG0aU WwJ~SZI)e}yR :&R: 6' u_Gxǎ,"|# p|pod7o܉)?%Oujz4Z3[ ]kdUuFA(դ0x8]Y|uev7h%J3*= oX{` L}>ΝB$ga+<%ŜdE2BALş1k#n i7znH  r#kINi12鵈TpPIL}^|Z cZ"#o1ubLbH:_1JX]_SE+#fYw",-۹oG?z6}q@09 6KȌ.òI٫o 7G lpq<QBʔ77k0W#\rwu^y ?ue`zmF'DtSǻ%@KډGBf[Rϻov y !x^3@U_o*U-F*d2EuE*23н(O^`JNI>/Hw/<11Q;$Jb>==rA4 2`;@:(-uB^#N X|yXU!iaۼr9飁Vt"i֊A\ h12g<:@CIxc:ϏPSxOBFK) 6呐X_Gv80:\ʅKتGr9nUshGa&>2vNȪn&&2eYP tKOjlq1W\P'єG妓 ajV*d/ .D[0 LOCN0PcL(= a(Jۤ#`갿U;r:Tb7.)z/x"9a"fB\׮qda.PzQ^#IBbe~Q9™A8x Sʋαu/8熐? Ͽsq6%LT-SRBҩ$ow nL۷w{~h3/O~fz~[6`*+K'"zXwERwj_[= TgZ&٠h{$xb '^FTjaˣ/fݮeVQ$B*[ZL 54\A=@e`ܮfHQZN\rN8@8A%2F=A'ԘU@QCG> 47 SP$dTGWx ɏGC*)m)4df* ogDQb2k/ڑy~ZIjzC߻>?XĺN7ä=:CDc" .D%08H3MF  uks'8bH+ID@%J)BMhrZ9 CtgeJS$4] 5&'Cb:YET à6gL-Ue -xx=j6jf<#\.2sIJn(PJ9ry:I`?ҕx-qjщ B5=Wj(m\,#bqaCB&PdGKB.G4# t$}#)= 6{>(lQ[9ݠzKq*nE> [@$piۮ}YP##ث۪|> 0kom7kZC ۆ}BM}[c3|jGm l8V~\m*xv/Xvo47`W~>6 kv[\[?ĞC&!J)(l ~:/1Ff[ 68~T~__d\^2$FjRB"0Y5YՑ%cVaa؇qdSwdFpp8.|qx gV$ьB0Ƞby(ސ(WYb5YF K&vyyT|2YsAC#u 5ep]&&(Q^.xXjYߕwupX;~Ƭ$a:hHX)^\-JXґÂpUT@B0sBRc( gld\ֹz [H|LSZ]+)$Pk/f) @"FCIK>M.Ioȁx:OŰVVH<0p0zGrj7(Ϗ r bN2i  'Cak֔Jz_y.CgZbIr0XΫ\_ʇ7uNݵD#`G\tx[$tV𿴋3~bEW C X>T&W k+c;{ %R+i{i19'Bv,B,xV Dp~N-n*8lQm=|c_v|CD(kWgw_ϯYgS,! F d)Ԛ'. c Zm#%ʕ FkU<J7МG!)X` 2YF8bD)-{XA4쒑za Qqaig`z"*ij:OcͰ#"=+a!,~M7: gFIgU h6#* IDAT8~<0FQ49RBo|'1[{ǖx(>^US`uk RƓXYzuD/5Fo:$Hayj؃Xsױk&4u`΁n'2Y[`13efI@r~Υ?w$/Hi lXGa Uwlt dtXAU3Q7i)DWk5Ȏv 5C #A'beQ)巌kܑd۔j (Wax1@"Րv/YG!'}};2BXP [KܵMap țw.C%\\g}n5XhɡSzmJujh8K@.KB8sť9({Tl n:p3;! ꀖi2T[&Jb$FX:YEzQdZMfsҳk \nTT 0#[ [D:$F}ng߀=߷GːYӕƶ ]=Y@UPmko ^OCI7 <5-X;L{֚,%Bi& f$?".#,aVW SM` *G?q'!7`W뎷/;}潻;7Am Tw—O|±3p5#?#Wn7~yjq."JnM2z"cY)DoQ3!_v,KCi)igwy~z lŸaCU9Cވ^kϗ5$D]&=qtb1fԳ`[Y@=]eCW@N ܯ`= PBCIo]-4M b.t%;t栍p`#Vh9?Dg/vB Lni= "B8f/z6+{Ӊ6/fbwIsS-[?T&jS5 lAjUτ8gءSZ\SVρQ~k SP2ڥZ!1îWW*/N! f5b+|$z^["DQ4 Რ! pАH+Uq/ oT;Adj$kA3ѓؘ_ձn+#S-{%1ꅌ`HdRq㤻wJf3`d_je4XI+_SY\ӣh-sŮ۵Pǝ@MSUʩĄ tc%kqKB5/SV̳d%pnz5d]0"q` ^u}&c'O~?ׇe=zQ$pLOCk0 ~?yąRJٳ|᳟ pl//_au8Z jqbKxa y?ӍsDF<:8Uȯ+%)s)Pfc`M[9r`t`^(L QrJ y!I%!w z'ćIGC弊G@I/>"nzXUE[;qIZ;CIT{:i1@>Tr!1uHG gN=O*[v gaW{ cePe7H(xj٪C3©B!g1QvJSd4}Nž7+#ū2*nU^ / y7@_,k< RԡD7$ljԉ- 9r|$!o)Q$zZv$*a@8g J9[O݅/n}ɏ8&"Xj|AW#G ]!U:C4ԸFu@\ U߸4+ SQv[Q J|d=.]l-7WQ׽ktMUO4=7x{߻ 6 ۿ;ww_Jq(xxg$w:xX&+@ 9P{CbuT\Tb Car4W3 O .b=S/=~vX`!ca2)Gb"9zgP_LBP|ܥ!ϗv#<+kjBKpR˔S>+;r ij N]W#i_aΖIՇb.<^pJ6T?34W^Y-Fӡ:tg+qLbaxgpBN3^Y[,ScPe_z}Z+@(߸E`(ao ]߇)Sī}[ F-j6S,v!Z䞃u/ftRRTTGESm-^ƪwƪ8l!l'ҴnLeFڜ݇@9nn t|_`1op;k.|6Tb}ua~3^JB`Ȓ M`Zum8 ^ 4*leY'vD6`Tb)H[=| 8 IAHr ,?L?~ 5<ҕ}2]Ư\h;6ug q(a/_~-ȕVLM=@!t,}u_-"(ˁtyuup!9!glp3 Rpq\lKa\j@Jit;oל?& >7}CW<`{yFxOLW' $E!D ?=l*琈H=N+Ǡ?4 b;?Qs0#K#N|yf8E(L\7T Zj*Wid-'Buޛږ\}jsΝ}ݯlH ELіJ0!N@d$0$vXe$@8  `d7{|ιI,>Qf3]v!/8t`"[SPqڞ~֠f I-kb((W,J uP.C[7Q!AEtƜHT*Y ;\P\ȴ@ 3BRvh6jIdm0{BkkbhY%˝#{ϩ( !YGO\[;_sT` U2)w=VvZn+}>^ p&4>FÎl[0=gƇ֛`9`T ?Q#PaR T"k38ʑ[Yek\z:a]IkgMF֚\!~ W9/h(C d%[] FF~'<ޱg"M'Vp^}UN&8a [%c,(t <:R- XN@0N x:E95w+H¤bH}dg4Zl,  Y?(Ix (@(z8@DB'_az0sY| k| Bt BdL+sml~93<3HH=;PsCK!^Kx %uxFHlD3Mt@l̩۳L&J_SmӵKáS[ҖN.yKֶ-9^B׫|3o @z=Bɛ^ϙmm۹LX\kpB^xa;(Oz"4>T~mM 7??ua^;?E,UwC߽w&-'*pVPN0rޡ H9r`g)nTvOw&*+B"jłH9*us*) *ӉhW]i|Yo 4t>+)qɓV IT#AIN BV1RWn)6Be@|2aG ׎A fo|.0I?w$T: bXP02;\m;]q5G,@*1gPwɏ pF29Z;,@12~,@줈vq'ؐHSW87 Gt1ze$cdnVW2$;K>i,ΐ+ &l+23`+|eX32"Q+՟Icꕇ1^[aeɜY&w3΁l3\nr#Cx V3@B*Kq&j_fuă@ MwdfxRh/J8ZdF)3'. [?:m麵oozN|;'ok[o/P]X\a31hu:3;` H㢀p9.xA~/J|_mmmZ?#?u_j?hv_ {rd̝tK :'΍D8o`25BWpՁ<jABvB:s\=VKFJݖ> 3H--0/5p[bk8 V9~ j0B&":P X¤V)`s Ε[U_|~*=F@Da15ХH,"ٵg(#a?ó O;a7 D"]~4@7k@_vG@}zjFdU~7KM&ܶ<͘6*s@vU7ZC柀/ J JP^Y|Y{ ZVqQb`n`S%}3WZPAJyP))Hcב @@72tfD&uX t%L9@ >xg"7e dA"s Ec%H (7{$|`B.sF|U1uP&%Lpo|sD;" Aĵ7?>p;X{:Ms0SFgQX%'VR(+s wܮX;6XHbM09"B,c&_#+#ys f@͏>=AIN,IZ|N%.aO:!т{Ah|B6R7 U]M^u'\i(N[ fft~H( "$Ww$a?%0WwXX IDATQɣ X0,AUa>]m]07~( 'K_ +^0!TBpa'/4¸K06% ea0@Ϻ|(# '"JP[@~[ֶgnݺֶ.3([>(م bmʫ=G*]ImǨ$LG`^t[13~p{󶵭q/O>俴]0sOUg`/ G?nj#?i?Z) pYdLj0 Jyޔ즻u#  ~Z y:"j(#}ueMa5@VWé`nMDu0#9K?)Mf9Pg!t7Mn(ю HJj~B4Jb0L w/XHplOP|&3jJ!P |mM?;7@_qiۅ1xra lvYB| }L7dk; ?7Rm{Z#)⪮8 ˽|hpʳ9XV`I+8x HFکXZ Zc^ѠOc_J~b0Ϋ 8zp'TL 6.`-_^*\6N z.;ݽG@vR Yt?d @uq=F3B,ω@ց*Fsf0ܩ 83seh1Rd~uFhDG.T-cz%XDzf b *:э V21IܮcpB<7?栳H%m"c0f:c4O.Fh"*E `# *H׉Pt;j+'Jk+'=W#(_QVP;18K-)D jn\mTkUyM_ށ|bPL:vF m}l7ЅPwRׯ&-#^ PjkKl77'ˇhqǍرysI W 4h]%`GZiRaTa^/]fُ,Cޑ /fNv7_ߪf83Ʋd#j 䑚)YIrl$Fd -3{Lږ%?qmRr=ٕu<4mdW;PP $& f)+S8Q l==g8|y$eʎ;f4' mDFub 0ݟ6{U^5eq!ة8&[ z4T8 j,Y{J,;rYfhVq$L*Fʼr2!GL3E4:A^-#Vhy~^)] ĿY^/p 7';=BnEO|џG!Ϙ]]_E&Bɣ+ڽ4֜4uXl(*Ute7̓Gmk[ֶ&__*ŷm%j^|:b S\M'@M tE" jAfjO~{m~|#ST_aQm~躱fޙq'Q95RV1PN/OL8YEW\W|v0kTH0IupZC0$Tצ$o+D !]sv ^@Me.pӭx~@Y[bKF<HM@.p(=v:7jZ)X4(ZmYŕ Z~gpL 0~Fఊ(tW;dL1g iPnc1UXmpvBFz]HqVV(f(*rXg >v'7߭ W#Dx~ٌ1K zJk}8`L}גk9| 6p<PQ;P&P"D`J}&ڜ5Ĕ@H0)y;vfWNFPg9 ]ˆR}9@(c Nk]N UTµuDt8w f+^΄^/h !%pY^З61^ZQms2cJF;}@Du23,my=rzG*%B͙)3\-u]98pL4NF1;YFqt6|ʓYӥ8aJua#mМ6k 7,׫*?"Jh:Ғ6D$'AT_jG6؋d,'":y4(r=bB P)WF.Q3zY@&6y`"@*N`b1w2BbÇ{[`2Oi'WWݧ"S" RݍA0jo朿^"tW{jFɆŦ2,e"T=ֶ'LX}_ "pBaBaН9' F-J:#H5Hxun^6kB~G"3mjIb 钃嵁ObD/uW,qIÉ.Lg"I= 0a5@F H$wJF7 QTxRQ˄Lm7 ufԕ½.K'a}®^ #??.kC(>BJ1ocֺ0B/c>Q5wBu^ wm5 S筁ommk[֛ǹmmk[uZ{{ :|yQ-պ-z<шi; Yif BJ UO<۬xO|bktY9ÊPB$ fXԦQ~+~KՕohf~ړrts"1rp@쐕XJaPatI#23ቹY> P/d2k5`}[0 |bYackJwUs@x)Z)0oCEtճSu` N?~ϴɗ۔G+!J`D4Hq;`;J'饶"k/FE )s2403G©9c0ʐϦ7ɾ0w@zד6<,mkQ$9=`/4u ~V=x.пwAzzޮf+AσYYsl$E{/c(DzB:뤃FCs3kc zݨ\ 8!)&+.15T%Pwx}gck>]ͭ n& R!ª2hd^~} Xrw ">ǟp+)P O!Y?08Z 9 ,w,PE:∸C,kl f Izs~bJTf-ˑz/S-Y2bR[@bP;ZF&p< c{; %B1>߼Lik!;ٽDw D(G"z*JjW\2k6~_KY#F`z^'x ӑvzbW5q=eNֈ*{8'*?xGL>aMi1LdIg.U|%Xxߖe-,#5h150=. 1c'Ce[^9<{=Nj#˔B1#L^q7JGx]J;܉gQ7 TZ=9УG݀ڌDauKqW?3 % 9&K3`,̝JD)W'T7 f_} \H*"y_k8M8on>1VKp?PO%' ݒF;LL3Wc{{%e _P>ھq2-t dE ͨ  &݋-z58DTEAdYu&ǠS[AO+nm韒!'}Y_Z}րmmSƪ]m5JUi{!N3Ԡ{@ʠÌYR$)2g%| X%0Pl⻾m2WA֒jBg3@ ]VwU~ݦ@F'O/# i⯨ ?:2`2>D>ɿFQL*E*9Jж-rC[ybݩڛ쟺X@kvAƎxi+T"܃q1yk#U` A\}}v0UU,c yձ2S=X]*Q% 3MTK`aDXhuTJVҴ_e{:9 t g#A׊ڻ~? B8l9}Д }M]5:5dpBa{ OA~,,.tt)M{Ww@=Xd6@f%V4 as 8oyy ?#n]p_Ͽ€݅ncm Wlxw%w# KǞ͙KSz7 5TUCG`p\ ߽2 C+i2lrȯ }dc>f`ʈ480Ձ1J- T/&ȞiVd3F;eͶ13'{We6HT_?SD~0#e1BC_YȊ1,@gMf̲DŽ]Sdhkpkb5!1S#xb4JD`k^e4fQwbR;,r+"P;Ad+:*䄵WO.V))c-'HxXflԲ"ݲ2{-#wH8YQb& Itb=ڽm95Sؿ]jjxTЩ=SkMc+~ qruɌtaJp+dȞry&虄,Nʜ"#Pkn>t{R2[_ϖtWV+F]$">|7Xy!fix0f 2S$Bmg>U݁EǞXG)Z- !0Sq),jg @:nQwKT8xn')Ei8pR\nD ́r_+*b<^y\~@B+rmm˸Œ i딭_9q %oU R;Yhi#~ Lc!({Pl$/,^MtHDʓGUv nڄd%\^;[ɾwQUV Eooබ-7yǁ׻|䇛}}>= 6t rEHy7>_sj&3_~'U) ]F?7s}G9"nEOmO2| BNGʩHp<۹*ugb~TuF' HbUIV !+Ǿ>zUqǃk$Ug26l /;K r Lq$-79'p/7|ǽm]&J͈ ĥPS9A(LJ&.(B /z u'U3f]QmMm%7*ͻ2F&[9K1C %կ p1žG uĽF\UUQ݊-Pbf~V@6f 5;F>ª2 L`0BbG%,=(1(G{=߳)m>qRdn yzʉ'u#JP(/e*.Ƀ6ޜN9 8;Y֯*RBW og- mmk[zg?YfBlk[zKkk1?,|v嶵#x5aS e| r e'rIh~[<+9q 9{FwY=Q*&<vlg(Q"Un:Aջg%"`h"UI`x^6*p?pbɸK:%W!{3X\[[EְN 3͑F>ukaPQi.B_ac|?rp[**vUs]"?5)X}{V+~KX(Λ[\hW+ۮR܂aE6<2'*rM}b\(0{ (>eլt,%.(C}9";8<:1{A8Y' f=1)s0}~uWخo4QEn>W!7M u,\yƞnN4@K<ġ&$T0l1`9u4RF ,cSVQ, +<%͡`=% ##z7.ػA* TN@Z>&Fd.<3*2 #ƎғPF%u8fܢ!L\]uN~@{{d!kv=Q{I vzD/_n5 >?L]zXCЗ-qVȟ5P]VROF|s/LZޱrUcg[c ik`:/[v#D IDAT0ÑHe õհ"cm`0 ɕU^O;n`~y[ S%R>>]A(Gk.da ' "m 14x7qgvNzURtSJ:t\[ݠte!&: t7.,` ƪlȻM`뫨ī""؁݁Σ+z1b$FBGp.wQ{>&3($;qn{=cn 鿘1OZ}g5;yP@p'SL~y#~MWz_b ÆS<m}1FӉ#CdHR#3V8>Bok[ֶ,ZX.[j[ַ}ɆIz;t~hM:iɱbk OE9(K2j/ İ7|d{i}5{{7Yַߍ-P: ].UAVy̐BNpu~yvV)#L/:Dh^ :H1_efB6 2 ό7[,%@j !@ X ɕ kiyN2Pr3=g! jLuV|eŬ22әLY ;\tqa:1Q;uE7H' @1mC)&݀&7*`W'RUYG@*'txtUn"_Ѕ\#y){'l \&p 䟣OԒQ;'=U;]eeՐypih+2~=%qPw&K}+~~6G`shHP{^wZ7'3<x\jJ8?ߣ͘jڔ0_X7!~(;߆@\v2un^BpivSsM.0lbDF)],6o}Rk-j&:H]үa#QgL5 acj@qAZqZ~LH^Ar=\ )@5j2e#vб#ËywCvuH{5PL}rWOdr"5A˅+ PkXSѭ^OZAi "t3j.l2ۥ)sQ##;a vY3'uAČį@ݍ%E26Ŧ6z*5{t^@7j׳9J aP̠f>3<}Db;;2\ i`|Ō2RNd7Tq.F,q#eV35Qlg4|HFZk=T?a^\8hۛri!cUEkm"/[yrxlk[ֶ4~vkYmm-Q-_xI4V$f[^ݵ6r6 !L& K , L@ Ӓa/2 ېzm%H$$LҢm=\fp̼Fz<@^e޼7LiCW[v+>S>MPRsAt7ѽS! &I%?<̉ TjEjJ4Ů8X٧ozQɨ+J+ab!tSpN2vԫQ kkjcr+0Km iUp 221 !&b@V8@7X?+'h@@ vX |VKF4F[C?2^[P#Բb_9a%Ub Z&u dl}8Y6Hݧ S9B;) : )-y)Fo%3\VƐISh!;eF}00lq~:HT6SGCadzqOhd{ 07 FAnt''!,mR$ܰܝ;ZZ$?04לu>5Kņ@(r.\-_c!8@ؓ ~Az3НNs6{K M눀%W+0 ᳊,= ;$4 ȧZf/Ԯuv4/qTŊ֌\WY  9;A'#1KPPq$6 K-8 #$AÂg$dP11I&Z}X[?/P$K'c4wrAQ(rS NOXʊtVݓksxrȠj nupLOUcN@7:Guu@Ġ89w$[́ YZ#z0?.OYC"TeHFTAJ &7]f JA%#T> ?j*oUs,@j II ٫;P Ot09qbT`>R>W`%z9 C}nj%1qu# 3t;CCR!M3{ցQ/s?G#HU`Lᷕ.(D'HxSfӐɎR%'`JAJ{QD=$r4aJ"g#*t5{[s$߾ƖK)XQfЅ= @!'߁;g#D&q5}x^H>3Y=R#Xba[Z="\6Q`o/̉XҽcU8jG'\ b,]~GU焴?̘,IK{"nܣtԘ0}|du!,3yX ș27M (2ej3k:gAݾZj==JBy4:Jb@\+PO2kd3F2AqswI(rɨp .DbpoDLݸ/]|l|0螚9K!P3C@:Ę=s6RDJfm+BMsY,WrO1(;ϷX7#f'9~'O1z~ Lr:Y`Њ?3g+,)c{1?~mų'BhMZU4x3^B@^8pR 5j7WOg~/!>wz}E7n![,FLdݺ%b:j$D< 98PPS2ciuT'^LbXc9e̛9!8# s3P, _=}z͌BJefK!؜6+uXcpbA*WX`+vթ"pw7Wٷh5Yh1V!X';m\ |n6s2M A:?w|$ 5:ӜPz)(?FwM̞;JYFwms;GnQ7@q2IYK¤ħQCSC 7>f?]a0-2 H,_:!\BfpGwt{2E`#No Xy|M8RwI, '3P|3kc;Q%$Q`e(ZhPwݕa/25QON3d'?']r1cmЎ*:q(K  aGGD"7Ϋ1 [|E"].3Lmsk"B|DQ&~j~wmn@g+ BZJ^D7(dX+, QB؏2 m,{rq`k`ʈ*y2DA;;To՟#kծv]V_Kj})w]A}_>=7kv@AR\+V32[-<婵A=x=RWp[[^]jWG) -n%z~B& l?w(0 8ցC`Lx٘=|'## >Hn48(UDJVx"Dba Umb!Kyw&Ӛ6F^j4uҊ{Bezv0ȹOr%E,+B" MT1F8/LE(_4+&QG[0l6Rg~/-B> xVm}BBJA̮O3gg7^ Y k8)s#Bh '3ߜ/aͱ t8` Ɣ)6Q(T8H|odj$+cN0+,gRF{SUJ&D .'|@#+E&Ђ;Xv·kgSKK0K3!!1&3.,uihۂo093B1H!ffY{߄ڸ_%kX>ֽe ndyYA*xO|;nU67 s2)^z`vꎡ N$Q֒Q@+%$ۘ}RnWL [d MzX4a3ρ}o&~[a]v`?>xPAE\ '䍊oS>=ې,(uڮ5ʣ0+ O&urQ0%ĆOkx5BfzyԜMz`29{zNx=w'!>"Yl "#"KN"فPogr385Bnoݶ@D-Q,JE琮%=4aO4x4_fڪDg-N/ $#_h&1x.&¼ue^]ǿ6.H x܉$8_8XY7 ;oZI/f,Jvנ"N<qoNi;7%":@4@"O'0KBoԞB YAoV,J$z"N(AExjqWNF yb:xʐ2NN Tr.y|?w]jW_55 ÓojWծHק?IoaбJ4*]/!T{79LPʛ_/D1B1 @ </`v?D_~lZ0" = p²prpu%Hd';bƹqc5:NOfn)WoEuXv`p& N] @=)g،uE3!BTC+)=~|ZkPnb-B~lc w#6PJt '[*4j-]+"FfOěrOP]Vkx:vSKK02:* 7 :(J˴s~ӈ#=ܽFjvd԰8Xl %g =hu`l TdQ>; SWg\໡3TՁ %SMJuq+24ݔ?W^(zMN^?{mhy3H#ݟWGo>e-Y^%}ff 3~d>KmܬJ;e[,y0dNzp "Y3 1m+n_ t[a)x`:DEE`Vb+Aǧ˓.}qBRz7JE6\gXsBVU 9(3Ő}s,PBFj]p5 UW|\0du ԰uDjDHp\}JzDm5#1@?cno^:cdm _m||{zlPP' m:KA2KoktLic= IDAT)3m`qh0P.0Z+2\IPKt=qa_ddм#-\z㣢`18, ~s ? 2'I~aF1W*P_inqgD]T$ r s jdqBPU̚Ds{@$R?\/oID' o>KS&#oד>qh[7 9hR9G{O ![SEZw܊*й@t ~ݒ= SI.B:?}Ɇ=Jmp(eF:6)rh OUE!j7]Gm.>Wt`k`yd>[W,c!:uWR_XHILqTX-t 3%U*SVP.\D{+Tlʌ5C"1':z$-΃>OJUB\oO@!H0~@ς~tMS | L[BobNyW ) ؠn]70ML=oLi$>Z>N&"@!Κ++ ^ߣ($hgksP"Jl ` 0+NP0CmGNI}A ct5k#2x0?L6aRP yPzU!l>2Pn "2p+`}8\lFbSÚRە 5ϦﲿilϱЫFX)K*&o w\ =Qҭ^U؇(^ @<]*L94iMF NA!\q{yd Aofj< !C™#c0iE6[0T=6@@rhC/6WzL6q `핍WI+ SQ}TM 7 ]jW^{Oծv]ѩ(>C0iۨ,G>4^^Q m_5[='=kAyHŘ+5oծv?Nb]eԧ<;JPN* ao$! El[aw x!Tި<7ꋑ~6 ẀNn Գ4s򺟩 ? 03SOn0tssP]!.~(n=z@/wnt`Xhh{͍e90 p.eMq^= q=4XA!~9=ǫ3<w uצֶw&+` `mGھ)|o*qл }tdCS;1 5qc[V@_9DYV;=xƟIQׁ}~ `,Fw?nH<;2&nh1 a<P/^TiX/VfcBf `R++ؿu llc KAxE;<:hU,BWUWĢ/~A)SV, =* ]~/Zx?YsT +e*nM ]G:f[o 5lukb:7[mnT#M^74H j=*@7v>>ϛ-07oA3;k*E .9LzGc\)2%NY>t '=Dc0s3s!b5g:گO9|5EԨ~Ŀ\G3yEnu3 oFjm׶Q6W!'lwU4A}5_0+x#-ESEQlaP,NTQ3z:'N-c']$aH ٪)بg,v QƋqۈW9Wl>BORI^|?mKKi[ϑint'-H&DT|B:xb9CaM90(/g>+_$x A{A"ݽRF˜-d1MN[0&<3ݮޛa /N࣐kR6N9- \N aЗJ2MDZX@fC%rv{jrXx8>Bh&np:Z1unWma9 /`ľz0Þ Cy-N&`LDb_.Az4\_lN*+uu:c8= {x%"Ck ʠT_'=KBq8# |7̔K- ̆=0U!҅ޕ uS."am/!`a<Hf)p cAT@ x:,#i_*(kWQ=p.bk#|)g3nBBёM(FՌ!LrɡuB]5OR+lP*b{^ͽArZ[wh/sYi@ ͐&BWHdZs,`t+D:jȳPj۳ނz(Tmc@FoKxptzLG3U V!QnCwr7#G 9`Bk;1p<-%- y(0B=H:%&vץ4zH5?# _YLm]|~ӾWoP}HwU(mTXHWKMMw i.5K;tkukvǮv]ꫢ>PJYjWx}߿l)bdZ< *[9BsʤFrcp^>_(vIQ'#;"./BSyk9ܝQaYKm= Pձ"9 G{0!c#r>ghf ! Ӿ_Nmɫ`Sl=*g{=zy( A h.#1zV|gP\Q-Q1z'P/9{Dh 17Bt&84V7x ]9lNVmnuG*O#':IJX罰g"1LJe܈un(;~{])B@D$w@~T=w9`>WjF3۾ |"z%bh+|Ƭg\MaWR 17\w1ZNf 6B. |} ,m "ҧ}ҭ]gjf %]\^.^!we+ëRf<c([5'vRs)GT?n'Z=|nhb3#Ifd@.}=UhjVW\^ϴ'HIrH ,j,aZxL. }6wu@ &>0mrxAfŤX݇Dxiǐ!D7S';c?*e ^%Pv^i]_lap"ƈ0t 63_Ӯ{_yT}]:cY?^CX : #>lNcخ=?Χ32sRMue :mj+R= l]Rdނr >xv@<_?`f@V5q|_k׾kь&w9@kj8A[/Tx8,e*$iPnLW2J 2hȿx2}7e{`6g[Ac䑣v9+:R~[K _HӍn[?/"UM`&6 f_9/?Qelw]-)h m@ӊ]lkZ)A*{+UXRt baD`X(&W!=ʋuHeZvwU&bkDfW)̌~k@[3o9:DeZzjfLɳ`@~b3J>{ @HSJuTgnο@c|49c@pD?((nXQ IDAT(d;/)!KH2w*_cD)/V@G#!{fI\*@f5S Q?yp{^aU YEa-}L-/5B]nJ7 cm~#:3+&~_-io..@{dzh0 ]V*F栭̮H RF=j#39JN@8_Pt h _v~C@Z%sYP5a՝|yZr@a4i~?, i8(k46/.歴_-?@u<%l:z0_ٰ^_;Dː МOhTokQ̔3_p"Q乂^X\~@_)72_#:q0ښY)शPvQ}jP>km[_3܁vH e$W>/BFܡDMпš7uqk̢No!N60\;r7rF`2nD~w2ka&y>6dAHρˠon=kCZR|6n=|h|= k%Z-:,lIxx@NOQfR$=A^|rt%@}LjaĦU¥T‘?c@" {z4,\ dqcw*԰8Juw w 9RRH3 şgU@ɴ<[ tn\؟ bɿԉ8PHr+ѹ`P|،8m(#1y@Q[@sgQfʢ3߯$!Fʻz(P LFy4*sg/T6WtOivX(HbF8Q' ~m@>ubtrPrbY3܄P/ag w9s hv癟G98yHL=F4%h@+Wgg_J\*뇈N?ύ{@~_׾cQ9hWk_I?m3}w>!Ef<Ѕ_"0 `Q4e30dC= KB<] =5xqꪕ%p۬@3jPxs o+׾Ya_J]Y[͞|0rDC*%<+ s, E*IZ|Mt S42Q—nEz-2$q!dgD͇3q+~pW ne_.'r(^'*f!no/<^=7_oUmKlʳџwYؚ+O*sM*Иc hs%WȚK*e\ÈH Jg\(1`H]9L6 ~jub1(3 /iے6)lˆosO*aˋx>ia>8@">*u l_EW"i1'c!֔BpWD?`hio; #C=OXwY_6*\iPb`%Ch 'oUH/ĿRvkd)@md; 1MN71Q}<*`x+ːt_YS՝Lfl$NAL*k ɇVWMu3|@g$BN70 zu@_] wD 7:ӀA]mF+m௞oϵ1;XVZʄ7ɷm"Έ-ĝ>bjsR4Eˁ̻pWz**:T9}BO ̅yLO%!RJ(K=i=c&B:}l|ɉGlw4 Aۺ+l5ζvv{D85ܘhpkf򭉠3[peɈg`[3'v@9bd|seύT-1Q߀4ѾW#JNzͰgkw+jcAF7F6zԟ*j`nc_,sHaPZEn1 s3데#aX6?n3͹=;76?k0Zϕ +A}l$tC}۰xO#sR;LkXi4'U8y<$(A(֝X|\mLmH֝a^:Z !0FA~rŽ ˈB, D6= }k_h>׾~5G0Ygnx@]/)uv=+%j"c4SXH/WoFl,.<_z&qP8hp cj▢a}֯ʯHRODg-˔~&O*:+ז1l(K3;ƌݝtmY F+<4[Fvo.\"9x׃q+}}0 81}6xuѰ]yT6_w EByM5C9p0RC??#Jųuhm;EZӚaV<H%z&) )eɥ4p2~Nz (G}Vw^P0/#}[/gju3W[8@J|.S/j06^K ޫ!Fe?Hs#ٳtK͉u K//5`DLZ0a9@ȓrG`'"n{ *n05x P'Rzk%[މ<L8(Pi?z/ɿwFFPHZn-)81|#QZzIsS0Xf@dRL}hJG\=Hq=AyW5s ף/HcpucT'brEwp=ބxiKx ]` -yzFt{k|xw n"%|gRlΔ*B=qC7L)#m4t 8iG'B QeH#]2;YC? c>lqM H'ɫәz@q)$;PpC"7=B=7!OL+LG0U qg8 bMP>WѶ&}n$%] (A( R\?g#s¿ӗ.{{rp""@룫9]"SϬ 8 3!^3uYh'@d%[KmZsfKL =OFS=煻>l.hw+}4~-՚+x슁a%( xq6HPQ66# 햤,YeXW UrE!H@oGs>Z}ݚAv{ִ}k_?b;0VKYþ%zꖰ'g]V \ӊ<  w^Ӣ_ambm<)kG85Wԯ;Ⱥx {rx>Q/8ctZjf7N'&{6OQyya\ I qPXҨTZy2AҹG^1'-=hԕP;TqoX 6/ߗAmo8\oϯhG[}'AWo,C~&wuM`ic+ڵ +PXK+/}PhJ: .* U|_|6z602l #i:n]*=e#odA(@H1a- 9kw6sbtLJ$gVWJXPVV)ػ>DoAo᪶aB{]v۴=gZ!tF3NjUghBJCW'!QxET+N )B5i1aHD7d>z/ЬBMH=[Eoz^9&Ch&ISMsǹgQFo"#VbP{öew-ɕaߡtջPF +#emŎo}6hIIGVEm d6N0jcdTK~%6YaP68x@KSRh|Yݚ+UJT!K@͙p9§2/jP:VzOf}"e *j`0Kbq`$ nԄHDR$@S}!'{PUH{97FS@9Z$%珍{^Q֕a@n8鄨^O7[{ի" w֘?𳦾gfǡ/8Ҵ9#5`t-X%9' ;~p% *MM8G-Y dž9pP>>MtmCސS_ v>+D( zbp^ִ Ta\ͅN>:I.t欋&TSA)GD$}k_?s7¾23Zk ðoW}l0& i3x[XM)}5 ։ſP8h? o;Obz4p 6xkZAci/xpuy׾~`.zϫOz[A}:^J[`ZDDJu5tm(`׭gCӂo thqXA!HEϡ' '5a'bL >غ] =ȿ~J$^4.Z uB+ 薬i=V\]zԕT*qeUmf0܌niԕg%f8QtTlfS խ6 Shjv%Eg>2]U$,y t0y?+"%A*:qdT@}Lmw /tmxM{(1FWU`?E$F!'q9δ \d pYa@O0C5b''%/WT`ݧ8UB +=[ҔnbH'q!_zy ]g$%Qh˂$pUb(xhqo/Q` P6k Kj#>PڡCK%pQ"t7wEr5ZU9d/]a R{v-XA.]]q6DODEʃ[0d}Zi{ H@ӆ(yQ G^ܨy7F0ArVź%((* ~:M)T$OBRvT]N@__K/:[OB/ 7Ow(S!m:PJ (29AaO2qD`7WHd] %)cf=S Uh=AS}\] <4# _r!fB6.L2eehSڱO<]CX[懓pYPn(G'hL69@ܿbFlTQmM[|'tT؛mD@N<#Àa=Ӽ*&gzʤ SeeƷm4b{][O;H|Ԃ~%x9`j#'\1}^I V tw#p TI$uhd*tF itb Q`(v?ؑAsQQPo* S' @}XO]E ͚fs 0!7+Z~UD =@F0%|jvCcљ*W#2LfڋWk_׾eݿy׾\^}Q^ *~ZˁpgKHnX45 %#7'H3R@vrq1DC$Wp[ЧyQ3k_ןG"jb*_V|Y}  ь<zLI;KPV=:b$LzR?#R)fV5y |q%`|<Vu ~ `߄Ftڈ5Xg*?rzX[*UhSez2aosK4Bi3WuSh>PJ#hʡ/n~eTt/DD ݅E և[a5#HaT]p%~Xރ!5ҕFW%wc|=vF3{FC%!KE7b^y'ywg 61D5lؓ+^4]q;s.4qQ^PZT48yYX˞ *h mv $Z "><nA;$Dd䞟n ;o;&e*OgI/tU‡ Kmf"p@9}%O3(yomg)>9Ҵ;o`HEuYXm `/3#>)ASfG &`]2LZkF^~<)Ȼ>lp}^g743Z˴эP8d s)F;>^r;Q[]pvv0!2fM(H~&PYYֿ4F1 0?{B׈Nгv^xE)gF~ݘ =Yu<, gJjƎ~;xȗ})GF{T B|Q"]5m+3w@c"~H @nu7D@%8yA_3Iٛg<| dvl/i V ̫Vuk nNy2GJ=NA[% Lm[27G>QƏXSUN>VkkTϗvYa n.Pͳէ9CWK6󂴈n#Ԡ&J)B1ѫZ`y[̈́Uds̓חp(|nIX yڜH 2T I=\qn#ؙ ~i#։r>(Rgz}] WPZݝvJFO"ܙJ%m̆ %\Pul?v`Z5 ="a¦ʹf7+6\m?>SbH;gv$DmN*l_^$L!S9W/Xu_<*}{v5V5T!.zzR)G@N6JRʚ>^:|­uj N|)δ{[Vȏ J?CXbԘh+l[e ~g}vqH3Vg:?'>؃xk ܄D~1"JEɣo]̯dT-`;'=EtHj9 L zqD_(kEQc,%Wu)ݽAу3fDNóɊ }6Add4 l,o{u7i * s Bx$!El[24[ B{AL|Ǎv_uziA}mE[@x4+}rj" @ Y$GՍWce0`h inw}P2`UHͿ M.(BܚE1tuM_]P?$[SZE[#(ԗ<}iqgD?{`FP&D҈lrǰ%9u҆Ƹh%8ծvtծv~F]}-n-&?T@2hf}n*/@ػ=HF /z9a u@,l.x,ЬQ^vr?nޮv~*"== !1ڠgQgO ubANA?CE_--5wq#rDHMT$ HYU$0_+ ߄mA5Vzs2]t#HQARQW  !K"m6l/$L 3˺{ 3HaUA/hϔW]$Ev_ۿ"-T y@O<$X)Z?^z砮"U"TH6Pnrd!5iXq7%lj2IĢ,ak6CPKoR`ͯh+tr@7&K0ɰhZO(Q21ʞwW&0|3 -i~[%gO,)& L`{%NWZ @ZQLJ4˷>噤RWS#e'lH¯%δ@ExɳlA3V<`Vg ؒ`L 4ac( Uit+Uc9+-(*7hLa ĺ"SU'|R%אI Kg }8 . k  ٣tpN#e226脣a?dCA]Z q!+E., ,$Zȼ<%OcT`+'pg6;RW!PQDZLj­(ce=T~=@MB(=exT_?4KWnp$ӖmSKB'k{Ն\KDSҩWWjvE*قRLDxwzBш~hB}ik3hÈNLE:dvDqXGxZ,kᡃUx?Z +jrï͠䉯+ e 6 g۵4b@48](O=aJ&j̬,RՉf RY&%!E&(I^=*cfyXb,| e}2, ;M Q7#̪eD> 0"E}+k㛑r%c-ɒ*l`|+b%qip{rm{08/G5'NY,; N)|F:@& V[P8*&_f'%L¶/mW~bc114qiQ7U@km1S&FKH|+/a,/ sxR>D"n=ח9YᓈG 2:k֭U IC[ï E_zB€*ȑHf Tr?3>T8!m9@<&La^ї0ª1y#|aw@@ VZl W}J D}ϯWd4.TRL犠xHK\{&ë 0esԿ0rqMyf&ӽ L O+A#`}(nҶ350[6se\\m\YAZ@oI'.kofns'y]5ַ¾ WoC+}kJ7.W/L{dOas`@R➠Qw=6Vਡt /:JTHTUx=2 tyc(pݎPG1+:;Wܞ&;f8E bT!ɐK@~/+Hx16#N͝`۵`E vJQ+ /جtsDLpcIsq@))L&}pu(g?ˁ>?uoٸ29XŭF7<}/r4 Tօ?3.W4h;kv\d~ Uȥ."T`\MFs +as=‘P4&uIfNG q~(P^~$U@ ND09pS(WҤ XZ|)0Qk`o3m2sN)Ebd gN͕=WrgKKJ5laqe ᒲ=*p2;Ǟ7PTFl6V`qZŀaAZ-͠[=HA}wf>xNt*R:69foRUkwcvUC@ytҗJ} RcPn p_s.Eh?ߐCr_A=ųlB'm"Te6l Qr1.qf<"JA 52Kk B=Ԡ1X,V"+͕|zn=S @ə`|M\5Z|%4#˭=3NhoX x3a4ծ.h>6q>L`7ѳ͹2 =.+@R-&T)z{=*4a6=K}`s;ȅgjKm]͝9pm~}=J!ˆK#D!7m3{,n8cɰu14 zBmeqA/#<8~x R.D 'Et lp*PކzWQ1Fճ9 P[+Xo]E:v9 2;HyA5ksڤw!O{-_QYZPP!4_R N o!n\an!g3-`(ߣHʪ(6&<3&)mc@`JKd 1ųs!:0x&Lo( #@D7jSFy4EHyw>%>L`0!NȮn ށmpt~TajmyO R.eZs_/lSڟ?k /%w|@=(&_9Üg&WM9> ;x1V;{@i%p h'h[R^r+l [?rא1؂>ܭNES$1k* -PSd8B$N e8Xy<)j?5_vbb=awi" j>} h˅yBJڜTZsK67"0B쿼h;rfzP πeWiW2]`*nb`t:x(!'Tp#^Cmcߘ9)*uK#R03mUH})/hcHW |yOfߓ{<)̏ y^Z$x_f6g!/:Ŏ A_ӥ9Epd؇"bR(M N$Ww",w]jWj_-v]wK=Qkʕ+[^)$ߩZATDB ?u#hoȺ^t_k ץ+ʷ3zl( \7)OY5V:piwv]5ML#-, g2\uE`T=!~F~m sao eA_T}P%\>E?!ģy7z9毝@3Qw\UtU\: ;3AcbAP t(U`5~T==v^g`(\pg58) 4 ,*h J-qM΀!u$NO %r"ڬaBBêt.(̊mx?F6z#{ `oY9Py@#xCv1sBG*-?) [84ڦy;"9@FgFAH9RwR<NmXV @0!;?lp0u{rlpk sBC 1]rk|sHQFG_䊰_9 ݞQP1} 0^ȁk༢Ko[,\@,_7kJ~⊳F#9DAQZC&`bn銘 ږʙ-W$*س9aQAIAƱ p9dVx aחr Jhgiwf RЗV!ħPLE7Sʥ|?Std'+{8ůa [i3E_H.kYRl۽ga<7,;hȵgwA'# m ~]k@@Z:PFbsE9!%^YZ/L=*6ޫ*6V_3']wk]jWߕɳjW^f-.C~ꧺ7t1ȑQ_f%#~#jàۤkvҘH $5c >'x֠}8RUVЛQ_ݼ]jWm}SA`1&son!-?_FfO1p$!Q~Z-kF`WN]Kdevr?eW3dsT 4I8><6`M7BNZ!it,zTxkӑf6 RcX,XdN`֥+z(s Uw ,^\B] C'2#n#QgX o`I 0EFXaqprϛnu}\&@tu q*j#`oEF'3ocbԞ|OFDmu'6ԭѾIRB^Wfw1|e ?e}N1]]tW`{ib A1B8K6$O閁-'9j"0>smI~͟wf>dW@Z ;sy %sN'q\.} dz4W.W R7;6Ap۳|N·@J{_CϘ q_IↈǖhFlDK 0lܝ8~ |6_eUq2oCaj=+z>_ I[f*l)e漁<^*qN :UXxPvi?",.GcH@*]i(**#CvS'U ׁ@;d瑠X a}=ё m: MB$HY#4ȹŚP`9aP ?c2zG QތD2Fp}kl5&,$Q5 ?i !g%d4DB'["lS6QSʒE,}d^0w$AaNn=vo'wtW¾щÿ`s~+d`sy*";-y(h0 N\I󧡩^3NJd8̨OX6Q6dۇy]C!7 ^عkH> s\MU'JNx{[(o=%-. QC'xJX6"ȑZ? ]jWQ!]v2s˼RN!\M3CƦp]a ಐQmruګ\\Ч q4J%k@Z @VIhijjWm^[^Μ!F!J!_5>6@(J/Pax 2 [;H1??3'#)y@zbM2%_ D2ހ[#F-*cv >NDDkRhznF7{k;Qن xs9 HD Uyjg7MXXDov=6a^u-兀F V wH8=2B"H@/R>N=*$>.p8M``ovr Xe 'aV(88]8*\؝XKҔC2{8 슃!5X|ȯ>Hno8=c<,[Cvzq ؇ J MjWj6/Bg9>4zTAmosHmchѨ_6>>N}xgӝ۷](1T/{ `'PN90ܤ\)_ۂs wm% +BR6aC1up>n>>{7瞱3%Hty5 !\'hW7Sgv5BTWfT5a+`ȴܦv~]-xsAW Ja(zsl_6ŭ?[/${:*˓xG Łt"\`]dU&u7oLp%RLMX__C[d~s C;bl2~PQ%BcZ5.)SDcHh2ݙhjy"6ҫnǽ}orl o8y 2]ÎUx>O|]M}5"O=ȋNu9Ah(Q`|}`;g귍pp6m$LT$zaNFwly|ԁbBp36}#X'<hL7g@u*R7a-b b=ªn%@؂}q_OW#\e{ cW9wq3rM`[^Xd'M$3#z M)?~9kcKd,0@d =XI.>_gbtÐ'_9bFӾ HR ۗkNxR6<4",S Hu rJ$>!|@DXh^{PRR-P$d щ+=ʇl9uaLOa\ FAz$@vv]z#*R]wI|뭷vWJ;5!@mla!܄TX=X!UjotG)pӁxU8tp0Wq#B9hz9tBy/!\ѭ]jWߣBpto7R̈́5F*ςC 5cۅؒۤQQ>)r F6Sоa̡~?9!? mF@Ũη+rتgI# e9h;h-v&Vni ͌r . Fs 94c&E7orjP8\lO*ze@9I[y"1[D>[e;}(ns-z d|x!Ke3C!{U[B `c IDAT z& \Jx 0<& + Egn{XKB( |A (ዃ  !Y Cq80/ean}9{]ڧvzI~RNw>Z  Lπ}&|X񦱋o;XLTa64I mkjeʴ3Q9X{ 7P¼@@@RH8*=mQ7n焉֕Rti)˕YG]ז"|":h6Qj(h︭NA֑ H{8omA4ػ uqi j,>ĊJˮR7wB7Ku!FWn'JP(o9*u ܾissVA{>&xk {>65C\VNƟ/tm*A՟%XIfLD9P;THDwHOgӇ a؈1 xܝ~y\1^#${~"N'c-T@CK+uJWoIHuELKzBjQ5iwr#_Stmy*7gJ8f8 vR\Aj>Yh W22ª,%x*vj8ĿYy#p> =2٫}P?&8w%~ F!'apј2E6 KLe`Rg9:8^HpvgBQK7:J1^үYPNCRVs! !@+\乨'dx_4 oB"7&OLL;{R3 d8] أw}!>sn,*d0dY_!q cQzI>LW"HyϡҘD} {Hf '9w*d(TX<_aܐ/OBq6GY֋Ju/@)8|z Q[J۾7k>#JK}?`"g 4$³d%W IC)ÉD,EhW&ڑiԝB~Wծvn޼kg[]%"'gWkxzC& Pv'#Kcm/7{}&_]Vy4@BX<5X5閠g,祿+gw7oW?J),K0 fIn aʒp!xAH_ [\GG)HRaG~,$2۸V z.1Lh 75z;h,#emXC5+.ar+λ>Uv WBO-ԯ_yϷ%آbA]i [i©e:: dx!8!W6yE Ϯ& 7nqhCq[QW T7e{z\+T h@f^PH@͞*X=.GgjE n>-mM$%'t, b zf*26{osC0|b?4L@/U7Xnoh.fo^;|b3w D{>APooHj @`3#͋nǕ[1Ww}COT3V2lŷfMyx!RІBՆP>f3Pvׇ[N0€nE[<{R@(Y@-^N{n|,?ʠu燘)u}';o@>2b*GWW~C홵Oy^nə)Aue݆VWs9=lBDuʳ.|~b?t˴E@ HN<%i~ӁB aX# BI4> ZboV%Ss<:v K@ZӪNY ׎ҋYgs帒;X';@ Vn\ #4ġP FD30@zf䫙f} Y=0mz 'R6PnfL`l@q=}L~zCrbp 1PGlȺ?dR p~@6|}Cq g8D<tIJ G":1N-%f2avnHYgPeb_2>2a% |!8x2#ɮ/0s Vc =F(ծv]0C:]jWt[k/<6$j 7iY3zO_كwE\]-Ldxv%S`33 ȓwi  i ؐ {'5sӽޔ,S6EE*Ek tib!5hJ%=[aݲ{8HjBX2f&lpoqHeda>v",{LP/ihw#ȾPӆd(juhLTlpX`\ .XDh[alpk^n?? %5$V" d XH`x׈u>E lA3b~w4$ A#F 58<^ k@%B zhyHEM-M{}skڍkK+^)>fdcهf2+f![w̨?LP{ԏ't̢k?0At!P:`60-%z8²R<3|.O[!\,5UXIF/ UVZ iWK#r}g` (`pG00_6Y؜2~ܰ@o?O,&u_26X+ 3q`#!0kqއ؋~k@9:a@Љgdu0:^> {ĉ䱓s t?gk,Y$X}{w7j ݲ#Zt "{ώ *?fp"{XI'΀;, w{RТfUGP&w`)֘pfk]Kw\Iّt֌ߧJ~RӺd@t,o8 ?zWu`y~ _xJ*cV ab}ͣ)0~gن͘bBh׊? 6TfJXPnAjC a)jţGAi Hb wՇLP`>ݽK"c;a:!c*i0Kt҆V#0? %ڿ",ҙqo}ծv]1kdȉu;([eKއ]jW}a]T((y3=v(Mхf:h" 2<.|37ڂ9e  F;-D %|AJ{Y ۘ o"jWՇ6SB>n B"}1 Y"3" ́RnC8`,u%=yH%0O{Q><8毭E\6&pb^'VL5،C<݆"i s$7{ Pē5VR9nۖ U>'9ݛ8A=89S7\jUBYƀf~? m-g m]9QVvtGΌa@\B|vfpte{GVTw)F "{8ע}9yvi&b;FJ"+ c5XC(p]*,6{IPfgHɭ_NN:;,iX-_b P ljI),d&G&'# F3%\h}1"dH|qou%(a-0? v"i0R"4 3͎Lw*o5ʽc? ڇ@ML!rc<,p) ?у5q`bCtI|36=:攒N%`zPrZ ܾDRpL}9&]_as̏TsC/nI5Cfs"?(4 !{z`3V4焴ʄ__8cNc&Pm;vp>{G4h}݇Fhv7NsizI5{~k}ޘw]jWk ZcTڏ?[x1ݠծ>W^ꧾ(n@f"ˆ2|+VnfmX:4þdH;XB`pTꂹx2}=/k0i?ؓv!O{]C+ {2ԁHi=֛ pArC~GZD+{C-8(+Q0JL{ *N)~ez0{i k8 /,V׼Aĺ#_H̯4D- .0nt9|>vw|ROA8#CEA#cnAHQJl0 {%!'Jw@Wm턷*9(oBR< 6'S>B2uYȖI>C'QPT#R~]܃Y6bH &p %8i1h[A0q,lYs6] j,L22WIQoVzF&`Q!1 wg LRfqA.&a I)9K+'5|kQam,/.Ʌ86hMrSJ>zΐK@3:hȺJD)[]Шh\ӂf]:€iȽD@'d5f_ >hIZFQh-sF;Iwxj^n@q0Z#x.qr4ZuE-3A"W\#9. }nE7dsNJj|匳`NHp{hǛ{$?w"6x7Eͷ}C|-ݺ+9q(`_ 6)n&Cq^o4%WgN6ƪ[tCW7SW?o‘;oW|'jy!-*j IDAT)\:xKm$ d9 y=r߷J#GaeT]@"ÑX?8vj3zd`aC6#zXfk'-#mp[@#}F;[ݧJ6hQS&$w[3K L-0\:E8 d(G3m+G O)< J{Kծv]Ps}R@Ā ]}lՓ]ƞ}5})yA"qv_[F~WDs?rg >s_n)a\- `u}1Sn mk|2}u@jk绳ۆ2+7gԿI~\I F U0kP g2sPi0!RuT$*ImxEJiͥt0F8{`v:T`ÅToGl'yy '&LCu" 4Zn,5b[w@9<`lha;nfD&NE_^~DG&(h WqɈv@ P~ai#_Y辝ie$[Z~Ny/c?.nN5p9Y@DوO >;{RMHy1B ݗ#<5ѻ+b" i FUh_BYY3e`0:$YжR}Ep//uRe/Y6ߘaJ%O!OpfqchL^wXܶus‰|$"y17F Ƽh)a"Tk4]>,g~Uã/ Y9k `׸uƖpd M!̜s56gg`Icj s+O)m%DꘝL(jPw|OA`f` wks74ʖL`AhȳWHNЯqb8,w9 LI¬%ɾ$+l*HVbIK@, .p!GJ YKճޯ4\6B'~-bo՚+Fhe=G2=j |o)%Hj6pQkd,?Vg*o4a`ww#UޯL45*T}=j] vn>Zh hN^Th!G' Cf8*KU#~c(y2\XvtwXIMD LOKvBD^w]jWܛ~?VV~׫[k;]#EO~ ue\"p Җ{Pׅr{B2g¨( Waz:pY" >*2Y'$UOAZ !" ʛjW2I㨜*LtE YRSd Q_n-Je;mG~-zf\S#CYPDd(d8TXa{j!30"4HK51 'Ƿ7yMao&?`  ]"[5ZMAG.7fڈO% x TojQ%x?`p0~%ն `16 α6s J5 DXcXe733' `ou iQ_3g^LOmiW *WɴVicUSn(WC Һ1W Zx4V W2q+ |YNAod :c uЗ ;>uBB!؍{ 013e%tmq[exUzw%xit;瓁wH7(rbpAUb8@~z0Fd y WW%n LHDt )V](EM\ 酃2gV!,z28hZqg;GwF6QMDW'lNsN*0ۇW%w%:>Jj/<2c5XbGC !~D.݆x$fCP(g 3%2*^%Ʋ $'Xk' b%ok%)픏+rGEr"ԧStȧ &WH7W ~nBz6Jv@㊖AF}̹9<&F0 ~62t% ڟjk~#x4RwH pJZDPZug2=2ϻ~Nj~t|!!L@f-TԞv.*y#9x8]Q6zo|T׉j @̉(nٞp[r$`щVmJ#_sz>98Qd5?]^=!҆!4hU{X, z@+nǀdHXVy4=By9'F!l3,OG'GD=cw3qZ`suWA} ;d{,)x4_RwxOU!;l8P`p(,[7ݿA>iSj5`^AmTq.XSC95Htdy 8.B-\LMV0Kߎğ_n,(AzVӣw#cg>`#7^pBeAL7fD< C:a7+"PXcJ$%}gdB3M d {SL±PD' {Du{z 9Ϲ'a/gf[d dv Gt5I7c7!J zdqo?\,6"4 ɠ;hB{<6 n1%nD2JWv-Xk NGEz B WݱAkQfz+;@}\6>=k|cb-K;o}ν7朣2wU\ee HV`!pBBB j$R~i  < 6ЈnFj\PʙSddFDps߰keWFЙJg 7A~j4vH<'&5|qfZ ^\3J>]=6W=K9])F_%Z:Hj+?-1V9pgMܸQBF5R~SN%n"u^?Ĝ33Bㇸ$e'̧-cqDnHg'F̑}ϊVOF$ <ݟ]=2jWծݵwv iOm1Fh{ ț1ƷYko_;%2`WӘ??X`,27j/yfTQ#(*x l9%ِiv<xV#uVm;) ˑ0(v]*A#%>/$JX-L;`dXzk / ߂G(FIg#n%ITQZs ݠj{ 9zԒ` errp۾Z|JG.P: ut-Pcf(yr,qЬ EЛ\*<}7nn[s~|)Tt=>'^lAjiSÛ吀"pˠ='JW R#0FۦWB?㻞BuGkgq۟vunh:OCvh@2K۰܂ яpf.=Tߎ ;N$ Ma% ? nst,Y@(hMm3=Ua{ϹZf%%\I|ɭ!ySEsnTB3`rƵF ~>ljnBD3V/>vMّz9Ad ODX7qsA!gP$UG+#i7f4*@Ss ]+,"pSkD1qroŊHqf9{!Hs\BfM}3c+* N@(iVfHwzf5IR -oUo?"݄6QbO <9zls-3pmF8˗R"j N Z`A#߅⾻L OE4%i f B$U̠@hiBYRݗ9yA{#|zM`-џ[S@?-c X\43Psĩ *A]BHwjD̷gAdfp9"{w  kuXOB؝h;Gb6B2¯9]dxIA!v˗`S׊*fPnnnY!VqF{{ 脰;jp 'f 37M?/=;-CEڇ #E৕LǷ"E:Jˊ;AGZl 2YGS5 }0q*j"$#]u\o8("VoOH_IXسCi<+xA_;DŽ7Kxp S0{7 :_KQ|mGsRdF>HsG3b<;Xlj;o@76-nY6.۪G }!G2t>Dx29hz̈́}ȭ9ٜ+\h- kfT#d'?0G !, Q k-1uIO ~ʰjDtG& `o&—П^RĖrxvF=%sOώJ9l UVJ~l]C/ +~ծv]}i}G)=@^kSŷw f&.?~WzZ w+Θ ѓLjJNtd` 16WG: ݉}#H ŎC >(]j]˶v[ah8@ LScYZs? 81޸UB}5&C]]yu\b T%=]FJ<7w\e/Wd=bL`4Gr+ 0f硗bŀ!!{W ]^ls[D> tUBVaY|:SM4*+BU/9UOMVXC Z~P 0g@́k{6C>@#z.F /5P!}RJH6M#')zwB9t %0s/; 8\!42p` /O*H/WٕJ h1 p4BLWz8Eq[7}ȼ3h$'Fu\znH auي Y{zGz4QFmSbn6 \Os;@+JBsw7~zoD98?q*4 f e 0-B+pN:N汏@{e%+JwH>MO%lcdZdSVb IDATr#ҧ{LJVB5%nC#haðQ,F&ȹ}oܑ421̉ZJTrS *=[os=@5%h AאQ=`"zR' <LA!Z`=`6*3Fw\fe1ܚCX[GRS|hi|mL_£enfl㤵OFX{](.2xv N~aֶo&w]jWş3$@_o oq}bA׿{mk;(-6;`L|@ \L8G: L7*+ ,rz]r@(Ɯݲ~N yI< 4l^=r~%B/uwV\u*Q7[<LQoOksodp w\JSC$CGcڐh)#F>kͮd7?o7s]&6#Xtgaȉ髕1Bj'}$ynRf(FM=8S+{i7ʱa!{Ռ3pEJ{>2ም_u[}=bt h{>LHu ?8sy 6 M,|!w==#eDS ŭiYj$%HկGu%L'5[=3]jWծMԶy~}_gyp?3yb+=uV82ס1R ;U>Ա+ٟ"ÑDșgο|{x9ryFDv˹CE~HҸ[v]c- r\DO3eQil=߿*aڭ}-z&h fvݚ 9iճ,0zAÇ:{;̈́9_ 8.@ܡH`:ȿ5y˯ٺ7 =mX o@q(F0I*~/M3R_*Z^?N=+ g~[Z}Dmj@i~CxCՋ ?}dV```r`AsLz4k0l)B,EV7 l|Y^7u?1By}܊oWgRfV,z\e(1L' JF$>vkL<$ UzGCktόw ;ӯPL[E}؇07ffvaܠ;  FHgҌ!E,# HR9aoM{>W]b=_dtv~kCB쁾؟ Q-HkYnfC TG䢐;hz{ 4m}]hg/t?D F1'DJ˙H¶#gfӌm 9m1!{@6sElpv=O5̲ HRDĎ !$gzdЂQO:S@^ծv]}[;23̌ksWǷyjWңP&Ϙ I!ϛO)m *Uc.*,a fprކnAޯnKCW: .yjW;f k/b}^ OgH́mr0?$\YIoo DitǶ5>,]8(iF7%(m=۷5:"ǡYD,2l+o`6ϡ?4f"W!πSaFbq^-Ϲ2MtRآ+64v4a=(q=JdO/@g+FGUhH/wHD~&o'o^ l~0Ȱa25<(Thv ~x7뵸oB d4,C$+7~k`nWYrI5x|~ˆFC_͌+{ c<%5>O:/:}B]|w\]X\^`؉ވ7,@ n6'\K 'Bh3)Dl bM](aژ`1T ?` x%YD4Alp9V_08Zvz$(pϬ B4GK@ܛ +38Y6Cw:P7dO>i{ Nb^7= t[ːծv]jWMmq;~'~€'vWbW>YO D'1ëchX.2͊ؤ> !%U*P;."eDiW;ח%ږ@cЃ^$Xw[BO(3 i֚rw:`ήLc7 ՎdGya ٴ ۇ"zr|D/5/%XJ895 tc#h@g׷>?^LSYXrY|o\1:\) ~"`rpZGYO6u]pPds/a5Ѐ)N&<$ ƆtGv@#,wVaW؛},5j1MHDHS:T"ZD#UV% HԔգ̔{a2İ c w3@ƴN9m2|сqt`zr~/[PO>pD`! N%s<@< H(m9$z= 4(9h&ZB"UC\xk3)P 'EȐ=ԔFL`k%Z{B=43m&)V@7AaD֬!wSΓM@8!&I5Aeˊe4xΪ sY*`D3c+7A? {I}Jk@==w/J{k=¡bكs夊0 N2,B@ MsW cugY]jWշ㷕sfL]~~֑m3uC^hkpu۰͌**O(0gF0QW O oؐ{t8ιM[J ,H%Fw i/xw ͼM\ߵKQ a\PVliamBQ8~>ŇUePO<7 ˌˣX{o+(Ǿ# {QSz9ߺVtJ4S,z9/DRgYMA3DqrGa̒#^ m=#H|3_ƶ^φ? gЙn@*{rNDPEi$5ț:>1#Sb`:5%@P//Mp Dd|AD_)eRnC:f#Qm"SWW(НdG*pd fLODZ;95բKGN2LÖL\*!)2ٯÄJ:0%8) G6L~,ݠ& J8Tmpc;fiD >  ~jH, ] 4N GXR |s"."bFNyDP2 k%#Y)N X$YgUk1;Qgm8N > Kf(n$r焓xF2A>eBIN* 5 mJoBc&c~ Q FmGh B #ndB7MVH" GP;>ֱё4߰Jm泒ʹkP6e3ؖTKdxgz|x*β~WծvZ^[jWGz6oM>+빑  $"\9Q@ z5["TB*DkByβ~W;WuHM,΋44Xbӽ?C%yz 8( yghBh l?DO͍7Ue:n+FW_~:67u~f;nW+E+2O.O)|e`[N \t׆2㷄if `dKqF&JHn_Hr- 0qB\6ɶ3 ;L0}~_LtoIh6x=^T`4g,e w! tZ0uw6AQչ& Rj0|ۻ# x""36V y*P$S$ y;)0@ds@z--=PԭiBPL~Aј#1m:? IDATiԶ {9y2DA;J^QF2p ].E`x%~_rJ@,bkmę\H5>'sߟwJ}>s8pShkfwW}S-Aϓ؛-a ꛫ,]wM` ju3W}D=w37)۹ʙ^ԯ'|[ llkz.gN!>Rď/dQ`ibt-}ס> ԝSL5fkyU> |7P9$7O:BNzHs"QPRo tɣ& XQЅBvz 4t]s&y4H8bm;GA~OVtϨIoo"ݟ$'G$Q:Nf b>_#sZ8P(X]jWT"Bzծ>O!U\4@wT](r8DP ܁pH=Dk]HghynWܩ? "!$:>UjW7۷oрv>zBB$4wV\cV&y&S2ѽ7K8͍Y )s?հr,u fj$vB#$HρK4L05ܑބջCp7)p~A>܁vLwhizw B'$s -X6dyCxI 0-w` @]a]7;ˤ@$,ZO?I |2t.^3a'n&&'с[ |l LO|z^?<3vL{| 0u!0UĔ)QLA-T1"/pe?nɆC Vc~y0F >r\x 3x0/ KO 9M@pMC[^ZfWBsFH !bxsuh>:@f}ZsO !wd -jDi!l;$**|/5ĐkWFqP/l[e7C8n<[!I@vhWVAP:oGzܛߣ᷽]Zr~I4ᶽSuBu<"p*=Ce%@wG Ey@z ޻Xdyߊ9YTf9á83aðiA @@0 z0`ll 0i[Ѓ% [eBmQ.CRen sV=Jo] y#ĿB+IG;QaЗĀW}M PehbR+hU(I(0QA3š #cX$sfÃ< FPDTɼ G5/)<*]mA(:>S4HmtvE)w3:YЕ?? JoA"}Gh<h79O(k\(Hy$#}]o;tHf` v^cD/x R+X=_K`ٝ-PB~Ҭ)m^klgoBZ]KP`EW9!r'uFanmg%mkEf (BF ȩkB(ʣm4qĒ3f̸+O~rgy/`{/3f̘q~>y1V=!^ep;zG A?Q&J"Q]К,gF+/13fx~mZ1 W!:}#&t]滻ژ`XSbFLslԨ HwnN r mޕR)(>coWU'f[7mDaN xaj{}߽új밪P#^Pe'0&M?,w*%t.=!E+~ܵ?D]{juޏ0++$,@EJ5 ȸLȲTbѲfTH@jb(?73}_L}/F$Vk6= <!+Ev30'rnTm $ @ɈLNhmς^" p+FG倨&Qa IIoII2V`eWexsZSkm@FoBzۓbtM$ 4ֆ>]a?&4Q#JFg{{= SeDܪ*#FA.YB1V>q<֣VNa 9<7BqGFSCH@S"&w kD8s-JK+e9@*v T\)onH Bݙ.s tps".&B;[H3T^X2ʼnR~J:`ãKW[!Ec2q?//.DJG CK  VMc3vş+:i}KD&"P=&' +uȏ. 7ph]o-J$xɝFa5",a5IL$r3#T(}LJx (b#>?Wf"fZ)}f̘=afX c7}"Cw:x215u#cҠJoS[iJ$cK7g*ٓp~J_>WY50l!{j?'dn{n^ͱYW[D DzD*S$MNyn.ٕIa !}mnPzHN`L6 ?L ˺͡29ijRPN03AnM8 n-= H*HEw3iY\"qj$ nQnH)yqy:cӌ3;̟LF?gpC'MmM<7;Q Q+pWpu4A V<{{W૕Rw%n UN/:H~Ut _CO`Z)JL ٵ['QKzekO-KF!,Tw!~sZ(]\J: G% &m9=n?l_lz\. aKh &Eq@&twZ Ȓƹ7w2CD>wXLȗ/@%dӽVu'?q C2/cb~vuP^?O@ɯP\2f f'7#wW ![nu jR\ÞwՇPYKlJF4:,]&,AlB%J\ngf^#4F0VG ey ` #=FOSZĂaCV'# XA,=Lu5g(BE b ۺDzI`)h>W6k@zAm꙽ P_ȣS"m)bn 7#i5^4(I3DOҝ@ žsB|L) ^Z{B >.kWVO!0C> fOb?ntְ)Ja|-2UW7ȡ5ߨ/U]` Ǒ6E| Ĉ@+FwH07 ?os#zƹljpof޷ Q $퉈ٷ *V+S9jHMaa>Y1cƌw>>, >Θ1cffjlšTmJ˨/,ݧz7@FBۃsK -)Nke/rt ЕXkVþL"W-}_xQRzR,"%t'i"g;ao` ]u7cYljAR%ڏ^`w@·8xvAP^ĺ@oZ[?t %%L%T'!l@BBV5!{T:J_?mb_0ڔ`ŭi1;EV]Zjmo}@Es >/^}/RׯtLϘ1cƌԧv̽D,?3f̸}nGxEJD < sJ,H:}P]eвT9'+ !uq3fxI)1 Pi n)Pkp/ o$-n)"`tyg9. R{0;v4\qK;/p=bH0bnJ ί45k/$wiO=6y~5X< \ Cll[TAb[n\I0SE6;=>; _#+ }FȋA&+CD_[ax)1Cl7`Ӑd8M԰Adۖ*$N~«nQ/"h X0EE# VCFØyE9}ұ8܃",$L(<}-jY8D+-ն :O6$/bAQ! y6ř3d &(}Yo K/6{sRpDQ׽i~ | 1ǖ*YwL$nO@'E^PojwXMwB v vѰ%%hHno \~.Po+z˧hI`}Y)#!cK_pCS!o|$GS|(wa,DtP#Gf"mߟqw#KtRGJȓ@sJ dPҡVGM[ORD z"b;'Q咂fIۏ~Y R-CK i1CQG4Q}r_InBC6?׏b% ǡgo2Y`bUkD1cƌwJ)!IqFJxB~V]Θ1x໺Q`Sbԅ+BxȈE8%!@k)Vn V%9H!j;"^U9OΝ7cƌg}R !F"(z2-m !rG #=X*Dum"`2\Lˇx7=GY.`JHhUAfIK+>? nW[q}Yx@LeS<1ifpݒbMP'}@/wcqW&=4:a:2DK]%u3"~Sxn8 <#ҟiNY؂Q B U#paAk tr %G@ CwR y9ڂ;T#E`uJ03Z1ÉAt>!H>,Aĭ/Mq20r!<ѯLX\^vLʰ`3w2Ox z'HD N;:ϭ2I7З^{Zg%AĐ7Jk{nWJq 6"ܼys3f|GK]XSJJPU4[U&|(iߚű{)BtZ23X_;FFQE)%"DrӰ@z>w7NiL5r5=!dLAnB\)) e<™ ߎ#~¼2'HMw 0.D5AE%"[ӽ{w"CN'Kb_ap u`XF_Jv5wo{Lw(`ƀދ aԄw/$e[88<&.>z6RRmBP-&f}+, " |M f/P ;ǀJt5-N(n˾)0[$/:d+& qmAu!Y<<3du qsu@SSYLW>tmal(9۔ JoK6[۸iI#Qx1*:D#BB>6S@[MٝǶS@jU=Y"x +QAN,>,G=STg j?J.Gv ng t JWXsu{;<.br7 r+|oՇ1IA_>˿{ q]b̴w~} GuDJh$鐒^!#Uhk8_ uO[xЀm3Px~M2Zfj2]@5~M#7HtI[WD L,B(E*Eۍ In/uDC@jX j{=g3f̸+0{ò>H3_cl3f̸gvsv+~xRzBp%A>^Nt6R;Q ~|lSJWf̘SOafDOE8$ƏC.I;Fs[G([}5rᕁmx}`puB)pPѡeşXt:=WG#hqoC[_hnj%w%S9'fAD@>=nMl tmkҹ̐W= Јꏣ X=ކ-:#bnhvs)~oG Jy"a@ǒ(>XEIZ@^Wq`%#&? %@``0l\2 (ǀNx5+钿9Y@V'#}R. g)N;bah/ ;g'.ؾ [jSK{B4L؋"Qr脾. 5F o.p&,+ \o _ G6LF!]P Qf}OÇ^+ݡGqfA]FE9O=C]e l K@ 22$BGDfd;~"#' ;נ2_Rѷ G<,ovnKnNV 6f"p T&"UVy:D Z !H.^3;KyQ&"0I[} ,J؈UT 3f̘q߉g8ֺ#y3f̘q/ HyuEY4KߕN]A+HnVy-xZF)jk8m.xY7۷of̘|{Ћ/sX1:P6?+VGq˝}|a8Z+ 18ڱ˞QLO Ln0/Tn~1w`Gd g3O‰+n=O$WHROy\`mm(r B\BkWʇa] 5Q[+ %Y9$RY<TJ[+ ?A_( f*NSmP&*ąhڈ[n d0NLS/{7֬7ЯH: JaJ618bwkR1(JMNSmۑ\KϮȯ۠tXPL׌@ cxG*e:\>j!6ØTR}oc9tS$x.9;j) ƝKôۛf ZqG&:Ҝ$7=ܪ0A@U!` Tg˞+Q` LXvDN(L`uj}5/+ИG< \ ͉{jRϵ?K?cz]XۊjK=PQA?ѥH]ZHb``\ Б`e~ a/)1'>-'b;(ZZ3%ë'iQDX}Hpnz'+Ӿ2=F?1X@*ݡ1UxC(kug;]wE|J Ԙ8  a'B>hAEi[t7H1&J%.x>ͼCֈ4 W&\3t?>Ğ覣3bؔ"X 3@L_a$؞ @3qRjad u1tDkM ) $  A7TsgJ3f̘1?{&?~whJ/}K 1c=__ܑ]A!Y_'({ !`W7PH((A͑x+&DY:B!]͌˿;pƌ߆{n7M4 Wa}66:Xs4WatV@2džRcptqg,'BR(C!v@^OC]%>VVdԬ0n(|mp73d-(2ysGw<30tqiH,tuGATm j#H(".%27`OeMq+of'~J\)I kZ2ͤ{=V?a ֡2q9TVfHD'pO\;xPL&L !G-C{ Ƃ+I|&L$ƠT9 & E ^H7'>p;kFB0aT )BZ3B!(hV\&s=Y=Xx{ۢU&@gJ>=Kl}bldDC4ZRCKh-wGĽ@p<㹀 A:kW2KА]uWp )e ]ढǠ[a%jGQa|6 'EJ¤=ʸRW xWjBnCङxI?cN3@W6yT7 -ʩ*JfgcF"gGJndPnZtJinK0t6^GԄjDa7]%l z>A2ba"Oek `X(z3z¸^ ޟu>tLr<E'`:L}q=髠DJ]f,#L XT>MO^V] CT ?l) έe\Om/#OJ)p6"vAte m (X+*b멊;ablfesiRwb9n;"3f̘1CuGP ؒ<[3fK۬cσہPuJT+ xmS c\w<~ 3fܛ?w]raG'r`ۭj S=[VklSrt[{v(v[\#tf.ϕKaf>]QH1%J))ȕ!hn:4qeD`ohmmg*]sΎe e+H!>Hu =]. ݶB͊,< r'ͯRE@'(;{}Ub@ˁBO\$~A"JUonroz6{YC h"lTɜT{ۣ*P&j! 53:9/g@2RcId>-Q1 'rXJnQ,}>"E-B.ǂEܮ_ۦ3w{NwspI Hǣ2|^KBBz&X@yg{Mna 0Y& ; ȣR !<19W ¦='4^4O+` *u.6T* E4Etk(:+ `9(Xj*ب;Yvq%a' 屉rE @qN$o'}ǜ5W@0eW\O ]L6OQyA>)z a1D|Ğb0v7+X@~PF.DDЃ hP̓ELܕn2ī15kgЯ}+ cCc6ht  P->cƌ3>4P[krƌw<;;JJ20 e(LłpX:y5~C2\3+߮nٚHt e:xq_;oƌo7񍏆:3@gU 5 z{#%CƠT:}&"AoUS"X+k*"qÙSw*L/K'S~x2ѝ娅! ߭z#=@W"z%0 =d(A-nEXj;h}NyQjp$Mw-=+u{<,A`8pvoZ1$ -û[ u .6(eQm<=LQwg$CO1=8e3cb-ˮo9Z{s+nRlޯdɎd1@` C 8<-A%~3A H $NdRu$Fm"&ٷ^s1TR]յ:}^s1kxĜ/(2nJHٛUBklo\ِh{;Wfp' nu=7y6EZZī7rqf`@Z5R׌zM|ۄW}D Aԋ:@h1Vv ѽH%ctQ5$hoڦkL,@S4 ѽY+2KN=.@N8>?Tx1* 2 +Ɨg$ښ,\Øv)R<ޣ#c F 1&i\[?3֙78ls]{eoRE>¾%Xs듟}{:] 8v 5kP =9;eb2)b+=p>,~m?>"|7[q:pscg5YZ; `c ~GSґ#b=D+_,3~f̘1cƌ!瑻sFD_yg̘@g~gv?۠TJLYPDCzHi"$#6_^b9WVɡ!WU̓7c'~ǽ61>O L'uN.+#`xvBn52S; 'B+/@.?NM:$Dzi7qe(#3el#  l*!NZ&!c T#ؙ+D59?\&^SPVޞVkDw) 48t`$ID.gA_zMo'x5Ƶ.G~E[`/B:@XG okB6z#9HElE. iW k̻DO&ӎ|xJO_St ##ɖOG_d bink!iGEH6H$S$G2<c0͟=9'.;aT~\ʝ/V_$lПxV&@ ]W9TJ>8%a^M,o,b8;|S,^K q ԡ6&ƧqsI?S }J}8A'0F\%d'A;o8cƌ3f#g?0~#D)eg]74X IDATߜ'39Wi*juVPY=ӽGAL7HI#%mTTQ Cd7|nu>j_1c99(/ MmGZH#p(`88][egq&y̌z{#3Lnv(~_MB}~澋x_[8H?@: .(tB~X6 Jy מ p@*~TcP:eQcC[ΰc2d5 amxTIP/ |hR~yg@~(6ָM.ϹQI,`/נy'> _ꑏ\歋ţa%!jaW?54 {P. }x${];PuB}lCW(wͺk!KX3Xo4>ZA8+Pگro ĭ5rɤu_f:h] T 5\^Z, r__~jAWcΤ P]\vBhfy7gG.C]>jp4`xR>c8x;v3f̘1cƽrHX+@dZ͓y̘1g>qܩS 8aZkR2GF~N֊@I!w0D7Hgll&*{爑3lG~?ɋz"j[|~wǝOΝFfN1o4uS&M\z/NK+E@X=Ss2p ^k C6Rn@gtrKF /v, O׬c~R!]6_,)-/@` n[Ʃ]-'o>P8y̘1O>#৚?w}^ qܧ=AH\"| <{zy$MD :jT$b-Rhd3jGUfFPpmָA^G*aPb# *m#Um3*Sb^RnՈ

    |,], j,Hlѯ`)@w$xّScȇieP_$,L~6ؚf'v*r9gҥ~gn)TE`?5n:K EE>"[|?{ʨ虂-S0t91<83gojA,ȷw#? p0R. >2 BDm)ahBSX?H I24sfw <A8 7G~cv_ȱ9r燐fhsZؼ\ NkrnOMq3O 𬢏Ѵu{$!L: 1>?rW|ƌ3f3tR,NH7y̘1)lP/$'XB}9G:jA,S( ' 8cقAasJۉw1cFïswP3 ve'\N=`CnhN/ϝ-ē JP3|o-/ ԁoFdUiڌ8#'H;izmOJz4IlI[[eP;A-9YGv+ /IA]LFrɌR 2#h9{#㒡Yвnߎ ee ntu!_z"}9P6\} !7::orXc (aT-֏y\O]~!Nb,??w뚸tЍ79̇;UqJWYO0ݫFaI[`l0 Q@68H#,mK %*n:Ř" E{^KXg`s@πwd# 5٦ww?^#z` t%h!}(aHr0^*p"O$L=E J0\GD#MM[ixh^uHUy`")#ح*όd0/}epҽQDkE=XԷ|}[QӺ'G|{`?]>E͢(gOpYbɮuN. 5`($Ft7|,hvccn=9j QI\b|!/YU Dvx[K2 ,*,ms&euZwSYtgO>SY%n='ң~ġC$ȏA>%7jRpҙC`Y@xAg1GG::\GO.סp<(2"$Ģ |$7 8 ʆ=|xݚ!Gևn#a@WBg,^:kDM@ a2Ӌw}]9 .6cF\`PYGJ)YJ4 0=&E)(`D1DRfTf3cƌ3?' BHyƌ~~nGdMuI^=hO@ݎ vbUʷ~yfx@q _"xC4aa"跿6)tJꅚвZ*wh zNNrMY#@ui[<}oq2dUAc!zs>l-c k(6!LZn)Pw9>jF앓/y0 rձ?ݑWB??o\'_^!MȨmD=jV42m2=ؙ9_T>cFECXBU O $t9HWbPmCim&`1&]euklWpvz .yHA8ʖR : Iن %kϮ߅q{%f'kNN\5(l1bQמݫ/h$Wz xGRY1W<7UWoQ֩7z%7]I=n ;!tjm#4'd)O'e*ڱM{(ҝszxW聾ή &=|wʑ=02nUj#~ˮFU8(J=[RxSDQ#SI91q^vۍ]˾E}"ne;}kS%w+LwɥS},D$@r<ﯧ6':'fP2DN~ PV SE/f蒴Z?A{ɾi0DLv9G})=8nQ-oF "') g~GjV C =8q6>c$ϦobfpAdLN$ڜtE[#lDDa}/uo1L2_c0cƌ3f3x׻@y"`3f }ӟNکF5i=Y_\I|csfxpcf;Ǐ7v{UāzzԻhq5_F8rjC]TTD@ +fُqg{a y #Z(o_']Z#ٚ%HS ['LW sSwdOkjDqn#txx)Uv +W KszԴkR7* c=&hv/qO$|޴1DC 8 A\Gு%qlz#ɬZ[ T8lSc>h ]%*;H=6/AvvyΝ並f@&dtJ`UrDOX}q e"4VTE%n $G5j͎Lƭ]4o582|Kqg;]c&FrŚJn $!D=>#'*Fa(S|iAtlNk))ȷVLU9o*Q;?dRv =B!i9KR=?)=u8t ρNijj[5O;\k[ե7/AGBuq^$F(09=y)q&qۉxUς}KP3Pg2аiأmx_Br&1 䂍PRɷr؞c1/ykLė.B]a4m0|/${zSiK P6.*y3 !t\f!DxHڽSM.HPKh{ jqdȞ)lk_EV`m5% R"c^`aӾrqŗ`z.e" gQpA4&wQvQ %G@.hh "Kn#zȱ2. tJ K"iqo>Sc5(91uL!-BuO>ʃWE HGf rm0^Ur`-#T#LowdCKS^ikKa0i$D}+[#I.0:ŒDjS_FӐ}3֜lrD|؋. ==<zК0;ŽIϯ;#ϗ`ƌ3fK>@dON~I1c//u8j KajgTD~/ oV^Dygxp{!t-TlSt4r=ekjVpCAtxZb]LOm"nWPE.ZS| q;O}L?md:?%|XC>IK# z1fp'DnHE=yz=]H6*+ÈL0k> Z:ʷ*$+c`qA j]?wX*Xtu(ǠMw!ፌP&+q'^㺷b;8`NaRO0 IDATkF;fH8&er]S pm :ޛ={|5,bRk ^.eɖt U~Xgd<-&8,^o&^󮶜5 bXn, neZ}hBm | 4e}MOBCw:͵ 3{H+ 2pgfh:ˉL{𦨏kVW lHt? 3* [x9o)špN/ ~߽$EE@;L}[(N-nM }NU?;$:JH#+"лsv h˄70E G,jm"1!+cKC׎ K) a1ݿƬ1cƌyuN݃g?Ѓ3fx ֌R|˩UQ3Eso%ܝ__8>H56gH;{Ï | MP%+'ag!vr$h0555<UStu&P*J<|CUwl}I+eQK"#?WKH_{x~5>x# dyZlcx &_7MU(X=V Sf0Y;<ph#B%^A?RɄ?!!l8۝<;U{Bw{>]j;!u) /(_ 6j8 뵀rg7GIm$0*H@DA(#bT 2 j،OcrձR(Wƈ*h,A19[ ًujG\ YǃNFS gEvLYܰ&8zH-6qtT& ^-PF"*h6&_GƊobs-";y9qޮbYsnM]B)/Еvv 5}1uC.%c GҬ=;5Hͪ}ܼ@S 56pq ewgF3F8 Ϗ*3 ? 3USĩ Dԋ-K?OsBBS%OUOW'Y9,u!ZmHvM Z,#]3cm MPJV .@ Ǚ藤H }A8UxMEҬ:2KK3~\w`Q9;r?5 Po*Ek#ۘ"y"Bʊ?G tc} 7"J$c83wb(Fѱ=fj>9/z!aqi;?]WEGr(:׬+ш=S?bKHO''C+4uzAz-7w  t:wx)BA0q's'15:i yqVٸ5"Id7cz(>ځơ1PUew7v?slY;iM[l̾1i@ᠣ[tѥ2e7kU1@d+6zY#RΧ#^SXrD%$aǞA Ƙ+%XUcgSԱֈY~oș5N@TI5,!eYdhz$Itգ ):%Y k4;9>VxiWAKJ#MHk[Om28~,EjDSW=Z#j ) (5+%>^ ;esф>tL|8,\ISLͬ!FMk8Z5#}F%'`a0a'ޢ;HjVu@Iws,3!فϘ1cƌ~XTыDğ}moy̘1>)2w._R8!]Y/E߶>DN ̸^[Z[__xᅹ^Ϙvy_![V&G@/:tE5lrS$'4y?n"ǧCmā==Q?TwW조CNBF}C##ؕSRJˑ&'ɿ}W ʓJ}O2ޖ(0vU8aÂ{>~FiOTّmCӫ*dE.!Kn/5Ts/&zM /Sr:DBp)XP??ƞEVJ4Ƹ7IVH\R7̘d.A UȰ,0aɆ'09vEOaxq)I|5 }@#'GFƏ1o=2Jt&A{3z_B}R?z5p;vΎxs?sSW^HȟdR#܄رQ/ڵ}cԷac0-Fڐ}r*%lbF =-_,qsAS 唽n|Ć &8t#Úli^ՐO]:q4pesk$Aw ̼^IET -9ѢK+tFaf85xr<7 yS]pJ:ލ;Bfu%EIFnuPaUH՚%jΰQ:IUQ* 2bdž> 8CrQn 6 eghB(hS) KbrŇu@SO(I+б?7*g.}Y>>\m7R@oKdZ[I.Q> ,H$WT-ӑ?;-XY@dCje/*=W މן [$iFsT-fu ୹b yVZS(c4lig%a8+ΆiH`R'XgHiW)=:ڮڂQ8VlZ3 ]][곀 ۓm-PFW`:%Ոҙ0ոsH}4U',J$I5h!ZGQxǞ5x/1$pu뚭}o5 3f̘~?q^xs*;輏`f[[1cû”Rd1֧T֠ds/G@yF{}ow1c;R(CWp*A=}KHȚe LJ1*DPo>펟*ץ͈L_RH"i.Ӈ}[;ۯ5| ~X U%Ri] uaq[h[K>e!_I?6Wm?55BU@|Ea\\*iڶS%qZvn];2p׏edks;I[n `sA[#WJoElr*gձ!WDbf#b 9!XaFpR1L$/E@a7aʦ/y }X˹ &aA;X rVZDoA԰_+ŤT2^Ml #o) ,ج+Uu| 6 1CRHpʆEh6v[OpV%ďwu6xU A^bP{uMy?5M~j@NX_ђ0-.~м,ok36P7ۈj?h*a $JVbxZ #DsPw;{mbHQg@`1"Ů(Q(`%*kPxg6<alȢJ@%ʰ,TE%E.6x{kyEdLIL2y{O}|;`bL&M0kѬb#bw="y*萰6A, yҥ e5 __`Gm c㈸Q!?Xc5{>E^;N28Xc5ֽT=]ZXN!Kk TZ+g8X"meomǝbQ#u[`NASkf9yH 5y{YJQCBÅLlZM2~F7:w,v ,OUq'Na 6E[5k`e;i2n3>cLCY6 5`8 \pʉdebtdq_T 0~sdޅ8pR< K"0ȶNwܫcτ".B}:!O+r>SDx?`J$rO~ ;x5hJmjc:!Y;Lŏf<7@r1-`%BF y0,2ʽ"ǻ)R).ZfWx?t"]pPk/bR7.-d}y K^i]a(ƆnUPc,)}t- iYX-B ISDc52/8hsAz>rE R7)iL}ǵ4ԧ~t $vrsV@3 CncOx}V> Ap5rZ[KnM$RJDc3}Fn)]Ҷvb"\eD;:\&0*u2q+{PY` 9OfxdS6 ȡKx'pSNyR0ulR-CN:)Y1M4YfGA`0нwWN/@!O LWW:d\{ε> ڛ ] rE3u %+a}ZPmV5> | XWٝLlYddpV#v[ȩH(Gكra BB0iĈ9`O;/!l% >uVv| u_*EZ@ԛ78FE?ev}ut"tH¤A2LA +գ^԰RH1.L޾(HPa&v"_WG[pS2 #eǦj~uk(tv0t%<+ajt^ύ\"Y%~])rdZkӿ)^/;va/Bz' W\&4/exԑRGKqʚsXc^>Pۆ8a~ð?;_(̍7G[\i yVfЖ+9+"`uV7w]6 cjߵǵd9RO,4R)#Qm McT&ҁikױ~%2|'_x xad0ڒiB';Pf+R-uNg`s5JQv|-*%ֈ\42G<| $t'G\`+q|,G` ;[cͤo1ջŏM ?0'/M~kZLS{B!gɿ`ƺgn[__FD6Jen!d@_z鎟&cuwwN\WG֫k8.bb8HT5P9tJ[4T*[5 $(> ~?YXM:9K)S.3D <` CXˡ׏dAvP%f b+6y9ldLPIzY0ˠB/m3g$)L^ަђ!:P5{<Ó)NlVn]lL&4SO%=@It!sL3llx> g ZH%>2m6 dv ` Tx ~ xx8݀q]Lqy{@#+:N'1fT-Yz s7x~1"IE:o=4Sϭ!Ռj.7] e) '2R;ńy w}yX ȯW e tL En𦣷>hg$i:wܛl".9d5"?ޥ @z;zk?xWՎ],}cٝ}E">ޔҦK ybXZ?ME ~s NCR T<54H KB2\EA-HӌOFI1 Yh]Y!Oi Hjڑ_Nt/九pY8w m ,D`7Vn\;p8MBO̍1`QA(31d_'$)^4Al|ޕRZ'vj⺋#S(qWN}mN4]a8WtW#NI+u áQo^k΂*p; Tp)8G1Y<WyώpG> 17Xcoꓟ$VrΘC 8ؐZY^]>'oXc?Bc72#g^hj=إ,`G觉~Cl[%64S.9Lj| BS&7r'ݵ ӃQ+fN46vw?3p\?UÞ#,hF B]=тoNXA/07ݩVi;D)K`O96.lmCVB1tvg%rD05OPXiVBvЩr}FnddoU}h':LǨ!WpW|ۻY+Rbr_(mL8&rPVp+AX B4!YE m\nn _y0/@x_έ}%Ž%,#7:ޭ5~ 1(D[[+ŎƒXJ8rؼRz4L,ZY @ 0uuQ 7%{U_n+M I"[{jيAUPې(Rd"0<^ȁ\j%3;-0LBsw~mȯ;:v ʼ:6'm]ڨ# +b&^IuXWuv;͐ۆA%sl8a1SsBy"}B]z-~n9um5,*6#9@P|Wȑ. B(8wt$>"OfpExZ!H {٨SP+t5=H#$,mZ ق)@$~ya,-۱Vﯕ`"!5DjqE&lu[LPQLHZwQ!){Λ@uS,Hw 7_QDzPr" B~1Gib냀@!@ 78LZOn.0;B%-ͪxWq %z09|6dtƆȵа=6)Ɗ:LNe*q 16 E' 鄓 O%3Os!}4 u )AV 9AM[NZ̡ӸK?l|"f6M+Po| gS8lwADUj R$!]@T4 8hĄz+ _oΓvZ?tcHF# G[:I.kP(Ӓ61҈*R8\_ >@pt^ඓy\fG;ȻAk[ܩ a+bj6LETt%ƾڜU"g#ƣ94&#@#녱ɏ5Xc^O|Y~}N돪ʗ5Xz_駟>reTA 9q;{/09`~ITcu 9$Ly{ `.!Su.ex Bہmyz2Åtn}icOݽvԺȓnUQgȦ kC`ör;' h*"7rLo2~K yxBEq ^U7WJGB7!yB];%!zd4'@S̢$_/ݙo֛8 JUpҜȒE f  Y;!v& N0ǯJ=́=y8yg N;~& ȁ"ARo~W6TdG}LHq>J91mS h*ݝJ"5qVYLjb*Ԑ֭z&)L+KB=xׄP&#<#e^A`~Pa*=b19ؑCtUY88"|ƒ$OαZ<T$tzdwr^:ؑKIՏކr1׷MNAc<^χ^5$h9 `wM~.Opҩ}cfX"e9OO<5 DP&=qIF \f"XeݚF]98xʤ.bSf :ar _]X Ks򥄞#Pk 8\nAuu Wl'r=,M,G;e}Ed&@-c?||c8^ PWR/~5Y=-[A?%/˕*+W=[z&gråPے%4I]sNy)O%#}TwsNɽA271zxniկBY'F^G.FOLN'>3HhY?Xc5{>яbm2߻S az_ԯ|%|s(aբk cѶ~_UO|Y(CCOa5+8_^" : }R=D\Ndow0 4y БLsn/;b|cȘU蕮TMa> 9m`U e pt +%K .TȄ PJMFW! PxN^&ycq}| -9zI? 5[ݙ[Ϣ_0ly[>-ɾ\dm}{7Etar$rCD*rHZIdVTܘ 迕p=$):}P^Q/w8tˎA 9(3먗_-YqpxvlI\2%X I(8Nx LHd Ȋ -w ȏ5Xc??8Sv Xgoſmk~RR+q3Ox[$ a %=pB^Sb^4X}76:ujT£~D3z+B =5,ɻs L7]q# kߖPxm/6E̕T+vGԡWo+ }CP4=nC)E~kGDJtZl_l6Jjf19r:dXtE{%U 5H՚tmy\{bflc7Zi!Aʊ"b?Ѱ;N952HF&k';XAP٦JMP#Bzu%xH'N:98a8">{=&ƹh6Mkˏ6ʬ/Y[WP\-k v. s,^/s gc.G{^u\@EwloU2RBP%AUHH;Qv-@'-_6] ,+ +nIDoF.Mny2հul, [Yܷ׀*L0llMD(0 -mC, R"}I=Ut*!eDzw%H ,r+"8 6؅ 劺Q- ¶ |k_w7\=rko_z AOIXnnK|t:(o8KZ _5 ҷH 0~\ɎO"uMȆKXaiA j>H\\k p6ۨA 5 a;|;\bA}͚HqD2_uXWp5XxQ `\!H].e3p0[7ϖ }}*l `VUJ\8kCy)y^ r9 pjq%ރLZA*_V#8/MQԯCRJASYې&)+e9+KAC+P2Qd*)إq$CY%k.'!Pn lg7 l'خɶ^u}x:]7dv܄xJ@=j*:t6mJp2@\bs' ,ڞȏ>䕊Ps:/o UgHn@NGKX0XK e Qp,ި E,O$!/ɏV+N@:|({+R-4DIIgPYlDjQT˺Y 52wUm|ptDmo qF\Dw`AhDZ! }k!%KLI ?9A(;x9^c| ęVRNT8Qb̃3(\ȡVb R/M3ŦAm^q=lNWYZ= CoNBN<*Ÿ.qhc̜eA_W Mncq}bUMtm\-Ǒ$ƂܜU֪lUfy%z悮t Þ;F4 AFNP_Kq'  8\ 5Co} ˂榰C5JvF.=k'F 9TRJXWPp 뚼E wdóĺt' mQJƱ|j /4\%nt?L>%X˼3B듄FrCIެSLw7qp+kʯ\&<-н @Չ nP?d+|ȑ+๢g4T8eCQuDԉx(NB7;TXpRjkz֧?Mq0^_;;sN5XcZw~W5ePM}O˿oXc݃/=; #|Nnsx=s(wbmT kENZqU"w r>cG>%v@O3 Cn74;ppAijX: a_Vv G@a2B ݲP:5~WfR2*#D? yE4Jʐ2MN)PzA LL#ӑ(Z*v$ .ҙ >TUt LH{&kX^^i}— !,Ae78r$ݼ}EbSV*& ʣHLJZ ȼF^7SH*|O UAl־dp+'| s9Dnv9Ŷr [pY IDAT\kU_+a )x4ulo O&M/ў,6}՚k`>QNNB`[; ᔘ6{Xӱ:3ׁ[ W~T3VQا:뫬Cw9XSZ(_[-i&v`~9~7`ևkKӖ#is%_<)l =Ml5"&De`yFWJo6TqN#uV)l!x.SL>^+e[8Rl "ohM* 9gEQSfo9\4YX+< =b(~S`ш5Qry+)a/ -sb$ΑHMaaE\msZ8f-VmQe{U!蕌~x 5)Mb9UZXXCT#pmZGzvz$>8oY;plX1Jjgمu(!R7y]70{˲̪̪ztUuUi5Cc{lYABj3bZFƒd@ Q A7#F{4alUMvŸZ74RǽۡN6w3kDn;ÿ5R:Ʀ;LCr^LH% v{Vcc5u _YA.kk9u`!%Tk꤆@q'{zk4 y2U3 Ԟ]\#ʱ4(|%du佽V &m Twm{P_GXS!g> Ɛl {MP@ő3ioFEw` Z%nʭD~r &  Kє* ŸP2Waqx  .5Վeښ"sO4wJDeLyYǧY! \Q mwh&6wUQ''q3Nl9ofPlb~hrC`oo|#'~wDM?o,@@hs"Os6*dtU vͩ/vٱ}n~+ia+ߐE7b: ]:ԯ_s.LA:Y v˰kI@}Ψ7R{79pj @A`+6Qͻ.x»Svo\-ҙ2[vwy=|tT=H3ʼ(K>σ 7* 0VŁW,/ IּHg2!A'SE4<؟_f$;3_5iFm[1 @2mF|!Nth ޼ۧsFVȂ)6 K5sI;d&\!fc4"͂ԣ_-A/C²:?d&}9pk θA.? H!x*+q%0rQG,r\1b^<ܡV+mi{-N[\ˤvRH>mkPte"CW0KblXGcX,\1FuF@.-y#,CF# 5S>Ч2|o&p#w5^2fp$uςUv;'j^/tsHK_Py51$tthw"SI{C8 bNuz`~?OQmb&13c1NvW~e36MuO8h3?3|%L)eU9ޘ-mKLdr0|%gLT,s+5\ Ije!jXhbm2*_e~͍&xcO?CODBzڣ^[٩xc~k9G (|>pM7V|A Ny0a',g%d_DO@/rCD?mIW/_I8eAJ(m)dt|Qb5< R6:ԛf%䋐^uV%f_> {r'2eM\B~ C/_Kp2<3T+^Pk"LBo`2ה5`HB~K :vqiWXB'X=WJ5z҄t7vx vuAw5Sbͧ788,wl$6}d-*>?:%9LnF]!#$|P-~TCC2n@Cv[Ҁ%|JтX]-qKKˎg{}Sv(W*u='{z Jzæ lǐY850,XYx e`фOLdLJ~;}( JM 5c2PըIeO9$hЖQF:6EgGZ4 ~LZ~F/j$ `ZTiO'f/pRT`礯)| "@Xˆ(H)je;)O4(RWS p!(V%-g@aIbO=ܤ! 6h2W82ތ!/dZZy[cKF:z؂?ou+5IF#=ak bNr7IF^Y녞qM*O_/&gobwA'8RZQӠU Ii2'@IZ :rs ؃}@E.n;- F2'G3e85PRY1^&s fTj|,.dIK=0O0U_i2e giϩD1q-!?SLKȣn'L G^D v}Q8SHg`x3z3^ae@,iGF9$$ '* 3WrԱ{'>@"T d.rƀyBs0wl,qaT%^nKlnL"آ2X-`Z"wJH۲ɥ{W9h~ ! C8Hp N7JãBki{a|_I$q҇;t~ձS`;%fYIZWZEڠ$Zm=RkH~اKd$ϴ#mGzy'*΁2jt@ w~4(dPKtS (׉檁H"NmLim蜔cP`db1=ъ[j5M%NkN*E^mt.Z׺dI%ԣ֜T/VO4:fxwPd !EFF-Me36 ~?8KKujOP;,Ң) ] [VSV*P2![:0P]m|C-{{lL[R LM-^˝7F J44evN8[@W nFȶE L4~3 %Qq2KZ |܈h6K, RZbBN'dB©ݷpڌS%5)c @We\ow9 S.9!$(x=cZOlob,nmD ܊ ɱV;+Qqmb\'*URn9n7'tME~9<Er5pxqIZG;%fS'KEK3l9RBC'j,M>zDa/+uھ(O| Mlbxǧ>){ ]_lPwwGl&6Q>ƃ*Va88`Sʩ5~&a"_rhlUZY+QJs?~s#7;<_|$i}HNb2Qvm{e?;<TA G`{=kzkpHMG[t_`W Eo*B" v Q R3˽=sA.%N$%48_.Pjg3h'!a?2k ߓ7AV6{t 7/7h;= X[u9lwQHv>r~> ~AY yç6@ŗEQLpQJ4f_5J){$+PgXEyPg~Pja2knu?+6Y^-@H%7lLtXT.B (!p X:(aRU5u O[cB={f׮5CQk9>ޔCx" QN xu[v5\tLEA|̫"j⠞6C5m36g@(~hj7^V Y` $%TЊ;-otNRJb[b[>6Aޑ<o; ]+*uYEpKѬPA+Eљ3Ɛ=tBIة{yQ[=ŧry(u..GV"NJ94؏uSfqŐ!j O) ӄܬ* GP,;wc#T^qd*Ӽ$ֽޘ V~Զt8J=~$:ں|67U)>Rwqa-x5iTDV2ǛLN/biNeϫ=4tD] 'Hsd;lm'6Ƌ?.8w ײO>N ^alX \Maʨ6g/-F;l*%$rrmM#DQIdʕ{2}8t- IDATv,/%J(z6{7}Vh8=V|tTp䱿 wMa!K {35Af $b&672 ~,65#0n 3gob[sOOȁkw;jh)^#B4 v(YZ46 )"o&gobwXq_q(R,* CM5x']_ F92HNc,*gHBaJ I_~Ȩ5&.Hx."8"0ƐEA3о+hxiGu/$ {] g\ C?dԏ-8HCz4$@b3{ qYNlL0F[b Ƣ4?Vo_fqPdd>*G ig`][h 5o~r %̸q1ftm @p_ʄ)9l`e$YP9maRx\?}J-2}eJנ ܔTY$[tʮaO w)(SiR1G@J3kSyT5)M*Ncy'=/5@RI]ُxO;eku#-yGR,ـߞHm U< t{>0k@JkŌ9ՃMl(b6H㇯oMY fEOnzpM 7SP o U`v%E~LquٻDzff;)\P.x+>vZj24V:7no1= g@?؇ yvK51YF{+G?q8ך*C{&TFuTZYU1@ 徊[軲~|>!y/Nď%v2&:s @sNtPW3)p(XK N%r@W۸鉵+J;_ Yc/(17}NK$>nĜQO!u@L8}3_CB {:\؛&  g^ HlU+/d:h̡bsX;!}k\rJ@6 SuN!?!CV|]h]Tcr6 MlbĻ>.>܊}|G0G)L?'7a];?/܊~k&; ]NG\B|R~CBZ f͋=#Er8~x߃nn&6q//{xDVCL 0\| $r+a`,?4 6mE}fGshAEYKS`Fґ/"x} @k}" qt8Q<WdA\$P.[Sl t *Qe\؎<j_xCz7F3.Q ua g;}'I!tUπg-&+u@ ~4.a7lAyH4RD@z]cQ d}bfO"C)5CI;y[աlk} ~֘fb f25[;$}}8gp&# $sq4cX你[AujL֠a6hm׿>6O7\ {F9aߎ( h귃ANˊ&/uW⾂vc Bx5yP)J)k֐ZorARpbԖD4yب {G3~­   ۃI{m7V4%-v22i{bTZq#]rT ֵki%m1$BtO ؼs 0w"Yz5`]62t8 { )A혂 =.QY{X^<Ż4f!Qrmih M ݇ "6O \a~xՂ9 uA(4ŰI7Zx3JB;h0c,@Z|]qbEkRΙ;5lbY_Pȱ#4 ZI5%B1 RF&q;e ˠByaE"1k4`U-54)Tv<'.W{f;,2PcW\C}~e%!%k {5S)!8HUZ 6#'><(إا4Gsā` C*\Uz>Yb?Vh Nm Tv FTirxN9 kM]Kc[Xeb~6ľ|ױCU𗜤Jy偮KwaǛ/+^~5ꚠM=ضԱIpÐ&6Mȏ)Ȕc,_ r9>V CCP:D +:k֓)Fm?铎?\:8ݝ*Wb>?3?ٛoz]{ްy#rF} cc>!Gε2!آ`^ pY(:M'aBּT4HE?MP`싎]eGmފt 9#׌K F K:7׷K=^3!es.(zw& ˡIG 18U1GP(/ blet;_}+`G{{܏J:T]B%A}V =H9ҴlA~OBSڊ> M s,,hGNֲ0[ {?<ɏN߯uhV&- ĕtfJDufPHy4G$Ioٺ'wkH*&uWBuܟЏ"tOεt~x2ZOIUPi0 vJ|Kmj-UA;}Y=9,vvm @vo?.̾{B>Ƙ]ĐK y \nCJiLUg8cA?2|@(T$xJ5V (JcrQ~ ɞ+ (|Rf1XLv>}e|q\yTSȤ[8Ѧ+:BTћ ^:5/*蒐5%֌9m7Aok̻yD¿܉Fmmӄ Ec#9($:X;nAzmJw#]W pƢ죬*eANxSϽZ ˘>KMr>ҬJ|`NB s'У;H'ѭs>Y(7kF<%NG{ZV-A: j؄i_l:"> qEdۛzD7RWMdwr]CY]''[ax6, C4 blVG2[*=:*V)%g/֕-Gk`%cFŗYE;4*0}ŝ&6Ml⎈~1 s7Du ðP_Unj\JE红k WJcteU ɅတFbL0߮LWGOScW_j+ q`ci# ;6D=oP^g{RII;aǤݱʮrt D!c2dLP)+5E#n4M k6V-]\H6 { +JUvDcEbQ8jSc߷XM|0xAoL^ZҊy8/fvk{~n#. ~(c"0kvXB->X7ar)t }XdЭVkϑi*kcdTBhrH}C6 蛎'B6 P c%ZG~K m\,X͉ v.  _཯x}-5QR'IJj[%)9:,TF܃[ P4HEQϔߣڴ5Gi {JC=t.bGQ*tA#Xv}p+Q7EKT-ٯȢZ#eN<|b×ӢQ_ߪPԒ{5_n^lj GBtAfl]͊֔QSȯb'dGONۢPШfE%Ji+xq\VWI1\ QoY4dlyg^d+a<*;6 Mlb&&cRW`}&6q/W95de`K=~C^f6Y v>R g)yP-g??۰7w_q^~? /GiC/i] \;!0яZ(ožbKoBXx`P @}x6&_ Rg }ayNu(1׭`aB7LH АVeH2h4 jyף@n5g:f  {֩A22c@a ?Bsd PWb;'S / m+[B?k[ &E=),rSuj#֋p ٛ=&6Ml⎉|K_x`o^f',c&6M |[?sx@Qb16aex'\/C=d> \0s][ʔ5DPNiOTRB4nzԕ[{y67r;pKu?l02^ۊX0G5@)Hʥ 2`ŃV? ${Se &?̅ϡ;+uv2tHS -ꓣ.4z/CrZßmL`Y^U2#2wL^ȻtOI(L}/W;E]*l{(SH9CI,fgCjSʤg0gEY!y Z%$FƓoCˀa.΁e ]6 \Hk,Ҏa8U )M I3a-`Nإ1Ffk'l^FVD3@R)|3*svsKCmG6;jtE=XnV4oNT0SOetA@QnBW)gpCc"N_K0ճ\Bh.nK5J'#*u`Y|* "]@ O4 {5q:o^#ۨ:~w6j?f/U\ImXS\HCcyTbPK+b^)ej RvxRvL~),TB~ o+J0e)HSN`.gzD",on:Yj LiF] 0eǘ+KADs@r|4PF/mE>nԳн×Pd HN9H-,kkmY|%n Qqt}GِTS4f)`ӐXֹGj͖+`7Z"^( P 5%Uǃ^wL`Ug^L=@v ˣ-#H{P Ew KU7 \hFTHSaU`i)pg 6v/=ij5،* pf [8,  Ϧ΢sD+[F$X)$s)!-a֜L ɼ1Scdma}gk(UPHmM[3k_׹N2fs. wϣݨ2wpи66z=QZScۋx&PAh*ԄUo;!hdJ0tXS ;5pề]u-\Sy$Nea/q'L `pliv,ȁe(pY QVN$ uavpm.m]_A{Xj:ZȜ~PC%S[d IDATQ~cHsm}}&Er氵$Lj(Z°ҽ?̺ݰ&6Mlo?|ǜCRZ#Ka\nbs?^E0p O߂{rgAv2zws(x 謁c" +MvmͧK_?ٛĻ48?# xc`l/__R_{&ؾ =lNk5 At ШF[rLܻEJ_OTN|8k\EIp4 2PVuc2!9Ⱦz9nU#cwk ,! )v{XɮާMI6%,,?x0c 6|H J,3F43 `$` ā=3c3QK-,z!jv}>ꜳʇOUfj$Eyyo=NoQ~}Vfy'?u3hK KU#0U3P t'Ђ,V%C $VW\0{ZV *|P*7?V́&tK𐖩XOT~3̺6y/tWDw^<KF"/}l5T*`z󘣚ós|icx A=}#Gʸ6)ts(ǥzY>L|J;AFq̌/b+cH6$HFHkGsc_s+d^ٞRߍYJ(h>(\/p{_kq4Ϧ1~8^Y|ḄQ[o?k*!_z,?>?9ŘX#l9Ǽ؉kyj{G=k_JrBg?kfa]y!XwP jaNo}P@[(*HD#luՇr0櫯8Fj6a/|E'QO#`` 9" HYJxJZfuͪ`}W}5KS>Ơǹh Zc}qG>vxw;؍Lh^{ x"op?t iI4?*?` {2㔑-}%FD.] {ĪIQWeP:YX)e @3W3]32)5Ә2 *syGi})Y 흸07MlbwLۻef 2fFJuOl3 6M~e_W kA`H7 oSNw '!_K`G pS$|cg`k7ʔ*(2]0o\MlZ($~_f7u \/5B769hamkD*+'7lg q_W?9&d@l`<#\+ PJᛐOVޫ֯+%e=!qX@ %n I^$3G, 徝afp2O k `JR,s 8+NYc, ,? fJ}Fbvsh_r2_ K#H գh$X/_! 2E_+`tbc1&תszXGmϊ[cb4B% Ymp1@F:FC9$yxDs?DQ@;`^e Rh@L @D w@ &г MtAVWT]y9nbk/k1WN|ּsH~{E འfPOX hؑAUn//=H.2d8x.55 eH[bc ylvI[eMEBg[>$tFq'u eʙѩн \uewCvWte^=iC@96ͤ< zkZL_Î ii:׍砝ƹvbv =FԿbp)9wzU>ְ:N|,XBqR %qp? |BO᥌>O*Ye MAFH x@G~D!Kj<<')̆qd`-O)ȼCx=AWV3Y·u9+h{y6Sh';@+ߎV(ǽoW[ML{|j| YJ깜 `\2cpPR X91ytR1DtW{xӎ`l ;k1(ia:4 !z1/-uY?grmG6 Mlb?3?:4Hyyo&6UO_:Hozӛp2ZW")ȶ٠udGJU [d9h;FVeoV^wB4\}6ws78~W~fI &I=W+;!K;zZL<Kd+KD*_kr7I9%XDs}i$[l{0hBJT)x/%TOZ`naU )]i/W__e\VXX")|YϓNB.Tͤ0-QTODWVnmv'_.Qhm*q(/#`Zu|4z#8D}B۰o8B2CgekG,p>HUr0vRPo]1Wcu:$yA1iF`ӟ&WܓkJے}SKܔ!_Z; 9Xۄbt.'%G tPsLЗ& Ec\Le[}8Uh4X]C!aˑLk)*~EsU [D>&E\smJѳUZ1xޑH>9 u \t}FoѼ% ,J-`n|7AylAK7 )#86q+1@fY!YUH*f8^'Z^*y>95/GɴZ|%f}POohb^ $Ģz۟E|? FBmwzdb\?\xk5ZJw=ɄCozB!E.z޽{A+hX|g8Xv]a|yWz`T`p>T2ȱU%]6"PC 6)Ryk< iSQ.73L@Fm\u&#]Kwhs6b'd*K0>DߞzZ˰pCtة @/Tס<"w B??T=_$zZE,Zyeo x(^ y-(; 1M.QU3mUALpdG}nG|PĀ:`m0owbT K}` xJ/)9Q7(U-eyQocjd CˀjP[B:r~d-qpg7ݛ&69n~_doo_00#猈ROQ;~C'^a\nbx=}- w'`,!H^)`=93Ca;]0\X| ΃L4M4?4ˏ7&gobI8< ]3Mq ^NÓDA:O>辐|RjVÛ3Nlzן-sQL¯U5/z'8@O̱O ~`a.[dd, )L܁[qpZ[Mz7NA^_H.d᪁ ]qx5ڌ1LђZCgsq r5ƺ*_^!Lfk~ǻB:ʒ{ ? O%s)?_MzcObRԪz@kAR@X08w^td^C2Cs@ebHK W.":$Q/SSE͵D*I>0ƣ1iV6,g4Cf]. <Ы2gk絅|$pI>WkM5 8J4EzbuKOS@FAMcF3ySW,@dđ݊=&֞SZ kj-Ÿݩe~ k7 \4 ${2NEy0q,AL%ٗCu&N\5ԏD#䤲9 FSdx4klch,|qJK* o =߂=jdA}x}~kDGzx!+[{$Ea;n 54 7|ӏ 󝎲ׂdA .YG.R΃ ;u\Wtuj[zaTYv'ž{扄sOVe#ϱc£eZ10L~kR߼y0GQ wvdÐ&6Mq?o{}lJ)x̀&6Y_5Nj쵸.YcSNz)~dج0vTi Y$potsDq,||c~ds7osܬח?/B"b_WjgXGItnrX)Eϯ/U]^hn+0ED>*:>ȍKWr} 0)7}0k)ARЙmhp^B\oo>5c~q kz83L}J =xJ5ʛbռ"o_pZM#wȽ!s:nյVy]8vx}9t:*N&@{Bn$uJ( S[- !'BNk$:.3KTŋ9Lcf#t޷Bȭ[d8`p@w$ aob&n%~;{Nz[8~7MlN~U傁 zJU^rFx`1EQt7@~ƠSHoNL;J uh '?M&n/r5RJ uȈEa?,GD r ʬ0nrkon.?׷SNzaR+" IDAT4R4&QľxҐRb ȓ@]VXC&GCJrH[-PKgU4X3ٕVcVEz"@s ͋>ٳj\$`]F|[;-pq\}#֐!.W ]Q9҅pBedkSjO( `}>]05vb2 wR߸@9rqs z-5-VrBlyiw,&r ,%w(V}⻺vXX;hd\C!S^B롸QCiQx }PaGk PРٞ2ٌuG7pi^18,4a硿KX*rÕ@wǾ0N гv? T5ʂUQS!-qlo6R#{ wC:FN'8;kex&.W6@imʊןQ y `{1:6}B#--3E:1ġAEX"=`+U"2(^hCXy9 32MojΫ f`ß6R8*V:D rG@KC^(Af%b+el[z!P0/آPa,hbm 6Ō̔h,t>`ϳ?DH0O,jqL&iG{ (OoHhk9Gɂ5;ƆB%&0X{QUNd 3= n51JUL8P i2iZFSN(-*SEOZSc@"M9K&x9d;öM !G+I\k3lc%+6}Hw%,)M75XȑSAv2: sǏ[g̼e^;z/7Mlbw\|;~X?t[mx){ O;6&6[# jFdm7*+է$M.C%_Δ-#@Osaքgis I;[#=gt;p[#PA0 *l'vF MDJMl7ηٟ͏<^naK]ɵmc_ȤMxK:5vnN9|zJUHVdџ-!o,c PPA֍aMk$E!T tt:GA"< O.*]9TJ'դ&_qIYdXPJU:GL>>f QeA%޷kXgzO$yN`h ,,!`c ' HuKi%i L \&,%|meLwíMPE/BSd.`SlL &j| @@CԒPl5mh(8m|}x>aR=ҝ"VPMv"vLP}Խ2m!e #m,"L01:Ҭ#Hs.A>ȣJ0 8ѧ%X:3_ǷZ ؁rH+'Av3l;:@qu& '1^*ƄaDq1TY*!N xY>篏 2$}>mYb&zWS{qOF1 >$$71ǡUai ɏj^#bcH; UZ[)&et"Fa:Ѵ 8@̑Dy% G$(̡Rh≯?Uv~ZcMP ZS 鳊_9s㵄,8fNnxK27 ".+r nrBA)ttk= y?^g2NL.%GZ y>!Wh g*.Z kOXoV?pՅqU:.6ү]QOAJ@UCCP)rt j r M^G=:"ԛu{02׆ dд*p讂jNKB]RcɂQ(Dl%|{C6(12'rcֱKI92uk+R0M:ѩTӡGKJz>}l9B;w[AgFK"s|&6;2RF79g ,}ktf@lbx]ō(>CUU`;k8iZ>s菃!ҽ{ Q`!8r}ؽ3xpS/%}m ~ѭҋ/SF& q!nƐ:{0HfCŪ"ݒ+h~sCR ve%: ^WK+$ ͭU??߇ = \ 2׏Mʳ|qgtzef̏,fs[/`S jԣ|W ggĻ)hP0:g\/:1\O H*~ 7xIPXߤOci]뫟#@1}i /ti(oS#@%~۪zh7d$ͨ㧠?oP90q@Xxb憷F;e FhN u\ k;l+HT}e 4(GF`M| 0cT_)& xg|V)v@Ȋ}X:d'ⷐ[*<ϽTDޡJw0*8!%-{V(wmjG0(xy)hUL* ;9d';vѪ0Jz^`7b\q>9 XJ.14M-Sg\!]LCˍ ¿zf1c k/Tn +ےW$TiB[R7̺ZtE^ .+iU{ wZ R('XZ%cX`!Hƴ,-]2I|X4Z/,N,U_ R}He5X:iz|(I=RR9ņ-@#6nJ(! mM%)2ա`jSڪl↔UGq]F #6>SS[Zf,a]V'EɚiD"fM `ɱzݽ(sxZ7C*)*d'AC9nc-PB醱߰Bm^h/921PйDCj mB A>zL:~G Mlb#fz۶ 1:oony&_(o~'W1G3~>SSpnn#҄[!m r`:q@yHVIH#6=iQ?w аaۑ}P1 )ѕ7~_Ml;>1Dr_7 (ڒM7`cj +&72;.gC&{tZ3r:XLK>R3[ Fqty'_wG/_v4`?ݭe*/_%j ءJ1c>Վd1eɖ5F<%kx<g[k,A|*=c+AI|uL:~KTd1H"_t5qQ-IXZpI#ʎ `T1pp>-fvle"WBxx;}`F UNVS&իMJރ,s,w.qh &EdPkx7 | (rk8YFGB1C}̭X-r]=~*|l˵""b4#@.zz';<{ُA]5q6kP~ōG#r?UJYy~,UZp B+ DᛇTsز xWOpBu($7^W}[\f#^M$= zh8Y~|5i85UKU!d2VH1D'J`2|:E-\I+95FM`+k, q|bcca' :2Oݩj@Iqvo rCOE㙍+-|5+_zۉ\ˮ8Dpd :}M[%kYTZ`?N46"=N{)"cY;%X"邟RצC!)NF'8`Vs;b$՘ةIU> I_Z..}UHB~+u_کl 0O}WŴ%,\(4 K}~01tGw)n7Ŀ4ԆR$p(wdy`/c!]i¸~/}^f.tS;Eԫ{O"|O\vLѴ|(< ~ŵI8}Iȏ7W= gYZ*?If͋N՘AjK U>V뢑%dCHWezTPB+Jthivh^X_)P/zjSQ9ߨd23gQ箮bhb/Ba1I{4=[k FXCcs[۪x؀Ui>eu}fs x'%^9~O?T޸7]G?6iOюҵxgȬ63ahQxgj3T[׎1`QFF9O{Ӌ9*6Vh(ͬ|mm?jٸ^_':AÚv-C=?Z/\n3r0K.ޱkob&?,MÍݭTUݝ->obĝKB!hCM@'AJgc/CytO < +wAL} +/ ƕN7+9J4qH&AK܁?~hsA7 nzRYU1:Bpo_6{&7Z}B* TF3WzVE)؎BSglWVt.pZ!y8Z<]8RUL`7EccOeb[-Ppp * ؊I93J#|d斢!y9&3{=pw Dlq| |@צ_2ծ(Zl |ʂ_?8_Dl IYdW Qns:M=ٕ`5~`Fz WgrT}wG~ CJ㧁7D!&:JTb5K*?wASҡ%P`C:rC:R R1 > UMVح_h_M+ Rq {B]6jn}EӁx4d 'C?(o`\F@H8i*C~DPx̆|c`L;9cKV &d vw|?:[B,M2d^fZmNm 8Ta- "6Y4Ƕ&܂RTcO/OO[O >guPx-9:ʘ>_JUoՎȜx#:y?lt!{tY,fJݾӥz>&Q}֣S=>-!e_K( HM$%IZ\3hSgnS #oT~*gf`䱟R?n9r [\9vc(KwR'r> !? ؅ |.ͧSY{ }UfPH)J^Z]RO0` ed=U+7?qJNU1>X{, p `u >\n=GUA:rGyPRw7MlbwLȖÏ~zU]VP7"![*Bobĝ?}vТ p -^n9!2tO>— |yKB?ސ Sδ}!`7(B~ cxb ݎoFL__Cmr&6;{ߍHoU]FeĥgMc-ˮZ{;^M]=lv)ʒC P B4B +ɀٰ!D6E8-MR=was}UdXlnWw9>?~:Ow`2|\ R c)>)Jȉ< X9۫=-g~"5mW[v‰/*w/RU=Ń;O}e0?T={L.[?N<\1)34T'_L.=~՝HnLb.UB y(LfxOΐߟe^iA3T-;2| sF&B7`->~>3 ]lھ fw(6/^OOs:USx'9Rʠ6cA y[/v%`@{ހ$TVx%<@虀t* ^nRr3s-A I|^z|IL/\-MayKC@VP˫T^! O QuF;Yۀ$_nKO-dG$8zD`cŗzL(oT9(:di0e$ʒ Ѷ=ɯg(Bt ӕ100,*u[4k0[k.M GB@{2t5Q=v (ςG/9Ɛo>_*:ZCf E+jaO\ ?{(xUb!>jAh!jieAplð7:`A9btl¨7Ia{CkE[o&o\-lBiN9dLەS23/)v D`#E>iIKۊmB7zPQCw)onr/F.*FiH{m%Y ŋ L;iVt1("$J(6 `Wp?߯aLz &,}Υ/ O0.7:s""U}5 rB4\V<# '@D@,JW(ןf!rT-],a#P$dHb,~UFQULr#Q&VS-zdx Gj͈H1x _tW3XSr_2 M~0^mGkӍ"<99% ~y0,}9zA=!yvQA<&l+k$KF zJ#t/\lh.(rUQmUXܣL ȮG_~̨ջmcX:qčl͜9~!Y׃s(X:=W>! 6%ϔw&x qDr'^J7 [vB3wZ8 NIZ*cg>c,^\M |30NٿozXu5?Ї|2]vb*T%jƶ w dy6=M2/0ӄ|Щ(iBr #ܫBIЉcG层!n*Ut'#[Uֳ s޳@LWb#Q7H2box&(R ik[ʡzZ^=<66&ɫWEzkxN$`.z[,K0u fBLd\t`SH dE$!(Y-Rnfq_j_ Y 9Eh5P1z?*&E~=4ZHtB|Q»Llhs9m_g  Nz+7Dmrt Ak| '5!,Y/,UJ(pJ)tѸ v'BlG)"M]L xo ?7@~R(%'x а S!-hUk JکBw J `3TiS!AUeIO@VHqy ҋ9 &. ] z&WEES*}̪ow}/%p*:DAd_<ԺPݏAf^J"w{rQ|ONSDz-ng:O/(OCyDnY A{!AYUkj'X*Tps̍is[W]4Tj U5&ƅ E."BX&rVe`QёQl阒EtN\\\9ϸc9^I#]^sAj`]I$jq>ǰCbא 7&x}FߘIM2dh5zӽگ}oBU=fJ:Wj;;[ uBr< ܡ[F/iiO~i9>PtD*Gt?WvZX:ֱ:>S!o&(3?3|СX:ָ_o`~cx:`#wsl"pM0 ]k\5ʞ9KByIȟ0vlW`?{+Pde>OS$Gfࡌ <;:gcw8nGsJ`~ptiUF]2{Kt+؏\6ẕ&~$*3\I PnF9a_ǂiZ7KJH`KџB&ȆôySVr',h0r훱.3G\VYVEA 'Ǎ*óD 9)|4بe1>k,f>-\r۰iTQ) /&ҹ x: oHP]ar)sE#d,uC`}]htYs|AE6!@yߖ-?&)!~꼣C.ݛ  ,tIB`E.޸Ql$'I/Fe- o;4RL/r1? ;89m0"!;8~AhwwP hI)o%& U@Nc::Oȼ~ ljZm.U_XQ/500xc^Yav (]%oCC*ȯ^R+2EվikEhe1ҧGHnja@~^x~xDz>I e*ıMHPJkXp.iɒ4o9b6vFҵ(zZ8-9H{ v<]QChJS{R$ѽ[#)97,H`)cb~ ]&~_ b$4kA4sq-+k0WJ~󽔓F)ݦc9pMW2Z d$I)4,.э@}պEᛡy[} ]?5 `,&psT奌9.hjbᜄj cl6K "Q,p=tZcW!{/߄Oń-H)-R`NTvZX:ֱ>; 9z`x':ֱuܭ~?s:m(c`CѝD֐P³% =5{S3i3feL^D]%d?b;@BnF ӌs0f;|u^:`jOĝJRRU71w SnwgĦ4o/T>=[nAb\~{]wdzIÿzuWTM_a_x=}zM%Wmee#Ӏ@cw=Pڲ8qR}nnek0$,20i[m iTU6X|~. A6еנ, ٠J'+i9U{ *s \5lGӎAY@֪sF_;$Wx]퍋C szxt`Ub5wU#(` Um_7s7We[ĘAWȋ+HpObgmؼhSs@g:"xk6mq!O{EX&IIȠA?̏u!R~z$Z U%K<"[jc,0΢#x-Ppn 39+j> OgokzX:_dg#S`>_T>l ã Y9Y ̖؈ҙOeh>H0ޯ@^5))$u<O,N,0Zl>xrױ;7#wC, y+{HI:3+I-^RetYS޳ԃwFXX^v!atu(띔:@ʊīW% ;$%ک2SH] 2ZyWp&ӛ o+Ke/uzo 0>R=C7}I0Kz`ǷNUg5 }o37!_{2Y1E @U;~l,9޴8Nk;z/I[d *}Bq-Vnet_x;B.I 3Nse  Ҧu Uf]9vC{x<fa0>+Zȑ*0m1+p\BhdӞh9xCx[ C!o6ozC,>6J`.(!N=b/(`@5|x6+1 aɂL2ǽ8#d/쏠qlZsӌgH`DTgV!UW^RU9Nl\95|]x˿vJ ,[UݲSm [a޺g,W-qƘ^#* U hm&7c ڨmh%9/_?+Sy~d}cױ;<?J+-6e<H"+L:Vg:6$ }oVZ%V֙k, ]&\Rs|ꀰt=m-S`K`˱ [J? ` #\^=r%Ve} ^SľE =%Uxxc;$!cçOJ#Û27Hb)mYyuY`jp*S alC1׷` [sV;ߵ\_x iV dv%s S_HT}o{p̑y= dmZB t8USl؆Q}B: ]*BFh2h& B}q%}e\zRe"<X`NGG߱_Զ:7;|*#cǏ v h >s6 A@9 ~J2:ȮV QT5IBk{  3$c-)<@|]EhƆܼ>

      QK%!!/3{Jw \b@^YM]s$T(BvvYHx9aVΪ͆aA-x)ҡ26F(]$jˬo[OWG.Zl1r-ZtPJ4-5 ~}WriHR+'L2#}% eCq{BjA_R0]@BjB-JUŠu~/,wfU-JrX|ڧ:E_YKY"{F ME|^y´ߛ:ֱucw]Ȗ |Iڶ3$~{֠:ֱ=[>EAV'N.*Uy.ug .;vdtG:`k. [5,^xl1F I~:W{~_T5|vXO;pa`f ph+rT0u2zRO^?V7F ^SAv%6WbS'VkX_I 1vށ8R%dO8IÎYYf̗vNTೋOz=gǽB{TeD 4.*8<_ a ZOƠ9dEQ_}Y{_i}x Zo3LA{7$zy\`@"p1 ]39 0gm۩~` P]͡4ǡlA +ME?) E à'[lE67{fh4kEJ˵a G,s$gF#It"6ӣ~걦 ^MM#M# |>hS9D\t]z`[*Iw8 ](i#|xZehG -3<FbLS5Q˼Ϝ?= IDAT>r7W|9u,8!vmr͇J-[ʩHRjCF)nϽ!VJhࡵp*SoCB|!ձjӌADCWu:_vQ}N'R 2o2uqch VKK~gv E|YPz۠z]rXv´R锸 [aa#d ~G^)J36B .JQϱ.n@JcnZ9U.Ʋj) o %ڻ jqCK ȋ^B.$ҋJze·[HrF}9żp=Zi}  vpϽ%"L--m\D¢%Yf,A(RǽF,ֱucLj,^m!"~~菮;:ֱ{.~G~ G?74*qItwEBƸg:b\I@lqi-y@tR=l섟tNJ۶RS7_:|jウIC\ Nz\o:A07*KK SeY h(:O.j+s+gyq :|w|_ ^Ս;~țYv%iH;Fm"خx82` Ao:>a)cWåJ$W/7_ 2}AE6N{I鞹2]*X4kf U1/>((*2<_|]ASMՋ"]HQojMi}OxE߷$@ãf/Y2Wi[2P|u[(Zzx n&\=pkgK};)bjp 렏'Z|kFJDN#FH|kh7{S6NdJ27+'C~Og8Zvڍ&E ;bF(8^y+#X3.Qq8L\$%nt +.uP@ڰ@ƑQ-̩ Zȴ=Bӎ0wml 9Hc}̑S}q02w(rG>y{^%c|.AY7Еb+5V`һt!3?qI^".X¡.qT$,wM#ΟM#ͅ<}d$Oa;7Q} g΅ŏ~VF`4u/@C BU\RS|ڒ\j1) pQG(ϰeъ>0 +HRL銐\CucX:¸-?}{ߺa8̯.]ďyϗݸ^:ֱ)7S4k?-݋ucDlƻ!GbXFFC|b=t<͌ !sXu#n¢`/[79{xSOqܹ;" xn`  ݎ+6=+pN`o;GË٧20Weo~CS}ţs8fT2s2<-{*s/wxcwP +P,dHyn <΁ 걾iK{`vNm9FvW6ޚn`8V=#B:6P\F#Wy [ /[ճ6+5R?ߚUxDyȵwuĪrbYUH)-}[b}N8m?V.NYrCUCvF9) c|B-kp-G1@-E= vIY,d"}+<88 gt-1ٕ`m*9#I ŷ5G ,j$qʙ֢ /`&%X/ߤ]Lwm.E!JX[wz'0X]ha. Xg/U^}T i\;y-&y;pl *8 ;Z*(UFn5C5 %WjdTSރUh0'Wv|F'4=7Գנڍ)P]y4u+r{t7-;!?e# X8T pH A>=#>/3p=G 8iH+CD<,I-d8OthqA_y?<:{z(*ʸު:U"/85[E@=k@~X:qOEϒ0cW哟$g~6ױun]:OC~ h@hm2H"B=|tAv v |!u ʦAi;\ArӢ~;ex~e'ױۈ[ X,BlJ# ):=mA@bP7} ``UUPfl$dSCj"m D1|= GUYq8d6=:`Kn3sϠ$؟>jQK(|KjK( ÆTuc|xV]m%#V$^h-"Û9H’B9=O=7ױucwsȖOy'O~W^t{ O|䩧nk#{X:~cc6"DHB::Wla@gw 2rhc|s.ِIP6tqguK ֐(I`5.}3?_uKĭ0o׻_e۲4[~d3i'FtV p~C0[e dq/0e`T(7 nR%9ٱqDZ^ IKTV^@}`A-6&Q$K lC$/AT/z㯑&Y+hq"o#T=PM@ix,l CBDKl&hoO$Y0=n> U6B:J;^:8!ӕFI=Ve wOhh zk,H4W ecHu-ْܾOW|!tq 9 i?S8Gkp/B6ilx0T*%l'nU![::\2+49 BqˠF1]AW\2ݕ ~к|=cWѮ۳p]AfFN+( -#IǷPB{)7;3-ݷp8u?Iy.+~UlFQ( yhΆߏMϋ[e s(!F$oA;@>H̡PF91 3SBw ې sk!W \`栗6#:IK8nA`qnIgR8.#Z .e 0r Q [# (䰕]="R`PȱRN(XitJ"ɨhFVf#)NZJҊ4!WPC!^j?!喛?W8W+׍s0(Q$F m,Ni94HbFQleio .0u,Q  yWѢzĚFZ\-IJ7t[ow0n!|r6"]4FPAwóUcJdQdцƽVIgcp:]\l'Qšjܪ@]_HfT;jEp ,>A&J#T kЕX)-оoXD!Mn"U|lT̡]xAMkc ^R8P8ɄܦhתT} VDK+ՒnEE.LҮ!W1G(Qe+uף>Wj>Kuc_q#(po|,e;X+۠މӁQ6rHRKxqw3ʼ`]enHxf#`Ґ%Cߢm,x[u6ɟa3NoT/,HQA `%T«Te`[F>ku)+˵`y:+Ly(D>ۿtuڊy,Iu`CBx^2=tYjH6V NL]|\2:t`ze<Šc_W.Wd&mQE%mV>[|ńUzQQo㬌FZ:GyV[4vGvn-qsh[0ZN}Y;0ytsstgȮSȖQUp3X`Y,GkղBJߘO]X^U`G ;jemC "5ږެ~qx P bK 氎:ƓW{QSv5ˎ9̭;aI'r_ 1(b>D(Ҫ|#N?h!YOܣīyUa\ڶ\ /"wǯ=K`'_ 鸒7~:Q'GwKoV˼# t"c5?8c5uu3 %|བྷ>3Bve {> 9d!asӹhfl6wwyf c븛@_lg9p&<]O6 ^'R=AH-/@y5|`|hNR?2r_2odM)|ie8ठv6d[*_ˊgE>%p? W*)?lx~]#!%\FbJ_: I,K)@^jSǁx|R}gMceˮ:Z;)3ɴ\eD(薊-CS]n %!CB 5Ui,P7 EIU܆LOi;|}!✽VX{s⾛tBq;C6CC}nF }wt;N-}o4;{֐sي=[0`"=3(g 9`; <]3iF'mmQcb-@_ ^k"HiS u,,ߏ5-; )X5E(CQ#\-e :p ҳ.C:5p%O5֙'{Z)0({W>EiضCja-YucXǫ#=ᮻNu`O!_)[[|g_p{X:^qG|w|E\0ViGw-`$ *W?p . %{ U01x>elde yf2GUsD{ # o>I0]Y *&6C(U POJ6q%ؙ`坌o\bot_*^ 0/ }6ud-C^QEceUȆM0Ҽ=70I_#7 `wO/ <`fʯcxMG j}K''/C[,q 6y-މCy r!= =wjv2KϽx¼$6$v,v7lr2 *z,uU侀8=]* ~F./x>)R/y u=Gojf>aѷSdHJ:tH֛*#l:7tdtrʿ#F}UZ&ƪ2Rbt7&.}~:$<OTalF ӋuD9㘇XC3aC} 9 (\-,3灯{o)Ihy' ;PZ~JH EkM@2 njy?|0U63dWH OLhmg#/K`PQ_ޠ,ǎ-b^})c,Q;BH "tq |I12GƩxwDaqV*-7)up[2WFQs߱B7IB¦m6 =Cx|qzTV`+"ӂ4( ,gӰI/LY4?[Lai؊U"p%&!.As e)9e4zOS}E)ff": ~b2焇f+m:i< 4e86V,-$`z7GѷxJ1uo{C܎%R8(9.p6c3_bs2QuX9UI2,s=)*,;bP=RGfIqɑx'KE O:<kciL0cEhǂ%.D5Jx-_:ֱuf#w#5^Gr@>( a)+O| ʯuc8Yɏ|9H_ex(>0Kv~ɑ v lutOKj5$k[q1Ē;]?r9МOpi =wx~Sz$/?LJOJi_P%Oz 呂RS{[8qnNo۝2r_^[  d@?)&2a ;T2rQ Ez`侫J`KZK'PZِiȌ Brjer'}i3ڛpVoTo= N$xOOy'u7' '?d|>S鴩'@a|`Ϡ9_b)A[&8JJ-x+Q= BVB6nR`Å臷U?ZLa3`F'?vtؠq*@c }Z)ktuî0Klg}8*lc\KؾåyA-豐:a-սN %KÆgNa r\r9dmα0]5&^S_}Ǐ6(|;EB; ݪu@˜G ;nLľy9KbClsy.Z z9BZ u AA }#/r rCɻMa8~e6[Wwϔvx˺ &l%Wπ<"4ĜwNѶF' fe"r ~T5aBSeI؎eY") z|\wȕ3W,k*^ Jӕ~΁QHm[{>h߄w<෤lBj -a4ƗǒB9,޳5liAwv% g-- x8 ]QRrآXO$iL1hݨu{!sޟ 37}uc7#z!gC$?!5q+gbo~j_q8zP%j"WW+|:Wuo~;<ܻ{[bI)ս-Rx^,V+g $-է!-n!xS~E<2QC5| ԗor0oƵ&{?g b|`'z p:YlMHܳ1iLw"Wu y0C~z;hD| 2~R@2ez4{ao)C=)R?WDax0v}hGz f|.Ga6![$.^ dl2RS-,gFQ j 8,4{?3ң UW ť#p,ȳki] ](uH6ReKE0E*l z/=>/cxgh˥#QkPT۪xTu®|A𷀿=}\wSX2*(kdb(AaWixͤoĄ- y)Ey ; Ŝ\XzV1+kqj,'166nlu8"DAin+k_YM o+j?ri _:ֱu$( ҥ)E;Ȋ<W9pX:JkF/Pm+G IOȡġݲ_`]{LN!ձ(!](k=D| 8!_"財!k|XxixP{כU%{ȫ &),B~ځ| )讐64 %np a iC X[h4)7- i;l_\jT+^d ",y)$V:)m]|uE8i6='n젿pғ誷;%0|b=e@O}'ϓaLkJ{O Zn G2KUsljzB*x M1%:k0etWKzIqmL1vG\T6Uec6t05s 6p?)?n`y'R`.@tI:cOe|/sH)rb KM6@R|?ۄ=J x[ڂ¦`IR@ 3zZ?(~4Eu`_cG Cnp=='ZrTa+",TҪ!]j6-:E9*DVP)Xc+_53JRXGm6Sh ,w;*E: { Ő!/N ,L j#a!y/mB汷6"ˀLJ*t\~6֚cRrM^xqNJڜ>,rLG[3{+DQlPmx"M/($؟emȮa[:"m~ .(IhR`vN s~&r!a!4мLIŠ6!T7A- '_KN^X0`F:楰K5C\|(jihI$tҫK~ĞE? nuF_ &jD PZ-Fѐc( h=ucxG?QU5< `]TZcz=eMNh|#?ߞz~ :ֱuK|}% zH/Hϓ#x~!o _zr6^!~-Ó4\0}Bf Ǿ@_PO\|?^"Ї>DeeŻ>OzH VF2m7! 9!C`u7 II9b3D+M0zle9:i/N x-<|ۇ5y:V߼keL-*~\m5,`+=Fk{EkJ?T<ɕxN/>M3<1撕i04\gyAA4:9ͬ5Z#" 5eS%->ڍ%,!MŌ>72#e ۰z忞~Er>n>9Or)eƎ/Xq}Ay/֟aC9\^%3f %#eXtǤO|s-u0_.>'rZ ֹ>>t6)w3=/o 9d;hTRא #/cXI.H9l`«HR}B ߦ2}%+lJwkL;A?#6 U K9K 0dt 9jW39e HU8P2-YSA5IzAGcTum$e-]ʡ"s0o9 ɅPٍq9X/ qhE"]F4ȇ )$g/*許b>X$Kd栻`m߀[Jfb]4hxyE-3ڀ>uArEhEX Q+*>ˆ(PqUgqOԸ{;{a!L(x;H@k =6F9-1śUdp`b]Y h>/#䆙tt@5KE0;E'Sr^5\Ftȳ@qgMKAF S7DAGT $9Fؐ0T#6f,o2v3\m۱sBW@qW6ђ渡_vQ8Ӈ=%\JE4ʘ? XH3ݸ$ؒ7ޮ[fx})߼&b͐_:ֱu$hoyRJ*&OUzW???|ӇX:J+7m#8@˂m_b0GG8؟5 h1Ȁ"">JI%}x߿ !=ngՆiL{ V 7Oe>X?_(A~; JM}oxڂ|ЇTJTh ?' 3k 0AU`/D~?䧠x6=̰0|i2nz+K%~y.o5fuۖyoq!hEY{!$^XfxZ"辠Zx|>׏93(0,?2r :oLƘg[,yE޻cKBsA6'P& #rAcWƿ5ej5HsLHs%m=mk\,PIEl_O]u/bDŽ&'Ud,,` FTSUPR)JVAc 4e?F8z8EN^9%d1?ݼCfa$P#ȳEY:Ǻ\9Q`ؕr?@Sz=oQ4'Jb. kH69 doQ&u? hBa}]܂ >L_.\WQ<jn }ỷ}U@fWbxg, ddVzؐǝ|-:^eױuchx޶BO!d3?@\ ._̷s;qӇX:񍎓o//ж- oQ =3䩦s\5`х׀y( OaNN |+￟~x-iYè꩖i7T>3M730 Qa Pzj!<0O {l{i遶O{FJ}Պd՛e(D`#NH ̓d^3:^H' L(@A!l΁D$x;}L|3tRԒ aui{r\ Ȧ'8 zBfݜOɯ)~>) nAc c)6۱!ߓ1w$`zxa> |x:,=KC@r ϥ4eA.&@E%1 ._>%=y@><"g! IDAT?Q|Vn槕KFf|Bw@洆޷zbs?;ysa ~@g3 3A MȆޒx8~Ryڰx C:&pE+E!ׁ<',zIGKW^yZêPzcM(P\\g 7dž,`F0xuAI)ީ׹x5͵kV~v<*xjLÏڰ{eU|}RyU/wy72fF‡9q?'VS<7lnجS_ϙhǏL42=!Cjg ΀U#G5 ӑ Ef͊:J$ Q vUp^k}z`rT~V w =o ^*}RP ȫ INl2)J1 [D_M6}vmx[-a;aEVb۟)Cty[k@~X:񚍓_HxlTY.+SJ*fFJ>o|7_:ֱuR>'?IΜ9^R '#!ہF_ס2`?<Y fns:^3qڸ}ӻ|7ewiAeĂ]U e|ɨ庇$ W9`mIO}lf`!/MIF\e rSD98l*#Kx@gc_%[`ٸvtd6xCW/)&nK7̔,UfexR9QI/˷L:윜+6cPF LPb(|:/]-.*׹FYA.(|.LVFWkA[ ukϜlyd^vyб| {WWgRL-(aP %MxWdf$y($Y%'hi6!mSQuf`w5>֫Fy-K~C OEOȕ|Q\,fz%î4Q7]k<~X:ֱS|˝wr… #(?=}DukmTU{yǛ>8_:ֱoTW__\/%5LeB,up>aHG%x"G9(?px)SתP^u|'ЇCUZDU@{qVPPS5j^NWKC:g2xiy얉n0oeNzY$iZ#C=X h!o_`.&ȶ" X$L}Q jCfֻ=bPX Hje.#HeyDQ=K 5MvxYQQr^ 8("=O<7Y[ 3E++Y Lc%xu9-P% \kBeE|)QL[*`/FTq(B-, kkz- o.o*? B9憷} ]rb흮O86|7 ~YEj7 Ke^!2xk{ޢ@b ,%%p#d`NWhNps+NO =|k:&V7`TMF>9e@^{}oe6yOa/p+yexAM]w y{ -rrjfx$˾ȧC }bXg!2%>ݠu3F<OCz.Ǫ&ɯk@~X:񚏓/p>ɎU+9GϺCU;;O?cX72oϟ˒L7`;T kć*}{R <"pq2@ ʘРxZ^ _||kP~{oypUjdET+۳qqcWVW( \U;.ҤѯZ~~Rd^)O^ FJ*A4l yw,Kݓ'yi.4;BH[l>nj; 3:#w353zڤoi:L3-]m-+tMwiU[UV olnPr=tq(ouq]U%ƩfcQ!ق]Y|aH6btt~KsrzQ>t:X&v㿓o=Bc1XMp)!}"p\DBG.c^^j`  T. d-gaqT[qYy!?-t%ޫY.0#ct%a8Зl` -[- \KSh( W\ jB2%<zcnzޓ2^t8U7 LLSsE6%,L9߄ b1/d1)mR|mHgNAy"$y o9\TD3>Ŕ-W>Q*# @ %/{NK7Xa@g,QεMۖ; Js!`,֜ߌ ln'tG" 4nA9 ++Q ]֫U3)T 6 >99ӄMaX{MmY/wd[I:7)flm~X&="r9 _X9gZ8~f6&jΉM_FUrg r|eoEҤohso & cWrQf I1fns̶6a4)Ƹu9 ,lk8;c# )+q$^uFnucX1]ⳟ,?bz*U_vZq¥Kx{?A|Cuc?K$qɏ|__G~GVw&:zxh҇HmC}a6do`èqr^T0pi^\!HxG%+2Ir¶%t~JcԔ = J/*Ϛ [0m +n#5eHs$H.asMWOX  )['%\mnW<`]rEU]pa+,oj!x Ap;2X𙡗ܱLr$A;7{D-te[+ xR⍲jj(i'8&3$rcئNfyH0w#c#kۤFg:cCz ‘BH)V]V D{ ?ktfQrIC}(=δ fk3 ~N;~ X ,VBQ&v\CQ.8=趴gO[h5mG%ro3\tVFI`9ƘnD $J$Z Q ܚP` M^Ykt_ ~~~s|Z+lFW:H8y;K?Ƣ c:؎ $^~NX*xZ.fМݾK@~`bmGt@;O8<Ҝn&>3άp t3֗ rPun&"EhjL ,ϖ攵%& C5A4ۍ庡,3e^%cBeZD$+.'4 F Yg{"t7)w5{@Xc>2E3t[H׈&NVjíԸ&>--A`dH }؂ӐIYA7s} ;wpl|j0Kie%1a\6g>Htq^)7֑pGݛjj+9m+眧ƺַy1}RdNA}l.}o!_9ڬɼMs^w2w6u9 O.G?gKxSLIYX־^)[ [6$몍U3K8$e}g\|D%]psHN4$ U ?TSM5SGA?+"C73gp-?pу Yf{<4_>H{Wʧ7ېN' VkҐ"藩jp OR@JXKwP~ vswZ2/aŁr6Mhe1;UNLs6x>߷3Ow#IR.|%E x:_^I##.3| b oen5kfM lzY)uYE a׵k%$]z/f4ON'"}46"-XSuNzmn,aȵ ;]FsOWgo뚡~NHQVYm T_?Q3%EWƀuݰ_ehSYC݆HdSh;%!I}M P|ߍV6lFfMr:0)_t 1_z庯_u\z–l:cɦ T+(UZm`[IWyǠ}Bwڜ4 %9Yl#Ǩsҏ RflEY A푂?"Z/(7-<Ů( ~ [@9rFIKMZ|bZr = g ͈+q:H%'̤wztKj농 g9+"Crl_jrμO:>!MuRAg NtZʨ@m3Jg"ds浯}-/:2_W]'`U_|g<_χ>!4K#I/f6{2o;sLdGF|=$uTf@n|lP[cլ]zY%rf588aY~8/#wl3$xiI϶[C{ BUinns8X;۬Wi()r\!w?ȞB%%D:6rb-esYS?Ll Sh@2A0y4--"H@U1"3"w<ܞ(;p`T#`@Ҷv5p5r~wSl )]ZOI#x `_.c?Y ᡯܗa-޶>Ft`#- ]օ&BO$jR9&, H(l76RFF]DCy4S*(4nW򛂝㫁m 8f#Qƪ w['Uw 3HkZs0>hB$kno[@z͐!!+9n; 'Wnmz͢]E.BB muv!$284m:,~]sq72['LWBWs[Xx-p_;t\9ӆ|$>UfzזYStZq;tn {2'a{p3 =h+g4TA6L`0 fO+͐H M^C>!ksĩ#H L1!u f#~C9UHrI r W)X ?TSM5U3o~kq _-//L 8}k_nmWymm~o}?ǎL??y擧?IN S~xc􈥪(+s.m>eiRq Wݚ᫮s amP`Xϕ_'0W@VȂvDk<i/YYxzgKvKd()Ҙ] `O^` s;/°"h'ړ?KρB4fU!d,bh!YBr)&`yHH%= ,q btƱ} $BdkH $TdȴykdŒ| |X5ۖj|Kqb Dn6h j6Ȣ!/RUvs:E diU_BUeEC.ݰ p|aOI]׍.w,h>󏡶P vauqUf bvA5}G Q#P&sefQ*kbجn} gu2.(<8iJd vW"`Yl Y6,_cת5`< Dn) 98[Gyp 1dSpU&.xz"4%>f\ׁ!B*k T-o俙id߰:8w )@ _yȃ?W%:(WzQR}~`9w) O6yv!=9[>gUڪ9l=}k2MvDH4`CE%{HMs ܕ_:vs}%jDϨV;S ˻xW Ny7 Yh&fjjWJƇ¿y _HJiR_v0xU )Oy ??ͧ{ЃSMu? x]Kv[0Ƈi9Ԃ־ ǁ;Wzv9+%KF葱KqAxpȕ +I#vF,^Fc-$s2Yu1fE%#NL4K~ԉ.;lHý}]g'ld@} R6_`͉R~KR>8봢tX/4Y}YJجcd3sӰ7:ذW\F-yqpwZm+ƁA:IϘV]0exWyO Y)>D=;zAwN_|/[GnS9A#i KI|L60oh;dE=(~+tr^}ff;Hvub]kl)G @`r"4`]5SM5TSM|~_ũ1.etVAE*2N^җrM7?|/A'0hq~=կ_͌)%~w~gj+ɏ{?RN:ŋ^"?coBO^]?a%4  p{PP>u,|%jY[xDHN#CyQuXP-uqյ'Ux/=/x,9u/f`%433{_mU~gfA`8P$$,e cJv`by09mtxv8l=0Z#ck%lA"[Fm{y(ȡxHkLȓ8 =Ͼ+K8(I8ptQR4b#XGħ@}w}xfZU'L>vaRQi 7=s8ԿUR]E;"amRe1NJ,|x̊$q0)u6I f `(3_J d"U>uh/Wd!k` |,bf`5 >@s_2gI 5ZB+qr@ ǥH5BeU[ \ bT]3֯{,;d7ȔC])pQD"͂|G*!ؽ9|m>;kh8mzsU*ءBrʔVaE:!vϋ##RzW3`$⤈Und1E$C@. 0ۄI2_Wq~rͣ.d3Ckj3MM5SM5TS]u0s:x3ۧԍa$VPq3S/{˸9Ї.~zcַrmz9}9_e+wgWo;oy[xӧ7r=8:'^Wg?oyֳ.:1knooO3Qv;YBePE&]SJv7p0>tH@&jh+7-E =Xj fj@V4U+vF4Kd=On}`sT%%ztgqBN zE3U|RD_NJYd(ύ%1O {o8z V(ed\2O\ʑL&m%n@D|{]2 ϐ.!DoYN}d(eYҒ*W GR%V]VQpd%+%{,猑]`װT(AX LEs:mBOÄ. uv&SʌP{Ms6iW+SmuAvB#C Fn[6N ׮$XRg T`d }T먳OKB -vCp`.1 "F'piJf٘\14[ M;z|]DcA]ghCr\?Kklz@w)`k~]ۡ[(ieD' 9DN45 HstʼnLi頁VN ỶgʼnqifWCEM/nmlD$|o}42+5 7(nrtH} -;ǫ.wiUÊ t ^dbXD@#YX\`N{?]wE4VvfOwHK$S=jj䧚jb8Pgemz v~q^/ p2_!{ǯگ w73~{j*yӛxk^䂹,;0ooots|Ƴؖ"7$X7fL]^g%mHe.4IB=K$ K`'amā93FmrtqUdP LDȚiSGmH%SՂH]:@pPsXCJA]ܹ,daҹ9\&7 $EmJPKɘ$TP;QӁR,DQ (:ަ_,a9TM kduT]wrhp8J:tY(`i;KNn l͔vg銵a|N!VL)y_PklCn2`[%$hpm5'5!ֽ/~l6q[| D 8@k쬃2BI+uk|j;uׁy&dNAʶf  3L=_fis߿.3`ZHR anrD~I\JD+6l\Ҧ M$+cg PX_=XYƀm@_ 7" ܂ ) :HQ&iɐPґߞ}Lg _]E gdQjTB-%=(]фJ6йbMԵQX*И6ҹR40ty ]P$y6YrYȓ:W&e*\H TęsE7"H|Zswn ̞ιC)vKX(lfv2$pJSZ 9$riHݵ]mFN,lJ >/bfnf^ڱmw]ۿ}Ӽ|G>dRBD3`Ci8}4L|q;\o3~5?ul{%#od$XuO!69V$e=LN7$z:$Ȏz4_"=0,l˙rE]iΆ9d<=(<ޯaBeJ(fMW5ܭpI5WթyնR>Js Bi6W ?Vܖj~pɏ?Y]u|.x 6nl`Q#u ixϾz$Akփ  YV2nQK;jIג={ƮRs8,+C+*}O.9UqnxJ&lS{؇'Ϩ8Dcu2}'-6[3rP33D >d#!ŏ뚛yyd+@޵X b\[g9՛$1!|N:>d Щ{K~1 FF&#C\aܯXĝxv3>d.5oxt6Bjb,\r;y?ELf"m$d=^Kpք>mл7zK=qı#3:m=tPaO$|=6 \ii=!?W]`2&kzZaN|[Vb(躻 Tb;hڞPr8p0i_7'&ʖmIB{u|PW8nt[Wr;38 M] t-:ʾdhKÎݐ?f~Sd\5?+HVXKV"վpZL5 bseƞ6gt'yК\WfjjZ_ oxr )%J)}<@ۡA \0d{wg<[ng~W(5kMze=o~3'rRAڿ}>ַkfkҕW9ܰsw^J)=8xXƟ!+_Jnf~W~옞TwZ￐3䓙6.n'lK(y>:,[O\ k m"Uq- Uڙ-WpOPA.n. `юVXݾRCŬ_q[sgIֻz~iX8t?]v+   jG G>bQ5\g[<ڌuԊgCOj8[r'=M af1%8 v5LtjRFG3f s!qpL uM-ϔ`3Y3nd:(WgrL݂[ v(]z/"(faHV1@&!faeVyDT=SE)XB*@{Kd'W|w%t3A><6:!/Så[ϵ>P[SvgW=, d4啁1>e(2* ;qk XXu@ښ\mef<-oWKd';NdH>^f];<G8!04'ြAZKyvUW}7H(Su+^`*~+R?`-۷eSedXE"e 4c y_$G 6ix{>wC.:H@׃ tJQ_%,ǎVF5Β%q\V!hIjʃԾҺgc$C`8鮄>E\Л2t߁MF'nA dfNNmDℍsN"*K- (^`vuUw?zZ=&@jVqY(0(݄kz`d:Lp4r.Om7m2轑aB:u[Q[Ά0@3EAt&agZpJU[&nR6}c/+ew~A!- -mc~菸qO":8%[]Njm**W'$! /@QX5RcUA$r{Q0}GkqhplƀO&0"\P"ŔGZ3ֳ*pc&:[36A/ t[d+9$+W|{֨ {odD誯c\ lsY$?3v_=]XtlkRDTU|#>eIrYX!no {f1Ho 6ӈpy{1t5#w !a.wd̡sYB뺍9;!+fu6!Etiڥ eG >!*q/Wsw9RZףJҪΟUF$/R פ5ڻHbŁ)a漉>+9]Ԇj˾\ZYΰN6{_\Bs쯌'yW-ዀ'%EΪorB:tmzTuAX7tl)L_I ُ1 kf8ݲ6 YiA@gYlv&;D*nBtR N|9-k 3GdSom`DhwȑS=jx`d}}Mo:fmN`lW,P6; l[[9q/~y_O2 0F.u_]x 5oquI4y,_tC:v?@Ƒ"gΜ/9ys[_; _ _Ƿ~w6t MAn`RG=>,]:(ᝐv#WzMr5AN&8\dt ][RwbE,*Dv;*[mg`kqΐk2Om<NZ-(YF2Sj Xֿ)Ʌ%>cV!Tݰ!7FՑ&UpWV-B>e{qoAϵm HLկʮѾFjMgR(R"wMT e>sj8_Yr ojxGzjMmXoQt@m#GP]J'4#Y/NI LAG.~!%k{M[isMԣ&j~-[4{εȝ>@Ydϖ7K YWFњ 1 j^)h u`CռyXzG$S1W֏v:Zeh WZ;۹-uD9!GTWLg -u/0>Ml?U`C|?!5SϢ6d "$Z_{9`8D[S<"9iqrJcj"cpj>1C:oeT4̥$kI({Ji''P`K~>x"n GGkN(J ˆ+Ͽ4.czsﯜIO,$=|&"R ]|ibN/9(W)\`2CD+N!68yb?ׂf3K-B8 Ci|Uǚ͠b_sHl[&OYu8,؞aDApFM?#pJaœd\3Rh`Tj:'??mvx2fգ/G2?nnn/xz6P0Hn}}?>o84EթᖈuΞnTo}ʜxR;NԧWs4N[_Oh=6pk=RqMuqN(Yd}z]ر^qOUyVי7 MWy" Wuwݷ.G8݁^xF=j*^LAŒv8 AR {d_m4C}3o"˄ zg A4n`$ U^ēz.%TSEʻDzv HAAV"VF xN?AY tC䱎;hVP b،:^HֆRQŻy<.X,xPUJ_1{e8񵱴_w.ߢ4^;V O#'ƈ;W[>& ΥJlZAĉl=z2wZG< j 580߹;<sT8NҰ(3ի~Ȩw+ =)#cH*cRPt0 sè%,rgAX&J;+osCR=R= 4Rq_OJOx3Z=G8!oC\csz'_qUV# zQEK'A $'$l2wT#$/;B&#IaR/0N71y$"k* !u X+M}^z KyгbFC:ɰ/6!Ȥ07n%XdJWP Ǡu#RALȤ3|Тqݝs* u]~_Н1ACȥtls Ufh#K|KOe&gXgԕdS磞{})3c4k jjQ_/9? ~1~pf< ΗRzP~ WDs=z뭼 o@U.=y#D@rG~q~uo} ƏSJ=>&kw]wIQswoxJ{LT]nV^җ84 m^@~C?oMozz.:LgZ;6oz"??.k0eʼ ^ܳ<]}`:T/ 2r=o,; 'A aO@tab]Z=vm\:ENJÐ^p"SrK8i〸3ZBNB$E6MCd[@Sd;K]\qS /VK( N}`B\q;ץb ueةvaۻk| _X1z_BzŒwgE+k ~}4HZonֶ] |6:!߼k9[ǹ#|f CȞ 80~Lr!y~^}6xP|.UᗎJ#t&9ݑ+e]?l i>Xk$+䬧Dw2& `O?"N*aB<:~\뜶2.!`rtX% N @JLReARdQ$q"[b tN&͍+c2s=V2/zU F Hr~BƠn=]z%uE$#ۮ 'M~UiYݚs}E,R]L2(e+ M^W2,K̾pzߖ Gʒ~}p~Ea"32XEr4Xw6Cّ+aG>j9!}֘2ݹ->i,Yd, rFy;^SrҒЕ]1vHw=3ʹrbrCôYHwBHt@zTaqyUn 3qz}vifN18,pGB:t;Kn4#!mv"|82գ]x+_x,1q½7}7җfN}E 1_OO|ߒ ]2rfE-ƌ2oi[g?Oa&5A6nX|(n5'QdrBmA<6``3%Re#HChqEtگÀTw-6A{[]|݂vJ6 ryZl`i_Ӏ!mC`!.,P;ZK~X^}eSU]'tN'7[NTvXz]@K2eE @Vq{RJ8w=)l@'d-9IdU ڑ58ϸ =y%X^㽓qmuTu/G/`eI3NB(@t.{{ l`m­@/I:l}ު@ʽ(}HZwŒuWtKjrW'N3CmeW]!X JdiRsğZ e/`[91Ḧ́ "MN,tMף~t@rq W# X{ \>9ZRv\+G󨛸 5q!G<ƦzW?t{v;P3t#Yb= AϞy+G)āذNI)2, t3͕xq$ cip.aPb.ffn>}Y>YY"K1"g>Z!%FLчSlߠs:zN=Px۹滗c%r& KFCc+!R4t[8`vo8ߞ1(F 0 IDATX| cTゝk@3 0$_LQqק4B7SXkD% rҰ]` K BY%LuYWw14맆zO5TSM5%Կ7y{ Rcb=zx=NZ'>'> 7sfkk<9|W5=ϟy~ ` ?z0G?'>w-;?s9޺E ƒa' qh MvHtbw3HD2#ctILXC/?(JZ^ x)^ [k}}^3yZ\;/sGnb_wclqtK7yα5fwr///sSS?n1D~'_i˭WC'&O% {dieaB~Tޒ@6i$HfM3xC9a!{- MMS2~lϑU5}$]fn3geLI;fY|a gRI 9ibU6o Nv1-=H'xJw_(l(t4(vHt =lq3!mC7j- KG37z\#Bzx Nx cM !h\ S_m#!k[ l)he;u dpB gb DrHA=+L(M4Db]@L\SZ@R"6'$-lH`L ޗ>Ϣ ʦ{ pq}JO¨F(B@7K[CO8v 8 2*~LNXO:rAP>6iGW4oszOVfA/}j8%Xͺj ;9e[Skf@~9c9y/oyы^C=42fv=&a1W .77Mi[+oox|7b<^]z׻XVٳ}㵷ݶ<(:NwσhOUz~X*0iO{??}e~>yLJ3/C~E0t \C)ɞCB:=|m+{w:0eD+'^}}PUJL _!ǾJ0l;$K p½A]'x-ik( j`m\pwFiga@}d46U2*>=&[2ǯ/&m7:I; ت=,_|} !K  gi$d K< ~rDyγا oA}sv]Eu~Z㼀‰yZυWl|_gnR}}Z/#")ssJr粗ER4I>qd_W{>׏:ޡQt6;j!_m|uE [cy(gJ'Nuum]|!' |Vke3JҀ:-ZDU8/KI4#%Mbi$6lLir͘*땎?tI=lr}uK6{GŊRkԂql[?h (m/zX짲BGB-YDY?us| 6g@- vbc֭sO\bi')Y… yOhc#kG΁=|t3c Ϩ[6B\ύX9c9D6[/n1۶7_Ŕ #0V9}4O-oy[oO|"Y,/iyޗ#?>1DӧOO|xrcOOie?M~#?g><#"';\ڮF_?OWu9_\_칳߼(ZMM d, okek'SGt-Lj!a~!H& 'O:rA\7>&wAaإC&OMUДL^,v`v jW/?g')vhI .}bL%kEHK`q/tl@d+G6Meb%DkOjz~pqH 'shH{a r;{0ƞKJ͂=\VziVuuOC:ݿEt^v@A_?٤łoi "9n| LpNG4w@f> জ/{[0XO4kAd/_o hcnz|MqδJ&hgѐWFs늓o/Q`1]HK^.b5C\Sʙ^\Cj yP4e;& HHYztѤL6WM'rT.?N{nR"[\f "&Iaۖ$TfV|bmTFmJE^C!Mvrl9Fw-/"۾xϏ؏= ?j]_O)c^ v[~ѣɰ^{`*h+tIg;ESGLYUo< R^S3()5{>9dy\T˔Mfh=a{šs@FUT_MΧ&ud ZL5(5sm?a{MIq\vH;x 4l٤&؍VAnq@(t%4Alw8Xq,)y]#nK"([HVj0uY ?7'񼍞ri);?e} sm҄KIK>5JDAA*_LPu?Ԃ\??c .doYx 6gN/i )}{{+浪sO\.}qH2-Ryd\lU-bׇhw$悚QVg>X(YdKv,Cb_4K54lr}{zUFaYpZӜ ˝M![ε YY9[҆UP"p-7Hl,9J}cܳ2(Ssz ]f@~9c93o~i~~`l pUǁMOy}ǫmuӧ03 \.ob1d\wXbZT@~*=eW{/xﺎiO>=7Cm[gYܝ{wiۖ>u#$4Nj]ww~w--g`:뾎#6sTBi{ xx rcQPm@ o$-W%3Wl.i5AEMUk9:k9'pޑYHx_ 诬dd&#;I ` iқv)?皌 8ȗ ۨXBoY<'[C;GRəxnmq=mb0D16F>OA> o+ΈňAcqw}s1s18>=7<[x6 єѽkO_X,( ,iwAݟ+/"t]_58{>恁U_jPc\nkрaJ4y[pjyً_̳S]aFf~mvXTuPx;^";/{k~ͽ Wsp ??G?ѡh\;ik!, )pɒSp"tS6HV_Y`bd *<gd+r;r2 >GSP*_e~%nЕ "@ׂG,KF\! qeUIwI 󞀼tkAÚEVj'df#Yx&ʖ_l9U!A Z:/;/׵fb@kE |,i<zojc%u}7`Kh MI`) Ty\*=\q~&yc d{.OCRlOKm v8q{NosP>j{,..hб-< ZH9n2x^Adh$ p  rkcX@'==](jZXZCrT3D~JNg7 k)hd|j|8A;.<s1WDZ%o-[ ^Ξ=;{c^SVqcMk+{ S) Xekǽ%y睼/<%/ww؍Tru+8_;[[oq߇?|ϙۙ9?|SgϜ߿MGB<|g[Sm.B$༅Z0*0F YFYiRʵk҅.hJ2=}qHLTɑU5dL:m;#Kl{C$Jȩ[ 9^'娿zGx 6dYv9z?kkOT}lI%ѐ}J‚ Ιr෿" WR߼ǨRTw~0)`Xy*#,?Y9օn$ɍr:*Cq'Ǭ TR6-`pMSoxAolkkII HL:P(,d0 vNQ eI˄?.1NeRDF sͱv"t&-iY#cjJqJHZR{5k")gNjBagAd *_!?wb >x|֫ (+A)y ;zHz ?vY LZam:Χ,Gº Pj(&J -ecZ7(侤\&TW'sRQ"k%0xU* c%LףRfQXY y⸪۠C{^WDǫAI&fW.ߗSOsSzԕ:4YҲ`ޠrʉu&ˍ!XmY ȠPw e@loK, =~t}:_ZA"wxiV "@6T='yӇ =~¶+.E&{Gdu;?9c9渆|w ^Μ93ߤ/@'~ܦ~̞iT[I+0+]J޿+;T!q__;*E[A\udm1ZYtxEAM6:ee=amt  ^CV0-|dH&EyLAk=|_e!"=̂ A v01$8Х|hkUTgžV{~? cà^k,C{-^ʓ Hۛ 7(ȱmUq2PT 0% :jM{[=а7,VA)?A=O(Mh'8$'h(b/ q 3"wzoPużBOϽʾ-?_\鉢V|Z.(MYbn?ߘ}TYI27( _ۇ:9?/gc9R|}S }1.w//)s};=Ju?}CQ^W|}^\ Ӟ~gv _KA '[@zHxIDUӕBkF}RB>\ [Af{κCewafYr{Y S0UQ~d [wTbt4,h1%fiaj4x4g%*U].C, ^ 5q* \9Jd/BieR97 ř}6߷p%C6~_*Me&=_{ =, |dX0\<&% J\_77lS,B%6sdCpMR&=|dڈ4d!"Ky(BrPM /7Z8<`P4U.MCtlZd^?bP7$ኔVX 逍S{\Iye |A 1 5܂Bl@*~8:_sK2^G/h[:H6DĽZrM}DKGOa-5%l˾2\A `( X͡QVK6tЖ=N׬iRy d 8TըBĠpy=+uaqp}54a*KG__~\}^9s1s(37wWU|Jhjc9H3qx]wxyrrmu )xx IO_H%z Ll=XxȏV_=`i5\քVlaGn$#-L i vآ2q*YhvY!bmVk O㫋X\0u|i^]$"Œl0IOb^=}gw|X_26'](S {;iN_i/`/yȆ:$smIxP.Qʹ XlA*D ?)^&khR ^ϭ Yǚ8Bֆ^hF\@U)ZS|aR2?Y,^#><)UivlN牄`#a#PdMDhk!o!%֡e ><뒧M$G EE(mN+bi{Ddžeчj_ڏ}чc@l"g5CgDۀ!~'caK&ÛhD25'!vm>pp $ }Ms o/W/a<-osZ+"Q_o5[E2:$SO EFei¿^kDn2 ag3 Ó}WG+ & !; y ΟfNypEaaW[C_(}'#iZ ;mGSl{~>/IIiߗcy̷sP YUwdS7Řd^Ⱥ|^\:|mw5^ 1n eq(&op XkaFu94ZjJ (o~ݮZ A MX NNU><]y0?P$8_rm˽Ԗ*Ž<(,leʾ}A#T{8v0bLΡ }֗PoL=ib.pKmމrR4g <zt[5#><=};|E]*r}N6vM6ny/̾|0 TT|Q#Ov_Гo).kR#H $$1uѵHq~?FݙlPL]P>v(?dEm-:ueD/8 ! q tT/cMS lsX[3 qڱ@ރ9>)o&Rɹy# b(Qdep J^zQE\%u/ηߔO/yO}lSr*_X51QVqRh@sUT0}s=2ZU_FǽOYܼٗ&KδltJi,4FC$;dZc2UՕJ@dbG`-f(^cU>&3.>9&}xp=5ե[EJw},.JOoaQaoZ(ƅj.8:o=Y}(ODPhB>ON j]WO|&[TjЯk*Tzda/=do8sz ̒s1s8ȽZn~~`_ʷw9"=Ljpw7bGeK^7~7?hP @)td@MQ-" "!hI^iVZE=oI"9& JF"ATur {=)4V~߄ /?ſjkmo̯b׼@$l??jSPs-s(QDMՔ~ji_x=j Az j5e)M:0TO *K*j2 tG DۑvI􎠯+ez@ŒeV&CbsP8i2_&ZφL)>7Z`/}pmHZ QkB1@!CU x,9[`zˢG(;$_e+g?R2~oP@qg’Vk@$:FJXܫ27Nq͂QIls/R6{h8U ܜ4csJc^S 'TU & Y1Xø缻$RL=V5Q"(R\,GwګW5Z4*r=|?p=_ ;arOxS.Ƌ( Mη7:~FO["3C\#LLxy#k漨I?~xb6cD!g*] ?rc9Q/oկ~,W?B~Sj#?#˿Wʯ z|,i- \W#Yh&FH0UeC + L~HO9Y׼vۿ~Σ!}qhvKkkWZ@rԒ|:( g{L )1Z(gA `IMyZ <=E3{lꃺ*UwlfW"sMɤXsįT, v 4ĿX.K f vH_ #}}LΓAJ(6P8e,d+ &p^wv/J T(0KK`{F~rA}pR5|c_ ]ʒ 8blO>sm]곾V>{*8?yk^3?<~G~;3;3?y=mbf} Ļ f1fm-Lx_BvX uMiw`jR?.`V_P`޹CM/0q(K1IT \C6FsEbW2' `'_EԂX%1PB!Vz TT 3̢;{-2RwBY{rc>aiO@ZF(`HkvPDN.f^f'RCa̖if`tNLSk5tT%q*3~" 0`ӛ U/QcPP_@^s+qR<*{\q r@ma|U$u2|:G+ ο_,ͷIKe//NϟI_dd_>).|~۶]P]$dڧ1eQ:y%YU016c|P$OVyvBV\"\-HKC~Ebҋwe?t/QJ'N\:MZ}PULxs`%0(%5?NYNT>l3v}~4ZP' ף*@K; G׹OF>Oۂ)Kԧ;(tAu$+Gۅ]?Rxz,R Vs<8JeC '8M}T߰-sUWJؗPϧ-H/>s0NjЇWcom krFA(a/~{ RѲ#=AvuГEkUQmͫR^ԂT_%j3Le,\x%Ц{頃f]HV;ܕzr:Ԕ&%TO \)t?X?Bx뷯JXX..luy:^+클vgh~-g@~9c98/_un-ڔ|&sq$v6|p0nј?v^җ(st-0M_e{I-MJ ҄yEh[$gSk/#YQ p/I\8v ͎GBY*O4KzZ\sJBY(( as p3t6SdԤoᔄgRN@Y;U?/oOTfOR?7T&ւ:/Yo˚# " E޺;i)~ۢX$KRY7rN)NZ,&ϙoƱfGli \+e`@6+}*޹d!# %s,yi"/q-l^#7 kdQذP1_ 6'qêu-QUb0b7i"tӖ- <ڲ Ƽ IK! )c$5-@P-[3ǭIz ';z"U/KG*ȡ-KDt=~ȭc>bUUd׫nB㱞!qOh'(Y dZ| A;Eݱz/]-o`ozH iuc7,?6,s}UCYƲ#ˌ2x_"l X( 9v0X1`ĽB&EvQ1ۿ߈|Nrd^QөJ}~q!e{Jc(K?˄^\zZpm6v~Nq>SB"BH{t>p)YzBPq@~ϯ%8sg B:08ʔ ^<_}__mӑܾ {5͊orw?#o/|1NNN9|ӟ&//}|3|sf?W'xZ'*6Mޱ=&YTa0w(RV~cȭK킩zRrRs_](ilȰ~.(sܘhRH- E}̖#ez#kY-_E*@nf)sH>TXa H0j-=ۈ;LH _ǰJaYj4TTdQtb"^8ĚurzM~ Bek1ߨEkAGgǛc3L^F3\ݲB3uYl}]uR7' I>/rUw!ʰ|09+s}jHk=aܰzNťutrFgQ̚EN 6ΐu}mQ X[Lboa|/>0{y9~޶m9IE]6TI}@RUhJq? k]QHX[r= T/R C@o &+wno5 GT*3ؚX\s<0z!gu= r}ݟ2w-#$wOިێ[ߖIgv:75_-[-kR7'x_ͪ@y ?wU="f/dر0=DAc}bm{5%ukDm]f{w|[Sc2W7BUsI"3X"πs1sqSՀOČٔs1[ ױ8??<7o_A>O|^32J)J6L  z-gk.GO(-9p#-X~;;- 9JrEK,ׂS7Uhd_YOf!{8B9ғ9 ; P~POF@le E#7D?󆾮p*P6C!9 lI檆P_J)䜛8[r>S!*O:UpFPKޚ-huXPV-,H"@jn%:)WmEڼ%ўgEeˠ͎% DuY@dDv͊Kۤ3G2%mc+XSqd1=/Õ@%k7hW|+et ^랮%i&RJȪ:_Is$,B $XVO,/6U>Ԃm٘q9j+8s>-H´T=A^Jȼ r]q\J!qMȢ>vd{Lut7?o}bcHT||vN՞SQuzgHdž̆eM"=/F2kyq6 kEF:s%KJ1`2UjN'ڠCcu4 ~g<4ݖzȰѻ6E Eزd+"eU@T-Rծ_bZ J1Uשz  :'VE0M\U`KIF Huq XŒj^0?Yj>K@p%p7iMtDQk~/'x*[PlڴI5M~,g<0?35> 99-aعHtH*68;~{DEP-hwi&g#F>"RmQwks1s1;?m?/"- snʎ9r7WqxO/?w}w5@dXE oORlQ` F÷ݓ-*sV-VM|A`哻J"R˔Slã_*ɹ vL$ܟPC̫[@{ SyٱeJ*P*P=` ǐnY[P9ea=AR_sͳ7T-SLylUav'w3yDmbE  \yOFOޓI;Gm]XUMJd;Է͓;54AVҼ.)<%Ehs2K4MyjWlt+AaЏqD*-V:к_ mMһ"`rZ(#N.@k$$B3Ba+ ): ޫkc_1俙OuE:Le[MpF]`>k/JR9[g>7.ۏ21T7(HOX@DKR#|e?#g}mW?${n#'ߣ ^gp@&vee ڰs4^!CU m[$૸m8Ƅr rrfnqI1\8U³g8X|cKnYBnr>D76+8(.P] Y`xmqIv`PY-yLZkׇ}&XUlY0lpU,k{!}MuE XB <%@ƫmϙ-zC!Ms+%ُ?Wi7]5,x_`2"l*1$[I `xW^\} va/!=vA??K=W2`YXpA)ɴ݊FϞ<=_HF>Uvwrc?G8?5=Le% V|c9cw<?(ɟd"0 crw?s\F^-Ko~E;RZ!VyZ=)Ec`iW0'k`װzzNVʨ.ur?TScW6)Dir:>56f`ephpp$~>YXij{5!>x!xL!lR#9<" 0X8< Ue-]@{X\ϊ\}*8kL8{nm^'d#r.2~~q #{Dmku۾}1]}g(>g._3)SΞk w\ 1,\jݘ2I?U}ZD_ TۮT;yk?[K8gmM}(Ol9 %׀W &O~_2[E%(:.q e(19{:{HOҧ}xZv7W=*PC-[*$ΛRP/k Z-jǥc\M&i O4}=nw; Kl7;P}c6x׶P nɺ6t{exS`HcBEvl*H%_S Px۸I5!IomZoͶcRNA 6("n3SoPJ;WF]1QU \ +߈zb*Tن8RX߼o8n-[]ou-l~n$d?˚ AJj$y_ 0Ɇi/R{=S!sHJ~&N{wt}IU+nV~BCNXT*,@9 VvٵgztD!·-d/ u q>rB% ~BR" C|Ҷфlлa?@ґ!!1qXح&іdɲq9c9x8S黿ooi |Mɪ9 g~g憙+'?IXTPƌ<ԑD*t8kɎglHdRv@ [R) =80l uvU U<\91UM&i HW aH;t+!'2} ""(;LrZ`B2f702 Yސ"mpyӳRjg(3f㺍5/v2xݟ}n IDATdKf?K(8>k'ft^38̤ͤGWA>絾Xú0ܜ mm"J"qGM\4No8%Eiw.!찥:d뤙}2 Svc2˥PlmSMȲ{)vv} {VPm(wA]ӊeE}yg@~9c9r[Mkla0&w;K1uL9g^}Ucwz?cfm@rȐ> q@_.S T'qYq<90RX-l7k,mcܐVŋʒ'ah1jWa&ޫ,| ʰkE7%XQ0r|%%RI5x.u}¢!M pJnYnkF8t3Sܰ īg@{hI*:;15 NOʲT! S홸1qLM69 Ef3ދc| rۥc-bM_(' ePp׿A( `%k-@WG`wgzUˌM}u;7s1s 8P_o%g ~9ަ XG>27OuoF1Ɏ$dh[ SL> hK;cH@=8@ 8dW`vd}K y+_| ƙv~|FBg;G:g!9pĘbĥ]7(6zr,%zFǞ!_ +zċHswqsql{v 0뒣)NջAi6+CV Kj'U,@6;1| -Jg^>Rʉ‰Rܠ^mKoMLjMb󫕵S: ;;N΃y({5lx=xSҵ@=d(e7f7i>di혙1>YlY")!C!?!C^+| ZWJ$eiH!{QdY?U럃yLS)V9/++\_Ӯ& QQ括wutqÒ$d&r+0 ,Q r}M|E)\VeGbc6YYå;+sEόrU'3Sn 8OT%`ET!iVui rnRǚ}|>m-r%2ְMR?Ԣ { ^[ִY~Ԃj#me_?aCxXbJכMT!C%U"|'a!߿P~Ig"Q?8nb=OOnlopq?wWqI~tA6EO|.KgxJ5`lt2cxo e`1&n@|;U"o=`s%]'8*IEJp_(pO @z:Ls c2es%XZR_(qyAWvqpɊ+Aj@B?@oL4>)"{MϹφ|iKI&$DsD 0(P$'r`qrv |i8G`Y\<e [gC1wx"ÐYlzd-#I##"s!$G2!e1BwB0E0Iޯ*pU~ %nnJOYAo֔;H˛FCT7 "bXBypЕ@ۂ[LgN2QGto,R MEI[Qcѐ |v%ºH2X/wN3,yʉ4 Mq+c8GnFyTȈJBLF,)׮eщ_p [rؓutA8¿ӜH-={#ekKգxހ {Qpe/*^ȯHQa!W^LmER/ /~X z(W8~VMEcuEЂdT7FrC!^*[C$5_Ra.]}Zx1),6)UYp˶5"QZlz%?( V}c1<KV_Q~*JAj!(1[p0žʰIbo2Lxmis ĹO^`p5x xmAE+H{PGw+ z\%~,+e& UCtl1Z XA4n?@P e50NAƯH91­Do/֘~RBa!3]'pO(9i}3Ӄk1s1s< ~?gwQsb1o+ȕsfGſs7gW*=! Yi2,\n(WɔbbӻԶYUђ\{9a@&غ.ť_";t/xnY8X8#HJB2h$,f0 &Ui d|N:3\AQ-$fet^sv(ءLeo!9Ԗܟ<-1C2Zl ,_gY =E;uʱJkLO&XyܓbC2)T@2XaAyFͿ(_PxyQq 5[SP[3Y0u a}hJ ~ThI{?a=E-oz;uFk1KeGAL V + FRÃljT]ʦ[zjyM]xm>k!WOQ`G&.:z׽!l ('F9+ c|eOui?si9e `2a.W̿?jkl}#کJ]Z2KE_N2ؾ6%:O|NJ;V%S!]ZO 8XkzU}s,ܪ@e}\TZe9 U+8>|ax^x2Y ǁ X5N^'䮐f w9`@oҾ dO\_?2e"`?:bc9cGE; C{N)bw+ŢzwF]2o-HF  ) KchF\=d]Evp1\[W6–\ٓd^&ePHxR ;p@^WUWy/Uq I/{ΖFsUPYd% EJ0& s44h3vM7Ю''GI.)k+C {!('c}:vf$E5n㾟{t=]롃/>ȋ ;Ơ:(k\*6b4J}\QpR7e6g&_L2Y_5+ڒԬJe>,KpGt)M<9|_Oi>- m )`''\{wZxUq ʕ98m34)oF@*Nߚ$߼; z|J2g]Ǽv|_A>fx ȫ y3,D-x\j?(Q^;dYa h*2UwW9Uֺ*0N̬f:΍hZ[^l>+skWЭ3aH? l\=Pz-%x1xdXeLj5o 8~-RS/]}pPл%v^ rg;(z:5[iVRC , [K6zGB}cnoYπs1s4??0Ͻ{Ǒr~l|7ܐsF(V_M_?[ϟex'~~>¿^TΒL(WJ7FwtYvK\7)̑_ eϓ"peY:E ^Kp&PG`{x. _{'MTPW*A/,k Dku*W ^ER}U/ħn Xc6j,f@΁G8H}5)z[c(Gl`E.@/B)  6%}>Fe4=G+sS@^^x^Dֵ+&jABv2!e]}:0F|~_U.ݏPH`3)8Eݖz;UT0HM)Zw~v]WmY .u ADꍀTLCbRytƹfs!)wt)\4W/j5ESJUVW +Ci{1):4D S@O6yֈߓ(騩xقԻ< =2+Х4Y~[M>V=͇V_^^48Я镁SJc#ݭj$ G0̋Vo%_|Uy,#Fv쎡8_J>^c Ln1Y爽3hĚ`N{xV|W:7PO UP55HEbgT@,=}J{GJ%^' ^ג[ m"cPg=T0X'nC {Q ȟv-s cIͣzZS#7 vӾ1c}KHŁ\Q&b[!Bmbԅ(.%/1ؠPlW\j7,Sg}5`v mҌm|'fWC{[_[P+"pk~l}$2B~k;v]"P< ]h;KrW_cqIQ"b &6[U)/Pd*X*$$IC/h2_oz [)V}(+ kk.޴=ynb9c9x6Aǁ<9?aYTR܀s98i2IO||Cs#??yҷAeۇ VHB¯Zλv!"=OTYWҞW/]G߂ e05W/^H6W=ekWɺELΦD_$LX)XKId}5k䉘(QvXB_aM¨ &-oM87!W@ZifIx+a>G`gZpm&QO;^g:֧Rz0] )l6c %?g'*pOy ֕k,gRAy#߼z"]Z? HBX*ǣbksAa!dYCAέ}̽n`$d0=.t/Ro4 }iV\XoPW# `b.Ĝ [f7[lfL6*֊` ޢ 6`2P?LRERad̑U%eogo>[iOXIw = Q]fS O(cܨUbؙbnaW;])쁮{e?2n?¢9G׃B /^bC;lmz= F; cQ$xcnWv|t8^Kemxq 6.bv{XmmV(ARi\!+^Jlq_,3A;(0Ǔjۖ 1W@RFJH1,bNO^Q@ vA IDATA ~jݚҔVˆ@!FQR,|չȖ}״3u]h[Z1M7wU5ClRgi؁a@EJ~Q€ыVrd(ה@]t6s\K}6Sbjw%b)~ ~R=QB$εBرg?bBu h a 1!+CW{Rg oSs^"hO`;;ϝC/w.4ŖTۢ\AÓzޞ9c9xAx<; /|dok9x\XJjxfr+h1SR)IIAΕĴ yR͋jwpgOUء'YVry$]?ף}I3 y%_ H @FF@r\$dS9е6Trvd#D\EWg`萨j kH@D1L$t^,p\b<!yesMI)H `k.B"LF>-u\='켠g r z ,A5$ʐ gɅPnj﯌z9,1A ]fLXA E;QIH5&GglEQ@$n``=K^E k3sOi Y LLzwjxyfe Q/|ޭhx2n^c zIZVVwۻ}Єk$=(7?Z!@@6X66vvߔ6HQHc;/{7ښ6~˔vXpa9Ue*sq#Oo7 XU[( 4JtjEĮ;kp%3߫F %T@ tA29HwӾrU=ftU,o,^!-N\KvK H \Yv}{c|K`QݱT2ޮ!R+TZ`ihfkt.E֜ lI{1aգZ1ͣmq4mI{ūêvb}3:43|7U^wc*-V0>*l?[7 y3[,ܼ[ɋ3,M}:AJɭ}H5Z|ҁgg O&XiuN!mƗu{_1돚[PɄb Nb+^>?U/=\;Kd(ICg!)6v7J6 `YR vazv-ik7PNuK=UV腆]EeX %D1T3[eIm,D'@9x5Zgk}#яo{99*_9gZsrr27|[o~~_$](hd1fd[K[64wI&5sY$Y'= +m>*0:LUGB7/=lrdY} r,O3EH/r{[%gVJVB>YVsSW!=rx.xh+Fz9#%ӹ8hrSI=WX:ЦWN\St i(ۡ`a[Pkp`^#_d*iߘ?pclεqKo79W5ZAKAV&0}*v6 ixGxcԩL<_{)d_+P\{q.>L¿]1VV6-P}WRmJҌ:墫v>]{5GkS\8[W%+ccK .ʬ^t+OvJ]sYc.Q=Tu*uCKQb(H i ~i~Ӄ/{Ɂ iZ?z߭I>;J‚~Z } B6 |{i7!ɋ@x&SĒ4<1yv? b*EkBYñUI(ab/ECAlzVtap^TnR++{~;O]U(|%0xV}ulϋ4kE}<^PO[`QT4g #`;$!Y"mb;nqxb^c997OoF~'~k9$rmJq;~oV>47\o'y=Y?o6!w WwURR X&j\ ]J&5;ˤJ i yLQ\LS/r0HYef +R S^Sʫ}`i@d $%ߥM]ұ}vKȑmAل@t~Q>yBV 8Tfֹ=Ӧ>'JyT(~Q/By)z,Vln&4&X'OADĜ[e6eb٧ǥX4mI{k0%e ŶF7o254ǟFwix*Y\6+뤨wdlm_{w4@E@+Ԩ H[F|G- ^Y|6DQNJmv{Z挬 4=L3,3i/3CDjӽr%X%Q&NqcH2m&߳p"mx޲ݓX{2&)Ov)-1m^ ΪRƫ>2[G@Ze"$g&p-R|4np+#`OiI`;:N}#:JTot}$El7$8~N/#l&b86|XzS)kW%2.-[NWYN9sZ`t VE֎ս%9#(=<%$jTl\R-I&$,ѿbSJpKzxeb8PY&얞3nXwU>އRfx1_H^պ#zesAǂ)p1PJqaT!a.uzr"dq۴qpc~QLIgQOMƊQNG8u[S׀]oH ?to!-+Մcd #Z krI< rhSЙi,.,\S5DYSgBK>s v! X&1Tf.Ձq1"YD!ȃaB/.p@`PJ67_np)k 6FaM2d–Mzon_d[ϱ ^3F.%{0⒥kz1$3!DqyƵ##0/r 1#g"uPЬ%w_^[^hu LoMbGI\u!  gxY e )X4n?;fRCk̕ |C-c&#&jHor ,)@)s VߪR 0."9LːXCltÄ2ଲuH`:Ps-Pv2F_qnA '˂q4t7jҲݿR{MPb d`0t! $Q6nCE(%weu?p+W_?7tmn8WjeotӄXq^s"ۇq B:PdEorf-CRсt /> X@3{0'(!l4VJ(r ْbM:aFW߫&CRU(Sf]7k2$Je%+ƭlAet埥upV"es /`K}a<b 2Yl 0B)ڃ9n(9+EУES' ^+#|fX&}8H]ER`" KqUP*Z`>{C^ kƆP(.R6$^N4UHeib-Ίڦ˪<4X{ }N(k_O|=KA.c<pt5&1!}?"mV\5ˌP[PQIJΊ2\ IB^91~~5_\9k9c9x#gõWo~l2~o滾'?xhwe=?w?;1̟Nן'|`A`5d8Q8*zCg/}+ +m*] lXRvi蹺kNSəVgb$2KSZȎs'NAO۶U1{sQPc@[~C &F b@tWQemQIu:v:]ݴtUJ4E4"6Iؙ:.r}pKyP 艢=!!d_ 2Ur'JY|϶^o0gәل5هm7vA7cDF]FȷYj m߯JuhCi&#˹yC"4-M4ɫDY&AB.r2Ktl}Ff.Anˉt< *0vf[18`9*.8׆<ϫSMW mlO)S8رN0MŒ de 9sO: r L^~Ruu-5.qf|.;ϸo30+p8aԦ`aX5w_Mv~wv;רEG:R;MѢh 9g\i]K]Ѷש4$߷}k j(,DhL|j6RDf@lcCwazsr2b<&ƚg$7"ς9- fQ%pUD:`1K׆[}ɞ tMcDc{6%DȏAdrրeEꌥ7˹\º4Z1tu"[er{:X7]yFcz" ng']YvŝBůÛl tr!N$uA{ y_oo4zWՉV̒31d װ ła:|U雚_suw^ItQqF9 EHUH Pzs OgFw$(lWbީ`Ȑ=TYi^)%Eg{ JJ%jca|(ؒV,n7b!145Ԝ}ăA.C>&>|Gmg+mn _O-W>$ee쉪D{us@ކICD?DC;=̥&m{V+δJ9Ä4jaBRg.\M |*;29@Ä\R]A׆\ :ucyk.ئNe^Q4xٚ|B o#6U"6.ޘaQ̨qNk5 1,%dZ; [`R!R!ZTsH& F)Z , tHH`P#ɾb:m\o&w}e.3Z\vCeq.X4y6mb;p6i qfo}&uzG>QHe?^Wd;`I&C@R{$hΒ?T:*cI8#<7 *%#|SnKQ|s.A بC̥CiUtfiC)yqɞCE_s73řb0w0[%2BY(MŧW9im=-"鶛n=9ɷ=B0t \6)arMPohXDgrҽi]k W5c`s1͸RE4҃duO7ol>[amSߣYUwLqO 28RY˙bFq ;]7 XP3ZSXЭE.K?'Ϻ 1s1̿~U^?5mj,͌rvm)@o6,BY;3}_#Q=[|c?Ksq+,WhNŋedleg%n@‡]ϭeӨ L<ؘV/Z`N;͝b)}4\=1m vDdHc9śX,dG+[kh#5':5%=&D#S IDATTb66!Yj,BJ(o: 0f.?<8!e0qZKΚK.i*"hO9K`w \ R%rhJ ?1!>){ZidCki%wpY9jޘ6w ѢE1ѫV\vnr×>#w6R|dp(䮄ZGy̯]͢8V9ُr7vBCKN#kshcۻlp B] XN8#1>_PXۨ4Q(1ٯq5Y^DN! zEb`E]*OLu5ĨV+m #4HXy<%\nJn7i󵦂%xUڻYőKHF|,ǚu| VKH:daBl=-FD9TO !ESg>[G͂Eq~D؁%O@u=.cDM^K[v Qq V) R0 *Yȼ^O2q5ʅ`{̙NJޣF*Y=b^02M󎰎NyU D3A6H̸J1>i-.on:K)dB :*L JZs c֪9.qI4t# R-HI`{PAŴǽ =&l6s aQpA 5gA?I<"Q6/SVt6Sc \0'Y8IDogqr \,ɥ٤lc vL`=m9\A"ck9e|Aؙ0H~ں4UXI>8_O >{gHfL dX >؏>P}edCFZKP l:6LF`=XvQ|L촃usGB3K`nj (bgm4K7dh"X9_ne|4x#8idehVze: Ŗ<|iTQnv޴T1SoɚTEW;c`,9[`=Om+Pyxlՠ3ߤJ($Wx9HFnlu_ۛ%S ۂ8i [^ry*[W;8_{$0o^{!7{0\Jܲ>ξ[N ]x󗯫Cnrg$!)~}؈zE]A3]ǚ-Nmڀ|ߪ ~S,f@~9c9x(`uzw{~?C?kLۀ`zWнzI֯=Oy^Ƌ^"^#?ɟ}+nj1ק9-?/Q>d3lXtG/w/??9~ бM[dC\]"qHI WCjAHH+nדq*Ig~7/`WmJoeRULk_;{|t}F ҁmmI&m7) x㺦Z˽~Y9INn4)Ȃ&u&)Y<Ɛ4Zll&6/yC[74eCmH[TTc g[M[; @QdN!'ө9X zmXF" oW% gD-Og+#;:GBZ^i@S뼰lr Hӛ*@Ά )L*^x^ʓϜMh8@Y&o$GYg2+]wenUOڥc@,4(, Կ !ur  ID%$)֊SqEc5/dsKlۭRs}@VO~R%}M~9 46^k7G ]DQm?#6a+Ķc᳿4d>,Ad4k措`p1晄Cmڦ+!2ﰸ|s魭M('uyWBIk9H{|"SsV"6a'Jz1J(d1T˫mkWI`665%UE*}34Xƍe_gB^۲MTl&X*r00 [HFk=uy;Jdݣv3 K4c)%P8*}잓|LսFI|yܚ[*!aN6dmFǵS9uv ܻ )/7~fzL@1;J]S tP, U˲0'Ѭr7xމaysJhc*@u@>w@̀s1sP<~{y ^^:?oxrտj CM=᧌oo%/y ~a>sq;||_Jz'A[uB= VI~ZL(Ay~lG~)`/GF0+dl}d+7hXX5CY)rgHj2M)ϰ/ A ]i69LmN jCQ9c9x?Ox[|S//^=G3S$эJU}|%'6Uڮ(0 ux%~/4e29QФS8~|B\(WlUz> >;ڶ!/tl2:aZO tYGG ?-x+CxS 5]oݸ>SB'g-mmꍐhM4v~Nko#1 j@|7oҽdlcS Ki`[v,Gh=Tffʹ} PRH WGyѽ5v/]uK.;sdX={iP5M&d"- JoӂA )r{= ܔέ4\kț(:{LSOV3WMcU{>+sm~u\3tUD%[8;6K?׈t@6sg`Q[U IR\y_yӺ?v Ku]'l:0n~9%O負ˉ*QYD:;JPX!%obn=IBu ð^&p97Ͽ91%o>ij+A~^ggý]{5sͧuZSTgv^}~}}g?ټo>>|{_emRq%<;dd<-ٵ]@εx%¨UZ"wݟ7X5IQ/0"XM/H^T , !Wh_Pp iۡ^uj/lɸԱ՘4EaŵO];YУv6vXES["ݧ9T29u ws{W][0qեJW2zѝv*:h^Ig6".^}WP,hpRSLJ%"E)=H~mFERx hPUo1xjP!@bF%[5N '(KHIhI2eH99!oM6t @UѰ] ?3sl'ҐCc-ȃɂ,3\}$~c, iviTI eI%*οCb1p4 92Ygpl|= SYCZ/)xK  [aq[pHp`Xdv_Ov6-@.[y3ck8kA H\VB^; K &Q:7U!p֕& 2+řx^uQQ:\ &"%h$Y/1Jaq9WWNNb/g_쮮s܆aӵhwseWǐƜ7W74}VtX5U,Lv#KKb҉FWTBͥu:tc<Wvs׷+2KBZChTwfa^QV+o(J*; *mkBڣu*QidI䓄mCZPO{x6'iPW% W*Tj^/3v̕3'gDAxaNZ _6r57`DjvS}$.,#%mVmޛҩ kAZFe*)ޭEG Xf4E~OK`Y4MoN#|},YbPpXŞtځWևF9(X7otJ)x)tpAaojNkz.gQ97Ͽ90F@O?￟կ~5GY,}/1Rv$39efy:hTR~3ƍV9g>> xoMov\1ǣ1_/7/})y7|5-oy~Ό2qABU3]j9Ij߉>G[B*\z\ JEJK/g &8P V03=fZ"H|Q|!(j#ܼ+' :tGv22^Ӥ!pI3O`V\nH!-:gKH[ASrlBn?Wz{y<ǝk`me+P\Yۛ| %'rnn'N- 4:*kr+#[:3^k1,3viw![e/g (grk^^->.? 3#Oޅj9-]j%A4&e!o S B]gIrd)g@l ߆2ql "53A]9Sŷ('8{.M.3$lѯB6 S,%5 MeGPާХmwk./uCT G-(;ȵ"}%4ƳgoG{y7(cE3u2 9FJg4v.ΨƵUG%4o͇fxH7ԳKvs c"997oڭ5yBJ(xk[3u0~m<{㱒:-6;7ET-$JmޭO-uWޑ/p˛ȏJS(ml$x67C42h6;śbʩ9;KJjަI}P$oj0Q.Xl.4X)8[-LlIBkM4XXY(r*s0m% \2־p1s`tWU%a9{ts1Ͽy1CͲ,~Ne/o|#}ky޷s󾂰9睯멂 ZErz;E6\Lw٧}i|&w]o?c6[_?|ɷ (/|>iě^ǯޯѭ+]hjznnE#3Dm06QIڄ$?ܽrYH~RAbfy .ΜuirBN]0& B݊» Sp0+0>_&HQ}fNrj^0N}NZcVfP}lB#zu*`_T\ZLa5{>30ѼTe><OeɣI/;IjP%h{?(f EkIOBY!eri'sYmʆtvMT J8~岈Lh IDATmLЬM"9 &26'H# 1쪿d?QVtTRٚ@Ug%"yT%GjiwCA;poq[p&vg,%@EFsArCOfoEH}`G* X f"R} i]h B!P>NJ5uZɧ?wOWM Rb 9-0vk$6?>Z}vKI)Aw?5 pEpOjW%W?ǣ!ș6YʞTIK;7ǴAky[WVYKW?&{Ukc:kFrLԼLm՗ SYk!'.ØWrzȤ)&Ěico45gaXIUslbk&m'&p6;/ LU[#_$][9Ζ&WIη2))_ۨ((0D3Ծ*@lm;'! u]uP㇂\82(bL҃} nJ{gsx6a}زc?\pֺBEb %#R6C֊ml \=9&!Etŋ%g'&0!X]Ʒ+K#q+G&Ż ]R{?h7H9!Bo@ ~u1(8yΑ. τs!;v{2Lf|yLr 7-66SysX"t8,> Bg=;J6D^o]J ]ߧ\r NvZi蒃;椐Ne NUF1?"AE:Nܟ5Vo$M`pK& `62Y#^B3V䃘Nzd~}szRSJcό A uԃY]bhq(>Vr\a:odDHc2"C`';;Y%-Λ!fC`K ۧl2BdHe2hpڔa=j{r%׳5pHW˘06pԆld&}u)%A4N\% ddv+5$ -PY{TϋzS4rZƁ&MTUh2\êeHY;3o^гkCS,'k.n絮YMe`WWUQj]"g*ykb(T վ6)eT]MF֮h*ldHseYpVJ+KL, y R8FH<gi9nk !UY(ȶ0lC*-Ϟ`~EįTj>",.!h]XS1"\{T-ܭn&5bh`@M\9g\zWO=W5 97Ͽ9Ͳ~_ )Okoy;>a8s  ~X1{yֳӞ4rg<1/|+x{&y}|w/;ʛ~zտ}QVXPU22Ϊj0lcήxQ>pט""XGޢ`*B Upk"1jQ¿˄ zƦ$Rqi-*2gZrY(ٝr,PN!#B֝u+c5꘵xV4f,$/Y& l,:)G̈́Nuq]sK%XKj0OuBҐ:Q:y|ܸӀyQ )E/lfM^w ;+tK*d"~jkUڏ r @D h'ުfM] o|-@?WM5,jKr/lԱi@ #xpù-;vqc9 BEPTsS@͛Y\v;a;MpZ`,C3e($ZH9m,7ޜ`RBuP~ rU-&ds`0dHި &ٻ|+66 x.ZҘ"tm"g`'!oߒHT`nI :Qcg<vHgq&ɂ5@*[ex*VTE*٦Tvwk8ϭ't:4|62+>fðFK\UlE4OU^|_DϤUn &8v F*ɕBLSSXw[#bl0.%ۑR3MmD}`6UGY.p\խђL&Ϲ ,b< $;P?'M)|=iH Z rL<Ɠ85Zl s|pyp?<^BoWWy;>я}|~l9>{b5r=н6"-K˿O:{/՘ݿ9cG&};I<6+=/ ˗W7 fӓR&+'J&9a!;/7Y("W (2WL`) 9@`D+UGu"!cm*[(8 t侕㒲e[`%H.`!AVF\¢8WpOc5.O%U&2Mvwil2}<$B=tidޠ;'9模#{lZĵ5jS7@ͬZ֒,ERBR{AΠlK`>c[W3vDs>Ҭ&[$dMGS1%iځ8! 'B2gTKeuG[rI"7xք.\Hr_cQK}Va"SxZt2ܵN1Oͯ59jNU_hvе* p &8ՆP: vS *OA0l%(r`S@*ylu}16H`s6Y m֡q"Xޢ6y~o*sZIXzs6rvwvcJp*͟/Kz׻Goo]Q%łݰ1ITJrBڥ,2_x] 8bewd.i QQ"FɐJ(0FA^.GqB H0l$/CE pÕ_tH G .)\82] S0<2 c˱XɆQ^L«vHp:sɰHa[C%LAKPACTq?w־~LA2JS'ue v(YGWxZt>w?USSS-OӦKo]N@bg<\}eMxcv`lS%KQ٣RNDSVєP Sԧ avmQc\hېҤeU0[YrM@`[_o:N`TIT$^1EafZd#|v@Hc6*T 7HD5DB~>g-9c}0f}-J><$Ʊ*@WCKg|V$W˘n gCF@NB~pŐNHxd3^*<2x%5nmfK3qrUXYrQf<.1öeù+:sos73c?K^x}7x>~-/_x_5_Ó$^G>‡38|s[|B+JO /o|#W^m 5`,} U[a#J%Mhr"Ll6zWֶ^hm'lki*ye^I[a&e.r1{ g}Ǵ@R XRtW.)vl+8 shaͱ°p`}' Q8 %]8$zkm Fҙp^ XMꅷkj.݊:?ǝ773櫢(#\E>ɡDr`1Z-Ŗ߭R}|h&wV7ͮ>evzt-5kؠk m\c-h9xs7=AQXs|9^Ol5$.W_Xm _ʌ 9m>T`꽬$)ite%XH(Tk!/S%sLggL7qubꙹ?{Uj7ǚ |e,({e#HGq"u?=O c׸1^%TVKy,sP8'\Ώbɬ1). m)#3#,2ۻnɤIsulEՁ4E4|p>ywFkic5b hIDcۇ Cx ojVu{*o۸7WAkT=JX5J@w_'L!_K=I'#@Z{NZonsE-Ep$i&,[4n!l_n?D\$'Y1;&v HIc ,-C==Ydh>5ęZ3l5KM)+`U+dTq#3>OY l⽪\m }ּHwg9sٟ!Wx>O~ x ^˷}??~7Ї'?g>ef4g>Dܗş~o>;z׿W HR+ዾxSD'g<{pOwksܡ{|^g~'=-oyK' ^ =|f`A44HBM~L'-v4qBʜc>8S6ۺnkH}r$tKpsW)0/?ް6ca(~<`Er$x?npѵM,E/ pˊ9Фk/jiI2)vAK 'ʈ+ !tKBqP|e7)Le 6Hl15x9WCkʋoNT2e`PK*!NO5=8ʥڰRUs6fp6t/ zt(`n KV?l>ՙaёpVeIZ6|ghex]J q!S]l~; ˱Z2(5MQ\’s {Xq];(F1$)EI.̙`."Ґ@S`]iפz[/R Q׌\-ѨQa&bp`AUIB g]6߽Н\5m]ί3!+/ib;0tW,\B!.S~J9UTC7c27Kۡ__!u*.H05+V][RWYpWP֐HV\_aHks*ضw%AbB"_valm 3E\Jsld+; 2*4^Pd$*(kWC6[X+Ax)~W*s)$Y&"!땼E7/B²', =Hrm$L__Ǝ01ySKq l 數 DJ v(v:!Px\F;E4aKﴁcsT Dς-H] [ȒRJ(%m!moubwn7Jב8aWvR;;;|]z} ;@ NO%W{>~o 0g8m]}k4{pp=DK//IOz__8~~jOOw}s1헳N~o&OUzk7H9Q=5=s8w2(JJ+ W`$S+vk5Osf7q9ES+Ç3> 9V+vU8<ea/PK..P. rdAsABW6FJ%qoa@,L t Y)v(DPƅ8pXA/4=9 -C\zr8sRa!릃vP[zu ?׵z [6t\lp !E^Uȥ`/AK3 X IDATsVF֓#iA&ZL-J]gyH0$^R5vU|dEx\PK ܬYc᝛BѠQ3L\d0^3#YƴLDdMi>TK\y] -Awǃ˹LQq&gX3mZVA4%lJm,MfaߡDU `r/|Qzu˖ 6(iצ@c!{i_3JIQo)eTt1q͒`a"2' <2 Ӹ|bU$ (|0qu!*АY"<dz>yOF7&ӼZDh;3pz`5>b QS 9 qp˽(#YĚ]K: Yym75@(mk#VeЮ2< K0t@W2YWQBiTR!ֽc9c9>qPpA:}{PD[t# -ReբHمB%+ErRnMSp[W=(iu5đHT*IJ,Y%SHJ%"g澜sk=Y{s#r8$G0̽z8wv; axI)}}{9>Os>t]w,~WՏUۛ"c Rc{@oo~x{ogooSNqwR⦛n0\g>[-k*"oO|_G|gϜ@trO3ODKh7~6g$eMYfbGlջ+4}U5 z.lf[ 0PJv yCstq8 O8 IXrlq{B1+5ID; _njcvրՎ,Qr%6kR<)ZE&)uЀݺxi ^("ϫ-؏h1\7 [;n k%&]FqDRbƷuL3={V{crc]-lޫ;+BV5ʎ"yqn 5d|=rď>}߭Vsf[lTXT[[ 45Q8MNDP]S\{>x]}ZĮi6(a', S {QjK1+86ގT/NujXRu)FdǓ+_žX4{ 89DKv.xl[f%h )N[m\CxI8B ux5k‹`8F)yǣy քiek=&hx_Όyq048kHzS}SY"kk5+WJ 8RHglנG7rDX[Sw|R5AOO}`c=?M|>Gy~:D.R k_Zn׮x[70 , ĉ|wo^L>so]HDtܱ̾>~˛7w<<裸9y]6U-ۙ3p&|B9b<%|R'=6wL_c%:ײԞmZWF۷7+͢bkK`u~1N^?kW`m=#j P娠omHrBρl٩@k4ȑ vR}Qvc1kh);|"OmMJ噼kINW?vm]|{ Ñd@fmnUL9>7<}`;u7MKHu > k%~5Uv$U4mkƕ3%A\Zj`^HbNi cո6 Qi,b:/< ,G0n5b&V+px. /SRIQɟ}sUQn_/z񒱚$צ459*&yp Яc*7S$3Rl8WqJ>㋸>9S"KC|Ǭ__!Aڼ~˸קϡHhIm\GF:eL;D/YNzފ9Qxz"yaLO$__W ȋ+ҟwɓMuuj `ٳ_Ϲȕ7{(ߴ8CȦlr&əfG<*hlDinnͦn8,YCTmًmZ*9w(cjdܵܡΉ=.G`;<\sH̍nRv!D~ަѵ,[[_u)Pٌ[]68׷Tvr?Ԗ*#plMr,|kSXֽV6T.EC PV1%E ,k ?AD(k"9iiD/%nmWobz lq)[]II3*v M0~Jmbs\=*k{z͜hS"XTUitYԟٍC7QʵI-r DmQ_+Ҹ1vvwx?L\hM EMb%|.+6Uv 1V5X> zçq,AE8$1_RI0gs6Y{Si׵7-cUa ѮT{|D99Pv:>c=]:HGPs8Ug1xN47F]ݛvU86RLb$:~.1Kirs'o%e z׎"MblVbڰ+nk [Gר㬶e8Αi#.2Ǫ3$w; EgqlP"lajQɽ.Xm3o;:~Qb5e#QܣLu-JHN᭻o1+Մ5A] N# ŇDGuho>PPJL)N(f~>)'|kCJ+Fq,:̤LMb}9 [)S.:}#, "y0Euz،ij:_۽ ƤH.kdeXh}-DZ439Ǧ/`\sucr\z}r=hXGSavq^Ƞ)K$Ò7]]GQEDDUJC^uy5?xm'~Gyy_`w ؈_FKY֐MR`Kusb7'cy0\7KlVb`o5S7XUsAByG4"pg 律.Jٯ3f+ԭnvǙ>UN-Sffnd>bIfu_GT5]4)g˺S\WÙlfи_| /%*X{$QY@urL+<xA壺\b08&8I?i{ mjV e%9o37~8E`>8<R}* '̝\J&OL O3Ӭ}l cC:c7yϛQOq]cu|f_6U䆯|:^\|3b 1cK2Vs`b|HT j5~WN`Yg~蛹6ؼ'e#祔"_hXJy' ew<ӟ1K7Q k3aCFʱ`'^"7\߼ܶ_lKxk.WJ>ŶL͂:h3#)N^=9={7Ǭx"I&#ali1W<\zߪD Ĉn8'Mx~YGu<;5lK?M ^?#okU o(C${J$[.8g>v3OΫrw Zs jP?#f/:XW_{k\b6ÔtR?+Xަ Eޫ"""rS0[D;^iR^_Ͼ|çyKOпz_ŬD?n*+qx_u" +{6]珖ؙ=Ǧ鈀VxWqLnqc#3<%Sbc xlG>VᯡæBo ȧn ^0שR>nD[SWM?g{/zl1p?nSƪxkP0eQd%$ \7#@aS=imje[ ۢ2^~z-gcETxISļ>.M ءcBjW`,lvLꊵ)DeƬ*J2%4h) G)~ޡGދCjˑD2&a>sׯlqH&2pG o+95kzL]|6DA&CMPf˺z\͐jxq rkƠn_Ih4vj)}$%q}mդ\]iw;6M ϛu{^gUrLds=A%u>1}JT [cVCZ=0VԵ˗ƖRM05:{[COpI>HfY3o]y}+qM}6xɬc]u]lkr^=I e5QH!IEDDDDD%BG=|p7 /O=)>嫫yg=%O-W]:hSP aڎK)]vekms 2eU9V968T^'uNZF@x>*Q)y@{ԐE YRE4l38ìӯ{hk%yubY&̜l#rk!Z[=QyYm>rxI j$Z% 0Dkmsl9ٹ9ڠL-y(_k ƚ~d3O|?6mˤ!Ћ9on2vxj\uea8` ruAѲr,ja >948%~HdbsyĬr nj`v pɻuHhkXR!MckVxyJoJܷH,j[TY'ZkM Of*p9cVo?ڲoe!kG5}ɌxqB`D`U,*iI Ȇ)/3;QڄyR^jUj[63#lk(ڍ"X1d>oZ7{CSͺa!}g,n=g42d\e` X}NEе9yKĹ㾑Jw< ];.y?P6N):L8ln&l:(]ˬ-Zu1m|Vz ޗX;ε0+ReK!"D2YMdfճ2|:H C:HQ>9SvRtXGpʘE5l/# Xmcju]LutKNXM#g}z9yդ.kثK ?ުRK_A)AY1)1mК >9iت~k[X9Ca)}|6譎6j8˜ϕ}2ʦIDATsp޵[Ͱ~)Ŧn\(L* <>$դ2833sQk12ڡ"tk~;7fY5+!1 Ss|)ʓO=!buc++qۉ:a#6}{}Uc%s*DuXJSaU{~PgX9U>L?+gD2U1{ݻD#j'ڞR{Ute=e}H8,:<*rW+R`mjIO Tk`mc! o {DMu-V[3ܷ6vxɛԁQe,e*RyT/x?!2[Մ0YźLQ|dXA'_M\Hm635xϖPHz$q4:^yzv٩ծkUǼxcCe֏!ne=gl7>qWfonǔ\۝IjՌ^i"yC]ƪR.Z?]deʘ7ຶ2ⱕ~k .O\b4GtBuQqjtlrat,Ì,ӱ|~Ħ V^t2{Gׄk9owbN=VS2,c}sXk)7sad~!Q)8_rPϋj8:JlAw}k0,oNuqԒ!""""""$WosXb.3G|e{Ozb:/O^f;m۲\.g?SO=E3y0sh f9)̖r23 Y&FZ5:6٢>M?glllxz":{ڎ15N4Ìfݒ։MʦQB&Gp/JhF{,:sScfO(mD$E*9u+PR!!mq,JR1#4e)- bM˔5O 8Vd5=3f?уݟs"˵rmQzАD4fiN4Celoc,H>Qȧzy1s*ϙIG)j:°xXq(^@QŸ~`yf1s68f>`]blcA?{;k$STY0_iZҪ7SJ9DϝCsz_r;0[Ϡ7sN)2I1=fLctn43U;͋vt+j w 67mt3:QR0*t:y&e9lh-A I3Lw*JiͱCcc}<4h5Y;6AiBwCD)XȖIbFs8'N]wlHQ9F)$J:@34DǘǭXWxo7o2>fLʐfHX>fVc JSJZhJ/S+F*ql/X@s; p?B9 SO8y@r[ڵ,u`{ +R̰?g Юwb 6ڝb1kDy"4XUn&TC̔E!8y'$/X.n%:OvNAtkJ/DO٩{9Үh)C/`%e90k*:Drf y&/|^ȧ"} uF:J4NxȑЖ:%fu4.EDDDDDbAp3oo ~ _oC8b.{gx_ַw繎m @f=s;'|+?ƿMrtqƓ^?3?I {z'Yt >%_IO9<+#4w};<ŧskيN]Mos^ٿsЖ$Nr]߶{ox8H'gyw=xL:8Dbs,Ջ֗C?yϚ593W|EC? L;8n7Wtt|ӟ|=Ykx8~:V_kgu_֚SOǚHh!/~.H޲|/.z[\λm|3}i?r/73Б)%GB r1̚H~]y ~i [&#; [2,Ҝ00KZɲGhClPG7m44|[wiz#s|]y_םjswmft yX@xc7<{ؔh.sSOD%vne>&wcy7D޿W/gYR;/ݝwwvyW$_-|#)8k+ŋ~-w|'Qi{zDn|x;\%`<( /""""""׉w֕h!1pG?u?r﹣~'Oy|r//OY"y)oT R>m_޾o/G{_cڏR-TH^缈5[N92ڇ·gݯ_:GWݛ~x'/eO:ꈼ:s|?eyk˥n}\[DDDDDDDwW}}.vTnӧz}:p|۽=߾鿯WND򲛷_o_L`j_ }n_f#c.q;^os<~?_g%3cӧ^>Vljoc?}1AD^kp|z:\3?3!"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""/)z@ye OyåS@^DDDDDDDDDDDDDD24>EDDDDDDDDDDDDDD|EDDDDDDDDDDDDD _""""""""""""""r{\W^jBTIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/images/neologo_favicon.png0000644000175100001660000000210114743453644021157 0ustar00runnerdockerPNG  IHDR szzsBIT|d pHYsLLi9tEXtSoftwarewww.inkscape.org<IDATXmheyܦηdVkmF-Z0CnB% J %$* C$>dfIok-9Mw>6ys??s 9\٨OG3Ǘ8P1o9#f$KCt_|ZFL@F Jo 5 wGh#?yɶYhqdѭ دn=~_Ftw&Yq1OMGA[SEHӇD&N X XNP# ,;;Vح$會l!Xst^+L>Ӽhd)L9dN\>o&@7c)@6:E޾@y݌1p|ZSwblA{Q0lY&!)h@,3F~w#rvlZ*}m08%ʚ*" f6<=РU=؉N Qx ΰ%*D3c|{AVXd7a7ˡ w qX]Ea?SZ 6Jg1|]aIyL- x ׌,]7a! h.3|WedKM)u?{SRٲWw,ӋTYY {(a҅#ҴTlЏ5_+xZ^p҉q^DLѻY ) M(NcJ,n %%3 ;} ^H W]  02ڡ R!ڠQ_CBC-ԚfH:Hu[qDg! 2P7!AZb- @A+[.70T6C+Ch43-F"Ǥ&S)3+HRYY޽{/\>}6lP\\~XTTԯ_l UUU=x̙SO^7|ֿ` D 2IٱkhmR'FW0\l4'@8aH@.dA0P 9iV4u.Ҡ AЌn;] PdgK8/A( b,`8bfQhD68 U[\Ճ:>8Fe˖ׯ ?333_tEx뭷|cwoL܉->~YYY?ӋEccC/_~vg;w/˓#GUD4j)Ӧ2 geeb,G#Br*J70 ii1hOQ|j3V @i Ud|hsPb n:Ȳst,jq|IfȁL|eCԙBһZ J`;@ 20%%zǷ9ƍ}q+++=cwe'Idʕ=L>=Hk$VTT G#ݾ"|Z#1o~O=[ֳ>۽eŊ3g<7}5.ӑ9k֬Gye޼y?OzT\򇙄mD9r?]_ Fri' 4 J؅ aF\5P1RȮHz[)**0aBoVK/=&=nrɒ%'Mpgm2_QQѽ{-E(_ };^d1(@ ,^dnwB P >xQ,b"n7W* JL16xG'o0xe[M1hD*ц(zۮb Nћ|,gUf5^P.G<1w\wP%3u"2jԨ^ (#2utg[pg qv'饗^:-==SWsGTs[t,@J0YRΣ44蚠CN! y?ᯂEa+w&u@3i>Ku!|%Y STu)GE;;zVrrrz%%jlnn>m=ֵk6442*GwU+Wu(pʴ)?3)ͼTE@ QSDEgd/La"Sx6"Vpuh9 Gt~͐eaXm]!l |-ٲ]-E4⤽qYc+њ(d) WC 8,M/):9YGOS?] #F+Ǝmr8Ǩ6!X!1?َ]VDn2WU(EW!:y!Z!1BH~\4Hȃa',i5$xU{L&jVQ¹OFpevJmP,ERћӿm۶?AiGv F_nԩXVVt"E3cQFSL Q@ǜcD\h4xX+J—C0-piטD8#ԉO Mv'jZ©{*I7tSNNʞIxl{棵u=bn""+r8lYa-O0mb*Z+Jv\*9\f>UhBEDڮxMRMyLE{Yv7;QM +چE/|Ȃ*H>ppU|p̘1_lYWfU&b'+~nkjKGk 3f-M#Brd~#Gy/WB+SS6GawHEQ6+Z%F$(NS73B.`5j'4ؘЂ^WhR9ߞ>p 6GΝ;O= eΊhkp>X}G4X4+z5NQybt( o%Pz#8*/k:Jq*]NmN@ЈڥL#Dx E"_$hcD›hCv?qlx~ڵ_[(:{9}ZM E;M #|6Q"VJ|-S(#i9h3+L1Df]!f+\&41W)r-1wnB^uGaf.@jG(&cVk"Mljc*++?SpyۛK 7?(f(\ 8Ah;F@í)s皉6F=O.C2 ].X 70^A!3ԙ?$sҬȶs(IX1N$4Q~\CĹ~dգ(S|Q&E怈V֑A[T ~ ax7*z ~a D?2E4S[}%K̞={wWM197xJ%W#?p…/>2`,jZ'04]!r3,0Dm%3˷82!(!&]l5t\b&v #d\n>:t (<skJiGRmܸqΜ9>lT;555555|_$Hw~~[o/O_en߽ފI2QY{7o|s.[qYH]dN jI*zhHu z9aA #pA\(x|$ ID¹@x# 82,Cʍ!ŤBLwT$<1j'e.,ZhѢEf4iR׵?j+-+XmOFQZ^^{G!#)_I* \VC[{-=P ofh,ӊr݂K92Y(GE㤳hsPpx}&B::n[~dsQNns*fHP5~B1cƌ}T&Yv믿*//_pO>iӦf̘q5̜9 ++RJҽ{{F^[0H& "CE6쵟n4d֤ܳjP`@RFf)4I Y(,* a -8m 7[m0\ C'd!)XτA8Gr 4VL׬A['PY󢟩ﱜ֭۽{wmmm"((((--=묳|W] ׷׷'$a_4G>tƝ38C-*PIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/images/neologo_small.png0000644000175100001660000001237214743453644020655 0ustar00runnerdockerPNG  IHDR"lsBIT|d pHYscc`2tEXtSoftwarewww.inkscape.org<wIDATx՜yՕǿnfEۅqㆢqhDbGゎ Q'q-*:.%h4Q%A}if酚?~򪫫tSWu.{,bԧ@MHy_x;ok6s?/U!m[F.@>P |8hq[!T G@aH@Ž5@ k  0/ҀSGo?˱Xr]@mTc5!Mۜ]8J#R81< };Yݘ<<xdk#Go>Lu@-1k(GvEPB"#d}"eV a: =[ 0Mps{"wPOGX&؂ vv!aFrq6K;+Xjoоjc}Q F o_mksmCº -j$jU9ߢ.V~kM^AԖ?6]*~j++)b/iv)iǶbRE:!cIm74~I''qoG>7q =n㍲m5˶tȶ^/dx|z8c|}vxt> 'Z[G{m,(t19$Z_am8;o"&itDX4TjкGpv#-0~kd? $D3Ĺ MTߤYx}fX@ioq{oQv?׶;}x/qN&qh؇s|dxV๻n DzR#"^6Ӂ\"~ 1!哐6& A\s291g <4g T#!|At̗(.BXKd#aj}AM@{}oYBڭE@L= U4csBNBCo`*{V M{"@5hAD_74mBEh~~M%H#('WOs Ѷc}Zixaf{d&˵hal@{fz Gy'[ρ+Ξkef/EչCw;6?nBizAHCMV?a(8@ZZF-Xe` 5V(AFCd Zd-E{3#?6n2$d !)GOŎV`3`9a!!_9V t}#h,D=-ȁYR }i3N#֚%2KQj># DVd^j< LkpuE"+W#(QxiE6܌b r A/GqB9/DB;\33xxʞqۣh1qye 2-hQv' ϱ`APU&IR;㐖O3`Ő @297Bp/HÃJzhCnYF͠3ȤsP= gw,ugi(~ }$#| t)JjAev⻷yr J'^huKS>sT.txĽA]qxl <%:X;/Dt" c!\6(Cڬ i"ڲ} ($RNۑ^z%;">xxPm$uo@ ~d>NrHdǣ)ZryNxM> ?t:S)ch<Mȫ0-fW d+WI $ngGz9F nZLG"˓rՁuo_Ai!-UXtX9X:m-F!H{4 Qr'xDY(paϑP)}h* e4uS쁴qҔg M ݬ<9aΤ)~zyC.D@=Oڑ޴8Z\%($C76G?[.Yghm$id0 MaII"|k-hʳgGȨHW5V ꆛNklৈ8q>OE6ݕB A d-ʔi*~Z&Hf=mc<35HEZi-eO6:ip&?DQa Dfv]^6Ʋ&Lz^Q.Bi_(Ab<'D4-9XIq\oP*kd#]a3܍9H ZC)ٝ ڕ(QhMK$'" L! Ly=۳}m]F* ˮ Z4.%4AB3C'Jl,Jzr%6[x( y'FF kLG=KXK%2"˲hoZE4Nzl k{$Tkh>vsɯ̦F;4^\h:ɝFᧅho5p'1S"͸o `8KǙ܁<p ,b9nW!oD}jKt0oG6ÖyHHNC}uG# T:$SZ꓇#ߌ•hjђK\$YW-1س! 4܇̠k" {9ŮCs{3)XE5A[r6¾mٳV22<ћa}:#ҢH&45Hґ e $)6UHXG$?AI˅^E}Wc=˙tkZ1?BKO<84{ZJ͵8LfIc%Ҍ㐰}h>?x=Mjji$d96^r~G.C.Ңo2:Л9  o(Ô!h JJ%MGJ=% A$-#P]|*Э2ɥY 2 FjA&+MM b8f XG5CeՔSEa;5b/d(&XYvc.;)%EsciF&1'F)W֎;efG`7vmey̖۶}IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/images/neologo_small_darkmode.png0000644000175100001660000004442014743453644022522 0ustar00runnerdockerPNG  IHDR$ qkzTXtRaw profile type exifxڥYcY,8;Rvfb7ZzUZ䧎:C^S=~=C?|&/=~=1*>49ϲb]Y_U KΧy-%&P_ e~^Zˏ?`FקZx/Ylo٪{I-$ _\S8A}w*fm}c-;T&kw\4R&7di{i3ŚOʇw.`/GW7ݬe+$ZϹwxO<`[o7뭐+bklW.##~*/?~2(eoA`g%?HP^  vIj&  kHj)jΚ$h2L,2D1\Kig4hzf̼J:$V~vjhJ*"MT ڤAqjTjס^ֵ>y@SF:cN9yr9W^e%a|vݲӲ?ZaC)z䴣qn ^w3kߴZf-L3kU1Dr8 EWO=gZgsW$3IYzR~.OF=sWނ_OOY3?]A;lfr nrMˉ/Ml\ؼL-I2^SC^gq7--EXPʳM)Wf3uޖ{[SFk[G+ښ_'mu~-/9/9Lv#PzHJD^[i=t%-6#nL$6dB6]霺ܕh{hn#wNZWL碕T' YFY. PQ.yn>X[-F֒rewNjջ;AM!<@g5Oh1֩6s*gҥMkqqsׂ EtLݴ\o9,%y5QrA 0B^⬾DB~!i$N2=3tGA^-7xY靝* [,8)(J )q%l5JƛIU@EYiɵʔ@4\W_ s uQe@H,e^"I7@+s Ҫ=|Wwף ? r}dh UJS̠+?Imu kZd C~\Ao(%PUZhuG;6>4DjbL&˭3l e1 _ g 1Q]B&PV(8B yԯ%Q Y@wf83muB)qA>P]uEGJuf$i6GƼNtk6/C1XMٴvY_, (Wj%iH+f/ Q1`}vb1٦/sBq%uQjAPJ]mBHaIAqouѐI7@CR\2ʹwKnuQʆ^DG5nDK5-R[vJ 'B/=bzG@33Tp ^v$ }v (FPY&{N+@itQ}i|\ᔈH@b"h&AG|"-uA+˲Ǭ% y·逰h:`)〡'f6jz^_OFsLw=٩S0 0sn=Bxmp\A!PC_@E›ۼ}ˊ?Bf| |76aqr_4u͂qsSGjhࣈStgNV;G; @!蟮͂1ݩ6ʘG @-3OEN!,4s h]gom&oe[胁' AK8Ή! ; KAIQyVz4.4]P]L悿I^QvM*뺺[ F;"i<9 7K7`EN=o )`_v 40 CNC\6@+E!(Pn:"SVzOm=д ׁK'ozN$Ҙ KqoB\dN8pk "s`2AXrVPnj 1 &̐FrwN/PPt/re <Ȥ"5 U&n[hh`)d\jC27~<!9$ #'iRoOPˊsiO?䛾o1J545pzaـRpfJ. ޠ I3WJ Q*^,'[ESI~ dx).ե-tDPPT^qfsM]d-$:ʿ,DcFP~aosb;[qO_,w] `o=N[m$Pzm╁bj-$MS"E÷!o?|!uWn^>q͐8A+bwL⤡pmD1:SF1a/`5ӻ8Έ`Q!5Joi,`iʹˠ7iQpƬv<Q&|8Ry8١(sܦeտN`ӈ `4wҩ`5Mo1GF-quqf;;$? 4 Nޖo+ѻ;ޗ; K8.pзg#iYłԿv;UJPya`{QwDI!f܋d!2&믧\֠r߲T6VNXfSlE`o.Y˗iCCPICC profilex}=H@_JE*fqP,q*BZu0 $).kŪ "%/)=Bt+4m )[¯!qH jsGw1ѯ-$YV3m MyXd%E#>'7ď\W=~\tYIR.f%S'G5ݠ|!y^= #yce4G" C:ʨFV iO]L.\e0r, ZI/)z^c|;N>WF_m37:Z.;\CO5T\)HS(30x yqd pp){ݽݽ{r^iTXtXML:com.adobe.xmp fZbKGD pHYs  tIME.?_֥p*47WvҽP(T5 .khpe0W]s mm %TVVҸ`Heii眆}z`J) 8 CȢKۻ+ԩSυB!֭^쭩>YSULZm@K>lshmO__@X,i/͊Hگ-@s󜫉k_oݰa͛?*y~׮]]kxGb…#G pJ9,?xpF=\ͲeG/\mT_4`u gm%mwkk[zBYٳ ¹s?w# x555Ā9@lhtt/pb7`ݿ{UUw~uTk9ǤҾܻ˹nm nm]uWF^N1הY`5k=zg[#:NUE@Z G"#mx5RU a[gĈLAT ڣ:c@T#>o IGB QEF)6B?U~K\v:GZ ڥHT`tXZ9׮ ^U$'/$i)4@͒Xܙ]^hkSSؼgwܖcކ+yw<}:r`-- gzomj;wxb@w?~QVVur…HgWʆ:?'m%n_O%,12ޝ~{ _ ŗBAd 1E* % R[2A ($)HDښ鞗@[ Q뛽RwTqB q_Z %9Ø>k8p$p}aY9tD]eW%&čCM@H &HETQ\!8uEdlhTbXjbvwwQ{#۪+5UUH(wt;x0'^)4O<{׻.LC=2 Xo?mDn޸Ųe- ҡHrGNJ{_jo9w.s}޷3y&'4`^1c矼TltB֗JוvFP8鰊vT=_vUHu I N"K,1g:i<Ӂb¬${%fߤiFo1pϊ( wH~pIe&zL$}n ۤVMKIawWM#b2C6 k#;hT29 }мRw Plnj]`UUOa(’%[6mt̙w'^Ϝ9: HP|`D}>+zժ`ƍϕ? ?.7ﶝ{~/~pKKlޜ9]u-'^Kj\ҮO~9mWdUUXܹS53*;hUnڲĝ=cΧvGeB7]Fq3sXeog@9(pĵ Ղ, gTz(JHt4Ȩ¸85^$'TeВs)4S8h=2Q$noudDw.EurBBi2-.$?CXHQhkSS0w\'N0rK^Wyy?P}IfFOϪ:]V^ɓSqҥ kvD65I65eKY~tkk8ylo{~0yjkjÑȚ_O>]jTN4zOmmj"C=lsLݒH| OZGG8xWwzK !Ϛ}vNRj(y:2U'gͬ^>E :@ғS}Y%)4N> bq3j[4l=16p3M},]#IEm)\6T(n#IIN:膼M-&:@R( d7Vd Ko šz뗮{~gxhkSS!0喖Sw^3 wTg(}#cc/wt\ySc; S t?}#[aˈIe7 pUe%/_^=08(SxYUUqP)+--xPaQS. Q}ʀa|Ɩϸs正mn=zy#Bp 0dt̨E F'RB15Vty]3jS$X R`H sĵ8mcr7jFj3e?sZ7>32JZ$$lH)j - |+-KXM xVOmqy%wNӫM}w! Sr֯w/^ގݻ+V-Y2 6=PFBz{9sfE:c}$ksg6\Ҡ:>{_GoiodhI z8m/Oľ_Vq<[τN(YKv t>,Sk+՗m?u@}}Pue!: gCǧ#ױ=UM(Z+V {ދF-sf2&ꊊX|C1&϶TjuϚPmmsy:QsI> pn֬&&:dV_@5T3nk3!#6 Lgf(LfF۷n~w)2 '@Zg#Cw;oqY,VB=~-Thsu9Gqti[0ZH< u>6ރnԍlQA*v(2ݩcea z8j/Lu` S.H ?S51 EBWtiI͞] F aOY/̮;xP5ݏt)`΀(/144kg~쳫FGMg +x2H(Y8FqXn,? x:c%>"@ AMq o j-i'@}EN {X% qν&Ca@~r$VWX+R; "?=gh=wF]^LSqwmWd 1m\jgwRNQ7 PY)--! |ߗp($Y: '+d :˻ʢ"iY.;+H=ksI2s,ޛ TXR brrrz\v9yZb~zHxv:Rc9#4isp],?0:m_tEC6\E% rBb H)3۠bP''mG-:˶:YbޤeꥌR ;i . a. 湂Db ?S@54`#yL^%A ~x^w'iD&|3Pkp8˫@T*)(U~gDɽȃs@ΘZ(|ҲX$^'mT8uҤ|EuP3q瀇j'RcW1q@#zx W2_W"?­ 0璸S;wFq&O*RA*@Am؛ЙHZ*/?Z@G kЗ<ڟOxee zk1dyhL@%XӺY |JZM3p\` k8I( ,TR}Rx3J.-YG$MH=Aķ(8)-+.2/>|yqOO<39_`9H;ԭo. cPhڄѱX~~_VYo rޟL#h1*+[@ ҙtQ`~G*rm\ܘ. ԋ*Nڦ=r&4ͺ[f+ ]|i\_Vh 6#N\^"c7p,oEƏ>XR\|^PHb€d5>12S'\@ Iu_~jyKz|AgΫ[͖9ES ~M+|]"e*0]1YO-!RK1f"AWWz2hp9.nA~U +K Gѿa F .vЇ'm&G@Pe0< ȧ= yVcNUJ@e >?WhW8 Oi+lfX{@>!n0*Ady_)a`ύG< Y$4YaKKO2=pmXl.,50R[I2>&<&"q#z o}.F(ZuWua5OJv8_n uSruV6q~pL Vc<<Ӡ(:I_QeL>_`2U8YCj̻lH:oz*Uk HuVfm]]-ˏ?~f{g +~kaCC¦m4OViW $X];5+6r䜓T/D_z=e8nyi uVdB T7ڳ<6ҶԘUHG-bPXXUtLTOIs(h:@ʁg: kύj7/Js{EOHZݣ:5!mf_d]8 w@*|:2?5hp,:3}k/?MC ~QUj7jLR!ἵy+mysySKS@r--A-3m4U%L{S1|yˁ>cG1 UNFd$ʹ]М,ㄿi WxHWWCN##-WRn3X; nB pe NJgBۙ|Ɠģ;s5YӴ*To\"ҴV,(SS8ؙ3w_r嚛͟?R3cct1%YKarpxx۾LoÚ5'rsr44/-*Gmm9vTB[ *rsr2CRdqNco̲i[,m:;?x, mmjǴ}X Ff\s乖bNO*g#55 FD,[&$=y_eEN[GUW=t)r{Zt6JഠO ԧ.wD .]\rj`@ҵ.rKNK-7oWVEG`9O߱m[<]=cθe4z^dTY`7y-x;;M[eS{zfK]Tz&@=oAgW׺c'O.~vtg7DH t3ΚO]pI}aRunY&Au>949jګWDQ!IDATږ;>- Em ۜAO)R@.WvE.{xiu4*뚵.2sq]I{˅HӦ7CD~p-}ŅO|6C7oXt,1Սg}Ƣgں5(/쿏=UENmm/GXYrY|ȐxH$Ҟ=…e l;]!W,?O3nn&-Sr-PH3,]gC@ kAW#ЪH;H: dL6qF)!x٥8%R\͠rH;L%\- {] ꬲ{pkR\/b(ސtd$tƪu>/]Wi2TuWX҃47m_[vUe^8`K6=+n==֛9PHQC:=s@0#|wVfUau-2b3buU~D܊J݊,c^dĜ7AVeF ~cҲڼJk9k.JK0m:qUQ(n,wFvVW+@%;cRR]g;0^8USU5VSU56sƌsU?dEg11≑EϪNfڬH>۸n߹S65eI9Hܺ=֮iϽz+??uV^sMvۿ{LfZ+t yd-#l}'ҙQ[@#D1bF$Y(ˋ89RpO1LOv%sΏujXRaY& kwF-wLjcN;#aݳ֗{d(2@$8uBy~U%H #ȀyZpEI!6%/z8'47ǍOf)dM;:F*4hnΜi1i"5 }Dd<q_-Sz^`"02:Z>H|ߗp8x<;tSn3IKcY}9DznҘ#U[(bMM^&+P%nsiB=GAG8Ot;I(ukpH&uT\ev8LLj&ȧ\:/I/`8 f\ %ʼ'^399L:Y&:F+'i3J oHd1d{z̉Fi9\ ॡH,S4'957K4% #9ќ%x$ (P*Wu { *r. ׯY0J@wkGvͼ֝+Vvv }֖'FSށx2 H̊¢֎ޡ,c=TP}#f.-hs쐈qfgZu$ mNȎyӼK>=&"S6YvPg"Yf#`x`id^LZo0ŷL?Qӑ^IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/images/simple_generated_diagram.png0000644000175100001660000160647214743453644023031 0ustar00runnerdockerPNG  IHDR9tEXtSoftwareMatplotlib version3.7.2, https://matplotlib.org/)] pHYsaa?iIDATxwx[Ѵ%[{;;!;! Ib$aG2ziQZR(]Wa d=x ZXc'v3uqE::9H$}? !B!B!B!8- l=!B!B!B!1dB&B!B!B!]g@!B!B!BqH@(B!B!B!iDB!B!B!B!N# !B!B!BqP!B!B!BӈB!B!B!BF$ B!B!B!4"B!B!B! B!B!B!8H@(B!B!B!iDB!B!B!B!N# !B!B!BqP!B!B!BӈB!B!B!BF$ B!B!B!4"B!B!B! B!B!B!8H@(B!B!B!iDB!B!B!B!N# !B!B!BqP!B!B!BӈB!B!B!BF$ B!B!B!4"B!B!B! B!B!B!8H@(B!B!B!iDB!B!B!B!N# !B!B!BqP!B!B!BӈB!B!B!BF$ B!B!B!4b!B!B!踬,jjj:{Bn۷!P!B!B!NJ555v!D;45=DB!B!B!8Y1`;{$B&wG"H@(B!B!'1c=B6=ݝ= BB!B!B!B? !B!B!BqP!B!B!BӈB!B!B!BF =!B!B!B4zTjKkN_w;w@1鬟Kt8H@(B!B!ⴶ|o2ջu,y {Q@on '&% b Xuy;dq\H@(B!B!ⴶaΆf+ *)ZDZNWYP 2׏Cmi-y #b#[0N|_9yǶ,BbN"02!Z!B!B!(_Mo 8ff%C ^n,mK5[`273zTis;^t M\q/ϓP$ B!B!Bi4 NC9-l}'eӂMh慛9雿ό{&x/fv<3$d%ٽr7k]CR\.<V3I]|`FZ>MaIKsTf~So'[2n׵:_HRf;sy|r3sٲh ^>wy|e&h./7P߮Q 65 wLWU%߹GGXz͈)#Y8t҅o/d X]^B!B!Bqg2! !Bۋ2Gy]Z#Auqu~<>~c}`w^,lz{=yk[Gmi-#yq~32M՚gϪ=Y9s:7ؗ 7n.G'657>iÌ(l<8U~@=o"<2͞}|ԧνĦ5u߯kCJvP랿Rt 4_((:-8uH@(B!B!'GͫEE[ZʥܒLOv)ZDeA%鱤H> z=\%(:rSUXU6meV,l 60[̨~Jf6 ϒ0|p}qT8oI=7 XR4UǏdb? v$Y}X&]BѶ"v.e;Qt IItڅ! ?x0gzq#>+e/ >S[Z˸Ƒ7S կ4*)s<شXV3:go.wr?9CZ4:o.`ܭvs8~CWB!B!BӞix5 6P=vj݁ nMk\XVU~tBD;%%|V^ι11ܖ lj{Lof2կmܘ-V uv/ 6TVu2 S>^Mj fpTWۼg 7{&&r#mX7 a9Ŗ?Gt; wH. pT88ƨFQݫviFɮJv|rӵms[o |`udF ^e|n_[0!}x|/ƪ&~<wYe%@ƒ]voϸ>}3}h6/|CSB!B!BJhiGwm-kq^Um BB:wc5 Ʃ贐jWk-kMJ+u@NQ1q|UQJݼ:x1|N_eӂM}'e!gPWu<}-e޶DY@c#Scip4*G8##6ڢ3 zzmɶa4/7.?n'c>%;KP*>o~˯AZUs:VKxJvth'?t?zNsII<`(RB!B!B@ZSwl5nʹj͂Y@֒¸ւ8kqЅW(;GOӚWB5v3lrƭZo?<Zn~6f@:^Ӝ@ NcI뙆N}B]m[G{Ml`Kgamϋy$džӦrp30,zw{Vi~{dO{}!N !!a!DEGGo߾BqVGö# <-B÷`\mڪ;}Zy\"| ݴp`mWĵ7ӵcPSShjvt_m7Oh|n@HOKbI wΛm4zX,#^`a/cKur{vR$F^32Qeomi^4_z1i1eۊ>pvMV, c̙ ZyKE~EX+3j(8Qo֦tү'a 7Z[qp !!jjjpBqhj:{B!iv; s۵ ZVyZn>U9Q[Uos8ԤYHtvo-B~=Oj}_Յ-o Z{siƩځՈ 1O(`0+ &SmNGNGX`S`!Iش\.c\x1lKO_i) VQ~N/n?nޟpLflmEhy^GD'Go-c׫XYCmzS/͠^n.dˢnz/o. O:fkuAE."^g"o&n;8"@lz,VostOv3VE\F?}!lkׂ7ehZOž# 8]H@(BBq"p׹vBq |!WyBICZNl- ~nײj B5le[GheaNwi?G[`UhZv2k`wf`AQ0( @f ́0)3t- P[xmyclˣ^UE8{Fڕz8 cv[S|V<u:!Xmqi=H{|o5Ɗծl\|hoײ۵9뚳@慛T-@gfVog7kX͚St u!v- y|l1*)vs[,|>_1HjTbBP!hba!DyB2Zkml>P۷4jkum<[TTvnp+j6bhϭ'b*;T[p\zm~ӜzF>|5_MY0k Z !CB4A*u;t2;Q=N͜GOiFuV+~MCĚ`vDh{#{Nz4UtO){JIMqµYŞ5{P*]v_ѡ} 4~G7Sod1=稞ֿˈNf48HMbX1mE0 4'7v>j\.|^h+}2>e8}29N^u_e|9ꅯa;;h2ajHʹ~Ti磲2lo'z~ srH#f3H@(rr"øˎߩ*'k[cQIQ\BP!B!N@8_;x2jOxv8۴yWSYJ5o[dM˚ZQB Hh&IpYk4 Z :d֠ϚnZ[hjÐ$X#dYSU>$2[n- l=vVI ӑr1pRVMH a6f%- j\3Rݥ֡N.2[±v>x^ʩwc0M2cvl!DH@(B!8!d-,+4Vg-;c M?$ Ϛv`mhmk H`%t,-Ô-crEi1-oڮ{孅lmѰ Z yYHmm-fAV+ZS:w[hv4lR&8fTT}(@@eH++#s`r].;,p ",NpGtr;BP!'=W%,a]ԔԠ,6 QQ$wKfټ 'g>_@XDï#KVG%,;0),; p-4`kZ:_ & J|YAZSk -zR[C+̚t<:\ظQc罍0׽#j^8}lkqpPmTw_Y|.5v iZ ICrP(6[oP߬5d TF.>m! !lI& N'܉#d¥ZJJ ) ?*"B!Nj˿X &sgAEA;~#GN/t.)kAWhcTkOY孅-J?MPՁ Zq ZHl -CkC6B֖ܦ=lӴ\SBq2[_ϝ۷Sb2Ѡiڭ[ѵ+Ay9p$EB! BqR+Q=c1G:Oٲuy,|[ wcY7M|f|u.7s;-u{yWfo>n~fdo_Y s6m;$ 01 s6v8#IDBVBc;\ZtzII t(}l(Vot˄;&OgmkKkyf3O-x}O8a(~?؂R-B 0hZT!X8Z ZlZ S B7WZ0k6 Mh(BC۷@ɄOӨxxdz*χL0+#B!Njpsҏ3<#pSȜiX8lm?l'__G?`sAp=o"<2cL-Fmi-QQl[-||:v5g 6PIq}[Sr;{qOSj x4ߏ^QtDDDX`ȥk25i |CP ># h09* 0#coKrd7Ex|/{FoԳ~`87w8Y2rl ;L-ٿc?EZ47]TV{n 2ۇh`)aŴt֍gv=ีmIIc>e{P*Y͹wF}Dw>{3"b##}) rN(Xz!OhPUTzqD a/"^ =-c:TB!NYU]n'hD({<1yn6LOc kt gCBq P!'o>e&TWP_ʯVrɣm5=G$W:sOmi-{۰nl]5f#W;؆]1` \~LEО{X9}%UU0 Jw~m l(`{N_u3׵xg#qjƸ8}p}QOf̃89?5MC(Dt L5|>԰M0tXzz[ B/$4B!8b=|WYI1fͼSWmFʂzx b9N3Y$0/!Bz*+#` \cKx#"`V ;>]]ýpq8 !8<>j4[[R/:B!N{?rܒCG { )_C˺v,l<e-pkٰ7;PMl)t~Ħ9 qzPUED D x4ZUŤ(u::aBNw@h&]n u:[, iOb"B!D,)ōBtyXzޭׯo ttAT(.2ӵq:!EV1Z?aH@(ⴶ{w=q5Yg4rg/XIǮyHι` o+VD }kVxeol4k ڤGh)ɯ }%5JjLPT|U?`<5FNXqchj@jv;` ]  !47g ^UWa~ aaÇܯbX+?؟B78!H@(5܉f0A/|?l稞d":9Ǧb"!;gA> E/ կR[ZK"Ǿy {(2鳟9HDrdJv`/c2AGc/SQP3 8ఎsp~zbRb#1'(8z=Iaa4~) U020aٌi8~~?qJɄgk}=v2N'Cn 3VP!55f=^ Fl|t=EEcJGEnL mCg VsG"Nm !8-}UQûwI1w;{X0y=l s6c0H„'0y~,eKo۵l.1_QIQԖQ˞w|:Þ{13=S)VjLn:9r7ccK2_gee5 !Eӈ5jN]~?:Q~MD($LLg`d$N'\.~?5^/ 44h:`wʠHz[,Z ;/B!' N'܉#d¥T{RSej*TU̙ BϞ2/S^tfvG}߷%=nu%%~? lG=Lx]5?OpD Bv>)+={p*)F#`T~gM17![ { gop[8=RzP \uHi)\H0kdˤ^uuz=s_˖[y|J{ FWbN"wq7?~#;臘EQ$!;z6˘L 6QRlEqqܷs'eSi +}>,BvX>JK ZzT jeJBڕxձ.|6iXŵh@X AXZI -Bq2S_۷Sj2Ѡ|\YYs΅"8 (/<:3N9nGwjfgf}lN9i쮮Q\~S~<5f cPͼ~=]v7\~qL|}nKvׄwu,#E\Hq99:L]쀀07&&~9;+…La!pJZlBq|UQvj2xq*'TMCOcHI&1^/M#\kP) z=TZMӈ4e XG4 b:*Z8Maյ@kzUŭ(hlwl21$2Xmb35B!8\u+[\.RL&F˹11ޣaz=O7IIq#\~9xc_X<Ç\ci)͊͞"FNt4u}bpwŖ-f5EE,/[.~rjLvTV2097.c?4kžR"#wo7S`xe3&؆_VKL O}vCRSy\է<K j;1t\ҳ'8谟mXU\Sa!zEapj*M̲Bnf㼹޾V-hԩm޵f}ͳڵ9ĆsfZ]qE<5K;͎Ԙ1<=v,._kab׮m&koSr{SAgf0xi =j|ƶ@׋NQ `PP,I ^QוL\h@chXvbs]ֻ\}>c)J043? xaͮz>)/Ǡ(tt cp`>>V+=,`P)Bq"zmv6\$h@˙6ujZckrׯ1,LN?c铐GW\QgsY5!sYt֭tyEF?|Mn7|u6fiXuujر$Z쮮 zyeҤv{EvvXΙG3:3i[riĄ1ejs9vz=Vo,> \^/ƠǍ_~^ 2~-a2x>JN.֍'G%KXz-u:,W3ص+w  @JD[ ?CD\.ߵ ߏhlטC JIa-0ꭷxrh.=X!g5蛘{>p!,ZS:7ϲB~}晭v A\x8kV]x(ÇѦMym{/QQvUUŋyn~?{~5s&_\uRRxmd;>2t |z},5۶qmHH\ѻwA -z99,ڷ7 BV.IH`BL ֮C4{JH7;Ydwk[},*) hɠ`f&ccbcv6\5-Kce:M&f~541f#hdqm-偿##zlvUբ"^߿3VLH`r\\ FfX*2\pߏW4 cHh 5Mpz M0tXzz[, llMj. !S8|>ܾUIF#:E㡷wž=t)lluu0k蛔pJr6l'!C&i9<ssgQP[ e޸#331twL8ݟVߏNQRWUd |OsY]\̇7jBH\v/No !8,)z3WU°(688;{pgln/y;1 Ħ}DwFLAXDءw"D'ɂ޽URG4*%;,4 Ϣ" jeAM Kjj(x+ Qz= T5N'眘.glt4?t:zX,X&w"Ƨiy>AQ_O@L^OǛ%%$Lܛ̯ᳲ2v׷ڂEy9+*H5,>c΅ d`ddpY˖@hdIǃ=CFc8~L 4TIk}>fUW3:&#" {[,Ą"Bq$Cw}Uq@8j6FϞ䆇Mrec8^ :t¬nyt<~?srtt|T2DX(oQ:W85OL3nߟgǍ#baya!:anw6^۲0jūTՑ|Zl_lrኺ:^-:ూjuu|=n8چf ,ZDrD ##G{a;W\x8&,*eH͛Ogsy9όK8,F#|p쑚Kjd$lCg{6pc~hq'S>2CQZ5 !8Ty̩Ƣӡj~M㊄t"? !NYpq|<""xp.fUUQs*Jc{Oh2o0Tz<LJ<䫊 fTV6kAyTRW y\X1FȨ(F~$4].6Zu8 A`NGl|@hXv/** cH|=-ӕB!8uƓ{20^/F#ޝ>?wv7;wBpeq|,ٳ/X2W`YȊwdGGfHMeeOlxs&¿2>!K].:!`y7ob,6&&Ueg}=p23cn.ee1i,mKUYpOqNL 3mQTTsg5l gOpk s0n\nt gv \1B!8hƟR"z,:%^/z=uPúu-E+/As0f]Gmuz۹38ae] ֡|[|t[l,nR3Xn[\-[l/ uu1 TT0$51͛yzVی6U}> XTeGG l=5ȷv~7wPs>ڴ逹Z(c""0tl`rm~m-;++8Wߏi`YaaUNn]xv;V|e snnX?ԳSpP$ BqZ^Q~?c9_Ą3t:~Ι6ٹN'^+P4 R`H4I5YZ[˔-[8.228>)hhJ>+/gAZN+/竊 ҚZbzEBWp~\.V;ihǧih:z=6*+mLu:" X Bo Y3B!b,:z=e^/a:ڕ1WU""`6 ;.cPZo>}ȍ+JZ_?3HxnRb;/_Γ3&+O7of[EE̴4š:7z4}=1˭[k3\G<1jE̝-Оc0׹O_?ȯ]xzz%$:9L"L&sNn.cyxV[7#>w¼<&w 2d;ih`LVVk@Ҷa"hCҧ7-_}Ŧ2vU{7]qQV:E=xI0t9~ldYH,VvDXt֬ھ}2`oXb}sCҥ31,+, >6098gOu5 -|cOvs(B!N{Yp L~Y? !ĩbwLEOc.{.+cvu5&'sgj*aaܝ]r8-H-Hݪ~g~Y\X;xUu(NG[\.ձdAC׋Fc8hz=-3t|̭f^M F###2c'mB;%%m0PWUY76VՁIp>G$Y[,qb;Ć3[7^86:q"g&d#X=xzjX={O?~"f&2{`@3Ϥ㵕+y~Re1kfۏa`r2w~ +{ol zm:cn̨(&vlK;!EΝˍ_~``pJ 7T9˗yԿ?o_ziqo|>FddիתUx~zٔ) KOokci).5Mr8޼իyy2|> :pulL_m3f_=~:\~9w|5W9L8JZyyye Fgf8`CuB9Cs޽bX챽,X~nR[^ORDәwMmBFZl-݅BSkEE JVX3%!Y(@ jkqhz.UQz=ri|<݂#4MeS|N'kNj|>Uh f._ӨWU)4^ӑn63$2Xeb BSִrڽUH0zOfeqgk^ӟ{[o_x10~ GJJ ~a SK+pqc~|q#ΝKw8Koт#\֢gee|Y^N\t-Hۢ( &M&Fkh`spF O~UQa|@hmuu(eeNGpGFj $B!5Gwƫ$|5ӹ#%V-[ 'N`# ٻwn^]n84O~`3oCTc}|};#32>Ovn׬.;?/f̠wB׆Mx2XZ޽1`#NBdzzܪ^Qɞ5PTQ!:BmPj@d$_哲2>^EAxUP@nx8n7E)&nUe۶1!&G222KfX@ ү**Ԃ WڂB?VLH`R\1iSr 2M 8쬯&t>Ð0R@hdÁFcH3VB YaaGw!B;?r߮]ԩ*F#NUťܙ_v̙a`x8l C@:j4ѦMUe@r2_= :A_Le]Q~>aaܸߓY#g9طȭB }<2r',i1*޽4r$ :fЩbȑpB޽{QkTu_M?Qv4TMktXzcZW  t:~?5>z=%%qoZm+hANߏ^QjтM#`@ QǨ8}>ձ nMOSh@rljO׍570h0a6iy9=z=z=6J22 .Ֆ-HW|UY7iAZvׂ]\p97&qM&68;:h,ps8Xr gS`h nvIyyp>V+gFF?"~V+ifT !ɾn۾BT QrNL Sv=xW]Gil1:iRB!D'P!)oFe%~MäQjDDg-}©SYUewC].6:q:^Wx.!aD 4 pβ@+pa6a/5X)/Bm]_OɄO(za~qX=h0v,u/BEB!RXz,-XDCB ژQ!SrlvH6Ѐ2ޣC}Xm !"&N>* BS78~F~?z=t `$}1ҧOgAZnx8_ x}~~pnBQauN'DRP H0I3|TZUUܞ-;<_sOZvmU%^/ ؇KUv54>q\ bɠJj-pj (tXC ݁pAu5 jje52f=?B!q|ܹ};Ft~ oI.ıa,`B8<_!8 BTMӲ2@(8~.# *r%KO7mvԫگ_p-Uyyu}yeed/@db"n9?ϞKqƠkamʽ{?b:nc2w\gӟ-.&c`Fsp7!Ç7-*Ar^\Dbp:(߹^?%pɋ/2+[vfV 9}5`َ,:5kp;$t¸gy~Yv.ZDNdR'M;1e}+V0)۾E#.; -FLn._?8_?8OsDd xb0+ @5aG^Oovxٓy55L-(&\#` R/|Z^\m2uYQQ^/TVqY].}>Uf3>Mż[RBNLXHbFFFE12* y> N'\.lǧihFX 0li쨫cK] BZ] B~~s'KkkI41( aaٳ'fwhCPY QQpR=(!B:l#Zǣ+ݎbrGdi ޾Z3zUWgS\୯Go4rOEm,P걽 { GEqK/mh`_wm_|@u~>s]njmG'or{)=P[KxZ=[o%K=@뮟6(۱/H\NnGi)}0p&,n?'V9g)XIO=5>Jm|fhQnnϸGٿy3qnzsaCyZyx.h94bOXplNs{ u`j JǷ|[Y^Qt̐*ìR! ^Uݻ8c L5ygOrh롸.rrOvo[-_}wàӱ0/q_'Q7.=tL1o[U~II<8bWݩj9jz440u2nߟܘNm| qP!)kzy9nU%`#db|tQ=FK. T#_~Yw|;O"tD$$0驧id`矷S>mIIfg嗳sBwU`رUWSaI={2zw^64pGxEkW_E:f /gt=:eFͬ6̀hFx#}.qaWP̭ܻɤ@1c7\<-گ њ4w{բ"QT(TVU<bFs۶mܚ\˅̨!` dAUYpp֭#X5EQ:@UzzN'dhNI bD.;t@(F4i쪯gz{P410 iK %]he o42fc`D#"mw !ǑiF׋Eä(ev;/u߻u$^gNO@ɄKUŵ\Ƚii$t  \ՉlvVQrʼ^4UN'N^XLHନf>b•Օ^o-*N'*UELB^U'*\UyYFNG߈ڒZI2P!)G4obtxDֽ;CPUTܹ:^ t*^/'`rwq⋃҅4-X]xT969^tKB!Tt*:~;{` GEF64`Or֝w;r$a6c;˱<">11lYfiq]Q\ ,m&a6=g(We%-rn%Zo4`sϱ$vjeK/5[jwpwŖ-f5EE,/<5+[kWۗ^ KѦM쪪"&<]yܨ< w|5w|5Zcj~;gs?&O&THf ^U婐n8M>-㵕+aԩЯώ\y"ca^uut呑#_6Mm67}7Ox9y2#Ay[Qm8Ȋnk[r** n٭>'.^̛kRpΙii|tX}*.y085&Og||ν%#s0{c 1"E9ϹF^ȑ<}- !8%}ZV2ang64{.yE_~ypyCU[Gl5#8ǂv̟m".(8`@5.fUẀ+dW,/g}l))VqqKJ6{6oq|nwÖl6&? ~͛Y+|zܿd ]GC{xصp!|B4h2z^\_ {XF*Մnb >Zx΍ᝒY\~^O^M<>*+ &vx@^ \:,/r<TMæ8f[a!21N̤/"~@c~N'].Vlr*́ zbU@[ҽ쨫ĆGD08Pej%FxBqy{~VXE(Fi)\}5@Z1}+0l.+!xAm-w LNL OfY1ټeڽgϦ`sy9B6ؼyzYU//Koәy:g~x&F7a˭[yH~`_MM1,ۗW_*q:YgnQp%\?m3noFqq}U1HxK+ ,Z~ڻj3nSt5K韔DFH&Vq,޷ՑnDL,+,֯b46{n6{ɳEOɻ~Lz}Q]u)Lд4z==λ7 ](dew֭~sΡOb"e.څb4zyDL,޷:&.^_;06 PGh_}]QDueI@(┳6.CUGASfUvkb߿*[f<6q/32s&lz1"!Ưb׮Vig}mmy! λu4*Bg0>w.5EEG5 lbX=y2kײkѢr]jH!_1$2wfG]&U^/JχE'`૊ 68<ؘNK^-,2< M&<:ھQQ<ɠbѬ,KOg^M bcG 5PUeE_WVU\OI]QRfRf&~rb 4 } 0 0U cVu5) aaRe`W!8(/@Hk4R⪦mso*dluu0kA9y*jɯ NM%kTVϐi3xPstMxwz?F#ucڶmL߶YxRr1Ǐ g>]+fg3}voFߤ$].۰O/ `DF/L׎=eL/O9J۔\$X11eN] UӘsj! 3oҞ=[B~*v8}863ߖ N1:+ռv!cFqg`0Y^X謬6Pf!WBBn0GI0 h6pSmtCˮ;xn\2[:&2iRpԺݼvMg~8V$ BqODG^%a6}W0Z,2 geٛoߥ ?o}AxU,[s H@ a7̪>{euQu+[ XpTkk:L,ZE֭/[?WW_b/)aŻ6gG{;ӱmysz>=z*~k\ y˗ 7p=lXdszwj 8}:'OYHDAڊqb13xr^ J'\I2-۷s{r2edd2ln.%%b~>kj7H5YTSJK?=ú0 .LӲ2 n|FD1`khJa!gGG3%!11OҪ–,z=Cm6lܖi54drT|4@`m0 7\s4p83m6>V+֣N۸qLdfrk1O"}{q>կ0Hۗ|3f୫#&+ faX(sd$׽&>${/ ݺ1驧x曃l<ÌG{%oٲZJ4NMAzw15}44KaMc/RWUED|<.q>\gSO3 7xxjϞ>Xtp?GKH׋'r4`@QT2vBozdAM /BL~>,-*nKNTljܛƢ>+/g~u5=¤@UgfUH7"!zXw6Nnxxp*Ukj}>|>Eâ_5Vx|Y^Ηt::}VFF/LG_!hҚ߹b4TU\]))<fφJ !5gpO̟ӧ?&O{\ L /$-2 4o"-^OTMz%̤Sb)q:;t.-[08 X(<^-LC.#jnggp-Uun @8^nMNJrxf"33҈ +V0/uC_#S ;s^Qaa\ޫn>}xwz8h [Y3ÇȑTȹ7tf~8'70m?p-kB !8,MèqAZj]Ϛ-q9_]Q%gar`&Co!x;{B\뭃 t0!x7@o2-voΚ@b/Yr?z(x?2)f?cokZ:C53bw!#L(ܔܽN'F#5~?JU%dbe6Df&%%S0**O{a!n7:1z=U>/iy9seB#3t˹|UQeemh*2*nVPaqUb"`9E+㢍FFGG3::>Xeᠠ2 PՃ:qC-'.nG,:&m6Þ SBS!ĉe;wR5v)PU~?%&dHe\%Bu5|3N6GWB_^}5nyy<4{6~3e8,v2I9R^W쾪iTדM)h Gj^{7~U)Skv+6<){Pqۡş,n'fkX¼<.=l0 T5nm۸o_=:L=s-0ȯ-[xsNQx謳x謳ȫիyt\zsQY,?H۶1.;ؾޱuB9$ BqJV^O0txͫacii]ڗz۹38ae] vD0t'=GFwjرIImtCZd$O>}}h4a^\ԣ㲳df;pν6-ǚB!NesyNLSb@]U]u<Sନd}xɣ4b!ĩf0R. yyT|d͔x<B ^ϗlpx>7jF#feqUb"+,J< RL&T7ny11L[<V+W97.]p[l&Xد̙l26;}|N̚eV=Kc*Me%vd O^E,tpr}>wQݧԧ( &%j7;wTM(pY2\nj_@a@l)Rlcs` sGDpzDQ !8uwevדb24ʽ^Ίݻ^pM[@H IJ/fAlx8u4|xv.#LK㋫!_n=d͞MŹ⋏L8σgi2Ј,?p@r2B]7mbBN\z)gv^8|=}ߏS$Xtm<1>9Ml Ǝ ցɊ⹥Kqx<<5f Olݻ agU-]36yzXJN5 ȯ<::sԒNQE3H$/d zss<ވ z5Z Ox>2aNH`/~sr_b6=d;*+(q^n.|]Ǟ,!jkkׄB4Mc҆ lp:I5)r[={vh?)))h .aB^zY\~KNUy<{7UUaRiLPsK]ЭEj3**xu`@WVUY,<ɤcJ>.+c˅[U TQE,뒒8'&F |lrtdAKE sj а>^QX GDi6ҭ^BZˍ[ dB{< ޽ mZav.8C:III\R/V~vUU[o=Ǯz}n8?܏g믓oe^/u~?if3>Z<^=ii\KL!h$d3vnKIT"rJEQ4dfU ̌ \Rvܾ}ZXy\Ȩ( hnbaJb"U:8~f[FExm潒+)!L'h,-ؚ" !)ޝ;YZ[Kш!б 7,7{$l>o VAf&P_&iNDe5h&^2 9ﯿܘ|:E9?MJ=#…|iȑ=!NZ !8~WTb̭\OQsJ!ı5::gv^O~ ïiL+/g jq!H_veJBܷN'z h$dǫL.;&? NL䪄9|Z^W c L&TMEy93*+II\OV3M&ƛLQUձd2s ` %MTᓲ2>)+ìk42<"_UUڽUU `={~;WU`0* vaĈw/kdf&Ǎcܿq踷/T^#! BfUUQ`0RUt:.a !T{|^߿zUkx8E5>;H7I6M۶qWJ gd`n 3R^.,8v46vtOChΦ1_QFF202fdUEJ^O@'᥂.DFDy0t􋈠_D7vtz .+v6\Bx`J˗L+/Ǭa3832a6#"k& !IE4o^c0Q`2zZ6uՃ p ?6*P!iBB!'/NGH>!ǝIlGD޽z<z nnb~2fj}>n/]е9&_0).Yy9E!mGTWdIKvێ5%%ʘ]]~m0j24j}>.)2GDp}RaMj6j63).h0drv:|Mao++1tD `ƠHGDk!'0MӾ}_ZMǢQb3x[7GFA"#av<蜀8.vI@(⤶ev;:~MC4$$ Neͧ?c}ؒRǭ}֮}9zMx,)8I]OwQǿ=l$ "TTP`o{(`G`bCR n&f~d_@|>pٝyffݙ{WX5z47 Ɋ,w:9?9Xv6g3}v~uPZ-): JKYPW]ݺqA*;JŰ(ʼ^>ᝪ*vxZMFC4e~q:Yr팏rŬbRd2j冔̺Pp.@ Pc ,v;j Rwd$-EFl=A:(<]Zʋ޴~?*O0=[Kaz:x<-Fnj- AOjki 7yZƄ2Cg7z~fBA(h=yQ *|>j6y< $tTL**b΃7bÞ=yKd(g77sͼ/=RznNMdnh*~t:)ЇU)z=~Y>?eeRY 9.:Zz -NN*JN'~?@xyJ5>Q(`ngݎJ0 Z[ĉĂ (<[VӥB~?:oT0`F ?u !& Be>A+IHG9#>~7+&= aȬTv6}##};~?6FCf i ԰me}Zm6N;yU$O0ȷ tȍ$3LR1&61lxxkjAQh  uC Y$}m>* =~s'j{h6 -E<̯.\HQ{DV2I8? ݋ _|瞣cL G>o1\nWͣ/og]]MØZb-{9͛1FGsYg1PsuR< 6 o_N}"W:blceegqUUar䑜3h#"Ĩ=+75aMNgW0.}m2 p$Kl6zLܺe [hȏ@CMc7r{j*W%'\hNٌOHV\$*;pjrFT筪*ָ4-l ,۷2FGGs^BC6ÍZ7701YQ(nnfo.}>&0TÁ䀢 YF%`a00b(~f3iz rٱ5-@0)-mوג=RADDKoߖ  e}\[K@QЫTT|dfJ,p]l·3g`W/)g儻&G\kTnW^Iь81%Zo]~9F1~cNg8@u|f͘G -=|E.rsiᴬ,fFz~wAGEI]q1uu}A>8Sl,#nޖ G|ܫwlW$@J¦&u:Rt:jܾ_\."~|г'jjxjNJ^Lʎzܴe UWsz:"#Fj4v3O$hDYQp'h„NH%IdGD9 (N\.V\tJ5-@Z%0 =646J"T*Rt:2 d "+VV2}v$ VenMMPXrd &tv ojv lY^ϙY+V;1Qii ȏ_̳/|_|1LJ&O]z_RRG u-))aܹl&rbb:z8  BU󱨾Z(sQ/c 96 9^K/E9XWoAb^QQ}Tn܈-?/ٌY$I Ϟ͐k!"*og$_?{z|1nN1^nQ^59k:/(1cڬCRUڵ3882 ?߽;Hq 8ssyeeT$jj57S#ti B J*;Nu5e>ʎ~oRR>7I "ѭfU[TXjen746Ν9 6DZ;$n NM̩zW[QJUILQSs++1$j Z*IhCAVUSQPpY1%Iiiܒ=ӁEE0p qD_XHQ}}S-v^ԻA ~UTĸwehnӈ6Xm7}%ySڶ?)2W\AA BӾTKA|DPA> 1՜vˋ㬨䓑Gp{E9Ç(_[~>3\3o͛IՋu8eƌhltە窪š/cɬYwIz-['hv82sbSZz;2;n%^ "m4 $tlkn梍55RR8$VezV㙾};˝NlLv@YQZU*LZ-$!>TWvUA GF##pyȊBV#I.9;uk1? 'UO!d|FffR\N㠏eo5v0:ܡz¿ ](UU~A`bbf0qx{}YQT>CRZqમnӏ xv8@Q0);ϻ2^/}>fyg&2>_ΐkyq:MJ>f3ɇ55E'IDi4 0`lɄ^ܔ_Úٶ, 2W'%qozzNil/l jy3 Cd]i4^7 }v8ܺp!?lߎ率5Gm1b߾֭K/eDF-[;AQ}=ѣ1uKӦ17lH;XKP|-dDE۱xzypȿ_.<f,]G̙C›g^U~2e .;/fѶm\[\կ waGf '1knhSbt9OOh.fʅ{z͜nj~i*Zf>6viJE|[\?D<tW;/nd6sNAFDԶgŇ7eQg3 7DPAr;lnj"Z'˨%8"B'?n{ņzwQd&#;МѷKcmm9 +P_J+dWb/-eջc.,6g<r0U'x+b*"B;f0v~>3v`ne%U~? Z-*%^/ą2dDv6Z8'!㣣Oi)WUQѐ ?DnIM~irmr2_74vU˝N|> *Q z=~YgVi)/WT0<*%2(ьU.8rqEQ= cCCEQhVY]Z ZQf3-FFrdd_c~M wn݊?tem6h e`6F8$肥>RO9g߹t|^94,z=nl๱c裏H0:b@fjPr1}R.#~XwѨTD ymNᚣZkή:[[cȓ$ݻʕe^~WjѪ=hUUwHVm7X:[9gs?J瞻p۬cW0Wgpp1`<^_M {l_R _|C#G2(5f/)-rȫg4'`2sYN>{kf1 6W\x?\=(HA.j|A'U焽ioqYYqTTpdYc/-0\f|$zV$ͦŋqu@Bn.:#duy2TvV6EE EV>`CwLqqZ AaPy0#_\LGVK~D[ ͎ Ic˄BnHIᦔ hLP`/y nkzkj&/J&.U YX_Ϣz2 .HL̸8lf GF`M _\.u APi0* ` ,GRaRPaH,q/Znߺ,e\%Ll   ¨Q۾9Dcb7q47SʕeesY Bl >^Ou>}IeTc̡x)\NL z)2k_}E=HXh ojj3ֿc EaHn8^^.ۗ_R O<¢".>H&%z.+:rØޢ"l5k83?=TXY^ND:4ڤ<|9@]FL ﭽ J _|NjsNѣAbA j($O+kOR+.f۲eKeM|p͌6^/yñf ^:4>&}6[O3™&M xksHe8kw>>QQdbt~1eޝcocoyK[]F3 63ò#>77\656+ uR"Vbw@>A$qf|h$h:Zw̛krǐ!lav]|_fŋWT4|};css}ot)xՍZ#8 {& Bqm-@dW0HZ͙З`:b8,}yV&j، Ǝm\LF/E?Lcm-YCr#s/̙{5DDE1+ye W_廧n@g2Sַ/}_z` @\Vg?,J( ,1wΊW_YQ.2cᄻ/3䪫-*bklҷ&cަ @ć={r϶m̯II0lzLVKVK,mC֭lFC&J8+>㢢xmˎ2?9_-5ux(5KL܄V\̫Ӻ:*~T@FMCV oUUaM f.8)&C&T*1<)a*Nj~>JhyJU&ZAQ *I¨Rk428al^ zn)* `sy`v+a/'gN?1))>d5 ym3 dbOs fلkOf3N'Z}A t:J^شk--bQZ-3283>JJXp`IuRQLJK6;$IXopgZkkyP VZU&J#tIʼn'A:Z(0(0fCVn :T|8BC$aT1DJe&Yfon7`T0brLHRz9*B]C7nق;2@<}>g.m))ڳ'@t4HXx32?=|éCĉ{ϷhVg.EX\e;gxz:^/ee t*[0(--<6F/KCSS?.,ddFpBO7o>H{&ÌK7֮޽ >}Чn7[ǝ_MMCϾ/ش(^mUf.+! ]wv;%Dk442ZI⼄ ɨ$+x3?̈*|>BnDZ-M * :*`Vi)mF[<۽;z=> V$j;nYNCNǕ|ݧqZ\ PQWHh( ܽu+knE]WSIF#&$xv6#俹\DvDEI1ޗ): Z-*`K\iǮ^ͱWs֭|XSö&qA~۹a\`S(8xz\OLw/nT 􃳽CHV?+JŰt2FBݭ)@R~2vg|A &S,Ag;Z.kUi'lfS]]SCdE k|{Zj0[7n^uu\z{m[d$ DD602#7oKPt@/=" Bnu5P  A?;b^TT7 jRzLj5e^/ۚHhPnghVcbq*IxFEG߲2^mUvԦ,trĴN$FFG32:&ޭj~$Zʏ&tG Jޫf%6'DG򣝀$IdDD(B*\.~r:DߏB ac,%aTd&6{ÍYu+1eDFk?s{mXuޏ3.[rJI &މmPlɞ=WǍ}Et~{]NzM?hz=O?1{6AxujFddqa!jjڬsTf&}V /.WjWo_n܇7fC?99e}p HIG\no%75qlz:qF#?ɚJ:d;g JįdFEqn^23y矙μ) $A84DPA55NZMPQ Nvֺ ph%t;vrE>Z-۽^|>< iz=:>WoUIIޭhh'=3☾};Kv ʎΩ䫆nKM̖Hܓ΍)),cne%=CG5FYel'Iz=z=nV|v  !\nԨRaj$ 90,zy70Z-CE0ZppͦMԇ͡XfwWnXZzVT)@Z!tE~TZʥzym8&ʔ3FCx^N'f*%yǐ!lyp||w饌SNa?p\f&sO?s85}oES @- sr+\'4*I\ѷ/Ϗfb)<8b/ZW޽gPn2:$޽[ݙ}Iܼp!^_02eJS{ث<|9o[GOvt4ύ##Yzeܾx1| pDBO~ZL=XW/S'YQ@Ip8X,=AAأw੝;IT*~۷31TLcrnA4~96I)GL.."ۛ2zTJ# 2jl2""z;Y]֦&"T*b4d' `Ji 1TDi4h$ ,TZΌDzέgn7?9Hc0LQƨRp#4*`fRPc,Di[ FV:\i~?IZ-^EĘŸ,vWKv;46”)qpWV2dbwp4_0ȱsz+=pTLD>|eO2&a;)2Aί)d^uuˍ*#˜iʴ $IOM[PDVK@Ov8XJŏ3WQI12*y2/\Y 8+.;utX*Iب(i)?ZS.?jʏTB[1Z-ͤ4\kn~sYtۍ=$ I-م2 Bc0ȺFV76\y9F&CC}## |AK\\i5>:Pph;A%{02%{N:Ss8꥗8YpywrMLYs{AAHANoQC>q M,s:zX Bl^e˖pjNQ2:):~?oe6wuF^ޘ4k4٭|*;ѐ y ܚʅ_ nJMe~m-s++P(mʏeoXb%O* C̀'[*IE} @D& Zae48la ]TN|*)anU^xZM׋'dKV.mBy95y-//yxv0Tj4D[\55LeG l\v;oTUNGDY+lmjb.-e||<'$'ʏvFc,X>%`\.V\,s8XHߏ(% JEZUAQB,t`AV+GE7Ag d(88j=0k-̦&X""@25 ;5kO~B1u BAS/.@hVㅉ⦒ p@*efR`212$t2fYêRC$1&6V+/RhTWYrqކ \miiXōpyMVUAM >*I"Z!)T~by9oTU1jDFFG]IfXTâFϯ.+N~p8DV0XC٥U\1JEN0ÿ*;E6662aFZk~[X>~n\p8dNө=>c/ˬ ]OAi j95.% $IDr""yIjIp2`&Y&I#Y"~qO"5&uؾp$ht8A^(/gQC99&SMzLT>J( V ]W0ȢzihȥG(?%hatL ^/+].~q:Yh`Rh$ EQhe}>ީ*j5)z=džʑm6wN plxPXN$@(8xz8tf^+AM`pl= A i9> 4he.Y B4b^i~t8$D28$g ol䙜2(@vD޾MFPђfݼ111ܟAJ'Dk\%|kFe%?:mʏZ4eM3CG]Z^iz=š( rdAGC A0ąe75+j#"nrt(`-ɂpX*xjf3>+W–-Ӓ=݊BA#;:* tZQ(DT -n9̚o1X|rܿy3ږXA0+}l *Y|VU^8JEχ$Ixd8J 3ׯ籬,N٧Iĉ11 ZyUVR{NnOKや4 3F gmhl䝪*>Gh4$Cϕ1QQ\ȱQQx'IYdEDpNBPbON'@1ahj$ YZZ&CC ͘!sWi[Sd9kyy{Pm ,*!?ЍHBQ ;  A:%EQx H@!V+LZVx1%%%@gG?ܫ 7OA"jʢdbشZz*^TOQ(ttT|\y37&'sKj>Lj5w3&6Biu:j~ٶ<L<ŭii|XS땕77Tp_Gh)?y]ȋqqqߔpP$Km6|tɯ.A@RLj5F sCN'ԒDZf3VDɃ lmj")ɜ|uC;Uj)1:ztTT5<Aأ {S&ݭW] BźFjՙ{1ۘbc1 f$IRܲe ;^ZRz~|^hHjiYZʚF&a?nl={fU3KK)hHhe9\))#j\x].|>*P&YfÝ۶ΝdcVsөT e^'w_N9kl6@ԴdFX5E(42_|m$ ,Y, X3Qilnҍ`P*^&sH<@%{PmgC;vVIJJa 쑺\ )ͫ*V`8i˷*=GMQƘ:|x#$wjtWC5?&N&"* SΜ?@b^w¯Řv6~ڈmt$1;Xe=8}ƏgW_Cmh sr8yTl.1XclKGM )+JFEGsQb"CVQ~0dTb2j嶴4~?\r`Cܼ0XjCCOIZ-CVZ,me0 fI{\ZXFP #dbn~>saFHO%P8z4A_@ANz2,sN||̖X`OȀK/f9mDѣ)ZN n_5x0QQ(¼믧rFFv$|oN_599e?O#P|9Kfֳ'=;7ވge%̘@tnԗ7s̄ >kt;;},>+N~v:`׋GQ1 $( ML{55W]A&Yب(X8l TzL(,dCc#VGyytf0_}-##8c:ի?><*_FAN瓺:6W0I섄_(׏=F / {0`_xc.cL /BS[,)S(G'wz^3'=@xݻse|-IOKEj߾lg&'Xqǵٗ*_^F ?vi`IJbjیM3L@mw23$Ie̝;y2dg0,ihtNrv :קpeR_3_].F(FCS0F&mS;wry UUZu:N㔸8Ea/> (  ZMl(`(;y*+1TdED0je@(`vn aBָشZT@GѭUCjXuƖGd WfڴiL.+,dMV*7;"dt, dj GRj VĴASYp(,كz^pٓ~f3~?YƦaPhjie|>"U*ZVݜ~=жXW/ JEχWI0,guT^/ j$I99|ߧSPWZt: /WTpڵ\UXȏt.J3f\~=(>ՋiVc((zq$ NGNGV J;wr _ 6leetKY\^X*Du(8a00'/Բn]ے=/$0a'|B=0͌3Vמ.뮻l"""c̙(>k,Y$I|wxFÚ5kp8{fX0qDRRR 0K}>}:YYYz7n9spe M(0aBo``Νm A2Z-UQ=;'YYmʌ{lKyVeC#VucY^wGAE,|!x}~^ϨI5i5EE,qm; )+" {6,h4%jXfY#Q#9ex-q[7tYʠVssj*'0 Z-:uSKJXP[˃3y^M\ėVYj@ZMFC4 IIX躴*}f\'dJeknjdZfJBP0'42|ЀVªp`f L&] tPpPppW9nsޑ߲ iA~7CzGy7̍7ȇ~@cc#Z3gڵk$'Y5\Í7m}9CϞ=۷/W\q3gsaΝzEᬳb͚5<1gNcǎeL>e˖VvӦM̘1ӧIt'7!DPA4ʼ^54V#+ EἄN{/.+ sb" <̿]`X=0.$ˋdsM\ VKV+}>-~KmQmp}{Qm BWahO<]ZJߏM 5u:|>5t:-/g]c#OR"h䭂UWΝTxXC̯.g_[RStlZ񌋋cɜ )} j5M/N'\d LO/eTl2jT\.V\`EA#I-PYQBc guu|VW^"Ve1 f""\OA8Wn VT9yy7Ր-eFO<E\2+--FeT*6١ 0d_W]u7|sx1c0zh~(((dԨQ|7,\+WҿF͑G̙35kǭVOʕ+=z4]w]LJ 1OߙYl=zاm t]JQA8|XS; I pV{Rqw]wp5dJE]q1ۖ-㼗^ /?z4?}MyQa8/!\C\VMek`aWbX;>cIL$*- _~IdNd|<57S^Bzw$qIZ|ڈRB}}ˍ1UV[/+ԩS9Sׯ^AAk"@( t ^Y杪*4Jp@ơdϳ7QkfdP0vlviƥ$I|?{6?Ϊ*L11$͠VV{9PjoŸ'1/Miv:$%1tc'_??"JTJ =?>g͢coMR+:!& nܲn71 6@dEDPRa rƍܞ5dy&'qqqL+)aǃQ"Z!RfkSWmĩܗNR'\=Fgeqsj*VWze% Pf@QhxW++å6}"#EG AcLl,cbcQ^/+].V8,۩hP ZMF$IȊB,S29UUU*2 2 tpHٴvZz^у#"#;z-DWjz[ʌ רVVtonn`޼y\{qDGGG裏e]VvgwZwmm-hw~{{_~9^ziӦaٸ۸; >ADANaa}=;^b5dJŹ]~7scLٶ/m~6X,Y^۱Mx睿}`ĭ ?>J j\}_jcA&hd^Awl42 zYfkSiz=^E#N%Y.`qy4+JaJq 0 ewvƹ ESS2)VQF`hhPg0Ȼ̯eII>,>$I@7&~q:YtA} @( PP0(xd<^RdbDt4,DFvڲ< mwNIxGt_ MM`BQ=N?fȑ<>vYwLL YYY{yNw*I&1i$JJJx嗹뮻SO׊IE DPApZE2S(e21J ¡BڹQբjR`2H8`lnjbvN0¬p_Fcccy_].4DFQ玭[33;T;1\ȹ |k,w:DXBev:\qqQIF#F#le 8tӉ=$((jL*Ѝ퀢 s(#Qj2jeB n< O07X$Qr Ah \ ))=Dhjjje>]=j(f͚Ell,ν3xظq#zjx?^_z _=Aít&JƯ((J ¡$&uF۶ˊ&tTxdV+?\TzZ646rΆ L`|| |г's++UZJGFM)diq]r2$'qԒNfJ>C Ф42=nߺwbHVHdAVrj@YQPIPUAQ3Ú>!B&``TTVDB nfnh V IT|jBQo톌 (.L8G)5nYfNj/iu=#Grqq]wѣG_cҤI{|F]s52p@f3}vc= cgeԨQǓq@(Uo B{ ,PqZllGKAX2 ݼM񡲢~??\bEGVKNGϤ[Yv39=v:9!:ogq}=`T@vzfd00ڗ$f3}f&67fUTWS$b5u:L۷|y9f#0ɬZ@V+7 XrbF*JEJELYfÆF+/ǬV3ba |QLg ՛6n'Vm -Y L-Űb$'C p#딮:6oC=$I\|Ō=믿-IGx> AdYާ 4^zO^^>s Guw}7f{K.aΜ9{ ](Kg# lnfԚ5(EcRZwt!IJJRQ0'wAƓӧ$>o2(H@&YfJs@g01 w'JɊ§uuؾ͘Ce7BOZ ܞFB~?0fdE!Z!BBYƤV3** II XDF/5>?ʑ~gSe#Տ'42`JMcdTVZ,ċVjj&9s#Z\!pPRqq`2uXjj*eeePZZA#sq:"PAXVW Hp5KHa Kx=?{m|LFNn_d$cbcYT_OS(^R?l>q$qqq ZybޫU3Պ ihtN=zEi\%6_JEn,j5 р+Ӻ:jhOd$W$%qrLL8#{#^㔸8NCV =V8`.@@dGfti,SZe%s0Ta21":A }"#Qpu~?W$^E v|yK`0.waA! BqS]^B &$&  ZS99d *-ǦբjYvpUr2oUUQYQqզMܔͩ!`hv61BMj5^/7l'LȠaySǩ,w:SQv;e>F(ZM,dED$ L& L&.OJ'%[p|B BH'gN'P/͡V+CVY, ]@_ܪ}>./,dEB(8Xrn.;SY]vHKk vCvAÉ aQ`2z;zX ЮT-iidFDpm|$t$t773뒓yMMi4$i4!B&``TTVD A؝J vIjф6Aؾ ~l6ep8ଳl BA!+ s*+$Q rLq& N#U͛)inOYWlxneR̳ݻk4Xj589& kDt_\̧Yf %v;n~P*_I,aCc#ϕcV`0jeJ(h <\vբz^у>:zҖ2"{PA8 ]R >YF\nͿ^=^)YiYYԗee{˺:ڧW>wܱ6og<{i)ӲضlYϿKfy:&A ͼ߳'f~LNGF 3Go;SSo_Φш=YhHPw9?`TpЩT X95zby~eII$txdrRG0NZj4_\صkoܳu+R z ̅769$*|>z^J{HLllhN#QA: A:땕e*nz='to$(n^߹zŋ/)9Q BH3x۷n峺:BV+ԛwdTgfȎ|$j$2 ݼ[RR)52ԒE6}; I e86.+ca}=S22.j5$&rnB64jE˝Nj5ZM,ngAeIIQ]q:qJ\PNd@ DޗѡrMLk̩¤RqĈhY,Dw_qS )xt 7:z{d ֶdAR ѣANCACnZMPQlM}^e@NߏR7hEvԳgGᠳ$%aIJaBahx{w2 ^(/*ԓWRNϣ* z=Ͳz۷neVi)l@Vѻ FTDDIIV\p`kSP0ąʑO0.+NPV+, .WC865qƍ55_<ʍI>|p@d ^p:˞5%xLx{){"5i_SUXȢlY&*5^-%F{~zF2 dRf J&Nc1~l:blcee9ޝUW^QV.2[~>=(=ğ~`l{N̉|2'}7︃5~}?~/Fn2xr$Dܻmedq] 2 A>e[s3ޝvA+I'0b;y2xdW0Ȼppon8$f3}f&67VUTWS󡒤pQ,S`I ϗsaBl$ a(Radt4#WQdi(!/HIƤVc ezg 55|TSCZM(Y 0lB״aBa!MMB+|>z#+"G,*8∖R6{lGJA:OA8~ޯ!"-eOL$0B\|~ ,6[8˰=ǨI,>)#n̻zCR<n"N}͚kɈnK|7k&N2r_=Gǹ/>㬬b-A_}SYgwD⪪bۏ?᪪ֳ'}>N֥Ky+v FY)Sldꊋ9Kbp/'wE /dUW[o5p_7INy4549?^}5ݻs3Ϡh޲fseCq"Fsf_x{Y_2Vn7_<̢3[z2{{w)g2Fj~4;3>'̬a8/}htv;'O).ΝT-{=uu8++9e um Bg&I%&f0pӖ-{mJNܺ{T|شZZ-kB} g{OFÔL2nt`I֢"gZf&`tKN惚TVR܌(Dk4$t@KKys㙐Dvg.tY$` dn7+NsAQЪTDTĄ eE#lxXsjX, Zdo46462$tȊBOܼ"7RO\kfff'X=Xݎ: VSp#<޻d913kZv-N;>g~6POE8*ׯgG nN1#XK嬬˩ST. ƌa5d{,+^}/7秪缗_q cdž㩯^Zy/Db^^˶hs Hۗ ?wԾ}| 8~{{w)_ļ<^w]*feqsױ:s1cciv&!V+ nf56*)Z0+m6b|>l:]8xMLJM应vb^_E)+kNGc0Ȃ:VLNO猸M(+fz^`M}2BF^jrER##;zaNR1baͩ|p:ۆ*}>Bم*U8C'42Y\_>Ȩ([ X}_uRMpĜ*~Ptdǣڔ~,^VKQ㙃XF$ATjju…,}9jn~Ve_sR3|1yG[oaNH cImÒY8++QdeӨ3 wee 1EqԴ{Wk Nڵݧ9?ӽ |2#$%se9hƿ޴G#ÏcbHEQ,5srl]½=ǻY|5}:'Hj߾m7ǿl,eTj59Ç AArFٓ[lj5Z-@996ssB'Dxx6z<UV2 J&#d'2a}MzI}"#GRWn_Ct4HRK0z8T*RSSImxh;}t,wķ8AY&b4e5pI~?44xrs=0*Yl 07Hb^g\ǜ*;zێ=6笳ټupSbGyf7H /9sxxfp|Qŏ<1誫7j|XfsZ-Vz/gcL ^Z V+?]ގRqܹbc<9`o\r u{ XW2?ݝs?]ecQb{.OG%v5f4r;%f1{;$,YҮ(F啼<.KJ#XB7뿨y*;pjj> (n5=eGD07?'j)2I:&OjkneBN%I |>Ջ3㑁2{0E&EC'I|YW6p,#/;VBRI&W$%17?_:719| PQR$4RzZ$gGogj7l;UU45~'8\VXjf3ow dCrrK`l,x',yDGG=܃ښ5k8$**K/~. ͆` ++:y`fq ]L0Co``ΝL:MpΜ9Hįʀ0 uQZ 2338$P] /0|p"""믧/?:t(F}|;cdeeIJJbܸqxffҭ|1jI5i&M导; 1?[~>19Kï x\ʲzZ^${u~hv86A?o'>'s_xKɊ,za>S]vc=m2|ƾOq԰n~1,IIḿ2X,6Nrz=y]ǭK%.6:dGDTشZZV\y3tNKT|$jZ~u8kz؃$.HLdbih &EL$_VP$àR$,w:d⪤$NC/2C,Radt4#WQ`R@,#*GVc ezg 55|TSCZM(Y 0eM~r8ffj6 A\W[tdFEJRf[BؓO>O?̓>H>}oy޼y3Æ cذa;466rr駟0qD/_ٳILL\q\~<#4551||>PyӦM̘1ӧIL HMMGOf۶m$%%Gqg2{l>;3o<***;?]]tE\L~=mÖ9(/tj;179} loOr^ȁ[, *,QV5z=9K]I _ ZBu:,YAihIg_vqd|m{oIDR^8M_ S\jwP)]$I\D7[R;QqYa!getN[%Lz;Ҹ*9t3;1ބ`kkYrqF+Ki<͍))^U;UUT|$fYFn)*RHJb|||!I%&eVݬp:YbEARR Ie6yEgz No2ع bb`ԨU9s&7|3swuł %+srr8۷/+WnsVm)dY㢋.W^ ?~f 3,[=zo& I2d+r- ]g`6sL _|XV?|x }ݜwy@K?3U?S'pʕ=:oǏ?;;c9/ 쎸Aheb5Zg egwu l<*7n wߍ-?䮻8 |7k?l=7O>I1Ph5<ۙ3I0_|A֭O=ǎSWצ({^KGTPZeG2 s Ib3`NH8ن/詯g`d˟I'{p>n݇F继nSjF?(=ǎ%[7e\2 vM>t?HDQQM?xɬY491&JƍޒG$}!ȹ7^=lO<=PdK|fev| /ƒHTZZ愘nf6{V8pNGC B(PzdFYfq}=ч` mh-[2QQԣ֮4Yŋb**`XHKu*;wN;-NOdIr| ^{-soF߾}ӧO>$O<7mDee%\rߎ'++k[Yr^v_1cƄU´uV(D]Z2[}W^aԩzo'VA؝.I/ tU^/ 7'et ΃䔇"6#UヒLb~>Z]H|z=|z=9q"?2F1X۬| zqC/Bvs-oܹ͉ǼљLds uuy._??"JTiXp|r]bbv Xrg=(K{g&*%s_xV-loO>ɧ>?&M׷ ?o>(IOgьL&]y%;V#`n}A ƌ /#(S/R>s'j>};JWbui5VMzL߳'7l2(NGC ӥ47z^n'R"N ^u5ۚx67t᠌/``n~>oUUΝ&_Ni6!@VˍLUTP܌ ĆW@Qxd^.H;HNENǩqq(z<,w:ng@Pj5PTEQhe}>^dNU&#L&FDG3bOd$qe[p$t42uy17e2P_V+*| M\[[ԩSw[*sWg}ɓ'pӳgOx N>dB}Փv< 0!twckŊ :V%&&6G*վhss>moo\~8^z%Mfn;A P" f$tA`ёGj^gD`;'O얫Ss;z8myj@FN&JV`pӷjXߕ}=\FM:'OϱI_nh'O0=۶AM zI"Z#4 XJ^DQpTsrv{45q_q1KvT@VT%qqq<.2,Y]/`T@fYƪpF\%%#4B:w J+] Z^$ z^9je`nzv2Ym-mJc0HVK,SpbL j̄u?|WJYY)))deedɒ6%A'L%K()) 11;//HNN&U_GEQߙ6m-bQPPE8v; &PTTIJe<>uTeΜ9\ve)zcx7)))!33ŋZߏFaȑt֍s熗 ^{5.䒿Z2Z-&Lc| JJJxyY`zn{>~Й+s:Y A fUZIB\ GGw`gnV˗g嗣c.([zE}=.mҥW}4;tfTy:';ҐJJEVr 7n8ffgcR)PII:e^/JE1fDDz~>deah(2I:*nաqtzwo^cՊG)EaNe%c֮MXr돝Dj4澌 y$99U q|{4jzu:,j5@kjXTիv-OrV-[Pppll,w ʕPRfsK 8HHH`|>_}UFņ ߿_BK~1}t)))G$%%o[~> ?8/d~(Ž3aƍ bA:J^5dJ%6[GK ,{9w@$'Љ]3LHGTc늴`? rػ(ꭁߙd7}!˵c/X}@"bEQz퀂 ,\AJ o6}wgg?Qy)g&9$qҺ;4A,ILKMwHSb4ֶ6.>}X7ofs[[BMV׹M--woBчIDFEEqgq1_4Ī*d5EEˌ^9{IhX3N'+(zX5S[ŕv;cVdHD`zs^B^`ms3Yr*LU eI0LV Y( _=3f 66OT;sL?p8 .V+۷o磏>b̙2j(({c=(2g¸HLL$**^z0`N۸?>&Ltr-p9t?g)]w]wݵ\uU0b"""hhhe?㉋##B$ >cxuPaɣ=s|wK֔..0~W=:_K6);\!+kƒԢ"JI$|>ݼ;{~e +XSU~^bK[OgeR^/VV``6avՍLOC$Ihss39|XWGK,cU"-Z ].tƔ$NFۄJeGF2<2Pi׋K10pY&\0MiҠR]k552#"8fcTT"I^bFI > !t:wf;r:(*^ ;qnfjkk;w.,3ydȒ%K:fժUL>/CZZ'x" ~G… )))!((#8Kt49s /`8c:+K/ԩSٰayyy|GFYY`wy'G&99]Y|97x#'N$<<;zOk~cGɂ ?>>x 8;0n6͛Uao3A}[6m"\Q%]L  f sMQkVBd:]L۹159۷s IGZp02392*jǹ;Fb |>TI&LO'FUy,6WVzu5 NP"ItY Jcc 9+Ca/&4Q%pYF$IOai$$q#"#"YIh=?yyi  1 Lߛ'`:Ј >Be%^ Dq:)AALA᠑+yyCOcg$1[-5*e Xtv}BBx97ٽ{lB$I$^f?i}ݛ/TJ*UH "ZQ(hm冭[v- ܺݡ n%0y>7;rsDJp0'b!YH4Bevv:8?k0%UUlaء4M`fi)&tV7$$(,=Q5x1TrPA qم O"bɅ lޑ  "'JIDATYYܻm8|>bUxZ'߷la/s UZ]gzI ڸ;=}SdvDEqGI _4KBv)L^ՄAAܜdתYTYv Q4 aPpwI OTTpIB%& pEcl6NOgSK _,wXLe`va,wN$ aZS[KBvh(lbpxL䉊 (+Crۭ'&2wo,rNӄ+:y3 wwd p8^ JZ~"-tpN\\w% %E+=z!K>L7m"VUy_?DEQ29\^P@Ϸc eIn.wV5;T\UńYZ_c9Tb`Ӈu 4I44]2Ʈ]̒Jں;tAc$?4I"AUs7m\.i3 j|>",bT.goHQk>Ue&'%^^;cI43l9$>S &$٠AbhDACa*ly-[ݡ ŸiǼ}x-/RS k8}>=~?VIFBKL)*b˅6AakA0Mؾ1Ki3 MNfFz:Kp :HKû;*AA8K/A*ܺNfpIbbw% SccSUݼCa$.LݛPYZŮi$*ZZ8gFef2ffJ^*+y XUx TUŷܓα<&˜bbXU4: ъ 4\U;gquRC"";|A4YȨ(TJsՍ:i$˄21$II ,we҂9fc# mx H) >^dZJ 7" Z+<º;2AA8 BAajx YF~Nohhwc{,_ H#x%/P^/@ :]"^fRb"䐨i8^4jɅ,v:Ke*LIJ87 Kژ\Xȭ[ ,Ix%/7Xthi({a}cAW=%z$I"#$KYƢI4 ׋'"i2mm<^Q61ڢ"^t4UZ|@rCnNM=x|ՐUUwAA8 BAazjM0e.ۻ;mu|0TnGeu!{zKqmU{Kҥԗ2saT =Kvh(qUQ76(Uۋqz<\kqMQZZ ,S()aK[w%ʫyyLප4IJ:x~fI8\A# ^$HnQQ z^m~IwRNdIXAz2{P/2m>G7M5 r^/edF~cf\DX,ĩ*n]JH߾D>WeINf|Ԅ&I(  mm\^PyޫQxK{x(3WqxE -R/nFFF259QQO"A8Y$ ດ_ݬhhKziH 6E!Z&-~??45}c#,ik1:ڴu*1Nc˗_vm=׾&22.,dgso^Oo][+<~ܛ˃΋\3wcisyyhpfG;y[oQf 227KA8D* Oee1)!àL-brAI@KVàag7uŜkqgZALmRUIbqe%~.~@]|>hקnzuBddM#TYEq#]. zT8ك8;>'~Pq]r2}BBh7M>M~? IF.Ty,r:#֬|;lmkV^ƭ[y39(K}%=X BB@Q8RR;2AA8  WMgN4Y^X{^2r#p 9D/־ՅsUWݢE|`nmLZdꊋYt g==m?;7@q}u\\[ |PWRWO>og!82*9s8I9%W\Aźu73Qx}Ζ}Gwŋ9{2=3g}6{6e?IwE?tp;v, 99\[\[7/O@2edpKj*~%\V\\i>ݛٽ{H Y&QU97eC~ڔߟ#"#utl­\ZP4ߗĭzܜJz ev36l:(Z! cVLOt@ݛcl6dIVAUSUtdi}=sܺuno7n78|W<[zM Q Lχ"ۻ7$&8~[;n7GwwT;D$Ib޼y̜9/F$5==ӧ:>fڵ̜9c?=g AA8-wB5 $ʤ$䃸zr[2~irX4cvyXvѮuQy3.YRscaKMgl ݫϜ~:΍GtZ)#Q[C:=>Gwkq7I4haWSN|Zz Ia5t.s]֗/IX/~&tpEEhL MM #p %b Β>Js6ndAv6 -[px$:^./(t.NHox_?8mlˆ\|$.DZ,X4i5 [[6EaXQQQfM~?ӶlZlB,SH`b|^g;e;GYYoeΜ9<~ᤧ:vZwyhɓ'cZv-fb D$A4Mq8&%#8CV"v>1#.#Gj\1Xv` cvD ]S-.f+%~a\Y%GPD ˸m]VV̛Ǧ> 3:L:ep)C씰_>Hbn. 1c Ή'NU{ h45-mm\i8"6H:wz4Y溔l^\MM0ps[ 0>[҈!zhU\jN*^,@imj⪢"qMRAd 92!& 11jh`EAk+NeUͦi5Mt7y0YfPx8lX_QיZT2hE!DeؽszaӦVXc u_)**k풘vmmm0O\虒#iO|>dYƲAxU/ e?45}SVEA7M r}}h]$Y',&woK.rJ}sMnL7wܸ.AVcsĤI_n 0xDOHsM esiw_ɳfq̙TnGkaW_fBTA἖ǔB~jnaSYìR(hħq# oqkSRgr{q1k $0YK $!RSՄ%BQ2) xN'4 aPʴ-[x836`Q BR9?8hnVe.pY&b!RQ0M6àgNVV(ɸ@+^l\充kn&^UQ% Kh߾NW\ /$'w$ uzP<3fĜ9s:c(]eѤpB, fb„ O"K/e̝;ο/Ə͛ߡ-I'ī;?iӦ;C϶m tٕ.S2}tf͚YgEii).Kw̙3px;w.<O>˄ >}:g믿btiZXXȽٳ ATAK ZZXri`^ࢄCDGSWZʲsܷ/{mF /'4&]n3c9u\޻fBH9͛I8wzvgko2pPv-Cẻ+<.W\ޣv˖Ip˖PQAXl,U} ҂Yu7˅UQHPUu9۷z;=ٽ{'${maWUU--i23տ?+*x2ʆਨہ,bRsyG4 anɊ $%11.P(1 l6lHOn>wXLχn͆uu|XWGBߐm2$ū;ڰaoo'N`Ջ_=tff&-m/#pW0rHRSSw+Axmqyǰa=zcXxN?5\y/? #8bDh}}=_5{OA=uh}z+ u++iI4\MUOVhYz0[Z-uu|9낒k\_LUA.dwIAgA[Cr !QQ7MO絫fg`ˊILM/@# 1Gǖ$ˬx"vZ1omn7'4:2?Q7rG9W==ⳳ1 /&,&}wߥ`R"HACQ\v6FM i4:UVR>}n'=8 4$MpEa!3z℄]VmA̴TfWՄ\ϤnNK =bpaBxEt$ DaI{;dEW&%qn\؅b Kyaa䅅1%)ZoY | $ae`S Ӥ0ºf NUgrJpӖ-y<$.8tzLv6ɚVe%|-$&a@s3\pwwd˗s 'h@NNk֬5kX,] O~I'm_ 14X=ίsss:h 8MՄX;cor: 4 OđS~F\vm ~\ o7z+KTRct-M0-b239w'Ϛ{JXt4իis'' iV-\ڊW/&syYc9F)CӛoPVEH<_x-n9Pf t&N{p ¡.bL55V$~m->Oee1f~bmIkt;KJ(nk^ݿ?OTT0?PMɷ<ԧkl YxN僺:WT#Hk>àazI OUT09)XMXNkW |r*pY&B0MiR󱤪ŕ4H@nt!!,!k?w6_}0p TT@RLae,^x ;Nl6Nr ;%BjbbbKMMbݡ/mE-/͂ 5k\r-AEZA*+q:IFO%~Ǚr,s7smN܍6Ӧum3;ܧ~՛KF$$pڸ =]lɊŝgs Y8}.GFrAC,IܖFRP SUq9w&";47-|rauJy83nTMA &PYƦ(2뚛q#7rݎe?V: 4Y̸8NzWT?miLJ%%OwSdScc`@> AH4j^foصkwYb ϳ!!\s99|?t(srlLaPPގHQm(˄2TWsq~>YՅRUE>vVv;@l,QƏƍ4hÆ wa{G1|=ehG}y[]]WޣO{DGGz#^ЍD ^SCKb2BՃ p0;1&XU嚢"<:=&P>Ü r߶m8}>UUf޸G33C+%bᦴ4Z\\L~K  qJRsOz:bbĕE8)&IulBb۷n'iG/#BQ8.:㢣i޾Qe0&Ԡ BdI~?^m- 9Xaas[[,_ PU1Pn^|E=XNJbb"e˖qptׯguSLrȿ/|>7p_-܂$I$''3gQsEQ뮻뮻v{FADD| }3qƏO\\"|A%*A=D$,[`1g'Ӿ7a ɫFχ4I4ܺu7 Ī*IH4rUfE^w{3)1iz eF˵7skq1- dIh׏rrcjTx]hu./gڵ[ZCTLBiHE9Y,䅄LJzp0M~?^/^/^Ī(a4flƩsO?qoi)ߺxn㏰m$'w@bEXjiii\wup L>Y۷nmcѢEL8n>Լyqs 70ydN?t;0"##x[cȑ#Yb&MSNaʕqvavm̛7#83gAvML۽Ϟ@AϫUUܰu+qn4/0f2Ni6a7M fϦI$D ^/9ϯV1k5- $Ԣ"[[UU$$v;w+i|T_ό*<bPF]'7,32&eimc#+*cD) ᲌ t6(v; t+i2N'ADt`kap~|DeTl6lI:̞ 61rU>BEEɔww8ݢ &O?G!zFbTA3aLhUxnh& ¾i [~]i4:WTP@>䆅z~}fhh b!>Pq8}tӒ$1!&ܶu+h Tr|KNfjr2j7%2$qTTGFFCSpp: ъҙ(pqqL-fY apkq1UW&D) >$ K )vTTGEEqkZ| |Hχa2 4X\Y UUXVE\OlThnMqDrPg~zLcc#= \ve E$A=墰hEcȒĕv=BA] Xxo_4N'GHWWhf&q\.)Ū*>1ޯ婬,8XBʨzWU5z]gnY_<ЧHVE$1<2ᑑ\TxD(lus:y3cc*) qCD?6o?uuX0YnIM))9#U$'$Kvܺ7n7+XrQ3 4I"b!FQ$ _ީ%baxDlZI { QE 0hݑ $IX,0^yfΜ AH 4Mu:OH'twh  c,3+=@YU> (|\WeĨ*s22 ۩HTUUeuc#lĂ,rº8,ĕII䦭[YLx a1Mt9mfĸp^3C#"Xl#%Kߓ)iogECcS>if.Dhifhy9Um6lE^n٩ v =cУeggww Ÿ &22cAzM--mz:9^nOK^e۩4M&LpwoR.p7z4O?7'213~x_p! 99>}p{hlZ>DItvw8!Fxk&P3 )EEL,IT|Ȓ))=%W{Y\G@bU>!Uv;RS 68U[KwT5Y,3 [ rQ|Lۙp^m-^/;(t:UTKn'^T 651.p.x6;9 i94:߸|rghDB I>à筚ޮ%bለ -KsC/!.c`CqH00AH \f\(>{@\߾ >+yy\QP@˼_ڈN.(ߙC0;;JJxa4\UEc}by$qQb"##iV~hl$D) aaqaBBW=l2CCWf&W%%DEZFZ,D+ &P<\^KUULJL21#Rjh`Z2IGVh( "bb8)&a}c#_44q}=.]G$",B$T.$,rCC;l䆆sBUBvKbbbw GV!Z -[xdMå먲̲AH+WPysdzfQmGyht:`t*I03o"-`<,~*zy X}9{/ncԩpELZ#?"!'︃^Çwng+pWT˩OTR2ΙC7`du'Ϝ/֯{ԡCu5x%4Ș1\ dչ³&:=|M}WO>I͖-FGs3:|),~I6S%bU,;U: w Y:w.>zbbH13ytU|v}T[iXSRu 84WW/Q OzjɅ|H$IT|2yi2G1LxU4΂Vx yee=1]i|t|0}:u%%1i!V+su? БԳ*qQQTſ<>u*G 3fPUP{eߦiԩT3뉴Y曼t\lQII~}7㮿Ciw);׳sLL䴹s,V>(K>IqWT)>HN*7m)ݵy>iz+57‘c߶/{cnɬY||ݜ3>55,gp-`MIoᗤi<:e q}r#`Q7osz%_N1v} /ƋL-*b˅MQHTU}>n+.ƥ\,IܐJJPKJpx5xUems3lSYY enՋQV+nʖ֨-~?[c=X充xV뛛yO].*^EY\YdRGBZu5wn$iAsdd$dg},I `pDHI |Z_0M0@4M 6-/IxU@Ȩ(,;{(+V6=- YAإgN~"+]67{%y 7t|U>ˉw݅Ia5ts_^0 H0Gǎp2r?ՋɹcѴXV?+4Y6w..g橧8b$,j6+}ʱ*+yp16G[Ę&,[tqAjjw  o mko筚+<[~Ί%=$#ٴ oN/-@4 kj:oq<YY|S_Zys2FBÄo>b HŹq#Ξ~.([2GF Fxl,8p_O1Xv9c\ՕtwI2t#hpt.ӻwgr O ]m}Gָq_۝Jc[o3P]T6ܵy3AB-ۗKh6 t@+*_EW fgKEE,r:1MUG23yOU ibWUIi36l`}sswzP99ٯ'DGnTxqJQ2c֮_}0M,+cī*~? ,>%1(sYƳ\UQp:5 XE!YӈQZ~ޮ͛2)ݸwb"46Bh(݇'  NױH VE!Z&>_҆۾ñcyTA) A~Sy{;UW*H@υ ՃD>r$v[mEe΄/~]}-->>~I 8'\SgܹD3)SvFH !Kkr3_Kur/jz̝' P߽wK b72ٲU=ǻ7LBn.ܧBx(]Mc} t7Y=- 0wv^T$nm-M~?Ofe(؃x)7lz|IҠw8xWfsAzHKpXy9^/ JQ,-嫆Ӈ䠠%IGDFRn.yoq:сD0xg³#1 n޺7kje":i25){:$^AhV+{b]s3+-mm4xHD,3hvlFmb"pz҃91:q6CĪ  t7 A~J܁F0)zpy<]xa㏻,cߟM9vN">H[ ncWݲ#)Z.1ue6>~3X|ym"+ 7wEuc32HHt*#qnBv7kGqpk/ 2>R͝yEUѽ޽?AM$INƪ(L/)#QUU.Lv6FdVnƳN'>EA $}>geC{2OIᨨ(nں"-TV.ׯ矽{srt4!.$qdT###roj(L $ s[q1 &'sV\A" %ͺ߷l:0YCnOKcjr!< KC""O].~jl$SB߲2*q*lmk㑊 t8WUNfʑQQXA Avxx@`Ϲdvwh#G٬^>}X+ں,sĤI˼~ *G@GJ>G>b/\tG]uT[Ght4GN̊yhs5|8є#jF^q?./^|1.8(z*G^/k\_LM*)2÷ (|]w,smޭvqQHL]I _y 9q}-whcMM[Wc0{^UeotSmѱc9m?Ьgolii{eb32غr%ǣeޣ liĩ*`&*ܝNrPsoL(*ʷn7nȂlzk""x۶Wq FԢ"΋^c=$IZŊ-/gMs3.m5 ۹iVr8.9ccDP }>*,+hE!DeIOG$P2CCDMA[SS {|8d@$i4Xt0jVw?AA~x" dqe%.$M'b*Q=O BJJAxdGwչ--sxOwW9y :xӬ|Qy)&i@F @ҀZᅬ[^LN>hezśoC̙xLL$}Hb&'sO=W2d̙K&u9f?Fxl,~;>LevA|5>?U%&= qkt>>Ll>C|H@Bn.,\501 cbQXl,6_>8MՄX;cosq7w˗]?kJʟާ BOprL  S7ob4U--ifg$I\DrP7mJ/jiˑQ-"9Z^RBCL !}Sfd0,2=ɒxV+\.+/fMU%)(ƴ-[pɜ#Z {0SU$ Gƒ}pjllwcŭ^MGƔPޯ9GMI[u>i* $5 ~ުZ",FDFr\ Y݇%  0n7⍊ T{[E̸8 Ni6a7MU=֟~B<6~<,!}ĈnE͞Mˇ(I8Gvۺf,,d{{;8^X%cc#Q_z;rgu߁í[UUtӤ#b,Qa|Z_ckn$ eaPH@^h(ץ0!:E|P充䷴(hU屾}q-*>bcaF<N>a]c#_\|rx@0L$ 4iiX ьZ =$ۺ jllDAx:hE'bjQ=c|6g>o맞⋇fYgu{rPAvנp^%+4J4I4չH^׏T|x˶ܰe af7MWIAA,te H4ܲ2.ش_Y8)& SYY ǥTf&iъ†Vz\ =Ϧ.ش5 $zI bQNHoZJ#eXݻ7 ;sKZyaaxLKKOBrPvMC~hlRNgƭ]m/tAH |>^"(0{XB=ҥݢE =Nڡ  J^éuEE_[۹lFH1j0H4d2n+.Ӄ>Hx_?Ss/nN۰71EjHр<ѷ/y:$MQXU~=3Ec̈vzRn.E]kn+fIH VNʒЈnHM峁l@ݛQ@e Y\ؚD"lmkc^y97ndO?1.CAADQAa1wvFa1 ߟ~s%Z : &FQe*}>d\عlmżQSC,cSt&Ūx4;kypvUV $6%C$Έefz:=,C0x)lkCbMi3 u 04"KN Y+욆nT|䆅\v6[{ 톶6?a8=V64kF4 e-d4&M~?^@$UV+XZ p-FAN.ŕ22ulTrPA+FUYÉzGu7MfHYYg]¿33>%cKB|O7QW wœ҂qz՜~=߸!GeΊAx83>!!:N(7%>arUQN $\~?X^89` ⼄l.LH RQp:5>i($(:oVW3ufF\ϋANAaIu5>Ja$b  \TVfM i|ccy'+*(ioG09(Von~ljbTTRRDCUUURBa`W*QQQ,Uh+? !9ըQyQ„&}S_\|\_$-lB$&~?K0!xP·W^444tw jm۶C@AF]gڵzĩ*^/ltRTuO }o!b-Fn,-eQeeg Qwxfd<[mLu Ih1*5({d4YRUŜ۩SU4I¥GFP>d硤@p[{;I"VUQ$,ʹº;da2LxSZ sbL efkwl Б(Ɂb'&뚛YlikG$"d0$aMy!̀0N̐8**FO#ww$ ""qݮQ$Ax`fI 0h5 qTTTw%%%tP闗 6cp8 |HEEgWaРLѾ} \YXHi{; EpxĪ*xfZ[yVol$$ &5>qƬtΈHZ~^i(Db~~?a r]rUm$a0:/Zhu qqJl**஻ $`̘{4Ɗ>g]s3-~?HLłHM)I2!!LaFnhh{nQjuw8 D"A @3nZ*^4 1QQ)))TTTg} ?)//pa1MEs6|AZYM;mmL.,dCKKgE#baNLƣ}`^YO;S}>dIxfwI _AL nf(ExJJ"1H|80huy3(DX,|xLIܓ"ނ^ ""p+XrMߏaBEA$_~?~$X $ 3 J'npA~ޏ#=DccA(p{rUG$&'i; AߥiZw $I\ncUn-.aWUbU \VP;J ᕼ<**[hET|ܴu+>$%6A̭z1j喭[ֆMQH4uŕoiLr+ S8;.N'*+qx2VE!bAיpzM '&rݎM̤;`9<*,䇦&b`YE$nNM))=")t@in+!:{ N9ےIAA |>V44Y}=+nj|% -5 4i5 Z[¼r҃99:㢣. G\$pkYp`#"s+$y1sLRRR:_x1$>cԨQ\z{λ… ͛R$Ibٲej=8 ̸8UQp|hD%T{iprL NaH}۶1{6} GFEKOGB6l୚¦ܘ*Tx4$M2YGGBRy6CSJ,XT3֬bb#;N6U匸8ggС,xB-jtrz]G$5$M#L)nkrذ?Ľ|؈e( =H ި!FQhQdYTo9spwj*;<&OmdngժU >|ow@Ta96:E99ĩ*UWU~lj|OSYY\@S`F\"w8a{h&ZU?{&(x%$Må\e SiܕΧrqB&P(5KK9v:TUɂj7mDM2,KHL~?X UUpᐔݑHEo<ҷ/vrr(!E.,u,Di2errH @eӇXUIZE"IV]MYYD*=ﭰh:8<lu뚛׷/٢hK L.yOq{Mgloo禭[ydZJ bb zr֭~4 i \6Aa!$'w45-a 'DGsBt4m~?66O].^t$(І4.Vc8^;<[YIrrt4l"ḪAzWINm-%Ճ&)I^z)]vI(--ݩo)))aĉXV9)//}rgBFFN|ל|Ř1c7 I$xb~??ݻ7AAA׏w}stmƽ۹niioÔ$'xSErr2 i2sLIJJϟOnn.AAAӇ~zўT 99 T%*(?ⶶeeIⶴ4f#KU>aL|*wZ~"9W}x+* '&b9}zPqNz08E!YӰZ,|GYí[VQ#4T60k,fż}-s_kKD+}0uT^}Uf͚E~YgwOO䪫!!|Tͦ 8vӻ;_;߳~z~à O9ru]ذ;7~Mz_Aaz-mm* 톁,ILՃ{O>dddQ yaK.%""aÆ駟ׯ_)@߾}4hP.ί `|׼ktMӇ8nw7o3<믿ĉ8(..weȐ![>h ͛ȑ#y/Xn$qqDZd}]Jcc#gftM{s,˟A]SA";4ss@0I(nk@~aa˟Gr͝IDM#7m,4$q-G[[rJ~nnf^f&9;}$IbxV PQDϊV76rƴ.YaheVޮ%LRtVସ8Ӈ<#^ 0p u=jRe#82*;{bMS].>^Q$H@k4:TWju56Eamdg'+yWg?"Ҧ&jp8  =ڌؼzsZ\-ZR%AxOэ"w~uot Ã^_QA)2; !r$Ճ^/8QT7˗/N $$]HHH ''5kaDQN>H^,WSSlge˖]n?G4&Le?~|qG#Ҳ,ӻwoUVYg%q1|^/澖/_ss*Гdr^ oi!AUk۹8? !7j\MîisIAef2f#ڵ!ݿ?w~m-A,ˬmn欍;=:K$Ѽ]Sccb͆bc.9Zz PYOȅ;z"fX~yr)t=HY$ᑑ ִ457⃺:Jq:r YH &jjxHdXUaIbaNC{E-WǢXyB{/[ߙڭx +- -WԳ HK:!!l117r(^SSu+c|~%/7hu#5~}."A(pyU&'aMmm-/M!CUUUl*|?i$6nȬY"44.?hӶ#Y1 cڠ(**mV[[ Yk=aW9Ta_J @џWU4 å,ҾqPx81--N)EEܟzIl}rDd$mr4p>7nLO1mꄎKHXTUÁ!(03\hYRUuu\UII؃;ֶv,,fbU I#HvH-ko`m-t]9ɒĐDDpCj*ֆ+0O7b(DKi^m-iJ7M.+(`aNuSpָY_ |636nϭ|]ٞt ;:/>UJ߼ kikBsyH2gv٧izc?MMĦ21TT=h^:wu[OcY{S O|ȉE[c$Iax 19ؚuWkO^$55\ԕ$e'uc0oC9Sp::q1r|OѪ"j؆ /#;e}.B>~c63sGQ]RͧO|J2 ثŢ􎏗߽O/"^RrS8xZ]ׯ|šhe(K;_?n0/~swq]`۩0 '}p:.ElZ.eLJ ^ƪ7WxZ<46aMrʍ0"9xA!-~?OVT ك[LLwvH[n龘Y$$$r]Z555_駟h".nn—_~i"ψ\itRVNά=!? ZRP/rYAk $̜>WTVGpDFH1Ս( IJǍ[P2%)&dIbRb"¸~V[Z}--$ 9Z,LNJbb\*+Ytz eBB55\v;b^ss3S )mo'AUH(]*@U ;כ$1 <=9V74a]4x@BłMQMfP$DUryAeg3g.߽gLr{R^. Obs53򜑝-[o_U1  .o;t{}y=}[^MHΕ߿wSLt]Y_:cJ Q]ҟȯr[SmVn&{ivaŴ;Ze74l2]ͬd-M}~s5=ꜗ~zmֹ0.-#W^MYYYmir۸qhkkpQGn2bBBBc'ؑ8 xM\((`uc#]Uqz\YX}2~,͛:m^z\ӯKJxV8U%XYDrDz*קrAB ^%"Cee,檤$.JH L>wGBa ۗ E6Aa!t Q;A$r cjR[<,҂I"B; i8^(,l$acm#'')+ڲZ,j)E|F<.Epx0W{L~dͲhklcKI\zz}U6LB\V?-2c.C\8ÃQ4O#[BcM#u~Ϡ}l|O=bYfKu&2gv&Lk7vfCHu' bة^?ne1t^ pڛINԛOe[Xj£9kYԖղrqG% Bo38ESbn?yG>Lڛ#<0/RI` Ni|ǝI^{1ܑ.?ۣH2f +2nTYAt *[òu~3*!'"^ol}v0||8ȸHB"CPTm^6ĺuTZ Oԕܵa&c.7WHd|$?>߿=,!"A(pp: :W{< x1{px9c:u*8-[\1 'ɓ׿EHH3f >ñV+C a֬Yv뮻v楗^#99޽{Ô)S83[ C9S~<laKg;4*f)d̢+6rPk(sd-vN5 y7jwqhF_4'&$"ШPvq<Ĉw ++)xH4Z~TYfZJJB`ǪU;hjj"99ӷo /W^ɕW^IBB{//̕W^ɹKzz:]IQl\wuG` b]`& R HHwݹcKwwvٹ}y멩a̙?ӧ|@vv6 4;S>,r wMMMdgg#oc$tJUf$&"=vAŞ$T>D%~Ep 7S]SfCZ4& f#;-NX;?bYy[L*c3;|Vg%[&aMJgca]B:}ߗGE{aɤHm}|w{FNɠϭn%{~Kg-exS[VGx?ݝ[ٹzOnj0pphm]WG ¶Ų-*`;KVW&BuMp] m&N^ͺuVvmE޶.*B61ao]t7;C&oo}SLaʔ)Ǐ-~ ow5״o ʕ=zt|w{h42yd&Oi  b{oy ''g.]}&L`„ Бs 1ALLΌ ~Ǒ$,V۹f]6FG##$^ˣDQsɀEKMeFb"A͝.YпhYYkQ'͎OFFrE`h9C%1=1uuT?`Yƪ56rGFqoX#}|ą~`u |ZM\_@jTVpUi2JUJUѱ KVĝ;i}iMvǯ;['V힣wV59ΩW il{hr(8 ;XAuq5YK p_TҘ<4ECtwmn7+߃3n:o7uu|3k'Iж=+:Jv C)W)WMo6>mk`G>mQ'lGѴw׀߯mMG3|p<<(L+wof_uB# >)*1oAq2',L|I$ Bj2^|< ,(/f6c$J:Z, n %@y8+BE!X$Vr|HK7yͼlj<ۦh,S(<ں:r;ÃϓY^SyyRU[6:뙐)OO~ʽ;wKe%F#f3BƵAA<#ڵ.|9cQUG[ ň=`\L& ZZaIjaMnknCS ߚf-mwekpr~۴'¯FOo,xa^]7#'mn4M;_l?~ٿq--hAo/n$@}=ORk.Ypt AY8jUl__NƁ¾ifh# r6x+>hdnY6 P(SUΦYיK5kN U2jv>HLdWC FڴЀO-G߈#E|Yc NfTV2-? ̈́:,fMm-gpoX{ypKz:kjk5q1)Z1 }pZb49 z%7bbx,;/SS9mr"rs)qw8"f3@'N}e=|;[Yv_L(NM`m,7~"Ww^/I5߮Չz{EAxSWa_ϼ5MFSÀ3cm&{L#[.}U:7's\ t;ٚ4 $nSASm|aُq$Kg.m?r`dE\<\H8)&}IzUT:~p 򢦤Mv규|TV5n _cc?Fܭdj]n_-JbEv61{nLv-c翿ObE_8: BQa!B,Si3`ٲe>a+IAAOv *-f(I+ EsGhhC}|<)mn"˄265 _twg~<ͼZݶ'"#Rьqy;?f̀:^%Ռ_z876rSZiH@j4tt4Wuw}PRgY:_j^\bьF219GQpsuU BI.ecQ-ݶϹlr)5/-\Ǻ $d 8s?ZLKC oDPSv?x2f.gRĀ3s隢cvẆW`@\ MVo~tÅykw,qΝw9TVQ^LI=9z]͓`ml!gc`F̯`\IOۮy˙u<=yv=YѭdϢdσ`&:3pre킵UiםF޶$.U_o$W/W5A pIC뫿*ͩW vǍ:]pZAlvP@s}3Xb- >op{}EE891As13ò8;Vd%49n=_@-ªoW2 l w?wH<%~k]>D|JOvƠs90/b' M`4!ikFr 9~'\t_WC Am׃/\͒P[;_tf3UJs{HDFr?I`XQp5x)&Kioޖ֖^f3&uF2ݝihR**bʬV\4G 4:YP (hMSE33VU% fDQtvGK@QpvFMczA3UU$ se%#֭cgt4$q?1yyppxyyQk)ԉ}wKl?C s /r%7xZ=vS[?H9O!uٷcO>ҡ/"--x꽂jUPYFp7#4AA8d0Z~>劂$aPU>).j|t4f4 1{wrt I\Uy";ZUkaOi63-.!/)Ey%6MdxL&)-Ep1|17:M㡈ZD};wr4ъR54F\Dlj^#ٙWbᕼ+.橜T]'Phuj4fcJNV4:[,<ծUU۲2 @$:Z3<5AA}haXZ]ͫyyl͘ tjUdbl@w!JEtlhBUQm6n ^',] II`K |8^{A'TogbL Hf4m2;22hԴv˛ FEqOXV EiMN*.fRf&V]尿9xf3orl,f3V+LpVIvs0 G3Bb4*ŜiRۋ^fھ%KnF#Ŋ`He>A?Alb{HEu>-.-[XX^HHAh䁈)^^v=p`(.A#Iy;?FMdJU5%D1:ԩS4{1uԮWTw"0Wccqv$\F|f~4HchD6jddbNi)Xv@wwJz]'Pqwӥ[Chdl` QQxKEV+UaJ^gn=>+ogS}=IB6(TM&qK/l CvwT=ܾGVBdWjUe p\L&((\\ 3 s]A AC{U^f3:Ф\+V/~VKc*px\[L9$߫5== n 幘̎ĢOLܱUݥmJ WѨXI|6>+.Fٺ;T Lq[H&zMl"PVl/=u^ZU545,  V,̤$.;3z+@Q mF;Ix-7neEM >NՊ$BL _٠ |%%n\y=+ ]H$A[4:F#U$q<ƏСCꫯHHHٙ<4Mg!::'''RRRX`A*SO=պLLL >oW_bM7DsssۈŅ$^{5l/~.]ʈ#`00|/]SO={iii`ʔ)L: )S{}[pwwgܸqXV-[/>lڴs9wwwZ+c*p9Ϗ2)Zq6$ִ ⍸8$%?>52GlX^im9jJGE^-Py*:_ `L@@kKCcef64psZWn՜RnJO\Qe4bxJNbG~>_oo'(ֈx0z^CudɑnuFˀXڷ]VZ;ogA> ]㯚lu %P;>/--{g}www|||믙:u*)))3UVq'0qD̙O(swO[oΰa6lgϦG}뮻~m͚5 &MTTOqL}LA3||mZ8&WUq[z:p5="M&ȠPQ$$յ\̤^`0pePݹwN6e2(ksKKqq twpCʻ S[˹JU $Bh4WW |}?i*W{UT^evYMF$! hF3ODEqmqaV]lLQe&GDee%+W$11'n>C̙e]YgEVV?< ,`||GL8u]Ǐ?mK\z饼+s9wq.cXZC6SO=>~<==ׯ&..<s~i}^^^\s5<ㄅ,˜tI 6 ŋ1c֭e٭1?İpBL/e89c:ܖhd2qL;? GӼy?![HZYA >NL6 $6s|Dl7%XU?77KIaJNshZ $$Ԇnc\$fR'zz2'%EǎF$*iߖ[Uq[HGC3%;OKJp2wT[xYݪ^~ F'Rr^ܵ<>wW캘LL frx8> 4 ́B{R~<> %Q VW Pl6n BiM,YY P۴9r$o˖-h4kyTUeӦM}5j6lhwߌ3x뭷lme鴟Yjqje֭T̉,X[Y+**fa0Xx1z+65ņ :Mf7qT| -9S(Hf3*+##wJŧIIܘF~K Y"ˤ56r|DR̫ djN$a,S(HHxG`0py` ܸwN6i9Zi|URBzc#o˪$FY,\G|\\LՊɄٌP(Lݵ/JJ7,L"ܖں:|f\FJV 1)<Z~  NN`6CI }6X,רi(,BjT_WFMBU2+,BBNY̝ ֢QpfûUZu t*jhnEp BA^nQe%$]Gn S9bl닋 ˗/pyшUUUtDYYY=|F/z߁̙`0 /pg/|}}+z,$$K%iSAtooދt}f~n$tDWW׏ ;v@I"D)liaBZswܦ7mZʒĺ:lkPlfRDWNAs(Z6 $TfٹY<i^^]fvC]wdd:HQp1y::EK۞bvHO' La[CF#Y橨(WA`^ `trWWfNKAɲuXT=XSu7l6\FV"JTv#FDKK zj >]ꫯ:(̠AXp!_}{&̋uo2*͍!CsNzNeȑ#پ};an {û ܶG $ #*9ii#$,Z)-iqq{fW/n6Jl,yx0r"˄2V+Ҹ?,CCEW/̋\k,ZUwͺκ:ƥ2LJIaa?$FgpVB}TՊ$F\gvŮ ]fAQsvKJȎss_VF֚Ю44''ಀ}f}cT=YXP_ pLP[c9Mp۲e j! r64'IXupGh͒曹Ky衇>W% ގkɉϓ9-55DpWF/hchO  "Օ32ԄL$Qֆ^KtIb"kjx%7f3LsE˫, BC sv>m6o3-?F,c(S]\x/>c<< 6l`{P`p8 Bj6ߔJ^--xL(6V+.&,'TQs^^ p%ZP-رʦ&ncxԴi\;p ώyض]j[Zx~ lFA]NLdv99l(*OnwYK/:źBZȬazgmȄ<ᬘ2^6] }Tf~>6hBUsqa3ӄ1}tx>;;zjy+y饗ϸ0<#햹۸xgkګz- 7xO>[nN;%KUW]_o͠Apq=z47p&MN>/l/Z n .^x`,q:a\O{qL1  ލdlrȠEz$13)||4u$Ѣ<̢;S9LJJUF$,楦Ŕ64pir2/699 N/Fu>|_fUѣtr"҆}>|,N_Y_TDraBBJL%KXzjj񡪩WW/`-MƧ_Rkn/)|ʬVfc {CPF,ZdOL gqĪ1c}} puUӘJ3o[{!1'tqv6 vhM>x1ٙkN#ݝ3Qo,C{`W;~zjy\u !r4q|HHcNN|se ΍cٮ],HK!C$dkkvVl,!|y3  ۷pY~?lu ]Az AeϧFU ej5 Wᢢ5jk׮DLJ(AAy~~h$ߕc0xd`p^$XLOzjT ImldZ\A8d,qٰ  cDFrJ'bz{0%!(=Ol6?TT®]d77f2h}[҂d4r?EFG߃Em8bD׬vvpQ(|~%hyy۴ wwB<<:<]iiNPZAz Qjc6Mx"  QHf4e6MYfekhތdHQp15Ҩ œ. N(W>9j&gͅ;CҢ|TXȻT* >f3n&MNa2qOXw5_ fļ*D??ؼw ӓhooH/y&g}96$\f>-ƌfq_2n@Zy~JRtstg|p? V1tL6AAdWUʕ4( ݺ쐰0ݹ_xȫݵkۭo\[~N< EEܸb-ϏF>ݸ@B<<:Ǹ7h~Y]|};ny{k1[[T{Q¢kJOAx% //gc}=~f3V]Gٸ=$6AAsq@:@$!W@I³|}y?!32(Z e%ܰc&&Ӌ n I^K eʣYYl^Vh:/QQl26B'$r^# hϑRUr cl@@?/z}栫+یuwTmUM Srr\_l4"؀b>;ˋ)QQ 83ժՃFjpHJm\`5--̼"e?-2%ҥ\wD{{3*!f#% 7V&YfxT/u>׫uR?^ά0/UȫEup.+L|w\7\o]W^Ψٳ914.ӧtla`&MM|;_iC液2ΝzTKM%ˋ{mЙ318qI'uw2<{q{AQ8k& eVb\\u@%aFAAww8 gWVXu@I^ש4 ⅘LTʭt*T`IB(SN$zqpf`um-&f3uJ1ӓE^FUoN~bVU4Fv||AT8*f365|~=`Qfcni)n̬b@c_`ٸ"0Errx۷jᘛkOؗ=dWs粣ͼĪiSP}nq h1*Ѓ[L/,DL--EOaL:C# GeeQ(:$\''yy131(Z e%uuuKMeVR'#+]d⅘̮]82--LرQThrGz:y--Jf"Eh䉈n g_qMPZ4 uY][CBŠ=Qx=\Zc#SsrX X1JS 945ܹFGCv6DD؏#|v%RXWǐ>"ݝF[T pDPQXHcM!<qpZl/oGr0}Aj#Ip$ {h0ltt == iiHng܎JJ"' Z,$rΝd55/I2ʳvbb4-zx4+ZM#1ϭj%@y-6ڟc=<~>,SL绲2 gl@OxxBf&b!>5j UldQӨTUf ֐#ӍaHH{p ]$SOuw r Bg%%jUtooNЄ6l9e믿8cpsscС{9qvvOdƍ{[4yqrr"%% >sI^^^}gl6?t Yg` **A@F2)sZs7U\̓蝴gII;9Qdb2$6sMj*GxO<=oo*% mІfJn.I☗YlJf4oXd$&V+uٌE)Zy 3neEu5N~~.z5( BQ$&BXpiUl+yyXuPYhjFpxI?/2de'BA$ =ԛԨ*f3}zZnv&O_Mii)\sMwyHܹs?~eʔ.;̛7zUV1.ٮ  Wlt4=35'$aww>KN&ٙ"Eudl''>MNDH$˶mcQEEw)q>6:P//榤?mdN|k'O1t2AR^kB`ը ÆA,jiឌ ߱JEN<"9W#[VT@HcǂAzIx8n4 b-uuu̘1N: e]F^^̜9Z.\H@@`[ב~Ȝ9s{^VV?< ,l63k,?x>#-Z?SNg|FS]9}=cHNNn]FA6WXv6eJٌ "":x'͍ϒcYMMXd`Y&RS49X#7]O6y2*b>aXΞ$^=h=}Oau>/)|JV590jԨvXd ,sj뿑#G~c=ƝwOpp'|UU~UAx&* #Pb4NAot.1Օ/wqj"ljTH N|ӯI[4:I`Z~>7S(Qgc]mZ$ WbEA 獸ֶX׏ ĹP(*nF#Uy3?7m˒]?,q5T/4Up YkjhΦZQeM&U Ue;_%'blOüy 9Yg8A Bgu5kj1с&]gB~>B`TRR.9u\]]$ߤI(,,Doرciiiar)a:}AX[(x1ŸEęf#XnjT74]83.ZӨRU|fM&~`̶ml0?UTpMj*YMM2f/'<a`4Ϣy<2Ol  /ںb>۾!8N{\};g6(4:V+n&EDpN:l0}`d=Y ]}[ADPQuWrsQl6L&''n Є.DYYY닋 k׮ߚ5k0:kl6nVRRRغu+f:R! !bpTJUuE|&'KJ:}^3_$'fr$ s>4$>HH`RX6XQp62 \};x$t-f|ȠZU e4"(ǹ8j2qGXx'2~f3.5[#յGՠ(jUs6oRdPYШ\ǏpGXNՆxFX""‚8 HIxA B2 Xu-$#o8Yj1bMMMpowyk2o<x~ؾ–nDAzCC;4f]FU7Qm6fa{ s$fS(h6!L~K #hdRD%$'I:*'CeUޝ;y&'h)423y!7l6,DS())m89Rl,RR8ۛZMj2F# ˹pmiTY}``ըiA7[DN5mډV*B+%&ab"1Ys炦 36.ު6Ǘ,mTWc:? xjgy̔K {Zl,.fҥPl:6lh=mjdgwi<6n0u*jKsr0}:30VZ/RoKx:1ٸ GBNu5S.r9wpD&n?πa.=GԴi\\6 A!57p6PU]\&(#ڄ `ԨQL>~2III|\z饼,Y 3C#<3;M=p#q?x0#2|87{,:HpRXEF2n ~j +WpjjjAr36mJQt:Ã`!2aaaJS'oPt33[ZٌHՊ,331YRQё$d"ElfzB6 x=?FM#Xсb/':0zUUܷs'V+GBXQ4x&:;R›-+A5q5hu'||x0"Wؼ^x²2x);b!]Ѐw٨TUZt$77L3n«† Yyy ?!!G,`Ɣɓ&lD{{С\=``o1z<;r$V+w3mߎ?ֲtxr ˸_HG&ͼI;w`.׏#F ;9D&_wgtoS΍w׮X?{0OO SRxqus%[rs1\ě瞋wuߗ_+;Y(mh`*/S>/k'ӕm]?h'PN2y56 TUm6e2R_s}%II \QlH-,:{r  DB(Zs 4x$+#)/l|\Tii;f6EV+̬^{ cc׿?#s'4`Ob4cEn³b>^mOvBa!$'>3]{2265uN42 ଞNKXhn:=&诿F6=f 󯸂Cuss߻hSSy쳙q|mKsrZ'cP5{nnkxl0>߼ɿvP񧕗_[Iaax߹z^y%""f<~hܒlٶ^ȫgۙ믝n/a3gb6=f _x!+v[ZZi3gҤ|2z4njĐ >LJ ` 8'N;uW`qwg8U'Χ7_)uy@bn`VNÆjē,3 0p>,]aگMcu~>w}rx8~..,ߵ֛[SÙ11|q;X__N5=;++yfr^8 >5EE/{;U'쵭^+Ǫi,رnĘ~89*?8_Zd422:5~ֳzC W#Pi^^  p8OGUD,SĴ4HNl$nu$fLBEtގRü+#jk2ejUYŤ56V|<=dV^Oeuiq1&`IIשTU3=! rw~XTY˹55!aJseTw _^νaa\df35ue  pXLLOH`$mnfŽGu̇CҤ;:SܕGpOHgg׏khuJIbUm-cmǪT&'EEHFrk 㗁$O,˔X<ť[h=_֭X쉮hEu5lᩜj&JljHHA]oW[Ci)xzATu_==m\~Ki)VM6.W׽HndGrmrg^j*}n?3[:x:9KR\_Ϙvˎ׏;9<݌QX5%%noqv6$%aT]Gu[,x99"qٮ]\Қ<[,KY_Xl`POG}Ƀ^8oqBB_O#= ;++ٹ? YU׻,6a`~̤ ͛ dDT=+ӣő?bҮp0D B7Z^SUUx؀zM`wwh  i6Ab"RSY[WE2MM߱/ qrn&33#+*5HELOH`ޣdXܮ]* I"XknT^"HlmhlhTQhd$rs1%$x+?o(Z?#L+oR&Y(b`Ok; ZZx97iu$ 'zMZU$&scp0G(rH AՄW^ mh=`k%K~h9|Z~wo*vWWHxQ{`yrcAxv\]Y݋.s U=Ώ"Gf 77] ,{ŝ.oldʲeLYlT46|~n:r1P60u2,wIsg ȭ%03^V[ݯl͍zzʕTC'\Ǘ,HlƎ6ubh(& EEhj2yl0YFD0?5_vki|_Fͣ͞CRPWǃjO۔O?oax;;[S;w2II2g~9wx"̊\ΌaxT$;cFNgQf&& ⮟1 C1=fN<Ɔ"v/˖e=plJ gd0ZZY11Զ޺u1cr5 NL&hy3X,L] 7I'`b4h0/''Zn_o/EF|.;nMx~J>Dd]26XiTW3gv~LOa~sA$ABZZ2޳,  GT $&r]j*V+$;22x?!/]L&މIBYjt>LL6 W7uq|s %Ib]]cmxNP ܑ|f\FT& x%6I0̤. ]U%@e5[ɬ>m:,8v)JD/H"{Sҵ΅&{`v6åvYRHrsՕg/_Ώ39=qo!L:dVtptb"SN?֭$^?̙sPpr⌘~lMy4*]ˋ+W\¹qq?2:c,nGZZ_?^?v˴Ngĉ<ܰp!-Jŵ%y?n|f 溁8.$O=ikŌ4Y_|@㏜4*|~=׭C4;v,C8:.JJr͆vן\t'1czXfUl4k9{w; bqw畳տn̗^M?~K7= pssտaXDKǏkXϕwxx=}=/\ +Wd2Iaa,7ӄ tjjj&1YAt4oXQp234{\6l6Kyn.R UItuHX|!&lc᪫jWW]lmhl0l$xd$#{G9Ֆvm83͍)'5) 1oō3#Gud-<{o2-3ͷ֥OcqGlk 6s&rJc]/ɉcvw(nʫ2W[[+f iQj&GD'lܸSzw" }`>HLlPQp6633QwdbzBgP(l2s3yz _?b]\(ZQm6BeM;yi׮CvT]N I&$0)"B$`08LJ M& V5 I"ҘFFf ;C^]~s3wedp]j*[7 $tB7#"iFja=A YYp0lXwGvDk,槦rW_Q̄.8=TcSRM&u:[T33>-clY <2t w 6?`UuuuÇoor kưtE>'|BAAx̞=9s0a$,믿Yfo)SIff&Qbp  ӽ( An1WG##;q7iiY]$,IYܘ'IIG/Z qrd۲2ٌl0KH 7C@jCwv0ofc/V3osy@ŦLc>az^ y0<+Li}``=IiJf];݉rG;~<[ۉ_i?^eepp}95"u7aexQ4?x従O0z{aDږZA8fPFSwG%G;wg^@QnN;$^{ 6oO<`o[n;3{/9&Nk_N^^NNNl6ƌæMx g֬Ys9`੧bʔ)~)//2)))h"V+\p?8>,+Wd2fOZZ=>,t [KLT@IBWUj2qoXX_{HL䦴4UW I2V+w>d⍸8bVP@`$$Ibm]cmxPIG'Ib2ۛ==iZxLͨfR"ͭC޷u렢 h̋PQU $$z]FU$n Y1VS̛gO z{Cz:ùvwd %D'}U|.BU`S!Ņ}PYYڵk[q<躎hb[omO=TjjjOJtM}ݭ˞}<ӯ_?/FŋYhk׮xGO>pڴim20ڵk9쳹.c y;\ăڦ  ]@xv6劂$Q(!!>lDnر55H!iiLLdpM  'Ņ(Z2!̮fMM.msSO:onAF,lZ2/ph)F#9Ϗ7SVFjĕe5?Ye qWX=ZSQ` A*+aXh4fNAeɄ,l* %<q[-^ uuv\r@KAz Ğ|݇; ANxNjT0)<dfA_ЮR/99UU)--b0c z-233iiNT9w'ڶ}_aa!/&::2|p֯_ϸC2x`>cL¨Q8cePLLH BbAx.7JE1S]p7:(z| ;vW$aK 71+)} Q;9q{FYMM8ZF( IfSJEarf&*+q13iuTnn@kw٧2/rY@ں:P1+*umvD׉')6ռ˖$ډ>N"'{,۫N6EsR'l{oAEEݖ3gz+<gy&>>>̛7_|quyyy۽r[gc7p555|L:}ǃ>vy< p49$]#F_n~u7|c]h42i$&MDNN~!=Ɍ5j3W Ba0/,FGՒQU $J33q58׷HRk%Z$ '=ėpVߕau|fd䷴^B=]O<ǼbEA6=aa`6*(s|}y;?KJ(Z5 etkjl6.pVZ C`ը+:8WjT,.FU6 0zk;1<wډq#\i4h4R 8{yq /tw8 T75/8Z  fMMMuvɺGɴi#::KyxxIMMeԨQҲ BAA`HuY $bE >LL=+I|;@G0|L>$t5G3oS(X$ IX[Wmx'>==;TT]|``cb+I<ͥ1bgq3f`ҥ̟?Gy^{m5<[nG} 2i$9Zg ;]C/AA`(P4:IVU##I+ILJxJf#Xsp{  xf VLLNs3ץ2[cTnNOgZ~>&$Ѥ( ܘ"l;_;D:;SlRxL2£\u+/4^=ئZl;w҂E14 V%)QQ0`Y{Zm{E=p;;;즐JBW(XPpDDEb"xxE+^QTD!$${/?6$}pfn7xcÆ 3!C?ӷo_?|M۷/IIIzj  4`h p΢۱*{{zobkHc==M77͆"!(WWr5 TU٘Ƌ`s8x\kkisWl Νws;q G3H[7 C54vU?++{70W`@E31ػ7x05w |ZZv5 ;0lnݸ;$ܚ5wyyAUu^}$醙m֭$%%5 ¹@x2N7RP^gu[bG>(Mth."* 3Jˢ"gd1o0a< /+C j٨T eܲ_wݳwGy+77rs)Ze+,dTrrW~v;8}X4y4bcy8<\$rqnnөoFJ!˄4';X_Z%*T `s׮\c8@F!:V+]\x%.;wnAmয় "™,,t<˓™cZl i%9σq 1vX*$MRy~9?%rt   g[$iH@Ge%R{8Tw;u% kk=9v$teHx8v j` HQv$O zx7ئH|ݭ:t]4vF55߳ {߯͛)[Ue jk RF 2un$@םE33!&#kcǎ|ɵ^Knnn6L4h\]]ԩ;"a$I~ફ͍=zm6˹馛SNlذjjj>SQyy'$ɓ' &p}#Gҹsgzwy9r$d2p8ضmO=,[Ï$I<͚u2w\y:wLAA֭C4̌3={67nDe{NOIIaΜ9̞=|}}Op$AG$s /5Eu :Ί+طyWk.F??0uV{=<򮡊 v^M,GkLk8_™   X+o3:9\M#DU5?EHTY%'`UŬ5}?!vL. 0{SSIo UUVJKc_m-j/N8o0aaab9"Ņg`Gu5 (*% yQ` OOD۱d~F#͍=P 4 ӓ#"gk8+U /}[;URR͛qYYYL6 ݎ`l6pBYE]Dyy9K.=*Ax]w4n{2h x ILLf_uֱyfzr0?h wμy?qe nn9͛73h &M؈#o߾G ,))aƍ7똂 mH rf]6|Ğpo֘4 ׏%sk&zv.lKۘ~#-/#$2e >   uXLI!jŬ(`4 *59? NNfwu5$aJM ayBf M9ӓO:w޽{Rb2/+:FEal,μy-'Abs84TϯJh-$q/O^ 4|ѣK,!))!Cpy59% +=0v~Knza<#ghr+*!kwWN<>1t#IDjg(@2H\u"9(  1LJ1 :^F#&I⥬,?PtD;YQY]))[-} gPHFՊш,ia!ɪk>KVڻG0oP$]&BB[7Fٚ QU VqMğo쭩Δwo/@u'&"2m nA᧟C۝ «[;sğUU9죏>bĉ <իW3mڴD>=c=vhEEEddd(_-jǏg٬\^z?ߤAA'J&։ BI7J"abA]{x;Ұa߻z!<?̟m/j]Dζ@QyMϦ   ?t]@%V+333)uMcfF~F#p} vĨݻIŢ) [*++%e:u sm,06(WWfe5Ve+*qn^&.;4opwu5ǘ7Bt4 Jݗbb lh;ZڿϋyvV+,/ ]tB+*Hĵ|BΝss;'y>siTn V.;"f͚Ӳo???١dd02e SL!33z{ rµWhǷ YеvەݸsVI2 _l AA=c6@h(uv;NPg39-M']Ņw:u"Ņ\M(I* 3!%j E3HYHNõ*ܚEE'ǚ"nڵj̊@ՊCkqq"9]g]0cG|Mf#h$hdkU&'HZ ռ|ھYYv;B;6$"++9XܫHs'DEAU: ^^YdnO>9-8p YYYӫW#ukɮIDATvZq<̙3???OJ:R\'9c h>kwV7uX/)M+ЋF]@]e˧.,IkAAAN!u{p065v;fEf㞽{]]}}ĺS'BL&r4 EP~(+TI`h@'$ِ0V:2ktsj*%NH9FF\#vK5o[7FRpc"X۷3+#a;wȾ}dcVU|Fܳ NO" +]\( Η^*χ5kTӡwo֎1p@;ϟϺu9kM5h .2.rx 6lU>}:;ZSO=լM0իW?0eʸKg .^͛7yJ%pNYmq;w!+ەwҏ/6w^>N9/ԏ0$IwI=wq߶ǹUYT{GUI)ж9NІ͘1$NaHJJ"==Ǘ-[$I4luV7a~  S;r]@NÁEQ4LI@fuvwxU\$g4uq1Ϟ']ˋB1jee@jjce 6op7(45X;:͍Bb]K7[S}i)UE4:fcXL ݫ;tNZ|9BX3Y Ç,vtgI&1i$~iFMdd$=iٷ$I||:]UU:IOQ(u.⁰0޿j6o_bޠpB56ojv6p Iv0 x\w%"#av3>Sp^]ᦛZ;S&^ V竳KEE =O/Idtd̨Fqb0LxsBcr@uU`,Ww5a0 //Isc5`X뭧܅p@PhAVFXXX'ئq ¹My-.<=)ZqfEa{U .fql,LՊ,'32jy.0Y˔0@n0(l(+_;v`U=bcbޠ.Qxl [2 K6KPVFPn.P^lyyuug`:33!&#AV!^ mV{M>G$O1f }?q+CdLsML|{bӂYqf3=<=[;L6z w}۶mcԩFʂ ɓ'_SVVFHH7x#smʕ+;w.{LJ.e˖a2;v,iiis=$%%o>Dzex:TAyfoNΝy79J"""bܸq(1cXlq*VAZV|<7Ejm-!Jsy9z\HM%j%XQp8,3Cv3 ILЁhWWgdU_,I*uZBth)*Զ*ٿ˱qTlhƆvBp/)!&:{wСOs'BU3Q8t(j O BA Il;xG;\//3uT/_Ύ;Xlݻ`4Yr%:?v[6'OfӦM,\o3gbuҥK5j>VW_EQ4Mk&%%9s0{l֬Yq5jƍ?d2q5PUUb>`…lڴUVsyyy\~ȲG}Ĝ9sXbwqQێ=o> n#b?I=weܹ<|w,Z@4Mc̘17i&xƵ͹~ p5Xҩ&9z&&޽{_ѳgO6o̽ȑ#Kv3zh,YÏ8NII 7n$>>L4 .0,Yƒ>ؒ4!!-E͛ k׮ŵa7r 3g$11qiӦq7Vz~cݿ,NRw7ofРA0bĈ۷Q3sA\qqٳ\`3YYP'!0'22(Z PJV^M;$ M'fQ 8ŹJΫ99<[kCA8f|egSix2 ܆xy1Cy{L6WV{7AeedDFUZ&UQEarY7t.i Ɂ]||`p B;&*AZ];xqжF#$܁|ZXؤ}CaaheN`w8x"#Ϛj垽{ID۝_yF+f dHZvd}i) 7ek5v;ˮ]y<"_E9 ׊ .dݎ54)u<XLOOgĮ]YYyβ0* jaàSA3 Ah$!uv;F#[E8ի4oݻիQ_!#IwgϦLX,,_~x%%%/ ݻ7_VpЫW멊dΜ9 4A=„jvvjRS҄$IL`LU> ƶpsƍG)h"^{5K ;Ǐl6_ٱc11ydjkk S;:aQccn/5_ ]4Sk8Mhd~L ;vMXw7+ss#OӰ9*V+wjlϬv;+r6?pUS)ur5@Uevǎ|ٵ+}}"%**7,ve?v;ٚ,IUop|VXrr UÇ~/1c|֬5eee$%%~˖-C$t]?!Q[n%)) {{j ,# drx8FIf_QȪgIZH gG}|sr뭷رc&>>M6ygb4ׯK.gԨQ|w0vX}~W ĉ4"/_Β%K1b]φ; o& `Ȑ!܇lfhƈ#>}:7|3K,9f5MP~ذacƌaȐ!|?iӦ1|KRRiUA5$\TWSh zLI! $17*6$C]{8LfĮ]|PP,TlX.]xN'ww>HLV+u Xngzz:85࿥\cGV}=fUhf#[P  o`24#?M77˃8qqDi:>wTnONnRع?grnw^Aڝw٤+++c֬YG%̦M033j֭̚5K$Ah(//˫c9eTHBML{eZk#p\x9(-+cl(+#TU)udw'djPۭ0 %++9-[ƸqZmM  gJ]g̞=\^YQ$}ϖ-[O\yH.X-Fw.b\]] {ܹFϞ=ٳgdb0tPjjjJM:: 4ǹS:{ lhHA^gcZ??>-,Sqe>,(v AA3 PUyS'n޽ZBTEᇲ2&86I*e̦ YWdOL:W[˃QY,(Tl: ,)[5x6* rVF`4[wxa u͜ VKmm-9ajxNKIIaΜ9̞=|}}Qx gk!==g}Yp!{nqӫW/>#rss:u*%%%|Gl;zhf̘Y<Ix'5weܹƷl2ٚ¬,^kHsرc( p2..drVB_ńL̈8̽CFԉے`E2n'$`9a_xF ;E(Z9ȜiB1Hb2 rV,BGe%#w6ӊ9*,,kkQ JR]n'XU74gn3 лwʒ\˼lM#PQ5y 41fshyw;CIs.a̛7xӧpqvO=QQQ^eeLL {毿gϞl޼{w#Gp%4fG̨>|)))aƍǟ4￟I&pEƒ%Kxٳ' \pǼypqqaڵ6Tz{{s-0sL6m7|3Ջ~w,ch͛4hP1膹}=hs ±w$ \<0ߏcXA8[o܈tX877n \e/YUUDAAӭ1~V̊\M&Z,'݇4>[Y]EU VvVW3~KH gJXpPixLЁf?AA* iXTV[˨ݻYKv0PIFG,Y$ ywniA8s"AFÁۛKA8?lAu{BCAٚƂ,7   y1:(uB'dbIa6xS'F''1IWUwZ@]Ky9LPcQĺ2?&^-$חw/) !JqGJ FE1rB[S mi)v;@N~l<N!p Z\],/YYhF#AJΖJn޽LX9{9PXݺ9+_Q~~>m*碢"*Мŋ3c fΜ=CΝyk(..rGbkz\zucGnnvCơuuu:^S?r|Mf͚lfԩ']ۜ'p,m7Ol?ܝ;[d 5y-7yK/- 9!&Sgc~鿥^Yڡ  cNH4UU5i\\xS'"]\4DkERgY%% ۹We"2|ޥK% jfcrZde9G@H`).` TUMTŊDވ;ATؿf=ww笽@5;$ݺ1, Zz x~zv(*:&'ƍjJ ફUB` x`G}}݀3xb زe >`=w͹!X1&g²ǬV+%%%'Mf)SHII!##c5z<qC H~\]ȱ?>Pwش6@UDhtgכ.AAA aLFNPd21%MvueiNLh$o4mI -|jܵw/yFH9V+$x+>?ŠD.jK3DF3x}7rrr6^p :V+]\X˪.]ۻ>߲jk|Z<\\x-.%ĹoRx2U%RS3%-PQlW;3qڱ#\yekGv '((իW7>i| 8ݻwӫWBt$;ٳgSWWGff&X,/_~b?<撒~z7.,p(T:K(Zy):Vl^VRV(EU1e66q ܲUWï?PW^W IWq7egVn.YFшb~0n F9o~sct& `8%?Oڸ>odڵ,2҅US`42ٮ]`**^r2nj.]x{w>#'̊ %7ȜD׿8矍jsl̊jMXӼtԉ/US' <;^y1 ufBL&Veng~VvQE(  eT11j+ [*+y05n===y%6OY&j``\ğs'--hhT)ٸחϻti!.11<jSeVq=hZZ^Έ]75Zdkpwݺq_XX'vpV AqjG9,H|ѥ Pfi *V+322k;bvVjʌ /<>(> s[o%11cM||<~?bXz׏Kr3j(;b;_aÆ1qD4Mkk˗dFAmm-k׮mL4 |M !C4#F0}tnf,YrJ1f~aƌÐ!C۷/>ӦMcs!AN8jwX,3N/&06޷݆l4Rl4Xk.}!ccO MaZWNSSRB%0g0m|p=TYmI8v>$]'8=7 #W/οV55EbcgS NHx…egdKn&Ɇ زbOOX3C,+_矧Ljǽ ۰a lH..fIs]?/D&Syql $$efXv*v3 G>Mhh(YM@gҥ/SVVoݸ~ٲe7Պ,;22ѣG3{&IJJ:6[n?g̙ZeA8NJ%d3r.l 晨&W.*⡴4lBՊ xcGno朩9͂,jv̊@Պ!!<zQp8x/?Y5ī9X$f\-1Ke|U\Lݎш,;KVL}}y4<Ć`3$&®]pp-~X|^8x[X)ueU6Tkɣ\r3'/owVjH4aki$1lf/OgfUI 6BRb]i)"#Geڵ 0&^sb">_z{Oh(3SS>| s"'΂ Ȥlp֪**.nЄcHFJooVur%w%$n2i8BTlMc=NYƒ\ضEXvTYH4M&EGy.\{擃۶Aih~>X,Х !dո8ވ yF͆Hۓy$-jp8yy~~كZAAhv F.|#ا~;Ԕb4IL鸸Ưoy|v;Ÿx{Uav7 ݕ嘏uG5`:.J*֒尻冖(z} G[oexYpli]gAN즠 ]\(u\ &qΌc2n8dYF$233IJJ:i.###FデÆ kV{*&NH`` \r%lٲm$IbѢEL0???mda-3f pBFͥ^ڸiٲeHΝ;߿?nnnٳqNEK={6QQQL&, C (H8Ccرߟ+V lA=˓ I:~F#}I$oPeSNB׹75?++O)699ܚLZm-fU` jEw8/4 wq9I{zatvw'jEs8QuRSYxprvffddPPې<4$I֍ !!؁lM( $k%wqG$ OW7 aG38h21pNBaZ,G%8!sB?!'΂ ,s_h(n'hdOM 12(<6&,I1`Xt),3k,_դcǎe̝;¼y8p odΜ9\s5|}CCj*^|EBCCyؿ?1 '2zhf̘YܙhWד I<AqAшEU4&~b"qHZLOOgMq1FI"TUVUgLڻ"]Lr!FĖJ8/即/UjR]]c6@X&Sk iif3TU9ת!yؑ^^̏!t$,ZAnBS!U뼒Cܨ({쯫㥃Y]\L͆ш,Soi(LЁn/g0* ^>^^|ѥ oJv6ٚCrfcmq1UTpXcVίyMFy( vb4?9cG+~]:@@t4r MĦ&_H{~\{sB//{Nu|<Y۶ĉ$ 6O)LKk־:v$o8l'W^!H߸3gڣe<ڎ:DE7ro&p`P @]CZ>*,lЄh\uU:LNjz,[lA#\{l޼mkǎUx49yW4~pIvv ̙3CzڵkIJJb˖-j% pɒj+ 75&ve^V+v;j=Z {m\xl?5ӧs`#* 2!]ft3&L= ix|cw 㰖iMqORS\F歆;=|'>GCYv6.'4ԹaΚr/2͍Ǎaè,(8 ¹j?])uTJv6Uڡ @QQ˖-CQ#oޤxU)Lf%mAsj4T9.CmEꚴ9ƏٳYr%z"$$IkOv AA8dWHtw'_Ӑ%ELKOo<2/7AՊ) UUqwJ1_W:1-=Gc42?&;3uF'##y""IȳZq7P~(+ݻڒjײ|6feQox2źN^QQ|ٵ+WO;!7FM'&Bt4BQmZQ;yn濷ݰqVVT8CVAژvb#0p`»»:~ny?WwdžQ.}!.}#1b=kM~kh#د֭;ⱋ ;j?O?+W6~ߔlNHP(`0JIf_Q8P_ϊ iSǍ7ԩSubX(--E#G@<gEEEtС񢢢q& L”)S䭷#!!!CpY  Aqqܼ{7F-|\XHģ8~ގݻI%DU T6`Zš6+L4WUm4)Tl:=Lnh@tEU4:F''C<#k׎Lٷuu) BmÜA0*8ow`a!l AA`:}vTMb1Xil+ )ݳ)iil̺u k ]d  cHqqgwp˫Cc$ C5n"4vLC~GV\wOsp }ݼ| <ɓK`` vSN7/C 6еkkGd$1Ϗݺ1)$O;(\};qz:`80pըl?8fI?>III5|ٲeH~ܘɌ3tٺu+III'A}:n ӠA ĥ>>\ņ2BUUXǭ4TN mG`` 6mPHlll;#0m4ݻ7ׯ?y{G4&O'SL᧟~jfk~okaZԩ1}>6mg~,[AT  `], .wDFF:CmЎkժU6k͝wyV֭[5k3fhނ '#rpb!}`i$ gҋgSW%fVn*/ݻqmh˔i<c-mFvv6deev8(N~GW 5vcy~>~I4b]]sg,&Sq~>Q8hd00, 9;m#π ]硴4.)`hTש۹9(g0ձ0+UEETl ؀";΄aa߿%E`,g{Qrr` HHhzsrXMאЭ(uk6z9{;EAs_.[qaَ:j=bV[[D9jb0e F'-C=TTT m^^ L1.+f з~˼yX~=Vb1nܸMAsA[fU%I{RVvUΟUU6ÁQ6#YLǘ`vJV|F'iCvN^mb4WYf]i)VTi Tg4< F+-edtW|6eg턪*^Lix<wݻsv$`&u.ΡJX77'$0/:@U%WӨRF7o~u\'`lڴM6aXNҥKy9pnc2g>#$Ibݜ9s4>'xz衇Xj/"o~!6lhRGo>ŅnMNF$C}]Νˣ>w}ǢE D4ܘܸq#6m:\SRR3ggf͚5zA8 BA6AAWQx3>vqUhdMq1ȣ1u EA$4Ґ$ʱZw/Ax0<Ŀ32ȵZ1+ A–Jnڵ7< 5hv;0+uu(EU166F#Z,L !\վkdgCt48=zvTA98K}|x(*ZWj\]UWu^B/Σ ւo nv;<==իQQQ^aÆpΝ;O1b$""y1wmcbbxwB{=,XĉpbbbNz.ӦMo 00^zo1`㮑es7o̠A4iRc}=hII 7n$>>YAh. Ahc R*khfg\ËK{7@`L &|STfI:-|6m6z{y(  yUT}쭩C4v$@$d:4;Ci)wKFRFE1*8eN s8,,Fvu 67Y>-v>.,daVP F @F͆mBPCҰ]p8੧d7ȑY˫Ya. L% 49yQN"źNy<Ew93(,,lBCCjmojkk;駟npA8|uvhv]wߥ\4aQ]/t/0nɹf[nэɿ/"',hL6G1c=z4?.?? ƍ#gvo9@^exwLܰ` :XL^YBb6-8YYGTk;x#$  ]VWYM͆YU1L}Ca 6us㺀&2__fw}(i+4ffd`VUɵA$`X>F#OOJ`0YS\LkqqCky9+$ HU1-ue[?4dYCzhu5BnՙPR<;*97cbϓ쫭S7TV2bN P\OSr[8;|ر=zPQQE(++cܸq Bjsr).&}LC_h< I#Irwn5;+hLJ#gv̉nٱq\> }h_ ycf҆Y56ovX  p\=9pr4 EPF*m6|FVUլCaa;T:B΃iiW{ Ic-^UɳZq5P~(+={(дfp;w2q^kj7*NQks?w¼رYI嬤 ֎w߁,0:u:IϏvełpcbBU` ݹg\!͆'ʕ+6lFuuڏ%p.kw bv1wo[Ԕ4;ϏBzx#M5kxkP^~~fdF,Z%1x_?>mNqAhfQAA8OY[;4AAA8ˢ"eelZdU.aa9{%Y|0,T6PӘ:Ӷmx` m4cJAڽ͸n۫­VY,7̮f+Y߾;lopTV0x04#=Eᙨ(MH Օ|r ? Ea{U7͜L[ Y%_(>ǻ袋?M6qaE BӴ^Mi''Bģah$!EEdQUYGqKJ t`;yǍ7ܹ_sl./_z> ˬSuX1)udjQE(  etӹ75|M#DUQ%P>ܙx77:JuÁYUITj~ I<ݱ#WQ0ТdqWJ %{.8 cI|\4q"6$QeEv -DA8sBL&n *5'}.  gŽ*;yyDRgi*o3329a$|t4{zR`"~1ǣ ,wþ@{mV±={ tpq!WӐ$1Q;jn>wˑ$ p|Apャ{)\Ы|Cڏ?r;4n?hΙæ&0.>w12 _͍77zDuwgK]E}6*6KUTqtz;vDa㫯{w(׭cO?TCR-VPdkob{W!  {NHV+Vd:z/Ws'YF%|XP@+CCܴk* 3?&Y$Ã#%55+ !Jv}=kPx;7)Zq3[:v;AĐnƣ=l]M(8gUm޽ s^2>3 y{kWde$7lM#HQUUm6^ᇲ2ؑ}|N˩\Z; AmiOHMi)?*@o;$qҵ}n_ǯC%bs[(d믃$ؑ~2_={˨%Ko={:QQܸx1a=z4wl8SFX~]\T"i讻(JK{Af̊D^p)S@e>/*bRh(Ѯ  h$ٚȿùb9iR.ŅEٳB Un煃quf$BL&ތgTr2 GO 1+ GD6ƊƧ@EjaTVRiVlTlxipwH ICoRS!+˙(Os_~ll^zZv.<;#UU  쭭dF35<E9-m-vCAhC$Q^^ס; BÁ<2cF;28h[?/N剽{1xql $]3\};vY&[k6\ AAi쯫hMu*l6:3/:|c$d\@ED:7k_?3~m6rz"#g4k_IqWJ VTc4Rci8_0 PiQa. 0"\\Z;ۇ:us& '\NXs<{Ojm6ggfN6*ITlTlĸ2cG.=niz"//Ah2M(ZVEEE ݵڣvmV5II ? ,Gqe>-*bbHPAAhau6p33;M:XPXlg/zӟ={7+@n6)?v ~|I6&y|ֆeY4AAjd0>7_}+7]˅߮1L:Dn-/EAtyaa0pYՖjzz:4AAa,W˪U|t( Ns΢96!OdAߏ;|Atf2MBC\&p'Liu6eq[U:ڗ*<Ǿv;~?&uwsQq1݆1LⳎ[[JX4M^:u##yz(V'7)I4D) ъ«ͻ5kUIIH7Qm;]]AM@TdY4~BQqII  >O oi4 u$ [dV*6񿶶*zgqĈm؂  7M㡺: MC|>,Dn!NUiccGVs++uUzJJxmXrH 8n5$UKK#mDIJ,q8W[]]I&Lz 9">%XvYF16s*+iIVUdpvZ˗e--ށdpx1TT1!* 1cxkj&]ۭ?8>1y8Wx a $ /^C )6v?֘㍖0YfMM%e~AA+++I"]Y~?qMٜ.J󍍨LRrqq1KZ&iOpjQu^/iF;mm$ksF3wT?:$f#\U& oAXslBf9RRV+/'UUIPU5kxz(5m܎傟~0@p䡎jik? TI* ȑC6YTpSy9_98 DU%Lhۙ;b:YA°Hʲ ==FEG:A-:Ci nmKKv `s\]_AA<++izWUB% a2 | ÷k\$qۈTx<|p⚲2+(r돑Bd4Mr(*pAvaqq1\r SL!%% vm!lh0e:aCSaGsQZLig_QE(  lFmO׮喊 zLtMC|>Be[GQH P7qTBed,\AsII ^%I/ t:^"UUz9:qge%3/z(t:>l$"NUX8f "#i>[mmX;Y- 4 5˂3 ,>}#P*,?#Gi4|MdM#FQWtpAr ٳgsg( $QYYIͩO$&&H;8jkkح/!,,\.\6_5GqIIIv<@~>?s|7H$I,X0!$$cowĈTUUqw޷r0%IG/n… ,9s搔DZZ>&c1zhBBB'9(qN:udgU  BeYQ+WQ{;vE!QU2 ~FDʘ1\"IC]q߲H4*<.).mڗ"IܛA11EQvsIIɀ_]˗p]]o7fi|d tDn1b(O 1cnki.%%, V4RZ[a@HWf 3g>ԑmY8!1Ǐ縄M-XM2 nXAr ›onKtRRSS~p3/R]]͑GUAfo'{o6̘1^x^{<: jjjz?#0aBoGy$_|1w_~989x뭷HIIa:Mxט6mf+z\uU,[}JN9{=/57uh  b()']e|>z,3SRxk8&EE uH$erTqRcpNXhA"#i߶uc[S0H4l6ARRhn!};Tƫ*ώš:`VirCy9a@q[*f3.ZZEGa{ 11PU#GudZJHȑ $U%fkcV䱺:PAA;!*h=$77EqqW\|E89r$'Nio4>}:_5 \s yyy$&&p8_RRSO=ūʉ'!Byy9wuo6!!!'Nȼyg}xW/Xb$q!K/ot:;;k1c~p [|,e+sT6wt4|AIO74pfr/"  ,vnXHE0uBB3bG#UxV4M#f㵖FqtXdA]hiaDHWgem#azQ%TMC\0WNJJt ÷{6OrMYobXIFϝ8tkwbY㏁֢pQ1ԑ e`r'PAx6ԑ I8&!)QU;t|$*Fs{UutpWn.C{' G\>;0t] 99QF?a~fqG6al 7|@CCC iy䑽L>}-+c࣢HLL䠃P(2999L ''iӦcжв>p|9IEii|p6MT0=}AA`bpaGsGNi; #9s~5 irm-7儅HAgYCO3M#',ёl4yGxIɚt&N,st|<`BdvqCa¼|65a:JP]N`a ֮ T zDICՃf  XH4̸8VVRCtEsiqVquf&SREsvv6OAm)&&C@$ Φnojj"66vJč>@uY^sRPP@xx8g}6===%|3dY4Mo^Ӵ޶>V ͍3bĈ{9s* L+tE"<=9(QE( X z<=IOrCv6$%\{EGs[Nזѩl4\SVFVHXWt4wrui)~?qJ dWt6:|[ˬYzow8/,,jh"kkW_~'lzqN ß$I\Ra|yiiC  ulc#=IJڬoYLAx=H#hDRqYI } NHLZ\ѻKymXFls>1h]%6,1M^l~v;WddݾC%+ #QU%כq91Z|=f0c̎ 0y2c.NU??⸥ʞB1 >䘕+.+3oF( !;gŷ  .4vxG7im;ӧOgѢEL8u+V;;/oʕ}Ji^/iiwQSSg_z6m4<^oqleʔ)Č3clHSA:L੆NKN&|+  ;e]]݄2iϲhlܘ9))î$I\EyOﷵ$*+G |L*^^knFUUR4 yybJk£ `iRH<#i11;|$I\ArsE~?)lA[u' NgPRh/ CK(- TFvvG84.= [~n(/`5a %CC#} l _x;utaa?]uUeƌ\|ŤP__ϧ~i0avw?aaa|$%%nnܹspp-lR%VXX /;Czz:9995 .?믿I&rXb.{~!GuL7|\xᅔ>)**gyf]2P?%clxiC  0|h].$ubrT1f6w&,s^==&Mӈxuu\1ɒ=y|pi$*].,+㉂AHzM7[ZxlKA'7vzr2Qµee* 3׬a~a!;M\ N'dgCuuhAPG5:;!**0_Oѣ:.^U&jXdMm|+!+AKgAa3nC,],.R;0n&dYfȑ?ϔ)S8꫹7/H||<'|2wudܹ̙39묳$3ggɒ%}"""9s&'OOnz!|M>h$UӈTimȕ+YyAA6|Qng|0nOaNHL$] e|ӍC  0@^/[ǵeetk,S,NONs`LPCd !8.ZQXċMM[sSS9+%.Ӥ4IUU|>.*.9X ^a|<8cp'7Ƌcư{d$M~?`k !) UuTDz#P5XWY$qRR?8 9ƒՄ>Z|>^]چ:tAa uOgYC|^U興`$[GO::HVUR45n7H--<^_OyO:Y%f3"-$nj᜵k$QUI4~]' n0_톈@0/FϺu? 'qqC/#4 y 2 ^kiᇮ.CC*>O=`OsW m@IՊ*5x0p{8 Y pY!+ߑetAL=uC AR8J K95)ul6|>ml6CAaiZ[{0J@cZn!Iӆ6^3+**2 U:JJxkܸ;MȑRT tM#QUYppUt`33>E$tSU5׭kU%UUi9:+(b~{|v^{pIfzrrrs᠃:,I~v;7EggQQRoQ񰠱Ӈ:laռ~AW=)^Z~& &ݧ~fM47jw1r!NfAVqjR"wڨAA-VfdTMk|ī*y@$ᬔNNJ¡-MR|9ũ*BχKq:tt`uІD'EFda!MQ "9XUQ8(&Ve;::WRG Q8aPG5x!;|>x#([vh(ϏݹD?BBPeiڨmkOz{}s:G^y$aaC0UϞ|_>G7n'/|G('*Af\SN ZQx[SA؎|Iӡtz~?@BePY&$ eBC*Z =ռԄ4I4d\BC:ԝ$IܖC͏]]i[]͍[8U8".{kjh,IB<m"#4#DRwDl/,b> >8b9Cwv ^/cZq ~8@2w#iɒĬ۹zkk#7wy̝6Wz%>!e?a 1IL?o:݁.Ce +dgŴVqz:1ddS%}TNoO/{dЋ僇>jEg=x#&O{];,j¦H>݇~э@hT(G]u&=Ծ oWZ݊ĥ1q}PC>׬'>~]=;x;~εry%]=ov~\O3SE\Un9>>5KVӆiD%D5>/={&˲Xr&tNtb4@XTX]e|׼?} 6)7o;QH drL|iJdC##9&!_g=Q_OC`: >ˢg(n0(' p:>iSU~^R¼|fu}ydZO7 |j 3gBHW]aaG$(ɌwV]u@ q+v\^IgCgv+>Z$I{ɯԭ볿.,b7k9끳zSa/Rwyg{M\^.B\Nzѡ}mC"{z0cI9I37N<>{-s{KU _<%ߕ0Y_WW=pw@ 7M/Q[yz޸_7jwմoG}L=PL9뵛lz<|9I6,.!yNG$ANIV \6\V YMQw7Yr1MLBdUP%PY(4ea>gTx#QCUgSk*o+KYRl! =/z)#SB5_*-d3葏z#v4z\=֦`Ǽ1W$*>.zzXJ&;ߛ a'5?g׏o؛MYzj8PݻIOg (NA9G?WWVV2gx/Srg x;"qNa댋djL `CMxuh0^65qڵLYS[U뭭z(DBUFHJFdWWrH"I2v4tM#&xqf]^?̙EE<@Qw7e ;_]._ւeiX@χ&3+cƈ 986Zdle%%86m<Ȍ+3uϓ*Id(dj#BCzx=`##Grt|<4IQU܆2!fru f5 RR:rez0++P=zp* 9؂GESQҭ|v-Z[:ԝpIM9q ;{go22>U{Rz{^VjM8j;u? -[Oβj 1;qǡ$d%L-MlZl^U|^ѻݾݗ(B"B={o_a`ݝTg8pvfkyCΞ^ًf86p}o~ aS'or܍Y"&%&p<ƞIlZ,Zƞl P|Kt3wv;b7 j[OGcv!*++;w.gqq챿xbϟUW]G}]M8p^j*ut1Mb+lmep+Tyg'sW݆D,`>o!gX ۋ7یӲU[$!:\bT$I"$x{tp7~e|'rouaqqkvs ;iD}=@5$ѡx,I;/ CsiFy MUIVUVvws}Y Knf T l4iP##4=v-KNR5dU姮.*-lX=avk+V皲2t⤤ @W'udBuO8j>!!X&jk+~5iU2$IDhThoZZaZ6x<8[̿x>=]=[m+BX@cIcVmj˞cV]|f<,_RjVihr3_p5GtqߛwwwtvTT߮ mx<F6>g=sVӆe6SF+O|iմV>'ms(aG'Ge]ј1c:aGSagOt4{DE$]Q &.Z\Ç|NQw7`R0JIѴͶ3,cf\A5Xh(U%QUIRUUh ݲcMa6M$Nic@Rߣm>0 n{x6?kv\,~q6{?l?|*$IbL6 #: /^ nF-[FTTvs!!!̙3s[3gSN%##^x9+?Acc#oHVXu]7|fc?6{"Ω I8/5NzL829vG!Ĵ,v8x::pR0i},ˢDzpF (IX@,FGDBFͶo`*{zaMw7u>.àݲ,E!2T$pE l{kj8&>#*J\A[SCO"I8 .`tx8w2nPXUFիiF~YQADx륅XA, ѵc4Y恼ւ 8쳩`Ĉ:9uhl,YviS/Z Æ0XʂFn|Ii}f e2q6EF2!2 &C$bUXUeM{:;U1- $(g) aaY8tyQDvٷ ;n,/N}>BdsSS>+KfoGc""9;KJJ(r1, !!$Ҍ "#//KJhuTfUUdr?`,son. Rs3e:7WT,IMݾAy3-En:6orq]ԭ3L>g&.Yq8F`Y 8F44¢p8Y’fT%o7~Glj,ݝt4tPc{DD5>w[wSq7{̱ Nݻd~xV*,* Y$0f'%/W_?9&:7A=HN* μ!;]E{{;_5U%%%'য়~b=_~a…1vmhѢޖL<_~vm@+99eeKM2*|?ށ ^^njf} B4LL yaǎczl,GEm(`lD礦u~::zqn!(Dlr:/77tC>oY6>Ӥ&^Uť纞n©$*>Wر䅅N>l=yysMMos++&m 99H}{[2 ##aqPGCr:KNN^B=Iav*V'iG䘄"zz :""0wl䕛_ {B6UVmC'{PݧcVd;&Go<7.gլ^jk盗_O?w:Eԯw۴`DaƳ=i.o[^ 9/y-CC"BpV|_h>o1đWIsE3z't>~o*xi1v>&dOaG^M|hƑGc<|Ȳg1u+Vpe裏fٲe}n{'x衇(++}n7K.駟ԩS|Z/,,MdٛZ[CCe!I}^xa`xr0I&aYlYfb֬YO?gZ^5v]g~CĈNių ގSd`[0\uWZE0>"#Ø6fczl,cc);q8X.>L[a(E핕<ȥUAn}>nmmkH''%qˈċʜㅦ&46a$rBCp:Rsk([woiiT\c#,i{\\\kcNJJѭHwH66b~?wVW[o3W!!PQh9ڋ._+WBv6`Y0s ,Ro{g*D2 6$aX.5"ˤir@L S٨Bz9_E^/$&eNfяi(i $"NdoeEƧO}J"tN P޹O9\8B}[.DQHʨG1&ws:ʩYUCWk@h9ؓ~2 ͏/VRՂ7 .-SF21ۧ1Y|'ԯ'42Ʋ{ُn<~Xźoa&9o$A8cq\|Y6L$*!qYmQeE;NaY ʚl'r>cG.3))׭x^7VeLӤ?L,mNkk+aط_\x\{̘1X|M;::0M>>{ 8fFm 4Mmc6V̙Ü9s%#SAX/LQ8;%fk.mPvdU==̫V܆AddiY8Cd=8:>鱱䆆 qI #/,3)ry7Z[i` R$i-y+228JAf,vn%f#RQ6 u;ߢQsDߏ&$k6ImA K 歚q'IssrzM#IUYrqmY yǂ,Iܖ&IOn~WlfoQЦ(ۺ;{gJDlZqquQG^{l}Nڇ}Nڧ_g䜇s[gc /&oyK=!!xx恿oIa-&7~3GXX_}fex:::zN&$$( ---}nziӦ̙ V}|| s8N9wTU1:<=s"DωW.8;fݶ6 kk*3sx K7egc$uUvjj-332hjLp83F6=Kz0+o.XZ,q81#DӲ6MZ$Lv h~J .+ .4ȸH:;{gM#ܾi ߂iӦxz~fԩK/يc٘8q"-⬳}DÁi}Y2"""{)--b`>}:EEEϋs*VrzRjk(Eჶ622\ac#uu{2T zL`M㔤$NIJ"+4t(.m6NMN攤$\̢6}>eX&;f \ȡ>AeYUUT($*Ӥ'QӸ!+SDvf~}=o\4LֺL"dsaZ Kv2 U:KKys8Bf$jEE4*^Z 9R$,Iܐ*Iv8UCיW[߲>+k^ I-+P=f >ԑm~dykn֠Lۢgt:pEabd$3U"#ο|BC3ן3;Ww> CA$F\_ϤIp\X=ѣ={6\r O?1o޼?|kSO=… ihhӹ+7oF';uȑȲ9Sr=p!`Ywaaa;K/Maa!LmmfŦ&BTMRUs|EFrwn.il43$k23Il$uݲ1;{p?сd{ω@3;súz:;Vi"[!eVlA11gobDӄ7ހ?ZZ¿5$kj0vX^?--x<4qqS>';Na ߿[cȑh‚499jڸ[7;nktRn&9^/YYY~\41BӁϺH / ,hlYZK "^ ;NǮ., q^ӤUQ%i11m RBBìS[˻mm|lD2v]ޚ>Μ&V bZj65j0fLII%,⇮.Nر$lEux&I[SCO":ף[1x +*U))QQ نՃ*\ EQw78|2 Wp`$(lH?8Ǽ0@er8$6bbE]Td H 'رE{;Mda:AŹ \$r8DoEEFFuuuS[[; lz_E"zk33:+kCvq.]Z466 m6‚uˢGDpMf&3bc,?k}Ω4iR.LKtQM(;*<nN$ QUT v;P.fm+e౺::xM(X0fxOMeT?*=_4Ua-G䘄װ,.\wHVU$IcFl,leu`YOswu58tndvJ vS}}6@T͝ ;sc@k`=:?͡|t{xMU-X%cLo0JQ+*i֡#FGy'44ȑn]`7S7bqJNBC#A]/u^hPs:PA}̈VY慦&OK#zvl8TQn"$aZm4 NLLibd$ώ7Ia W~]. AM盚xV8pE0hu4k339=9yp& vg˅4H06]4l\)) 눰0uhuUh HSNUWssvX촕$ItTYJZ~l6$`Ac#eqgNΟ5@{Ͻh/3,WN& ud[Ŵ,VuwɗՅ00- UTUe.$ MHѴYطa˂߆@`GGg褓6A?C\$ea[l(⍼ ;sSSiDysRS:4auṦ&z dUEe,ˢCqUJHb$Iþv;ﷵqgu5ъBL.] {zzo ®l͍|\iX@χ#n|{mmWر[5nȑz5 ~?iJe1Q5)ikTI֊ Z盚[nmB*+!!@Bm̘ g(* t~=k[;;iD2 6[ opai"IIq~aNJ琑8pâbSAf NAD;::; AnhdBvNeIg'7WT&RQH V \NɒQ ksWUihj]l- p3MpdaЩ뤅pCV'$&9@aVk+OS`q64iЁdU嬔HN&qf]jEhFⶪ*ݪܟѦ$*M>7WTʞOMf$UIbaSeq_^uX&0wp4Ճ aaDn*w`-u:Ut&X,[%6 ZuòPex11v;Is8*#BAAd"A8H>h~-~p;F#0$ITu81Ml6*zz:L+o m NU/?⸵2(E!ZQ Vp8rd|P,]-Ɗ ~q$tM}>l ܜMX2\Ϋ--oh e|IχdpNJ &'zK@E'7bn7Frs38i++rmf&WU {:T> pZr26IrGך1,Ҳ`2 $rU_;s7~ $sr+E!-ˢ;%_uvҡULg z7I(L`BpOڵ0z48D'  Tv,ċ?؂ ccc@,FMH-mNnx}ՠLTUsqq=ռLՄiF%ŬJK?7Ga'6 婆ך$e8 Pn1qq ygPD M&>9IIIDläF`~>|SY^tAZkn^nnFUUR5 Ѣפ$lĵee4o,'縩 JJE=д|Hczm6mXE,(g ꖅ06 ,T *oNp_&P80mOo2葏i 2[H HSR icǮ.mAfXW[&ɚ*I}grGN#†:]F<㖊 JՄvU0O]k=#^U:dAmb&,vY,}>Bd3SR!+8:8}>MM4|Db$I'&b$(IòxxHܭYG`n\]] ɓ`[@%[nnf eQNs:qۂ*D*AibU>v;Ss'DDlmW^nMMN9,nqx lN kCDPAcVD]煦& Uϵee|N$mZ5i#+S!2=6Ŧ&|>UX6*<9C  q:ߦ&$*ItS Ù;bbc:ay6Y&UPtEɅ7$g#\rq[e%y WS؃-LDDpNj68]1 $+KK{q6ﵵ[qw@MN*mklX=7y2L]p:;|pyG>=@,&~HXfJt4 s@}\ vgH4$IM8f|1Hח?"CC\a oiIIWSD* ﷵqMf&YC0 ,Rֹl+ elvh\w䈟f\DGscyy娪(hZ#'ŬRA;:HE!]Ҹ23y^oi2mt:,΅iïC+n4pap[9034v--~?IF]UU䇅q`L.xlKJhIUUm6>jooXAQ[noLH$l67n`XՃ=eN';;YEa`Yj 0VӐ]EܦIχnYȒD0#6bbngtxα<0{0>>К8Vt~"<<NBB8ö] ʕ+A[aAv$%m4 arsP%,⥦&N)*bM(ũ*cQ"99&!WƎeLDM~?n&IkN]RngC Vis֮!YӰ+ NHí99"98HCWIgm|&ccyah^;Cvd@@~>6N͆iY̭d۽bsXCI+JK)xv]XAvz଺O;:`:;YDaNZU5P=X] >ﴶrmYS-+SQN "f#=$`+N]gY䅅qQz:Ϗ{njἴ4FDW_ T_H4o#~yfGq3b޼gyc#s/ƴJ2|µ?,_4w.|D;O#^s/fYCnJXtPcYO;˖~z9W׿eyc#{ϟl,khؗ_&{Nv gA+*ܶ>®C|zA$#4#x",ln梴-6 TV,tMC ^pܟ/;11v,הA{;=IFѩ ҘC=*lfᕥ6vV#8-)5R5UNYl<[tŊ@u g΄2lt*q4YrmX&ID26$aXnà58kP$6oNNho?g YYao>@HVJ762/-16Zp.aDa!q_XA4xVY{EmײLsV4˲XtD}=_vvcDwPyL Cuuq{e%wo$u^_V#;G*,uzۍ&*_;n7|/uAM O,) ;vwiY5^/:|p]M)LVUI²,z,+: W&FF2=6tH†˂xm0X&M3CmִUU O8ab1%#c_CsT$*(Q8w190;8$&r[oqdA@C3"v7ߌ09NΝ/ lQQŷN'銂,hlԤ$qQB跏۹DU%D&~?Ɲ990a HWef26"ʨH %%\ I pA6aZpwu5 ^/164il\iibʟ&vt0&vx huFwpZnE0oU`Q,u\`,dL DG o0~<45'Hnc~v> rpep\3-'?Zhldϴ4^8x2zO.v}wg> +.檏?`Ly|qYL1M+Wv319=uLeO?eː% v}uN'7|++iuɏ @[ϳy8kDw_WWsג%T_0ƞii׋+WOF)-lk>4N3{9`zII9Lf<|>n3^_6X2i\]][oms4gb~%@>n= LWUUOY܌"IP1oUGceT^qpdA/6Iz56m&׽N?;,MN]h^8/[{N;i=Wgo ߇XɝKp%T\~9@<®cL uͮt l?$qVJ 9UkndZlP','8SH$\A3!2Gp'(uX\\ZR 8pE!YU׬Br†:TA^U==RQgX@!eܙS%vDnVnh`ۍaYl$l4{LXU嬔NM%{'m3<ϩEE:JEDlRHAixMyuu33>~d״wt4I&*?8v-ώEʕ`Y}mmpA`u~طzpU=hZ%Kr8l HBjeYxLo ID* þv;#"Po0 hnSO#,$˕}MiY\\Qe{M\X!N=nUQC צ&n $Im3Y|v65qN0 eYꫬhliȌf R2;u߷wqԩLJIdYC-n7,ly$qȑ<װwE\\?pS}$FD'sK/qx~>c ^곏}~mLnvsΜ9̟?W^yK/bvm7~i 7eƪU0a>&6 gyz;9;{Xz5? .3oec$'ثC ;;AKqqdRC|SH ˰,≆ 5؞ǰ,NJJΜ1Cgkcrui)ko9 0 MM_[KGF6 ڃI339#9yʹ̂F^$ f#T-ei\ĬRAQQ\ɭG+'DFrwn.Сl4\W^Nvh(c""HvM{FGQn^/i?wuq/ $y H;Ճ#GBwNu:: ڂlU~aU!Lqpl,M~ TBjp:(, ̮B]>Ou-t'*.t&ˤDFP0n˲/+ 3қxI,3sHZn[?R~<ފCܿt)?wcM.岽\ݤ&{@v6e^\4y2ee2:ܟߡmޟSSI^>,-̉-5E!=*w}~M\} r:\|\wuDGGsWsO?r9s&yyykpim/_~s2vX}]N8.]^{_oyG}Dss3߹798gΝeYXSSSy79y衇eYɜ2礦CW6GsWWUqWNV#86!̫#DH &/))፱cA[T F✵kz{g?=&L #0pw<@`hhz8ϱŪnu8e..,``͆,I4- YR`Q{$cǎ@`EjZor~/Lˢm3O??Pގw}x?74phnndQ}0)%=h^?74a5}*4E᰼<oP`&| G(GuKw77|[OGO^ n)?54pȑAGF$~ 737x9_VV')-i\ݛ(orm1~-w o7c,!O<233ygq:,Z a\ve())ᩧW_`I!Byy9wuo66 {2|>C%, ?:v ѣGn#9'&&P]:D~.).fÁ]QTIONX1egl$!Mw^v'1~T4MkyxHǂ lG>1J,N ᆬ,NLLu/bIE<;mm8uPY&EP$ a"K9 D $\ֺݔݤ䨨Gpuf&ﵵ$*E\YZߪq;sGsڵTiU].Njo'tagwPZ pa4,u8`qg'-~?^D$"dDUE Y40E!?<11g39*j~Hq1|f;VU*5-}9,Y[\{\%647׬_|{M*6ZPvS;oC IVFsҥKt{c ~OqKzmV0wT WU~s9~CW{MUh(1EDиQs<Rc2:6,8[/W^A$),3IB6LiQQ,@Ӊ*`F~֋h(8]'6:RL~'g G'A矣iGy$ӧOz„ x\z~,YBH[eV7ѱ WqBBO54 2pyFX,uXrro۶)0TΊ ~}w)ZnBe"e I0,nà41- [;ȡ a_.ʂjHKe\wto]˴#wpD}Is_Dž+ܒ`6<Ѳ㼵v-ۆB磲2=XfM{w﷾rsRh(6ancb|_c|X&s鶵}333?K7?ol޸js0ͳ˗C]{mPm ?Off^͆/X^Gpzmm 律 ^lמ KSSS ׭x^QUz JO:$^/&L`-VXAdacѮ2a ;U.'ER09u: #.B$.Is(=5ee,jm(A܆9aj~"f#f0h ё#yT,\0i^[YSx vEi|,w(?wz{FGsmf&z0781##Gi42̓ o GfV[Zpx`u|qKA?\@BDSc"#&+WƌwBNON&7,L$7x1,[yyH{,$'ud[I☖EE}#5F 99:ćgZZ&d$EDhݺ|Geeo%%}Y}^>w ȈO[kbYV6ceE KxbDz:' Bn\.JK οIPe ЯJ/f׳Ȍ ^[))ć $Mlዋ12#0ңk1e\4 ÿO:b4,>`;LgEPeH70PڗxZ`>Æ#!zʜN6̿|zl_{KMs3oXA^B,//+8kWҬVxoj.}Ǽ?+1н|+nh kt%#[,sG{ܿ?AA޲g,ଜa}wʛ+V OO XK,a_Un\rvQa{:ԩ<ٶ++iu=쁋!!L`胺_j^> H@$xMjiiٸf#:mGEJDDpA>%& _>#=*iӻ vG7 ߎ-LEٸ4!#qlM㋼'._NGRpyb"fgЄr0z̫|!a\OGR !=8w'Kajky" W-))s1Lyv;o3nǥ4:v]" 纤$NAaܐϬZ,tӤZG!FƬ[fPJow?pS͐ WW\a^/ .àܸ8^iӾˆ.r:Yʾ2a*I'KeHD(p3=HݲW/>ƶн?\Q&.g7|Ous3qSN!h'Smhi?ޡColo'O9Kzhu] u#SLJDa"2A6cUU.IHL*δ4ѼF 80zk].<^ Ŝnڸ [ k6lnH na ЁmqxMł|xL~O;)s-vXWTp0 ֦t}G;n!IA6siBou"2Cx 4܁ V+o'z `dt4egsMTy$h6f~n$ג hu(/祲2^U0EeTxD*w695||QSÛlr0LhU%TMZ BU<1m6z-Vx.;ׯkG-䅆}Gű -jiMx{w[NHO|!#QQÍ;LxVU>A$L:E? hSBsE ֲi2 jtw K0,;2:AV+EDi‡зc&> Gض(Bw]d1Gဉ fCB8-&ϫ* IJnHNRnVڕcvΊI׹gfj|>5 6nnDה v,DPC##y,3܃ =>❊ J=$ VU ep_듒fnSVLMbwGA#$:ub}Sv,5v(.fRzA1=&,[;<v(8":rreӦ |\]Ey"3e7YYt䷆57Ӥ/܅*?3:tfk_U$ I"bHDF2j%iwY6!5n SA|j[K@V?pu#;"%GD !" B"1ojkqѪJ7IHh mRߺ/AV+op$$ЬL**%VH48L((\$Ǹ*nj\AIN]ǡ$Z,ܙe /Q{rNEWWSb}6 <Rg16!X~#9N'kN/.>~´lF]˶-"**6ޒXe?.A^_ô@UJDM4Mޫ"IL@7MV75`fk`0pʆbhLr`V+]CC^4_ɟbj᫯ , BB`:_^TA: A@,v8H fTTpQ|Ms0MWxb` md\RS[RĨ*?xcn|\U3۶Qv(X,xM2 IblBvY^jke$pU 䆆r}RʼnJ,IQB0MKIў=(b@YA: Aڔ$I\mcD+ kX`37i7T18 m))4:KKq|XUiFE!!\eA8462 te&54Fy9v\Ax f_2VOJbTt<,?uڏ0,^QQܕƣ4: 2ڴr-7|>i/"x*OtXt($Ha4:d>  B=xpvvZ_^S'0 (+ڵG& % B;3&(sI4|>ޭ£ \Nh3$qwN8u7**PuHU2" NjU^S׉4Bdf]#RUn:fy9+@V 4:MNpvl,㓒d,v4j厴#{wu~Cr2+YSEH465q_.3 {i:%N'8n0%"I!0Q2CB8)2 !?hee0?0njg m >̟/G#A=A6(\41Ez6\=4 |Q]["#!K9#&:a4:o i|[[˙V14IX$2sjt4ٓDpp5WZ+e&:D2)AA2>e$q7={z׮ dΈ?Bi%%^Yx*+aaTz(Dum-/V6@}=Fќͼ۶kp²e۰XԄ*I4R,$cHۏ雷<޽ӧdfrVllV[ `ar2 vALp:Aك=#Ό+L)*B2v?7nDhUAשxH .]x[7CC{J~s3mI+VHq1n7qJJP$QPܖϽ{tVAlGB׋EU^-/Zw|NqFKIϕZ"IDATAr%$Q󱹴~=[ǿmLxM#bf,I8uR(',ˤa4L$7$1 d}M ̙ yuu0r\-[oXM>hpB{p\R 4_̝!o-_ΩKLH͗c;11~ޮc>x70e#&@(G Xb'O3AhC Ώ9pn e>G R[7m1PcT{ ͮ]Eᐋ4^҅Ԡ ʽ^$h-vMA8 KK9s*%TIXMRW/΋ dnC7lUxc4#9(Ӈ:w&-8/AS2>Q0g惞=,G32P%XUY׹m--mG>4||ZVƚfp1Jl(trRE:]Ϟ!!L zIX4f3yengrQH)z:l9."}ځ4:fy9kVEiwN]ǡhL0IJXBD9#Ш(nHJbZI aI-[x1'砂dzKK el nn/(nᑬOEsv=r׬ *:u"MS.D* ͆A˸aLpEE?"~Xw_kPʢRJi|t|~=pan8|7׬Q @2s$sO? S23y3I=o,[04l_0p ^Z=+zё#[{_xo*nRffNQ5d0qի13VbM7q7ܸ߰83}Vewsd$_q^zy\ÐNZ^׫fxznɣƛ˗St€>BBq,,)A$ON3Ϥk\>mn77osd$ww w}J?y[2q& B[W}ze q, |P~1B|Jn-L%/,rsEpP8GF25#4|D*VEJBB.9(~xxf6>ƥkIQiu-HMD41M?JJnMC7M|>\Apfl,Wl)2.POd(UeVM 'EFrAԉMMih b!^X`hq1dd^;.i2abdB>}hC98QQ Z`ށ$qgZR$8U-[$r2yyPU&P ZK0XzSNiչ}D^|<^x!pdDGSr…z=VpN煷WdXz:]p?rǏ?RtW>U;{6RRݭ[6oSOqO?q̙|wwWŗcњ57 JMgx<3j)<9> d\޳'3ǎ%$DhlIZ)s:y߹/u,Z ʹinķ"jC$̝Y|n{_֭NL$m7%,F[q~ nn&j3$bᏒq/<$̝˅|BcQ=%Ř1~:SRR105wV)@ʕtdXλ]+V<})%$PxtPMcMU'''n[q1tۯm߮ES5`VUVЯ"Iw Ӳ?%JTyc޸q(((fĉq'odĉ㏔ѹsgzݟ3#F/OӥK~m?~KJJ CԿ|?zͳ>ˉ'xHG7ߤ ~'|5\x꫙1cF~曙m(sdL@ϵ㹿sguky/kj|X$xUEeJZ6cMMć105֟iӕWfKN&stfs~׮(N(s:ӬV+(دu8Nirb ;t(@|h(^{?KJ8s=*}n;-wM>L? T4yo*{ee[o{֟ΝKRD\uZ A挜lL? ͛˗%@xU< J@ 1 (((G'r뭷r-ԄiTUaܴ֬q#KN5 (xHXx57p $ii0MUUʼ^*,=DO-A551yv;I 2Pbt ΝuLd0nih`Fy9\N,l .àF$҂fxDJNh(tBewq^A]zzj%/+<&54;< pngӉHISiuLIgQ v;FFy:wG}!K1Mު@$4J $3ccnn]"#aĈ[^ skxpyC# !jN82`eE3ʨsZo/)@8"=}Z$2 mͲȊiQQAӲ( +@c`SS) <*֭lih޽>6o|.]8.)iϚsogwʒ%L_º:ܺ@ncw5A8Ԏa]]/n ƕpb,c٘>}:n7K[om]3dԨQ%%eYLԉ80 k$QbUU^ɡ~H8:lRN'I 6MfBAtE"^Q#VU Qu:HU_ܘL1֠Zfi]ǩXd~\ę11l߸c% ̚@t:y;W;##ةhu5R[ t@!QQ6 6@pdIbjFཪ*$ QӨz=$11r٤DD`C|ouE2)Ϣ(DoQ<.~,IĄPظ_۲k  /ϸP]~[98%3w/İ09\]473c fXGpt_%GD50!kw9$g.dܹL6))DE)*˲;#K3}nxg*.㝕+«˖1e\lL8CPܼ?۾'kr݃sJf&|~=OΟew} ptS^n|TUUa _yONaa!lݔCˉn ٳgA>}pR>|8K.}pӧo'Os癸"8(A8>q:JW55\#t(iЖ-|]SC,T{2eg34*(]pڵlmi!b!NӘpmܷ ~ic}=QB$bprt4r,uZML=Y7Mj}>Z 0EἸ8hYx4#UMMlqHX$[VƐH즿6)|V]EHXXB^ErEN':mhE1`Y&\SU$I0M\" SzqbT'Xugޙ&x̔HOdf1M>Fl -6J. ?JN͐v?ȑ>xuGXrs(=[rX>q?r石*8lonnw4sd큖ꏅ_jڲeݻv{*Թ3;%VN5{)*.]Zo RU< w"r.ٓvhegVf[ON}|nOz^%;)jh൥K9ĆR /7l`DzNcz.{W1;:jL̖@SO>o:Yfh"@"wxپݶ}555lٲMv /m۶Ȁ裏ү_?y GaAPX8u_7_x>D mxE!LQzY[HNCR,˄2c]]{O`kK 7l\$*Ѫ]שxH bzNvvMdɝ\gm%AH_xzPnNI޽y%7"8x Xx23EA׉VU\=,In7^/-IZp0㓒x%7y}]߹3'GG۶Ay9Ƃ [Sege1:.za`4͛61/?O?%%pqdǤ[o la^bG UlnTYi&˸wIjz'&/9y Zֶn&zwz}4y<;}ϵFfd_|[ϝc'LLHkj܏׮ŻKt]c&[C ;_~%#F)_ɺcbb?}C+BeNNx׸{֭s^+f.V.ML䗆zޮ53p{fàJב`ٸ0>_IQQ\BeDM-[x!'砾[UrrhZ*^,\z1\ΊF9kh`eSMa(D,cXP$ 4& >͆XdXMHZ Z }q?;,# )kc@aum-1Jr޵+'G˖3͠ 8=t>ӱGXB8BJ<~bl^T55¢E``j* |ÿ `Yy9oH cgȈ|OE6,ƕz1񧟐'#&$' OOoal޼ \n\_O U_r2w ĻVqʻrs~)s:yf.ٓwٷEE;̾*X;EFgrݬY8nwRn׏;\G[xXdzS0tdF-[ƀCC]É ի %LZ{XJս{3믉 XfFZZ>a5Ny]n0p߷nLж`?0?+K|z-\uagɺGɴiӈ%#|cs9nKBArJt4iAA$h>WWa͛Mx&]iٸ=5UL:듓Ytum-A;#C#v"V46JɁU>_D鷯2/y.F`b/ب2Vl#eB ,t8 b!JUsUrCCy"#[6m#FU)z=z7iE u|_h aШ4ʊUQ͐@@{h( Z$2sri$Y,{\ό]9z?{ $֭㏇ٸ) ¸qGToİ0BCy(w: ̜:`h'C1|6CNL 7ǝ?HeSffvxt;~; [:@fgͣkprFo>'͘rO?[#G1'M">,^-}&jedz:9{c?7H }92'>0i0& Ӳ7Ǧ:7 eުUL>F&a-̾>ڕ,Iz9ȑ#'==}I竣%%m+VSOAb7%%pppaT,X߃vDPE˜|]:3nL 7~anK\׷/y؟wkt+̓R2a-ǂ<Ì&6=c{rM7qFy$I+dԨQ|nI9s&SN'x jРA꫼x^vʧ~ 'Ͻ˴iӸꪫˬA0:.JJp:VE˚C;&5:7oHQK I :P2,*gEpP8j4BegrZLL{QZiYu5޺mn7Bł4)u2s_NceMdɻ|W[ۚi0(x0xM҄.KL1%4;u͛iu(.,6ݩk$8Mc3۶qہMMM,kldBZ`Y&\SU$I0M\k I2yaa V+""j7BP]/#~* /wumh >Џf ӭ@Àg @pLf_bb.j࠰g?>6-km;Ao-~>t@X_]s rc~"8( Ah/|73Ԡ *<҃O: >"^3Y^ ' 1*˔{,VM5RTov; | <ع3'GGSp:fTTl * d4|(DNHWl'R|aܸq#jjHX&^/wqg`]s3KL,#&MNKhp?簨(NZqh| kˆc ̳Iz`֍.;?`:xqHH6o `Р:R~><Ct4Y\!z; ݛu+}= >6O|rk?^0dI:R¡5nL>\S23px ŽEd ؄WWGalii׆ JJ(U"ITxi/pD6)N'jjvG8!Џ0HLF6Ѥ_i)) Uu:HU))ܔB;{|/ K3{OZ,3,*q6DGR%22X@EYɠȃZ-(geq͆ |D޻y3]CC8ckjbi CO]K$CiMf@$,D1$2AV+"" 9< ^XYyyyyw56AB'aqK 6lnڞf0{6 6A./}(;wgv!G؞kHN,?x#{޽X716  auRTYlre-MD0_m-JK $Z,tV=D$df&Lr,gn l*HNp9b47rsz8A.W_ݻK’%pLB,X˖Af? W]/;+_5CW(% aH%&-覉UQ.!xxuirOZg/Q"Fx.+vGFE#|p*iibc}N=:1:>(e&vޫdv}}kfbA$Z 2HX,!KI9echxkpcs3}Ё[RRXts}=I 1ʜƬ]Klh? (!b` "ID*VXN&6n BCJJjY,յ+W_Flb $|[7Rşᖞpfd6FClPn '#@ BBA;?.m(UTYu5۠Wg7oHKł'PilBMZƤ"t(E͛gOϗ 3ane%JJxTU5 aP(OJδ4b2[H`w++܌0PR:CQn\cq~\#Bw`IBEM 'EEqa|Ak\< ͭ}][K$IAaPCA, DGD-45MXBB#ov/%`0kW\5MM$Y,,77s&%|m{9A]LA! ]Y_YI4ğTUB>EK׹eF \.l &P2jc"C8OJb@?M#n txiŬljBE<|LJOgڮc=667QUVWS IѪJa&i!)QQ\m1":E ALV׮%bIיRTqdGYYZ2tic#N]9PyB4I X0L5 ,hDžӵJj^L?0(˯H bF 0[r̂,+)ABZ =m ?62lg ݻA͈ .&$Yu5. JU)x{hG4yh~ۉ4!3$҅PR$Xf&+viD( WVrrt4#{a\{6mkALiܖ6[( x _xveD-TIcTzCJ>"RQe*<4rrH}\HFuBÃ[Mx81@9DA>jy9u^/QBł4)ud⸿sg:pZ/y.:!˭eD #"1 ⰉU] |][Kp h7R&X2?V46ҨB` 4%C0q$XPt䢸8}WXRYHzHowד/D54PZ^0pQ=#] =2AAhS"@( Y<173M"uMMt k59<^\,ID*>$xFlj1Ԙ.MH`FEBfGy.+ H)m0M[)p!V1MrCCsgN>*nLduSUU1zQUd}2'EFreb"bb,JȲ={~US۶QBͪ&t4 UbT-Cp{@Юx=$drYUn7)AA4:_rFl,Ĵ8--jDE3uk!IVH$%|j#"PL$N8x+&F==PAYgb_A8rd{3s\.ӦqE^<tZ7zt[L3ח-;u]˴?`Ue%,?9N<6WM[fX5_}PefX'@3sAhk[L>Hzzz{ɓ'_ihh`l޼yg̘$I|ab &Oe 㜸84pYƥ|ZU:jyL((ī*M0%% {xpX׹3]BCzQyu5յݭnluyF6iĪ*NC@N|۫bb0qռY^Nc4U=*^뒒գuqq"8(t8IbL|<.]'nG7MbTdM#%(HEcT{z<{'{fqLv67BNgQ0gfBXiɨpwrV\ XjkGEQpnskAq lF?sPQ(Κ?Tfn˗/ǎ~aDGspg+1/ǎ /$.4S}Vjq50e\6tY99,^E L;:=)BN]wuwyLСClb…G̱+V0e|Ad[*qqZV@,yM Ұ筎0M),$ł|Rp,TU :QJä-[AB SJ%ϗaUMN(2c;-ԣhռWYV dR8ua!!\ĊBSdYc#v77ӬW$E&( oh98Z9.<=N?y$Q(uC۸n hV,nQQ͛z 1 eba!fgy} SI |*'.p雔C8YRԹs:btRgW7 U  #e&n]'X\:j@^/,{O1%})Ca?\ϻ4QJ7\C;RVƷuuD* P54EubTyPY&Av-ܥQ%{1 >ndr<й3##wm4M8|XUjkq|Dbe|IGa(剉j.aYc#KNlhn00LYeTDB&]G$LӤch!!`DGD__IX4g6C4a2 {vD˗Ö-Bx)zI4 UjTI3ξ0M+iϞP^qqpyupVWVr?4ɈޡCgO_=1MW-0MۗN=輭[yYRV[靘sFd͜+W M[Ǹ>}RbtV~>-\ȪJ$I℔qXأO|n$1"=w.u 4g+**49ڪ*&͙Âmpt#8-;{ϻ?[QevO'L%K aoἳjo._n#mϠ7owߥ[ءlvqK=9EE47!CWeogyy9=l vL~1 'Mll,wnW\N;pihhhkFpp0s=;?O>cٸKq7CХKٶm_Jn/d @pp0>o<ߚ5k:t(ۗ ܎ߋG}LHJJΣ3fp5i$1.Ƶ'‘GXGD`\C30Y vݶ MS^"Udg#c]:F׋ D*˚ ri{C^}7Sd(|T~wV_qTuϪ8.Z*+&I hC׋UUgJ Ōn85&FvU]m-qƪU \q60eĩ*)AA$Y,2=,>$D e"UucN><tKh3YYt !HU[^]JuxeeXhnЎ[^0_A (+#_?10E%L e^+/gZIn// sg3΀6ߑGX//ǎھ}iإ<+X]U{\=C0?o9%3FӋ/&+&a3fnࡓN̜z%&kYx7406/O/w?E9h LZ_O;]c#GW)>Sa!g> aa|tEyyt>JNl~|u%HO>`qiscm-',߳b˽uƊHSP}{q1# MNNLZnoA jj/ )DlªN`o&^{-Ǐ'r1sL<AAAc裏NNt]v&L 55'x38͛7_|ѣ>}:o]***8ׯ| L8:>裝+y2e ^x!EEE;]IĤI}YnV>N>d:oԩdff2k֬֒ߟ˗ӷo_/^?OfF 6apWo>z蝞y摻IiOqM70dRSSy7ޭ[7&|g}`[BBBK/o{/N׏?'Qe.^QFnE]sV} '?A:cbY,xī*>TW~w"bg4|MH QUZ ZGRJJFÃ[Fnnk$A84|V^ΫyD) q ^ӤFeNΝv1Lv;TUc]EWU4Yk| pE8.KLdhd;4)xXtd@ 䅅1j-00Mη+ qv;-+_m0<:z~@ ; y[#ڵ(<F:Y=#".] Pnt|\uU{Off>vsLL f,Y™gr{ rJ3JZ Tt_Ӈ7xɓ's9pqsi t\˜xeebZq{Zv6 Ī*2P+qJ͛*#E奝UUXA!!K?\q WϜGgI ^HvL WϜj NXB5k.*=7jQQ*~k}O'ң2|8WM}K &:wY鑐@DPϞ473y\&ϝ9{@9fuwg_{מzv%6!ii{gJ.֍Tzic…L;Æ1 %`^\9EEY6('aee%Ne*w{MM 'Om}^|E|A~anfgAm ;i3DKaFݘ+**o4M#&&njy{Yі]jcyW2e 6 &0qĿ}?A:xTx<|U[˵s~R%E!VӘ-ʤ nJ^v->q]ybVN:J, ǞՍ<^\v;C׉4nJNf|R;d OzhE!8PFԮ4:ALp8+6`ۅ4M,ٞ!h_ Ul֚5d3$2#"8.<|&%Z,~-*?g?ѺLusN-<uy;eaA]k;n'yu/=Gȑ<:r$뫫ynB͜IDcbrsr& SoncBB$/+w |Z}Թ3lHK.[JVUVrСY\.@PO=; ע". gR@kᮎxж%֪w}cbb[Yx_#ŋ/HUUK.%++ѣGSUUEl`ͮA] bwcg $vRWWCEeNٲe Ǐ{i7+GFFu ~I⣪=~.,ĥD*6=b QpnIIm MHSЖ-f 64` d@ǃ4zqKjfN[JK|$j $QRH$$i^zdLB ilq 9irX?7mr ].TI¦iX,$Z,KNCCM &v׮y|ӫųqJL %&u|@ſx:+E#JQh1 &RvsA gu4 0w.[ |ޗ%ӹ8Pre$i^/7lȺ8֭lMKhAx;'>4Αu4w*AGI_2,{Ԯ\ ׵d[s f0 %VޝƳn@=%'ߡܿ?u./M d1^(= j_S{ßlӁll_o2 ܘ<^9ܓuw}L÷688R HHH`֬Y==?A;*9u%nw$IGe֬Yѯ_?x8Ϛ5_ނ x'gƌH /1MsPKOO/ׯsivA(咄~cD) Yt{1 &EzJ9tq62nHNZV66l(|PUyqq#1佔1 55N'8Ty4:$ d7Y1% SNZ(7KD3kjExv69iPr|D,kAAt.](yFO?=mGkHDDə|{<\駄[, ԉ@3YWć'2̍c௿2~,>"#9=;^nHϴ?+izxs߷NN>&'- svөS'N?t&MDtt4w}7}[l!((N8z^;6x'ظq#ќ|ɼ1n8 7oNZz[-Zĝwŋ /g!,Pbw|h[oŸNֻ$I&w̘1W_}zڵ+?Gn]cƌTVVrUW1cƌ=?A|u,zKJHXWU+ \aגR;E^ٻa-,dFEI >Ӥcrz:HNn n֭|S[04d&]#BU*1=5[ty?N\*$6 }>t$J8/6K&&m4MݬlldɟN'\.u#L$(J䛦4i6 I"\Q ""s{2e^.+#Q0O2WJ dRW!IӨM}=7c#'xebAd ;jhI}Pru,kl$b4M*^GDnnDLtX#{gRRA c]wҧM^xt6plkqVN\pA{7,-/g׷P64gԄfl¡p8fw;ALG-kjի $eJ(!֡yz5[ZH4캎4y1'se9Aw^/\ICBǃUUW/:ʲ BGZy9S(+ ^ӤEeGFrt;BnIu5%n7ibUUu#K\iqA\jfߤ뜻z5뚚HXhuLnFTsm~>iy<UϞе+^ c˜1=?hfk!pm!n.]f,tӤeDTotzDo=z@}=46½H~*,#{8$\=s&/y_!#v,+1* tlBCv;AA`|V]-;0MIEE\}uEpPPqONVP@iz<ĥ4>l].Fњ#,C\'23t:}Ro¬=h`&6e~Ghqҡ[T>|AAٵ+[֖_mh^96JogCRR֎x%oN·m:E޽{8pBAC$gXEN'e355k@Kp&v.pϗ55̮'b!ZU8#6'V76xq1@J@&]qsr2$%uEM UUQ҂D2 2 j<L N؄ّB1Mm˅66F &H!RqSPg h"d20"`vHwQz?VZJiiojmx$#MT: #4PZiiml&Xn.;]&̝`ƍ,=huY!!˕SiĨ*_bU:^/:uMKlw:2~O6Ç mn^Z[ D0nܸA8ڜã8v<;E"ŘIP;+눻(,,ILJOgIG\|c PîR>I׉QUBà!D$!H=J v>bv}=&IĨ*AnuݟE( D΋=d ̻c@@|{PIBBeUEۥ\h2 $IB$dAV+'X wx8GII[SSX,+ UTpJt4âzYl #L4%JKl2ʙ;Ujkahm%Kn^?P8rA]pm~>^/6MC>"ZUs#. },]vK^v*,G䈈K8A8 BiûD$iu5)v5 ټJf]gܕF rCr2޺ai\PR=<1 >ndΝ~pr&$[,Ȓ0(x0HED.gztgm±CХ,q:[˅J&I\a(+/j/"ށraGDEL.^:U͛g6 ʧTVm؀=0١BfIL{^XABÀ?3>l[wЫɴlq#U^/ n\VF6|pW_AϞ0lX{LE_rr{C! BtA|<WWbD*%n7Ck7N\"JǨho!B19ֲdM#Tys%!d&v/.feS d >͆AjPw1&>4c& v>懺:>$2iu,%48/.$CKh{iR(?647Ӭeeyr=  aJ߈zD<d޶ Oh[TVV<\Kee26IEEL>kEEPUs8j;SWn3Mphh Df&wVNzyz64y:~B_Zb .   A:V+\,|lpX{F}quC-y۱I&3;!0 *@H QBRf0@qm˶lK8|GIl+ָ}>I-:ۧ~uKp{i).]Jw:cZ=tvu(_ۍ l,uIRU󹺰{mvP Fce{;q۩Z0jIrfNgfgsXz~"a,D1懶6洶R1 M&.94gB-Յ| mk+Fb}=Ggfr\VVbim延6 4 UOO笜.v["+l[j9N* ;9KwqfN$w[Gs2>kPU&+3׭le BAA؏PAdI⬜,/0M‡gdV&LRi&(R [~?/U߶jCÞ?)ºΓd++iM&v8M$a*Ru,ne0kU9lTUA^rJzAwł B5O:iBm<ۍ]K{֯gQ8LAnv^n.'+g BukI g N"M\va׳,ShcͽzqBVVnjN$xˮ\3 +ùG$/qʢEhur 4 UhH$сxz>9늊D8 %|UU\lc‚ܸjOUb$_HUi,bT 4UemNwCCYY $nL+/.}ȒeeuK$얱`KUKX%Ū1ª")/KjpGvY>}863@2I4)4*c1.^{{>eˠwohmviجext3絥Kt} ]ۥ{VqO'3s9o_yxݺmOIa%p`aaצ /.~s=<#;R$rJw/m^uw:^ziMgL:Y|a $OhL$*M$o{w`&_X|M#f).栴^ 7-zK YJu<΃<ү_w/OK4% 5 1ӻ{?a&ak `U VBA#ƙ99LΦƕ {il.ti$BDIw2BP.4D zd^.1ʞ8@ #{׬t.59lCϧLޯrҸc;UCF-F7<7LI8ob= 0a9sXB1"/O>b3Ϫ&nC>^3,7=zڮ۾97Wb]0H~j*g B6U}3xuRY3 b橧na{wSLᢋ.@Q$I|q]ɓ'AJJ z*۽P(W\Avv6n#8ymtIxGb„ O[B!.BRRR(((GGyde6uѢE7ȑ#3gv߆5c p:s)D9sfp8$)Sc4n8y墢bQ,1 D{YMU,=#^m?@+A$nՋtUٮ_nݽ<2L7N\߯]KC8QH\r%_$ 5 5 b1ITk =l/ ~aa]gNK OTUqٲe;N\WZQ%BM۸]h2Ie,F.ԫ1voJJQ(څv+ECYٚFC"A`3˩źl?.*T2i}ld F(+/Ūz^`=lMvSؿsZ[z 7T_TKXe^VhCm?cxn.s.9\qYԄB<}s m2q"#8OmnW C?×k?_|A0xqdnxKIaʈOIʃAә9__lE$IL׏+*w`4R8(N洴NJ mmUM :$E7/Kim%8elU!$MdaeKO繹OWjc1Bmk+a†A4.4vN'1ҮASnn..5k:fVܶv-0K*4Y恾}9u" 4sIMefVNӴڍgmF ðfy&tSbg%K>hn7WP߾=w8޲LjO+ 蓕ECK4C*VUg0ɮp;w &dw  49pN}&cBaj6)a԰ImmJ74ړI7Z䥤ȉ'V[z%~Co=Q񏼻jp#o^YfFh&_ԴogǏ?rAljr˸q_;uib$_\tYұ}mNaze=N8a޽y㶸Av~Ӈ2>C=a|Ocƌ7|SQּh"^}U^y&O )))l߾}m544~+C9 o93f 9÷xEQvxNܹs9+;ᶃXtA? B/Ѓ| }$Il涵&̜VִsfEjAwlf&? t+ xxįiL9#;^DueaX.T 2sPӴڅ QFpB+ˇͼD] ^S/snnn죏%%ܰz5mNAUaA]W77o3$#eG_wA8h[;kKr_, bϹyW~FA2q$c;}Gn$ 8ym3 7olt9˄ ;wF=>bK.\Q܎6WsLǿø^[6#FO3m4&MĨQEL ldђLTuLXab9?x ~(ຢ"nZaw8XS55P\I}<_W}=m$骊OUс%pstffH"·ͼR_׭uMՎivHt2cRR877>_ϟ;%l4Y(fQ8̼PE0]'n{.`=sA3 $IB$TSR)) OI!]dIbF uT~SEГqi9xKKd\iUCeuնwU$|iiVEc}=L YYݽ2F~trj td( 7#^~|-kf KZ39h4y2|׼ȉ'r`a ?1eezhmW^!qƜN|W]We|;pRˋso=ctxmR꫟\6cOMQ~r,Ys ߩsSǔ)} .P#J̩W^`QGxoe%׾nxǾ3gd̙?ȑ#y233R)0gU"6ihhZ2: V4nz;/'|ӧ_M7ݴn>appbV/ד%I8$W빺GmYiruT{AX _uu QidjjݣE _Xy'Uw&H&\.~]Tnof&afPkW * xk9ȔsW)͉DGc(wmm!G-ˤ* NU.0LPtrH+rZRV+q~f 4 $Ibzi)?BD(4Rgjj84-c"([ d : ]nW;X&ȀNm_߾\r% 9LXu5[ O?L`rTUz<{´4yiGLzoe ^nrhvYx^;gϟϷUU? :MdʕR\ܱ6dfs{F}2*-c[+V[uSF/`# xaBnCҸ栃y<ԄB[7/4#g:]dޔx/*SVVgyfíMϧd2QHXWWzzu:s#ls{,xx㍔SOq73h &M'}A6l5 Uu(_rDVo76vc#  KO.j$Bp2pҥ6U8VTpOjS&6I@++Yގ&k2uºಢ".DMMT_ςP*plAn1 4Yfy%NB綵QҮX=][Iw8:îluvu RR8(-b.tsFv647F @SU> Gm-mrLcge8<Ч?_d,U:wk2%BhULZUzfkud>4SSc[|>$YCc" Hpd:'z76ِn˗ÑGtz MQ:?(E9;_|vrn=DN"xy[gUmOϹnhKn:찎]MFp=Czm%;Yfeqx^\hl]KICṅ Yjo>'v27sd''ψ Nip8v1cu7x38H$ٳKwh[Æ C4fϞ1o:h׶'rwOtR&MQ~RY)9St6%O&54aC<]֡&)Bc"ArW^q"O,=23y(yv4,̷Ϟε[/ `2IpI~>*,$Wd"4OSAtE!~1 *tUl4z/b& X["IXՁYifW\LH;< %^/",ɒĝkk6'n5NJ OO%90-k ip.ֵkyz~Zƪ!3\ S#977f; &TD߭YCr|wD}=f864XAI' xnX´4zgdpK4  NP<!m|t)^M#KK$\ۜ=t(YWo:~]jss7 6X GxS`BM)/ =Ucǒtڵ>T~m Gq@nj{ǓMiO/BHgu0L^Sx}4Mf[h|M#nDM ,z B$I7g--4'dU[ǫCpe(⁊ >']L0q2'|X\̠n|xYN0rG0 Ivሔ$o}ߴ& F}"AaE|](VIӤ] qD۵{dIMeP2[< trGi)Z6Z:5kxa.;Bnm`Z&^[%;[zUiVP8jƳ3-A{e[tUa!d?WW95^ =u࣏ / kj3`+gו\8k-?˻T!7PJq&${a, 8 |rYZ'Č?E8wo=T~M3㨣9_=duQ[kFa;vGח\>7ޠtȑ<>qF'ϝGs9pn7g̕cư> 8p++N^ 'p2 wISP '/'2y`rSR⢋pocrrxv<`ӎ8|~-ȟ?3^~y;%AvSvv6swկhkko;:o~n0cǎ壏>کy{=xnTnF꺎a۾`'rO>$?8D+tT9=[nz[o .`3A:;JBNPkN /SonfV @ pEAyy<\ˣUU>Uen[9ig {XG*+wCa]'CUq8H58`UT\ar1n| >  :2aD!]՞5w8T_vU=7pՆV &Im*>X*cU݌MM倔z xlCdͼR_G;|55\Es K$4†365));AӴ6ċŬ'(/Z֬J$n-)!os^W?TX?N;$L{fd絶 ½… 1b<A.^ n79'AAXgև{L.pmo'OHa]B ^"ڢ"n]HމB/hUQ\L!$ WӸ_ʫP2{vηmmDtMRUa:!]G$N&ggsO=uV.d%HGn톁 `e=;P*0hubvpڡᨔF2,%a^/}n }_Ӹwo~|9$~Եky [E0suue_eeۿ5kKָKZZ/糪ଳp@eԷ/8kQ.Y`wM$xjr% T# [gU}R 5oe'csPQsLw/GL]Du-J^//ӦM#L2b}]vM ^Lr$>U9dV W77r}=iT' xuQQw/Mpvv6԰{ۣLD۾aă,ت4Ȫ uAk<| ~Ijv=a ~䀔y<,RM~suu( I&^{i $UuQ-_N>@Z1kE)j%$MQȲOبtzMq1'dem}4ʛ/54P0 b9$A@s2rvN'fe;[ 1L5vE0ߵ,!b$a|ٝZI4 &D*BUh1&5칁C^qbW9!+I>644TwCgu<_uK 47SiUOAZ][{]ƚ׫TVZz=믭y^/,_^~\8oRc1 5LUF 4;JKy ~U֯c!Cf{iRA yBا>yP lAMMMw/a!I, 0Las3͉D=X0 u 5H vgeq`ZsZ[)e4Yo55Ϋ]W]:-s#䚢"+G nh`J0MBN#Iyi~? zE{=!B Ѽ!d/]Q$iVUh4dEᠴ4FujZtRثI{ٯ[[i4Zt{ׯguQG%UO,\H]_DT@hUUUݽ Aa91+**:vlϺ:BL LrD1Az$"-]J0*58OpkIIw/of&o56 VMt8_瓱O0M74Z @MU*իy}П>G&p![뒵o&+ܪ5WeƤ>}jJ$D**(p:֬>7Ӵ³϶DS,\\~=ݽA-{lo+D@KA!yk݌IM`כ@ b1c}]jGnuxz:?KOf[G]Q(fRqi2ׯgn[&WU4Y&4'xrs^.n[Kk2F^nhPv])M]'lW\>ݶaFYhWkkcI8L0H!Cpُцiv]Ǵ_ݲLVvev4lxBM#]UyI~8\#8 t _[Ճii?0­ m`K{|>nǹ&ܴz5Ɓ;;07ǸغE!??!E8'  tS~>oiA7MRoZ[F)ލzwia:q 4pS^@$q}q1_ZUiveUUTT~SQpebAU 㳲^^N($/ {i>ytʱ1L QBRCS3„R*^-$]U*:P0巽zqTFn^vc#64aer5 UH&M$톁S99#UP2ɲHKVVibVb vةU<LMexvJA;ˉkyKOISU++KМLT'ܺf o0rRp8tҳ;|ӄ?֠i *A$qKI 58nh@q8w84xV[˗FAg֬Y~]A਌ TU$dV e=ugD׹apPHs8woQi kx]'CQy{ܣ}T[2ɳxPi@ $n:\WT-#Jk2ͼVº"I+ n䐐aКL$w884Q`'m ; u2>UEijiRF0"5:'Z vBM#EQW}=|>\ݷLKTQ4q8X0c:اR{;,[L,C߾]f ,^l΋F5~x"Iߧu8_pi, r 1hm7װh&6I@v>}:SN  {I~?o660 U%0K"xݽ4bY$BA0H&Q&> >ki~?Ց() o56rI~nkgju^j*Q4Y@Ӑ=/[Ӹ,?HUO0ʛ45јLjA$AC"A4( 93':f ۧSt ajf H&Q].[e<4v KEPA%YfFޜx1M$Yv֮atk <件6 54EᕆZk_ ZAawhkRXZ۰aݻ=(Y0FW--ܸjmm[rYE0vGD",b qZ ;*#Ae^#-˨D TuA~UXHL&IS"ÕK' 8ڵTbj~U%lKyp-*ppE$Ÿ**8r|]urYX-Ne,Fc2I"f+CrVN5VQ[-Ws܏?2z:njC]I '".04% oI$cUU]p_>*d4U%aܾv-˭N5wo+ʷPj40bxMTUhluP ~=8dAN2e ƍ7`2ajjj:.ƕW^I>}p 8|pO?E$>?x<#F>Tȧ~"7p8N<@vg̘AYYN|N9"3g䢋.p ISL~z߿?.ݶFA > {=p3$1+mrZI 5dTE޽ =O͹99<^]M|̼6ƤuZivc#TV4AUM:M$NYfǍ JDwx]!I*.4I29;~궢ծ \86c{LUpm20iD 6]'f kƠ`DJ C^1Q y[x~EEܹnÊXOS].$ye)}uu0x044XA~VVvx\lyI䩚-ϐ ++N[jwusDk_Wa> ,Xn I6_ί~+z~sYg1dF%\ƒ>YgEEEN493;)..f̙,_$;iӦmm}g2dq&NԩS1c_~%q˗sw3c RRRܱ;Z O?fb|֥Nvd*:1 ),dh/( xdҒLDu53Ly&SUvxU<*IEEshg o|L=?0ͮX$aP[~?'|bnfn23pa=36v(0pdJ RR0ՀЍ<]t)-NfV օ'N\' j""W_4jUea$|SQ&NB̘4ӇW$LpH$wz 46OLf϶Baì~񻤩svqr-,#Vk;y晟]v^{me'Lqm@qq1櫯b|G̝;1cpqqCmq݊srqqWv|mc??tAtyhjj/d;OAA}ii9TF8$66%ܻn`)qUQ_ '¼Q^N>6k֐iDUϡ s U 4d2I}}=yH<#^X,ɶƏ aۑGUWWGѻwoFAҞ:;_~{1~iӦ1i$FD8(>M >AeNJ(xߕó)"#_ӈ:7E9%)yy<[[K}*牪*V˖bAQAM<`늊B@T1WX5 4Yg/5LfH@Vu[;랢%di8QC(& hiz)7A;YRi8$*+9&32wzի^$*I, p_;!-[f;߿\Gu,_qHyՉWXÀ7ߴ5@y9±v 6h_~+s1dffkqd[Nݰ}mök׮űn %%%p6/'|ӧ_M7ݴtzAzqRAgLxa( > 9ck ( 2ДLrDF-AM\Ī"|0Ch>޾fA(#|L0TU9E8PrqMQ;ݦ.|vK谮#a͋'t8B NLӓ>: f* lgnnT(@A'*wr'TۭF9hP>;'ba$NNl/;ƚ?k$q'Hĭ%%ЀppPqي4x09 yV8C8 ll 믿QGzKEYY/Oy,s7r7R^^SO=7̠A4iV+އ?? ^/=hivc r"NuR%%b .uu4'd*8OVWp~ݽeE$cUUHD;:rsrpDuamk@7iH$0ME!_Ӑ%aИL5 L(q`Djj >b&M$ j?SUqlRnt 7 4Fm@0_:63S~^ǣ(d*T_ssl?$q͜f^Rqb.4z syPPFu@$>}\\McI8̵7@3 HM*/ e77 wl{z}<,]I&uX, :' 3$IlB̨iJ$L\]?Bd;@X׹ab֘ N*·Ow/ۭFKU64uBM$1à|~KN)oomhaeUBU -DsN9ctj~qG.DXlWVDibbUw2  " $IL-)˖q5V]9"#4Y9UUH$+e>7^ͿŹ'+ۭyZ-65 ' (Y0FAY8w.#G@nkIOD4~xzz!_W"Hl㨣裏of477x]UU۹۷{_~9>>T~m Gq@nj{ǓMii.FAA}ʉYYܿ~}AD8 Nޜx++Q,Sڢݺ_A|}=dL{<طow/b_AsٚSpTb Ǚ7$"B:=_+Ybwu$qsqqUW%Ib֬Yy{TUUرc躎a7^rO>$?8D+pA0zhnz!nV.fΜ7Oa"fKK iiiݽAA,^̧ EN'Gfd!u^kk)4AP}9K 5vۚ5gɲHy-2%axd\UM`2I0P%BS~&| zPipőHGLع2sQ5%8JIa]8!W YVZV9 3wspZڮ0(7ڢ"ZOqnY7%ew[  Vbϛ[46-G=t4E;339(   㲲H//UIWjqij.ߗnXSiup{i~1JWvsZ2Z 3uºuuX ݊RtVy\.,l;+*WXӮ8$tU%˘I0hM&APU&3.=mOΡ 6 amBw& ,t:) p0P.QrqCq1S׮%j8Gܿ~0f ֌u+-e!<^[qp**w﮹A[7 Aֺzav>v_Myj杻@e7jʣQT OPaL&q+ \ST`wی:q0H#iB݊4j$M0.=ӳ9>+k׫SIc"pM;-QeNFmBy< a {ZZ(4RqxFox2RO 7%%|ƂPBM#EQgm-Ged0>3nFAkV0q쥯A{ʕW z5x"J^DVtJAa!BAatǬ@a(,DX3 DtU5䁊 ܲLM.+Qp&XK|bAAL >鈌 -$>U9dvc.I 4J\.Gi{m {e hu2r{iiw/mFbq8 _Udvà.Ceຢ"IKb8e&C!f76fc#ձie0Mم$s88;+~JKCWDY.Ia$!cRlRR0P 0^,(I&9pG++d7X^MMЫ@z:025_p_E1$WXΝ<Էo>7&v[Ռ pIu>EܹH G"rFEK yƒpVٙ YAPA'yI>!Ijlb];u Vmk+YFj KO̜. zLx4E-˼P_e;ݽf&<\Ymm) X E80-_qTFfƚɊvmjFLUi (i~?df7tC<aA8Ly4J0veT>o! t2*5cfA[\YPMM,)p82ᄬ,Fl'֬X \.j *,`9h339x1^ ju:̞m=~Vq~8+ g/Y’p|M#˖n\Gۥu  PA؇MxiTb|ʸ]mu nk$ZupcqqXgh!auԷ/wgA;CSR8.3YKyK6`axٚxvsMQ'|869۔H~So56VBlY$I @2QEXvs YY xij U aVӾIU~HQUTE(E`/?h/Aqan.WW(d;| Tu5Wo\j/#qp8:ڋvL]pPkyz͞IJCa<˳Bd~3ky?`bAu\/se&9$Mjj(t:$?o  D@( IT+*p2o762dgVeNE,HD l+ x]5Qb}=ln$JknݞWUt.' v8; :47vc#:&B!K à)0P%|McωYYNM;!aGaREhCəL8,=}Z`" EHE0#ºN UDؤ*0fIb{ zM/[OA"MU޻7/[F[oX vV%VYJf/*KhB 56]9,=}͉DϬ*F1q"x;A4jTUkV%0jg3&|>gZy9-$>U67Wpp`ZSsQ^^Kaڴior y衇 (TA'|۟O d&U ajb1I+e{֬Gɔ9i[ء,IS* #36A,328zRLUfijb޷&,X`qi W]ݎc֬AMZk`amg YՃ.uXС[$IW/jb1^P5X˖/Y% dY.jMvvvlp);9NE* ī(uTE%ږd*Wa"aHe@0RUVNSS>9z|"jhBPשq2WpNN54p…LX֯gu{;)LY Mxxi2*5JKd^ʐ!wh5' ຢ"&|xD8(Nn(.FzMq8Xmޢ5kӭ~?ls_$qGi)EN'vWcE[ڵV{̂+T+ϭW/qzxTee\z:ii, r "n0 n&233|z񤤤^H0~ss3]tyyy\.ʸ7 /#p\X,)S7n?E±c퐣iL-)NFqYómkwYq{[Wi6+k .Y++ބGQx^%0F--ܸj'Nيx;dĈGb ?p?p^x08y뭷3g<] tlgK./{Yfq:,_ロ3fBff}rSTT=É'Ț5k^OGaرTmm-G}4cƌ_n&^|ō._S2}t8 76%IwqӦM>}ϐ!Cw%3qDNʌ3/QeA6G ~a7mF?iJ$pP.2s$*a> 9j7ȯ{M $ :-GQ8gxJ ?Bd Ip K à)0P%I>|>FTi&u8+#BF1ðB?%8e4Ӿ5 $L)˸d!^/SR:fwɵNAar2wrŴ:JU<Ν0xƯ%nLKBB]vhĬ@| b}=n{| ?ܚ'lCE'ٚSpTbh8L-)囑L&yk[8)٤;郎7|ee߾};v,?#Gdܹ\}՜uYq7 駟駟~/\s W^y%vEEE<\wu9Aqoq> .ٳg?קofr-s9ժt̘1E9sm'Ow>}8蠃~2KqG?A _863f.f&tA8Jc1r m`uu :%Q))dk_Fc#&eIB7MZt#I>qHZU ՝f.DXӔHݤ*)ˤ* >U8Xl&1$lL!^FU1EGʹ99Y߻WUA}=|V0];$i|F]# Lh9b9r$#F@UU?x:-_Z.líkCeܹu ;&LZnha9 ?9Yn>;aVfrH؆Z644|~~>}-HԴ0sweoorz)nf ĤIz]FW]%>9 c23vj3ZHQ0ٛ~wl~ BOĠtn 6S0]הL0͎I"MQpX x4q) cRS9, {4LxUnogU{;K"VF"tsC$T&U1 L3/_v3erPāA}ټ' Fb}=u:p.#Ú=(IVϝ$Kwͼ6 46]qXzFy̓f(.*8a{Ϛ98|[n4?XԠJyv%U+V!s(..&''7|cf`<|,Y'v#IFbƌ曔3fy8cdo&\s `믹{Ubncر̜9h4n!cvݭロ'xK2iҤnۦ3AvxVAN'Is3i464 o-{z ޫ%ּ  e|iRѢ覉&ˤ*>U-HD0hH$a^_ӳ9!+.M$Q> Ypev "I8% ,)Ai$0[$L)IxvUN-B3P( dIR[dLU:gzy9iZSRwx Nn-)U6n5v-Onj4/ &Mm,_]k_V\`"$jqfyFE,e˗dwRU믿n ψ#JiӦ1vXN;4.222X~=gfڴi 4qq3tP &''!C 2袋4O?X,o#c?lJwrn ¦D@( W&|| &)̜qrŇEA5zbP*mΊhatTfjG(H&ILyh{֯gq8LS"A0HlhiNY&eY:1 iHbIU`˅c'[ A^/&~C!>)/vp钰irv6651Swx=/ kaK ѻ}iԫ[gU]uTJeۗ@"--jKaZ {o w}Ȳ̥^y;.3`̙ԩS⋉bՋN8!3<ڵkq:tA|x^Lis= 33>"nG=s\uU,Z3{쎠Qe|I~sSXXHyyOG}č7ɓIIIsة5mJu :Cx'yI$ 8W^yţG[nᡇ[o .`̙]^A 0[ZZHA@]<θ EQyo_γg1*, l^}/if7 UIBZt]'a=k^E!nwvkE˅GQhL$ A`va5͍2YðM}" lU[2ɉ :PӨ/sMU!C`B8<8._E4ą i['g07`| C:.ju*ll2 3RR_z)xne}W^N9s&]tDBܾ|imm %W88-A;BAM49i1in覉(@p`&$UقYFº΢H\DUq{VoI:eJNxwv)AW :3O8,GR]n/Y-zqDVUy@?2D89D"cz~[wi<տ?,YBUlnP8t X)o.^/j'tՒu=IW/Dnl$ OXpʕ4HIA[" A+*II^Eu#_7(QGQ6 I9L |dB1fM}TDIUNr5 ,Ӧ묍FiN&YN]qnq˲h#* uHM OMeόuxz.͒%zf~(DKИNuS%8?j5*l%KOh„g*>ϔlkylj$a{CR*{@e,PV(6-{{$K^tsd!;N$N|˗eGJ;} r4YmoPhA\Aa$BAa26=Fŋ)3, Mېo^&ʪwNĒLww M&Zj[ⴻNG>b^E^ @Wk_%\LKm $Sةc{3.A3:i(esxg(X™_x0=+PTQ %flKT MP&I(g&9mSSc6$YIBK٪KpkU%Gbb|a** NU-IAh!^/ixw8SrEq1{i6 GC?Ib|yo]]A]X V98y.+[xd(_߁suuLK>AA " A933yrhhՆAc6Yې_>%q{W )wwC!i:8cTZ.ݱ4qیW٧x|qaRr!4T4}o'A{7V?>x ~VJ& ǏK_{o9-CwgIiJiC⟓$)i#KɕٽŨmm p899~PQ㜩L*}coAmiƪ23ɔeFQ^P@Ȳi˻x/%}_!2mh5tǎ勲2vq:qRN[^lE0m?+K3;%%\r%hRpe?iiM/ O=uuu'xl3fpYgDP7B辮iƭ}nis3w\x n @a4Aa쐙Scp֢EbtZs{Q&j8-:Z:xWw]c=SF0|tuckW<Y 8QTeP9ՈQ#/6Dd~ SmF-r8)3))hL4iDhFiDhDhF1lö1-+[U(v;쾽PP;DlFM~V-Q{O-PŜ>ڞ&NEA/ lyjj\.hogۍ" u4YZx>]]l?l#F[y9>\\gr%MMtƪ7w,jtI"OӨ6 [WƏ߯oxwޙCF9 qcyzW&sfΝM7u]'BAAmvd6s))=>jZc(ˆ]G ۲L Eho%`yxz*M>GSu[ز(lۦ4i@e(DE(DCFGz<_~>>6meYDL`4hxaM8)i]5hvbj5.z@5$鼪jb$B\]o>NQ6,A@EEBm=.ygf-ZD4QUee0n섯I(O4y% ]9ߖ)V= ~?|0]75I55}`aG/]clխϗ,Y\#***%VWWL^EEEcZWHYQ l" Ay;9d( 7 bMBOqhh+d>GNNOpe ȕǰL+q{ M,3*- 8LĶXQbXiaY2UEmf2[#+#n) iBG,֤ 9^4M -+60^%(jm-^(ݷ# #qri'd9QI!bǩAre,Ck+;dgs55d( nU`WN? 0jrs3c7hoƲ2v$g+<[O>&@ 99p32~Pqk47ssY UVy<3iʕ̘1c8W\ɕW^G}D4e硇wW\J{{; {/;cbIx?>/2'NO?]h{{;\p*Nk*f͚bmy8駟=z4?m[oz ߏb]v^`̙uYhgq3f3dٲex,_˗3tЍFAm" AQE#l{f͘a;P0`*t!ecFLj֐?2VEX2:ՌVXHW[U_ž %Y&|}=OPZmIIJh%LSr5tYݲxVU0YYpi;e۴ޕcK4JS$Bc$BchȲ6^_j0޾T$TV uIB5@MT.[kY/1S1jr>7%Sey|Ravb җAs3p|]4rr6Um_BIM:MI,1pEWwTTp`@uuG8Xf̥is(NWja tLEZFrf~)((o믿 SRTTSO=(tMva̙3_-2cN{w}Yt)@nC_\K._rwP^^Έ~Tvi\wutMwq5I>}:7xZg;䮻b{av]wz+gFQ-T/^mƭJFF99yFauD@( 6i S|*0#&3.GICQ5|Tg*#dW=:{7f?Nl7~(Z,q͚1 ˠnEsߛEBfNɔЖ<L\9  ۜ@jk!++3- JJXsUq1^NħiTSY!za<ͅp8~MyyW SQx\._XHv'8`W/#Ҹ^(QDaL%ÇS2eJ,?Lvi'JKKy뭷8׸yWy9w}))){;Ll;b~zՙ>,?w N>d^/;~-SN]>cXJ yr1b3Ӛ(( P]{U+6CZÈJŮxMRL9$(ڶMڞFmZtu5PT.UM(nUj4s5UO[*5 bzj-^\WR+WF=/Y1r3h}tAFe̘1k GE]zz:z(}m95k޼y*n)S`Z=vX~~bҤI߈d#v"T>^ZNG?rdEfԔQx=!lݺ,Z[#++q_|NxP !$Zwg5F"2>MQ3dY,oWUr˵-6!Eb:9d4H: 4)P1߰brS3(QvQ t$%f(tO!b"EA6/eeIQbɱq$qС0>(9禲2^0}+X0GB|Nt.*,䶊 Ƨi,䁪*- #hjUVUBU3Xœ55DS%K9~<-w3f0cƌU>7y_SSCNN*rvK줪Ph>`0ȿ/n&KꪫֺڞA"BAAi"3L^K2"5òDY-IeI銂SUt8b:Mlh W907Ҽ-Cs8gʵWqS$B >^(,+ī!֮ 2j@qEWW5$RU7Bѥid'g@Qu U%/,俍(u*wC{jQHI+ab-FÆq‚&ي0aJ^]-BŰ^2 ]ǣ|˙>t6k}孷bĉhQMN;a&o&w;s9t]yw3ou]ymСCxGYp!GqDz1RY)>  k,bws/\9dss9͆fqg'pÁaY4F, U1lZ@$2e,E!GUcE"jn`=œ.˜qyX[DPXIUSmȒD_eY,rQUŎp˵(F>BŦxub >41mp?EO$d(vaˢ*<´mlHkMbwSZ&)EAغ*4-3B].惦& u EzN>#3'FNձWߎ"ojbyW$qU0lkh棏b*< dLj4Dx5apSy9CSR_ /6 w}G߾<\q\s5ttt;׼0//hiXNn_G!0f^~D;5\}ǵ^>g< lL`ACAaEԊ5_3AX;.? t^^7n_E-wϼLb) JRR>=e]],"dYDe,ۦ4i5Mpôl[{-TiĖ@0hF F=*/PT q{Mo3䙊Ɂ=1E%ڛ*:UU95 ̓φ[. ;:8r|L"GUdgq7BY ; ')q8gbR ].3f3ᨣ{eɚ\I,7w8xeͪ[BQQ~B{9R9n^ !_m^Z[[E   l ,`:T&Se#<uy~涷( [eӹH 6iWy@^|^32K`,u`޼yL4V|AZZZ8묳{i [  V4ygu"Xסn7\ȃ~? ::U:!vtt01#%%2mlf LE1!r |TY-˸¨iڛ&MM 19P&m'=|2?QuxXcTkmncvBѫx5GebP1[**b W@paa!o54Pk:-ɝ웓C~テp8 .Yc* B$:dAs&WVV/UWڮZ47GfCne$Ia(<]'W˖/QDwѪ.IDAT ւӶ>?'IʚCzz:/7x#hI&{Q.FA  "l]EL$x8FYى xTB.vd ;ffrqQKJj@c^Nn)+JvsrWoIޏ@;PlI >nF D"4HxhXQV(H,֏@1jĶ5 -Ux^P:}}x(^l$A#եi\RTU+V,.} =0XPϯmiPq* /'~mjj~ll~Lu9j'+a<^SÈTN%{>?p86jA   lE,[[ 2u^e}>xx%~?+B!bG :M ߵgVr^A,(`n{;o76F՛W9Mk4Kpͤ qeF$yՊk^Mػis4JIJmLJT*}ɳ UIB$YFabwVN!ުM$%9u2M#Oɋ:+HtkM6P(60+ XСtMKI WMRmSY#GضaX (*C]Ki<9#vۑ%=,(تKO9oQi|3U39:ohf>:MM|99\TTČ p8)ღ&hh6j 9>Л4׎海swe%9pE*6 9>C0KUڏvM5hmӕTuW*#s2钄Īabwx{yXũ&I[[&*LEսUQ"LMZ6lè ᓖ}~ ^??C[[J JJ`̘^:i̿jj8f|zzwlcW܂vu:4Y&OӨ Ӓ%4~UeޢQ㕈k xLDWUbZZFm(M1 *a!DHIثiDFLnu_X,VT#6p=]QAԶh?r W_ۡ;6 IQn6S~i&_mY?jkcO; ^&'KFE(`b McN{;/[#FmۼMz>A %om>$8 AmXVV{;AX/?88oxd,M㹱c7Ja_Z"Z Y&GU6$hd( \PXȨ[OmmțvS$)1ӲP%))rC ɶm:LG$6g&ֆF"4E"=*W Y,iWػũ+t* miivs"I(FeېiAuiC$BϦD]QY}UThXU0*UrxӼxe7i>br4-S^LO"͍THE0 ʕ/qbA)δlM[x0YmR^cFmAB m55{=ث,LR.X46RӨ.[   m /ČWW_ř'BAn/-_~q_c4JxM& tkKJ8#/'jjO0KQh1M@}>-(qqjn.沼ypH4Y&+>-bYQuuJKD#nzWX_(;+HlD7ļhm{ aY$&Ȭ&ڶosM{4JK$V=ve*x$5,t|y,$hk}#@$[ 17oVdwDjl &NC\.vx4]'[Uy9s AUz*lkq+*h3M|¥Kye? F ٶi[ .1_C6\&ӌU!ۦPœ6&gf n:x tE![QbAa4c̬wg7<5AhhX RI"KQpۋvY ::++';^E$I63jY4AbC$BmK[]9CQG%ԩl{>~yUo7@ݢEFn`}CyeHʢpD~ȷ&[~޻ʿHWYx)?0S([&g<W0hFyz~xu}c)lfgHwY_/,(:mj)t88(1ii{7A¨O[i$6F""DUbC$aY$dbA"Z=/Qa-Ng%sMwuZi74Ob0ѥ₄uS[ki퐑{w0&,[F ;(mvsu+JIb].§iBSYɭՃ@zumdIoT| ƪ5ڸjr5 E! lD@( `#sϱe=j,@.]<}\ۙz yg>]z))YY\+s_}6|f?9l0C{/) ^~Fv-9ȑ822Hɡh : }KUvDEmdM w >KaDZpu5o767 6J]W9#/մ$qKO粢">mi>mn&Ao<,[9)N_63$idk,{U#nqZkG"tY]MԲ0-Nxg@,ik pm#߾-Nt]ǣ}nU%eknqZV=( Sχd m(A^j@N9ETE?G_6!O0l~rxA͌Aa=lld>$S4SoV~Ĵiۭ=ی;wXg⚌lw؁_~ o8ޝ9YǨ#„UPau:__Ǝ& RdnWAX; c~HTljcypH!Y'6F"S}>20'EQ8p56R}=KhFIeT #Q \]/ KID#=lfϕ k2j5mNZ%HR7 -NQ"E8)$ XՠDϪ`?-NߺL2dY?Zf( x#HѴ-ۆ!==v۲`#uHІABufbVUqFl9.=?sOUƫij\\λN>g`n32-9ťi]!;9DAAH  ֙i99=Ou>Nn_>t+u4y].&p6~z>{2^$U>|ﺋwop{;&qN8aup*MhhȶIQf0}ذA^e߶ѣ~>in&x5 WɚXP)>ik܂燶6lhF"m9Ğ]]V^}UU쑕q^/< lY$I"]QHW^ `6-hAb ^XcIՈɳx؟ގ =RۥijyyWiV}UDnr @*+ :;!55jtcgC!<t\IGmi)39eF{~a!65kg'Cgu5݃ <Ճ',BaxX]&0pR^?"q   p]MM}nbOF[GCT]njDz?MMd;dd99*~|E>N<#F$ځg^{/iR||ݼp9\7\);-7DQUf*/hjfr5=x! 6Fm,J$v8W% m'ZFm╉[׻*1-Cvwobu8LE(D5@IMFA㋿}vUTڊC}=ƨF믑233+:;ymHw8WT¸q-4MSn:.4q*~+7ye֬XHv*B:sQQC!fףiNY(ąKq#Aa BAAXOY\,SJv3a_#g^^/ ǜ_}a3/+->ڗ,#v= ZZ'U.*b+矧aٲ ɊB.y]ͤ{<(i~>Az~LHT6&%))T㪍U1@xc5:ˢ"+Wu5r׋ޏyNUx}>uvfC44P a6iSQp*֒;;zN6 كݏN:ITYPoZ[ɏ| +Wrb#AaЉPA֓z|fg;f ?\lZ^\{7LjVCvډϲ>wO?nmO593gbttyyYQg1_JZv6E'OR뮉o9i]Ĵ/^#:9a?EzEwi) {_|AjVRu>AV/UQ13U6"<[W9l${V9| @UߵlT|]Lj}dE0 |Da IYn:-ik㎊ XYYh&AID KM]fhjuAmiim:Uݳũ"j 1m5Ab 10 FEZs5WKS]A믱5j>̝ ]]YK2r:H<]4}Xü uՐ!|LaMWVN\һzՃ ]Qxx(_]]:Y‹LHO^   l=;f?d'@VA?}w|~Q\Cp̽2bڴ6;r Mee~Q$v9tÆorc޾z,;r$>d"|+<_|hOi)'<E&%M۲P#GSOZS]wkIl ˖11::8:ezSջi?>$¸4j#¢AZݺ$iLf&o,海K0%3+ aWd}sr7'aNS/kG(Y&[Q(uLۦ4y%SR8.ނt`ϏaH]ӏШ4iUU05AK4#-FgEjmW5bYj؆chD::E.Y#5Gk+>d~EW| \jŮ.RN咒\eUUwuDM lqnM/%%\t)WӨ;hSc#|qOfJ:?b/\H "n`TZge Am`:, [|jm[m_Go(ލU}޼*_y#^,Jo'IglQd;Bв:MD}òmkj*~<.t_Oer1u۶7ll0lLE!SQ%e&93^rpnϯ [?òD"F}}03 BJ֦CFL-I-3(+.ڊ,IKpffD#6Ոp]0bDlaWoD^?)4Qߞ!))d6g.ZMM:IxaXlW~mftk؊=W[˵+Wǫ#^?KAVUT †Y%LIX?: rȍ7A8-7~k+ a/%Cnr_c#UUhNiFC77se&Xo$11#\9d77j `HRU|v--| 4s8eL1kH͊.˱6kh6hxbrXka{U#FՈRQUښU}CCqut0oZu~T#f( yNA^r[Ӥ=c}wERR)J[uapwe%dImm)ť [y}„~`Ճ[rsY55LQ qҥgܸu AaPA6ʊٳ'RN|a`/MJKy' *VB$NH݂_R$<vx2 KUPZL'kjx8'?(pCE(Y_PF"Mq*3jkyq۽^A $idkkhX IUDà:$E"tf"D]ZvUŰmHʡCq*#Omm2ú죏HuF;;5 11##=fד(864pϷQ[ALK|^YIԶjsyn\3kԈك$IL/)aig'A7mmTVB"Aa  lwi)g͜9ktL:A] ']Q!3zT.U,⍆N 9d38ɚ0HW,E)J^BN݀ptHJ r^A߶z ;MME"`d*x{.bn{;sڸ#nQU(VEe  ֣1.N'Z$BDQXR$*FT1;D4, RR%ƭJxDKҮ.2%KkpD52߿+,FtvRp`kkjO>;V=XW/7Eၑ#9v|C! tLY?uuOO9A61  VRsj <]_55mfSU}>zSQp*&0 [gjk#n|${VgeHwx%`N{;-CV t“}>U lXJJ>ԦFUعjDLD]H$X]p8(hog{QaYhD4 Yk~_ũ(2^MKF̍Wy{GL_PpŴ&MoYQ)fAuoՃ;6#9}B>]'pky9RS7IAa'BAAA؊핓[UiF@G$[UY;MM "7| \❦&\]ǰ,uuqҥ7=+3 Ƨc6v'/&#xx(~hmJlm4q*NȲ3-b,./.frfS$Ʀ36=?as3/Mk+xUaj ǥqJn.ݸDU ۊX@%I 40}6KURUT[=1`6ۦbqȐ>uY+Ŷm$I"l4E"44Y^وs=ѣ8:5 Y q*ō+Wۓ23?M#]Q `8bmFE&(<0r$ΟOE8LTSWtNqZZZh BF^ @-AAapGi)~}A$j*߷1;dƘqQe|>syG IWe* (TWJCqV~>Nu`|JUx82^UZUݳ EU [*hkUǂ7wnuizz,,,-׺].jh Cq*pyq1Quo6mوՈH:à*0hDg5b,LF$"$i>]g#jtE+i<:ǪUU@XBF D4apKy9߁Rp lah^M (9T.\Cn6iL.=MqpI7u*}4^~y5zɟ0a@%^99xU@4y))4E`:*-kJJz*ZT -@UcA.Un _C0nk!Iis3-IPeSYɿF^$I8UgՈ"I{ՆAu{" (gqwUU, 33gĥi\]R©3򸷲iFq*aY,%Kbvw:rBT ͈D`ٲX[h4VWX8yXvy[^PXț 4^Q 6څ$1&=TY>axj*Ī#UZiYtZehmm4+ NHiW5b01YlDM:EEyN^*1WuܚM_"I7Ү. ɏAn*+oRSAp" A P|R=>f8Lر׿Rm޸Js;hgN;qwno;`ٴՑUX'nl\oCVF7_=Ob%|FwdNg) |~ Ǝ; UsXc9y8ꮻto-;Uy۶׿__YGO?no;|8\~9#k+[oegjm%37qlX;-F˿ŋdСw啔'7k^ +6).N'_bﳁ`$[Uq* 67kGsj\z:׭SYɷU(uLA~lkc.+*bBFƀwUIUmnU ljj !3 C !wb9QQ {ȑIwo 㵆~jkPq2UWs͈44Y& o-ՈmI B{]L撲h'NijomՈ)L$slĈmS +qQ$x%bAa!b[uH(<0b-X@E8LTg|z: AAa)c}6z~HVAAbr>AJhnwOG ՅiEݢE|zHn#>4R8' w^} f>#M믧n"޼)[ޙ>}.v  R}7ggpNxajkyK^h$ߩ_ azՑ7~V*IxhnѢO\e,X@W0^}';='FzC]9wnBMsRo.lBe2^>=vfȎ;nkc+6 3s& kd:'=f1rgHw9ᇑU{Mgs3_?x8տB1?%s}s^yH()Ouj.Xϯڀ?o;~:;,vǮ@e Oָr%v>G*hĴiw\2dh*l]ƥ(4fͨa۴G"*› \PXHij`/wɒġn7r UUT蒄KUIuɳuu38F 㒫 Uh1~^;EU {I6cXс`w*44fLUEE\|9a£,zȳdeqsuud( .UӖnl |kǂIFl7D&x[j ю}%4YFuW"FhFY0=JZI&d* C^!>o,ZR_W5 ?/]ScHu5Imb.AaÉPA6@Gc#}7>@SYYÆ(H ?wœ''AQg@8ty<#F̺>~}ZkkXCi ׏?(k/r y]w冥KW䔔ڥ'S뮉Pzni!`/Ni8S5lYlcaaFac:$LU%SUx!QԲhF!baPkԄTI-M# 19DLeմ3ncmam-ێ2#[U)r8(sD TP~!:+C!_ZàvBu Ϭv4>s5޿%+[3>@μ] lCD@( + t){_r aRRx󪫈n)=> Xۼ}u~)N' /}tn HwW?㉅ni99=>.sON1ozN>}/$1z8 l,-婤bWw4Yff y`[\TTI>VW:Af#n,+ߵcMcyW\۟so\WRi^UD,@<<3 ka*-MQ¶MeU*{ʜBWXr{b|c钄[(W""z4mܔ$eYg'_.#\Jk4ʊPQut`ٷhmA%Ҝid@ވ-gnMm'49z-ft?>K͚Aa=EB!Gu=6qmnp5|zin˔LtΦln^eIϤ㏧=`[oѝwOMvZ[cǢ>`g8O4Qu[ɡ7!7H|ӟ/H5;>ɲYx[xs#aKuF$JaIRm=rs9_% †cmE Vp:h`mYאk1 0'vt:B]'UQ[)mmS|>^ B]'My<ƥ~JXHj9`džd< [obRXaZM.&bDZ1MQP1"Vì -Q'ڢ2FAQG(?Gv<|GT]+W  '0-G]՜9Ԭ"pؖůᄏ} ߞy/m@ϴ$Oヒ&چ)xz`ޛoҰlYt+L]I"Pj\waJD se,#Z ii;P*ag%{UC –撢"u* mSQHeq֠45G䬼<`h-;:tryq1R uvZ 綷3;**8$O(UUt8bajP^͍Uͥ!dI!C6$'~QUUܳg© Cr7qϠ"㽙r2CRRvfirXS Qct&E41+!,'*zvGVnY.躽.]D9 2SW_9ܗl7dŏ%,a>Aw0k,Z? Aa=8gA^8< 9C 2?vS'؃7z4exGoiczO+9@TU17w衉m<Æ7U)~: str¶ X@m8LA{EZ<=a&efc{*+*NiYK ߵr%EE,TUYQۦ%akkw웓.f 0c}]]0z{X aà,W;dfrKd( ynDMM с||`9f@PڙmӺ*2"-P|bAH/HLe>!CDˢ#eQ$¼v"vD̐eL zIK4aT"Hs֣s00T'n}ތޣ}ؑWq%>!KZ2([@6:k'c;}Nθ \.a~k~XOOdwAczgɕ|YY=>o?pUGŏ8?O_*h7ډmd2:i({'!]ܻ?ƒ_Q1EUhZO),r1fJomv<|G6 ,[" 8^+]DvQ_=_>:gƕ+@)sO޹:gy[xː_&gN|a޿6^)4/Gŋ맞b[o$nG̑ɩO=] .;r$Lsg8fzMu5yդ\LʾfɊv؁9BKe%S4i/6imk:lΦ&2<?6O{7ĿO; 0bzO(왕--Y!ۦHYEHrf^)2H99L歆biW 4 u6@9墢"|k4R=Wz ۶RUj6f>iiaXJ r׻YR f۰hdd;[q۲fk+}4 ϱ?^S-h =vˊyj _ &wUVoNU_|vP[c͍$Id*Yڋs,ۦ9]%D1 aa# ˢӲ66Y9݂4]V{ClFiDmL"((MIqǣ66Gof#2C& ??MCyC㲹e̸dg?xz%o`Vng{997ؑ5,lN'tb"$\3&*hq_.ً̢8sq}ƪF)""HQWخ"ɫ&!F`0sA]~~>Maqu r6|ロA[Uj3OO?% &[oɓ$j֣1O=+u80ghFXwVm &OpYƥH@ia:rzn]{MMY$I"lY4GDan7'|윙)^hap5PӠnc\ ӧP}<n-+!|]'dYtX3ƌaߜ?Wo3l2M5 +(a~(5VYT' '׷52m@ 0o -G+D穝 Z@,cK V$4~{(,UjQs޺뭞wJʼK Yћ\A9PuOXX\= ;N{gw&ytK,bvƮeY|v]z;*q%3(|C BS2񠉘QtJ/aqz:SF~btNva@* {RY3fŞvY^#}_/fsߛˑWɧOJ#iwFEX/w\pa$ }ajmm )8l=۠p"\,dԩ"-̎N'nU1M-dA(Dc6OpdzFBR9ɚod( يSQhD^V\]\A.& Rc^x@a K9Jc6A:^ .=rs9&CV ~hkXXk߯?_hi x%1DSY^YY5^//E0H(<[Wۇ~TW톩S7꺶f$ppvò#D1 *C!AK4Jm1MV C5ʴЧixTpӤ1eag&zBIO|ny"*9꣘x>?#KlfiNA:_\Ng_Rjր ٜqp_.@Vd8yXC'0ݹ}U8o>qKw,*ڛ۱=] tES8間tg2f1xؖMKM s|d>1q򡓙~xGKNArFG|3MMÉ'Wo1-尿==QA[iť lNx:fROIJQU~`=k[lM!C8%7~^od*>]ǰ,wtK0-+k aFa՛$Il\Q\ <[WDzNlLE!+lvY?S{;wTTpI>#6LEAUU`; ¸w{Ѷ6uo/ͣʈXnMcn{;74pz%_$1}P?67|Ql`w%\+IeRR(JIY6I}wx$VTTIeRp`6Ek4"I KIaRFfB$hv=nW~W*UPl}]MVٿxoUl#Q*pl~Ջc%Yww.4U5a[ΖiUy@y_Z{:?fI O]f\~]]tOLoSӲhl-v޳ iNm'  V[o[oc?<ap>t(%ߵQBM8OhFyVRNJ>nn&hxTܿ[[9⢢A4猼<>oiz>in0UN$>Ajk+;S|>Fȕ3 lVDgyy녎HK ثqzn.ֲ2"?=*uIȭ'ddpf^8][3N]0\ t{o( MMej:ضMi2gkk5 MZ|~^/s]DUZ$asywwil\%ec[6Ndde~3 ZCkՋھD8){Τzq5?>@"쯔̞gݣ- }   lòtQ,*H?Tm-T>iiaIg'DSGIK wVT0 N4y56rAa!$ONP@1 l&[UīMLwaXxR"X4X&H̱ۋ\ CnoDi¥\t)!£wm-ǵvSI+VppĂXg?$ ,a))rM͐6L2F䑒[h94v:j'>|C"rAehD ZG̊WPoop_A$\EDh WvEvЀxΌ{<忔oйAx" AAmŜdIkk#G&-{ŋB$ajVOu8L,dXV \O8Xs rՐ!\XXȻMM<[[vQd,Uũ-]]T^}UUvsǎt cU~mmY|mڋ&;~lk@MpDruq1.]Ji4aży0!557 [ˊC^;df9Л_.f̞c(XBv^6Q#O'A=M;w~(¬g%/پER3S9x'holgGHL吋!53QSFŘ_o? WM4XRF6{CU$:rshjD@(  ۸?pҥlA./.rTY@ 񊪰2gs~?խ2pQG.Y^m^xKHa ۏ:mFy&ed\-ACfݱpCAE|gdlTY!C…&nM0x?z>kiXQY (x``̘a`]6kF//þz/fmOK8ƒyYY1;|w:S̽9è/%5Wjdw䧷¶ljTT E AAiݳltY&MQh3MUHqk4n:mtZ~ 2d9z|buƆP$193;Iy0FRnYiwy2ΙHji+62^cU~GnoP_ś^YY쓝MK4 2ձ||%(.]2*^ŖeyA`8O2rHndE&='SFr뱻v{v8lҲPu%3^lj7ƾ?{3}[2=_dڙ* y8Pv>j:O%d>C%;/?Μ6aH q:AAt6]7AXz+oM$QSS? iitvc#EuAIHU`m|24d h&>]O'\-g /iK CV4Y&bY&Liٜwv6xZ Pbֆ,(/R78:j`O9j|$ KQ{<4j&9_/G>+ ;Ĉ[oU4Zeee*(tp rոi:}W" 㴝^6UT  gf46#vvr׋.t&.U2m$I웓ێKK:5As4J:o46b`/U/''ƌÉF'^U66rEAaU: X8Ū7Y{d2284vS߷n_˗S"&CH̯A" A ƕW ' 2o9MKr@=N877u*sw}TUqSi)+fژu}ܻ0g]v'|omF-FKO4dxfv,sF^N(0,|WUY,ᴅ }P%%̞|LYf?kW6%') '|1aM鹹Lm$Ba N6M][˱sR_OiCa A# aYwpb ~8%Y&RUnm僦{ [%_ol8Mri:]2JAdo2T7(?8_ . ((K@@@,P#{eHZR--|$999'9=z`U"9fAAA$A xݺE_Z,khf6\=MuǯC~ZïCC WI3oaHRI9&N  ٙmծ..dL rT*dz_''SҌ~d2nrsð0҅顡pr"~lFco?$/?!OH wAr9dP\ 17_\wQ??4qV(0Y,||<+ΝŠb K$`mA.ki_ ͅH Xswj׎V,wt><䧦b1|ֿ?ڵn#f*(`飏2;<rlݺ ZXF{/LfF˖[ݾ=sdTIhxQ ``̙|һ7ڵ>}eԊeOfSOqϞӱ#ƌ!?W~|Ùݾ=Ky|Obӱ#QK~jjzU͢gvx8_rWWSO

      0k^0NZL z:wNjpYSz"V"t={/*UST"q~vЁǓy\m_ҥ|q-ÛofCru.zђ<ּuάvl~=}r%`F˖hْ+V\{%83QV ;ss9YTd24~ԉj_"hdFBÏi6VR?;wvb 2M&Tr9xKF#&%qkt4:f? Ԓ O*ʿkSgۋ4Y{rJ%`V}TreWgiikmF]I %byDP2#Wg  \@A7eM=4jϐ :3j5zǻukNoƲbʕt )SȈeԻttd9gg>J8e .Z-9 l3cI çUq̙t3 _q"Ǎc#ף[M >]_}uxRƹ? - ]t?J]X2y2W8el5-[79?LJc;駔T9??=ޭ[sg$Ϝ4?e̙ܼNǟ_Mnrr{[~1<{6*%)k{dži4e ]RG}+ӯ={2/y,:ip"ybb[,zn=MC\@jNjE<~lߞ/5$ ~HKcenD\C:k|LTZJbtI :E_ww^ !^3!ɭ,#XB$a fdf[v6]\dw&j!(B=dexj-tUۋ@M^{}}YFLqqEɌMjqvَmNϏFEr2ٕ~od }AAI"A(  PTȯe߾U/e_LϊO?1i?b#'1]_~=|IжhWÇ7Hc7݄\dôi {Md ݛEiշ/nYO<~=֔#G8z4wU^ѣ_?ZZqW 4rϥ?_~b[z=MdB^L#SӇ ` *6'-&؝;g<64G8;ܤ$[|۵m{,^Ͱ7ߤԥ c#cإ `\䥤K9rvϵ:2rIqݺH>z|ǪG< HكBXLzzG"O۶x6H'7nѣyCfiS1RUer"#WW</:ݺ^# 0wӷ/3۴af6O,rq0, ٳsVŒ*붽喊+J'ȑ6'~~ZXox8w@7 ԸrNa6h=hPsΞ5&ʔU l՘j{I=~Mf?XL U gϼy$&^XBeK|x>ԉ:p/LF@шR&#@[H7 1A356XEQAhbI% [+r{tT-Z4L `VK777L&2L7)) [5=ɀB0qab"5}' GT Bshж˫o2BQVTk9k4WY3tN Iq LeeUcj/;^]w/I9z{y *<(~]<tN~]+LM\\GVB]U;{zRo_S󓙉;jm*oG&…l#V"fz1bt5f,OU? EUsTSjmтn݈\Z|}iYRrp`ԩ :X̟^7<]x817G1qb:+neYYQv6*ggZ-q[VˋҼ<,fs$ax11w/y ,W-ήRxÚW9nQѵk+V3b OqvΝ˲'].H M~__>NJxlގgNlJ,49~bO+TyPc}~E'$V+KJxijp0nhNt'0GؐMTjjEQ7{Q"O GGm B= nnĞ\W#.Ο_ۋv06ARٙKJJ&c^x_iڬknۛGJ\Ty{ʶ/40MM E ͶH BiѫRLݺո_NXL&U3)r4gNGѣU֍KnTZZe~>6gW*Dǖ?I&b؋&¸9d;.<cii &k+S[j?n?ڜLٱb´k\^rp lr>mۢP8cG99$:D@dd]vϱ7&O5di۵%ؑA/-[MN R`*jgzh(&%UC4=Z"Օ 5ͲFV>? 7k2T`pG osR(ۛ;؛Ϗiil&JU#I*Y,ė2-.ϒۛ||hԻ 7.6W7n..phhhCD۠d27?"OI"``Aj*T_N wprUf AYop0w8AٌFH1x/1oڴՍBfZ(be;.3 BS 1k BAAh"^Z{Yyqtc(.F$"n}Utݛ5­ёsV0nP/_֏>"Gb6o&2 {/*mLH̳߰gh:ooMqVVEr??~:׾= UP:9U$Zž #g5pE҉ phеo8;?\㲵9?ߟ__}_Grp`Viɚv$FDLQV/\H^jܮVKر e_QjsPGH8{zr~~'O'*;h!ݻ_< Ə'i¾(\Z[@۲%GV&Q us$9]ZZ\@ji)t/(`"_ߊ3xTc.^^8k4AW.aohd٨\\G?9AXsߩ{,ڵф0i?bD2 r1j#kWXA(T*##yp"Ttn`/RVP> rܸ+ڦPws|ն-!sJEH^/͘L&̹3+O8OXYt@339]\jEPi.0٘Ŗ991QcnH,e\n ʒyqq:ݿ:4LW>μ< f 4 3[e^ 3gڪ0J|gNf_~>VE\QP2P.h EEн{O<BAٌ$g2E殾ݻvLU+ju:9;a4 &%.}aC<:gol^:3}?숏G6cW^L߱s99]v`TZUbJ"1-:Ep}d3fQTD'2Wse"{wޡ8qorjɫx{N-\='tS(4ʌ GS]k^*OYs wWSP@r>.%$%* %Z% q[˿ECB,ܫ홀ggk6Pl0Er2n]L[{ՔUPPl&@U`iz:wTt nL]ygϒY\̘K̵Y_jz^Iejd>E nmժ""xuVǧ6H.|7ztjEZ͛۷3<,Y'{$dD>g/\[8&tmZ1qj2k׫p}   \RڱBmٴtrbFSQ !-"Q}uMR;|` Jdb /I"N3gTr9Xѡ+;v2)F#J$2f%$!^={M \@&}A۶l{m/ZXxʹ-8oofB,LQxfeAuJd2^ M1pW((2y7!>MZy|E¨Ç ['}6oj |9#kPf2UΎx,X|!oXeļٳi|g%cQFnJXn[g"Ox}V5tŋ͘A9ݷ-F/u~9y.|h?~J-kse3ؙ#G͘(IWb- pkSzёOs5}c۶*49?~O?yl"F6c`γgos|23x_+?T}\df"1?l76;ٌ숏1d8bP =p   \PEGWynFB==ӱ!;pMf&6Q•P*y5$>>Ȧlf%ٖs<ӡ.d2nrs&77^*+㧴4jKPRaZ59#^j52DAy 4)N%ʓOWRe~"QusfڋV?225Hsrm߶-9@u~;ɸĮړvի)5?z4jNge^Ttط~:"}II䖖:LVf*^ȶKƺ#>A }Djv%&ח w ^sQ  @Jޤ$Yg;ë,U}tr`;^;//:|%:UcGp&+Sc<߳'Q񧞢=>eˊ1c{{ש5΄#iSJ1va}-1J(d2JA%۪[1#u:"u:V+BB8ÂC.Hڷ/o.vvۼyKJ_HHqh\9HEÑe sAZpu*~6 psd]Rh-ԁQAAlaSz=2~~d2  ɢ"v6YBÑd hXߩ Y ZÅwSbc\ eCD?3J $ dL8:8)I))8>xΖ4u|%'C~f~>2a߾ۋ_sE+{Ol 7ϒ^j̀[kU[{zT*(X$Ζ]JJ?=qt3L+6ZmErF$%1}{LKP f3.#u:^ۺE^ނ?US_{0cN@kϣ7U炙#wwhz _Lr~>J$ \H  pY]]JY&SEѣfT tLlP#7s%%R+[rrx'1ƶoű<=BCu -[</,-)l$f3fe1;..LcV{M&H%$@yJMٳЪTZ4Ϗ6$rM&$%Kڊ.1U_ v{lIy-$Nl>Yj+A-GGdCTiY.w܁bymVF-]J /β^9?7 .L?`)-UfFQ6trOPs 57MZgg r{6ަ 9%%ṍQ;8m*(?W#?$wv")?@kF#;Y}$a0,Sԉ*SiXEUpd$~ļ B[K,?9sw+S;j\~ZjJQZj&7Z-oQqr2wxy.I[,I~d2nd}NSZI␽XhrGsgkۖV rL&\ T*\r3 >|]a¹sJ?d2[_}Lkh9/:3*lަ /4HIͻصkݝ^^/ feq ͏JZT $6;n|y9;WY^!/$W! @)P{fV:U5'p$:TݻT l;ڵcى_:{/oƘ~B^1hPu|9r$mH\N=?z Gyc6^ۺb|]\Lg1''͔LHe25׷mFt"|}YsmHni)j5ۗzu̵eXrz嬀j><҅wwݽ{VbڀL0ʲwƙlݽL'QM8}a!S6mE)6,S[s ?72x" f3i.XrwT۶LܹVۜc;*OXϨÇ:|B37 n\2Z_AAZq9x˧İwHjH'Ә1׏NGcZ9OX-LRQٷȎ[̃˖_$C'OHDcbv̙)+,ĻU+MJXcT|;OxjْoMPG.e%'ruE"\jrcTY8s'~pn}UV|z}4kEףHMMmˇIIUGaaXV;?88\VF_:v:p*6&%oRR5' ,2F `|B˪Rl663z='0[K.r9V llY`tuw9mV+[_l,ooDZZa/sr lбם>ͨKz2޵f[\w3)/pUZ$#ݝ>tyon>۷)SjWF5**LkϰB p%~z1J%w}.wMi\IS'yq}=~m7xY'O2q:w'L@PpgqY$ 3eL^YqqKOʽVSCF.| zdd/^w2᫯XS-ScôiDuGE1jl[P\\~XK:y,:ix`B<,\yۮWdʕvG 7E >DlkP&/d-<$Å*,l@&P0%( j)XH1*8-,16\MY__~`Avb!` l>OR&㷬,8yQG*#sPZjHH,.l׮abl&\ ,J%NJصcj@mB77Tl` b[$iiWe{PWAש_wwr2$C$>o޽ђ`W ;9g6lh6\~;sOѮ]ErPhDQAAlro_hYv _}Bg|zMBfz|#Gڞѣ5ϐZJ 劶#8)9:rdnB&^DIJt5aBckmٔ;kα<=BC~tQd VCDl"`I.Cpspl`A y%.kNl,*VC*bbBB 1t:[5uf7RR8[ZJ g~VA٣Gpz//4 8'N4\R.guT|%f3]u:޽ѷחT7#w`cҲ%/e  ԓj??ֿ&7l8'GQλCPE^廪L,{)2bcti˖dZLXL&tFc[T%9`(.f;0o_fi6m8dW1-+@Nc]x8Ǐi,lΘ߿Ѕg<rh,A.jy bOEU\Κ,FRhj2aZ-EDbP*$R_ OI@ANgI4N&͍[sg E@o4f0ppKH(-͸8>{ |kVa!,+чR 2Cn'ga)%S8@I 0p8\%*rfJR&%mS"Ã{7gbyT(xsQMYOQcR>\vK$Adr9,\V_YCd;We9gDžsIAPtU^+agU$ʿ ȯEw/ w9l}/իiٷ/ˎX꣼"|}2߻'Ln07p`Č2s0w@63;v46AH?Pʪxnoo\ f%\_.3O(L f}Nj)T znfuv\K'' eg.&)@RRo21')!Lh+\z[M[+ٶ B P( /fU_swI=&NE^GD*9XuLݷ> ؿdI]QfČ?MJAq  4ȈZ`6֭8k\r̶g;pd[E3GD\ Te6ciiRRH:|V֖7&OƷ];2"ؑA/\{WRYp^ܛ6&M#I-)agnn'4O2Z-+Mv|&8YrN ||-"vA2l] @B%9;cbu(22*Z BWB&"hժ~1P;sܮrgl,ιk4貲Օ]-.nnl@P6+AA>H_DA>Wt|v̙CI^!ݻџq"{Ôyp"ucl־ &wh[ߩ}x}?w2/3fWY+xz駉߻|~οS',Xѵk1 ao~Ĉe,&+ڕC+V{< H\wMҁ~E DwEz˫h3Zh-;(reF|<7m99ėԤq Gkggo׎ ټRe2<% 7tWΝcyFor[Sd2]Ɣ@~HKtR 2{QBbi)<9||ח$ 4$%Z??shV5h۶mn'8+pʢPHNJMF9 ёGỳ$W^QmuAAM2ZnXAZq9xǛӯc2xN_͚Ed2R[5?rr][<<=24aZqW(H1KML|TL&4BABшB=>>L [jplӉ9oX#I8嘭VrL&J-$Z-uyAɝ?n/dAUq.+lU'OBpMm2oCl,AAoޝƑj0Jp0S-\[I5ЩT$o8\gU2???z&0/KJxK!a`cٻ__h`c`j*3vdWB%&^^<ѭv튬 ek\Z|? ػM߱mҵ>7b4 Z3>KgS#4}DTQe:]}/ AA~k4/ؓ_JH"9=FP$rp0vĭ  ) 9 5ێaIZx>>O'ɜ0:o6l0PbWZV~LKc̱cEߍ͆cXXO[wU}95+{&O{@@s3vHPO"A(  Bw")OY,Qi.{||p)XH) RZٙ|ٺ5-I36pW(SH7xY?rR(LJ""j׎AZ,$ ͸+Td2PL #aEz:"/4ޖԓm Vls 5Zo/jΝ䨳3t|Y,xJ_uu]\4Q(ϓ65QHBVH|;Ԣ ѣA֞:(Ԗ$30CSҤ="71  \E! \U%7s$&_]\8TXJ^4˫I6 ͛\&c<<*9z=Nbao~>>my\&cF` YM\FpsplpQ哤$&tn98(ϙP11PRp,ARB:dOf cVoYYT8,NKFjy1(ɧNQl6TRV7))(1 g,͘c02yy>prj8+fd7@+M]2qjJM&YYȑ..L8 ywojR kZ{2]޺5?$qtdĒ% nl5kR@M]hxk2[?`XPԲ hDPСh9ƛ۷#xW*N^nzfŠ$><..2aBZXXe='k|^۷"vXtH'ڷ1fsE9II|ֺu 4Vx;;WZZcbbINf]w1ʞԢEkQ;8|VBZ̀(2(ӓnjBAe *I)( ^W 쒒*^յ"eZL^Y  IH.ػ7]C6`tRÑGR ss`Qt4wzRRվ}+ۮ]?ٳ2]?ƀ[[׾W6yR. 3lXs:E >:P?"A(  y98mRf&$ޞ t$y{dr~djP`2YPh_yyyx6 7T?}}5+/.&hCJV lǴ4~G&Z K;>>u#&JD[bdui^HKlz{CϞ-9?;rs+"3uH\H77Ǵ4 kxחnWNk[SZ--[oO:]xؾ#iiob8S%6<,ޱxx`zz9u=ofgSf.[Z3^$7ʷl?9K} l~¦MN@J;٦MEr&V<]̤܂EE*u%A.D   TuVIvC&PP`6!IlHZx-$;2X!l&`@)`rnR#e[NVCn }|vEb!` l] @Bff2q?yXnc$4ZTl#ÇAχnl]JKav[2U.%VUPPNɄP zLF @4J%&n %f3'&!7Ǎ|Bo_È%Ktrbwwd@iOTX-~uQhFw<~=#[fS,̣ZoBqq/LΝY|!@f%neKx}=~˿{VqEۼBܞ|9}}Y1~}AR\}dB){D+'   \^^8Vk3#72h48:cON-4rp}r$ eYFDZ_"``Jl,<əх:91E vDFbP` RkV$qccr0ߧRȉok %%XcdBa&s8P\l¬|.BLFٌV$`F ]O` b[Tq1K9jOOgML SRȺżRz͟WsXì]]V˟l>{))104b'֭c˹se Ϟ}^^l<{OIz\Bn.o(:pUX4v,a{\ol#k0u*Iq$-׷ngyjzNddTsp~secl,w-[Ve^bɓ*=Dۛc7V8xٵh-锞=q$DEQ;{wc-Zp*+7mgytZbШDPA#17shٲ29swLJW`F˖Xjy0~^|UM桛o<rdbZqS(ؒCbiiD+\nrs㗎y+${\łJ6QHJ!|U*^ fgd$BCsp d"`@K+-1aHJ"7^owuگ_\ ;v:6vْnn aaЩEA777rL&$ 0/5FޛCG2FTr9 d1kWnիy<~=};Jt^n_Gwww_2/C{ooZ@j*:_~;ΞeO?q<#c:YT2yu js #qyU^ն-@s,=׭c؏?Q9qʮFq?)۶e;xq˗cX.  GXP Az#y7::[Kd >9s8l/EYY$&إK|4kEףHMMmp%#;See)ee <|Պ=rp0/ТTĹű=7+T"M&,:vgވfVfd0/5ؒVp1Yd/}|xH;a\[R/.ZkЪok7z=JK7ҖA.E  :9(o ڌnfឞ}81wZ:90<9aaT h% /ÅsȻA[i:+<ӱsghݚ..L$a)LIJbüy.2pKN+٪`2JЮ<^^KujC4"]\6QȀoRR(iߣj4ww'dB8Dĉ5LP*)ޕ+1_R Ǵ;СH pQ"A( WĆ |sj׎Ozfc79Oӱ#j_̶m)_87i,>ՋY1oX:3Z~෷H>ՋsVlkK/r%`F˖hْ+Vpr&vfo]wd媷5 l9OzfVv|ڧL تwΝK^_ێ9sh 4O]59VXXe >>rJ,<$264r@.1LJ j%hDTȱ]X~eeUNѨrf}D ڵ;  ZI_h0/5lXz'6le8yx`ZYSOdД)^&M-[ptqeW_z }9q{ct:v? YY>{6`Yc$:b)ϯ7{tiŮu ye<)HKܟuzNmʽ~ 8^ jmFgdz>W/<ȆlM&Dϳ8<\4pզ ^#+Kk[{hjGyyU*5p)W$ PJH:tZMD\NJEk1qN5uMkӆ""!d dL(T8ˤF=LMB=ym BOOݺVpM֛ףd%P sy{zŅ, fSR04^#tZ,X$+/?5t ZU/p# BAAlw3۴7f 3;vUۋ{|1fi gZ]B1WW˖däI|pM}5xޠ}ȌNגwX-hu\bҹzQU wv+y&LV+EQ ;:m۶|ٺ5A f<% oEE5d6u85i~V<=z\mWΞe^OJEшtAՈ' BMJfMI˔L&BALɄRɔ@&t( ʶII, \ @LٌBpOOϏH7[~cG|ݻÔ)[o`áMlוKarɖ,w+Pj6sKt4q nruemN74  &khy]1TVVdd0ӳCuvfI K>* 1?Jv9LF/wwzs"`Y.CP+Z,lb[Ny* j5F~jgmEVl-4ki[[V ;ۖ(lTTL[t㼽292t*ܢ4jB&UVPd6TRVƂT7ZB&^hV1L1yy7}lٙ` rrp KZk<=x0NJ%wໃIzᅊbi,=vl4NN 㣡CqspXO6c_ALf&Ynd<7s@D~u:0o*i5vl䏄^ݲ(d2Zk;dl @[IiBϞؒ\ 4ʙba 1jœݲ%OHǴ4*OIEba[NCF% ]]p*M& B©S/[[U z*ۛSRH-+W"ddyx4L&@Qh6)I |--B<=vv&^duڶ`P^U\4SRGf{fZ͝˂CxRm@>:8/&\4&I.GQu=^A6ua*oXTEFQQJ|u mՊugΰ:&Qm\xӱ#S6mbML :v`Qt4!՝"χVXv&$b(,^ٴs?!sp 5(I2aY%  Ujyr lF.!~NO"*fH&1ӓ <ֳ*2?3E88ZH;"#y1(wI"` d^Q,+/Odldz9,,@ptzIIuZ((%+] %%dhJm?ïʦ\%dbZH+/lRIٌ pY9{epmxmVEGW$.gJ U>A 䟔*ˎV7MINnjM];̙ 6-Ւk^^U񮄻#wȑ9ݟV *Zźӧ)V3>7 ՗;W3~̙̙ڷVvk˖"9(WAAQ)V$ |㼽QdY,x(ĖwƤ$ eYFDɄBJEX>98m4P`X*9IZ>BAٌF32Iyy8o';̹L-,ħ 2_WWR 7) }a!?y'ڷWP$!E[qAÿAAAhNL.XN%sf'uYY5Ղpr`]N h7I5**J-f'&2QQ{PtD`@)RV(8PXcNq#I$_WQڪV x9pxzhK Vk/x]0?l Tܖ(<Ֆi-4Fn͜{ɪV6;ьoj5Y%%Ur\JL C\vxrr;a8:R1}{ЁmɔոN}wR%u} WN$A:c>ݻQuャ2^bHm^7^Ah͈GYQ$ ^oK.^usIgZoj4cK^?nW[ (P*aXĮ<7\guȃcq$W(djOOgML SR.HUWZJzkbbk+Z@j31gϲ?%2ߟ-cѣr$#,͍##lcoR/m̦XYy2me5uFD5>QGB_/gg>:bP)L^Ϟ"*:xCC)6yb:;k[:?75r"#9NȄ/O3n2~8r,<|epoՊA[c{\<;w{{T}Q!  W30wj+9iUHfb}ʆڇqv&ne@e2淈`b4"T*dW));:kw( =&^EyAQQ R& P@齷͖ݬIH ~srrgBv{ϟhs)L0& ?^_ 5bjkjaBAhv6^Fs؜Z$ +V\a!AfHիy|*!QX6W|ZHBbbNG鉛F&#OR{? /{{b5Ed#j&6W͚޶o%JT(tsc~=/UMLoۖznn ڸX$Iahˤ;u+5 1ޝk))Lu"$9wO[[~8K[׮" PI>=='1AAG^^^ô3=9hlԣG+X ӓ_~iA摽s'Dls4:}ز+q9Ƅ/, <| Pf£p0597or);k '^O|Ar9=<] BrZ~MLdyL yy*WWTO|;s۴ ~4wo7t0s&DGCj 'b#.pW?0޺HT*rt:z=[i\DCUd$ߺJZ#ScEtwv~m֌&eP֩S,ۗY9dI%f$t)_uȼ:ug)(1h^l1͆IY3׫Ү] Y0$o?Ng?ǎ=Ax5xMȉ2ZtvU$XղjCA,:99{LVc&! \(OOlԈXYVRPp%')aat={ɻϙ[Bn4$ }Ça͓^ICu f36i鉫RIr/Wee\#`~$o|)f Ϻu7֯'>+ܗ|EETqpUN$AUyaO 8l)V(%".یcϜa[;.^ pce7~…u>̺qqqa<`>>ߑŮ> ZdLbzY6/5k5kh LEl>D /XAqP';@:t`͌߼: CKcB K\W(BJ&cKb/Tj6r9oWʦ@ڒPP@F\RɥlF\$fK=<ߨjԠ% ssv:]ϞeM\9wɃ *ʐjAۅhp6N~>ݪ$γ];ÌG]Et:\ήdn<́^`Z@Pp.;bΰz4:]OCwLƁѣ9e f0gE.*A(ѿDA^g4>@@Z,[3G#W*NNfO?QVjENJ 11u}}MA: W9wP$Iu{FGիsr s1&uHf|<qA.ZDLhhw~pxEY.~gl1[977TsoDn3;;j[[բKTR.gZ*eV^ՄE%1͍= u͚4!U!:?RPϻ9115-zmrrprƐ$|cp䈡bc 3V5[H~cAzl,iQQ_lj3hj4aCG)SLmF/ލZPY[Ө۶Jt6?LRXCMTmْ&K/+r `~֍ B0--ARɉ͉8*% LFfj Axؚٱ~}K5i+ \BOggut4dePaL&|11d'"QXH(Zyz8sЊTz=7dqqй3x{;2Iʼn t: n+9wU699;9 +5qqcRuYr BJ!T0/ ЧcAIE^M>L9sDD0nӦ?A摽s'Dllù'ѹ?N -8ެY~EFR`!sID?)ofmՄrQMzML GM62: U!OMbc֣Wن_Zaٗ_޹w}C߾0fLܹbhz&64ibȊt8wK99xTDΎ40KYY1NHHӮ];>j֬iZZjܼyJM6e̘1 WO D-   dFsYYe? kL4])) RA0ji~~(d2jtJ XCP;JK$9:n]~WnNNtDzTd+ ;9W;tHLC",'˃Ppt%q. {{ա~}sGuLcY\v6&zFsq!SElr6%&kx g֭`ggg*޽{iӦ ڵ={3i$ƶh"8Pl!!!lҴlΜ9?:w};w_N׮](ޘ1c a|1x`^/c $n1AAdS<))9;߶n-811!zW <* 89nx8fea)IلWrrqE5$Tf&p05hWcyˋMOgI2$63.<0PqdLO#G Ճz!QءcYWWEEJEFttt439tc> xwUڶmKnh?XYY=*NVVFCٳq.[ΝW#GO>̑‚V8d7nܘ5kraS,CңGFMPPǏI"*A 3^TTm瑑e;YYήΎ-LP&|X$I=?֩B0WMS"IfnD]Μ tQQ%z̳k UVVbhMRa>2c9atu-Urxz8(IO*+R-kkuu%H$n* P(4-H[ׄ$IѣӻwoqppC:uʴ-%g7nDRbԩS‚-[ra$q!~'$ISN!6i$ܰcǎ>}ر$Ibɒ%L8gggzMDD$믿2tPlmmY&'jW^yGGGW/Rl[nI&X[[B9seشi ̝;ה,4|pԩŋM:uĈ#?Kgff2ydN:|Ū<$I uaǎu xΟ?I$~ӱ ۡJDZZVVV[XذjժrF./ Q?j(Zj˽Axډ   \KlB ߔ-:NN*kdtlOJz 㥰pSz4#I!EA.CJn.#.]bvx8íٱN6ɉ\c0_MC"N惈ΜaUl,9OrP[tp7;a}\hP}$ 8nU0TW>!IqLFNʸ8v iZ-r9 bbϓ*$$k׮͛71GҒ͛p-vڵkٴitؑH]=yyy޽ر6mD.]pvvF3h ~̙Î;GаaCzMHH| `h%aϟƍ$  ϟZ_~7-7 d˖-3d&O6m]v=8㿁0J׮]ٹs'WSNݡoa^_ťԊ3o߾w|]%IB.Vx7111T)F!???rssIIINk4UzڶmKzz:+Wdԩ7nӦMiӦgFI&MgI[oرݛXSbq͚5 8[[; xwLݻw/]F!%%rm#O'/UAAA*޷-֭2ꊅLFhZԊ QkE QM8ef! $IqpzX[.GRPǴv,PV= !;PmHuX!`h/ ի?x+ӆvv6ժA:措\FzxPfei1cؕGTVmۚZ{Ӯ];ڵkWlY۶mM'&&2a|||P((J 3ᅮΝ;)((`!AXzu7nFAѠjԩmB:}4rܴzɓ'۫WRd:8۲})`JJVP6hЀtƌMt'UVE0k-IDATjԨ{?u> R_Uk׮]]]quu%::-ܷk׮͛zƌÉ'غu+ٓrh+UAN$AAA0nn&oL0Ω)M[[Y[բmFvvl.m6RXCPM(?I@Vש3k˘( eJX=ΝcKb"OB01jC\N!9x˗ rHK > rspr2<ʂv F+?KKuu5δؘHZmxFVkjܖe1ok׮'N#Gо}{ڶmKpp0?kδѣٷos6mjsF$AAA0%Kڨ36Ƌvw:&|dDggv4hڵihkKFC"JBAhV^_h(UDaTrz=*$"Ptv41g aC,J Adh$&>L3DPҒt;ߓ(*???T‚ ]6...g}Fzp2VLwǎ+꯰-[Pڂ ͛7/Ѱa2cm޼9Z۷7lٲCx5ɉcҭ[7.]?x`ݙ5kUׯҥK;ִח+W[o~t:~ORZyXR,u5jо}{qUF}1$''sUvu׬YǙ4i=GV"A(  ټK7$$KlmFV~ *$Ņ u͚Գ&E!FF|,,pR(7+\aKI}% sxطo /^,Ϡ ǢEسg "''^ڵkg:ĩSn^,͛9rN*رc e˖Ԯ]۹s'#F`bѢE߶6ڋmxO޽;.]k%?1cC A9sA5lؐ8=z_1!jUG=8z(VVV7 ϟψ#غuk֩}eܹZ!C ywoL<?#FPZ5~{ `޼yЫW/ZhAL-/^Lbb"AAAhѢs(W?L:=z0k,4i©SnKJZ֭[ӥKx 222_Yz} <$@cA"NǦO͜6}:)۴!D\6ndѣ&5*wE8v/\|.^ĭF ,y{A0摽s'Dlly υ-9زSMҬ(i_3bjޯVW||EP)7'+ KIY@ד`)1Ãi~~NDz^2U@)ՒѠhmo|}icoPgi=4aa0kBVh4aI))`av*]ɼt N u͚ SYZ j.GO+___!**HVӱcG2339zhf/0zhbccU O'񒑑!*AAx8j|쓃QXXۤI TmwxTɉ$!$&%U6}`lmZM/4âSd `_F, ĩըd2|,,8Ƌ/2%Ndd<~o WWC҄ !5\\ ɴ'իpxz66Ьz ݝclk!>6lz[X0ݝ"U{SS9ixQRTl޼d V5wH%&&Yf1tPǔH  ݱe}0NlMݗci.|ܠƎ%|,~9ŝ:1n]v~(vQ-'y8> di׮\)1|Qs^-ZY=mAA"c!̯[Z`ܹ\(9ܚ5/.ha|ձqvRs<}˗i(>iԈ4^-2~b,4j11A%AAgհat|A*cLCwIRuqA.Iu:rpN;˙ǯ&(1Xƍj5j52>*V2SSy]?SB$1ehժe r0P0T֯ohI$8yҐ(XY'?2 t: ego关RIF\NE(~L5|An.rUh1r$/Y±+n;ގ3ֺ5C-åzu~}uK;e .1`BNȩu8Ϧo8OF\*C-˴i\9TGݺ\ܽwFncT}}=m&LȲe˷qc0$"s32H&3>[O8嗗_FT2諯4yy22Lu:|9  "wٳz鼴mƋ(qqu:$ [77zz*͚ɿJ ɐ!y%E F=gZ֖K dؑǏs?x8>#}{,\hΎ-SW-eH޽9v-=?4Juk׳N }{tZ-G-ѣãvmn:E@D>wq)1,kJENJ iQQwxԩvŎ+dHxe̹sxԩCɓMtnڭfM<3![LuX^/(*]L *Ib{RP>jVvur md2S5xOOaUI+gv O|CYV"SeGRSS̫>>+m_E 3 _5-HH{{QZΞ5TR֮ IIDa&ꡰ܈z= G9Ec3xR5\FGvsN  T2❳  ܧ7JLa\i\W7%i4*N3uV- R""nۗ۶vv&3.:ZB*rqܵF 2yD/zBј>jV&R!wo2 ^@Ƽ] j5 r9>* `sb"BCk׸h2 <²׮Z@r2]mXpZP0$ 7'hPww\U*R5le2ru:Vx(TPTN*BAAx(DPAS1Ae~,Kq+W*L3.Ι3ٹ3þ [v$jm_%git:zk2}|ּ9Ca 6c{c/X8?lTiޜgy4U[Y3"O / bMz56..l6-[ӨQ$߸Qj ˿];]cqP>kޜ}|rGA.g gIᛔ%$ZS‚ K%. pw2S\d6aF\RL?w11hniT5jT??lrbjR$ e/ >wiaa}4%&BN0;ah(TYYиqٳ +Ht <= IRZ4wTR0wwt:\ήGsVT2y:KTA$Ũ  '+''2p]sy^nM3Lˮ8$.ӧߦm;mF׭߱(,\[)-\s5 7nzuTn9N1Uըeq|L;eƃx` ݱ `ej*BheoΔlYYԷ-u}$1͍OoBc%+%UFC{VXM8*e11Ĩո+T$i4̎PZgiipX*oUOO~em|<1j52 r9Z-kٞ77&y{S"' VV=< BggPAZ*.G Wݪߓ3[#]Q.'ZfM\W7K]~s[c '7/aGa]f.(^n3f%G:Ç9f ru -h`K=7n$1.ɉի޺iC3fyYL.Z9s{7Ǐs믉ttjՐd2ٰgIz-NiswIյ5 J ^oͨ E&7oVl6P mHPu޸T䀛R/(J&c'S?aGRZ- 2Z -.ח(eyxv6L 0* ́sSS᭷°ޭ[P΃y%';._)S |4=a/b-a!_P'4[L_GG3/"|lu8iKtt4>>>D4cƌ!,,r#**U2c 틷7fͺ3f ׯ7ޠ{ddd7pavIPPY:x ;wڵk({>**D4iU;v,( z/^xP222D   UPrOwikkiI+{{2u:ۓ*(BAx:y[XNWBAZV[DFG3.dg;ԧF kkQmŅ|PuRPp#/ oh({OUbaK 7tto`ժzw!I ; ޞfvvi($ X֌{#<< ^T>"aaat:ƏO֭$6M6zjVX'|BPP `Ϟ=oߞ#G[cG)9tE #   <6T*HoVΖckWWf^^F*O$1ˋޞ$TGWә <cb̚Dx4ڵ^=:8:iLo sYYLr!.vo D56$KButJ4]vNH̐(l Y$qȀ|g99uAe//4rNdfrP9~`m۶XYYΔ)S %;w @@@$QZ5V^͑#G$ IXj]s-+ԩS/"233Q(*N8$IĘ}ԭ[ X|mǽ::ubĈ,Zooolmm7n999ҥKSÇ/\&1gbbbؼy3`h)I/nv3fqpp0{:tSmSfsԮ];;;zmFRX=PfM$ISN@ՃJI3f ˖-+%SSS;v,XZZo]lӸqc,--dذa{I.\`w-ػwou y4j =z Be#   |nݺQF n̺u6m&L`lٲoN޽iذ!!!!ЧOkƲb voaJmۖ^ cP*?~q#G^:|Ǽ ܹ#Gꫯk]lذ˗pB6měoy={6R߇wQPPcӧO۶n{[ڵ+k׮eӦMбcG"##Ƈ~?ӧyhڴ)_5`r oX}aq$Kpp0!!! jmVlիW3h lmmK}ԩxb|@AA+W/ҬY3n7|R4U܋I&l߾Ν;ӧON*:{SR8N_^񡦵u;/!XP b  ՆPzEu!1hkk^PPddvx8Zc~pz:kcc ^fVDz= '339JWggTٽ;уիW9880|pfΜ/uI&TV 777iժUuI֯_O~Ljɉ`jժő#Gxg?hٲ%GqgFFc޼ydf׮]IJJ?dРAZPJJ gϞBY3e̙{#ɐdj5UT)s???i/kNGPPlذt`8ϓ'Of Θ1N=qe&g)6c͚5 6 p={v0U7>lzcMbb"&LBR$,,bժU˔[.رcٷoqqqOKԸqc.\ȷ~ˍ7=w5jTۗ܋fڴiTZRRdmRҥKyN]*% AA"˩niYlYd~>ZuttM$CZ&#OmFpP(, ojS"V&OKJؐ@PŜGB&c'5UqR(UIhQ|KgYp&E`hoWZuü>ܐ WϰnevŁ;M;GEd+:Co+IIN1[Ihg8`Ujj*:cǚ$JҔ(Sa4i믿Zĉ۵kGpp0ZǏӾ}{ڶmKpp0ׯ_'..TAN#&&\r+qaaqqqARq֭2׉;zhǜ9s8x 'O~hXJmեKYn`H9 ϥKү_?>_>w _{QӧOgŊL6sIuv6 -FAAAxrqZtiX;\(%mɼB&$I}\\hbk˻7n/5,7+yy| ^^SVenv ?Ʋ:>GT/9!ތ61PInlm}{P7$lm _kPyNa1*Cǎa޸E%$PV91sww!*?Oocb$.GGG$I?.JO?Vѣ;׏r9m۶wa޽( ׯOzz:_|899Z`:[۷ﶤJYPb===Ʃ(JZnݻny=~8ɴi E-޽{Uڥ?C&1zh֬YC֭ cwёKd_̙y&...R~۶sߺu+oiY^^I'%  yW+qwo2z= QȨA(+a~(DhzJ$`IT/\hk*3Ve_ÆB&IDdi8+xTaD]ΞeKh lC ђ vNNu+8 5$j g1wTfSƆvdj% $&.Nw+\K*B^qa3$D*3yh޼menR/5]rڷooMBBJET*>ZnL&Edddb ڴicJشj +++K¢\ 1UoT*6lx_x'*/^dŖt:f͚iƞ +Wֻu׮]3=Gә;v_N3soӪU+jIhڴ)#//j׮k׮-u=bDFFrAx BAAxۦO'%"q6;1}{@Лoj0==ʕxԩCu]4be\NV feugba<ܕJ t:vЮA2Iby Nffb%I8)XddLcrqw#ki|F{z$:D8*)h|]mz:Fְ!YVTxa/Ā oU))* ||ʕ(P))C=ƷīxTj4, ,[nz 7n`ۗ]ڵYv-۷oLJիJNϞ=5jj"++>@Yf>|߶죏>2ɉI&quZnMAA/^ŋ\\rvv_~DGG[o1vXSl;w.sν9C aь;ӭ[7222oطoׯ0TߟO?J%}: xM4aΜ9ؐ|pmJj֬L&~`ذa888Pv+\tRpss3UСCo曻]v 8ꫯpww'00LG}رcQT 8|oŋ܃Xx1rf͚\D  <F"oR4}ΥӔ)^؏?Rq B%f4CVnKϺR`)39/ccæ@E2V$ \Yt4HwYR&LNGZMNJE@ZZ-;SRIJ✣#zW e2HO@P*<, Z!Qغ5XY7.3D-kkR4,d2t길!;q^^hz44[LQ8p 6d5j~ǏO^=z4-Z~q,-- /o߾KTZz3 ? walٲ~1rHoNi0$/̴i4h_|IuFvYV\W_}ݻݻ7 ٳC[wҥ4mڔ[o{QFb[G}ĢE/ټy3[fĉ׬Y3f̘Exg={v뇅/]ٺukV\s=Nj/uq1 IPզ 9KҸqcƍǴiӘ2em?_4}zzzw ˋ8>}6s*z{ps&;ub~ݺ,ڕ?pW`i.̯[5#F~(s(+ 7E̫S szzvuE ~5󩑑l|>iԈ痉 pa.KZTs\lCmb.}W_iá%K{|y>v nX2'%"'qc>_qԩrVfχE6̫S/۶eCHҭ6-oaz2?'q|۫۷`zt49'M,`\b@H@ HuB_.vl^W^!%:^^W֎kM5ooӦ䥧q8rRRqP==yv$CLw$h~yeiC#b);:u*-Gox>mr&/YBj43ݳf!Cvvظ},qq>~˅[oKf|<71ŐW:짟x:__^~5W ]#/#˖qЁf*nn},Ar9~D盖E$I<ƿYYzrRPsen{'B€:;:AD18+xTdj4L> q$^..t&Z$‚R,,rvG"Kdϟgf\~^^8ǃa^_enHVkHmkh*`P0͍%̛~~xYX-#UXE]L ߖ27M8z6rq1n8s@Grr2oAAAG BAAxYY?Fp}ǐ^^dű{lt 2[77z͚XUi֌LWSظ_#S(٩9Gv/mۆwÆoϲ޽ z~1QW{w~N5k0^nЀŝ:qe~tαUg"WL[^+^ h>|8=NȲe<3z4rt^ڶ 8S:LFȊhjn؀i_r^1QdڮA,IHr9\$II!-*c#"Tyzۤ}G7!,;5NNwܮ3 n"K^.'?RRxãL$ՕvvsSSjqS* cKXwߩP!TRR*feҘU|%&%6֭q߳g!>5Muuƍce?ő V)1-&W|ٛlg oՌ;/:u4wOs =@ C1%VZVŖu:MN3uV- Rq{vFrtˋυ]IM} R*QcbKKZّ"$z=EQAxlx[Xc:̫^cŏV[DGE1.fg;ԧWb"(Jj4᭪UW(QIϧ~x8Z;;Z-7rsy][Hbz8rJP( 7ܐ񷲢Z-$Ǔ{ʱGa'NJ% vr99Z-y/!T~q2?5kfAD  Z'8鐓66vVVP|A\)aپ=  UEK"_lv6\ӫT=H\j5TA٭[$ո)h4uaH7vQY˜  _M?ad6g7oƯy{z maN~~>s&&Oʟ`l%Xmڔ{_yh^\GFzZ-z(k''^cưڲ%.47QZ[nX0;NA-7B9Q*Ndjt( CAQda@_׬JEZMNJ$>>)k,-A dH&걺NZّV#>*62SSyyqq:{fMCQLr9Q[))fYWWZ$Z&㗄bsAAӱ7w, `v^^^ô3]X}3H`IPjZ5Ax,7;$bccNkr$gMe@n2`ttt V%:?wo`j*rIM@ `%1ۛEϷlNO?@u <=` |¼y`lٙ\E*Ȁ G퍳9Assa oo8&OnS%O3gj7|}y ڕz; 3o |QQQ灭ZcRPPBtܙk׮Qٳgӿ6mjP?9y$Z 2uTlָJ{J~XhFߌіOɟ_'Ue!*A2㏹kGl}% 2{rP-1J_m{8;#a`m's*3XQI ?֩Çիc#VV*A狨(_xU= J!VMЕ+YYР)9 $aCW4EN.GBӱ(*gϲ26<`/-Aj*yC3 z;;mֳ0VenB1.+H3+M_)sgs1wt ggg~gnJFx裏[iQwZZsƍQx"A( :;sv#M^|`A*ܫ>>H%/gΎ)6٢ͨ T*2Ib[iagGRAiZ-N . p<#)鿯5Ca|t A Jݍ\8//7jcgZMVBJEZ{:wII=phcFxx`!PWP??fN 3wX}UVXXX;rss=u*ƍcƍӇnݺ2w\}_sY6&T^"A( Hyx1޿z7xLpvVY7n TO D Ym]U*ۓ!$# PԵaS` UQJ*j5\ʬprU$KuPah?իqwJ%3VF6ΖPpS(+W2B|Ɍ CՐEGs'D3;;ّբ$$`u|O֖NNdn\OJAYzҽ{waÆϦW\IVpppӓC_kCjxpssŅ/o???\]]1c"? cƌ]v_0`e{A$I",, $Ib˖-1[[[Ww}Wl,F-,^#FЩSrNٰa?Bb!Al8 *OI P/p1 KlglO$߿?*׳uVƏOZWdd$'Nd|DEEѽ{b իWsu֮]ѣ:u*ӦM~c,X[ڵk||g|?~QFyL:jժuV8q"L֭[Yp!˗/gÆ wLeʔ)TRm۶/ٹs'~) >ܴMa"w!$$8))ʕ+YnnݢO>tnT@>LFJmjccCΝi_sN Ƹqزem1QFe,--4hjeFEyyyxbBBBغu+uԡUVYk֬jժtرW^͂ >}:cɒ%b:<:t 77+W~zZlI^νPvv6J?={ꫯE7;sN}2))  B0Օz`yL oVrm2+(@j*/6rP)uvrb{u:P`)q*3A~j qs+V!CFdg*ss ˗A0$sr~bˣkej* ## FܔJU*t:'%q -yw'S C[7CepOz:;SҒȼ<NNfؗJJXOOO%Ѥ$"""رc ][hVYfTZӧOӼyss]I֭ׯg͚5ܼy+++zŖ-[ضm4mMwqqwޜ={F\zɼyԩ۶mc۶m4hЀD~'+&M@֭Fu҅ [V4jcǎ$&&F+cW-Bӱo>h޼9ر$I{,&&zwᄃ}6nܘƍi߾=ׯ_gʕž3f^͍͛sqڷo_kTM4nݺ;v,o6/^ڵk5jTɓ'޽`Ν@TЫW:B,^شM۶mIOOgʕL:غF+u?PQD   Don)#wVdiȍ <Ax,,XU.URV4y:Ӯ_'ƂQJυ\rX1HD7gg~kЀZXV`#RYCgYUrIL4TzxZm8M"2#cz=r9^+I}|L3Jb3D1yd6mDr)-Ϟ=KϞ=qqqAPPjUSB;w6%bd2իWgʴN@@111ŶV)9УGT*'Os)T* ڨjcZյDԝM:t۷BA\~?ѣVVVh44 ԩSӧO]ǎh4eV={M:jZ>#jԨJ+VſGu0}СCgǎZ2<<ը7f׮]̞=ӧOV{!^xSr{9/_N`` VVV(JR)gM*H  P)*8Cx>;tqIBc#q4#$fT*5$/գ5qj59:*2yyfe;#%B-o`Z]ލJ&E7jČ*UˉQIjqRHh&ϝccB;+s -R B |>P`'ղ1hޞgM3d?Je2{͍ѣGAݹz*ٓl/_ѣGMscJU겒۹cy9-zcإDcWW{:{ggg~';ƦM_XjJǹs爌ۛ[n|dd$^^^?9s0~xvɓ'=zt^{2V5*/hj3fڴis q1o<֯_OO?5=|^νƍ4i}aǎ8q3fۺ%Q BAAA*&vL3ZJy] GGlmFr25z f$ Z۳~}ՒVc+Tr!;/\`el,B)RS e2Cj;KKCj BQ#{y!ƄBRͼca˖ʕ\/܁X^-" W.sGgqsI(q/rp"fSg#=Gܹsу+WrA6nȒ%K UVX[[3qDϧ~ʏ?PcpwwgСl޼u1n8zAƍ19r$o˗/8;;#=N:äIؿ?mծ]͛7sN:ԩSIOOk׮lذC~zƏϟY1:BСCk*UXt)?/vb꫼+tɴصk_|{^ 33>Xn+W~W^S\J{JkrرbeI=z4%M8w};v_ofK׮]ټy3{e̙,.\0~E-^DhѢ`H\PJ^{5z̙3dԬYc?{U5p{^'4Q^YT@Q+lPXE`׵c(" +PJ{/$#&!$/ɓ2e oSN'LHH`<#LSY̫8Y-^K0}{Ç܃ܓxm[f7!'ܷ(-_toMc}AU-EQjeEǎ'$` HXύ;v T85 yy|^^Y]AFHxkDEMn%:fQtb0a2aءC\};u|ͶmPV r'?aKAU#"u ~).fWiic`⽽u80U%*n:VXa(((1sRĊ+_x;zKNN/^ta_" B4i0y{c翳fs*~amڰok2v`#?h݂|VM{׭i1v,C|ÿWsb0?{;|-ZĠGpfl| MN`L řZ/,/]U-g|OsS5nW=.dexcHMBkS[ފD7>,aB>.&Eg̠ر2?w︃7U<@QFO\.CwQY <חC(HS,:~!UW$meWv ڶ4'N6\CŋǨwsBnFیoj |4R?M#ngCA77uGFz:v;F#&6H5kvKE^;~~ڡC}6ТEb4XƆ %lW% m.KKg3yszc'yۋ^͡p(6˲PJsŠCcjV=kS\4|||Xt) 8uƚ5k qTU=YMYΝ)))i0JBBK.kezBBq DŽV=t_?[-Сߟ#Gf+{7~?bl_cmX6\͙@뫮 >\Tyy "i<KfNm]yTUgfvC?H1Z,74и8ҪjIV{y9)F믯^~9Ns?ٶ|c9֍>˃}WO&C_ H۱^慸 ՃΖZ?Rx*P,mF$ feN\HAAj4Xsi~u'*+#f;QG^Ϗ:tvKA͆IU60) ˳YR^m[7*, Rrh0eIU;2:Ao%%X␘xʯ3BqK҅Bs\IY~>Ntp¶\b &;()ps\ggPϯ6ZՑ35%7~a|sS[Sr*eyyl7V0=Vq3o=Uh{/,)![7=-`ϥBEq1.]ʆ Z|D<[H>8f*T|s:̑#\izB[;,NMeqj*iU-GL&2vطM<ϥ4(=L?nW=x4]MXVUQ5|TVVbV v;wdҸ=4Xt񡛯/?m6~f&X^wK))dlXF^OO&^Ϟ=;!ht B!W@ ~xҟ+OHUce\;8`TV+43g08mM#{~6=(m`9^tؑ+ğH=C?( }+8a*Mnz\N'Gla?IO@EUb$4|!<,[{Z !N猪 ]=s7z ( ]*/OB\B#͚ߟG`y9&Eoed[I /n ]TAWU}vP8y.;1؈ĤP^OOtl6GTAcb*(`2);BCQ%QؠEalx8c"VR֒w1i?h H*)Sh!R -FBֲo_8l6t9 sg\޳_֞=r]UӈЁ߿߰0##uko`SOЮt>^";w&C4m˗c"[=Nml"C &Q]g{7_Lo\];cq:BѣY :O@n"eKleelmi5k8xחg/UށtLJ~KEQ-wޡe߾v>_QChuӥ xQJڌl,,dq!.~a&kǛQRm6FM&vf8Bnْ y.:yy$aXO//wp.(-X8zv4<(gBBfkx8.rxL&ʝN6rΝ#11X,EGe85/Um֬L _U塘߿BKT !=4Ws[>'Ndcq$19ԉU=Wsrb>M[1I޴&Mbg1?).Ӈ 5oI`l:Nm,7wƍ#\>(LH;^@QUBbcO^޽(HIaѽob`6cmӆ|& f{ָnk#Frr8|uN?_һ?sT%h:w{ofK/XM8WF//{yQtbTU\ڼ QqQIQQ,Ёx2vJ\.M&|5O))4NzyuW &'(PT?x.;v [fb #E m6JɄɐyQ(o V5^8zx*Aw\J^^Lk֌e>Ykm2fLJ/ti#43hܪvw'!55hRN3B!<_5-EEERA(B4+Wڴ/1;4!`DL5n0+ eUmFsv~,*j[V7Huh Ӈs=d]LssU/#]IXV.<,&)3&5,=[Q.[X۵+Ӛ5äl8 }eN62&, \j<""p 2u8(+֭[IHHryc!HP!h$Fw3 w"UBQk= VSrZ^^{{ۛ"6B*0&aYΣX4aat4d*pĤ9 TVYNNc%ݎSB$B!QV ojϯ*.FΦ† Rq4lɿڴj4fauL&u槤pP+** /ϝ t'HкuYW)[Z,е)7" ;bĘdlFD3G0dvggx2QV+>FӉQp4$\tbTUtzƏO~i׮~~~ :LbLBV}̟?ׯGQ; 7ݺuc۶mr뭷GY~}ʘ:u*јfzyΜ9a6o%K0aF#0~|@۶mX,=z(AB!B IjWfOYYCK//OQMB(_h(uĕ:8  l((`DRkrs;Ժ˃rwOEm6wailGLĶmOAU]5͚a>f>a@X|¿T'Ll"^^  DSTEaif&&dUI@E޲2_ ߿~y믳exKKK1̟?5kpO/ɓ6l˗/G4F̈́ ԩ˖-E=Jt]gȑ|̞=+WҪU+ r($$$\~m}Y}Q֮]ˢEZl6 O<ƍٴiO>g={0w\̙êU ӱ3y!r#}׮ƎD!NɕniJÆB"_C(+-Eu̪DF2)2\j "L&rv>j BrWd$ĮicQEZm۶ @||<,"""xWXp!TO2t䀘mW_} n:ZlInp3ꫯf˖-Qݺu7 !!Çse:'A!EM^!PU**cɿ!) <삂:_E}1+"<ȱM>ɩSf+*3: . 皠 >ԉ^Jbq17'%L\ׇ4vNUW@C||V_۶}ܭEcc\߀VtIJl^8z ,Jp̑#|ʹf͸14"<;FU嶰0>K4'$ηV^JI!fj4pzzEZ 00m@EՏ?{wG}k /_3srr8tFZhqgur'NW_}ٳg#<ϸoXXX#M$B0Lt֭BSE@ɄQt.`GIIP+5EQ0* _Xek1!DÉ4YRSYB1-G3v˽QQLm֬-ʪٲ:(nuu:AU/D嗻,h0kii^b_1pg>{lޜRypK9k6˲y+>Ɲa\@:6vxՊ+kx脟׷2m4MFrr23f >>Çv_y (5WB!BQ{mZU!q8p:uZc@` Eri`oyyG*i11ߡH٨p0RSdTkrRRܭDurA~;AX\ VpnHOpyB Yӵ+°:i6N d"`BnݵHU唀hAA8AQ0+ uσ1aa8jeN'oed4vX]yyydO?mHJJ !!!ٳWzXΝKpp0wHJV6g!8$A(BuVp57BK]uZAF#N'ުJ ߟ:ubhHN'FܔĦcf6 6䀗{]qWVnYXV+\HmftGlôXXئ v@om6BɄ(+?m GR\i[0*.+*LF˅pen%8p k׮eY#GRVV k}ѣ3gdӇB\p@/,,_z !ĐJtt4)))gɒ%L0ݎpQvUUюu#y: ga+˲y`^"L&JNP6uN|BwW]pkXv]'fáDV'蒟O8"4M*Vtֹ54!"/M"` &T(B4I !gi<̛7_-[x~^ZZhdY￟~_|&O̰aX|91zh&L@NXl-Z`ў꺮3rH>CfϞʕ+iժC 9cNQ:OyygyGYv--jb6lO<7ndӦM<䓞}ܹs3gV"((NB3"4d/N':\$!ąLRɰVUFvrΝ,ήqySQ B=00't tۡGF Kmaǎ\OA|Bq l#G.Va!!U4) deQt6rdn]|}* BMQ0K22(k" ! X!<i֬)))̜9˅DDDpBл+),,7dԩ5ֺy=:{m͚5C 8uֱfٳ'޵kWϟς Niu%2eQFyoժ}9h^^7n Bvwd$S fFWAAAl,,DuTo \.[B&Ǣi<Kw__,ԉrrxQcQU |5<=ʧ99L&KlJFiv6.6_schhc]|WP@IJ>alxxc&B4y+Bmz8iA+бcG0<߿:vWp_ZZ֭e˖t ÁtrWe˖p85kVε[n^lR+$9(8zcPΦ:sU` fUrxkX\܀ !.Ep';ח 2 zz:cw:-'SS tgis~9;w-w{6m $s4Ea]0ys54#<?#.DĤˣ_@}}w80* Zz: !I !g)00mSU|{ 6+W/0sLOcT;vWvNNh4Zh97qD̙ҥKٳ'QQQB\z!uvi UQ]Qu^^B\t iXLJMn1i^6mXȴu84L& Nf>̰;XQ&FFR^ *˲)v8927rWd$:`u4_KJi+& B!8p k׮eY#GRVV k1c30x`xvM޽OUǶU}ey > 6'ЧOz̙3Y`}!!!&iUmLJ^ƀ].wdE9$8G"foCѸt a2v❌ s'JKsU-xʁ-,tÅܬr|T\DLx*+sr};T5.>>t(뼟d*&}4;#":._X_Pdf% !zaa!U:BKYLL DGG!)թ ۶$ +>sm,恽{0(q:AQi9Bq2krsy 6aF#FE!nDžX| 9;ʕЩjW/wE^q1̛'i,[]}Ю<QAx29ŽR@h$'9̝XUweeN:6;;wclw͚5vT *lf~|ءs8Ȱٰ*&NE ޶Op5}uuՊQr`0ku=.9Wz{sM` EN'`TȠKʸ\.ONPP!!!l6sSRRBdd$˗/`…lڴ+Vt  i|̝;>mǍw˱X,9F'( xo6>,>(k׮eѢEXVl6Æ '`ƍlڴ'|ҳo]?!8 B!B$Q}=^\Lk)ۛff3].6pE@@,ח:1VQrl0`QU6pSR/n͕uyn*(Jw!w-4v4(4d8zՐ~~бccGuNU#">8)),"f#` dj^ȝ;-,cb5;ZQaa\\CWU_VFkotf{i)Q&$#BCQ.c0h ZhQcz8V\inݚ^zoѽ{w=z4 rƸqx7<|5ƍi׮c_”)S+7ࡇ$?mKcXXz5^^^pm1k,:Ӟx̙3p*ٳ'?3?D97QFyoժ}9ab]?!8*!B!%{'3먊uuEQ0( __ۄ`WڵQ4 i2q;vߩo/YX &{aQk۹JJ^ys8.q 5N@I͆y'#` |5R(@.AJJCG 7d21dȐۭ[n ]q88uF@@+ݺu_5߳gq'..ɭcc+ 11VVۼy3C$nazk}||<]p0k֬:ԭ[7V^MBB[lk̺<~Bq2 B!B\tw V` EVf4}gBԑ(<[c6nauFÇw^iwJճ}鄸sv _~#Rm/z*]}}cGiCLFAi2e1AnJJzYfѪU+:uė_~ @nUR722䂮S9Y ==cFIOOq``{SUnEEEW'NdΜ9,]={s=W} !\ZB!MjTgYYGHӉwܡ/YYQU9cStj4i;QRrE9AA9za=|՝c^JTEa]`L jQra2l0v7<QUp48\Q&{[M?M<]}lox=h/&++-[ЪU+nf 8!ve=Y ˬvΘ$A(B\&MT+UPPٳOH6M60BuVfϞ- B!.i Dꊙ:&0p:>brkO!!2+6ml4fN;;x] { aa|ϥN\.HLtW ;^@;J۶XȲɭe2Qhdovksu5Eu|*rl#lBB(eQU>Φ_Li0xGXp!/;VBB?37t+V[o$ /_͚5k>}:aaatUU?;w͗_~g}Ƅ (..W-_/`0qD"""㧟~bǎ']cԩ3l0 ^{5&OѣzNL<+Ww1m4 0`gŋILL$99Bj B!.BvILL ݻwo5V+_~yU?~B T?0MķR&Lqi14O;v/Yv;.&^’ UaE;1h@n;f@I kKؔ= eeDaǎU( CCBXӵ+6ofQrf2a5H*+c3e^X{BB}i:E>XTҪVv;:|zGy衇xgL?~|mڵkǦMaÆ1o<"##=m=˛oM7رcXv->UO?1b^l6"{=x FEyy9Wp|Wټy3g']#""ua5j=cƌ7ިWLs:uo߾_;3Ça>@=9s& ,O>$$$4HB B!Ίbc=v7۶mcȐ!ȝwIAAL0, qqq̘1K.[nX,""">\OÁAQP327n%SPP@^^=?NLر#+V ??2~w,X@PP?IJJ]OHO:'ƏϏ?H~~>%%%l޼o6#==Œ%KS?~BQ B!?ϋ/yرc{{ҿ K.?=~gSi&.\W_}ŬYӺ7dرу+Vш6;{aܹ̙3UVy޸رc0a| f믿"##Y|9 .dӦMXkddd0h 4M?fܹ|u]'l;n8/_baȑ5b?EQgGeڵ,ZՊfcذa<lܸM6Oz'pDwcfյAA?*ck !.-/nܖ-{e2i1y^y"UQt6W^:S,!Bzr8̟?|{ AѢE=SűrJ([W^otޝD~F 7*ſo7F*cƍ)SpWoC=iIږbzjnc֬Y5f8̜91cV={\_4Tn2%&&2x`Ϲ5}Vӧ  !.|}9\YIu\ɶٰ֣UXTr ?M#`sq1W4lBqTEa|d$}|xx~l0i4pBJ %GXEJw0"ݪN/5"EkIQq?ogf854 M#`//g޽\Zw{]PVB|srh1oPPmW^NɄKY !MT !tQC=ij>˟g:tklӮ];6mg 6yiٷo_|Mn&Ǝ ڵk܃}~'FދfT{oQ(//g6*7o >kDDDn:l6Fc̘1xNu ѷo_֯_ϝwٰa| }G̜9 ЧO$V!D6$1T͑~(K4~.*T>B\ JKoih. yslܲs'_sV9 ۋVTJ{s2??>ؑ[&l&f$Pӈ08RQ{2a&Qt* qVVD<= m6V4vXB!))^XXUB!ĥ,&&TIIIipܒ%K0av!| sl 2__Գrݶ `RЁ BS&'l6sjeؿ?v;fUFm*s/RS}Ǝ좗o(5w22(q: 5*N'S'* 調 mm^~ SrQ 8'ǫ]/EEDͤltau.Q}^>dff/RPP믿ٿoeܸq̙3$$$8f֭|g̚5 UqiMKQQT !B!.~F#G ^B Ru~6B Ea!Aq1>F#-6LEш<{ٷ4k~]5PPn/*"hdVl,:u⊀2l6,UmG+].=ra;vm~>9HLÁEU\|ĪEa|D`s4v}{?2oMnٳ5G!$B!sNll ( W}jP-(8' !D+(p謬UhoL ڶ$h_X͘]8tU4lw um0@΍%/wsZa5H(r: 1^VƄ/ZY٠6*7b]륪|KQSI`WBs|/MrNFFcU޽{ˉ &&ݻ7rd'*z޽;111uڷS]v^qHP!?]כD!8 q[Vdg{+˅q aBNݎje~><CIVUŒF3rNWPx198؝, m/KAUsx8_uŸq6:e4bQ>O۷Fz:ai\ :ib2ͪ8i|WPs<Əτ 4 EQHNN&!! C1j(eĈujXRR½ދjˋe˖(¢Eyҵ~aVX?+G}kǸq;X|9#GbN($$$jjo6>,>(k׮eѢEXVl6Æ $<7nȦMj={;w.saժUwB4)B!B\{yaV*uw_KJ꽞@/??'`@6rkXg-ZPИ7BQ{ÃÇ{[^NHDCUZ-[i'BwaH$m2`eμ΢TRm6 ªfn).f̮]_5#j&p}Zo0eej%XM&FZz:Aۡ~̓11g}gUVpz rXv-~~~ٓ8V\Ɉ#NRR˖-O>aԨQ 8-Z0|}Y϶[歷:ZټK}Yfn2sLƌjgϞh֭&113e} >}'//7Ү]:S!JB!BKB́ 픳l : 0躎l. (,YF!Ώ m__uC_Mj4Rp~f&**XԦ fk^˃v 'fTڋ6)fUh0aQpf4e2QtVz:k޼9VTEױ Ç)r8t<'G7o:;cy?+b@tO7:Cu1dpT} }lٲ -[iZ|||:t(5O֎;dlT 9)Em|;vb47*DbᕶmYϜÇ[Vl0il<?˲{l,|||a!!A`RegPL LJ|AQx'3M*aɒ%,Y䄟utB\xx °c1LuKҐ]MU+L8B^}UfϞMDD<ӧO?gz HP!BqIg:iNwEEkxooM&2l6B .?a<Ѕzg?ڤ<K7Iو428\QwXn ueLloN\ЩSG4EQ;-7I64(w:PPIILh uxrDh(feQ TV}a!؜&?r` cxhhcVgr-'Mn;Hq85'@ǟSSuVp` soJKj+@Qp:>ƎRmT!,ԉ+ɶ)q3( qd5ߞ=PQ^^-[BxxCS}|x/>U3+3l6 N M&VT0y^&áZ* p:߿7* ui\\γ|NJaa!^{-}6l`ҥu][wؑ#Gr=_0l0v;SNS,Voӧ+_p 7zڷ z:3ydqV\w}Ǵi(((`/&11[!HB!Y7oشicƌaҤIZC;+Vpi~N[neْ BQXѳjr|URMbSQY)MU:pJNv5o 9Ö-wiwQVt=QQ@͆S׉2QU˰;XBy5i;kE=xSqch(&>JGU3.$VM6Ѽysx O}p"BS= !RSS&%%/Y &t:Oyb6vSyy9^^^vsnGUU4M; qnJi6: T,nNJBfR*+VH)-3M3?Cej%?g^u`Ô:DL `-[rzvAO;2!_IHNfsq1`x'tX <:~/ss1I.]COZ&y>ݻtEK% u4iO?tc#8yjZP!3a4MCQkՎСC5@|}}1bD^pbZblٲ6h"&OLpp0CNl1ZRRwމ/QQQ,\qqW{9UԤ$뇷7ݻwgӦM>3gqqqf"##)++$F#0~xwԯ_?>ڶmbѣ,F!D7ug13tU};%R$-yx kf59/w5zK'R"#y}{"3E38={=w0'""-F2??uȼ8Fl6JNB Iܱ{7Gi*o ESl.Ʈ25TkQrh0pyNNcuA믙?>֭cŊ 6B!xe B!'$**yycg/''Ûoi̞=aÆojnYn>,̟?o߾-ZΝ_χ~xʺ~+V3<Çiݺ7nwO<gfȑ$''{(S ~g}{;Ś5kl 6'x9sqF4Mz{aܹ̙3___j}\!gLX:TU99tSVFݎQUu5J+*-yt8vEtʋ˱Z ut fpxa<ՠe./~ <}>Yֱ#ǖb "L&[">R۷+ŝ(:hnaU;#"ijGYNi6V(b͚16, qn2kj0pYNNm~>~f3 ^f&wDD6jr:xݣ(Jwpaҥ$$$p8֭k֬!..A#;ye%BSVFiѢglۺukzSͻK/Kطo_5kV̙33f KѳgO~g}4MD̔)S|C2dָ4RRO 3G4NML. 0Ů 1Gm'su,uW􄵬(qiŇ:0A>ɡ"`(pEjӆ>>_v܉svD,hӆV>|RLBm,ﱱ\vL[Ӹ1$0*+ssټ9&6Rl((rd0glz4h6l8ZhArrr+d B\$A(Bg֭cȐ!xyyp8}lٲ -[iZ|||:t(5O֎;Qw2p8j$ 333Ox*YNN͛7ܟs⇨IUUMƴiHNN^cƌ3|[JC!ĥ WX/*z(Uyqq9EStm4y9/vN5E{5א1هs{umd c_Gwe3cOiiz~!1!sSry/obpWڱm(3nlm+myQ9{~þqn5OSD"mOK'$}vdzm뺜v-p':>[srSwt_bzGv.Rvt/ϡV+RS)t: 4l6>b1Fzz:11g@D!Kzzzc # B!<8p +Wk׮gϞ8N>sF @YYWfҤIuZsΘL&V^AO?D>}ܹsݻ>|zJ!8ޭaaa|.rZvoɦ75O ,-!:>~cy Km/m$\BQ?ͻ4';9uas+iyYKO{L쮤u$Ǔ h`f:!X BqM:w}ko;v, :;vdȑs=L:NXVnvO(DGG3o}+~!~מv{4ݥS^@xpv~Sa-VZ.[}m\^7:wԙY"}o:Gs iRhk;@sܳ-t mJ~mo._m՟";9Ý #`GwGKBd4j۶?zHو01Z\̨;Yк3qWzyAJ CK`-!4PXHIXU<22p:N bM.A0&,99\ l&Uр !Ĺ'[M$Bji&qxfiӦVk[e̙ҫW/֭[Wy{ ,f1uT6m9K:N\.י7SأGfΜɂ xǸ;N:Q! 8[,/?5#f^m׎vϏg8o͹MEuKv|l]EǵeGNαX֩?VhPBjS=_o4mzC:ZهЁOyR*+4 JNWTiXXHZe%Qf?ۛmDL h͛77lB!. B!¤INh뙐@BB?~|m5kƻ[++r]Ozrrr۾;; /8ڜ`81kxǛ7oͫq$ ˋb/Ww8dݶެ/MYQDpt\6ZG{cgUrڝ$~蹿4F l5dzLxͼ={Vu'AmVvw}mT(B;;9GxZ՚Ic7;ؑc}AhLѣApDF 5MUmG+)(kN'$!9>ʒBN.B!Ӊ8<uҥK1bcǎ5kB⦐(+"g慨y߲H<+^8J' `g5eOiw;e尿e?[Vm[_<H|xB]X=KLZjoݩ|:S~;6տ_kxiKJS= @&:5籭K%Axq3x;>{u2m6|UȦ"[\p-*r5ȵzS'hoMÁ6ھ`㈃s`Usrȳ׮[!h(*K!hb Ć N-Z"l]y2Bq?XǢƩgcfs<}vm>NQz ϟ OOb$]i{: c_rؼr3W.uaWj3 Zo4o7oKWٹ~';<~s5ܼƟdŤ$ۛdRm6"M&VTz_'`3/(.i&Uh,raR\N#GXXz7v[; dlM!%DB!D+P\|fyF!.Ni:DKS`D wnή HߛNyq9 aӚnV:&#ۿNYaQmؼrs$гZ铟HޖLi~)FP?㣉Ϋ[W˵k/Y㲖яr"4_m"i߯ _CTHAz /Fp[x8xp>UT0a"JK٬[ߟ.[K+Q+Xڡ7IMbS!dPga!GY#h'XK^$LٌZ%<-!$A(BTk.{ "ѩ8T[,>GJJB- ..` 1z=j H3;>¸= DB{GGKJ0[.)ai,HOӧ9c0Qj5?k h}/u:t@Q*={BeiEcb3 ,7t|5rr f3Ej*+uEQúnݘ H|@(HCOKcjd(ZShѰ=EE-vL!$A(B!hînS !-,'b7F;DRrDQ+ iF#*~Z- | DkvՊZͶ|Rkl2}{keI 7rm͆LV+j5s$cYԩfdSH1h(XIpg` iW;:2Ãuٸi4ӹ# Jx!h~ B!Bi\\UTDU0RZJkZ(/8N!h)!&`v 3!/"Qݨ]zԉgyVoBo9S^{:ӵ)o' & srΚ P+ 3ÃWNduv6f3~Z-:&捻>'Y lxoǜ,<5Nk~~/BT' B!B!D6Ãj[̓!!4([`Fਘ K!ZҖ]Xe6\)`4:]V l$gw;t^Μ!`OEղ)/)s&Ma RԊ²L (;zAz=w^JJxi)j5 V+GKKq|}y];.0)=ÃGGKK 0[,ȐB! B!B!D67]p ~Ԩ K!Z &Sbݻ֊r=z@jE0y!13:Z-!ލbG˜$\͒ -jSTDOWF( [OUz:)Z-A3W%/gڵ_F%QϏX8KrY!5B)`-B!h\4toUt1} |cXPa޽T3ϙb8/]^>ScGz tsG|<ӱZ/bTѪ pw'@lQb&0+"ŝ:Օ,,  tv0 {ĵ>>i4͸,:BHP!BhjWI)/10hя+.),=t0:uwGfwyegOpfeΖ- -Ņwɕ:ǡ 7!,삆NLHJNG'NS%I&T*{{Sn6WXb9Ǟ.]x!, '3 :j5?2>HN>clFUYuqFW!h$B!m^#Uo=^^Lh6cMREߟ'`ԩ\xmc}}p ΘݻķY*z!!E4ÇA()ZPݻW,_NN,ܙaLtRRxQLf8q^hORqp0kvjOO fR *:%f3:uOERQfѐTVB!DsB!B6+ؖb/Z W !'mwTiX| !@^6XN[fQ s.͛9f+(7o'ˬYv?8j|_<~=iOÃ+-%2%mXXy<B\B<<<8yHP!B!))5֭橋 OAy9]SW]^?-˖"1|C{//Nn:|{ s /%Kl%0իpdкu<ޯY7ofΖ-J_ef^׭)Sjlwʕ׫OLJvqy<<:V={H>L;N=(tNMkIM.-%ڛ:2G`с ?#<`Kgg֭6 O~>q7f ҆.]xlV9M]ڎ}\ߩS@ SL[GDȑMK㎕+kl;g<;`@,T<Q9_W͑xvYY%EΒ?zW## y=94VL>xҬJQחy'ObZqRXË&n {{T(LcNbyf&gF4u:rM&JN\^j??VncɓXV\j6qv?cQP^ &Ig DI !B!ڼ^^(@T_@Rh057$ Kr:?PwwسrVx-eXxxzDz䯿X2y27t9?neō7Qc>/'$ĜC_UoSZλ%ڒ xfF,Vkp;uف:2w;xk賎GPΜAR1C6 5#g7nd]B2rrjlY'9ɲƎ9#.1|CZQ..,ؿ77/zwkv2:* ]ycbj$λ%jEi)tVQf\C^GTVVKNG}GLv҂1֡#]YXZjeuvv% +o''3?-?`|OΜaSn.s""k/@gK32,mFm]I3<Ӭ"^qͅee7{y\ΝQvՒm2RR'ʘ^oE\>EZ,,bV5? f.bx8x>1EE8Txi4/-#GחkOǟˊ,J-<4N)/Of !h B!B ёSUsf..U 5G/GG5~11V{׬/22w/Z$,.j;2KJj0<䖕aXj$ hd|1q"Ӻwm_VVgv7vLp{|?BCIyee:sGip: (/;Bz:x{CDE9t:ubfB?`Zj)0<-SeeۡZEGh//^9yBW4ss߿Ew+t?))75`lp{{y;Q-)!Pb8#CB!$B!Օ-Ւm`wA=9 ddS9ku||mFDPj2Qn2ѿ]z?y {2sFoOkùgpeiM&WR<_=0Y,=vփtNVf3F9ɜ.(86eqqݺ!!D{{qj -ѣz fj*fYJQceFلÆEat4NTʍF|+K7Cot41&qqss\[u- pTy];FxyBb"S5jR 8v5'H>jE&??f%&bk^IT!B!Bcwrruk[upF믌_ @rAgm:W\%Kx(2ؗFk#F˳7СD{{3k`V9kײ|Җ-e _ls\z>NN]dH߾+6N13}{Z7qhxaӦ%A=-[pj//MًMI3vl!N]Zj[ۡNfEEdXN_ӧϸqt8K">}`N&-^{7-]>L\@z^AAjz5*>޽1|ݫW)kjUc7F'*>ohbل l8~/&>;Sabl4<@:p<<7p jlf$wsV=HO :9>:Z͍]4jK2yR6'%q$+˶Q\\cׯg1ox߈⏻z~{%n4Q PL.q!~%D'^^|ugVIOߧOi0YYrl&dGefh(,+&HY&hjV=z4J`=|E=VuQ iKۻ~/yiyč#VG=6RRՍZ}WPP 3B!J@b"mw.~<~zw8B4AEAؽݓ,ܙd[,t7y,!af6EQleFWԕ3Yڕͤ +gL{y1ʭVҍFB^FZQT?ž˖/-DaS"qOb},f %%)J!DA(B!9^Vf+2IDATUb`6QvK--"gXD• &mlt:'.3łVK R :Q'.8T2iF#rEİ"+'Orw?2=EEUV70Xxj4(Y*._.^.L]g;sN7ٵj9)9tQ ѶHP!B!*queC>DVෂ]`9tCñΚe0"G ɁwT58ռE&'f0բjٚԃ$&NNU4>nnu99vII pw'YEٌVK#')4X ՘V<5%bq1jumחZ_p ez}O, K(wwVw^ҏc2pu e 1;>;GugH=QG]q5I{/kW}yX:̦7}v6|ûr?o3H~bLB!:dg!!$$z}E}لJQʛQQ8՜,qbWAd( gdڹNǻQQ|Mi|Zb!hd5^a_Gu}~5v`FzugOgL ̑G:hme;wɑm=>kESkմ'CiH+FD&PZ8W*}ϋW#y)I !B!D5\\Xk[jRd2;X,;;&shC|ZLKd4Rh2 -lpl ^l˫º'RZZ;ѪtٝciXVrzEY>>%pkueT t?),Dk'7 !B!D5<=ZО̟ϭ˖uٛ7-KC3yy-v<9sĉf`{0w.o Xqmu-Ҙݜ݋2g&o,cM_ޤ}jN ps$GRrDOb \j4fgsäKIKXooP̨f69:56`Ÿ guVDz?8ſ,~ah|ߏHڛĩOa6/h\!DːGB!(@gw+&+Ӣ+5<ȓZm˗gJ / DGR 683.ƵƼڼ()ggHJ wTM(<J^󉉤hjQPԃ$&NNU4՞*3)/ɭph[r/>;>sm݉}:[m]hPjgR$qtQrX:cuO`cE\ᭇطa6%vAc !$B!ZVQ0X(1PZj-͍}f8ktc% 'G7:F~*{>ҏc(3ጻ;Q4s|OrRr8rj>q'hu$A(B!xj43;wRXH{OO4v;v~);ر8U&9fo̧E̙-C͐0_99SU1,\ m MHd^Lԉ9CSዉǙB댯TK^w-س[UR˜(v̔#G )/w)SXv0+ٙg z*>7ogz:'8wnj!ʫrQϷ_.!cc}1/o)ߟC9)~RSq鸹kW^jzۺRt?[u,錕+1UE4łm>C'͍^AA};X*[e}B.$Guwx#,]^C32y3>MAy9:QQT:z$^FDͤI$pϚ5KKWP_Ot$ !> TK^yzcG9zeekt$3ގbd? ͯyyeFjSkR)nt\ɽs8#6:vJbyG]R(F=0 !Oz !B!D-:]<ŏO?qs׮Fk-˖رkx}H:64XUΣ$1S' :sڵ<ѯ^=R^^Y/ º[nṁY?OcǶZ_N?uq2?_}Ey=*(/g…8i,<qqu 'ׯD z$wZňHMB{OOkܰpOʰpYm_?ΝY:y2_]{-j_|AqэUݰv:F1+7Ę<Ɉ bԩ>o=z~/̈c-^ݶI4'Xr SgDd$..|_0"<=J),G@Nodhx8.dgJJ yl4'NdGr2Yô˹+Xx~t899 \H{Gլ\]S'8;n4bZ 7QNK==qVflVX!h)2P!B!jrtdoq1eՊl>̶ aXxeVݛÆ0**S޲1:ض)-e߽[9sj :zf3G()A\t:v耣VЈ<ȳخ`koH.t~mVg'ڶ߮Z֮ѣQSpc:swM zw|ݛ/hdM7T\׭G\=k0Ы ㎸8ngf7woHNTܣyy|wPmGGEpVdzP>m ""Y Wޫ1ף^9QV{IILޝ jߞ/Ntwpex~ ]\xcvv̫W_ T\ޟ|BJ kZl47^U*u΂mbe1jkhdlp}mWh05IM_w's}e)^ Z-&%&f0034iՕi4XVpBqB!B͍ﲲlV`S^[xq}ll;u5k0[,+BCmA11ܿv-ӹsuδݛjeC\m6S'oⳲjujmAX__bFUUpüu+G(V5:u m0Pwwv/4F B[ucT8r_q~>q=iikĈz3}5]ӡC BVӳF,17~_O$ض>!'cק1ףʘj%-}/1ٞg&`Xl뇄c09әٷoqЁ]gΜw|U{M42=.y۶3%|0y  ڼU3M,rj$ J bVTˌZw/T|n0@.t|ٱ#3guV&?\0RHacZYfEfBqB!B2ӳκ- L-*3BVI 3_'T-Uђ~;}DEWV[mPcߪٗe/>K{w$'mjK-*wf]+SUuv=gOJF&/]ʛ۷tx׳OFqq ]Wba·ȑ{xh {}s=4vvi}ڷR,V+3Vdʕu=]P@VI װ)rMs-W3ڷbcqklwГ?Ģxi^kܪ/^Gjii^^PRNNP9rAj|2Th2 -,p[q՞̭,3Vn4)/+pB!.7[B!B `no &+t>JU#YRRcߪf5puV+Ax. jeFddu@3êU9ٙ䂂_ϪuroϞ=vz~ujص%p #-ӧ3(, lK6VcG6o(^Lp<P)92f0m4sKKcSicČ8ٸ))ur{ -?rQdM?R(r9ӪTV[ɤ i|>uqp Wf4;[B!.[R@!B!jQ8T&&hJlb)Bpqa5wWʋB̻ jUk)h6~{Ys03HUWj2Unogݧwp0]eJA;qokZݔΝ)1b..565Tj4ֈt~>;;KF|<( TݺA)ӨR qPI5qPjQPԃ9vcleՊs2B!Hf !B!D=4J rFϛZ⹁ydz<Юf]BBYK^_ @Ja!O33TB}cJ?0agKRiEE۳ghWoA5ja[ʌ8fKExf x?lⳳoG EV#9n,̾}4>wZŔΝxO1vct!Ņ ")/W Ze&ϥ1bz`Vڎqh8x^=nz=m˗Ј=p35f !Ņ׭A8;wuMs빡S'ڷ=nkhXDY7z1զy%^<+gnIJbW_q4W?}i^ڲӋ/6q`Q\c"Sjy1 tt))Cot4Z{/6jOOǮ+r0#9[0} N-^Kb"ٵ iۀVXϪxNdjb_z:_c;KNW,.tr ёo;uޣG-?/LI3ڤRŢ\+jh&)3*2$ B!B!zjEE_>!!4tñ+³7VTN5Ѽu򥍡( )ܽz5eeA<=`@3D68h4IK={(,/'ӓǍ㦮]Z Yß))Lܙۻww8|HH(/Z^Z-*Vt|ٱ#3guV&?\0N%݀쭝q..^PFjeCNNNZ\dfB4\d ô B!Bz;:wnEhup([`F{# ڲk&rv! B!B!hNG~im9SBQ?'M&QJ*EPzOL$h$@WeGAS䓘:89;6]\^YfRYf5&/뛡BL[UB!B4 LXi)Rקj%yBfTdmR_ PVz=]~~j3VdGr2F#Okex xmc3-3_?nԩE{.7ofBL W~46K[))?SR(11Z=i~j|"0qqLD$ B!B!h@w~˳-[EEĺs_EQZdgXBqZR+) &23S0ӓs('j H./gڑ#fJXӓyNQ\-:V\l֭W; mƄ|^Ysla@vL g8jm{^WX>u*z=^<ҧsli{pUЩ 'MBVa,]a-vse !nn5_#M_̀v=={b49SXȪGanڕEJw&B!B4`;o$'X!7Q BJE=LB >ڰRkVhMEpph/gq|۩ws?`4eNx8Y#]W+\ † i~<~&@b7!!>ncukhv6CCѾmݭݺƍȠ_T~>]=z #ڷ'͍6mbLTTzMk䣏R{ak8v¨} sWX$ B!B!hzfmlbPZM`+zC!jSWr^V8xf ptNQ~K!@%dD f$E5ۛ? X8* [(4p\oN_/@3/&Ndz\\Ue/0o6 ˹gO5bٍ(.fRl,5ٜs_tܵ+]}mS<~=ڽ[.͟fB!Bq8h#h|I}B&7N7AE|u:ؑǏ:+ ZVK[d̍@w!3=E ,3ZbVe2- Ad\PG\@GܔDfI tٸd^9"^.~~̬Lm=y ps׮0h)g `B{;7$ j>܂eGDF2o6f3 }G) B!Bph2lgM۱w^VX/J uEjhKdbAz:YF#oGEv`D88ŸtXMlNN䗕5\lfԩ8iЁeG]H|\]ؘȊ#Gl g7ndT|yqe24v_q8ZTDZ8_ٺX__p0C slrt`IlC,]?DzA[kHx8'ţ}2^rr8xWU3׷I)G[NU#G]ݤkNS`XƬjEsj4f\@m&je`Xss|Ϟ: g .]ur'Gr2l!ӳh3xyw VgZ-Z&:BNi)h D+K!B!"9Ւݻ9s`X\j@RrDOb \j>FmƨQ.]xs(\FU%Qk'"C+%ۙe `x?ٜTg[j<W3sgڷBCm-[JJAZN]sB!Bq|G4>}: `ʕرcIwaa!w۷ё;o`͛7( 6mbԨQ899Ǿ}gԩұcG6o\#fΜIpp0z+[6V;w.z8q"%%%̟?3fjQӧ׸N .$::N>b1 !A~~|Fqbo3z BNGٌ^Q0Z,l˳wX :U%1Xpu<NFbEYW%յN ܲ:cg@ёCU_@o''RH0k;zI32wU׺%N؟Nre¸II\j[h05˭#GkW8ᑑ bϼqqOHT~>:-<{'"0P&B!Bŕ,O=_^~e͛ǧ~ݻym_/..Fo~zx^~ez:cs=7e˖V2e 3f̠K.|1e+{*ZVz[̙êUh߾=F:gNQfϞݤs/yx'駟x`00n8ymyl+0w\V^g-hFU+n' bc spj%P#`#G~& 2F*~ީ995ιjk%[NGrrTçCWjaa<ݿ?d7VZX_^|w ]lL k-xn.=ްpfgUJ deg;F̴v{Ȍ=Ѿ=sS'g=zQxi˖:_{{KKg[F|lZTkf`hC{ZlwXDܲlf3S:w>8}#%{{j˓B!B^gݞzb<'';wZtrr2< JE@@.P߿?|̜9Xw}7?m۱c2rH[-44N:o1l06nٹs'*`9r$ݻw7n0nZJմOwȑ#ln۷O>hja۶mHC!/)f` suN+>ij;QQlvm>KMPYf4\%^cz~V9Bx7yvՌX+pmǎ8j4ee|< oaZnD{{Sd0m[\hJMej. HϏ?fwqGMxo3\u:۰rZq#>>op.̟~sw'Nqep0vݻ0=d@(w^Rmkcb㏼};}}l zO`|r?| I$*ݻү2s%M%)̒vU\v0*EwPaR ّbLa!YLޝՒB4$B!,t:@縏ȱmAXL&Grq?}~@Æ }^lR&Rug*߈ظq#a4!Cؽ{Y6qqq|g̞=sWT{l"##%9(Dk`?h4JȢN;>? j jI3y1^dü,usSdK!``K^% +=9W /&Nl 0~6Y7sh5,V+}}ykN1$<qqؑ%ZuX}M0U;46~; nHVI h׎I GM??HD-aR>?~_|A+I>ڨkX=xY2Bǀׯ17b'xcȳngV+3=swg޶mw }: l۶ͶfĈ$&&Β%K:u*O>$W_}5,[W_}V^k :cǎ@RRO\}նEO>ᮻO?70jrPz?Gc=SO=`Ch4k >}:ǎ~kxh˚&7zbƠSE/Y$IM&;z_rshpTH7ѩT@{xYz1fdדb0͍f@iiLwvfO;s:?w̳e=E~w%1/̙-Rb>ڹmibemx?H~1ԗ4ٯbjYQPP =B!\YO9_l˗/gС_bȑmΗܹǪUթT*qILL;駟fܷ3 -9˟Fç11&db_l2+)wNdfC=ܓ'HY ElYb|{զ2fwg&4븗*ҥSW{5e\x1y{#9IB!B!8vQ4ZfjEcذaf8rHy駉!77?h4⋼⋍>=܃7}Օ5k֐ʾ3U=} /tBfdKJNRz|dK%d3g(4Nf4 o+]]٘Fjecn.SZW]լcfRUyV@x󯽖^k0h4 A!B!Ρse+q}q}/s뭷O?,c+Š+yW9r$> +vRa^6bR5?BQ !G5l!B!\lfXFd$3k+$$INNn⼝={`<,PץĨXV>KMeɓVZJ,fh4RHB%2|>i2Eǎ[LҘ'[Bq._ŔjpڼA(B!2ãκvA(Fb"*EQ+(oN"hIK\9Bh0/yttrlFRaZٜkﰄB" B!B!8Gꏨc G!KZSxC\j U*|Z~C8S^n/i0 6u*?blbm!5B!B4Z]c9`S$BagU'11t1* ~Z-{!N.d;:EbU&hdwaB!LB!B^Zm,)&h ?+fD5<΂;GxiR) <=1Z(FQXjwh2} |yy3!oyޜ2g 99 s|(s>_yfwKbyd̙{mޱǫ$P'l7^9s0Uw/o}bB!B4BDU]T1"mJ};voLA,%ٙ4JNGjy93asnC$ @(*ˌ&_RbﰄJF>߳zug `w[yiP ظYbim$B!9;YCf_!?x wtdal,=]]01V& sL&9z5YY OB'2-KQއ֌f3f=O=[naDdYoH˜ֽ;kn9C0o663COqqhB!B\ Y[A<=Bɓ;tl?xYdz-?o@4G(4a^2jyx$#EQPsrZڼOX__ʨ:|_ĉDV=(17'Odpud$KH=CU|g)x9:rep0Z/͛X| ΚŐ{z\I>7A(B!SP{PEE/ "뮻8qbcΜ9 0jO7۷\ݻ9sϣRɳ 4FG,lӑm4ʩS<fqQ)2qUI3ؚT??{$#۷gd@EIK}lۮ`I@G:?gbǎcn W^AAD.㹶;Ϝad׻m :5^T]s }+x2ܰt)k̜¿G`TT33yX>uYaΊxV9BWJJ|=b|[tLAGquw9l16+1cU*u΂yv@ >̻c4 7]+gy={((/gՍ7[YlmzW vu*ڗ_>g 2Pe_cB!BqV{=hc4hDR ׷YjZw(B\Uu:?x rPy;* WXL&ZrM&INdbvx8yᬼZSn. V`cn% *?! lԵ:ؖ;ӓg0cG6&&2** G6+Ņ>>>sa\@[͛,Y9{w8k5HHNhk9ǯӪմ$)7P`uvjЩ Cg`cǜǼmؙB`?|s$l/Թ,JM_h-90>&Flv}9 rumXB\'B!B4w~89͘ X,[o}1j(\\\o'Z\f̘A@@DFFOcѢE@@@7teѦO΀Xp!888p:%Fʄڵ+zݻHJJ"#F(\j}%FO #W{j0`ѣ۷o s%22^O`` 'N3c Z-0}^?!. II+Ugd$Sfm4RyZ?NP>PՊZ| /OmIYtp@]+iLZQPQbt޽h_~tN{;z`С,:p^|BЛo~k<j,*ީ}ՓQNN7|}W]k-7~89՛L5^cnjh(_Wq]lm6hKI),ĿTc]峉 8燮0lP7q+ĥFf !B!D#t$ٖ#^uz-^z%믿tm=8p -vm^3g}v}]ILLd29wy'wqͣ+V`0W +ܹsqqq,gnf{1BBB7ocƌĉl2&MĻK޽mזիK,!55zz<̙3믿ש6EQ5kg>}_kΝ;1 7sm6juM~B\Rd_}%L(<ۮj5:} _$#B:tYf@7h;* .*&3ޡ5#Gxo_ǶdSf6 R#IY\L@@^Lԉs Oǯǯ<>ٽX[)S{Ȭ ,)9k1,.&Z9jh(-UƎ9#.g6ndf~lJJb-.baSb"ڵkpNXYRc\HQ/GG79ZTwIZ!.% B!BFrtdkAU" g2x7xyg>|8afKDFFj*[ʨ(z͞={ѣ;w`ʔ) <ضb[o>4iRm6bC=}@ >GGҷox7ppp`ڵ8VM7ċ/Hj孞ynFTi^?X3>j}wȑ#mp 7>o_˧O>uz)6 qI9xfnH˂(<Fì$ҍFZT k)10:Z3EpGG::9WʦK*AXj4֘Au:?\Zc;clCͥwPYu(ўGR9ÃW翻ws8+ˮ UGr{\myѣ5jVuHNQf);ΝyxzXAKmRXȽz5M@8@VI >?VNVS^ )1rE` ?;V횣GϚR! B!B!hn..^co7O>MFF&Lt5͛7mܸ{j+;=z .._FèQN|| %%Σ[\\}gf\q~J)OKF^:%/Sjhlc|ڱ#gݖBV+zrskDz8? 0kz&:m@~y9NZ-ظL`~^{"Ņ3|7wzM^}CBpXs(yee >K㎕+95f5<\ٙ¶;}Ε+r$ ?1}dz7Qqs㕭[5)}znԉ㩫3ð>hPf&&:రSO#9LR^Kbѣw>Ǐ_}t҅u @``YktŜRSSSEjjj *+ZVks;;w.-W^Q6 qɐ>>|Fղ[T | @RQjVi4a5c+WO?h߾Όrϸqu+7=..&[ٙwI;ww\Q_6R:4 UP6'%q_-'OtdTQWjlbmӯכ#Gr,'/'bV+QLܙ'WfrN ,Z)2h3(~`ҥ,=tR&/]K9Ycy۶`oڄVixyذӱ1L^OZ/V˘o'pNؑeSwF7,]˖SZOvש A(B!5ޔ:Ԅ>(  ֛)T>{aΜ9L4'O]]jj*]ti0S̬Q 533F ˌF#999LfJ??NRR| O?4?J?qYO?x11s(g u:ZsC|ޱ#Uef] I.+Wh9/q^AAtXC}wmwp0:fvu!vȵRR[\dB!B4Z=eYTJyV3 lذvÆ СCիGPJpW0w\HJJ"&&@ Jsrrݻ7~F{fݺu5f._JXyW@MKJZ_wwTEQH(-C{ ͎T(OOV+Q`7!W|VK}%8dB!B4ZMl[4/xLFc= /qqq|uf͞=޽{su1m4<<<8uk׮e2`&MD.]X,;ѹsgT*?1c:I&Q^^ʕ+ywq=7P͛3wT>1;_58;;ӵk:c̜9?qcSO=Ŕ)Sj<__|_|s=x{{ӷo_\]]Yf yyy <cgذa.媠N(/*ۄn..|Gp@r9ΐ!|hRYGJJփM5k3%);s{GqHP!B!M 3e'|,^{5T*wuݺuc…mbbbؾ};?6#k~8@NXv-ѨRy8p $%%# 7s 77믿~^1f64WP~1tؑKҧOz3˴iӘ?~+D\0"}/'h:89S'gQZ-A:wNT#f/B /<-yy 4T*-<}CB؁Xqssw,B!BعŨ (V*.$$INNq3c F#<{*ĥ߯6l?]1}*"`QPV^QH3qRy-2IUv{1gdדR^U|~%00}Zӝ-~Az !.wǏZ]yYDG7qQt|0OOFJ-ZJf8~&/==Q) &}EEd K!h<)B!Me c0u%:U3QpsEʋA ȱckdLJJ"dᐐ:sے8T͸դl/(`E9~JjaE9B"yՑB!B4A'':v2ә.jV< J؁ZѸ8V|ZrF}4f3υjIBo8~]j5/Zqnc !ąXk8џ$B! zY%mPTaa\(wTNt*n7OSSLxiL|x % s#"P7xz-?Պ^bS^&:u*tؑ͛7׈3g^+d֭-vs%22^O`` 'N3c Z-0}i…DGGӧ[,F!I !B!DTpƠ7{۷s7r]wz -_{キIsRcBT2Qpw T*hQVn7u耋ZMje[aCNwSJpiiC=<VJŦ<Ւk/̼yOٽ{7>hZx ֯_8=}`gL ku/2O</^#,,R ʕ+INNgu훚ʔ)S:t(Ph~~>cƌϏF1c FE~\cNU6_wбcGk|Rc"5?/BXXٗH hЀZR< B-ggs׶mdZ^%bnh鼠nڕfq׶zmbgeΝU0`d[vA.]JIHHfaٰׯl6&NXsMHH`…$&&~JeR$&&FA)A("""""RK=l{gyHNN&993w1Czz:.}cذa5.9vX>SLg}``H0eJKKO*ߪ/ W^᭷O?wTFѣ;w.^^^x㍔vG C "5tEPAՊ@ʜmK8Ih6DÁ`KPPP录ϸ6lf„ 2Vm'>v{bTz7wu'Oft҅FF6lذ\EDDDDDA'F~A_gEУG7}t/ƿlY.]a1|̙3Unk4k֌iӦ/ƶlْYfrGꫯٓ&Mвe3˄ [ K.Y>}r'N'l ~~eNvwTr<0)54š\F0+. KM@>:rӉ|[X,͛G+%ppp0111|U^??NZZO= >iY0/Uϰڭ>,]*N\\t_T)СCYvmC 9\[lq;!44 +8>>v'p0VA9kG'V+ ¡jV] . hnd"n'9'aHQQQd? @zz:!!!tҥW͔)S&%%=)YHK""""""gkP*رc$%%U)ӵyȠAUVʅQiۙl(IRi{hhhMNRˑ%CNNYP B9IKK1 [,lm8x &gzxח|dE 0`/f,Zo:{РAߟ[ol2͛O?ʹiNl矯>1|~q۷/?:k׮%--KDbYRWVal' BVG.m}} >۶V\Ll-(Δh0L@`qL:`)^c68qbw}УGOYjl]\JJ`. FhQ%$BpWQDzxZXȝ))OK$IחPLLU99nM""""""g!˫spFrr2M6f<3FZpϬY9r$&Lছnntҳ7}tF{1b;w& sՄJԃ TP\+>7΢"Fݹh_PLl%""R8srr6K;r핶}ն-׆Łhܸ1튊{^pw8"r ~^}̘AZDEɠR3&%m[, 2JKiŬ8;s6Qڱ| tDYoB?.,ZA("""""r6Wٶ \8;MҥK7oÆ #;;qƹ;4dԛf^^|O[__[8N"=<[\6;s+0__|չKDDD BqOmɩvl6[_vΏٳ1b~;EEE,Z:?ԓY3wG$(//>VN'<L>ѣGW{ĸqZ7nȗ_~ĉ1-LDQDDDDDh2B_P""gn/?h"TAq w/5 9QnjyU+ vwҧ 7om۶tܙ47oUW]@fHKK?_W֮]7t?t-[pabccCϞ=L챈LU+eQpaPhΝ=z!؀ pNlNyW^7O>$~![l!))Ҙ۷ӧOf3g7dŊy睮1Ǐ'993f2qDVw}oΝ;3o<`X(>)55)S0yd,X@7nsӓ!COdd$s`ƌ$''3o޼j8td2g1e>c*cGѣ;w.^^^x㍕b` 11cN{/Oxb^{5(--eذa<3\d}Y׾~"" B]eyx!pm_f[cޱ/Y_wtrKÆzbNOh$Bږ^o6iӦ#O0p@?OLL wlٲ%]v_~cǎ]zo}w8gԨQ̜9ӵntLV\Illc<@^b̙p'?GaڵU^,s֯_O-8r!!!Un'3Ԣiu1GDDx(KX9r6Jffh4㏓ʞ={뮻xꩧX`""""""T_+s'xz=!&ƽ񈜁hdJL wEDPpkf`pW` >&v;&v;k˱4iBÆ ?k[ii)~mq `֭tҥWV :uɓ)..&--X"##,1gffO?ѵkW~%gV׮]o*7oN.]Yg+::)SLJJ Ps9896ػZPE"`2xys,ogdX8n:<ujI+oo~-( ltsn.Wf3=>,$$$oTFtڕ믿ѣGľ}\ݻ77pڵpꫯҰaCڶmh_dܸqxxxp 7PRRW_}Ō3u쯽f&M0uT|}}뮻 00?|}}˪1~x2l0{1222x'iӦ] f3'NUz聿?_5c_g}αV_c_rv7E""r22! ƍH ƍ)r8ȲXڿJ>2 sގO裏/swЦMƎ[iLll,@YaÆ1uT"##]e={ɻ_ŋ`ر|G^#FpSZZZW[~!3gdȑpBWh4on:ë#""KRZZȑ#y駹[9sYt2ݎ‡jgϞ,[1c0|p/_Μ9s޽;;wf„ L>ݻX'gNNEDDDDD|jҊ1 dX>KDfVڶ} <N lՕ8N^ٿW0XȴZO6iÍ_P+ df2f6BflʎI#lnhgH BsSe۶B7D""RKe PP[= ֬FFRpgf6cw8=9rĭLth0t:YGJv$!Zھ|},j)ь Dbp0an=. z>""r(A("""""r=|TW~'Nʌ3ڵ+l6z9^]7oaaa{iƍL4gyc=k3QPDDDDDLPV4nwc4""gte+βmM7&b4J؝N= f3I‡w֭נy[@^F#E&6P/۾};=Pԅڮooo:vX}.s-Պhd2yH- """"""\%*%",8zPPo&ӓϹrc2n8L&ܳg#G$((???FAzzzOXXۗWc0x׸fС@3???5jČ35js9U_޽{CǎINN9ɓӓH: IJJrł``ر@=ݻ71[ˋ["Ǧ9 :S+rDD.D_%hՖ-&$$a#,o?/Wbu:1 c?<$''Ldd;v}!==w}>}1lذ;v,~)SL>`00`9Riܔ)S(--O>gv/̛7W^yzO?e˖(QF1zhΝ7x#`0XOxxy'Xx1aaa2l0Wsʕ$''W:TLɓY` VcQQsbpOdZ?("']"2xU+7Ǐb6Ãܗ^O>+aw:5ؘOVBjѢ111ѣM>ŋK.0|FqW ̙ȑ#0`͚5cڴiˮ-[d֬Yѣ|ٓ&Mвe3˄ [ K.Y>}rT>k׮eРA<m'@1t333Yr%:Hmi9 \Zn([5qqHmM&hՊ4FIl6IMe]=?>&F#yv;5tR76 Fxx8qqqUʄVgLJD___ڵk+2diڲek 5Nx^y啮8pl6&NXOHHH`…$&&~z.䠈ZA("""""r"NJD7oNy*O&"rN> `D?7ccSj*gejipSSGs'^^l/,yy@JK;v$ֱc3A  lذi:Q4$$P=zX\=߿qں뮻fҤIDDDcOq3]9jYe[Nv6y}"r1(Lպ5<;0UnTދ_PއpkAP֗llڴ^W[tM&NNU'22,l6[$Ç@<чTN$ώ;F رcg|2<<㤥;SOOH]QPDDDDDEWӻeS5("r(),,D.If3r׶m=IXRmx?.v$[؜N|FrT)8 С˵ѥKv;_}7x#,\{Vs]vexxxpBWǏzjw^·hL›oIJJ Çw^,))RD|Os[e׌'ޘpCzw!rA0_l,w*'mxTs5 __V+Zzm|\yO}NcۛNۓ.**иqc4EQQ111s= GDNA?.,ZA("""""RL;KV\B,fߟ#V+{mx0&JJ_'6mK.e޼y 6lƍDD.*J>t*E(""r `V\8T!I))a~&>F#Ev;?_ eFOnc٪g|}}={6#FoESl_QwxT#$n !:!ڽ]YRn?HAV}~ LD{qq޶-[,Dxx1۶A|;f3N`un.#ϢO4p@/_^k͚5#--N׫W/֭[Ws)A("""""rna\6.W/UeBPx- uCtQ_̺H)cQZT7#lerҢR>ysRI\bO>^J""IR\RRZP@l+,d̶m|OcOs>N@ti4cNi[oE^^_k"""C Bspe||HmFV=ѽGv{><=˱<2N ;2{r鸂v5;ny]oMw%3!xx{0c\A.ڥt.">==y?.;SRH),$ÃHR 4:DŽX7,F#%N'F#GJK^XHXw ""gA Bs~l,_;FC) ěV~J+/;/qDŽ㜬 '|L~f>Qa~2gFOڷ&mв[]+-*=oIasˋ3%텅DxxnkAcm8"!IϏ@|`,Θ **꬏+"R222D Bs`2x)&?ڦT,&^1li;G>]il4VC͹b6 4%o/aXK4iۄATkt==ʪ٫HۘF<,cI@ *z~trqF~W s o`'\AO_Oz.Wi՘17?`φ=lON랭+`wݦj?ٗ/}ɦo^uXKtܡV""RSͼH*_Iܨ$a|< =F#=Xk ssq8c""""""(OZIgtO,~k12lYmqwЬ}3v={nf=2 oKtĮO\Jl%۲}[{nnxJI>yWb ඃlQغ|C:VتG+[sxaR~Luֵ:+Řu0, $*fxܟ, s $}g=:J3vd#_Ҹy6;I%9&;#ҢR: PsooޏgTJ {ʓ -~gܶmGY& /`8N ~ɡh26 C ~n]8 mK \&Rjgߖ}GӎO|xY,׏۲/Zleދd1Mb6 eI%ƱY̛:ϕl}yk:_әcnҲ[jP yd!|7ˣ8-KTZ:8"[Ew{IY*ڲ{K]ŬY;6'd6˵4ЌC:9Yr3n8c`ZߟJ Jf#Ci±}J6Ԝ7tp?rh!.yȕlޱ9=oh h.n\DDV ooދctJ iD]W$'b4(r85ȲNUƮ[.NEDD "09eOb7t̯UsC<Ջnӷ\ָqDŗU:Q4cG9sؽa7"\Lze}}˿+<]vQUO7=wf3{ > ͋7W ??ݮ,}g)+URPRiOOq>bJV*]ZS/o?e8 ǩ9O_Oe[tiAQ^R0?wڑof|o6.xz'8* 0R5=sLJ8Foƾb$9/mcV\ j$!Ã#XN~ͭ6A(""r #s۶%29Oa-dlϠ(4c׶,–%[ޣފ̃jzChP8T8?z267mהJ|Ewt˾N_ìGgUY)"Rn\,-b0f*'{m#V 8N 6SlO""""""""u(O=j*("~=z kC٬j-=oIHv @zqWVٿU4q݁mle@ SNH㌝JmU'z6 .xVY /BQ}*NWݢB#MÉ{RL1 8NLW; t:X<-tѕ#L1#uOs.""u2n6ÃP99<};oc2y"&aY""""""6!tٕ0K,n#b 8˶o pRm6&|=>qlO $Isk6 B>s:_әcSU{ڋ-KPU@IA ]zޛL=ȊVFwug}sMQn?_MFX<-4mTScњԟR[`?3<Ɏ;hճ#X+i`?]%HJQOw.""u)ߟqq۶ HYY;zocb0%]}pYBuyy:5Z(""r&Cԙ@r x6d5+(tVId0Jl:K(!@NNVۊH|;vP`agp@F<Ӭi?p7ohh0kevt?g ""\q$,xe>YŁm9CƴR=[tm䠈WyE FZLy ڿy}[jPpi0`u8ؐwKJ%!?3_Rk\59"64wFłfcL߸q z29/{o""rRPDDDDDD. mZbhQ0{ nL랭ySOAN42V-[Lݷ_;#"ݯ?9\!s\: @H fmbpj年4|L&n Ogg""rػw wG(t8x6af3Vڵ o!!&b!j%l&dC^+AMnI.h\ lw!'(A("""""""""r jڔw`0npj屝;6ߠkhG@_;`yy}R/xxDNPPDDDDDDDDD<1 Ljޜ"DX,Zyxf#05?ti4d0xx2 n8y顗(*qwRيG&11\JFA#L{ogc^klg[@C*7ED"H=p:@PeGD䔢ld;d/6;SR%?p"=mN͆$l`iv6N"dl\^c?4#{_4{={ GG Bz{zrGD䔶l6[-qHOO}VvAb ȷiIF&\L=Ѵۦk[oa6 uCd"HSPDDDDD?O4mܔ;^^ i5={ؕ[\Á{6&oBܒ$Xywoz5m}xhBB}|MB}|hϳ?W2Ǐg,4kojoKry,(iuz:ct֮wo=kvOXw/ϰa/Ǵ5΍{r(?\x2+.%%|q( 1yxpS@mx@ZuoԃuI.r6/1]b~Q_=mr~Cw?4݀ve_E<LτвkKBhۿ-{7eM31utUDL q3+xkW&(+5eK撸|yafQqN|-a5c40 ՚?u#ݻ پ}h@U3ys}ծGJ$˂T?$>gM//=۵_nI W`2&c㏮D۬/O>l4ҭqcF]vu邱|˗Ӡo-;AHOt$ifnJ[gRӸVv@j/SS] /'ߟGb2T~yȅ'6jğ"#٘ςvͦ3O!!`?nJiҶIw @^4mlq|cF8slzz\_@ iؼa i"R_,""""""Mzn.1>ڴᗌ k[&M\Aᱱl>|ݡiVWEyY͊DOl;ڶ<->fK_x+p># \A[TZZp}fˑ#\բ{}Q۳'+.?w͵t y""dCFPVsx֕5QӸzDEaa:˭mۺ'yȅ`0ߟѬܙ/۵-Z;,'&5ex{W*CZMh9?0""""""r0B>1Sỉp <Um+ؓЏ?ʘ>z}}ٟMs)( ?0FTv3`^j'ڷgTk/l>dTXy\XV;쫲ݷ/!QUÿ-д]SR~LβĞh Wj϶eeD/X?&r}hϋ=˪#$ N`юEb ZRZ\ʮuMɋyEܔW(֭tt ]IxL?q" X\gViLH^GRu]s'vzDEm6s8?+cb=njۙ js@l=v.2.`vϵmDzmN޿VqTh>7hMKDDD.,zdVw`ĄUDŽU_~7.+E< CFV;K^Zib⺧˯=S]Iۘƶp:n`ž}\Ca$ۗ O8t;9d" ,#cdJ{:b:Ű6#k4kߌ^"ekdofwF>D4VD.NJ\֍b7֮奕+i̇_-[V7ys:FDp_WR6m*̫t<\_e`7bW$% v̟_|AtP ͟Nk}ǫkzx&,ރٓ۱6o&&پ=sPロg~ϧfi` Wl*zy&$?gƠ-נAn /hCrWskMXǎ%Ks<ՍI2HJ:zN:iX3˸j4`t\TyE\Gjt,9 3''2(""""""r"##s&oZ=eP7T/{[~lG1ӧc4 äIxNLԿŵg37%Nb?&%EDDDDD.;w^`ԩc<î X,L6EC /\wÆ cܹL&nfƍGv/h֬7|3%%%@YoO>I&1|ZhϘ3 $&&\{=^~ex /^kFXX 6gy+W̳>755)S0yd,X@ jul?S%r wↈjp0e ڳg)2I@@͙]\̤k@ϰaLyٓͼ[n! ݙ|yw/p7[nCx87ϙËᴚ|y#5Ά  z7mzqcHny' ӓ}sVHMĨ"33kҤIә0aHDD3fzz"''w}WOqLZ \v- pm9rq-޽;fs_]333Yr%$""R:FF;n.r]\\I:ڄۏW&\U `TLX_]Æu~}99}*mx|13~;z=vRb+Ã-]ʵgM̔l |}Jl6^j\joRV+/ HtPfn.Wlܛo>cWӵqcYws_W\A@={N뉤_YoiR} ǽ{k<BxcP<Hlh(cb\s(VҔGӓvMֵd= ǧJ5lȌ5k;UVc`L}Wv0/eUΝ3!"µtҧY3vee/TINݛ[۵ LJ.Út4k1 yͧxjf ٌ͛ݡCm p?z;\zj$BDDDDDDܦRp ==tR}L!::)SLJJ {RDU9zDES@ hJv0/BtFip}n#GdKM}OP~>+wº!.R妶m)\0 mMX-4`my-ݳQQD']l&=X%GE ).f_dnO*^k#kyTFGc8X=XSM^\3f9y2^`/33++$rj}XmKTllFwP'󟊳^gKV\$ c=Ӊ㭷ޢN4hgwu?VyWxQ\ۢH=~tI+V5((-eEtw@4玹s)۹mZPoĚuuz4)A("""""""""‡7նm4yP!>>u6W^U|,JMotrG1}{Z_Zʋ+W6, LBD22];C?箎&ѣ7[rJJXҥć'׭_R{Y` G Xo7fTЁk0I׏ ~=rݺG'nB Vw>ߺ50E "Qɤ~jsml8tMv4>KGU¦>t(̟OnI ;tdb^J o_σ]Я|#bcw+9aaJK1U=9ysٰn?鬒PV""4RM"t`00CGnn۶F ii-,d]y_̹)) 6jDP+quz:6yyOM-[ݡc+$UEjJ B?;ut|%9%%̺:M,\Ѭߏs˖q_<([m6p:iƿWfn.>clV^CD n=} !<޳'o'6G-bOVݣy+$N<2a{^cһiS:'-~3.^_bPWh03kI_jt G*5G-"ֻ7{q5ew8X{7 :8'`w:9BwuH@\ɭN^i)sOKvdf2uJ ݺѺ\1gccyӡCܲe,߻?gƍ$m܈D##曹!>)e?999TWDDDDDD^TTqƤ;S+Wdd$1חĿԛ99̘AC28NzvϞ'{O?Rb:YEEt}ݝwb䥕+yu{ھTBRA%ddd;?\)""""""""""&~eu:Ά D)9Xݺ Uw-|/\xގ[Ҳf̟:uRrP.x*1*""""""""""I֭u:m_|hd+Np~ܺl+cbxW/w#rFJ-:(/N#u:b2I=F iw!RcZ*""""""""""""""""""gyhw@bb"QQQ';;Dv]i{RRV!W7n$11PDDDDDDjM B9{ jl&MT%A8l01uyqF&M\.DDDDDDYVF#QQQ^Ax*aaa\d2; 8|I4h@HHO?t6m#((1cƐz=++q111ɇ~Ȗ-[HJJ4fٳy7YbwykINNfƌ|L8zwos̛7?X,JKK]cRSS2e 'Of4hq~79sɐ!C'22s0c 7o^s:tb2Ϙ2e 1w}wFb̝;///nJW`0x1'{xy'Xx1aaa2l0yV\Irr2>k\?w{>s|gOmi&MbI/F235w.᯼Ŀ/\nwk\I727%väIo_'4?Oy~%I0L ?蛔ի)>VDJfcڴi<#< 8f͚U]%+[lI׮]_ر#k׮塇oo߾5j3gtm*'33+W{?ЫW/9s&>(;v >>=zriӦ…  00n'ҦM &p뭷eJtš5kӧ)7L|ڵk4hFzܢE w^bmիվ=ʫ D|ݴːox0IOgʊ,߻݆KJƍDpC||wM hSRH-`Sk[\xa!?~`/|X#HQPDDDDDϑ#Gk]<<< ǎ#11R+''_gL8-ZЮ];?@ddiiذac.Cx*ǴX,Qi{PP뱇ŵ:^Mu]L<ٳgӥK5j?['""r>9N\/L?Kp:+I\Ҷ&MbYZka$^[, /|%"^y[>OgoNSVpLή|n ^z _䚏?fWfMIaܹ"_}{"޽\>s&SKt}z)e,-ߎ}TIi֌A-Z0c׶_~Iw߭4nݮkr~Ko3e -f%K(P&ס_R-[\Xb+3S~RNfӧXm'3Vi۰!w'JN=SPDDDDD8zh'?GaڵU^,s֯_O-8r!!!Un'JSQ,ayȑJ۬V+gLf?Njj*{ᮻ⩧bgܷ6ODD|z姟{6?Æ׳7'OI-AA̻DGs_X%% =!!̻>9,*:&M:m:+֭}}x`^^..~;{>|y3*Nw3l#"ܢw}Vu'* WYCZsrݡCΧ6j3SQ7kҤ 6d|xzz 0[ҥK3i0ԩ'OfѥK"##ꪫ$?(O?1uT~%%%k׮$%%Q\\t\[tt4SL7$%%ÇW:{\lӒy[7.;0&fӧ-uu=ׯsF4>tiԈxL4?mi˅;vAOtib 5-<`PVTܶ~8%%6d﫮nf2j`^ +p&ͥYjC 2+x&,OOB}|N{Ou&$ҪUIO{7mwӦT_X_#v ?*#"""""ff{g}Px7DKLLk׮\= … ILL$>>޽{s 7Ю];* 6m۶F^|Eƍ7p%%%|W̘1Z^{ L&M:u*u]DDDȇ~HHH\veU?~<6l=<|͕-ĉ8qb G_J13`ˆ>XEDDpm>&[T:6ThtO-Yڃ+ۙJĺiXi&b#V^͈#)--u?3g2rHXp+h4yYn}aҥK)--eȑKaLgGMvo]]V"R;ZA("""""""""r3<֣>>$DDڵ op˖xL=>uÇIڴF}_͟ucCF6n2.64EvqMZ2fH˖tiԈ?e6|9Pۙq##h@Zv6nMgsl~y&5a0{5{$Ϗ50e :FDtޮ1q2kni׎iiU75kx۬ێqLņEJ E7!!&ު?'DUyx*[eѣe+W{]\LtPPyNOtrii~=1 {C?* Z;v,NY;X%{),ϏoG>{6cGe<'>;p0/nGT1j<X2z4x28'0a}!-UWv?Ӊ,ʔ'DDOuH| {,wӦ8n\ۇ5װdF| IɰkccIۗw6l`9:Uz&,?jǝÃQc29oqӜ9bgqC:7ޖ-n0g& uJ_%ƍ%F&hB6+((HA2 & *+,,LsmPv#,RaB |Zp.]ݻ+,,LEC qviuڴiL&SL0ᶾ-X@sΕ ߩpg" C$IO?]0u;ζx񢼼Եk -*++"R:$8YBB%IFQAyyy-y >\~~~c=|}yM4I&I^^^ӧ -[L'NT@@ $ϟ׸q֭[kҥ=zkkSײPll5k]*33khdC2dʔfnnn2 JHH=ڵkձcGyzzѣF͛9sH233k+**R޽իW77|xKHH땒~[Aqqq:y]UTT護Ҽyj뗿6mڤŋkʕZ~vPGرcqFyzzjذa`lvh^{5-ZH3gԎ;l2L&UTT(>>x޽[vך%''k֭oйpwU c޹S {g^ 3gnx;7-e\*=zW䙜\ÂWJRS_wubʰ`rrlRug^$)X 5ڥȰ`,>?}cQp+<<\pTYVرChk˖-z;ڰa.IS۶md-ZֶCzWԩSZf^~eM4IԳgOiF:t$%%iȑ$ɤh}'ݻw}Fc Ҁ4yd۱.}{/$Gru_3gh݊h94eZg U֭:ΉգR^q {u͉oZRW\v7<Д0 8P^^^X,X,jժ"##k,ZlF [ RVV]GyޱowY-,ժZ>hB7V ΝS Ѻa^yN{W}T-ZHvIv/Çk_hW_Ԭ^|!ҥα/{gm׬S]˪ ݈+wol'`>vLmӁ'uV_FTD)v)e.IґgU[3 ?^xuYY,'Nt9<+**;~kgsqqь3#Gh={nz;7G0nGΩkPۧm(ڵ'qB܌Fmxq%DEi;ص QBT2|RO>`IWxǕ_xA}|- QQ/p6f@#-[K.roGGGJ7oְa$IeeeJOOׄ 4}'www <}٣=z4CXXRRR?Qmk̬N3}{ n]kuھ}bkwBo-٢57WC"#g1f|=<$Iѭ[+|Rmc5Νuoݻێ ܹz]  ]WvUThO~PIREUoؠ%%v3bBCHv/NҢCxܡ$I}nn׿t_V**+>=zcBCw $ WfޝxQm"⢱]hkw{?_ƃKߨ__p_3kȑ2y{KVMݾ֦kp}Hm˗+..N&IaMrOnK嗖f5A?ugIu옆DF* A^nnYY||٢5 +'Νܱ~|ctz]d+G;v7cGqkeXf4 Ν$?qBUUz􊽌M5-GѨ~ը!.tt̄(-ܽ[YwZ_#Q zoazic %ipD]@X_mZ:4p'" Fd2)33S?y;wN!!!#^}^}U=sJJJ҅ Խ{wedd\~{3fh׮], gϞZjVXJEFFjÆ YݺuSRRRSS5g;=ܱCЯս-[CgdUˏ{zxM:~oMQZNNst vUɥKZjG)Gbbjݛf{n4JRk2$Sf:Q,ƿ<5֩+v~h֬0U;:f@jF7}NlAosԪ/;qL͚u}w%:~O|5VT3B L0ƲfYf:!!A vmڴi5k\y}}}rJ\6uwվ9>>>zK.^v5yNGOm… pBc;ѦKbb?W,~bUKTeڅ.\Pwxε{^^`ЌԌT^q~N-Zؖ2uSW q ,>X㎎ MS{?/TYۑ#:۴7%%vN9|Yb4Kpy !~EEET˖-Sqq]JL:I:ZR=zMvU-)}}n-I ӖCԥU+]1үEEN :qQQ[zתZnf,}v?0׮~e4Ν&*)/W377=a7ozϞZfDG+GΝӇk}_- LܺU͚)&4Tv萊/]Rm}4~f}=uLiO~f~k_(@Ǐ?WS:{V{UYUbvص~kuz>6VZ5Eh_]j%wQkޏ~_/77 IUi韅퀀PG}T{m۶Dի{SA4a߼Y&oowoS~i]C|ݾ]GΞUP裶'ӹr4o0 0slFb^UVU)E mxqbFլժVwo к,hLb7ۮZ,I8PUUc|5v!2}v3(3X $I7N}ޭwhT+ń*cX}Dm]|ݕ>j&z|Ӳ:TvzHm#oKˆ6ԐHm| f.=p@.[֎1cw 4I%%%j޼k;Fhh |Ԑs",Ǖ-s9F-X^~Y;ƌkޮ&mۦBʼx.\PyP ]NWZZ BSE8q4EEw^۷O4-TXXP p[дMܶMh=h\..n!ժgz]SLHpv n g -n{:jE@j;2N竫]B@`Pj>rN*e08|!K.M\@V/^Kw3 vvP'pZ ! 499992ͲZ.w&'''G , $PJUUU9  HHHPll6oެjРA*,,9w&OKZdmmv)o8p5k(۷O%%%z'HܹӮ2M>]!!!<]vݲkNNNVxx<<<!CLiiiJLL$`0(!!sZv:v(OOO=z@@MW_}_|Q .ԟgegggiɒ%ھ}~i~Wc'*>>^7nhԈ#{Wڶm#F\T]]aÆ魷҂ eo^fg0d6t-Z3gjǎZlL&***sJvޭL͛7777W)))JNN֭[ߠsgΜQVVڴi#IWRRV\\\KJ6իJJJzjM>n_:uA4`[֦MuY? m߾]YYY$ 0@]tђ%KZgFQ.. hɶcÇ=o߾$GruS3g{nEDD4X@ѱcG[8(I:ubɓ'$IZr.]6ãXqqqö}8v1IRFFڵk(Y,[}*;;޺l﨨(+2dcp劋dRXX ]#4 H&Oɓ'_ѣٳgߔ }]9Rg۷JVAٳvܩqi裏aCԭ[7%%%)55U=zlKF D͛7wv-@!!!wv9P'~^^JKKA4%@B@4!@B@4!@B@4!@B@Mܹs2$IfY S\\,٬ÇOKK`b%~rrrd6eZ] ;!&L[6Oqq,XP# Wff\]]of߫-X-x:J(443b2d2nX˟htv)f@`Z5k,+00Ps̩uvھ}4p@OƍSqqg*11QAAATxxfϞm7ƺu%OOOg?%I ڵkձcGyzzѣ5L޽{SݺuSvv$)//Oڵ$=2 Rk[bO?Տ~#yyyd2iʔ)pB8p@j֬v둜pyxx(88XC QYYҔ(Irss`PBBB4!4/~;͚5Ko߯46R޽uvڥ1cL>]Zt}͟?_W^QF[nڴi?M6JIIQrrn*:5jayxxG7J.]Lmڴ1?~h4VJJ֮]'|FѣGkرڸq<==5l0kc0d6ms^{M-̙3c-[L&Iܹs%IwVff͛gېjpX,ZdN9sH맶mڵpmٲŶdeԽ{w}gڵOkĈ>}[VWѣ+؎:j;ڵOSUWWbb(**JwuJxbXB럛ǏkرpuezPݫAAW߿yN$IoX4tfegg 6p;qℤog]EEE2rss{[|}{{IN>-I -[:\{m5?~TXXXnnn Paaq???swwwIҥKt>G?^ZnպukKm! ;\V$IN;~뀀M:UYYY5O=o˗ɓV5tP>^ӦMSaaf͚#Fs^Uo>'NT``bbbm۶X}$˗/W\\L&nVI9sh"h„ vZ[effjܹ?~uw?mYϞ={j:r<<<ԣGرCޒk…z~f5o)SܹmAVZ_WݻBBBWc eddhƌ>||||4rH-^jZUUVkSVҊ+TYYHmذA=z$uMIIIJMM՜9s4vXݔz D͛7wv-@!!!wv97]ZZUYY)WWٝ)--eB)! Bm'!!A,/ !ЄM!ЄM!ЄM!4?d0*٬Piii2 X,N4wn79992ͲZ.@ jҥ޽dX4dgVM6d25τ nkт 4w\0s@p!IO?mLݎ.^(///uڵ}CCCokjJh4:w w%&&JF Zȑ#>|{L4iL&ԧOegg۵1 Zl&N 4HR%Fϟ?qG[ҥK5zh֦eS8X5kL]vUffP 5d)--vd0 {kתcǎѣGoY6B͛7Os̑$eff*33SWTT޽{+??_W֛ooF+%%Eo tIv)))[oy:/KmڴI/ʕ+~zܹӡ:Fcjƍ԰aTQQQo kZhfΜ;vhٲe2LP||-ܽ{233577W)))JNN֭[ߠsXbp۷Wxx$)&&~Zڱc|}}%I ז-[czwa >\mjɒ%Zhmꫯ9֩Sf˚4i$gϞjӦ:tpkIJJȑ#%I&IOԻw:hɶc]^HR=j'3gh݊h9AUFF(///Y,Y,jJ5 MvvF]A)++ˮ#Ewhˢ.٬lUWW;7<}$ɶ'ɤ[Q>ԉP+ɤL=zgt9(..N?W_s=$]pAݻwWFFu M>]1cvuª*YٳVZ+VRڰaz!I֭9shرJKK@ KJJԼysgpPhh |g/^Txx&L_|?n/ 4|߯(jٲe*..VbbKFp]T]]]{AF[֭lbQTTo߮zK~G^۶mwS׫W/ݻ M!ຬ\RΝ=%""%!4b uvPBg@#fZUPP2!4BAAA.[꒒5oٵJKK"|&hB&hB&hB&hB&hB&hB&hB&hB&hB&hB&hB&hB&UJKK][T(lIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/index.rst0000644000175100001660000000655614743453644015720 0ustar00runnerdocker .. title:: Neo documentation .. The page title must be in rST for it to show in next/prev page buttons. Therefore we add a special style rule to only this page that hides h1 tags (thank you MNE Python for this idea) .. raw:: html ================= Neo documentation ================= .. grid:: .. grid-item-card:: Neo is a Python package for working with **electrophysiology data**. It implements a hierarchical data model well adapted to intracellular and extracellular electrophysiology and EEG data. .. grid-item-card:: Goal: improve **interoperability** between Python tools for analyzing, visualizing and generating electrophysiology data, by providing a **common, shared object model**. .. grid-item-card:: .. image:: images/incf_endorsed_with_spacing.png :width: 100% :alt: Endorsed as a community standard by INCF :target: https://www.incf.org/sbp/neo .. grid:: .. grid-item-card:: Support for reading a **wide range of neurophysiology file formats**, including Spike2, NeuroExplorer, AlphaOmega, Axon, Blackrock, Plexon, Tdt and Igor Pro, and for writing to **open formats** such as NWB and NIX. .. grid-item-card:: Neo objects behave just like **normal NumPy arrays**, but with additional **metadata**, checks for **dimensional consistency** and **automatic unit conversion**. .. grid-item-card:: In order to be as **lightweight** a dependency as possible, Neo is deliberately limited to represention of data, with no functions for data analysis or visualization. .. image:: images/neologo.png :width: 100% :alt: Neo logo :class: only-light .. image:: images/neologo_darkmode.png :width: 100% :alt: Neo logo :class: only-dark .. toctree:: :hidden: :maxdepth: 1 Download & Install Read and analyze data Share data in an open format Use Neo in a library or app Add support for a new file format examples/index Report a bug, request a feature Contribute to Neo Who else is using Neo? API reference rawio Supported formats rawiolist releases authors governance .. grid:: .. grid-item-card:: Download & Install :link: install.html .. grid-item-card:: Read and analyze data :link: read_and_analyze.html .. grid-item-card:: Share data in an open format :link: share_data.html .. grid:: .. grid-item-card:: Use Neo in a library or app :link: use_neo_as_dependency.html .. grid-item-card:: Add support for a new file format :link: add_file_format.html .. grid-item-card:: Examples :link: examples/index.html .. grid:: .. grid-item-card:: Report a bug or request a new feature :link: bug_reports.html .. grid-item-card:: Contribute to Neo :link: contributing.html .. grid-item-card:: See who is using Neo :link: neo_users.html .. grid:: .. grid-item-card:: API reference :link: api_reference.html .. grid-item-card:: Optimisation of performance and memory consumption :link: rawio.html .. grid-item-card:: Supported file formats :link: iolist.html ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/install.rst0000644000175100001660000000466514743453644016256 0ustar00runnerdocker======================== Download and install Neo ======================== Neo is a pure Python package, so it should be easy to get it running on any system. Installing with pip =================== You can install the latest published version of Neo and its dependencies using:: $ pip install neo Dependencies ------------ * Python_ >= 3.8 * numpy_ >= 1.19.5 * quantities_ >= 0.12.1 Certain IO modules have additional dependencies. If these are not satisfied, Neo will still install but the IO module that uses them will fail on loading: * scipy >= 1.0.0 for NeoMatlabIO * h5py >= 2.5 for KwikIO * klusta for KwikIO * igor2 >= 0.5.2 for IgorIO * nixio >= 1.5 for NixIO * stfio for StimfitIO * pillow for TiffIO These dependencies can be installed by specifying a comma-separated list with the ``pip install`` command, e.g.:: $ pip install neo[nixio,tiffio] Or when installing a specific version of neo:: $ pip install neo[nixio,tiffio]==0.9.0 The following IO modules have additional dependencies: * igorproio * kwikio * neomatlabio * nixio * stimfitio * tiffio Installing from source ====================== To download and install the package manually, download: |neo_github_url| Then: .. parsed-literal:: $ unzip neo-|release|.zip $ cd neo-|release| $ pip install . Alternatively, to install the latest version of Neo from the Git repository:: $ git clone git://github.com/NeuralEnsemble/python-neo.git $ cd python-neo $ pip install . Installing with Conda ===================== :: $ conda config --add channels conda-forge $ conda config --set channel_priority strict $ conda install -c conda-forge python-neo Installing from a package repository ==================================== To install Neo if you're using Fedora_ Linux:: $ sudo dnf install python-neo .. NeuroDebian seems out of date - still has Trac as homepage - how to update? To install Neo if you're using the Spack_ package manager:: $ spack install py-neo .. _`Python`: https://www.python.org/ .. _`numpy`: https://numpy.org/ .. _`quantities`: https://pypi.org/project/quantities/ .. _`pip`: https://pypi.org/project/pip/ .. _`setuptools`: http://pypi.python.org/pypi/setuptools .. _Anaconda: https://www.anaconda.com/distribution/ .. _Fedora: https://src.fedoraproject.org/rpms/python-neo .. _Spack: https://spack.readthedocs.io/en/latest/package_list.html#py-neo ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/iolist.rst0000644000175100001660000000012614743453644016077 0ustar00runnerdockerList of implemented IO modules ============================== .. automodule:: neo.io ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/neo_users.rst0000644000175100001660000000267014743453644016604 0ustar00runnerdocker================= Who is using Neo? ================= .. note:: This page has not yet been written. It will highlight some of the projects that are using Neo, such as Elephant_, ephyviewer_, PyNN_, Neurotic_, SpikeInterface_, MEArec_, tridesclous_, uncertainpy_ and eFEL_. .. note:: We also plan to maintain a list of publications that mention use of Neo and/or cite the Neo article. For now, you can view mentions on SciCrunch_ and on `Google Scholar`_, and read `comments from Neo users`_ from the INCF review of Neo as a community standard. .. _Elephant: https://github.com/NeuralEnsemble/elephant .. _ephyviewer: https://github.com/NeuralEnsemble/ephyviewer .. _PyNN: https://github.com/NeuralEnsemble/PyNN .. _Neurotic: https://github.com/jpgill86/neurotic .. _SpikeInterface: https://github.com/SpikeInterface .. _MEArec: https://github.com/alejoe91/MEArec .. _tridesclous: https://github.com/tridesclous/tridesclous .. _uncertainpy: https://github.com/simetenn/uncertainpy .. _eFEL: https://github.com/BlueBrain/eFEL .. _SciCrunch: https://scicrunch.org/resolver/SCR_000634/mentions?q=&i=rrid:scr_000634 .. _`Google Scholar`: https://scholar.google.com/scholar?hl=en&as_sdt=0%2C5&q=%22RRID%3ASCR_000634%22+OR+%22SCR_000634%22+OR+%22neuralensemble.org%2Fneo%2F%22+OR+%22github.com%2FNeuralEnsemble%2Fpython-neo%22&btnG= .. _`comments from Neo users`: https://f1000research.com/documents/11-658 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/rawio.rst0000644000175100001660000002676114743453644015732 0ustar00runnerdocker.. _section-neo-rawio-API: ============= Neo RawIO API ============= .. currentmodule:: neo.rawio For performance and memory consumption reasons, Neo provides a low-level, developer-oriented read-only API for reading different file formats. Neo's full-featured IO modules are built on this, but it is also available for direct use. In brief: - **neo.io** is the user-oriented read/write layer. Reading consists of getting a tree of Neo objects from a data source (file, url, or directory). When reading, all Neo objects are correctly scaled to the correct units. Writing consists of making a set of Neo objects persistent in a file format. - **neo.rawio** is a low-level layer for reading data only. Reading consists of getting NumPy buffers (often int16/int64) of signals/spikes/events. Scaling to real values (microV, times, ...) is done in a second step. Here the underlying objects must be consistent across Blocks and Segments for a given data source. The neo.rawio API is close in spirit to a C API for reading data, but in Python/NumPy. Many, but not all of the file formats supported in :mod:`neo.io` also have a :mod:`neo.rawio` interface. Possible uses of the :mod:`neo.rawio` API are: - fast reading chunks of signals in int16 and do the scaling of units (uV) on a GPU while scaling the zoom. This should improve bandwidth from HD/SSD to RAM and from RAM to GPU memory. - load only a small chunk of data for heavy computations. For instance the spike sorting module tridesclous_ does this. The :mod:`neo.rawio` API is less flexible than :mod:`neo.io` and has some limitations: - read-only - AnalogSignals must have the same characteristics across all Blocks and Segments: ``sampling_rate``, ``shape[1]``, ``dtype`` - AnalogSignals should all have the same value of ``sampling_rate``, otherwise they won't be read at the same time. - Units must have SpikeTrains even if empty across all Block and Segment - Epoch and Event are processed the same way (with ``durations=None`` for Event). For an intuitive comparison of :mod:`neo.io` and :mod:`neo.rawio` see: - :doc:`examples/read_files_neo_io` - :doc:`examples/read_files_neo_rawio` One benefit of the :mod:`neo.rawio` API is that a developer should be able to code a new RawIO class with little knowledge of the Neo tree of objects or of the :mod:`quantities` package. Basic usage =========== .. Download example files .. ipython:: python :suppress: import os.path from urllib.request import urlretrieve url_repo = 'https://web.gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/' for distantfile in ('plexon/File_plexon_2.plx', 'plexon/File_plexon_3.plx', 'blackrock/FileSpec2.3001.nev', 'blackrock/FileSpec2.3001.ns5'): localfile = distantfile.split("/")[1] if not os.path.exists(localfile): urlretrieve(url_repo + distantfile, localfile) First create a reader from a class: .. ipython:: In [1]: from neo.rawio import PlexonRawIO In [2]: reader = PlexonRawIO(filename='File_plexon_3.plx') Then browse the internal header and display information: .. ipython:: In [3]: reader.parse_header() In [4]: reader Out[4]: PlexonRawIO: File_plexon_3.plx nb_block: 1 nb_segment: [1] signal_channels: [V1] spike_channels: [Wspk1u, Wspk2u, Wspk4u, Wspk5u ... Wspk29u Wspk30u Wspk31u Wspk32u] event_channels: [] You get the number of blocks and segments per block. You have information about channels: :attr:`signal_channels`, :attr:`spike_channels`, :attr:`event_channels`. All this information is available in the :attr:`header` dict: .. ipython:: In [5]: for k, v in reader.header.items(): ...: print(k, v) Out[5]: signal_channels [('V1', 0, 1000., 'int16', '', 2.44140625, 0., 0)] event_channels [] nb_segment [1] nb_block 1 spike_channels [('Wspk1u', 'ch1#0', '', 0.00146484, 0., 0, 30000.) ('Wspk2u', 'ch2#0', '', 0.00146484, 0., 0, 30000.) Read chunks of signal data and scale them ----------------------------------------- .. ipython:: In [6]: channel_indexes = None #could be channel_indexes = [0] In [7]: raw_sigs = reader.get_analogsignal_chunk(block_index=0, seg_index=0, ...: i_start=1024, i_stop=2048, ...: channel_indexes=channel_indexes) In [8]: float_sigs = reader.rescale_signal_raw_to_float(raw_sigs, dtype='float64') In [9]: sampling_rate = reader.get_signal_sampling_rate() In [10]: t_start = reader.get_signal_t_start(block_index=0, seg_index=0) In [11]: units = reader.header['signal_channels'][0]['units'] In [12]: raw_sigs.shape, raw_sigs.dtype Out[12]: ((1024, 1), dtype('int16')) In [13]: float_sigs.shape, float_sigs.dtype Out[13]: ((1024, 1), dtype('float64')) In [14]: sampling_rate, t_start, units Out[14]: (1000.0, 0.0, '') There are 3 ways to select a subset of channels: by index (0 based), by id or by name. By index is unambiguous 0 to n-1 (inclusive), whereas for some IOs channel_names (and sometimes channel_ids) are not guaranteed to be unique. In such cases, using names or ids may raise an error. A selected subset of channels which is passed to :func:`get_analog_signal_chunk()`, :func:`get_analog_signal_size()`, or :func:`get_analog_signal_t_start()` has the additional restriction that all such channels must have the same :attr:`t_start` and :attr:`signal_size`. Such subsets of channels may be available in specific RawIOs by using the :func:`get_group_signal_channel_indexes()` method, if the RawIO has defined separate :attr:`group_ids` for each group with those common characteristics. Example with BlackrockRawIO for the recording `FileSpec2.3001`_: .. ipython:: In [15]: from neo.rawio import BlackrockRawIO In [16]: reader = BlackrockRawIO(filename="FileSpec2.3001") In [17]: reader.parse_header() In [18]: raw_sigs = reader.get_analogsignal_chunk(channel_indexes=None) # Take all channels In [19]: raw_sigs1 = reader.get_analogsignal_chunk(channel_indexes=[0, 2, 4]) # Take 0 2 and 4 In [20]: raw_sigs2 = reader.get_analogsignal_chunk(channel_ids=['1', '3', '5']) # Same but with their id (1 based) In [21]: raw_sigs3 = reader.get_analogsignal_chunk(channel_names=['chan1', 'chan3', 'chan5']) # Same but with their name In [22]: raw_sigs1.shape[1], raw_sigs2.shape[1], raw_sigs3.shape[1] Out[22]: (3, 3, 3) Inspect spiking unit channels ----------------------------- Each channel gives a SpikeTrain for each Segment. Note that for many formats a physical channel can have several units after spike sorting. So the number of spike channels could be more than the number of physical channels or signal channels. .. ipython:: In [23]: nb_unit = reader.spike_channels_count() In [24]: print('nb_unit', nb_unit) nb_unit 4 In [25]: for spike_channel_index in range(nb_unit): ....: nb_spike = reader.spike_count(block_index=0, seg_index=0, spike_channel_index=spike_channel_index) ....: print('spike_channel_index', spike_channel_index, 'nb_spike', nb_spike) spike_channel_index 0 nb_spike 259 spike_channel_index 1 nb_spike 234 spike_channel_index 2 nb_spike 218 spike_channel_index 3 nb_spike 253 Get spike timestamps in a defined time range and convert them to spike times ---------------------------------------------------------------------------- .. ipython:: In [26]: spike_timestamps = reader.get_spike_timestamps(block_index=0, seg_index=0, spike_channel_index=0, ....: t_start=0, t_stop=10) In [27]: print(spike_timestamps.shape, spike_timestamps.dtype, spike_timestamps[:5]) (86,) uint32 [ 19312 49298 79301 139290 162170] In [28]: spike_times = reader.rescale_spike_timestamp( spike_timestamps, dtype='float64') In [29]: print(spike_times.shape, spike_times.dtype, spike_times[:5]) (86,) float64 [0.64373333 1.64326667 2.64336667 4.643 5.40566667] Get spike waveforms in a defined time range ------------------------------------------- .. ipython:: In [30]: raw_waveforms = reader.get_spike_raw_waveforms(block_index=0, seg_index=0, spike_channel_index=0, ....: t_start=0, t_stop=10) In [31]: print(raw_waveforms.shape, raw_waveforms.dtype, raw_waveforms[0, 0, :4]) (86, 1, 48) int16 [-209 -224 -74 205] In [32]: float_waveforms = reader.rescale_waveforms_to_float(raw_waveforms, dtype='float32', spike_channel_index=0) In [33]: print(float_waveforms.shape, float_waveforms.dtype, float_waveforms[0,0,:4]) (86, 1, 48) float32 [-52.25 -56. -18.5 51.25] Count events per channel ------------------------ .. ipython:: In [34]: reader = PlexonRawIO(filename='File_plexon_2.plx') In [35]: reader.parse_header() In [36]: nb_event_channel = reader.event_channels_count() In [37]: print('nb_event_channel', nb_event_channel) nb_event_channel 28 In [38]: for chan_index in range(nb_event_channel): ....: nb_event = reader.event_count(block_index=0, seg_index=0, event_channel_index=chan_index) ....: print('chan_index',chan_index, 'nb_event', nb_event) chan_index 0 nb_event 1 chan_index 1 nb_event 0 chan_index 2 nb_event 0 chan_index 3 nb_event 0 ... Read event timestamps and times ------------------------------- .. ipython:: In [39]: ev_timestamps, ev_durations, ev_labels = reader.get_event_timestamps( ....: block_index=0, seg_index=0, event_channel_index=0, ....: t_start=None, t_stop=None) In [40]: print(ev_timestamps, ev_durations, ev_labels) [1268] None ['0'] In [41]: ev_times = reader.rescale_event_timestamp(ev_timestamps, dtype='float64') In [42]: print(ev_times) [ 0.0317] Signal streams and signal buffers --------------------------------- For reading analog signals **neo.rawio** has 2 important concepts: 1. The **signal_stream** : it is a group of channels that can be read together using :func:`get_analog_signal_chunk()`. This group of channels is guaranteed to have the same sampling rate, and the same duration per segment. Most of the time, this group of channel is a "logical" group of channels. In short they are from the same headstage or from the same auxiliary board. Optionally, depending on the format, a **signal_stream** can be a slice of or an entire **signal_buffer**. 2. The **signal_buffer** : it is group of channels that share the same data layout in a file. The most simple example is channel that can be read by a simple :func:`signals = np.memmap(file, shape=..., dtype=... , offset=...)`. A **signal_buffer** can contain one or several **signal_stream**'s (very often it is only one). There are two kind of formats that handle this concept: * Formats which use :func:`np.memmap()` internally * Formats based on hdf5 There are many formats that do not handle this concept: * the ones that use an external python package for reading data (edf, ced, plexon2, ...) * the ones with a complicated data layout (e.g. those where the data blocks are split without structure) To check if a format makes use of the buffer api you can check the class attribute flag `has_buffer_description_api` of the rawio class. List of implemented formats =========================== See :doc:`rawiolist`. .. _tridesclous: https://github.com/tridesclous/tridesclous .. _FileSpec2.3001: https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/src/master/blackrock././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/rawiolist.rst0000644000175100001660000000013714743453644016613 0ustar00runnerdockerList of implemented RawIO modules ================================= .. automodule:: neo.rawio ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/read_and_analyze.rst0000644000175100001660000004516614743453644020071 0ustar00runnerdocker=================================== Reading and analyzing data with Neo =================================== .. currentmodule:: neo.core Getting started =============== Neo is a library for working with neurophysiology data in the Python programming language. One of the big advantages of Neo is that it works with many different file formats: it doesn't matter which format your data is stored in, Neo provides a standard way to read the data, and then represents it in a standardised way, as a set of Python objects. .. loading data with an IO module The first step in reading data is to import the appropriate Neo input-output (or IO) module for your data. For this example, we're going to work with membrane potential traces stored in a text file, so we use the :class:`~neo.io.AsciiSignalIO` module: .. ipython:: In [1]: from neo.io import AsciiSignalIO In [2]: data = AsciiSignalIO("example_data.txt", delimiter=" ").read() .. link to list of IO modules .. note:: For a full list of IO modules provided by Neo, see :doc:`iolist`. .. navigating through the tree .. ipython:: In [3]: data Out[3]: [Block with 1 segments file_origin: 'example_data.txt' # segments (N=1) 0: Segment with 1 analogsignals # analogsignals (N=1) 0: AnalogSignal with 4 channels of length 10001; units mV; datatype float32 name: 'multichannel' sampling rate: 1.0 kHz time: 0.0 s to 10.001 s] Different data files can contain different amounts of data, from single traces to multiple recording sessions. To provide consistent behaviour, for all IO modules, the :meth:`read()` method returns a list of data blocks. A :class:`Block` typically represents a recording session. Each block contains a list of segments, where each :class:`Segment` contains data recorded at the same time. In this example file, we see a single type of data, the "analog signal", which represents continuous time series sampled at a fixed interval. The other types of data that can be contained in a :class:`Segment` are discussed below under :ref:`section-data-types`. .. note:: :meth:`read()` reads the entire file into memory at once. If you only want to access part of the data, you can do so using Neo's "lazy" data loading - see the section on :ref:`section-performance-memory` below. .. plotting data Neo data objects are based on NumPy_ arrays, and behave very similarly. For example, they can be plotted just like arrays: .. ipython:: In [4]: import matplotlib.pyplot as plt In [5]: signal = data[0].segments[0].analogsignals[0] In [6]: plt.plot(signal.times, signal) Out[6]: [, , , ] In [7]: plt.xlabel(f"Time ({signal.times.units.dimensionality.string})") Out[7]: Text(0.5, 0, 'Time (s)') In [8]: plt.ylabel(f"Membrane potential ({signal.units.dimensionality.string})") Out[8]: Text(0, 0.5, 'Membrane potential (mV)') In [9]: plt.savefig("example_plot.png") .. image:: example_plot.png .. link to examples. You now know enough to start using Neo. For more examples, see :doc:`../examples/index`. If you want to know more, read on. NumPy ===== Neo is based on NumPy_. All Neo data classes behave like NumPy arrays, but have extra functionality. The first addition is support for units. In contrast to a plain NumPy array, an :class:`AnalogSignal` knows the units of the data it contains, e.g.: .. ipython:: In [10]: signal.units Out[10]: array(1.) * mV This helps avoid errors like adding signals with different units, lets you auto-generate figure axis labels, and makes it easy to change units, like here from millivolts to volts e.g.: .. ipython:: In [11]: signal.magnitude[:5] Out[11]: array([[-58.469, -52.855, -58.79 , -58.815], [-59.061, -50.518, -52.003, -57.24 ], [-59.01 , -50.51 , -51.988, -57.199], [-58.96 , -50.503, -51.973, -57.158], [-58.911, -50.495, -51.958, -57.117]], dtype=float32) In [12]: signal.rescale("V").magnitude[:5] Out[12]: array([[-0.058469 , -0.052855 , -0.05879 , -0.058815 ], [-0.059061 , -0.050518 , -0.052003 , -0.05724001], [-0.05901 , -0.05051 , -0.051988 , -0.05719901], [-0.05896 , -0.050503 , -0.051973 , -0.057158 ], [-0.058911 , -0.050495 , -0.051958 , -0.057117 ]], dtype=float32) The second addition is support for structured metadata. Some of these metadata are *required*. For example, an :class:`AnalogSignal` must always have a :attr:`sampling_rate` attribute, and Neo will produce an Exception if you try to add two signals with different sampling rates: .. ipython:: In [13]: signal.sampling_rate Out[13]: array(1.) * kHz Some of these metadata are recommended but optional, like a name for each signal. Such metadata appear as attributes of the data objects: .. ipython:: In [14]: signal.name Out[14]: 'multichannel' And finally, some metadata are fully optional. These are stored in the :attr:`annotations` and :attr:`array_annotations` attributes: .. ipython:: In [15]: signal.array_annotations Out[15]: {'channel_index': array([0, 1, 2, 3])} For more information about this, see :ref:`section-annotations`. .. treating Neo data objects like numpy arrays, quantity arrays, converting between them, rescaling Most NumPy array methods also work on Neo data objects, e.g.: .. ipython:: In [16]: signal.mean() Out[16]: array(-56.33598, dtype=float32) * mV Data objects can be sliced like arrays (array annotations are automatically sliced appropriately): .. ipython:: In [17]: signal[100:110, 1:3] Out[17]: AnalogSignal with 2 channels of length 10; units mV; datatype float32 name: 'multichannel' sampling rate: 1.0 kHz time: 0.1 s to 0.11 s In [18]: signal[100:110, 1:3].array_annotations Out[18]: {'channel_index': array([1, 2])} To convert a Neo data object to a plain NumPy array, use the :attr:`magnitude` attribute: .. ipython:: In [19]: signal[100:110, 1:3].magnitude Out[19]: array([[-60.654, -60. ], [-60.724, -60. ], [-60.792, -60. ], [-60.859, -60. ], [-60.924, -60. ], [-60.989, -60. ], [-61.052, -60. ], [-61.114, -60. ], [-61.175, -60. ], [-61.234, -60. ]], dtype=float32) .. _section-data-types: Data types ========== The following classes directly represent data as arrays of numerical values with associated metadata (units, sampling frequency, etc.). * :py:class:`AnalogSignal`: A regular sampling of a single- or multi-channel continuous analog signal. * :py:class:`IrregularlySampledSignal`: A non-regular sampling of a single- or multi-channel continuous analog signal. * :py:class:`SpikeTrain`: A set of action potentials (spikes) emitted by the same unit in a period of time (with optional waveforms). * :py:class:`Event`: An array of time points representing one or more events in the data. * :py:class:`Epoch`: An array of time intervals representing one or more periods of time in the data. * :py:class:`ImageSequence`: A three dimensional array representing a sequence of images. AnalogSignal ------------ We have already met the :class:`AnalogSignal`, which represents continuous time series sampled at a fixed interval. In addition to reading data from a file, as above, it is also possible to create new signal objects directly, e.g.: .. ipython:: In [20]: import numpy as np In [21]: from quantities import mV, kHz In [22]: from neo import AnalogSignal In [23]: signal = AnalogSignal(np.random.normal(-65.0, 5.0, size=(100, 5)), ....: units=mV, sampling_rate=1 * kHz) In [24]: signal Out[24]: AnalogSignal with 5 channels of length 100; units mV; datatype float64 sampling rate: 1.0 kHz time: 0.0 s to 0.1 s IrregularlySampledSignal ------------------------ :class:`IrregularlySampledSignal` represents continuous time series sampled at non-regular time points. This means that instead of specifying the sampling rate or sampling interval, you must specify the array of times at which the signal was sampled. .. ipython:: In [25]: from quantities import ms, nA In [26]: from neo import IrregularlySampledSignal In [27]: isignal = IrregularlySampledSignal( ....: times=[0.0, 1.11, 4.27, 16.38, 19.33] * ms, ....: signal=[0.5, 0.8, 0.5, 0.7, 0.2] * nA, ....: description="input current") In [28]: isignal Out[28]: IrregularlySampledSignal with 1 channels of length 5; units nA; datatype float64 description: 'input current' sample times: [ 0. 1.11 4.27 16.38 19.33] ms .. note:: in case of multi-channel data, samples are assumed to have been taken at the same time points in all channels. If you need to specify different time points for different channels, use one signal object per channel. SpikeTrain ---------- A :class:`SpikeTrain` represents the times of occurrence of action potentials (spikes). .. ipython:: In [29]: from neo import SpikeTrain In [30]: spike_train = SpikeTrain([3, 4, 5], units='sec', t_stop=10.0) In [31]: spike_train Out[31]: SpikeTrain containing 3 spikes; units s; datatype float64 time: 0.0 s to 10.0 s It may also contain the waveforms of the action potentials, stored as :class:`AnalogSignals` *within* the spike train object - see the reference documentation for more on this. Event ----- It is common in electrophysiology experiments to record the times of specific events, such as the times at which stimuli are presented. An :class:`Event` contains an array of times at which events occurred, together with an *optional* array of labels for the events, e.g.: .. ipython:: In [32]: from neo import Event In [33]: events = Event(np.array([5, 15, 25]), units="second", ....: labels=["apple", "rock", "elephant"], ....: name="stimulus onset") In [34]: events Out[34]: Event containing 3 events with labels; time units s; datatype int64 name: 'stimulus onset' Epoch ----- A variation of events is where something occurs over a certain period of time, in which case we need to know both the start time and the duration. An :class:`Epoch` contains an array of start or onset times together with an array of durations (or a single value if all epochs have the same duration), and an optional array of labels. .. ipython:: In [35]: from neo import Epoch In [36]: epochs = Epoch(times=np.array([5, 15, 25]), ....: durations=2.0, ....: units="second", ....: labels=["apple", "rock", "elephant"], ....: name="stimulus presentations") In [37]: epochs Out[37]: Epoch containing 3 epochs with labels; time units s; datatype int64 name: 'stimulus presentations' ImageSequence ------------- In addition to electrophysiology, neurophysiology signals may be obtained through functional microscopy. The :class:`ImageSequence` class represents a sequence of images, as a 3D array organized as [frame][row][column]. It behaves similarly to :class:`AnalogSignal`, but in 3D rather than 2D. .. ipython:: In [38]: from quantities import Hz, micrometer In [39]: from neo import ImageSequence In [40]: img_sequence_array = [[[column for column in range(20)]for row in range(20)] ....: for frame in range(10)] In [41]: image_sequence = ImageSequence(img_sequence_array, units='dimensionless', ....: sampling_rate=1 * Hz, ....: spatial_scale=1 * micrometer) In [42]: image_sequence Out[42]: ImageSequence 10 frames with width 20 px and height 20 px; units dimensionless; datatype int64 sampling rate: 1.0 Hz spatial_scale: 1.0 um .. _section-annotations: Annotations =========== .. and array annotations Neo objects have certain *required* metadata, such as the :attr:`sampling_rate` for :class:`AnalogSignals`. There are also certain *recommended* metadata, such as a name and description. For any metadata not covered by the required or recommended fields, additional annotations can be added, e.g.: .. ipython:: In [43]: from quantities import um as µm In [44]: signal.annotate(pipette_tip_diameter=1.5 * µm) In [45]: signal.annotations Out[45]: {'pipette_tip_diameter': array(1.5) * um} For those IO modules that support writing data to file, annotations will also be written, provided they can be serialized to JSON format. .. todo: we should provide a custom ``JSONEncoder`` that supports quantities Array annotations ----------------- Since certain Neo objects contain array data, it is sometimes necessary to annotate individual array elements, or individual columns. For 1D arrays, the array annotations should have the same length as the array, e.g. .. ipython:: In [46]: events.shape In [47]: events.array_annotate(secondary_labels=["red", "green", "blue"]) For 2D arrays, the array annotations should match the shape of the channel dimension, e.g. .. ipython:: In [48]: signal.shape In [49]: signal.array_annotate(quality=["good", "good", "noisy", "good", "noisy"]) Dataset structure ================= The overall structure of a Neo dataset is shown in this figure: .. image:: images/base_schematic.png :height: 500 px :alt: Illustration of the main Neo data types :align: center Beyond the core data classes, Neo has various classes for grouping and structuring different data objects. We have already met two of them, the :class:`Block` and :class:`Segment`. Tree structure -------------- :class:`Block` and :class:`Segment` provide a basic two-level hierarchical structure: :class:`Blocks` contain :class:`Segments`, which contain data objects. :class:`Segments` are used to group data that have a common time basis, i.e. that were recorded at the same time. A :class:`Segment` can be considered as equivalent to a "trial", "episode", "run", "recording", etc., depending on the experimental context. :class:`Segments` have the following attributes, used to access lists of data objects: - :attr:`analogsignals` - :attr:`epochs` - :attr:`events` - :attr:`imagesequences` - :attr:`irregularlysampledsignals` - :attr:`spiketrains` :class:`Block` is the top-level container gathering all of the data, discrete and continuous, for a given recording session. It contains :class:`Segment` and :class:`Group` (see next section) objects in the attributes :attr:`segments` and :attr:`groups`. Grouping and linking objects ---------------------------- Sometimes your data have a structure that goes beyond a simple two-level hierarchy. For example, suppose that you wish to group together signals that were recorded from the same tetrode in multi-tetrode recording setup. For this, Neo provides a :class:`Group` class: .. ipython:: In [50]: from neo import Group In [51]: signal1 = AnalogSignal(np.random.normal(-65.0, 5.0, size=(100, 5)), units=mV, sampling_rate=1 * kHz) In [52]: signal2 = AnalogSignal(np.random.normal(-65.0, 5.0, size=(1000, 5)), units=nA, sampling_rate=10 * kHz) In [53]: group = Group(objects=(signal1, signal2)) In [54]: group Out[54]: Group with 2 analogsignals Since :class:`AnalogSignals` can contain data from multiple channels, sometimes we wish to include only a subset of channels in a group. For this, Neo provides the :class:`ChannelView` class, e.g.: .. ipython:: In [55]: from neo import ChannelView In [56]: channel_of_interest = ChannelView(obj=signal1, index=[2]) In [57]: signal_with_spikes = Group(objects=(channel_of_interest, spike_train)) In [58]: signal_with_spikes Out[58]: Group with 1 spiketrains, 1 channelviews .. todo: give some examples of using ROI with ImageSequence .. _section-performance-memory: Performance and memory consumption ================================== .. lazy loading In some cases you may not wish to load everything in memory, because it could be too big, or you know you only need to access a subset of the data in a file. For this scenario, some IO modules provide an optional argument to their :attr:`read()` methods: ``lazy=True/False``. With ``lazy=True`` all data objects (:class:`AnalogSignal`/:class:`SpikeTrain`/:class:`Event`/:class:`Epoch`/:class:`ImageSequence`) are replaced by proxy objects (:class:`AnalogSignalProxy`/:class:`SpikeTrainProxy`/:class:`EventProxy`/:class:`EpochProxy`/:class:`ImageSequenceProxy`). .. todo: implement ImageSequenceProxy By default (if not specified), ``lazy=False``, i.e. all data are loaded. These proxy objects contain metadata (:attr:`name`, :attr:`sampling_rate`, ...) so they can be inspected, but they do not contain any array-like data. When you want to load the actual data from a proxy object, use the :func:`load()` method to return a real data object of the appropriate type. Furthermore :func:`load()` has a ``time_slice`` argument, which allows you to load only a slice of data from the file. In this way the consumption of memory can be finely controlled. .. ipython: : .. In [59]: lazy_data = AsciiSignalIO("example_data.txt", delimiter=" ").read(lazy=True) .. In [60]: lazy_data .. todo: implement AsciiSignalRawIO Examples ======== For more examples of using Neo, see :doc:`../examples/index`. Citing Neo ========== If you use Neo in your work, please mention the use of Neo in your Methods section, using our RRID_: ``RRID:SCR_000634``. If you wish to cite Neo in publications, please use: Garcia S., Guarino D., Jaillet F., Jennings T.R., Pröpper R., Rautenberg P.L., Rodgers C., Sobolev A.,Wachtler T., Yger P. and Davison A.P. (2014) Neo: an object model for handling electrophysiology data in multiple formats. Frontiers in Neuroinformatics 8:10: doi:`10.3389/fninf.2014.00010`_ A BibTeX entry for LaTeX users is:: @article{neo14, author = {Garcia S. and Guarino D. and Jaillet F. and Jennings T.R. and Pröpper R. and Rautenberg P.L. and Rodgers C. and Sobolev A. and Wachtler T. and Yger P. and Davison A.P.}, doi = {10.3389/fninf.2014.00010}, full_text = {https://www.frontiersin.org/articles/10.3389/fninf.2014.00010/full}, journal = {Frontiers in Neuroinformatics}, month = {February}, title = {Neo: an object model for handling electrophysiology data in multiple formats}, volume = {8:10}, year = {2014} } .. _NumPy: https://numpy.org/ .. _`10.3389/fninf.2014.00010`: https://doi.org/10.3389/fninf.2014.00010 .. _RRID: https://www.rrids.org ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1304154 neo-0.14.0/doc/source/releases/0000755000175100001660000000000014743453656015651 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.10.0.rst0000644000175100001660000000562214743453644017121 0ustar00runnerdocker======================== Neo 0.10.0 release notes ======================== 27th July 2021 New IO modules -------------- .. currentmodule:: neo.io * :class:`CedIO` - an alternative to :class:`Spike2IO` * :class:`AxonaIO` * :class:`OpenEphysIO` - handle the binary format * :class:`PhyIO` * :class:`SpikeGLXIO` * :class:`NWBIO` - support for a subset of the `NWB:N`_ format * :class:`MaxwellIO` Bug fixes and improvements in IO modules ---------------------------------------- * :class:`NeuralynxIO` was refactored and now supports new file versions (neuraview) and single file loading. * Legacy versions of old IOs were removed for NeuralynxIO (neuralynxio_v1), BlackrockIO, NeoHdf5IO. * :class:`NixIOfr` now supports array annotations of :class:`AnalogSignal` objects. * :class:`NSDFIO` was removed because we can no longer maintain it. * all IOs now accept :class:`pathlib.Path` objects. * The IO modules of this release have been tested with version 0.1.0 of the `ephy_testing_data`_. Removal of Unit and ChannelIndex -------------------------------- .. currentmodule:: neo.core In version 0.9.0 :class:`Group` and :class:`ChannelView` were introduced, replacing :class:`Unit` and :class:`ChannelIndex`, which were deprecated. In this version the deprecated :class:`Unit` and :class:`ChannelIndex` are removed and only the new :class:`Group` and :class:`ChannelView` objects are available. Supported Python and NumPy versions ----------------------------------- We no longer support Python 3.6, nor versions of NumPy older than 1.16. Other new or modified features ------------------------------ * Lists of :class:`SpikeTrain` objects can now also be created from two arrays: one containing spike times and the other unit identities of the times (:class:`SpikeTrainList`). * Object identity is now preserved when using utility :func:`time_slice()` methods. See all `pull requests`_ included in this release and the `list of closed issues`_. RawIO modules ------------- Internal refactoring of the neo.rawio module regarding channel grouping. Now the concept of a signal stream is used to handle channel groups for signals. This enhances the way the :attr:`annotation` and :attr:`array_annotation` attributes are rendered at neo.io level. Acknowledgements ---------------- Thanks to Samuel Garcia, Julia Sprenger, Peter N. Steinmetz, Andrew Davison, Steffen Bürgers, Regimantas Jurkus, Alessio Buccino, Shashwat Sridhar, Jeffrey Gill, Etienne Combrisson, Ben Dichter and Elodie Legouée for their contributions to this release. .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+milestone%3A0.10.0+is%3Aclosed .. _`pull requests`: https://github.com/NeuralEnsemble/python-neo/pulls?q=is%3Apr+is%3Aclosed+merged%3A%3E2020-11-10+milestone%3A0.10.0 .. _`ephy_testing_data`: https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/src/v0.1.0 .. _`NWB:N`: https://www.nwb.org/nwb-neurophysiology/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.10.1.rst0000644000175100001660000000351614743453644017122 0ustar00runnerdocker======================== Neo 0.10.1 release notes ======================== 2nd March 2022 Bug fixes and improvements in IO modules ---------------------------------------- * :class:`NeuralynxIO` memory performace was improved during initialization [#998](https://github.com/NeuralEnsemble/python-neo/pull/990) and new arguments for file selection were added [#1023](https://github.com/NeuralEnsemble/python-neo/pull/1023) [#1043](https://github.com/NeuralEnsemble/python-neo/pull/1043) * :class:`TdtIO` can load single block tdt datasets [#1057](https://github.com/NeuralEnsemble/python-neo/pull/1057) * :class:`SpikeGLXIO` supports neuropixel 2.0 format [#1045](https://github.com/NeuralEnsemble/python-neo/pull/1045) and uses corrected gain values [#1069](https://github.com/NeuralEnsemble/python-neo/pull/1069) * :class:`NixIO` some bug fix related to nixio module * :class:`NwbIO` various improvement [#1052](https://github.com/NeuralEnsemble/python-neo/pull/1052) [#1054](https://github.com/NeuralEnsemble/python-neo/pull/1054) * :class:`OpenEphysIO` small bug fix [#1062](https://github.com/NeuralEnsemble/python-neo/pull/1062) * :class:`MaxwellIO` bug fix [#1074](https://github.com/NeuralEnsemble/python-neo/pull/1074) * :class:`NeuroscopeIO` bug fix [#1078](https://github.com/NeuralEnsemble/python-neo/pull/1078) * The IO modules of this release have been tested with version 0.1.1 of the `ephy_testing_data`_. Documentation ------------- A project governance guide has been added [#1048](https://github.com/NeuralEnsemble/python-neo/pull/1048) Acknowledgements ---------------- Thanks to Samuel Garcia, Julia Sprenger, Andrew Davison, Alessio Buccino, Ben Dichter, Elodie Legouée, Eric Larson and Heberto Mayorquin for their contributions to this release. .. _`ephy_testing_data`: https://gin.g-node.org/NeuralEnsemble/ephy_testing_data/src/v0.1.1 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.10.2.rst0000644000175100001660000000057214743453644017122 0ustar00runnerdocker======================== Neo 0.10.2 release notes ======================== 8th March 2022 This release fixes the following bugs introduced in 0.10.1: 1. Remove broken imports in `spike2rawio.py `_ 2. Fix the compilation of the documentation on `readthedoc `_ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.11.0.rst0000644000175100001660000000307214743453644017117 0ustar00runnerdocker======================== Neo 0.11.0 release notes ======================== 1st September 2022 .. currentmodule:: neo.io Bug fixes and improvements in IO modules ---------------------------------------- Bug fixes and/or improvements have been made to :class:`NWBIO`, :class:`NeoMatlabIO`, :class:`NixIO`, :class:`AxonIO`, :class:`SpikeGLXIO`, :class:`NeuroshareIO`, :class:`NeuroScopeIO`, :class:`NeuralynxIO`, :class:`OpenEphysIO`, :class:`AsciiSignalIO`, :class:`AlphaOmegaIO`, and :class:`TdtIO`. New IO modules -------------- Modules :class:`BiocamIO` and :class:`EDFIO` have been added. Supported NumPy versions ------------------------ We no longer support versions of NumPy older than 1.18.5. Other changes ------------- .. currentmodule:: neo.io.spiketrainlist - documentation fixes and updates - improvements to :class:`SpikeTrainList` See all `pull requests`_ included in this release and the `list of closed issues`_. Acknowledgements ---------------- Thanks to Julia Sprenger, Samuel Garcia, Heberto Mayorquin, Andrew Davison, Tom Donoghue, Alessio Buccino, Thomas Perret, Saksham Sharda, Ben Dichter and Elodie Legouée for their contributions to this release. .. generated with git shortlog --since=2022-03-08 -sne then checking Github for PRs merged since the last release but with commits before then .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+milestone%3A0.11.0+is%3Aclosed .. _`pull requests`: https://github.com/NeuralEnsemble/python-neo/pulls?q=is%3Apr+is%3Aclosed+merged%3A%3E2022-03-08+milestone%3A0.11.0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.11.1.rst0000644000175100001660000000263214743453644017121 0ustar00runnerdocker======================== Neo 0.11.1 release notes ======================== 21st October 2022 .. currentmodule:: neo.io Bug fixes and improvements in IO modules ---------------------------------------- Bug fixes and/or improvements have been made to :class:`OpenEphysBinaryIO`, :class:`BlackrockIO`, :class:`NWBIO`, :class:`PhyIO`, :class:`NeuralynxIO` Supported format versions ------------------------- :class:`BlackrockIO` now supports file version 3.0 Other changes ------------- New installation mode - Neo can now be installed including all optional dependencies via *pip install neo[all]* Faster import - Dependency imports have been optimized for faster import of Neo Epoch durations - Epoch durations of epochs can now be of type float See all `pull requests`_ included in this release and the `list of closed issues`_. Acknowledgements ---------------- Thanks to Andrew Davison, Julia Sprenger, Chadwick Boulay, Alessio Buccino, Elodie Legouée, Samuel Garcia for their contributions to this release. .. generated with git shortlog --since=2022-09-01 -sne then checking Github for PRs merged since the last release but with commits before then .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+milestone%3A0.11.1+is%3Aclosed .. _`pull requests`: https://github.com/NeuralEnsemble/python-neo/pulls?q=is%3Apr+is%3Aclosed+merged%3A%3E2022-09-01+milestone%3A0.11.1 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.12.0.rst0000644000175100001660000000414414743453644017121 0ustar00runnerdocker======================== Neo 0.12.0 release notes ======================== 17th February 2023 .. currentmodule:: neo.io Change of packaging system -------------------------- We have updated our tooling for building and installing Neo to follow the `latest recommendations`_ of the Python community (using pyproject.toml, etc.) For users, this means you should always use `pip` to install Neo, unless you're using another package manager such as `conda`, `spack`, or a Linux package manager. Improved file format detection ------------------------------ In addition to the existing :func:`get_io()` function, there is now an additional utility function for finding a suitable IO for a given dataset. :func:`list_candidate_ios()` provides a list of all IOs supporting the formats detected in a given path. This list is generated based on the file extension of the file or the extensions of the matching files in a given folder, potentially also scanning subfolders if required. Bug fixes and improvements in IO modules ---------------------------------------- Bug fixes and/or improvements have been made to :class:`OpenEphysBinaryIO` and :class:`NWBIO`. Other changes ------------- - The IO test suite has been greatly improved, with a substantial speed-up. See all `pull requests`_ included in this release and the `list of closed issues`_. Updated dependencies -------------------- We have dropped support for Python 3.7 and added support for 3.11. Neo now requires NumPy version >=1.19.5 and Quantities >=v0.14.1. Acknowledgements ---------------- Thanks to Julia Sprenger, Andrew Davison, and Samuel Garcia for their contributions to this release. .. generated with git shortlog --since=2022-10-21 -sne then checking Github for PRs merged since the last release but with commits before then .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+milestone%3A0.12.0+is%3Aclosed .. _`pull requests`: https://github.com/NeuralEnsemble/python-neo/pulls?q=is%3Apr+is%3Aclosed+merged%3A%3E2022-10-21+milestone%3A0.12.0 .. _`latest recommendations`: https://packaging.python.org/en/latest/././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.13.0.rst0000644000175100001660000001503614743453644017124 0ustar00runnerdocker======================== Neo 0.13.0 release notes ======================== 2nd February 2024 This release of Neo sees a lot of changes and improvements, with a documentation rewrite, final tweaks and refinements to the object model (in anticipation of a 1.0 release in the next few months), a new approach to filtering objects of interest from complex datasets, and a large number of bug fixes and performance improvements in IO modules. 23 people contributed to this release, which is a new record for Neo! See all `pull requests`_ included in this release and the `list of closed issues`_. Refinements to the Neo object model ----------------------------------- In order to simplify the structure of Neo datasets, and make a clearer distinction between the Block-Segment-data hierarchy and the more flexible data-grouping functionality, we no longer allow Groups to contain Segments. We have made the handling of RegionOfInterest subclasses consistent with :class:`ChannelView`, i.e., just as a :class:`ChannelView` gives a view of a subset of the channels in a multi-channel :class:`AnalogSignal`, so the :class:`RegionOfInterest`` subclasses give views of a subset of the pixels in an :class:`ImageSequence`. Neo now has automatic handling of relationships between objects. In previous versions, the child-parent relationships between objects had to be handled manually, for example when you added a :class:`SpikeTrain` to a :class:`Segment`, this created a parent-child relationship, but the reverse child-parent relationship was not automatically created, leading to potential inconsistencies. Now these relationships are created automatically, as the various child lists (``Segment.spiketrains``, ``Segment.analogsignals``, ``Block.segments``, etc.) are now represented by pseudo-list objects which take care of the book-keeping behind the scenes. As a convenience, all Neo containers (:class:`Block`, :class:`Segment`, :class:`Group`) now have an :meth:`add()` method that automatically puts the object in the correct list, for example:: segment.add(signal1, event2, spiketrain3) instead of:: segment.analogsignals.append(signal1) segment.events.append(event2) segment.spiketrains.append(spiketrain3) Documentation rewrite and new theme ----------------------------------- The Neo documentation has had a complete overhaul, with a rewrite aimed at providing different entry points to the documentation for different_ user_ needs_, using the Sphinx IPython extension to ensure code snippets are always up-to-date, and a switch to the `PyData Sphinx theme`_. Improved filtering ------------------ For complex datasets, it is often necessary to extract subsets of the data from a Neo object tree by filtering based on object types, names, and annotations. Neo's filtering capabilities have been improved, with the addition of a new :mod:`filters` module. For example, suppose we have a dataset from an animal performing a behavioural task. Our objective is to retain only the trials where the animal performed correctly, for one of the four trial types in the experiment, and where the recordings met certain quality criteria. Based on an annotated Neo dataset, we can extract the spike trains of interest in a single step, without for loops or complex list comprehensions, as follows: .. code-block:: python import neo.core.filters as nf # ... load data, `trial` is a Segment object ... sua_spiketrains = trial.filter( objects=neo.SpikeTrain, targdict=[ {"sua": True}, # only single-unit activity {"electrode_reject_HFC": False}, # } exclude different types {"electrode_reject_LFC": False}, # } of artefacts {"electrode_reject_IFC": False}, # } or markers of poor-quality {"noise": False}, # } recordings {"spike_count": nf.FilterGreaterThan(10000)} # only use neurons with a sufficiently high firing rate ] ) New IO modules -------------- Neo now supports MED_ format, with the new :class:`MedIO` and :class:`MedRawIO` classes. Bug fixes and improvements in IO modules ---------------------------------------- Bug fixes and/or improvements have been made to :class:`AsciiSignalIO`, :class:`BCI2000IO`, :class:`BiocamIO`, :class:`BlackrockIO`, :class:`IgorIO`, :class:`IntanIO`, :class:`KlustaKwikIO`, :class:`MaxwellIO`, :class:`MEArecIO`, :class:`NeoMatlabIO`, :class:`NeuralynxIO`, :class:`NixIO`, :class:`NWBIO`, :class:`OpenEphysIO`, :class:`PlexonIO`, :class:`Plexon2IO`, :class:`SpikeGLXIO`, and :class:`TdtIO`. Other changes ------------- - RawIO classes have a method :meth:`parse_header` that extracts all the information from the formats and therefore is usually a computationally heavy process. A flag ``is_header_parsed`` has now been added, to avoid re-extracting the header information if it is already available. This can produce significant speed ups. - Type hints have been added to the :mod:`baseio`, :mod:`baserawio`, and :mod:`exampleio` modules, with the aim of helping developers who wish to add a new IO module. - All of the code is now formatted with black_. - The continuous integration (CI) pipeline has been sped up. Updated dependencies -------------------- Neo now requires NumPy version >=1.20.3. Acknowledgements ---------------- Thanks to Julia Sprenger, Andrew Davison, Zach McKenzie, Alessio Buccino, Moritz Alexander Kern, Samuel Garcia, Heberto Mayorquin, Joscha Schmiedt, Daniel P. Crepeau, Divyansh Gupta, Nate Dolensek, Peter N. Steinmetz, Philipp Hornauer, Robert Wolff, Jules Lebert, Kyle Johnsen, Ben Dichter, Benjamin Heasly, Baptiste Grimaud, Cody Baker, Fernando J. Chaure, @Filipe, and Matthias Klumpp for their contributions to this release. .. generated with git shortlog --since=2023-02-17 -sne then checking Github for PRs merged since the last release but with commits before then .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+milestone%3A0.13.0+is%3Aclosed .. _`pull requests`: https://github.com/NeuralEnsemble/python-neo/pulls?q=is%3Apr+is%3Aclosed+merged%3A%3E2023-02-17+milestone%3A0.13.0 .. _`latest recommendations`: https://packaging.python.org/en/latest/ .. _black: https://black.readthedocs.io .. _`PyData Sphinx theme`: https://pydata-sphinx-theme.readthedocs.io .. _MED: https://medformat.org .. _different: https://neo.readthedocs.io/en/latest/read_and_analyze.html .. _user: https://neo.readthedocs.io/en/latest/share_data.html .. _needs: https://neo.readthedocs.io/en/latest/use_neo_as_dependency.html ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.13.1.rst0000644000175100001660000000370514743453644017125 0ustar00runnerdocker======================== Neo 0.13.1 release notes ======================== 7th May 2024 This release of Neo contains a lot of improvements to code quality and documentation, still with a focus on the planned 1.0 release, together with, as usual, bug fixes and performance improvements in IO modules. See all `pull requests`_ included in this release and the `list of closed issues`_. Code and documentation quality ------------------------------ Particular thanks go to Zach McKenzie, who has checked, and rewritten if necessary, every docstring in the project, to ensure they all have a consistent style. Zach has also updated and improved the :doc:`../examples/index` in the Sphinx documentation. The Neo code base contained a lot of ``assert``\s that should be exceptions. These have all been replaced with appropriate exceptions (again by Zach McKenzie). A new exception class, :class:`NeoReadWriteError` has been introduced. Bug fixes and improvements in IO modules ---------------------------------------- Bug fixes and/or improvements have been made to :class:`SpikeGLXIO`, :class:`OpenEphysIO`, :class:`SpikeGadgetsIO`, :class:`MaxwellIO`, :class:`AxonIO`, :class:`IntanIO`, :class:`TDTIO`, :class:`NeuralynxIO` and :class:`BlackrockIO`. Acknowledgements ---------------- Thanks to Zach McKenzie, Andrew Davison, Heberto Mayorquin, Alessio Buccino, Samuel Garcia, Peter N. Steinmetz, Aitor Morales-Gregorio, Greg Knoll, Chris Halcrow and Szonja Weigl for their contributions to this release. .. generated with git shortlog --since=2024-02-02 -sne then checking Github for PRs merged since the last release but with commits before then .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+milestone%3A0.13.1+is%3Aclosed .. _`pull requests`: https://github.com/NeuralEnsemble/python-neo/pulls?q=is%3Apr+is%3Aclosed+merged%3A%3E2024-02-02+milestone%3A0.13.1 .. _`examples gallery`: https://neo.readthedocs.io/en/latest/examples/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.13.2.rst0000644000175100001660000000276414743453644017132 0ustar00runnerdocker======================== Neo 0.13.2 release notes ======================== 1st August 2024 This release of Neo contains bug fixes, still with a focus on the planned 1.0 release, along with some performance improvements in IO modules and updates to the CI. See all `pull requests`_ included in this release and the `list of closed issues`_. Continuous Integration ---------------------- Core tests now run on python 3.12. IO tests now run on python 3.9 and python 3.11. Performance Improvements & Code quality --------------------------------------- The imports across the code base were standardized to standard library, 3rd party, and then 1st party for top level imports. Additionally, :code:`neo` import time was improved. Bug fixes and improvements in IO modules ---------------------------------------- Bug fixes and/or improvements have been made to :class:`IntanIO`, :class:`PlexonIO`, :class:`SpikeGadgetsIO`, :class:`NeuralynxIO`, :class:`SpikeGLXIO`, :class:`BlackrockIO`, and :class:`RawBinarySignalRawIO`. Acknowledgements ---------------- Thanks to Heberto Mayorquin, Zach McKenzie, Alessio Buccino, Andrew Davison, Chris Heydrick, Anthony Pinto, Kyu Hun Lee, Téo Lohrer, Tom Donoghue, Xin Niu, and Samuel Garcia for their contributions to this release. .. _`pull requests`: https://github.com/NeuralEnsemble/python-neo/pulls?q=is%3Apr+is%3Aclosed+milestone%3A0.13.2 .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+is%3Aclosed+milestone%3A0.13.2././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.13.3.rst0000644000175100001660000000177014743453644017127 0ustar00runnerdocker======================== Neo 0.13.3 release notes ======================== 28 August 2024 This release of Neo contains bug fixes, still with a focus on the planned 1.0 release, and will be the last release not to support NumPy 2.0. See all `pull requests`_ included in this release and the `list of closed issues`_. Updated dependencies -------------------- Neo has a limit of NumPy >= 1.19.5, < 2.0.0 and Quantities >= 14.0.1, < 0.16.0 Bug fixes and improvements in IO modules ---------------------------------------- Bug fixes and/or improvements have been made to :class:`PlexonIO`, :class:`SpikeGLXIO`, :class:`BiocamIO`. Acknowledgements ---------------- Thanks to Zach McKenzie, Heberto Mayorquin, and Alessio Buccino for their contributions to this release. .. _`pull requests`: https://github.com/NeuralEnsemble/python-neo/pulls?q=is%3Apr+is%3Aclosed+milestone%3A0.13.3 .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+is%3Aclosed+milestone%3A0.13.3././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.13.4.rst0000644000175100001660000001336614743453644017134 0ustar00runnerdocker======================== Neo 0.13.4 release notes ======================== 21 October 2024 This release of Neo contains bug fixes across many IOs, a new IO for :code:`NeuroNexus`, drop of Python 3.8, NumPy 1.20 & 1.21, still with a focus on the planned 1.0 release. Additionally Neo now supports Quantities >=16.1 which brings us closer to support for NumPy 2.0 +. At the :code:`RawIO` level a new :code:`buffer api` has been introduced with the goal of better grouping streams of data together. This is an ongoing effort to provide better access to streams of data that are typically analyzed together without changes to the public API. This point release will be the last release to not support Python 3.13 and NumPy > 2.0. See all `pull requests`_ included in this release and the `list of closed issues`_. Updated dependencies -------------------- Neo has a limit of NumPy >= 1.22.4, < 2.0.0 Neo now supports Python >= 3.9, <3.13 Neo has a limit of Quantities >= 16.1 Neo has a limit of dhn_med_py < 2.0.0 (for reading MED format) Deprecations ------------ As Quantities has dropped support for the :code:`copy` argument when making Quantities arrays to be NumPy 2.0 compatible, the :code:`copy` argument has also been deprecated in all Neo core objects (e.g. :code:`SpikeTrain`, etc.). For this version and the next version the default is now :code:`copy=None`. If :code:`copy=True` or :code:`copy=False` are used an error will be raised. This also means that some functionality for rescaling and dtype conversion, which required :code:`copy=True` are no longer possible. Appropriate errors are raised if the user tries these now impossible behaviors at construction. Additional changes that occurred in Quantities can be viewed at their changelog: https://github.com/python-quantities/python-quantities/blob/master/CHANGES.txt Currently acceptable construction patterns can be found in the Neo test folder: https://github.com/NeuralEnsemble/python-neo/blob/master/neo/test/coretest Many previous behaviors can still be achieved by using additional lines of code, e.g.: .. code-block:: python >>> import quantities as pq >>> import neo # if we want to get a spiketrain in seconds, but we entered our times in ms # we used to be able to autoconvert by specifying units. But now this will # raise an error! >>> times = [1,2,3] * 1 * pq.ms >>> t_stop = 1 * pq.s >>> spiketrain = neo.SpikeTrain(times, t_stop=t_stop, units='s') ValueError: cannot rescale and return view # so instead we need to rescale in a second step >>> spiketrain = neo.SpikeTrain(times, t_stop=t_stop) >>> spiketrain >>> rescaled_spiketrain = spiketrain.rescale('s') >>> rescaled_spiketrain CI Additions/Changes -------------------- Neo has sped up the testing suite by ~15% and added additional testing for IOs: :class:`NeuralynxIO` and :class:`Plexon2IO`. Testing around :code:`copy` was removed from the core testing, since this argument is no longer possible. Addition of a New IO module --------------------------- Neo now has support for reading NeuroNexus :code:`.xdat` files with the new :class:`NeuroNexusIO`. Bug fixes and improvements in IO modules ---------------------------------------- Bug fixes and/or improvements have been made to :class:`MaxwellIO`, :class:`NeuroNexusIO`, :class:`IntanIO`, :class:`Plexon2IO`, :class:`IgorIO`, :class:`SpikeGadgetsIO`, :class:`PlexonIO`, and :class:`BrainVisionRawIO`, and :class:`EDFIO` Buffer API ---------- The motivation for this :code:`RawIO` was that many IOs have buffers of data (memmaps/hdf5) files, which allow for multiple unrelated streams of data to be packaged together. This has led to some inconsistencies in how IOs access streams of data. For example, the :code:`PlexonIO` stores WideBand and Filtered versions of the same data, but the end user likely wouldn't want to analyze them both at the same time as that would be duplication of information. :code:`SpikeGLX` also makes use of a sync channel which is stored with the electrophysiological channels, but should not be analyzed as an ephys channel. The Buffer API will be an ongoing set of PRs at the :code:`RawIO` level to better clarify how data enters and is mapped in Neo versus how the end-user might request streams of data. We hope that this process will allow the end-user better access to the data they want without having unrelated data mixed in. Importantly the public API is not being affected by this process at all. The end-user will still request their desired stream using :code:`stream_index` argument when interacting with a :code:`RawIO`. In this release, each IO was divided into whether it would fit with the buffer api requirements or not and the initial :code:`buffer_id` was applied to all IOs. This step has not changed any behavior in Neo. But the :code:`RawIO.header` information will now have an additional field that will be used in future releases of Neo under-the-hood. We want to emphasize this is not a public API change and over the next version we hope to fully implement this new schema to allow for better interaction with data at the :code:`RawIO` and :code:`IO` levels of Neo. This project has largely been spearheaded by Samuel Garcia and we thank him for his herculean efforts. Acknowledgements ---------------- Thanks to Zach McKenzie, Heberto Mayorquin, Samuel Garcia, Andrew Davison, Alessio Buccino, Nikhil Chandra, and Peter Steinmetz for their contributions to this release. .. _`pull requests`: https://github.com/NeuralEnsemble/python-neo/pulls?q=is%3Apr+is%3Aclosed+milestone%3A0.13.4 .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+is%3Aclosed+milestone%3A0.13.4././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.14.0.rst0000644000175100001660000000321314743453644017117 0ustar00runnerdocker======================== Neo 0.14.0 release notes ======================== 17 January 2025 This release of Neo is now compatible with NumPy 2.0 for core and IOs (with the exception of :class:`MedIO`) as well as Python 3.13, and includes IO bug fixes with an eye toward a 1.0 release. See all `pull requests`_ included in this release and the `list of closed issues`_. Updated dependencies -------------------- Neo now has a limit of NumPy >= 1.22.4 CI Improvements --------------- To ensure compatiblility between pre- and post- NumPy 2.0 the CI was changed to test on the lowest supported Python (3.9) and the highest supported Python (3.13) each with NumPy 1.26 as well as NumPy 2.0 for all :code:`RawIO` and :code:`IO` tests. We also no longer use a cached conda env for testing as we see that there is no speed benefit to caching and we had some issues with the caches getting corrupted. Testing of additional Python-NumPy combinations for core tests were added (NumPy 2.0 and 2.1 with their respective Python versions). Bug fixes and improvements in IO modules ---------------------------------------- Bug fixes and/or improvements have been made to :class:`NeuroNexusIO`, :class:`OpenEphysBinaryIO`, :class:`MicromedIO`, :class:`IntanIO` and :class:`SpikeGLX`. Acknowledgements ---------------- Thanks to Zach McKenzie, Heberto Mayorquin, Andrew Davison, Luigi Petrucco, Alessio Buccino, and Samuel Garcia. .. _`pull requests` : https://github.com/NeuralEnsemble/python-neo/pulls?q=is%3Apr+is%3Aclosed+milestone%3A0.14.0 .. _`list of closed issues` : https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue%20state%3Aclosed%20milestone%3A0.14.0././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.5.0.rst0000644000175100001660000001360714743453644017047 0ustar00runnerdocker======================= Neo 0.5.0 release notes ======================= 22nd March 2017 For Neo 0.5, we have taken the opportunity to simplify the Neo object model. Although this will require an initial time investment for anyone who has written code with an earlier version of Neo, the benefits will be greater simplicity, both in your own code and within the Neo code base, which should allow us to move more quickly in fixing bugs, improving performance and adding new features. More detail on these changes follows: Merging of "single-value" and "array" versions of data classes ============================================================== In previous versions of Neo, we had :class:`AnalogSignal` for one-dimensional (single channel) signals, and :class:`AnalogSignalArray` for two-dimensional (multi-channel) signals. In Neo 0.5.0, these have been merged under the name :class:`AnalogSignal`. :class:`AnalogSignal` has the same behaviour as the old :class:`AnalogSignalArray`. It is still possible to create an :class:`AnalogSignal` from a one-dimensional array, but this will be converted to an array with shape `(n, 1)`, e.g.: .. code-block:: python >>> signal = neo.AnalogSignal([0.0, 0.1, 0.2, 0.5, 0.6, 0.5, 0.4, 0.3, 0.0], ... sampling_rate=10*kHz, ... units=nA) >>> signal.shape (9, 1) Multi-channel arrays are created as before, but using :class:`AnalogSignal` instead of :class:`AnalogSignalArray`: .. code-block:: python >>> signal = neo.AnalogSignal([[0.0, 0.1, 0.2, 0.5, 0.6, 0.5, 0.4, 0.3, 0.0], ... [0.0, 0.2, 0.4, 0.7, 0.9, 0.8, 0.7, 0.6, 0.3]], ... sampling_rate=10*kHz, ... units=nA) >>> signal.shape (9, 2) Similarly, the :class:`Epoch` and :class:`EpochArray` classes have been merged into an array-valued class :class:`Epoch`, ditto for :class:`Event` and :class:`EventArray`, and the :class:`Spike` class, whose main function was to contain the waveform data for an individual spike, has been suppressed; waveform data are now available as the :attr:`waveforms` attribute of the :class:`SpikeTrain` class. Recording channels ================== As a consequence of the removal of "single-value" data classes, information on recording channels and the relationship between analog signals and spike trains is also stored differently. In Neo 0.5, we have introduced a new class, :class:`ChannelIndex`, which replaces both :class:`RecordingChannel` and :class:`RecordingChannelGroup`. In older versions of Neo, a :class:`RecordingChannel` object held metadata about a logical recording channel (a name and/or integer index) together with references to one or more :class:`AnalogSignal`\s recorded on that channel at different points in time (different :class:`Segment`\s); redundantly, the :class:`AnalogSignal` also had a :attr:`channel_index` attribute, which could be used in addition to or instead of creating a :class:`RecordingChannel`. Metadata about :class:`AnalogSignalArray`\s could be contained in a :class:`RecordingChannelGroup` in a similar way, i.e. :class:`RecordingChannelGroup` functioned as an array-valued version of :class:`RecordingChannel`, but :class:`RecordingChannelGroup` could also be used to group together individual :class:`RecordingChannel` objects. With Neo 0.5, information about the channel names and ids of an :class:`AnalogSignal` is contained in a :class:`ChannelIndex`, e.g.: .. code-block:: python >>> signal = neo.AnalogSignal([[0.0, 0.1, 0.2, 0.5, 0.6, 0.5, 0.4, 0.3, 0.0], ... [0.0, 0.2, 0.4, 0.7, 0.9, 0.8, 0.7, 0.6, 0.3]], ... [0.0, 0.1, 0.3, 0.6, 0.8, 0.7, 0.6, 0.5, 0.3]], ... sampling_rate=10*kHz, ... units=nA) >>> channels = neo.ChannelIndex(index=[0, 1, 2], ... channel_names=["chan1", "chan2", "chan3"]) >>> signal.channel_index = channels In this use, it replaces :class:`RecordingChannel`. :class:`ChannelIndex` may also be used to group together a subset of the channels of a multi-channel signal, for example: .. code-block:: python >>> channel_group = neo.ChannelIndex(index=[0, 2]) >>> channel_group.analogsignals.append(signal) >>> unit = neo.Unit() # will contain the spike train recorded from channels 0 and 2. >>> unit.channel_index = channel_group Checklist for updating code from 0.3/0.4 to 0.5 =============================================== To update your code from Neo 0.3/0.4 to 0.5, run through the following checklist: 1. Change all usages of :class:`AnalogSignalArray` to :class:`AnalogSignal`. 2. Change all usages of :class:`EpochArray` to :class:`Epoch`. 3. Change all usages of :class:`EventArray` to :class:`Event`. 4. Where you have a list of (single channel) :class:`AnalogSignal`\s all of the same length, consider converting them to a single, multi-channel :class:`AnalogSignal`. 5. Replace :class:`RecordingChannel` and :class:`RecordingChannelGroup` with :class:`ChannelIndex`. .. note:: in points 1-3, the data structure is still an array, it just has a shorter name. Other changes ============= * added :class:`NixIO` (`about the NIX format`_) * added :class:`IgorIO` * added :class:`NestIO` (for data files produced by the `NEST simulator`_) * :class:`NeoHdf5IO` is now read-only. It will read data files produced by earlier versions of Neo, but another HDF5-based IO, e.g. :class:`NixIO`, should be used for writing data. * many fixes/improvements to existing IO modules. All IO modules should now work with Python 3. .. https://github.com/NeuralEnsemble/python-neo/issues?utf8=✓&q=is%3Aissue%20is%3Aclosed%20created%3A%3E2014-02-01%20 .. _`about the NIX format`: https://github.com/G-Node/nix/wiki .. _`NEST simulator`: https://www.nest-simulator.org/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.5.1.rst0000644000175100001660000000225514743453644017045 0ustar00runnerdocker======================= Neo 0.5.1 release notes ======================= 4th May 2017 * Fixes to :class:`AxonIO` (thanks to @erikli and @cjfraz) and :class:`NeuroExplorerIO` (thanks to Mark Hollenbeck) * Fixes to pickling of :class:`Epoch` and :class:`Event` objects (thanks to Hélissande Fragnaud) * Added methods :meth:`as_array()` and :meth:`as_quantity()` to Neo data objects to simplify the common tasks of turning a Neo data object back into a plain Numpy array * Added :class:`NeuralynxIO`, which reads standard Neuralynx output files in ncs, nev, nse and ntt format (thanks to Julia Sprenger and Carlos Canova). * Added the :attr:`extras_require` field to setup.py, to clearly document the requirements for different io modules. For example, this allows you to run :command:`pip install neo[neomatlabio]` and have the extra dependency needed for the :mod:`neomatlabio` module (scipy in this case) be automatically installed. * Fixed a bug where slicing an :class:`AnalogSignal` did not modify the linked :class:`ChannelIndex`. (Full `list of closed issues`_) .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+milestone%3A0.5.1+is%3Aclosed ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.5.2.rst0000644000175100001660000000151314743453644017042 0ustar00runnerdocker======================= Neo 0.5.2 release notes ======================= 27th September 2017 * Removed support for Python 2.6 * Pickling :class:`AnalogSignal` and :class:`SpikeTrain` now preserves parent objects * Added NSDFIO, which reads and writes NSDF files * Fixes and improvements to PlexonIO, NixIO, BlackrockIO, NeuralynxIO, IgorIO, ElanIO, MicromedIO, TdtIO and others. Thanks to Michael Denker, Achilleas Koutsou, Mieszko Grodzicki, Samuel Garcia, Julia Sprenger, Andrew Davison, Rohan Shah, Richard C Gerkin, Mieszko Grodzicki, Mikkel Elle Lepperød, Joffrey Gonin, Hélissande Fragnaud, Elodie Legouée and Matthieu Sénoville for their contributions to this release. (Full `list of closed issues`_) .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+milestone%3A0.5.2+is%3Aclosed ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.6.0.rst0000644000175100001660000000366514743453644017053 0ustar00runnerdocker======================= Neo 0.6.0 release notes ======================= 23rd March 2018 Major changes: * Introduced :mod:`neo.rawio`: a low-level reader for various data formats * Added continuous integration for all IOs using CircleCI (previously only :mod:`neo.core` was tested, using Travis CI) * Moved the test file repository to https://gin.g-node.org/NeuralEnsemble/ephy_testing_data - this makes it easier for people to contribute new files for testing. Other important changes: * Added :func:`time_index()` and :func:`splice()` methods to :class:`AnalogSignal` * IO fixes and improvements: Blackrock, TDT, Axon, Spike2, Brainvision, Neuralynx * Implemented `__deepcopy__` for all data classes * New IO: BCI2000 * Lots of PEP8 fixes! * Implemented `__getitem__` for :class:`Epoch` * Removed "cascade" support from all IOs * Removed lazy loading except for IOs based on rawio * Marked lazy option as deprecated * Added :func:`time_slice` in read_segment() for IOs based on rawio * Made :attr:`SpikeTrain.times` return a :class:`Quantity` instead of a :class:`SpikeTrain` * Raise a :class:`ValueError` if ``t_stop`` is earlier than ``t_start`` when creating an empty :class:`SpikeTrain` * Changed filter behaviour to return all objects if no filter parameters are specified * Fix pickling/unpickling of :class:`Events` Deprecated IO classes: * :class:`KlustaKwikIO` (use :class:`KwikIO` instead) * :class:`PyNNTextIO`, :class:`PyNNNumpyIO` (Full `list of closed issues`_) Thanks to Björn Müller, Andrew Davison, Achilleas Koutsou, Chadwick Boulay, Julia Sprenger, Matthieu Senoville, Michael Denker and especially Samuel Garcia for their contributions to this release. .. note:: version 0.6.1 was released immediately following 0.6.0 to fix a minor problem with the documentation. .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+milestone%3A0.6.0+is%3Aclosed ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.7.0.rst0000644000175100001660000000203214743453644017037 0ustar00runnerdocker======================= Neo 0.7.0 release notes ======================= 26th November 2018 Main added features: * array annotations Other features: * `Event.to_epoch()` * Change the behaviour of `SpikeTrain.__add__` and `SpikeTrain.__sub__` * bug fix for `Epoch.time_slice()` New IO classes: * RawMCSRawIO (raw multi channel system file format) * OpenEphys format * Intanrawio (both RHD and RHS) * AxographIO Many bug fixes and improvements in IO: * AxonIO * WinWCPIO * NixIO * ElphyIO * Spike2IO * NeoMatlab * NeuralynxIO * BlackrockIO (V2.3) * NixIO (rewritten) Removed: * PyNNIO (Full `list of closed issues`_) Thanks to Achilleas Koutsou, Andrew Davison, Björn Müller, Chadwick Boulay, erikli, Jeffrey Gill, Julia Sprenger, Lucas (lkoelman), Mark Histed, Michael Denker, Mike Sintsov, Samuel Garcia, Scott W Harden and William Hart for their contributions to this release. .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+milestone%3A0.7.0+is%3Aclosed ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.7.1.rst0000644000175100001660000000063314743453644017045 0ustar00runnerdocker======================= Neo 0.7.1 release notes ======================= 13th December 2019 * Add alias `duplicate_with_new_array` for `duplicate_with_new_data`, for backwards compatibility * Update `NeuroshareapiIO` and `NeurosharectypesIO` to Neo 0.6 * Create basic and compatibility test for `nixio_fr` Thanks to Chek Yin Choi, Andrew Davison and Julia Sprenger for their contributions to this release. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.7.2.rst0000644000175100001660000000042114743453644017041 0ustar00runnerdocker======================= Neo 0.7.2 release notes ======================= 10th July 2019 New RawIO class: * AxographRawIO Bug fixes: * Various CI fixes Thanks to Andrew Davison, Samuel Garcia, Jeffrey Gill and Julia Sprenger for their contributions to this release. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.8.0.rst0000644000175100001660000001101514743453644017041 0ustar00runnerdocker======================= Neo 0.8.0 release notes ======================= 30th September 2019 Lazy loading ------------ Neo 0.8 sees a major new feature, the ability to selectively load only parts of a data file (for supported file formats) into memory, for example only a subset of the signals in a segment, a subset of the channels in a signal, or even only a certain time slice of a given signal. This can lead to major savings in time and memory consumption, or can allow files that are too large to be loaded into memory in their entirety to be processed one section at a time. Here is an example, loading only certain sections of a signal:: lim0, lim1 = -500*pq.ms, +1500*pq.ms seg = reader.read_segment(lazy=True) # this loads only the segment structure and metadata # but all data objects are replaced by proxies triggers = seg.events[0].load() # this loads all triggers in memory sigproxy = seg.analogsignals[0] # this is a proxy object all_sig_chunks = [] for t in triggers.times: t0, t1 = (t + lim0), (t + lim1) sig_chunk = sigproxy.load(time_slice=(t0, t1)) # here the actual data are loaded all_sig_chunks.append(sig_chunk) Not all IO modules support lazy loading (but many do). To know whether a given IO class supports lazy mode, use ``SomeIO.support_lazy``. For more details, see :ref:`section-performance-memory`. Image sequence data ------------------- Another new feature, although one that is more experimental, is support for image sequence data, coming from calcium imaging of neuronal activity, voltage-sensitive dye imaging, etc. The new :class:`ImageSequence` object contains a sequence of image frames as a 3D array. As with other Neo data objects, the object also holds metadata such as the sampling rate/frame duration and the spatial scale (physical size represented by one pixel). Three new IO modules, :class:`TiffIO`, :class:`AsciiImageIO` and :class:`BlkIO`, allow reading such data from file, e.g.:: from quantities import Hz, mm, dimensionless from neo.io import TiffIO data = TiffIO(data_path).read(units=dimensionless, sampling_rate=25 * Hz, spatial_scale=0.05 * mm) images = data[0].segments[0].imagesequences[0] :class:`ImageSequence` is a subclass of the NumPy :class:`ndarray`, and so can be manipulated in the same ways, e.g.:: images /= images.max() background = np.mean(images, axis=0) preprocessed_images = images - background Since a common operation with image sequences is to extract time series from regions of interest, Neo also provides various region-of-interest classes which perform this operation, returning an :class:`AnalogSignal` object:: roi = CircularRegionOfInterest(x=50, y=50, radius=10) signal = preprocessed_images.signal_from_region(roi)[0] Other new features ------------------ * new neo.utils module * Numpy 1.16+ compatibility * :meth:`time_shift()` method for :class:`Epoch`/:class:`Event`/:class:`AnalogSignal` * :meth:`time_slice()` method is now more robust * dropped support for Python 3.4 See all `pull requests`_ included in this release and the `list of closed issues`_. Bug fixes and improvements in IO modules ---------------------------------------- * Blackrock * Neuroshare * NixIOFr * NixIO (array annotation + 1d coordinates) * AsciiSignal (fix + json metadata + IrregularlySampledSignals + write proxy) * Spike2 (group same sampling rate) * Brainvision * NeuralynxIO .. Warning:: Some IOs (based on rawio) when loading can choose to split each channel into its own 1-channel :class:`AnalogSignal` or to group them in a multi-channel :class:`AnalogSignal`. The default behavior (either ``signal_group_mode='split-all'`` or ``'group-same-units'``) is not the same for all IOs for backwards compatibility reasons. In the next release, all IOs will have the default ``signal_group_mode='group-same-units'`` Acknowledgements ---------------- Thanks to Achileas Koutsou, Chek Yin Choi, Richard C. Gerkin, Hugo van Kemenade, Alexander Kleinjohann, Björn Müller, Jeffrey Gill, Christian Kothe, Mike Sintsov, @rishidhingra, Michael Denker, Julia Sprenger, Corentin Fragnaud, Andrew Davison and Samuel Garcia for their contributions to this release. .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+milestone%3A0.8.0+is%3Aclosed .. _`pull requests`: https://github.com/NeuralEnsemble/python-neo/pulls?q=is%3Apr+is%3Aclosed+merged%3A%3E2018-11-27+milestone%3A0.8.0././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases/0.9.0.rst0000644000175100001660000002357114743453644017054 0ustar00runnerdocker======================= Neo 0.9.0 release notes ======================= 10th November 2020 Group and ChannelView replace Unit and ChannelIndex --------------------------------------------------- Experience with :class:`ChannelIndex` and :class:`Unit` has shown that these classes are often confusing and difficult to understand. In particular, :class:`ChannelIndex` was trying to provide three different functionalities in a single object: - providing information about individual traces within :class:`AnalogSignals` like the channel id and the channel name (labelling) - grouping a subset of traces within an :class:`AnalogSignal` via the ``index`` attribute (masking) - linking between / grouping :class:`AnalogSignals` (grouping) while grouping :class:`SpikeTrains` required a different class, :class:`Unit`. For more pointers to the difficulties this created, and some of the limitations of this approach, see `this Github issue`_. With the aim of making the three functionalities of labelling, masking and grouping both easier to use and more flexible, we have replaced :class:`ChannelIndex` and :class:`Unit` with: - array annotations (*labelling*) - already available since Neo 0.8 - :class:`~neo.core.ChannelView` (*masking*) - defines subsets of channels within an `AnalogSignal` using a mask - :class:`~neo.core.Group` (*grouping*) - allows any Neo object except :class`Segment` and :class:`Block` to be grouped For some guidance on migrating from :class:`ChannelIndex`/:class:`Unit` to :class:`Group` and :class:`ChannelView` see the appendix at the bottom of this page. Python 3 only ------------- We have now dropped support for Python 2.7 and Python 3.5, and for versions of NumPy older than 1.13. In future, we plan to follow NEP29_ + one year, i.e. we will support Python and NumPy versions for one year longer than recommended in NEP29. This was `discussed here`_. Change in default behaviour for grouping channels in IO modules --------------------------------------------------------------- Previously, when reading multiple related signals (same length, same units) from a file, some IO classes would by default create a separate, single-channel :class:`AnalogSignal` per signal, others would combine all related signals into one multi-channel :class:`AnalogSignal`. From Neo 0.9.0, the default for all IO classes is to create a one multi-channel :class:`AnalogSignal`. To get the "multiple single-channel signals" behaviour, use:: io.read(signal_group_mode="split-all") Other new or modified features ------------------------------ * added methods :func:`rectify()`, :func:`downsample` and :func:`resample` to :class:`AnalogSignal` * :func:`SpikeTrain.merge()` can now merge multiple spiketrains * the utility function :func:`cut_block_by_epochs()` gives a new :class:`Block` now rather than modifying the block in place * some missing properties such as ``t_start`` were added to :class:`ImageSequence`, and ``sampling_period`` was renamed to ``frame_duration`` * :func:`AnalogSignal.time_index()` now accepts arrays of times, not just a scalar. See all `pull requests`_ included in this release and the `list of closed issues`_. Bug fixes and improvements in IO modules ---------------------------------------- * NeoMatlabIO (support for signal annotations) * NeuralynxIO (fix handling of empty .nev files) * AxonIO (support EDR3 header, fix channel events bug) * Spike2IO (fix rounding problem, fix for v9 SON files) * MicromedIO (fix label encoding) Acknowledgements ---------------- Thanks to Julia Sprenger, Samuel Garcia, Andrew Davison, Alexander Kleinjohann, Hugo van Kemenade, Achilleas Koutsou, Jeffrey Gill, Corentin Fragnaud, Aitor Morales-Gregorio, Rémi Proville, Robin Gutzen, Marin Manuel, Simon Danner, Michael Denker, Peter N. Steinmetz, Diziet Asahi and Lucien Krapp for their contributions to this release. Appendix: Migrating from ChannelIndex/Unit to ChannelView/Group =============================================================== While the basic hierarchical :class:`Block` - :class:`Segment` structure of Neo has remained unchanged since the inception of Neo, the structures used to cross-link objects (for example to link a signal to the spike trains derived from it) have undergone changes, in an effort to find an easily understandable and usable approach. Below we give some examples of how to migrate from :class:`ChannelIndex` and :class:`Unit`, as used in Neo 0.8, to the new classes :class:`Group` and :class:`ChannelView` introduced in Neo 0.9. Note that Neo 0.9 supports the new and old API in parallel, to facilitate migration. IO classes in Neo 0.9 can read :class:`ChannelIndex` and :class:`Unit` objects, but do not write them. :class:`ChannelIndex` and :class:`Unit` will be removed in Neo 0.10.0. Examples -------- A simple example with two tetrodes. Here the :class:`ChannelIndex` was not being used for grouping, simply to associate a name with each channel. Using :class:`ChannelIndex`:: import numpy as np from quantities import kHz, mV from neo import Block, Segment, ChannelIndex, AnalogSignal block = Block() segment = Segment() segment.block = block block.segments.append(segment) for i in (0, 1): signal = AnalogSignal(np.random.rand(1000, 4) * mV, sampling_rate=1 * kHz,) segment.analogsignals.append(signal) chx = ChannelIndex(name=f"Tetrode #{i + 1}", index=[0, 1, 2, 3], channel_names=["A", "B", "C", "D"]) chx.analogsignals.append(signal) block.channel_indexes.append(chx) Using array annotations, we annotate the channels of the :class:`AnalogSignal` directly:: import numpy as np from quantities import kHz, mV from neo import Block, Segment, AnalogSignal block = Block() segment = Segment() segment.block = block block.segments.append(segment) for i in (0, 1): signal = AnalogSignal(np.random.rand(1000, 4) * mV, sampling_rate=1 * kHz, channel_names=["A", "B", "C", "D"]) segment.analogsignals.append(signal) Now a more complex example: a 1x4 silicon probe, with a neuron on channels 0,1,2 and another neuron on channels 1,2,3. We create a :class:`ChannelIndex` for each neuron to hold the :class:`Unit` object associated with this spike sorting group. Each :class:`ChannelIndex` also contains the list of channels on which that neuron spiked. :: import numpy as np from quantities import ms, mV, kHz from neo import Block, Segment, ChannelIndex, Unit, SpikeTrain, AnalogSignal block = Block(name="probe data") segment = Segment() segment.block = block block.segments.append(segment) # create 4-channel AnalogSignal with dummy data signal = AnalogSignal(np.random.rand(1000, 4) * mV, sampling_rate=10 * kHz) # create spike trains with dummy data # we will pretend the spikes have been extracted from the dummy signal spiketrains = [ SpikeTrain(np.arange(5, 100) * ms, t_stop=100 * ms), SpikeTrain(np.arange(7, 100) * ms, t_stop=100 * ms) ] segment.analogsignals.append(signal) segment.spiketrains.extend(spiketrains) # assign each spiketrain to a neuron (Unit) units = [] for i, spiketrain in enumerate(spiketrains): unit = Unit(name=f"Neuron #{i + 1}") unit.spiketrains.append(spiketrain) units.append(unit) # create a ChannelIndex for each unit, to show which channels the spikes come from chx0 = ChannelIndex(name="Channel Group 1", index=[0, 1, 2]) chx0.units.append(units[0]) chx0.analogsignals.append(signal) units[0].channel_index = chx0 chx1 = ChannelIndex(name="Channel Group 2", index=[1, 2, 3]) chx1.units.append(units[1]) chx1.analogsignals.append(signal) units[1].channel_index = chx1 block.channel_indexes.extend((chx0, chx1)) Using :class:`ChannelView` and :class:`Group`:: import numpy as np from quantities import ms, mV, kHz from neo import Block, Segment, ChannelView, Group, SpikeTrain, AnalogSignal block = Block(name="probe data") segment = Segment() segment.block = block block.segments.append(segment) # create 4-channel AnalogSignal with dummy data signal = AnalogSignal(np.random.rand(1000, 4) * mV, sampling_rate=10 * kHz) # create spike trains with dummy data # we will pretend the spikes have been extracted from the dummy signal spiketrains = [ SpikeTrain(np.arange(5, 100) * ms, t_stop=100 * ms), SpikeTrain(np.arange(7, 100) * ms, t_stop=100 * ms) ] segment.analogsignals.append(signal) segment.spiketrains.extend(spiketrains) # assign each spiketrain to a neuron (now using Group) units = [] for i, spiketrain in enumerate(spiketrains): unit = Group([spiketrain], name=f"Neuron #{i + 1}") units.append(unit) # create a ChannelView of the signal for each unit, to show which channels the spikes come from # and add it to the relevant Group view0 = ChannelView(signal, index=[0, 1, 2], name="Channel Group 1") units[0].add(view0) view1 = ChannelView(signal, index=[1, 2, 3], name="Channel Group 2") units[1].add(view1) block.groups.extend(units) Now each putative neuron is represented by a :class:`Group` containing the spiketrains of that neuron and a view of the signal selecting only those channels from which the spikes were obtained. .. _`list of closed issues`: https://github.com/NeuralEnsemble/python-neo/issues?q=is%3Aissue+milestone%3A0.9.0+is%3Aclosed .. _`pull requests`: https://github.com/NeuralEnsemble/python-neo/pulls?q=is%3Apr+is%3Aclosed+merged%3A%3E2019-09-30+milestone%3A0.9.0 .. _NEP29: https://numpy.org/neps/nep-0029-deprecation_policy.html .. _`discussed here`: https://github.com/NeuralEnsemble/python-neo/issues/788 .. _`this Github issue`: https://github.com/NeuralEnsemble/python-neo/issues/456 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/releases.rst0000644000175100001660000000537014743453644016405 0ustar00runnerdocker============= Release notes ============= .. toctree:: :maxdepth: 1 releases/0.14.0.rst releases/0.13.4.rst releases/0.13.3.rst releases/0.13.2.rst releases/0.13.1.rst releases/0.13.0.rst releases/0.12.0.rst releases/0.11.1.rst releases/0.11.0.rst releases/0.10.2.rst releases/0.10.1.rst releases/0.10.0.rst releases/0.9.0.rst releases/0.8.0.rst releases/0.7.2.rst releases/0.7.1.rst releases/0.7.0.rst releases/0.6.0.rst releases/0.5.2.rst releases/0.5.1.rst releases/0.5.0.rst .. releases/0.2.0.rst .. releases/0.2.1.rst .. releases/0.3.0.rst .. releases/0.3.1.rst .. releases/0.3.2.rst .. releases/0.3.3.rst Version 0.4.0 ------------- * added StimfitIO * added KwikIO * significant improvements to AxonIO, BlackrockIO, BrainwareSrcIO, NeuroshareIO, PlexonIO, Spike2IO, TdtIO, * many test suite improvements * Container base class Version 0.3.3 ------------- * fix a bug in PlexonIO where some EventArrays only load 1 element. * fix a bug in BrainwareSrcIo for segments with no spikes. Version 0.3.2 ------------- * cleanup of io test code, with additional helper functions and methods * added BrainwareDamIo * added BrainwareF32Io * added BrainwareSrcIo Version 0.3.1 ------------- * lazy/cascading improvement * load_lazy_olbject() in neo.io added * added NeuroscopeIO Version 0.3.0 ------------- * various bug fixes in neo.io * added ElphyIO * SpikeTrain performance improved * An IO class now can return a list of Block (see read_all_blocks in IOs) * python3 compatibility improved Version 0.2.1 ------------- * assorted bug fixes * added :func:`time_slice()` method to the :class:`SpikeTrain` and :class:`AnalogSignalArray` classes. * improvements to annotation data type handling * added PickleIO, allowing saving Neo objects in the Python pickle format. * added ElphyIO (see http://neuro-psi.cnrs.fr/spip.php?article943) * added BrainVisionIO (see https://brainvision.com/) * improvements to PlexonIO * added :func:`merge()` method to the :class:`Block` and :class:`Segment` classes * development was mostly moved to GitHub, although the issue tracker is still at neuralensemble.org/neo Version 0.2.0 ------------- New features compared to Neo 0.1: * new schema more consistent. * new objects: RecordingChannelGroup, EventArray, AnalogSignalArray, EpochArray * Neuron is now Unit * use the quantities_ module for everything that can have units. * Some objects directly inherit from Quantity: SpikeTrain, AnalogSignal, AnalogSignalArray, instead of having an attribute for data. * Attributes are classified in 3 categories: necessary, recommended, free. * lazy and cascade keywords are added to all IOs * Python 3 support * better tests .. _quantities: https://pypi.org/project/quantities/ ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1304154 neo-0.14.0/doc/source/scripts/0000755000175100001660000000000014743453656015535 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/scripts/multi_tetrode_example.py0000644000175100001660000000645714743453644022513 0ustar00runnerdocker""" Example for usecases.rst """ from itertools import cycle import numpy as np from quantities import ms, mV, kHz import matplotlib.pyplot as plt from neo import Block, Segment, ChannelView, Group, SpikeTrain, AnalogSignal store_signals = False block = Block(name="probe data", tetrode_ids=["Tetrode #1", "Tetrode #2"]) block.segments = [ Segment(name="trial #1", index=0), Segment(name="trial #2", index=1), Segment(name="trial #3", index=2), ] n_units = {"Tetrode #1": 2, "Tetrode #2": 5} # Create a group for each neuron, annotate each group with the tetrode from which it was recorded groups = [] counter = 0 for tetrode_id, n in n_units.items(): groups.extend([Group(name=f"neuron #{counter + i + 1}", tetrode_id=tetrode_id) for i in range(n)]) counter += n block.groups.extend(groups) iter_group = cycle(groups) # Create dummy data, one segment at a time for segment in block.segments: # create two 4-channel AnalogSignals with dummy data signals = { "Tetrode #1": AnalogSignal(np.random.rand(1000, 4) * mV, sampling_rate=10 * kHz, tetrode_id="Tetrode #1"), "Tetrode #2": AnalogSignal(np.random.rand(1000, 4) * mV, sampling_rate=10 * kHz, tetrode_id="Tetrode #2"), } if store_signals: segment.analogsignals.extend(signals.values()) # create spike trains with dummy data # we will pretend the spikes have been extracted from the dummy signal for tetrode_id in ("Tetrode #1", "Tetrode #2"): for i in range(n_units[tetrode_id]): spiketrain = SpikeTrain(np.random.uniform(0, 100, size=30) * ms, t_stop=100 * ms) # assign each spiketrain to the appropriate segment segment.spiketrains.append(spiketrain) # assign each spiketrain to a given neuron current_group = next(iter_group) current_group.add(spiketrain) if store_signals: # add to the group a reference to the signal from which the spikes were obtained # this does not give a 1:1 correspondance between spike trains and signals, # for that we could use additional groups (and have groups of groups) current_group.add(signals[tetrode_id]) # Now plot the data # .. by trial plt.figure() for seg in block.segments: print(f"Analyzing segment {seg.index}") stlist = [st - st.t_start for st in seg.spiketrains] plt.subplot(len(block.segments), 1, seg.index + 1) count, bins = np.histogram(stlist) plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title(f"PSTH in segment {seg.index}") plt.show() # ..by neuron plt.figure() for i, group in enumerate(block.groups): stlist = [st - st.t_start for st in group.spiketrains] plt.subplot(len(block.groups), 1, i + 1) count, bins = np.histogram(stlist) plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title(f"PSTH of unit {group.name}") plt.show() # ..by tetrode plt.figure() for i, tetrode_id in enumerate(block.annotations["tetrode_ids"]): stlist = [] for unit in block.filter(objects=Group, tetrode_id=tetrode_id): stlist.extend([st - st.t_start for st in unit.spiketrains]) plt.subplot(2, 1, i + 1) count, bins = np.histogram(stlist) plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title(f"PSTH blend of tetrode {tetrode_id}") plt.show() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/scripts/spike_sorting_example.py0000644000175100001660000000236314743453644022503 0ustar00runnerdocker""" Example for usecases.rst """ import numpy as np from neo import Segment, AnalogSignal, SpikeTrain, Group, ChannelView from quantities import Hz # generate some fake data seg = Segment() seg.analogsignals.append( AnalogSignal( [ [0.1, 0.1, 0.1, 0.1], [-2.0, -2.0, -2.0, -2.0], [0.1, 0.1, 0.1, 0.1], [-0.1, -0.1, -0.1, -0.1], [-0.1, -0.1, -0.1, -0.1], [-3.0, -3.0, -3.0, -3.0], [0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.1, 0.1], ], sampling_rate=1000 * Hz, units="V", ) ) # extract spike trains from all channels st_list = [] for signal in seg.analogsignals: # use a simple threshhold detector spike_mask = np.where(np.min(signal.magnitude, axis=1) < -1.0)[0] # create a spike train spike_times = signal.times[spike_mask] st = SpikeTrain(spike_times, t_start=signal.t_start, t_stop=signal.t_stop) # remember the spike waveforms wf_list = [] for spike_idx in np.nonzero(spike_mask)[0]: wf_list.append(signal[spike_idx - 1 : spike_idx + 2, :]) st.waveforms = np.array(wf_list) st_list.append(st) unit = Group() unit.spiketrains = st_list unit.analogsignals.extend(seg.analogsignals) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/share_data.rst0000644000175100001660000002134114743453644016671 0ustar00runnerdocker=========================================== Sharing neuroscience data in an open format =========================================== .. FAIR, advantages of open formats .. data from other formats, or from simulations When sharing data and metadata, it is important to consider the `FAIR guiding principles`_. Among these principles are *interoperability* and *reusability*, which include the idea that data and metadata should be stored in a format that can be read by many different tools, and should be thoroughly annotated with metadata. In neurophysiology, a large fraction of experimental data are obtained using commercial setups with dedicated software, which stores data in a proprietary format. While Neo can help greatly in being able to read many proprietary formats, (i) not everyone uses Python, and (ii) many metadata of interest cannot be contained in these formats, and metadata labels do not in general use standardised terminologies. Conversely, data from neuroscience simulations *are* often stored in open formats, such as plain text files or HDF5, but with considerable variability between users and little or no standardisation. It is therefore advantageous to convert to, or write data directly in, an open format that conforms to FAIR principles. Neo supports two such formats: - `NIX`_ - `Neurodata Without Borders (NWB)`_ Example ======= Before getting into the details of the formats, we present an example dataset that will be used to demonstrate the process of converting to open formats. Our example is a public dataset, "`Whole cell patch-clamp recordings of cerebellar granule cells`_", contributed to the EBRAINS_ repository by Marialuisa Tognolina from the laboratory of Egidio D'Angelo at the University of Pavia. As we can see from the dataset description, *This dataset provides a characterization of the intrinsic excitability and synaptic properties of the cerebellar granule cells. Whole-cell patch-clamp recordings were performed on acute parasagittal cerebellar slices obtained from juvenile Wistar rats (p18-p24). Passive granule cells parameters were extracted in voltage-clamp mode by analyzing current relaxation induced by step voltage changes (IV protocol). Granule cells intrinsic excitability was investigated in current-clamp mode by injecting 2 s current steps (CC step protocol). Synaptic transmission properties were investigated in current clamp mode by an electrical stimulation of the mossy fibers bundle (5 pulses at 50 Hz, EPSP protocol).* The dataset contains recordings from multiple subjects. For this example. let's download the data for Subject 15. You can download them by hand, by selecting each file then selecting "Download file", or run the following code: .. ipython:: In [1]: from urllib.request import urlretrieve In [2]: from urllib.parse import quote In [3]: dataset_url = "https://object.cscs.ch/v1/AUTH_63ea6845b1d34ad7a43c8158d9572867/hbp-d000017_PatchClamp-GranuleCells_pub" In [4]: folder = "GrC_Subject15_180116" In [5]: filenames = ["180116_0004 IV -70.abf", "180116_0005 CC step.abf", "180116_0006 EPSP.abf"] In [6]: for filename in filenames: ...: datafile_url = f"{dataset_url}/{folder}/{quote(filename)}" ...: local_file = urlretrieve(datafile_url, filename) Let's start with the current-clamp data. The data are in Axon format (suffix ".abf"), so we could import :class:`~neo.io.AxonIO` directly, but we can also ask Neo to guess the format using the :func:`get_io()` function: .. ipython:: In [7]: from neo.io import get_io In [8]: reader = get_io("180116_0005 CC step.abf") In [9]: data = reader.read() In [10]: data Out[10]: We can see that the file contains a single :class:`Block`, containing 15 :class:`Segments`, and each segment contains one :class:`AnalogSignal` with a single channel, and an :class:`Event`. .. note: the events are essentially empty To quickly take a look at the data, let's plot it: .. ipython:: In [11]: import matplotlib.pyplot as plt In [12]: fig = plt.figure(figsize=(10, 5)) In [13]: for segment in data[0].segments: ....: signal = segment.analogsignals[0] ....: plt.plot(signal.times, signal) In [14]: plt.xlabel(f"Time ({signal.times.units.dimensionality.string})") In [15]: plt.ylabel(f"Voltage ({signal.units.dimensionality.string})") In [16]: plt.savefig("open_format_example_cc_step.png") .. image:: open_format_example_cc_step.png Now we've read the data into Neo, we're ready to write them to an open format. NIX === The `NIX data model`_ allows storing a fully annotated scientific dataset, i.e. the data together with its metadata, within a single container. The current implementations use the HDF5 file format as a storage backend. For users of Neo, the advantage of NIX is that all Neo objects can be stored in an open format, HDF5, readable with many different tools, without needing to add extra annotations or structure the dataset in any specific way. Using Neo's :class:`~neo.io.NIXIO` requires some additional dependencies. To install Neo with NIXIO support, run:: $ pip install neo[nixio] Writing our example dataset to NIX format is straightforward: .. ipython:: In [17]: from neo.io import NixIO In [18]: writer = NixIO("GrC_Subject15_180116.nix", mode="ow") In [19]: writer.write(data) Neurodata Without Borders (NWB) =============================== `Neurodata Without Borders`_ (NWB:N) is an open standard file format for neurophysiology. Using Neo's :class:`~neo.io.NWBIO` requires some additional dependencies. To install Neo with NWB support, run:: $ pip install neo[nwb] :class:`NWBIO` can read NWB 2.0-format files, and maps their structure onto Neo objects and annotations. :class:`NWBIO` can also write to NWB 2.0 format. Since NWB has a more complex structure than Neo's basic :class:`Block` - :class:`Segment` hierarchy, and NWB requires fairly extensive metadata, it is recommended to annotate the Neo objects with special, NWB-specific annotations, to ensure data and metadata are correctly placed within the NWB file. The location of data stored in an NWB file depends on the source of the data, e.g. whether they are stimuli, intracellular electrophysiology recordings, extracellular electrophysiology recordings, behavioural measuremenets, etc. For this, we need to annotate all data objects with special metadata, identified by keys starting with "``nwb_``": .. ipython:: In [20]: signal_metadata = { ....: "nwb_group": "acquisition", ....: "nwb_neurodata_type": ("pynwb.icephys", "PatchClampSeries"), ....: "nwb_electrode": { ....: "name": "patch clamp electrode", ....: "description": "The patch-clamp pipettes were pulled from borosilicate glass capillaries " ....: "(Hilgenberg, Malsfeld, Germany) and filled with intracellular solution " ....: "(K-gluconate based solution)", ....: "device": { ....: "name": "patch clamp electrode" ....: } ....: }, ....: "nwb:gain": 1.0 ....: } In [21]: for segment in data[0].segments: ....: signal = segment.analogsignals[0] ....: signal.annotate(**signal_metadata) We can also provide global metadata, either attaching them to a Neo :class:`Block` or passing them to the :func:`write()` method. Here we take metadata from the dataset description on the EBRAINS search portal: .. ipython:: In [22]: global_metadata = { ....: "session_start_time": data[0].rec_datetime, ....: "identifier": data[0].file_origin, ....: "session_id": "180116_0005", ....: "institution": "University of Pavia", ....: "lab": "D'Angelo Lab", ....: "related_publications": "https://doi.org/10.1038/s42003-020-0953-x" ....: } Now that we have annotated our dataset, we can write it to an NWB file: .. ipython:: :okwarning: In [23]: from neo.io import NWBIO In [24]: writer = NWBIO("GrC_Subject15_180116.nwb", mode="w", **global_metadata) In [25]: writer.write(data) .. note:: Neo support for NWB is a work-in-progress, it does not currently support NWB extensions for example. If you encounter a problem reading an NWB file with Neo, please make a `bug report`_ (see :doc:`bug_reports`). .. _`Neurodata Without Borders`: https://www.nwb.org .. _`bug report`: https://github.com/NeuralEnsemble/python-neo/issues/new .. _`Whole cell patch-clamp recordings of cerebellar granule cells`: https://doi.org/10.25493/CHJG-7QC .. _EBRAINS: https://ebrains.eu/services/data-and-knowledge/ .. _`NIX data model`: https://nixpy.readthedocs.io/ .. _`FAIR guiding principles`: https://doi.org/10.1038/sdata.2016.18././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/doc/source/use_neo_as_dependency.rst0000644000175100001660000000701414743453644021115 0ustar00runnerdocker============================= Using Neo in a library or app ============================= .. Neo as a common layer for interoperability The main goal of Neo is to act as an interoperability layer for any software that deals with neurophysiology or optical imaging data, whether recorded experimentally or generated by simulations. Any software that uses the Neo object model as its internal representation, or which can import/export its internal data structures from/to Neo, will be automatically compatible with all other software that does the same. The following figure shows the Neo ecosystem: the Neo core classes, the IO modules, and some of the software tools built on top of Neo. .. image:: images/neo_ecosystem.svg To see more of the tools built on Neo, see the Github `dependency graph`_. At the time of writing, Github records 394 repositories that depend on Neo, of which 55 publish their own Python packages. Dependability ============= .. dependability - stable, community development, link to governance, continuous integration, testing library If you're using Neo as a key dependency for your project, you need to be confident that Neo is a stable base to build on. Here are some of the factors you might consider: **API stability** Neo was first released in 2010. Since then we have been gradually refining and updating the object model, based on experience in real-world projects, and feedback from users. Any changes that will break users' code are introduced gradually, with deprecation warnings. We are getting close to releasing version 1.0, at which point we expect to maintain backwards-compatibility. **Testing and continuous integration** Neo has an extensive test suite; we use Github Actions to run the tests whenever the code is changed. As part of this, we maintain an `open repository of data files`_ for all the formats Neo supports, which we use for our own tests and make available to others. **Community** Neo uses a community development model, with defined rules of :doc:`governance` under which frequent contributors can become maintainers, and a `code of conduct`_. This community model means that Neo does not rely on any one source of funding. **Licencing** Neo is open source software, available under a permissive BSD-3-clause `licence`_. Performance =========== .. low-level data reading - the RawIO layer (see rawio.rst) With the increasing quantities of data that can be generated by modern recording methods and by large-scale simulations, performance, in terms of both speed and memory consumption, is highly important. Neo has multiple optimizations to reduce import time, minimise the overhead due to using Neo objects rather than plain NumPy arrays, and minimize memory footprint. For using Neo as a dependency in another library of app, it is important to be aware of the "raw" IO layer, which exposes a low-level read-only API based only on dictionaries and NumPy buffers. Available for a large subset of the file formats Neo supports, the :mod:`neo.rawio` module provide much of the benefit of Neo's multiple file-format support without needing to use the Neo object model. For more details, see :doc:`rawio`. .. _`dependency graph`: https://github.com/NeuralEnsemble/python-neo/network/dependents .. _`open repository of data files`: https://gin.g-node.org/NeuralEnsemble/ephy_testing_data .. _`licence`: https://github.com/NeuralEnsemble/python-neo/blob/master/LICENSE.txt .. _`code of conduct`: https://github.com/NeuralEnsemble/python-neo/blob/master/CODE_OF_CONDUCT.md ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1314154 neo-0.14.0/examples/0000755000175100001660000000000014743453656013617 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/examples/convert_to_nwb.py0000644000175100001660000000324314743453644017220 0ustar00runnerdocker""" Converting to NWB using Neo =========================== """ from urllib.request import urlretrieve from urllib.parse import quote from neo.io import get_io dataset_url = "https://object.cscs.ch/v1/AUTH_63ea6845b1d34ad7a43c8158d9572867/hbp-d000017_PatchClamp-GranuleCells_pub" folder = "GrC_Subject15_180116" # filenames = ["180116_0004 IV -70.abf", "180116_0005 CC step.abf", "180116_0006 EPSP.abf"] filenames = ["180116_0005 CC step.abf"] for filename in filenames: datafile_url = f"{dataset_url}/{folder}/{quote(filename)}" local_file = urlretrieve(datafile_url, filename) reader = get_io("180116_0005 CC step.abf") data = reader.read() global_metadata = { "session_start_time": data[0].rec_datetime, "identifier": data[0].file_origin, "session_id": "180116_0005", "institution": "University of Pavia", "lab": "D'Angelo Lab", "related_publications": "https://doi.org/10.1038/s42003-020-0953-x", } # data[0].annotate(**global_metadata) signal_metadata = { "nwb_group": "acquisition", "nwb_neurodata_type": ("pynwb.icephys", "PatchClampSeries"), "nwb_electrode": { "name": "patch clamp electrode", "description": "The patch-clamp pipettes were pulled from borosilicate glass capillaries " "(Hilgenberg, Malsfeld, Germany) and filled with intracellular solution " "(K-gluconate based solution)", "device": {"name": "patch clamp electrode"}, }, "nwb:gain": 1.0, } for segment in data[0].segments: signal = segment.analogsignals[0] signal.annotate(**signal_metadata) from neo.io import NWBIO writer = NWBIO("GrC_Subject15_180116.nwb", mode="w", **global_metadata) writer.write(data) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/examples/plot_igorio.py0000644000175100001660000000254114743453644016516 0ustar00runnerdocker""" IgorProIO Demo (BROKEN) ======================= """ ########################################################### # Import our packages import os from urllib.request import urlretrieve import zipfile import matplotlib.pyplot as plt from neo.io import get_io ############################################################# # Then download some data # Downloaded from Human Brain Project Collaboratory # Digital Reconstruction of Neocortical Microcircuitry (nmc-portal) # http://microcircuits.epfl.ch/#/animal/8ecde7d1-b2d2-11e4-b949-6003088da632 # NOTE: this dataset is not found as the link is broken. # datafile_url = "https://microcircuits.epfl.ch/data/released_data/B95.zip" # filename_zip = "B95.zip" # filename = "grouped_ephys/B95/B95_Ch0_IDRest_107.ibw" # urlretrieve(datafile_url, filename_zip) # zip_ref = zipfile.ZipFile(filename_zip) # create zipfile object # zip_ref.extract(path=".", member=filename) # extract file to dir # zip_ref.close() # ###################################################### # # Once we have our data we can use `get_io` to find an # # io (Igor in this case). Then we read the analogsignals # # Finally we will make some nice plots # reader = get_io(filename) # signal = reader.read_analogsignal() # plt.plot(signal.times, signal) # plt.xlabel(signal.sampling_period.dimensionality) # plt.ylabel(signal.dimensionality) # plt.show() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/examples/plot_imageseq.py0000644000175100001660000000276614743453644017032 0ustar00runnerdocker""" ImageSequences ============== """ ########################################################## # Let's import some packages from neo.core import ImageSequence from neo.core import RectangularRegionOfInterest, CircularRegionOfInterest, PolygonRegionOfInterest import matplotlib.pyplot as plt import quantities as pq import random ############################################################ # Now we need to generate some data # We will just make a nice box and then we can attach this # ImageSequence to a variety of ROIs # our ImageSequence will be 50 frames of 100x100 pixel images l = [] for frame in range(50): l.append([]) for y in range(100): l[frame].append([]) for x in range(100): l[frame][y].append(random.randint(0, 50)) ##################################################################### # we then make our image sequence and pull out our results from the # image_seq image_seq = ImageSequence(l, sampling_rate=500 * pq.Hz, spatial_scale="m", units="V") result = image_seq.signal_from_region( CircularRegionOfInterest(image_seq, 50, 50, 25), CircularRegionOfInterest(image_seq, 10, 10, 5), PolygonRegionOfInterest(image_seq, (50, 25), (50, 45), (14, 65), (90, 80)), ) ############################################################### # It is easy to plot our results using matplotlib for i in range(len(result)): plt.figure() plt.plot(result[i].times, result[i]) plt.xlabel("seconde") plt.ylabel("valeur") plt.tight_layout() plt.show() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/examples/plot_multi_tetrode_example.py0000644000175100001660000001251614743453644021624 0ustar00runnerdocker""" Analyzing and Plotting Data with Neo Structures =============================================== """ ###################################################### # First we import some packages. Since we are making simulated # data we will import quite a few neo features as well as use # quantities to provide units from itertools import cycle import numpy as np from quantities import ms, mV, kHz import matplotlib.pyplot as plt from neo import Block, Segment, ChannelView, Group, SpikeTrain, AnalogSignal ########################################################################## # For Neo we start with a block of data that will contain segments of data # so we will create a block of probe data that has a couple tetrodes # Then we will load in 3 segments (for examples trials of a stimulus) store_signals = False block = Block(name="probe data", tetrode_ids=["Tetrode #1", "Tetrode #2"]) block.segments = [ Segment(name="trial #1", index=0), Segment(name="trial #2", index=1), Segment(name="trial #3", index=2), ] # we will decide how many units each tetrode has found. If only science was this easy n_units = {"Tetrode #1": 2, "Tetrode #2": 5} ################################################################################## # Neo can also have groups. Groups are structures within a block that can cross segments # for example we could group a neuron across trials or across probes. # Create a group for each neuron, annotate each group with the tetrode from which it was recorded groups = [] counter = 0 for tetrode_id, n in n_units.items(): groups.extend([Group(name=f"neuron #{counter + i + 1}", tetrode_id=tetrode_id) for i in range(n)]) counter += n block.groups.extend(groups) iter_group = cycle(groups) ########################################################################################## # Segments are also containers of data. Segments can hold raw signal data like an AnalogSignal # Segments can also hold spiketrain data (in a SpikeTrain). It can also hold event data (which # we are not show in this example) # Create dummy data, one segment at a time for segment in block.segments: # create two 4-channel AnalogSignals with simulated data (because we have two tetrodes!) # note that the AnalogSignal with have numpy array-like data with units and sampling rates # Neo keeps track of these units while also giving you the flexibility of treating the raw data # like a numpy array signals = { "Tetrode #1": AnalogSignal(np.random.rand(1000, 4) * mV, sampling_rate=10 * kHz, tetrode_id="Tetrode #1"), "Tetrode #2": AnalogSignal(np.random.rand(1000, 4) * mV, sampling_rate=10 * kHz, tetrode_id="Tetrode #2"), } if store_signals: segment.analogsignals.extend(signals.values()) # create spike trains with simulated data # we will pretend the spikes have been extracted from the simulated signal for tetrode_id in ("Tetrode #1", "Tetrode #2"): for i in range(n_units[tetrode_id]): spiketrain = SpikeTrain(np.random.uniform(0, 100, size=30) * ms, t_stop=100 * ms) # assign each spiketrain to the appropriate segment segment.spiketrains.append(spiketrain) # assign each spiketrain to a given neuron current_group = next(iter_group) current_group.add(spiketrain) if store_signals: # add to the group a reference to the signal from which the spikes were obtained # this does not give a 1:1 correspondance between spike trains and signals, # for that we could use additional groups (and have groups of groups) current_group.add(signals[tetrode_id]) ################################################### # Now we will plot the data # Neo doesn't provide it's own plotting functions, but # since its data can be treated like numpy arrays # it is easy to use standard packages like matplotlib # for all your plotting needs # We do a classic in neuroscience and show various ways # to plot a PSTH (Peristimulus histogram) ################################################### # .. by trial plt.figure() for seg in block.segments: print(f"Analyzing segment {seg.index}") stlist = [st - st.t_start for st in seg.spiketrains] plt.subplot(len(block.segments), 1, seg.index + 1) count, bins = np.histogram(stlist) plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title(f"PSTH in segment {seg.index}") plt.tight_layout() plt.show() #################################################### # ..by neuron plt.figure() for i, group in enumerate(block.groups): stlist = [st - st.t_start for st in group.spiketrains] plt.subplot(len(block.groups), 1, i + 1) count, bins = np.histogram(stlist) plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title(f"PSTH of unit {group.name}") plt.tight_layout() plt.show() ########################################################### # ..by tetrode (or other electrode number) plt.figure() for i, tetrode_id in enumerate(block.annotations["tetrode_ids"]): stlist = [] for unit in block.filter(objects=Group, tetrode_id=tetrode_id): stlist.extend([st - st.t_start for st in unit.spiketrains]) plt.subplot(2, 1, i + 1) count, bins = np.histogram(stlist) plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title(f"PSTH blend of tetrode {tetrode_id}") plt.tight_layout() plt.show() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/examples/plot_read_files_neo_io.py0000644000175100001660000000356014743453644020655 0ustar00runnerdocker""" Reading files with neo.io ========================= """ #################################################### # Start with package import and getting a datafile import urllib import neo url_repo = "https://web.gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/" # Plexon files distantfile = url_repo + "plexon/File_plexon_3.plx" localfile = "File_plexon_3.plx" urllib.request.urlretrieve(distantfile, localfile) ################################################### # Now we can create our reader and read some data # create a reader reader = neo.io.PlexonIO(filename="File_plexon_3.plx") # read the blocks blks = reader.read(lazy=False) print(blks) ###################################################### # Once we have our blocks we can iterate through each # block of data and see the contents of all parts of # that data # access to segments for blk in blks: for seg in blk.segments: print(seg) for asig in seg.analogsignals: print(asig) for st in seg.spiketrains: print(st) ####################################################### # Let's look at another file type # CED Spike2 files distantfile = url_repo + "spike2/File_spike2_1.smr" localfile = "./File_spike2_1.smr" urllib.request.urlretrieve(distantfile, localfile) # create a reader reader = neo.io.Spike2IO(filename="File_spike2_1.smr") ######################################################### # Despite being a different raw file format we can access # the data in the same way # read the block bl = reader.read(lazy=False)[0] print(bl) ########################################################## # Similarly we can view the different types of data within # the block (AnalogSignals and SpikeTrains) # access to segments for seg in bl.segments: print(seg) for asig in seg.analogsignals: print(asig) for st in seg.spiketrains: print(st) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/examples/plot_read_files_neo_rawio.py0000644000175100001660000001476514743453644021400 0ustar00runnerdocker""" Reading files with neo.rawio ============================ compare with read_files_neo_io.py """ ########################################################### # First we import a RawIO from neo.rawio # For this example we will use PlexonRawIO import urllib from neo.rawio import PlexonRawIO ############################################################## # Get Plexon files # We will be pulling these files down, but if you have a local file # then all you need to do is specify the file location on your # computer. NeuralEnsemble keeps a wide variety of freely accesible, small # test files that can be used. So for this example we will take advantage of that # fact. url_repo = "https://web.gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/" distantfile = url_repo + "plexon/File_plexon_3.plx" localfile = "File_plexon_3.plx" urllib.request.urlretrieve(distantfile, localfile) ############################################################### # Create a reader # All it takes to create a reader is giving the filename (or dirname) # Then we need to do the slow step of parsing the header with the # `parse_header` function. This collects metadata as well as # make all future steps much faster for us reader = PlexonRawIO(filename="File_plexon_3.plx") reader.parse_header() print(reader) # we can view metadata in the header print(reader.header) ############################################################### # Read signal chunks # This is how we read raw data. We choose indices that we want or # we can use None to mean look at all channels. We also need to # specify the block of data (block_index) as well as the segment # (seg_index). Then we give the index start and stop. Since we # often think in time: to go from time to index would just require # the sample rate (so index = time / sampling_rate) channel_indexes = None # could be channel_indexes = [0] raw_sigs = reader.get_analogsignal_chunk( block_index=0, seg_index=0, i_start=1024, i_stop=2048, channel_indexes=channel_indexes ) # raw_sigs are not voltages so to convert to voltages we do the follwing float_sigs = reader.rescale_signal_raw_to_float(raw_sigs, dtype="float64") # We can see that the shapes are the same, but that the datatypes # are different once we've rescaled our data print("Raw Data: ", raw_sigs.shape, raw_sigs.dtype) print("Scaled Data: ", float_sigs.shape, float_sigs.dtype) ############################################################### # Each rawio gives you access to lots of information about your data # some of this information comes from functions # other information is stored as metadata in the reader.header sampling_rate = reader.get_signal_sampling_rate() # Like above we need to indicate the block and segment t_start = reader.get_signal_t_start(block_index=0, seg_index=0) units = reader.header["signal_channels"][0]["units"] # and we can display all of this information print(f"{sampling_rate=}, {t_start=}, {units=}") #################################################################### # Some rawio's and file formats also provide information about spikes # If a rawio can't read this data it will raise an error, but lucky # for us PlexonRawIO does have spikes data!! # Count units and spikes per unit nb_unit = reader.spike_channels_count() print(f"nb_unit: {nb_unit}\n") # nb_unit stands for number of units print("spike_channel_index nb_spike") for spike_channel_index in range(nb_unit): nb_spike = reader.spike_count(block_index=0, seg_index=0, spike_channel_index=spike_channel_index) print(f"{spike_channel_index}: {nb_spike}\n") # Read spike times and rescale (just like analogsignal above) spike_timestamps = reader.get_spike_timestamps( block_index=0, seg_index=0, spike_channel_index=0, t_start=0.0, t_stop=10.0 ) print(f"{spike_timestamps.shape=}\n{spike_timestamps.dtype=}\n{spike_timestamps[:5]=}\n") spike_times = reader.rescale_spike_timestamp(spike_timestamps, dtype="float64") print(f"{spike_times.shape=}\n{spike_times.dtype=}\n{spike_times[:5]}\n") ####################################################################### # Some file formats can also give waveform information. We are lucky # again our file has waveform data!! We forms are a 3d dataset of # (nb_spike, nb_channel, nb_sample) # Read spike waveforms raw_waveforms = reader.get_spike_raw_waveforms( block_index=0, seg_index=0, spike_channel_index=0, t_start=0.0, t_stop=10.0 ) print(f"{raw_waveforms.shape=}\n{raw_waveforms.dtype=}\n{raw_waveforms[0, 0, :4]=}\n") float_waveforms = reader.rescale_waveforms_to_float(raw_waveforms, dtype="float32", spike_channel_index=0) print(f"{float_waveforms.shape=}\n{float_waveforms.dtype=}{float_waveforms[0, 0, :4]=}\n") ######################################################################### # RawIOs can also read event timestamps. But looks like our luck ran out # let's grab a new file to see this feature # Read event timestamps and times (take another file) distantfile = url_repo + "plexon/File_plexon_2.plx" localfile = "File_plexon_2.plx" urllib.request.urlretrieve(distantfile, localfile) ######################################################################### # Since this is a new file we need to read initialize our reader as well # as parse the header reader = PlexonRawIO(filename="File_plexon_2.plx") reader.parse_header() # if we look at this header we see it is different than the header above print(reader.header) ########################################################################### # Now let's look at some event data. This could be things like stimuli applied # during the course of an ephys recording nb_event_channel = reader.event_channels_count() print(f"nb_event_channel: {nb_event_channel}") # now iterate through the channels for chan_index in range(nb_event_channel): nb_event = reader.event_count(block_index=0, seg_index=0, event_channel_index=chan_index) print(f"chan_index: {chan_index} nb_event: {nb_event}\n") ############################################################################### # Finally we can get our actual event timestamps. Some file formats provide the # real timestamps (timestamps in s/ms) others have raw timestamps (in samples) # so we can do the same style of functions as above. Get the raw timestamps # and convert to real times with a rescale function. ev_timestamps, ev_durations, ev_labels = reader.get_event_timestamps( block_index=0, seg_index=0, event_channel_index=0, t_start=None, t_stop=None ) print(f"{ev_timestamps=}\n{ev_durations=}\n{ev_labels=}\n") ev_times = reader.rescale_event_timestamp(ev_timestamps, dtype="float64") print(f"{ev_times=}\n") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/examples/plot_read_proxy_with_lazy_load.py0000644000175100001660000001010214743453644022463 0ustar00runnerdocker""" Demonstration of lazy load and proxy objects ============================================ """ ################################################ # Import our packages first # It is often nice to have units so we will also # import quantities import urllib import neo import quantities as pq import numpy as np ############################################### # Let's get a file # NeuralEnsemble maintains a wide variety of small test # datasets that are free to use. We can use urllib to pull # down one of these files for use url_repo = "https://web.gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/" # Get med file distantfile = url_repo + "micromed/File_micromed_1.TRC" localfile = "./File_micromed_1.TRC" urllib.request.urlretrieve(distantfile, localfile) ################################################## # create a reader # creating a reader for neo is easy it just requires using # the name of the desired reader and providing either a filename # or a directory name (reader dependent). Since we got a micromed # file we will use MicromedIO. reader = neo.MicromedIO(filename="File_micromed_1.TRC") reader.parse_header() ############################################################ # as always we can look view some interesting information about the # metadata and structure of a file just by printing the reader and # it's header print(reader) print(f"Header information: {reader.header}") ##################################################### # Now let's make a function that we want to apply to # look at lazy vs eager uses of the API def apply_my_fancy_average(sig_list): """basic average along triggers and then channels here we go back to numpy with magnitude to be able to use np.stack. Because neo uses quantities to keep track of units we can always get just the magnitude of an array with `.magnitude` """ sig_list = [s.magnitude for s in sig_list] sigs = np.stack(sig_list, axis=0) return np.mean(np.mean(sigs, axis=0), axis=1) ################################################# # Let's set our limits for both cases. We will # use quantities to include time dimensions. lim_start = -20 * pq.ms # 20 milliseconds before lim_end = +20 * pq.ms # 20 milliseconds after ################################################## # We start with eager (where `lazy=False`.) Everything # is loaded into memory. We will read a segment of data. # This includes analog signal data and events data # (final contents of a segment are dependent on the # underlying IO being used) seg = reader.read_segment(lazy=False) triggers = seg.events[0] anasig = seg.analogsignals[0] # here anasig contain the whole recording in memory all_sig_chunks = [] for t in triggers.times: t0, t1 = (t + lim_start), (t + lim_end) anasig_chunk = anasig.time_slice(t0, t1) all_sig_chunks.append(anasig_chunk) # After pulling all data into memory and then iterating through triggers # we end by doing our average m1 = apply_my_fancy_average(all_sig_chunks) ##################################################### # Here we do `lazy=True`, i.e. we do lazy loading. We # only load the data that we want into memory # and we use a proxy object for our analogsignal until we # load it chunk by chunk (no running out of memory!) seg = reader.read_segment(lazy=True) triggers = seg.events[0].load(time_slice=None) # this load all triggers in memory anasigproxy = seg.analogsignals[0] # this is a proxy all_sig_chunks = [] for t in triggers.times: t0, t1 = (t + lim_start), (t + lim_end) # at this step we load actual data into memory, but notice that we only load one # chunk of data at a time, so we reduce the memory strain anasig_chunk = anasigproxy.load(time_slice=(t0, t1)) # here real data are loaded all_sig_chunks.append(anasig_chunk) # Finally we apply the same average as we did above m2 = apply_my_fancy_average(all_sig_chunks) ########################################################## # We see that either way the result is the same, but # we do not exhaust our RAM/memory print(f"Eagerly loading data and averaging: {m1}") print(f"Lazy loading data and average {m2}") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/examples/plot_roi_demo.py0000644000175100001660000000472114743453644017025 0ustar00runnerdocker""" Working with RegionOfInterest objects ===================================== """ ################################################################# # Import our packages # We can import a variety of neo objects from neo.core and since an ImageSquence # also uses units let's import quantities which is the "units" library # that neo uses under the hood import matplotlib.pyplot as plt import numpy as np from neo.core import CircularRegionOfInterest, RectangularRegionOfInterest, PolygonRegionOfInterest, ImageSequence from numpy.random import rand import random import quantities as pq ################################################################## # First we create our image_sequence. Let's generate some data # In this simulated dataset we will just make an image that is # 100x100 pixels and then we will make 50 frames of this image # finally we will fill with random values for the data l = [] for frame in range(50): l.append([]) for y in range(100): l[frame].append([]) for x in range(100): l[frame][y].append(random.randint(0, 50)) # make an ImageSquence in Neo image_seq = ImageSequence(l, sampling_rate=500 * pq.Hz, spatial_scale="m", units="V") ################################################################# # Now we will write a function for plotting an roi def plot_roi(roi, shape): img = rand(120, 100) pir = np.array(roi.pixels_in_region()).T img[pir[1], pir[0]] = 5 plt.imshow(img, cmap="gray_r") plt.clim(0, 5) ax = plt.gca() ax.add_artist(shape) ################################################################################ # Finally we will plot each roi to demonstrate how we could high regions of interest # First a nice circle roi = CircularRegionOfInterest(image_sequence=image_seq, x=50.3, y=50.8, radius=30.2) shape = plt.Circle(roi.centre, roi.radius, color="r", fill=False) plt.subplot(1, 3, 1) plot_roi(roi, shape) # Next a rectangle roi = RectangularRegionOfInterest(image_sequence=image_seq, x=50.3, y=40.2, width=40.1, height=50.3) shape = plt.Rectangle((roi.x - roi.width / 2.0, roi.y - roi.height / 2.0), roi.width, roi.height, color="r", fill=False) plt.subplot(1, 3, 2) plot_roi(roi, shape) # Finally we can make a polygon (in this case a triangle) roi = PolygonRegionOfInterest(image_seq, (20.3, 30.2), (80.7, 30.1), (55.2, 59.4)) shape = plt.Polygon(np.array(roi.vertices), closed=True, color="r", fill=False) plt.subplot(1, 3, 3) plot_roi(roi, shape) plt.tight_layout() plt.show() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/examples/plot_with_matplotlib.py0000644000175100001660000000222614743453644020430 0ustar00runnerdocker""" Plotting a Neo object with matplotlib ===================================== """ import urllib import numpy as np import quantities as pq from matplotlib import pyplot import neo distantfile = "https://web.gin.g-node.org/NeuralEnsemble/ephy_testing_data/raw/master/plexon/File_plexon_3.plx" localfile = "File_plexon_3.plx" urllib.request.urlretrieve(distantfile, localfile) # reader = neo.io.NeuroExplorerIO(filename='File_neuroexplorer_2.nex') reader = neo.io.PlexonIO(filename="File_plexon_3.plx") bl = reader.read(lazy=False)[0] for seg in bl.segments: print("SEG: " + str(seg.file_origin)) fig = pyplot.figure() ax1 = fig.add_subplot(2, 1, 1) ax2 = fig.add_subplot(2, 1, 2) ax1.set_title(seg.file_origin) ax1.set_ylabel("arbitrary units") mint = 0 * pq.s maxt = np.inf * pq.s for i, asig in enumerate(seg.analogsignals): times = asig.times.rescale("s").magnitude asig = asig.magnitude ax1.plot(times, asig) trains = [st.rescale("s").magnitude for st in seg.spiketrains] colors = pyplot.cm.jet(np.linspace(0, 1, len(seg.spiketrains))) ax2.eventplot(trains, colors=colors) pyplot.show() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1324153 neo-0.14.0/neo/0000755000175100001660000000000014743453656012562 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/__init__.py0000644000175100001660000000063714743453644014676 0ustar00runnerdocker""" Neo is a package for representing electrophysiology data in Python, together with support for reading a wide range of neurophysiology file formats """ import importlib.metadata # this need to be at the begining because some sub module will need the version __version__ = importlib.metadata.version("neo") import logging logging_handler = logging.StreamHandler() from neo.core import * from neo.io import * ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1364152 neo-0.14.0/neo/core/0000755000175100001660000000000014743453656013512 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/__init__.py0000644000175100001660000000355614743453644015631 0ustar00runnerdocker""" :mod:`neo.core` provides classes for storing common electrophysiological data types. Some of these classes contain raw data, such as spike trains or analog signals, while others are containers to organize other classes (including both data classes and other container classes). Classes from :mod:`neo.io` return nested data structures containing one or more classes from this module. Classes: .. autoclass:: Block .. automethod:: Block.filter .. autoclass:: Segment .. automethod:: Segment.filter .. autoclass:: Group .. autoclass:: AnalogSignal .. autoclass:: IrregularlySampledSignal .. autoclass:: ChannelView .. autoclass:: Event .. autoclass:: Epoch .. autoclass:: SpikeTrain .. autoclass:: ImageSequence .. autoclass:: RectangularRegionOfInterest .. autoclass:: CircularRegionOfInterest .. autoclass:: PolygonRegionOfInterest """ from neo.core.block import Block from neo.core.segment import Segment from neo.core.analogsignal import AnalogSignal from neo.core.irregularlysampledsignal import IrregularlySampledSignal # Import FilterClasses from neo.core import filters from neo.core.event import Event from neo.core.epoch import Epoch from neo.core.spiketrain import SpikeTrain from neo.core.imagesequence import ImageSequence from neo.core.regionofinterest import RectangularRegionOfInterest, CircularRegionOfInterest, PolygonRegionOfInterest from neo.core.view import ChannelView from neo.core.group import Group from neo.core.baseneo import NeoReadWriteError # Block should always be first in this list objectlist = [ Block, Segment, AnalogSignal, IrregularlySampledSignal, Event, Epoch, SpikeTrain, ImageSequence, RectangularRegionOfInterest, CircularRegionOfInterest, PolygonRegionOfInterest, ChannelView, Group, ] objectnames = [ob.__name__ for ob in objectlist] class_by_name = dict(zip(objectnames, objectlist)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/analogsignal.py0000644000175100001660000007575214743453644016540 0ustar00runnerdocker""" This module implements :class:`AnalogSignal`, an array of analog signals. :class:`AnalogSignal` inherits from :class:`basesignal.BaseSignal` which derives from :class:`BaseNeo`, and from :class:`quantities.Quantity`which in turn inherits from :class:`numpy.array`. Inheritance from :class:`numpy.array` is explained here: http://docs.scipy.org/doc/numpy/user/basics.subclassing.html In brief: * Initialization of a new object from constructor happens in :meth:`__new__`. This is where user-specified attributes are set. * :meth:`__array_finalize__` is called for all new objects, including those created by slicing. This is where attributes are copied over from the old object. """ import logging from copy import deepcopy import numpy as np import quantities as pq from neo.core.baseneo import BaseNeo, MergeError, merge_annotations, intersect_annotations from neo.core.dataobject import DataObject from neo.core.basesignal import BaseSignal logger = logging.getLogger("Neo") def _get_sampling_rate(sampling_rate, sampling_period): """ Gets the sampling_rate from either the sampling_period or the sampling_rate, or makes sure they match if both are specified """ if sampling_period is None: if sampling_rate is None: raise ValueError("You must provide either the sampling rate or " + "sampling period") elif sampling_rate is None: sampling_rate = 1.0 / sampling_period elif sampling_period != 1.0 / sampling_rate: raise ValueError("The sampling_rate has to be 1/sampling_period") if not hasattr(sampling_rate, "units"): raise TypeError("Sampling rate/sampling period must have units") return sampling_rate def _new_AnalogSignalArray( cls, signal, units=None, dtype=None, copy=None, t_start=0 * pq.s, sampling_rate=None, sampling_period=None, name=None, file_origin=None, description=None, array_annotations=None, annotations=None, segment=None, ): """ A function to map AnalogSignal.__new__ to function that does not do the unit checking. This is needed for pickle to work. """ obj = cls( signal=signal, units=units, dtype=dtype, copy=copy, t_start=t_start, sampling_rate=sampling_rate, sampling_period=sampling_period, name=name, file_origin=file_origin, description=description, array_annotations=array_annotations, **annotations, ) obj.segment = segment return obj class AnalogSignal(BaseSignal): """ Array of one or more continuous analog signals. A representation of several continuous, analog signals that have the same duration, sampling rate and start time. Basically, it is a 2D array: dim 0 is time, dim 1 is channel index Inherits from :class:`quantities.Quantity`, which in turn inherits from :class:`numpy.ndarray`. *Usage*:: >>> from neo.core import AnalogSignal >>> import quantities as pq >>> >>> sigarr = AnalogSignal([[1, 2, 3], [4, 5, 6]], units='V', ... sampling_rate=1*pq.Hz) >>> >>> sigarr >>> sigarr[:,1] >>> sigarr[1, 1] array(5) * V *Required attributes/properties*: :signal: (quantity array 2D, numpy array 2D, or list (data, channel)) The data itself. :units: (quantity units) Required if the signal is a list or NumPy array, not if it is a :class:`Quantity` :t_start: (quantity scalar) Time when signal begins :sampling_rate: *or* **sampling_period** (quantity scalar) Number of samples per unit time or interval between two samples. If both are specified, they are checked for consistency. *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. *Optional attributes/properties*: :dtype: (numpy dtype or str) Override the dtype of the signal array. :copy: (bool) True by default. :array_annotations: (dict) Dict mapping strings to numpy arrays containing annotations \ for all data points Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Properties available on this object*: :sampling_rate: (quantity scalar) Number of samples per unit time. (1/:attr:`sampling_period`) :sampling_period: (quantity scalar) Interval between two samples. (1/:attr:`quantity scalar`) :duration: (Quantity) Signal duration, read-only. (size * :attr:`sampling_period`) :t_stop: (quantity scalar) Time when signal ends, read-only. (:attr:`t_start` + :attr:`duration`) :times: (quantity 1D) The time points of each sample of the signal, read-only. (:attr:`t_start` + arange(:attr:`shape`[0])/:attr:`sampling_rate`) *Slicing*: :class:`AnalogSignal` objects can be sliced. When taking a single column (dimension 0, e.g. [0, :]) or a single element, a :class:`~quantities.Quantity` is returned. Otherwise an :class:`AnalogSignal` (actually a view) is returned, with the same metadata, except that :attr:`t_start` is changed if the start index along dimension 1 is greater than 1. Note that slicing an :class:`AnalogSignal` may give a different result to slicing the underlying NumPy array since signals are always two-dimensional. *Operations available on this object*: == != + * / """ _parent_objects = ("Segment",) _parent_attrs = ("segment",) _quantity_attr = "signal" _necessary_attrs = (("signal", pq.Quantity, 2), ("sampling_rate", pq.Quantity, 0), ("t_start", pq.Quantity, 0)) _recommended_attrs = BaseNeo._recommended_attrs def __new__( cls, signal, units=None, dtype=None, copy=None, t_start=0 * pq.s, sampling_rate=None, sampling_period=None, name=None, file_origin=None, description=None, array_annotations=None, **annotations, ): """ Constructs new :class:`AnalogSignal` from data. This is called whenever a new class:`AnalogSignal` is created from the constructor, but not when slicing. __array_finalize__ is called on the new object. """ if copy is not None: raise ValueError( "`copy` is now deprecated in Neo due to removal in Quantites to support Numpy 2.0. " "In order to facilitate the deprecation copy can be set to None but will raise an " "error if set to True/False since this will silently do nothing. This argument will be completely " "removed in Neo 0.15.0. Please update your code base as necessary." ) signal = cls._rescale(signal, units=units) obj = pq.Quantity(signal, units=units, dtype=dtype).view(cls) if obj.ndim == 1: obj.shape = (-1, 1) if t_start is None: raise ValueError("`t_start` cannot be None") obj._t_start = t_start obj._sampling_rate = _get_sampling_rate(sampling_rate, sampling_period) obj.segment = None return obj def __init__( self, signal, units=None, dtype=None, copy=None, t_start=0 * pq.s, sampling_rate=None, sampling_period=None, name=None, file_origin=None, description=None, array_annotations=None, **annotations, ): """ Initializes a newly constructed :class:`AnalogSignal` instance. """ # This method is only called when constructing a new AnalogSignal, # not when slicing or viewing. We use the same call signature # as __new__ for documentation purposes. Anything not in the call # signature is stored in annotations. # Calls parent __init__, which grabs universally recommended # attributes and sets up self.annotations DataObject.__init__( self, name=name, file_origin=file_origin, description=description, array_annotations=array_annotations, **annotations, ) def __reduce__(self): """ Map the __new__ function onto _new_AnalogSignalArray, so that pickle works """ return _new_AnalogSignalArray, ( self.__class__, np.array(self), self.units, self.dtype, None, self.t_start, self.sampling_rate, self.sampling_period, self.name, self.file_origin, self.description, self.array_annotations, self.annotations, self.segment, ) def _array_finalize_spec(self, obj): """ Set default values for attributes specific to :class:`AnalogSignal`. Common attributes are defined in :meth:`__array_finalize__` in :class:`basesignal.BaseSignal`), which is called every time a new signal is created and calls this method. """ self._t_start = getattr(obj, "_t_start", 0 * pq.s) self._sampling_rate = getattr(obj, "_sampling_rate", None) return obj def __repr__(self): """ Returns a string representing the :class:`AnalogSignal`. """ return f"<{self.__class__.__name__}({super().__repr__()}, [{self.t_start}, {self.t_stop}], sampling rate: {self.sampling_rate})>" def __getitem__(self, i): """ Get the item or slice :attr:`i`. """ if isinstance(i, (int, np.integer)): # a single point in time across all channels obj = super().__getitem__(i) obj = pq.Quantity(obj.magnitude, units=obj.units) elif isinstance(i, tuple): obj = super().__getitem__(i) j, k = i if isinstance(j, (int, np.integer)): # extract a quantity array obj = pq.Quantity(obj.magnitude, units=obj.units) else: if isinstance(j, slice): if j.start: obj.t_start = self.t_start + j.start * self.sampling_period if j.step: obj.sampling_period *= j.step elif isinstance(j, np.ndarray): raise NotImplementedError("Arrays not yet supported") # in the general case, would need to return # IrregularlySampledSignal(Array) else: raise TypeError(f"{type(j)} not supported") if isinstance(k, (int, np.integer)): obj = obj.reshape(-1, 1) elif k is None: # matplotlib _check_1d() calls__getitem__ with (:, None) and # reacts appropriately if an IndexError or ValueError is raised raise IndexError("Cannot add dimensions to an AnalogSignal") obj.array_annotate(**deepcopy(self.array_annotations_at_index(k))) elif isinstance(i, slice): obj = super().__getitem__(i) if i.start: obj.t_start = self.t_start + i.start * self.sampling_period obj.array_annotations = deepcopy(self.array_annotations) elif isinstance(i, np.ndarray): # Indexing of an AnalogSignal is only consistent if the resulting number of # samples is the same for each trace. The time axis for these samples is not # guaranteed to be continuous, so returning a Quantity instead of an AnalogSignal here. new_time_dims = np.sum(i, axis=0) if len(new_time_dims) and all(new_time_dims == new_time_dims[0]): obj = np.asarray(self).T.__getitem__(i.T) obj = obj.T.reshape(self.shape[1], -1).T obj = pq.Quantity(obj, units=self.units) else: raise IndexError( "indexing of an AnalogSignals needs to keep the same number of " "sample for each trace contained" ) else: raise IndexError("index should be an integer, tuple, slice or boolean numpy array") return obj def __setitem__(self, i, value): """ Set an item or slice defined by :attr:`i` to `value`. """ # because AnalogSignals are always at least two-dimensional, # we need to handle the case where `i` is an integer if isinstance(i, int): i = slice(i, i + 1) elif isinstance(i, tuple): j, k = i if isinstance(k, int): i = (j, slice(k, k + 1)) return super().__setitem__(i, value) # sampling_rate attribute is handled as a property so type checking can # be done @property def sampling_rate(self): """ Number of samples per unit time. (1/:attr:`sampling_period`) """ return self._sampling_rate @sampling_rate.setter def sampling_rate(self, rate): """ Setter for :attr:`sampling_rate` """ if rate is None: raise ValueError("sampling_rate cannot be None") elif not hasattr(rate, "units"): raise ValueError("sampling_rate must have units") self._sampling_rate = rate # sampling_period attribute is handled as a property on underlying rate @property def sampling_period(self): """ Interval between two samples. (1/:attr:`sampling_rate`) """ return 1.0 / self.sampling_rate @sampling_period.setter def sampling_period(self, period): """ Setter for :attr:`sampling_period` """ if period is None: raise ValueError("sampling_period cannot be None") elif not hasattr(period, "units"): raise ValueError("sampling_period must have units") self.sampling_rate = 1.0 / period # t_start attribute is handled as a property so type checking can be done @property def t_start(self): """ Time when signal begins. """ return self._t_start @t_start.setter def t_start(self, start): """ Setter for :attr:`t_start` """ if start is None: raise ValueError("t_start cannot be None") self._t_start = start @property def duration(self): """ Signal duration (:attr:`size` * :attr:`sampling_period`) """ return self.shape[0] / self.sampling_rate @property def t_stop(self): """ Time when signal ends. (:attr:`t_start` + :attr:`duration`) """ return self.t_start + self.duration @property def times(self): """ The time points of each sample of the signal (:attr:`t_start` + arange(:attr:`shape`)/:attr:`sampling_rate`) """ return self.t_start + np.arange(self.shape[0]) / self.sampling_rate def __eq__(self, other): """ Equality test (==) """ if isinstance(other, AnalogSignal) and ( self.t_start != other.t_start or self.sampling_rate != other.sampling_rate ): return False return super().__eq__(other) def _check_consistency(self, other): """ Check if the attributes of another :class:`AnalogSignal` are compatible with this one. """ if isinstance(other, AnalogSignal): for attr in "t_start", "sampling_rate": if getattr(self, attr) != getattr(other, attr): raise ValueError(f"Inconsistent values of {attr}") # how to handle name and annotations? def _repr_pretty_(self, pp, cycle): """ Handle pretty-printing the :class:`AnalogSignal`. """ pp.text( f"{self.__class__.__name__} with {self.shape[1]} channels of length " f"{self.shape[0]}; units {self.units.dimensionality.string}; datatype " f"{self.dtype}" ) if self._has_repr_pretty_attrs_(): pp.breakable() self._repr_pretty_attrs_(pp, cycle) def _pp(line): pp.breakable() with pp.group(indent=1): pp.text(line) _pp(f"sampling rate: {self.sampling_rate}") _pp(f"time: {self.t_start} to {self.t_stop}") def time_index(self, t): """Return the array index (or indices) corresponding to the time (or times) `t`""" i = (t - self.t_start) * self.sampling_rate i = np.rint(i.simplified.magnitude).astype(np.int64) return i def time_slice(self, t_start, t_stop): """ Creates a new AnalogSignal corresponding to the time slice of the original AnalogSignal between times t_start, t_stop. Note, that for numerical stability reasons if t_start does not fall exactly on the time bins defined by the sampling_period it will be rounded to the nearest sampling bin. The time bin for t_stop will be chosen to make the duration of the resultant signal as close as possible to t_stop - t_start. This means that for a given duration, the size of the slice will always be the same. """ # checking start time and transforming to start index if t_start is None: i = 0 t_start = 0 * pq.s else: i = self.time_index(t_start) # checking stop time and transforming to stop index if t_stop is None: j = len(self) else: delta = (t_stop - t_start) * self.sampling_rate j = i + int(np.rint(delta.simplified.magnitude)) if (i < 0) or (j > len(self)): raise ValueError( "t_start, t_stop have to be within the analog \ signal duration" ) # Time slicing should create a deep copy of the object obj = deepcopy(self[i:j]) obj.t_start = self.t_start + i * self.sampling_period return obj def time_shift(self, t_shift): """ Shifts a :class:`AnalogSignal` to start at a new time. Parameters ---------- t_shift: Quantity (time) Amount of time by which to shift the :class:`AnalogSignal`. Returns ------- new_sig: :class:`AnalogSignal` New instance of a :class:`AnalogSignal` object starting at t_shift later than the original :class:`AnalogSignal` (the original :class:`AnalogSignal` is not modified). """ new_sig = deepcopy(self) new_sig.t_start = new_sig.t_start + t_shift return new_sig # copy in splice is a deepcopy not a numpy copy so we can keep def splice(self, signal, copy=False): """ Replace part of the current signal by a new piece of signal. The new piece of signal will overwrite part of the current signal starting at the time given by the new piece's `t_start` attribute. The signal to be spliced in must have the same physical dimensions, sampling rate, and number of channels as the current signal and fit within it. If `copy` is False (the default), modify the current signal in place. If `copy` is True, return a new signal and leave the current one untouched. In this case, the new signal will not be linked to any parent objects. """ if signal.t_start < self.t_start: raise ValueError("Cannot splice earlier than the start of the signal") if signal.t_stop > self.t_stop: raise ValueError("Splice extends beyond signal") if signal.sampling_rate != self.sampling_rate: raise ValueError("Sampling rates do not match") i = self.time_index(signal.t_start) j = i + signal.shape[0] if copy: new_signal = deepcopy(self) new_signal.segment = None new_signal[i:j, :] = signal return new_signal else: self[i:j, :] = signal return self def downsample(self, downsampling_factor, **kwargs): """ Downsample the data of a signal. This method reduces the number of samples of the AnalogSignal to a fraction of the original number of samples, defined by `downsampling_factor`. This method is a wrapper of scipy.signal.decimate and accepts the same set of keyword arguments, except for specifying the axis of resampling, which is fixed to the first axis here. Parameters ---------- downsampling_factor: int Factor used for decimation of samples. Scipy recommends to call decimate multiple times for downsampling factors higher than 13 when using IIR downsampling (default). Returns ------- downsampled_signal: :class:`AnalogSignal` New instance of a :class:`AnalogSignal` object containing the resampled data points. The original :class:`AnalogSignal` is not modified. Notes ----- For resampling the signal with a fixed number of samples, see `resample` method. """ try: import scipy.signal except ImportError as err: raise ImportError("Decimating requires availability of scipy.signal") # Resampling is only permitted along the time axis (axis=0) if "axis" in kwargs: kwargs.pop("axis") downsampled_data = scipy.signal.decimate(self.magnitude, downsampling_factor, axis=0, **kwargs) downsampled_signal = self.duplicate_with_new_data(downsampled_data) # since the number of channels stays the same, we can also copy array annotations here downsampled_signal.array_annotations = self.array_annotations.copy() downsampled_signal.sampling_rate = self.sampling_rate / downsampling_factor return downsampled_signal def resample(self, sample_count, **kwargs): """ Resample the data points of the signal. This method interpolates the signal and returns a new signal with a fixed number of samples defined by `sample_count`. This method is a wrapper of scipy.signal.resample and accepts the same set of keyword arguments, except for specifying the axis of resampling which is fixed to the first axis here, and the sample positions. . Parameters ---------- sample_count: int Number of desired samples. The resulting signal starts at the same sample as the original and is sampled regularly. Returns ------- resampled_signal: :class:`AnalogSignal` New instance of a :class:`AnalogSignal` object containing the resampled data points. The original :class:`AnalogSignal` is not modified. Notes ----- For reducing the number of samples to a fraction of the original, see `downsample` method """ try: import scipy.signal except ImportError as err: raise ImportError("Decimating requires availability of scipy.signal") # Resampling is only permitted along the time axis (axis=0) if "axis" in kwargs: kwargs.pop("axis") if "t" in kwargs: kwargs.pop("t") resampled_data, resampled_times = scipy.signal.resample( self.magnitude, sample_count, t=self.times, axis=0, **kwargs ) resampled_signal = self.duplicate_with_new_data(resampled_data) resampled_signal.sampling_rate = (sample_count / self.shape[0]) * self.sampling_rate # since the number of channels stays the same, we can also copy array annotations here resampled_signal.array_annotations = self.array_annotations.copy() return resampled_signal def rectify(self, **kwargs): """ Rectify the signal. This method rectifies the signal by taking the absolute value. This method is a wrapper of numpy.absolute() and accepts the same set of keyword arguments. Returns ------- resampled_signal: :class:`AnalogSignal` New instance of a :class:`AnalogSignal` object containing the rectified data points. The original :class:`AnalogSignal` is not modified. """ # Use numpy to get the absolute value of the signal rectified_data = np.absolute(self.magnitude, **kwargs) rectified_signal = self.duplicate_with_new_data(rectified_data) # the sampling rate stays constant rectified_signal.sampling_rate = self.sampling_rate # since the number of channels stays the same, we can also copy array annotations here rectified_signal.array_annotations = self.array_annotations.copy() return rectified_signal def concatenate(self, *signals, overwrite=False, padding=False): """ Concatenate multiple neo.AnalogSignal objects across time. Units, sampling_rate and number of signal traces must be the same for all signals. Otherwise a ValueError is raised. Note that timestamps of concatenated signals might shift in oder to align the sampling times of all signals. Parameters ---------- signals: neo.AnalogSignal objects AnalogSignals that will be concatenated overwrite : bool If True, samples of the earlier (lower index in `signals`) signals are overwritten by that of later (higher index in `signals`) signals. If False, samples of the later are overwritten by earlier signal. Default: False padding : bool, scalar quantity Sampling values to use as padding in case signals do not overlap. If False, do not apply padding. Signals have to align or overlap. If True, signals will be padded using np.NaN as pad values. If a scalar quantity is provided, this will be used for padding. The other signal is moved forward in time by maximum one sampling period to align the sampling times of both signals. Default: False Returns ------- signal: neo.AnalogSignal concatenated output signal """ # Sanity of inputs if not hasattr(signals, "__iter__"): raise TypeError("signals must be iterable") if not all([isinstance(a, AnalogSignal) for a in signals]): raise TypeError("Entries of anasiglist have to be of type neo.AnalogSignal") if len(signals) == 0: return self signals = [self] + list(signals) # Check required common attributes: units, sampling_rate and shape[-1] shared_attributes = ["units", "sampling_rate"] attribute_values = [tuple((getattr(anasig, attr) for attr in shared_attributes)) for anasig in signals] # add shape dimensions that do not relate to time attribute_values = [(attribute_values[i] + (signals[i].shape[1:],)) for i in range(len(signals))] if not all([attrs == attribute_values[0] for attrs in attribute_values]): raise MergeError(f"AnalogSignals have to share {shared_attributes} attributes to be concatenated.") units, sr, shape = attribute_values[0] # find gaps between Analogsignals combined_time_ranges = self._concatenate_time_ranges([(s.t_start, s.t_stop) for s in signals]) missing_time_ranges = self._invert_time_ranges(combined_time_ranges) if len(missing_time_ranges): diffs = np.diff(np.asarray(missing_time_ranges), axis=1) else: diffs = [] if padding is False and any(diffs > signals[0].sampling_period): raise MergeError( f"Signals are not continuous. Can not concatenate signals with gaps. " f"Please provide a padding value." ) if padding is not False: logger.warning(f"Signals will be padded using {padding}.") if padding is True: padding = np.nan * units if isinstance(padding, pq.Quantity): padding = padding.rescale(units).magnitude else: raise MergeError( "Invalid type of padding value. Please provide a bool value " "or a quantities object." ) t_start = min([a.t_start for a in signals]) t_stop = max([a.t_stop for a in signals]) n_samples = int(np.rint(((t_stop - t_start) * sr).rescale("dimensionless").magnitude)) shape = (n_samples,) + shape # Collect attributes and annotations across all concatenated signals kwargs = {} common_annotations = signals[0].annotations common_array_annotations = signals[0].array_annotations for anasig in signals[1:]: common_annotations = intersect_annotations(common_annotations, anasig.annotations) common_array_annotations = intersect_annotations(common_array_annotations, anasig.array_annotations) kwargs["annotations"] = common_annotations kwargs["array_annotations"] = common_array_annotations for name in ("name", "description", "file_origin"): attr = [getattr(s, name) for s in signals] if all([a == attr[0] for a in attr]): kwargs[name] = attr[0] else: kwargs[name] = f"concatenation ({attr})" conc_signal = AnalogSignal( np.full(shape=shape, fill_value=padding, dtype=signals[0].dtype), sampling_rate=sr, t_start=t_start, units=units, **kwargs, ) if not overwrite: signals = signals[::-1] while len(signals) > 0: conc_signal.splice(signals.pop(0), copy=False) return conc_signal def _concatenate_time_ranges(self, time_ranges): time_ranges = sorted(time_ranges) new_ranges = time_ranges[:1] for t_start, t_stop in time_ranges[1:]: # time range are non continuous -> define new range if t_start > new_ranges[-1][1]: new_ranges.append((t_start, t_stop)) # time range is continuous -> extend time range elif t_stop > new_ranges[-1][1]: new_ranges[-1] = (new_ranges[-1][0], t_stop) return new_ranges def _invert_time_ranges(self, time_ranges): i = 0 new_ranges = [] while i < len(time_ranges) - 1: new_ranges.append((time_ranges[i][1], time_ranges[i + 1][0])) i += 1 return new_ranges ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/baseneo.py0000644000175100001660000003502114743453644015476 0ustar00runnerdocker""" This module defines :class:`BaseNeo`, the abstract base class used by all :module:`neo.core` classes. """ from copy import deepcopy from datetime import datetime, date, time, timedelta from decimal import Decimal import logging from numbers import Number import numpy as np ALLOWED_ANNOTATION_TYPES = ( int, float, complex, str, bytes, type(None), datetime, date, time, timedelta, Number, Decimal, np.number, np.bool_, ) logger = logging.getLogger("Neo") class MergeError(Exception): pass class NeoReadWriteError(IOError): """ This is the main neo-specific error that has to deal with ephys data that does not follow the requirements for the Neo object hierarchy. It should be used for: 1) When an IO does not support a specific read/write functionality 2) A file format does not support the structural requirements * Different sampling rates among streams * Different expectations for a file format (could also be a NotImplementedError depending on circumstances) It should NOT be used when other errors more accurately describe the problem: 1) ValueError: for incorrect values (like t_start, t_stop) 2) TypeError: use of an inappropriate type for an argument 3) FileNotFoundError: for use when a file is not found """ pass def _check_annotations(value): """ Recursively check that value is either of a "simple" type (number, string, date/time) or is a (possibly nested) dict, list or numpy array containing only simple types. """ if isinstance(value, np.ndarray): if not issubclass(value.dtype.type, ALLOWED_ANNOTATION_TYPES): raise ValueError(f"Invalid annotation. NumPy arrays with dtype {value.dtype.type}" f"are not allowed") elif isinstance(value, dict): for key, element in value.items(): if not isinstance(key, str): raise TypeError(f"Annotations keys must be strings not of type {type(key)}") _check_annotations(element) elif isinstance(value, (list, tuple)): for element in value: _check_annotations(element) elif not isinstance(value, ALLOWED_ANNOTATION_TYPES): raise ValueError(f"Invalid annotation. Annotations of type {type(value)} are not" f"allowed") def merge_annotation(a, b): """ First attempt at a policy for merging annotations (intended for use with parallel computations using MPI). This policy needs to be discussed further, or we could allow the user to specify a policy. Current policy: For arrays or lists: concatenate For dicts: merge recursively For strings: concatenate with ';' Otherwise: fail if the annotations are not equal """ if type(a) != type(b): raise TypeError(f"type({a}) {type(a)} != type({b}) {type(b)}") if isinstance(a, dict): return merge_annotations(a, b) elif isinstance(a, np.ndarray): # concatenate b to a return np.append(a, b) elif isinstance(a, list): # concatenate b to a return a + b elif isinstance(a, str): if a == b: return a else: return a + ";" + b else: if a != b: raise ValueError(f"{a} != {b}") return a def merge_annotations(A, *Bs): """ Merge two sets of annotations. Merging follows these rules: All keys that are in A or B, but not both, are kept. For keys that are present in both: For arrays or lists: concatenate For dicts: merge recursively For strings: concatenate with ';' Otherwise: warn if the annotations are not equal """ merged = A.copy() for B in Bs: for name in B: if name not in merged: merged[name] = B[name] else: try: merged[name] = merge_annotation(merged[name], B[name]) except BaseException as exc: # exc.args += ('key %s' % name,) # raise merged[name] = "MERGE CONFLICT" # temporary hack logger.debug(f"Merging annotations: A={A} Bs={Bs} merged={merged}") return merged def intersect_annotations(A, B): """ Identify common entries in dictionaries A and B and return these in a separate dictionary. Entries have to share key as well as value to be considered common. Parameters ---------- A, B : dict Dictionaries to merge. """ result = {} for key in set(A.keys()) & set(B.keys()): v1, v2 = A[key], B[key] if type(v1) != type(v2): raise TypeError(f"type({v1}) {type(v1)} != type({v2}) {type(v2)}") if isinstance(v1, dict) and v1 == v2: result[key] = deepcopy(v1) elif isinstance(v1, str) and v1 == v2: result[key] = A[key] elif isinstance(v1, list) and v1 == v2: result[key] = deepcopy(v1) elif isinstance(v1, np.ndarray) and all(v1 == v2): result[key] = deepcopy(v1) return result def _reference_name(class_name): """ Given the name of a class, return an attribute name to be used for references to instances of that class. For example, a Segment object has a parent Block object, referenced by `segment.block`. The attribute name `block` is obtained by calling `_container_name("Block")`. """ return class_name.lower() def _container_name(class_name): """ Given the name of a class, return an attribute name to be used for lists (or other containers) containing instances of that class. For example, a Block object contains a list of Segment objects, referenced by `block.segments`. The attribute name `segments` is obtained by calling `_container_name_plural("Segment")`. """ if "RegionOfInterest" in class_name: # this is a hack, pending a more principled way to handle this return "regionsofinterest" else: return _reference_name(class_name) + "s" class BaseNeo: """ This is the base class from which all Neo objects inherit. This class implements support for universally recommended arguments, and also sets up the :attr:`annotations` dict for additional arguments. Each class can define one or more of the following class attributes: :_parent_objects: Neo objects that can be parents of this object. Note that no Neo object can have more than one parent. An instance attribute named class.__name__.lower() will be automatically defined to hold this parent and will be initialized to None. :_necessary_attrs: A list of tuples containing the attributes that the class must have. The tuple can have 2-4 elements. The first element is the attribute name. The second element is the attribute type. The third element is the number of dimensions (only for numpy arrays and quantities). The fourth element is the dtype of array (only for numpy arrays and quantities). This does NOT include the attributes holding the parents or children of the object. :_recommended_attrs: A list of tuples containing the attributes that the class may optionally have. It uses the same structure as :_necessary_attrs: :_repr_pretty_attrs_keys_: The names of attributes printed when pretty-printing using iPython. The following helper properties are available: :_parent_containers: The names of the container attributes used to store :_parent_objects: :parents: All objects that are parents of the current object. :_all_attrs: All required and optional attributes. :_necessary_attrs: + :_recommended_attrs: The following "universal" methods are available: :__init__: Grabs the universally recommended arguments :attr:`name`, :attr:`file_origin`, and :attr:`description` and stores them as attributes. Also takes every additional argument (that is, every argument that is not handled by :class:`BaseNeo` or the child class), and puts in the dict :attr:`annotations`. :annotate(**args): Updates :attr:`annotations` with keyword/value pairs. :merge(**args): Merge the contents of another object into this one. The merge method implemented here only merges annotations (see :merge_annotations:). Subclasses should implementt their own merge rules. :merge_annotations(**args): Merge the :attr:`annotations` of another object into this one. Each child class should: 0) describe its parents (if any) and attributes in the relevant class attributes. :_recommended_attrs: should append BaseNeo._recommended_attrs to the end. 1) call BaseNeo.__init__(self, name=name, description=description, file_origin=file_origin, **annotations) with the universal recommended arguments, plus optional annotations 2) process its required arguments in its __new__ or __init__ method 3) process its non-universal recommended arguments (in its __new__ or __init__ method Non-keyword arguments should only be used for required arguments. The required and recommended arguments for each child class (Neo object) are specified in the _necessary_attrs and _recommended_attrs attributes and documentation for the child object. """ # these attributes control relationships, they need to be # specified in each child class # Parent objects whose children can have a single parent _parent_objects = () # Attribute names corresponding to _parent_objects _parent_attrs = () # Attributes that an instance is required to have defined _necessary_attrs = () # Attributes that an instance may or may have defined _recommended_attrs = (("name", str), ("description", str), ("file_origin", str)) # Attributes that are used for pretty-printing _repr_pretty_attrs_keys_ = ("name", "description", "annotations") is_view = False def __init__(self, name=None, description=None, file_origin=None, **annotations): """ This is the base constructor for all Neo objects. Stores universally recommended attributes and creates :attr:`annotations` from additional arguments not processed by :class:`BaseNeo` or the child class. """ # create `annotations` for additional arguments _check_annotations(annotations) self.annotations = annotations # these attributes are recommended for all objects. self.name = name self.description = description self.file_origin = file_origin # initialize parent containers for parent in self._parent_containers: setattr(self, parent, None) def annotate(self, **annotations): """ Add annotations (non-standardized metadata) to a Neo object. Example: >>> obj.annotate(key1=value0, key2=value1) >>> obj.key2 value2 """ _check_annotations(annotations) self.annotations.update(annotations) def _has_repr_pretty_attrs_(self): return any(getattr(self, k) for k in self._repr_pretty_attrs_keys_) def _repr_pretty_attrs_(self, pp, cycle): first = True for key in self._repr_pretty_attrs_keys_: value = getattr(self, key) if value: if first: first = False else: pp.breakable() with pp.group(indent=1): pp.text(f"{key}: ") pp.pretty(value) def _repr_pretty_(self, pp, cycle): """ Handle pretty-printing the :class:`BaseNeo`. """ pp.text(self.__class__.__name__) if self._has_repr_pretty_attrs_(): pp.breakable() self._repr_pretty_attrs_(pp, cycle) @property def _parent_containers(self): """ Containers for parent objects. """ return tuple([_reference_name(parent) for parent in self._parent_objects]) @property def parents(self): """ All parent objects storing the current object. """ return tuple([getattr(self, attr) for attr in self._parent_containers]) @property def _all_attrs(self): """ Returns a combination of all required and recommended attributes. """ return self._necessary_attrs + self._recommended_attrs def merge_annotations(self, *others): """ Merge annotations from the other object into this one. Merging follows these rules: All keys that are in the either object, but not both, are kept. For keys that are present in both objects: For arrays or lists: concatenate the two arrays For dicts: merge recursively For strings: concatenate with ';' Otherwise: fail if the annotations are not equal """ other_annotations = [other.annotations for other in others] merged_annotations = merge_annotations(self.annotations, *other_annotations) self.annotations.update(merged_annotations) def merge(self, *others): """ Merge the contents of another object into this one. See :meth:`merge_annotations` for details of the merge operation. """ self.merge_annotations(*others) def set_parent(self, obj): """ Set the appropriate "parent" attribute of this object according to the type of "obj" """ if obj.__class__.__name__ not in self._parent_objects: raise TypeError( ( f"{self.__class__.__name__} can only have parents of " f"type {self._parwents_objects}, not {obj.__class__.__name__}" ) ) loc = self._parent_objects.index(obj.__class__.__name__) parent_attr = self._parent_attrs[loc] setattr(self, parent_attr, obj) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/basesignal.py0000644000175100001660000002655014743453644016201 0ustar00runnerdocker""" This module implements :class:`BaseSignal`, an array of signals. This is a parent class from which all signal objects inherit: :class:`AnalogSignal` and :class:`IrregularlySampledSignal` :class:`BaseSignal` inherits from :class:`quantities.Quantity`, which inherits from :class:`numpy.array`. Inheritance from :class:`numpy.array` is explained here: http://docs.scipy.org/doc/numpy/user/basics.subclassing.html In brief: * Constructor :meth:`__new__` for :class:`BaseSignal` doesn't exist. Only child objects :class:`AnalogSignal` and :class:`IrregularlySampledSignal` can be created. """ import logging from copy import deepcopy import numpy as np import quantities as pq from neo.core.baseneo import MergeError, merge_annotations from neo.core.dataobject import DataObject, ArrayDict logger = logging.getLogger("Neo") class BaseSignal(DataObject): """ This is the base class from which all signal objects inherit: :class:`AnalogSignal` and :class:`IrregularlySampledSignal`. This class contains all common methods of both child classes. It uses the following child class attributes: :_necessary_attrs: a list of the attributes that the class must have. :_recommended_attrs: a list of the attributes that the class may optionally have. """ def _array_finalize_spec(self, obj): """ Called by :meth:`__array_finalize__`, used to customize behaviour of sub-classes. """ return obj def __array_finalize__(self, obj): """ This is called every time a new signal is created. It is the appropriate place to set default values for attributes for a signal constructed by slicing or viewing. User-specified values are only relevant for construction from constructor, and these are set in __new__ in the child object. Then they are just copied over here. Default values for the specific attributes for subclasses (:class:`AnalogSignal` and :class:`IrregularlySampledSignal`) are set in :meth:`_array_finalize_spec` """ super().__array_finalize__(obj) self._array_finalize_spec(obj) # The additional arguments self.annotations = getattr(obj, "annotations", {}) # Add empty array annotations, because they cannot always be copied, # but do not overwrite existing ones from slicing etc. # This ensures the attribute exists if not hasattr(self, "array_annotations"): self.array_annotations = ArrayDict(self._get_arr_ann_length()) # Globally recommended attributes self.name = getattr(obj, "name", None) self.file_origin = getattr(obj, "file_origin", None) self.description = getattr(obj, "description", None) # Parent objects self.segment = getattr(obj, "segment", None) @classmethod def _rescale(self, signal, units=None): """ Check that units are present, and rescale the signal if necessary. This is called whenever a new signal is created from the constructor. See :meth:`__new__' in :class:`AnalogSignal` and :class:`IrregularlySampledSignal` """ if units is None: if not hasattr(signal, "units"): raise ValueError("Units must be specified") elif isinstance(signal, pq.Quantity): # This test always returns True, i.e. rescaling is always executed if one of the units # is a pq.CompoundUnit. This is fine because rescaling is correct anyway. if pq.quantity.validate_dimensionality(units) != signal.dimensionality: signal = signal.rescale(units) return signal def __getslice__(self, i, j): """ Get a slice from :attr:`i` to :attr:`j`.attr[0] Doesn't get called in Python 3, :meth:`__getitem__` is called instead """ return self.__getitem__(slice(i, j)) def __ne__(self, other): """ Non-equality test (!=) """ return not self.__eq__(other) def _apply_operator(self, other, op, *args): """ Handle copying metadata to the new signal after a mathematical operation. """ self._check_consistency(other) f = getattr(super(), op) new_signal = f(other, *args) new_signal._copy_data_complement(self) # _copy_data_complement can't always copy array annotations, # so this needs to be done locally new_signal.array_annotations = deepcopy(self.array_annotations) return new_signal def _get_required_attributes(self, signal, units): """ Return a list of the required attributes for a signal as a dictionary """ required_attributes = {} for attr in self._necessary_attrs: if attr[0] == "signal": required_attributes["signal"] = signal elif attr[0] == "image_data": required_attributes["image_data"] = signal elif attr[0] == "t_start": required_attributes["t_start"] = getattr(self, "t_start", 0.0 * pq.ms) else: required_attributes[str(attr[0])] = getattr(self, attr[0], None) required_attributes["units"] = units return required_attributes def duplicate_with_new_data(self, signal, units=None): """ Create a new signal with the same metadata but different data. Required attributes of the signal are used. Note: Array annotations can not be copied here because length of data can change """ if units is None: units = self.units # else: # units = pq.quantity.validate_dimensionality(units) # signal is the new signal required_attributes = self._get_required_attributes(signal, units) new = self.__class__(**required_attributes) new._copy_data_complement(self) new.annotations.update(self.annotations) # Note: Array annotations are not copied here, because it is not ensured # that the same number of signals is used and they would possibly make no sense # when combined with another signal return new def _copy_data_complement(self, other): """ Copy the metadata from another signal. Required and recommended attributes of the signal are used. Note: Array annotations can not be copied here because length of data can change """ all_attr = {self._recommended_attrs, self._necessary_attrs} for sub_at in all_attr: for attr in sub_at: if attr[0] == "t_start": setattr(self, attr[0], deepcopy(getattr(other, attr[0], 0.0 * pq.ms))) elif attr[0] != "signal": setattr(self, attr[0], deepcopy(getattr(other, attr[0], None))) setattr(self, "annotations", deepcopy(getattr(other, "annotations", None))) # Note: Array annotations cannot be copied because length of data can be changed # here # which would cause inconsistencies def __rsub__(self, other, *args): """ Backwards subtraction (other-self) """ return self.__mul__(-1, *args) + other def __add__(self, other, *args): """ Addition (+) """ return self._apply_operator(other, "__add__", *args) def __sub__(self, other, *args): """ Subtraction (-) """ return self._apply_operator(other, "__sub__", *args) def __mul__(self, other, *args): """ Multiplication (*) """ return self._apply_operator(other, "__mul__", *args) def __truediv__(self, other, *args): """ Float division (/) """ return self._apply_operator(other, "__truediv__", *args) def __div__(self, other, *args): """ Integer division (//) """ return self._apply_operator(other, "__div__", *args) __radd__ = __add__ __rmul__ = __sub__ def merge(self, other): """ Merge another signal into this one. The signal objects are concatenated horizontally (column-wise, :func:`np.hstack`). If the attributes of the two signal are not compatible, an Exception is raised. Required attributes of the signal are used. """ for attr in self._necessary_attrs: if "signal" != attr[0]: if getattr(self, attr[0], None) != getattr(other, attr[0], None): raise MergeError(f"Cannot merge these two signals as the {attr[0]} differ.") if self.segment != other.segment: raise MergeError("Cannot merge these two signals as they belong to different segments.") if hasattr(self, "lazy_shape"): if hasattr(other, "lazy_shape"): if self.lazy_shape[0] != other.lazy_shape[0]: raise MergeError("Cannot merge signals of different length.") merged_lazy_shape = (self.lazy_shape[0], self.lazy_shape[1] + other.lazy_shape[1]) else: raise MergeError("Cannot merge a lazy object with a real object.") if other.units != self.units: other = other.rescale(self.units) stack = np.hstack((self.magnitude, other.magnitude)) kwargs = {} for name in ("name", "description", "file_origin"): attr_self = getattr(self, name) attr_other = getattr(other, name) if attr_self == attr_other: kwargs[name] = attr_self else: kwargs[name] = f"merge({attr_self}, {attr_other})" merged_annotations = merge_annotations(self.annotations, other.annotations) kwargs.update(merged_annotations) kwargs["array_annotations"] = self._merge_array_annotations(other) signal = self.__class__( stack, units=self.units, dtype=self.dtype, copy=None, t_start=self.t_start, sampling_rate=self.sampling_rate, **kwargs, ) signal.segment = self.segment if hasattr(self, "lazy_shape"): signal.lazy_shape = merged_lazy_shape return signal def time_slice(self, t_start, t_stop): """ Creates a new AnalogSignal corresponding to the time slice of the original Signal between times t_start, t_stop. """ NotImplementedError("Needs to be implemented for subclasses.") def concatenate(self, *signals): """ Concatenate multiple signals across time. The signal objects are concatenated vertically (row-wise, :func:`np.vstack`). Concatenation can be used to combine signals across segments. Note: Only (array) annotations common to both signals are attached to the concatenated signal. If the attributes of the signals are not compatible, an Exception is raised. Parameters ---------- signals : multiple neo.BaseSignal objects The objects that is concatenated with this one. Returns ------- signal : neo.BaseSignal Signal containing all non-overlapping samples of the source signals. Raises ------ MergeError If `other` object has incompatible attributes. """ NotImplementedError("Patching need to be implemented in subclasses") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/block.py0000644000175100001660000001123114743453644015151 0ustar00runnerdocker""" This module defines :class:`Block`, the main container gathering all the data, whether discrete or continuous, for a given recording session. base class used by all :module:`neo.core` classes. :class:`Block` derives from :class:`Container`, from :module:`neo.core.container`. """ from datetime import datetime from neo.core.container import Container, unique_objs from neo.core.group import Group from neo.core.objectlist import ObjectList from neo.core.segment import Segment class Block(Container): """ Main container gathering all the data, whether discrete or continuous, for a given recording session. A block is not necessarily temporally homogeneous, in contrast to :class:`Segment`. *Usage*:: >>> from neo.core import Block, Segment, Group, AnalogSignal >>> from quantities import nA, kHz >>> import numpy as np >>> >>> # create a Block with 3 Segment and 2 Group objects ,,, blk = Block() >>> for ind in range(3): ... seg = Segment(name='segment %d' % ind, index=ind) ... blk.segments.append(seg) ... >>> for ind in range(2): ... group = Group(name='Array probe %d' % ind) ... blk.groups.append(group) ... >>> # Populate the Block with AnalogSignal objects ... for seg in blk.segments: ... for group in blk.groups: ... a = AnalogSignal(np.random.randn(10000, 64)*nA, ... sampling_rate=10*kHz) ... group.analogsignals.append(a) ... seg.analogsignals.append(a) *Required attributes/properties*: None *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. :file_datetime: (datetime) The creation date and time of the original data file. :rec_datetime: (datetime) The date and time of the original recording. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Container of*: :class:`Segment` :class:`Group` """ _container_child_objects = ("Segment", "Group") _recommended_attrs = ( ("file_datetime", datetime), ("rec_datetime", datetime), ("index", int), ) + Container._recommended_attrs _repr_pretty_attrs_keys_ = Container._repr_pretty_attrs_keys_ + ( "file_origin", "file_datetime", "rec_datetime", "index", ) _repr_pretty_containers = ("segments",) def __init__( self, name=None, description=None, file_origin=None, file_datetime=None, rec_datetime=None, index=None, **annotations, ): """ Initialize a new :class:`Block` instance. """ super().__init__(name=name, description=description, file_origin=file_origin, **annotations) self.file_datetime = file_datetime self.rec_datetime = rec_datetime self.index = index self._segments = ObjectList(Segment, parent=self) self._groups = ObjectList(Group, parent=self) segments = property( fget=lambda self: self._get_object_list("_segments"), fset=lambda self, value: self._set_object_list("_segments", value), doc="list of Segments contained in this block", ) groups = property( fget=lambda self: self._get_object_list("_groups"), fset=lambda self, value: self._set_object_list("_groups", value), doc="list of Groups contained in this block", ) @property def data_children_recur(self): """ All data child objects stored in the current object, obtained recursively. """ # subclassing this to remove duplicate objects such as SpikeTrain # objects in both Segment and Group # Only Block can have duplicate items right now, so implement # this here for performance reasons. return tuple(unique_objs(super().data_children_recur)) def list_children_by_class(self, cls): """ List all children of a particular class recursively. You can either provide a class object, a class name, or the name of the container storing the class. """ # subclassing this to remove duplicate objects such as SpikeTrain # objects in both Segment and Group # Only Block can have duplicate items right now, so implement # this here for performance reasons. return unique_objs(super().list_children_by_class(cls)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/container.py0000644000175100001660000005625114743453644016054 0ustar00runnerdocker""" This module implements generic container base class that all neo container object inherit from. It provides shared methods for all container types. :class:`Container` is derived from :class:`BaseNeo` """ from copy import deepcopy from neo.core import filters from neo.core.baseneo import BaseNeo, _reference_name, _container_name from neo.core.objectlist import ObjectList from neo.core.spiketrain import SpikeTrain from neo.core.spiketrainlist import SpikeTrainList def unique_objs(objs): """ Return a list of objects in the list objs where all objects are unique using the "is" test. """ seen = set() return [obj for obj in objs if id(obj) not in seen and not seen.add(id(obj))] def filterdata(data, targdict=None, objects=None, **kwargs): """ Return a list of the objects in data matching *any* of the search terms in either their attributes or annotations. Search terms can be provided as keyword arguments or a dictionary, either as a positional argument after data or to the argument targdict. A key of a provided dictionary is the name of the requested annotation and the value is a FilterCondition object. E.g.: Equal(x), LessThan(x), InRange(x, y). targdict can also be a list of dictionaries, in which case the filters are applied sequentially. A list of dictionaries is handled as follows: [ { or } and { or } ] If targdict and kwargs are both supplied, the targdict filters are applied first, followed by the kwarg filters. A targdict of None or {} corresponds to no filters applied, therefore returning all child objects. Default targdict is None. """ # if objects are specified, get the classes if objects: if hasattr(objects, "lower") or isinstance(objects, type): objects = [objects] elif objects is not None: return [] # handle cases with targdict if targdict is None: targdict = kwargs elif not kwargs: pass elif hasattr(targdict, "keys"): targdict = [targdict, kwargs] else: targdict += [kwargs] if not targdict: results = data # if multiple dicts are provided, apply each filter sequentially elif not hasattr(targdict, "keys"): # for performance reasons, only do the object filtering on the first # iteration results = filterdata(data, targdict=targdict[0], objects=objects) for targ in targdict[1:]: results = filterdata(results, targdict=targ) return results else: # do the actual filtering results = [] for obj in data: for key, value in sorted(targdict.items()): if hasattr(obj, key) and getattr(obj, key) == value: results.append(obj) break if isinstance(value, filters.FilterCondition) and key in obj.annotations: if value.evaluate(obj.annotations[key]): results.append(obj) break if key in obj.annotations and obj.annotations[key] == value: results.append(obj) break # remove duplicates from results results = list({id(res): res for res in results}.values()) # keep only objects of the correct classes if objects: results = [result for result in results if result.__class__ in objects or result.__class__.__name__ in objects] if results and all(isinstance(obj, SpikeTrain) for obj in results): return SpikeTrainList(results) else: return results class Container(BaseNeo): """ This is the base class from which Neo container objects inherit. It derives from :class:`BaseNeo`. In addition to the setup :class:`BaseNeo` does, this class also automatically sets up the lists to hold the children of the object. Each class can define one or more of the following class attributes (in addition to those of BaseNeo): :_container_child_objects: Neo container objects that can be children of this object. An instance attribute named class.__name__.lower()+'s' will be automatically defined to hold this child and will be initialized to an empty list. :_data_child_objects: Neo data objects that can be children of this object. An instance attribute named class.__name__.lower()+'s' will be automatically defined to hold this child and will be initialized to an empty list. :_repr_pretty_containers: The names of containers attributes printed when pretty-printing using IPython. The following helper properties are available (in addition to those of BaseNeo): :_child_objects: All neo objects that can be children of this object. :_container_child_objects: + :_data_child_objects: :_container_child_containers: The names of the container attributes used to store :_container_child_objects: :_data_child_containers: The names of the container attributes used to store :_data_child_objects: :_single_child_containers: The names of the container attributes used to store :_single_child_objects: :_child_containers: All child container attributes. Same as :_single_child_containers: :_single_children: All objects that are children of the current object where the child can only have one parent of this type. :data_children: All data objects that are children of the current object. :container_children: All container objects that are children of the current object. :children: All Neo objects that are children of the current object. :data_children_recur: All data objects that are children of the current object or any of its children, any of its children's children, etc. :container_children_recur: All container objects that are children of the current object or any of its children, any of its children's children, etc. :children_recur: All Neo objects that are children of the current object or any of its children, any of its children's children, etc. The following "universal" methods are available (in addition to those of BaseNeo): :size: A dictionary where each key is an attribute storing child objects and the value is the number of objects stored in that attribute. :filter(**args): Retrieves children of the current object that have particular properties. :list_children_by_class(**args): Retrieves all children of the current object recursively that are of a particular class. :create_relationship(**args): For each child of the current object, set its parent to be the current object. :merge(**args): Annotations are merged based on the rules of :merge_annotations:. Child objects with the same name and a :merge: method are merged using that method. Other child objects are appended to the relevant container attribute. Parents attributes are NOT changed in this operation. Unlike :BaseNeo.merge:, this method implements all necessary merge rules for a container class. Each child class should: 0) call Container.__init__(self, name=name, description=description, file_origin=file_origin, **annotations) with the universal recommended arguments, plus optional annotations 1) process its required arguments in its __new__ or __init__ method 2) process its non-universal recommended arguments (in its __new__ or __init__ method """ # Child objects that are a container _container_child_objects = () # Child objects that have data _data_child_objects = () # Containers that are listed when pretty-printing _repr_pretty_containers = () def __init__(self, name=None, description=None, file_origin=None, **annotations): """ Initialize a new :class:`Container` instance. """ super().__init__(name=name, description=description, file_origin=file_origin, **annotations) def _get_object_list(self, name): """ Return the container's ObjectList with the given (private) attribute name Example: >>> segment._get_object_list("_analogsignals") """ return getattr(self, name) def _set_object_list(self, name, value): """ Set the contents of the container's ObjectList with the given (private) attribute name Example: >>> segment._set_object_list("_analogsignals", [sig1, sig2]) """ if isinstance(value, list): object_list = getattr(self, name) object_list.clear() object_list.extend(value) elif isinstance(value, ObjectList): # from __iadd__ setattr(self, name, value) else: TypeError("value must be a list or an ObjectList") @property def _child_objects(self): """ Return the names of the classes that can be children of this container. """ return self._container_child_objects + self._data_child_objects @property def _container_child_containers(self): """ Containers for child objects that are a container and have a single parent. """ return tuple([_container_name(child) for child in self._container_child_objects]) @property def _data_child_containers(self): """ Containers for child objects that have data and have a single parent. """ # the following construction removes the duplicate 'regionsofinterest' # while preserving the child order (which `set()` would not do) # I don't know if preserving the order is important, but I'm playing it safe return tuple({_container_name(child): None for child in self._data_child_objects}.keys()) @property def _child_containers(self): """ Containers for child objects with a single parent. """ return tuple({_container_name(child): None for child in self._child_objects}.keys()) @property def _single_children(self): """ All child objects that can only have single parents. """ childs = [list(getattr(self, attr)) for attr in self._child_containers] return tuple(sum(childs, [])) @property def data_children(self): """ All data child objects stored in the current object. Not recursive. """ childs = [list(getattr(self, attr)) for attr in self._data_child_containers] return tuple(sum(childs, [])) @property def container_children(self): """ All container child objects stored in the current object. Not recursive. """ childs = [list(getattr(self, attr)) for attr in self._container_child_containers] return tuple(sum(childs, [])) @property def children(self): """ All child objects stored in the current object. Not recursive. """ return self.data_children + self.container_children @property def data_children_recur(self): """ All data child objects stored in the current object, obtained recursively. """ childs = [list(child.data_children_recur) for child in self.container_children] return self.data_children + tuple(sum(childs, [])) @property def container_children_recur(self): """ All container child objects stored in the current object, obtained recursively. """ childs = [list(child.container_children_recur) for child in self.container_children] return self.container_children + tuple(sum(childs, [])) @property def children_recur(self): """ All child objects stored in the current object, obtained recursively. """ return self.data_children_recur + self.container_children_recur @property def size(self): """ Get dictionary containing the names of child containers in the current object as keys and the number of children of that type as values. """ return {name: len(getattr(self, name)) for name in self._child_containers} @property def _container_lookup(self): return { cls_name: getattr(self, container_name) for cls_name, container_name in zip(self._child_objects, self._child_containers) } def _get_container(self, cls): if hasattr(cls, "proxy_for"): cls = cls.proxy_for return self._container_lookup[cls.__name__] def add(self, *objects): """Add a new Neo object to the Container""" for obj in objects: if obj.__class__.__name__ in self._child_objects or ( hasattr(obj, "proxy_for") and obj.proxy_for.__name__ in self._child_objects ): container = self._get_container(obj.__class__) container.append(obj) else: raise TypeError( f"Cannot add object of type {obj.__class__.__name__} " f"to a {self.__class__.__name__}, can only add objects of the " f"following types: {self._child_objects}" ) def filter(self, targdict=None, data=True, container=False, recursive=True, objects=None, **kwargs): """ Return a list of child objects matching *any* of the search terms in either their attributes or annotations. Search terms can be provided as keyword arguments or a dictionary, either as a positional argument after data or to the argument targdict. A key of a provided dictionary is the name of the requested annotation and the value is a FilterCondition object. E.g.: equal(x), less_than(x), InRange(x, y). targdict can also be a list of dictionaries, in which case the filters are applied sequentially. A list of dictionaries is handled as follows: [ { or } and { or } ] If targdict and kwargs are both supplied, the targdict filters are applied first, followed by the kwarg filters. A targdict of None or {} corresponds to no filters applied, therefore returning all child objects. Default targdict is None. If data is True (default), include data objects. If container is True (default False), include container objects. If recursive is True (default), descend into child containers for objects. objects (optional) should be the name of a Neo object type, a neo object class, or a list of one or both of these. If specified, only these objects will be returned. If not specified any type of object is returned. Default is None. Note that if recursive is True, containers not in objects will still be descended into. This overrides data and container. Examples:: >>> obj.filter(name="Vm") >>> obj.filter(objects=neo.SpikeTrain) >>> obj.filter(targdict={'myannotation':3}) >>> obj.filter(name=neo.core.filters.Equal(5)) >>> obj.filter({'name': neo.core.filters.LessThan(5)}) """ if isinstance(targdict, str): raise TypeError("filtering is based on key-value pairs." " Only a single string was provided.") # if objects are specified, get the classes if objects: data = True container = True children = [] # get the objects we want if data: if recursive: children.extend(self.data_children_recur) else: children.extend(self.data_children) if container: if recursive: children.extend(self.container_children_recur) else: children.extend(self.container_children) filtered = filterdata(children, objects=objects, targdict=targdict, **kwargs) if objects == SpikeTrain: return SpikeTrainList(items=filtered) else: return filtered def list_children_by_class(self, cls): """ List all children of a particular class recursively. You can either provide a class object, a class name, or the name of the container storing the class. """ if not hasattr(cls, "lower"): cls = cls.__name__ container_name = _container_name(cls) objs = list(getattr(self, container_name, [])) for child in self.container_children_recur: objs.extend(getattr(child, container_name, [])) return objs def check_relationships(self, recursive=True): """ Check that the expected child-parent relationships exist. """ parent_name = _reference_name(self.__class__.__name__) for child in self._single_children: if hasattr(child, "proxy_for"): container = getattr(self, _container_name(child.proxy_for.__name__)) else: container = getattr(self, _container_name(child.__class__.__name__)) if container.parent is not None: if getattr(child, parent_name, None) is not self: raise AttributeError("Child should have its parent as an attribute") if recursive: for child in self.container_children: child.check_relationships(recursive=True) def create_relationship(self, force=False, recursive=True): """ For each child of the current object that can only have a single parent, set its parent to be the current object. For children of the current object, put the current object in the parent list. If force is True overwrite any existing relationships If recursive is True descend into child objects and create relationships there """ parent_name = _reference_name(self.__class__.__name__) for child in self._single_children: if hasattr(child, parent_name) and getattr(child, parent_name) is None or force: setattr(child, parent_name, self) if recursive: for child in self.container_children: child.create_relationship(force=force, recursive=True) def __deepcopy__(self, memo): """ Creates a deep copy of the container. All contained objects will also be deep copied and relationships between all objects will be identical to the original relationships. Attributes and annotations of the container are deep copied as well. :param memo: (dict) Objects that have been deep copied already :return: (Container) Deep copy of input Container """ cls = self.__class__ necessary_attrs = {} for k in self._necessary_attrs: necessary_attrs[k[0]] = getattr(self, k[0], None) new_container = cls(**necessary_attrs) new_container.__dict__.update(self.__dict__) memo[id(self)] = new_container for k, v in self.__dict__.items(): try: setattr(new_container, k, deepcopy(v, memo)) except TypeError: setattr(new_container, k, v) new_container.create_relationship() return new_container def merge(self, other): """ Merge the contents of another object into this one. Container children of the current object with the same name will be merged. All other objects will be appended to the list of objects in this one. Duplicate copies of the same object will be skipped. Annotations are merged such that only items not present in the current annotations are added. Note that the other object will be linked inconsistently to other Neo objects after the merge operation and should not be used further. """ # merge containers with the same name for container in self._container_child_containers: lookup = {obj.name: obj for obj in getattr(self, container)} ids = [id(obj) for obj in getattr(self, container)] for obj in getattr(other, container): if id(obj) in ids: continue if obj.name in lookup: lookup[obj.name].merge(obj) else: lookup[obj.name] = obj ids.append(id(obj)) getattr(self, container).append(obj) # for data objects, ignore the name and just add them for container in self._data_child_containers: objs = getattr(self, container) lookup = {obj.name: i for i, obj in enumerate(objs)} ids = [id(obj) for obj in objs] for obj in getattr(other, container): if id(obj) in ids: pass elif hasattr(obj, "merge") and obj.name is not None and obj.name in lookup: ind = lookup[obj.name] try: newobj = getattr(self, container)[ind].merge(obj) getattr(self, container)[ind] = newobj except NotImplementedError: getattr(self, container).append(obj) ids.append(id(obj)) else: lookup[obj.name] = obj ids.append(id(obj)) getattr(self, container).append(obj) obj.set_parent(self) # use the BaseNeo merge as well super().merge(other) def _repr_pretty_(self, pp, cycle): """ Handle pretty-printing. """ pp.text(self.__class__.__name__) pp.text(" with ") vals = [] for container in self._child_containers: objs = getattr(self, container) if objs: vals.append(f"{objs} {container}") pp.text(", ".join(vals)) if self._has_repr_pretty_attrs_(): pp.breakable() self._repr_pretty_attrs_(pp, cycle) for container in self._repr_pretty_containers: pp.breakable() objs = getattr(self, container) pp.text(f"# {container} (N={objs})") for i, obj in enumerate(objs): pp.breakable() pp.text(f"{i}: ") with pp.indent(3): pp.pretty(obj) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/dataobject.py0000644000175100001660000004342614743453644016172 0ustar00runnerdocker""" This module defines :class:`DataObject`, the abstract base class used by all :module:`neo.core` classes that can contain data (i.e. are not container classes). It contains basic functionality that is shared among all those data objects. """ from copy import deepcopy import warnings import quantities as pq import numpy as np from neo.core.baseneo import BaseNeo, _check_annotations def _normalize_array_annotations(value, length): """Check consistency of array annotations Recursively check that value is either an array or list containing only "simple" types (number, string, date/time) or is a dict of those. Parameters ---------- value : np.ndarray or list or tuple or dict Value to be checked for consistency. length : int Required length of the array annotation. Returns ------- np.ndarray The array_annotations from value in correct form Raises ------ ValueError In case value is not accepted as array_annotation(s) """ # First stage, resolve dict of annotations into single annotations if isinstance(value, dict): for key in value.keys(): if isinstance(value[key], dict): raise ValueError("Nested dicts are not allowed as array annotations") value[key] = _normalize_array_annotations(value[key], length) elif value is None: raise ValueError("Array annotations must not be None") # If not array annotation, pass on to regular check and make it a list, that is checked again # This covers array annotations with length 1 elif not isinstance(value, (list, np.ndarray, tuple)) or (isinstance(value, pq.Quantity) and value.shape == ()): _check_annotations(value) value = _normalize_array_annotations(np.array([value]), length) # If array annotation, check for correct length, only single dimension and allowed data else: # Get length that is required for array annotations, which is equal to the length # of the object's data own_length = length # Escape check if empty array or list and just annotate an empty array (length 0) # This enables the user to easily create dummy array annotations that will be filled # with data later on if len(value) == 0: if not isinstance(value, np.ndarray): value = np.ndarray((0,)) val_length = own_length else: # Note: len(o) also works for np.ndarray, it then uses the first dimension, # which is exactly the desired behaviour here val_length = len(value) if not own_length == val_length: raise ValueError(f"Incorrect length of array annotation: {val_length} != {own_length}") # Local function used to check single elements of a list or an array # They must not be lists or arrays and fit the usual annotation data types def _check_single_elem(element): # Nested array annotations not allowed currently # If element is a list or a np.ndarray, it's not conform except if it's a quantity of # length 1 if isinstance(element, list) or ( isinstance(element, np.ndarray) and not (isinstance(element, pq.Quantity) and (element.shape == () or element.shape == (1,))) ): raise ValueError("Array annotations should only be 1-dimensional") if isinstance(element, dict): raise ValueError("Dictionaries are not supported as array annotations") # Perform regular check for elements of array or list _check_annotations(element) # Arrays only need testing of single element to make sure the others are the same if isinstance(value, np.ndarray): # Type of first element is representative for all others # Thus just performing a check on the first element is enough # Even if it's a pq.Quantity, which can be scalar or array, this is still true # Because a np.ndarray cannot contain scalars and sequences simultaneously # If length of data is 0, then nothing needs to be checked if len(value): # Perform check on first element _check_single_elem(value[0]) return value # In case of list, it needs to be ensured that all data are of the same type else: # Conversion to numpy array makes all elements same type # Converts elements to most general type try: value = np.array(value) # Except when scalar and non-scalar values are mixed, this causes conversion to fail except ValueError as e: msg = str(e) if "setting an array element with a sequence." in msg: raise ValueError( "Scalar values and arrays/lists cannot be " "combined into a single array annotation" ) else: raise e # If most specialized data type that possibly fits all elements is object, # raise an Error with a telling error message, because this means the elements # are not compatible if value.dtype == object: raise ValueError("Cannot convert list of incompatible types into a single" " array annotation") # Check the first element for correctness # If its type is correct for annotations, all others are correct as well # Note: Empty lists cannot reach this point _check_single_elem(value[0]) return value class DataObject(BaseNeo, pq.Quantity): """ This is the base class from which all objects containing data inherit It contains common functionality for all those objects and handles array_annotations. Parameters ---------- name: str | None, default: None Name of the Neo object description: str | None, default: None Human readable string description of the Neo object array_annotations: dict | None, default: None Dictionary containing arrays / lists which annotate individual data points of the Neo object. **annotations: dict | None: Other keyword annotations to be included Notes ----- Common functionality that is not included in BaseNeo includes: - duplicating with new data - rescaling the object - copying the object - returning it as pq.Quantity or np.ndarray - handling of array_annotations Array_annotations are a kind of annotation that contains metadata for every data point, i.e. per timestamp (in SpikeTrain, Event and Epoch) or signal channel (in AnalogSignal and IrregularlySampledSignal). They can contain the same data types as regular annotations, but are always represented as numpy arrays of the same length as the number of data points of the annotated neo object. """ def __init__(self, name=None, description=None, file_origin=None, array_annotations=None, **annotations): """ This method is called by each data object and initializes the newly created object by adding array annotations and calling __init__ of the super class, where more annotations and attributes are processed. """ if not hasattr(self, "array_annotations") or not self.array_annotations: self.array_annotations = ArrayDict(self._get_arr_ann_length()) if array_annotations is not None: self.array_annotate(**array_annotations) BaseNeo.__init__(self, name=name, description=description, file_origin=file_origin, **annotations) def array_annotate(self, **array_annotations): """ Add array annotations (annotations for individual data points) as arrays to a Neo data object. Parameters ---------- **array_annotations: dict Series of keyword annotations to add to the object Examples -------- >>> obj.array_annotate(code=['a', 'b', 'a'], category=[2, 1, 1]) >>> obj.array_annotations['code'][1] 'b' """ self.array_annotations.update(array_annotations) def array_annotations_at_index(self, index): """ Return dictionary of array annotations at a given index or list of indices Parameters ---------- index: int | list | np.ndarray The index (indices) from which the annotations are extracted Returns ------- index_annotations: dict Dictionary of values or numpy arrays containing all array annotations for given index/indices Examples -------- >>> obj.array_annotate(code=['a', 'b', 'a'], category=[2, 1, 1]) >>> obj.array_annotations_at_index(1) {code='b', category=1} """ # Taking only a part of the array annotations # Thus not using ArrayDict here, because checks for length are not needed index_annotations = {} # Use what is given as an index to determine the corresponding annotations, # if not possible, numpy raises an Error for ann in self.array_annotations.keys(): # NO deepcopy, because someone might want to alter the actual object using this try: index_annotations[ann] = self.array_annotations[ann][index] except IndexError as e: # IndexError caused by 'dummy' array annotations should not result in failure # Taking a slice from nothing results in nothing if len(self.array_annotations[ann]) == 0 and not self._get_arr_ann_length() == 0: index_annotations[ann] = self.array_annotations[ann] else: raise e return index_annotations def _merge_array_annotations(self, other): """ Merges array annotations of 2 different objects. Parameters ---------- other: any The annotation to attemp to merge Returns ------- merged_array_annotations: dict The merged annotations Notes ----- The merge happens in such a way that the result fits the merged data In general this means concatenating the arrays from the 2 objects. If an annotation is only present in one of the objects, it will be omitted """ merged_array_annotations = {} omitted_keys_self = [] # Concatenating arrays for each key for key in self.array_annotations: try: value = deepcopy(self.array_annotations[key]) other_value = deepcopy(other.array_annotations[key]) # Quantities need to be rescaled to common unit if isinstance(value, pq.Quantity): try: other_value = other_value.rescale(value.units) except ValueError: raise ValueError("Could not merge array annotations " "due to different units") merged_array_annotations[key] = np.append(value, other_value) * value.units else: merged_array_annotations[key] = np.append(value, other_value) except KeyError: # Save the omitted keys to be able to print them omitted_keys_self.append(key) continue # Also save omitted keys from 'other' omitted_keys_other = [key for key in other.array_annotations if key not in self.array_annotations] # Warn if keys were omitted if omitted_keys_other or omitted_keys_self: warnings.warn( f"The following array annotations were omitted, because they were only " f"present in one of the merged objects: {omitted_keys_self} from the " f"one that was merged into and {omitted_keys_other} from the one that " f"was merged into the other", UserWarning, ) # Return the merged array_annotations return merged_array_annotations def rescale(self, units, dtype=None): """ Return a copy of the object converted to the specified units. Parameters ---------- units: quantity unit The units to convert the object to dtype: a numpy dtype Only exists for backward compatibility see [1] Returns ------- self.copy(): Any A copy of the object with the desired units Notes ----- [1] The `dtype` argument exists only for backward compatibility within quantities, see https://github.com/python-quantities/python-quantities/pull/204 """ # Use simpler functionality, if nothing will be changed dim = pq.quantity.validate_dimensionality(units) if self.dimensionality == dim: return self.copy() # Rescale the object into a new object obj = self.duplicate_with_new_data(signal=self.view(pq.Quantity).rescale(dim), units=units) # Expected behavior is deepcopy, so deepcopying array_annotations obj.array_annotations = deepcopy(self.array_annotations) obj.segment = self.segment return obj # Needed to implement this so array annotations are copied as well, ONLY WHEN copying 1:1 def copy(self, **kwargs): """ Returns a shallow copy of the object :return: Copy of self """ obj = super().copy(**kwargs) obj.array_annotations = self.array_annotations return obj def as_array(self, units=None): """ Return the object's data as a plain NumPy array. Parameters ---------- units: quantities units | None, default: None The data return as a np.ndarray with units requested Returns ------- data_array: np.ndarray The data as an array If `units` is specified, first rescale to those units. """ if units: return self.rescale(units).magnitude else: return self.magnitude def as_quantity(self): """ Return the object's data as a quantities array. """ return self.view(pq.Quantity) def _get_arr_ann_length(self): """ Return the length of the object's data as required for array annotations This is the last dimension of every object. :return Required length of array annotations for this object """ # Number of items is last dimension in of data object # This method should be overridden in case this changes try: length = self.shape[-1] # Note: This is because __getitem__[int] returns a scalar Epoch/Event/SpikeTrain # To be removed if __getitem__[int] is changed except IndexError: length = 1 return length def __deepcopy__(self, memo): """ Create a deep copy of the data object. All attributes and annotations are also deep copied. References to parent objects are not kept, they are set to None. :param memo: (dict) Objects that have been deep copied already :return: (DataObject) Deep copy of the input DataObject """ cls = self.__class__ necessary_attrs = {} # Units need to be specified explicitly for analogsignals/irregularlysampledsignals for k in self._necessary_attrs + (("units",),): necessary_attrs[k[0]] = getattr(self, k[0], self) # Create object using constructor with necessary attributes new_obj = cls(**necessary_attrs) # Add all attributes new_obj.__dict__.update(self.__dict__) memo[id(self)] = new_obj for k, v in self.__dict__.items(): # Single parent objects should not be deepcopied, because this is not expected behavior # and leads to a lot of stuff being copied (e.g. all other children of the parent as well), # thus creating a lot of overhead # But keeping the reference to the same parent is not desired either, because this would be unidirectional # When deepcopying top-down, e.g. a whole block, the links will be handled by the parent if k in self._parent_attrs: setattr(new_obj, k, None) continue try: setattr(new_obj, k, deepcopy(v, memo)) except TypeError: setattr(new_obj, k, v) return new_obj class ArrayDict(dict): """Dictionary subclass to handle array annotations When setting `obj.array_annotations[key]=value`, checks for consistency should not be bypassed. This class overrides __setitem__ from dict to perform these checks every time. The method used for these checks is given as an argument for __init__. """ def __init__(self, length, check_function=_normalize_array_annotations, *args, **kwargs): super().__init__(*args, **kwargs) self.check_function = check_function self.length = length def __setitem__(self, key, value): # Directly call the defined function # Need to wrap key and value in a dict in order to make sure # that nested dicts are detected value = self.check_function({key: value}, self.length)[key] super().__setitem__(key, value) # Updating the dict also needs to perform checks, so rerouting this to __setitem__ def update(self, *args, **kwargs): if args: if len(args) > 1: raise TypeError("update expected at most 1 arguments, " f"got {len(args)}") other = dict(args[0]) for key in other: self[key] = other[key] for key in kwargs: self[key] = kwargs[key] def __reduce__(self): return super().__reduce__() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/epoch.py0000644000175100001660000003537614743453644015175 0ustar00runnerdocker""" This module defines :class:`Epoch`, an array of epochs. :class:`Epoch` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`. """ from copy import deepcopy from numbers import Number import numpy as np import quantities as pq from neo.core.baseneo import BaseNeo, merge_annotations from neo.core.dataobject import DataObject, ArrayDict def _new_epoch( cls, times=None, durations=None, labels=None, units=None, name=None, description=None, file_origin=None, array_annotations=None, annotations=None, segment=None, ): """ A function to map epoch.__new__ to function that does not do the unit checking. This is needed for pickle to work. """ e = Epoch( times=times, durations=durations, labels=labels, units=units, name=name, file_origin=file_origin, description=description, array_annotations=array_annotations, **annotations, ) e.segment = segment return e class Epoch(DataObject): """ Array of epochs. Parameters ---------- times: quantity array 1D | numpy array 1D | list | None, default: None The start times of each time period. If None, generates an empty array durations: quantity array 1D | numpy array 1D | list | quantity scalar | float | None, default: None The length(s) of each time period. If a scalar/float, the same value is used for all time periods. If None, generates an empty array labels: numpy.array 1D dtype='U' | list | None, default: None Names or labels for the time periods. If None, creates an empty array units: quantity units | str | None, default: None The units for the time Required if the times is a list or NumPy, not required if it is a :class:`Quantity` name: (str) A label for the dataset, description: (str) Text description, file_origin: (str) Filesystem path or URL of the original data file. *Usage*:: >>> from neo.core import Epoch >>> from quantities import s, ms >>> import numpy as np >>> >>> epc = Epoch(times=np.arange(0, 30, 10)*s, ... durations=[10, 5, 7]*ms, ... labels=np.array(['btn0', 'btn1', 'btn2'], dtype='U')) >>> >>> epc.times array([ 0., 10., 20.]) * s >>> epc.durations array([ 10., 5., 7.]) * ms >>> epc.labels array(['btn0', 'btn1', 'btn2'], dtype=' 1: raise ValueError("Times array has more than 1 dimension") if isinstance(durations, (list, tuple)): durations = np.array(durations) elif durations is None: durations = np.array([]) * pq.s elif isinstance(durations, Number): durations = durations * np.ones(times.shape) elif durations.size != times.size: if durations.size == 1: durations = durations * np.ones_like(times.magnitude) else: raise ValueError("Durations array has different length to times") if labels is None: labels = np.array([], dtype="U") else: labels = np.array(labels) if labels.size != times.size and labels.size: raise ValueError("Labels array has different length to times") if units is None: # No keyword units, so get from `times` try: units = times.units dim = units.dimensionality except AttributeError: raise ValueError("you must specify units") else: if hasattr(units, "dimensionality"): dim = units.dimensionality else: dim = pq.quantity.validate_dimensionality(units) if not hasattr(durations, "dimensionality"): durations = pq.Quantity(durations, dim) # check to make sure the units are time # this approach is much faster than comparing the # reference dimensionality if len(dim) != 1 or list(dim.values())[0] != 1 or not isinstance(list(dim.keys())[0], pq.UnitTime): ValueError(f"Unit {units} has dimensions {dim.simplified}, not [time]") obj = pq.Quantity.__new__(cls, times, units=dim) obj._labels = labels obj._durations = durations obj.segment = None return obj def __init__( self, times=None, durations=None, labels=None, units=None, name=None, description=None, file_origin=None, array_annotations=None, **annotations, ): """ Initialize a new :class:`Epoch` instance. """ DataObject.__init__( self, name=name, file_origin=file_origin, description=description, array_annotations=array_annotations, **annotations, ) def __reduce__(self): """ Map the __new__ function onto _new_epoch, so that pickle works """ return _new_epoch, ( self.__class__, self.times, self.durations, self.labels, self.units, self.name, self.file_origin, self.description, self.array_annotations, self.annotations, self.segment, ) def __array_finalize__(self, obj): super().__array_finalize__(obj) self._durations = getattr(obj, "durations", None) self._labels = getattr(obj, "labels", None) self.annotations = getattr(obj, "annotations", None) self.name = getattr(obj, "name", None) self.file_origin = getattr(obj, "file_origin", None) self.description = getattr(obj, "description", None) self.segment = getattr(obj, "segment", None) # Add empty array annotations, because they cannot always be copied, # but do not overwrite existing ones from slicing etc. # This ensures the attribute exists if not hasattr(self, "array_annotations"): self.array_annotations = ArrayDict(self._get_arr_ann_length()) def __repr__(self): """ Returns a string representing the :class:`Epoch`. """ objs = [ f"{label}@{str(time)} for {str(dur)}" for label, time, dur in zip(self.labels, self.times, self.durations) ] return "" % ", ".join(objs) def _repr_pretty_(self, pp, cycle): labels = "" if self._labels is not None: labels = " with labels" pp.text( f"{self.__class__.__name__} containing {self.size} epochs{labels}; " f"time units {self.units.dimensionality.string}; datatype {self.dtype} " ) if self._has_repr_pretty_attrs_(): pp.breakable() self._repr_pretty_attrs_(pp, cycle) def rescale(self, units, dtype=None): """ Return a copy of the :class:`Epoch` converted to the specified units The `dtype` argument exists only for backward compatibility within quantities, see https://github.com/python-quantities/python-quantities/pull/204 :return: Copy of self with specified units """ # Use simpler functionality, if nothing will be changed dim = pq.quantity.validate_dimensionality(units) if self.dimensionality == dim: return self.copy() # Rescale the object into a new object obj = self.duplicate_with_new_data( times=self.view(pq.Quantity).rescale(dim), durations=self.durations.rescale(dim), labels=self.labels, units=units, ) # Expected behavior is deepcopy, so deepcopying array_annotations obj.array_annotations = deepcopy(self.array_annotations) obj.segment = self.segment return obj def __getitem__(self, i): """ Get the item or slice :attr:`i`. """ obj = super().__getitem__(i) obj._durations = self.durations[i] if self._labels is not None and self._labels.size > 0: obj._labels = self.labels[i] else: obj._labels = self.labels try: # Array annotations need to be sliced accordingly obj.array_annotate(**deepcopy(self.array_annotations_at_index(i))) obj._copy_data_complement(self) except AttributeError: # If Quantity was returned, not Epoch obj.times = obj obj.durations = obj._durations obj.labels = obj._labels return obj def __getslice__(self, i, j): """ Get a slice from :attr:`i` to :attr:`j`.attr[0] Doesn't get called in Python 3, :meth:`__getitem__` is called instead """ return self.__getitem__(slice(i, j)) @property def times(self): return pq.Quantity(self) def merge(self, other): """ Merge the another :class:`Epoch` into this one. The :class:`Epoch` objects are concatenated horizontally (column-wise), :func:`np.hstack`). If the attributes of the two :class:`Epoch` are not compatible, and Exception is raised. """ othertimes = other.times.rescale(self.times.units) otherdurations = other.durations.rescale(self.durations.units) times = np.hstack([self.times, othertimes]) * self.times.units durations = np.hstack([self.durations, otherdurations]) * self.durations.units labels = np.hstack([self.labels, other.labels]) kwargs = {} for name in ("name", "description", "file_origin"): attr_self = getattr(self, name) attr_other = getattr(other, name) if attr_self == attr_other: kwargs[name] = attr_self else: kwargs[name] = f"merge({attr_self}, {attr_other})" merged_annotations = merge_annotations(self.annotations, other.annotations) kwargs.update(merged_annotations) kwargs["array_annotations"] = self._merge_array_annotations(other) return Epoch(times=times, durations=durations, labels=labels, **kwargs) def _copy_data_complement(self, other): """ Copy the metadata from another :class:`Epoch`. Note: Array annotations can not be copied here because length of data can change """ # Note: Array annotations cannot be copied because length of data could be changed # here which would cause inconsistencies. This is instead done locally. for attr in ("name", "file_origin", "description"): setattr(self, attr, deepcopy(getattr(other, attr, None))) self._copy_annotations(other) def _copy_annotations(self, other): self.annotations = deepcopy(other.annotations) def duplicate_with_new_data(self, times, durations, labels, units=None): """ Create a new :class:`Epoch` with the same metadata but different data (times, durations) Note: Array annotations can not be copied here because length of data can change """ if units is None: units = self.units else: units = pq.quantity.validate_dimensionality(units) new = self.__class__(times=times, durations=durations, labels=labels, units=units) new._copy_data_complement(self) new._labels = labels new._durations = durations # Note: Array annotations can not be copied here because length of data can change return new def time_slice(self, t_start, t_stop): """ Creates a new :class:`Epoch` corresponding to the time slice of the original :class:`Epoch` between (and including) times :attr:`t_start` and :attr:`t_stop`. Either parameter can also be None to use infinite endpoints for the time interval. """ _t_start = t_start _t_stop = t_stop if t_start is None: _t_start = -np.inf if t_stop is None: _t_stop = np.inf indices = (self >= _t_start) & (self <= _t_stop) # Time slicing should create a deep copy of the object new_epc = deepcopy(self[indices]) return new_epc def time_shift(self, t_shift): """ Shifts an :class:`Epoch` by an amount of time. Parameters ---------- t_shift: Quantity (time) Amount of time by which to shift the :class:`Epoch`. Returns ------- epoch: :class:`Epoch` New instance of an :class:`Epoch` object starting at t_shift later than the original :class:`Epoch` (the original :class:`Epoch` is not modified). """ new_epc = self.duplicate_with_new_data(times=self.times + t_shift, durations=self.durations, labels=self.labels) # Here we can safely copy the array annotations since we know that # the length of the Epoch does not change. new_epc.array_annotate(**self.array_annotations) return new_epc def set_labels(self, labels): if self.labels is not None and self.labels.size > 0 and len(labels) != self.size: raise ValueError(f"Labels array has different length to times " f"({len(labels)} != {self.size})") self._labels = np.array(labels) def get_labels(self): return self._labels labels = property(get_labels, set_labels) def set_durations(self, durations): if self.durations is not None and self.durations.size > 0 and len(durations) != self.size: raise ValueError("Durations array has different length to times " f"({len(durations)} != {self.size})") self._durations = durations def get_durations(self): return self._durations durations = property(get_durations, set_durations) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/event.py0000644000175100001660000003604114743453644015206 0ustar00runnerdocker""" This module defines :class:`Event`, an array of events. :class:`Event` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`. """ from copy import deepcopy import numpy as np import quantities as pq from neo.core.baseneo import merge_annotations from neo.core.dataobject import DataObject, ArrayDict from neo.core.epoch import Epoch def _new_event( cls, times=None, labels=None, units=None, name=None, file_origin=None, description=None, array_annotations=None, annotations=None, segment=None, ): """ A function to map Event.__new__ to function that does not do the unit checking. This is needed for pickle to work. """ e = Event( times=times, labels=labels, units=units, name=name, file_origin=file_origin, description=description, array_annotations=array_annotations, **annotations, ) e.segment = segment return e class Event(DataObject): """ Array of events which are the start times of events along with the labels of the events Parameters ---------- times: quantity array 1d | list The times of the events labels: numpy.ndarray 1d dtype='U' | list Names or labels for the events units: quantity units | None, default: None If times are list the units of the times If times is a quantity array this is ignored name: str | None, default: None An optional label for the dataset description: str | None, default: None An optional text descriptoin of the dataset file_orgin: str | None, default: None The filesystem path or url of the original data file array_annotations: dict | None, default: None Dict mapping strings to numpy arrays containing annotations for all data points **annotations: dict Additional user specified metadata stored in the annotations attribue Examples -------- >>> from neo.core import Event >>> from quantities import s >>> import numpy as np >>> >>> evt = Event(np.arange(0, 30, 10)*s, ... labels=np.array(['trig0', 'trig1', 'trig2'], ... dtype='U')) >>> >>> evt.times array([ 0., 10., 20.]) * s >>> evt.labels array(['trig0', 'trig1', 'trig2'], dtype=' 1: raise ValueError("Times array has more than 1 dimension") if labels is None: labels = np.array([], dtype="U") else: labels = np.array(labels) if labels.size != times.size and labels.size: raise ValueError("Labels array has different length to times") if units is None: # No keyword units, so get from `times` try: units = times.units dim = units.dimensionality except AttributeError: raise ValueError("you must specify units") else: if hasattr(units, "dimensionality"): dim = units.dimensionality else: dim = pq.quantity.validate_dimensionality(units) # check to make sure the units are time # this approach is much faster than comparing the # reference dimensionality if len(dim) != 1 or list(dim.values())[0] != 1 or not isinstance(list(dim.keys())[0], pq.UnitTime): ValueError(f"Unit {units} has dimensions {dim.simplified}, not [time].") obj = pq.Quantity(times, units=dim).view(cls) obj._labels = labels obj.segment = None return obj def __init__( self, times=None, labels=None, units=None, name=None, description=None, file_origin=None, array_annotations=None, **annotations, ): """ Initialize a new :class:`Event` instance. """ DataObject.__init__( self, name=name, file_origin=file_origin, description=description, array_annotations=array_annotations, **annotations, ) def __reduce__(self): """ Map the __new__ function onto _new_event, so that pickle works """ return _new_event, ( self.__class__, np.array(self), self.labels, self.units, self.name, self.file_origin, self.description, self.array_annotations, self.annotations, self.segment, ) def __array_finalize__(self, obj): super().__array_finalize__(obj) self._labels = getattr(obj, "labels", None) self.annotations = getattr(obj, "annotations", None) self.name = getattr(obj, "name", None) self.file_origin = getattr(obj, "file_origin", None) self.description = getattr(obj, "description", None) self.segment = getattr(obj, "segment", None) # Add empty array annotations, because they cannot always be copied, # but do not overwrite existing ones from slicing etc. # This ensures the attribute exists if not hasattr(self, "array_annotations"): self.array_annotations = ArrayDict(self._get_arr_ann_length()) def __repr__(self): """ Returns a string representing the :class:`Event`. """ objs = [f"{label}@{str(time)}" for label, time in zip(self.labels, self.times)] return "" % ", ".join(objs) def _repr_pretty_(self, pp, cycle): labels = "" if self._labels is not None: labels = " with labels" pp.text( f"{self.__class__.__name__} containing {self.size} events{labels}; " f"time units {self.units.dimensionality.string}; datatype {self.dtype} " ) if self._has_repr_pretty_attrs_(): pp.breakable() self._repr_pretty_attrs_(pp, cycle) def rescale(self, units, dtype=None): """ Return a copy of the :class:`Event` converted to the specified units Parameters ---------- units: quantity units The units to convert the Event to dtype: None Exists for backward compatiblity within quantities see Notes for more info Returns ------- obj: neo.core.Event A copy of the event with the specified units Notes ----- The `dtype` argument exists only for backward compatibility within quantities, see https://github.com/python-quantities/python-quantities/pull/204 """ # Use simpler functionality, if nothing will be changed dim = pq.quantity.validate_dimensionality(units) if self.dimensionality == dim: return self.copy() # Rescale the object into a new object obj = self.duplicate_with_new_data(times=self.view(pq.Quantity).rescale(dim), labels=self.labels, units=units) # Expected behavior is deepcopy, so deepcopying array_annotations obj.array_annotations = deepcopy(self.array_annotations) obj.segment = self.segment return obj @property def times(self): return pq.Quantity(self) def merge(self, other): """ Merge another :class:`Event` into this one. Parameter --------- other: neo.core.Event The `Event` to merge into this one Notes ----- * The :class:`Event` objects are concatenated horizontally (column-wise), :func:`np.hstack`). * If the attributes of the two :class:`Event` are not compatible, and Exception is raised. """ othertimes = other.times.rescale(self.times.units) times = np.hstack([self.times, othertimes]) * self.times.units labels = np.hstack([self.labels, other.labels]) kwargs = {} for name in ("name", "description", "file_origin"): attr_self = getattr(self, name) attr_other = getattr(other, name) if attr_self == attr_other: kwargs[name] = attr_self else: kwargs[name] = f"merge({attr_self}, {attr_other})" print("Event: merge annotations") merged_annotations = merge_annotations(self.annotations, other.annotations) kwargs.update(merged_annotations) kwargs["array_annotations"] = self._merge_array_annotations(other) evt = Event(times=times, labels=labels, **kwargs) return evt def _copy_data_complement(self, other): """ Copy the metadata from another :class:`Event`. Note: Array annotations can not be copied here because length of data can change """ # Note: Array annotations, including labels, cannot be copied # because they are linked to their respective timestamps and length of data can be changed # here which would cause inconsistencies for attr in ("name", "file_origin", "description", "annotations"): setattr(self, attr, deepcopy(getattr(other, attr, None))) def __getitem__(self, i): obj = super().__getitem__(i) if self._labels is not None and self._labels.size > 0: obj.labels = self._labels[i] else: obj.labels = self._labels try: obj.array_annotate(**deepcopy(self.array_annotations_at_index(i))) obj._copy_data_complement(self) except AttributeError: # If Quantity was returned, not Event obj.times = obj return obj def set_labels(self, labels): if self.labels is not None and self.labels.size > 0 and len(labels) != self.size: raise ValueError(f"Labels array has different length to times " f"({len(labels)} != {self.size})") self._labels = np.array(labels) def get_labels(self): return self._labels labels = property(get_labels, set_labels) def duplicate_with_new_data(self, times, labels, units=None): """ Create a new :class:`Event` with the same metadata but different data Note: Array annotations can not be copied here because length of data can change """ if units is None: units = self.units else: units = pq.quantity.validate_dimensionality(units) new = self.__class__(times=times, units=units) new._copy_data_complement(self) new.labels = labels # Note: Array annotations cannot be copied here, because length of data can be changed return new def time_slice(self, t_start, t_stop): """ Creates a new `Event` corresponding to the time slice of the original `Event` between (and including) times `t_start` and `t_stop`. Parameters ---------- t_start: float | None The starting time of the time slice If None will use -np.inf for the starting time t_stop: float | None The stopping time of the time slice If None will use np.inf for the stopping time Returns ------- new_evt: neo.core.Event The new `Event` limited by the time points """ _t_start = t_start _t_stop = t_stop if t_start is None: _t_start = -np.inf if t_stop is None: _t_stop = np.inf indices = (self >= _t_start) & (self <= _t_stop) # Time slicing should create a deep copy of the object new_evt = deepcopy(self[indices]) return new_evt def time_shift(self, t_shift): """ Shifts an :class:`Event` by an amount of time. Parameters ---------- t_shift: Quantity (time) Amount of time by which to shift the :class:`Event`. Returns ------- epoch: Event New instance of an :class:`Event` object starting at t_shift later than the original :class:`Event` (the original :class:`Event` is not modified). """ new_evt = self.duplicate_with_new_data(times=self.times + t_shift, labels=self.labels) # Here we can safely copy the array annotations since we know that # the length of the Event does not change. new_evt.array_annotate(**self.array_annotations) return new_evt def to_epoch(self, pairwise=False, durations=None): """ Returns a new Epoch object based on the times and labels in the Event object. This method has three modes of action. 1. By default, an array of `n` event times will be transformed into `n-1` epochs, where the end of one epoch is the beginning of the next. This assumes that the events are ordered in time; it is the responsibility of the caller to check this is the case. 2. If `pairwise` is True, then the event times will be taken as pairs representing the start and end time of an epoch. The number of events must be even, otherwise a ValueError is raised. 3. If `durations` is given, it should be a scalar Quantity or a Quantity array of the same size as the Event. Each event time is then taken as the start of an epoch of duration given by `durations`. `pairwise=True` and `durations` are mutually exclusive. A ValueError will be raised if both are given. If `durations` is given, epoch labels are set to the corresponding labels of the events that indicate the epoch start If `durations` is not given, then the event labels A and B bounding the epoch are used to set the labels of the epochs in the form 'A-B'. """ if pairwise: # Mode 2 if durations is not None: raise ValueError("Inconsistent arguments. " "Cannot give both `pairwise` and `durations`") if self.size % 2 != 0: raise ValueError("Pairwise conversion of events to epochs" " requires an even number of events") times = self.times[::2] durations = self.times[1::2] - times labels = np.array([f"{a}-{b}" for a, b in zip(self.labels[::2], self.labels[1::2])]) elif durations is None: # Mode 1 times = self.times[:-1] durations = np.diff(self.times) labels = np.array([f"{a}-{b}" for a, b in zip(self.labels[:-1], self.labels[1:])]) else: # Mode 3 times = self.times labels = self.labels return Epoch(times=times, durations=durations, labels=labels) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/filters.py0000644000175100001660000001421414743453644015533 0ustar00runnerdocker""" This module implements :class:`FilterCondition`, which enables use of different filter conditions for neo.core.container.filter. Classes: - :class:`FilterCondition`: Abstract base class for defining filter conditions. - :class:`Equals`: Filter condition to check if a value is equal to the control value. - :class:`IsNot`: Filter condition to check if a value is not equal to the control value. - :class:`LessThanOrEquals`: Filter condition to check if a value is less than or equal to the control value. - :class:`GreaterThanOrEquals`: Filter condition to check if a value is greater than or equal to the control value. - :class:`LessThan`: Filter condition to check if a value is less than the control value. - :class:`GreaterThan`: Filter condition to check if a value is greater than the control value. - :class:`IsIn`: Filter condition to check if a value is in a list or equal to the control value. - :class:`InRange`: Filter condition to check if a value is in a specified range. The provided classes allow users to select filter conditions and use them with :func:`neo.core.container.filter()` to perform specific filtering operations on data. """ from abc import ABC, abstractmethod from numbers import Number from typing import Union, Any class FilterCondition(ABC): """ FilterCondition object is given as parameter to container.filter(): Usage: segment.filter(my_annotation=) or segment=filter({'my_annotation': }) """ @abstractmethod def __init__(self, control: Any) -> None: """ Initialize new FilterCondition object. Parameters ---------- control: Any The control value to be used for filtering. Notes ----- This is an abstract base class and should not be instantiated directly. """ @abstractmethod def evaluate(self, compare: Any) -> bool: """ Evaluate the filter condition for given value. Parameters: ----------- compare: Any The value to be compared with the control value. Returns ------- bool: True if the condition is satisfied, False otherwise. Notes ----- This method should be implemented in subclasses. """ class Equals(FilterCondition): """ Filter condition to check if target value is equal to the control value. """ def __init__(self, control: Any) -> None: self.control = control def evaluate(self, compare: Any) -> bool: return compare == self.control class IsNot(FilterCondition): """ Filter condition to check if target value is not equal to the control value. """ def __init__(self, control: Any) -> None: self.control = control def evaluate(self, compare: Any) -> bool: return compare != self.control class LessThanOrEquals(FilterCondition): """ Filter condition to check if target value is less than or equal to the control value. """ def __init__(self, control: Number) -> None: self.control = control def evaluate(self, compare: Number) -> bool: return compare <= self.control class GreaterThanOrEquals(FilterCondition): """ Filter condition to check if target value is greater than or equal to the control value. """ def __init__(self, control: Number) -> None: self.control = control def evaluate(self, compare: Number) -> bool: return compare >= self.control class LessThan(FilterCondition): """ Filter condition to check if target value is less than the control value. """ def __init__(self, control: Number) -> None: self.control = control def evaluate(self, compare: Number) -> bool: return compare < self.control class GreaterThan(FilterCondition): """ Filter condition to check if target value is greater than the control value. """ def __init__(self, control: Number) -> None: self.control = control def evaluate(self, compare: Number) -> bool: return compare > self.control class IsIn(FilterCondition): """ Filter condition to check if target is in control. """ def __init__(self, control: Union[list, tuple, set, int]) -> None: self.control = control def evaluate(self, compare: Any) -> bool: if isinstance(self.control, (list, tuple, set)): return compare in self.control if isinstance(self.control, int): return compare == self.control raise SyntaxError("parameter not of type list, tuple, set or int") class InRange(FilterCondition): """ Filter condition to check if a value is in a specified range. Parameters ----------- lower_bound: int The lower bound of the range. upper_bound: int The upper bound of the range. left_closed: bool If True, the range includes the lower bound (lower_bound <= compare). right_closed: bool If True, the range includes the upper bound (compare <= upper_bound). Returns ------- bool: whether the values are in range Examples -------- >>> InRange(lower_bound, upper_bound, left_closed=False, right_closed=False) """ def __init__( self, lower_bound: Number, upper_bound: Number, left_closed: bool = False, right_closed: bool = False ) -> None: if not isinstance(lower_bound, Number) or not isinstance(upper_bound, Number): raise ValueError("parameter is not a number") self.lower_bound = lower_bound self.upper_bound = upper_bound self.left_closed = left_closed self.right_closed = right_closed def evaluate(self, compare: Number) -> bool: if not self.left_closed and not self.right_closed: return self.lower_bound <= compare <= self.upper_bound if not self.left_closed and self.right_closed: return self.lower_bound <= compare < self.upper_bound if self.left_closed and not self.right_closed: return self.lower_bound < compare <= self.upper_bound return self.lower_bound < compare < self.upper_bound ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/group.py0000644000175100001660000001470114743453644015220 0ustar00runnerdocker""" This module implements :class:`Group`, which represents a subset of the channels in an :class:`AnalogSignal` or :class:`IrregularlySampledSignal`. It replaces and extends the grouping function of the former :class:`ChannelIndex` and :class:`Unit`. """ from neo.core.container import Container from neo.core.analogsignal import AnalogSignal from neo.core.container import Container from neo.core.objectlist import ObjectList from neo.core.epoch import Epoch from neo.core.event import Event from neo.core.imagesequence import ImageSequence from neo.core.irregularlysampledsignal import IrregularlySampledSignal from neo.core.segment import Segment from neo.core.spiketrainlist import SpikeTrainList from neo.core.view import ChannelView from neo.core.regionofinterest import RegionOfInterest class Group(Container): """ Can contain any of the data objects, views, or other groups, outside the hierarchy of the segment and block containers. A common use is to link the :class:`SpikeTrain` objects within a :class:`Block`, possibly across multiple Segments, that were emitted by the same neuron. *Required attributes/properties*: None *Recommended attributes/properties*: :objects: (Neo object) Objects with which to pre-populate the :class:`Group` :name: (str) A label for the group. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. *Optional arguments*: :allowed_types: (list or tuple) Types of Neo object that are allowed to be added to the Group. If not specified, any Neo object can be added. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Container of*: :class:`AnalogSignal`, :class:`IrregularlySampledSignal`, :class:`SpikeTrain`, :class:`Event`, :class:`Epoch`, :class:`ChannelView`, :class:`Group` """ _data_child_objects = ( "AnalogSignal", "IrregularlySampledSignal", "SpikeTrain", "Event", "Epoch", "ChannelView", "ImageSequence", "CircularRegionOfInterest", "RectangularRegionOfInterest", "PolygonRegionOfInterest", ) _container_child_objects = ("Group",) _parent_objects = ("Block",) def __init__(self, objects=None, name=None, description=None, file_origin=None, allowed_types=None, **annotations): super().__init__(name=name, description=description, file_origin=file_origin, **annotations) # note that we create the ObjectLists here _without_ a parent argument # since objects do not have a reference to the group(s) # they are contained in. self._analogsignals = ObjectList(AnalogSignal) self._irregularlysampledsignals = ObjectList(IrregularlySampledSignal) self._spiketrains = SpikeTrainList() self._events = ObjectList(Event) self._epochs = ObjectList(Epoch) self._channelviews = ObjectList(ChannelView) self._imagesequences = ObjectList(ImageSequence) self._regionsofinterest = ObjectList(RegionOfInterest) self._segments = ObjectList(Segment) # to remove? self._groups = ObjectList(Group) if allowed_types is None: self.allowed_types = None else: self.allowed_types = tuple(allowed_types) for type_ in self.allowed_types: if type_.__name__ not in self._child_objects: raise TypeError(f"Groups can not contain objects of type {type_.__name__}") if objects: self.add(*objects) analogsignals = property( fget=lambda self: self._get_object_list("_analogsignals"), fset=lambda self, value: self._set_object_list("_analogsignals", value), doc="list of AnalogSignals contained in this group", ) irregularlysampledsignals = property( fget=lambda self: self._get_object_list("_irregularlysampledsignals"), fset=lambda self, value: self._set_object_list("_irregularlysampledsignals", value), doc="list of IrregularlySignals contained in this group", ) events = property( fget=lambda self: self._get_object_list("_events"), fset=lambda self, value: self._set_object_list("_events", value), doc="list of Events contained in this group", ) epochs = property( fget=lambda self: self._get_object_list("_epochs"), fset=lambda self, value: self._set_object_list("_epochs", value), doc="list of Epochs contained in this group", ) channelviews = property( fget=lambda self: self._get_object_list("_channelviews"), fset=lambda self, value: self._set_object_list("_channelviews", value), doc="list of ChannelViews contained in this group", ) imagesequences = property( fget=lambda self: self._get_object_list("_imagesequences"), fset=lambda self, value: self._set_object_list("_imagesequences", value), doc="list of ImageSequences contained in this group", ) regionsofinterest = property( fget=lambda self: self._get_object_list("_regionsofinterest"), fset=lambda self, value: self._set_object_list("_regionsofinterest", value), doc="list of RegionOfInterest objects contained in this group", ) spiketrains = property( fget=lambda self: self._get_object_list("_spiketrains"), fset=lambda self, value: self._set_object_list("_spiketrains", value), doc="list of SpikeTrains contained in this group", ) segments = property( fget=lambda self: self._get_object_list("_segments"), fset=lambda self, value: self._set_object_list("_segments", value), doc="list of Segments contained in this group", ) groups = property( fget=lambda self: self._get_object_list("_groups"), fset=lambda self, value: self._set_object_list("_groups", value), doc="list of Groups contained in this group", ) def add(self, *objects): """Add a new Neo object to the Group""" for obj in objects: if self.allowed_types and not isinstance(obj, self.allowed_types): raise TypeError(f"This Group can only contain {self.allowed_types}, " f"but not {type(obj)}") super().add(*objects) def walk(self): """ Walk the tree of subgroups """ yield self for grp in self.groups: yield from grp.walk() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/imagesequence.py0000644000175100001660000002443414743453644016703 0ustar00runnerdocker""" This module implements :class:`ImageSequence`, a 3D array. :class:`ImageSequence` inherits from :class:`basesignal.BaseSignal` which derives from :class:`BaseNeo`, and from :class:`quantities.Quantity`which in turn inherits from :class:`numpy.array`. Inheritance from :class:`numpy.array` is explained here: http://docs.scipy.org/doc/numpy/user/basics.subclassing.html In brief: * Initialization of a new object from constructor happens in :meth:`__new__`. This is where user-specified attributes are set. * :meth:`__array_finalize__` is called for all new objects, including those created by slicing. This is where attributes are copied over from the old object. """ import quantities as pq import numpy as np from neo.core.analogsignal import AnalogSignal, _get_sampling_rate from neo.core.baseneo import BaseNeo from neo.core.basesignal import BaseSignal from neo.core.dataobject import DataObject class ImageSequence(BaseSignal): """ Representation of a sequence of images, as an array of three dimensions organized as [frame][row][column]. Inherits from :class:`quantities.Quantity`, which in turn inherits from :class:`numpy.ndarray`. *usage*:: >>> from neo.core import ImageSequence >>> import quantities as pq >>> >>> img_sequence_array = [[[column for column in range(20)]for row in range(20)] ... for frame in range(10)] >>> image_sequence = ImageSequence(img_sequence_array, units='V', ... sampling_rate=1 * pq.Hz, ... spatial_scale=1 * pq.micrometer) >>> image_sequence ImageSequence 10 frames with width 20 px and height 20 px; units V; datatype int64 sampling rate: 1.0 spatial_scale: 1.0 >>> image_sequence.spatial_scale array(1.) * um *Required attributes/properties*: :image_data: (3D NumPy array, or a list of 2D arrays) The data itself :units: (quantity units) :sampling_rate: *or* **frame_duration** (quantity scalar) Number of samples per unit time or duration of a single image frame. If both are specified, they are checked for consistency. :spatial_scale: (quantity scalar) size for a pixel. :t_start: (quantity scalar) Time when sequence begins. Default 0. *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. *Optional attributes/properties*: :dtype: (numpy dtype or str) Override the dtype of the signal array. :copy: deprecated Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Properties available on this object*: :sampling_rate: (quantity scalar) Number of samples per unit time. (1/:attr:`frame_duration`) :frame_duration: (quantity scalar) Duration of each image frame. (1/:attr:`sampling_rate`) :spatial_scale: Size of a pixel :duration: (Quantity) Sequence duration, read-only. (size * :attr:`frame_duration`) :t_stop: (quantity scalar) Time when sequence ends, read-only. (:attr:`t_start` + :attr:`duration`) """ _parent_objects = ("Segment",) _parent_attrs = ("segment",) _quantity_attr = "image_data" _necessary_attrs = ( ("image_data", pq.Quantity, 3), ("sampling_rate", pq.Quantity, 0), ("spatial_scale", pq.Quantity, 0), ("t_start", pq.Quantity, 0), ) _recommended_attrs = BaseNeo._recommended_attrs def __new__( cls, image_data, units=pq.dimensionless, dtype=None, copy=None, t_start=0 * pq.s, spatial_scale=None, frame_duration=None, sampling_rate=None, name=None, description=None, file_origin=None, **annotations, ): """ Constructs new :class:`ImageSequence` from data. This is called whenever a new class:`ImageSequence` is created from the constructor, but not when slicing. __array_finalize__ is called on the new object. """ if copy is not None: raise ValueError( "`copy` is now deprecated in Neo due to removal in Quantites to support Numpy 2.0. " "In order to facilitate the deprecation copy can be set to None but will raise an " "error if set to True/False since this will silently do nothing. This argument will be completely " "removed in Neo 0.15.0. Please update your code base as necessary." ) if spatial_scale is None: raise ValueError("spatial_scale is required") image_data = np.stack(image_data) if len(image_data.shape) != 3: raise ValueError("list doesn't have the correct number of dimensions") obj = pq.Quantity(image_data, units=units, dtype=dtype).view(cls) obj.segment = None # function from analogsignal.py in neo/core directory obj.sampling_rate = _get_sampling_rate(sampling_rate, frame_duration) obj.spatial_scale = spatial_scale if t_start is None: raise ValueError("t_start cannot be None") obj._t_start = t_start return obj def __init__( self, image_data, units=pq.dimensionless, dtype=None, copy=None, t_start=0 * pq.s, spatial_scale=None, frame_duration=None, sampling_rate=None, name=None, description=None, file_origin=None, **annotations, ): """ Initializes a newly constructed :class:`ImageSequence` instance. """ DataObject.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) def __array_finalize__spec(self, obj): self.sampling_rate = getattr(obj, "sampling_rate", None) self.spatial_scale = getattr(obj, "spatial_scale", None) self.units = getattr(obj, "units", pq.dimensionless) self._t_start = getattr(obj, "_t_start", 0 * pq.s) return obj def signal_from_region(self, *region): """ Method that takes 1 or multiple regionofinterest, uses the method of each region of interest to get the list of pixels to average. Return a list of :class:`AnalogSignal` for each regionofinterest """ if len(region) == 0: raise ValueError("no regions of interest have been given") region_pixel = [] for i, b in enumerate(region): r = region[i].pixels_in_region() if not r: raise ValueError("region " + str(i) + "is empty") else: region_pixel.append(r) analogsignal_list = [] for i in region_pixel: data = [] for frame in range(len(self)): picture_data = [] for v in i: picture_data.append(self.view(pq.Quantity)[frame][v[0]][v[1]]) average = picture_data[0] for b in range(1, len(picture_data)): average += picture_data[b] data.append((average * 1.0) / len(i)) analogsignal_list.append( AnalogSignal(data, units=self.units, t_start=self.t_start, sampling_rate=self.sampling_rate) ) return analogsignal_list def _repr_pretty_(self, pp, cycle): """ Handle pretty-printing the :class:`ImageSequence`. """ pp.text( f"{self.__class__.__name__} {self.shape[0]} frames with " f"width {self.shape[2]} px and height {self.shape[1]} px; " f"units {self.units.dimensionality.string}; datatype {self.dtype} " ) def _pp(line): pp.breakable() with pp.group(indent=1): pp.text(line) for line in [f"sampling rate: {self.sampling_rate}", f"spatial_scale: {self.spatial_scale}"]: _pp(line) def _check_consistency(self, other): """ Check if the attributes of another :class:`ImageSequence` are compatible with this one. """ if isinstance(other, ImageSequence): for attr in ("sampling_rate", "spatial_scale", "t_start"): if getattr(self, attr) != getattr(other, attr): raise ValueError(f"Inconsistent values of {attr}") # t_start attribute is handled as a property so type checking can be done @property def t_start(self): """ Time when sequence begins. """ return self._t_start @t_start.setter def t_start(self, start): """ Setter for :attr:`t_start` """ if start is None: raise ValueError("t_start cannot be None") self._t_start = start @property def duration(self): """ Sequence duration (:attr:`size` * :attr:`frame_duration`) """ return self.shape[0] / self.sampling_rate @property def t_stop(self): """ Time when Sequence ends. (:attr:`t_start` + :attr:`duration`) """ return self.t_start + self.duration @property def times(self): """ The time points of each frame in the sequence (:attr:`t_start` + arange(:attr:`shape`)/:attr:`sampling_rate`) """ return self.t_start + np.arange(self.shape[0]) / self.sampling_rate @property def frame_duration(self): """ Duration of a single image frame in the sequence. (1/:attr:`sampling_rate`) """ return 1.0 / self.sampling_rate @frame_duration.setter def frame_duration(self, duration): """ Setter for :attr:`frame_duration` """ if duration is None: raise ValueError("frame_duration cannot be None") elif not hasattr(duration, "units"): raise ValueError("frame_duration must have units") self.sampling_rate = 1.0 / duration ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/irregularlysampledsignal.py0000644000175100001660000006024214743453644021172 0ustar00runnerdocker""" This module implements :class:`IrregularlySampledSignal`, an array of analog signals with samples taken at arbitrary time points. :class:`IrregularlySampledSignal` inherits from :class:`basesignal.BaseSignal` which derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`, and from :class:`quantities.Quantity`, which in turn inherits from :class:`numpy.ndarray`. Inheritance from :class:`numpy.array` is explained here: http://docs.scipy.org/doc/numpy/user/basics.subclassing.html In brief: * Initialization of a new object from constructor happens in :meth:`__new__`. This is where user-specified attributes are set. * :meth:`__array_finalize__` is called for all new objects, including those created by slicing. This is where attributes are copied over from the old object. """ from copy import deepcopy import numpy as np import quantities as pq from neo.core.baseneo import MergeError, merge_annotations, intersect_annotations from neo.core.basesignal import BaseSignal from neo.core.analogsignal import AnalogSignal from neo.core.dataobject import DataObject def _new_IrregularlySampledSignal( cls, times, signal, units=None, time_units=None, dtype=None, copy=None, name=None, file_origin=None, description=None, array_annotations=None, annotations=None, segment=None, ): """ A function to map IrregularlySampledSignal.__new__ to a function that does not do the unit checking. This is needed for pickle to work. """ iss = cls( times=times, signal=signal, units=units, time_units=time_units, dtype=dtype, copy=copy, name=name, file_origin=file_origin, description=description, array_annotations=array_annotations, **annotations, ) iss.segment = segment return iss class IrregularlySampledSignal(BaseSignal): """ An array of one or more analog signals with samples taken at arbitrary time points. A representation of one or more continuous, analog signals acquired at time :attr:`t_start` with a varying sampling interval. Each channel is sampled at the same time points. Inherits from :class:`quantities.Quantity`, which in turn inherits from :class:`numpy.ndarray`. Parameters ---------- times: quantity array 1D |numpy array 1D | list The time of each data point. Must have the same size as `signal`. signal: quantity array 2D | numpy array 2D | list (data, channel) The data itself organized as (n_data x n_channel) units: quantity units | None, default: None The units for the signal if signal is numpy array or list Ignored if signal is a quantity array time_units: quantity units | None, default: None The units for times if times is a numpy array or list Ignored if times is a quantity array dtype: numpy dtype | string | None, default: None Overrides the signal array dtype Does not affect the dtype of the times which must be floats copy: bool | None, default: None deprecated and no longer used (for NumPy 2.0 support). Will be removed. name: str | None, default: None An optional label for the dataset description: str | None, default: None An optional text description of the dataset file_origin: str | None, default: None The filesystem path or url of the orginal data array_annotations: dict | None, default: None Dict mapping strings to numpy arrays containing annotations for all data points annotations: dict Optional additional metadata supplied by the user as a dict. Will be stored in the annotations attribute of the object Notes ----- Attributes that can accessed for this object: * sampling_intervals: quantity 1d array Interval between each adjacent pair of samples (times[1:] - times[:-1]) * duration: quantity scalar Signal duration, read-only (times[-1]-times[0]) * t_start: quantity scalar Time when signal begins, read-only (times[0]) * t_stop: quantity scalar Time when signal ends, read-only (times[-1]) Slicing * `IrregularlySampledSignal` objects can be sliced. When this occurs, a new `IrregularlySampledSignal` (actually a view) is returned, with the same metadata, except that `times` is also sliced in the same way. Operations * == * != * + * * * / Examples -------- >>> from neo.core import IrregularlySampledSignal >>> from quantities import s, nA >>> >>> irsig0 = IrregularlySampledSignal([0.0, 1.23, 6.78], [1, 2, 3], ... units='mV', time_units='ms') >>> irsig1 = IrregularlySampledSignal([0.01, 0.03, 0.12]*s, ... [[4, 5], [5, 4], [6, 3]]*nA) >>> irsig0 == irsig1 False """ _parent_objects = ("Segment",) _parent_attrs = ("segment",) _quantity_attr = "signal" _necessary_attrs = (("times", pq.Quantity, 1), ("signal", pq.Quantity, 2)) def __new__( cls, times, signal, units=None, time_units=None, dtype=None, copy=None, name=None, file_origin=None, description=None, array_annotations=None, **annotations, ): """ Construct a new :class:`IrregularlySampledSignal` instance. This is called whenever a new :class:`IrregularlySampledSignal` is created from the constructor, but not when slicing. """ if copy is not None: raise ValueError( "`copy` is now deprecated in Neo due to removal in Quantites to support Numpy 2.0. " "In order to facilitate the deprecation copy can be set to None but will raise an " "error if set to True/False since this will silently do nothing. This argument will be completely " "removed in Neo 0.15.0. Please update your code base as necessary." ) signal = cls._rescale(signal, units=units) if time_units is None: if hasattr(times, "units"): time_units = times.units else: raise ValueError("Time units must be specified") elif isinstance(times, pq.Quantity): # could improve this test, what if units is a string? if time_units != times.units: times = times.rescale(time_units) # should check time units have correct dimensions obj = pq.Quantity.__new__(cls, signal, units=units, dtype=dtype, copy=copy) if obj.ndim == 1: obj = obj.reshape(-1, 1) if len(times) != obj.shape[0]: raise ValueError("times array and signal array must have same length") obj.times = pq.Quantity(times, units=time_units, dtype=float, copy=copy) obj.segment = None return obj def __init__( self, times, signal, units=None, time_units=None, dtype=None, copy=None, name=None, file_origin=None, description=None, array_annotations=None, **annotations, ): """ Initializes a newly constructed :class:`IrregularlySampledSignal` instance. """ DataObject.__init__( self, name=name, file_origin=file_origin, description=description, array_annotations=array_annotations, **annotations, ) def __reduce__(self): """ Map the __new__ function onto _new_IrregularlySampledSignal, so that pickle works """ return _new_IrregularlySampledSignal, ( self.__class__, self.times, np.array(self), self.units, self.times.units, self.dtype, None, self.name, self.file_origin, self.description, self.array_annotations, self.annotations, self.segment, ) def _array_finalize_spec(self, obj): """ Set default values for attributes specific to :class:`IrregularlySampledSignal`. Common attributes are defined in :meth:`__array_finalize__` in :class:`basesignal.BaseSignal`), which is called every time a new signal is created and calls this method. """ self.times = getattr(obj, "times", None) return obj def __repr__(self): """ Returns a string representing the :class:`IrregularlySampledSignal`. """ return f"<{self.__class__.__name__}({super().__repr__()} " f"at times {self.times})>" def __getitem__(self, i): """ Get the item or slice :attr:`i`. """ if isinstance(i, (int, np.integer)): # a single point in time across all channels obj = super().__getitem__(i) obj = pq.Quantity(obj.magnitude, units=obj.units) elif isinstance(i, tuple): obj = super().__getitem__(i) j, k = i if isinstance(j, (int, np.integer)): # a single point in time across some channels obj = pq.Quantity(obj.magnitude, units=obj.units) else: if isinstance(j, slice): obj.times = self.times.__getitem__(j) elif isinstance(j, np.ndarray): raise NotImplementedError("Arrays not yet supported") else: raise TypeError(f"{type(j)} not supported") if isinstance(k, (int, np.integer)): obj = obj.reshape(-1, 1) obj.array_annotations = deepcopy(self.array_annotations_at_index(k)) elif isinstance(i, slice): obj = super().__getitem__(i) obj.times = self.times.__getitem__(i) obj.array_annotations = deepcopy(self.array_annotations) elif isinstance(i, np.ndarray): # Indexing of an IrregularlySampledSignal is only consistent if the resulting # number of samples is the same for each trace. The time axis for these samples is not # guaranteed to be continuous, so returning a Quantity instead of an # IrregularlySampledSignal here. new_time_dims = np.sum(i, axis=0) if len(new_time_dims) and all(new_time_dims == new_time_dims[0]): obj = np.asarray(self).T.__getitem__(i.T) obj = obj.T.reshape(self.shape[1], -1).T obj = pq.Quantity(obj, units=self.units) else: raise IndexError( "indexing of an IrregularlySampledSignal needs to keep the same " "number of sample for each trace contained" ) else: raise IndexError("index should be an integer, tuple, slice or boolean numpy array") return obj @property def duration(self): """ Signal duration. (:attr:`times`[-1] - :attr:`times`[0]) """ return self.times[-1] - self.times[0] @property def t_start(self): """ Time when signal begins. (:attr:`times`[0]) """ return self.times[0] @property def t_stop(self): """ Time when signal ends. (:attr:`times`[-1]) """ return self.times[-1] def __eq__(self, other): """ Equality test (==) """ if isinstance(other, IrregularlySampledSignal) and not (self.times == other.times).all(): return False return super().__eq__(other) def _check_consistency(self, other) -> None: """ Check if the attributes of another :class:`IrregularlySampledSignal` are compatible with this one. Raises ------ ValueError * Dimensionality of objects don't match for signal * If times are different between the two objects Returns ------- None if check passes """ # if not an array, then allow the calculation if not hasattr(other, "ndim"): return # if a scalar array, then allow the calculation if not other.ndim: return # dimensionality should match if self.ndim != other.ndim: raise ValueError(f"Dimensionality does not match: {self.ndim} vs {other.ndim}") # if if the other array does not have a times property, # then it should be okay to add it directly if not hasattr(other, "times"): return # if there is a times property, the times need to be the same if not (self.times == other.times).all(): raise ValueError(f"Times do not match: {self.times} vs {other.times}") def __rsub__(self, other, *args): """ Backwards subtraction (other-self) """ return self.__mul__(-1) + other def _repr_pretty_(self, pp, cycle): """ Handle pretty-printing the :class:`IrregularlySampledSignal`. """ pp.text( f"{self.__class__.__name__} with {self.shape[1]} channels of length " f"{self.shape[0]}; units {self.units.dimensionality.string}; datatype " f"{self.dtype}" ) if self._has_repr_pretty_attrs_(): pp.breakable() self._repr_pretty_attrs_(pp, cycle) def _pp(line): pp.breakable() with pp.group(indent=1): pp.text(line) for line in [f"sample times: {self.times}"]: _pp(line) @property def sampling_intervals(self): """ Interval between each adjacent pair of samples. (:attr:`times[1:]` - :attr:`times`[:-1]) """ return self.times[1:] - self.times[:-1] def mean(self, interpolation=None): """ Calculates the mean, optionally using interpolation between sampling times. Parameters ---------- interpolation: function | None Optionally interpolate between samples. Not currently implemented If none uses the standard mean assuming that values change stepwise in sampling time. Returns ------- mean: float The mean of the IrregularlySampledSignal """ if interpolation is None: return (self[:-1] * self.sampling_intervals.reshape(-1, 1)).sum() / self.duration else: raise NotImplementedError def resample(self, sample_count, **kwargs): """ Resample the data points of the signal. This method interpolates the signal and returns a new signal with a fixed number of samples defined by `sample_count`. This function is a wrapper of scipy.signal.resample and accepts the same set of keyword arguments, except for specifying the axis of resampling which is fixed to the first axis here, and the sample positions. . Parameters ---------- sample_count: int Number of desired samples. The resulting signal starts at the same sample as the original and is sampled regularly. Returns ------- resampled_signal: :class:`AnalogSignal` New instance of a :class:`AnalogSignal` object containing the resampled data points. The original :class:`AnalogSignal` is not modified. """ try: import scipy.signal except ImportError: raise ImportError("Resampling requires availability of scipy.signal") # Resampling is only permitted along the time axis (axis=0) if "axis" in kwargs: kwargs.pop("axis") if "t" in kwargs: kwargs.pop("t") resampled_data, resampled_times = scipy.signal.resample( self.magnitude, sample_count, t=self.times.magnitude, axis=0, **kwargs ) new_sampling_rate = (sample_count - 1) / self.duration resampled_signal = AnalogSignal( resampled_data, units=self.units, dtype=self.dtype, t_start=self.t_start, sampling_rate=new_sampling_rate, array_annotations=self.array_annotations.copy(), **self.annotations.copy(), ) # since the number of channels stays the same, we can also copy array annotations here resampled_signal.array_annotations = self.array_annotations.copy() return resampled_signal def time_slice(self, t_start, t_stop): """ Creates a new :class:`IrregularlySampledSignal` corresponding to the time slice of the original :class:`IrregularlySampledSignal` Parameters ---------- t_start: float | None The starting time of the time slice If None it will use -np.inf to determine the start index t_stop: float | None The stopping time of the time slice If None it will use np,inf to determine the end index Returns ------- new_st: neo.core.IrregularlySampledSignal A new IrregularlySampledSignal with the demanded times """ _t_start = t_start _t_stop = t_stop if t_start is None: _t_start = -np.inf if t_stop is None: _t_stop = np.inf indices = (self.times >= _t_start) & (self.times <= _t_stop) count = 0 id_start = None id_stop = None for i in indices: if id_start is None: if i: id_start = count else: if not i: id_stop = count break count += 1 # Time slicing should create a deep copy of the object new_st = deepcopy(self[id_start:id_stop]) return new_st def time_shift(self, t_shift): """ Shifts a :class:`IrregularlySampledSignal` to start at a new time. Parameters ---------- t_shift: Quantity (time) Amount of time by which to shift the :class:`IrregularlySampledSignal`. Returns ------- new_sig: :class:`SpikeTrain` New instance of a :class:`IrregularlySampledSignal` object starting at t_shift later than the original :class:`IrregularlySampledSignal` (the original :class:`IrregularlySampledSignal` is not modified). """ new_sig = deepcopy(self) # As of numpy 2.0/quantities 0.16 we need to copy the array itself # in order to be able to time_shift new_sig.times = self.times.copy() new_sig.times += t_shift return new_sig def merge(self, other): """ Merge another signal into this one. The signal objects are concatenated horizontally (column-wise, :func:`np.hstack`). If the attributes of the two signals are not compatible, an Exception is raised. Required attributes of the signal are used. """ if not np.array_equal(self.times, other.times): raise MergeError("Cannot merge these two signals as the sample times differ.") if self.segment != other.segment: raise MergeError("Cannot merge these two signals as they belong to different segments.") if hasattr(self, "lazy_shape"): if hasattr(other, "lazy_shape"): if self.lazy_shape[0] != other.lazy_shape[0]: raise MergeError("Cannot merge signals of different length.") merged_lazy_shape = (self.lazy_shape[0], self.lazy_shape[1] + other.lazy_shape[1]) else: raise MergeError("Cannot merge a lazy object with a real object.") if other.units != self.units: other = other.rescale(self.units) stack = np.hstack((self.magnitude, other.magnitude)) kwargs = {} for name in ("name", "description", "file_origin"): attr_self = getattr(self, name) attr_other = getattr(other, name) if attr_self == attr_other: kwargs[name] = attr_self else: kwargs[name] = f"merge({attr_self}, {attr_other})" merged_annotations = merge_annotations(self.annotations, other.annotations) kwargs.update(merged_annotations) signal = self.__class__(self.times, stack, units=self.units, dtype=self.dtype, copy=None, **kwargs) signal.segment = self.segment signal.array_annotate(**self._merge_array_annotations(other)) if hasattr(self, "lazy_shape"): signal.lazy_shape = merged_lazy_shape return signal def concatenate(self, other, allow_overlap=False): """ Combine this and another signal along the time axis. The signal objects are concatenated vertically (row-wise, :func:`np.vstack`). Patching can be used to combine signals across segments. Note: Only array annotations common to both signals are attached to the concatenated signal. If the attributes of the two signal are not compatible, an Exception is raised. Required attributes of the signal are used. Parameters ---------- other : neo.BaseSignal The object that is merged into this one. allow_overlap : bool If false, overlapping samples between the two signals are not permitted and an ValueError is raised. If true, no check for overlapping samples is performed and all samples are combined. Returns ------- signal : neo.IrregularlySampledSignal Signal containing all non-overlapping samples of both source signals. Raises ------ MergeError If `other` object has incompatible attributes. """ for attr in self._necessary_attrs: if not (attr[0] in ["signal", "times", "t_start", "t_stop", "times"]): if getattr(self, attr[0], None) != getattr(other, attr[0], None): raise MergeError(f"Cannot concatenate these two signals as the {attr[0]} differ.") if hasattr(self, "lazy_shape"): if hasattr(other, "lazy_shape"): if self.lazy_shape[-1] != other.lazy_shape[-1]: raise MergeError("Cannot concatenate signals as they contain" " different numbers of traces.") merged_lazy_shape = (self.lazy_shape[0] + other.lazy_shape[0], self.lazy_shape[-1]) else: raise MergeError("Cannot concatenate a lazy object with a real object.") if other.units != self.units: other = other.rescale(self.units) new_times = np.hstack((self.times, other.times)) sorting = np.argsort(new_times) new_samples = np.vstack((self.magnitude, other.magnitude)) kwargs = {} for name in ("name", "description", "file_origin"): attr_self = getattr(self, name) attr_other = getattr(other, name) if attr_self == attr_other: kwargs[name] = attr_self else: kwargs[name] = f"merge({attr_self}, {attr_other})" merged_annotations = merge_annotations(self.annotations, other.annotations) kwargs.update(merged_annotations) kwargs["array_annotations"] = intersect_annotations(self.array_annotations, other.array_annotations) if not allow_overlap: if max(self.t_start, other.t_start) <= min(self.t_stop, other.t_stop): raise ValueError( "Can not combine signals that overlap in time. Allow for " 'overlapping samples using the "no_overlap" parameter.' ) t_start = min(self.t_start, other.t_start) t_stop = max(self.t_start, other.t_start) signal = IrregularlySampledSignal( signal=new_samples[sorting], times=new_times[sorting], units=self.units, dtype=self.dtype, copy=None, t_start=t_start, t_stop=t_stop, **kwargs, ) signal.segment = None if hasattr(self, "lazy_shape"): signal.lazy_shape = merged_lazy_shape return signal ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/objectlist.py0000644000175100001660000001002014743453644016214 0ustar00runnerdocker""" This module implements the ObjectList class, which is used to peform type checks and handle relationships within the Neo Block-Segment-Data hierarchy. """ import sys from neo.core.baseneo import BaseNeo class ObjectList: """ This class behaves like a list, but has additional functionality to handle relationships within Neo hierarchy, and perform type checks. """ def __init__(self, allowed_contents, parent=None): # validate allowed_contents and normalize it to a tuple if isinstance(allowed_contents, type) and issubclass(allowed_contents, BaseNeo): self.allowed_contents = (allowed_contents,) else: for item in allowed_contents: if not issubclass(item, BaseNeo): raise TypeError("Each item in allowed_contents must be a subclass of BaseNeo") self.allowed_contents = tuple(allowed_contents) self._items = [] self.parent = parent def _handle_append(self, obj): if not ( isinstance(obj, self.allowed_contents) or ( # also allow proxy objects of the correct type hasattr(obj, "proxy_for") and obj.proxy_for in self.allowed_contents ) ): raise TypeError(f"Object is a {type(obj)}. It should be one of {self.allowed_contents}.") if self._contains(obj): raise ValueError("Cannot add this object because it is already contained within the list") # set the child-parent relationship if self.parent: relationship_name = self.parent.__class__.__name__.lower() if relationship_name == "group": raise Exception("Objects in groups should not link to the group as their parent") current_parent = getattr(obj, relationship_name) if current_parent != self.parent: # use weakref here? - see https://github.com/NeuralEnsemble/python-neo/issues/684 setattr(obj, relationship_name, self.parent) def _contains(self, obj): if self._items is None: obj_ids = [] else: obj_ids = [id(item) for item in self._items] return id(obj) in obj_ids def __str__(self): return str(self._items) def __repr__(self): return repr(self._items) def __add__(self, objects): # todo: decision: return a list, or a new DataObjectList? if isinstance(objects, ObjectList): return self._items + objects._items else: return self._items + objects def __radd__(self, objects): if isinstance(objects, ObjectList): return objects._items + self._items else: return objects + self._items def __contains__(self, key): return key in self._items def __iadd__(self, objects): for obj in objects: self._handle_append(obj) self._items.extend(objects) return self def __iter__(self): return iter(self._items) def __getitem__(self, i): return self._items[i] def __len__(self): return len(self._items) def __setitem__(self, key, value): self._items[key] = value def append(self, obj): self._handle_append(obj) self._items.append(obj) def extend(self, objects): for obj in objects: self._handle_append(obj) self._items.extend(objects) def clear(self): self._items = [] def count(self, value): return self._items.count(value) def index(self, value, start=0, stop=sys.maxsize): return self._items.index(value, start, stop) def insert(self, index, obj): self._handle_append(obj) self._items.insert(index, obj) def pop(self, index=-1): return self._items.pop(index) def remove(self, value): return self._items.remove(value) def reverse(self): raise self._items.reverse() def sort(self, *args, key=None, reverse=False): self._items.sort(*args, key=key, reverse=reverse) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/regionofinterest.py0000644000175100001660000001710314743453644017451 0ustar00runnerdockerfrom math import floor, ceil from neo.core.baseneo import BaseNeo from neo.core.imagesequence import ImageSequence class RegionOfInterest(BaseNeo): """Abstract base class""" _parent_objects = ("Group",) _parent_attrs = ("group",) _necessary_attrs = (("image_sequence", ("ImageSequence",), 1),) is_view = True def __init__(self, image_sequence, name=None, description=None, file_origin=None, **annotations): super().__init__(name=name, description=description, file_origin=file_origin, **annotations) if not ( isinstance(image_sequence, ImageSequence) or (hasattr(image_sequence, "proxy_for") and issubclass(image_sequence.proxy_for, ImageSequence)) ): raise ValueError("Can only take a RegionOfInterest of an ImageSequence") self.image_sequence = image_sequence def _get_obj(self): # for consistency with ChannelView return self.image_sequence def _set_obj(self, value): if not isinstance(value, ImageSequence): raise TypeError(f"Value must be ImageSequence, not of type: {type(value)}") self.image_sequence = value obj = property(fget=_get_obj, fset=_set_obj) def resolve(self): """ Return a signal from within this region of the underlying ImageSequence. """ return self.image_sequence.signal_from_region(self) class CircularRegionOfInterest(RegionOfInterest): """Representation of a circular ROI *Usage:* >>> roi = CircularRegionOfInterest(20.0, 20.0, radius=5.0) >>> signal = image_sequence.signal_from_region(roi) *Required attributes/properties*: :x, y: (integers or floats) Pixel coordinates of the centre of the ROI :radius: (integer or float) Radius of the ROI in pixels """ _necessary_attrs = (("image_sequence", ("ImageSequence",), 1), ("x", int), ("y", int), ("radius", int)) def __init__(self, image_sequence, x, y, radius, name=None, description=None, file_origin=None, **annotations): super().__init__(image_sequence, name, description, file_origin, **annotations) self.y = y self.x = x self.radius = radius @property def centre(self): return (self.x, self.y) @property def center(self): return self.centre def is_inside(self, x, y): if (x - self.x) * (x - self.x) + (y - self.y) * (y - self.y) <= self.radius * self.radius: return True else: return False def pixels_in_region(self): """Returns a list of pixels whose *centres* are within the circle""" pixel_in_list = [] for y in range(int(floor(self.y - self.radius)), int(ceil(self.y + self.radius))): for x in range(int(floor(self.x - self.radius)), int(ceil(self.x + self.radius))): if self.is_inside(x, y): pixel_in_list.append([x, y]) return pixel_in_list class RectangularRegionOfInterest(RegionOfInterest): """Representation of a rectangular ROI *Usage:* >>> roi = RectangularRegionOfInterest(20.0, 20.0, width=5.0, height=5.0) >>> signal = image_sequence.signal_from_region(roi) *Required attributes/properties*: :x, y: (integers or floats) Pixel coordinates of the centre of the ROI :width: (integer or float) Width (x-direction) of the ROI in pixels :height: (integer or float) Height (y-direction) of the ROI in pixels """ _necessary_attrs = ( ("image_sequence", ("ImageSequence",), 1), ("x", int), ("y", int), ("width", int), ("height", int), ) def __init__( self, image_sequence, x, y, width, height, name=None, description=None, file_origin=None, **annotations ): super().__init__(image_sequence, name, description, file_origin, **annotations) self.x = x self.y = y self.width = width self.height = height def is_inside(self, x, y): if ( self.x - self.width / 2.0 <= x < self.x + self.width / 2.0 and self.y - self.height / 2.0 <= y < self.y + self.height / 2.0 ): return True else: return False def pixels_in_region(self): """Returns a list of pixels whose *centres* are within the rectangle""" pixel_list = [] h = self.height w = self.width for y in range(int(floor(self.y - h / 2.0)), int(ceil(self.y + h / 2.0))): for x in range(int(floor(self.x - w / 2.0)), int(ceil(self.x + w / 2.0))): if self.is_inside(x, y): pixel_list.append([x, y]) return pixel_list class PolygonRegionOfInterest(RegionOfInterest): """Representation of a polygonal ROI *Usage:* >>> roi = PolygonRegionOfInterest( ... (20.0, 20.0), ... (30.0, 20.0), ... (25.0, 25.0) ... ) >>> signal = image_sequence.signal_from_region(roi) *Required attributes/properties*: :vertices: tuples containing the (x, y) coordinates, as integers or floats, of the vertices of the polygon """ _necessary_attrs = ( ("image_sequence", ("ImageSequence",), 1), ("vertices", list), ) def __init__(self, image_sequence, *vertices, name=None, description=None, file_origin=None, **annotations): super().__init__(image_sequence, name, description, file_origin, **annotations) self.vertices = vertices def polygon_ray_casting(self, bounding_points, bounding_box_positions): # from https://stackoverflow.com/questions/217578/how-can-i-determine-whether-a-2d-point-is-within-a-polygon # user Noresourses # Arrays containing the x- and y-coordinates of the polygon's vertices. vertx = [point[0] for point in bounding_points] verty = [point[1] for point in bounding_points] # Number of vertices in the polygon nvert = len(bounding_points) # Points that are inside points_inside = [] # For every candidate position within the bounding box for idx, pos in enumerate(bounding_box_positions): testx, testy = (pos[0], pos[1]) c = 0 for i in range(0, nvert): j = i - 1 if i != 0 else nvert - 1 if ((verty[i] * 1.0 > testy * 1.0) != (verty[j] * 1.0 > testy * 1.0)) and ( testx * 1.0 < (vertx[j] * 1.0 - vertx[i] * 1.0) * (testy * 1.0 - verty[i] * 1.0) / (verty[j] * 1.0 - verty[i] * 1.0) + vertx[i] * 1.0 ): c += 1 # If odd, that means that we are inside the polygon if c % 2 == 1: points_inside.append(pos) return points_inside def pixels_in_region(self): min_x, max_x, min_y, max_y = ( self.vertices[0][0], self.vertices[0][0], self.vertices[0][1], self.vertices[0][1], ) for i in self.vertices: if i[0] < min_x: min_x = i[0] if i[0] > max_x: max_x = i[0] if i[1] < min_y: min_y = i[1] if i[1] > max_y: max_y = i[1] list_coord = [] for y in range(int(floor(min_y)), int(ceil(max_y))): for x in range(int(floor(min_x)), int(ceil(max_x))): list_coord.append((x, y)) pixel_list = self.polygon_ray_casting(self.vertices, list_coord) return pixel_list ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/segment.py0000644000175100001660000002563214743453644015533 0ustar00runnerdocker""" This module defines :class:`Segment`, a container for data sharing a common time basis. :class:`Segment` derives from :class:`Container`, from :module:`neo.core.container`. """ from datetime import datetime from copy import deepcopy from neo.core.analogsignal import AnalogSignal from neo.core.container import Container from neo.core.objectlist import ObjectList from neo.core.epoch import Epoch from neo.core.event import Event from neo.core.imagesequence import ImageSequence from neo.core.irregularlysampledsignal import IrregularlySampledSignal from neo.core.spiketrainlist import SpikeTrainList from neo.core.view import ChannelView class Segment(Container): """ A container for data sharing a common time basis. A :class:`Segment` is a heterogeneous container for discrete or continuous data sharing a common clock (time basis) but not necessary the same sampling rate, start or end time. Parameters ---------- name: str | None, default: None A label for the dataset. description: str | None, default: None Text description. file_origin: str | None, default: None Filesystem path or URL of the original data file. rec_datetime: datetime.datetime| None, default: None The date and time of the original recording index: int | None, default: None You can use this to define a temporal ordering of your Segment. For instance you could use this for trial numbers. annotations: dict | None, Other keyword annotations for the dataset Examples -------- >>> from neo.core import Segment, SpikeTrain, AnalogSignal >>> from quantities import Hz, s >>> >>> seg = Segment(index=5) >>> >>> train0 = SpikeTrain(times=[.01, 3.3, 9.3], units='sec', t_stop=10) >>> seg.spiketrains.append(train0) >>> >>> train1 = SpikeTrain(times=[100.01, 103.3, 109.3], units='sec', ... t_stop=110) >>> seg.spiketrains.append(train1) >>> >>> sig0 = AnalogSignal(signal=[.01, 3.3, 9.3], units='uV', ... sampling_rate=1*Hz) >>> seg.analogsignals.append(sig0) >>> >>> sig1 = AnalogSignal(signal=[100.01, 103.3, 109.3], units='nA', ... sampling_period=.1*s) >>> seg.analogsignals.append(sig1) Notes ----- Container of: :class:`Epoch` :class:`Event` :class:`AnalogSignal` :class:`IrregularlySampledSignal` :class:`SpikeTrain` """ _data_child_objects = ("AnalogSignal", "Epoch", "Event", "IrregularlySampledSignal", "SpikeTrain", "ImageSequence") _parent_objects = ("Block",) _recommended_attrs = ( ("file_datetime", datetime), ("rec_datetime", datetime), ("index", int), ) + Container._recommended_attrs _repr_pretty_containers = ("analogsignals",) def __init__( self, name=None, description=None, file_origin=None, file_datetime=None, rec_datetime=None, index=None, **annotations, ): """ Initialize a new :class:`Segment` instance. """ super().__init__(name=name, description=description, file_origin=file_origin, **annotations) self._analogsignals = ObjectList(AnalogSignal, parent=self) self._irregularlysampledsignals = ObjectList(IrregularlySampledSignal, parent=self) self._spiketrains = SpikeTrainList(parent=self) self._events = ObjectList(Event, parent=self) self._epochs = ObjectList(Epoch, parent=self) self._channelviews = ObjectList(ChannelView, parent=self) self._imagesequences = ObjectList(ImageSequence, parent=self) self.block = None self.file_datetime = file_datetime self.rec_datetime = rec_datetime self.index = index analogsignals = property( fget=lambda self: self._get_object_list("_analogsignals"), fset=lambda self, value: self._set_object_list("_analogsignals", value), doc="list of AnalogSignals contained in this segment", ) irregularlysampledsignals = property( fget=lambda self: self._get_object_list("_irregularlysampledsignals"), fset=lambda self, value: self._set_object_list("_irregularlysampledsignals", value), doc="list of IrregularlySignals contained in this segment", ) events = property( fget=lambda self: self._get_object_list("_events"), fset=lambda self, value: self._set_object_list("_events", value), doc="list of Events contained in this segment", ) epochs = property( fget=lambda self: self._get_object_list("_epochs"), fset=lambda self, value: self._set_object_list("_epochs", value), doc="list of Epochs contained in this segment", ) channelviews = property( fget=lambda self: self._get_object_list("_channelviews"), fset=lambda self, value: self._set_object_list("_channelviews", value), doc="list of ChannelViews contained in this segment", ) imagesequences = property( fget=lambda self: self._get_object_list("_imagesequences"), fset=lambda self, value: self._set_object_list("_imagesequences", value), doc="list of ImageSequences contained in this segment", ) spiketrains = property( fget=lambda self: self._get_object_list("_spiketrains"), fset=lambda self, value: self._set_object_list("_spiketrains", value), doc="list of SpikeTrains contained in this segment", ) # t_start attribute is handled as a property so type checking can be done @property def t_start(self): """ Time when first signal begins. Returns ------- t_start: float | None Returns the starting time if exists otherwise None """ t_starts = [sig.t_start for sig in self.analogsignals + self.spiketrains + self.irregularlysampledsignals] for e in self.epochs + self.events: if hasattr(e, "t_start"): # in case of proxy objects t_starts += [e.t_start] elif len(e) > 0: t_starts += [e.times[0]] # t_start is not defined if no children are present if len(t_starts) == 0: return None t_start = min(t_starts) return t_start # t_stop attribute is handled as a property so type checking can be done @property def t_stop(self): """ Time when last signal ends. Returns ------- t_stop: float | None Returns the stopping time if exists otherwise None """ t_stops = [sig.t_stop for sig in self.analogsignals + self.spiketrains + self.irregularlysampledsignals] for e in self.epochs + self.events: if hasattr(e, "t_stop"): # in case of proxy objects t_stops += [e.t_stop] elif len(e) > 0: t_stops += [e.times[-1]] # t_stop is not defined if no children are present if len(t_stops) == 0: return None t_stop = max(t_stops) return t_stop def time_slice(self, t_start=None, t_stop=None, reset_time=False, **kwargs): """ Creates a time slice of a Segment containing slices of all child objects. Parameters ---------- t_start: Quantity Starting time of the sliced time window. t_stop: Quantity Stop time of the sliced time window. reset_time: bool, optional, default: False If True the time stamps of all sliced objects are set to fall in the range from t_start to t_stop. If False, original time stamps are retained. **kwargs Additional keyword arguments used for initialization of the sliced Segment object. Returns ------- subseg: Segment Temporal slice of the original Segment from t_start to t_stop. """ subseg = Segment(**kwargs) for attr in ["file_datetime", "rec_datetime", "index", "name", "description", "file_origin"]: setattr(subseg, attr, getattr(self, attr)) subseg.annotations = deepcopy(self.annotations) if t_start is None: t_start = self.t_start if t_stop is None: t_stop = self.t_stop t_shift = -t_start # cut analogsignals and analogsignalarrays for ana_id in range(len(self.analogsignals)): if hasattr(self.analogsignals[ana_id], "_rawio"): ana_time_slice = self.analogsignals[ana_id].load(time_slice=(t_start, t_stop)) else: ana_time_slice = self.analogsignals[ana_id].time_slice(t_start, t_stop) if reset_time: ana_time_slice = ana_time_slice.time_shift(t_shift) subseg.analogsignals.append(ana_time_slice) # cut irregularly sampled signals for irr_id in range(len(self.irregularlysampledsignals)): if hasattr(self.irregularlysampledsignals[irr_id], "_rawio"): ana_time_slice = self.irregularlysampledsignals[irr_id].load(time_slice=(t_start, t_stop)) else: ana_time_slice = self.irregularlysampledsignals[irr_id].time_slice(t_start, t_stop) if reset_time: ana_time_slice = ana_time_slice.time_shift(t_shift) subseg.irregularlysampledsignals.append(ana_time_slice) # cut spiketrains for st_id in range(len(self.spiketrains)): if hasattr(self.spiketrains[st_id], "_rawio"): st_time_slice = self.spiketrains[st_id].load(time_slice=(t_start, t_stop)) else: st_time_slice = self.spiketrains[st_id].time_slice(t_start, t_stop) if reset_time: st_time_slice = st_time_slice.time_shift(t_shift) subseg.spiketrains.append(st_time_slice) # cut events for ev_id in range(len(self.events)): if hasattr(self.events[ev_id], "_rawio"): ev_time_slice = self.events[ev_id].load(time_slice=(t_start, t_stop)) else: ev_time_slice = self.events[ev_id].time_slice(t_start, t_stop) if reset_time: ev_time_slice = ev_time_slice.time_shift(t_shift) # appending only non-empty events if len(ev_time_slice): subseg.events.append(ev_time_slice) # cut epochs for ep_id in range(len(self.epochs)): if hasattr(self.epochs[ep_id], "_rawio"): ep_time_slice = self.epochs[ep_id].load(time_slice=(t_start, t_stop)) else: ep_time_slice = self.epochs[ep_id].time_slice(t_start, t_stop) if reset_time: ep_time_slice = ep_time_slice.time_shift(t_shift) # appending only non-empty epochs if len(ep_time_slice): subseg.epochs.append(ep_time_slice) subseg.check_relationships() return subseg ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/spiketrain.py0000644000175100001660000011412714743453644016240 0ustar00runnerdocker""" This module implements :class:`SpikeTrain`, an array of spike times. :class:`SpikeTrain` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`, and from :class:`quantities.Quantity`, which inherits from :class:`numpy.array`. Inheritance from :class:`numpy.array` is explained here: http://docs.scipy.org/doc/numpy/user/basics.subclassing.html In brief: * Initialization of a new object from constructor happens in :meth:`__new__`. This is where user-specified attributes are set. * :meth:`__array_finalize__` is called for all new objects, including those created by slicing. This is where attributes are copied over from the old object. """ from copy import deepcopy import warnings import numpy as np import quantities as pq from neo.core.baseneo import BaseNeo, MergeError, merge_annotations from neo.core.dataobject import DataObject, ArrayDict # need this to avoid circular import issue import neo def check_has_dimensions_time(*values) -> None: """ Verify that all arguments have a dimensionality that is compatible with time. Raises ------ ValueError if any value is not compatible with time Returns ------- None: indicating that each value in values has the dimension time """ errmsgs = [] for value in values: dim = value.dimensionality.simplified if len(dim) != 1 or list(dim.values())[0] != 1 or not isinstance(list(dim.keys())[0], pq.UnitTime): errmsgs.append(f"value {value} has dimensions {dim}, not [time]") if errmsgs: raise ValueError("\n".join(errmsgs)) def _check_time_in_range(value, t_start, t_stop, view=False) -> None: """ Verify that all times in `value` are between `t_start` and `t_stop` (inclusive) Parameters ---------- value: array-like An array-like object with times t_start: float The starting time t_stop: float The stopping time view: bool, default: False If true views are used for the test. This increases speed but is only safe if certain that the dtype and units are the same. Raises ------ ValueError * If t_stop < t_start * value.min() < t_start * value.max() > t_start Returns ------- None: If check passes """ if t_start > t_stop: raise ValueError(f"t_stop ({t_stop}) is before t_start ({t_start})") if not value.size: return if view: value = value.view(np.ndarray) t_start = t_start.view(np.ndarray) t_stop = t_stop.view(np.ndarray) if value.min() < t_start: raise ValueError(f"The first spike ({value}) is before t_start ({t_start})") if value.max() > t_stop: raise ValueError(f"The last spike ({value}) is after t_stop ({t_stop})") def _check_waveform_dimensions(spiketrain) -> None: """ Verify that waveform is compliant with the waveform definition as quantity array 3D (spike, channel, time) Parameters ---------- spiketrain: neo.core.SpikeTrain The neo.core.SpikeTrain to check for waveforms Raises ------ ValueError * number of waveforms doesn't match the number of spikes Returns ------- None if test passes or no waveforms present """ if not spiketrain.size: return waveforms = spiketrain.waveforms if (waveforms is None) or (not waveforms.size): return if waveforms.shape[0] != len(spiketrain): raise ValueError( f"Spiketrain length ({len(spiketrain)}) does not match to number of " f"waveforms present ({waveforms.shape[0]})" ) def _new_spiketrain( cls, signal, t_stop, units=None, dtype=None, copy=None, sampling_rate=1.0 * pq.Hz, t_start=0.0 * pq.s, waveforms=None, left_sweep=None, name=None, file_origin=None, description=None, array_annotations=None, annotations=None, segment=None, unit=None, ): """ A function to map :meth:`BaseAnalogSignal.__new__` to function that does not do the unit checking. This is needed for :module:`pickle` to work. """ if annotations is None: annotations = {} obj = SpikeTrain( times=signal, t_stop=t_stop, units=units, dtype=dtype, copy=copy, sampling_rate=sampling_rate, t_start=t_start, waveforms=waveforms, left_sweep=left_sweep, name=name, file_origin=file_origin, description=description, array_annotations=array_annotations, **annotations, ) obj.segment = segment obj.unit = unit return obj def normalize_times_array(times, units=None, dtype=None, copy=None): """ Return a quantity array with the correct units. There are four scenarios: A. times (NumPy array), units given as string or Quantities units B. times (Quantity array), units=None C. times (Quantity), units given as string or Quantities units D. times (NumPy array), units=None In scenarios A-C we return a tuple (times as a Quantity array, dimensionality) In scenario C, we rescale the original array to match `units` In scenario D, we raise a ValueError """ if copy is not None: raise ValueError( "`copy` is now deprecated in Neo due to removal in Quantites to support Numpy 2.0. " "In order to facilitate the deprecation copy can be set to None but will raise an " "error if set to True/False since this will silently do nothing. This argument will be completely " "removed in Neo 0.15.0. Please update your code base as necessary." ) if dtype is None: if not hasattr(times, "dtype"): dtype = float if units is None: # No keyword units, so get from `times` try: dim = times.units.dimensionality except AttributeError: raise ValueError("you must specify units") else: if hasattr(units, "dimensionality"): dim = units.dimensionality else: dim = pq.quantity.validate_dimensionality(units) if hasattr(times, "dimensionality"): if times.dimensionality.items() == dim.items(): units = None # units will be taken from times, avoids copying else: raise ValueError("cannot rescale and return view") # check to make sure the units are time # this approach is orders of magnitude faster than comparing the # reference dimensionality if len(dim) != 1 or list(dim.values())[0] != 1 or not isinstance(list(dim.keys())[0], pq.UnitTime): ValueError(f"Units have dimensions {dim.simplified}, not [time]") return ( pq.Quantity( times, units=units, dtype=dtype, ), dim, ) class SpikeTrain(DataObject): """ :class:`SpikeTrain` is a :class:`Quantity` array of spike times. It is an ensemble of action potentials (spikes) emitted by the same unit in a period of time. Parameters ---------- times: quantity array 1D | numpy array 1D | list The times of each spike. t_stop: quantity scalar | numpy scalar |float Time at which the SpikeTrain ended. This will be converted to the same units as `times`. This argument is required because it specifies the period of time over which spikes could have occurred. Note that :attr:`t_start` is highly recommended for the same reason. units: (quantity units) | None, default: None Required if `times` is a list or numpy.ndarray` Not required if times is a quantities.Quantity dtype: numpy dtype | str | None, default: None Due to change in `copy` behavior this argument is also deprecated during construction copy: bool, default: None Deprecated in order to support NumPy 2.0 and will be removed. sampling_rate: quantity scalar, default: 1.0 pq.Hz Number of samples per unit time for the waveforms. t_start: quantity scalar | numpy scalar | float Time at which the`SpikeTrain` began. This will be converted to the same units as `times`. waveforms: quantity array 3D (n_spikes, n_channels, n_time) | None, default: None The waveforms of each spike if given must be of the correct shape None indicates no waveforms left_sweep: (quantity array 1D) | None, default: None Time from the beginning of the waveform to the trigger time of the spike. name: str | None, default: None A label for the dataset. description: str | None, default: None A text description of this dataset file_origin: str | Filesystem path | URL | None, default: None The path or location of the original data file. array_annotations: dict A dictonary mapping of strings to numpy arrays containing annotations for all data points annotations: dict Other user defined metadata given as a dict Notes ----- Useful properties of a SpikeTrain * sampling_period: quantity scalar Interval between two samples (1/`sampling_rate`) * duration: quantity scalar Duration over which spikes can occur read-only (`t_stop` - `t_start`) * spike_duration: quantity scalar Duration of a waveform, read-only (`waveform`.shape[2] * `sampling_period`) * right_sweep: quantity scalar Time from the trigger times of the spikes to the end of the waveforms, read-only (`left_sweep` + `spike_duration`) * times: quantity array 1D Returns the :class:`SpikeTrain` as a quantity array. *Slicing*: :class:`SpikeTrain` objects can be sliced. When this occurs, a new :class:`SpikeTrain` (actually a view) is returned, with the same metadata, except that :attr:`waveforms` is also sliced in the same way (along dimension 0). Note that t_start and t_stop are not changed automatically, although you can still manually change them. Examples -------- >>> from neo.core import SpikeTrain >>> from quantities import s >>> >>> train = SpikeTrain([3, 4, 5]*s, t_stop=10.0) >>> train2 = train[1:3] >>> >>> train.t_start array(0.0) * s >>> train.t_stop array(10.0) * s >>> train >>> train2 """ _parent_objects = ("Segment",) _parent_attrs = ("segment",) _quantity_attr = "times" _necessary_attrs = (("times", pq.Quantity, 1), ("t_start", pq.Quantity, 0), ("t_stop", pq.Quantity, 0)) _recommended_attrs = ( ("waveforms", pq.Quantity, 3), ("left_sweep", pq.Quantity, 0), ("sampling_rate", pq.Quantity, 0), ) + BaseNeo._recommended_attrs def __new__( cls, times, t_stop, units=None, dtype=None, copy=None, sampling_rate=1.0 * pq.Hz, t_start=0.0 * pq.s, waveforms=None, left_sweep=None, name=None, file_origin=None, description=None, array_annotations=None, **annotations, ): """ Constructs a new :class:`Spiketrain` instance from data. This is called whenever a new :class:`SpikeTrain` is created from the constructor, but not when slicing. """ if copy is not None: raise ValueError( "`copy` is now deprecated in Neo due to removal in Quantites to support Numpy 2.0. " "In order to facilitate the deprecation copy can be set to None but will raise an " "error if set to True/False since this will silently do nothing. This argument will be completely " "removed in Neo 0.15.0. Please update your code base as necessary." ) if len(times) != 0 and waveforms is not None and len(times) != waveforms.shape[0]: # len(times)!=0 has been used to workaround a bug occurring during neo import raise ValueError("the number of waveforms should be equal to the number of spikes") if dtype is not None and hasattr(times, "dtype") and times.dtype != dtype: raise ValueError("cannot change dtype during construction due to change in copy behavior") # if t_start.dtype or t_stop.dtype != times.dtype != dtype, # _check_time_in_range can have problems, so we set the t_start # and t_stop dtypes to be the same as times before converting them # to dtype below # see ticket #38 if hasattr(t_start, "dtype") and t_start.dtype != times.dtype: t_start = t_start.astype(times.dtype) if hasattr(t_stop, "dtype") and t_stop.dtype != times.dtype: t_stop = t_stop.astype(times.dtype) # Make sure units are consistent # also get the dimensionality now since it is much faster to feed # that to Quantity rather than a unit times, dim = normalize_times_array(times, units, dtype, copy) # Construct Quantity from data obj = times.view(cls) # spiketrain times always need to be 1-dimensional if len(obj.shape) > 1: raise ValueError("Spiketrain times array has more than 1 dimension") # if the dtype and units match, just copy the values here instead # of doing the much more expensive creation of a new Quantity # using items() is orders of magnitude faster if ( hasattr(t_start, "dtype") and t_start.dtype == obj.dtype and hasattr(t_start, "dimensionality") and t_start.dimensionality.items() == dim.items() ): obj.t_start = t_start.copy() else: obj.t_start = pq.Quantity(t_start, units=dim, dtype=obj.dtype) if ( hasattr(t_stop, "dtype") and t_stop.dtype == obj.dtype and hasattr(t_stop, "dimensionality") and t_stop.dimensionality.items() == dim.items() ): obj.t_stop = t_stop.copy() else: obj.t_stop = pq.Quantity(t_stop, units=dim, dtype=obj.dtype) # Store attributes obj.waveforms = waveforms obj.left_sweep = left_sweep obj.sampling_rate = sampling_rate # parents obj.segment = None obj.unit = None # Error checking (do earlier?) _check_time_in_range(obj, obj.t_start, obj.t_stop, view=True) return obj def __init__( self, times, t_stop, units=None, dtype=None, copy=None, sampling_rate=1.0 * pq.Hz, t_start=0.0 * pq.s, waveforms=None, left_sweep=None, name=None, file_origin=None, description=None, array_annotations=None, **annotations, ): """ Initializes a newly constructed :class:`SpikeTrain` instance. """ # This method is only called when constructing a new SpikeTrain, # not when slicing or viewing. We use the same call signature # as __new__ for documentation purposes. Anything not in the call # signature is stored in annotations. # Calls parent __init__, which grabs universally recommended # attributes and sets up self.annotations DataObject.__init__( self, name=name, file_origin=file_origin, description=description, array_annotations=array_annotations, **annotations, ) def _repr_pretty_(self, pp, cycle): waveforms = "" if self.waveforms is not None: waveforms = " with waveforms" pp.text( f"{self.__class__.__name__} containing {self.size} spikes{waveforms}; " f"units {self.units.dimensionality.string}; datatype {self.dtype} " ) if self._has_repr_pretty_attrs_(): pp.breakable() self._repr_pretty_attrs_(pp, cycle) def _pp(line): pp.breakable() with pp.group(indent=1): pp.text(line) _pp(f"time: {self.t_start} to {self.t_stop}") def rescale(self, units, dtype=None): """ Return a copy of the :class:`SpikeTrain` converted to the specified units The `dtype` argument exists only for backward compatibility within quantities, see https://github.com/python-quantities/python-quantities/pull/204 """ obj = super().rescale(units) obj.t_start = self.t_start.rescale(units) obj.t_stop = self.t_stop.rescale(units) obj.unit = self.unit return obj def __reduce__(self): """ Map the __new__ function onto _new_BaseAnalogSignal, so that pickle works """ import numpy return _new_spiketrain, ( self.__class__, numpy.array(self), self.t_stop, self.units, self.dtype, None, self.sampling_rate, self.t_start, self.waveforms, self.left_sweep, self.name, self.file_origin, self.description, self.array_annotations, self.annotations, self.segment, self.unit, ) def __array_finalize__(self, obj): """ This is called every time a new :class:`SpikeTrain` is created. It is the appropriate place to set default values for attributes for :class:`SpikeTrain` constructed by slicing or viewing. User-specified values are only relevant for construction from constructor, and these are set in __new__. Then they are just copied over here. Note that the :attr:`waveforms` attribute is not sliced here. Nor is :attr:`t_start` or :attr:`t_stop` modified. """ # This calls Quantity.__array_finalize__ which deals with # dimensionality super().__array_finalize__(obj) # Supposedly, during initialization from constructor, obj is supposed # to be None, but this never happens. It must be something to do # with inheritance from Quantity. if obj is None: return # Set all attributes of the new object `self` from the attributes # of `obj`. For instance, when slicing, we want to copy over the # attributes of the original object. self.t_start = getattr(obj, "t_start", None) self.t_stop = getattr(obj, "t_stop", None) self.waveforms = getattr(obj, "waveforms", None) self.left_sweep = getattr(obj, "left_sweep", None) self.sampling_rate = getattr(obj, "sampling_rate", None) self.segment = getattr(obj, "segment", None) self.unit = getattr(obj, "unit", None) # The additional arguments self.annotations = getattr(obj, "annotations", {}) # Add empty array annotations, because they cannot always be copied, # but do not overwrite existing ones from slicing etc. # This ensures the attribute exists if not hasattr(self, "array_annotations"): self.array_annotations = ArrayDict(self._get_arr_ann_length()) # Note: Array annotations have to be changed when slicing or initializing an object, # copying them over in spite of changed data would result in unexpected behaviour # Globally recommended attributes self.name = getattr(obj, "name", None) self.file_origin = getattr(obj, "file_origin", None) self.description = getattr(obj, "description", None) if hasattr(obj, "lazy_shape"): self.lazy_shape = obj.lazy_shape def __repr__(self): """ Returns a string representing the :class:`SpikeTrain`. """ return f"" def sort(self): """ Sorts the :class:`SpikeTrain` and its :attr:`waveforms`, if any, by time. """ # sort the waveforms by the times sort_indices = np.argsort(self) if self.waveforms is not None and self.waveforms.any(): self.waveforms = self.waveforms[sort_indices] self.array_annotate(**deepcopy(self.array_annotations_at_index(sort_indices))) # now sort the times # We have sorted twice, but `self = self[sort_indices]` introduces # a dependency on the slicing functionality of SpikeTrain. super().sort() def __getslice__(self, i, j): """ Get a slice from :attr:`i` to :attr:`j`. Doesn't get called in Python 3, :meth:`__getitem__` is called instead """ return self.__getitem__(slice(i, j)) def __add__(self, time): """ Shifts the time point of all spikes by adding the amount in :attr:`time` (:class:`Quantity`) If `time` is a scalar, this also shifts :attr:`t_start` and :attr:`t_stop`. If `time` is an array, :attr:`t_start` and :attr:`t_stop` are not changed unless some of the new spikes would be outside this range. In this case :attr:`t_start` and :attr:`t_stop` are modified if necessary to ensure they encompass all spikes. It is not possible to add two SpikeTrains (raises ValueError). """ spikes = self.view(pq.Quantity) check_has_dimensions_time(time) if isinstance(time, SpikeTrain): raise TypeError("Can't add two spike trains") new_times = spikes + time if time.size > 1: t_start = min(self.t_start, np.min(new_times)) t_stop = max(self.t_stop, np.max(new_times)) else: t_start = self.t_start + time t_stop = self.t_stop + time return SpikeTrain( times=new_times, t_stop=t_stop, units=self.units, sampling_rate=self.sampling_rate, t_start=t_start, waveforms=self.waveforms, left_sweep=self.left_sweep, name=self.name, file_origin=self.file_origin, description=self.description, array_annotations=deepcopy(self.array_annotations), **self.annotations, ) def __sub__(self, time): """ Shifts the time point of all spikes by subtracting the amount in :attr:`time` (:class:`Quantity`) If `time` is a scalar, this also shifts :attr:`t_start` and :attr:`t_stop`. If `time` is an array, :attr:`t_start` and :attr:`t_stop` are not changed unless some of the new spikes would be outside this range. In this case :attr:`t_start` and :attr:`t_stop` are modified if necessary to ensure they encompass all spikes. In general, it is not possible to subtract two SpikeTrain objects (raises ValueError). However, if `time` is itself a SpikeTrain of the same size as the SpikeTrain, returns a Quantities array (since this is often used in checking whether two spike trains are the same or in calculating the inter-spike interval. """ spikes = self.view(pq.Quantity) check_has_dimensions_time(time) if isinstance(time, SpikeTrain): if self.size == time.size: return spikes - time else: raise TypeError("Can't subtract spike trains with different sizes") else: new_times = spikes - time if time.size > 1: t_start = min(self.t_start, np.min(new_times)) t_stop = max(self.t_stop, np.max(new_times)) else: t_start = self.t_start - time t_stop = self.t_stop - time return SpikeTrain( times=spikes - time, t_stop=t_stop, units=self.units, sampling_rate=self.sampling_rate, t_start=t_start, waveforms=self.waveforms, left_sweep=self.left_sweep, name=self.name, file_origin=self.file_origin, description=self.description, array_annotations=deepcopy(self.array_annotations), **self.annotations, ) def __getitem__(self, i): """ Get the item or slice :attr:`i`. """ obj = super().__getitem__(i) if hasattr(obj, "waveforms") and obj.waveforms is not None: obj.waveforms = obj.waveforms.__getitem__(i) try: obj.array_annotate(**deepcopy(self.array_annotations_at_index(i))) except AttributeError: # If Quantity was returned, not SpikeTrain pass return obj def __setitem__(self, i, value): """ Set the value the item or slice :attr:`i`. """ if not hasattr(value, "units"): value = pq.Quantity(value, units=self.units) # or should we be strict: raise ValueError( # "Setting a value # requires a quantity")? # check for values outside t_start, t_stop _check_time_in_range(value, self.t_start, self.t_stop) super().__setitem__(i, value) def __setslice__(self, i, j, value): if not hasattr(value, "units"): value = pq.Quantity(value, units=self.units) _check_time_in_range(value, self.t_start, self.t_stop) super().__setslice__(i, j, value) def _copy_data_complement(self, other, deep_copy=False): """ Copy the metadata from another :class:`SpikeTrain`. Note: Array annotations can not be copied here because length of data can change """ # Note: Array annotations cannot be copied because length of data can be changed # here which would cause inconsistencies for attr in ("left_sweep", "sampling_rate", "name", "file_origin", "description", "annotations"): attr_value = getattr(other, attr, None) if deep_copy: attr_value = deepcopy(attr_value) setattr(self, attr, attr_value) def duplicate_with_new_data(self, signal, t_start=None, t_stop=None, waveforms=None, deep_copy=True, units=None): """ Create a new :class:`SpikeTrain` with the same metadata but different data (times, t_start, t_stop) Note: Array annotations can not be copied here because length of data can change """ # using previous t_start and t_stop if no values are provided if t_start is None: t_start = self.t_start if t_stop is None: t_stop = self.t_stop if waveforms is None: waveforms = self.waveforms if units is None: units = self.units else: units = pq.quantity.validate_dimensionality(units) signal = deepcopy(signal) new_st = SpikeTrain(signal, t_start=t_start, t_stop=t_stop, waveforms=waveforms, units=units) new_st._copy_data_complement(self, deep_copy=deep_copy) # Note: Array annotations are not copied here, because length of data could change # overwriting t_start and t_stop with new values new_st.t_start = t_start new_st.t_stop = t_stop # consistency check _check_time_in_range(new_st, new_st.t_start, new_st.t_stop, view=False) _check_waveform_dimensions(new_st) return new_st def time_slice(self, t_start, t_stop): """ Creates a new :class:`SpikeTrain` corresponding to the time slice of the original :class:`SpikeTrain` between (and including) times :attr:`t_start` and :attr:`t_stop`. Either parameter can also be None to use infinite endpoints for the time interval. """ _t_start = t_start _t_stop = t_stop if t_start is None: _t_start = -np.inf if t_stop is None: _t_stop = np.inf if _t_start > self.t_stop or _t_stop < self.t_start: # the alternative to raising an exception would be to return # a zero-duration spike train set at self.t_stop or self.t_start raise ValueError("A time slice completely outside the " "boundaries of the spike train is not defined.") indices = (self >= _t_start) & (self <= _t_stop) # Time slicing should create a deep copy of the object new_st = deepcopy(self[indices]) new_st.t_start = max(_t_start, self.t_start) new_st.t_stop = min(_t_stop, self.t_stop) if self.waveforms is not None: new_st.waveforms = self.waveforms[indices] return new_st def time_shift(self, t_shift): """ Shifts a :class:`SpikeTrain` to start at a new time. Parameters ---------- t_shift: Quantity (time) Amount of time by which to shift the :class:`SpikeTrain`. Returns ------- spiketrain: :class:`SpikeTrain` New instance of a :class:`SpikeTrain` object starting at t_shift later than the original :class:`SpikeTrain` (the original :class:`SpikeTrain` is not modified). """ # We need new to make a new SpikeTrain times = self.times.copy() + t_shift t_stop = self.t_stop + t_shift t_start = self.t_start + t_shift new_st = SpikeTrain( times=times, t_stop=t_stop, units=self.unit, sampling_rate=self.sampling_rate, t_start=t_start, waveforms=self.waveforms, left_sweep=self.left_sweep, name=self.name, file_origin=self.file_origin, description=self.description, array_annotations=deepcopy(self.array_annotations), **self.annotations, ) # Here we can safely copy the array annotations since we know that # the length of the SpikeTrain does not change. new_st.array_annotate(**self.array_annotations) return new_st def merge(self, *others): """ Merge other :class:`SpikeTrain` objects into this one. The times of the :class:`SpikeTrain` objects combined in one array and sorted. If the attributes of the :class:`SpikeTrain` objects are not compatible, an Exception is raised. """ for other in others: if isinstance(other, neo.io.proxyobjects.SpikeTrainProxy): raise MergeError( "Cannot merge, SpikeTrainProxy objects cannot be merged" "into regular SpikeTrain objects, please load them first." ) elif not isinstance(other, SpikeTrain): raise MergeError("Cannot merge, only SpikeTrain" "can be merged into a SpikeTrain.") if self.sampling_rate != other.sampling_rate: raise MergeError("Cannot merge, different sampling rates") if self.t_start != other.t_start: raise MergeError("Cannot merge, different t_start") if self.t_stop != other.t_stop: raise MergeError("Cannot merge, different t_stop") if self.left_sweep != other.left_sweep: raise MergeError("Cannot merge, different left_sweep") if self.segment != other.segment: raise MergeError("Cannot merge these signals as they belong to" " different segments.") all_spiketrains = [self] all_spiketrains.extend([st.rescale(self.units) for st in others]) wfs = [st.waveforms is not None for st in all_spiketrains] if any(wfs) and not all(wfs): raise MergeError("Cannot merge signal with waveform and signal " "without waveform.") stack = np.concatenate([np.asarray(st) for st in all_spiketrains]) sorting = np.argsort(stack) sorted_stack = stack[sorting] kwargs = {} kwargs["array_annotations"] = self._merge_array_annotations(others, sorting=sorting) for name in ("name", "description", "file_origin"): attr = getattr(self, name) # check if self is already a merged spiketrain # if it is, get rid of the bracket at the end to append more attributes if attr is not None: if attr.startswith("merge(") and attr.endswith(")"): attr = attr[:-1] for other in others: attr_other = getattr(other, name) # both attributes are None --> nothing to do if attr is None and attr_other is None: continue # one of the attributes is None --> convert to string in order to merge them elif attr is None or attr_other is None: attr = str(attr) attr_other = str(attr_other) # check if the other spiketrain is already a merged spiketrain # if it is, append all of its merged attributes that aren't already in attr if attr_other.startswith("merge(") and attr_other.endswith(")"): for subattr in attr_other[6:-1].split("; "): if subattr not in attr: attr += "; " + subattr if not attr.startswith("merge("): attr = "merge(" + attr # if the other attribute is not in the list --> append # if attr doesn't already start with merge add merge( in the beginning elif attr_other not in attr: attr += "; " + attr_other if not attr.startswith("merge("): attr = "merge(" + attr # close the bracket of merge(...) if necessary if attr is not None: if attr.startswith("merge("): attr += ")" # write attr into kwargs dict kwargs[name] = attr merged_annotations = merge_annotations(*(st.annotations for st in all_spiketrains)) kwargs.update(merged_annotations) train = SpikeTrain( sorted_stack, units=self.units, dtype=self.dtype, copy=None, t_start=self.t_start, t_stop=self.t_stop, sampling_rate=self.sampling_rate, left_sweep=self.left_sweep, **kwargs, ) if all(wfs): wfs_stack = np.vstack([st.waveforms.rescale(self.waveforms.units) for st in all_spiketrains]) wfs_stack = wfs_stack[sorting] * self.waveforms.units train.waveforms = wfs_stack train.segment = self.segment if train.segment is not None: self.segment.spiketrains.append(train) return train def _merge_array_annotations(self, others, sorting=None): """ Merges array annotations of multiple different objects. The merge happens in such a way that the result fits the merged data In general this means concatenating the arrays from the objects. If an annotation is not present in one of the objects, it will be omitted. Apart from that the array_annotations need to be sorted according to the sorting of the spikes. :return Merged array_annotations """ if sorting is None: raise ValueError("The order of the merged spikes must be known") merged_array_annotations = {} omitted_keys_self = [] keys = self.array_annotations.keys() for key in keys: try: self_ann = deepcopy(self.array_annotations[key]) other_ann = np.concatenate([deepcopy(other.array_annotations[key]) for other in others]) if isinstance(self_ann, pq.Quantity): other_ann.rescale(self_ann.units) arr_ann = np.concatenate([self_ann, other_ann]) * self_ann.units else: arr_ann = np.concatenate([self_ann, other_ann]) merged_array_annotations[key] = arr_ann[sorting] # Annotation only available in 'self', must be skipped # Ignore annotations present only in one of the SpikeTrains except KeyError: omitted_keys_self.append(key) continue omitted_keys_other = [ key for key in set([key for other in others for key in other.array_annotations]) if key not in self.array_annotations ] if omitted_keys_self or omitted_keys_other: warnings.warn( f"The following array annotations were omitted, because they were only " f"present in one of the merged objects: {omitted_keys_self} from the " f"one that was merged into and {omitted_keys_other} from the ones that " f"were merged into it.", UserWarning, ) return merged_array_annotations @property def times(self): """ Returns the :class:`SpikeTrain` as a quantity array. """ return pq.Quantity(self) @property def duration(self): """ Duration over which spikes can occur, (:attr:`t_stop` - :attr:`t_start`) """ if self.t_stop is None or self.t_start is None: return None return self.t_stop - self.t_start @property def spike_duration(self): """ Duration of a waveform. (:attr:`waveform`.shape[2] * :attr:`sampling_period`) """ if self.waveforms is None or self.sampling_rate is None: return None return self.waveforms.shape[2] / self.sampling_rate @property def sampling_period(self): """ Interval between two samples. (1/:attr:`sampling_rate`) """ if self.sampling_rate is None: return None return 1.0 / self.sampling_rate @sampling_period.setter def sampling_period(self, period): """ Setter for :attr:`sampling_period` """ if period is None: self.sampling_rate = None else: self.sampling_rate = 1.0 / period @property def right_sweep(self): """ Time from the trigger times of the spikes to the end of the waveforms. (:attr:`left_sweep` + :attr:`spike_duration`) """ dur = self.spike_duration if self.left_sweep is None or dur is None: return None return self.left_sweep + dur ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/spiketrainlist.py0000644000175100001660000004372314743453644017137 0ustar00runnerdocker# -*- coding: utf-8 -*- """ This module implements :class:`SpikeTrainList`, a pseudo-list which supports a multiplexed representation of spike trains (all times in a single array, with a second array indicating which neuron/channel the spike is from). """ import warnings import numpy as np import quantities as pq from .spiketrain import SpikeTrain, normalize_times_array from .objectlist import ObjectList def is_spiketrain_or_proxy(obj): return isinstance(obj, SpikeTrain) or getattr(obj, "proxy_for", None) == SpikeTrain def unique(quantities): """ Function to mimic np.unique for use with quantities Parameters ---------- quantities: array-like[pq.Quantity dtype] An array-like object containing quantities Returns ------- unique_quantities: array[pq.Quantity dtype] The unique entries within the array Notes ----- np.unique doesn't work with a list of quantities of different scale, this function can be used instead.""" # todo: add a tolerance to handle floating point discrepancies # due to scaling. if len(quantities) > 0: common_units = quantities[0].units scaled_quantities = pq.Quantity([q.rescale(common_units) for q in quantities], common_units) return np.unique(scaled_quantities) else: return quantities class SpikeTrainList(ObjectList): """ This class contains multiple spike trains, and can represent them either as a list of SpikeTrain objects or as a pair of arrays (all spike times in a single array, with a second array indicating which neuron/channel the spike is from). Parameters ---------- items: list[neo.SpikeTrain] | array[neo.SpikeTrain] | None, default: None The SpikeTrains to add to the list parent: neo.Segment | None, default: None The Segment to include the SpikeTrainList within or None for no parent Notes ----- A SpikeTrainList object should behave like a list of SpikeTrains for iteration and item access. It is not intended to be used directly by users, but is available as the attribute `spiketrains` of Segments. Examples -------- # Create from list of SpikeTrain objects >>> stl = SpikeTrainList(items=( ... SpikeTrain([0.5, 0.6, 23.6, 99.2], units="ms", t_start=0 * pq.ms, t_stop=100.0 * pq.ms), ... SpikeTrain([0.0007, 0.0112], units="s", t_start=0 * pq.ms, t_stop=100.0 * pq.ms), ... SpikeTrain([1100, 88500], units="us", t_start=0 * pq.ms, t_stop=100.0 * pq.ms), ... SpikeTrain([], units="ms", t_start=0 * pq.ms, t_stop=100.0 * pq.ms), ... ) ... ) >>> stl.multiplexed (array([0, 0, 0, 0, 1, 1, 2, 2]), array([ 0.5, 0.6, 23.6, 99.2, 0.7, 11.2, 1.1, 88.5]) * ms) # Create from a pair of arrays >>> stl = SpikeTrainList.from_spike_time_array( ... np.array([0.5, 0.6, 0.7, 1.1, 11.2, 23.6, 88.5, 99.2]), ... np.array([0, 0, 1, 2, 1, 0, 2, 0]), ... all_channel_ids=[0, 1, 2, 3], ... units='ms', ... t_start=0 * pq.ms, ... t_stop=100.0 * pq.ms) >>> list(stl) [, , , ] """ allowed_contents = (SpikeTrain,) def __init__(self, items=None, parent=None): """Initialize self""" if items is None: self._items = items else: for item in items: if not is_spiketrain_or_proxy(item): raise ValueError("`items` can only contain SpikeTrain objects or proxy objects") self._items = list(items) self._spike_time_array = None self._channel_id_array = None self._all_channel_ids = None self._spiketrain_metadata = {} if parent is not None and parent.__class__.__name__ != "Segment": raise AttributeError("The parent class must be a Segment") self.segment = parent @property def parent(self): return self.segment def __iter__(self): """Implement iter(self)""" if self._items is None: self._spiketrains_from_array() for item in self._items: yield item def __getitem__(self, i): """x.__getitem__(y) <==> x[y]""" if self._items is None: self._spiketrains_from_array() items = self._items[i] if is_spiketrain_or_proxy(items): return items else: return SpikeTrainList(items=items) def __setitem__(self, i, value): if self._items is None: self._spiketrains_from_array() self._items[i] = value def __str__(self): """Return str(self)""" if self._items is None: if self._spike_time_array is None: return str([]) else: return ( f"SpikeTrainList containing {self._spike_time_array.size} " f"spikes from {len(self._all_channel_ids)} neurons" ) else: return str(self._items) def __repr__(self): return "" def __len__(self): """Return len(self)""" if self._items is None: if self._all_channel_ids is not None: return len(self._all_channel_ids) elif self._channel_id_array is not None: return np.unique(self._channel_id_array).size else: return 0 else: return len(self._items) def _add_spiketrainlists(self, other, in_place=False): if self._spike_time_array is None or other._spike_time_array is None: # if either self or other is not storing multiplexed spike trains # we combine them using the list of SpikeTrains representation if self._items is None: self._spiketrains_from_array() if other._items is None: other._spiketrains_from_array() if in_place: self._items.extend(other._items) return self else: return self.__class__(items=self._items[:] + other._items) else: # both self and other are storing multiplexed spike trains # so we update the array representation if self._spiketrain_metadata["t_start"] != other._spiketrain_metadata["t_start"]: raise ValueError("Incompatible t_start") # todo: adjust times and t_start of other to be compatible with self if self._spiketrain_metadata["t_stop"] != other._spiketrain_metadata["t_stop"]: raise ValueError("Incompatible t_stop") # todo: adjust t_stop of self and other as necessary combined_spike_time_array = np.hstack((self._spike_time_array, other._spike_time_array)) combined_channel_id_array = np.hstack((self._channel_id_array, other._channel_id_array)) combined_channel_ids = set(list(self._all_channel_ids) + other._all_channel_ids) if len(combined_channel_ids) != (len(self._all_channel_ids) + len(other._all_channel_ids)): raise ValueError("Duplicate channel ids, please rename channels before adding") if in_place: self._spike_time_array = combined_spike_time_array self._channel_id_array = combined_channel_id_array self._all_channel_ids = combined_channel_ids self._items = None return self else: return self.__class__.from_spike_time_array( combined_spike_time_array, combined_channel_id_array, combined_channel_ids, t_start=self._spiketrain_metadata["t_start"], t_stop=self._spiketrain_metadata["t_stop"], ) def __add__(self, other): """Return self + other""" if isinstance(other, self.__class__): return self._add_spiketrainlists(other) elif other and is_spiketrain_or_proxy(other[0]): return self._add_spiketrainlists(self.__class__(items=other, parent=self.segment)) else: if self._items is None: self._spiketrains_from_array() return self._items + other def __iadd__(self, other): """Return self""" if isinstance(other, self.__class__): return self._add_spiketrainlists(other, in_place=True) elif other and is_spiketrain_or_proxy(other[0]): for obj in other: self._handle_append(obj) if self._items is None: self._spiketrains_from_array() self._items.extend(other) return self else: raise TypeError("Can only add a SpikeTrainList or a list of SpikeTrains in place") def __radd__(self, other): """Return other + self""" if isinstance(other, self.__class__): return other._add_spiketrainlists(self) elif other and is_spiketrain_or_proxy(other[0]): for obj in other: obj.segment = self.segment if self._items is None: self._spiketrains_from_array() self._items.extend(other) return self elif len(other) == 0: return self else: if self._items is None: self._spiketrains_from_array() return other + self._items def append(self, obj): """ Appends to the SpikeTrainList with a new neo.core.SpikeTrain Parameters ---------- obj: neo.core.SpikeTrain The new neo.core.SpikeTrain to append to the current SpikeTrainList Examples -------- # with SpikeTrainList stl with two SpikeTrains >>> len(stl) 2 >>> stl.append(SpikeTrain([0.5, 0.6, 23.6, 99.2], units="ms", t_start=0 * pq.ms, t_stop=100.0 * pq.ms)) >>> len(stl) 3 """ if not is_spiketrain_or_proxy(obj): raise ValueError("Can only append SpikeTrain objects") if self._items is None: self._spiketrains_from_array() self._handle_append(obj) self._items.append(obj) def extend(self, iterable): """Extends the SpikeTrainList with additional SpikeTrain's from an iterable Parameters ---------- iterable: iterable[neo.core.SpikeTrain] A list-like or array-like object containing neo.core.SpikeTrain to be added to the SpikeTrainList Examples -------- # with SpikeTrainList stl with two SpikeTrains and stl_other with three SpikeTrains >>> len(stl) 2 >>> len(stl_other) 3 >>> stl.extend(stl_other) >>> len(stl) 5 """ if self._items is None: self._spiketrains_from_array() for obj in iterable: self._handle_append(obj) self._items.extend(iterable) @classmethod def from_spike_time_array( cls, spike_time_array, channel_id_array, all_channel_ids, t_stop, units=None, t_start=0.0 * pq.s, **annotations ): """Create a SpikeTrainList object from an array of spike times and an array of channel ids. Parameters ---------- spike_time_array: quantity array 1D | numpy array 1D, | list The times of all spikes. channel_id_array: numpy array 1D of dtype int The id of the channel (e.g. the neuron) to which each spike belongs. This array should have the same length as the `spike_time_array` all_channel_ids: list | tuple, | numpy array 1D containing integers All channel ids. This is needed to represent channels in which there are no spikes. t_stop: quantity scalar | numpy scalar | float Time at which spike recording ended. This will be converted to the same units as `spike_time_array` or `units`. units: quantity units | None, default: None Required if `spike_time_array is not a :class:`~quantities.Quantity`. :t_start: quantity scalar | numpy scalar | float, default: 0.0 * pq.s Time at which spike recording began. This will be converted to the same units as `spike_time_array` or `units` **annotations: dict The neo.core.baseneo annotations (e.g. name, or user-defined) """ spike_time_array, dim = normalize_times_array(spike_time_array, units) obj = cls() obj._spike_time_array = spike_time_array obj._channel_id_array = channel_id_array obj._all_channel_ids = all_channel_ids obj._spiketrain_metadata = {"t_start": t_start, "t_stop": t_stop} for name, ann_value in annotations.items(): if ( not isinstance(ann_value, str) and hasattr(ann_value, "__len__") and len(ann_value) != len(all_channel_ids) ): raise ValueError(f"incorrect length for annotation '{name}'") obj._annotations = annotations return obj def _spiketrains_from_array(self): """Convert multiplexed spike time data into a list of SpikeTrain objects""" if self._spike_time_array is None: self._items = [] else: self._items = [] for i, channel_id in enumerate(self._all_channel_ids): mask = self._channel_id_array == channel_id times = self._spike_time_array[mask] spiketrain = SpikeTrain(times, **self._spiketrain_metadata) for name, value in self._annotations.items(): if ( not isinstance(value, str) and hasattr(value, "__len__") and len(value) == len(self._all_channel_ids) ): spiketrain.annotate(**{name: value[i]}) else: spiketrain.annotate(**{name: value}) spiketrain.annotate(channel_id=channel_id) spiketrain.segment = self.segment self._items.append(spiketrain) @property def multiplexed(self): """ Return spike trains as a pair of arrays. Returns ------- channel_id_array: np.ndarray The ids of the channels/neurons that produced each spike spike_time_array: np.ndarray of dtype Quantity The Quantity array containing the times of the spikes """ if self._spike_time_array is None: # need to convert list of SpikeTrains into multiplexed spike times array if self._items is None: return np.array([]), np.array([]) else: channel_ids = [] spike_times = [] dim = self._items[0].units.dimensionality for i, spiketrain in enumerate(self._items): if hasattr(spiketrain, "load"): # proxy object spiketrain = spiketrain.load() if spiketrain.times.dimensionality.items() == dim.items(): # no need to rescale spike_times.append(spiketrain.times) else: spike_times.append(spiketrain.times.rescale(dim)) if "channel_id" in spiketrain.annotations and isinstance(spiketrain.annotations["channel_id"], int): ch_id = spiketrain.annotations["channel_id"] else: ch_id = i channel_ids.append(ch_id * np.ones(spiketrain.shape, dtype=np.int64)) self._spike_time_array = np.hstack(spike_times) * self._items[0].units self._channel_id_array = np.hstack(channel_ids) return self._channel_id_array, self._spike_time_array @property def t_start(self): if "t_start" in self._spiketrain_metadata: return self._spiketrain_metadata["t_start"] else: t_start_values = unique( [item.t_start for item in self._items if isinstance(item, SpikeTrain)] ) # ignore proxy objects if len(t_start_values) == 0: raise ValueError("t_start not defined for an empty spike train list") elif len(t_start_values) > 1: warnings.warn("Found multiple values of t_start, returning the earliest") t_start = t_start_values.min() else: t_start = t_start_values[0] self._spiketrain_metadata["t_start"] = t_start return t_start @property def t_stop(self): if "t_stop" in self._spiketrain_metadata: return self._spiketrain_metadata["t_stop"] else: t_stop_values = unique( [item.t_stop for item in self._items if isinstance(item, SpikeTrain)] ) # ignore proxy objects if len(t_stop_values) == 0: raise ValueError("t_stop not defined for an empty spike train list") elif len(t_stop_values) > 1: warnings.warn("Found multiple values of t_stop, returning the latest") t_stop = t_stop_values.max() else: t_stop = t_stop_values[0] self._spiketrain_metadata["t_stop"] = t_stop return t_stop @property def all_channel_ids(self): if self._all_channel_ids is None: self._all_channel_ids = [] for i, spiketrain in enumerate(self._items): if "channel_id" in spiketrain.annotations and isinstance(spiketrain.annotations["channel_id"], int): ch_id = spiketrain.annotations["channel_id"] else: ch_id = i self._all_channel_ids.append(ch_id) return self._all_channel_ids ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/core/view.py0000644000175100001660000000667414743453644015050 0ustar00runnerdocker""" This module implements :class:`ChannelView`, which represents a subset of the channels in an :class:`AnalogSignal` or :class:`IrregularlySampledSignal`. It replaces the indexing function of the former :class:`ChannelIndex`. """ import numpy as np from .baseneo import BaseNeo from .basesignal import BaseSignal from .dataobject import ArrayDict class ChannelView(BaseNeo): """ A tool for indexing a subset of the channels within an :class:`AnalogSignal` or :class:`IrregularlySampledSignal`; Parameters ---------- obj: Neo.AnalogSignal | Neo.IrregularlySampledSignal The neo object to index index: list | np.ndarray Boolean or integer mask to select the channels of interest name: str | None, default: None A label for the dataset. description: str | None, default: None Text description. file_origin: str | None, default: None Filesystem path or URL of the original data file. array_annotations: dict | None, default: None Dict mapping strings to numpy arrays containing annotations for all data points annotations: dict Other use-specified metadata with keywords """ _parent_objects = ("Group",) _parent_attrs = ("group",) _necessary_attrs = ( ("obj", ("AnalogSignal", "IrregularlySampledSignal"), 1), ("index", np.ndarray, 1, np.dtype("i")), ) is_view = True # "mask" would be an alternative name, proposing "index" for # backwards-compatibility with ChannelIndex def __init__( self, obj, index, name=None, description=None, file_origin=None, array_annotations=None, **annotations ): super().__init__(name=name, description=description, file_origin=file_origin, **annotations) if not (isinstance(obj, BaseSignal) or (hasattr(obj, "proxy_for") and issubclass(obj.proxy_for, BaseSignal))): raise ValueError("Can only take a ChannelView of an AnalogSignal " "or an IrregularlySampledSignal") self.obj = obj # check type and dtype of index and convert index to a common form # (accept list or array of bool or int, convert to int array) self.index = np.array(index) if len(self.index.shape) != 1: raise ValueError("index must be a 1D array") if self.index.dtype == bool: # convert boolean mask to integer index if self.index.size != self.obj.shape[-1]: raise ValueError("index size does not match number of channels in signal") (self.index,) = np.nonzero(self.index) # allow any type of integer representation elif self.index.dtype.char not in np.typecodes["AllInteger"]: raise ValueError("index must be of a list or array of data type boolean or integer") if not hasattr(self, "array_annotations") or not self.array_annotations: self.array_annotations = ArrayDict(self._get_arr_ann_length()) if array_annotations is not None: self.array_annotate(**array_annotations) @property def shape(self): return (self.obj.shape[0], self.index.size) def _get_arr_ann_length(self): return self.index.size def array_annotate(self, **array_annotations): self.array_annotations.update(array_annotations) def resolve(self): """ Return a copy of the underlying object containing just the subset of channels defined by the index. """ return self.obj[:, self.index] ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1464155 neo-0.14.0/neo/io/0000755000175100001660000000000014743453656013171 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/__init__.py0000644000175100001660000003070014743453644015277 0ustar00runnerdocker""" :mod:`neo.io` provides classes for reading and/or writing electrophysiological data files. Note that if the package dependency is not satisfied for one io, it does not raise an error but a warning. :attr:`neo.io.iolist` provides a list of successfully imported io classes. Functions: .. autofunction:: neo.io.get_io .. autofunction:: neo.io.list_candidate_ios Classes: * :attr:`AlphaOmegaIO` * :attr:`AsciiImageIO` * :attr:`AsciiSignalIO` * :attr:`AsciiSpikeTrainIO` * :attr:`AxographIO` * :attr:`AxonaIO` * :attr:`AxonIO` * :attr:`BCI2000IO` * :attr:`BiocamIO` * :attr:`BlackrockIO` * :attr:`BlkIO` * :attr:`BrainVisionIO` * :attr:`BrainwareDamIO` * :attr:`BrainwareF32IO` * :attr:`BrainwareSrcIO` * :attr:`CedIO` * :attr:`EDFIO` * :attr:`ElanIO` * :attr:`IgorIO` * :attr:`IntanIO` * :attr:`MEArecIO` * :attr:`KlustaKwikIO` * :attr:`KwikIO` * :attr:`MaxwellIO` * :attr:`MedIO` * :attr:`MicromedIO` * :attr:`NeoMatlabIO` * :attr:`NestIO` * :attr:`NeuralynxIO` * :attr:`NeuroExplorerIO` * :attr:`NeuroNexusIO` * :attr:`NeuroScopeIO` * :attr:`NeuroshareIO` * :attr:`NixIO` * :attr:`NWBIO` * :attr:`OpenEphysIO` * :attr:`OpenEphysBinaryIO` * :attr:`PhyIO` * :attr:`PickleIO` * :attr:`PlexonIO` * :attr:`Plexon2IO` * :attr:`RawBinarySignalIO` * :attr:`RawMCSIO` * :attr:`Spike2IO` * :attr:`SpikeGadgetsIO` * :attr:`SpikeGLXIO` * :attr:`StimfitIO` * :attr:`TdtIO` * :attr:`TiffIO` * :attr:`WinEdrIO` * :attr:`WinWcpIO` .. autoclass:: neo.io.AlphaOmegaIO .. autoattribute:: extensions .. autoclass:: neo.io.AsciiImageIO .. autoattribute:: extensions .. autoclass:: neo.io.AsciiSignalIO .. autoattribute:: extensions .. autoclass:: neo.io.AsciiSpikeTrainIO .. autoattribute:: extensions .. autoclass:: neo.io.AxographIO .. autoattribute:: extensions .. autoclass:: neo.io.AxonaIO .. autoattribute:: extensions .. autoclass:: neo.io.AxonIO .. autoattribute:: extensions .. autoclass:: neo.io.BCI2000IO .. autoattribute:: extensions .. autoclass:: neo.io.BiocamIO .. autoattribute:: extensions .. autoclass:: neo.io.BlackrockIO .. autoattribute:: extensions .. autoclass:: neo.io.BlkIO .. autoattribute:: extensions .. autoclass:: neo.io.BrainVisionIO .. autoattribute:: extensions .. autoclass:: neo.io.BrainwareDamIO .. autoattribute:: extensions .. autoclass:: neo.io.BrainwareF32IO .. autoattribute:: extensions .. autoclass:: neo.io.BrainwareSrcIO .. autoattribute:: extensions .. autoclass:: neo.io.CedIO .. autoattribute:: extensions .. autoclass:: neo.io.EDFIO .. autoattribute:: extensions .. autoclass:: neo.io.ElanIO .. autoattribute:: extensions .. .. autoclass:: neo.io.ElphyIO .. autoattribute:: extensions .. autoclass:: neo.io.IgorIO .. autoattribute:: extensions .. autoclass:: neo.io.IntanIO .. autoattribute:: extensions .. autoclass:: neo.io.KlustaKwikIO .. autoattribute:: extensions .. autoclass:: neo.io.KwikIO .. autoattribute:: extensions .. autoclass:: neo.io.MEArecIO .. autoattribute:: extensions .. autoclass:: neo.io.MaxwellIO .. autoattribute:: extensions .. autoclass:: neo.io.MedIO .. autoattribute:: extensions .. autoclass:: neo.io.MicromedIO .. autoattribute:: extensions .. autoclass:: neo.io.NeoMatlabIO .. autoattribute:: extensions .. autoclass:: neo.io.NestIO .. autoattribute:: extensions .. autoclass:: neo.io.NeuralynxIO .. autoattribute:: extensions .. autoclass:: neo.io.NeuroExplorerIO .. autoattribute:: extensions .. autoclass:: neo.io.NeuroNexusIO .. autoattribute:: extensions .. autoclass:: neo.io.NeuroScopeIO .. autoattribute:: extensions .. autoclass:: neo.io.NeuroshareIO .. autoattribute:: extensions .. autoclass:: neo.io.NixIO .. autoattribute:: extensions .. autoclass:: neo.io.NWBIO .. autoattribute:: extensions .. autoclass:: neo.io.OpenEphysIO .. autoattribute:: extensions .. autoclass:: neo.io.OpenEphysBinaryIO .. autoattribute:: extensions .. autoclass:: neo.io.PhyIO .. autoattribute:: extensions .. autoclass:: neo.io.PickleIO .. autoattribute:: extensions .. autoclass:: neo.io.PlexonIO .. autoattribute:: extensions .. autoclass:: neo.io.Plexon2IO .. autoattribute:: extensions .. autoclass:: neo.io.RawBinarySignalIO .. autoattribute:: extensions .. autoclass:: neo.io.RawMCSIO .. autoattribute:: extensions .. autoclass:: Spike2IO .. autoattribute:: extensions .. autoclass:: SpikeGadgetsIO .. autoattribute:: extensions .. autoclass:: SpikeGLXIO .. autoattribute:: extensions .. autoclass:: neo.io.StimfitIO .. autoattribute:: extensions .. autoclass:: neo.io.TdtIO .. autoattribute:: extensions .. autoclass:: neo.io.TiffIO .. autoattribute:: extensions .. autoclass:: neo.io.WinEdrIO .. autoattribute:: extensions .. autoclass:: neo.io.WinWcpIO .. autoattribute:: extensions """ import pathlib from collections import Counter # try to import the neuroshare library. # if it is present, use the neuroshareapiio to load neuroshare files # if it is not present, use the neurosharectypesio to load files try: import neuroshare as ns except ModuleNotFoundError as err: from neo.io.neurosharectypesio import NeurosharectypesIO as NeuroshareIO # print("\n neuroshare library not found, loading data with ctypes" ) # print("\n to use the API be sure to install the library found at:") # print("\n www.http://pythonhosted.org/neuroshare/") else: from neo.io.neuroshareapiio import NeuroshareapiIO as NeuroshareIO # print("neuroshare library successfully imported") # print("\n loading with API...") from neo.io.alphaomegaio import AlphaOmegaIO from neo.io.asciiimageio import AsciiImageIO from neo.io.asciisignalio import AsciiSignalIO from neo.io.asciispiketrainio import AsciiSpikeTrainIO from neo.io.axographio import AxographIO from neo.io.axonaio import AxonaIO from neo.io.axonio import AxonIO from neo.io.biocamio import BiocamIO from neo.io.blackrockio import BlackrockIO from neo.io.blkio import BlkIO from neo.io.bci2000io import BCI2000IO from neo.io.brainvisionio import BrainVisionIO from neo.io.brainwaredamio import BrainwareDamIO from neo.io.brainwaref32io import BrainwareF32IO from neo.io.brainwaresrcio import BrainwareSrcIO from neo.io.cedio import CedIO from neo.io.edfio import EDFIO from neo.io.elanio import ElanIO from neo.io.elphyio import ElphyIO from neo.io.exampleio import ExampleIO from neo.io.igorproio import IgorIO from neo.io.intanio import IntanIO from neo.io.klustakwikio import KlustaKwikIO from neo.io.kwikio import KwikIO from neo.io.mearecio import MEArecIO from neo.io.maxwellio import MaxwellIO from neo.io.medio import MedIO from neo.io.micromedio import MicromedIO from neo.io.neomatlabio import NeoMatlabIO from neo.io.nestio import NestIO from neo.io.neuralynxio import NeuralynxIO from neo.io.neuroexplorerio import NeuroExplorerIO from neo.io.neuronexusio import NeuroNexusIO from neo.io.neuroscopeio import NeuroScopeIO from neo.io.nixio import NixIO from neo.io.nixio_fr import NixIO as NixIOFr from neo.io.nwbio import NWBIO from neo.io.openephysio import OpenEphysIO from neo.io.openephysbinaryio import OpenEphysBinaryIO from neo.io.phyio import PhyIO from neo.io.pickleio import PickleIO from neo.io.plexonio import PlexonIO from neo.io.plexon2io import Plexon2IO from neo.io.rawbinarysignalio import RawBinarySignalIO from neo.io.rawmcsio import RawMCSIO from neo.io.spike2io import Spike2IO from neo.io.spikegadgetsio import SpikeGadgetsIO from neo.io.spikeglxio import SpikeGLXIO from neo.io.stimfitio import StimfitIO from neo.io.tdtio import TdtIO from neo.io.tiffio import TiffIO from neo.io.winedrio import WinEdrIO from neo.io.winwcpio import WinWcpIO iolist = [ AlphaOmegaIO, AsciiImageIO, AsciiSignalIO, AsciiSpikeTrainIO, AxographIO, AxonaIO, AxonIO, BCI2000IO, BiocamIO, BlackrockIO, BlkIO, BrainVisionIO, BrainwareDamIO, BrainwareF32IO, BrainwareSrcIO, CedIO, EDFIO, ElanIO, ElphyIO, ExampleIO, IgorIO, IntanIO, KlustaKwikIO, KwikIO, MEArecIO, MaxwellIO, MedIO, MicromedIO, NixIO, NixIOFr, NeoMatlabIO, NestIO, NeuralynxIO, NeuroExplorerIO, NeuroNexusIO, NeuroScopeIO, NeuroshareIO, NWBIO, OpenEphysIO, OpenEphysBinaryIO, PhyIO, PickleIO, PlexonIO, Plexon2IO, RawBinarySignalIO, RawMCSIO, Spike2IO, SpikeGadgetsIO, SpikeGLXIO, StimfitIO, TdtIO, TiffIO, WinEdrIO, WinWcpIO, ] # for each supported extension list the ios supporting it io_by_extension = {} for current_io in iolist: # do not use `io` as variable name here as this overwrites the module io for extension in current_io.extensions: extension = extension.lower() # extension handling should not be case sensitive io_by_extension.setdefault(extension, []).append(current_io) def get_io(file_or_folder, *args, **kwargs): """ Return a Neo IO instance, guessing the type based on the filename suffix. """ ios = list_candidate_ios(file_or_folder) for io in ios: try: return io(file_or_folder, *args, **kwargs) except: continue raise IOError(f"Could not identify IO for {file_or_folder}") def list_candidate_ios(file_or_folder, ignore_patterns=["*.ini", "README.txt", "README.md"]): """ Identify neo IO that can potentially load data in the file or folder Parameters ---------- file_or_folder (str, pathlib.Path) Path to the file or folder to load ignore_patterns (list) List of patterns to ignore when scanning for known formats. See pathlib.PurePath.match(). Default: ['ini'] Returns ------- list List of neo io classes that are associated with the file extensions detected """ file_or_folder = pathlib.Path(file_or_folder) if file_or_folder.is_file(): suffix = file_or_folder.suffix[1:].lower() if suffix not in io_by_extension: raise ValueError(f"{suffix} is not a supported format of any IO.") return io_by_extension[suffix] elif file_or_folder.is_dir(): # scan files in folder to determine io type filenames = [f for f in file_or_folder.glob("**/*") if f.is_file()] # keep only relevant filenames filenames = [f for f in filenames if f.suffix and not any([f.match(p) for p in ignore_patterns])] # if no files are found in the folder, check subfolders # this is necessary for nested-folder based formats like spikeglx if not filenames: filenames = [f for f in file_or_folder.glob("**/*") if f.is_file()] # keep only relevant filenames filenames = [f for f in filenames if f.suffix and not any([f.match(p) for p in ignore_patterns])] # if only file prefix was provided, e.g /mydatafolder/session1- # to select all files sharing the `session1-` prefix elif file_or_folder.parent.exists(): filenames = list(file_or_folder.parent.glob(file_or_folder.name + "*")) # if filenames empty and suffix is provided then non-existent file # may be written in current dir. So run check for io if len(filenames) == 0 and file_or_folder.suffix: suffix = file_or_folder.suffix[1:].lower() if suffix not in io_by_extension: raise ValueError(f"{suffix} is not a supported format of any IO.") return io_by_extension[suffix] # If non-existent file in non-existent dir is given check if this # structure could be created with an io writing the file elif file_or_folder.suffix: suffix = file_or_folder.suffix[1:].lower() if suffix not in io_by_extension: raise ValueError(f"{suffix} is not a supported format of any IO.") return io_by_extension[suffix] else: raise ValueError(f"{file_or_folder} does not contain data files of a supported format") # find the io that fits the best with the files contained in the folder potential_ios = [] for filename in filenames: for suffix in filename.suffixes: suffix = suffix[1:].lower() if suffix in io_by_extension: potential_ios.extend(io_by_extension[suffix]) if not potential_ios: raise ValueError(f"Could not determine IO to load {file_or_folder}") # return ios ordered by number of files supported counter = Counter(potential_ios).most_common() return [io for io, count in counter] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/alphaomegaio.py0000644000175100001660000000102514743453644016164 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.alphaomegarawio import AlphaOmegaRawIO class AlphaOmegaIO(AlphaOmegaRawIO, BaseFromRaw): """Class for reading data from AlphaOmega MPX file""" __doc__ = AlphaOmegaRawIO.__doc__ def __init__(self, filename, lsx_files=None, prune_channels=True): AlphaOmegaRawIO.__init__( self, dirname=filename, lsx_files=lsx_files, prune_channels=prune_channels, ) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/asciiimageio.py0000644000175100001660000000571514743453644016173 0ustar00runnerdockerimport numpy as np from .baseio import BaseIO from neo.core import ImageSequence, Segment, Block class AsciiImageIO(BaseIO): """ IO class for reading ImageSequence in a text file *Usage*: >>> from neo import io >>> import quantities as pq >>> r = io.AsciiImageIO(file_name='File_asciiimage_1.txt',nb_frame=511, nb_row=100, ... nb_column=100,units='mm', sampling_rate=1.0*pq.Hz, ... spatial_scale=1.0*pq.mm) >>> block = r.read_block() read block creating segment returning block >>> block Block with 1 segments file_origin: 'File_asciiimage_1.txt # segments (N=1) 0: Segment with 1 imagesequences # analogsignals (N=0) """ name = "AsciiImage IO" description = "Neo IO module for optical imaging data stored as a folder of TIFF images." _prefered_signal_group_mode = "group-by-same-units" is_readable = True is_writable = False supported_objects = [Block, Segment, ImageSequence] readable_objects = supported_objects writeable_object = [] support_lazy = False read_params = {} write_params = {} extensions = [] mode = "file" def __init__( self, file_name=None, nb_frame=None, nb_row=None, nb_column=None, units=None, sampling_rate=None, spatial_scale=None, **kwargs, ): BaseIO.__init__(self, file_name, **kwargs) self.nb_frame = nb_frame self.nb_row = nb_row self.nb_column = nb_column self.units = units self.sampling_rate = sampling_rate self.spatial_scale = spatial_scale def read_block(self, lazy=False, **kwargs): file = open(self.filename, "r") data = file.read() print("read block") liste_value = [] record = [] for i in range(len(data)): if data[i] == "\n" or data[i] == "\t": t = "".join(str(e) for e in record) liste_value.append(t) record = [] else: record.append(data[i]) data = [] nb = 0 for i in range(self.nb_frame): data.append([]) for y in range(self.nb_row): data[i].append([]) for x in range(self.nb_column): data[i][y].append(liste_value[nb]) nb += 1 image_sequence = ImageSequence( np.array(data, dtype="float"), units=self.units, sampling_rate=self.sampling_rate, spatial_scale=self.spatial_scale, ) file.close() print("creating segment") segment = Segment(file_origin=self.filename) segment.imagesequences = [image_sequence] block = Block(file_origin=self.filename) block.segments.append(segment) print("returning block") return block ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/asciisignalio.py0000644000175100001660000004120514743453644016360 0ustar00runnerdocker""" Class for reading/writing analog signals in a text file. Each column represents an AnalogSignal. All AnalogSignals have the same sampling rate. Covers many cases when parts of a file can be viewed as a CSV format. Supported : Read/Write Author: sgarcia """ import csv import os import json import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import AnalogSignal, IrregularlySampledSignal, Segment, Block class AsciiSignalIO(BaseIO): """ Class for reading signals in generic ascii format. Columns represent signals. They all share the same sampling rate. The sampling rate is externally known or the first column could hold the time vector. Usage: >>> from neo import io >>> r = io.AsciiSignalIO(filename='File_asciisignal_2.txt') >>> seg = r.read_segment() >>> print seg.analogsignals [ AnalogSignal sampling_rate = 1.0 / np.mean(np.diff(sig[:, self.timecolumn])) / self.time_units else: # not equally spaced --> IrregularlySampledSignal sampling_rate = None t_start = sig[0, self.timecolumn] * self.time_units if self.signal_group_mode == "all-in-one": channel_index_annotation = self.usecols or np.arange(sig.shape[1]) channel_index_annotation = np.asarray(channel_index_annotation) if self.timecolumn is not None: mask = list(range(sig.shape[1])) if self.timecolumn >= 0: mask.remove(self.timecolumn) else: # allow negative column index mask.remove(sig.shape[1] + self.timecolumn) signal = sig[:, mask] channel_index_annotation = channel_index_annotation[mask] else: signal = sig if sampling_rate is None: irr_sig = IrregularlySampledSignal( signal[:, self.timecolumn] * self.time_units, signal * self.units, name="multichannel" ) seg.irregularlysampledsignals.append(irr_sig) else: ana_sig = AnalogSignal( signal * self.units, sampling_rate=sampling_rate, t_start=t_start, name="multichannel" ) ana_sig.array_annotate(channel_index=channel_index_annotation) seg.analogsignals.append(ana_sig) else: if self.timecolumn is not None and self.timecolumn < 0: time_col = sig.shape[1] + self.timecolumn else: time_col = self.timecolumn for i in range(sig.shape[1]): if time_col == i: continue signal = sig[:, i] * self.units if sampling_rate is None: irr_sig = IrregularlySampledSignal( sig[:, time_col] * self.time_units, signal, t_start=t_start, channel_index=i, name="Column %d" % i, ) seg.irregularlysampledsignals.append(irr_sig) else: ana_sig = AnalogSignal( signal, sampling_rate=sampling_rate, t_start=t_start, channel_index=i, name="Column %d" % i ) seg.analogsignals.append(ana_sig) seg.check_relationships() return seg def read_metadata(self): """ Read IO parameters from an associated JSON file """ # todo: also read annotations if self.metadata_filename is None: candidate = os.path.splitext(self.filename)[0] + "_about.json" if os.path.exists(candidate): self.metadata_filename = candidate else: return {} if os.path.exists(self.metadata_filename): with open(self.metadata_filename) as fp: metadata = json.load(fp) for key in "sampling_rate", "t_start": if key in metadata: metadata[key] = pq.Quantity(metadata[key]["value"], metadata[key]["units"]) for key in "units", "time_units": if key in metadata: metadata[key] = pq.Quantity(1, metadata[key]) return metadata else: return {} def write_segment(self, segment): """ Write a segment and AnalogSignal in a text file. """ # todo: check all analog signals have the same length, physical dimensions # and sampling rates l = [] if self.timecolumn is not None: if self.timecolumn != 0: raise NotImplementedError("Only column 0 currently supported for writing times") l.append(segment.analogsignals[0].times[:, np.newaxis].rescale(self.time_units)) # check signals are compatible (size, sampling rate), otherwise we # can't/shouldn't concatenate them # also set sampling_rate, t_start, units, time_units from signal(s) signal0 = segment.analogsignals[0] for attr in ("sampling_rate", "units", "shape"): val0 = getattr(signal0, attr) for signal in segment.analogsignals[1:]: val1 = getattr(signal, attr) if val0 != val1: raise Exception("Signals being written have different " + attr) setattr(self, attr, val0) # todo t_start, time_units self.time_units = signal0.times.units self.t_start = min(sig.t_start for sig in segment.analogsignals) for anaSig in segment.analogsignals: l.append(anaSig.rescale(self.units).magnitude) sigs = np.concatenate(l, axis=1) # print sigs.shape np.savetxt(self.filename, sigs, delimiter=self.delimiter) if self.metadata_filename is not None: self.write_metadata() def write_block(self, block): """ Can only write blocks containing a single segment. """ # in future, maybe separate segments by a blank link, or a "magic" comment if len(block.segments) > 1: raise ValueError( "Can only write blocks containing a single segment." f" This block contains {len(block.segments)} segments." ) self.write_segment(block.segments[0]) def write_metadata(self, metadata_filename=None): """ Write IO parameters to an associated JSON file """ # todo: also write annotations metadata = { "filename": self.filename, "delimiter": self.delimiter, "usecols": self.usecols, "skiprows": self.skiprows, "timecolumn": self.timecolumn, "sampling_rate": { "value": float(self.sampling_rate.magnitude), "units": self.sampling_rate.dimensionality.string, }, "t_start": {"value": float(self.t_start.magnitude), "units": self.t_start.dimensionality.string}, "units": self.units.dimensionality.string, "time_units": self.time_units.dimensionality.string, "method": self.method, "signal_group_mode": self.signal_group_mode, } if metadata_filename is None: if self.metadata_filename is None: self.metadata_filename = os.path.splitext(self.filename) + "_about.json" else: self.metadata_filename = metadata_filename with open(self.metadata_filename, "w") as fp: json.dump(metadata, fp) return self.metadata_filename ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/asciispiketrainio.py0000644000175100001660000000716714743453644017265 0ustar00runnerdocker""" Classe for reading/writing SpikeTrains in a text file. It is the simple case where different spiketrains are written line by line. Supported : Read/Write Author: sgarcia """ import os import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Segment, SpikeTrain, NeoReadWriteError class AsciiSpikeTrainIO(BaseIO): """ Class for reading/writing SpikeTrains in a text file. Each Spiketrain is a line. Usage: >>> from neo import io >>> r = io.AsciiSpikeTrainIO( filename = 'File_ascii_spiketrain_1.txt') >>> seg = r.read_segment() >>> print seg.spiketrains # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [>> import neo >>> r = neo.io.AxographIO(filename=filename) >>> blk = r.read_block(signal_group_mode='split-all') >>> display(blk) >>> # get signals >>> seg_index = 0 # episode number >>> sigs = [sig for sig in blk.segments[seg_index].analogsignals ... if sig.name in channel_names] >>> display(sigs) >>> # get event markers (same for all segments/episodes) >>> ev = blk.segments[0].events[0] >>> print([ev for ev in zip(ev.times, ev.labels)]) >>> # get interval bars (same for all segments/episodes) >>> ep = blk.segments[0].epochs[0] >>> print([ep for ep in zip(ep.times, ep.durations, ep.labels)]) >>> # get notes >>> print(blk.annotations['notes']) """ name = "AxographIO" description = "This IO reads .axgd/.axgx files created with AxoGraph" _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename="", force_single_segment=False): AxographRawIO.__init__(self, filename, force_single_segment) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/axonaio.py0000644000175100001660000000054114743453644015176 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.axonarawio import AxonaRawIO class AxonaIO(AxonaRawIO, BaseFromRaw): name = "Axona IO" description = "Read raw continuous data (.bin and .set files)" def __init__(self, filename): AxonaRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/axonio.py0000644000175100001660000000761414743453644015045 0ustar00runnerdockerimport quantities as pq from neo.io.basefromrawio import BaseFromRaw from neo.rawio.axonrawio import AxonRawIO from neo.core import Segment, AnalogSignal class AxonIO(AxonRawIO, BaseFromRaw): """ Class for reading data from pCLAMP and AxoScope files (.abf version 1 and 2), developed by Molecular device/Axon technologies. - abf = Axon binary file - atf is a text file based format from axon that could be read by AsciiIO (but this file is less efficient.) Here an important note from erikli@github for user who want to get the : With Axon ABF2 files, the information that you need to recapitulate the original stimulus waveform (both digital and analog) is contained in multiple places. - `AxonIO._axon_info['protocol']` -- things like number of samples in episode - `AxonIO.axon_info['section']['ADCSection']` | `AxonIO.axon_info['section']['DACSection']` -- things about the number of channels and channel properties - `AxonIO._axon_info['protocol']['nActiveDACChannel']` -- bitmask specifying which DACs are actually active - `AxonIO._axon_info['protocol']['nDigitalEnable']` -- bitmask specifying which set of Epoch timings should be used to specify the duration of digital outputs - `AxonIO._axon_info['dictEpochInfoPerDAC']` -- dict of dict. First index is DAC channel and second index is Epoch number (i.e. information about Epoch A in Channel 2 would be in `AxonIO._axon_info['dictEpochInfoPerDAC'][2][0]`) - `AxonIO._axon_info['EpochInfo']` -- list of dicts containing information about each Epoch's digital out pattern. Digital out is a bitmask with least significant bit corresponding to Digital Out 0 - `AxonIO._axon_info['listDACInfo']` -- information about DAC name, scale factor, holding level, etc - `AxonIO._t_starts` -- start time of each sweep in a unified time basis - `AxonIO._sampling_rate` The current AxonIO.read_protocol() method utilizes a subset of these. In particular I know it doesn't consider `nDigitalEnable`, `EpochInfo`, or `nActiveDACChannel` and it doesn't account for different types of Epochs offered by Clampex/pClamp other than discrete steps (such as ramp, pulse train, etc and encoded by `nEpochType` in the EpochInfoPerDAC section). I'm currently parsing a superset of the properties used by read_protocol() in my analysis scripts, but that code still doesn't parse the full information and isn't in a state where it could be committed and I can't currently prioritize putting together all the code that would parse the full set of data. The `AxonIO._axon_info['EpochInfo']` section doesn't currently exist. """ _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename): AxonRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) def read_protocol(self): """ Read the protocol waveform of the file, if present; function works with ABF2 only. Protocols can be reconstructed from the ABF1 header. Returns ------- segments : list of segments Segments, one for every episode, with list of analog signls (one for every DAC). """ sigs_by_segments, sig_names, sig_units = self.read_raw_protocol() segments = [] for seg_index, sigs in enumerate(sigs_by_segments): seg = Segment(index=seg_index) t_start = self._t_starts[seg_index] * pq.s for c, sig in enumerate(sigs): ana_sig = AnalogSignal( sig, sampling_rate=self._sampling_rate * pq.Hz, t_start=t_start, name=sig_names[c], units=sig_units[c], ) seg.analogsignals.append(ana_sig) segments.append(seg) return segments ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/basefromrawio.py0000644000175100001660000003422214743453644016403 0ustar00runnerdocker""" BaseFromRaw ====== BaseFromRaw implement a bridge between the new neo.rawio API and the neo.io legacy that give neo.core object. The neo.rawio API is more restricted and limited and does not cover tricky cases with asymetrical tree of neo object. But if a format is done in neo.rawio the neo.io is done for free by inheritance of this class. Furthermore, IOs that inherit this BaseFromRaw also have the ability to lazy load with proxy objects. """ import collections import warnings import numpy as np from neo import logging_handler from neo.core import AnalogSignal, Block, Epoch, Event, IrregularlySampledSignal, Group, Segment, SpikeTrain from neo.io.baseio import BaseIO from neo.io.proxyobjects import ( AnalogSignalProxy, SpikeTrainProxy, EventProxy, EpochProxy, ensure_signal_units, check_annotations, ensure_second, proxyobjectlist, ) import quantities as pq class BaseFromRaw(BaseIO): """ This implement generic reader on top of RawIO reader. Arguments depend on `mode` (dir or file) File case:: reader = BlackRockIO(filename='FileSpec2.3001.nev') Dir case:: reader = NeuralynxIO(dirname='Cheetah_v5.7.4/original_data') Other arguments are IO specific. """ is_readable = True is_writable = False supported_objects = [Block, Segment, AnalogSignal, SpikeTrain, Group, Event, Epoch] readable_objects = [Block, Segment] writeable_objects = [] support_lazy = True name = "BaseIO" description = "" extensions = [] mode = "file" _prefered_signal_group_mode = "group-by-same-units" # 'split-all' def __init__(self, *args, **kargs): BaseIO.__init__(self, *args, **kargs) self.parse_header() def read_block( self, block_index=0, lazy=False, create_group_across_segment=None, signal_group_mode=None, load_waveforms=False ): """ Reads one block of data from a file Parameters ---------- block_index: int, default: 0 In the case of multiple blocks, the block_index specifies which block to read lazy: bool, default: False Whether to read the block lazily (True) or load into memory (False) create_group_across_segment: bool | dict | None, default: None If True : * Create a neo.Group to group AnalogSignal segments * Create a neo.Group to group SpikeTrain across segments * Create a neo.Group to group Event across segments * Create a neo.Group to group Epoch across segments With a dict the behavior can be controlled more finely * for example: create_group_across_segment = { 'AnalogSignal': True, 'SpikeTrain': False, ...} signal_group_mode: 'split-all' | 'group-by-same-units' | None, default: None This control behavior for grouping channels in AnalogSignal. * 'split-all': each channel will be give an AnalogSignal * 'group-by-same-units' all channel sharing the same quantity units are grouped in a 2D AnalogSignal By default None since the default is dependant on the IO load_waveforms: bool, default: False Determines whether SpikeTrains.waveforms is created Returns ------- bl: neo.core.Block The block of data """ if signal_group_mode is None: signal_group_mode = self._prefered_signal_group_mode l = ["AnalogSignal", "SpikeTrain", "Event", "Epoch"] if create_group_across_segment is None: # @andrew @ julia @michael ? # I think here the default None could give this create_group_across_segment = { "AnalogSignal": True, # because mimic the old ChannelIndex for AnalogSignals "SpikeTrain": False, # False by default because can create too many object for simulation "Event": False, # not implemented yet "Epoch": False, # not implemented yet } elif isinstance(create_group_across_segment, bool): # bool to dict v = create_group_across_segment create_group_across_segment = {k: v for k in l} elif isinstance(create_group_across_segment, dict): # put False to missing keys create_group_across_segment = {k: create_group_across_segment.get(k, False) for k in l} else: raise ValueError("create_group_across_segment must be bool or dict") # annotations bl_annotations = dict(self.raw_annotations["blocks"][block_index]) bl_annotations.pop("segments") bl_annotations = check_annotations(bl_annotations) bl = Block(**bl_annotations) # Group for AnalogSignals coming from signal_streams if create_group_across_segment["AnalogSignal"]: signal_streams = self.header["signal_streams"] sub_streams = self.get_sub_signal_streams(signal_group_mode) sub_stream_groups = [] for sub_stream in sub_streams: stream_index, inner_stream_channels, name = sub_stream group = Group(name=name, stream_id=signal_streams[stream_index]["id"]) bl.groups.append(group) sub_stream_groups.append(group) if create_group_across_segment["SpikeTrain"]: spike_channels = self.header["spike_channels"] st_groups = [] for c in range(spike_channels.size): group = Group(name=f"SpikeTrain group {c}") group.annotate(unit_name=spike_channels[c]["name"]) group.annotate(unit_id=spike_channels[c]["id"]) bl.groups.append(group) st_groups.append(group) if create_group_across_segment["Event"]: # @andrew @ julia @michael : # Do we need this ? I guess yes raise NotImplementedError() if create_group_across_segment["Epoch"]: # @andrew @ julia @michael : # Do we need this ? I guess yes raise NotImplementedError() # Read all segments for seg_index in range(self.segment_count(block_index)): seg = self.read_segment( block_index=block_index, seg_index=seg_index, lazy=lazy, signal_group_mode=signal_group_mode, load_waveforms=load_waveforms, ) bl.segments.append(seg) # create link between group (across segment) and data objects for seg in bl.segments: if create_group_across_segment["AnalogSignal"]: for c, anasig in enumerate(seg.analogsignals): sub_stream_groups[c].add(anasig) if create_group_across_segment["SpikeTrain"]: for c, sptr in enumerate(seg.spiketrains): st_groups[c].add(sptr) bl.check_relationships() return bl def read_segment( self, block_index=0, seg_index=0, lazy=False, signal_group_mode=None, load_waveforms=False, time_slice=None, strict_slicing=True, ): """ Reads one segment of the data file Parameters ---------- block_index: int, default: 0 In the case of a multiblock dataset, this specifies which block to read seg_index: int, default: 0 In the case of a multisegment block, this specifies which segmeent to read lazy: bool, default: False Whether to lazily load the segment (True) or to load the segment into memory (False) signal_group_mode: 'split-all' | 'group-by-same-units' | None, default: None This control behavior for grouping channels in AnalogSignal. * 'split-all': each channel will be give an AnalogSignal * 'group-by-same-units' all channel sharing the same quantity units are grouped in a 2D AnalogSignal load_waveforms: bool, default: False Determines whether SpikeTrains.waveforms is created time_slice: tuple[quantity.Quantities | None] | None, default: None Whether to take a time slice of the data * None: indicates from beginning of the segment to the end of the segment * tuple: (t_start, t_stop) with t_start and t_stop being quantities in seconds * tuple: (None, t_stop) indicates the beginning of the segment to t_stop * tuple: (t_start, None) indicates from t_start to the end of the segment strict_slicing: bool, default: True Control if an error is raised or not when t_start or t_stop is outside of the real time range of the segment. Returns ------- seg: neo.core.Segment Returns the desired segment based on the parameters given """ if lazy: if time_slice is not None: raise ValueError("For lazy=True you must specify a time_slice when LazyObject.load(time_slice=...)") if load_waveforms: raise ValueError( "For lazy=True you must specify load_waveforms when SpikeTrain.load(load_waveforms=...)" ) if signal_group_mode is None: signal_group_mode = self._prefered_signal_group_mode # annotations seg_annotations = self.raw_annotations["blocks"][block_index]["segments"][seg_index].copy() for k in ("signals", "spikes", "events"): seg_annotations.pop(k) seg_annotations = check_annotations(seg_annotations) seg = Segment(index=seg_index, **seg_annotations) # AnalogSignal signal_streams = self.header["signal_streams"] sub_streams = self.get_sub_signal_streams(signal_group_mode) for sub_stream in sub_streams: stream_index, inner_stream_channels, name = sub_stream anasig = AnalogSignalProxy( rawio=self, stream_index=stream_index, inner_stream_channels=inner_stream_channels, block_index=block_index, seg_index=seg_index, ) anasig.name = name if not lazy: # ... and get the real AnalogSignal if not lazy anasig = anasig.load(time_slice=time_slice, strict_slicing=strict_slicing) seg.analogsignals.append(anasig) # SpikeTrain and waveforms (optional) spike_channels = self.header["spike_channels"] for spike_channel_index in range(len(spike_channels)): # make a proxy... sptr = SpikeTrainProxy( rawio=self, spike_channel_index=spike_channel_index, block_index=block_index, seg_index=seg_index ) if not lazy: # ... and get the real SpikeTrain if not lazy sptr = sptr.load(time_slice=time_slice, strict_slicing=strict_slicing, load_waveforms=load_waveforms) # TODO magnitude_mode='rescaled'/'raw' seg.spiketrains.append(sptr) # Events/Epoch event_channels = self.header["event_channels"] for chan_ind in range(len(event_channels)): if event_channels["type"][chan_ind] == b"event": e = EventProxy(rawio=self, event_channel_index=chan_ind, block_index=block_index, seg_index=seg_index) if not lazy: e = e.load(time_slice=time_slice, strict_slicing=strict_slicing) seg.events.append(e) elif event_channels["type"][chan_ind] == b"epoch": e = EpochProxy(rawio=self, event_channel_index=chan_ind, block_index=block_index, seg_index=seg_index) if not lazy: e = e.load(time_slice=time_slice, strict_slicing=strict_slicing) seg.epochs.append(e) seg.check_relationships() return seg def get_sub_signal_streams(self, signal_group_mode="group-by-same-units"): """ When signal streams don't have homogeneous SI units across channels, they have to be split in sub streams to construct AnalogSignal objects with unique units. For backward compatibility (neo version <= 0.5) sub-streams can also be used to generate one AnalogSignal per channel. """ signal_streams = self.header["signal_streams"] signal_channels = self.header["signal_channels"] sub_streams = [] for stream_index in range(len(signal_streams)): stream_id = signal_streams[stream_index]["id"] stream_name = signal_streams[stream_index]["name"] mask = signal_channels["stream_id"] == stream_id channels = signal_channels[mask] if signal_group_mode == "group-by-same-units": # this does not keep the original order _, idx = np.unique(channels["units"], return_index=True) all_units = channels["units"][np.sort(idx)] if len(all_units) == 1: # no substream # None iwill be transform as slice later inner_stream_channels = None name = stream_name sub_stream = (stream_index, inner_stream_channels, name) sub_streams.append(sub_stream) else: for units in all_units: (inner_stream_channels,) = np.nonzero(channels["units"] == units) chan_names = channels[inner_stream_channels]["name"] name = "Channels: (" + " ".join(chan_names) + ")" sub_stream = (stream_index, inner_stream_channels, name) sub_streams.append(sub_stream) elif signal_group_mode == "split-all": # mimic all neo <= 0.5 behavior for i, channel in enumerate(channels): inner_stream_channels = [i] name = channels[i]["name"] sub_stream = (stream_index, inner_stream_channels, name) sub_streams.append(sub_stream) else: raise (NotImplementedError) return sub_streams ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/baseio.py0000644000175100001660000002426514743453644015013 0ustar00runnerdocker""" baseio ====== Classes ------- BaseIO - abstract class which should be overridden, managing how a file will load/write its data If you want a model for developing a new IO start from exampleIO. """ from __future__ import annotations from pathlib import Path try: from collections.abc import Sequence except ImportError: from collections import Sequence import logging from neo import logging_handler from neo.core import ( AnalogSignal, Block, Epoch, Event, Group, IrregularlySampledSignal, ChannelView, Segment, SpikeTrain, ImageSequence, RectangularRegionOfInterest, CircularRegionOfInterest, PolygonRegionOfInterest, NeoReadWriteError, ) read_error = "This type is not supported by this file format for reading" write_error = "This type is not supported by this file format for writing" class BaseIO: """ Generic class to handle all the file read/write methods for the key objects of the core class. This template is file-reading/writing oriented but it can also handle data read from/written to a database such as TDT sytem tanks or SQLite files. This is an abstract class that will be subclassed for each format The key methods of the class are: - ``read()`` - Read the whole object structure, return a list of Block objects - ``read_block(lazy=True, **params)`` - Read Block object from file with some parameters - ``read_segment(lazy=True, **params)`` - Read Segment object from file with some parameters - ``read_spiketrainlist(lazy=True, **params)`` - Read SpikeTrainList object from file with some parameters - ``write()`` - Write the whole object structure - ``write_block(**params)`` - Write Block object to file with some parameters - ``write_segment(**params)`` - Write Segment object to file with some parameters - ``write_spiketrainlist(**params)`` - Write SpikeTrainList object to file with some parameters The class can also implement these methods: - ``read_XXX(lazy=True, **params)`` - ``write_XXX(**params)`` where XXX could be one of the objects supported by the IO Each class is able to declare what can be accessed or written directly discribed by **readable_objects** and **readable_objects**. The object types can be one of the classes defined in neo.core (Block, Segment, AnalogSignal, ...) Each class does not necessary support all the whole neo hierarchy but part of it. This is described with **supported_objects**. All IOs must support at least Block with a read_block() ** start a new IO ** If you want to implement your own file format, you should create a class that will inherit from this BaseFile class and implement the previous methods. See ExampleIO in exampleio.py """ is_readable = False is_writable = False supported_objects = [] readable_objects = [] writeable_objects = [] support_lazy = False read_params = {} write_params = {} name = "BaseIO" description = "" extensions = [] mode = "file" # or 'fake' or 'dir' or 'database' def __init__(self, filename: str | Path = None, **kargs): self.filename = str(filename) # create a logger for the IO class fullname = self.__class__.__module__ + "." + self.__class__.__name__ self.logger = logging.getLogger(fullname) # create a logger for 'neo' and add a handler to it if it doesn't # have one already. # (it will also not add one if the root logger has a handler) corename = self.__class__.__module__.split(".")[0] corelogger = logging.getLogger(corename) rootlogger = logging.getLogger() if not corelogger.handlers and not rootlogger.handlers: corelogger.addHandler(logging_handler) ######## General read/write methods ####################### def read(self, lazy: bool = False, **kargs): """ Return all data from the file as a list of Blocks Parameters ---------- lazy: bool, default: False Whether to lazily load the data (True) or to load into memory (False) kargs: dict IO specific additional arguments Returns ------ block_list: list[neo.core.Block] Returns all the data from the file as Blocks """ if lazy and not self.support_lazy: raise NeoReadWriteError("This IO module does not support lazy loading") if Block in self.readable_objects: if hasattr(self, "read_all_blocks") and callable(getattr(self, "read_all_blocks")): return self.read_all_blocks(lazy=lazy, **kargs) return [self.read_block(lazy=lazy, **kargs)] elif Segment in self.readable_objects: bl = Block(name="One segment only") seg = self.read_segment(lazy=lazy, **kargs) bl.segments.append(seg) bl.check_relationships() return [bl] else: raise NotImplementedError def write(self, bl, **kargs): """ Writes a given block if IO supports writing Parameters ---------- bl: neo.core.Block The neo Block to be written kargs: dict IO specific additional arguments """ if Block in self.writeable_objects: if isinstance(bl, Sequence): if not hasattr(self, "write_all_blocks"): raise NeoReadWriteError(f"{self.__class__.__name__} does not offer to store a sequence of blocks") self.write_all_blocks(bl, **kargs) else: self.write_block(bl, **kargs) elif Segment in self.writeable_objects: if len(bl.segments) != 1: raise NeoReadWriteError( f"{self.__class__.__name__} is based on segment so if you try to write a block it " + "must contain only one Segment" ) self.write_segment(bl.segments[0], **kargs) else: raise NotImplementedError ######## All individual read methods ####################### def read_block(self, **kargs): if Block not in self.readable_objects: raise NeoReadWriteError(read_error) def read_segment(self, **kargs): if Segment not in self.readable_objects: raise NeoReadWriteError(read_error) def read_spiketrain(self, **kargs): if SpikeTrain not in self.readable_objects: raise NeoReadWriteError(read_error) def read_analogsignal(self, **kargs): if AnalogSignal not in self.readable_objects: raise NeoReadWriteError(read_error) def read_imagesequence(self, **kargs): if ImageSequence not in self.readable_objects: raise NeoReadWriteError(read_error) def read_rectangularregionofinterest(self, **kargs): if RectangularRegionOfInterest not in self.readable_objects: raise NeoReadWriteError(read_error) def read_circularregionofinterest(self, **kargs): if CircularRegionOfInterest not in self.readable_objects: raise NeoReadWriteError(read_error) def read_polygonregionofinterest(self, **kargs): if PolygonRegionOfInterest not in self.readable_objects: raise NeoReadWriteError(read_error) def read_irregularlysampledsignal(self, **kargs): if IrregularlySampledSignal not in self.readable_objects: raise NeoReadWriteError(read_error) def read_channelview(self, **kargs): if ChannelView not in self.readable_objects: raise NeoReadWriteError(read_error) def read_event(self, **kargs): if Event not in self.readable_objects: raise NeoReadWriteError(read_error) def read_epoch(self, **kargs): if Epoch not in self.readable_objects: raise NeoReadWriteError(read_error) def read_group(self, **kargs): if Group not in self.readable_objects: raise NeoReadWriteError(read_error) ######## All individual write methods ####################### def write_block(self, bl, **kargs): if Block not in self.writeable_objects: raise NeoReadWriteError(write_error) def write_segment(self, seg, **kargs): if Segment not in self.writeable_objects: raise NeoReadWriteError(write_error) def write_spiketrain(self, sptr, **kargs): if SpikeTrain not in self.writeable_objects: raise NeoReadWriteError(write_error) def write_analogsignal(self, anasig, **kargs): if AnalogSignal not in self.writeable_objects: raise NeoReadWriteError(write_error) def write_imagesequence(self, imseq, **kargs): if ImageSequence not in self.writeable_objects: raise NeoReadWriteError(write_error) def write_rectangularregionofinterest(self, rectroi, **kargs): if RectangularRegionOfInterest not in self.writeable_objects: raise NeoReadWriteError(write_error) def write_circularregionofinterest(self, circroi, **kargs): if CircularRegionOfInterest not in self.writeable_objects: raise NeoReadWriteError(write_error) def write_polygonregionofinterest(self, polyroi, **kargs): if PolygonRegionOfInterest not in self.writeable_objects: raise NeoReadWriteError(write_error) def write_irregularlysampledsignal(self, irsig, **kargs): if IrregularlySampledSignal not in self.writeable_objects: raise NeoReadWriteError(write_error) def write_channelview(self, chv, **kargs): if ChannelView not in self.writeable_objects: raise NeoReadWriteError(write_error) def write_event(self, ev, **kargs): if Event not in self.writeable_objects: raise NeoReadWriteError(write_error) def write_epoch(self, ep, **kargs): if Epoch not in self.writeable_objects: raise NeoReadWriteError(write_error) def write_group(self, group, **kargs): if Group not in self.writeable_objects: raise NeoReadWriteError(write_error) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/bci2000io.py0000644000175100001660000000064014743453644015127 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.bci2000rawio import BCI2000RawIO class BCI2000IO(BCI2000RawIO, BaseFromRaw): """Class for reading data from a BCI2000 .dat file, either version 1.0 or 1.1""" _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename): BCI2000RawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/biocamio.py0000644000175100001660000000050114743453644015316 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.biocamrawio import BiocamRawIO class BiocamIO(BiocamRawIO, BaseFromRaw): __doc__ = BiocamRawIO.__doc__ mode = "file" def __init__(self, filename): BiocamRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/blackrockio.py0000644000175100001660000000120314743453644016017 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.blackrockrawio import BlackrockRawIO class BlackrockIO(BlackrockRawIO, BaseFromRaw): """ Supplementary class for reading BlackRock data using only a single nsx file. """ name = "Blackrock IO for single nsx" description = ( "This IO reads a pair of corresponding nev and nsX files of the Blackrock " "" + "(Cerebus) recording system." ) _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename, **kargs): BlackrockRawIO.__init__(self, filename=filename, **kargs) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/blkio.py0000644000175100001660000003207214743453644014644 0ustar00runnerdockerimport struct import os import math import numpy as np from .baseio import BaseIO from neo.core import ImageSequence, Segment, Block class BlkIO(BaseIO): """ Neo IO module for optical imaging data stored as BLK file *Usage*: >>> from neo import io >>> import quantities as pq >>> r = io.BlkIO("file_blk_1.BLK",units='V',sampling_rate=1.0*pq.Hz, ... spatial_scale=1.0*pq.Hz) >>> block = r.read_block() reading the header reading block returning block >>> block Block with 6 segments file_origin: 'file_blk_1.BLK' # segments (N=6) 0: Segment with 1 imagesequences description: 'stim nb:0' # analogsignals (N=0) 1: Segment with 1 imagesequences description: 'stim nb:1' # analogsignals (N=0) 2: Segment with 1 imagesequences description: 'stim nb:2' # analogsignals (N=0) 3: Segment with 1 imagesequences description: 'stim nb:3' # analogsignals (N=0) 4: Segment with 1 imagesequences description: 'stim nb:4' # analogsignals (N=0) 5: Segment with 1 imagesequences description: 'stim nb:5' # analogsignals (N=0) Many thanks to Thomas Deneux for the MATLAB code on which this was based. """ name = "BLK IO" description = "Neo IO module for optical imaging data stored as BLK file" _prefered_signal_goup_mode = "group-by-same-units" is_readable = True is_wirtable = False supported_objects = [Block, Segment, ImageSequence] readble_objects = supported_objects support_lazy = False read_params = {} write_params = {} extensions = [] mode = "file" def __init__(self, file_name=None, units=None, sampling_rate=None, spatial_scale=None, **kwargs): BaseIO.__init__(self, file_name, **kwargs) self.units = units self.sampling_rate = sampling_rate self.spatial_scale = spatial_scale def read(self, lazy=False, **kwargs): """ Return all data from the file as a list of Blocks """ if lazy: raise ValueError("This IO module does not support lazy loading") return [ self.read_block( lazy=lazy, units=self.units, sampling_rate=self.sampling_rate, spatial_scale=self.spatial_scale, **kwargs, ) ] def read_block(self, lazy=False, **kargs): def read(name, type, nb, dictionary, file): if type == "int32": # dictionary[name] = int.from_bytes(file.read(4), byteorder=sys.byteorder, signed=True) dictionary[name] = struct.unpack("i", file.read(4))[0] if type == "float32": dictionary[name] = struct.unpack("f", file.read(4))[0] if type == "uint8": l = [] for i in range(nb): l.append(chr(struct.unpack("B", file.read(1))[0])) dictionary[name] = l if type == "uint16": l = [] for i in range(nb): l.append((struct.unpack("H", file.read(2)))[0]) dictionary[name] = l if type == "short": dictionary[name] = struct.unpack("h", file.read(2))[0] return dictionary def read_header(file_name): file = open(file_name, "rb") i = [ ["file_size", "int32", 1], ["checksum_header", "int32", 1], ["check_data", "int32", 1], ["lenheader", "int32", 1], ["versionid", "float32", 1], ["filetype", "int32", 1], ["filesubtype", "int32", 1], ["datatype", "int32", 1], ["sizeof", "int32", 1], ["framewidth", "int32", 1], ["frameheight", "int32", 1], ["nframesperstim", "int32", 1], ["nstimuli", "int32", 1], ["initialxbinfactor", "int32", 1], ["initialybinfactor", "int32", 1], ["xbinfactor", "int32", 1], ["ybinfactor", "int32", 1], ["username", "uint8", 32], ["recordingdate", "uint8", 16], ["x1roi", "int32", 1], ["y1roi", "int32", 1], ["x2roi", "int32", 1], ["y2roi", "int32", 1], ["stimoffs", "int32", 1], ["stimsize", "int32", 1], ["frameoffs", "int32", 1], ["framesize", "int32", 1], ["refoffs", "int32", 1], ["refsize", "int32", 1], ["refwidth", "int32", 1], ["refheight", "int32", 1], ["whichblocks", "uint16", 16], ["whichframe", "uint16", 16], ["loclip", "int32", 1], ["hiclip", "int32", 1], ["lopass", "int32", 1], ["hipass", "int32", 1], ["operationsperformed", "uint8", 64], ["magnification", "float32", 1], ["gain", "uint16", 1], ["wavelength", "uint16", 1], ["exposuretime", "int32", 1], ["nrepetitions", "int32", 1], ["acquisitiondelay", "int32", 1], ["interstiminterval", "int32", 1], ["creationdate", "uint8", 16], ["datafilename", "uint8", 64], ["orareserved", "uint8", 256], ] dic = {} for x in i: dic = read(name=x[0], type=x[1], nb=x[2], dictionary=dic, file=file) if dic["filesubtype"] == 13: i = [ ["includesrefframe", "int32", 1], ["temp", "uint8", 128], ["ntrials", "int32", 1], ["scalefactors", "int32", 1], ["cameragain", "short", 1], ["ampgain", "short", 1], ["samplingrate", "short", 1], ["average", "short", 1], ["exposuretime", "short", 1], ["samplingaverage", "short", 1], ["presentaverage", "short", 1], ["framesperstim", "short", 1], ["trialsperblock", "short", 1], ["sizeofanalogbufferinframes", "short", 1], ["cameratrials", "short", 1], ["filler", "uint8", 106], ["dyedaqreserved", "uint8", 106], ] for x in i: dic = read(name=x[0], type=x[1], nb=x[2], dictionary=dic, file=file) # nottested # p.listofstimuli=temp(1:max(find(temp~=0)))'; % up to first non-zero stimulus dic["listofstimuli"] = dic["temp"][0 : np.argwhere(x != 0).max(0)] else: i = [ ["includesrefframe", "int32", 1], ["listofstimuli", "uint8", 256], ["nvideoframesperdataframe", "int32", 1], ["ntrials", "int32", 1], ["scalefactor", "int32", 1], ["meanampgain", "float32", 1], ["meanampdc", "float32", 1], ["vdaqreserved", "uint8", 256], ] for x in i: dic = read(name=x[0], type=x[1], nb=x[2], dictionary=dic, file=file) i = [["user", "uint8", 256], ["comment", "uint8", 256], ["refscalefactor", "int32", 1]] for x in i: dic = read(name=x[0], type=x[1], nb=x[2], dictionary=dic, file=file) dic["actuallength"] = os.stat(file_name).st_size file.close() return dic # start of the reading process nblocks = 1 print("reading the header") header = read_header(self.filename) nstim = header["nstimuli"] ni = header["framewidth"] nj = header["frameheight"] nfr = header["nframesperstim"] lenh = header["lenheader"] framesize = header["framesize"] filesize = header["file_size"] dtype = header["datatype"] gain = header["meanampgain"] dc = header["meanampdc"] scalefactor = header["scalefactor"] # [["dtype","nbytes","datatype","type_out"],[...]] l = [ [11, 1, "uchar", "uint8", "B"], [12, 2, "ushort", "uint16", "H"], [13, 4, "ulong", "uint32", "I"], [14, 4, "float", "single", "f"], ] for i in l: if dtype == i[0]: nbytes, datatype, type_out, struct_type = i[1], i[2], i[3], i[4] if framesize != ni * nj * nbytes: print("BAD HEADER!!! framesize does not match framewidth*frameheight*nbytes!") framesize = ni * nj * nbytes if (filesize - lenh) > (framesize * nfr * nstim): nfr2 = nfr + 1 includesrefframe = True else: nfr2 = nfr includesrefframe = False nbin = nblocks conds = [i for i in range(1, nstim + 1)] ncond = len(conds) data = [[[np.zeros((ni, nj, nfr), type_out)] for x in range(ncond)] for i in range(nbin)] for k in range(1, nbin + 1): print("reading block") bin = np.arange(math.floor((k - 1 / nbin * nblocks) + 1), math.floor((k / nbin * nblocks) + 1)) sbin = bin.size for j in range(1, sbin + 1): file = open(self.filename, "rb") for i in range(1, ncond + 1): framestart = conds[i - 1] * nfr2 - nfr offset = framestart * ni * nj * nbytes + lenh file.seek(offset, 0) a = [(struct.unpack(struct_type, file.read(nbytes)))[0] for m in range(ni * nj * nfr)] a = np.reshape(np.array(a, dtype=type_out, order="F"), (ni * nj, nfr), order="F") a = np.reshape(a, (ni, nj, nfr), order="F") if includesrefframe: # not tested framestart = (conds[i] - 1) * nfr2 offset = framestart * ni * nj * nbytes + lenh file.seek(offset) ref = [(struct.unpack(struct_type, file.read(nbytes)))[0] for m in range(ni * nj)] ref = np.array(ref, dtype=type_out) for y in range(len(ref)): ref[y] *= scalefactor ref = np.reshape(ref, (ni, nj)) b = np.tile(ref, [1, 1, nfr]) for y in range(len(a)): b.append([]) for x in range(len(a[y])): b[y + 1].append([]) for frame in range(len(a[y][x])): b[y + 1][x][frame] = (a[y][x][frame] / gain) - (scalefactor * dc / gain) a = b if sbin == 1: data[k - 1][i - 1] = a else: # not tested for y in range(len(a)): for x in range(len(a[y])): a[y][x] /= sbin data[k - 1][i - 1] = data[k - 1][i - 1] + a / sbin file.close() # data format [block][stim][width][height][frame]] # data structure should be [block][stim][frame][width][height] in order to be easy to use with neo # each file is a block # each stim could be a segment # then an image sequence [frame][width][height] # image need to be rotated # changing order of data for compatibility # [block][stim][width][height][frame]] # to # [block][stim][frame][width][height] for block in range(len(data)): for stim in range(len(data[block])): a = [] for frame in range(header["nframesperstim"]): a.append([]) for width in range(len(data[block][stim])): a[frame].append([]) for height in range(len(data[block][stim][width])): a[frame][width].append(data[block][stim][width][height][frame]) # rotation of data to be the same as thomas deneux screenshot a[frame] = np.rot90(np.fliplr(a[frame])) data[block][stim] = a block = Block(file_origin=self.filename) for stim in range(len(data[0])): image_sequence = ImageSequence( data[0][stim], units=self.units, sampling_rate=self.sampling_rate, spatial_scale=self.spatial_scale ) segment = Segment(file_origin=self.filename, description=("stim nb:" + str(stim))) segment.imagesequences = [image_sequence] for key in header: block.annotations[key] = header[key] block.segments.append(segment) print("returning block") return block ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/brainvisionio.py0000644000175100001660000000063614743453644016420 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.brainvisionrawio import BrainVisionRawIO class BrainVisionIO(BrainVisionRawIO, BaseFromRaw): """Class for reading data from the BrainVision product.""" _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename): BrainVisionRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/brainwaredamio.py0000644000175100001660000001731414743453644016532 0ustar00runnerdocker""" Class for reading from Brainware DAM files DAM files are binary files for holding raw data. They are broken up into sequence of Segments, each containing a single raw trace and parameters. The DAM file does NOT contain a sampling rate, nor can it be reliably calculated from any of the parameters. You can calculate it from the "sweep length" attribute if it is present, but it isn't always present. It is more reliable to get it from the corresponding SRC file or F32 file if you have one. The DAM file also does not divide up data into Blocks, so only a single Block is returned.. Brainware was developed by Dr. Jan Schnupp and is availabe from Tucker Davis Technologies, Inc. http://www.tdt.com/downloads.htm Neither Dr. Jan Schnupp nor Tucker Davis Technologies, Inc. had any part in the development of this code The code is implemented with the permission of Dr. Jan Schnupp Author: Todd Jennings """ # import needed core python modules import os import os.path # numpy and quantities are already required by neo import numpy as np import quantities as pq # needed core neo modules from neo.core import AnalogSignal, Block, Group, Segment # need to subclass BaseIO from neo.io.baseio import BaseIO class BrainwareDamIO(BaseIO): """ Class for reading Brainware raw data files with the extension '.dam'. The read_block method returns the first Block of the file. It will automatically close the file after reading. The read method is the same as read_block. Note: The file format does not contain a sampling rate. The sampling rate is set to 1 Hz, but this is arbitrary. If you have a corresponding .src or .f32 file, you can get the sampling rate from that. It may also be possible to infer it from the attributes, such as "sweep length", if present. Usage: >>> from neo.io.brainwaredamio import BrainwareDamIO >>> damfile = BrainwareDamIO(filename='multi_500ms_mulitrep_ch1.dam') >>> blk1 = damfile.read() >>> blk2 = damfile.read_block() >>> print blk1.segments >>> print blk1.segments[0].analogsignals >>> print blk1.units >>> print blk1.units[0].name >>> print blk2 >>> print blk2[0].segments """ is_readable = True # This class can only read data is_writable = False # write is not supported # This class is able to directly or indirectly handle the following objects # You can notice that this greatly simplifies the full Neo object hierarchy supported_objects = [Block, Group, Segment, AnalogSignal] readable_objects = [Block] writeable_objects = [] has_header = False is_streameable = False # This is for GUI stuff: a definition for parameters when reading. # This dict should be keyed by object (`Block`). Each entry is a list # of tuple. The first entry in each tuple is the parameter name. The # second entry is a dict with keys 'value' (for default value), # and 'label' (for a descriptive name). # Note that if the highest-level object requires parameters, # common_io_test will be skipped. read_params = {Block: []} # do not support write so no GUI stuff write_params = None name = "Brainware DAM File" extensions = ["dam"] mode = "file" def __init__(self, filename=None): """ Arguments: filename: the filename """ BaseIO.__init__(self) self._path = filename self._filename = os.path.basename(filename) self._fsrc = None def read_block(self, lazy=False, **kargs): """ Reads a block from the raw data file "fname" generated with BrainWare """ assert not lazy, "Do not support lazy" # there are no keyargs implemented to so far. If someone tries to pass # them they are expecting them to do something or making a mistake, # neither of which should pass silently if kargs: raise NotImplementedError("This method does not have any " "arguments implemented yet") self._fsrc = None block = Block(file_origin=self._filename) # create the objects to store other objects gr = Group(file_origin=self._filename) # load objects into their containers block.groups.append(gr) # open the file with open(self._path, "rb") as fobject: # while the file is not done keep reading segments while True: seg = self._read_segment(fobject) # if there are no more Segments, stop if not seg: break # store the segment and signals block.segments.append(seg) gr.analogsignals.append(seg.analogsignals[0]) # remove the file object self._fsrc = None block.check_relationships() return block # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- # IMPORTANT!!! # These are private methods implementing the internal reading mechanism. # Due to the way BrainWare DAM files are structured, they CANNOT be used # on their own. Calling these manually will almost certainly alter your # position in the file in an unrecoverable manner, whether they throw # an exception or not. # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- def _read_segment(self, fobject): """ Read a single segment with a single analogsignal Returns the segment or None if there are no more segments """ try: # float64 -- start time of the AnalogSignal t_start = np.fromfile(fobject, dtype=np.float64, count=1)[0] except IndexError: # if there are no more Segments, return return False # int16 -- index of the stimulus parameters seg_index = np.fromfile(fobject, dtype=np.int16, count=1)[0].tolist() # int16 -- number of stimulus parameters numelements = np.fromfile(fobject, dtype=np.int16, count=1)[0] # read the name strings for the stimulus parameters paramnames = [] for _ in range(numelements): # unit8 -- the number of characters in the string numchars = np.fromfile(fobject, dtype=np.uint8, count=1)[0] # char * numchars -- a single name string name = np.fromfile(fobject, dtype=np.uint8, count=numchars) # exclude invalid characters name = str(name[name >= 32].view("c").tobytes()) # add the name to the list of names paramnames.append(name) # float32 * numelements -- the values for the stimulus parameters paramvalues = np.fromfile(fobject, dtype=np.float32, count=numelements) # combine parameter names and the parameters as a dict params = dict(zip(paramnames, paramvalues)) # int32 -- the number elements in the AnalogSignal numpts = np.fromfile(fobject, dtype=np.int32, count=1)[0] # int16 * numpts -- the AnalogSignal itself signal = np.fromfile(fobject, dtype=np.int16, count=numpts) sig = AnalogSignal( signal.astype(np.float32) * pq.mV, t_start=t_start * pq.d, file_origin=self._filename, sampling_period=1.0 * pq.s, copy=None, ) # Note: setting the sampling_period to 1 s is arbitrary # load the AnalogSignal and parameters into a new Segment seg = Segment(file_origin=self._filename, index=seg_index, **params) seg.analogsignals = [sig] return seg ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/brainwaref32io.py0000644000175100001660000002176614743453644016371 0ustar00runnerdocker""" Class for reading from Brainware F32 files F32 files are simplified binary files for holding spike data. Unlike SRC files, F32 files carry little metadata. This also means, however, that the file format does not change, unlike SRC files whose format changes periodically (although ideally SRC files are backwards-compatible). Each F32 file only holds a single Block. The only metadata stored in the file is the length of a single repetition of the stimulus and the values of the stimulus parameters (but not the names of the parameters). Brainware was developed by Dr. Jan Schnupp and is availabe from Tucker Davis Technologies, Inc. http://www.tdt.com/downloads.htm Neither Dr. Jan Schnupp nor Tucker Davis Technologies, Inc. had any part in the development of this code The code is implemented with the permission of Dr. Jan Schnupp Author: Todd Jennings """ # import needed core python modules from os import path # numpy and quantities are already required by neo import numpy as np import quantities as pq # needed core neo modules from neo.core import Block, Group, Segment, SpikeTrain, NeoReadWriteError # need to subclass BaseIO from neo.io.baseio import BaseIO class BrainwareF32IO(BaseIO): """ Class for reading Brainware Spike ReCord files with the extension '.f32' The read_block method returns the first Block of the file. It will automatically close the file after reading. The read method is the same as read_block. The read_all_blocks method automatically reads all Blocks. It will automatically close the file after reading. The read_next_block method will return one Block each time it is called. It will automatically close the file and reset to the first Block after reading the last block. Call the close method to close the file and reset this method back to the first Block. The isopen property tells whether the file is currently open and reading or closed. Note 1: There is always only one Group. Usage: >>> from neo.io.brainwaref32io import BrainwareF32IO >>> f32file = BrainwareF32IO(filename='multi_500ms_mulitrep_ch1.f32') >>> blk1 = f32file.read() >>> blk2 = f32file.read_block() >>> print blk1.segments >>> print blk1.segments[0].spiketrains >>> print blk1.units >>> print blk1.units[0].name >>> print blk2 >>> print blk2[0].segments """ is_readable = True # This class can only read data is_writable = False # write is not supported # This class is able to directly or indirectly handle the following objects # You can notice that this greatly simplifies the full Neo object hierarchy supported_objects = [Block, Group, Segment, SpikeTrain] readable_objects = [Block] writeable_objects = [] has_header = False is_streameable = False # This is for GUI stuff: a definition for parameters when reading. # This dict should be keyed by object (`Block`). Each entry is a list # of tuple. The first entry in each tuple is the parameter name. The # second entry is a dict with keys 'value' (for default value), # and 'label' (for a descriptive name). # Note that if the highest-level object requires parameters, # common_io_test will be skipped. read_params = {Block: []} # does not support write so no GUI stuff write_params = None name = "Brainware F32 File" extensions = ["f32"] mode = "file" def __init__(self, filename=None): """ Arguments: filename: the filename """ BaseIO.__init__(self) self._path = filename self._filename = path.basename(filename) self._fsrc = None self._blk = None self.__unit_group = None self.__t_stop = None self.__params = None self.__seg = None self.__spiketimes = None def read_block(self, lazy=False, **kargs): """ Reads a block from the simple spike data file "fname" generated with BrainWare """ if lazy: raise NeoReadWriteError("This IO does not support lazy reading") # there are no keyargs implemented to so far. If someone tries to pass # them they are expecting them to do something or making a mistake, # neither of which should pass silently if kargs: raise NotImplementedError("This method does not have any " "argument implemented yet") self._fsrc = None self._blk = Block(file_origin=self._filename) block = self._blk # create the objects to store other objects self.__unit_group = Group(file_origin=self._filename) block.groups.append(self.__unit_group) # initialize values self.__t_stop = None self.__params = None self.__seg = None self.__spiketimes = None # open the file with open(self._path, "rb") as self._fsrc: res = True # while the file is not done keep reading segments while res: res = self.__read_id() block.check_relationships() # cleanup attributes self._fsrc = None self._blk = None self.__t_stop = None self.__params = None self.__seg = None self.__spiketimes = None return block # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- # IMPORTANT!!! # These are private methods implementing the internal reading mechanism. # Due to the way BrainWare DAM files are structured, they CANNOT be used # on their own. Calling these manually will almost certainly alter your # position in the file in an unrecoverable manner, whether they throw # an exception or not. # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- def __read_id(self): """ Read the next ID number and do the appropriate task with it. Returns nothing. """ try: # float32 -- ID of the first data sequence objid = np.fromfile(self._fsrc, dtype=np.float32, count=1)[0] except IndexError: # if we have a previous segment, save it self.__save_segment() # if there are no more Segments, return return False if objid == -2: self.__read_condition() elif objid == -1: self.__read_segment() else: self.__spiketimes.append(objid) return True def __read_condition(self): """ Read the parameter values for a single stimulus condition. Returns nothing. """ # float32 -- SpikeTrain length in ms self.__t_stop = np.fromfile(self._fsrc, dtype=np.float32, count=1)[0] # float32 -- number of stimulus parameters numelements = int(np.fromfile(self._fsrc, dtype=np.float32, count=1)[0]) # [float32] * numelements -- stimulus parameter values paramvals = np.fromfile(self._fsrc, dtype=np.float32, count=numelements).tolist() # organize the parameers into a dictionary with arbitrary names paramnames = [f"Param{i}" for i in range(len(paramvals))] self.__params = dict(zip(paramnames, paramvals)) def __read_segment(self): """ Setup the next Segment. Returns nothing. """ # if we have a previous segment, save it self.__save_segment() # create the segment self.__seg = Segment(file_origin=self._filename, **self.__params) # create an empy array to save the spike times # this needs to be converted to a SpikeTrain before it can be used self.__spiketimes = [] def __save_segment(self): """ Write the segment to the Block if it exists """ # if this is the beginning of the first condition, then we don't want # to save, so exit # but set __seg from None to False so we know next time to create a # segment even if there are no spike in the condition if self.__seg is None: self.__seg = False return if not self.__seg: # create dummy values if there are no SpikeTrains in this condition self.__seg = Segment(file_origin=self._filename, **self.__params) self.__spiketimes = [] times = pq.Quantity(self.__spiketimes, dtype=np.float32, units=pq.ms) train = SpikeTrain(times, t_start=0 * pq.ms, t_stop=self.__t_stop * pq.ms, file_origin=self._filename) self.__seg.spiketrains = [train] self.__unit_group.spiketrains.append(train) self._blk.segments.append(self.__seg) # set an empty segment # from now on, we need to set __seg to False rather than None so # that if there is a condition with no SpikeTrains we know # to create an empty Segment self.__seg = False ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/brainwaresrcio.py0000755000175100001660000015267014743453644016570 0ustar00runnerdocker""" Class for reading from Brainware SRC files SRC files are binary files for holding spike data. They are broken up into nested data sequences of different types, with each type of sequence identified by a unique ID number. This allows new versions of sequences to be included without breaking backwards compatibility, since new versions can just be given a new ID number. The ID numbers and the format of the data they contain were taken from the Matlab-based reader function supplied with BrainWare. The python code, however, was implemented from scratch in Python using Python idioms. There are some situations where BrainWare data can overflow the SRC file, resulting in a corrupt file. Neither BrainWare nor the Matlab-based reader can read such files. This software, however, will try to recover the data, and in most cases can do so successfully. Each SRC file can hold the equivalent of multiple Neo Blocks. Brainware was developed by Dr. Jan Schnupp and is availabe from Tucker Davis Technologies, Inc. http://www.tdt.com/downloads.htm Neither Dr. Jan Schnupp nor Tucker Davis Technologies, Inc. had any part in the development of this code The code is implemented with the permission of Dr. Jan Schnupp Note when porting ChannelIndex/Unit to Group (Samuel Garcia). The ChannelIndex was used as group of units. To avoid now a "group of group" each units is directly a "Group"'. Author: Todd Jennings """ # import needed core python modules from datetime import datetime, timedelta from itertools import chain import logging import os.path # numpy and quantities are already required by neo import numpy as np import quantities as pq # needed core neo modules from neo.core import Block, Event, Group, Segment, SpikeTrain # need to subclass BaseIO from neo.io.baseio import BaseIO LOGHANDLER = logging.StreamHandler() class BrainwareSrcIO(BaseIO): """ Class for reading Brainware Spike ReCord files with the extension '.src' The read_block method returns the first Block of the file. It will automatically close the file after reading. The read method is the same as read_block. The read_all_blocks method automatically reads all Blocks. It will automatically close the file after reading. The read_next_block method will return one Block each time it is called. It will automatically close the file and reset to the first Block after reading the last block. Call the close method to close the file and reset this method back to the first Block. The _isopen property tells whether the file is currently open and reading or closed. Note 1: The first Unit in each Group is always UnassignedSpikes, which has a SpikeTrain for each Segment containing all the spikes not assigned to any Unit in that Segment. Note 2: The first Segment in each Block is always Comments, which stores all comments as an Event object. Note 3: The parameters from the BrainWare table for each condition are stored in the Segment annotations. If there are multiple repetitions of a condition, each repetition is stored as a separate Segment. Note 4: There is always only one Group. Usage: >>> from neo.io.brainwaresrcio import BrainwareSrcIO >>> srcfile = BrainwareSrcIO(filename='multi_500ms_mulitrep_ch1.src') >>> blk1 = srcfile.read() >>> blk2 = srcfile.read_block() >>> blks = srcfile.read_all_blocks() >>> print blk1.segments >>> print blk1.segments[0].spiketrains >>> print blk1.groups >>> print blk1.groups[0].name >>> print blk2 >>> print blk2[0].segments >>> print blks >>> print blks[0].segments """ is_readable = True # This class can only read data is_writable = False # write is not supported # This class is able to directly or indirectly handle the following objects supported_objects = [Block, Group, Segment, SpikeTrain, Event] readable_objects = [Block] writeable_objects = [] has_header = False is_streameable = False # This is for GUI stuff: a definition for parameters when reading. # This dict should be keyed by object (`Block`). Each entry is a list # of tuple. The first entry in each tuple is the parameter name. The # second entry is a dict with keys 'value' (for default value), # and 'label' (for a descriptive name). # Note that if the highest-level object requires parameters, # common_io_test will be skipped. read_params = {Block: []} # does not support write so no GUI stuff write_params = None name = "Brainware SRC File" extensions = ["src"] mode = "file" def __init__(self, filename=None): """ Arguments: filename: the filename """ BaseIO.__init__(self) # log the __init__ self.logger.info("__init__") # this stores the filename of the current object, exactly as it is # provided when the instance is initialized. self._filename = filename # this store the filename without the path self._file_origin = filename # This stores the file object for the current file self._fsrc = None # This stores the current Block self._blk = None # This stores the current Segment for easy access # It is equivalent to self._blk.segments[-1] self._seg0 = None # this stores a dictionary of the Block's Group (Units) by name, # making it easier and faster to retrieve Units by name later # UnassignedSpikes and Units accessed by index are not stored here self._unitdict = {} # this stores the current Unit self._unit0 = None # if the file has a list with negative length, the rest of the file's # list lengths are unreliable, so we need to store this value for the # whole file self._damaged = False # this stores an empty SpikeTrain which is used in various places. self._default_spiketrain = None @property def _isopen(self): """ This property tells whether the SRC file associated with the IO object is open. """ return self._fsrc is not None def _opensrc(self): """ Open the file if it isn't already open. """ # if the file isn't already open, open it and clear the Blocks if not self._fsrc or self._fsrc.closed: self._fsrc = open(self._filename, "rb") # figure out the filename of the current file self._file_origin = os.path.basename(self._filename) def close(self): """ Close the currently-open file and reset the current reading point. """ self.logger.info("close") if self._isopen and not self._fsrc.closed: self._fsrc.close() # we also need to reset all per-file attributes self._damaged = False self._fsrc = None self._seg0 = None self._file_origin = None self._lazy = False self._default_spiketrain = None def read_block(self, lazy=False, **kargs): """ Reads the first Block from the Spike ReCording file "filename" generated with BrainWare. If you wish to read more than one Block, please use read_all_blocks. """ assert not lazy, "Do not support lazy" # there are no keyargs implemented to so far. If someone tries to pass # them they are expecting them to do something or making a mistake, # neither of which should pass silently if kargs: raise NotImplementedError("This method does not have any " "arguments implemented yet") blockobj = self.read_next_block() self.close() return blockobj def read_next_block(self, **kargs): """ Reads a single Block from the Spike ReCording file "filename" generated with BrainWare. Each call of read will return the next Block until all Blocks are loaded. After the last Block, the file will be automatically closed and the progress reset. Call the close method manually to reset back to the first Block. """ # there are no keyargs implemented to so far. If someone tries to pass # them they are expecting them to do something or making a mistake, # neither of which should pass silently if kargs: raise NotImplementedError("This method does not have any " "arguments implemented yet") self._opensrc() # create _default_spiketrain here for performance reasons self._default_spiketrain = self._init_default_spiketrain.copy() self._default_spiketrain.file_origin = self._file_origin # create the Block and the contents all Blocks of from IO share self._blk = Block(file_origin=self._file_origin) self._seg0 = Segment(name="Comments", file_origin=self._file_origin) self._unit0 = Group(name="UnassignedSpikes", elliptic=[], boundaries=[], timestamp=[], max_valid=[]) self._blk.groups.append(self._unit0) self._blk.segments.append(self._seg0) # this actually reads the contents of the Block result = [] while hasattr(result, "__iter__"): try: result = self._read_by_id() except: self.close() raise # since we read at a Block level we always do this self._blk.check_relationships() # put the Block in a local object so it can be gargabe collected blockobj = self._blk # reset the per-Block attributes self._blk = None self._unitdict = {} # combine the comments into one big event self._combine_segment_events(self._seg0) # result is None iff the end of the file is reached, so we can # close the file # this notification is not helpful if using the read method with # cascading, since the user will know it is done when the method # returns a value if result is None: self.logger.info("Last Block read. Closing file.") self.close() return blockobj def read_all_blocks(self, lazy=False, **kargs): """ Reads all Blocks from the Spike ReCording file "filename" generated with BrainWare. The progress in the file is reset and the file closed then opened again prior to reading. The file is automatically closed after reading completes. """ # there are no keyargs implemented to so far. If someone tries to pass # them they are expecting them to do something or making a mistake, # neither of which should pass silently assert not lazy, "Do not support lazy" if kargs: raise NotImplementedError("This method does not have any " "argument implemented yet") self.close() self._opensrc() # Read each Block. # After the last Block self._isopen is set to False, so this make a # good way to determine when to stop blocks = [] while self._isopen: try: blocks.append(self.read_next_block()) except: self.close() raise return blocks def _convert_timestamp(self, timestamp, start_date=datetime(1899, 12, 30)): """ _convert_timestamp(timestamp, start_date) - convert a timestamp in brainware src file units to a python datetime object. start_date defaults to 1899.12.30 (ISO format), which is the start date used by all BrainWare SRC data Blocks so far. If manually specified it should be a datetime object or any other object that can be added to a timedelta object. """ # datetime + timedelta = datetime again. try: timestamp = convert_brainwaresrc_timestamp(timestamp, start_date) except OverflowError as err: timestamp = start_date self.logger.exception("_convert_timestamp overflow") return timestamp # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- # All methods from here on are private. They are not intended to be used # on their own, although methods that could theoretically be called on # their own are marked as such. All private methods could be renamed, # combined, or split at any time. All private methods prefixed by # "__read" or "__skip" will alter the current place in the file. # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- def _read_by_id(self): """ Reader for generic data BrainWare SRC files are broken up into data sequences that are identified by an ID code. This method determines the ID code and calls the method to read the data sequence with that ID code. See the _ID_DICT attribute for a dictionary of code/method pairs. IMPORTANT!!! This is the only private method that can be called directly. The rest of the private methods can only safely be called by this method or by other private methods, since they depend on the current position in the file. """ try: # uint16 -- the ID code of the next sequence seqid = np.fromfile(self._fsrc, dtype=np.uint16, count=1).item() except ValueError: # return a None if at EOF. Other methods use None to recognize # an EOF return None # using the seqid, get the reader function from the reader dict readfunc = self._ID_DICT.get(seqid) if readfunc is None: if seqid <= 0: # return if end-of-sequence ID code. This has to be 0. # just calling "return" will return a None which is used as an # EOF indicator return 0 else: # return a warning if the key is invalid # (this is consistent with the official behavior, # even the official reference files have invalid keys # when using the official reference reader matlab # scripts self.logger.warning("unknown ID: %s", seqid) return [] try: # run the function to get the data return readfunc(self) except (EOFError, UnicodeDecodeError) as err: # return a warning if the EOF is reached in the middle of a method self.logger.exception("Premature end of file") return None # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- # These are helper methods. They don't read from the file, so it # won't harm the reading process to call them, but they are only relevant # when used in other private methods. # # These are tuned to the particular needs of this IO class, they are # unlikely to work properly if used with another file format. # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- def _assign_sequence(self, data_obj): """ _assign_sequence(data_obj) - Try to guess where an unknown sequence should go based on its class. Warning are issued if this method is used since manual reorganization may be needed. """ if isinstance(data_obj, Group): self.logger.warning("Unknown Group found, adding to Group list") self._blk.groups.append(data_obj) if data_obj.name: self._unitdict[data_obj.name] = data_obj elif isinstance(data_obj, Segment): self.logger.warning("Unknown Segment found, " "adding to Segments list") self._blk.segments.append(data_obj) elif isinstance(data_obj, Event): self.logger.warning("Unknown Event found, " "adding to comment Events list") self._seg0.events.append(data_obj) elif isinstance(data_obj, SpikeTrain): self.logger.warning("Unknown SpikeTrain found, " "adding to the UnassignedSpikes Unit") self._unit0.spiketrains.append(data_obj) elif hasattr(data_obj, "__iter__") and not isinstance(data_obj, str): for sub_obj in data_obj: self._assign_sequence(sub_obj) else: if self.logger.isEnabledFor(logging.WARNING): self.logger.warning("Unrecognized sequence of type %s found, " "skipping", type(data_obj)) _default_datetime = datetime(1, 1, 1) _default_t_start = pq.Quantity(0.0, units=pq.ms, dtype=np.float32) _init_default_spiketrain = SpikeTrain( times=pq.Quantity([], units=pq.ms, dtype=np.float32), t_start=pq.Quantity(0, units=pq.ms, dtype=np.float32), t_stop=pq.Quantity(1, units=pq.ms, dtype=np.float32), waveforms=pq.Quantity([[[]]], dtype=np.int8, units=pq.mV), dtype=np.float32, copy=None, timestamp=_default_datetime, respwin=np.array([], dtype=np.int32), dama_index=-1, trig2=pq.Quantity([], units=pq.ms, dtype=np.uint8), side="", ) def _combine_events(self, events): """ _combine_events(events) - combine a list of Events with single events into one long Event """ if not events: event = Event( times=pq.Quantity([], units=pq.s), labels=np.array([], dtype="U"), senders=np.array([], dtype="S"), t_start=0, ) return event times = [] labels = [] senders = [] for event in events: times.append(event.times.magnitude) if event.labels.shape == (1,): labels.append(event.labels[0]) else: raise AssertionError( "This single event has multiple labels in an array with " f"shape {event.labels.shape} instead of a single label." ) senders.append(event.annotations["sender"]) times = np.array(times, dtype=np.float32) t_start = times.min() times = pq.Quantity(times - t_start, units=pq.d).rescale(pq.s) labels = np.array(labels, dtype="U") senders = np.array(senders) event = Event(times=times, labels=labels, t_start=t_start.tolist(), senders=senders) return event def _combine_segment_events(self, segment): """ _combine_segment_events(segment) Combine all Events in a segment. """ event = self._combine_events(segment.events) event_t_start = event.annotations.pop("t_start") segment.rec_datetime = self._convert_timestamp(event_t_start) segment.events = [event] def _combine_spiketrains(self, spiketrains): """ _combine_spiketrains(spiketrains) - combine a list of SpikeTrains with single spikes into one long SpikeTrain """ if not spiketrains: return self._default_spiketrain.copy() if hasattr(spiketrains[0], "waveforms") and len(spiketrains) == 1: train = spiketrains[0] return train if hasattr(spiketrains[0], "t_stop"): # workaround for bug in some broken files istrain = [hasattr(utrain, "waveforms") for utrain in spiketrains] if not all(istrain): goodtrains = [itrain for i, itrain in enumerate(spiketrains) if istrain[i]] badtrains = [itrain for i, itrain in enumerate(spiketrains) if not istrain[i]] spiketrains = goodtrains + [self._combine_spiketrains(badtrains)] spiketrains = [itrain for itrain in spiketrains if itrain.size > 0] if not spiketrains: return self._default_spiketrain.copy() # get the times of the spiketrains and combine them waveforms = [itrain.waveforms for itrain in spiketrains] rawtrains = np.array(np.concatenate(spiketrains, axis=1)) times = pq.Quantity(rawtrains, units=pq.ms) lens1 = np.array([wave.shape[1] for wave in waveforms]) lens2 = np.array([wave.shape[2] for wave in waveforms]) if lens1.max() != lens1.min() or lens2.max() != lens2.min(): lens1 = lens1.max() - lens1 lens2 = lens2.max() - lens2 waveforms = [ np.pad(waveform, ((0, 0), (0, len1), (0, len2)), "constant") for waveform, len1, len2 in zip(waveforms, lens1, lens2) ] waveforms = np.concatenate(waveforms, axis=0) # extract the trig2 annotation trig2 = np.array(np.concatenate([itrain.annotations["trig2"] for itrain in spiketrains], axis=1)) trig2 = pq.Quantity(trig2, units=pq.ms) elif hasattr(spiketrains[0], "units"): return self._combine_spiketrains([spiketrains]) else: times, waveforms, trig2 = zip(*spiketrains) times = np.concatenate(times, axis=0) # get the times of the SpikeTrains and combine them times = pq.Quantity(times, units=pq.ms) # get the waveforms of the SpikeTrains and combine them # these should be a 3D array with the first axis being the spike, # the second axis being the recording channel (there is only one), # and the third axis being the actual waveform waveforms = np.concatenate(waveforms, axis=0) # extract the trig2 annotation trig2 = pq.Quantity(np.hstack(trig2), units=pq.ms) if not times.size: return self._default_spiketrain.copy() # get the maximum time t_stop = times[-1] * 2.0 waveforms = pq.Quantity(waveforms, units=pq.mV) train = SpikeTrain( times=times, copy=None, t_start=self._default_t_start.copy(), t_stop=t_stop, file_origin=self._file_origin, waveforms=waveforms, timestamp=self._default_datetime, respwin=np.array([], dtype=np.int32), dama_index=-1, trig2=trig2, side="", ) return train # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- # IMPORTANT!!! # These are private methods implementing the internal reading mechanism. # Due to the way BrainWare SRC files are structured, they CANNOT be used # on their own. Calling these manually will almost certainly alter your # position in the file in an unrecoverable manner, whether they throw # an exception or not. # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- def __read_str(self, numchars=1, utf=None): """ Read a string of a specific length. """ rawstr = np.fromfile(self._fsrc, dtype="S%s" % numchars, count=1).item() return rawstr.decode("utf-8") def __read_annotations(self): """ Read the stimulus grid properties. ------------------------------------------------------------------- Returns a dictionary containing the parameter names as keys and the parameter values as values. The returned object must be added to the Block. ID: 29109 """ # int16 -- number of stimulus parameters numelements = np.fromfile(self._fsrc, dtype=np.int16, count=1)[0] if not numelements: return {} # [data sequence] * numelements -- parameter names names = [] for i in range(numelements): # {skip} = byte (char) -- skip one byte self._fsrc.seek(1, 1) # uint8 -- length of next string numchars = np.fromfile(self._fsrc, dtype=np.uint8, count=1).item() # if there is no name, make one up if not numchars: name = "param%s" % i else: # char * numchars -- parameter name string name = self.__read_str(numchars) # if the name is already in there, add a unique number to it # so it isn't overwritten if name in names: name = name + str(i) names.append(name) # float32 * numelements -- an array of parameter values values = np.fromfile(self._fsrc, dtype=np.float32, count=numelements) # combine the names and values into a dict # the dict will be added to the annotations annotations = dict(zip(names, values)) return annotations def __read_annotations_old(self): """ Read the stimulus grid properties. Returns a dictionary containing the parameter names as keys and the parameter values as values. ------------------------------------------------ The returned objects must be added to the Block. This reads an old version of the format that does not store paramater names, so placeholder names are created instead. ID: 29099 """ # int16 * 14 -- an array of parameter values values = np.fromfile(self._fsrc, dtype=np.int16, count=14) # create dummy names and combine them with the values in a dict # the dict will be added to the annotations params = ["param%s" % i for i in range(len(values))] annotations = dict(zip(params, values)) return annotations def __read_comment(self): """ Read a single comment. The comment is stored as an Event in Segment 0, which is specifically for comments. ---------------------- Returns an empty list. The returned object is already added to the Block. No ID number: always called from another method """ # float64 -- timestamp (number of days since dec 30th 1899) time = np.fromfile(self._fsrc, dtype=np.double, count=1)[0] # int16 -- length of next string numchars1 = np.fromfile(self._fsrc, dtype=np.int16, count=1).item() # char * numchars -- the one who sent the comment sender = self.__read_str(numchars1) # int16 -- length of next string numchars2 = np.fromfile(self._fsrc, dtype=np.int16, count=1).item() # char * numchars -- comment text text = self.__read_str(numchars2, utf=False) comment = Event( times=pq.Quantity(time, units=pq.d), labels=[text], sender=sender, file_origin=self._file_origin ) self._seg0.events.append(comment) return [] def __read_list(self): """ Read a list of arbitrary data sequences It only says how many data sequences should be read. These sequences are then read by their ID number. Note that lists can be nested. If there are too many sequences (for instance if there are a large number of spikes in a Segment) then a negative number will be returned for the number of data sequences to read. In this case the method tries to guess. This also means that all future list data sequences have unreliable lengths as well. ------------------------------------------- Returns a list of objects. Whether these objects need to be added to the Block depends on the object in question. There are several data sequences that have identical formats but are used in different situations. That means this data sequences has multiple ID numbers. ID: 29082 ID: 29083 ID: 29091 ID: 29093 """ # int16 -- number of sequences to read numelements = np.fromfile(self._fsrc, dtype=np.int16, count=1)[0] # {skip} = bytes * 4 (int16 * 2) -- skip four bytes self._fsrc.seek(4, 1) if numelements == 0: return [] if not self._damaged and numelements < 0: self._damaged = True self.logger.error("Negative sequence count %s, file damaged", numelements) if not self._damaged: # read the sequences into a list seq_list = [self._read_by_id() for _ in range(numelements)] else: # read until we get some indication we should stop seq_list = [] # uint16 -- the ID of the next sequence seqidinit = np.fromfile(self._fsrc, dtype=np.uint16, count=1)[0] # {rewind} = byte * 2 (int16) -- move back 2 bytes, i.e. go back to # before the beginning of the seqid self._fsrc.seek(-2, 1) while 1: # uint16 -- the ID of the next sequence seqid = np.fromfile(self._fsrc, dtype=np.uint16, count=1)[0] # {rewind} = byte * 2 (int16) -- move back 2 bytes, i.e. go # back to before the beginning of the seqid self._fsrc.seek(-2, 1) # if we come across a new sequence, we are at the end of the # list so we should stop if seqidinit != seqid: break # otherwise read the next sequence seq_list.append(self._read_by_id()) return seq_list def __read_segment(self): """ Read an individual Segment. A Segment contains a dictionary of parameters, the length of the recording, a list of Units with their Spikes, and a list of Spikes not assigned to any Unit. The unassigned spikes are always stored in Unit 0, which is exclusively for storing these spikes. ------------------------------------------------- Returns the Segment object created by the method. The returned object is already added to the Block. ID: 29106 """ # (data_obj) -- the stimulus parameters for this segment annotations = self._read_by_id() annotations["feature_type"] = -1 annotations["go_by_closest_unit_center"] = False annotations["include_unit_bounds"] = False # (data_obj) -- SpikeTrain list of unassigned spikes # these go in the first Unit since it is for unassigned spikes unassigned_spikes = self._read_by_id() self._unit0.spiketrains.extend(unassigned_spikes) # read a list of units and grab the second return value, which is the # SpikeTrains from this Segment (if we use the Unit we will get all the # SpikeTrains from that Unit, resuling in duplicates if we are past # the first Segment trains = self._read_by_id() if not trains: if unassigned_spikes: # if there are no assigned spikes, # just use the unassigned spikes trains = zip(unassigned_spikes) else: # if there are no spiketrains at all, # create an empty spike train trains = [[self._default_spiketrain.copy()]] elif hasattr(trains[0], "dtype"): # workaround for some broken files trains = [unassigned_spikes + [self._combine_spiketrains([trains])]] else: # get the second element from each returned value, # which is the actual SpikeTrains trains = [unassigned_spikes] + [train[1] for train in trains] # re-organize by sweeps trains = zip(*trains) # int32 -- SpikeTrain length in ms spiketrainlen = pq.Quantity(np.fromfile(self._fsrc, dtype=np.int32, count=1)[0], units=pq.ms) segments = [] for train in trains: # create the Segment and add everything to it segment = Segment(file_origin=self._file_origin, **annotations) segment.spiketrains = train self._blk.segments.append(segment) segments.append(segment) for itrain in train: # use the SpikeTrain length to figure out the stop time # t_start is always 0 so we can ignore it itrain.t_stop = spiketrainlen return segments def __read_segment_list(self): """ Read a list of Segments with comments. Since comments can occur at any point, whether a recording is happening or not, it is impossible to reliably assign them to a specific Segment. For this reason they are always assigned to Segment 0, which is exclusively used to store comments. -------------------------------------------------------- Returns a list of the Segments created with this method. The returned objects are already added to the Block. ID: 29112 """ # uint8 -- number of electrode channels in the Segment numchannels = np.fromfile(self._fsrc, dtype=np.uint8, count=1)[0] # [list of sequences] -- individual Segments segments = self.__read_list() while not hasattr(segments[0], "spiketrains"): segments = list(chain(*segments)) # char -- "side of brain" info side = self.__read_str(1) # int16 -- number of comments numelements = np.fromfile(self._fsrc, dtype=np.int16, count=1)[0] # comment_obj * numelements -- comments about the Segments # we don't know which Segment specifically, though for _ in range(numelements): self.__read_comment() # store what side of the head we are dealing with for segment in segments: for spiketrain in segment.spiketrains: spiketrain.annotations["side"] = side return segments def __read_segment_list_v8(self): """ Read a list of Segments with comments. This is version 8 of the data sequence. This is the same as __read_segment_list_var, but can also contain one or more arbitrary sequences. The class makes an attempt to assign the sequences when possible, and warns the user when this happens (see the _assign_sequence method) -------------------------------------------------------- Returns a list of the Segments created with this method. The returned objects are already added to the Block. ID: 29117 """ # segment_collection_var -- this is based off a segment_collection_var segments = self.__read_segment_list_var() # uint16 -- the ID of the next sequence seqid = np.fromfile(self._fsrc, dtype=np.uint16, count=1)[0] # {rewind} = byte * 2 (int16) -- move back 2 bytes, i.e. go back to # before the beginning of the seqid self._fsrc.seek(-2, 1) if seqid in self._ID_DICT: # if it is a valid seqid, read it and try to figure out where # to put it self._assign_sequence(self._read_by_id()) else: # otherwise it is a Unit list self.__read_unit_list() # {skip} = byte * 2 (int16) -- skip 2 bytes self._fsrc.seek(2, 1) return segments def __read_segment_list_v9(self): """ Read a list of Segments with comments. This is version 9 of the data sequence. This is the same as __read_segment_list_v8, but contains some additional annotations. These annotations are added to the Segment. -------------------------------------------------------- Returns a list of the Segments created with this method. The returned objects are already added to the Block. ID: 29120 """ # segment_collection_v8 -- this is based off a segment_collection_v8 segments = self.__read_segment_list_v8() # uint8 feature_type = np.fromfile(self._fsrc, dtype=np.uint8, count=1)[0] # uint8 go_by_closest_unit_center = np.fromfile(self._fsrc, dtype=np.bool8, count=1)[0] # uint8 include_unit_bounds = np.fromfile(self._fsrc, dtype=np.bool8, count=1)[0] # create a dictionary of the annotations annotations = { "feature_type": feature_type, "go_by_closest_unit_center": go_by_closest_unit_center, "include_unit_bounds": include_unit_bounds, } # add the annotations to each Segment for segment in segments: segment.annotations.update(annotations) return segments def __read_segment_list_var(self): """ Read a list of Segments with comments. This is the same as __read_segment_list, but contains information regarding the sampling period. This information is added to the SpikeTrains in the Segments. -------------------------------------------------------- Returns a list of the Segments created with this method. The returned objects are already added to the Block. ID: 29114 """ # float32 -- DA conversion clock period in microsec sampling_period = pq.Quantity(np.fromfile(self._fsrc, dtype=np.float32, count=1), units=pq.us)[0] # segment_collection -- this is based off a segment_collection segments = self.__read_segment_list() # add the sampling period to each SpikeTrain for segment in segments: for spiketrain in segment.spiketrains: spiketrain.sampling_period = sampling_period return segments def __read_spike_fixed(self, numpts=40): """ Read a spike with a fixed waveform length (40 time bins) ------------------------------------------- Returns the time, waveform and trig2 value. The returned objects must be converted to a SpikeTrain then added to the Block. ID: 29079 """ # float32 -- spike time stamp in ms since start of SpikeTrain time = np.fromfile(self._fsrc, dtype=np.float32, count=1) # int8 * 40 -- spike shape -- use numpts for spike_var waveform = np.fromfile(self._fsrc, dtype=np.int8, count=numpts).reshape(1, 1, numpts) # uint8 -- point of return to noise trig2 = np.fromfile(self._fsrc, dtype=np.uint8, count=1) return time, waveform, trig2 def __read_spike_fixed_old(self): """ Read a spike with a fixed waveform length (40 time bins) This is an old version of the format. The time is stored as ints representing 1/25 ms time steps. It has no trigger information. ------------------------------------------- Returns the time, waveform and trig2 value. The returned objects must be converted to a SpikeTrain then added to the Block. ID: 29081 """ # int32 -- spike time stamp in ms since start of SpikeTrain time = np.fromfile(self._fsrc, dtype=np.int32, count=1) / 25.0 time = time.astype(np.float32) # int8 * 40 -- spike shape # This needs to be a 3D array, one for each channel. BrainWare # only ever has a single channel per file. waveform = np.fromfile(self._fsrc, dtype=np.int8, count=40).reshape(1, 1, 40) # create a dummy trig2 value trig2 = np.array([-1], dtype=np.uint8) return time, waveform, trig2 def __read_spike_var(self): """ Read a spike with a variable waveform length ------------------------------------------- Returns the time, waveform and trig2 value. The returned objects must be converted to a SpikeTrain then added to the Block. ID: 29115 """ # uint8 -- number of points in spike shape numpts = np.fromfile(self._fsrc, dtype=np.uint8, count=1)[0] # spike_fixed is the same as spike_var if you don't read the numpts # byte and set numpts = 40 return self.__read_spike_fixed(numpts) def __read_spiketrain_indexed(self): """ Read a SpikeTrain This is the same as __read_spiketrain_timestamped except it also contains the index of the Segment in the dam file. The index is stored as an annotation in the SpikeTrain. ------------------------------------------------- Returns a SpikeTrain object with multiple spikes. The returned object must be added to the Block. ID: 29121 """ # int32 -- index of the analogsignalarray in corresponding .dam file dama_index = np.fromfile(self._fsrc, dtype=np.int32, count=1)[0] # spiketrain_timestamped -- this is based off a spiketrain_timestamped spiketrain = self.__read_spiketrain_timestamped() # add the property to the dict spiketrain.annotations["dama_index"] = dama_index return spiketrain def __read_spiketrain_timestamped(self): """ Read a SpikeTrain This SpikeTrain contains a time stamp for when it was recorded The timestamp is stored as an annotation in the SpikeTrain. ------------------------------------------------- Returns a SpikeTrain object with multiple spikes. The returned object must be added to the Block. ID: 29110 """ # float64 -- timeStamp (number of days since dec 30th 1899) timestamp = np.fromfile(self._fsrc, dtype=np.double, count=1)[0] # convert to datetime object timestamp = self._convert_timestamp(timestamp) # seq_list -- spike list # combine the spikes into a single SpikeTrain spiketrain = self._combine_spiketrains(self.__read_list()) # add the timestamp spiketrain.annotations["timestamp"] = timestamp return spiketrain def __read_unit(self): """ Read all SpikeTrains from a single Segment and Unit This is the same as __read_unit_unsorted except it also contains information on the spike sorting boundaries. ------------------------------------------------------------------ Returns a single Unit and a list of SpikeTrains from that Unit and current Segment, in that order. The SpikeTrains must be returned since it is not possible to determine from the Unit which SpikeTrains are from the current Segment. The returned objects are already added to the Block. The SpikeTrains must be added to the current Segment. ID: 29116 """ # same as unsorted Unit unit, trains = self.__read_unit_unsorted() # float32 * 18 -- Unit boundaries (IEEE 32-bit floats) unit.annotations["boundaries"] = [np.fromfile(self._fsrc, dtype=np.float32, count=18)] # uint8 * 9 -- boolean values indicating elliptic feature boundary # dimensions unit.annotations["elliptic"] = [np.fromfile(self._fsrc, dtype=np.uint8, count=9)] return unit, trains def __read_unit_list(self): """ A list of a list of Units ----------------------------------------------- Returns a list of Units modified in the method. The returned objects are already added to the Block. No ID number: only called by other methods """ # this is used to figure out which Units to return maxunit = 1 # int16 -- number of time slices numelements = np.fromfile(self._fsrc, dtype=np.int16, count=1)[0] # {sequence} * numelements1 -- the number of lists of Units to read for i in range(numelements): # {skip} = byte * 2 (int16) -- skip 2 bytes self._fsrc.seek(2, 1) # double max_valid = np.fromfile(self._fsrc, dtype=np.double, count=1)[0] # int16 - the number of Units to read numunits = np.fromfile(self._fsrc, dtype=np.int16, count=1)[0] # update tha maximum Unit so far maxunit = max(maxunit, numunits + 1) # if there aren't enough Units, create them # remember we need to skip the UnassignedSpikes Unit if numunits > len(self._blk.groups) + 1: for ind1 in range(len(self._blk.groups), numunits + 1): unit = Group( name="unit%s" % ind1, file_origin=self._file_origin, elliptic=[], boundaries=[], timestamp=[], max_valid=[], ) self._blk.groups.append(unit) # {Block} * numelements -- Units for ind1 in range(numunits): # get the Unit with the given index # remember we need to skip the UnassignedSpikes Unit unit = self._blk.groups[ind1 + 1] # {skip} = byte * 2 (int16) -- skip 2 bytes self._fsrc.seek(2, 1) # int16 -- a multiplier for the elliptic and boundaries # properties numelements3 = np.fromfile(self._fsrc, dtype=np.int16, count=1)[0] # uint8 * 10 * numelements3 -- boolean values indicating # elliptic feature boundary dimensions elliptic = np.fromfile(self._fsrc, dtype=np.uint8, count=10 * numelements3) # float32 * 20 * numelements3 -- feature boundaries boundaries = np.fromfile(self._fsrc, dtype=np.float32, count=20 * numelements3) unit.annotations["elliptic"].append(elliptic) unit.annotations["boundaries"].append(boundaries) unit.annotations["max_valid"].append(max_valid) return self._blk.groups[1:maxunit] def __read_unit_list_timestamped(self): """ A list of a list of Units. This is the same as __read_unit_list, except that it also has a timestamp. This is added ad an annotation to all Units. ----------------------------------------------- Returns a list of Units modified in the method. The returned objects are already added to the Block. ID: 29119 """ # double -- time zero (number of days since dec 30th 1899) timestamp = np.fromfile(self._fsrc, dtype=np.double, count=1)[0] # convert to to days since UNIX epoc time: timestamp = self._convert_timestamp(timestamp) # sorter -- this is based off a sorter units = self.__read_unit_list() for unit in units: unit.annotations["timestamp"].append(timestamp) return units def __read_unit_old(self): """ Read all SpikeTrains from a single Segment and Unit This is the same as __read_unit_unsorted except it also contains information on the spike sorting boundaries. This is an old version of the format that used 48-bit floating-point numbers for the boundaries. These cannot easily be read and so are skipped. ------------------------------------------------------------------ Returns a single Unit and a list of SpikeTrains from that Unit and current Segment, in that order. The SpikeTrains must be returned since it is not possible to determine from the Unit which SpikeTrains are from the current Segment. The returned objects are already added to the Block. The SpikeTrains must be added to the current Segment. ID: 29107 """ # same as Unit unit, trains = self.__read_unit_unsorted() # bytes * 108 (float48 * 18) -- Unit boundaries (48-bit floating # point numbers are not supported so we skip them) self._fsrc.seek(108, 1) # uint8 * 9 -- boolean values indicating elliptic feature boundary # dimensions unit.annotations["elliptic"] = np.fromfile(self._fsrc, dtype=np.uint8, count=9).tolist() return unit, trains def __read_unit_unsorted(self): """ Read all SpikeTrains from a single Segment and Unit This does not contain Unit boundaries. ------------------------------------------------------------------ Returns a single Unit and a list of SpikeTrains from that Unit and current Segment, in that order. The SpikeTrains must be returned since it is not possible to determine from the Unit which SpikeTrains are from the current Segment. The returned objects are already added to the Block. The SpikeTrains must be added to the current Segment. ID: 29084 """ # {skip} = bytes * 2 (uint16) -- skip two bytes self._fsrc.seek(2, 1) # uint16 -- number of characters in next string numchars = np.fromfile(self._fsrc, dtype=np.uint16, count=1).item() # char * numchars -- ID string of Unit name = self.__read_str(numchars) # int32 -- SpikeTrain length in ms # int32 * 4 -- response and spon period boundaries parts = np.fromfile(self._fsrc, dtype=np.int32, count=5) t_stop = pq.Quantity(parts[0].astype("float32"), units=pq.ms) respwin = parts[1:] # (data_obj) -- list of SpikeTrains spikeslists = self._read_by_id() # use the Unit if it already exists, otherwise create it if name in self._unitdict: unit = self._unitdict[name] else: unit = Group( name=name, file_origin=self._file_origin, elliptic=[], boundaries=[], timestamp=[], max_valid=[] ) self._blk.groups.append(unit) self._unitdict[name] = unit # convert the individual spikes to SpikeTrains and add them to the Unit trains = [self._combine_spiketrains(spikes) for spikes in spikeslists] unit.spiketrains.extend(trains) for train in trains: train.t_stop = t_stop.copy() train.annotations["respwin"] = respwin.copy() return unit, trains def __skip_information(self): """ Read an information sequence. This is data sequence is skipped both here and in the Matlab reference implementation. ---------------------- Returns an empty list Nothing is created so nothing is added to the Block. ID: 29113 """ # {skip} char * 34 -- display information self._fsrc.seek(34, 1) return [] def __skip_information_old(self): """ Read an information sequence This is data sequence is skipped both here and in the Matlab reference implementation This is an old version of the format ---------------------- Returns an empty list. Nothing is created so nothing is added to the Block. ID: 29100 """ # {skip} char * 4 -- display information self._fsrc.seek(4, 1) return [] # This dictionary maps the numeric data sequence ID codes to the data # sequence reading functions. # # Since functions are first-class objects in Python, the functions returned # from this dictionary are directly callable. # # If new data sequence ID codes are added in the future please add the code # here in numeric order and the method above in alphabetical order # # The naming of any private method may change at any time _ID_DICT = { 29079: __read_spike_fixed, 29081: __read_spike_fixed_old, 29082: __read_list, 29083: __read_list, 29084: __read_unit_unsorted, 29091: __read_list, 29093: __read_list, 29099: __read_annotations_old, 29100: __skip_information_old, 29106: __read_segment, 29107: __read_unit_old, 29109: __read_annotations, 29110: __read_spiketrain_timestamped, 29112: __read_segment_list, 29113: __skip_information, 29114: __read_segment_list_var, 29115: __read_spike_var, 29116: __read_unit, 29117: __read_segment_list_v8, 29119: __read_unit_list_timestamped, 29120: __read_segment_list_v9, 29121: __read_spiketrain_indexed, } def convert_brainwaresrc_timestamp(timestamp, start_date=datetime(1899, 12, 30)): """ convert_brainwaresrc_timestamp(timestamp, start_date) - convert a timestamp in brainware src file units to a python datetime object. start_date defaults to 1899.12.30 (ISO format), which is the start date used by all BrainWare SRC data Blocks so far. If manually specified it should be a datetime object or any other object that can be added to a timedelta object. """ # datetime + timedelta = datetime again. return start_date + timedelta(days=timestamp) if __name__ == "__main__": # run this when calling the file directly as a benchmark from neo.test.iotest.test_brainwaresrcio import FILES_TO_TEST from neo.test.iotest.common_io_test import url_for_tests from neo.test.iotest.tools import ( create_local_temp_dir, download_test_file, get_test_file_full_path, make_all_directories, ) shortname = BrainwareSrcIO.__name__.lower().strip("io") local_test_dir = create_local_temp_dir(shortname) url = url_for_tests + shortname FILES_TO_TEST.remove("long_170s_1rep_1clust_ch2.src") make_all_directories(FILES_TO_TEST, local_test_dir) download_test_file(FILES_TO_TEST, local_test_dir, url) for path in get_test_file_full_path(ioclass=BrainwareSrcIO, filename=FILES_TO_TEST, directory=local_test_dir): ioobj = BrainwareSrcIO(path) ioobj.read_all_blocks(lazy=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/cedio.py0000644000175100001660000000047114743453644014625 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.cedrawio import CedRawIO class CedIO(CedRawIO, BaseFromRaw): __doc__ = CedRawIO.__doc__ def __init__(self, filename, entfile=None, posfile=None): CedRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/edfio.py0000644000175100001660000000122214743453644014623 0ustar00runnerdocker""" IO for reading edf and edf+ files using pyedflib PyEDFLib https://pyedflib.readthedocs.io https://github.com/holgern/pyedflib EDF Format Specifications: https://www.edfplus.info/ Author: Julia Sprenger """ from neo.io.basefromrawio import BaseFromRaw from neo.rawio.edfrawio import EDFRawIO class EDFIO(EDFRawIO, BaseFromRaw): """ IO for reading edf and edf+ files. """ name = "EDF IO" description = "IO for reading EDF and EDF+ files" _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename=""): EDFRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/elanio.py0000644000175100001660000000206014743453644015005 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.elanrawio import ElanRawIO class ElanIO(ElanRawIO, BaseFromRaw): """ Class for reading data from Elan. Elan is software for studying time-frequency maps of EEG data. Elan is developed in Lyon, France, at INSERM U821 https://elan.lyon.inserm.fr Args: filename (string) : Full path to the .eeg file entfile (string) : Full path to the .ent file (optional). If None, the path to the ent file is inferred from the filename by adding the ".ent" extension to it posfile (string) : Full path to the .pos file (optional). If None, the path to the pos file is inferred from the filename by adding the ".pos" extension to it """ _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename, entfile=None, posfile=None): ElanRawIO.__init__(self, filename=filename, entfile=entfile, posfile=posfile) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/elphyio.py0000644000175100001660000046001114743453644015213 0ustar00runnerdocker""" README ===================================================================================== This is the implementation of the NEO IO for Elphy files. IO dependencies: - NEO - types - numpy - quantities Quick reference: ===================================================================================== Class ElphyIO() with methods read_block() and write_block() are implemented. This classes represent the way to access and produce Elphy files from NEO objects. As regards reading an existing Elphy file, start by initializing a IO class with it: >>> import neo >>> r = neo.io.ElphyIO( filename="Elphy.DAT" ) >>> r Read the file content into NEO object Block: >>> bl = r.read_block() >>> bl Now you can then read all Elphy data as NEO objects: >>> b1.segments [, , , ] >>> bl.segments[0].analogsignals[0] These functions return NEO objects, completely "detached" from the original Elphy file. Changes to the runtime objects will not cause any changes in the file. Having already existing NEO structures, it is possible to write them as an Elphy file. For example, given a segment: >>> s = neo.Segment() filled with other NEO structures: >>> import numpy as np >>> import quantities as pq >>> a = AnalogSignal( signal=np.random.rand(300), t_start=42*pq.ms) >>> s.analogsignals.append( a ) and added to a newly created NEO Block: >>> bl = neo.Block() >>> bl.segments.append( s ) Then, it's easy to create an Elphy file: >>> r = neo.io.ElphyIO( filename="ElphyNeoTest.DAT" ) >>> r.write_block( bl ) Author: Thierry Brizzi Domenico Guarino """ # python commons: from datetime import datetime from math import gcd from os import path import re import struct from time import time # note neo.core needs only numpy and quantities import numpy as np import quantities as pq # I need to subclass BaseIO from neo.io.baseio import BaseIO # to import from core from neo.core import Block, Segment, AnalogSignal, Event, SpikeTrain, NeoReadWriteError # -------------------------------------------------------- # OBJECTS class ElphyScaleFactor: """ Useful to retrieve real values from integer ones that are stored in an Elphy file : ``scale`` : compute the actual value of a sample with this following formula : ``delta`` * value + ``offset`` """ def __init__(self, delta, offset): self.delta = delta self.offset = offset def scale(self, value): return value * self.delta + self.offset class BaseSignal: """ A descriptor storing main signal properties : ``layout`` : the :class:``ElphyLayout` object that extracts data from a file. ``episode`` : the episode in which the signal has been acquired. ``sampling_frequency`` : the sampling frequency of the analog to digital converter. ``sampling_period`` : the sampling period of the analog to digital converter computed from sampling_frequency. ``t_start`` : the start time of the signal acquisition. ``t_stop`` : the end time of the signal acquisition. ``duration`` : the duration of the signal acquisition computed from t_start and t_stop. ``n_samples`` : the number of sample acquired during the recording computed from the duration and the sampling period. ``name`` : a label to identify the signal. ``data`` : a property triggering data extraction. """ def __init__(self, layout, episode, sampling_frequency, start, stop, name=None): self.layout = layout self.episode = episode self.sampling_frequency = sampling_frequency self.sampling_period = 1 / sampling_frequency self.t_start = start self.t_stop = stop self.duration = self.t_stop - self.t_start self.n_samples = int(self.duration / self.sampling_period) self.name = name @property def data(self): raise NotImplementedError("must be overloaded in subclass") class ElphySignal(BaseSignal): """ Subclass of :class:`BaseSignal` corresponding to Elphy's analog channels : ``channel`` : the identifier of the analog channel providing the signal. ``units`` : an array containing x and y coordinates units. ``x_unit`` : a property to access the x-coordinates unit. ``y_unit`` : a property to access the y-coordinates unit. ``data`` : a property that delegate data extraction to the ``get_signal_data`` function of the ```layout`` object. """ def __init__(self, layout, episode, channel, x_unit, y_unit, sampling_frequency, start, stop, name=None): super().__init__(layout, episode, sampling_frequency, start, stop, name) self.channel = channel self.units = [x_unit, y_unit] def __str__(self): return f"{self.layout.file.name} ep_{self.episode} ch_{self.channel} [{self.x_unit}, {self.y_unit}]" def __repr__(self): return self.__str__() @property def x_unit(self): """ Return the x-coordinate of the signal. """ return self.units[0] @property def y_unit(self): """ Return the y-coordinate of the signal. """ return self.units[1] @property def data(self): return self.layout.get_signal_data(self.episode, self.channel) class ElphyTag(BaseSignal): """ Subclass of :class:`BaseSignal` corresponding to Elphy's tag channels : ``number`` : the identifier of the tag channel. ``x_unit`` : the unit of the x-coordinate. """ def __init__(self, layout, episode, number, x_unit, sampling_frequency, start, stop, name=None): super().__init__(layout, episode, sampling_frequency, start, stop, name) self.number = number self.units = [x_unit, None] def __str__(self): return f"{self.layout.file.name} : ep_{self.episode} tag_ch_{ self.number} [{self.x_unit}]" def __repr__(self): return self.__str__() @property def x_unit(self): """ Return the x-coordinate of the signal. """ return self.units[0] @property def data(self): return self.layout.get_tag_data(self.episode, self.number) @property def channel(self): return self.number class ElphyEvent: """ A descriptor that store a set of events properties : ``layout`` : the :class:``ElphyLayout` object that extracts data from a file. ``episode`` : the episode in which the signal has been acquired. ``number`` : the identifier of the channel. ``x_unit`` : the unit of the x-coordinate. ``n_events`` : the number of events. ``name`` : a label to identify the event. ``times`` : a property triggering event times extraction. """ def __init__(self, layout, episode, number, x_unit, n_events, ch_number=None, name=None): self.layout = layout self.episode = episode self.number = number self.x_unit = x_unit self.n_events = n_events self.name = name self.ch_number = ch_number def __str__(self): return f"{self.layout.file.name} : ep_{self.episode} evt_ch_{self.number} [{self.x_unit}]" def __repr__(self): return self.__str__() @property def channel(self): return self.number @property def times(self): return self.layout.get_event_data(self.episode, self.number) @property def data(self): return self.times class ElphySpikeTrain(ElphyEvent): """ A descriptor that store spiketrain properties : ``wf_samples`` : number of samples composing waveforms. ``wf_sampling_frequency`` : sampling frequency of waveforms. ``wf_sampling_period`` : sampling period of waveforms. ``wf_units`` : the units of the x and y coordinates of waveforms. ``t_start`` : the time before the arrival of the spike which corresponds to the starting time of a waveform. ``name`` : a label to identify the event. ``times`` : a property triggering event times extraction. ``waveforms`` : a property triggering waveforms extraction. """ def __init__( self, layout, episode, number, x_unit, n_events, wf_sampling_frequency, wf_samples, unit_x_wf, unit_y_wf, t_start, name=None, ): super().__init__(layout, episode, number, x_unit, n_events, name) self.wf_samples = wf_samples self.wf_sampling_frequency = wf_sampling_frequency if not wf_sampling_frequency: raise ValueError("bad sampling frequency") self.wf_sampling_period = 1.0 / wf_sampling_frequency self.wf_units = [unit_x_wf, unit_y_wf] self.t_start = t_start @property def x_unit_wf(self): """ Return the x-coordinate of waveforms. """ return self.wf_units[0] @property def y_unit_wf(self): """ Return the y-coordinate of waveforms. """ return self.wf_units[1] @property def times(self): return self.layout.get_spiketrain_data(self.episode, self.number) @property def waveforms(self): return self.layout.get_waveform_data(self.episode, self.number) if self.wf_samples else None # -------------------------------------------------------- # BLOCKS class BaseBlock: """ Represent a chunk of file storing metadata or raw data. A convenient class to break down the structure of an Elphy file to several building blocks : ``layout`` : the layout containing the block. ``identifier`` : the label that identified the block. ``size`` : the size of the block. ``start`` : the file index corresponding to the starting byte of the block. ``end`` : the file index corresponding to the ending byte of the block NB : Subclassing this class is a convenient way to set the properties using polymorphism rather than a conditional structure. By this way each :class:`BaseBlock` type know how to iterate through the Elphy file and store interesting data. """ def __init__(self, layout, identifier, start, size): self.layout = layout self.identifier = identifier self.size = size self.start = start self.end = self.start + self.size - 1 class ElphyBlock(BaseBlock): """ A subclass of :class:`BaseBlock`. Useful to store the location and size of interesting data within a block : ``parent_block`` : the parent block containing the block. ``header_size`` : the size of the header permitting the identification of the type of the block. ``data_offset`` : the file index located after the block header. ``data_size`` : the size of data located after the header. ``sub_blocks`` : the sub-blocks contained by the block. """ def __init__(self, layout, identifier, start, size, fixed_length=None, size_format="i", parent_block=None): super().__init__(layout, identifier, start, size) # a block may be a sub-block of another block self.parent_block = parent_block # pascal language store strings in 2 different ways # ... first, if in the program the size of the string is # specified (fixed) then the file stores the length # of the string and allocate a number of bytes equal # to the specified size # ... if this size is not specified the length of the # string is also stored but the file allocate dynamically # a number of bytes equal to the actual size of the string l_ident = len(self.identifier) if fixed_length: l_ident += fixed_length - l_ident self.header_size = l_ident + 1 + type_dict[size_format] # starting point of data located in the block self.data_offset = self.start + self.header_size self.data_size = self.size - self.header_size # a block may have sub-blocks # it is to subclasses to initialize # this property self.sub_blocks = list() def __repr__(self): return f"{self.identifier} : size = {self.size}, start = {self.start}, end = {self.end}" def add_sub_block(self, block): """ Append a block to the sub-block list. """ self.sub_blocks.append(block) class FileInfoBlock(ElphyBlock): """ Base class of all subclasses whose the purpose is to extract user file info stored into an Elphy file : ``header`` : the header block relative to the block. ``file`` : the file containing the block. NB : User defined metadata are not really practical. An Elphy script must know the order of metadata storage to know exactly how to retrieve these data. That's why it is necessary to subclass and reproduce elphy script commands to extract metadata relative to a protocol. Consequently managing a new protocol implies to refactor the file info extraction. """ def __init__(self, layout, identifier, start, size, fixed_length=None, size_format="i", parent_block=None): super().__init__(layout, identifier, start, size, fixed_length, size_format, parent_block=parent_block) self.header = None self.file = self.layout.file def get_protocol_and_version(self): """ Return a tuple useful to identify the kind of protocol that has generated a file during data acquisition. """ raise Exception("must be overloaded in a subclass") def get_user_file_info(self): """ Return a dictionary containing all user file info stored in the file. """ raise Exception("must be overloaded in a subclass") def get_sparsenoise_revcor(self): """ Return 'REVCOR' user file info. This method is common to :class:`ClassicFileInfo` and :class:`MultistimFileInfo` because the last one is able to store this kind of metadata. """ header = dict() header["n_div_x"] = read_from_char(self.file, "h") header["n_div_y"] = read_from_char(self.file, "h") header["gray_levels"] = read_from_char(self.file, "h") header["position_x"] = read_from_char(self.file, "ext") header["position_y"] = read_from_char(self.file, "ext") header["length"] = read_from_char(self.file, "ext") header["width"] = read_from_char(self.file, "ext") header["orientation"] = read_from_char(self.file, "ext") header["expansion"] = read_from_char(self.file, "h") header["scotoma"] = read_from_char(self.file, "h") header["seed"] = read_from_char(self.file, "h") # dt_on and dt_off may not exist in old revcor formats rollback = self.file.tell() header["dt_on"] = read_from_char(self.file, "ext") if header["dt_on"] is None: self.file.seek(rollback) rollback = self.file.tell() header["dt_off"] = read_from_char(self.file, "ext") if header["dt_off"] is None: self.file.seek(rollback) return header class ClassicFileInfo(FileInfoBlock): """ Extract user file info stored into an Elphy file corresponding to sparse noise (revcor), moving bar and flashbar protocols. """ def detect_protocol_from_name(self, path): pattern = r"\d{4}(\d+|\D)\D" codes = {"r": "sparsenoise", "o": "movingbar", "f": "flashbar", "m": "multistim"} # here just for assertion filename = path.split(path)[1] match = re.search(pattern, path) if hasattr(match, "end"): code = codes.get(path[match.end() - 1].lower(), None) if code == "m": raise ValueError("multistim file detected") return code elif "spt" in filename.lower(): return "spontaneousactivity" else: return None def get_protocol_and_version(self): if self.layout and self.layout.info_block: self.file.seek(self.layout.info_block.data_offset) version = self.get_title() if version in ["REVCOR1", "REVCOR2", "REVCOR + PAIRING"]: name = "sparsenoise" elif version in ["BARFLASH"]: name = "flashbar" elif version in ["ORISTIM", "ORISTM", "ORISTM1", "ORITUN"]: name = "movingbar" else: name = self.detect_protocol_from_name(self.file.name) self.file.seek(0) return name, version return None, None def get_title(self): title_length, title = struct.unpack("= 2: name = None version = None else: if center == 2: name = "sparsenoise" elif center == 3: name = "densenoise" elif center == 4: name = "densenoise" elif center == 5: name = "grating" else: name = None version = None self.file.seek(0) return name, version return None, None def get_title(self): title_length = read_from_char(self.file, "B") (title,) = struct.unpack(f"<{title_length}s", self.file.read(title_length)) if hasattr(title, "decode"): title = title.decode() self.file.seek(self.file.tell() + 255 - title_length) return title def get_user_file_info(self): header = dict() if self.layout and self.layout.info_block: # go to the info_block sub_block = self.layout.info_block self.file.seek(sub_block.data_offset) # get the first four parameters acqLGN = read_from_char(self.file, "i") center = read_from_char(self.file, "i") surround = read_from_char(self.file, "i") # store info in the header header["acqLGN"] = acqLGN header["center"] = center header["surround"] = surround if not (header["surround"] >= 2): header.update(self.get_center_header(center)) self.file.seek(0) return header def get_center_header(self, code): # get file info corresponding # to the executed protocol # for the center first ... if code == 0: return self.get_sparsenoise_revcor() elif code == 2: return self.get_sparsenoise_center() elif code == 3: return self.get_densenoise_center(True) elif code == 4: return self.get_densenoise_center(False) elif code == 5: return dict() # return self.get_grating_center() else: return dict() def get_surround_header(self, code): # then the surround if code == 2: return self.get_sparsenoise_surround() elif code == 3: return self.get_densenoise_surround(True) elif code == 4: return self.get_densenoise_surround(False) elif code == 5: raise NotImplementedError() return self.get_grating_center() else: return dict() def get_center_surround(self, center, surround): header = dict() header["stim_center"] = self.get_center_header(center) header["stim_surround"] = self.get_surround_header(surround) return header def get_sparsenoise_center(self): header = dict() header["title"] = self.get_title() header["number_of_sequences"] = read_from_char(self.file, "i") header["pretrigger_duration"] = read_from_char(self.file, "ext") header["n_div_x"] = read_from_char(self.file, "h") header["n_div_y"] = read_from_char(self.file, "h") header["gray_levels"] = read_from_char(self.file, "h") header["position_x"] = read_from_char(self.file, "ext") header["position_y"] = read_from_char(self.file, "ext") header["length"] = read_from_char(self.file, "ext") header["width"] = read_from_char(self.file, "ext") header["orientation"] = read_from_char(self.file, "ext") header["expansion"] = read_from_char(self.file, "h") header["scotoma"] = read_from_char(self.file, "h") header["seed"] = read_from_char(self.file, "h") header["luminance_1"] = read_from_char(self.file, "ext") header["luminance_2"] = read_from_char(self.file, "ext") header["dt_count"] = read_from_char(self.file, "i") dt_array = list() for _ in range(0, header["dt_count"]): dt_array.append(read_from_char(self.file, "ext")) header["dt_on"] = dt_array if dt_array else None header["dt_off"] = read_from_char(self.file, "ext") return header def get_sparsenoise_surround(self): header = dict() header["title_surround"] = self.get_title() header["gap"] = read_from_char(self.file, "ext") header["n_div_x"] = read_from_char(self.file, "h") header["n_div_y"] = read_from_char(self.file, "h") header["gray_levels"] = read_from_char(self.file, "h") header["expansion"] = read_from_char(self.file, "h") header["scotoma"] = read_from_char(self.file, "h") header["seed"] = read_from_char(self.file, "h") header["luminance_1"] = read_from_char(self.file, "ext") header["luminance_2"] = read_from_char(self.file, "ext") header["dt_on"] = read_from_char(self.file, "ext") header["dt_off"] = read_from_char(self.file, "ext") return header def get_densenoise_center(self, is_binary): header = dict() header["stimulus_type"] = "B" if is_binary else "T" header["title"] = self.get_title() _tmp = read_from_char(self.file, "i") header["number_of_sequences"] = _tmp if _tmp < 0 else None rollback = self.file.tell() header["stimulus_duration"] = read_from_char(self.file, "ext") if header["stimulus_duration"] is None: self.file.seek(rollback) header["pretrigger_duration"] = read_from_char(self.file, "ext") header["n_div_x"] = read_from_char(self.file, "h") header["n_div_y"] = read_from_char(self.file, "h") header["position_x"] = read_from_char(self.file, "ext") header["position_y"] = read_from_char(self.file, "ext") header["length"] = read_from_char(self.file, "ext") header["width"] = read_from_char(self.file, "ext") header["orientation"] = read_from_char(self.file, "ext") header["expansion"] = read_from_char(self.file, "h") header["seed"] = read_from_char(self.file, "h") header["luminance_1"] = read_from_char(self.file, "ext") header["luminance_2"] = read_from_char(self.file, "ext") header["dt_on"] = read_from_char(self.file, "ext") header["dt_off"] = read_from_char(self.file, "ext") return header def get_densenoise_surround(self, is_binary): header = dict() header["title_surround"] = self.get_title() header["gap"] = read_from_char(self.file, "ext") header["n_div_x"] = read_from_char(self.file, "h") header["n_div_y"] = read_from_char(self.file, "h") header["expansion"] = read_from_char(self.file, "h") header["seed"] = read_from_char(self.file, "h") header["luminance_1"] = read_from_char(self.file, "ext") header["luminance_2"] = read_from_char(self.file, "ext") header["dt_on"] = read_from_char(self.file, "ext") header["dt_off"] = read_from_char(self.file, "ext") return header def get_grating_center(self): pass def get_grating_surround(self): pass class Header(ElphyBlock): """ A convenient subclass of :class:`Block` to store Elphy file header properties. NB : Subclassing this class is a convenient way to set the properties of the header using polymorphism rather than a conditional structure. """ def __init__(self, layout, identifier, size, fixed_length=None, size_format="i"): super().__init__(layout, identifier, 0, size, fixed_length, size_format) class Acquis1Header(Header): """ A subclass of :class:`Header` used to identify the 'ACQUIS1/GS/1991' format. Whereas more recent format, the header contains all data relative to episodes, channels and traces : ``n_channels`` : the number of acquisition channels. ``nbpt`` and ``nbptEx`` : parameters useful to compute the number of samples by episodes. ``tpData`` : the data format identifier used to compute sample size. ``x_unit`` : the x-coordinate unit for all channels in an episode. ``y_units`` : an array containing y-coordinate units for each channel in the episode. ``dX`` and ``X0`` : the scale factors necessary to retrieve the actual times relative to each sample in a channel. ``dY_ar`` and ``Y0_ar``: arrays of scale factors necessary to retrieve the actual values relative to samples. ``continuous`` : a boolean telling if the file has been acquired in continuous mode. ``preSeqI`` : the size in bytes of the data preceding raw data. ``postSeqI`` : the size in bytes of the data preceding raw data. ``dat_length`` : the length in bytes of the data in the file. ``sample_size`` : the size in bytes of a sample. ``n_samples`` : the number of samples. ``ep_size`` : the size in bytes of an episode. ``n_episodes`` : the number of recording sequences store in the file. NB : The size is read from the file, the identifier is a string containing 15 characters and the size is encoded as small integer. See file 'FicDefAc1.pas' to identify the parsed parameters. """ def __init__(self, layout): fileobj = layout.file super().__init__(layout, "ACQUIS1/GS/1991", 1024, 15, "h") # parse the header to store interesting data about episodes and channels fileobj.seek(18) # extract episode properties n_channels = read_from_char(fileobj, "B") if (n_channels < 1) or (n_channels > 16): raise ValueError(f"`n_channels` must be between 1 and 15. It is currently {n_channels}") nbpt = read_from_char(fileobj, "h") l_xu, x_unit = struct.unpack("= self.end: tagShift = 0 else: tagShift = read_from_char(layout.file, "B") # setup object properties self.n_channels = n_channels self.nbpt = nbpt self.tpData = tpData self.x_unit = xu[0:l_xu] self.dX = dX self.X0 = X0 self.y_units = y_units[0:n_channels] self.dY_ar = dY_ar[0:n_channels] self.Y0_ar = Y0_ar[0:n_channels] self.continuous = continuous if self.continuous: self.preSeqI = 0 self.postSeqI = 0 else: self.preSeqI = preSeqI self.postSeqI = postSeqI self.varEp = varEp self.withTags = withTags if not self.withTags: self.tagShift = 0 else: if tagShift == 0: self.tagShift = 4 else: self.tagShift = tagShift self.sample_size = type_dict[types[self.tpData]] self.dat_length = self.layout.file_size - self.layout.data_offset if self.continuous: if self.n_channels > 0: self.n_samples = self.dat_length / (self.n_channels * self.sample_size) else: self.n_samples = 0 else: self.n_samples = self.nbpt self.ep_size = self.preSeqI + self.postSeqI + self.n_samples * self.sample_size * self.n_channels self.n_episodes = self.dat_length / self.ep_size if (self.n_samples != 0) else 0 class DAC2GSEpisodeBlock(ElphyBlock): """ Subclass of :class:`Block` useful to store data corresponding to 'DAC2SEQ' blocks stored in the DAC2/GS/2000 format. ``n_channels`` : the number of acquisition channels. ``nbpt`` : the number of samples by episodes. ``tpData`` : the data format identifier used to compute the sample size. ``x_unit`` : the x-coordinate unit for all channels in an episode. ``y_units`` : an array containing y-coordinate units for each channel in the episode. ``dX`` and ``X0`` : the scale factors necessary to retrieve the actual times relative to each sample in a channel. ``dY_ar`` and ``Y0_ar``: arrays of scale factors necessary to retrieve the actual values relative to samples. ``postSeqI`` : the size in bytes of the data preceding raw data. NB : see file 'FdefDac2.pas' to identify the parsed parameters. """ def __init__(self, layout, identifier, start, size, fixed_length=None, size_format="i"): main = layout.main_block n_channels, nbpt, tpData, postSeqI = struct.unpack(" 0] for data_block in blocks: self.file.seek(data_block.start) raw = self.file.read(data_block.size)[0:expected_size] databytes = np.frombuffer(raw, dtype=dtype) chunks.append(databytes) # concatenate all chunks and return # the specified slice if len(chunks) > 0: databytes = np.concatenate(chunks) return databytes[start:end] else: return np.array([]) def reshape_bytes(self, databytes, reshape, datatypes, order="<"): """ Reshape a numpy array containing a set of databytes. """ if not datatypes and len(datatypes) == len(reshape): raise NeoReadWriteError("The `datatypes` are not well-defined") l_bytes = len(databytes) # create the mask for each shape shape_mask = list() for shape in reshape: for _ in np.arange(1, shape + 1): shape_mask.append(shape) # create a set of masks to extract data bit_masks = list() for shape in reshape: bit_mask = list() for value in shape_mask: bit = 1 if (value == shape) else 0 bit_mask.append(bit) bit_masks.append(np.array(bit_mask)) # extract data n_samples = l_bytes / np.sum(reshape) data = np.empty([len(reshape), n_samples], dtype=(int, int)) for index, bit_mask in enumerate(bit_masks): tmp = self.filter_bytes(databytes, bit_mask) tp = f"{order}{datatypes[index]}{reshape[index]}" data[index] = np.frombuffer(tmp, dtype=tp) return data.T def filter_bytes(self, databytes, bit_mask): """ Detect from a bit mask which bits to keep to recompose the signal. """ n_bytes = len(databytes) mask = np.ones(n_bytes, dtype=int) np.putmask(mask, mask, bit_mask) to_keep = np.where(mask > 0)[0] return databytes.take(to_keep) def load_channel_data(self, ep, ch): """ Return a numpy array containing the list of bytes corresponding to the specified episode and channel. """ # memorise the sample size and symbol sample_size = self.sample_size(ep, ch) sample_symbol = self.sample_symbol(ep, ch) # create a bit mask to define which # sample to keep from the file bit_mask = self.create_bit_mask(ep, ch) # load all bytes contained in an episode data_blocks = self.get_data_blocks(ep) databytes = self.load_bytes(data_blocks) raw = self.filter_bytes(databytes, bit_mask) # reshape bytes from the sample size dt = np.dtype(numpy_map[sample_symbol]) dt.newbyteorder("<") return np.frombuffer(raw.reshape([int(len(raw) / sample_size), sample_size]), dt) def apply_op(self, np_array, value, op_type): """ A convenient function to apply an operator over all elements of a numpy array. """ if op_type == "shift_right": return np_array >> value elif op_type == "shift_left": return np_array << value elif op_type == "mask": return np_array & value else: return np_array def get_tag_mask(self, tag_ch, tag_mode): """ Return a mask useful to retrieve bits that encode a tag channel. """ if tag_mode == 1: tag_mask = 0b01 if (tag_ch == 1) else 0b10 elif tag_mode in [2, 3]: ar_mask = np.zeros(16, dtype=int) ar_mask[tag_ch - 1] = 1 st = "0b" + "".join(np.array(np.flipud(ar_mask), dtype=str)) tag_mask = eval(st) return tag_mask def load_encoded_tags(self, ep, tag_ch): """ Return a numpy array containing bytes corresponding to the specified episode and channel. """ tag_mode = self.tag_mode(ep) tag_mask = self.get_tag_mask(tag_ch, tag_mode) if tag_mode in [1, 2]: # digidata or itc mode # available for all formats ch = self.get_channel_for_tags(ep) raw = self.load_channel_data(ep, ch) return self.apply_op(raw, tag_mask, "mask") elif tag_mode == 3: # cyber k mode # only available for DAC2 objects format # store bytes corresponding to the blocks # containing tags in a numpy array and reshape # it to have a set of tuples (time, value) ck_blocks = self.get_blocks_of_type(ep, "RCyberTag") databytes = self.load_bytes(ck_blocks) raw = self.reshape_bytes(databytes, reshape=(4, 2), datatypes=("u", "u"), order="<") # keep only items that are compatible # with the specified tag channel raw[:, 1] = self.apply_op(raw[:, 1], tag_mask, "mask") # computing numpy.diff is useful to know # how many times a value is maintained # and necessary to reconstruct the # compressed signal ... repeats = np.array(np.diff(raw[:, 0]), dtype=int) data = np.repeat(raw[:-1, 1], repeats, axis=0) # ... note that there is always # a transition at t=0 for synchronisation # purpose, consequently it is not necessary # to complete with zeros when the first # transition arrive ... return data def load_encoded_data(self, ep, ch): """ Get encoded value of raw data from the elphy file. """ tag_shift = self.tag_shift(ep) data = self.load_channel_data(ep, ch) if tag_shift: return self.apply_op(data, tag_shift, "shift_right") else: return data def get_signal_data(self, ep, ch): """ Return a numpy array containing all samples of a signal, acquired on an Elphy analog channel, formatted as a list of (time, value) tuples. """ # get data from the file y_data = self.load_encoded_data(ep, ch) x_data = np.arange(0, len(y_data)) # create a recarray data = np.recarray(len(y_data), dtype=[("x", b_float), ("y", b_float)]) # put in the recarray the scaled data x_factors = self.x_scale_factors(ep, ch) y_factors = self.y_scale_factors(ep, ch) data["x"] = x_factors.scale(x_data) data["y"] = y_factors.scale(y_data) return data def get_tag_data(self, ep, tag_ch): """ Return a numpy array containing all samples of a signal, acquired on an Elphy tag channel, formatted as a list of (time, value) tuples. """ # get data from the file y_data = self.load_encoded_tags(ep, tag_ch) x_data = np.arange(0, len(y_data)) # create a recarray data = np.recarray(len(y_data), dtype=[("x", b_float), ("y", b_int)]) # put in the recarray the scaled data factors = self.x_tag_scale_factors(ep) data["x"] = factors.scale(x_data) data["y"] = y_data return data class Acquis1Layout(ElphyLayout): """ A subclass of :class:`ElphyLayout` to know how the 'ACQUIS1/GS/1991' format is organised. Extends :class:`ElphyLayout` to store the offset used to retrieve directly raw data : ``data_offset`` : an offset to jump directly to the raw data. """ def __init__(self, fileobj, data_offset): super().__init__(fileobj) self.data_offset = data_offset self.data_blocks = None def get_blocks_end(self): return self.data_offset def is_continuous(self): return self.header.continuous def get_episode_blocks(self): raise NotImplementedError() def set_info_block(self): i_blks = self.get_blocks_of_type("USER INFO") if len(i_blks) >= 2: raise ValueError(f"There are too many info blocks: {i_blks}") if len(i_blks): self.info_block = i_blks[0] def set_data_blocks(self): data_blocks = list() size = self.header.n_samples * self.header.sample_size * self.header.n_channels for ep in range(0, self.header.n_episodes): start = self.data_offset + ep * self.header.ep_size + self.header.preSeqI data_blocks.append(DummyDataBlock(self, "Acquis1Data", start, size)) self.data_blocks = data_blocks def get_data_blocks(self, ep): return [self.data_blocks[ep - 1]] @property def n_episodes(self): return self.header.n_episodes def n_channels(self, episode): return self.header.n_channels def n_tags(self, episode): return 0 def tag_mode(self, ep): return 0 def tag_shift(self, ep): return 0 def get_channel_for_tags(self, ep): return None @property def no_analog_data(self): return True if (self.n_episodes == 0) else self.header.no_analog_data def sample_type(self, ep, ch): return self.header.tpData def sampling_period(self, ep, ch): return self.header.dX def n_samples(self, ep, ch): return self.header.n_samples def x_tag_scale_factors(self, ep): return ElphyScaleFactor(self.header.dX, self.header.X0) def x_scale_factors(self, ep, ch): return ElphyScaleFactor(self.header.dX, self.header.X0) def y_scale_factors(self, ep, ch): dY = self.header.dY_ar[ch - 1] Y0 = self.header.Y0_ar[ch - 1] # TODO: see why this kind of exception exists if dY is None or Y0 is None: raise Exception(f"bad Y-scale factors for episode {ep} channel {ch}") return ElphyScaleFactor(dY, Y0) def x_unit(self, ep, ch): return self.header.x_unit def y_unit(self, ep, ch): return self.header.y_units[ch - 1] @property def ep_size(self): return self.header.ep_size @property def file_duration(self): return self.header.dX * self.n_samples def get_tag(self, episode, tag_channel): return None def create_channel_mask(self, ep): return np.arange(1, self.header.n_channels + 1) class DAC2GSLayout(ElphyLayout): """ A subclass of :class:`ElphyLayout` to know how the 'DAC2 / GS / 2000' format is organised. Extends :class:`ElphyLayout` to store the offset used to retrieve directly raw data : ``data_offset`` : an offset to jump directly after the 'MAIN' block where 'DAC2SEQ' blocks start. ``main_block```: a shortcut to access 'MAIN' block. ``episode_blocks`` : a shortcut to access blocks corresponding to episodes. """ def __init__(self, fileobj, data_offset): super().__init__(fileobj) self.data_offset = data_offset self.main_block = None self.episode_blocks = None def get_blocks_end(self): return self.file_size # data_offset def is_continuous(self): main_block = self.main_block return main_block.continuous if main_block else False def get_episode_blocks(self): raise NotImplementedError() def set_main_block(self): main_block = self.get_blocks_of_type("MAIN") self.main_block = main_block[0] if main_block else None def set_episode_blocks(self): ep_blocks = self.get_blocks_of_type("DAC2SEQ") self.episode_blocks = ep_blocks if ep_blocks else None def set_info_block(self): i_blks = self.get_blocks_of_type("USER INFO") if len(i_blks) >= 2: raise ValueError(f"There are too many info blocks: {i_blks}") if len(i_blks): self.info_block = i_blks[0] def set_data_blocks(self): data_blocks = list() identifier = "DAC2GSData" size = self.main_block.n_samples * self.main_block.sample_size * self.main_block.n_channels if not self.is_continuous(): blocks = self.get_blocks_of_type("DAC2SEQ") for block in blocks: start = block.start + self.main_block.preSeqI data_blocks.append(DummyDataBlock(self, identifier, start, size)) else: start = self.blocks[-1].end + 1 + self.main_block.preSeqI data_blocks.append(DummyDataBlock(self, identifier, start, size)) self.data_blocks = data_blocks def get_data_blocks(self, ep): return [self.data_blocks[ep - 1]] def episode_block(self, ep): return self.main_block if self.is_continuous() else self.episode_blocks[ep - 1] def tag_mode(self, ep): return 1 if self.main_block.withTags else 0 def tag_shift(self, ep): return self.main_block.tagShift def get_channel_for_tags(self, ep): return 1 def sample_type(self, ep, ch): return self.main_block.tpData def sample_size(self, ep, ch): size = super().sample_size(ep, ch) if size != 2: raise ValueError(f"sample size is always 2 bytes for DAC2/GS/2000 format, but size is calculated as {size}") return size def sampling_period(self, ep, ch): block = self.episode_block(ep) return block.dX def x_tag_scale_factors(self, ep): block = self.episode_block(ep) return ElphyScaleFactor( block.dX, block.X0, ) def x_scale_factors(self, ep, ch): block = self.episode_block(ep) return ElphyScaleFactor( block.dX, block.X0, ) def y_scale_factors(self, ep, ch): block = self.episode_block(ep) return ElphyScaleFactor(block.dY_ar[ch - 1], block.Y0_ar[ch - 1]) def x_unit(self, ep, ch): block = self.episode_block(ep) return block.x_unit def y_unit(self, ep, ch): block = self.episode_block(ep) return block.y_units[ch - 1] def n_samples(self, ep, ch): return self.main_block.n_samples def ep_size(self, ep): return self.main_block.ep_size @property def n_episodes(self): return self.main_block.n_episodes def n_channels(self, episode): return self.main_block.n_channels def n_tags(self, episode): return 2 if self.main_block.withTags else 0 @property def file_duration(self): return self.main_block.dX * self.n_samples def get_tag(self, episode, tag_channel): if episode not in range(1, self.n_episodes + 1): raise ValueError(f"`episode` must be within {range(1 + self.n_episodes + 1)} and is {episode}") # there are none or 2 tag channels if self.tag_mode(episode) == 1: if tag_channel not in range(1, 3): raise ValueError("DAC2/GS/2000 format support only 2 tag channels") block = self.episode_block(episode) t_stop = self.main_block.n_samples * block.dX return ElphyTag(self, episode, tag_channel, block.x_unit, 1.0 / block.dX, 0, t_stop) else: return None def n_tag_samples(self, ep, tag_channel): return self.main_block.n_samples def get_tag_data(self, episode, tag_channel): # memorise some useful properties block = self.episode_block(episode) sample_size = self.sample_size(episode, tag_channel) sample_symbol = self.sample_symbol(episode, tag_channel) # create a bit mask to define which # sample to keep from the file channel_mask = self.create_channel_mask(episode) bit_mask = self.create_bit_mask(channel_mask, 1) # get bytes from the file data_block = self.data_blocks[episode - 1] n_bytes = data_block.size self.file.seek(data_block.start) databytes = np.frombuffer(self.file.read(n_bytes), " 0)[0] raw = databytes.take(to_keep) raw = raw.reshape([len(raw) / sample_size, sample_size]) # create a recarray containing data dt = np.dtype(numpy_map[sample_symbol]) dt.newbyteorder("<") tag_mask = 0b01 if (tag_channel == 1) else 0b10 y_data = np.frombuffer(raw, dt) & tag_mask x_data = np.arange(0, len(y_data)) * block.dX + block.X0 data = np.recarray(len(y_data), dtype=[("x", b_float), ("y", b_int)]) data["x"] = x_data data["y"] = y_data return data def create_channel_mask(self, ep): return np.arange(1, self.main_block.n_channels + 1) class DAC2Layout(ElphyLayout): """ A subclass of :class:`ElphyLayout` to know how the Elphy format is organised. Whereas other formats storing raw data at the end of the file, 'DAC2 objects' format spreads them over multiple blocks : ``episode_blocks`` : a shortcut to access blocks corresponding to episodes. """ def __init__(self, fileobj): super().__init__(fileobj) self.episode_blocks = None def get_blocks_end(self): return self.file_size def is_continuous(self): ep_blocks = [k for k in self.blocks if k.identifier.startswith("B_Ep")] if ep_blocks: ep_block = ep_blocks[0] ep_sub_block = ep_block.sub_blocks[0] return ep_sub_block.continuous else: return False def set_episode_blocks(self): self.episode_blocks = [k for k in self.blocks if str(k.identifier).startswith("B_Ep")] def set_info_block(self): # in fact the file info are contained into a single sub-block with an USR identifier i_blks = self.get_blocks_of_type("B_Finfo") if len(i_blks) >= 2: raise ValueError(f"There are too many info blocks: {i_blks}") if len(i_blks): i_blk = i_blks[0] sub_blocks = i_blk.sub_blocks if len(sub_blocks): self.info_block = sub_blocks[0] def set_data_blocks(self): data_blocks = list() blocks = self.get_blocks_of_type("RDATA") for block in blocks: start = block.data_start size = block.end + 1 - start data_blocks.append(DummyDataBlock(self, "RDATA", start, size)) self.data_blocks = data_blocks def get_data_blocks(self, ep): return self.group_blocks_of_type(ep, "RDATA") def group_blocks_of_type(self, ep, identifier): ep_blocks = list() blocks = [k for k in self.get_blocks_stored_in_episode(ep) if k.identifier == identifier] for block in blocks: start = block.data_start size = block.end + 1 - start ep_blocks.append(DummyDataBlock(self, identifier, start, size)) return ep_blocks def get_blocks_stored_in_episode(self, ep): data_blocks = [k for k in self.blocks if k.identifier == "RDATA"] n_ep = self.n_episodes blk_1 = self.episode_block(ep) blk_2 = self.episode_block((ep + 1) % n_ep) i_1 = self.blocks.index(blk_1) i_2 = self.blocks.index(blk_2) if (blk_1 == blk_2) or (i_2 < i_1): return [k for k in data_blocks if self.blocks.index(k) > i_1] else: return [k for k in data_blocks if self.blocks.index(k) in range(i_1, i_2)] def set_cyberk_blocks(self): ck_blocks = list() blocks = self.get_blocks_of_type("RCyberTag") for block in blocks: start = block.data_start size = block.end + 1 - start ck_blocks.append(DummyDataBlock(self, "RCyberTag", start, size)) self.ck_blocks = ck_blocks def episode_block(self, ep): return self.episode_blocks[ep - 1] @property def n_episodes(self): return len(self.episode_blocks) def analog_index(self, episode): """ Return indices relative to channels used for analog signals. """ block = self.episode_block(episode) tag_mode = block.ep_block.tag_mode an_index = np.where(np.array(block.ks_block.k_sampling) > 0) if tag_mode == 2: an_index = an_index[:-1] return an_index def n_channels(self, episode): """ Return the number of channels used for analog signals but also events. NB : in Elphy this 2 kinds of channels are not differenciated. """ block = self.episode_block(episode) tag_mode = block.ep_block.tag_mode n_channels = len(block.ks_block.k_sampling) return n_channels if tag_mode != 2 else n_channels - 1 def n_tags(self, episode): block = self.episode_block(episode) tag_mode = block.ep_block.tag_mode tag_map = {0: 0, 1: 2, 2: 16, 3: 16} return tag_map.get(tag_mode, 0) def n_events(self, episode): """ Return the number of channels dedicated to events. """ block = self.episode_block(episode) return block.ks_block.k_sampling.count(0) def n_spiketrains(self, episode): spk_blocks = [k for k in self.blocks if k.identifier == "RSPK"] return spk_blocks[0].n_evt_channels if spk_blocks else 0 def sub_sampling(self, ep, ch): """ Return the sub-sampling factor for the specified episode and channel. """ block = self.episode_block(ep) return block.ks_block.k_sampling[ch - 1] if block.ks_block else 1 def aggregate_size(self, block, ep): ag_size = 0 for ch in range(1, len(block.ks_block.k_sampling)): if block.ks_block.k_sampling[ch - 1] != 0: ag_size += self.sample_size(ep, ch) return ag_size def n_samples(self, ep, ch): block = self.episode_block(ep) if not block.ep_block.continuous: return block.ep_block.nbpt / self.sub_sampling(ep, ch) else: # for continuous case there isn't any place # in the file that contains the number of # samples unlike the episode case ... data_blocks = self.get_data_blocks(ep) total_size = np.sum([k.size for k in data_blocks]) # count the number of samples in an # aggregate and compute its size in order # to determine the size of an aggregate ag_count = self.aggregate_sample_count(block) ag_size = self.aggregate_size(block, ep) n_ag = total_size / ag_size # the number of samples is equal # to the number of aggregates ... n_samples = n_ag n_chunks = total_size % ag_size # ... but not when there exists # a incomplete aggregate at the # end of the file, consequently # the preeceeding computed number # of samples must be incremented # by one only if the channel map # to a sample in the last aggregate # ... maybe this last part should be # deleted because the n_chunks is always # null in continuous mode if n_chunks: last_ag_size = total_size - n_ag * ag_count size = 0 for i in range(0, ch): size += self.sample_size(ep, i + 1) if size <= last_ag_size: n_samples += 1 return n_samples def sample_type(self, ep, ch): block = self.episode_block(ep) return block.kt_block.k_types[ch - 1] if block.kt_block else block.ep_block.tpData def sampling_period(self, ep, ch): block = self.episode_block(ep) return block.ep_block.dX * self.sub_sampling(ep, ch) def x_tag_scale_factors(self, ep): block = self.episode_block(ep) return ElphyScaleFactor(block.ep_block.dX, block.ep_block.X0) def x_scale_factors(self, ep, ch): block = self.episode_block(ep) return ElphyScaleFactor( block.ep_block.dX * block.ks_block.k_sampling[ch - 1], block.ep_block.X0, ) def y_scale_factors(self, ep, ch): block = self.episode_block(ep) return ElphyScaleFactor(block.ch_block.dY_ar[ch - 1], block.ch_block.Y0_ar[ch - 1]) def x_unit(self, ep, ch): block = self.episode_block(ep) return block.ep_block.x_unit def y_unit(self, ep, ch): block = self.episode_block(ep) return block.ch_block.y_units[ch - 1] def tag_mode(self, ep): block = self.episode_block(ep) return block.ep_block.tag_mode def tag_shift(self, ep): block = self.episode_block(ep) return block.ep_block.tag_shift def get_channel_for_tags(self, ep): block = self.episode_block(ep) tag_mode = self.tag_mode(ep) if tag_mode == 1: ks = np.array(block.ks_block.k_sampling) mins = np.where(ks == ks.min())[0] + 1 return mins[0] elif tag_mode == 2: return block.ep_block.n_channels else: return None def aggregate_sample_count(self, block): """ Return the number of sample in an aggregate. """ # compute the least common multiple # for channels having block.ks_block.k_sampling[ch] > 0 lcm0 = 1 for i in range(0, block.ep_block.n_channels): if block.ks_block.k_sampling[i] > 0: lcm0 = least_common_multiple(lcm0, block.ks_block.k_sampling[i]) # sum quotients lcm / KSampling count = 0 for i in range(0, block.ep_block.n_channels): if block.ks_block.k_sampling[i] > 0: count += int(lcm0 / block.ks_block.k_sampling[i]) return count def create_channel_mask(self, ep): """ Return the minimal pattern of channel numbers representing the succession of channels in the multiplexed data. It is useful to do the mapping between a sample stored in the file and its relative channel. NB : This function has been converted from the 'TseqBlock.BuildMask' method of the file 'ElphyFormat.pas' stored in Elphy source code. """ block = self.episode_block(ep) ag_count = self.aggregate_sample_count(block) mask_ar = np.zeros(ag_count, dtype="i") ag_size = 0 i = 0 k = 0 while k < ag_count: for j in range(0, block.ep_block.n_channels): if (block.ks_block.k_sampling[j] != 0) and (i % block.ks_block.k_sampling[j] == 0): mask_ar[k] = j + 1 ag_size += self.sample_size(ep, j + 1) k += 1 if k >= ag_count: break i += 1 return mask_ar def get_signal(self, episode, channel): block = self.episode_block(episode) k_sampling = np.array(block.ks_block.k_sampling) evt_channels = np.where(k_sampling == 0)[0] if channel not in evt_channels: return super().get_signal(episode, channel) else: k_sampling[channel - 1] = -1 return self.get_event(episode, channel, k_sampling) def get_tag(self, episode, tag_channel): """ Return a :class:`ElphyTag` which is a descriptor of the specified event channel. """ if episode not in range(1, self.n_episodes + 1): raise ValueError(f"`episode` must be in {range(1, self.n_episodes + 1)} and is {episode}") # there are none, 2 or 16 tag # channels depending on tag_mode tag_mode = self.tag_mode(episode) if tag_mode: block = self.episode_block(episode) x_unit = block.ep_block.x_unit # verify the validity of the tag channel if tag_mode == 1: if tag_channel not in range(1, 3): raise ValueError("Elphy format support only 2 tag channels for tag_mode == 1") elif tag_mode == 2 or tag_mode == 3: if tag_channel not in range(1, 17): raise ValueError("Elphy format support only 16 tag channels for tag_mode == 2 or tag_mode == 3") smp_period = block.ep_block.dX smp_freq = 1.0 / smp_period if tag_mode != 3: ch = self.get_channel_for_tags(episode) n_samples = self.n_samples(episode, ch) t_stop = (n_samples - 1) * smp_freq else: # get the max of n_samples multiplied by the sampling # period done on every analog channels in order to avoid # the selection of a channel without concrete signals t_max = list() for ch in self.analog_index(episode): n_samples = self.n_samples(episode, ch) factors = self.x_scale_factors(episode, ch) chtime = n_samples * factors.delta t_max.append(chtime) time_max = max(t_max) # as (n_samples_tag - 1) * dX_tag # and time_max = n_sample_tag * dX_tag # it comes the following duration t_stop = time_max - smp_period return ElphyTag(self, episode, tag_channel, x_unit, smp_freq, 0, t_stop) else: return None def get_event(self, ep, ch, marked_ks): """ Return a :class:`ElphyEvent` which is a descriptor of the specified event channel. """ if ep not in range(1, self.n_episodes + 1): raise ValueError(f"`ep` must be in {range(1, self.n_episodes + 1)}, but is {ep}") if ch not in range(1, self.n_channels + 1): raise ValueError(f"`ch` must be in {range(1, self.n_channels + 1)}, but is {ch}") # find the event channel number evt_channel = np.where(marked_ks == -1)[0][0] if evt_channel not in range(1, self.n_events(ep) + 1): raise ValueError(f"`evt_channel` must be in {range(1, self.n_events(ep) + 1)}, but is {evt_channel}") block = self.episode_block(ep) ep_blocks = self.get_blocks_stored_in_episode(ep) evt_blocks = [k for k in ep_blocks if k.identifier == "REVT"] n_events = np.sum([k.n_events[evt_channel - 1] for k in evt_blocks], dtype=int) x_unit = block.ep_block.x_unit return ElphyEvent(self, ep, evt_channel, x_unit, n_events, ch_number=ch) def load_encoded_events(self, episode, evt_channel, identifier): """ Return times stored as a 4-bytes integer in the specified event channel. """ data_blocks = self.group_blocks_of_type(episode, identifier) ep_blocks = self.get_blocks_stored_in_episode(episode) evt_blocks = [k for k in ep_blocks if k.identifier == identifier] # compute events on each channel n_events = np.sum([k.n_events for k in evt_blocks], dtype=int, axis=0) pre_events = np.sum(n_events[0 : evt_channel - 1], dtype=int) start = pre_events end = start + n_events[evt_channel - 1] expected_size = 4 * np.sum(n_events, dtype=int) return self.load_bytes(data_blocks, dtype=" 0: name = names[episode - 1] start = name.size + 1 - name.data_size + 1 end = name.end - name.start + 1 chars = self.load_bytes([name], dtype="uint8", start=start, end=end, expected_size=name.size).tolist() # print "chars[%s:%s]: %s" % (start,end,chars) episode_name = "".join([chr(k) for k in chars]) return episode_name def get_event_data(self, episode, evt_channel): """ Return times contained in the specified event channel. This function is triggered when the 'times' property of an :class:`ElphyEvent` descriptor instance is accessed. """ times = self.load_encoded_events(episode, evt_channel, "REVT") block = self.episode_block(episode) return times * block.ep_block.dX / len(block.ks_block.k_sampling) def get_spiketrain(self, episode, electrode_id): """ Return a :class:`Spike` which is a descriptor of the specified spike channel. """ if episode not in range(1, self.n_episodes + 1): raise ValueError(f"`episode` must be in {range(1, self.n_episodes + 1)}, but is {episode}") if electrode_id not in range(1, self.n_spiketrains(episode) + 1): raise ValueError( f"`eletrodee_id` must be in {range(1, self.n_spiketrains(episode)+1)}, but is {electrode_id}" ) # get some properties stored in the episode sub-block block = self.episode_block(episode) x_unit = block.ep_block.x_unit x_unit_wf = getattr(block.ep_block, "x_unit_wf", None) y_unit_wf = getattr(block.ep_block, "y_unit_wf", None) # number of spikes in the entire episode spk_blocks = [k for k in self.blocks if k.identifier == "RSPK"] n_events = np.sum([k.n_events[electrode_id - 1] for k in spk_blocks], dtype=int) # number of samples in a waveform wf_sampling_frequency = 1.0 / block.ep_block.dX wf_blocks = [k for k in self.blocks if k.identifier == "RspkWave"] if wf_blocks: wf_samples = wf_blocks[0].wavelength t_start = wf_blocks[0].pre_trigger * block.ep_block.dX else: wf_samples = 0 t_start = 0 return ElphySpikeTrain( self, episode, electrode_id, x_unit, n_events, wf_sampling_frequency, wf_samples, x_unit_wf, y_unit_wf, t_start, ) def get_spiketrain_data(self, episode, electrode_id): """ Return times contained in the specified spike channel. This function is triggered when the 'times' property of an :class:`Spike` descriptor instance is accessed. NB : The 'RSPK' block is not actually identical to the 'EVT' one, because all units relative to a time are stored directly after all event times, 1 byte for each. This function doesn't return these units. But, they could be retrieved from the 'RspkWave' block with the 'get_waveform_data function' """ block = self.episode_block(episode) times = self.load_encoded_spikes(episode, electrode_id, "RSPK") return times * block.ep_block.dX def load_encoded_waveforms(self, episode, electrode_id): """ Return times on which waveforms are defined and a numpy recarray containing all the data stored in the RspkWave block. """ # load data corresponding to the RspkWave block identifier = "RspkWave" data_blocks = self.group_blocks_of_type(episode, identifier) databytes = self.load_bytes(data_blocks) # select only data corresponding # to the specified spk_channel ep_blocks = self.get_blocks_stored_in_episode(episode) wf_blocks = [k for k in ep_blocks if k.identifier == identifier] wf_samples = wf_blocks[0].wavelength events = np.sum([k.n_spikes for k in wf_blocks], dtype=int, axis=0) n_events = events[electrode_id - 1] pre_events = np.sum(events[0 : electrode_id - 1], dtype=int) start = pre_events end = start + n_events # data must be reshaped before dtype = [ # the time of the spike arrival ("elphy_time", "u4", (1,)), ("device_time", "u4", (1,)), # the identifier of the electrode # would also be the 'trodalness' # but this tetrode devices are not # implemented in Elphy ("channel_id", "u2", (1,)), # the 'category' of the waveform ("unit_id", "u1", (1,)), # do not used ("dummy", "u1", (13,)), # samples of the waveform ("waveform", "i2", (wf_samples,)), ] x_start = wf_blocks[0].pre_trigger x_stop = wf_samples - x_start return np.arange(-x_start, x_stop), np.frombuffer(databytes, dtype=dtype)[start:end] def get_waveform_data(self, episode, electrode_id): """ Return waveforms corresponding to the specified spike channel. This function is triggered when the ``waveforms`` property of an :class:`Spike` descriptor instance is accessed. """ block = self.episode_block(episode) times, databytes = self.load_encoded_waveforms(episode, electrode_id) (n_events,) = databytes.shape wf_samples = databytes["waveform"].shape[1] dtype = [("time", float), ("electrode_id", int), ("unit_id", int), ("waveform", float, (wf_samples, 2))] data = np.empty(n_events, dtype=dtype) data["electrode_id"] = databytes["channel_id"][:, 0] data["unit_id"] = databytes["unit_id"][:, 0] data["time"] = databytes["elphy_time"][:, 0] * block.ep_block.dX data["waveform"][:, :, 0] = times * block.ep_block.dX data["waveform"][:, :, 1] = databytes["waveform"] * block.ep_block.dY_wf + block.ep_block.Y0_wf return data def get_rspk_data(self, spk_channel): """ Return times stored as a 4-bytes integer in the specified event channel. """ evt_blocks = self.get_blocks_of_type("RSPK") # compute events on each channel n_events = np.sum([k.n_events for k in evt_blocks], dtype=int, axis=0) # sum of array values up to spk_channel-1!!!! pre_events = np.sum(n_events[0:spk_channel], dtype=int) start = pre_events + (7 + len(n_events)) # rspk header end = start + n_events[spk_channel] expected_size = 4 * np.sum(n_events, dtype=int) # constant return self.load_bytes(evt_blocks, dtype="= layout.data_offset)): block = self.factory.create_block(layout, offset) # create the sub blocks if it is DAC2 objects format # this is only done for B_Ep and B_Finfo blocks for # DAC2 objects format, maybe it could be useful to # spread this to other block types. # if isinstance(header, DAC2Header) and (block.identifier in ['B_Ep']) : if isinstance(header, DAC2Header) and (block.identifier in ["B_Ep", "B_Finfo"]): sub_offset = block.data_offset while sub_offset < block.start + block.size: sub_block = self.factory.create_sub_block(block, sub_offset) block.add_sub_block(sub_block) sub_offset += sub_block.size # set up some properties of some DAC2Layout sub-blocks if isinstance(sub_block, (DAC2EpSubBlock, DAC2AdcSubBlock, DAC2KSampSubBlock, DAC2KTypeSubBlock)): block.set_episode_block() block.set_channel_block() block.set_sub_sampling_block() block.set_sample_size_block() # SpikeTrain # if isinstance(header, DAC2Header) and (block.identifier in ['RSPK']) : # print "\nElphyFile.create_layout() - RSPK" # print "ElphyFile.create_layout() - n_events",block.n_events # print "ElphyFile.create_layout() - n_evt_channels",block.n_evt_channels layout.add_block(block) offset += block.size # set up as soon as possible the shortcut # to the main block of a DAC2GSLayout if not detect_main and isinstance(layout, DAC2GSLayout) and isinstance(block, DAC2GSMainBlock): layout.set_main_block() detect_main = True # detect if the file is continuous when # the 'MAIN' block has been parsed if not detect_continuous: is_continuous = isinstance(header, DAC2GSHeader) and layout.is_continuous() # set up the shortcut to blocks corresponding # to episodes, only available for DAC2Layout # and also DAC2GSLayout if not continuous if isinstance(layout, DAC2Layout) or (isinstance(layout, DAC2GSLayout) and not layout.is_continuous()): layout.set_episode_blocks() layout.set_data_blocks() # finally set up the user info block of the layout layout.set_info_block() self.file.seek(0) return layout def is_continuous(self): return self.layout.is_continuous() @property def n_episodes(self): """ Return the number of recording sequences. """ return self.layout.n_episodes def n_channels(self, episode): """ Return the number of recording channels involved in data acquisition and relative to the specified episode : ``episode`` : the recording sequence identifier. """ return self.layout.n_channels(episode) def n_tags(self, episode): """ Return the number of tag channels relative to the specified episode : ``episode`` : the recording sequence identifier. """ return self.layout.n_tags(episode) def n_events(self, episode): """ Return the number of event channels relative to the specified episode : ``episode`` : the recording sequence identifier. """ return self.layout.n_events(episode) def n_spiketrains(self, episode): """ Return the number of event channels relative to the specified episode : ``episode`` : the recording sequence identifier. """ return self.layout.n_spiketrains(episode) def n_waveforms(self, episode): """ Return the number of waveform channels : """ return self.layout.n_waveforms(episode) def get_signal(self, episode, channel): """ Return the signal or event descriptor relative to the specified episode and channel : ``episode`` : the recording sequence identifier. ``channel`` : the analog channel identifier. NB : For 'DAC2 objects' format, it could be also used to retrieve events. """ return self.layout.get_signal(episode, channel) def get_tag(self, episode, tag_channel): """ Return the tag descriptor relative to the specified episode and tag channel : ``episode`` : the recording sequence identifier. ``tag_channel`` : the tag channel identifier. NB : There isn't any tag channels for 'Acquis1' format. ElphyTag channels appeared after 'DAC2/GS/2000' release. They are also present in 'DAC2 objects' format. """ return self.layout.get_tag(episode, tag_channel) def get_event(self, episode, evt_channel): """ Return the event relative the specified episode and event channel. `episode`` : the recording sequence identifier. ``tag_channel`` : the tag channel identifier. """ return self.layout.get_event(episode, evt_channel) def get_spiketrain(self, episode, electrode_id): """ Return the spiketrain relative to the specified episode and electrode_id. ``episode`` : the recording sequence identifier. ``electrode_id`` : the identifier of the electrode providing the spiketrain. NB : Available only for 'DAC2 objects' format. This descriptor can return the times of a spiketrain and waveforms relative to each of these times. """ return self.layout.get_spiketrain(episode, electrode_id) @property def comments(self): raise NotImplementedError() def get_user_file_info(self): """ Return user defined file metadata. """ if not self.layout.info_block: return dict() else: return self.layout.info_block.get_user_file_info() @property def episode_info(self, ep_number): raise NotImplementedError() def get_signals(self): """ Get all available analog or event channels stored into an Elphy file. """ signals = list() for ep in range(1, self.n_episodes + 1): for ch in range(1, self.n_channels(ep) + 1): signal = self.get_signal(ep, ch) signals.append(signal) return signals def get_tags(self): """ Get all available tag channels stored into an Elphy file. """ tags = list() for ep in range(1, self.n_episodes + 1): for tg in range(1, self.n_tags(ep) + 1): tag = self.get_tag(ep, tg) tags.append(tag) return tags def get_spiketrains(self): """ Get all available spiketrains stored into an Elphy file. """ spiketrains = list() for ep in range(1, self.n_episodes + 1): for ch in range(1, self.n_spiketrains(ep) + 1): spiketrain = self.get_spiketrain(ep, ch) spiketrains.append(spiketrain) return spiketrains def get_rspk_spiketrains(self): """ Get all available spiketrains stored into an Elphy file. """ spiketrains = list() spk_blocks = self.layout.get_blocks_of_type("RSPK") for bl in spk_blocks: # print "ElphyFile.get_spiketrains() - identifier:",bl.identifier for ch in range(0, bl.n_evt_channels): spiketrain = self.layout.get_rspk_data(ch) spiketrains.append(spiketrain) return spiketrains def get_names(self): com_blocks = list() com_blocks = self.layout.get_blocks_of_type("COM") return com_blocks # -------------------------------------------------------- class ElphyIO(BaseIO): """ Class for reading from and writing to an Elphy file. It enables reading: - :class:`Block` - :class:`Segment` - :class:`Event` - :class:`SpikeTrain` Usage: >>> from neo import io >>> r = io.ElphyIO(filename='ElphyExample.DAT') >>> seg = r.read_block() >>> print(seg.analogsignals) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE >>> print(seg.spiketrains) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE >>> print(seg.events) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE >>> print(anasig._data_description) >>> anasig = r.read_analogsignal() >>> bl = Block() >>> # creating segments, their contents and append to bl >>> r.write_block( bl ) """ is_readable = True # This class can read data is_writable = False # This class can write data # This class is able to directly or indirectly handle the following objects supported_objects = [Block, Segment, AnalogSignal, SpikeTrain] # This class can return a Block readable_objects = [Block] # This class is not able to write objects writeable_objects = [] has_header = False is_streameable = False # This is for GUI stuff : a definition for parameters when reading. # This dict should be keyed by object (`Block`). Each entry is a list # of tuple. The first entry in each tuple is the parameter name. The # second entry is a dict with keys 'value' (for default value), # and 'label' (for a descriptive name). # Note that if the highest-level object requires parameters, # common_io_test will be skipped. read_params = {} # do not supported write so no GUI stuff write_params = {} name = "Elphy IO" extensions = ["DAT"] # mode can be 'file' or 'dir' or 'fake' or 'database' mode = "file" # internal serialized representation of neo data serialized = None def __init__(self, filename=None): """ Arguments: filename : the filename to read """ BaseIO.__init__(self) self.filename = filename self.elphy_file = ElphyFile(self.filename) def read_block( self, lazy=False, ): """ Return :class:`Block`. Parameters ---------- lazy : bool Postpone actual reading of the file. """ if lazy: raise NeoReadWriteError("This IO does not support lazy reading") # basic block = Block(name=None) # get analog and tag channels try: self.elphy_file.open() except Exception as e: self.elphy_file.close() raise Exception(f"cannot open file {self.filename} : { e}") # create a segment containing all analog, # tag and event channels for the episode if self.elphy_file.n_episodes in [None, 0]: print("File '{self.filename}' appears to have no episodes") return block for episode in range(1, self.elphy_file.n_episodes + 1): segment = self.read_segment(episode) block.segments.append(segment) # close file self.elphy_file.close() # result return block def write_block(self, block): """ Write a given Neo Block to an Elphy file, its structure being, for example: Neo -> Elphy -------------------------------------------------------------- Block File Segment Episode Block (B_Ep) AnalogSignalArray Episode Descriptor (Ep + Adc + Ksamp + Ktype) multichannel RDATA (with a ChannelMask multiplexing channels) 2D NumPy Array ... AnalogSignalArray AnalogSignal AnalogSignal ... ... SpikeTrain Event Block (RSPK) SpikeTrain ... Arguments:: block: the block to be saved """ # Serialize Neo structure into Elphy file # each analog signal will be serialized as elphy Episode Block (with its subblocks) # then all spiketrains will be serialized into an Rspk Block (an Event Block with addons). # Serialize (and size) all Neo structures before writing them to file # Since to write each Elphy Block is required to know in advance its size, # which includes that of its subblocks, it is necessary to # serialize first the lowest structures. # Iterate over block structures elphy_limit = 256 All = "" # print "\n\n--------------------------------------------\n" # print "write_block() - n_segments:",len(block.segments) for seg in block.segments: analogsignals = 0 # init nbchan = 0 nbpt = 0 chls = 0 Dxu = 1e-8 # 0.0000001 Rxu = 1e8 # 10000000.0 X0uSpk = 0.0 CyberTime = 0.0 aa_units = [] NbEv = [] serialized_analog_data = "" serialized_spike_data = "" # AnalogSignals # Neo signalarrays are 2D numpy array where each row is an array of samples for a # channel: # signalarray A = [[ 1, 2, 3, 4 ], # [ 5, 6, 7, 8 ]] # signalarray B = [[ 9, 10, 11, 12 ], # [ 13, 14, 15, 16 ]] # Neo Segments can have more than one signalarray. # To be converted in Elphy analog channels they need to be all in a 2D array, not in # several 2D arrays. # Concatenate all analogsignalarrays into one and then flatten it. # Elphy RDATA blocks contain Fortran styled samples: # 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16 # AnalogSignalArrays -> analogsignals # get the first to have analogsignals with the right shape # Annotations for analogsignals array come as a list of int being source ids # here, put each source id on a separate dict entry in order to have a matching # afterwards idx = 0 annotations = dict() # get all the others # print "write_block() - n_analogsignals:",len(seg.analogsignals) # print "write_block() - n_analogsignalarrays:",len(seg.analogsignalarrays) for asigar in seg.analogsignalarrays: idx, annotations = self.get_annotations_dict( annotations, "analogsignal", asigar.annotations.items(), asigar.name, idx ) # array structure _, chls = asigar.shape # units for _ in range(chls): aa_units.append(asigar.units) Dxu = asigar.sampling_period Rxu = asigar.sampling_rate if isinstance(analogsignals, np.ndarray): analogsignals = np.hstack((analogsignals, asigar)) else: analogsignals = asigar # first time # collect and reshape all analogsignals if isinstance(analogsignals, np.ndarray): # transpose matrix since in Neo channels are column-wise while in Elphy are # row-wise analogsignals = analogsignals.T # get dimensions nbchan, nbpt = analogsignals.shape # serialize AnalogSignal analog_data_fmt = "<" + str(analogsignals.size) + "f" # serialized flattened numpy channels in 'F'ortran style analog_data_64 = analogsignals.flatten("F") # elphy normally uses float32 values (for performance reasons) analog_data = np.array(analog_data_64, dtype=np.float32) serialized_analog_data += struct.pack(analog_data_fmt, *analog_data) # SpikeTrains # Neo spiketrains are stored as a one-dimensional array of times # [ 0.11, 1.23, 2.34, 3.45, 4.56, 5.67, 6.78, 7.89 ... ] # These are converted into Elphy Rspk Block which will contain all of them # RDATA + NbVeV:integer for the number of channels (spiketrains) # + NbEv:integer[] for the number of event per channel # followed by the actual arrays of integer containing spike times # spiketrains = seg.spiketrains # ... but consider elphy loading limitation: NbVeV = len(seg.spiketrains) # print "write_block() - n_spiketrains:",NbVeV if len(seg.spiketrains) > elphy_limit: NbVeV = elphy_limit # serialize format spiketrain_data_fmt = "<" spiketrains = [] for idx, train in enumerate(seg.spiketrains[:NbVeV]): # print "write_block() - train.size:", train.size,idx # print "write_block() - train:", train fake, annotations = self.get_annotations_dict( annotations, "spiketrain", train.annotations.items(), "", idx ) # annotations.update( dict( [("spiketrain-"+str(idx), # train.annotations['source_id'])] ) ) # print "write_block() - train[%s].annotation['source_id']:%s" # "" % (idx,train.annotations['source_id']) # total number of events format + blackrock sorting mark (0 for neo) spiketrain_data_fmt += str(train.size) + "i" + str(train.size) + "B" # get starting time X0uSpk = train.t_start.item() CyberTime = train.t_stop.item() # count number of events per train NbEv.append(train.size) # multiply by sampling period train = train * Rxu # all flattened spike train # blackrock acquisition card also adds a byte for each event to sort it spiketrains.extend([spike.item() for spike in train] + [0 for _ in range(train.size)]) # Annotations # print annotations # using DBrecord elphy block, they will be available as values in elphy environment # separate keys and values in two separate serialized strings ST_sub = "" st_fmt = "" st_data = [] BUF_sub = "" serialized_ST_data = "" serialized_BUF_data = "" for key in sorted(annotations.iterkeys()): # take all values, get their type and concatenate fmt = "" data = [] value = annotations[key] if isinstance(value, (int, np.int32, np.int64)): # elphy type 2 fmt = " 0 else f"episode {str(episode + 1)}" segment = Segment(name=name) # create an analog signal for # each channel in the episode for channel in range(1, self.elphy_file.n_channels(episode) + 1): signal = self.elphy_file.get_signal(episode, channel) x_unit = signal.x_unit.strip().decode() analog_signal = AnalogSignal( signal.data["y"], units=signal.y_unit, t_start=signal.t_start * getattr(pq, signal.x_unit.strip().decode()), t_stop=signal.t_stop * getattr(pq, signal.x_unit.strip().decode()), # sampling_rate = signal.sampling_frequency * pq.kHz, sampling_period=signal.sampling_period * getattr(pq, x_unit), channel_name=f"episode {int(episode + 1)}, channel { int(channel + 1)}", ) segment.analogsignals.append(analog_signal) # create a spiketrain for each # spike channel in the episode # in case of multi-electrode # acquisition context n_spikes = self.elphy_file.n_spiketrains(episode) # print "read_segment() - n_spikes:",n_spikes if n_spikes > 0: for spk in range(1, n_spikes + 1): spiketrain = self.read_spiketrain(episode, spk) segment.spiketrains.append(spiketrain) # segment return segment def read_event(self, episode, evt): """ Internal method used to return a list of elphy :class:`EventArray` acquired from event channels. Parameters ---------- episode : int Number of elphy episode, roughly corresponding to a segment. evt : int Index of the event. """ event = self.elphy_file.get_event(episode, evt) neo_event = Event(times=event.times * pq.s, channel_name=f"episode {episode + 1}, event channel {evt + 1}") return neo_event def read_spiketrain(self, episode, spk): """ Internal method used to return an elphy object :class:`SpikeTrain`. Parameters ---------- episode : int Number of elphy episode, roughly corresponding to a segment. spk : int Index of the spike array. """ block = self.elphy_file.layout.episode_block(episode) spike = self.elphy_file.get_spiketrain(episode, spk) spikes = spike.times * pq.s # print "read_spiketrain() - spikes: %s" % (len(spikes)) # print "read_spiketrain() - spikes:",spikes dct = { "times": spikes, # check "t_start": block.ep_block.X0_wf if block.ep_block.X0_wf < spikes[0] else spikes[0], "t_stop": block.ep_block.cyber_time if block.ep_block.cyber_time > spikes[-1] else spikes[-1], "units": "s", # special keywords to identify the # electrode providing the spiketrain # event though it is redundant with # waveforms "label": f"episode {episode}, electrode {spk}", "electrode_id": spk, } # new spiketrain return SpikeTrain(**dct) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/exampleio.py0000644000175100001660000000161414743453644015525 0ustar00runnerdocker""" neo.io has been split into a 2-level API: * neo.io: this API gives Neo objects * neo.rawio: this API gives raw data as they are in files. Developers are encourage to use neo.rawio. When this is done the neo.io can be implemented trivially using code like shown in this file. Author: sgarcia """ from neo.io.basefromrawio import BaseFromRaw from neo.rawio.examplerawio import ExampleRawIO class ExampleIO(ExampleRawIO, BaseFromRaw): name = "example IO" description = "Fake IO" # This is an inportant choice when there are several channels. # 'split-all' : 1 AnalogSignal each 1 channel # 'group-by-same-units' : one 2D AnalogSignal for each group of channel with same units _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename=""): ExampleRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/igorproio.py0000644000175100001660000001632414743453644015557 0ustar00runnerdocker""" Class for reading data created by IGOR Pro (WaveMetrics, Inc., Portland, OR, USA) Depends on: igor2 (https://pypi.python.org/pypi/igor2/) Supported: Read Author: Andrew Davison Also contributing: Rick Gerkin """ from warnings import warn import pathlib import quantities as pq from neo.io.baseio import BaseIO from neo.core import Block, Segment, AnalogSignal, NeoReadWriteError class IgorIO(BaseIO): """ Class for reading Igor Binary Waves (.ibw) or Packed Experiment (.pxp) files written by WaveMetrics’ IGOR Pro software. It requires the `igor2` Python package. Usage: >>> from neo import io >>> r = io.IgorIO(filename='...ibw') """ is_readable = True # This class can only read data is_writable = False # write is not supported supported_objects = [Block, Segment, AnalogSignal] readable_objects = [Block, Segment, AnalogSignal] writeable_objects = [] has_header = False is_streameable = False name = "igorpro" extensions = ["ibw", "pxp"] mode = "file" def __init__(self, filename=None, parse_notes=None): """ Arguments: filename: the filename parse_notes: (optional) A function which will parse the 'notes' field in the file header and return a dictionary which will be added to the object annotations. """ BaseIO.__init__(self) filename = pathlib.Path(filename) if filename.suffix[1:] not in self.extensions: raise NotImplementedError(f"Only the following extensions are supported: {self.extensions}") self.filename = filename self.extension = filename.suffix[1:] self.parse_notes = parse_notes self._filesystem = None def read_block(self, lazy=False): if lazy: raise NeoReadWriteError("This IO does not support lazy reading") block = Block(file_origin=str(self.filename)) block.segments.append(self.read_segment(lazy=lazy)) return block def read_segment(self, lazy=False): import igor2.packed as pxp from igor2.record.wave import WaveRecord if lazy: raise NeoReadWriteError("This IO does not support lazy mode") segment = Segment(file_origin=str(self.filename)) if self.extension == "pxp": if not self._filesystem: _, self.filesystem = pxp.load(str(self.filename)) def callback(dirpath, key, value): if isinstance(value, WaveRecord): signal = self._wave_to_analogsignal(value.wave["wave"], dirpath) segment.analogsignals.append(signal) pxp.walk(self.filesystem, callback) else: segment.analogsignals.append(self.read_analogsignal(lazy=lazy)) return segment def read_analogsignal(self, path=None, lazy=False): import igor2.binarywave as bw import igor2.packed as pxp if lazy: raise NeoReadWriteError("This IO does not support lazy mode") if self.extension == "ibw": data = bw.load(str(self.filename)) version = data["version"] if version > 5: raise IOError(f"Igor binary wave file format version {version} " "is not supported.") elif self.extension == "pxp": if type(path) is not str: raise TypeError("A colon-separated Igor-style path must be provided.") if not self._filesystem: _, self.filesystem = pxp.load(str(self.filename)) path = path.split(":") location = self.filesystem["root"] for element in path: if element != "root": location = location[element.encode("utf8")] data = location.wave return self._wave_to_analogsignal(data["wave"], []) def _wave_to_analogsignal(self, content, dirpath): if "padding" in content: if content["padding"].size != 0: raise NeoReadWriteError("Cannot handle non-empty padding") signal = content["wData"] note = content["note"] header = content["wave_header"] name = str(header["bname"].decode("utf-8")) units = "".join([x.decode() for x in header["dataUnits"]]) if "xUnits" in header: # "xUnits" is used in Versions 1, 2, 3 of .pxp files time_units = "".join([x.decode() for x in header["xUnits"]]) elif "dimUnits" in header: # Version 5 uses "dimUnits" # see https://github.com/AFM-analysis/igor2/blob/43fccf51714661fb96372e8119c59e17ce01f683/igor2/binarywave.py#L501 _time_unit_structure = header["dimUnits"].ravel() # For the files we've seen so far, the first element of _time_unit_structure contains the units. # If someone has a file for which this assumption does not hold an Exception will be raised. if not all([element == b"" for element in _time_unit_structure[1:]]): raise Exception( "Neo cannot yet handle the units in this file. " "Please create a new issue in the Neo issue tracker at " "https://github.com/NeuralEnsemble/python-neo/issues/new/choose" ) time_units = _time_unit_structure[0].decode() else: time_units = "" if len(time_units) == 0: time_units = "s" try: t_start = pq.Quantity(header["hsB"], time_units) except KeyError: t_start = pq.Quantity(header["sfB"][0], time_units) try: sampling_period = pq.Quantity(header["hsA"], time_units) except KeyError: sampling_period = pq.Quantity(header["sfA"][0], time_units) if self.parse_notes: try: annotations = self.parse_notes(note) except ValueError: warn("Couldn't parse notes field.") annotations = {"note": note} else: annotations = {"note": note} annotations["igor_path"] = ":".join(item.decode("utf-8") for item in dirpath) signal = AnalogSignal( signal, units=units, copy=None, t_start=t_start, sampling_period=sampling_period, name=name, file_origin=str(self.filename), **annotations, ) return signal # the following function is to handle the annotations in the # Igor data files from the Blue Brain Project NMC Portal def key_value_string_parser(itemsep=";", kvsep=":"): """ Parses a string into a dict. Parameters ---------- itemsep : str Character which separates items kvsep : str Character which separates the key and value within an item Returns ------- callable a function which takes the string to be parsed as the sole argument and returns a dict. Examples -------- >>> parse = key_value_string_parser(itemsep=";", kvsep=":") >>> parse("a:2;b:3") {'a': 2, 'b': 3} """ def parser(s): items = s.split(itemsep) return dict(item.split(kvsep, 1) for item in items if item) return parser ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/intanio.py0000644000175100001660000000054114743453644015201 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.intanrawio import IntanRawIO class IntanIO(IntanRawIO, BaseFromRaw): __doc__ = IntanRawIO.__doc__ _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename): IntanRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/klustakwikio.py0000644000175100001660000004101714743453644016264 0ustar00runnerdocker""" Reading and writing from KlustaKwik-format files. Ref: http://klusters.sourceforge.net/UserManual/data-files.html Supported : Read, Write Author : Chris Rodgers TODO: * When reading, put the Unit into the RCG, RC hierarchy * When writing, figure out how to get group and cluster if those annotations weren't set. Consider removing those annotations if they are redundant. * Load features in addition to spiketimes. """ import re import logging from pathlib import Path import shutil # note neo.core need only numpy and quantities import numpy as np # I need to subclass BaseIO from neo.io.baseio import BaseIO from neo.core import Block, Segment, Group, SpikeTrain # Pasted version of feature file format spec """ The Feature File Generic file name: base.fet.n Format: ASCII, integer values The feature file lists for each spike the PCA coefficients for each electrode, followed by the timestamp of the spike (more features can be inserted between the PCA coefficients and the timestamp). The first line contains the number of dimensions. Assuming N1 spikes (spike1...spikeN1), N2 electrodes (e1...eN2) and N3 coefficients (c1...cN3), this file looks like: nbDimensions c1_e1_spk1 c2_e1_spk1 ... cN3_e1_spk1 c1_e2_spk1 ... cN3_eN2_spk1 timestamp_spk1 c1_e1_spk2 c2_e1_spk2 ... cN3_e1_spk2 c1_e2_spk2 ... cN3_eN2_spk2 timestamp_spk2 ... c1_e1_spkN1 c2_e1_spkN1 ... cN3_e1_spkN1 c1_e2_spkN1 ... cN3_eN2_spkN1 timestamp_spkN1 The timestamp is expressed in multiples of the sampling interval. For instance, for a 20kHz recording (50 microsecond sampling interval), a timestamp of 200 corresponds to 200x0.000050s=0.01s from the beginning of the recording session. Notice that the last line must end with a newline or carriage return. """ class KlustaKwikIO(BaseIO): """Reading and writing from KlustaKwik-format files.""" # Class variables demonstrating capabilities of this IO is_readable = True is_writable = True # This IO can only manipulate objects relating to spike times supported_objects = [Block, SpikeTrain] # Keep things simple by always returning a block readable_objects = [Block] # And write a block writeable_objects = [Block] # Not sure what these do, if anything has_header = False is_streameable = False # GUI params read_params = {} # GUI params write_params = {} # The IO name and the file extensions it uses name = "KlustaKwik" extensions = ["fet", "clu", "res", "spk"] # Operates on directories mode = "dir" def __init__(self, dirname, sampling_rate=30000.0): """Create a new IO to operate on a directory dirname : the directory to contain the files sampling_rate : in Hz, necessary because the KlustaKwik files stores data in samples. """ BaseIO.__init__(self) self.dirname = Path(dirname) # in case no basename is provided if self.dirname.is_dir(): self.session_dir = self.dirname else: self.session_dir = self.dirname.parent self.basename = self.dirname.name self.sampling_rate = float(sampling_rate) # error check if not self.session_dir.is_dir(): raise ValueError("dirname must be in an existing directory") # initialize a helper object to parse filenames self._fp = FilenameParser(dirname=self.session_dir, basename=self.basename) def read_block(self, lazy=False): """Returns a Block containing spike information. There is no obvious way to infer the segment boundaries from raw spike times, so for now all spike times are returned in one big segment. The way around this would be to specify the segment boundaries, and then change this code to put the spikes in the right segments. """ assert not lazy, "Do not support lazy" # Create block and segment to hold all the data block = Block() # Search data directory for KlustaKwik files. # If nothing found, return empty block self._fetfiles = self._fp.read_filenames("fet") self._clufiles = self._fp.read_filenames("clu") if len(self._fetfiles) == 0: return block # Create a single segment to hold all of the data seg = Segment(name="seg0", index=0, file_origin=str(self.session_dir / self.basename)) block.segments.append(seg) # Load spike times from each group and store in a dict, keyed # by group number self.spiketrains = dict() for group in sorted(self._fetfiles.keys()): # Load spike times fetfile = self._fetfiles[group] spks, features = self._load_spike_times(fetfile) # Load cluster ids or generate if group in self._clufiles: clufile = self._clufiles[group] uids = self._load_unit_id(clufile) else: # unclustered data, assume all zeros uids = np.zeros(spks.shape, dtype=np.int32) # error check if len(spks) != len(uids): raise ValueError("lengths of fet and clu files are different") # Create Group for each cluster unique_unit_ids = np.unique(uids) for unit_id in sorted(unique_unit_ids): # Initialize the unit u = Group(name=(f"unit {unit_id} from group {group}"), index=unit_id, group=group) # Initialize a new SpikeTrain for the spikes from this unit st = SpikeTrain( times=spks[uids == unit_id] / self.sampling_rate, units="sec", t_start=0.0, t_stop=spks.max() / self.sampling_rate, name=(f"unit {unit_id} from group {group}"), ) st.annotations["cluster"] = unit_id st.annotations["group"] = group # put features in if len(features) != 0: st.annotations["waveform_features"] = features # Link u.add(st) seg.spiketrains.append(st) block.check_relationships() return block # Helper hidden functions for reading def _load_spike_times(self, fetfilename): """Reads and returns the spike times and features""" with open(fetfilename, mode="r") as f: # Number of clustering features is integer on first line nbFeatures = int(f.readline().strip()) # Each subsequent line consists of nbFeatures values, followed by # the spike time in samples. names = [f"fet{n}" for n in range(nbFeatures)] names.append("spike_time") # Load into recarray data = np.genfromtxt(fetfilename, names=names, skip_header=1, delimiter=" ") # get features features = np.array([data[f"fet{n}"] for n in range(nbFeatures)]) # Return the spike_time column return data["spike_time"], features.transpose() def _load_unit_id(self, clufilename): """Reads and return the cluster ids as int32""" with open(clufilename, mode="r") as f: # Number of clusters on this tetrode is integer on first line nbClusters = int(f.readline().strip()) # Read each cluster name as a string cluster_names = f.readlines() # Convert names to integers # I think the spec requires cluster names to be integers, but # this code could be modified to support string names which are # auto-numbered. try: cluster_ids = [int(name) for name in cluster_names] except ValueError: raise ValueError(f"Could not convert cluster name to integer in {clufilename}") # convert to numpy array and error check cluster_ids = np.array(cluster_ids, dtype=np.int32) if len(np.unique(cluster_ids)) != nbClusters: logging.warning( f"warning: I got {len(np.unique(cluster_ids))} clusters instead of {nbClusters} in {clufilename}" ) return cluster_ids # writing functions def write_block(self, block): """Write spike times and unit ids to disk. Currently descends hierarchy from block to segment to spiketrain. Then gets group and cluster information from spiketrain. Then writes the time and cluster info to the file associated with that group. The group and cluster information are extracted from annotations, eg `sptr.annotations['group']`. If no cluster information exists, it is assigned to cluster 0. Note that all segments are essentially combined in this process, since the KlustaKwik format does not allow for segment boundaries. As implemented currently, does not use the `Unit` object at all. We first try to use the sampling rate of each SpikeTrain, or if this is not set, we use `self.sampling_rate`. If the files already exist, backup copies are created by appending the filenames with a "~". """ # set basename if self.basename is None: logging.warning("warning: no basename provided, using `basename`") self.basename = "basename" # First create file handles for each group which will be stored self._make_all_file_handles(block) # We'll detect how many features belong in each group self._group2features = {} # Iterate through segments in this block for seg in block.segments: # Write each spiketrain of the segment for st in seg.spiketrains: # Get file handles for this spiketrain using its group group = self.st2group(st) fetfilehandle = self._fetfilehandles[group] clufilehandle = self._clufilehandles[group] # Get the id to write to clu file for this spike train cluster = self.st2cluster(st) # Choose sampling rate to convert to samples try: sr = st.annotations["sampling_rate"] except KeyError: sr = self.sampling_rate # Convert to samples spike_times_in_samples = np.rint(np.array(st) * sr).astype(np.int64) # Try to get features from spiketrain try: all_features = st.annotations["waveform_features"] except KeyError: # Use empty all_features = [[] for _ in range(len(spike_times_in_samples))] all_features = np.asarray(all_features) if all_features.ndim != 2: raise ValueError("waveform features should be 2d array") # Check number of features we're supposed to have try: n_features = self._group2features[group] except KeyError: # First time through .. set number of features n_features = all_features.shape[1] self._group2features[group] = n_features # and write to first line of file fetfilehandle.write(f"{n_features}\n") if n_features != all_features.shape[1]: raise ValueError( "inconsistent number of features: " + f"supposed to be {n_features} but I got {all_features.shape[1]}" ) # Write features and time for each spike for stt, features in zip(spike_times_in_samples, all_features): # first features for val in features: fetfilehandle.write(str(val)) fetfilehandle.write(" ") # now time fetfilehandle.write(f"{stt}\n") # and cluster id clufilehandle.write(f"{cluster}\n") # We're done, so close the files self._close_all_files() # Helper functions for writing def st2group(self, st): # Not sure this is right so make it a method in case we change it try: return st.annotations["group"] except KeyError: return 0 def st2cluster(self, st): # Not sure this is right so make it a method in case we change it try: return st.annotations["cluster"] except KeyError: return 0 def _make_all_file_handles(self, block): """Get the tetrode (group) of each neuron (cluster) by descending the hierarchy through segment and block. Store in a dict {group_id: list_of_clusters_in_that_group} """ group2clusters = {} for seg in block.segments: for st in seg.spiketrains: group = self.st2group(st) cluster = self.st2cluster(st) if group in group2clusters: if cluster not in group2clusters[group]: group2clusters[group].append(cluster) else: group2clusters[group] = [cluster] # Make new file handles for each group self._fetfilehandles, self._clufilehandles = {}, {} for group, clusters in group2clusters.items(): self._new_group(group, nbClusters=len(clusters)) def _new_group(self, id_group, nbClusters): # generate filenames fetfilename = self.session_dir / (self.basename + (f".fet.{id_group}")) clufilename = self.session_dir / (self.basename + (f".clu.{id_group}")) # back up before overwriting if fetfilename.exists(): shutil.copyfile(fetfilename, fetfilename + "~") if clufilename.exists(): shutil.copyfile(clufilename, clufilename + "~") # create file handles self._fetfilehandles[id_group] = open(fetfilename, mode="w") self._clufilehandles[id_group] = open(clufilename, mode="w") # write out first line # self._fetfilehandles[id_group].write("0\n") # Number of features self._clufilehandles[id_group].write(f"{nbClusters}\n") def _close_all_files(self): for val in self._fetfilehandles.values(): val.close() for val in self._clufilehandles.values(): val.close() class FilenameParser: """Simple class to interpret user's requests into KlustaKwik filenames""" def __init__(self, dirname, basename=None): """Initialize a new parser for a directory containing files dirname: directory containing files basename: basename in KlustaKwik format spec If basename is left None, then files with any basename in the directory will be used. An error is raised if files with multiple basenames exist in the directory. """ self.dirname = Path(dirname).absolute() self.basename = basename # error check if not self.dirname.is_dir(): raise ValueError("dirname must be a directory") def read_filenames(self, typestring="fet"): """Returns filenames in the data directory matching the type. Generally, `typestring` is one of the following: 'fet', 'clu', 'spk', 'res' Returns a dict {group_number: filename}, e.g.: { 0: 'basename.fet.0', 1: 'basename.fet.1', 2: 'basename.fet.2'} 'basename' can be any string not containing whitespace. Only filenames that begin with "basename.typestring." and end with a sequence of digits are valid. The digits are converted to an integer and used as the group number. """ all_filenames = self.dirname.glob("*") # Fill the dict with valid filenames d = {} for v in all_filenames: # Test whether matches format, ie ends with digits split_fn = v.name m = re.search(rf"^(.*)\.{typestring}\.(\d+)$", split_fn) if m is not None: # get basename from first hit if not specified if self.basename is None: self.basename = m.group(1) # return files with correct basename if self.basename == m.group(1): # Key the group number to the filename # This conversion to int should always work since only # strings of digits will match the regex tetn = int(m.group(2)) d[tetn] = v return d ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/kwikio.py0000644000175100001660000001350714743453644015043 0ustar00runnerdocker""" Class for reading data from a .kwik dataset Depends on: scipy phy Supported: Read Author: Mikkel E. Lepperød @CINPLA """ # TODO: writing to file import numpy as np import quantities as pq import os # I need to subclass BaseIO from neo.io.baseio import BaseIO # to import from core from neo.core import Segment, SpikeTrain, AnalogSignal, Block, Group class KwikIO(BaseIO): """ Class for "reading" experimental data from a .kwik file. Generates a :class:`Segment` with a :class:`AnalogSignal` """ is_readable = True # This class can only read data is_writable = False # write is not supported supported_objects = [Block, Segment, SpikeTrain, AnalogSignal, Group] # This class can return either a Block or a Segment # The first one is the default ( self.read ) # These lists should go from highest object to lowest object because # common_io_test assumes it. readable_objects = [Block] # This class is not able to write objects writeable_objects = [] has_header = False is_streameable = False name = "Kwik" description = "This IO reads experimental data from a .kwik dataset" extensions = ["kwik"] mode = "file" def __init__(self, filename): """ Arguments: filename : the filename """ from klusta import kwik BaseIO.__init__(self) self.filename = os.path.abspath(filename) model = kwik.KwikModel(self.filename) # TODO this group is loaded twice self.models = [kwik.KwikModel(self.filename, channel_group=grp) for grp in model.channel_groups] def read_block( self, lazy=False, get_waveforms=True, cluster_group=None, raw_data_units="uV", get_raw_data=False, ): """ Reads a block with segments and groups Parameters ---------- get_waveforms: bool, default = False Wether or not to get the waveforms get_raw_data: bool, default = False Wether or not to get the raw traces raw_data_units: str, default = "uV" SI units of the raw trace according to voltage_gain given to klusta cluster_group: str, default = None Which clusters to load, possibilities are "noise", "unsorted", "good", if None all is loaded. """ assert not lazy, "Do not support lazy" blk = Block() seg = Segment(file_origin=self.filename) blk.segments += [seg] for model in self.models: group_id = model.channel_group group_meta = {"group_id": group_id} group_meta.update(model.metadata) chx = Group(name=f"channel group #{group_id}", index=model.channels, **group_meta) blk.groups.append(chx) clusters = model.spike_clusters for cluster_id in model.cluster_ids: meta = model.cluster_metadata[cluster_id] if cluster_group is None: pass elif cluster_group != meta: continue sptr = self.read_spiketrain( cluster_id=cluster_id, model=model, get_waveforms=get_waveforms, raw_data_units=raw_data_units ) sptr.annotations.update({"cluster_group": meta, "group_id": model.channel_group}) unit = Group(cluster_group=meta, group_id=model.channel_group, name=f"unit #{cluster_id}") unit.add(sptr) chx.add(unit) seg.spiketrains.append(sptr) if get_raw_data: ana = self.read_analogsignal(model, units=raw_data_units) chx.add(ana) seg.analogsignals.append(ana) seg.duration = model.duration * pq.s blk.check_relationships() return blk def read_analogsignal(self, model, units="uV", lazy=False): """ Reads analogsignals Parameters ---------- units: str, default = "uV" SI units of the raw trace according to voltage_gain given to klusta """ assert not lazy, "Do not support lazy" arr = model.traces[:] * model.metadata["voltage_gain"] ana = AnalogSignal( arr, sampling_rate=model.sample_rate * pq.Hz, units=units, file_origin=model.metadata["raw_data_files"] ) return ana def read_spiketrain(self, cluster_id, model, lazy=False, get_waveforms=True, raw_data_units=None): """ Reads sorted spiketrains Parameters ---------- get_waveforms: bool, default = False Wether or not to get the waveforms cluster_id: int, Which cluster to load, according to cluster id from klusta model: klusta.kwik.KwikModel A KwikModel object obtained by klusta.kwik.KwikModel(fname) """ try: if not (cluster_id in model.cluster_ids): raise ValueError except ValueError: print(f"Exception: cluster_id ({cluster_id}) not found !! ") return clusters = model.spike_clusters idx = np.nonzero(clusters == cluster_id) if get_waveforms: w = model.all_waveforms[idx] # klusta: num_spikes, samples_per_spike, num_chans = w.shape w = w.swapaxes(1, 2) w = pq.Quantity(w, raw_data_units) else: w = None if model.duration > 0.0: t_stop = model.duration else: t_stop = np.max(model.spike_times[idx]) sptr = SpikeTrain( times=model.spike_times[idx], t_stop=t_stop, waveforms=w, units="s", sampling_rate=model.sample_rate * pq.Hz, file_origin=self.filename, **{"cluster_id": cluster_id}, ) return sptr ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/maxwellio.py0000644000175100001660000000044414743453644015543 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.maxwellrawio import MaxwellRawIO class MaxwellIO(MaxwellRawIO, BaseFromRaw): mode = "file" def __init__(self, filename): MaxwellRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/mearecio.py0000644000175100001660000000071614743453644015330 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.mearecrawio import MEArecRawIO class MEArecIO(MEArecRawIO, BaseFromRaw): __doc__ = MEArecRawIO.__doc__ mode = "file" def __init__(self, filename, load_spiketrains=True, load_analogsignal=True): MEArecRawIO.__init__( self, filename=filename, load_spiketrains=load_spiketrains, load_analogsignal=load_analogsignal ) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/medio.py0000644000175100001660000000264514743453644014644 0ustar00runnerdocker""" IO for reading MED datasets using dhn-med-py library. dhn-med-py https://medformat.org https://pypi.org/project/dhn-med-py/ MED Format Specifications: https://medformat.org Author: Dan Crepeau, Matt Stead """ from neo.io.basefromrawio import BaseFromRaw from neo.rawio.medrawio import MedRawIO class MedIO(MedRawIO, BaseFromRaw): """ IO for reading MED datasets. """ name = "MED IO" description = "IO for reading MED datasets" _prefered_signal_group_mode = "group-by-same-units" mode = "dir" def __init__(self, dirname=None, password=None, keep_original_times=False): MedRawIO.__init__(self, dirname=dirname, password=password, keep_original_times=keep_original_times) """ Initialise IO instance Parameters ---------- dirname : str Directory containing data files password : str MED sessions can be optionally encrypted with a password. Default: None keep_original_times : bool Preserve original time stamps as in data files. By default datasets are shifted to begin at t_start = 0. When set to True, timestamps will be returned as UTC (seconds since midnight 1 Jan 1970). Default: False """ BaseFromRaw.__init__(self, dirname) def close(self): MedRawIO.close(self) def __del__(self): MedRawIO.__del__(self) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/micromedio.py0000644000175100001660000000071614743453644015673 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.micromedrawio import MicromedRawIO from neo.core import Segment, AnalogSignal, Epoch, Event class MicromedIO(MicromedRawIO, BaseFromRaw): """Class for reading/writing data from Micromed files (.trc).""" _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename): MicromedRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/neomatlabio.py0000644000175100001660000005125314743453644016040 0ustar00runnerdocker""" Module for reading/writing Neo objects in MATLAB format (.mat) versions 5 to 7.2. This module is a bridge for MATLAB users who want to adopt the Neo object representation. The nomenclature is the same but using Matlab structs and cell arrays. With this module MATLAB users can use neo.io to read a format and convert it to .mat. Supported : Read/Write Author: sgarcia, Robert Pröpper """ from collections.abc import Mapping from datetime import datetime import re import numpy as np import quantities as pq from packaging.version import Version from neo.io.baseio import BaseIO from neo.core import ( Block, Segment, AnalogSignal, IrregularlySampledSignal, Event, Epoch, SpikeTrain, Group, ImageSequence, ChannelView, RectangularRegionOfInterest, CircularRegionOfInterest, PolygonRegionOfInterest, objectnames, class_by_name, NeoReadWriteError, ) from neo.core.regionofinterest import RegionOfInterest from neo.core.baseneo import _container_name def get_classname_from_container_name(container_name, struct): if container_name == "regionsofinterest": if "radius" in struct._fieldnames: return "CircularRegionOfInterest" elif "vertices" in struct._fieldnames: return "PolygonRegionOfInterest" else: return "RectangularRegionOfInterest" else: for classname in objectnames: if _container_name(classname) == container_name: return classname PY_NONE = "Py_None" class NeoMatlabIO(BaseIO): """ Class for reading/writing Neo objects in MATLAB format (.mat) versions 5 to 7.2. This module is a bridge for MATLAB users who want to adopt the Neo object representation. The nomenclature is the same but using Matlab structs and cell arrays. With this module MATLAB users can use neo.io to read a format and convert it to .mat. Rules of conversion: * Neo classes are converted to MATLAB structs. e.g., a Block is a struct with attributes "name", "file_datetime", ... * Neo one_to_many relationships are cellarrays in MATLAB. e.g., ``seg.analogsignals[2]`` in Python Neo will be ``seg.analogsignals{3}`` in MATLAB. * Quantity attributes are represented by 2 fields in MATLAB. e.g., ``anasig.t_start = 1.5 * s`` in Python will be ``anasig.t_start = 1.5`` and ``anasig.t_start_unit = 's'`` in MATLAB. * classes that inherit from Quantity (AnalogSignal, SpikeTrain, ...) in Python will have 2 fields (array and units) in the MATLAB struct. e.g.: ``AnalogSignal( [1., 2., 3.], 'V')`` in Python will be ``anasig.array = [1. 2. 3]`` and ``anasig.units = 'V'`` in MATLAB. 1 - **Scenario 1: create data in MATLAB and read them in Python** This MATLAB code generates a block:: block = struct(); block.segments = { }; block.name = 'my block with matlab'; for s = 1:3 seg = struct(); seg.name = strcat('segment ',num2str(s)); seg.analogsignals = { }; for a = 1:5 anasig = struct(); anasig.signal = rand(100,1); anasig.signal_units = 'mV'; anasig.t_start = 0; anasig.t_start_units = 's'; anasig.sampling_rate = 100; anasig.sampling_rate_units = 'Hz'; seg.analogsignals{a} = anasig; end seg.spiketrains = { }; for t = 1:7 sptr = struct(); sptr.times = rand(30,1)*10; sptr.times_units = 'ms'; sptr.t_start = 0; sptr.t_start_units = 'ms'; sptr.t_stop = 10; sptr.t_stop_units = 'ms'; seg.spiketrains{t} = sptr; end event = struct(); event.times = [0, 10, 30]; event.times_units = 'ms'; event.labels = ['trig0'; 'trig1'; 'trig2']; seg.events{1} = event; epoch = struct(); epoch.times = [10, 20]; epoch.times_units = 'ms'; epoch.durations = [4, 10]; epoch.durations_units = 'ms'; epoch.labels = ['a0'; 'a1']; seg.epochs{1} = epoch; block.segments{s} = seg; end save 'myblock.mat' block -V7 This code reads it in Python:: import neo r = neo.io.NeoMatlabIO(filename='myblock.mat') bl = r.read_block() print bl.segments[1].analogsignals[2] print bl.segments[1].spiketrains[4] 2 - **Scenario 2: create data in Python and read them in MATLAB** This Python code generates the same block as in the previous scenario:: import neo import quantities as pq from scipy import rand, array bl = neo.Block(name='my block with neo') for s in range(3): seg = neo.Segment(name='segment' + str(s)) bl.segments.append(seg) for a in range(5): anasig = neo.AnalogSignal(rand(100)*pq.mV, t_start=0*pq.s, sampling_rate=100*pq.Hz) seg.analogsignals.append(anasig) for t in range(7): sptr = neo.SpikeTrain(rand(40)*pq.ms, t_start=0*pq.ms, t_stop=10*pq.ms) seg.spiketrains.append(sptr) ev = neo.Event([0, 10, 30]*pq.ms, labels=array(['trig0', 'trig1', 'trig2'])) ep = neo.Epoch([10, 20]*pq.ms, durations=[4, 10]*pq.ms, labels=array(['a0', 'a1'])) seg.events.append(ev) seg.epochs.append(ep) from neo.io.neomatlabio import NeoMatlabIO w = NeoMatlabIO(filename='myblock.mat') w.write_block(bl) This MATLAB code reads it:: load 'myblock.mat' block.name block.segments{2}.analogsignals{3}.signal block.segments{2}.analogsignals{3}.signal_units block.segments{2}.analogsignals{3}.t_start block.segments{2}.analogsignals{3}.t_start_units 3 - **Scenario 3: conversion** This Python code converts a Spike2 file to MATLAB:: from neo import Block from neo.io import Spike2IO, NeoMatlabIO r = Spike2IO(filename='spike2.smr') w = NeoMatlabIO(filename='convertedfile.mat') blocks = r.read() w.write(blocks[0]) """ is_readable = True is_writable = True supported_objects = [ Block, Segment, AnalogSignal, IrregularlySampledSignal, Epoch, Event, SpikeTrain, Group, ImageSequence, ChannelView, RectangularRegionOfInterest, CircularRegionOfInterest, PolygonRegionOfInterest, ] readable_objects = [Block] writeable_objects = [Block] has_header = False is_streameable = False read_params = {Block: []} write_params = {Block: []} name = "neomatlab" extensions = ["mat"] mode = "file" def __init__(self, filename=None): """ This class read/write neo objects in matlab 5 to 7.2 format. Arguments: filename : the filename to read """ import scipy.version if Version(scipy.version.version) < Version("0.12.0"): raise ImportError( "your scipy version is too old to support " + "MatlabIO, you need at least 0.12.0. " + f"You have {scipy.version.version}" ) BaseIO.__init__(self) self.filename = filename self._refs = {} def read_block(self, lazy=False): """ Arguments: """ import scipy.io if lazy: raise NeoReadWriteError(f"This IO does not support lazy reading") d = scipy.io.loadmat(self.filename, struct_as_record=False, squeeze_me=True, mat_dtype=True) if "block" not in d: self.logger.exception("No block in " + self.filename) return None bl_struct = d["block"] bl = self.create_ob_from_struct(bl_struct, "Block") self._resolve_references(bl) bl.check_relationships() return bl def write_block(self, bl, **kargs): """ Arguments: bl: the block to be saved """ import scipy.io bl_struct = self.create_struct_from_obj(bl) for seg in bl.segments: seg_struct = self.create_struct_from_obj(seg) bl_struct["segments"].append(seg_struct) for container_name in seg._child_containers: for child_obj in getattr(seg, container_name): child_struct = self.create_struct_from_obj(child_obj) seg_struct[container_name].append(child_struct) for group in bl.groups: group_structure = self.create_struct_from_obj(group) bl_struct["groups"].append(group_structure) for container_name in group._child_containers: for child_obj in getattr(group, container_name): if isinstance(child_obj, (ChannelView, RegionOfInterest)): child_struct = self.create_struct_from_view(child_obj) group_structure[container_name].append(child_struct) else: group_structure[container_name].append(id(child_obj)) scipy.io.savemat(self.filename, {"block": bl_struct}, oned_as="row") def _get_matlab_value(self, ob, attrname): units = None if hasattr(ob, "_quantity_attr") and ob._quantity_attr == attrname: units = ob.dimensionality.string value = ob.magnitude else: try: value = getattr(ob, attrname) except AttributeError: value = ob[attrname] if isinstance(value, pq.Quantity): units = value.dimensionality.string value = value.magnitude elif isinstance(value, datetime): value = str(value) elif isinstance(value, Mapping): new_value = {} for key in value: subvalue, subunits = self._get_matlab_value(value, key) if subvalue is not None: new_value[key] = subvalue if subunits: new_value[f"{key}_units"] = subunits elif attrname == "annotations": # In general we don't send None to MATLAB # but we make an exception for annotations. # However, we have to save then retrieve some # special value as actual `None` is ignored by default. new_value[key] = PY_NONE value = new_value return value, units def create_struct_from_obj(self, ob): struct = {"neo_id": id(ob)} # relationship for childname in getattr(ob, "_child_containers", []): supported_containers = [_container_name(subob.__name__) for subob in self.supported_objects] if childname in supported_containers: struct[childname] = [] # attributes all_attrs = list(ob._all_attrs) if hasattr(ob, "annotations"): all_attrs.append(("annotations", type(ob.annotations))) for attr in all_attrs: attrname, attrtype = attr[0], attr[1] attr_value, attr_units = self._get_matlab_value(ob, attrname) if attr_value is not None: struct[attrname] = attr_value if attr_units: struct[attrname + "_units"] = attr_units return struct def create_struct_from_view(self, ob): # for "view" objects (ChannelView and RegionOfInterest), we just store # a reference to the object (AnalogSignal, ImageSequence) that the view # points to struct = self.create_struct_from_obj(ob) obj_name = ob._necessary_attrs[0][0] # this is fragile, better to add an attribute _view_attr viewed_obj = getattr(ob, obj_name) struct[obj_name] = id(viewed_obj) struct["viewed_classname"] = viewed_obj.__class__.__name__ return struct def create_ob_from_struct(self, struct, classname): cl = class_by_name[classname] # ~ if is_quantity: if hasattr(cl, "_quantity_attr"): quantity_attr = cl._quantity_attr arr = getattr(struct, quantity_attr) # ~ data_complement = dict(units=str(struct.units)) data_complement = dict(units=str(getattr(struct, quantity_attr + "_units"))) if "sampling_rate" in (at[0] for at in cl._necessary_attrs): # put fake value for now, put correct value later data_complement["sampling_rate"] = 0 * pq.kHz try: len(arr) except TypeError: # strange scipy.io behavior: if len is 1 we get a float arr = np.array(arr) arr = arr.reshape((-1,)) # new view with one dimension if "t_stop" in (at[0] for at in cl._necessary_attrs): if len(arr) > 0: data_complement["t_stop"] = arr.max() else: data_complement["t_stop"] = 0.0 if "t_start" in (at[0] for at in cl._necessary_attrs): if len(arr) > 0: data_complement["t_start"] = arr.min() else: data_complement["t_start"] = 0.0 if "spatial_scale" in (at[0] for at in cl._necessary_attrs): if len(arr) > 0: data_complement["spatial_scale"] = arr else: data_complement["spatial_scale"] = 1.0 if "times" in (at[0] for at in cl._necessary_attrs) and quantity_attr != "times": # handle IrregularlySampledSignal times = getattr(struct, "times") data_complement["time_units"] = getattr(struct, "times_units") ob = cl(times, arr, **data_complement) else: ob = cl(arr, **data_complement) elif cl.is_view: kwargs = {} for i, attr in enumerate(cl._necessary_attrs): value = getattr(struct, attr[0]) if i == 0: # this is a bit hacky, should really add an attribute _view_attr to ChannelView and RegionOfInterest if not isinstance(value, int): # object id raise TypeError(f"value must be int not of type {type(value)}") kwargs[attr[0]] = _Ref(identifier=value, target_class_name=struct.viewed_classname) else: if attr[1] == np.ndarray and isinstance(value, int): value = np.array([value]) kwargs[attr[0]] = value ob = cl(**kwargs) else: ob = cl() for attrname in struct._fieldnames: # check children if attrname in getattr(ob, "_child_containers", []): child_struct = getattr(struct, attrname) try: # try must only surround len() or other errors are captured child_len = len(child_struct) except TypeError: # strange scipy.io behavior: if len is 1 there is no len() child_struct = [child_struct] child_len = 1 for c in range(child_len): child_class_name = get_classname_from_container_name(attrname, child_struct[c]) if classname == "Group": if child_class_name == ("ChannelView") or "RegionOfInterest" in child_class_name: child = self.create_ob_from_struct(child_struct[c], child_class_name) else: child = _Ref(child_struct[c], child_class_name) else: child = self.create_ob_from_struct(child_struct[c], child_class_name) getattr(ob, attrname.lower()).append(child) continue # attributes if attrname.endswith("_units") or attrname == "units": # linked with another field continue if hasattr(cl, "_quantity_attr") and cl._quantity_attr == attrname: continue if cl.is_view and attrname in ( "obj", "index", "image_sequence", "x", "y", "radius", "width", "height", "vertices", ): continue item = getattr(struct, attrname) attributes = cl._necessary_attrs + cl._recommended_attrs + (("annotations", dict),) dict_attributes = dict([(a[0], a[1:]) for a in attributes]) if attrname in dict_attributes: attrtype = dict_attributes[attrname][0] if attrtype == datetime: m = r"(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+).(\d+)" r = re.findall(m, str(item)) if len(r) == 1: item = datetime(*[int(e) for e in r[0]]) else: item = None elif attrtype == np.ndarray: dt = dict_attributes[attrname][2] try: item = item.astype(dt) except AttributeError: # it seems arrays of length 1 are stored as scalars item = np.array([item], dtype=dt) elif attrtype == pq.Quantity: ndim = dict_attributes[attrname][1] units = str(getattr(struct, attrname + "_units")) if ndim == 0: item = pq.Quantity(item, units) else: item = pq.Quantity(item, units) elif attrtype == dict: new_item = {} for fn in item._fieldnames: value = getattr(item, fn) if value == PY_NONE: value = None new_item[fn] = value item = new_item else: item = attrtype(item) setattr(ob, attrname, item) neo_id = getattr(struct, "neo_id", None) if neo_id: setattr(ob, "_id", neo_id) return ob def _resolve_references(self, bl): if bl.groups: obj_lookup = {} for ob in bl.children_recur: if hasattr(ob, "_id"): obj_lookup[ob._id] = ob for grp in bl.groups: for container_name in grp._child_containers: container = getattr(grp, container_name) for i, item in enumerate(container): if isinstance(item, _Ref): if not isinstance(item.identifier, (int, np.integer)): raise TypeError( f"item.identifier must be either int or np.integer not of type {type(item.identifier)}" ) # A reference to an object that already exists container[i] = obj_lookup[item.identifier] else: # ChannelView and RegionOfInterest if not item.is_view: raise TypeError(f"`item` must be a view") if not isinstance(item.obj, _Ref): raise TypeError(f"`item.obj` must be a {_Ref} and is of type {type(item.obj)}") item.obj = obj_lookup[item.obj.identifier] class _Ref: def __init__(self, identifier, target_class_name): self.identifier = identifier if target_class_name: self.target_cls = class_by_name[target_class_name] else: self.target_cls = None @property def proxy_for(self): return self.target_cls @property def data_children_recur(self): return [] @property def container_children_recur(self): return [] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/nestio.py0000644000175100001660000007173414743453644015055 0ustar00runnerdocker""" Class for reading output files from NEST simulations ( http://www.nest-simulator.org/ ). Tested with NEST2.10.0 Depends on: numpy, quantities Supported: Read Authors: Julia Sprenger, Maximilian Schmidt, Johanna Senk """ # needed for Python3 compatibility import os.path import warnings from datetime import datetime import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Block, Segment, SpikeTrain, AnalogSignal value_type_dict = {"V": pq.mV, "I": pq.pA, "g": pq.CompoundUnit("10^-9*S"), "no type": pq.dimensionless} class NestIO(BaseIO): """ Class for reading NEST output files. GDF files for the spike data and DAT files for analog signals are possible. Usage: >>> from neo.io.nestio import NestIO >>> files = ['membrane_voltages-1261-0.dat', 'spikes-1258-0.gdf'] >>> r = NestIO(filenames=files) >>> seg = r.read_segment(gid_list=[], t_start=400 * pq.ms, t_stop=600 * pq.ms, id_column_gdf=0, time_column_gdf=1, id_column_dat=0, time_column_dat=1, value_columns_dat=2) """ is_readable = True # class supports reading, but not writing is_writable = False supported_objects = [SpikeTrain, AnalogSignal, Segment, Block] readable_objects = [SpikeTrain, AnalogSignal, Segment, Block] has_header = False is_streameable = False write_params = None # writing is not supported name = "nest" extensions = ["gdf", "dat"] mode = "file" def __init__(self, filenames=None): """ Parameters ---------- filenames: string or list of strings, default=None The filename or list of filenames to load. """ if isinstance(filenames, str): filenames = [filenames] self.filenames = filenames self.avail_formats = {} self.avail_IOs = {} for filename in filenames: path, ext = os.path.splitext(filename) ext = ext.strip(".") if ext in self.extensions: if ext in self.avail_IOs: raise ValueError( f'Received multiple files with "{ext}" ' "extension. Can only load single file of " "this type." ) self.avail_IOs[ext] = ColumnIO(filename) self.avail_formats[ext] = path def __read_analogsignals( self, gid_list, time_unit, t_start=None, t_stop=None, sampling_period=None, id_column=0, time_column=1, value_columns=2, value_types=None, value_units=None, ): """ Internal function called by read_analogsignal() and read_segment(). """ if "dat" not in self.avail_formats: raise ValueError("Can not load analogsignals. No DAT file " "provided.") # checking gid input parameters gid_list, id_column = self._check_input_gids(gid_list, id_column) # checking time input parameters t_start, t_stop = self._check_input_times(t_start, t_stop, mandatory=False) # checking value input parameters (value_columns, value_types, value_units) = self._check_input_values_parameters( value_columns, value_types, value_units ) # defining standard column order for internal usage # [id_column, time_column, value_column1, value_column2, ...] column_ids = [id_column, time_column] + value_columns for i, cid in enumerate(column_ids): if cid is None: column_ids[i] = -1 # assert that no single column is assigned twice column_list = [id_column, time_column] + value_columns column_list_no_None = [c for c in column_list if c is not None] if len(np.unique(column_list_no_None)) < len(column_list_no_None): raise ValueError( "One or more columns have been specified to contain " "the same data. Columns were specified to {column_list_no_None}." "" ) # extracting condition and sorting parameters for raw data loading (condition, condition_column, sorting_column) = self._get_conditions_and_sorting( id_column, time_column, gid_list, t_start, t_stop ) # loading raw data columns data = self.avail_IOs["dat"].get_columns( column_ids=column_ids, condition=condition, condition_column=condition_column, sorting_columns=sorting_column, ) sampling_period = self._check_input_sampling_period(sampling_period, time_column, time_unit, data) analogsignal_list = [] # extracting complete gid list for anasig generation if (gid_list == []) and id_column is not None: gid_list = np.unique(data[:, id_column]) # generate analogsignals for each neuron ID for i in gid_list: selected_ids = self._get_selected_ids(i, id_column, time_column, t_start, t_stop, time_unit, data) # extract starting time of analogsignal if (time_column is not None) and data.size: anasig_start_time = data[selected_ids[0], 1] * time_unit else: # set t_start equal to sampling_period because NEST starts # recording only after 1 sampling_period anasig_start_time = 1.0 * sampling_period # create one analogsignal per value column requested for v_id, value_column in enumerate(value_columns): signal = data[selected_ids[0] : selected_ids[1], value_column] # create AnalogSignal objects and annotate them with # the neuron ID analogsignal_list.append( AnalogSignal( signal * value_units[v_id], sampling_period=sampling_period, t_start=anasig_start_time, id=i, type=value_types[v_id], ) ) # check for correct length of analogsignal assert analogsignal_list[-1].t_stop == anasig_start_time + len(signal) * sampling_period return analogsignal_list def __read_spiketrains(self, gdf_id_list, time_unit, t_start, t_stop, id_column, time_column, **args): """ Internal function for reading multiple spiketrains at once. This function is called by read_spiketrain() and read_segment(). """ if "gdf" not in self.avail_IOs: raise ValueError("Can not load spiketrains. No GDF file provided.") # assert that the file contains spike times if time_column is None: raise ValueError("Time column is None. No spike times to " "be read in.") gdf_id_list, id_column = self._check_input_gids(gdf_id_list, id_column) t_start, t_stop = self._check_input_times(t_start, t_stop, mandatory=True) # assert that no single column is assigned twice if id_column == time_column: raise ValueError("One or more columns have been specified to " "contain the same data.") # defining standard column order for internal usage # [id_column, time_column, value_column1, value_column2, ...] column_ids = [id_column, time_column] for i, cid in enumerate(column_ids): if cid is None: column_ids[i] = -1 (condition, condition_column, sorting_column) = self._get_conditions_and_sorting( id_column, time_column, gdf_id_list, t_start, t_stop ) data = self.avail_IOs["gdf"].get_columns( column_ids=column_ids, condition=condition, condition_column=condition_column, sorting_columns=sorting_column, ) # create a list of SpikeTrains for all neuron IDs in gdf_id_list # assign spike times to neuron IDs if id_column is given if id_column is not None: if (gdf_id_list == []) and id_column is not None: gdf_id_list = np.unique(data[:, id_column]) spiketrain_list = [] for nid in gdf_id_list: selected_ids = self._get_selected_ids(nid, id_column, time_column, t_start, t_stop, time_unit, data) times = data[selected_ids[0] : selected_ids[1], time_column] spiketrain_list.append( SpikeTrain(times, units=time_unit, t_start=t_start, t_stop=t_stop, id=nid, **args) ) # if id_column is not given, all spike times are collected in one # spike train with id=None else: train = data[:, time_column] spiketrain_list = [SpikeTrain(train, units=time_unit, t_start=t_start, t_stop=t_stop, id=None, **args)] return spiketrain_list def _check_input_times(self, t_start, t_stop, mandatory=True): """ Checks input times for existence and setting default values if necessary. t_start: pq.quantity.Quantity, start time of the time range to load. t_stop: pq.quantity.Quantity, stop time of the time range to load. mandatory: bool, if True times can not be None and an error will be raised. if False, time values of None will be replaced by -infinity or infinity, respectively. default: True. """ if t_stop is None: if mandatory: raise ValueError("No t_start specified.") else: t_stop = np.inf * pq.s if t_start is None: if mandatory: raise ValueError("No t_stop specified.") else: t_start = -np.inf * pq.s for time in (t_start, t_stop): if not isinstance(time, pq.quantity.Quantity): raise TypeError(f"Time value ({time}) is not a quantity.") return t_start, t_stop def _check_input_values_parameters(self, value_columns, value_types, value_units): """ Checks value parameters for consistency. value_columns: int, column id containing the value to load. value_types: list of strings, type of values. value_units: list of units of the value columns. Returns adjusted list of [value_columns, value_types, value_units] """ if value_columns is None: raise ValueError("No value column provided.") if isinstance(value_columns, int): value_columns = [value_columns] if value_types is None: value_types = ["no type"] * len(value_columns) elif isinstance(value_types, str): value_types = [value_types] # translating value types into units as far as possible if value_units is None: short_value_types = [vtype.split("_")[0] for vtype in value_types] if not all([svt in value_type_dict for svt in short_value_types]): raise ValueError(f"Can not interpret value types " f'"{value_types}"') value_units = [value_type_dict[svt] for svt in short_value_types] # checking for same number of value types, units and columns if not (len(value_types) == len(value_units) == len(value_columns)): raise ValueError( "Length of value types, units and columns does " f"not match ({len(value_types)},{len(value_units)},{len(value_columns)})" ) if not all([isinstance(vunit, pq.UnitQuantity) for vunit in value_units]): raise ValueError("No value unit or standard value type specified.") return value_columns, value_types, value_units def _check_input_gids(self, gid_list, id_column): """ Checks gid values and column for consistency. gid_list: list of int or None, gid to load. id_column: int, id of the column containing the gids. Returns adjusted list of [gid_list, id_column]. """ if gid_list is None: gid_list = [gid_list] if None in gid_list and id_column is not None: raise ValueError( "No neuron IDs specified but file contains " f"neuron IDs in column {str(id_column)}. Specify empty list to " "retrieve spiketrains of all neurons." "" ) if gid_list != [None] and id_column is None: raise ValueError(f"Specified neuron IDs to be {gid_list}, but no ID column " "specified.") return gid_list, id_column def _check_input_sampling_period(self, sampling_period, time_column, time_unit, data): """ Checks sampling period, times and time unit for consistency. sampling_period: pq.quantity.Quantity, sampling period of data to load. time_column: int, column id of times in data to load. time_unit: pq.quantity.Quantity, unit of time used in the data to load. data: numpy array, the data to be loaded / interpreted. Returns pq.quantities.Quantity object, the updated sampling period. """ if sampling_period is None: if time_column is not None: data_sampling = np.unique(np.diff(sorted(np.unique(data[:, 1])))) if len(data_sampling) > 1: raise ValueError(f"Different sampling distances found in " "data set ({data_sampling})") else: dt = data_sampling[0] else: raise ValueError("Can not estimate sampling rate without time " "column id provided.") sampling_period = pq.CompoundUnit(str(dt) + "*" + time_unit.units.u_symbol) elif not isinstance(sampling_period, pq.UnitQuantity): raise ValueError("sampling_period is not specified as a unit.") return sampling_period def _get_conditions_and_sorting(self, id_column, time_column, gid_list, t_start, t_stop): """ Calculates the condition, condition_column and sorting_column based on other parameters supplied for loading the data. id_column: int, id of the column containing gids. time_column: int, id of the column containing times. gid_list: list of int, gid to be loaded. t_start: pq.quantity.Quantity, start of the time range to be loaded. t_stop: pq.quantity.Quantity, stop of the time range to be loaded. Returns updated [condition, condition_column, sorting_column]. """ condition, condition_column = None, None sorting_column = [] curr_id = 0 if (gid_list != [None]) and (gid_list is not None): if gid_list != []: def condition(x): return x in gid_list condition_column = id_column sorting_column.append(curr_id) # Sorting according to gids first curr_id += 1 if time_column is not None: sorting_column.append(curr_id) # Sorting according to time curr_id += 1 elif t_start != -np.inf and t_stop != np.inf: warnings.warn("Ignoring t_start and t_stop parameters, because no " "time column id is provided.") if sorting_column == []: sorting_column = None else: sorting_column = sorting_column[::-1] return condition, condition_column, sorting_column def _get_selected_ids(self, gid, id_column, time_column, t_start, t_stop, time_unit, data): """ Calculates the data range to load depending on the selected gid and the provided time range (t_start, t_stop) gid: int, gid to be loaded. id_column: int, id of the column containing gids. time_column: int, id of the column containing times. t_start: pq.quantity.Quantity, start of the time range to load. t_stop: pq.quantity.Quantity, stop of the time range to load. time_unit: pq.quantity.Quantity, time unit of the data to load. data: numpy array, data to load. Returns list of selected gids """ gid_ids = np.array([0, data.shape[0]]) if id_column is not None: gid_ids = np.array( [np.searchsorted(data[:, 0], gid, side="left"), np.searchsorted(data[:, 0], gid, side="right")] ) gid_data = data[gid_ids[0] : gid_ids[1], :] # select only requested time range id_shifts = np.array([0, 0]) if time_column is not None: id_shifts[0] = np.searchsorted(gid_data[:, 1], t_start.rescale(time_unit).magnitude, side="left") id_shifts[1] = ( np.searchsorted(gid_data[:, 1], t_stop.rescale(time_unit).magnitude, side="left") - gid_data.shape[0] ) selected_ids = gid_ids + id_shifts return selected_ids def read_block( self, gid_list=None, time_unit=pq.ms, t_start=None, t_stop=None, sampling_period=None, id_column_dat=0, time_column_dat=1, value_columns_dat=2, id_column_gdf=0, time_column_gdf=1, value_types=None, value_units=None, lazy=False, ): assert not lazy, "Do not support lazy" seg = self.read_segment( gid_list, time_unit, t_start, t_stop, sampling_period, id_column_dat, time_column_dat, value_columns_dat, id_column_gdf, time_column_gdf, value_types, value_units, ) blk = Block(file_origin=seg.file_origin, file_datetime=seg.file_datetime) blk.segments.append(seg) return blk def read_segment( self, gid_list=None, time_unit=pq.ms, t_start=None, t_stop=None, sampling_period=None, id_column_dat=0, time_column_dat=1, value_columns_dat=2, id_column_gdf=0, time_column_gdf=1, value_types=None, value_units=None, lazy=False, ): """ Reads a Segment which contains SpikeTrain(s) with specified neuron IDs from the GDF data. Arguments ---------- gid_list : list, default: None A list of GDF IDs of which to return SpikeTrain(s). gid_list must be specified if the GDF file contains neuron IDs, the default None then raises an error. Specify an empty list [] to retrieve the spike trains of all neurons. time_unit : Quantity (time), optional, default: quantities.ms The time unit of recorded time stamps in DAT as well as GDF files. t_start : Quantity (time), optional, default: 0 * pq.ms Start time of SpikeTrain. t_stop : Quantity (time), default: None Stop time of SpikeTrain. t_stop must be specified, the default None raises an error. sampling_period : Quantity (frequency), optional, default: None Sampling period of the recorded data. id_column_dat : int, optional, default: 0 Column index of neuron IDs in the DAT file. time_column_dat : int, optional, default: 1 Column index of time stamps in the DAT file. value_columns_dat : int, optional, default: 2 Column index of the analog values recorded in the DAT file. id_column_gdf : int, optional, default: 0 Column index of neuron IDs in the GDF file. time_column_gdf : int, optional, default: 1 Column index of time stamps in the GDF file. value_types : str, optional, default: None Nest data type of the analog values recorded, eg.'V_m', 'I', 'g_e' value_units : Quantity (amplitude), default: None The physical unit of the recorded signal values. lazy : bool, optional, default: False Returns ------- seg : Segment The Segment contains one SpikeTrain and one AnalogSignal for each ID in gid_list. """ assert not lazy, "Do not support lazy" if isinstance(gid_list, tuple): if gid_list[0] > gid_list[1]: raise ValueError("The second entry in gid_list must be " "greater or equal to the first entry.") gid_list = range(gid_list[0], gid_list[1] + 1) # __read_xxx() needs a list of IDs if gid_list is None: gid_list = [None] # create an empty Segment seg = Segment(file_origin=",".join(self.filenames)) seg.file_datetime = datetime.fromtimestamp(os.stat(self.filenames[0]).st_mtime) # todo: rather than take the first file for the timestamp, we should take the oldest # in practice, there won't be much difference # Load analogsignals and attach to Segment if "dat" in self.avail_formats: seg.analogsignals = self.__read_analogsignals( gid_list, time_unit, t_start, t_stop, sampling_period=sampling_period, id_column=id_column_dat, time_column=time_column_dat, value_columns=value_columns_dat, value_types=value_types, value_units=value_units, ) if "gdf" in self.avail_formats: seg.spiketrains = self.__read_spiketrains( gid_list, time_unit, t_start, t_stop, id_column=id_column_gdf, time_column=time_column_gdf ) return seg def read_analogsignal( self, gid=None, time_unit=pq.ms, t_start=None, t_stop=None, sampling_period=None, id_column=0, time_column=1, value_column=2, value_type=None, value_unit=None, lazy=False, ): """ Reads an AnalogSignal with specified neuron ID from the DAT data. Arguments ---------- gid : int, default: None The GDF ID of the returned SpikeTrain. gdf_id must be specified if the GDF file contains neuron IDs, the default None then raises an error. Specify an empty list [] to retrieve the spike trains of all neurons. time_unit : Quantity (time), optional, default: quantities.ms The time unit of recorded time stamps. t_start : Quantity (time), optional, default: 0 * pq.ms Start time of SpikeTrain. t_stop : Quantity (time), default: None Stop time of SpikeTrain. t_stop must be specified, the default None raises an error. sampling_period : Quantity (frequency), optional, default: None Sampling period of the recorded data. id_column : int, optional, default: 0 Column index of neuron IDs. time_column : int, optional, default: 1 Column index of time stamps. value_column : int, optional, default: 2 Column index of the analog values recorded. value_type : str, optional, default: None Nest data type of the analog values recorded, eg.'V_m', 'I', 'g_e'. value_unit : Quantity (amplitude), default: None The physical unit of the recorded signal values. lazy : bool, optional, default: False Returns ------- spiketrain : SpikeTrain The requested SpikeTrain object with an annotation 'id' corresponding to the gdf_id parameter. """ assert not lazy, "Do not support lazy" # __read_spiketrains() needs a list of IDs return self.__read_analogsignals( [gid], time_unit, t_start, t_stop, sampling_period=sampling_period, id_column=id_column, time_column=time_column, value_columns=value_column, value_types=value_type, value_units=value_unit, )[0] def read_spiketrain( self, gdf_id=None, time_unit=pq.ms, t_start=None, t_stop=None, id_column=0, time_column=1, lazy=False, **args ): """ Reads a SpikeTrain with specified neuron ID from the GDF data. Arguments ---------- gdf_id : int, default: None The GDF ID of the returned SpikeTrain. gdf_id must be specified if the GDF file contains neuron IDs. Providing [] loads all available IDs. time_unit : Quantity (time), optional, default: quantities.ms The time unit of recorded time stamps. t_start : Quantity (time), default: None Start time of SpikeTrain. t_start must be specified. t_stop : Quantity (time), default: None Stop time of SpikeTrain. t_stop must be specified. id_column : int, optional, default: 0 Column index of neuron IDs. time_column : int, optional, default: 1 Column index of time stamps. lazy : bool, optional, default: False Returns ------- spiketrain : SpikeTrain The requested SpikeTrain object with an annotation 'id' corresponding to the gdf_id parameter. """ assert not lazy, "Do not support lazy" if (not isinstance(gdf_id, int)) and gdf_id is not None: raise ValueError("gdf_id has to be of type int or None.") if gdf_id is None and id_column is not None: raise ValueError("No neuron ID specified but file contains " "neuron IDs in column " + str(id_column) + ".") return self.__read_spiketrains([gdf_id], time_unit, t_start, t_stop, id_column, time_column, **args)[0] class ColumnIO: """ Class for reading an ASCII file containing multiple columns of data. """ def __init__(self, filename): """ filename: string, path to ASCII file to read. """ self.filename = filename # read the first line to check the data type (int or float) of the data f = open(self.filename) line = f.readline() additional_parameters = {} if "." not in line: additional_parameters["dtype"] = np.int32 self.data = np.loadtxt(self.filename, **additional_parameters) if len(self.data.shape) == 1: self.data = self.data[:, np.newaxis] def get_columns(self, column_ids="all", condition=None, condition_column=None, sorting_columns=None): """ column_ids : 'all' or list of int, the ids of columns to extract. condition : None or function, which is applied to each row to evaluate if it should be included in the result. Needs to return a bool value. condition_column : int, id of the column on which the condition function is applied to sorting_columns : int or list of int, column ids to sort by. List entries have to be ordered by increasing sorting priority! Returns ------- numpy array containing the requested data. """ if column_ids == [] or column_ids == "all": column_ids = range(self.data.shape[-1]) if isinstance(column_ids, (int, float)): column_ids = [column_ids] column_ids = np.array(column_ids) if column_ids is not None: if max(column_ids) >= len(self.data) - 1: raise ValueError( f"Can not load column ID {max(column_ids)}. File contains " f"only {len(self.data)} columns" ) if sorting_columns is not None: if isinstance(sorting_columns, int): sorting_columns = [sorting_columns] if max(sorting_columns) >= self.data.shape[1]: raise ValueError( f"Can not sort by column ID {max(sorting_columns)}. File contains " f"only {self.data.shape[1]} columns" ) # Starting with whole dataset being selected for return selected_data = self.data # Apply filter condition to rows if condition and (condition_column is None): raise ValueError("Filter condition provided, but no " "condition_column ID provided") elif (condition_column is not None) and (condition is None): warnings.warn("Condition column ID provided, but no condition " "given. No filtering will be performed.") elif (condition is not None) and (condition_column is not None): condition_function = np.vectorize(condition) mask = condition_function(selected_data[:, condition_column]).astype(bool) selected_data = selected_data[mask, :] # Apply sorting if requested if sorting_columns is not None: values_to_sort = selected_data[:, sorting_columns].T ordered_ids = np.lexsort(tuple(values_to_sort[i] for i in range(len(values_to_sort)))) selected_data = selected_data[ordered_ids, :] # Select only requested columns selected_data = selected_data[:, column_ids] return selected_data ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/neuralynxio.py0000644000175100001660000000615614743453644016125 0ustar00runnerdocker""" Class for reading data from Neuralynx files. This IO supports NCS, NEV and NSE file formats. Depends on: numpy Supported: Read Author: Julia Sprenger, Carlos Canova """ import warnings from neo.io.basefromrawio import BaseFromRaw from neo.rawio.neuralynxrawio.neuralynxrawio import NeuralynxRawIO class NeuralynxIO(NeuralynxRawIO, BaseFromRaw): """ Class for reading data from Neuralynx files. This IO supports NCS, NEV, NSE and NTT file formats. NCS contains signals for one channel NEV contains events NSE contains spikes and waveforms for mono electrodes NTT contains spikes and waveforms for tetrodes """ _prefered_signal_group_mode = "group-by-same-units" mode = "dir" def __init__( self, dirname, use_cache=False, cache_path="same_as_resource", include_filenames=None, exclude_filenames=None, keep_original_times=False, filename=None, exclude_filename=None, ): """ Initialise IO instance Parameters ---------- dirname : str Directory containing data files filename : str Deprecated and will be removed. Please use `include_filenames` instead Name of a single ncs, nse, nev, or ntt file to include in dataset. Will be ignored, if dirname is provided. use_cache : bool, optional Cache results of initial file scans for faster loading in subsequent runs. Default: False cache_path : str, optional Folder path to use for cache files. Default: 'same_as_resource' exclude_filename: None, Deprecated and will be removed. Please use `exclude_filenames` instead include_filenames: str or list Filename or list of filenames to be included. This can be absolute path or path relative to dirname. exclude_filenames: str or list Filename or list of filenames to be excluded. Expects base filenames without directory path. keep_original_times : bool Preserve original time stamps as in data files. By default datasets are shifted to begin at t_start = 0*pq.second. Default: False """ if filename is not None: warnings.warn("Deprecated and will be removed. Please use `include_filenames` instead") include_filenames = [filename] if exclude_filename is not None: warnings.warn("Deprecated and will be removed. Please use `exclude_filenames` instead") exclude_filenames = exclude_filename NeuralynxRawIO.__init__( self, dirname=dirname, include_filenames=include_filenames, exclude_filenames=exclude_filenames, keep_original_times=keep_original_times, use_cache=use_cache, cache_path=cache_path, ) if self.rawmode == "one-dir": BaseFromRaw.__init__(self, dirname) elif self.rawmode == "multiple-files": BaseFromRaw.__init__(self, include_filenames=include_filenames) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/neuroexplorerio.py0000644000175100001660000000064414743453644017005 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.neuroexplorerrawio import NeuroExplorerRawIO class NeuroExplorerIO(NeuroExplorerRawIO, BaseFromRaw): """Class for reading data from NeuroExplorer (.nex)""" _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename): NeuroExplorerRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/neuronexusio.py0000644000175100001660000000057714743453644016314 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.neuronexusrawio import NeuroNexusRawIO class NeuroNexusIO(NeuroNexusRawIO, BaseFromRaw): __doc__ = NeuroNexusRawIO.__doc__ _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename): NeuroNexusRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/neuroscopeio.py0000644000175100001660000000070114743453644016250 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.neuroscoperawio import NeuroScopeRawIO class NeuroScopeIO(NeuroScopeRawIO, BaseFromRaw): """ Reading from Neuroscope format files. Ref: http://neuroscope.sourceforge.net/ """ _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename): NeuroScopeRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/neuroshareapiio.py0000644000175100001660000004617114743453644016746 0ustar00runnerdocker""" Class for "reading" data from Neuroshare compatible files (check neuroshare.org) It runs through the whole file and searches for: analog signals, spike cutouts, and trigger events (without duration) Depends on: Neuroshare API 0.9.1, numpy 1.6.1, quantities 0.10.1 Supported: Read Author: Andre Maia Chagas """ # note neo.core needs only numpy and quantities import numpy as np import quantities as pq import os # check to see if the neuroshare bindings are properly imported try: import neuroshare as ns except ImportError as err: print(err) # print('\n neuroshare library not found, loading data will not work!' ) # print('\n be sure to install the library found at:') # print('\n www.http://pythonhosted.org/neuroshare/') else: pass # print('neuroshare library successfully imported') # import BaseIO from neo.io.baseio import BaseIO # import objects from neo.core from neo.core import Segment, AnalogSignal, SpikeTrain, Event, Epoch # create an object based on BaseIO class NeuroshareapiIO(BaseIO): # setting some class parameters is_readable = True # This class can only read data is_writable = False # write is not supported supported_objects = [Segment, AnalogSignal, SpikeTrain, Event, Epoch] has_header = False is_streameable = False readable_objects = [Segment, AnalogSignal, SpikeTrain, Event, Epoch] # This class is not able to write objects writeable_objects = [] # # This is for GUI stuff : a definition for parameters when reading. # # This dict should be keyed by object (`Block`). Each entry is a list # # of tuple. The first entry in each tuple is the parameter name. The # # second entry is a dict with keys 'value' (for default value), # # and 'label' (for a descriptive name). # # Note that if the highest-level object requires parameters, # # common_io_test will be skipped. read_params = { Segment: [ ("segment_duration", {"value": 0.0, "label": "Segment size (s.)"}), ("t_start", {"value": 0.0, "label": "start reading (s.)"}), # ("num_analogsignal", # {'value" : 8, "label" : "Number of recording points"}), # ("num_spiketrain_by_channel', # {"value" : 3, "label" : "Num of spiketrains"}), ], } # # do not supported write so no GUI stuff write_params = None name = "Neuroshare" extensions = ["mcd"] # This object operates on neuroshare files mode = "file" def __init__(self, filename=None, dllname=None): """ Arguments: filename : the filename dllname: the path of the library to use for reading The init function will run automatically upon calling of the class, as in: test = MultichannelIO(filename = filetoberead.mcd), therefore the first operations with the file are set here, so that the user doesn't have to remember to use another method, than the ones defined in the NEO library """ BaseIO.__init__(self) self.filename = str(filename) # set the flags for each event type eventID = 1 analogID = 2 epochID = 3 # if a filename was given, create a dictionary with information that will # be needed later on. if self.filename is not None: if dllname is not None: # converting to string to also accept pathlib objects dllpath = str(dllname) name = os.path.splitext(os.path.basename(dllpath))[0] library = ns.Library(name, dllpath) else: library = None self.fd = ns.File(self.filename, library=library) # get all the metadata from file self.metadata = self.fd.metadata_raw # get sampling rate self.metadata["sampRate"] = 1.0 / self.metadata["TimeStampResolution"] # hz # create lists and array for electrode, spike cutouts and trigger channels self.metadata["elecChannels"] = list() self.metadata["elecChanId"] = list() self.metadata["num_analogs"] = 0 self.metadata["spkChannels"] = list() self.metadata["spkChanId"] = list() self.metadata["num_spkChans"] = 0 self.metadata["triggers"] = list() self.metadata["triggersId"] = list() self.metadata["num_trigs"] = 0 self.metadata["digital epochs"] = list() self.metadata["digiEpochId"] = list() self.metadata["num_digiEpochs"] = 0 # loop through all entities in file to get the indexes for each entity # type, so that one can run through the indexes later, upon reading the # segment for entity in self.fd.entities: # if entity is analog and not the digital line recording # (stored as analog in neuroshare files) if entity.entity_type == analogID and entity.label[0:4] != "digi": # get the electrode number self.metadata["elecChannels"].append(entity.label[-4:]) # get the electrode index self.metadata["elecChanId"].append(entity.id) # increase the number of electrodes found self.metadata["num_analogs"] += 1 # if the entity is a event entitiy and a trigger if entity.entity_type == eventID and entity.label[0:4] == "trig": # get the digital bit/trigger number self.metadata["triggers"].append(entity.label[0:4] + entity.label[-4:]) # get the digital bit index self.metadata["triggersId"].append(entity.id) # increase the number of triggers found self.metadata["num_trigs"] += 1 # if the entity is non triggered digital values with duration if entity.entity_type == eventID and entity.label[0:4] == "digi": # get the digital bit number self.metadata["digital epochs"].append(entity.label[-5:]) # get the digital bit index self.metadata["digiEpochId"].append(entity.id) # increase the number of triggers found self.metadata["num_digiEpochs"] += 1 # if the entity is spike cutouts if entity.entity_type == epochID and entity.label[0:4] == "spks": self.metadata["spkChannels"].append(entity.label[-4:]) self.metadata["spkChanId"].append(entity.id) self.metadata["num_spkChans"] += 1 # function to create a block and read in a segment # def create_block(self, # # ): # # blk=Block(name = self.fileName+"_segment:", # file_datetime = str(self.metadata_raw["Time_Day"])+"/"+ # str(self.metadata_raw["Time_Month"])+"/"+ # str(self.metadata_raw["Time_Year"])+"_"+ # str(self.metadata_raw["Time_Hour"])+":"+ # str(self.metadata_raw["Time_Min"])) # # blk.rec_datetime = blk.file_datetime # return blk # create function to read segment def read_segment( self, lazy=False, # all following arguments are decided by this IO and are free t_start=0.0, segment_duration=0.0, ): """ Return a Segment containing all analog and spike channels, as well as all trigger events. Parameters ---------- segment_duration : float The size in seconds of the segment. num_analogsignal : int Number of AnalogSignal in this segment. num_spiketrain : int Number of SpikeTrain in this segment. """ assert not lazy, "Do not support lazy" # if no segment duration is given, use the complete file if segment_duration == 0.0: segment_duration = float(self.metadata["TimeSpan"]) # if the segment duration is bigger than file, use the complete file if segment_duration >= float(self.metadata["TimeSpan"]): segment_duration = float(self.metadata["TimeSpan"]) # if the time sum of start point and segment duration is bigger than # the file time span, cap it at the end if segment_duration + t_start > float(self.metadata["TimeSpan"]): segment_duration = float(self.metadata["TimeSpan"]) - t_start # create an empty segment seg = Segment(name="segment from the NeuroshareapiIO") # read nested analosignal if self.metadata["num_analogs"] == 0: print("no analog signals in this file!") else: # run through the number of analog channels found at the __init__ function for i in range(self.metadata["num_analogs"]): # create an analog signal object for each channel found ana = self.read_analogsignal( channel_index=self.metadata["elecChanId"][i], segment_duration=segment_duration, t_start=t_start ) # add analog signal read to segment object seg.analogsignals += [ana] # read triggers (in this case without any duration) for i in range(self.metadata["num_trigs"]): # create event object for each trigger/bit found eva = self.read_event( channel_index=self.metadata["triggersId"][i], segment_duration=segment_duration, t_start=t_start, ) # add event object to segment seg.events += [eva] # read epochs (digital events with duration) for i in range(self.metadata["num_digiEpochs"]): # create event object for each trigger/bit found epa = self.read_epoch( channel_index=self.metadata["digiEpochId"][i], segment_duration=segment_duration, t_start=t_start, ) # add event object to segment seg.epochs += [epa] # read nested spiketrain # run through all spike channels found for i in range(self.metadata["num_spkChans"]): # create spike object sptr = self.read_spiketrain( channel_index=self.metadata["spkChanId"][i], segment_duration=segment_duration, t_start=t_start ) # add the spike object to segment seg.spiketrains += [sptr] seg.check_relationships() return seg """ With this IO AnalogSignal can be accessed directly with its channel number """ def read_analogsignal( self, lazy=False, # channel index as given by the neuroshare API channel_index=0, # time in seconds to be read segment_duration=0.0, # time in seconds to start reading from t_start=0.0, ): assert not lazy, "Do not support lazy" # some controls: # if no segment duration is given, use the complete file if segment_duration == 0.0: segment_duration = float(self.metadata["TimeSpan"]) # if the segment duration is bigger than file, use the complete file if segment_duration >= float(self.metadata["TimeSpan"]): segment_duration = float(self.metadata["TimeSpan"]) # get the analog object sig = self.fd.get_entity(channel_index) # get the units (V, mV etc) sigUnits = sig.units # get the electrode number chanName = sig.label[-4:] # transform t_start into index (reading will start from this index) startat = int(t_start * self.metadata["sampRate"]) # get the number of bins to read in bins = int(segment_duration * self.metadata["sampRate"]) # if the number of bins to read is bigger than # the total number of bins, read only till the end of analog object if startat + bins > sig.item_count: bins = sig.item_count - startat # read the data from the sig object sig, _, _ = sig.get_data(index=startat, count=bins) # store it to the 'AnalogSignal' object anasig = AnalogSignal( sig, units=sigUnits, sampling_rate=self.metadata["sampRate"] * pq.Hz, t_start=t_start * pq.s, t_stop=(t_start + segment_duration) * pq.s, channel_index=channel_index, ) # annotate from which electrode the signal comes from anasig.annotate(info=f"signal from channel {chanName}") return anasig # function to read spike trains def read_spiketrain(self, lazy=False, channel_index=0, segment_duration=0.0, t_start=0.0): """ Function to read in spike trains. This API still does not support read in of specific channels as they are recorded. rather the fuunction gets the entity set by 'channel_index' which is set in the __init__ function (all spike channels) """ assert not lazy, "Do not support lazy" # sampling rate sr = self.metadata["sampRate"] # create a list to store spiketrain times times = list() # get the spike data from a specific channel index tempSpks = self.fd.get_entity(channel_index) # transform t_start into index (reading will start from this index) startat = tempSpks.get_index_by_time(t_start, 0) # zero means closest index to value # get the last index to read, using segment duration and t_start # -1 means last index before time endat = tempSpks.get_index_by_time(float(segment_duration + t_start), -1) numIndx = endat - startat # get the end point using segment duration # create a numpy empty array to store the waveforms waveforms = np.array(np.zeros([numIndx, 1, tempSpks.max_sample_count])) # loop through the data from the specific channel index for i in range(startat, endat, 1): # get cutout, timestamp, cutout duration, and spike unit tempCuts, timeStamp, duration, unit = tempSpks.get_data(i) # save the cutout in the waveform matrix waveforms[i, 0, :] = tempCuts[0] # append time stamp to list times.append(timeStamp) # create a spike train object spiketr = SpikeTrain( times, units=pq.s, t_stop=t_start + segment_duration, t_start=t_start * pq.s, name="spikes from electrode" + tempSpks.label[-3:], waveforms=waveforms * pq.volt, sampling_rate=sr * pq.Hz, file_origin=self.filename, annotate=("channel_index:" + str(channel_index)), ) return spiketr def read_event(self, lazy=False, channel_index=0, t_start=0.0, segment_duration=0.0): """function to read digital timestamps. this function only reads the event onset. to get digital event durations, use the epoch function (to be implemented).""" assert not lazy, "Do not support lazy" # create temporary empty lists to store data tempNames = list() tempTimeStamp = list() # get entity from file trigEntity = self.fd.get_entity(channel_index) # transform t_start into index (reading will start from this index) startat = trigEntity.get_index_by_time(t_start, 0) # zero means closest index to value # get the last index to read, using segment duration and t_start endat = trigEntity.get_index_by_time(float(segment_duration + t_start), -1) # -1 means last index before time # numIndx = endat-startat # run through specified intervals in entity for i in range(startat, endat + 1, 1): # trigEntity.item_count): # get in which digital bit was the trigger detected tempNames.append(trigEntity.label[-8:]) # get the time stamps of onset events tempData, onOrOff = trigEntity.get_data(i) # if this was an onset event, save it to the list # on triggered recordings it seems that only onset events are # recorded. On continuous recordings both onset(==1) # and offset(==255) seem to be recorded if onOrOff == 1: # append the time stamp to them empty list tempTimeStamp.append(tempData) # create an event array eva = Event( labels=np.array(tempNames, dtype="U"), times=np.array(tempTimeStamp) * pq.s, file_origin=self.filename, description="the trigger events (without durations)", ) return eva def read_epoch(self, lazy=False, channel_index=0, t_start=0.0, segment_duration=0.0): """function to read digital timestamps. this function reads the event onset and offset and outputs onset and duration. to get only onsets use the event array function""" assert not lazy, "Do not support lazy" # create temporary empty lists to store data tempNames = list() tempTimeStamp = list() durations = list() # get entity from file digEntity = self.fd.get_entity(channel_index) # transform t_start into index (reading will start from this index) startat = digEntity.get_index_by_time(t_start, 0) # zero means closest index to value # get the last index to read, using segment duration and t_start # -1 means last index before time endat = digEntity.get_index_by_time(float(segment_duration + t_start), -1) # run through entity using only odd "i"s for i in range(startat, endat + 1, 1): if i % 2 == 1: # get in which digital bit was the trigger detected tempNames.append(digEntity.label[-8:]) # get the time stamps of even events tempData, onOrOff = digEntity.get_data(i - 1) # if this was an onset event, save it to the list # on triggered recordings it seems that only onset events are # recorded. On continuous recordings both onset(==1) # and offset(==255) seem to be recorded # if onOrOff == 1: # append the time stamp to them empty list tempTimeStamp.append(tempData) # get time stamps of odd events tempData1, onOrOff = digEntity.get_data(i) # if onOrOff == 255: # pass durations.append(tempData1 - tempData) epa = Epoch( file_origin=self.filename, times=np.array(tempTimeStamp) * pq.s, durations=np.array(durations) * pq.s, labels=np.array(tempNames, dtype="U"), description="digital events with duration", ) return epa ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/neurosharectypesio.py0000644000175100001660000004121114743453644017472 0ustar00runnerdocker""" NeuroshareIO is a wrap with ctypes of neuroshare DLLs. Neuroshare is a C API for reading neural data. Neuroshare also provides a Matlab and a Python API on top of that. Neuroshare is an open source API but each dll is provided directly by the vendor. The neo user have to download separtatly the dll on neurosharewebsite: http://neuroshare.sourceforge.net/ For some vendors (Spike2/CED , Clampfit/Abf, ...), neo.io also provides pure Python Neo users you should prefer them of course :) Supported : Read Author: sgarcia """ import sys import ctypes import os import warnings import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Segment, AnalogSignal, SpikeTrain, Event ns_OK = 0 # Function successful ns_LIBERROR = -1 # Generic linked library error ns_TYPEERROR = -2 # Library unable to open file type ns_FILEERROR = -3 # File access or read error ns_BADFILE = -4 # Invalid file handle passed to function ns_BADENTITY = -5 # Invalid or inappropriate entity identifier specified ns_BADSOURCE = -6 # Invalid source identifier specified ns_BADINDEX = -7 # Invalid entity index specified class NeuroshareError(Exception): def __init__(self, lib, errno): self.lib = lib self.errno = errno pszMsgBuffer = ctypes.create_string_buffer(256) self.lib.ns_GetLastErrorMsg(pszMsgBuffer, ctypes.c_uint32(256)) errstr = f"{errno}: {pszMsgBuffer.value}" Exception.__init__(self, errstr) class DllWithError: def __init__(self, lib): self.lib = lib def __getattr__(self, attr): f = getattr(self.lib, attr) return self.decorate_with_error(f) def decorate_with_error(self, f): def func_with_error(*args): errno = f(*args) if errno != ns_OK: raise NeuroshareError(self.lib, errno) return errno return func_with_error class NeurosharectypesIO(BaseIO): """ Class for reading file trougth neuroshare API. The user need the DLLs in the path of the file format. Usage: >>> from neo import io >>> r = io.NeuroshareIO(filename='a_file', dllname=the_name_of_dll) >>> seg = r.read_segment(import_neuroshare_segment=True) >>> print seg.analogsignals # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [>> print seg.spiketrains [] >>> print seg.events [] Note: neuroshare.ns_ENTITY_EVENT: are converted to neo.EventArray neuroshare.ns_ENTITY_ANALOG: are converted to neo.AnalogSignal neuroshare.ns_ENTITY_NEURALEVENT: are converted to neo.SpikeTrain neuroshare.ns_ENTITY_SEGMENT: is something between serie of small AnalogSignal and Spiketrain with associated waveforms. It is arbitrarily converted as SpikeTrain. """ is_readable = True is_writable = False supported_objects = [Segment, AnalogSignal, Event, SpikeTrain] readable_objects = [Segment] writeable_objects = [] has_header = False is_streameable = False read_params = {Segment: []} write_params = None name = "neuroshare" extensions = ["mcd"] mode = "file" def __init__(self, filename="", dllname=""): """ Arguments: filename: the file to read ddlname: the name of neuroshare dll to be used for this file """ BaseIO.__init__(self) self.dllname = dllname self.filename = str(filename) def read_segment(self, import_neuroshare_segment=True, lazy=False): """ Arguments: import_neuroshare_segment: import neuroshare segment as SpikeTrain with associated waveforms or not imported at all. """ assert not lazy, "Do not support lazy" seg = Segment( file_origin=os.path.basename(self.filename), ) if self.dllname == "": warnings.warn("No neuroshare dll provided. Can not load data.") return Segment() if sys.platform.startswith("win"): neuroshare = ctypes.windll.LoadLibrary(self.dllname) elif sys.platform.startswith("linux"): neuroshare = ctypes.cdll.LoadLibrary(self.dllname) neuroshare = DllWithError(neuroshare) # elif sys.platform.startswith('darwin'): # API version info = ns_LIBRARYINFO() neuroshare.ns_GetLibraryInfo(ctypes.byref(info), ctypes.sizeof(info)) seg.annotate(neuroshare_version=str(info.dwAPIVersionMaj) + "." + str(info.dwAPIVersionMin)) # open file hFile = ctypes.c_uint32(0) neuroshare.ns_OpenFile(ctypes.c_char_p(bytes(self.filename, "utf-8")), ctypes.byref(hFile)) fileinfo = ns_FILEINFO() neuroshare.ns_GetFileInfo(hFile, ctypes.byref(fileinfo), ctypes.sizeof(fileinfo)) # read all entities for dwEntityID in range(fileinfo.dwEntityCount): entityInfo = ns_ENTITYINFO() neuroshare.ns_GetEntityInfo(hFile, dwEntityID, ctypes.byref(entityInfo), ctypes.sizeof(entityInfo)) # EVENT if entity_types[entityInfo.dwEntityType] == "ns_ENTITY_EVENT": pEventInfo = ns_EVENTINFO() neuroshare.ns_GetEventInfo(hFile, dwEntityID, ctypes.byref(pEventInfo), ctypes.sizeof(pEventInfo)) if pEventInfo.dwEventType == 0: # TEXT pData = ctypes.create_string_buffer(pEventInfo.dwMaxDataLength) elif pEventInfo.dwEventType == 1: # CVS pData = ctypes.create_string_buffer(pEventInfo.dwMaxDataLength) elif pEventInfo.dwEventType == 2: # 8bit pData = ctypes.c_byte(0) elif pEventInfo.dwEventType == 3: # 16bit pData = ctypes.c_int16(0) elif pEventInfo.dwEventType == 4: # 32bit pData = ctypes.c_int32(0) pdTimeStamp = ctypes.c_double(0.0) pdwDataRetSize = ctypes.c_uint32(0) times = [] labels = [] for dwIndex in range(entityInfo.dwItemCount): neuroshare.ns_GetEventData( hFile, dwEntityID, dwIndex, ctypes.byref(pdTimeStamp), ctypes.byref(pData), ctypes.sizeof(pData), ctypes.byref(pdwDataRetSize), ) times.append(pdTimeStamp.value) labels.append(str(pData.value)) times = times * pq.s labels = np.array(labels, dtype="U") ea = Event(name=str(entityInfo.szEntityLabel), times=times, labels=labels) seg.events.append(ea) # analog if entity_types[entityInfo.dwEntityType] == "ns_ENTITY_ANALOG": pAnalogInfo = ns_ANALOGINFO() neuroshare.ns_GetAnalogInfo(hFile, dwEntityID, ctypes.byref(pAnalogInfo), ctypes.sizeof(pAnalogInfo)) dwIndexCount = entityInfo.dwItemCount pdwContCount = ctypes.c_uint32(0) pData = np.zeros((entityInfo.dwItemCount,), dtype="float64") total_read = 0 while total_read < entityInfo.dwItemCount: dwStartIndex = ctypes.c_uint32(total_read) dwStopIndex = ctypes.c_uint32(entityInfo.dwItemCount - total_read) neuroshare.ns_GetAnalogData( hFile, dwEntityID, dwStartIndex, dwStopIndex, ctypes.byref(pdwContCount), pData[total_read:].ctypes.data_as(ctypes.POINTER(ctypes.c_double)), ) total_read += pdwContCount.value try: signal = pq.Quantity(pData, units=pAnalogInfo.szUnits.decode()) unit_annotation = None except LookupError: signal = pq.Quantity(pData, units="dimensionless") unit_annotation = pAnalogInfo.szUnits.decode() # t_start dwIndex = 0 pdTime = ctypes.c_double(0) neuroshare.ns_GetTimeByIndex(hFile, dwEntityID, dwIndex, ctypes.byref(pdTime)) anaSig = AnalogSignal( signal, sampling_rate=pAnalogInfo.dSampleRate * pq.Hz, t_start=pdTime.value * pq.s, name=str(entityInfo.szEntityLabel), ) anaSig.annotate(probe_info=str(pAnalogInfo.szProbeInfo)) if unit_annotation is not None: anaSig.annotate(units=unit_annotation) seg.analogsignals.append(anaSig) # segment if entity_types[entityInfo.dwEntityType] == "ns_ENTITY_SEGMENT" and import_neuroshare_segment: pdwSegmentInfo = ns_SEGMENTINFO() if not str(entityInfo.szEntityLabel).startswith("spks"): continue neuroshare.ns_GetSegmentInfo( hFile, dwEntityID, ctypes.byref(pdwSegmentInfo), ctypes.sizeof(pdwSegmentInfo) ) nsource = pdwSegmentInfo.dwSourceCount pszMsgBuffer = ctypes.create_string_buffer(" " * 256) neuroshare.ns_GetLastErrorMsg(ctypes.byref(pszMsgBuffer), 256) for dwSourceID in range(pdwSegmentInfo.dwSourceCount): pSourceInfo = ns_SEGSOURCEINFO() neuroshare.ns_GetSegmentSourceInfo( hFile, dwEntityID, dwSourceID, ctypes.byref(pSourceInfo), ctypes.sizeof(pSourceInfo) ) pdTimeStamp = ctypes.c_double(0.0) dwDataBufferSize = pdwSegmentInfo.dwMaxSampleCount * pdwSegmentInfo.dwSourceCount pData = np.zeros((dwDataBufferSize), dtype="float64") pdwSampleCount = ctypes.c_uint32(0) pdwUnitID = ctypes.c_uint32(0) nsample = int(dwDataBufferSize) times = np.empty((entityInfo.dwItemCount), dtype="f") waveforms = np.empty((entityInfo.dwItemCount, nsource, nsample), dtype="f") for dwIndex in range(entityInfo.dwItemCount): neuroshare.ns_GetSegmentData( hFile, dwEntityID, dwIndex, ctypes.byref(pdTimeStamp), pData.ctypes.data_as(ctypes.POINTER(ctypes.c_double)), dwDataBufferSize * 8, ctypes.byref(pdwSampleCount), ctypes.byref(pdwUnitID), ) times[dwIndex] = pdTimeStamp.value waveforms[dwIndex, :, :] = pData[: nsample * nsource].reshape(nsample, nsource).transpose() sptr = SpikeTrain( times=pq.Quantity(times, units="s"), t_stop=times.max(), waveforms=pq.Quantity(waveforms, units=str(pdwSegmentInfo.szUnits)), left_sweep=nsample / 2.0 / float(pdwSegmentInfo.dSampleRate) * pq.s, sampling_rate=float(pdwSegmentInfo.dSampleRate) * pq.Hz, name=str(entityInfo.szEntityLabel), ) seg.spiketrains.append(sptr) # neuralevent if entity_types[entityInfo.dwEntityType] == "ns_ENTITY_NEURALEVENT": pNeuralInfo = ns_NEURALINFO() neuroshare.ns_GetNeuralInfo(hFile, dwEntityID, ctypes.byref(pNeuralInfo), ctypes.sizeof(pNeuralInfo)) pData = np.zeros((entityInfo.dwItemCount,), dtype="float64") dwStartIndex = 0 dwIndexCount = entityInfo.dwItemCount neuroshare.ns_GetNeuralData( hFile, dwEntityID, dwStartIndex, dwIndexCount, pData.ctypes.data_as(ctypes.POINTER(ctypes.c_double)) ) times = pData * pq.s t_stop = times.max() sptr = SpikeTrain( times, t_stop=t_stop, name=str(entityInfo.szEntityLabel), ) seg.spiketrains.append(sptr) # close neuroshare.ns_CloseFile(hFile) seg.check_relationships() return seg # neuroshare structures class ns_FILEDESC(ctypes.Structure): _fields_ = [ ("szDescription", ctypes.c_char * 32), ("szExtension", ctypes.c_char * 8), ("szMacCodes", ctypes.c_char * 8), ("szMagicCode", ctypes.c_char * 16), ] class ns_LIBRARYINFO(ctypes.Structure): _fields_ = [ ("dwLibVersionMaj", ctypes.c_uint32), ("dwLibVersionMin", ctypes.c_uint32), ("dwAPIVersionMaj", ctypes.c_uint32), ("dwAPIVersionMin", ctypes.c_uint32), ("szDescription", ctypes.c_char * 64), ("szCreator", ctypes.c_char * 64), ("dwTime_Year", ctypes.c_uint32), ("dwTime_Month", ctypes.c_uint32), ("dwTime_Day", ctypes.c_uint32), ("dwFlags", ctypes.c_uint32), ("dwMaxFiles", ctypes.c_uint32), ("dwFileDescCount", ctypes.c_uint32), ("FileDesc", ns_FILEDESC * 16), ] class ns_FILEINFO(ctypes.Structure): _fields_ = [ ("szFileType", ctypes.c_char * 32), ("dwEntityCount", ctypes.c_uint32), ("dTimeStampResolution", ctypes.c_double), ("dTimeSpan", ctypes.c_double), ("szAppName", ctypes.c_char * 64), ("dwTime_Year", ctypes.c_uint32), ("dwTime_Month", ctypes.c_uint32), ("dwReserved", ctypes.c_uint32), ("dwTime_Day", ctypes.c_uint32), ("dwTime_Hour", ctypes.c_uint32), ("dwTime_Min", ctypes.c_uint32), ("dwTime_Sec", ctypes.c_uint32), ("dwTime_MilliSec", ctypes.c_uint32), ("szFileComment", ctypes.c_char * 256), ] class ns_ENTITYINFO(ctypes.Structure): _fields_ = [ ("szEntityLabel", ctypes.c_char * 32), ("dwEntityType", ctypes.c_uint32), ("dwItemCount", ctypes.c_uint32), ] entity_types = { 0: "ns_ENTITY_UNKNOWN", 1: "ns_ENTITY_EVENT", 2: "ns_ENTITY_ANALOG", 3: "ns_ENTITY_SEGMENT", 4: "ns_ENTITY_NEURALEVENT", } class ns_EVENTINFO(ctypes.Structure): _fields_ = [ ("dwEventType", ctypes.c_uint32), ("dwMinDataLength", ctypes.c_uint32), ("dwMaxDataLength", ctypes.c_uint32), ("szCSVDesc", ctypes.c_char * 128), ] class ns_ANALOGINFO(ctypes.Structure): _fields_ = [ ("dSampleRate", ctypes.c_double), ("dMinVal", ctypes.c_double), ("dMaxVal", ctypes.c_double), ("szUnits", ctypes.c_char * 16), ("dResolution", ctypes.c_double), ("dLocationX", ctypes.c_double), ("dLocationY", ctypes.c_double), ("dLocationZ", ctypes.c_double), ("dLocationUser", ctypes.c_double), ("dHighFreqCorner", ctypes.c_double), ("dwHighFreqOrder", ctypes.c_uint32), ("szHighFilterType", ctypes.c_char * 16), ("dLowFreqCorner", ctypes.c_double), ("dwLowFreqOrder", ctypes.c_uint32), ("szLowFilterType", ctypes.c_char * 16), ("szProbeInfo", ctypes.c_char * 128), ] class ns_SEGMENTINFO(ctypes.Structure): _fields_ = [ ("dwSourceCount", ctypes.c_uint32), ("dwMinSampleCount", ctypes.c_uint32), ("dwMaxSampleCount", ctypes.c_uint32), ("dSampleRate", ctypes.c_double), ("szUnits", ctypes.c_char * 32), ] class ns_SEGSOURCEINFO(ctypes.Structure): _fields_ = [ ("dMinVal", ctypes.c_double), ("dMaxVal", ctypes.c_double), ("dResolution", ctypes.c_double), ("dSubSampleShift", ctypes.c_double), ("dLocationX", ctypes.c_double), ("dLocationY", ctypes.c_double), ("dLocationZ", ctypes.c_double), ("dLocationUser", ctypes.c_double), ("dHighFreqCorner", ctypes.c_double), ("dwHighFreqOrder", ctypes.c_uint32), ("szHighFilterType", ctypes.c_char * 16), ("dLowFreqCorner", ctypes.c_double), ("dwLowFreqOrder", ctypes.c_uint32), ("szLowFilterType", ctypes.c_char * 16), ("szProbeInfo", ctypes.c_char * 128), ] class ns_NEURALINFO(ctypes.Structure): _fields_ = [ ("dwSourceEntityID", ctypes.c_uint32), ("dwSourceUnitID", ctypes.c_uint32), ("szProbeInfo", ctypes.c_char * 128), ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/nixio.py0000644000175100001660000015766514743453644014712 0ustar00runnerdocker# Copyright (c) 2016, German Neuroinformatics Node (G-Node) # Achilleas Koutsou # # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted under the terms of the BSD License. See # LICENSE file in the root of the Project. """ Module for reading data from files in the NIX format. Author: Achilleas Koutsou This IO supports both writing and reading of NIX files. Reading is supported only if the NIX file was created using this IO. Details on how the Neo object tree is mapped to NIX, as well as details on behaviours specific to this IO, can be found on the wiki of the G-Node fork of Neo: https://github.com/G-Node/python-neo/wiki """ from datetime import date, time, datetime from collections.abc import Iterable from collections import OrderedDict import itertools from uuid import uuid4 import warnings from packaging.version import Version import quantities as pq import numpy as np from .baseio import BaseIO from ..core import ( Block, Segment, AnalogSignal, IrregularlySampledSignal, Epoch, Event, SpikeTrain, ImageSequence, ChannelView, Group, ) from ..io.proxyobjects import BaseProxy from .. import __version__ as neover datetime_types = (date, time, datetime) EMPTYANNOTATION = "EMPTYLIST" ARRAYANNOTATION = "ARRAYANNOTATION" DATETIMEANNOTATION = "DATETIME" DATEANNOTATION = "DATE" TIMEANNOTATION = "TIME" MIN_NIX_VER = Version("1.5.0") datefmt = "%Y-%m-%d" timefmt = "%H:%M:%S.%f" datetimefmt = datefmt + "T" + timefmt def stringify(value): if value is None: return value if isinstance(value, bytes): value = value.decode() return str(value) def create_quantity(values, unitstr): if "*" in unitstr: unit = pq.CompoundUnit(stringify(unitstr)) else: unit = unitstr return pq.Quantity(values, unit) def units_to_string(pqunit): dim = str(pqunit.dimensionality) if dim.startswith("(") and dim.endswith(")"): return dim.strip("()") return dim def dt_to_nix(dt): """ Converts date, time, and datetime objects to an ISO string representation appropriate for storing in NIX. Returns the converted value and the annotation type definition for converting back to the original value type. """ if isinstance(dt, datetime): return dt.strftime(datetimefmt), DATETIMEANNOTATION if isinstance(dt, date): return dt.strftime(datefmt), DATEANNOTATION if isinstance(dt, time): return dt.strftime(timefmt), TIMEANNOTATION # Unknown: returning as is return dt def dt_from_nix(nixdt, annotype): """ Inverse function of 'dt_to_nix()'. Requires the stored annotation type to distinguish between the three source types (date, time, and datetime). """ if annotype == DATEANNOTATION: dt = datetime.strptime(nixdt, datefmt) return dt.date() if annotype == TIMEANNOTATION: dt = datetime.strptime(nixdt, timefmt) return dt.time() if annotype == DATETIMEANNOTATION: dt = datetime.strptime(nixdt, datetimefmt) return dt # Unknown type: older (or newer) IO version? # Returning as is to avoid data loss. return nixdt def check_nix_version(): try: import nixio except ImportError: raise Exception( "Failed to import NIX. " "The NixIO requires the Python package for NIX " "(nixio on PyPi). Try `pip install nixio`." ) # nixio version numbers have a 'v' prefix which breaks the comparison nixverstr = nixio.__version__.lstrip("v") try: nixver = Version(nixverstr) except ValueError: warnings.warn( f"Could not understand NIX Python version {nixverstr}. " f"The NixIO requires version {MIN_NIX_VER} of the Python package for NIX. " "The IO may not work correctly." ) return if nixver < MIN_NIX_VER: raise Exception( "NIX version not supported. " f"The NixIO requires version {MIN_NIX_VER} or higher of the Python package " f"for NIX. Found version {nixverstr}" ) class NixIO(BaseIO): """ Class for reading and writing NIX files. """ is_readable = True is_writable = True supported_objects = [ Block, Segment, Group, ChannelView, AnalogSignal, IrregularlySampledSignal, Epoch, Event, SpikeTrain, ] readable_objects = [Block] writeable_objects = [Block] name = "NIX" extensions = ["h5", "nix"] mode = "file" def __init__(self, filename, mode="rw"): """ Initialise IO instance and NIX file. :param filename: Full path to the file """ check_nix_version() import nixio BaseIO.__init__(self, filename) self.filename = str(filename) if mode == "ro": filemode = nixio.FileMode.ReadOnly elif mode == "rw": filemode = nixio.FileMode.ReadWrite elif mode == "ow": filemode = nixio.FileMode.Overwrite else: raise ValueError( f"Invalid mode specified '{mode}'. " "Valid modes: 'ro' (ReadOnly)', 'rw' (ReadWrite)," " 'ow' (Overwrite)." ) self.nix_file = nixio.File.open(self.filename, filemode) if self.nix_file.mode == nixio.FileMode.ReadOnly: self._file_version = "0.5.2" if "neo" in self.nix_file.sections: self._file_version = self.nix_file.sections["neo"]["version"] elif self.nix_file.mode == nixio.FileMode.ReadWrite: if "neo" in self.nix_file.sections: self._file_version = self.nix_file.sections["neo"]["version"] else: self._file_version = "0.5.2" filemd = self.nix_file.create_section("neo", "neo.metadata") filemd["version"] = self._file_version else: # new file filemd = self.nix_file.create_section("neo", "neo.metadata") filemd["version"] = neover self._file_version = neover self._block_read_counter = 0 # helper maps self._neo_map = dict() self._ref_map = dict() self._signal_map = dict() self._view_map = dict() # _names_ok is used to guard against name check duplication self._names_ok = False def __enter__(self): return self def __exit__(self, *args): self.close() def read_all_blocks(self, lazy=False): if lazy: raise Exception("Lazy loading is not supported for NixIO") return list(self._nix_to_neo_block(blk) for blk in self.nix_file.blocks) def read_block(self, index=None, nixname=None, neoname=None, lazy=False): """ Loads a Block from the NIX file along with all contained child objects and returns the equivalent Neo Block. The Block to read can be specified in one of three ways: - Index (position) in the file - Name of the NIX Block (see [...] for details on the naming) - Name of the original Neo Block If no arguments are specified, the first Block is returned and consecutive calls to the function return the next Block in the file. After all Blocks have been loaded this way, the function returns None. If more than one argument is specified, the precedence order is: index, nixname, neoname Note that Neo objects can be anonymous or have non-unique names, so specifying a Neo name may be ambiguous. See also :meth:`NixIO.iter_blocks`. :param index: The position of the Block to be loaded (creation order) :param nixname: The name of the Block in NIX :param neoname: The name of the original Neo Block """ if lazy: raise Exception("Lazy loading is not supported for NixIO") nix_block = None if index is not None: nix_block = self.nix_file.blocks[index] elif nixname is not None: nix_block = self.nix_file.blocks[nixname] elif neoname is not None: for blk in self.nix_file.blocks: if "neo_name" in blk.metadata and blk.metadata["neo_name"] == neoname: nix_block = blk break else: raise KeyError(f"Block with Neo name '{neoname}' does not exist") else: index = self._block_read_counter if index >= len(self.nix_file.blocks): return None nix_block = self.nix_file.blocks[index] self._block_read_counter += 1 return self._nix_to_neo_block(nix_block) def iter_blocks(self): """ Returns an iterator which can be used to consecutively load and convert all Blocks from the NIX File. """ for blk in self.nix_file.blocks: yield self._nix_to_neo_block(blk) def _nix_to_neo_block(self, nix_block): neo_attrs = self._nix_attr_to_neo(nix_block) neo_block = Block(**neo_attrs) neo_block.rec_datetime = datetime.fromtimestamp(nix_block.created_at) # descend into Groups groups_to_resolve = [] for grp in nix_block.groups: if grp.type == "neo.segment": newseg = self._nix_to_neo_segment(grp) neo_block.segments.append(newseg) elif grp.type == "neo.group": newgrp, parent_name = self._nix_to_neo_group(grp) if parent_name is not None: raise ValueError(f"`parent_name` must be None and is {parent_name}") neo_block.groups.append(newgrp) elif grp.type == "neo.subgroup": newgrp, parent_name = self._nix_to_neo_group(grp) groups_to_resolve.append((newgrp, parent_name)) else: raise Exception("Unexpected group type") # link subgroups to parents for newgrp, parent_name in groups_to_resolve: parent = self._neo_map[parent_name] parent.groups.append(newgrp) # find free floating (Groupless) signals and spiketrains blockdas = self._group_signals(nix_block.data_arrays) for name, das in blockdas.items(): if name not in self._neo_map: if das[0].type == "neo.analogsignal": self._nix_to_neo_analogsignal(das) elif das[0].type == "neo.irregularlysampledsignal": self._nix_to_neo_irregularlysampledsignal(das) elif das[0].type == "neo.imagesequence": self._nix_to_neo_imagesequence(das) for mt in nix_block.multi_tags: if mt.type == "neo.spiketrain" and mt.name not in self._neo_map: self._nix_to_neo_spiketrain(mt) # create object links neo_block.check_relationships() # reset maps self._neo_map = dict() self._ref_map = dict() self._signal_map = dict() self._view_map = dict() return neo_block def _nix_to_neo_segment(self, nix_group): neo_attrs = self._nix_attr_to_neo(nix_group) neo_segment = Segment(**neo_attrs) neo_segment.rec_datetime = datetime.fromtimestamp(nix_group.created_at) self._neo_map[nix_group.name] = neo_segment # this will probably get all the DAs anyway, but if we change any part # of the mapping to add other kinds of DataArrays to a group, such as # MultiTag positions and extents, this filter will be necessary dataarrays = list( filter( lambda da: da.type in ( "neo.analogsignal", "neo.irregularlysampledsignal", "neo.imagesequence", ), nix_group.data_arrays, ) ) dataarrays = self._group_signals(dataarrays) # descend into DataArrays for name, das in dataarrays.items(): if das[0].type == "neo.analogsignal": newasig = self._nix_to_neo_analogsignal(das) neo_segment.analogsignals.append(newasig) elif das[0].type == "neo.irregularlysampledsignal": newisig = self._nix_to_neo_irregularlysampledsignal(das) neo_segment.irregularlysampledsignals.append(newisig) elif das[0].type == "neo.imagesequence": new_imgseq = self._nix_to_neo_imagesequence(das) neo_segment.imagesequences.append(new_imgseq) # descend into MultiTags for mtag in nix_group.multi_tags: if mtag.type == "neo.event": newevent = self._nix_to_neo_event(mtag) neo_segment.events.append(newevent) elif mtag.type == "neo.epoch": newepoch = self._nix_to_neo_epoch(mtag) neo_segment.epochs.append(newepoch) elif mtag.type == "neo.spiketrain": newst = self._nix_to_neo_spiketrain(mtag) neo_segment.spiketrains.append(newst) return neo_segment def _nix_to_neo_group(self, nix_group): neo_attrs = self._nix_attr_to_neo(nix_group) parent_name = neo_attrs.pop("neo_parent", None) neo_group = Group(**neo_attrs) self._neo_map[nix_group.name] = neo_group dataarrays = list( filter( lambda da: da.type in ( "neo.analogsignal", "neo.irregularlysampledsignal", "neo.imagesequence", ), nix_group.data_arrays, ) ) dataarrays = self._group_signals(dataarrays) # descend into DataArrays for name in dataarrays: obj = self._neo_map[name] neo_group.add(obj) # descend into MultiTags for mtag in nix_group.multi_tags: if mtag.type == "neo.channelview" and mtag.name not in self._neo_map: self._nix_to_neo_channelview(mtag) obj = self._neo_map[mtag.name] neo_group.add(obj) return neo_group, parent_name def _nix_to_neo_channelview(self, nix_mtag): neo_attrs = self._nix_attr_to_neo(nix_mtag) index = nix_mtag.positions (nix_name,) = self._group_signals(nix_mtag.references).keys() obj = self._neo_map[nix_name] neo_chview = ChannelView(obj, index, **neo_attrs) self._neo_map[nix_mtag.name] = neo_chview return neo_chview def _nix_to_neo_analogsignal(self, nix_da_group): """ Convert a group of NIX DataArrays to a Neo AnalogSignal. This method expects a list of data arrays that all represent the same, multidimensional Neo AnalogSignal object. :param nix_da_group: a list of NIX DataArray objects :return: a Neo AnalogSignal object """ neo_attrs = self._nix_attr_to_neo(nix_da_group[0]) metadata = nix_da_group[0].metadata neo_attrs["nix_name"] = metadata.name # use the common base name unit = nix_da_group[0].unit signaldata = np.array([d[:] for d in nix_da_group]).transpose() signaldata = create_quantity(signaldata, unit) timedim = self._get_time_dimension(nix_da_group[0]) sampling_period = create_quantity(timedim.sampling_interval, timedim.unit) # t_start should have been added to neo_attrs via the NIX # object's metadata. This may not be present since in older # versions, we didn't store t_start in the metadata when it # wasn't necessary, such as when the timedim.offset and unit # did not require rescaling. if "t_start" in neo_attrs: t_start = neo_attrs["t_start"] del neo_attrs["t_start"] else: t_start = create_quantity(timedim.offset, timedim.unit) neo_signal = AnalogSignal(signal=signaldata, sampling_period=sampling_period, t_start=t_start, **neo_attrs) self._neo_map[neo_attrs["nix_name"]] = neo_signal # all DAs reference the same sources srcnames = list(src.name for src in nix_da_group[0].sources) for n in srcnames: if n not in self._ref_map: self._ref_map[n] = list() self._ref_map[n].append(neo_signal) return neo_signal def _nix_to_neo_imagesequence(self, nix_da_group): """ Convert a group of NIX DataArrays to a Neo ImageSequence. This method expects a list of data arrays that all represent the same, multidimensional Neo ImageSequence object. :param nix_da_group: a list of NIX DataArray objects :return: a Neo ImageSequence object """ neo_attrs = self._nix_attr_to_neo(nix_da_group[0]) metadata = nix_da_group[0].metadata neo_attrs["nix_name"] = metadata.name # use the common base name unit = nix_da_group[0].unit imgseq = np.array([d[:] for d in nix_da_group]).transpose() sampling_rate = neo_attrs["sampling_rate"] del neo_attrs["sampling_rate"] spatial_scale = neo_attrs["spatial_scale"] del neo_attrs["spatial_scale"] if "t_start" in neo_attrs: t_start = neo_attrs["t_start"] del neo_attrs["t_start"] else: t_start = 0.0 * pq.ms neo_seq = ImageSequence( image_data=imgseq, sampling_rate=sampling_rate, spatial_scale=spatial_scale, units=unit, t_start=t_start, **neo_attrs, ) self._neo_map[neo_attrs["nix_name"]] = neo_seq # all DAs reference the same sources srcnames = list(src.name for src in nix_da_group[0].sources) for n in srcnames: if n not in self._ref_map: self._ref_map[n] = list() self._ref_map[n].append(neo_seq) return neo_seq def _nix_to_neo_irregularlysampledsignal(self, nix_da_group): """ Convert a group of NIX DataArrays to a Neo IrregularlySampledSignal. This method expects a list of data arrays that all represent the same, multidimensional Neo IrregularlySampledSignal object. :param nix_da_group: a list of NIX DataArray objects :return: a Neo IrregularlySampledSignal object """ neo_attrs = self._nix_attr_to_neo(nix_da_group[0]) metadata = nix_da_group[0].metadata neo_attrs["nix_name"] = metadata.name # use the common base name unit = nix_da_group[0].unit signaldata = np.array([d[:] for d in nix_da_group]).transpose() signaldata = create_quantity(signaldata, unit) timedim = self._get_time_dimension(nix_da_group[0]) times = create_quantity(timedim.ticks, timedim.unit) neo_signal = IrregularlySampledSignal(signal=signaldata, times=times, **neo_attrs) self._neo_map[neo_attrs["nix_name"]] = neo_signal # all DAs reference the same sources srcnames = list(src.name for src in nix_da_group[0].sources) for n in srcnames: if n not in self._ref_map: self._ref_map[n] = list() self._ref_map[n].append(neo_signal) return neo_signal def _nix_to_neo_event(self, nix_mtag): neo_attrs = self._nix_attr_to_neo(nix_mtag) time_unit = nix_mtag.positions.unit times = create_quantity(nix_mtag.positions, time_unit) labels = np.array(nix_mtag.positions.dimensions[0].labels, dtype="U") neo_event = Event(times=times, labels=labels, **neo_attrs) self._neo_map[nix_mtag.name] = neo_event return neo_event def _nix_to_neo_epoch(self, nix_mtag): neo_attrs = self._nix_attr_to_neo(nix_mtag) time_unit = nix_mtag.positions.unit times = create_quantity(nix_mtag.positions, time_unit) durations = create_quantity(nix_mtag.extents, nix_mtag.extents.unit) if len(nix_mtag.positions.dimensions[0].labels) > 0: labels = np.array(nix_mtag.positions.dimensions[0].labels, dtype="U") else: labels = None neo_epoch = Epoch(times=times, durations=durations, labels=labels, **neo_attrs) self._neo_map[nix_mtag.name] = neo_epoch return neo_epoch def _nix_to_neo_spiketrain(self, nix_mtag): neo_attrs = self._nix_attr_to_neo(nix_mtag) time_unit = nix_mtag.positions.unit times = create_quantity(nix_mtag.positions, time_unit) neo_spiketrain = SpikeTrain(times=times, **neo_attrs) if nix_mtag.features: wfda = nix_mtag.features[0].data wftime = self._get_time_dimension(wfda) neo_spiketrain.waveforms = create_quantity(wfda, wfda.unit) interval_units = wftime.unit neo_spiketrain.sampling_period = create_quantity(wftime.sampling_interval, interval_units) left_sweep_units = wftime.unit if "left_sweep" in wfda.metadata: neo_spiketrain.left_sweep = create_quantity(wfda.metadata["left_sweep"], left_sweep_units) self._neo_map[nix_mtag.name] = neo_spiketrain srcnames = list(src.name for src in nix_mtag.sources) for n in srcnames: if n not in self._ref_map: self._ref_map[n] = list() self._ref_map[n].append(neo_spiketrain) return neo_spiketrain def write_all_blocks(self, neo_blocks, use_obj_names=False): """ Convert all ``neo_blocks`` to the NIX equivalent and write them to the file. :param neo_blocks: List (or iterable) containing Neo blocks :param use_obj_names: If True, will not generate unique object names but will instead try to use the name of each Neo object. If these are not unique, an exception will be raised. """ if use_obj_names: self._use_obj_names(neo_blocks) self._names_ok = True for bl in neo_blocks: self.write_block(bl, use_obj_names) def write_block(self, block, use_obj_names=False): """ Convert the provided Neo Block to a NIX Block and write it to the NIX file. :param block: Neo Block to be written :param use_obj_names: If True, will not generate unique object names but will instead try to use the name of each Neo object. If these are not unique, an exception will be raised. """ if use_obj_names: if not self._names_ok: # _names_ok guards against check duplication # If it's False, it means write_block() was called directly self._use_obj_names([block]) if "nix_name" in block.annotations: nix_name = block.annotations["nix_name"] else: nix_name = f"neo.block.{self._generate_nix_name()}" block.annotate(nix_name=nix_name) if nix_name in self.nix_file.blocks: nixblock = self.nix_file.blocks[nix_name] del self.nix_file.blocks[nix_name] del self.nix_file.sections[nix_name] nixblock = self.nix_file.create_block(nix_name, "neo.block") nixblock.metadata = self.nix_file.create_section(nix_name, "neo.block.metadata") metadata = nixblock.metadata neoname = block.name if block.name is not None else "" metadata["neo_name"] = neoname nixblock.definition = block.description if block.rec_datetime: nix_rec_dt = int(block.rec_datetime.timestamp()) nixblock.force_created_at(nix_rec_dt) if block.file_datetime: fdt, annotype = dt_to_nix(block.file_datetime) fdtprop = metadata.create_property("file_datetime", fdt) fdtprop.definition = annotype if block.annotations: for k, v in block.annotations.items(): self._write_property(metadata, k, v) # descend into Segments for seg in block.segments: self._write_segment(seg, nixblock) # descend into Neo Groups for group in block.groups: self._write_group(group, nixblock) def _write_channelview(self, chview, nixblock, nixgroup): """ Convert the provided Neo ChannelView to a NIX MultiTag and write it to the NIX file. :param chx: The Neo ChannelView to be written :param nixblock: NIX Block where the MultiTag will be created """ if "nix_name" in chview.annotations: nix_name = chview.annotations["nix_name"] else: nix_name = f"neo.channelview.{self._generate_nix_name()}" chview.annotate(nix_name=nix_name) # create a new data array if this channelview was not saved yet if not nix_name in self._view_map: channels = nixblock.create_data_array(f"{nix_name}.index", "neo.channelview.index", data=chview.index) nixmt = nixblock.create_multi_tag(nix_name, "neo.channelview", positions=channels) nixmt.metadata = nixgroup.metadata.create_section(nix_name, "neo.channelview.metadata") metadata = nixmt.metadata neoname = chview.name if chview.name is not None else "" metadata["neo_name"] = neoname nixmt.definition = chview.description if chview.annotations: for k, v in chview.annotations.items(): self._write_property(metadata, k, v) self._view_map[nix_name] = nixmt # link tag to the data array for the ChannelView's signal if not ("nix_name" in chview.obj.annotations and chview.obj.annotations["nix_name"] in self._signal_map): # the following restriction could be relaxed later # but for a first pass this simplifies my mental model raise Exception("Need to save signals before saving views") nix_name = chview.obj.annotations["nix_name"] nixmt.references.extend(self._signal_map[nix_name]) else: nixmt = self._view_map[nix_name] nixgroup.multi_tags.append(nixmt) def _write_segment(self, segment, nixblock): """ Convert the provided Neo Segment to a NIX Group and write it to the NIX file. :param segment: Neo Segment to be written :param nixblock: NIX Block where the Group will be created """ if "nix_name" in segment.annotations: nix_name = segment.annotations["nix_name"] else: nix_name = f"neo.segment.{self._generate_nix_name()}" segment.annotate(nix_name=nix_name) nixgroup = nixblock.create_group(nix_name, "neo.segment") nixgroup.metadata = nixblock.metadata.create_section(nix_name, "neo.segment.metadata") metadata = nixgroup.metadata neoname = segment.name if segment.name is not None else "" metadata["neo_name"] = neoname nixgroup.definition = segment.description if segment.rec_datetime: nix_rec_dt = int(segment.rec_datetime.strftime("%s")) nixgroup.force_created_at(nix_rec_dt) if segment.file_datetime: fdt, annotype = dt_to_nix(segment.file_datetime) fdtprop = metadata.create_property("file_datetime", fdt) fdtprop.definition = annotype if segment.annotations: for k, v in segment.annotations.items(): self._write_property(metadata, k, v) # write signals, events, epochs, and spiketrains for asig in segment.analogsignals: self._write_analogsignal(asig, nixblock, nixgroup) for isig in segment.irregularlysampledsignals: self._write_irregularlysampledsignal(isig, nixblock, nixgroup) for event in segment.events: self._write_event(event, nixblock, nixgroup) for epoch in segment.epochs: self._write_epoch(epoch, nixblock, nixgroup) for spiketrain in segment.spiketrains: self._write_spiketrain(spiketrain, nixblock, nixgroup) for imagesequence in segment.imagesequences: self._write_imagesequence(imagesequence, nixblock, nixgroup) def _write_group(self, neo_group, nixblock, parent=None): """ Convert the provided Neo Group to a NIX Group and write it to the NIX file. :param neo_group: Neo Group to be written :param nixblock: NIX Block where the NIX Group will be created :param parent: for sub-groups, the parent Neo Group """ if parent: label = "neo.subgroup" # note that the use of a different label for top-level groups and sub-groups is not # strictly necessary, the presence of the "neo_parent" annotation is sufficient. # However, I think it adds clarity and helps in debugging and testing. else: label = "neo.group" if "nix_name" in neo_group.annotations: nix_name = neo_group.annotations["nix_name"] else: nix_name = f"{label}.{self._generate_nix_name()}" neo_group.annotate(nix_name=nix_name) nixgroup = nixblock.create_group(nix_name, label) nixgroup.metadata = nixblock.metadata.create_section(nix_name, f"{label}.metadata") metadata = nixgroup.metadata neoname = neo_group.name if neo_group.name is not None else "" metadata["neo_name"] = neoname if parent: metadata["neo_parent"] = parent.annotations["nix_name"] nixgroup.definition = neo_group.description if neo_group.annotations: for k, v in neo_group.annotations.items(): self._write_property(metadata, k, v) # link signals and image sequences objnames = [] for obj in itertools.chain( neo_group.analogsignals, neo_group.irregularlysampledsignals, neo_group.imagesequences, ): if not ("nix_name" in obj.annotations and obj.annotations["nix_name"] in self._signal_map): # the following restriction could be relaxed later # but for a first pass this simplifies my mental model raise Exception("Orphan signals/image sequences cannot be stored, needs to belong to a Segment") objnames.append(obj.annotations["nix_name"]) for name in objnames: for da in self._signal_map[name]: nixgroup.data_arrays.append(da) # link events, epochs and spiketrains objnames = [] for obj in itertools.chain( neo_group.events, neo_group.epochs, neo_group.spiketrains, ): if not ("nix_name" in obj.annotations and obj.annotations["nix_name"] in nixblock.multi_tags): # the following restriction could be relaxed later # but for a first pass this simplifies my mental model raise Exception("Orphan epochs/events/spiketrains cannot be stored, needs to belong to a Segment") objnames.append(obj.annotations["nix_name"]) for name in objnames: mt = nixblock.multi_tags[name] nixgroup.multi_tags.append(mt) # save channel views for chview in neo_group.channelviews: self._write_channelview(chview, nixblock, nixgroup) # save sub-groups for subgroup in neo_group.groups: self._write_group(subgroup, nixblock, parent=neo_group) def _write_analogsignal(self, anasig, nixblock, nixgroup): """ Convert the provided ``anasig`` (AnalogSignal) to a list of NIX DataArray objects and write them to the NIX file. All DataArray objects created from the same AnalogSignal have their metadata section point to the same object. :param anasig: The Neo AnalogSignal to be written :param nixblock: NIX Block where the DataArrays will be created :param nixgroup: NIX Group where the DataArrays will be attached """ if "nix_name" in anasig.annotations: nix_name = anasig.annotations["nix_name"] else: nix_name = f"neo.analogsignal.{self._generate_nix_name()}" anasig.annotate(nix_name=nix_name) if f"{nix_name}.0" in nixblock.data_arrays and nixgroup: # AnalogSignal is in multiple Segments. # Append DataArrays to Group and return. dalist = list() for idx in itertools.count(): daname = f"{nix_name}.{idx}" if daname in nixblock.data_arrays: dalist.append(nixblock.data_arrays[daname]) else: break nixgroup.data_arrays.extend(dalist) return if isinstance(anasig, BaseProxy): data = np.transpose(anasig.load()[:].magnitude) else: data = np.transpose(anasig[:].magnitude) parentmd = nixgroup.metadata if nixgroup else nixblock.metadata metadata = parentmd.create_section(nix_name, "neo.analogsignal.metadata") nixdas = list() for idx, row in enumerate(data): daname = f"{nix_name}.{idx}" da = nixblock.create_data_array(daname, "neo.analogsignal", data=row) da.metadata = metadata da.definition = anasig.description da.unit = units_to_string(anasig.units) sampling_period = anasig.sampling_period.magnitude.item() timedim = da.append_sampled_dimension(sampling_period) timedim.unit = units_to_string(anasig.sampling_period.units) tstart = anasig.t_start metadata["t_start"] = tstart.magnitude.item() metadata.props["t_start"].unit = units_to_string(tstart.units) timedim.offset = tstart.rescale(timedim.unit).magnitude.item() timedim.label = "time" nixdas.append(da) if nixgroup: nixgroup.data_arrays.append(da) neoname = anasig.name if anasig.name is not None else "" metadata["neo_name"] = neoname if anasig.annotations: for k, v in anasig.annotations.items(): self._write_property(metadata, k, v) if anasig.array_annotations: for k, v in anasig.array_annotations.items(): p = self._write_property(metadata, k, v) p.type = ARRAYANNOTATION self._signal_map[nix_name] = nixdas def _write_imagesequence(self, imgseq, nixblock, nixgroup): """ Convert the provided ``imgseq`` (ImageSequence) to a list of NIX DataArray objects and write them to the NIX file. All DataArray objects created from the same ImageSequence have their metadata section point to the same object. :param anasig: The Neo ImageSequence to be written :param nixblock: NIX Block where the DataArrays will be created :param nixgroup: NIX Group where the DataArrays will be attached """ if "nix_name" in imgseq.annotations: nix_name = imgseq.annotations["nix_name"] else: nix_name = f"neo.imagesequence.{self._generate_nix_name()}" imgseq.annotate(nix_name=nix_name) if f"{nix_name}.0" in nixblock.data_arrays and nixgroup: dalist = list() for idx in itertools.count(): daname = f"{nix_name}.{idx}" if daname in nixblock.data_arrays: dalist.append(nixblock.data_arrays[daname]) else: break nixgroup.data_arrays.extend(dalist) return if isinstance(imgseq, BaseProxy): data = np.transpose(imgseq.load()[:].magnitude) else: data = np.transpose(imgseq[:].magnitude) parentmd = nixgroup.metadata if nixgroup else nixblock.metadata metadata = parentmd.create_section(nix_name, "neo.imagesequence.metadata") nixdas = list() for idx, row in enumerate(data): daname = f"{nix_name}.{idx}" da = nixblock.create_data_array(daname, "neo.imagesequence", data=row) da.metadata = metadata da.definition = imgseq.description da.unit = units_to_string(imgseq.units) metadata["sampling_rate"] = imgseq.sampling_rate.magnitude.item() units = imgseq.sampling_rate.units metadata.props["sampling_rate"].unit = units_to_string(units) metadata["spatial_scale"] = imgseq.spatial_scale.magnitude.item() units = imgseq.spatial_scale.units metadata.props["spatial_scale"].unit = units_to_string(units) metadata["t_start"] = imgseq.t_start.magnitude.item() units = imgseq.t_start.units metadata.props["t_start"].unit = units_to_string(units) nixdas.append(da) if nixgroup: nixgroup.data_arrays.append(da) neoname = imgseq.name if imgseq.name is not None else "" metadata["neo_name"] = neoname if imgseq.annotations: for k, v in imgseq.annotations.items(): self._write_property(metadata, k, v) self._signal_map[nix_name] = nixdas def _write_irregularlysampledsignal(self, irsig, nixblock, nixgroup): """ Convert the provided ``irsig`` (IrregularlySampledSignal) to a list of NIX DataArray objects and write them to the NIX file at the location. All DataArray objects created from the same IrregularlySampledSignal have their metadata section point to the same object. :param irsig: The Neo IrregularlySampledSignal to be written :param nixblock: NIX Block where the DataArrays will be created :param nixgroup: NIX Group where the DataArrays will be attached """ if "nix_name" in irsig.annotations: nix_name = irsig.annotations["nix_name"] else: nix_name = f"neo.irregularlysampledsignal.{self._generate_nix_name()}" irsig.annotate(nix_name=nix_name) if f"{nix_name}.0" in nixblock.data_arrays and nixgroup: # IrregularlySampledSignal is in multiple Segments. # Append DataArrays to Group and return. dalist = list() for idx in itertools.count(): daname = f"{nix_name}.{idx}" if daname in nixblock.data_arrays: dalist.append(nixblock.data_arrays[daname]) else: break nixgroup.data_arrays.extend(dalist) return if isinstance(irsig, BaseProxy): data = np.transpose(irsig.load()[:].magnitude) else: data = np.transpose(irsig[:].magnitude) parentmd = nixgroup.metadata if nixgroup else nixblock.metadata metadata = parentmd.create_section(nix_name, "neo.irregularlysampledsignal.metadata") nixdas = list() for idx, row in enumerate(data): daname = f"{nix_name}.{idx}" da = nixblock.create_data_array(daname, "neo.irregularlysampledsignal", data=row) da.metadata = metadata da.definition = irsig.description da.unit = units_to_string(irsig.units) timedim = da.append_range_dimension(irsig.times.magnitude) timedim.unit = units_to_string(irsig.times.units) timedim.label = "time" nixdas.append(da) if nixgroup: nixgroup.data_arrays.append(da) neoname = irsig.name if irsig.name is not None else "" metadata["neo_name"] = neoname if irsig.annotations: for k, v in irsig.annotations.items(): self._write_property(metadata, k, v) if irsig.array_annotations: for k, v in irsig.array_annotations.items(): p = self._write_property(metadata, k, v) p.type = ARRAYANNOTATION self._signal_map[nix_name] = nixdas def _write_event(self, event, nixblock, nixgroup): """ Convert the provided Neo Event to a NIX MultiTag and write it to the NIX file. :param event: The Neo Event to be written :param nixblock: NIX Block where the MultiTag will be created :param nixgroup: NIX Group where the MultiTag will be attached """ if "nix_name" in event.annotations: nix_name = event.annotations["nix_name"] else: nix_name = f"neo.event.{self._generate_nix_name()}" event.annotate(nix_name=nix_name) if nix_name in nixblock.multi_tags: # Event is in multiple Segments. Append to Group and return. mt = nixblock.multi_tags[nix_name] nixgroup.multi_tags.append(mt) return if isinstance(event, BaseProxy): event = event.load() times = event.times.magnitude units = units_to_string(event.times.units) labels = event.labels timesda = nixblock.create_data_array(f"{nix_name}.times", "neo.event.times", data=times) timesda.unit = units nixmt = nixblock.create_multi_tag(nix_name, "neo.event", positions=timesda) nixmt.metadata = nixgroup.metadata.create_section(nix_name, "neo.event.metadata") metadata = nixmt.metadata labeldim = timesda.append_set_dimension() labeldim.labels = labels neoname = event.name if event.name is not None else "" metadata["neo_name"] = neoname nixmt.definition = event.description if event.annotations: for k, v in event.annotations.items(): self._write_property(metadata, k, v) if event.array_annotations: for k, v in event.array_annotations.items(): p = self._write_property(metadata, k, v) p.type = ARRAYANNOTATION nixgroup.multi_tags.append(nixmt) # reference all AnalogSignals and IrregularlySampledSignals in Group for da in nixgroup.data_arrays: if da.type in ("neo.analogsignal", "neo.irregularlysampledsignal"): nixmt.references.append(da) def _write_epoch(self, epoch, nixblock, nixgroup): """ Convert the provided Neo Epoch to a NIX MultiTag and write it to the NIX file. :param epoch: The Neo Epoch to be written :param nixblock: NIX Block where the MultiTag will be created :param nixgroup: NIX Group where the MultiTag will be attached """ if "nix_name" in epoch.annotations: nix_name = epoch.annotations["nix_name"] else: nix_name = f"neo.epoch.{self._generate_nix_name()}" epoch.annotate(nix_name=nix_name) if nix_name in nixblock.multi_tags: # Epoch is in multiple Segments. Append to Group and return. mt = nixblock.multi_tags[nix_name] nixgroup.multi_tags.append(mt) return if isinstance(epoch, BaseProxy): epoch = epoch.load() times = epoch.times.magnitude tunits = units_to_string(epoch.times.units) durations = epoch.durations.magnitude dunits = units_to_string(epoch.durations.units) timesda = nixblock.create_data_array(f"{nix_name}.times", "neo.epoch.times", data=times) timesda.unit = tunits nixmt = nixblock.create_multi_tag(nix_name, "neo.epoch", positions=timesda) durada = nixblock.create_data_array(f"{nix_name}.durations", "neo.epoch.durations", data=durations) durada.unit = dunits nixmt.extents = durada nixmt.metadata = nixgroup.metadata.create_section(nix_name, "neo.epoch.metadata") metadata = nixmt.metadata labeldim = timesda.append_set_dimension() labeldim.labels = epoch.labels neoname = epoch.name if epoch.name is not None else "" metadata["neo_name"] = neoname nixmt.definition = epoch.description if epoch.annotations: for k, v in epoch.annotations.items(): self._write_property(metadata, k, v) if epoch.array_annotations: for k, v in epoch.array_annotations.items(): p = self._write_property(metadata, k, v) p.type = ARRAYANNOTATION nixgroup.multi_tags.append(nixmt) # reference all AnalogSignals and IrregularlySampledSignals in Group for da in nixgroup.data_arrays: if da.type in ("neo.analogsignal", "neo.irregularlysampledsignal"): nixmt.references.append(da) def _write_spiketrain(self, spiketrain, nixblock, nixgroup): """ Convert the provided Neo SpikeTrain to a NIX MultiTag and write it to the NIX file. :param spiketrain: The Neo SpikeTrain to be written :param nixblock: NIX Block where the MultiTag will be created :param nixgroup: NIX Group where the MultiTag will be attached """ import nixio if "nix_name" in spiketrain.annotations: nix_name = spiketrain.annotations["nix_name"] else: nix_name = f"neo.spiketrain.{self._generate_nix_name()}" spiketrain.annotate(nix_name=nix_name) if nix_name in nixblock.multi_tags and nixgroup: # SpikeTrain is in multiple Segments. Append to Group and return. mt = nixblock.multi_tags[nix_name] nixgroup.multi_tags.append(mt) return if isinstance(spiketrain, BaseProxy): spiketrain = spiketrain.load(load_waveforms=True) times = spiketrain.times.magnitude tunits = units_to_string(spiketrain.times.units) waveforms = spiketrain.waveforms timesda = nixblock.create_data_array(f"{nix_name}.times", "neo.spiketrain.times", data=times) timesda.unit = tunits nixmt = nixblock.create_multi_tag(nix_name, "neo.spiketrain", positions=timesda) parentmd = nixgroup.metadata if nixgroup else nixblock.metadata nixmt.metadata = parentmd.create_section(nix_name, "neo.spiketrain.metadata") metadata = nixmt.metadata neoname = spiketrain.name if spiketrain.name is not None else "" metadata["neo_name"] = neoname nixmt.definition = spiketrain.description self._write_property(metadata, "t_start", spiketrain.t_start) self._write_property(metadata, "t_stop", spiketrain.t_stop) if spiketrain.annotations: for k, v in spiketrain.annotations.items(): self._write_property(metadata, k, v) if spiketrain.array_annotations: for k, v in spiketrain.array_annotations.items(): p = self._write_property(metadata, k, v) p.type = ARRAYANNOTATION if nixgroup: nixgroup.multi_tags.append(nixmt) if waveforms is not None: wfdata = list(wf.magnitude for wf in list(wfgroup for wfgroup in spiketrain.waveforms)) wfunits = units_to_string(spiketrain.waveforms.units) wfda = nixblock.create_data_array(f"{nix_name}.waveforms", "neo.waveforms", data=wfdata) wfda.unit = wfunits wfda.metadata = nixmt.metadata.create_section(wfda.name, "neo.waveforms.metadata") nixmt.create_feature(wfda, nixio.LinkType.Indexed) # TODO: Move time dimension first for PR #457 # https://github.com/NeuralEnsemble/python-neo/pull/457 wfda.append_set_dimension() wfda.append_set_dimension() wftime = wfda.append_sampled_dimension(spiketrain.sampling_period.magnitude.item()) wftime.unit = units_to_string(spiketrain.sampling_period.units) wftime.label = "time" if spiketrain.left_sweep is not None: self._write_property(wfda.metadata, "left_sweep", spiketrain.left_sweep) @staticmethod def _generate_nix_name(): return uuid4().hex def _write_property(self, section, name, v): """ Create a metadata property with a given name and value on the provided metadata section. :param section: The metadata section to hold the new property :param name: The name of the property :param v: The value to write :return: The newly created property """ import nixio if isinstance(v, datetime_types): value, annotype = dt_to_nix(v) prop = section.create_property(name, value) prop.definition = annotype elif isinstance(v, str): if len(v): section.create_property(name, v) else: section.create_property(name, nixio.DataType.String) elif isinstance(v, bytes): section.create_property(name, v.decode()) elif isinstance(v, Iterable): values = [] unit = None definition = None # handling (quantity) arrays with only a single element if hasattr(v, "ndim") and v.ndim == 0: values = v.item() # handling empty arrays or lists elif (hasattr(v, "size") and (v.size == 0)) or (len(v) == 0): # NIX supports empty properties but dtype must be specified # Defaulting to String and using definition to signify empty # iterable as opposed to empty string values = nixio.DataType.String definition = EMPTYANNOTATION else: for item in v: if isinstance(item, str): item = item elif isinstance(item, pq.Quantity): current_unit = str(item.dimensionality) if unit is None: unit = current_unit elif unit != current_unit: raise ValueError(f"Inconsistent units detected for " f"property {name}: {v}") item = item.magnitude.item() elif isinstance(item, Iterable): self.logger.warn( "Multidimensional arrays and nested " "containers are not currently " "supported when writing to NIX." ) return None else: item = item values.append(item) if hasattr(v, "dimensionality"): unit = str(v.dimensionality) section.create_property(name, values) section.props[name].unit = unit section.props[name].definition = definition elif type(v).__module__ == "numpy": section.create_property(name, v.item()) else: section.create_property(name, v) return section.props[name] @staticmethod def _nix_attr_to_neo(nix_obj): """ Reads common attributes and metadata from a NIX object and populates a dictionary with Neo-compatible attributes and annotations. Common attributes: neo_name, nix_name, description, file_datetime (if applicable). Metadata: For properties that specify a 'unit', a Quantity object is created. """ import nixio neo_attrs = dict() neo_attrs["nix_name"] = nix_obj.name neo_attrs["description"] = stringify(nix_obj.definition) if nix_obj.metadata: for prop in nix_obj.metadata.inherited_properties(): values = list(prop.values) if not len(values): if prop.definition == EMPTYANNOTATION: values = list() elif prop.data_type == nixio.DataType.String: values = "" elif len(values) == 1: values = values[0] if prop.unit: units = prop.unit values = create_quantity(values, units) if prop.definition in (DATEANNOTATION, TIMEANNOTATION, DATETIMEANNOTATION): values = dt_from_nix(values, prop.definition) if prop.type == ARRAYANNOTATION: if "array_annotations" in neo_attrs: neo_attrs["array_annotations"][prop.name] = values else: neo_attrs["array_annotations"] = {prop.name: values} else: neo_attrs[prop.name] = values # since the 'neo_name' NIX property becomes the actual object's name, # there's no reason to keep it in the annotations neo_attrs["name"] = stringify(neo_attrs.pop("neo_name", None)) return neo_attrs @staticmethod def _group_signals(dataarrays): """ Groups data arrays that were generated by the same Neo Signal object. The collection can contain both AnalogSignals and IrregularlySampledSignals. :param dataarrays: A collection of DataArray objects to group :return: A dictionary mapping a base name to a list of DataArrays which belong to the same Signal """ # now start grouping groups = OrderedDict() for da in dataarrays: basename = ".".join(da.name.split(".")[:-1]) if basename not in groups: groups[basename] = list() groups[basename].append(da) return groups @staticmethod def _get_time_dimension(obj): for dim in obj.dimensions: if hasattr(dim, "label") and dim.label == "time": return dim return None def _use_obj_names(self, blocks): errmsg = "use_obj_names enabled: found conflict or anonymous object" allobjs = [] def check_unique(objs): names = list(o.name for o in objs) if None in names or "" in names: raise ValueError(names) if len(names) != len(set(names)): self._names_ok = False raise ValueError(names) # collect objs if ok allobjs.extend(objs) try: check_unique(blocks) except ValueError as exc: raise ValueError(f"{errmsg} in Blocks") from exc for blk in blocks: try: # Segments check_unique(blk.segments) except ValueError as exc: raise ValueError(f"{errmsg} at Block '{blk.name}' > segments") from exc # collect all signals in all segments signals = [] # collect all events, epochs, and spiketrains in all segments eests = [] for seg in blk.segments: signals.extend(seg.analogsignals) signals.extend(seg.irregularlysampledsignals) signals.extend(seg.imagesequences) eests.extend(seg.events) eests.extend(seg.epochs) eests.extend(seg.spiketrains) try: # AnalogSignals and IrregularlySampledSignals check_unique(signals) except ValueError as exc: raise ValueError(f"{errmsg} in Signal names of Block '{blk.name}'") from exc try: # Events, Epochs, and SpikeTrains check_unique(eests) except ValueError as exc: raise ValueError(f"{errmsg} in Event, Epoch, and Spiketrain names of Block '{blk.name}'") from exc # groups groups = [] for grp in blk.groups: groups.extend(list(grp.walk())) try: check_unique(groups) except ValueError as exc: raise ValueError(f"{errmsg} in Group names of Block '{blk.name}'") from exc # names are OK: assign annotations for o in allobjs: o.annotations["nix_name"] = o.name def close(self): """ Closes the open nix file and resets maps. """ if hasattr(self, "nix_file") and self.nix_file and self.nix_file.is_open(): self.nix_file.close() self.nix_file = None self._neo_map = None self._ref_map = None self._signal_map = None self._view_map = None self._block_read_counter = None def __del__(self): self.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/nixio_fr.py0000644000175100001660000000110414743453644015351 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.nixrawio import NIXRawIO # This class subjects to limitations when there are multiple asymmetric blocks class NixIO(NIXRawIO, BaseFromRaw): name = "NIX IO" _prefered_signal_group_mode = "group-by-same-units" _prefered_units_group_mode = "all-in-one" def __init__(self, filename): NIXRawIO.__init__(self, filename) BaseFromRaw.__init__(self, filename) def __enter__(self): return self def __exit__(self, *args): self.header = None self.file.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/nwbio.py0000644000175100001660000011061014743453644014655 0ustar00runnerdocker""" NWBIO ===== IO class for reading data from a Neurodata Without Borders (NWB) dataset Documentation : https://www.nwb.org/ Depends on: h5py, nwb, dateutil Supported: Read, Write Python API - https://pynwb.readthedocs.io Sample datasets from CRCNS - https://crcns.org/NWB Sample datasets from Allen Institute - http://alleninstitute.github.io/AllenSDK/cell_types.html#neurodata-without-borders """ from __future__ import absolute_import, division import json import logging import os from collections import defaultdict from itertools import chain from json.decoder import JSONDecodeError import numpy as np import quantities as pq from neo.core import Segment, SpikeTrain, Epoch, Event, AnalogSignal, IrregularlySampledSignal, Block, ImageSequence from neo.io.baseio import BaseIO from neo.io.proxyobjects import ( AnalogSignalProxy as BaseAnalogSignalProxy, EventProxy as BaseEventProxy, EpochProxy as BaseEpochProxy, SpikeTrainProxy as BaseSpikeTrainProxy, ) logger = logging.getLogger("Neo") GLOBAL_ANNOTATIONS = ( "session_start_time", "identifier", "timestamps_reference_time", "experimenter", "experiment_description", "session_id", "institution", "keywords", "notes", "pharmacology", "protocol", "related_publications", "slices", "source_script", "source_script_file_name", "data_collection", "surgery", "virus", "stimulus_notes", "lab", "session_description", "rec_datetime", ) POSSIBLE_JSON_FIELDS = ("source_script", "description") prefix_map = {1e9: "giga", 1e6: "mega", 1e3: "kilo", 1: "", 1e-3: "milli", 1e-6: "micro", 1e-9: "nano", 1e-12: "pico"} def try_json_field(content): """ Try to interpret a string as JSON data. If successful, return the JSON data (dict or list) If unsuccessful, return the original string """ try: return json.loads(content) except JSONDecodeError: return content def get_class(module, name): """ Given a module path and a class name, return the class object """ import pynwb module_path = module.split(".") if len(module_path) != 2: raise ValueError( f"`module_path` must be 2, not {module_path}" ) # todo: handle the general case where this isn't 2 return getattr(getattr(pynwb, module_path[1]), name) def statistics(block): # todo: move this to be a property of Block """ Return simple statistics about a Neo Block. """ stats = { "SpikeTrain": {"count": 0}, "AnalogSignal": {"count": 0}, "IrregularlySampledSignal": {"count": 0}, "Epoch": {"count": 0}, "Event": {"count": 0}, } for segment in block.segments: stats["SpikeTrain"]["count"] += len(segment.spiketrains) stats["AnalogSignal"]["count"] += len(segment.analogsignals) stats["IrregularlySampledSignal"]["count"] += len(segment.irregularlysampledsignals) stats["Epoch"]["count"] += len(segment.epochs) stats["Event"]["count"] += len(segment.events) return stats def get_units_conversion(signal, timeseries_class): """ Given a quantity array and a TimeSeries subclass, return the conversion factor and the expected units """ # it would be nice if the expected units was an attribute of the PyNWB class if "CurrentClamp" in timeseries_class.__name__: expected_units = pq.volt elif "VoltageClamp" in timeseries_class.__name__: expected_units = pq.ampere else: # todo: warn that we don't handle this subclass yet expected_units = signal.units return float((signal.units / expected_units).simplified.magnitude), expected_units def time_in_seconds(t): return float(t.rescale("second")) def _decompose_unit(unit): """ Given a quantities unit object, return a base unit name and a conversion factor. Example: >>> _decompose_unit(pq.mV) ('volt', 0.001) """ if not isinstance(unit, pq.quantity.Quantity): raise TypeError(f"`unit` must be of type pq.quantity.Quantity and not type {type(unit)}") if unit.magnitude != 1: raise ValueError(f"The magnitude of the `unit` must be 1 not {unit.magnitude}") conversion = 1.0 def _decompose(unit): dim = unit.dimensionality if len(dim) != 1: raise NotImplementedError("Compound units not yet supported") # e.g. volt-metre uq, n = list(dim.items())[0] if n != 1: raise NotImplementedError("Compound units not yet supported") # e.g. volt^2 uq_def = uq.definition return float(uq_def.magnitude), uq_def conv, unit2 = _decompose(unit) while conv != 1: conversion *= conv unit = unit2 conv, unit2 = _decompose(unit) return list(unit.dimensionality.keys())[0].name, conversion def _recompose_unit(base_unit_name, conversion): """ Given a base unit name and a conversion factor, return a quantities unit object Example: >>> _recompose_unit("ampere", 1e-9) UnitCurrent('nanoampere', 0.001 * uA, 'nA') """ unit_name = None for cf in prefix_map: # conversion may have a different float precision to the keys in # prefix_map, so we can't just use `prefix_map[conversion]` if abs(conversion - cf) / cf < 1e-6: unit_name = prefix_map[cf] + base_unit_name if unit_name is None: raise ValueError(f"Can't handle this conversion factor: {conversion}") if unit_name[-1] == "s": # strip trailing 's', e.g. "volts" --> "volt" unit_name = unit_name[:-1] try: return getattr(pq, unit_name) except AttributeError: logger.warning(f"Can't handle unit '{unit_name}'. Returning dimensionless") return pq.dimensionless class NWBIO(BaseIO): """ Class for "reading" experimental data from a .nwb file, and "writing" a .nwb file from Neo """ supported_objects = [ Block, Segment, AnalogSignal, IrregularlySampledSignal, SpikeTrain, Epoch, Event, ImageSequence, ] readable_objects = supported_objects writeable_objects = supported_objects has_header = False support_lazy = True name = "NeoNWB IO" description = "This IO reads/writes experimental data from/to an .nwb dataset" extensions = ["nwb"] mode = "one-file" is_readable = True is_writable = True is_streameable = False def __init__(self, filename, mode="r", **annotations): """ Arguments: filename : the filename """ import pynwb BaseIO.__init__(self, filename=filename) self.filename = filename self.blocks_written = 0 self.nwb_file_mode = mode self._blocks = {} self.annotations = annotations self._io_nwb = None def read_all_blocks(self, lazy=False, **kwargs): """ Load all blocks in the file. """ import pynwb if self.nwb_file_mode not in ("r",): raise ValueError("`mode` at init needs to be set to 'r' to read files") self._io_nwb = pynwb.NWBHDF5IO( self.filename, mode=self.nwb_file_mode, load_namespaces=True ) # Open a file with NWBHDF5IO try: self._file = self._io_nwb.read() except ValueError: print("Error: Unable to read this version of NWB file.") print("Please convert to a later NWB format.") raise self.global_block_metadata = {} for annotation_name in GLOBAL_ANNOTATIONS: value = getattr(self._file, annotation_name, None) if value is not None: if annotation_name in POSSIBLE_JSON_FIELDS: value = try_json_field(value) self.global_block_metadata[annotation_name] = value if "session_description" in self.global_block_metadata: self.global_block_metadata["description"] = self.global_block_metadata["session_description"] self.global_block_metadata["file_origin"] = self.filename if "session_start_time" in self.global_block_metadata: self.global_block_metadata["rec_datetime"] = self.global_block_metadata["session_start_time"] if "file_create_date" in self.global_block_metadata: self.global_block_metadata["file_datetime"] = self.global_block_metadata["rec_datetime"] self._blocks = {} self._read_acquisition_group(lazy=lazy) self._read_stimulus_group(lazy) self._read_units(lazy=lazy) self._read_epochs_group(lazy) return list(self._blocks.values()) def read_block(self, lazy=False, block_index=0, **kargs): """ Load the first block in the file. """ return self.read_all_blocks(lazy=lazy)[block_index] def _get_segment(self, block_name, segment_name): # If we've already created a Block with the given name return it, # otherwise create it now and store it in self._blocks. # If we've already created a Segment in the given block, return it, # otherwise create it now and return it. if block_name in self._blocks: block = self._blocks[block_name] else: block = Block(name=block_name, **self.global_block_metadata) self._blocks[block_name] = block segment = None for seg in block.segments: if segment_name == seg.name: segment = seg break if segment is None: segment = Segment(name=segment_name) block.segments.append(segment) return segment def _read_epochs_group(self, lazy): if self._file.epochs is not None: try: # NWB files created by Neo store the segment, block and epoch names as extra # columns segment_names = self._file.epochs.segment[:] block_names = self._file.epochs.block[:] epoch_names = self._file.epochs._name[:] except AttributeError: epoch_names = None if epoch_names is not None: unique_epoch_names = np.unique(epoch_names) for epoch_name in unique_epoch_names: (index,) = np.where((epoch_names == epoch_name)) epoch = EpochProxy(self._file.epochs, epoch_name, index) if not lazy: epoch = epoch.load() segment_name = np.unique(segment_names[index]) block_name = np.unique(block_names[index]) if segment_name.size != block_name.size == 1: raise ValueError("the `segment_name` and the `block_name` should be the same") segment = self._get_segment(block_name[0], segment_name[0]) segment.epochs.append(epoch) else: epoch = EpochProxy(self._file.epochs) if not lazy: epoch = epoch.load() segment = self._get_segment("default", "default") segment.epochs.append(epoch) def _read_timeseries_group(self, group_name, lazy): import pynwb group = getattr(self._file, group_name) for timeseries in group.values(): try: # NWB files created by Neo store the segment and block names in the comments field hierarchy = json.loads(timeseries.comments) except JSONDecodeError: # For NWB files created with other applications, we put everything in a single # segment in a single block # todo: investigate whether there is a reliable way to create multiple segments, # e.g. using Trial information block_name = "default" segment_name = "default" else: block_name = hierarchy["block"] segment_name = hierarchy["segment"] segment = self._get_segment(block_name, segment_name) if isinstance(timeseries, pynwb.misc.AnnotationSeries): event = EventProxy(timeseries, group_name) if not lazy: event = event.load() segment.events.append(event) elif timeseries.rate: # AnalogSignal signal = AnalogSignalProxy(timeseries, group_name) if not lazy: signal = signal.load() segment.analogsignals.append(signal) else: # IrregularlySampledSignal signal = AnalogSignalProxy(timeseries, group_name) if not lazy: signal = signal.load() segment.irregularlysampledsignals.append(signal) def _read_units(self, lazy): if self._file.units: for id in range(len(self._file.units)): try: # NWB files created by Neo store the segment and block names as extra columns segment_name = self._file.units.segment[id] block_name = self._file.units.block[id] except AttributeError: # For NWB files created with other applications, we put everything in a single # segment in a single block segment_name = "default" block_name = "default" segment = self._get_segment(block_name, segment_name) spiketrain = SpikeTrainProxy(self._file.units, id) if not lazy: spiketrain = spiketrain.load() segment.spiketrains.append(spiketrain) def _read_acquisition_group(self, lazy): self._read_timeseries_group("acquisition", lazy) def _read_stimulus_group(self, lazy): self._read_timeseries_group("stimulus", lazy) def _build_global_annotations(self, blocks): annotations = defaultdict(set) for annotation_name in GLOBAL_ANNOTATIONS: if annotation_name in self.annotations: annotations[annotation_name] = self.annotations[annotation_name] else: for block in blocks: if annotation_name in block.annotations: try: annotations[annotation_name].add(block.annotations[annotation_name]) except TypeError: if annotation_name in POSSIBLE_JSON_FIELDS: encoded = json.dumps(block.annotations[annotation_name]) annotations[annotation_name].add(encoded) else: raise if annotation_name in annotations: if len(annotations[annotation_name]) > 1: raise NotImplementedError(f"We don't yet support multiple values for {annotation_name}") # take single value from set (annotations[annotation_name],) = annotations[annotation_name] if "identifier" not in annotations: annotations["identifier"] = str(self.filename) if "session_description" not in annotations: annotations["session_description"] = blocks[0].description or str(self.filename) # need to use str() here because self.filename may be a pathlib path object # todo: concatenate descriptions of multiple blocks if different if annotations.get("session_start_time", None) is None: if "rec_datetime" in annotations: annotations["session_start_time"] = annotations["rec_datetime"] else: raise Exception("Writing to NWB requires an annotation 'session_start_time'") return annotations def write_all_blocks(self, blocks, validate=True, **kwargs): """ Write list of blocks to the file """ import pynwb global_annotations = self._build_global_annotations(blocks) self._nwbfile = pynwb.NWBFile(**global_annotations) if sum(statistics(block)["SpikeTrain"]["count"] for block in blocks) > 0: self._nwbfile.add_unit_column("_name", "the name attribute of the SpikeTrain") # nwbfile.add_unit_column('_description', # 'the description attribute of the SpikeTrain') self._nwbfile.add_unit_column("segment", "the name of the Neo Segment to which the SpikeTrain belongs") self._nwbfile.add_unit_column("block", "the name of the Neo Block to which the SpikeTrain belongs") if sum(statistics(block)["Epoch"]["count"] for block in blocks) > 0: self._nwbfile.add_epoch_column("_name", "the name attribute of the Epoch") # nwbfile.add_epoch_column('_description', 'the description attribute of the Epoch') self._nwbfile.add_epoch_column("segment", "the name of the Neo Segment to which the Epoch belongs") self._nwbfile.add_epoch_column("block", "the name of the Neo Block to which the Epoch belongs") for i, block in enumerate(blocks): self._write_block(block) if self.nwb_file_mode not in ("w",): raise ValueError("mode must be 'w' in order to write files") # possibly expand to 'a'ppend later if self.nwb_file_mode == "w" and os.path.exists(self.filename): os.remove(self.filename) io_nwb = pynwb.NWBHDF5IO(self.filename, mode=self.nwb_file_mode) io_nwb.write(self._nwbfile) io_nwb.close() if validate: self.validate_file() def validate_file(self): import pynwb with pynwb.NWBHDF5IO(self.filename, "r") as io_validate: errors = pynwb.validate(io_validate, namespace="core") if errors: raise Exception(f"Errors found when validating {self.filename}") def write_block(self, block, **kwargs): """ Write a single Block to the file :param block: Block to be written """ return self.write_all_blocks([block], **kwargs) def _write_block(self, block): """ Write a Block to the file :param block: Block to be written """ electrodes = self._write_electrodes(self._nwbfile, block) if not block.name: block.name = f"block{self.blocks_written}" for i, segment in enumerate(block.segments): if segment.block is not block: raise TypeError(f"segment.block must be block it is {segment.block}") if not segment.name: segment.name = f"{block.name} segment{i}" self._write_segment(self._nwbfile, segment, electrodes) self.blocks_written += 1 def _write_electrodes(self, nwbfile, block): # this handles only icephys_electrode for now electrodes = {} devices = {} for segment in block.segments: for signal in chain(segment.analogsignals, segment.irregularlysampledsignals): if "nwb_electrode" in signal.annotations: elec_meta = signal.annotations["nwb_electrode"].copy() if elec_meta["name"] not in electrodes: # todo: check for consistency if the name is already there if elec_meta["device"]["name"] in devices: device = devices[elec_meta["device"]["name"]] else: device = self._nwbfile.create_device(**elec_meta["device"]) devices[elec_meta["device"]["name"]] = device elec_meta.pop("device") electrodes[elec_meta["name"]] = self._nwbfile.create_icephys_electrode( device=device, **elec_meta ) return electrodes def _write_segment(self, nwbfile, segment, electrodes): # maybe use NWB trials to store Segment metadata? for i, signal in enumerate(chain(segment.analogsignals, segment.irregularlysampledsignals)): if signal.segment is not segment: raise TypeError(f"signal.segment must be segment and is {signal.segment}") if hasattr(signal, "name"): signal.name = f"{segment.name} {signal.name} {i}" logging.warning(f"Warning signal name exists. New name: {signal.name}") else: signal.name = f"{segment.name} analogsignal{signal.name} {i}" self._write_signal(self._nwbfile, signal, electrodes) for i, train in enumerate(segment.spiketrains): if train.segment is not segment: raise TypeError(f"train.segment must be segment and is {train.segment}") if not train.name: train.name = f"{segment.name} spiketrain{i}" self._write_spiketrain(self._nwbfile, train) for i, event in enumerate(segment.events): if event.segment is not segment: raise TypeError(f"event.segment mst be segment and is {event.segment}") if hasattr(event, "name"): event.name = f"{segment.name} {event.name} {i}" logging.warning(f"Warning event name exists. New name: {event.name}") else: event.name = f"{segment.name} event{event.name} {i}" self._write_event(self._nwbfile, event) for i, epoch in enumerate(segment.epochs): if not epoch.name: epoch.name = f"{segment.name} epoch{i}" self._write_epoch(self._nwbfile, epoch) def _write_signal(self, nwbfile, signal, electrodes): import pynwb hierarchy = {"block": signal.segment.block.name, "segment": signal.segment.name} if "nwb_neurodata_type" in signal.annotations: timeseries_class = get_class(*signal.annotations["nwb_neurodata_type"]) else: timeseries_class = pynwb.TimeSeries # default additional_metadata = {name[4:]: value for name, value in signal.annotations.items() if name.startswith("nwb:")} if "nwb_electrode" in signal.annotations: electrode_name = signal.annotations["nwb_electrode"]["name"] additional_metadata["electrode"] = electrodes[electrode_name] if timeseries_class != pynwb.TimeSeries: conversion, units = get_units_conversion(signal, timeseries_class) additional_metadata["conversion"] = conversion else: units = signal.units if hasattr(signal, "proxy_for") and signal.proxy_for in [AnalogSignal, IrregularlySampledSignal]: signal = signal.load() if issubclass(timeseries_class, pynwb.icephys.PatchClampSeries): if signal.shape[1] != 1: raise ValueError( "To store patch clamp data in NWB, please ensure that each AnalogSignal" f"contains only one channel. The current signal has {signal.shape[1]} channels." ) # see https://github.com/NeurodataWithoutBorders/pynwb/issues/1300 data = signal.ravel() # convert to 1D else: data = signal if isinstance(signal, AnalogSignal): sampling_rate = signal.sampling_rate.rescale("Hz") tS = timeseries_class( name=signal.name, starting_time=time_in_seconds(signal.t_start), data=data, unit=units.dimensionality.string, rate=float(sampling_rate), comments=json.dumps(hierarchy), **additional_metadata, ) # todo: try to add array_annotations via "control" attribute elif isinstance(signal, IrregularlySampledSignal): tS = timeseries_class( name=signal.name, data=data, unit=units.dimensionality.string, timestamps=signal.times.rescale("second").magnitude, comments=json.dumps(hierarchy), **additional_metadata, ) else: raise TypeError( f"signal has type { signal.__class__.__name__}, should be AnalogSignal or IrregularlySampledSignal" ) nwb_group = signal.annotations.get("nwb_group", "acquisition") add_method_map = {"acquisition": self._nwbfile.add_acquisition, "stimulus": self._nwbfile.add_stimulus} if nwb_group in add_method_map: add_time_series = add_method_map[nwb_group] else: raise NotImplementedError(f"NWB group '{nwb_group}' not yet supported") add_time_series(tS) return tS def _write_spiketrain(self, nwbfile, spiketrain): segment = spiketrain.segment if hasattr(spiketrain, "proxy_for") and spiketrain.proxy_for is SpikeTrain: spiketrain = spiketrain.load() self._nwbfile.add_unit( spike_times=spiketrain.rescale("s").magnitude, obs_intervals=[[float(spiketrain.t_start.rescale("s")), float(spiketrain.t_stop.rescale("s"))]], _name=spiketrain.name, # _description=spiketrain.description, segment=segment.name, block=segment.block.name, ) # todo: handle annotations (using add_unit_column()?) # todo: handle Neo Units # todo: handle spike waveforms, if any (see SpikeEventSeries) return self._nwbfile.units def _write_event(self, nwbfile, event): import pynwb segment = event.segment if hasattr(event, "proxy_for") and event.proxy_for == Event: event = event.load() hierarchy = {"block": segment.block.name, "segment": segment.name} tS_evt = pynwb.misc.AnnotationSeries( name=event.name, data=event.labels, timestamps=event.times.rescale("second").magnitude, description=event.description or "", comments=json.dumps(hierarchy), ) self._nwbfile.add_acquisition(tS_evt) return tS_evt def _write_epoch(self, nwbfile, epoch): segment = epoch.segment if hasattr(epoch, "proxy_for") and epoch.proxy_for == Epoch: epoch = epoch.load() for t_start, duration, label in zip( epoch.rescale("s").magnitude, epoch.durations.rescale("s").magnitude, epoch.labels ): self._nwbfile.add_epoch( t_start, t_start + duration, [label], [], _name=epoch.name, segment=segment.name, block=segment.block.name, ) return self._nwbfile.epochs def close(self): if self._io_nwb: self._io_nwb.close() class AnalogSignalProxy(BaseAnalogSignalProxy): common_metadata_fields = ( # fields that are the same for all TimeSeries subclasses "comments", "description", "unit", "starting_time", "timestamps", "rate", "data", "starting_time_unit", "timestamps_unit", "electrode", "stream_id", ) def __init__(self, timeseries, nwb_group): self._timeseries = timeseries self.units = timeseries.unit if timeseries.conversion: self.units = _recompose_unit(timeseries.unit, timeseries.conversion) if timeseries.starting_time is not None: self.t_start = timeseries.starting_time * pq.s else: self.t_start = timeseries.timestamps[0] * pq.s if timeseries.rate: self.sampling_rate = timeseries.rate * pq.Hz else: self.sampling_rate = None self.name = timeseries.name self.annotations = {"nwb_group": nwb_group} self.description = try_json_field(timeseries.description) if isinstance(self.description, dict): self.annotations["notes"] = self.description if "name" in self.annotations: self.annotations.pop("name") self.description = None self.shape = self._timeseries.data.shape if len(self.shape) == 1: self.shape = (self.shape[0], 1) metadata_fields = list(timeseries.__nwbfields__) for field_name in self.__class__.common_metadata_fields: # already handled try: metadata_fields.remove(field_name) except ValueError: pass for field_name in metadata_fields: value = getattr(timeseries, field_name) if value is not None: self.annotations[f"nwb:{field_name}"] = value self.annotations["nwb_neurodata_type"] = (timeseries.__class__.__module__, timeseries.__class__.__name__) if hasattr(timeseries, "electrode"): # todo: once the Group class is available, we could add electrode metadata # to a Group containing all signals that share that electrode # This would reduce the amount of redundancy (repeated metadata in every signal) electrode_metadata = {"device": {}} metadata_fields = list(timeseries.electrode.__class__.__nwbfields__) + ["name"] metadata_fields.remove("device") # needs special handling for field_name in metadata_fields: value = getattr(timeseries.electrode, field_name) if value is not None: electrode_metadata[field_name] = value for field_name in timeseries.electrode.device.__class__.__nwbfields__: value = getattr(timeseries.electrode.device, field_name) if value is not None: electrode_metadata["device"][field_name] = value self.annotations["nwb_electrode"] = electrode_metadata def load(self, time_slice=None, strict_slicing=True): """ Load AnalogSignalProxy args: :param time_slice: None or tuple of the time slice expressed with quantities. None is the entire signal. :param strict_slicing: True by default. Control if an error is raised or not when one of the time_slice members (t_start or t_stop) is outside the real time range of the segment. """ i_start, i_stop, sig_t_start = None, None, self.t_start if time_slice: if self.sampling_rate is None: i_start, i_stop = np.searchsorted(self._timeseries.timestamps, time_slice) else: i_start, i_stop, sig_t_start = self._time_slice_indices(time_slice, strict_slicing=strict_slicing) signal = self._timeseries.data[i_start:i_stop] if self.sampling_rate is None: return IrregularlySampledSignal( self._timeseries.timestamps[i_start:i_stop] * pq.s, signal, units=self.units, t_start=sig_t_start, sampling_rate=self.sampling_rate, name=self.name, description=self.description, array_annotations=None, **self.annotations, ) # todo: timeseries.control / control_description else: return AnalogSignal( signal, units=self.units, t_start=sig_t_start, sampling_rate=self.sampling_rate, name=self.name, description=self.description, array_annotations=None, **self.annotations, ) # todo: timeseries.control / control_description class EventProxy(BaseEventProxy): def __init__(self, timeseries, nwb_group): self._timeseries = timeseries self.name = timeseries.name self.annotations = {"nwb_group": nwb_group} self.description = try_json_field(timeseries.description) if isinstance(self.description, dict): self.annotations.update(self.description) self.description = None self.shape = self._timeseries.data.shape def load(self, time_slice=None, strict_slicing=True): """ Load EventProxy args: :param time_slice: None or tuple of the time slice expressed with quantities. None is the entire signal. :param strict_slicing: True by default. Control if an error is raised or not when one of the time_slice members (t_start or t_stop) is outside the real time range of the segment. """ if time_slice: raise NotImplementedError("todo") else: times = self._timeseries.timestamps[:] labels = self._timeseries.data[:] return Event(times * pq.s, labels=labels, name=self.name, description=self.description, **self.annotations) class EpochProxy(BaseEpochProxy): def __init__(self, time_intervals, epoch_name=None, index=None): """ :param time_intervals: An epochs table, which is a specific TimeIntervals table that stores info about long periods :param epoch_name: (str) Name of the epoch object :param index: (np.array, slice) Slice object or array of bool values masking time_intervals to be used. In case of an array it has to have the same shape as `time_intervals`. """ self._time_intervals = time_intervals if index is not None: self._index = index self.shape = (index.sum(),) else: self._index = slice(None) self.shape = (len(time_intervals),) self.name = epoch_name def load(self, time_slice=None, strict_slicing=True): """ Load EpochProxy args: :param time_slice: None or tuple of the time slice expressed with quantities. None is all of the intervals. :param strict_slicing: True by default. Control if an error is raised or not when one of the time_slice members (t_start or t_stop) is outside the real time range of the segment. """ if time_slice: raise NotImplementedError("todo") else: start_times = self._time_intervals.start_time[self._index] stop_times = self._time_intervals.stop_time[self._index] durations = stop_times - start_times labels = self._time_intervals.tags[self._index] return Epoch(times=start_times * pq.s, durations=durations * pq.s, labels=labels, name=self.name) class SpikeTrainProxy(BaseSpikeTrainProxy): def __init__(self, units_table, id): """ :param units_table: A Units table (see https://pynwb.readthedocs.io/en/stable/pynwb.misc.html#pynwb.misc.Units) :param id: the cell/unit ID (integer) """ self._units_table = units_table self.id = id self.units = pq.s obs_intervals = units_table.get_unit_obs_intervals(id) if len(obs_intervals) == 0: t_start, t_stop = None, None elif len(obs_intervals) == 1: t_start, t_stop = obs_intervals[0] else: raise NotImplementedError("Can't yet handle multiple observation intervals") self.t_start = t_start * pq.s self.t_stop = t_stop * pq.s self.annotations = {"nwb_group": "acquisition"} try: # NWB files created by Neo store the name as an extra column self.name = units_table._name[id] except AttributeError: self.name = None self.shape = None # no way to get this without reading the data def load(self, time_slice=None, strict_slicing=True): """ Load SpikeTrainProxy args: :param time_slice: None or tuple of the time slice expressed with quantities. None is the entire spike train. :param strict_slicing: True by default. Control if an error is raised or not when one of the time_slice members (t_start or t_stop) is outside the real time range of the segment. """ interval = None if time_slice: interval = (float(t) for t in time_slice) # convert from quantities spike_times = self._units_table.get_unit_spike_times(self.id, in_interval=interval) return SpikeTrain( spike_times * self.units, self.t_stop, units=self.units, # sampling_rate=array(1.) * Hz, t_start=self.t_start, # waveforms=None, # left_sweep=None, name=self.name, # file_origin=None, # description=None, # array_annotations=None, **self.annotations, ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/openephysbinaryio.py0000644000175100001660000000057714743453644017320 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.openephysbinaryrawio import OpenEphysBinaryRawIO class OpenEphysBinaryIO(OpenEphysBinaryRawIO, BaseFromRaw): _prefered_signal_group_mode = "group-by-same-units" mode = "dir" def __init__(self, dirname): OpenEphysBinaryRawIO.__init__(self, dirname=dirname) BaseFromRaw.__init__(self, dirname) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/openephysio.py0000644000175100001660000000054114743453644016102 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.openephysrawio import OpenEphysRawIO class OpenEphysIO(OpenEphysRawIO, BaseFromRaw): _prefered_signal_group_mode = "group-by-same-units" mode = "dir" def __init__(self, dirname): OpenEphysRawIO.__init__(self, dirname=dirname) BaseFromRaw.__init__(self, dirname) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/phyio.py0000644000175100001660000000062514743453644014673 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.phyrawio import PhyRawIO class PhyIO(PhyRawIO, BaseFromRaw): name = "Phy IO" description = "Phy IO" mode = "dir" def __init__(self, dirname, load_amplitudes=False, load_pcs=False): PhyRawIO.__init__(self, dirname=dirname, load_amplitudes=load_amplitudes, load_pcs=load_pcs) BaseFromRaw.__init__(self, dirname) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/pickleio.py0000644000175100001660000000257014743453644015343 0ustar00runnerdocker""" Module for reading/writing data from/to Python pickle format. Class: PickleIO Supported: Read/Write Authors: Andrew Davison """ import pickle from neo.io.baseio import BaseIO from neo.core import Block, Segment, AnalogSignal, SpikeTrain, NeoReadWriteError class PickleIO(BaseIO): """ A class for reading and writing Neo data from/to the Python "pickle" format. Note that files in this format may not be readable if using a different version of Neo to that used to create the file. It should therefore not be used for long-term storage, but rather for intermediate results in a pipeline. """ is_readable = True is_writable = True has_header = False is_streameable = False # TODO - correct spelling to "is_streamable" # should extend to other classes. supported_objects = [Block, Segment, AnalogSignal, SpikeTrain] readable_objects = supported_objects writeable_objects = supported_objects mode = "file" name = "Python pickle file" extensions = ["pkl", "pickle"] def read_block(self, lazy=False): if lazy: raise NeoReadWriteError("This IO does not support lazy reading") with open(self.filename, "rb") as fp: block = pickle.load(fp) return block def write_block(self, block): with open(self.filename, "wb") as fp: pickle.dump(block, fp) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/plexon2io.py0000644000175100001660000000071614743453644015463 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.plexon2rawio import Plexon2RawIO class Plexon2IO(Plexon2RawIO, BaseFromRaw): """ Class for reading data from Plexon PL2 files The IO is based on the Plexon2RawIO, see comments for memory optimization in neo.rawio.plexon2rawio.Plexon2RawIO """ def __init__(self, filename): Plexon2RawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/plexonio.py0000644000175100001660000000111214743453644015370 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.plexonrawio import PlexonRawIO class PlexonIO(PlexonRawIO, BaseFromRaw): """ Class for reading the old data format from Plexon acquisition system (.plx) Note that Plexon now use a new format PL2 which is NOT supported by this IO. Compatible with versions 100 to 106. Other versions have not been tested. """ _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename): PlexonRawIO.__init__(self, filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/proxyobjects.py0000644000175100001660000006455714743453644016314 0ustar00runnerdocker""" Here a list of proxy object that can be used when lazy=True at neo.io level. This idea is to be able to postpone that real in memory loading for objects that contains big data (AnalogSIgnal, SpikeTrain, Event, Epoch). The implementation rely on neo.rawio, so it will available only for neo.io that ineherits neo.rawio. """ import logging import numpy as np import quantities as pq from neo.core.baseneo import BaseNeo from neo.core import AnalogSignal, Epoch, Event, SpikeTrain from neo.core.dataobject import ArrayDict logger = logging.getLogger("Neo") class BaseProxy(BaseNeo): def __init__(self, array_annotations=None, **annotations): # this for py27 str vs py3 str in neo attributes ompatibility annotations = check_annotations(annotations) if "file_origin" not in annotations: # the str is to make compatible with neo_py27 where attribute # used to be str so raw bytes annotations["file_origin"] = str(self._rawio.source_name()) if array_annotations is None: array_annotations = {} for k, v in array_annotations.items(): array_annotations[k] = np.asarray(v) # clean array annotations that are not 1D # TODO remove this once multi-dimensional array_annotations are possible array_annotations = {k: v for k, v in array_annotations.items() if v.ndim == 1} # this mock the array annotations to avoid inherits DataObject self.array_annotations = ArrayDict(self.shape[-1]) self.array_annotations.update(array_annotations) BaseNeo.__init__(self, **annotations) def load(self, time_slice=None, **kwargs): # should be implemented by subclass raise NotImplementedError def time_slice(self, t_start, t_stop): """ Load the proxy object within the specified time range. Has the same call signature as AnalogSignal.time_slice, Epoch.time_slice, etc. """ return self.load(time_slice=(t_start, t_stop)) class AnalogSignalProxy(BaseProxy): """ This object mimic AnalogSignal except that it does not have the signals array itself. All attributes and annotations are here. The goal is to postpone the loading of data into memory when reading a file with the new lazy load system based on neo.rawio. This object must not be constructed directly but is given neo.io when lazy=True instead of a true AnalogSignal. The AnalogSignalProxy is able to load: * only a slice of time * only a subset of channels * have an internal raw magnitude identic to the file (int16) with a pq.CompoundUnit(). Usage: >>> proxy_anasig = AnalogSignalProxy(rawio=self.reader, global_channel_indexes=None, block_index=0, seg_index=0) >>> anasig = proxy_anasig.load() >>> slice_of_anasig = proxy_anasig.load(time_slice=(1.*pq.s, 2.*pq.s)) >>> some_channel_of_anasig = proxy_anasig.load(channel_indexes=[0,5,10]) """ _parent_objects = ("Segment",) _necessary_attrs = (("sampling_rate", pq.Quantity, 0), ("t_start", pq.Quantity, 0)) _recommended_attrs = BaseNeo._recommended_attrs proxy_for = AnalogSignal def __init__(self, rawio=None, stream_index=None, inner_stream_channels=None, block_index=0, seg_index=0): # stream_index: indicate the stream stream_id can be retreive easily # inner_stream_channels: are channel index inside the stream None means all channels # if inner_stream_channels is not None: # * then this is a "substream" # * handle the case where channels have different units inside a stream # * is related to BaseFromRaw.get_sub_signal_streams() self._rawio = rawio self._block_index = block_index self._seg_index = seg_index self._stream_index = stream_index if inner_stream_channels is None: inner_stream_channels = slice(inner_stream_channels) self._inner_stream_channels = inner_stream_channels signal_streams = self._rawio.header["signal_streams"] stream_id = signal_streams[stream_index]["id"] signal_channels = self._rawio.header["signal_channels"] (global_inds,) = np.nonzero(signal_channels["stream_id"] == stream_id) self._nb_total_chann_in_stream = global_inds.size self._global_channel_indexes = global_inds[inner_stream_channels] self._nb_chan = self._global_channel_indexes.size sig_chans = signal_channels[self._global_channel_indexes] if np.unique(sig_chans["units"]).size != 1: raise ValueError("Channel do not have same units") if np.unique(sig_chans["dtype"]).size != 1: raise TypeError("Channel do not have same dtype") if np.unique(sig_chans["sampling_rate"]).size != 1: raise ValueError("Channel do not have same sampling_rate") self.units = ensure_signal_units(sig_chans["units"][0]) self.dtype = sig_chans["dtype"][0] self.sampling_rate = sig_chans["sampling_rate"][0] * pq.Hz self.sampling_period = 1.0 / self.sampling_rate sigs_size = self._rawio.get_signal_size(block_index=block_index, seg_index=seg_index, stream_index=stream_index) self.shape = (sigs_size, self._nb_chan) self.t_start = self._rawio.get_signal_t_start(block_index, seg_index, stream_index) * pq.s # magnitude_mode='raw' is supported only if all offset=0 # and all gain are the same support_raw_magnitude = np.all(sig_chans["gain"] == sig_chans["gain"][0]) and np.all(sig_chans["offset"] == 0.0) if support_raw_magnitude: str_units = ensure_signal_units(sig_chans["units"][0]).units.dimensionality.string gain0 = sig_chans["gain"][0] self._raw_units = pq.CompoundUnit(f"{gain0}*{str_units}") else: self._raw_units = None # retrieve annotations and array annotations seg_ann = self._rawio.raw_annotations["blocks"][block_index]["segments"][seg_index] annotations = seg_ann["signals"][stream_index].copy() array_annotations = annotations.pop("__array_annotations__") array_annotations = {k: v[inner_stream_channels] for k, v in array_annotations.items()} BaseProxy.__init__(self, array_annotations=array_annotations, **annotations) @property def duration(self): """Signal duration""" return self.shape[0] / self.sampling_rate @property def t_stop(self): """Time when signal ends""" return self.t_start + self.duration def _time_slice_indices(self, time_slice, strict_slicing=True): """ Calculate the start and end indices for the slice. Also returns t_start """ if time_slice is None: i_start, i_stop = None, None sig_t_start = self.t_start else: sr = self.sampling_rate t_start, t_stop = time_slice if t_start is None: i_start = None sig_t_start = self.t_start else: t_start = ensure_second(t_start) if strict_slicing: if t_start < self.t_start or t_start > self.t_stop: raise ValueError("`t_start` is outside of the time range") else: t_start = max(t_start, self.t_start) # the i_start is rounded to the nearest sample i_start = np.rint((t_start - self.t_start).magnitude * sr.magnitude).astype(np.int64) # this is needed to get the real t_start of the first sample # because it does not necessary match what is demanded sig_t_start = self.t_start + i_start / sr if t_stop is None: i_stop = None else: t_stop = ensure_second(t_stop) if strict_slicing: if t_stop < self.t_start or t_stop > self.t_stop: raise ValueError("`t_stop` is outside of the time range") else: t_stop = min(t_stop, self.t_stop) # calculate duration demanded then round it to nearest sample number # add this to i_start to get i_stop delta = (t_stop - t_start) * sr i_stop = i_start + int(np.rint(delta.simplified.magnitude)) return i_start, i_stop, sig_t_start def load(self, time_slice=None, strict_slicing=True, channel_indexes=None, magnitude_mode="rescaled"): """ *Args*: :time_slice: None or tuple of the time slice expressed with quantities. None is the entire signal. :channel_indexes: None or list. Channels to load. None is all channels Be carefull that channel_indexes represent the local channel index inside the AnalogSignal and not the global_channel_indexes like in rawio. :magnitude_mode: 'rescaled' or 'raw'. For instance if the internal dtype is int16: * **rescaled** give [1.,2.,3.]*pq.uV and the dtype is float32 * **raw** give [10, 20, 30]*pq.CompoundUnit('0.1*uV') The CompoundUnit with magnitude_mode='raw' is usefull to postpone the scaling when needed and having an internal dtype=int16 but it less intuitive when you don't know so well quantities. :strict_slicing: True by default. Control if an error is raise or not when one of time_slice member (t_start or t_stop) is outside the real time range of the segment. """ # fixed_chan_indexes is channel index (or slice) in the stream # channel_indexes is channel index (or slice) in the substream if isinstance(self._inner_stream_channels, slice): if self._inner_stream_channels == slice(None): # sub stream is the entire stream if channel_indexes is None: fixed_chan_indexes = None else: fixed_chan_indexes = channel_indexes else: # sub stream is part of stream with slice if channel_indexes is None: fixed_chan_indexes = self._inner_stream_channels else: global_inds = np.arange(self._nb_total_chann_in_stream) fixed_chan_indexes = global_inds[self._inner_stream_channels][channel_indexes] else: # sub stream is part of stream with indexes if channel_indexes is None: fixed_chan_indexes = self._inner_stream_channels else: fixed_chan_indexes = self._inner_stream_channels[channel_indexes] i_start, i_stop, sig_t_start = self._time_slice_indices(time_slice, strict_slicing=strict_slicing) raw_signal = self._rawio.get_analogsignal_chunk( block_index=self._block_index, seg_index=self._seg_index, i_start=i_start, i_stop=i_stop, stream_index=self._stream_index, channel_indexes=fixed_chan_indexes, ) # if slice in channel : change name and array_annotations if raw_signal.shape[1] != self._nb_chan: name = "slice of " + self.name channel_indexes2 = channel_indexes if channel_indexes2 is None: channel_indexes2 = slice(None) array_annotations = {k: v[channel_indexes2] for k, v in self.array_annotations.items()} else: name = self.name array_annotations = self.array_annotations if magnitude_mode == "raw": if self._raw_units is None: raise ValueError( "raw magnitude is not supported if the gain are not the same for all channels or offset is not 0" ) sig = raw_signal units = self._raw_units elif magnitude_mode == "rescaled": # dtype is float32 when internally it is float32 or int16 if self.dtype == "float64": dtype = "float64" else: dtype = "float32" sig = self._rawio.rescale_signal_raw_to_float( raw_signal, dtype=dtype, stream_index=self._stream_index, channel_indexes=fixed_chan_indexes ) units = self.units else: raise ValueError(f"Invalid magnitude_mode {magnitude_mode}. Accepted values are " f'"rescaled" and "raw"') anasig = AnalogSignal( sig, units=units, copy=None, t_start=sig_t_start, sampling_rate=self.sampling_rate, name=name, file_origin=self.file_origin, description=self.description, array_annotations=array_annotations, **self.annotations, ) return anasig class SpikeTrainProxy(BaseProxy): """ This object mimic SpikeTrain except that it does not have the spike time nor waveforms. All attributes and annotations are here. The goal is to postpone the loading of data into memory when reading a file with the new lazy load system based on neo.rawio. This object must not be constructed directly but is given neo.io when lazy=True instead of a true SpikeTrain. The SpikeTrainProxy is able to load: * only a slice of time * load wveforms or not. * have an internal raw magnitude identic to the file (generally the ticks of clock in int64) or the rescale to seconds. Usage: >>> proxy_sptr = SpikeTrainProxy(rawio=self.reader, unit_channel=0, block_index=0, seg_index=0,) >>> sptr = proxy_sptr.load() >>> slice_of_sptr = proxy_sptr.load(time_slice=(1.*pq.s, 2.*pq.s)) """ _parent_objects = ("Segment", "Unit") _quantity_attr = "times" _necessary_attrs = (("t_start", pq.Quantity, 0), ("t_stop", pq.Quantity, 0)) _recommended_attrs = () proxy_for = SpikeTrain def __init__(self, rawio=None, spike_channel_index=None, block_index=0, seg_index=0): self._rawio = rawio self._block_index = block_index self._seg_index = seg_index self._spike_channel_index = spike_channel_index nb_spike = self._rawio.spike_count( block_index=block_index, seg_index=seg_index, spike_channel_index=spike_channel_index ) self.shape = (nb_spike,) self.t_start = self._rawio.segment_t_start(block_index, seg_index) * pq.s self.t_stop = self._rawio.segment_t_stop(block_index, seg_index) * pq.s seg_ann = self._rawio.raw_annotations["blocks"][block_index]["segments"][seg_index] annotations = seg_ann["spikes"][spike_channel_index].copy() array_annotations = annotations.pop("__array_annotations__") h = self._rawio.header["spike_channels"][spike_channel_index] wf_sampling_rate = h["wf_sampling_rate"] if not np.isnan(wf_sampling_rate) and wf_sampling_rate > 0: self.sampling_rate = wf_sampling_rate * pq.Hz self.left_sweep = (h["wf_left_sweep"] / self.sampling_rate).rescale("s") self._wf_units = ensure_signal_units(h["wf_units"]) else: self.sampling_rate = None self.left_sweep = None BaseProxy.__init__(self, array_annotations=array_annotations, **annotations) def load(self, time_slice=None, strict_slicing=True, magnitude_mode="rescaled", load_waveforms=False): """ *Args*: :time_slice: None or tuple of the time slice expressed with quantities. None is the entire signal. :strict_slicing: True by default. Control if an error is raise or not when one of time_slice member (t_start or t_stop) is outside the real time range of the segment. :magnitude_mode: 'rescaled' or 'raw'. :load_waveforms: bool load waveforms or not. """ t_start, t_stop = consolidate_time_slice(time_slice, self.t_start, self.t_stop, strict_slicing) _t_start, _t_stop = prepare_time_slice(time_slice) spike_timestamps = self._rawio.get_spike_timestamps( block_index=self._block_index, seg_index=self._seg_index, spike_channel_index=self._spike_channel_index, t_start=_t_start, t_stop=_t_stop, ) if magnitude_mode == "raw": # we must modify a bit the neo.rawio interface to also read the spike_timestamps # underlying clock wich is not always same as sigs raise (NotImplementedError) elif magnitude_mode == "rescaled": dtype = "float64" spike_times = self._rawio.rescale_spike_timestamp(spike_timestamps, dtype=dtype) units = "s" if load_waveforms: if self.sampling_rate is None: raise ValueError("There are no waveforms") raw_wfs = self._rawio.get_spike_raw_waveforms( block_index=self._block_index, seg_index=self._seg_index, spike_channel_index=self._spike_channel_index, t_start=_t_start, t_stop=_t_stop, ) if magnitude_mode == "rescaled": float_wfs = self._rawio.rescale_waveforms_to_float( raw_wfs, dtype="float32", spike_channel_index=self._spike_channel_index ) waveforms = pq.Quantity(float_wfs, units=self._wf_units, dtype="float32") elif magnitude_mode == "raw": # could code also CompundUnit here but it is over killed # so we used dimentionless waveforms = pq.Quantity(raw_wfs, units="", dtype=raw_wfs.dtype) else: waveforms = None sptr = SpikeTrain( spike_times, t_stop, units=units, dtype=dtype, t_start=t_start, copy=None, sampling_rate=self.sampling_rate, waveforms=waveforms, left_sweep=self.left_sweep, name=self.name, file_origin=self.file_origin, description=self.description, **self.annotations, ) if time_slice is None: sptr.array_annotate(**self.array_annotations) else: # TODO handle array_annotations with time_slice pass return sptr class _EventOrEpoch(BaseProxy): _parent_objects = ("Segment",) _quantity_attr = "times" def __init__(self, rawio=None, event_channel_index=None, block_index=0, seg_index=0): self._rawio = rawio self._block_index = block_index self._seg_index = seg_index self._event_channel_index = event_channel_index nb_event = self._rawio.event_count( block_index=block_index, seg_index=seg_index, event_channel_index=event_channel_index ) self.shape = (nb_event,) self.t_start = self._rawio.segment_t_start(block_index, seg_index) * pq.s self.t_stop = self._rawio.segment_t_stop(block_index, seg_index) * pq.s # both necessary attr and annotations annotations = {} for k in ("name", "id"): annotations[k] = self._rawio.header["event_channels"][event_channel_index][k] seg_ann = self._rawio.raw_annotations["blocks"][block_index]["segments"][seg_index] ann = seg_ann["events"][event_channel_index] annotations = ann.copy() array_annotations = annotations.pop("__array_annotations__") BaseProxy.__init__(self, array_annotations=array_annotations, **annotations) def load(self, time_slice=None, strict_slicing=True): """ *Args*: :time_slice: None or tuple of the time slice expressed with quantities. None is the entire signal. :strict_slicing: True by default. Control if an error is raise or not when one of time_slice member (t_start or t_stop) is outside the real time range of the segment. """ t_start, t_stop = consolidate_time_slice(time_slice, self.t_start, self.t_stop, strict_slicing) _t_start, _t_stop = prepare_time_slice(time_slice) timestamp, durations, labels = self._rawio.get_event_timestamps( block_index=self._block_index, seg_index=self._seg_index, event_channel_index=self._event_channel_index, t_start=_t_start, t_stop=_t_stop, ) dtype = "float64" times = self._rawio.rescale_event_timestamp(timestamp, dtype=dtype) units = "s" if durations is not None: durations = self._rawio.rescale_epoch_duration(durations, dtype=dtype) * pq.s h = self._rawio.header["event_channels"][self._event_channel_index] if h["type"] == b"event": ret = Event( times=times, labels=labels, units="s", name=self.name, file_origin=self.file_origin, description=self.description, **self.annotations, ) elif h["type"] == b"epoch": ret = Epoch( times=times, durations=durations, labels=labels, units="s", name=self.name, file_origin=self.file_origin, description=self.description, **self.annotations, ) if time_slice is None: ret.array_annotate(**self.array_annotations) else: # TODO handle array_annotations with time_slice pass return ret class EventProxy(_EventOrEpoch): """ This object mimic Event except that it does not have the times nor labels. All other attributes and annotations are here. The goal is to postpone the loading of data into memory when reading a file with the new lazy load system based on neo.rawio. This object must not be constructed directly but is given neo.io when lazy=True instead of a true Event. The EventProxy is able to load: * only a slice of time Usage: >>> proxy_event = EventProxy(rawio=self.reader, event_channel_index=0, block_index=0, seg_index=0,) >>> event = proxy_event.load() >>> slice_of_event = proxy_event.load(time_slice=(1.*pq.s, 2.*pq.s)) """ _necessary_attrs = (("times", pq.Quantity, 1), ("labels", np.ndarray, 1, np.dtype("U"))) proxy_for = Event class EpochProxy(_EventOrEpoch): """ This object mimic Epoch except that it does not have the times nor labels nor durations. All other attributes and annotations are here. The goal is to postpone the loading of data into memory when reading a file with the new lazy load system based on neo.rawio. This object must not be constructed directly but is given neo.io when lazy=True instead of a true Epoch. The EpochProxy is able to load: * only a slice of time Usage: >>> proxy_epoch = EpochProxy(rawio=self.reader, event_channel_index=0, block_index=0, seg_index=0,) >>> epoch = proxy_epoch.load() >>> slice_of_epoch = proxy_epoch.load(time_slice=(1.*pq.s, 2.*pq.s)) """ _necessary_attrs = ( ("times", pq.Quantity, 1), ("durations", pq.Quantity, 1), ("labels", np.ndarray, 1, np.dtype("U")), ) proxy_for = Epoch proxyobjectlist = [AnalogSignalProxy, SpikeTrainProxy, EventProxy, EpochProxy] unit_convert = { "Volts": "V", "volts": "V", "Volt": "V", "volt": "V", " Volt": "V", "microV": "uV", # note that "micro" and "mu" are two different characters in Unicode # although they mostly look the same. Here we accept both. "µV": "uV", "μV": "uV", } def ensure_signal_units(units): # test units units = units.replace(" ", "") if units in unit_convert: units = unit_convert[units] try: units = pq.Quantity(1, units) except: logger.warning(f'Units "{units}" can not be converted to a quantity. Using dimensionless ' "instead") units = "" units = pq.Quantity(1, units) return units def check_annotations(annotations): # force type to str for some keys # imposed for tests for k in ("name", "description", "file_origin"): if k in annotations: annotations[k] = str(annotations[k]) if "coordinates" in annotations: # some rawio expose some coordinates in annotations but is not standardized # (x, y, z) or polar, at the moment it is more resonable to remove them annotations.pop("coordinates") return annotations def ensure_second(v): if isinstance(v, float): return v * pq.s elif isinstance(v, pq.Quantity): return v.rescale("s") elif isinstance(v, int): return float(v) * pq.s def prepare_time_slice(time_slice): """ This give clean time slice but keep None for calling rawio slice """ if time_slice is None: t_start, t_stop = None, None else: t_start, t_stop = time_slice if t_start is not None: t_start = ensure_second(t_start).rescale("s").magnitude if t_stop is not None: t_stop = ensure_second(t_stop).rescale("s").magnitude return (t_start, t_stop) def consolidate_time_slice(time_slice, seg_t_start, seg_t_stop, strict_slicing): """ This give clean time slice in quantity for t_start/t_stop of object None is replace by seg limit. """ if time_slice is None: t_start, t_stop = None, None else: t_start, t_stop = time_slice if t_start is None: t_start = seg_t_start else: if strict_slicing: if t_start < seg_t_start or t_start > seg_t_stop: raise ValueError("`t_start` is outside of the time range") else: t_start = max(t_start, seg_t_start) t_start = ensure_second(t_start) if t_stop is None: t_stop = seg_t_stop else: if strict_slicing: if t_stop < seg_t_start or t_stop > seg_t_stop: raise ValueError("`t_stop` is outside of the time range") else: t_stop = min(t_stop, seg_t_stop) t_stop = ensure_second(t_stop) return (t_start, t_stop) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/rawbinarysignalio.py0000644000175100001660000000733014743453644017267 0ustar00runnerdocker""" Class for reading/writing data in a raw binary interleaved compact file. Sampling rate, units, number of channel and dtype must be externally known. This generic format is quite widely used in old acquisition systems and is quite universal for sharing data. Supported : Read/Write Author: sgarcia """ import numpy as np from neo.core import Segment, AnalogSignal, NeoReadWriteError from neo.io.basefromrawio import BaseFromRaw from neo.rawio.rawbinarysignalrawio import RawBinarySignalRawIO class RawBinarySignalIO(RawBinarySignalRawIO, BaseFromRaw): """ Class for reading/writing data in a raw binary interleaved compact file. **Important release note** Since the version neo 0.6.0 and the neo.rawio API, argmuents of the IO (dtype, nb_channel, sampling_rate) must be given at the __init__ and not at read_segment() because there is no read_segment() in neo.rawio classes. So now the usage is: >>>>r = io.RawBinarySignalIO(filename='file.raw', dtype='int16', nb_channel=16, sampling_rate=10000.) """ _prefered_signal_group_mode = "group-by-same-units" is_readable = True is_writable = True supported_objects = [Segment, AnalogSignal] readable_objects = [Segment] writeable_objects = [Segment] def __init__( self, filename, dtype="int16", sampling_rate=10000.0, nb_channel=2, signal_gain=1.0, signal_offset=0.0, bytesoffset=0, ): RawBinarySignalRawIO.__init__( self, filename=filename, dtype=dtype, sampling_rate=sampling_rate, nb_channel=nb_channel, signal_gain=signal_gain, signal_offset=signal_offset, bytesoffset=bytesoffset, ) BaseFromRaw.__init__(self, filename) def write_segment(self, segment): """ **Arguments** segment : the segment to write. Only analog signals will be written. Support only 2 cases: * segment.analogsignals have one 2D AnalogSignal * segment.analogsignals have several 1D AnalogSignal with same length/sampling_rate/dtype """ if self.bytesoffset: raise NotImplementedError("bytesoffset values other than 0 " + "not supported") anasigs = segment.analogsignals if len(anasigs) == 0: raise NeoReadWriteError("No AnalogSignal to write") anasig0 = anasigs[0] if len(anasigs) == 1 and anasig0.ndim == 2: numpy_sigs = anasig0.magnitude else: if anasig0.ndim != 1 and (anasig0.ndim == 2 and anasig0.shape[1] != 1): raise NeoReadWriteError("Incorrect analogsignal shaping for write") # all AnaologSignal from Segment must have the same length/sampling_rate/dtype for anasig in anasigs[1:]: if anasig.shape != anasig0.shape: raise ValueError("The shape of one of the analog signals does not match") if anasig.sampling_rate != anasig0.sampling_rate: raise ValueError("The sampling_rate of one of the analog signals does not match") if anasig.dtype != anasig0.dtype: raise ValueError("The dtype of one the analog signals does not match") numpy_sigs = np.empty((anasig0.size, len(anasigs))) for i, anasig in enumerate(anasigs): numpy_sigs[:, i] = anasig.magnitude.flatten() numpy_sigs -= self.signal_offset numpy_sigs /= self.signal_gain numpy_sigs = numpy_sigs.astype(self.dtype) with open(self.filename, "wb") as f: f.write(numpy_sigs.tobytes()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/rawmcsio.py0000644000175100001660000000050514743453644015364 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.rawmcsrawio import RawMCSRawIO class RawMCSIO(RawMCSRawIO, BaseFromRaw): _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename): RawMCSRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/spike2io.py0000644000175100001660000000052714743453644015271 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.spike2rawio import Spike2RawIO class Spike2IO(Spike2RawIO, BaseFromRaw): _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename, **kargs): Spike2RawIO.__init__(self, filename=filename, **kargs) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/spikegadgetsio.py0000644000175100001660000000052314743453644016542 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.spikegadgetsrawio import SpikeGadgetsRawIO class SpikeGadgetsIO(SpikeGadgetsRawIO, BaseFromRaw): __doc__ = SpikeGadgetsRawIO.__doc__ def __init__(self, filename): SpikeGadgetsRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/spikeglxio.py0000644000175100001660000000074614743453644015725 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.spikeglxrawio import SpikeGLXRawIO class SpikeGLXIO(SpikeGLXRawIO, BaseFromRaw): __doc__ = SpikeGLXRawIO.__doc__ mode = "dir" def __init__(self, dirname, load_sync_channel=False, load_channel_location=False): SpikeGLXRawIO.__init__( self, dirname=dirname, load_sync_channel=load_sync_channel, load_channel_location=load_channel_location ) BaseFromRaw.__init__(self, dirname) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/stimfitio.py0000644000175100001660000001165414743453644015556 0ustar00runnerdocker""" README =============================================================================== This is an adapter to represent stfio objects as neo objects. stfio is a standalone file i/o Python module that ships with the Stimfit program (http://www.stimfit.org). It's a Python wrapper around Stimfit's file i/o library (libstfio) that natively provides support for the following file types: - ABF (Axon binary file format; pClamp 6--9) - ABF2 (Axon binary file format 2; pClamp 10+) - ATF (Axon text file format) - AXGX/AXGD (Axograph X file format) - CFS (Cambridge electronic devices filing system) - HEKA (HEKA binary file format) - HDF5 (Hierarchical data format 5; only hdf5 files written by Stimfit or stfio are supported) In addition, libstfio can use the biosig file i/o library as an additional file handling backend (http://biosig.sourceforge.net/), extending support to more than 30 additional file formats (http://pub.ist.ac.at/~schloegl/biosig/TESTED). Based on exampleio.py and axonio.py from neo.io 08 Feb 2014, C. Schmidt-Hieber, University College London """ import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Block, Segment, AnalogSignal, NeoReadWriteError class StimfitIO(BaseIO): """ Class for converting a stfio Recording to a Neo object. Provides a standardized representation of the data as defined by the neo project; this is useful to explore the data with an increasing number of electrophysiology software tools that rely on the Neo standard. stfio is a standalone file i/o Python module that ships with the Stimfit program (http://www.stimfit.org). It is a Python wrapper around Stimfit's file i/o library (libstfio) that natively provides support for the following file types: - ABF (Axon binary file format; pClamp 6--9) - ABF2 (Axon binary file format 2; pClamp 10+) - ATF (Axon text file format) - AXGX/AXGD (Axograph X file format) - CFS (Cambridge electronic devices filing system) - HEKA (HEKA binary file format) - HDF5 (Hierarchical data format 5; only hdf5 files written by Stimfit or stfio are supported) In addition, libstfio can use the biosig file i/o library as an additional file handling backend (http://biosig.sourceforge.net/), extending support to more than 30 additional file formats (http://pub.ist.ac.at/~schloegl/biosig/TESTED). Example usage: >>> import neo >>> neo_obj = neo.io.StimfitIO("file.abf") or >>> import stfio >>> stfio_obj = stfio.read("file.abf") >>> neo_obj = neo.io.StimfitIO(stfio_obj) """ is_readable = True is_writable = False supported_objects = [Block, Segment, AnalogSignal] readable_objects = [Block] writeable_objects = [] has_header = False is_streameable = False read_params = {Block: []} write_params = None name = "Stimfit" extensions = ["abf", "dat", "axgx", "axgd", "cfs"] mode = "file" def __init__(self, filename=None): """ Arguments: filename : Either a filename or a stfio Recording object """ # We need this module, so try importing now so that it fails on # instantiation rather than read_block import stfio # noqa BaseIO.__init__(self) if hasattr(filename, "lower"): self.filename = filename self.stfio_rec = None else: self.stfio_rec = filename self.filename = None def read_block(self, lazy=False): import stfio if lazy: raise NeoReadWriteError("This IO does not support lazy reading") if self.filename is not None: self.stfio_rec = stfio.read(self.filename) bl = Block() bl.description = self.stfio_rec.file_description bl.annotate(comment=self.stfio_rec.comment) try: bl.rec_datetime = self.stfio_rec.datetime except: bl.rec_datetime = None dt = np.round(self.stfio_rec.dt * 1e-3, 9) * pq.s # ms to s sampling_rate = 1.0 / dt t_start = 0 * pq.s # iterate over sections first: for j, recseg in enumerate(self.stfio_rec[0]): seg = Segment(index=j) length = len(recseg) # iterate over channels: for i, recsig in enumerate(self.stfio_rec): name = recsig.name unit = recsig.yunits try: pq.Quantity(1, unit) except: unit = "" signal = pq.Quantity(recsig[j], unit) anaSig = AnalogSignal( signal, sampling_rate=sampling_rate, t_start=t_start, name=str(name), channel_index=i ) seg.analogsignals.append(anaSig) bl.segments.append(seg) t_start = t_start + length * dt bl.check_relationships() return bl ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/tdtio.py0000644000175100001660000000113314743453644014661 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.tdtrawio import TdtRawIO class TdtIO(TdtRawIO, BaseFromRaw): """ Class for reading data from from Tucker Davis TTank format. Terminology: TDT holds data with tanks (actually a directory). And tanks hold sub blocks (sub directories). Tanks correspond to Neo Blocks and TDT blocks correspond to Neo Segments. """ _prefered_signal_group_mode = "group-by-same-units" mode = "dir" def __init__(self, dirname): TdtRawIO.__init__(self, dirname=dirname) BaseFromRaw.__init__(self, dirname) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/tiffio.py0000644000175100001660000001005714743453644015023 0ustar00runnerdocker""" Neo IO module for optical imaging data stored as a folder of TIFF images. """ import glob import re import numpy as np from neo.core import ImageSequence, Segment, Block from .baseio import BaseIO class TiffIO(BaseIO): """ Neo IO module for optical imaging data stored as a folder of TIFF images. *Usage*: >>> from neo import io >>> import quantities as pq >>> r = io.TiffIO("dir_tiff",spatial_scale=1.0*pq.mm, units='V', ... sampling_rate=1.0*pq.Hz) >>> block = r.read_block() read block creating segment returning block >>> block Block with 1 segments file_origin: 'test' # segments (N=1) 0: Segment with 1 imagesequences annotations: {'tiff_file_names': ['file_tif_1_.tiff', 'file_tif_2.tiff', 'file_tif_3.tiff', 'file_tif_4.tiff', 'file_tif_5.tiff', 'file_tif_6.tiff', 'file_tif_7.tiff', 'file_tif_8.tiff', 'file_tif_9.tiff', 'file_tif_10.tiff', 'file_tif_11.tiff', 'file_tif_12.tiff', 'file_tif_13.tiff', 'file_tif_14.tiff']} # analogsignals (N=0) """ name = "TIFF IO" description = "Neo IO module for optical imaging data stored as a folder of TIFF images." _prefered_signal_group_mode = "group-by-same-units" is_readable = True is_writable = False supported_objects = [Block, Segment, ImageSequence] readable_objects = supported_objects writeable_objects = [] support_lazy = False read_params = {} write_params = {} extensions = [] mode = "dir" def __init__(self, directory_path=None, units=None, sampling_rate=None, spatial_scale=None, **kwargs): import PIL BaseIO.__init__(self, directory_path, **kwargs) self.units = units self.sampling_rate = sampling_rate self.spatial_scale = spatial_scale def read_block(self, lazy=False, **kwargs): import PIL # to sort file def natural_sort(l): convert = lambda text: int(text) if text.isdigit() else text.lower() alphanum_key = lambda key: [convert(c) for c in re.split("([0-9]+)", key)] return sorted(l, key=alphanum_key) # find all the images in the given directory file_name_list = [] # name of extensions to track types = ["*.tif", "*.tiff"] for file in types: file_name_list.append(glob.glob(self.filename + "/" + file)) # flatten list file_name_list = [item for sublist in file_name_list for item in sublist] # delete path in the name of file file_name_list = [file_name[len(self.filename) + 1 : :] for file_name in file_name_list] # sorting file file_name_list = natural_sort(file_name_list) list_data_image = [] for file_name in file_name_list: data = np.array(PIL.Image.open(self.filename + "/" + file_name)).astype(np.float32) list_data_image.append(data) list_data_image = np.array(list_data_image) if len(list_data_image.shape) == 4: list_data_image = [] for file_name in file_name_list: image = PIL.Image.open(self.filename + "/" + file_name).convert("L") data = np.array(image).astype(np.float32) list_data_image.append(data) print("read block") image_sequence = ImageSequence( np.stack(list_data_image), units=self.units, sampling_rate=self.sampling_rate, spatial_scale=self.spatial_scale, ) print("creating segment") segment = Segment(file_origin=self.filename) segment.annotate(tiff_file_names=file_name_list) segment.imagesequences = [image_sequence] block = Block(file_origin=self.filename) block.segments.append(segment) print("returning block") return block ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/tools.py0000644000175100001660000000442414743453644014704 0ustar00runnerdocker""" Tools for IO coder: * Creating RecordingChannel and making links with AnalogSignals and SPikeTrains """ from collections.abc import MutableSequence from neo.core import ( AnalogSignal, Block, Epoch, Event, IrregularlySampledSignal, Group, ChannelView, Segment, SpikeTrain, ) class LazyList(MutableSequence): """An enhanced list that can load its members on demand. Behaves exactly like a regular list for members that are Neo objects. Each item should contain the information that ``load_lazy_cascade`` needs to load the respective object. """ _container_objects = {Block, Segment, Group} _neo_objects = _container_objects.union( [AnalogSignal, Epoch, Event, ChannelView, IrregularlySampledSignal, SpikeTrain] ) def __init__(self, io, lazy, items=None): """ :param io: IO instance that can load items. :param lazy: Lazy parameter with which the container object using the list was loaded. :param items: Optional, initial list of items. """ if items is None: self._data = [] else: self._data = items self._lazy = lazy self._io = io def __getitem__(self, index): item = self._data.__getitem__(index) if isinstance(index, slice): return LazyList(self._io, item) if type(item) in self._neo_objects: return item loaded = self._io.load_lazy_cascade(item, self._lazy) self._data[index] = loaded return loaded def __delitem__(self, index): self._data.__delitem__(index) def __len__(self): return self._data.__len__() def __setitem__(self, index, value): self._data.__setitem__(index, value) def insert(self, index, value): self._data.insert(index, value) def append(self, value): self._data.append(value) def reverse(self): self._data.reverse() def extend(self, values): self._data.extend(values) def remove(self, value): self._data.remove(value) def __str__(self): return "<" + self.__class__.__name__ + ">" + self._data.__str__() def __repr__(self): return "<" + self.__class__.__name__ + ">" + self._data.__repr__() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/winedrio.py0000644000175100001660000000077314743453644015367 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.winedrrawio import WinEdrRawIO class WinEdrIO(WinEdrRawIO, BaseFromRaw): """ Class for reading data from WinEdr, a software tool written by John Dempster. WinEdr is free: http://spider.science.strath.ac.uk/sipbs/software.htm """ _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename): WinEdrRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/io/winwcpio.py0000644000175100001660000000077314743453644015406 0ustar00runnerdockerfrom neo.io.basefromrawio import BaseFromRaw from neo.rawio.winwcprawio import WinWcpRawIO class WinWcpIO(WinWcpRawIO, BaseFromRaw): """ Class for reading data from WinWCP, a software tool written by John Dempster. WinWCP is free: http://spider.science.strath.ac.uk/sipbs/software.htm """ _prefered_signal_group_mode = "group-by-same-units" def __init__(self, filename): WinWcpRawIO.__init__(self, filename=filename) BaseFromRaw.__init__(self, filename) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1534154 neo-0.14.0/neo/rawio/0000755000175100001660000000000014743453656013703 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/__init__.py0000644000175100001660000001753314743453644016022 0ustar00runnerdocker""" :mod:`neo.rawio` provides classes for reading electrophysiological data files with a low-level API :attr:`neo.rawio.rawiolist` provides a list of successfully imported rawio classes. Functions: .. autofunction:: neo.rawio.get_rawio Classes: * :attr:`AlphaOmegaRawIO` * :attr:`AxographRawIO` * :attr:`AxonaRawIO` * :attr:`AxonRawIO` * :attr:`BiocamRawIO` * :attr:`BlackrockRawIO` * :attr:`BrainVisionRawIO` * :attr:`CedRawIO` * :attr:`EDFRawIO` * :attr:`ElanRawIO` * :attr:`IntanRawIO` * :attr:`MaxwellRawIO` * :attr:`MedRawIO` * :attr:`MEArecRawIO` * :attr:`MicromedRawIO` * :attr:`NeuralynxRawIO` * :attr:`NeuroExplorerRawIO` * :attr:`NeuroNexusRawIO` * :attr:`NeuroScopeRawIO` * :attr:`NIXRawIO` * :attr:`OpenEphysRawIO` * :attr:`OpenEphysBinaryRawIO` * :attr:`PhyRawIO` * :attr:`PlexonRawIO` * :attr:`Plexon2RawIO` * :attr:`RawBinarySignalRawIO` * :attr:`RawMCSRawIO` * :attr:`Spike2RawIO` * :attr:`SpikeGadgetsRawIO` * :attr:`SpikeGLXRawIO` * :attr:`TdtRawIO` * :attr:`WinEdrRawIO` * :attr:`WinWcpRawIO` .. autoclass:: neo.rawio.AlphaOmegaRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.AxographRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.AxonaRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.AxonRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.BiocamRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.BlackrockRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.BrainVisionRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.CedRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.EDFRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.ElanRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.IntanRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.MaxwellRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.MedRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.MEArecRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.MicromedRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.NeuralynxRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.NeuroExplorerRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.NeuroNexusRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.NeuroScopeRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.NIXRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.OpenEphysRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.OpenEphysBinaryRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.PhyRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.PlexonRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.Plexon2RawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.RawBinarySignalRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.RawMCSRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.Spike2RawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.SpikeGadgetsRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.SpikeGLXRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.TdtRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.WinEdrRawIO .. autoattribute:: extensions .. autoclass:: neo.rawio.WinWcpRawIO .. autoattribute:: extensions """ from pathlib import Path from collections import Counter from neo.rawio.alphaomegarawio import AlphaOmegaRawIO from neo.rawio.axographrawio import AxographRawIO from neo.rawio.axonarawio import AxonaRawIO from neo.rawio.axonrawio import AxonRawIO from neo.rawio.biocamrawio import BiocamRawIO from neo.rawio.blackrockrawio import BlackrockRawIO from neo.rawio.brainvisionrawio import BrainVisionRawIO from neo.rawio.cedrawio import CedRawIO from neo.rawio.edfrawio import EDFRawIO from neo.rawio.elanrawio import ElanRawIO from neo.rawio.examplerawio import ExampleRawIO from neo.rawio.intanrawio import IntanRawIO from neo.rawio.maxwellrawio import MaxwellRawIO from neo.rawio.mearecrawio import MEArecRawIO from neo.rawio.medrawio import MedRawIO from neo.rawio.micromedrawio import MicromedRawIO from neo.rawio.neuralynxrawio import NeuralynxRawIO from neo.rawio.neuroexplorerrawio import NeuroExplorerRawIO from neo.rawio.neuronexusrawio import NeuroNexusRawIO from neo.rawio.neuroscoperawio import NeuroScopeRawIO from neo.rawio.nixrawio import NIXRawIO from neo.rawio.openephysrawio import OpenEphysRawIO from neo.rawio.openephysbinaryrawio import OpenEphysBinaryRawIO from neo.rawio.phyrawio import PhyRawIO from neo.rawio.plexonrawio import PlexonRawIO from neo.rawio.plexon2rawio import Plexon2RawIO from neo.rawio.rawbinarysignalrawio import RawBinarySignalRawIO from neo.rawio.rawmcsrawio import RawMCSRawIO from neo.rawio.spike2rawio import Spike2RawIO from neo.rawio.spikegadgetsrawio import SpikeGadgetsRawIO from neo.rawio.spikeglxrawio import SpikeGLXRawIO from neo.rawio.tdtrawio import TdtRawIO from neo.rawio.winedrrawio import WinEdrRawIO from neo.rawio.winwcprawio import WinWcpRawIO rawiolist = [ AlphaOmegaRawIO, AxographRawIO, AxonaRawIO, AxonRawIO, BiocamRawIO, BlackrockRawIO, BrainVisionRawIO, CedRawIO, EDFRawIO, ElanRawIO, IntanRawIO, MicromedRawIO, MaxwellRawIO, MEArecRawIO, MedRawIO, NeuralynxRawIO, NeuroExplorerRawIO, NeuroNexusRawIO, NeuroScopeRawIO, NIXRawIO, OpenEphysRawIO, OpenEphysBinaryRawIO, PhyRawIO, PlexonRawIO, Plexon2RawIO, RawBinarySignalRawIO, RawMCSRawIO, Spike2RawIO, SpikeGadgetsRawIO, SpikeGLXRawIO, TdtRawIO, WinEdrRawIO, WinWcpRawIO, ] def get_rawio_class(filename_or_dirname): """Legacy function for returning class guess from file extension DEPRECATED """ import warnings warnings.warn( "get_rawio_class is deprecated and will be removed in 0.15.0. " "In the future please use `get_rawio`" ) return get_rawio(filename_or_dirname) def get_rawio(filename_or_dirname, exclusive_rawio: bool = True): """ Return a neo.rawio class guess from file extension. Parameters ---------- filename_or_dirname : str | Path The filename or directory name to check for file suffixes that can be read by Neo. This can also be used to check whether a rawio could read a not-yet written file exclusive_rawio: bool, default: True Whether to return a rawio if there is only one rawio capable of reading the file. If this doesn't exist will return None. If set to False it will return all possible rawios organized by the most likely rawio. Returns ------- possibles: neo.RawIO | None | list[neo.RawIO] If exclusive_rawio is True, returns the single RawIO that can read a file/set of files or None. If exclusive_rawio is False it will return all possible RawIOs (organized by most likely) that could read the file or files. """ filename_or_dirname = Path(filename_or_dirname) # if filename_or_dirname doesn't exist then user may just be checking if # neo can read their file or they give a real file if not filename_or_dirname.exists() or filename_or_dirname.is_file(): ext = Path(filename_or_dirname).suffix ext_list = [ext[1:]] else: ext_list = list({filename.suffix[1:] for filename in filename_or_dirname.glob("*") if filename.is_file()}) possibles = [] for ext in ext_list: for rawio in rawiolist: if any(ext.lower() == ext2.lower() for ext2 in rawio.extensions): possibles.append(rawio) if len(possibles) == 1 and exclusive_rawio: return possibles[0] elif exclusive_rawio: return None else: possibles = [io[0] for io in Counter(possibles).most_common()] return possibles ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/alphaomegarawio.py0000644000175100001660000015375014743453644017425 0ustar00runnerdocker""" This module implements file reader for AlphaOmega MPX file format version 4. This module expect default channel names from the AlphaOmega record system (RAW ###, SPK ###, LFP ###, AI ###,…). This module reads all *.mpx files in a directory (not recursively) by default. If you provide a list of *.lsx files only the *.mpx files referenced by those *.lsx files will be loaded. The specifications are mostly extracted from the "AlphaRS User Manual V1.0.1.pdf" manual provided with the AlphaRS hardware. The specifications are described in the chapter 6: ALPHARS FILE FORMAT. See at the end of this file for file format blocks description. Some informations missing from the file specifications were kindly provided by AlphaOmega engineers. .. note:: Not a lot of memory optimization effort was put into this module. You should expect a big memory usage when loading data with this module Author: Thomas Perret """ import io import mmap import struct from collections import defaultdict from datetime import datetime from pathlib import Path, PureWindowsPath import numpy as np from .baserawio import ( BaseRawIO, _signal_buffer_dtype, _signal_stream_dtype, _signal_channel_dtype, _spike_channel_dtype, _event_channel_dtype, ) from neo.core import NeoReadWriteError class AlphaOmegaRawIO(BaseRawIO): """ AlphaOmega MPX file format 4 reader. Handles several segments. A segment is a continuous recording (when recording starts/stops). Only files in current `dirname` are loaded, subfolders are not explored. Parameters ---------- dirname: str | Path The folder from which the data will be loaded lsx_files: list[str] | None, default: None List of lsx files in `dirname` referencing mpx files to load (optional) If None all mpx files will be read prune_channels: bool, default: True If True removes the empty channels Notes ----- Because channels must be gathered into coherent streams, channels names **must** be the default channel names in AlphaRS or Alpha LAB SNR software. """ extensions = ["lsx", "mpx"] rawmode = "one-dir" STREAM_CHANNELS = ( ("Accelerometer", "ACC", "ACC"), ("Spike Train", "SPK", "SPK"), ("Local Field Potential", "LFP", "LFP"), ("Raw Analog", "RAW", "RAW"), ("Analog Input", "AI", "AI"), ("User Defined", "UD", "UD"), ) EVENT_CHANNELS = ( ("TTL", "TTL", "TTL"), ("Digital Output", "DOUT", "DOUT"), ("User Event", "UD", "UD"), ("Stim Marker", "StimMarker", "StimMarker"), ("Digital Port", "InPort", "InPort"), ("Internal Detection", "Internal Detection", "Internal Detection"), ) def __init__(self, dirname="", lsx_files=None, prune_channels=True): super().__init__(dirname=dirname) self.dirname = Path(dirname) self._lsx_files = lsx_files self._mpx_files = None self._prune_channels = prune_channels self._opened_files = {} self._ignore_unknown_datablocks = True # internal debug property if self.dirname.is_dir(): self._explore_folder() else: raise ValueError(f"{self.dirname} is not a folder") def _explore_folder(self): """ If class was instantiated with lsx_files (list of .lsx files), load only the files referenced in these lsx files otherwise, load all *.mpx files in `dirname`. It does not explores the subfolders. """ filenames = [] if self._lsx_files is not None: for index_file in self._lsx_files: index_file = self.dirname / index_file with open(index_file, "r") as f: for line in f: # a line is a Microsoft Windows path. As we cannot # instantiate a WindowsPath on other OS than MS # Windows, we use the PureWindowsPath class filename = PureWindowsPath(line.strip()) filename = self.dirname / filename.name if not filename.is_file(): self.logger.warning(f"File {filename} does not exist") else: filenames.append(filename) else: # Load all mpx. Filter in only files in case there's a folder with # .mpx extension filenames = list(filter(lambda x: x.is_file(), self.dirname.glob("*.mpx"))) if not filenames: self.logger.error(f"Found no AlphaOmega *.mpx files in {self.dirname}") else: # Sorting lexicographically should be enough to load the files in # correct order. This could improve slightly loading performances filenames.sort() self._mpx_files = filenames def _source_name(self): return str(self.dirname) def _read_file_datablocks(self, filename, prune_channels=True): """Read datablocks from AlphaOmega MPX file version 4. :param filename: the MPX filename to read datablocks from :type filename: Path-like object or str :param prune_channels: Remove references to channels and ports which doesn't contain any data recorded. Be careful when using this option with multiple-file data since it could theoretically leads to exception raised when data recorded in further files are merged into the first file pruned from these channels. :type prune_channels: bool """ continuous_analog_channels = {} segmented_analog_channels = {} digital_channels = {} channel_type = {} stream_data_channels = {} ports = {} events = [] unknown_datablocks = [] with open(filename, "rb") as f: length, block_type = HeaderType.unpack(f.read(HeaderType.size)) # First block is always type h and size 60 if block_type != b"h": try: bt = block_type.decode() self.logger.error("First block must be of type h not type {bt}") except UnicodeDecodeError: self.logger.error( (f"First block must be of type h not type " f"{int.from_bytes(bt, 'little')} (int format)") ) raise Exception("First block of AlphaOmega MPX file format must be of type h") if not length == 60: self.logger.error("First block must be of size 60 (got size {length})") raise Exception("First block of AlphaOmega MPX file format must be of size 60") ( next_block, version, hour, minute, second, hsecond, day, month, year, dayofweek, minimum_time, maximum_time, erase_count, map_version, application_name, resource_version, reserved, ) = SDataHeader.unpack(f.read(SDataHeader.size)) if map_version != 4: self.logger.error("Only map version 4 is supported") raise Exception("Only AlphaOmega MPX file format 4 is supported") resource_version = "".join([str(b) for b in resource_version]) try: resource_version = int(resource_version) except ValueError: self.logger.error(f"m_ResourceVersion should be an integer (got: {resource_version}") metadata = { "application_version": version, "application_name": decode_string(application_name), "record_date": datetime(year, month, day, hour, minute, second, 10000 * hsecond), "start_time": minimum_time, "stop_time": maximum_time, "erase_count": erase_count, "map_version": map_version, "resource_version": resource_version, "max_sample_rate": 0, } pos = 0 while True: pos += length f.seek(pos) header_bytes = f.read(HeaderType.size) length, block_type = HeaderType.unpack(header_bytes) if length == 65535: # The stop condition for reading MPX datablocks is base on # the # length of the block: if the block has length 65535 # (or -1 in signed integer value) we know we have reached # the end of the file # We could also check that we are at the end of the file # after this block break if block_type == b"h": self.logger.error("Type h block must exist only at the beginning of file") raise Exception("AlphaOmega MPX file format must not have type h block after first block") if block_type == b"2": ( next_block, is_analog, is_input, channel_number, *spike_color, ) = Type2DataBlock.unpack(f.read(Type2DataBlock.size)) if is_analog and is_input: ( mode, amplitude, sample_rate, spike_count, mode_spike, ) = SDefAnalog.unpack(f.read(SDefAnalog.size)) mode_spike_mode = (mode_spike & 0b1111000000000000) >> 12 mode_spike_master = mode_spike_mode == 1 mode_spike_slave = mode_spike_mode == 2 mode_spike_linked_channel = mode_spike & 0b0000111111111111 mode_spike = { "mode_spike_orig": mode_spike, "mode_spike_master": mode_spike_master, "mode_spike_slave": mode_spike_slave, "mode_spike_linked_channel": mode_spike_linked_channel, } metadata["max_sample_rate"] = max(metadata["max_sample_rate"], sample_rate * 1000) if amplitude <= 5: # This is true for any logging software for map # version >4 (specs say only for ALab SNR but AO # engineer says it's true for any software) amplitude = 1250000 / 2**15 if mode == 0: # continuous analog channel definition block if channel_number in channel_type: raise NeoReadWriteError( f"channel_number {channel_number} must not be in channel_type {channel_type}" ) channel_type[channel_number] = "continuous_analog" duration, total_gain_100 = SDefContinAnalog.unpack(f.read(SDefContinAnalog.size)) name_length = length - 38 name = get_name(f, name_length) if channel_number in continuous_analog_channels: raise NeoReadWriteError( f"`channel_number` {channel_number} must not be in continous_analog_channels {continuous_analog_channels}" ) continuous_analog_channels[channel_number] = { "spike_color": spike_color, "bit_resolution": amplitude, "sample_rate": sample_rate * 1000, "spike_count": spike_count, "mode_spike": mode_spike, "duration": duration, "gain": total_gain_100 / 100, "name": name, "positions": defaultdict(list), } elif mode == 1: # segmented analog channel definition block if channel_number in channel_type: raise NeoReadWriteError( f"`channel_number` {channel_number} must not be in channel_type {channel_type}" ) channel_type[channel_number] = "segmented_analog" ( pre_trig_ms, post_trig_ms, level_value, trg_mode, yes_rms, total_gain_100, ) = SDefLevelAnalog.unpack(f.read(SDefLevelAnalog.size)) name_length = length - 48 name = get_name(f, name_length) if channel_number in segmented_analog_channels: raise NeoReadWriteError( f"`channel_number` {channel_number} must be in segmented_analog_channels {segmented_analog_channels}" ) segmented_analog_channels[channel_number] = { "spike_color": spike_color, "bit_resolution": amplitude, "sample_rate": sample_rate * 1000, "spike_count": spike_count, "mode_spike": mode_spike, "pre_trig_duration": pre_trig_ms / 1000, "post_trig_duration": post_trig_ms / 1000, "level_value": level_value, "trg_mode": trg_mode, "automatic_level_base_rms": yes_rms, "gain": total_gain_100 / 100, "name": name, "positions": defaultdict(list), } else: self.logger.error(f"Unknown type 2 analog block mode: {mode}") continue elif is_analog == 0 and is_input == 1: # digital input channel definition if channel_number in channel_type: raise NeoReadWriteError( f"`channel_number` {channel_number} must not be in channel_type {channel_type}" ) channel_type[channel_number] = "digital" ( sample_rate, save_trigger, duration, prev_status, ) = SDefDigitalInput.unpack(f.read(SDefDigitalInput.size)) metadata["max_sample_rate"] = max(metadata["max_sample_rate"], sample_rate * 1000) if channel_number in digital_channels: raise NeoReadWriteError( f"`channel_number {channel_number} must not be in digital_channels {digital_channels}" ) name_length = length - 30 name = get_name(f, name_length) digital_channels[channel_number] = { "spike_color": spike_color, "sample_rate": sample_rate * 1000, "save_trigger": save_trigger, "duration": duration, "prev_status": prev_status, "name": name, "samples": [], } else: self.logger.error(f"Unknown type 2 block: analog={is_analog}, input={is_input}") continue elif block_type == b"S": # stream data definition block next_block, channel_number, sample_rate = SDefStream.unpack(f.read(SDefStream.size)) metadata["max_sample_rate"] = max(metadata["max_sample_rate"], sample_rate * 1000) if channel_number in channel_type: raise NeoReadWriteError( f"`channel_number` {channel_number} must not be in channel_type {channel_type}" ) channel_type[channel_number] = "stream_data" name_length = length - 18 name = get_name(f, name_length) stream_data_channels[channel_number] = { "sample_rate": sample_rate * 1000, "name": name, } elif block_type == b"b": # digital input/output port definition block board_number, port, sample_rate, prev_value = SDefPortX.unpack(f.read(SDefPortX.size)) metadata["max_sample_rate"] = max(metadata["max_sample_rate"], sample_rate * 1000) if port in channel_type: raise NeoReadWriteError(f"`port` {port} must not be in channel_type {channel_type}") channel_type[port] = "port" name_length = length - 18 name = get_name(f, name_length) ports[port] = { "board_number": board_number, "sample_rate": sample_rate * 1000, "prev_value": prev_value, "name": name, "samples": [], } elif block_type == b"5": # channel data block unit_number, channel_number = SDataChannel.unpack(f.read(SDataChannel.size)) if channel_number not in channel_type: raise ValueError(f"`channel_number` must be in channel_type {channel_type}") unit_number = int.from_bytes(unit_number, "little") if "analog" in channel_type[channel_number]: data_length = (length - 10) / 2 # why do we even have this check? if int(data_length) != data_length: raise ValueError(f"The data length must be equal to the int of the data length") data_length = int(data_length) data_start = f.tell() f.seek(2 * data_length, io.SEEK_CUR) if channel_type[channel_number].startswith("continuous"): if channel_number not in continuous_analog_channels: raise NeoReadWriteError( f"The `channel_number` must be in the continuous_analog_channels {continuous_analog_channels}" ) continuous_analog_channels[channel_number]["positions"][filename].append( ( SDataChannel_sample_id.unpack(f.read(SDataChannel_sample_id.size))[0], data_start, data_length, ) ) elif channel_type[channel_number].startswith("segmented"): if channel_number not in segmented_analog_channels: raise NeoReadWriteError( f"The `channel_number` must be in the segmented_analog_channels {segmented_analog_channels}" ) if unit_number > 0 and unit_number <= 4: segmented_analog_channels[channel_number]["positions"][filename].append( ( SDataChannel_sample_id.unpack(f.read(SDataChannel_sample_id.size))[0], data_start, data_length, ) ) elif unit_number == 0: segmented_analog_channels[channel_number]["positions"][filename].append( ( SDataChannel_sample_id.unpack(f.read(SDataChannel_sample_id.size))[0], data_start, data_length, ) ) else: self.logger.error(f"Unknown unit_number={unit_number} in channel data block") continue elif channel_type[channel_number] == "digital": if channel_number not in digital_channels: raise NeoReadWriteError( f"The `channel_number` must be in the digital_channels {digital_channels}" ) sample_number, value = SDataChannelDigital.unpack(f.read(SDataChannelDigital.size)) digital_channels[channel_number]["samples"].append( ( sample_number, value, ) ) elif channel_type[channel_number] == "port": if channel_number not in ports: raise NeoReadWriteError(f"The `channel_number` must be in ports {ports}") # specifications says that for ports it should be "= segment["metadata"]["record_date"] and 0 <= (s["metadata"]["start_time"] - segment["metadata"]["stop_time"]) <= factor_period / segment["metadata"]["max_sample_rate"] and s is not segment ] if len(possible_same_segments) not in (0, 1): self.logger.error( f"Cannot merge segments. Found {len(possible_same_segments)} segments following segment: {segment['metadata']}" ) continue if possible_same_segments: existing_merges = [s for segs in segments_to_merge for s in segs] if existing_merges: existing_merges.sort(key=lambda x: x["metadata"]["start_time"]) segment = existing_merges[0] segments_to_merge.append((segment, possible_same_segments[0])) for segment, segment_to_merge in segments_to_merge: sample_rate = segment["metadata"]["max_sample_rate"] sample_rate_merge = segment_to_merge["metadata"]["max_sample_rate"] if sample_rate != sample_rate_merge: self.logger.error( f"Segment to merge has sample_rate={sample_rate_merge}, expected {sample_rate}. Continuing anyway." ) segment["metadata"]["stop_time"] = segment_to_merge["metadata"]["stop_time"] segment["metadata"]["filenames"].extend(segment_to_merge["metadata"]["filenames"]) for stream in segment_to_merge["streams"]: for channel_id in segment_to_merge["streams"][stream]: try: channel = segment["streams"][stream][channel_id] except KeyError: # there can potentially have segment without stream for this # channel but the segment to merge has stream for this channel segment["streams"][stream][channel_id] = segment_to_merge["streams"][stream][channel_id] else: for f in segment_to_merge["streams"][stream][channel_id]["positions"]: channel["positions"][f].extend( segment_to_merge["streams"][stream][channel_id]["positions"][f] ) for channel_id in segment_to_merge["events"]: try: channel = segment["events"][channel_id] except KeyError: # it's possible that the first segment doesn't record any # port channel data and the port could have been pruned segment["events"][channel_id] = segment_to_merge["events"][channel_id] else: channel["samples"].extend(segment_to_merge["events"][channel_id]["samples"]) for channel_id in segment_to_merge["spikes"]: try: channel = segment["spikes"][channel_id] except KeyError: # there can potentially have segment without spike for this # channel but the segment to merge has spikes for this channel segment["spikes"][channel_id] = segment_to_merge["spikes"][channel_id] else: for f in segment_to_merge["spikes"][channel_id]["positions"]: channel["positions"][f].extend(segment_to_merge["spikes"][channel_id]["positions"][f]) segment["ao_events"].extend(segment_to_merge["ao_events"]) for channel_id in segment_to_merge["stream_data"]: # To be honest, I have no idea what is a # stream_data_channels so let's just overwrite it here segment["stream_data"][channel_id] = segment_to_merge["stream_data"][channel_id] self._segments.remove(segment_to_merge) def _parse_header(self): segments = [] for i, filename in enumerate(self._mpx_files): metadata, cac, sac, dc, ct, sd, p, e, ub = self._read_file_datablocks(filename, self._prune_channels) metadata["filenames"] = [filename] streams = {} for stream_name, channel_name_start, stream_id in self.STREAM_CHANNELS: channels = {i: c for i, c in cac.items() if c["name"].startswith(channel_name_start)} streams[stream_id] = channels events = dc.copy() events.update(p) segment = { "metadata": metadata, "streams": streams, "events": events, "spikes": sac, "ao_events": e, "stream_data": sd, } segments.append(segment) self._segments = segments # We merge segments after having loading all the files because they # could be loaded in any order self._merge_segments() buffer_id = "" signal_streams = set( (stream_name, stream_id, buffer_id) for segment in self._segments for stream in segment["streams"] for stream_name, _, stream_id in self.STREAM_CHANNELS if stream_id == stream and segment["streams"][stream] ) signal_streams = list(signal_streams) signal_streams.sort(key=lambda x: x[1]) signal_streams = np.array(signal_streams, dtype=_signal_stream_dtype) signal_buffers = np.array([], dtype=_signal_buffer_dtype) buffer_id = "" signal_channels = set( ( channel["name"], channel_id, channel["sample_rate"], np.dtype(np.short).name, "uV", channel["gain"] / channel["bit_resolution"], 0, stream_id, buffer_id, ) for segment in self._segments for stream_id in segment["streams"] for channel_id, channel in segment["streams"][stream_id].items() ) signal_channels = list(signal_channels) signal_channels.sort(key=lambda x: (x[7], x[0])) signal_channels = np.array(signal_channels, dtype=_signal_channel_dtype) spike_channels = set( ( c["name"], i, "uV", c["gain"] / c["bit_resolution"], 0, round(c["pre_trig_duration"] * c["sample_rate"]), c["sample_rate"], ) for segment in self._segments for i, c in segment["spikes"].items() ) spike_channels = list(spike_channels) spike_channels.sort(key=lambda x: x[0]) spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) event_channels = set( (event["name"], i, "event") for segment in self._segments for i, event in segment["events"].items() ) event_channels = list(event_channels) event_channels.sort(key=lambda x: x[1]) event_channels = np.array(event_channels, dtype=_event_channel_dtype) self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [len(self._segments)] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = signal_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels self._generate_minimal_annotations() bl_ann = self.raw_annotations["blocks"][0] bl_ann["name"] = "Block #{}{}".format(0, " from lsx file(s) {self._lsx_files}" if self._lsx_files else "") bl_ann["file_origin"] = ( "\n".join(str(self.dirname / f) for f in self._lsx_files) if self._lsx_files else bl_ann["file_origin"] ) bl_ann["rec_datetime"] = self._segments[0]["metadata"]["record_date"] for seg_index, segment in enumerate(self._segments): seg_ann = bl_ann["segments"][seg_index] seg_ann["name"] = f"Seg #{seg_index} Block #0" seg_ann["file_origin"] = "\n".join(str(f) for f in self._segments[seg_index]["metadata"]["filenames"]) seg_ann["rec_datetime"] = self._segments[seg_index]["metadata"]["record_date"] for c_index, c in enumerate(seg_ann["signals"]): c = c.copy() c["file_origin"] = "\n".join( set( str(f) for channels in self._segments[seg_index]["streams"][c["stream_id"]].values() for f in channels["positions"] ) ) seg_ann["signals"][c_index] = c for e_index, e in enumerate(seg_ann["events"]): e = e.copy() e["file_origin"] = seg_ann["file_origin"] seg_ann["events"][e_index] = e # We open files and create mmap objects for filename in self._mpx_files: if filename not in self._opened_files: self._opened_files[filename] = {} self._opened_files[filename]["file"] = filename.open(mode="rb") self._opened_files[filename]["mmap"] = mmap.mmap( self._opened_files[filename]["file"].fileno(), 0, access=mmap.ACCESS_READ, ) def __del__(self): # To be sure we close the file when object is deleted. Be aware that the # __del__ method is not necessarily called when interpreter exits so we # could still leave file opened. This is probably bad… for filename in self._opened_files: self._opened_files[filename]["mmap"].close() self._opened_files[filename]["file"].close() if hasattr(super(), "__del__"): super().__del__() def _segment_t_start(self, block_index, seg_index): return self._segments[seg_index]["metadata"]["start_time"] def _segment_t_stop(self, block_index, seg_index): return self._segments[seg_index]["metadata"]["stop_time"] def _get_signal_size(self, block_index, seg_index, stream_index): stream_id = self.header["signal_streams"][stream_index]["id"] sizes = [ sum(sample[2] for sample_by_file in channel["positions"].values() for sample in sample_by_file) for channel in self._segments[seg_index]["streams"][stream_id].values() ] if not all(s == sizes[0] for s in sizes): raise NeoReadWriteError("The sizes of signals must be the same to get signal size") return sizes[0] def _get_signal_t_start(self, block_index, seg_index, stream_index): return self._segment_t_start(block_index, seg_index) def _get_analogsignal_chunk(self, block_index, seg_index, i_start, i_stop, stream_index, channel_indexes): if i_start is None: i_start = 0 signal_size = self._get_signal_size(block_index, seg_index, stream_index) if i_stop is None or i_stop > signal_size: i_stop = signal_size stream_id = self.header["signal_streams"][stream_index]["id"] mask = self.header["signal_channels"]["stream_id"] == stream_id channel_ids = self.header["signal_channels"][mask]["id"][channel_indexes].flatten() # the data refers to timestamp (see docstrings) which does not start at # 0 but at time_start (see type H docstring) first_pos = [] for channel_id in channel_ids: channel_id = int(channel_id) first_pos.append( min( p[0] for f in self._segments[seg_index]["streams"][stream_id][channel_id]["positions"].values() for p in f ) ) # now we need to get all file data block indexes for the signal and # timestamp we want file_chunks = defaultdict(list) for i, channel_id in enumerate(channel_ids): channel_id = int(channel_id) effective_start = i_start + first_pos[i] effective_stop = i_stop + first_pos[i] for filename, positions in self._segments[seg_index]["streams"][stream_id][channel_id]["positions"].items(): file_chunks[filename].extend( [(i, *p) for p in positions if p[0] + p[2] > effective_start and p[0] < effective_stop] ) # we almost surely loaded more than asked (because the blocks are not # contiguous) so we need to know where to cut the results slices_channels = [] for channel_index, channel_id in enumerate(channel_ids): channel_id = int(channel_id) min_pos = ( min(p[0] for f in file_chunks.values() for i, *p in f if i == channel_index) - first_pos[channel_index] ) max_pos = ( max(p[0] + p[2] for f in file_chunks.values() for i, *p in f if i == channel_index) - first_pos[channel_index] ) slices_channels.append((min_pos, max_pos)) min_size = min(s[0] for s in slices_channels) max_size = max(s[1] for s in slices_channels) sigs = np.ndarray((max_size - min_size, len(channel_ids)), dtype=np.short) for filename in file_chunks: # we sort by chunk position in the file because we want to optimize # IO access and possibly read in sequential access. This is mainly # true for hard drives but shouldn't hurt flash memory file_chunks[filename].sort(key=lambda x: x[2]) for filename in file_chunks: for channel_index, chunk_index, file_position, chunk_size in file_chunks[filename]: sig_offset = chunk_index - first_pos[channel_index] - min_size sigs[sig_offset : sig_offset + chunk_size, channel_index] = np.frombuffer( self._opened_files[filename]["mmap"], dtype=np.short, count=chunk_size, offset=file_position, ) return sigs[i_start - min_size : i_stop - min_size, :] def _spike_count(self, block_index, seg_index, spike_channel_index): spike_id = int(self.header["spike_channels"]["id"][spike_channel_index]) nb_spikes = sum(len(f) for f in self._segments[seg_index]["spikes"][spike_id]["positions"].values()) return nb_spikes def _get_spike_timestamps(self, block_index, seg_index, spike_channel_index, t_start, t_stop): if self._spike_count(block_index, seg_index, spike_channel_index): spike_id = int(self.header["spike_channels"]["id"][spike_channel_index]) spikes = self._segments[seg_index]["spikes"][spike_id] if t_start is None: t_start = self._segment_t_start(block_index, seg_index) if t_stop is None: t_stop = self._segment_t_stop(block_index, seg_index) effective_start = t_start * spikes["sample_rate"] effective_stop = t_stop * spikes["sample_rate"] timestamps = np.array( [p[0] for f in spikes["positions"].values() for p in f if effective_start <= p[0] <= effective_stop] ) else: timestamps = np.array([], dtype=np.uint32) return timestamps def _rescale_spike_timestamp(self, spike_timestamps, dtype): # let's hope every spike channels have the same sampling rate sample_rate = int(self.header["spike_channels"]["wf_sampling_rate"][0]) spike_timestamps = spike_timestamps.astype(dtype) / sample_rate return spike_timestamps def _get_spike_raw_waveforms(self, block_index, seg_index, spike_channel_index, t_start, t_stop): spike_id = int(self.header["spike_channels"]["id"][spike_channel_index]) # nb_spikes = self._spike_count(block_index, seg_index, spike_channel_index) nb_spikes = self._get_spike_timestamps(block_index, seg_index, spike_channel_index, t_start, t_stop).size spikes = self._segments[seg_index]["spikes"][spike_id] spike_length = {p[2] for f in spikes["positions"].values() for p in f} if len(spike_length) != 1: raise ValueError(f"The len of `spike_length` must be 1 not {len(spike_length)}") spike_length = spike_length.pop() waveforms = np.ndarray((nb_spikes, spike_length), dtype=np.short) if t_start is None: t_start = self._segment_t_start(block_index, seg_index) if t_stop is None: t_stop = self._segment_t_stop(block_index, seg_index) effective_start = t_start * spikes["sample_rate"] effective_stop = t_stop * spikes["sample_rate"] i = 0 for filename in spikes["positions"]: for timestamp, file_position, length in spikes["positions"][filename]: if effective_start <= timestamp <= effective_stop: waveforms[i, :length] = np.frombuffer( self._opened_files[filename]["mmap"], dtype=np.short, count=length, offset=file_position, ) i += 1 waveforms.shape = nb_spikes, 1, spike_length return waveforms def _event_count(self, block_index, seg_index, event_channel_index): event_id = int(self.header["event_channels"]["id"][event_channel_index]) try: nb_events = len(self._segments[seg_index]["events"][event_id]["samples"]) except KeyError: # No event in this segment nb_events = 0 return nb_events def _get_event_timestamps(self, block_index, seg_index, event_channel_index, t_start, t_stop): if self._event_count(block_index, seg_index, event_channel_index): event_id = int(self.header["event_channels"]["id"][event_channel_index]) event = self._segments[seg_index]["events"][event_id] timestamps = np.array([s[0] for s in event["samples"]], dtype=np.uint32) if t_start is None: t_start = self._segment_t_start(block_index, seg_index) if t_stop is None: t_stop = self._segment_t_stop(block_index, seg_index) effective_start = t_start * event["sample_rate"] effective_stop = t_stop * event["sample_rate"] mask = (effective_start <= timestamps) & (timestamps <= effective_stop) timestamps = timestamps[mask] labels = np.array([s[1] for s in event["samples"]], dtype="U") labels = labels[mask] else: timestamps = np.array([], dtype=np.uint32) labels = np.array([], dtype="U") return timestamps, None, labels def _rescale_event_timestamp(self, event_timestamps, dtype, event_channel_index): event_id = int(self.header["event_channels"]["id"][event_channel_index]) for segment in self._segments: if event_id in segment["events"]: event = segment["events"][event_id] break event_times = event_timestamps.astype(dtype) / event["sample_rate"] return event_times def _rescale_epoch_duration(self, raw_duration, dtype, event_channel_index): pass def decode_string(encoded_string): """According to AlphaOmega engineers, all strings are NULL terminated and ASCII encoded""" return encoded_string[: encoded_string.find(b"\x00")].decode("ascii") def get_name(f, name_length): """Helper function to read a string from opened binary file""" return decode_string(struct.unpack(f"<{name_length}s", f.read(name_length))[0]) HeaderType = struct.Struct(" 100) - alignment byte: ignore - reserved (long): not used """ Type2DataBlock = struct.Struct(">> import logging >>> r = AxographRawIO(filename) >>> r.logger.setLevel(logging.DEBUG) >>> r.parse_header() Background and Terminology -------------------------- Acquisition modes: AxoGraph can operate in two main data acquisition modes: - Episodic "protocol-driven" acquisition mode, in which the program records from specified signal channels for a fixed duration each time a trigger is detected. Each trigger-activated recording is called an "episode". From files acquired in this mode, AxographRawIO creates multiple Neo Segments, one for each episode, unless force_single_segment=True. - Continuous "chart recorder" acquisition mode, in which it creates a continuous recording that can be paused and continued by the user whenever they like. From files acquired in this mode, AxographRawIO creates a single Neo Segment. "Episode": analogous to a Neo Segment See descriptions of acquisition modes above and of groups below. "Column": analogous to a Quantity array A column is a 1-dimensional array of data, stored in any one of a number of data types (e.g., scaled ints or floats). In the oldest version of the AxoGraph file format, even time was stored as a 1-dimensional array. In newer versions, time is stored as a special type of "column" that is really just a starting time and a sampling period. Column data appears in series in the file, i.e., all of the first column's data appears before the second column's. As an aside, because of this design choice AxoGraph cannot write data to disk as it is collected but must store it all in memory until data acquisition ends. This also affected how file slicing was implemented for this RawIO: Instead of using a single memmap to address into a 2-dimensional block of data, AxographRawIO constructs multiple 1-dimensional memmaps, one for each column, each with its own offset. Each column's data array is preceded by a header containing the column title, which normally contains the units (e.g., "Current (nA)"). Data recorded in episodic acquisition mode will contain a repeating sequence of column names, where each repetition corresponds to an episode (e.g., "Time", "Column A", "Column B", "Column A", "Column B", etc.). AxoGraph offers a spreadsheet view for viewing all column data. "Trace": analogous to a single-channel Neo AnalogSignal A trace is a 2-dimensional series. Raw data is not stored in the part of the file concerned with traces. Instead, in the header for each trace are indexes pointing to two data columns, defined earlier in the file, corresponding to the trace's x and y data. These indexes can be changed in AxoGraph under the "Assign X and Y Columns" tool, though doing so may violate assumptions made by AxographRawIO. For time series data collected under the usual data acquisition modes that has not been modified after collection by the user, the x-index always points to the time column; one trace exists for each non-time column, with the y-index pointing to that column. Traces are analogous to AnalogSignals in Neo. However, for simplicity of implementation, AxographRawIO does not actually check the pairing of columns in the trace headers. Instead it assumes the default pairing described above when it creates signal channels while scanning through columns. Older versions of the AxoGraph file format lack trace headers entirely, so this is the most general solution. Trace headers contain additional information about the series, such as plot style, which is parsed by AxographRawIO and made available in self.info['trace_header_info_list'] but is otherwise unused. "Group": analogous to a Neo ChannelIndex for matching channels across Segments A group is a collection of one or more traces. Like traces, raw data is not stored in the part of the file concerned with groups. Instead, each trace header contains an index pointing to the group it is assigned to. Group assignment of traces can be changed in AxoGraph under the "Group Traces" tool, or by using the "Merge Traces" or "Separate Traces" commands, though doing so may violate assumptions made by AxographRawIO. Files created in episodic acquisition mode contain multiple traces per group, one for each episode. In that mode, a group corresponds to a signal channel and is analogous to a ChannelIndex in Neo; the traces within the group represent the time series recorded for that channel across episodes and are analogous to AnalogSignals from multiple Segments in Neo. In contrast, files created in continuous acquisition mode contain one trace per group, each corresponding to a signal channel. In that mode, groups and traces are basically conceptually synonymous, though the former can still be thought of as analogous to ChannelIndexes in Neo for a single-Segment. Group headers are only consulted by AxographRawIO to determine if is safe to interpret a file as episodic and therefore translatable to multiple Segments in Neo. Certain criteria have to be met, such as all groups containing equal numbers of traces and each group having homogeneous signal parameters. If trace grouping was modified by the user after data acquisition, this may result in the file being interpreted as non-episodic. Older versions of the AxoGraph file format lack group headers entirely, so these files are never deemed safe to interpret as episodic, even if the column names follow a repeating sequence as described above. "Tag" / "Event marker": analogous to a Neo Event In continuous acquisition mode, the user can press a hot key to tag a moment in time with a short label. Additionally, if the user stops or restarts data acquisition in this mode, a tag is created automatically with the label "Stop" or "Start", respectively. These are displayed by AxoGraph as event markers. AxographRawIO will organize all event markers into a single Neo Event channel with the name "AxoGraph Tags". In episodic acquisition mode, the tag hot key behaves differently. The current episode number is recorded in a user-editable notes section of the file, made available by AxographRawIO in self.info['notes']. Because these do not correspond to moments in time, they are not processed into Neo Events. "Interval bar": analogous to a Neo Epoch After data acquisition, the user can annotate an AxoGraph file with horizontal, labeled bars called interval bars that span a specified period of time. These are not episode specific. AxographRawIO will organize all interval bars into a single Neo Epoch channel with the name "AxoGraph Intervals". """ from .baserawio import ( BaseRawIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) import os from datetime import datetime from io import open, BufferedReader from struct import unpack, calcsize import numpy as np class AxographRawIO(BaseRawIO): """ RawIO class for reading AxoGraph files (.axgd, .axgx) Parameters ---------- filename: str File name of the AxoGraph file to read. force_single_segment: bool, default: False Episodic files are normally read as multi-Segment Neo objects. This parameter can force AxographRawIO to put all signals into a single Segment. Examples -------- >>> import neo >>> reader = neo.rawio.AxographRawIO(filename=filename) >>> reader.parse_header() >>> print(reader) >>> # get signals >>> raw_chunk = reader.get_analogsignal_chunk(block_index=0, ... seg_index=0, ... i_start=0, ... i_stop=1024, ... channel_names=channel_names) >>> float_chunk = r.rescale_signal_raw_to_float(raw_chunk, ... dtype='float64', ... channel_names=channel_names) >>> print(float_chunk) >>> # get event markers >>> ev_raw_times, _, ev_labels = reader.get_event_timestamps(event_channel_index=0) >>> ev_times = reader.rescale_event_timestamp(ev_raw_times, dtype='float64') >>> print([ev for ev in zip(ev_times, ev_labels)]) >>> # get interval bars >>> ep_raw_times, ep_raw_durations, ep_labels = reader.get_event_timestamps(event_channel_index=1) >>> ep_times = reader.rescale_event_timestamp(ep_raw_times, dtype='float64') >>> ep_durations = reader.rescale_epoch_duration(ep_raw_durations, dtype='float64') >>> print([ep for ep in zip(ep_times, ep_durations, ep_labels)]) >>> # get notes >>> print(reader.info['notes']) >>> # get other miscellaneous info >>> print(reader.info) """ name = "AxographRawIO" description = "This IO reads .axgd/.axgx files created with AxoGraph" extensions = ["axgd", "axgx", ""] rawmode = "one-file" def __init__(self, filename, force_single_segment=False): BaseRawIO.__init__(self) self.filename = filename self.force_single_segment = force_single_segment def _parse_header(self): self.header = {} self._scan_axograph_file() if not self.force_single_segment and self._safe_to_treat_as_episodic(): self.logger.debug("Will treat as episodic") self._convert_to_multi_segment() else: self.logger.debug("Will not treat as episodic") self.logger.debug("") self._generate_minimal_annotations() blk_annotations = self.raw_annotations["blocks"][0] blk_annotations["format_ver"] = self.info["format_ver"] blk_annotations["comment"] = self.info["comment"] if "comment" in self.info else None blk_annotations["notes"] = self.info["notes"] if "notes" in self.info else None blk_annotations["rec_datetime"] = self._get_rec_datetime() # modified time is not ideal but less prone to # cross-platform issues than created time (ctime) blk_annotations["file_datetime"] = datetime.fromtimestamp(os.path.getmtime(self.filename)) def _source_name(self): return self.filename def _segment_t_start(self, block_index, seg_index): # same for all segments return self._t_start def _segment_t_stop(self, block_index, seg_index): # same for all signals in all segments t_stop = self._t_start + len(self._raw_signals[seg_index][0]) * self._sampling_period return t_stop ### # signal and channel zone def _get_signal_size(self, block_index, seg_index, stream_index): # same for all signals in all segments return len(self._raw_signals[seg_index][0]) def _get_signal_t_start(self, block_index, seg_index, stream_index): # same for all signals in all segments return self._t_start def _get_analogsignal_chunk(self, block_index, seg_index, i_start, i_stop, stream_index, channel_indexes): if channel_indexes is None or np.all(channel_indexes == slice(None, None, None)): channel_indexes = range(self.signal_channels_count(stream_index)) raw_signals = [ self._raw_signals[seg_index][channel_index][slice(i_start, i_stop)] for channel_index in channel_indexes ] raw_signals = np.array(raw_signals).T # loads data into memory return raw_signals ### # spiketrain and unit zone def _spike_count(self, block_index, seg_index, unit_index): # not supported return None def _get_spike_timestamps(self, block_index, seg_index, unit_index, t_start, t_stop): # not supported return None def _rescale_spike_timestamp(self, spike_timestamps, dtype): # not supported return None ### # spike waveforms zone def _get_spike_raw_waveforms(self, block_index, seg_index, unit_index, t_start, t_stop): # not supported return None ### # event and epoch zone def _event_count(self, block_index, seg_index, event_channel_index): # Retrieve size of either event or epoch channel: # event_channel_index: 0 AxoGraph Tags, 1 AxoGraph Intervals # AxoGraph tags can only be inserted in continuous data acquisition # mode. When the tag hot key is pressed in episodic acquisition mode, # the notes are updated with the current episode number instead of an # instantaneous event marker being created. This means that Neo-like # Events cannot be generated by AxoGraph for multi-Segment (episodic) # files. Furthermore, Neo-like Epochs (interval markers) are not # episode specific. For these reasons, this function ignores seg_index. return self._raw_event_epoch_timestamps[event_channel_index].size def _get_event_timestamps(self, block_index, seg_index, event_channel_index, t_start, t_stop): # Retrieve either event or epoch data, unscaled: # event_channel_index: 0 AxoGraph Tags, 1 AxoGraph Intervals # AxoGraph tags can only be inserted in continuous data acquisition # mode. When the tag hot key is pressed in episodic acquisition mode, # the notes are updated with the current episode number instead of an # instantaneous event marker being created. This means that Neo-like # Events cannot be generated by AxoGraph for multi-Segment (episodic) # files. Furthermore, Neo-like Epochs (interval markers) are not # episode specific. For these reasons, this function ignores seg_index. timestamps = self._raw_event_epoch_timestamps[event_channel_index] durations = self._raw_event_epoch_durations[event_channel_index] labels = self._event_epoch_labels[event_channel_index] if durations is None: # events if t_start is not None: # keep if event occurs after t_start ... keep = timestamps >= int(t_start / self._sampling_period) timestamps = timestamps[keep] labels = labels[keep] if t_stop is not None: # ... and before t_stop keep = timestamps <= int(t_stop / self._sampling_period) timestamps = timestamps[keep] labels = labels[keep] else: # epochs if t_start is not None: # keep if epoch ends after t_start ... keep = timestamps + durations >= int(t_start / self._sampling_period) timestamps = timestamps[keep] durations = durations[keep] labels = labels[keep] if t_stop is not None: # ... and starts before t_stop keep = timestamps <= int(t_stop / self._sampling_period) timestamps = timestamps[keep] durations = durations[keep] labels = labels[keep] return timestamps, durations, labels def _rescale_event_timestamp(self, event_timestamps, dtype, event_channel_index): # Scale either event or epoch start times from sample index to seconds # (t_start shouldn't be added) event_times = event_timestamps.astype(dtype) * self._sampling_period return event_times def _rescale_epoch_duration(self, raw_duration, dtype, event_channel_index): # Scale epoch durations from samples to seconds epoch_durations = raw_duration.astype(dtype) * self._sampling_period return epoch_durations ### # multi-segment zone def _safe_to_treat_as_episodic(self): """ The purpose of this function is to determine if the file contains any irregularities in its grouping of traces such that it cannot be treated as episodic. Even "continuous" recordings can be treated as single-episode recordings and could be identified as safe by this function. Recordings in which the user has changed groupings to create irregularities should be caught by this function. """ # First check: Old AxoGraph file formats do not contain enough metadata # to know for certain that the file is episodic. if self.info["format_ver"] < 3: self.logger.debug("Cannot treat as episodic because old format " "contains insufficient metadata") return False # Second check: If the file is episodic, it should report that it # contains more than 1 episode. if "n_episodes" not in self.info: self.logger.debug("Cannot treat as episodic because episode " "metadata is missing or could not be parsed") return False if self.info["n_episodes"] == 1: self.logger.debug("Cannot treat as episodic because file reports " "one episode") return False # Third check: If the file is episodic, groups of traces should all # contain the same number of traces, one for each episode. This is # generally true of "continuous" (single-episode) recordings as well, # which normally have 1 trace per group. if "group_header_info_list" not in self.info: self.logger.debug("Cannot treat as episodic because group " "metadata is missing or could not be parsed") return False if "trace_header_info_list" not in self.info: self.logger.debug("Cannot treat as episodic because trace " "metadata is missing or could not be parsed") return False group_id_to_col_indexes = {} for group_id in self.info["group_header_info_list"]: col_indexes = [] for trace_header in self.info["trace_header_info_list"].values(): if trace_header["group_id_for_this_trace"] == group_id: col_indexes.append(trace_header["y_index"]) group_id_to_col_indexes[group_id] = col_indexes n_traces_by_group = {k: len(v) for k, v in group_id_to_col_indexes.items()} all_groups_have_same_number_of_traces = len(np.unique(list(n_traces_by_group.values()))) == 1 if not all_groups_have_same_number_of_traces: self.logger.debug("Cannot treat as episodic because groups differ " "in number of traces") return False # Fourth check: The number of traces in each group should equal # n_episodes. n_traces_per_group = np.unique(list(n_traces_by_group.values())) if n_traces_per_group != self.info["n_episodes"]: self.logger.debug( "Cannot treat as episodic because n_episodes " "does not match number of traces per group" ) return False # Fifth check: If the file is episodic, all traces within a group # should have identical signal channel parameters (e.g., name, units) # except for their unique ids. This too is generally true of # "continuous" (single-episode) files, which normally have 1 trace per # group. signal_channels_with_ids_dropped = self.header["signal_channels"][ [n for n in self.header["signal_channels"].dtype.names if n != "id"] ] group_has_uniform_signal_parameters = {} for group_id, col_indexes in group_id_to_col_indexes.items(): # subtract 1 from indexes in next statement because time is not # included in signal_channels signal_params_for_group = np.array(signal_channels_with_ids_dropped[np.array(col_indexes) - 1]) group_has_uniform_signal_parameters[group_id] = len(np.unique(signal_params_for_group)) == 1 all_groups_have_uniform_signal_parameters = np.all(list(group_has_uniform_signal_parameters.values())) if not all_groups_have_uniform_signal_parameters: self.logger.debug("Cannot treat as episodic because some groups " "have heterogeneous signal parameters") return False # all checks passed self.logger.debug("Can treat as episodic") return True def _convert_to_multi_segment(self): """ Reshape signal headers and signal data for an episodic file """ self.header["nb_segment"] = [self.info["n_episodes"]] # drop repeated signal headers self.header["signal_channels"] = self.header["signal_channels"].reshape(self.info["n_episodes"], -1)[0] # reshape signal memmap list new_sig_memmaps = [] n_channels = len(self.header["signal_channels"]) sig_memmaps = self._raw_signals[0] for first_index in np.arange(0, len(sig_memmaps), n_channels): new_sig_memmaps.append(sig_memmaps[first_index : first_index + n_channels]) self._raw_signals = new_sig_memmaps self.logger.debug(f"New number of segments: {self.info['n_episodes']}") return def _get_rec_datetime(self): """ Determine the date and time at which the recording was started from automatically generated notes. How these notes should be parsed differs depending on whether the recording was obtained in episodic or continuous acquisition mode. """ rec_datetime = None date_string = "" time_string = "" datetime_string = "" if "notes" not in self.info: return None for note_line in self.info["notes"].split("\n"): # episodic acquisition mode if note_line.startswith("Created on "): date_string = note_line.strip("Created on ") if note_line.startswith("Start data acquisition at "): time_string = note_line.strip("Start data acquisition at ") # continuous acquisition mode if note_line.startswith("Created : "): datetime_string = note_line.strip("Created : ") if date_string and time_string: datetime_string = " ".join([date_string, time_string]) if datetime_string: try: rec_datetime = datetime.strptime(datetime_string, "%a %b %d %Y %H:%M:%S") except ValueError: pass return rec_datetime def _scan_axograph_file(self): """ This function traverses the entire AxoGraph file, constructing memmaps for signals and collecting channel information and other metadata """ self.info = {} with open(self.filename, "rb") as fid: f = StructFile(fid) self.logger.debug(f"filename: {self.filename}") self.logger.debug("") # the first 4 bytes are always a 4-character file type identifier # - for early versions of AxoGraph, this identifier was 'AxGr' # - starting with AxoGraph X, the identifier is 'axgx' header_id = f.read(4).decode("utf-8") self.info["header_id"] = header_id if header_id not in ["AxGr", "axgx"]: raise NeoReadWriteError(f'File "{self.filename}" is not an AxoGraph binary file! Use other neo reader') self.logger.debug(f"{header_id=}") # the next two numbers store the format version number and the # number of data columns to follow # - for 'AxGr' files, these numbers are 2-byte unsigned short ints # - for 'axgx' files, these numbers are 4-byte long ints # - the 4-character identifier changed from 'AxGr' to 'axgx' with # format version 3 if header_id == "AxGr": format_ver, n_cols = f.read_f("HH") if format_ver != 1 and format_ver != 2: raise ValueError( f'Mismatch between header identifier "{header_id}" and format ' f'version "{format_ver}"!' ) elif header_id == "axgx": format_ver, n_cols = f.read_f("ll") if format_ver < 3: raise ValueError( f'Mismatch between header identifier "{header_id}" and format ' f'version "{format_ver}"!' ) else: raise NotImplementedError(f'unimplemented file header identifier "{header_id}"!') self.info["format_ver"] = format_ver self.info["n_cols"] = n_cols self.logger.debug(f"format_ver: {format_ver}") self.logger.debug(f"n_cols: {n_cols}") self.logger.debug("") ############################################## # BEGIN COLUMNS sig_memmaps = [] sig_channels = [] for i in range(n_cols): self.logger.debug(f"== COLUMN INDEX {i} ==") ############################################## # NUMBER OF DATA POINTS IN COLUMN n_points = f.read_f("l") self.logger.debug(f"n_points: {n_points}") ############################################## # COLUMN TYPE # depending on the format version, data columns may have a type # - prior to version 3, column types did not exist and data was # stored in a fixed pattern # - beginning with version 3, several data types are available # as documented in AxoGraph_ReadWrite.h if format_ver == 1 or format_ver == 2: col_type = None elif format_ver >= 3: col_type = f.read_f("l") else: raise NotImplementedError(f'unimplemented file format version "{format_ver}"!') self.logger.debug(f"col_type: {col_type}") ############################################## # COLUMN NAME AND UNITS # depending on the format version, column titles are stored # differently # - prior to version 3, column titles were stored as # fixed-length 80-byte Pascal strings # - beginning with version 3, column titles are stored as # variable-length strings (see StructFile.read_string for # details) if format_ver == 1 or format_ver == 2: title = f.read_f("80p").decode("utf-8") elif format_ver >= 3: title = f.read_f("S") else: raise NotImplementedError(f'unimplemented file format version "{format_ver}"!') self.logger.debug(f"title: {title}") # units are given in parentheses at the end of a column title, # unless units are absent if len(title.split()) > 0 and title.split()[-1][0] == "(" and title.split()[-1][-1] == ")": name = " ".join(title.split()[:-1]) units = title.split()[-1].strip("()") else: name = title units = "" self.logger.debug(f"name: {name}") self.logger.debug(f"units: {units}") ############################################## # COLUMN DTYPE, SCALE, OFFSET if format_ver == 1: # for format version 1, all columns are arrays of floats dtype = "f" gain, offset = 1, 0 # data is neither scaled nor off-set elif format_ver == 2: # for format version 2, the first column is a "series" of # regularly spaced values specified merely by a first value # and an increment, and all subsequent columns are arrays # of shorts with a scaling factor if i == 0: # series first_value, increment = f.read_f("ff") self.logger.debug(f"interval: {increment}, freq: {1 / increment}") self.logger.debug(f"start: {first_value}, end: {first_value + increment * (n_points - 1)}") # assume this is the time column t_start, sampling_period = first_value, increment self.info["t_start"] = t_start self.info["sampling_period"] = sampling_period self.logger.debug("") continue # skip memmap, chan info for time col else: # scaled short dtype = "h" gain, offset = f.read_f("f"), 0 # data is scaled without offset elif format_ver >= 3: # for format versions 3 and later, the column type # determines how the data should be read # - column types 1, 2, 3, and 8 are not defined in # AxoGraph_ReadWrite.h # - column type 9 is different from the others in that it # represents regularly spaced values # (such as times at a fixed frequency) specified by a # first value and an increment, without storing a large # data array if col_type == 9: # series first_value, increment = f.read_f("dd") self.logger.debug(f"interval: {increment}, freq: {1 / increment}") self.logger.debug("start: {first_value}, end: {first_value + increment * (n_points - 1)}") if i == 0: # assume this is the time column t_start, sampling_period = first_value, increment self.info["t_start"] = t_start self.info["sampling_period"] = sampling_period self.logger.debug("") continue # skip memmap, chan info for time col else: raise NotImplementedError( "series data are supported only for the first " "data column (time)!" ) elif col_type == 4: # short dtype = "h" gain, offset = 1, 0 # data neither scaled nor off-set elif col_type == 5: # long dtype = "l" gain, offset = 1, 0 # data neither scaled nor off-set elif col_type == 6: # float dtype = "f" gain, offset = 1, 0 # data neither scaled nor off-set elif col_type == 7: # double dtype = "d" gain, offset = 1, 0 # data neither scaled nor off-set elif col_type == 10: # scaled short dtype = "h" gain, offset = f.read_f("dd") # data scaled w/ offset else: raise NotImplementedError(f'unimplemented column type "{col_type}"!') else: raise NotImplementedError(f'unimplemented file format version "{format_ver}"!') ############################################## # COLUMN MEMMAP AND CHANNEL INFO # create a memory map that allows accessing parts of the file # without loading it all into memory array = np.memmap(self.filename, mode="r", dtype=f.byte_order + dtype, offset=f.tell(), shape=n_points) # advance the file position to after the data array f.seek(array.nbytes, 1) if i == 0: # assume this is the time column containing n_points values # verify times are spaced regularly diffs = np.diff(array) increment = np.median(diffs) max_frac_step_deviation = np.max(np.abs(diffs / increment - 1)) tolerance = 1e-3 if max_frac_step_deviation > tolerance: self.logger.debug( "largest proportional deviation " "from median step size in the first " "column exceeds the tolerance " "of " + str(tolerance) + ":" " " + str(max_frac_step_deviation) ) raise ValueError("first data column (assumed to be " "time) is not regularly spaced") first_value = array[0] self.logger.debug(f"interval: {increment}, freq: {1 / increment}") self.logger.debug(f"start: {first_value}, end: {first_value + increment * (n_points - 1)}") t_start, sampling_period = first_value, increment self.info["t_start"] = t_start self.info["sampling_period"] = sampling_period self.logger.debug("") continue # skip saving memmap, chan info for time col else: # not a time column self.logger.debug(f"gain: {gain}, offset: {offset}") self.logger.debug("initial data: {array[:5] * gain + offset}") # channel_info will be cast to _signal_channel_dtype buffer_id = "" stream_id = "0" channel_info = ( name, str(i), 1 / sampling_period, f.byte_order + dtype, units, gain, offset, stream_id, buffer_id, ) self.logger.debug("channel_info: {channel_info}") self.logger.debug("") sig_memmaps.append(array) sig_channels.append(channel_info) # END COLUMNS ############################################## # initialize lists for events and epochs raw_event_timestamps = [] raw_epoch_timestamps = [] raw_epoch_durations = [] event_labels = [] epoch_labels = [] # the remainder of the file may contain metadata, events and epochs try: ############################################## # COMMENT self.logger.debug("== COMMENT ==") comment = f.read_f("S") self.info["comment"] = comment self.logger.debug(comment if comment else "no comment!") self.logger.debug("") ############################################## # NOTES self.logger.debug("== NOTES ==") notes = f.read_f("S") self.info["notes"] = notes self.logger.debug(notes if notes else "no notes!") self.logger.debug("") ############################################## # TRACES self.logger.debug("== TRACES ==") n_traces = f.read_f("l") self.info["n_traces"] = n_traces self.logger.debug(f"n_traces: {n_traces}") self.logger.debug("") trace_header_info_list = {} group_ids = [] for i in range(n_traces): # AxoGraph traces are 1-indexed in GUI, so use i+1 below self.logger.debug(f"== TRACE #{i+1} ==") trace_header_info = {} if format_ver < 6: # before format version 6, there was only one version # of the header, and version numbers were not provided trace_header_info["trace_header_version"] = 1 else: # for format versions 6 and later, the header version # must be read trace_header_info["trace_header_version"] = f.read_f("l") if trace_header_info["trace_header_version"] == 1: TraceHeaderDescription = TraceHeaderDescriptionV1 elif trace_header_info["trace_header_version"] == 2: TraceHeaderDescription = TraceHeaderDescriptionV2 else: raise NotImplementedError( f'unimplemented trace header version `{trace_header_info["trace_header_version"]}`!' ) for key, fmt in TraceHeaderDescription: trace_header_info[key] = f.read_f(fmt) # AxoGraph traces are 1-indexed in GUI, so use i+1 below trace_header_info_list[i + 1] = trace_header_info group_ids.append(trace_header_info["group_id_for_this_trace"]) self.logger.debug(trace_header_info) self.logger.debug("") self.info["trace_header_info_list"] = trace_header_info_list ############################################## # GROUPS self.logger.debug("== GROUPS ==") n_groups = f.read_f("l") self.info["n_groups"] = n_groups group_ids = np.sort(list(set(group_ids))) # remove duplicates and sort if n_groups != len(group_ids): raise ValueError(f"expected group_ids to have length {n_groups}: {group_ids}") self.logger.debug(f"n_groups: {n_groups}") self.logger.debug(f"group_ids: {group_ids}") self.logger.debug("") group_header_info_list = {} for i in group_ids: # AxoGraph groups are 0-indexed in GUI, so use i below self.logger.debug(f"== GROUP #{i} ==") group_header_info = {} if format_ver < 6: # before format version 6, there was only one version # of the header, and version numbers were not provided group_header_info["group_header_version"] = 1 else: # for format versions 6 and later, the header version # must be read group_header_info["group_header_version"] = f.read_f("l") if group_header_info["group_header_version"] == 1: GroupHeaderDescription = GroupHeaderDescriptionV1 else: raise NotImplementedError( f'unimplemented group header version `{group_header_info["group_header_version"]}`!' ) for key, fmt in GroupHeaderDescription: group_header_info[key] = f.read_f(fmt) # AxoGraph groups are 0-indexed in GUI, so use i below group_header_info_list[i] = group_header_info self.logger.debug(group_header_info) self.logger.debug("") self.info["group_header_info_list"] = group_header_info_list ############################################## # UNKNOWN self.logger.debug(">> UNKNOWN 1 <<") # 36 bytes of undeciphered data (types here are guesses) unknowns = f.read_f("9l") self.logger.debug(unknowns) self.logger.debug("") ############################################## # EPISODES self.logger.debug("== EPISODES ==") # a subset of episodes can be selected for "review", or # episodes can be paged through one by one, and the indexes of # those currently in review appear in this list episodes_in_review = [] n_episodes = f.read_f("l") self.info["n_episodes"] = n_episodes for i in range(n_episodes): episode_bool = f.read_f("Z") if episode_bool: episodes_in_review.append(i + 1) self.info["episodes_in_review"] = episodes_in_review self.logger.debug(f"n_episodes: {n_episodes}") self.logger.debug(f"episodes_in_review: {episodes_in_review}") if format_ver == 5: # the test file for version 5 contains this extra list of # episode indexes with unknown purpose old_unknown_episode_list = [] n_episodes2 = f.read_f("l") for i in range(n_episodes2): episode_bool = f.read_f("Z") if episode_bool: old_unknown_episode_list.append(i + 1) self.logger.debug(f"old_unknown_episode_list: {old_unknown_episode_list}") if n_episodes2 != n_episodes: self.logger.debug(f"n_episodes2 ({n_episodes2}) and n_episodes ({n_episodes}) " "differ!") # another list of episode indexes with unknown purpose unknown_episode_list = [] n_episodes3 = f.read_f("l") for i in range(n_episodes3): episode_bool = f.read_f("Z") if episode_bool: unknown_episode_list.append(i + 1) self.logger.debug(f"unknown_episode_list: {unknown_episode_list}") if n_episodes3 != n_episodes: self.logger.debug(f"n_episodes3 ({n_episodes3,}) and n_episodes ({n_episodes}) " "differ!") # episodes can be masked to be removed from the pool of # reviewable episodes completely until unmasked, and the # indexes of those currently masked appear in this list masked_episodes = [] n_episodes4 = f.read_f("l") for i in range(n_episodes4): episode_bool = f.read_f("Z") if episode_bool: masked_episodes.append(i + 1) self.info["masked_episodes"] = masked_episodes self.logger.debug(f"masked_episodes: {masked_episodes}") if n_episodes4 != n_episodes: self.logger.debug(f"n_episodes4 ({n_episodes4}) and n_episodes ({n_episodes}) " "differ!") self.logger.debug("") ############################################## # UNKNOWN self.logger.debug(">> UNKNOWN 2 <<") # 68 bytes of undeciphered data (types here are guesses) unknowns = f.read_f("d 9l d 4l") self.logger.debug(unknowns) self.logger.debug("") ############################################## # FONTS if format_ver >= 6: font_categories = ["axis titles", "axis labels (ticks)", "notes", "graph title"] else: # would need an old version of AxoGraph to determine how it # used these settings font_categories = ["everything (?)"] font_settings_info_list = {} for i in font_categories: self.logger.debug(f"== FONT SETTINGS FOR {i} ==") font_settings_info = {} for key, fmt in FontSettingsDescription: font_settings_info[key] = f.read_f(fmt) # I don't know why two arbitrary values were selected to # represent this switch, but it seems they were # - setting1 could contain other undeciphered data as a # bitmask, like setting2 if font_settings_info["setting1"] not in [ FONT_BOLD, FONT_NOT_BOLD, ]: raise ValueError( f"expected setting1 ({ font_settings_info['setting1']}) to have value FONT_BOLD " f"({FONT_BOLD}) or FONT_NOT_BOLD ({FONT_NOT_BOLD})" ) # size is stored 10 times bigger than real value font_settings_info["size"] = font_settings_info["size"] / 10.0 font_settings_info["bold"] = bool(font_settings_info["setting1"] == FONT_BOLD) font_settings_info["italics"] = bool(font_settings_info["setting2"] & FONT_ITALICS) font_settings_info["underline"] = bool(font_settings_info["setting2"] & FONT_UNDERLINE) font_settings_info["strikeout"] = bool(font_settings_info["setting2"] & FONT_STRIKEOUT) font_settings_info_list[i] = font_settings_info self.logger.debug(font_settings_info) self.logger.debug("") self.info["font_settings_info_list"] = font_settings_info_list ############################################## # X-AXIS SETTINGS self.logger.debug("== X-AXIS SETTINGS ==") x_axis_settings_info = {} for key, fmt in XAxisSettingsDescription: x_axis_settings_info[key] = f.read_f(fmt) self.info["x_axis_settings_info"] = x_axis_settings_info self.logger.debug(x_axis_settings_info) self.logger.debug("") ############################################## # UNKNOWN self.logger.debug(">> UNKNOWN 3 <<") # 108 bytes of undeciphered data (types here are guesses) unknowns = f.read_f("8l 3d 13l") self.logger.debug(unknowns) self.logger.debug("") ############################################## # EVENTS / TAGS self.logger.debug("=== EVENTS / TAGS ===") n_events, n_events_again = f.read_f("ll") self.info["n_events"] = n_events self.logger.debug(f"n_events: {n_events}") # event / tag timing is stored as an index into time raw_event_timestamps = [] event_labels = [] for i in range(n_events_again): event_index = f.read_f("l") raw_event_timestamps.append(event_index) n_events_yet_again = f.read_f("l") for i in range(n_events_yet_again): title = f.read_f("S") event_labels.append(title) event_list = [] for event_label, event_index in zip(event_labels, raw_event_timestamps): # t_start shouldn't be added here event_time = event_index * sampling_period event_list.append({"title": event_label, "index": event_index, "time": event_time}) self.info["event_list"] = event_list for event in event_list: self.logger.debug(event) self.logger.debug("") ############################################## # UNKNOWN self.logger.debug(">> UNKNOWN 4 <<") # 28 bytes of undeciphered data (types here are guesses) unknowns = f.read_f("7l") self.logger.debug(unknowns) self.logger.debug("") ############################################## # EPOCHS / INTERVAL BARS self.logger.debug("=== EPOCHS / INTERVAL BARS ===") n_epochs = f.read_f("l") self.info["n_epochs"] = n_epochs self.logger.debug(f"n_epochs: {n_epochs}") epoch_list = [] for i in range(n_epochs): epoch_info = {} for key, fmt in EpochInfoDescription: epoch_info[key] = f.read_f(fmt) epoch_list.append(epoch_info) self.info["epoch_list"] = epoch_list # epoch / interval bar timing and duration are stored in # seconds, so here they are converted to (possibly non-integer) # indexes into time to fit into the procrustean beds of # _rescale_event_timestamp and _rescale_epoch_duration raw_epoch_timestamps = [] raw_epoch_durations = [] epoch_labels = [] for epoch in epoch_list: raw_epoch_timestamps.append(epoch["t_start"] / sampling_period) raw_epoch_durations.append((epoch["t_stop"] - epoch["t_start"]) / sampling_period) epoch_labels.append(epoch["title"]) self.logger.debug(epoch) self.logger.debug("") ############################################## # UNKNOWN self.logger.debug(">> UNKNOWN 5 (includes y-axis plot ranges) <<") # lots of undeciphered data rest_of_the_file = f.read() self.logger.debug(rest_of_the_file) self.logger.debug("") self.logger.debug("End of file reached (expected)") except EOFError as e: if format_ver == 1 or format_ver == 2: # for format versions 1 and 2, metadata like graph display # information was stored separately in the "resource fork" # of the file, so reaching the end of the file before all # metadata is parsed is expected self.logger.debug("End of file reached (expected)") pass else: # for format versions 3 and later, there should be metadata # stored at the end of the file, so warn that something may # have gone wrong, but try to continue anyway self.logger.warning( "End of file reached unexpectedly " "while parsing metadata, will attempt " "to continue" ) self.logger.debug(e, exc_info=True) pass except UnicodeDecodeError as e: # warn that something went wrong with reading a string, but try # to continue anyway self.logger.warning( "Problem decoding text while parsing " "metadata, will ignore any remaining " "metadata and attempt to continue" ) self.logger.debug(e, exc_info=True) pass self.logger.debug("") ############################################## # RAWIO HEADER # event_channels will be cast to _event_channel_dtype event_channels = [] event_channels.append(("AxoGraph Tags", "", "event")) event_channels.append(("AxoGraph Intervals", "", "epoch")) if len(sig_channels) > 0: signal_streams = [("Signals", "0", "")] else: signal_streams = [] signal_buffers = [] # organize header self.header["nb_block"] = 1 self.header["nb_segment"] = [1] self.header["signal_buffers"] = np.array(signal_buffers, dtype=_signal_buffer_dtype) self.header["signal_streams"] = np.array(signal_streams, dtype=_signal_stream_dtype) self.header["signal_channels"] = np.array(sig_channels, dtype=_signal_channel_dtype) self.header["event_channels"] = np.array(event_channels, dtype=_event_channel_dtype) self.header["spike_channels"] = np.array([], dtype=_spike_channel_dtype) ############################################## # DATA OBJECTS # organize data self._sampling_period = sampling_period self._t_start = t_start self._raw_signals = [sig_memmaps] # first index is seg_index self._raw_event_epoch_timestamps = [np.array(raw_event_timestamps), np.array(raw_epoch_timestamps)] self._raw_event_epoch_durations = [None, np.array(raw_epoch_durations)] self._event_epoch_labels = [np.array(event_labels, dtype="U"), np.array(epoch_labels, dtype="U")] class StructFile(BufferedReader): """ A container for the file buffer with some added convenience functions for reading AxoGraph files """ def __init__(self, *args, **kwargs): # As far as I've seen, every AxoGraph file uses big-endian encoding, # regardless of the system architecture on which it was created, but # here I provide means for controlling byte ordering in case a counter # example is found. self.byte_order = kwargs.pop("byte_order", ">") if self.byte_order == ">": # big-endian self.utf_16_decoder = "utf-16-be" elif self.byte_order == "<": # little-endian self.utf_16_decoder = "utf-16-le" else: # unspecified self.utf_16_decoder = "utf-16" super().__init__(*args, **kwargs) def read_and_unpack(self, fmt): """ Calculate the number of bytes corresponding to the format string, read in that number of bytes, and unpack them according to the format string """ try: return unpack(self.byte_order + fmt, self.read(calcsize(self.byte_order + fmt))) except Exception as e: if e.args[0].startswith("unpack requires a buffer of"): raise EOFError(e) else: raise def read_string(self): """ The most common string format in AxoGraph files is a variable length string with UTF-16 encoding, preceded by a 4-byte integer (long) specifying the length of the string in bytes. Unlike a Pascal string ('p' format), these strings are not stored in a fixed number of bytes with padding at the end. This function reads in one of these variable length strings """ # length may be -1, 0, or a positive integer length = self.read_and_unpack("l")[0] if length > 0: return self.read(length).decode(self.utf_16_decoder) else: return "" def read_bool(self): """ AxoGraph files encode each boolean as 4-byte integer (long) with value 1 = True, 0 = False. This function reads in one of these booleans. """ return bool(self.read_and_unpack("l")[0]) def read_f(self, fmt, offset=None): """ This function is a wrapper for read_and_unpack that adds compatibility with two new format strings: 'S': a variable length UTF-16 string, readable with read_string 'Z': a boolean encoded as a 4-byte integer, readable with read_bool This method does not implement support for numbers before the new format strings, such as '3Z' to represent 3 bools (use 'ZZZ' instead). """ if offset is not None: self.seek(offset) # place commas before and after each instance of S or Z for special in ["S", "Z"]: fmt = fmt.replace(special, "," + special + ",") # split S and Z into isolated strings fmt = fmt.split(",") # construct a tuple of unpacked data data = () for subfmt in fmt: if subfmt == "S": data += (self.read_string(),) elif subfmt == "Z": data += (self.read_bool(),) else: data += self.read_and_unpack(subfmt) if len(data) == 1: return data[0] else: return data FONT_BOLD = 75 # mysterious arbitrary constant FONT_NOT_BOLD = 50 # mysterious arbitrary constant FONT_ITALICS = 1 FONT_UNDERLINE = 2 FONT_STRIKEOUT = 4 TraceHeaderDescriptionV1 = [ # documented in AxoGraph_ReadWrite.h ("x_index", "l"), ("y_index", "l"), ("err_bar_index", "l"), ("group_id_for_this_trace", "l"), ("hidden", "Z"), # AxoGraph_ReadWrite.h incorrectly states "shown" instead ("min_x", "d"), ("max_x", "d"), ("min_positive_x", "d"), ("x_is_regularly_spaced", "Z"), ("x_increases_monotonically", "Z"), ("x_interval_if_regularly_spaced", "d"), ("min_y", "d"), ("max_y", "d"), ("min_positive_y", "d"), ("trace_color", "xBBB"), ("display_joined_line_plot", "Z"), ("line_thickness", "d"), ("pen_style", "l"), ("display_symbol_plot", "Z"), ("symbol_type", "l"), ("symbol_size", "l"), ("draw_every_data_point", "Z"), ("skip_points_by_distance_instead_of_pixels", "Z"), ("pixels_between_symbols", "l"), ("display_histogram_plot", "Z"), ("histogram_type", "l"), ("histogram_bar_separation", "l"), ("display_error_bars", "Z"), ("display_pos_err_bar", "Z"), ("display_neg_err_bar", "Z"), ("err_bar_width", "l"), ] # documented in AxoGraph_ReadWrite.h # - only one difference exists between versions 1 and 2 TraceHeaderDescriptionV2 = list(TraceHeaderDescriptionV1) # make a copy TraceHeaderDescriptionV2.insert(3, ("neg_err_bar_index", "l")) GroupHeaderDescriptionV1 = [ # undocumented and reverse engineered ("title", "S"), ("unknown1", "h"), # 2 bytes of undeciphered data (types are guesses) ("units", "S"), ("unknown2", "hll"), # 10 bytes of undeciphered data (types are guesses) ] FontSettingsDescription = [ # undocumented and reverse engineered ("font", "S"), ("size", "h"), # divide this 2-byte integer by 10 to get font size ("unknown1", "5b"), # 5 bytes of undeciphered data (types are guesses) ("setting1", "B"), # includes bold setting ("setting2", "B"), # italics, underline, strikeout specified in bitmap ] XAxisSettingsDescription = [ # undocumented and reverse engineered ("unknown1", "3l2d"), # 28 bytes of undeciphered data (types are guesses) ("plotted_x_range", "dd"), ("unknown2", "d"), # 8 bytes of undeciphered data (types are guesses) ("auto_x_ticks", "Z"), ("x_minor_ticks", "d"), ("x_major_ticks", "d"), ("x_axis_title", "S"), ("unknown3", "h"), # 2 bytes of undeciphered data (types are guesses) ("units", "S"), ("unknown4", "h"), # 2 bytes of undeciphered data (types are guesses) ] EpochInfoDescription = [ # undocumented and reverse engineered ("title", "S"), ("t_start", "d"), ("t_stop", "d"), ("y_pos", "d"), ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/axonarawio.py0000644000175100001660000005551614743453644016436 0ustar00runnerdocker""" This class reads .set and .bin file data from the Axona acquisition system. File format overview: http://space-memory-navigation.org/DacqUSBFileFormats.pdf In brief: data.set - setup file containing all hardware setups related to the trial data.bin - raw data file There are many other data formats from Axona, which we do not consider (yet). These are derivative from the raw continuous data (.bin) and could in principle be extracted from it (see file format overview for details). Author: Steffen Buergers, Julia Sprenger """ import datetime import pathlib import re import numpy as np from .baserawio import ( BaseRawIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) class AxonaRawIO(BaseRawIO): """ Class for reading raw, continuous data from the Axona dacqUSB system Parameters ---------- filename: str The name of the *.bin file containing the data Notes ----- http://space-memory-navigation.org/DacqUSBFileFormats.pdf The raw data is saved in .bin binary files with an accompanying .set file about the recording setup (see the above manual for details). Examples -------- >>> import neo.rawio >>> r = neo.rawio.AxonaRawIO(filename=os.path.join(dir_name, base_filename)) >>> r.parse_header() >>> print(r) >>> raw_chunk = r.get_analogsignal_chunk(block_index=0, seg_index=0, i_start=0, i_stop=1024, channel_names=channel_names) >>> float_chunk = reader.rescale_signal_raw_to_float(raw_chunk, dtype='float64', channel_indexes=[0, 3, 6]) """ extensions = ["bin", "set"] + [str(i) for i in range(1, 33)] # Never used? rawmode = "multi-file" # In the .bin file, channels are arranged in a strange order. # This list takes a channel index as input and returns the actual # offset for the channel in the memory map (self._raw_signals). channel_memory_offset = [ 32, 33, 34, 35, 36, 37, 38, 39, 0, 1, 2, 3, 4, 5, 6, 7, 40, 41, 42, 43, 44, 45, 46, 47, 8, 9, 10, 11, 12, 13, 14, 15, 48, 49, 50, 51, 52, 53, 54, 55, 16, 17, 18, 19, 20, 21, 22, 23, 56, 57, 58, 59, 60, 61, 62, 63, 24, 25, 26, 27, 28, 29, 30, 31, ] def __init__(self, filename): BaseRawIO.__init__(self) # Accepting filename with arbitrary suffix as input self.filename = pathlib.Path(filename).with_suffix("") self.set_file = self.filename.with_suffix(".set") self.bin_file = None self.tetrode_files = [] # set file is mandatory for any recording if not self.set_file.exists(): raise ValueError( f'Could not locate ".set" file. ' f'{self.filename.with_suffix(".set")} does not ' f"exist." ) # detecting available files if self.filename.with_suffix(".bin").exists(): self.bin_file = self.filename.with_suffix(".bin") for i in range(1, 33): unit_file = self.filename.with_suffix(f".{i}") if unit_file.exists(): self.tetrode_files.append(unit_file) else: break def _source_name(self): return self.filename def _parse_header(self): """ Read important information from .set header file, create memory map to raw data (.bin file) and prepare header dictionary in neo format. """ unit_dtype = np.dtype([("spiketimes", ">i4"), ("samples", "int8", (50,))]) # Utility collection of file parameters (general info and header data) params = { "bin": { "filename": self.bin_file, "bytes_packet": 432, "bytes_data": 384, "bytes_head": 32, "bytes_tail": 16, "data_type": "int16", "header_size": 0, # bin files don't contain a file header "header_encoding": None, }, "set": {"filename": self.set_file, "header_encoding": "cp1252"}, "unit": {"data_type": unit_dtype, "tetrode_ids": [], "header_encoding": "cp1252"}, } self.file_parameters = params # SCAN SET FILE set_dict = self.get_header_parameters(self.set_file, "set") params["set"]["file_header"] = set_dict params["set"]["sampling_rate"] = int(set_dict["rawRate"]) # SCAN BIN FILE signal_buffers = [] signal_streams = [] signal_channels = [] if self.bin_file: bin_dict = self.file_parameters["bin"] # add derived parameters from bin file bin_dict["num_channels"] = len(self.get_active_tetrode()) * 4 num_tot_packets = int(self.bin_file.stat().st_size / bin_dict["bytes_packet"]) bin_dict["num_total_packets"] = num_tot_packets bin_dict["num_total_samples"] = num_tot_packets * 3 # Create np.memmap to .bin file self._raw_signals = np.memmap( self.bin_file, dtype=self.file_parameters["bin"]["data_type"], mode="r", offset=self.file_parameters["bin"]["header_size"], ) signal_streams = self._get_signal_streams_header() signal_channels = self._get_signal_chan_header() # SCAN TETRODE FILES # In this IO one tetrode corresponds to one unit as spikes are not # sorted yet. self._raw_spikes = [] spike_channels = [] if self.tetrode_files: for i, tetrode_file in enumerate(self.tetrode_files): # collecting tetrode specific parameters and dtype conversions tdict = self.get_header_parameters(tetrode_file, "unit") tdict["filename"] = tetrode_file tdict["num_chans"] = int(tdict["num_chans"]) tdict["num_spikes"] = int(tdict["num_spikes"]) tdict["header_size"] = len(self.get_header_bstring(tetrode_file)) # memory mapping spiking data spikes = np.memmap( tetrode_file, dtype=self.file_parameters["unit"]["data_type"], mode="r", offset=tdict["header_size"], shape=(tdict["num_spikes"], 4), ) self._raw_spikes.append(spikes) unit_name = f"tetrode {i + 1}" unit_id = f"{i + 1}" wf_units = "dimensionless" wf_gain = 1 wf_offset = 0.0 # left sweep information is only stored in set file wf_left_sweep = int(self.file_parameters["set"]["file_header"]["pretrigSamps"]) # Extract waveform sample rate # 1st priority source: Spike2msMode (0 -> 48kHz; 1 -> 24kHz) # 2nd priority source: tetrode sample rate spikemode_to_sr = {0: 48000, 1: 24000} # spikemode->rate in Hz sm = self.file_parameters["set"]["file_header"].get("Spike2msMode", -1) wf_sampling_rate = spikemode_to_sr.get(int(sm), None) if wf_sampling_rate is None: wf_sampling_rate = self._to_hz(tdict["sample_rate"], dtype=float) spike_channels.append( (unit_name, unit_id, wf_units, wf_gain, wf_offset, wf_left_sweep, wf_sampling_rate) ) self.file_parameters["unit"]["tetrode_ids"].append(i + 1) self.file_parameters["unit"][i + 1] = tdict # propagate common tetrode parameters to global unit level units_dict = self.file_parameters["unit"] ids = units_dict["tetrode_ids"] copied_keys = [] if ids: for key, value in units_dict[ids[0]].items(): # copy key-value pair if present across all tetrodes if all([key in units_dict[t] for t in ids]) and all([units_dict[t][key] == value for t in ids]): self.file_parameters["unit"][key] = value copied_keys.append(key) # remove key from individual tetrode parameters for key in copied_keys: for t in ids: self.file_parameters["unit"][t].pop(key) # Create RawIO header dict self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [1] self.header["signal_buffers"] = np.array(signal_buffers, dtype=_signal_buffer_dtype) self.header["signal_streams"] = np.array(signal_streams, dtype=_signal_stream_dtype) self.header["signal_channels"] = np.array(signal_channels, dtype=_signal_channel_dtype) self.header["spike_channels"] = np.array(spike_channels, dtype=_spike_channel_dtype) self.header["event_channels"] = np.array([], dtype=_event_channel_dtype) # Annotations self._generate_minimal_annotations() # Adding custom annotations bl_ann = self.raw_annotations["blocks"][0] seg_ann = bl_ann["segments"][0] seg_ann["rec_datetime"] = self.read_datetime() if len(seg_ann["signals"]): seg_ann["signals"][0]["__array_annotations__"]["tetrode_id"] = [ tetr for tetr in self.get_active_tetrode() for _ in range(4) ] if len(seg_ann["spikes"]): # adding segment annotations seg_keys = ["experimenter", "comments", "sw_version"] for seg_key in seg_keys: if seg_key in self.file_parameters["unit"]: seg_ann[seg_key] = self.file_parameters["unit"][seg_key] def _get_signal_streams_header(self): # create signals stream information (we always expect a single stream) return np.array([("stream 0", "0", "")], dtype=_signal_stream_dtype) def _segment_t_start(self, block_index, seg_index): return 0.0 def _segment_t_stop(self, block_index, seg_index): t_stop = 0.0 if "num_total_packets" in self.file_parameters["bin"]: sr = self.file_parameters["set"]["sampling_rate"] t_stop = self.file_parameters["bin"]["num_total_samples"] / sr if self.file_parameters["unit"]["tetrode_ids"]: # get tetrode recording durations in seconds if "duration" not in self.file_parameters["unit"]: raise ValueError("Can not determine common tetrode recording" "duration.") tetrode_duration = float(self.file_parameters["unit"]["duration"]) t_stop = max(t_stop, tetrode_duration) return t_stop def _get_signal_size(self, block_index, seg_index, channel_indexes=None): if "num_total_packets" in self.file_parameters["bin"]: return self.file_parameters["bin"]["num_total_samples"] else: return 0 def _get_signal_t_start(self, block_index, seg_index, stream_index): return 0.0 def _get_analogsignal_chunk(self, block_index, seg_index, i_start, i_stop, stream_index, channel_indexes): """ Return raw (continuous) signals as 2d numpy array (time x chan). Note that block_index and seg_index are always 1 (regardless of input). Raw data is in a single vector np.memmap with the following structure: Each byte packet (432 bytes) has header (32 bytes), footer (16 bytes) and three samples of 2 bytes each for 64 channels (384 bytes), which are jumbled up in a strange order. Each channel is remapped to a certain position (see get_channel_offset), and a channel's samples are allocated as follows (example for channel 7): sample 1: 32b (head) + 2*38b (remappedID) and 2*38b + 1b (2nd byte) sample 2: 32b (head) + 128 (all chan. 1st entry) + 2*38b and ... sample 3: 32b (head) + 128*2 (all channels 1st and 2nd entry) + ... """ bin_dict = self.file_parameters["bin"] # Set default values if i_start is None: i_start = 0 if i_stop is None: i_stop = bin_dict["num_total_samples"] if channel_indexes is None: channel_indexes = [i for i in range(bin_dict["num_channels"])] elif isinstance(channel_indexes, slice): channel_indexes_all = [i for i in range(bin_dict["num_channels"])] channel_indexes = channel_indexes_all[channel_indexes] num_samples = i_stop - i_start # Create base index vector for _raw_signals for time period of interest num_packets_oi = (num_samples + 2) // 3 offset = i_start // 3 * (bin_dict["bytes_packet"] // 2) rem = i_start % 3 raw_samples = np.arange(num_packets_oi + 1, dtype=np.uint32) sample1 = raw_samples * (bin_dict["bytes_packet"] // 2) + bin_dict["bytes_head"] // 2 + offset sample2 = sample1 + 64 sample3 = sample2 + 64 sig_ids = np.empty((sample1.size + sample2.size + sample3.size,), dtype=sample1.dtype) sig_ids[0::3] = sample1 sig_ids[1::3] = sample2 sig_ids[2::3] = sample3 sig_ids = sig_ids[rem : (rem + num_samples)] # Read one channel at a time raw_signals = np.ndarray(shape=(num_samples, len(channel_indexes)), dtype=bin_dict["data_type"]) for i, ch_idx in enumerate(channel_indexes): chan_offset = self.channel_memory_offset[ch_idx] raw_signals[:, i] = self._raw_signals[sig_ids + chan_offset] return raw_signals def _spike_count(self, block_index, seg_index, unit_index): tetrode_id = unit_index raw_spikes = self._raw_spikes[tetrode_id] nb_tetrode_spikes = raw_spikes.shape[0] # also take into account last, potentially incomplete set of spikes nb_unit_spikes = int(np.ceil(nb_tetrode_spikes)) return nb_unit_spikes def _get_spike_timestamps(self, block_index, seg_index, unit_index, t_start, t_stop): if block_index != 0: raise ValueError("`block_index must be 0") if seg_index != 0: raise ValueError("`seg_index` must be 0") tetrode_id = unit_index raw_spikes = self._raw_spikes[tetrode_id] # spike times are repeated for each contact -> use only first contact unit_spikes = raw_spikes["spiketimes"][:, 0] # slice spike times only if needed if t_start is None and t_stop is None: return unit_spikes if t_start is None: t_start = self._segment_t_start(block_index, seg_index) if t_stop is None: t_stop = self._segment_t_stop(block_index, seg_index) mask = self._get_temporal_mask(t_start, t_stop, tetrode_id) return unit_spikes[mask] def _rescale_spike_timestamp(self, spike_timestamps, dtype): spike_times = spike_timestamps.astype(dtype) spike_times /= self._to_hz(self.file_parameters["unit"]["timebase"], dtype=int) return spike_times def _get_spike_raw_waveforms(self, block_index, seg_index, unit_index, t_start, t_stop): if block_index != 0: raise ValueError("`block_index must be 0") if seg_index != 0: raise ValueError("`seg_index` must be 0") tetrode_id = unit_index waveforms = self._raw_spikes[tetrode_id]["samples"] # slice timestamps / waveforms only when necessary if t_start is None and t_stop is None: return waveforms if t_start is None: t_start = self._segment_t_start(block_index, seg_index) if t_stop is None: t_stop = self._segment_t_stop(block_index, seg_index) mask = self._get_temporal_mask(t_start, t_stop, tetrode_id) waveforms = waveforms[mask] return waveforms def get_header_bstring(self, file): """ Scan file for the occurrence of 'data_start' and return the header as byte string Parameters ---------- file (str or path): file to be loaded Returns ------- str: header byte content """ header = b"" with open(file, "rb") as f: for bin_line in f: if b"data_start" in bin_line: header += b"data_start" break else: header += bin_line return header # ------------------ HELPER METHODS -------------------- # This is largely based on code by Geoff Barrett from the Hussaini lab: # https://github.com/GeoffBarrett/BinConverter # Adapted or modified by Steffen Buergers, Julia Sprenger def _get_temporal_mask(self, t_start, t_stop, tetrode_id): # Convenience function for creating a temporal mask given # start time (t_start) and stop time (t_stop) # Used by _get_spike_raw_waveforms and _get_spike_timestamps # spike times are repeated for each contact -> use only first contact raw_spikes = self._raw_spikes[tetrode_id] unit_spikes = raw_spikes["spiketimes"][:, 0] # convert t_start and t_stop to sampling frequency # Note: this assumes no time offset! unit_params = self.file_parameters["unit"] lim0 = t_start * self._to_hz(unit_params["timebase"], dtype=int) lim1 = t_stop * self._to_hz(unit_params["timebase"], dtype=int) mask = (unit_spikes >= lim0) & (unit_spikes <= lim1) return mask def get_header_parameters(self, file, file_type): """ Extract header parameters as dictionary keys and following phrases as values (strings). Parameters ---------- file (str or path): file to be loaded file_type (str): type of file to be loaded ('set' or 'unit') Returns ------- header (dict): dictionary with keys being the parameters that were found & values being strings of the data. EXAMPLE self.get_header_parameters('file.set', 'set') """ params = {} encoding = self.file_parameters[file_type]["header_encoding"] header_string = self.get_header_bstring(file).decode(encoding) # omit the last line as this contains only `data_start` key for line in header_string.splitlines()[:-1]: key, value = line.split(" ", 1) params[key] = value return params def get_active_tetrode(self): """ Returns the ID numbers of the active tetrodes as a list. E.g.: [1,2,3,4] for a recording with 4 tetrodes (16 channels). """ active_tetrodes = [] for key, status in self.file_parameters["set"]["file_header"].items(): # The pattern to look for is collectMask_X Y, # where X is the tetrode number, and Y is 1 or 0 if key.startswith("collectMask_"): if int(status): tetrode_id = int(key.strip("collectMask_")) active_tetrodes.append(tetrode_id) return active_tetrodes def _get_channel_from_tetrode(self, tetrode): """ This function will take the tetrode number and return the Axona channel numbers, i.e. Tetrode 1 = Ch0-Ch3, Tetrode 2 = Ch4-Ch7, etc. """ return np.arange(0, 4) + 4 * (int(tetrode) - 1) def read_datetime(self): """ Creates datetime object (y, m, d, h, m, s) from .set file header """ date_str = self.file_parameters["set"]["file_header"]["trial_date"] time_str = self.file_parameters["set"]["file_header"]["trial_time"] # extract core date string date_str = re.findall(r"\d+\s\w+\s\d{4}$", date_str)[0] return datetime.datetime.strptime(date_str + ", " + time_str, "%d %b %Y, %H:%M:%S") def _get_channel_gain(self, bytes_per_sample=2): """ This is actually not the gain_ch value from the .set file, but the conversion factor from raw data to uV. Formula for conversion to uV: 1000 * adc_fullscale_mv / (gain_ch * max-value), with max_value = 2**(8 * bytes_per_sample - 1) Adapted from https://github.com/CINPLA/pyxona/blob/stable/pyxona/core.py """ gain_list = [] adc_fm = int(self.file_parameters["set"]["file_header"]["ADC_fullscale_mv"]) for key, value in self.file_parameters["set"]["file_header"].items(): if key.startswith("gain_ch"): gain_list.append(np.float32(value)) max_value = 2 ** (8 * bytes_per_sample - 1) gain_list = [1000 * adc_fm / (gain * max_value) for gain in gain_list] return gain_list def _get_signal_chan_header(self): """ Returns a 1 dimensional np.array of tuples with one entry per channel that recorded data. Each tuple contains the following information: channel name (1a, 1b, 1c, 1d, 2a, 2b, ...; num=tetrode, letter=elec), channel id (1, 2, 3, 4, 5, ... N), sampling rate, data type (int16), unit (uV), gain, offset, stream id """ active_tetrode_set = self.get_active_tetrode() num_active_tetrode = len(active_tetrode_set) elec_per_tetrode = 4 letters = ["a", "b", "c", "d"] dtype = self.file_parameters["bin"]["data_type"] units = "uV" gain_list = self._get_channel_gain() offset = 0 # What is the offset? sig_channels = [] for itetr in range(num_active_tetrode): for ielec in range(elec_per_tetrode): cntr = (itetr * elec_per_tetrode) + ielec ch_name = f"{itetr + 1}{letters[ielec]}" chan_id = str(cntr) gain = gain_list[cntr] stream_id = "0" buffer_id = "" # the sampling rate information is stored in the set header # and not in the bin file sr = self.file_parameters["set"]["sampling_rate"] sig_channels.append((ch_name, chan_id, sr, dtype, units, gain, offset, stream_id, buffer_id)) return np.array(sig_channels, dtype=_signal_channel_dtype) def _to_hz(self, param, dtype=float): return dtype(param.replace(" hz", "")) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/axonrawio.py0000644000175100001660000010340714743453644016266 0ustar00runnerdocker""" Class for reading data from pCLAMP and AxoScope files (.abf version 1 and 2), developed by Molecular device/Axon technologies. - abf = Axon binary file - atf is a text file based format from axon that could be read by AsciiIO (but this file is less efficient.) This code is a port of abfload and abf2load written in Matlab (BSD-2-Clause licence) by : - Copyright (c) 2009, Forrest Collman, fcollman@princeton.edu - Copyright (c) 2004, Harald Hentschke and available here: http://www.mathworks.com/matlabcentral/fileexchange/22114-abf2load The StringsSection parsing (parse_axon_soup) now relies on an idea presented in pyABF MIT License Copyright (c) 2018 Scott W Harden written by Scott Harden. His unofficial documentation for the formats is here: https://swharden.com/pyabf/abf2-file-format/ strings section: [uModifierNameIndex, uCreatorNameIndex, uProtocolPathIndex, lFileComment, lADCCChannelNames, lADCUnitsIndex lDACChannelNameIndex, lDACUnitIndex, lDACFilePath, nLeakSubtractADC] ['', 'Clampex', '', 'C:/path/protocol.pro', 'some comment', 'IN 0', 'mV', 'IN 1', 'mV', 'Cmd 0', 'pA', 'Cmd 1', 'pA', 'Cmd 2', 'mV', 'Cmd 3', 'mV'] Information on abf 1 and 2 formats is available here: http://www.moleculardevices.com/pages/software/developer_info.html This file supports the old (ABF1) and new (ABF2) format. ABF1 (clampfit <=9) and ABF2 (clampfit >10) All possible mode are possible : - event-driven variable-length mode 1 -> return several Segments per Block - event-driven fixed-length mode 2 or 5 -> return several Segments - gap free mode -> return one (or several) Segment in the Block Supported : Read Author: Samuel Garcia, JS Nowacki Note: j.s.nowacki@gmail.com has a C++ library with SWIG bindings which also reads abf files - would be good to cross-check """ import struct import datetime from io import open, BufferedReader import numpy as np from .baserawio import ( BaseRawWithBufferApiIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) from neo.core import NeoReadWriteError class AxonRawIO(BaseRawWithBufferApiIO): """ Class for Class for reading data from pCLAMP and AxoScope files (.abf version 1 and 2) Parameters ---------- filename: str, default: '' The *.abf file to be read Notes ----- This code is a port of abfload and abf2load written in Matlab (BSD-2-Clause licence) by Copyright (c) 2009, Forrest Collman, fcollman@princeton.edu Copyright (c) 2004, Harald Hentschke Examples -------- >>> import neo.rawio >>> reader = neo.rawio.AxonRawIO(filename='mydata.abf') >>> reader.parse_header() >>> print(reader) """ extensions = ["abf"] rawmode = "one-file" def __init__(self, filename=""): BaseRawWithBufferApiIO.__init__(self) self.filename = filename def _parse_header(self): info = self._axon_info = parse_axon_soup(self.filename) version = info["fFileVersionNumber"] # file format if info["nDataFormat"] == 0: sig_dtype = np.dtype("i2") elif info["nDataFormat"] == 1: sig_dtype = np.dtype("f4") if version < 2.0: nbchannel = info["nADCNumChannels"] head_offset = info["lDataSectionPtr"] * BLOCKSIZE + info["nNumPointsIgnored"] * sig_dtype.itemsize totalsize = info["lActualAcqLength"] elif version >= 2.0: nbchannel = info["sections"]["ADCSection"]["llNumEntries"] head_offset = info["sections"]["DataSection"]["uBlockIndex"] * BLOCKSIZE totalsize = info["sections"]["DataSection"]["llNumEntries"] # 3 possible modes if version < 2.0: mode = info["nOperationMode"] elif version >= 2.0: mode = info["protocol"]["nOperationMode"] if mode not in [1, 2, 3, 5]: raise NeoReadWriteError(f"Mode {mode} is not currently supported in Neo") # event-driven variable-length mode (mode 1) # event-driven fixed-length mode (mode 2 or 5) # gap free mode (mode 3) can be in several episodes # read sweep pos if version < 2.0: nbepisod = info["lSynchArraySize"] offset_episode = info["lSynchArrayPtr"] * BLOCKSIZE elif version >= 2.0: nbepisod = info["sections"]["SynchArraySection"]["llNumEntries"] offset_episode = info["sections"]["SynchArraySection"]["uBlockIndex"] * BLOCKSIZE if nbepisod > 0: episode_array = np.memmap( self.filename, [("offset", "i4"), ("len", "i4")], "r", shape=nbepisod, offset=offset_episode ) else: episode_array = np.empty(1, [("offset", "i4"), ("len", "i4")]) episode_array[0]["len"] = totalsize episode_array[0]["offset"] = 0 # sampling_rate if version < 2.0: self._sampling_rate = 1.0 / (info["fADCSampleInterval"] * nbchannel * 1.0e-6) elif version >= 2.0: self._sampling_rate = 1.0e6 / info["protocol"]["fADCSequenceInterval"] # one sweep = one segment nb_segment = episode_array.size stream_id = "0" buffer_id = "0" # Get raw data by segment # self._raw_signals = {} self._t_starts = {} self._buffer_descriptions = {0: {}} self._stream_buffer_slice = {stream_id: None} pos = 0 for seg_index in range(nb_segment): length = episode_array[seg_index]["len"] if version < 2.0: fSynchTimeUnit = info["fSynchTimeUnit"] elif version >= 2.0: fSynchTimeUnit = info["protocol"]["fSynchTimeUnit"] if (fSynchTimeUnit != 0) and (mode == 1): length /= fSynchTimeUnit self._buffer_descriptions[0][seg_index] = {} self._buffer_descriptions[0][seg_index][buffer_id] = { "type": "raw", "file_path": str(self.filename), "dtype": str(sig_dtype), "order": "C", "file_offset": head_offset + pos * sig_dtype.itemsize, "shape": (int(length // nbchannel), int(nbchannel)), } pos += length t_start = float(episode_array[seg_index]["offset"]) if fSynchTimeUnit == 0: t_start = t_start / self._sampling_rate else: t_start = t_start * fSynchTimeUnit * 1e-6 self._t_starts[seg_index] = t_start # Create channel header if version < 2.0: channel_ids = [chan_num for chan_num in info["nADCSamplingSeq"] if chan_num >= 0] else: channel_ids = list(range(nbchannel)) signal_channels = [] adc_nums = [] for chan_index, chan_id in enumerate(channel_ids): if version < 2.0: name = info["sADCChannelName"][chan_id].replace(b" ", b"") units = safe_decode_units(info["sADCUnits"][chan_id]) adc_num = info["nADCPtoLChannelMap"][chan_id] elif version >= 2.0: ADCInfo = info["listADCInfo"][chan_id] name = ADCInfo["ADCChNames"].replace(b" ", b"") units = safe_decode_units(ADCInfo["ADCChUnits"]) adc_num = ADCInfo["nADCNum"] adc_nums.append(adc_num) if info["nDataFormat"] == 0: # int16 gain/offset if version < 2.0: gain = info["fADCRange"] gain /= info["fInstrumentScaleFactor"][chan_id] gain /= info["fSignalGain"][chan_id] gain /= info["fADCProgrammableGain"][chan_id] gain /= info["lADCResolution"] if info["nTelegraphEnable"][chan_id] == 0: pass elif info["nTelegraphEnable"][chan_id] == 1: gain /= info["fTelegraphAdditGain"][chan_id] else: self.logger.warning("ignoring buggy nTelegraphEnable") offset = info["fInstrumentOffset"][chan_id] offset -= info["fSignalOffset"][chan_id] elif version >= 2.0: gain = info["protocol"]["fADCRange"] gain /= info["listADCInfo"][chan_id]["fInstrumentScaleFactor"] gain /= info["listADCInfo"][chan_id]["fSignalGain"] gain /= info["listADCInfo"][chan_id]["fADCProgrammableGain"] gain /= info["protocol"]["lADCResolution"] if info["listADCInfo"][chan_id]["nTelegraphEnable"]: gain /= info["listADCInfo"][chan_id]["fTelegraphAdditGain"] offset = info["listADCInfo"][chan_id]["fInstrumentOffset"] offset -= info["listADCInfo"][chan_id]["fSignalOffset"] else: gain, offset = 1.0, 0.0 signal_channels.append( (name, str(chan_id), self._sampling_rate, sig_dtype, units, gain, offset, stream_id, buffer_id) ) signal_channels = np.array(signal_channels, dtype=_signal_channel_dtype) # one unique signal stream and buffer signal_buffers = np.array([("Signals", buffer_id)], dtype=_signal_buffer_dtype) signal_streams = np.array([("Signals", stream_id, buffer_id)], dtype=_signal_stream_dtype) # only one events channel : tag # In ABF timstamps are not attached too any particular segment # so each segment acess all event timestamps = [] labels = [] comments = [] for i, tag in enumerate(info["listTag"]): timestamps.append(tag["lTagTime"]) labels.append(str(tag["nTagType"])) comments.append(str(clean_string(tag["sComment"]))) self._raw_ev_timestamps = np.array(timestamps) self._ev_labels = np.array(labels, dtype="U") self._ev_comments = np.array(comments, dtype="U") event_channels = [("Tag", "", "event")] event_channels = np.array(event_channels, dtype=_event_channel_dtype) # No spikes spike_channels = [] spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) # fille into header dict self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [nb_segment] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = signal_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels # insert some annotation at some place self._generate_minimal_annotations() bl_annotations = self.raw_annotations["blocks"][0] bl_annotations["rec_datetime"] = info["rec_datetime"] bl_annotations["abf_version"] = version for seg_index in range(nb_segment): seg_annotations = bl_annotations["segments"][seg_index] seg_annotations["abf_version"] = version signal_an = self.raw_annotations["blocks"][0]["segments"][seg_index]["signals"][0] nADCNum = np.array([adc_nums[c] for c in range(signal_channels.size)]) signal_an["__array_annotations__"]["nADCNum"] = nADCNum for c in range(event_channels.size): ev_ann = seg_annotations["events"][c] ev_ann["comments"] = self._ev_comments def _source_name(self): return self.filename def _segment_t_start(self, block_index, seg_index): return self._t_starts[seg_index] def _segment_t_stop(self, block_index, seg_index): sig_size = self.get_signal_size(block_index, seg_index, 0) t_stop = self._t_starts[seg_index] + sig_size / self._sampling_rate return t_stop def _get_signal_t_start(self, block_index, seg_index, stream_index): return self._t_starts[seg_index] def _get_analogsignal_buffer_description(self, block_index, seg_index, buffer_id): return self._buffer_descriptions[block_index][seg_index][buffer_id] def _event_count(self, block_index, seg_index, event_channel_index): return self._raw_ev_timestamps.size def _get_event_timestamps(self, block_index, seg_index, event_channel_index, t_start, t_stop): # In ABF timestamps are not attached too any particular segment # so each segment accesses all events timestamp = self._raw_ev_timestamps labels = self._ev_labels durations = None if t_start is not None: keep = timestamp >= int(t_start * self._sampling_rate) timestamp = timestamp[keep] labels = labels[keep] if t_stop is not None: keep = timestamp <= int(t_stop * self._sampling_rate) timestamp = timestamp[keep] labels = labels[keep] return timestamp, durations, labels def _rescale_event_timestamp(self, event_timestamps, dtype, event_channel_index): event_times = event_timestamps.astype(dtype) / self._sampling_rate return event_times def read_raw_protocol(self): """ Read the protocol waveform of the file, if present; function works with ABF2 only. Protocols can be reconstructed from the ABF1 header. Returns ------- segments : list of segments Segments, one for every episode, with list of analog signls (one for every DAC). Author: JS Nowacki """ info = self._axon_info if info["fFileVersionNumber"] < 2.0: raise IOError("Protocol section is only present in ABF2 files.") nADC = info["sections"]["ADCSection"]["llNumEntries"] # Number of ADC channels nDAC = info["sections"]["DACSection"]["llNumEntries"] # Number of DAC channels nSam = int(info["protocol"]["lNumSamplesPerEpisode"] / nADC) # Number of samples per episode nEpi = info["lActualEpisodes"] # Actual number of episodes # Make a list of segments with analog signals with just holding levels # List of segments relates to number of episodes, as for recorded data sigs_by_segments = [] for epiNum in range(nEpi): # One analog signal for each DAC in segment (episode) signals = [] for DACNum in range(nDAC): sig = np.ones(nSam) * info["listDACInfo"][DACNum]["fDACHoldingLevel"] # If there are epoch infos for this DAC if DACNum in info["dictEpochInfoPerDAC"]: # Save last sample index i_last = int(nSam * 15625 / 10**6) # TODO guess for first holding # Go over EpochInfoPerDAC and change the analog signal # according to the epochs epochInfo = info["dictEpochInfoPerDAC"][DACNum] for epochNum, epoch in epochInfo.items(): i_begin = i_last i_end = i_last + epoch["lEpochInitDuration"] + epoch["lEpochDurationInc"] * epiNum dif = i_end - i_begin sig[i_begin:i_end] = np.ones(dif) * ( epoch["fEpochInitLevel"] + epoch["fEpochLevelInc"] * epiNum ) i_last += epoch["lEpochInitDuration"] + epoch["lEpochDurationInc"] * epiNum signals.append(sig) sigs_by_segments.append(signals) sig_names = [] sig_units = [] for DACNum in range(nDAC): name = info["listDACInfo"][DACNum]["DACChNames"].decode("utf-8") units = safe_decode_units(info["listDACInfo"][DACNum]["DACChUnits"]) sig_names.append(name) sig_units.append(units) return sigs_by_segments, sig_names, sig_units def parse_axon_soup(filename): """ read the header of the file The strategy here differs from the original script under Matlab. In the original script for ABF2, it completes the header with information that is located in other structures. In ABF2 this function returns info with sub dict: sections (ABF2) protocol (ABF2) listTags (ABF1&2) listADCInfo (ABF2) listDACInfo (ABF2) dictEpochInfoPerDAC (ABF2) that contains more information. """ with open(filename, "rb") as fid: f = StructFile(fid) # version f_file_signature = f.read(4) if f_file_signature == b"ABF ": header_description = headerDescriptionV1 elif f_file_signature == b"ABF2": header_description = headerDescriptionV2 else: return None # construct dict header = {} for key, offset, fmt in header_description: val = f.read_f(fmt, offset=offset) if len(val) == 1: header[key] = val[0] else: header[key] = np.array(val) # correction of version number and starttime if f_file_signature == b"ABF ": header["lFileStartTime"] += header["nFileStartMillisecs"] * 0.001 elif f_file_signature == b"ABF2": n = header["fFileVersionNumber"] header["fFileVersionNumber"] = n[3] + 0.1 * n[2] + 0.01 * n[1] + 0.001 * n[0] header["lFileStartTime"] = header["uFileStartTimeMS"] * 0.001 if header["fFileVersionNumber"] < 2.0: # tags listTag = [] for i in range(header["lNumTagEntries"]): f.seek(header["lTagSectionPtr"] + i * 64) tag = {} for key, fmt in TagInfoDescription: val = f.read_f(fmt) if len(val) == 1: tag[key] = val[0] else: tag[key] = np.array(val) listTag.append(tag) header["listTag"] = listTag # protocol name formatting header["sProtocolPath"] = clean_string(header["sProtocolPath"]) header["sProtocolPath"] = header["sProtocolPath"].replace(b"\\", b"/") elif header["fFileVersionNumber"] >= 2.0: # in abf2 some info are in other place # sections sections = {} for s, sectionName in enumerate(sectionNames): uBlockIndex, uBytes, llNumEntries = f.read_f("IIl", offset=76 + s * 16) sections[sectionName] = {} sections[sectionName]["uBlockIndex"] = uBlockIndex sections[sectionName]["uBytes"] = uBytes sections[sectionName]["llNumEntries"] = llNumEntries header["sections"] = sections # strings sections # hack for reading channels names and units # this section is not very detailed and so the code # not very robust. f.seek(sections["StringsSection"]["uBlockIndex"] * BLOCKSIZE) big_string = f.read(sections["StringsSection"]["uBytes"]) # this idea comes from pyABF https://github.com/swharden/pyABF # previously we searched for clampex, Clampex etc, but this was # brittle. pyABF believes that looking for the \x00\x00 is more # robust. We find these values, replace mu->u, then split into # a set of strings indexed_string = big_string[big_string.rfind(b"\x00\x00") :] # replace mu -> u for easy display indexed_string = indexed_string.replace(b"\xb5", b"\x75") # we need to remove one of the \x00 to have the indices be # the correct order indexed_string = indexed_string.split(b"\x00")[1:] strings = indexed_string # ADC sections header["listADCInfo"] = [] for i in range(sections["ADCSection"]["llNumEntries"]): # read ADCInfo f.seek(sections["ADCSection"]["uBlockIndex"] * BLOCKSIZE + sections["ADCSection"]["uBytes"] * i) ADCInfo = {} for key, fmt in ADCInfoDescription: val = f.read_f(fmt) if len(val) == 1: ADCInfo[key] = val[0] else: ADCInfo[key] = np.array(val) ADCInfo["ADCChNames"] = strings[ADCInfo["lADCChannelNameIndex"]] ADCInfo["ADCChUnits"] = strings[ADCInfo["lADCUnitsIndex"]] header["listADCInfo"].append(ADCInfo) # protocol sections protocol = {} f.seek(sections["ProtocolSection"]["uBlockIndex"] * BLOCKSIZE) for key, fmt in protocolInfoDescription: val = f.read_f(fmt) if len(val) == 1: protocol[key] = val[0] else: protocol[key] = np.array(val) header["protocol"] = protocol header["sProtocolPath"] = strings[header["uProtocolPathIndex"]] # tags listTag = [] for i in range(sections["TagSection"]["llNumEntries"]): f.seek(sections["TagSection"]["uBlockIndex"] * BLOCKSIZE + sections["TagSection"]["uBytes"] * i) tag = {} for key, fmt in TagInfoDescription: val = f.read_f(fmt) if len(val) == 1: tag[key] = val[0] else: tag[key] = np.array(val) listTag.append(tag) header["listTag"] = listTag # DAC sections header["listDACInfo"] = [] for i in range(sections["DACSection"]["llNumEntries"]): # read DACInfo f.seek(sections["DACSection"]["uBlockIndex"] * BLOCKSIZE + sections["DACSection"]["uBytes"] * i) DACInfo = {} for key, fmt in DACInfoDescription: val = f.read_f(fmt) if len(val) == 1: DACInfo[key] = val[0] else: DACInfo[key] = np.array(val) DACInfo["DACChNames"] = strings[DACInfo["lDACChannelNameIndex"]] DACInfo["DACChUnits"] = strings[DACInfo["lDACChannelUnitsIndex"]] header["listDACInfo"].append(DACInfo) # EpochPerDAC sections # header['dictEpochInfoPerDAC'] is dict of dicts: # - the first index is the DAC number # - the second index is the epoch number # It has to be done like that because data may not exist # and may not be in sorted order header["dictEpochInfoPerDAC"] = {} for i in range(sections["EpochPerDACSection"]["llNumEntries"]): # read DACInfo f.seek( sections["EpochPerDACSection"]["uBlockIndex"] * BLOCKSIZE + sections["EpochPerDACSection"]["uBytes"] * i ) EpochInfoPerDAC = {} for key, fmt in EpochInfoPerDACDescription: val = f.read_f(fmt) if len(val) == 1: EpochInfoPerDAC[key] = val[0] else: EpochInfoPerDAC[key] = np.array(val) DACNum = EpochInfoPerDAC["nDACNum"] EpochNum = EpochInfoPerDAC["nEpochNum"] # Checking if the key exists, if not, the value is empty # so we have to create empty dict to populate if DACNum not in header["dictEpochInfoPerDAC"]: header["dictEpochInfoPerDAC"][DACNum] = {} header["dictEpochInfoPerDAC"][DACNum][EpochNum] = EpochInfoPerDAC # Epoch sections header["EpochInfo"] = [] for i in range(sections["EpochSection"]["llNumEntries"]): # read EpochInfo f.seek(sections["EpochSection"]["uBlockIndex"] * BLOCKSIZE + sections["EpochSection"]["uBytes"] * i) EpochInfo = {} for key, fmt in EpochInfoDescription: val = f.read_f(fmt) if len(val) == 1: EpochInfo[key] = val[0] else: EpochInfo[key] = np.array(val) header["EpochInfo"].append(EpochInfo) # date and time if header["fFileVersionNumber"] < 2.0: YY = 1900 MM = 1 DD = 1 hh = int(header["lFileStartTime"] / 3600.0) mm = int((header["lFileStartTime"] - hh * 3600) / 60) ss = header["lFileStartTime"] - hh * 3600 - mm * 60 ms = int(np.mod(ss, 1) * 1e6) ss = int(ss) elif header["fFileVersionNumber"] >= 2.0: YY = int(header["uFileStartDate"] / 10000) MM = int((header["uFileStartDate"] - YY * 10000) / 100) DD = int(header["uFileStartDate"] - YY * 10000 - MM * 100) hh = int(header["uFileStartTimeMS"] / 1000.0 / 3600.0) mm = int((header["uFileStartTimeMS"] / 1000.0 - hh * 3600) / 60) ss = header["uFileStartTimeMS"] / 1000.0 - hh * 3600 - mm * 60 ms = int(np.mod(ss, 1) * 1e6) ss = int(ss) header["rec_datetime"] = datetime.datetime(YY, MM, DD, hh, mm, ss, ms) return header class StructFile(BufferedReader): def read_f(self, fmt, offset=None): if offset is not None: self.seek(offset) return struct.unpack(fmt, self.read(struct.calcsize(fmt))) def clean_string(s): s = s.rstrip(b"\x00") s = s.rstrip(b" ") return s def safe_decode_units(s): s = s.replace(b" ", b"") s = s.replace(b"\xb5", b"u") # \xb5 is µ s = s.replace(b"\xb0", b"\xc2\xb0") # \xb0 is ° s = s.decode("utf-8") return s BLOCKSIZE = 512 headerDescriptionV1 = [ ("fFileSignature", 0, "4s"), ("fFileVersionNumber", 4, "f"), ("nOperationMode", 8, "h"), ("lActualAcqLength", 10, "i"), ("nNumPointsIgnored", 14, "h"), ("lActualEpisodes", 16, "i"), ("lFileStartTime", 24, "i"), ("lDataSectionPtr", 40, "i"), ("lTagSectionPtr", 44, "i"), ("lNumTagEntries", 48, "i"), ("lSynchArrayPtr", 92, "i"), ("lSynchArraySize", 96, "i"), ("nDataFormat", 100, "h"), ("nADCNumChannels", 120, "h"), ("fADCSampleInterval", 122, "f"), ("fSynchTimeUnit", 130, "f"), ("lNumSamplesPerEpisode", 138, "i"), ("lPreTriggerSamples", 142, "i"), ("lEpisodesPerRun", 146, "i"), ("fADCRange", 244, "f"), ("lADCResolution", 252, "i"), ("nFileStartMillisecs", 366, "h"), ("nADCPtoLChannelMap", 378, "16h"), ("nADCSamplingSeq", 410, "16h"), ("sADCChannelName", 442, "10s" * 16), ("sADCUnits", 602, "8s" * 16), ("fADCProgrammableGain", 730, "16f"), ("fInstrumentScaleFactor", 922, "16f"), ("fInstrumentOffset", 986, "16f"), ("fSignalGain", 1050, "16f"), ("fSignalOffset", 1114, "16f"), ("nDigitalEnable", 1436, "h"), ("nActiveDACChannel", 1440, "h"), ("nDigitalHolding", 1584, "h"), ("nDigitalInterEpisode", 1586, "h"), ("nDigitalValue", 2588, "10h"), ("lDACFilePtr", 2048, "2i"), ("lDACFileNumEpisodes", 2056, "2i"), ("fDACCalibrationFactor", 2074, "4f"), ("fDACCalibrationOffset", 2090, "4f"), ("nWaveformEnable", 2296, "2h"), ("nWaveformSource", 2300, "2h"), ("nInterEpisodeLevel", 2304, "2h"), ("nEpochType", 2308, "20h"), ("fEpochInitLevel", 2348, "20f"), ("fEpochLevelInc", 2428, "20f"), ("lEpochInitDuration", 2508, "20i"), ("lEpochDurationInc", 2588, "20i"), ("nTelegraphEnable", 4512, "16h"), ("fTelegraphAdditGain", 4576, "16f"), ("sProtocolPath", 4898, "384s"), ] headerDescriptionV2 = [ ("fFileSignature", 0, "4s"), ("fFileVersionNumber", 4, "4b"), ("uFileInfoSize", 8, "I"), ("lActualEpisodes", 12, "I"), ("uFileStartDate", 16, "I"), ("uFileStartTimeMS", 20, "I"), ("uStopwatchTime", 24, "I"), ("nFileType", 28, "H"), ("nDataFormat", 30, "H"), ("nSimultaneousScan", 32, "H"), ("nCRCEnable", 34, "H"), ("uFileCRC", 36, "I"), ("FileGUID", 40, "I"), ("uCreatorVersion", 56, "I"), ("uCreatorNameIndex", 60, "I"), ("uModifierVersion", 64, "I"), ("uModifierNameIndex", 68, "I"), ("uProtocolPathIndex", 72, "I"), ] sectionNames = [ "ProtocolSection", "ADCSection", "DACSection", "EpochSection", "ADCPerDACSection", "EpochPerDACSection", "UserListSection", "StatsRegionSection", "MathSection", "StringsSection", "DataSection", "TagSection", "ScopeSection", "DeltaSection", "VoiceTagSection", "SynchArraySection", "AnnotationSection", "StatsSection", ] protocolInfoDescription = [ ("nOperationMode", "h"), ("fADCSequenceInterval", "f"), ("bEnableFileCompression", "b"), ("sUnused1", "3s"), ("uFileCompressionRatio", "I"), ("fSynchTimeUnit", "f"), ("fSecondsPerRun", "f"), ("lNumSamplesPerEpisode", "i"), ("lPreTriggerSamples", "i"), ("lEpisodesPerRun", "i"), ("lRunsPerTrial", "i"), ("lNumberOfTrials", "i"), ("nAveragingMode", "h"), ("nUndoRunCount", "h"), ("nFirstEpisodeInRun", "h"), ("fTriggerThreshold", "f"), ("nTriggerSource", "h"), ("nTriggerAction", "h"), ("nTriggerPolarity", "h"), ("fScopeOutputInterval", "f"), ("fEpisodeStartToStart", "f"), ("fRunStartToStart", "f"), ("lAverageCount", "i"), ("fTrialStartToStart", "f"), ("nAutoTriggerStrategy", "h"), ("fFirstRunDelayS", "f"), ("nChannelStatsStrategy", "h"), ("lSamplesPerTrace", "i"), ("lStartDisplayNum", "i"), ("lFinishDisplayNum", "i"), ("nShowPNRawData", "h"), ("fStatisticsPeriod", "f"), ("lStatisticsMeasurements", "i"), ("nStatisticsSaveStrategy", "h"), ("fADCRange", "f"), ("fDACRange", "f"), ("lADCResolution", "i"), ("lDACResolution", "i"), ("nExperimentType", "h"), ("nManualInfoStrategy", "h"), ("nCommentsEnable", "h"), ("lFileCommentIndex", "i"), ("nAutoAnalyseEnable", "h"), ("nSignalType", "h"), ("nDigitalEnable", "h"), ("nActiveDACChannel", "h"), ("nDigitalHolding", "h"), ("nDigitalInterEpisode", "h"), ("nDigitalDACChannel", "h"), ("nDigitalTrainActiveLogic", "h"), ("nStatsEnable", "h"), ("nStatisticsClearStrategy", "h"), ("nLevelHysteresis", "h"), ("lTimeHysteresis", "i"), ("nAllowExternalTags", "h"), ("nAverageAlgorithm", "h"), ("fAverageWeighting", "f"), ("nUndoPromptStrategy", "h"), ("nTrialTriggerSource", "h"), ("nStatisticsDisplayStrategy", "h"), ("nExternalTagType", "h"), ("nScopeTriggerOut", "h"), ("nLTPType", "h"), ("nAlternateDACOutputState", "h"), ("nAlternateDigitalOutputState", "h"), ("fCellID", "3f"), ("nDigitizerADCs", "h"), ("nDigitizerDACs", "h"), ("nDigitizerTotalDigitalOuts", "h"), ("nDigitizerSynchDigitalOuts", "h"), ("nDigitizerType", "h"), ] ADCInfoDescription = [ ("nADCNum", "h"), ("nTelegraphEnable", "h"), ("nTelegraphInstrument", "h"), ("fTelegraphAdditGain", "f"), ("fTelegraphFilter", "f"), ("fTelegraphMembraneCap", "f"), ("nTelegraphMode", "h"), ("fTelegraphAccessResistance", "f"), ("nADCPtoLChannelMap", "h"), ("nADCSamplingSeq", "h"), ("fADCProgrammableGain", "f"), ("fADCDisplayAmplification", "f"), ("fADCDisplayOffset", "f"), ("fInstrumentScaleFactor", "f"), ("fInstrumentOffset", "f"), ("fSignalGain", "f"), ("fSignalOffset", "f"), ("fSignalLowpassFilter", "f"), ("fSignalHighpassFilter", "f"), ("nLowpassFilterType", "b"), ("nHighpassFilterType", "b"), ("fPostProcessLowpassFilter", "f"), ("nPostProcessLowpassFilterType", "c"), ("bEnabledDuringPN", "b"), ("nStatsChannelPolarity", "h"), ("lADCChannelNameIndex", "i"), ("lADCUnitsIndex", "i"), ] TagInfoDescription = [ ("lTagTime", "i"), ("sComment", "56s"), ("nTagType", "h"), ("nVoiceTagNumber_or_AnnotationIndex", "h"), ] DACInfoDescription = [ ("nDACNum", "h"), ("nTelegraphDACScaleFactorEnable", "h"), ("fInstrumentHoldingLevel", "f"), ("fDACScaleFactor", "f"), ("fDACHoldingLevel", "f"), ("fDACCalibrationFactor", "f"), ("fDACCalibrationOffset", "f"), ("lDACChannelNameIndex", "i"), ("lDACChannelUnitsIndex", "i"), ("lDACFilePtr", "i"), ("lDACFileNumEpisodes", "i"), ("nWaveformEnable", "h"), ("nWaveformSource", "h"), ("nInterEpisodeLevel", "h"), ("fDACFileScale", "f"), ("fDACFileOffset", "f"), ("lDACFileEpisodeNum", "i"), ("nDACFileADCNum", "h"), ("nConditEnable", "h"), ("lConditNumPulses", "i"), ("fBaselineDuration", "f"), ("fBaselineLevel", "f"), ("fStepDuration", "f"), ("fStepLevel", "f"), ("fPostTrainPeriod", "f"), ("fPostTrainLevel", "f"), ("nMembTestEnable", "h"), ("nLeakSubtractType", "h"), ("nPNPolarity", "h"), ("fPNHoldingLevel", "f"), ("nPNNumADCChannels", "h"), ("nPNPosition", "h"), ("nPNNumPulses", "h"), ("fPNSettlingTime", "f"), ("fPNInterpulse", "f"), ("nLTPUsageOfDAC", "h"), ("nLTPPresynapticPulses", "h"), ("lDACFilePathIndex", "i"), ("fMembTestPreSettlingTimeMS", "f"), ("fMembTestPostSettlingTimeMS", "f"), ("nLeakSubtractADCIndex", "h"), ("sUnused", "124s"), ] EpochInfoPerDACDescription = [ ("nEpochNum", "h"), ("nDACNum", "h"), ("nEpochType", "h"), ("fEpochInitLevel", "f"), ("fEpochLevelInc", "f"), ("lEpochInitDuration", "i"), ("lEpochDurationInc", "i"), ("lEpochPulsePeriod", "i"), ("lEpochPulseWidth", "i"), ("sUnused", "18s"), ] EpochInfoDescription = [ ("nEpochNum", "h"), ("nDigitalValue", "h"), ("nDigitalTrainValue", "h"), ("nAlternateDigitalValue", "h"), ("nAlternateDigitalTrainValue", "h"), ("bEpochCompression", "b"), ("sUnused", "21s"), ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/baserawio.py0000644000175100001660000016704614743453644016244 0ustar00runnerdocker""" baserawio ====== Classes ------- BaseRawIO abstract class which should be overridden to write a RawIO. RawIO is a low level API in neo that provides fast access to the raw data. When possible, all IOs should/implement this level following these guidelines: * internal use of memmap (or hdf5) * fast reading of the header (do not read the complete file) * neo tree object is symmetric and logical: same channel/units/event along all block and segments. For this level, datasets of recordings are mapped as follows: A channel refers to a physical channel of a recording in an experiment. It is identified by a channel_id. Recordings from a channel consist of sections of samples which are recorded contiguously in time; in other words, a section of a channel has a specific sampling_rate, start_time, and length (and thus also stop_time, which is the time of the sample which would lie one sampling interval beyond the last sample present in that section). A stream consists of a set of channels which all have the same structure of their sections of recording and the same data type of samples. Each stream has a unique stream_id and has a name, which does not need to be unique. A stream thus has multiple channels which all have the same sampling rate and are on the same clock, have the same sections with t_starts and lengths, and the same data type for their samples. The samples in a stream can thus be retrieved as an Numpy array, a chunk of samples. Channels within a stream can be accessed be either their channel_id, which must be unique within a stream, or by their channel_index, which is a 0 based index to all channels within the stream. Note that a single channel of recording may be represented within multiple streams, and such is the case for RawIOs which may have both unfiltered and filtered or downsampled versions of the signals from a single recording channel. In such a case, a single channel and channel_id may be represented by a different channel_index within different streams. Lists of channel_indexes are often convenient to pass around a selection of channels within a stream. At the neo.io level, one AnalogSignal with multiple channels can be created for each stream. Such an AnalogSignal may have multiple Segments, with each segment containing the sections from each channel with the same t_start and length. Such multiple Segments for a RawIO will have the same sampling rate. It is thus possible to retrieve the t_start and length of the sections of the channels for a Block and Segment of a stream. So this handles **only** one simplified but very frequent case of dataset: * Only one channel set for AnalogSignal stable along Segment * Only one channel set for SpikeTrain stable along Segment * AnalogSignal have all the same sampling_rate across all Segment * t_start/t_stop are the same for many object (SpikeTrain, Event) inside a Segment Signal channels are handled by group of "stream". One stream will result at neo.io level in one AnalogSignal with multiple channels. A helper class `neo.io.basefromrawio.BaseFromRaw` transforms a RawIO to neo legacy IO. In short all "neo.rawio" classes are also "neo.io" with lazy reading capability. With this API the IO have an attributes `header` with necessary keys. This `header` attribute is done in `_parse_header(...)` method. See ExampleRawIO as example. BaseRawIO also implements a possible persistent cache system that can be used by some RawIOs to avoid a very long parse_header() call. The idea is that some variable or vector can be stored somewhere (near the file, /tmp, any path) for use across multiple constructions of a RawIO for a given set of data. """ from __future__ import annotations import logging import numpy as np import os import sys from neo import logging_handler from .utils import get_memmap_chunk_from_opened_file possible_raw_modes = [ "one-file", "multi-file", "one-dir", ] # 'multi-dir', 'url', 'other' error_header = "Header is not read yet, do parse_header() first" _signal_buffer_dtype = [ ("name", "U64"), # not necessarily unique ("id", "U64"), # must be unique ] # To be left an empty array if the concept of buffer is undefined for a reader. _signal_stream_dtype = [ ("name", "U64"), # not necessarily unique ("id", "U64"), # must be unique ( "buffer_id", "U64", ), # should be "" (empty string) when the stream is not nested under a buffer or the buffer is undefined for some reason. ] _signal_channel_dtype = [ ("name", "U64"), # not necessarily unique ("id", "U64"), # must be unique ("sampling_rate", "float64"), ("dtype", "U16"), ("units", "U64"), ("gain", "float64"), ("offset", "float64"), ("stream_id", "U64"), ("buffer_id", "U64"), ] # TODO for later: add t_start and length in _signal_channel_dtype # this would simplify all t_start/t_stop stuff for each RawIO class _common_sig_characteristics = ["sampling_rate", "dtype", "stream_id"] _spike_channel_dtype = [ ("name", "U64"), ("id", "U64"), # for waveform ("wf_units", "U64"), ("wf_gain", "float64"), ("wf_offset", "float64"), ("wf_left_sweep", "int64"), ("wf_sampling_rate", "float64"), ] # in rawio event and epoch are handled the same way # except, that duration is `None` for events _event_channel_dtype = [ ("name", "U64"), ("id", "U64"), ("type", "S5"), # epoch or event ] class BaseRawIO: """ Generic class to handle. """ name = "BaseRawIO" description = "" extensions = [] rawmode = None # one key from possible_raw_modes # TODO Why multi-file would have a single filename is confusing here - shouldn't # the name of this argument be filenames_list or filenames_base or similar? # # When rawmode=='one-file' kargs MUST contains 'filename' the filename # When rawmode=='multi-file' kargs MUST contains 'filename' one of the filenames. # When rawmode=='one-dir' kargs MUST contains 'dirname' the dirname. def __init__(self, use_cache: bool = False, cache_path: str = "same_as_resource", **kargs): """ init docstring should be filled out at the rawio level so the user knows whether to input filename or dirname. """ # create a logger for the IO class fullname = self.__class__.__module__ + "." + self.__class__.__name__ self.logger = logging.getLogger(fullname) # Create a logger for 'neo' and add a handler to it if it doesn't have one already. # (it will also not add one if the root logger has a handler) corename = self.__class__.__module__.split(".")[0] corelogger = logging.getLogger(corename) rootlogger = logging.getLogger() if not corelogger.handlers and not rootlogger.handlers: corelogger.addHandler(logging_handler) self.use_cache = use_cache if use_cache: self.setup_cache(cache_path) else: self._cache = None self.header = None self.is_header_parsed = False self._has_buffer_description_api = False def has_buffer_description_api(self) -> bool: """ Return if the reader handle the buffer API. If True then the reader support internally `get_analogsignal_buffer_description()` """ return self._has_buffer_description_api def parse_header(self): """ Parses the header of the file(s) to allow for faster computations for all other functions """ # this must create # self.header['nb_block'] # self.header['nb_segment'] # self.header['signal_buffers'] # self.header['signal_streams'] # self.header['signal_channels'] # self.header['spike_channels'] # self.header['event_channels'] self._parse_header() self._check_stream_signal_channel_characteristics() self.is_header_parsed = True def source_name(self): """Return fancy name of file source""" return self._source_name() def __repr__(self): txt = f"{self.__class__.__name__}: {self.source_name()}\n" if self.header is not None: nb_block = self.block_count() txt += f"nb_block: {nb_block}\n" nb_seg = [self.segment_count(i) for i in range(nb_block)] txt += f"nb_segment: {nb_seg}\n" # signal streams v = [ s["name"] + f" (chans: {self.signal_channels_count(i)})" for i, s in enumerate(self.header["signal_streams"]) ] v = pprint_vector(v) txt += f"signal_streams: {v}\n" for k in ("signal_channels", "spike_channels", "event_channels"): ch = self.header[k] v = pprint_vector(self.header[k]["name"]) txt += f"{k}: {v}\n" return txt def _generate_minimal_annotations(self): """ Helper function that generates a nested dict for annotations. Must be called when these are Ok after self.header is done and thus when these functions return the correct values: * block_count() * segment_count() * signal_streams_count() * signal_channels_count() * spike_channels_count() * event_channels_count() There are several sources and kinds of annotations that will be forwarded to the neo.io level and used to enrich neo objects: * annotations of objects common across segments * signal_streams > neo.AnalogSignal annotations * signal_channels > neo.AnalogSignal array_annotations split by stream * spike_channels > neo.SpikeTrain * event_channels > neo.Event and neo.Epoch * annotations that depend of the block_id/segment_id of the object: * nested in raw_annotations['blocks'][block_index]['segments'][seg_index]['signals'] Usage after a call to this function we can do this to populate more annotations: raw_annotations['blocks'][block_index][ 'nickname'] = 'super block' raw_annotations['blocks'][block_index] ['segments']['important_key'] = 'important value' raw_annotations['blocks'][block_index] ['segments'][seg_index] ['signals']['nickname'] = 'super signals stream' raw_annotations['blocks'][block_index] ['segments'][seg_index] ['signals']['__array_annotations__'] ['channels_quality'] = ['bad', 'good', 'medium', 'good'] raw_annotations['blocks'][block_index] ['segments'][seg_index] ['spikes'][spike_chan]['nickname'] = 'super neuron' raw_annotations['blocks'][block_index] ['segments'][seg_index] ['spikes'][spike_chan] ['__array_annotations__']['spike_amplitudes'] = [-1.2, -10., ...] raw_annotations['blocks'][block_index] ['segments'][seg_index] ['events'][ev_chan]['nickname'] = 'super trigger' raw_annotations['blocks'][block_index] ['segments'][seg_index] ['events'][ev_chan] Z['__array_annotations__']['additional_label'] = ['A', 'B', 'A', 'C', ...] Theses annotations will be used at the neo.io API directly in objects. Standard annotation like name/id/file_origin are already generated here. """ signal_streams = self.header["signal_streams"] signal_channels = self.header["signal_channels"] spike_channels = self.header["spike_channels"] event_channels = self.header["event_channels"] # use for AnalogSignal.annotations and AnalogSignal.array_annotations signal_stream_annotations = [] for c in range(signal_streams.size): stream_id = signal_streams[c]["id"] channels = signal_channels[signal_channels["stream_id"] == stream_id] d = {} d["name"] = signal_streams["name"][c] d["stream_id"] = stream_id d["file_origin"] = self._source_name() d["__array_annotations__"] = {} for key in ("name", "id"): values = np.array([channels[key][chan] for chan in range(channels.size)]) d["__array_annotations__"]["channel_" + key + "s"] = values signal_stream_annotations.append(d) # used for SpikeTrain.annotations and SpikeTrain.array_annotations spike_annotations = [] for c in range(spike_channels.size): # use for Unit.annotations d = {} d["name"] = spike_channels["name"][c] d["id"] = spike_channels["id"][c] d["file_origin"] = self._source_name() d["__array_annotations__"] = {} spike_annotations.append(d) # used for Event/Epoch.annotations and Event/Epoch.array_annotations event_annotations = [] for c in range(event_channels.size): # not used in neo.io at the moment could useful one day d = {} d["name"] = event_channels["name"][c] d["id"] = event_channels["id"][c] d["file_origin"] = self._source_name() d["__array_annotations__"] = {} event_annotations.append(d) # duplicate this signal_stream_annotations/spike_annotations/event_annotations # across blocks and segments and create annotations ann = {} ann["blocks"] = [] for block_index in range(self.block_count()): d = {} d["file_origin"] = self.source_name() d["segments"] = [] ann["blocks"].append(d) for seg_index in range(self.segment_count(block_index)): d = {} d["file_origin"] = self.source_name() # copy nested d["signals"] = signal_stream_annotations.copy() d["spikes"] = spike_annotations.copy() d["events"] = event_annotations.copy() ann["blocks"][block_index]["segments"].append(d) self.raw_annotations = ann def _repr_annotations(self): txt = "Raw annotations\n" for block_index in range(self.block_count()): bl_a = self.raw_annotations["blocks"][block_index] txt += f"*Block {block_index}\n" for k, v in bl_a.items(): if k in ("segments",): continue txt += f" -{k}: {v}\n" for seg_index in range(self.segment_count(block_index)): seg_a = bl_a["segments"][seg_index] txt += f" *Segment {seg_index}\n" for k, v in seg_a.items(): if k in ( "signals", "spikes", "events", ): continue txt += f" -{k}: {v}\n" # annotations by channels for spikes/events/epochs for child in ( "signals", "events", "spikes", ): if child == "signals": n = self.header["signal_streams"].shape[0] else: n = self.header[child[:-1] + "_channels"].shape[0] for c in range(n): neo_name = {"signals": "AnalogSignal", "spikes": "SpikeTrain", "events": "Event/Epoch"}[child] txt += f" *{neo_name} {c}\n" child_a = seg_a[child][c] for k, v in child_a.items(): if k == "__array_annotations__": continue txt += f" -{k}: {v}\n" for k, values in child_a["__array_annotations__"].items(): values = ", ".join([str(v) for v in values[:4]]) values = "[ " + values + " ..." txt += f" -{k}: {values}\n" return txt def print_annotations(self): """Print formatted raw_annotations""" print(self._repr_annotations()) def block_count(self): """Returns the number of blocks""" return self.header["nb_block"] def segment_count(self, block_index: int): """ Returns count of segments for a given block Parameters ---------- block_index: int The index of the block to do the segment count for Returns ------- count: int The number of segments for a given block """ return self.header["nb_segment"][block_index] def signal_streams_count(self): """Return the number of signal streams. Same for all Blocks and Segments. """ return len(self.header["signal_streams"]) def signal_channels_count(self, stream_index: int): """Returns the number of signal channels for a given stream. This number is the same for all Blocks and Segments. Parameters ---------- stream_index: int the stream index in which to count the signal channels Returns ------- count: int the number of signal channels of a given stream """ stream_id = self.header["signal_streams"][stream_index]["id"] channels = self.header["signal_channels"] channels = channels[channels["stream_id"] == stream_id] return len(channels) def spike_channels_count(self): """Return the number of unit (aka spike) channels. Same for all Blocks and Segments. """ return len(self.header["spike_channels"]) def event_channels_count(self): """Return the number of event/epoch channels. Same for all Blocks and Segments. """ return len(self.header["event_channels"]) def segment_t_start(self, block_index: int, seg_index: int): """ Global t_start of a Segment Shared by all objects except for AnalogSignal. Parameters ---------- block_index: int The index of the block to find the segment t_start seg_index: int The index of the segment within the block_index in which to find the t_start Returns ------- t_start: float the time of global t_start of a segment within a block """ return self._segment_t_start(block_index, seg_index) def segment_t_stop(self, block_index, seg_index): """ Global t_stop of a Segment in s. Shared by all objects except for AnalogSignal. Parameters ---------- block_index: int The index of the block to find the segment t_start seg_index: int The index of the segment within the block_index in which to find the t_start Returns ------- t_stop: float the time of global t_stop of a segment within a block """ return self._segment_t_stop(block_index, seg_index) ### # signal and channel zone def _check_stream_signal_channel_characteristics(self): """ Check that all channels that belonging to the same stream_id have the same stream id and _common_sig_characteristics. These presently includes: * sampling_rate * units * dtype """ signal_streams = self.header["signal_streams"] signal_channels = self.header["signal_channels"] if signal_streams.size > 0: if signal_channels.size < 1: raise ValueError("Signal stream exists but there are no signal channels") for stream_index in range(signal_streams.size): stream_id = signal_streams[stream_index]["id"] mask = signal_channels["stream_id"] == stream_id characteristics = signal_channels[mask][_common_sig_characteristics] unique_characteristics = np.unique(characteristics) if unique_characteristics.size != 1: raise ValueError( f"Some channels in stream_id {stream_id} " f"do not have the same {_common_sig_characteristics} {unique_characteristics}" ) # also check that channel_id is unique inside a stream channel_ids = signal_channels[mask]["id"] if np.unique(channel_ids).size != channel_ids.size: raise ValueError(f"signal_channels do not have unique ids for stream {stream_index}") self._several_channel_groups = signal_streams.size > 1 def channel_name_to_index(self, stream_index: int, channel_names: list[str]): """ Inside a stream, transform channel_names to channel_indexes. Based on self.header['signal_channels'] channel_indexes are zero-based offsets within the stream Parameters ---------- stream_index: int The stream in which to convert channel_names to their respective channel_indexes channel_names: list[str] The channel names to convert to channel_indexes Returns ------- channel_indexes: np.array[int] the channel_indexes associated with the given channel_ids """ stream_id = self.header["signal_streams"][stream_index]["id"] mask = self.header["signal_channels"]["stream_id"] == stream_id signal_channels = self.header["signal_channels"][mask] chan_names = list(signal_channels["name"]) if signal_channels.size != np.unique(chan_names).size: raise ValueError("Channel names are not unique") channel_indexes = np.array([chan_names.index(name) for name in channel_names]) return channel_indexes def channel_id_to_index(self, stream_index: int, channel_ids: list[str]): """ Inside a stream, transform channel_ids to channel_indexes. Based on self.header['signal_channels'] channel_indexes are zero-based offsets within the stream Parameters ---------- stream_index: int the stream index in which to convert the channel_ids to channel_indexes channel_ids: list[str] the list of channel_ids to convert to channel_indexes Returns ------- channel_indexes: np.array[int] the channel_indexes associated with the given channel_ids """ # unique ids is already checked in _check_stream_signal_channel_characteristics stream_id = self.header["signal_streams"][stream_index]["id"] mask = self.header["signal_channels"]["stream_id"] == stream_id signal_channels = self.header["signal_channels"][mask] chan_ids = list(signal_channels["id"]) channel_indexes = np.array([chan_ids.index(chan_id) for chan_id in channel_ids]) return channel_indexes def _get_channel_indexes( self, stream_index: int, channel_indexes: list[int] | None, channel_names: list[str] | None, channel_ids: list[str] | None, ): """ Select channel_indexes for a stream based on channel_indexes/channel_names/channel_ids depending on which one is not None. Parameters ---------- stream_index: int, the stream index in which to get channel_indexes channel_indexes: list[int] | None the channel_indexes desired channel_names: list[str] | None the names of the channels to be converted to channel_indexes. Give this or channel_ids for conversion channel_ids: list[str] | None the ids of the channels to be converted to channel_indexes. Give this or channel_names for conversion Returns ------- channel_indexes: np.array[int] The desired channel_indexes for functions requiring channel_indexes """ if channel_indexes is None and channel_names is not None: channel_indexes = self.channel_name_to_index(stream_index, channel_names) elif channel_indexes is None and channel_ids is not None: channel_indexes = self.channel_id_to_index(stream_index, channel_ids) return channel_indexes def _get_stream_index_from_arg(self, stream_index_arg: int | None): """ Verifies the desired stream_index exists Parameters ---------- stream_index_arg: int | None, default: None The stream_index to verify If None checks if only one stream exists and then returns 0 if it is single stream Returns ------- stream_index: int The stream_index to be used for function requiring a stream_index """ if stream_index_arg is None: if self.header["signal_streams"].size != 1: raise ValueError("stream_index must be given for files with multiple streams") stream_index = 0 else: if stream_index_arg < 0 or stream_index_arg >= self.header["signal_streams"].size: raise ValueError(f"stream_index must be between 0 and {self.header['signal_streams'].size}") stream_index = stream_index_arg return stream_index def get_signal_size(self, block_index: int, seg_index: int, stream_index: int | None = None): """ Retrieves the length of a single section of the channels in a stream. Parameters ---------- block_index: int The desired block in which to get a signal size seg_index: int The desired segment of the block in which to get the signal size stream_index: int | None, default: None The optional stream index in which to determine signal size This is required for data with multiple streams Returns ------- signal_size: int The number of samples for a given signal within the desired block, segment, and stream """ stream_index = self._get_stream_index_from_arg(stream_index) return self._get_signal_size(block_index, seg_index, stream_index) def get_signal_t_start(self, block_index: int, seg_index: int, stream_index: int | None = None): """ Retrieves the t_start of a single section of the channels in a stream. Parameters ---------- block_index: int The desired block in which to get a t_start seg_index: int The desired segment of the block in which to get the t_start stream_index: int | None, default: None The optional stream index in which to determine t_start This is required for data with multiple streams Returns ------- signal_t_start: float The start time for a given signal within the desired block, segment, and stream """ stream_index = self._get_stream_index_from_arg(stream_index) return self._get_signal_t_start(block_index, seg_index, stream_index) def get_signal_sampling_rate(self, stream_index: int | None = None): """ Retrieves the sampling rate for a stream and all channels withinin that stream. Parameters ---------- stream_index: int | None, default: None The desired stream index in which to get the sampling_rate This is required for data with multiple streams Returns ------- sr: float The sampling rate of a given stream and all channels in that stream """ stream_index = self._get_stream_index_from_arg(stream_index) stream_id = self.header["signal_streams"][stream_index]["id"] mask = self.header["signal_channels"]["stream_id"] == stream_id signal_channels = self.header["signal_channels"][mask] sr = signal_channels[0]["sampling_rate"] return float(sr) def get_analogsignal_chunk( self, block_index: int = 0, seg_index: int = 0, i_start: int | None = None, i_stop: int | None = None, stream_index: int | None = None, channel_indexes: list[int] | None = None, channel_names: list[str] | None = None, channel_ids: list[str] | None = None, prefer_slice: bool = False, ): """ Returns a chunk of raw signal as a Numpy array. Parameters ---------- block_index: int, default: 0 The block with the desired analog signal seg_index: int, default: 0 The segment containing the desired analog signal i_start: int | None, default: None The index of the first sample (not time) of the desired analog signal i_stop: int | None, default: None The index of one past the last sample (not time) of the desired analog signal stream_index: int | None, default: None The index of the stream containing the channels to assess for the analog signal This is required for data with multiple streams channel_indexes: list[int] | np.array[int]| slice | None, default: None The list of indexes of channels to retrieve One of channel_indexes, channel_names, or channel_ids must be given channel_names: list[str] | None, default: None The list of channel names to retrieve One of channel_indexes, channel_names, or channel_ids must be given channel_ids: list[str] | None, default: None The list of channel_ids to retrieve One of channel_indexes, channel_names, or channel_ids must be given Returns ------- raw_chunk: np.array (n_samples, n_channels) The array with the raw signal samples Notes ----- Rows are the samples and columns are the channels The channels are chosen either by channel_names, if provided, otherwise by channel_ids, if provided, otherwise by channel_indexes, if provided, otherwise all channels are selected. Examples -------- # tetrode with 1 sec recording at sampling_rate = 1000. Hz >>> rawio_reader.parse_header() >>> raw_sigs = rawio_reader.get_analogsignal_chunk(block_index=2, seg_index=0, stream_index=0) >>> raw_sigs.shape (1000,4) # 1000 samples by 4 channels >>> raw_sigs.dtype 'int16' # returns the dtype from the recording itself # If we only want one electrode >>> raw_sigs_one_electrode = rawio_reader.get_analogsignal_chunk(block_index=2, seg_index=0, stream_index=0, channel_indexes=[0]) >>> raw_sigs_one_electrode.shape (1000,1) """ signal_streams = self.header["signal_streams"] signal_channels = self.header["signal_channels"] no_signal_streams = signal_streams.size == 0 no_channels = signal_channels.size == 0 if no_signal_streams or no_channels: error_message = ( "get_analogsignal_chunk can't be called on a file with no signal streams or channels." "Double check that your file contains signal streams and channels." ) raise AttributeError(error_message) stream_index = self._get_stream_index_from_arg(stream_index) channel_indexes = self._get_channel_indexes(stream_index, channel_indexes, channel_names, channel_ids) # some check on channel_indexes if isinstance(channel_indexes, list): channel_indexes = np.asarray(channel_indexes) if isinstance(channel_indexes, np.ndarray): if channel_indexes.dtype == "bool": if self.signal_channels_count(stream_index) != channel_indexes.size: raise ValueError( "If channel_indexes is a boolean it must have be the same length as the " f"number of channels {self.signal_channels_count(stream_index)}" ) (channel_indexes,) = np.nonzero(channel_indexes) if prefer_slice and isinstance(channel_indexes, np.ndarray): # Check if channel_indexes are contiguous and transform to slice argument if possible. # This is useful for memmap or hdf5 where providing a slice causes a lazy read, # rather than a list of indexes that make a copy (like numpy.take()). if np.all(np.diff(channel_indexes) == 1): channel_indexes = slice(channel_indexes[0], channel_indexes[-1] + 1) raw_chunk = self._get_analogsignal_chunk(block_index, seg_index, i_start, i_stop, stream_index, channel_indexes) return raw_chunk def rescale_signal_raw_to_float( self, raw_signal: np.ndarray, dtype: np.dtype = "float32", stream_index: int | None = None, channel_indexes: list[int] | None = None, channel_names: list[str] | None = None, channel_ids: list[str] | None = None, ): """ Rescales a chunk of raw signals which are provided as a Numpy array. These are normally returned by a call to get_analogsignal_chunk. Parameters ---------- raw_signal: np.array (n_samples, n_channels) The numpy array of samples with columns being samples for a single channel dtype: np.dype, default: "float32" The datatype for returning scaled samples, must be acceptable by the numpy dtype constructor stream_index: int | None, default: None The index of the stream containing the channels to assess channel_indexes: list[int], np.array[int], slice | None, default: None The list of indexes of channels to retrieve channel_names: list[str] | None, default: None The list of channel names to retrieve channel_ids: list[str] | None, default: None list of channel_ids to retrieve Returns ------- float_signal: np.array (n_samples, n_channels) The rescaled signal Notes ----- The channels are specified either by channel_names, if provided, otherwise by channel_ids, if provided, otherwise by channel_indexes, if provided, otherwise all channels are selected. These are rawio dependent because rescaling of the NumPy array requires the offset and gain stored within the header of the rawio Examples -------- # Once we have a `raw_sigs` using rawio.get_analogsignal_chunk() we can convert to voltages with a desired dtype # If we used `stream_index=0` with `get_analogsignal_chunk` we use `stream_index=0` here >>> float_sigs = rawio_reader.rescale_signal_raw_to_float(raw_signal=raw_sigs, dtype='float32', stream_index=0) >>> float_sigs.dtype 'float32' >>> float_sigs.shape (1000,4) >>> float_sigs.shape == raw_sigs.shape True """ stream_index = self._get_stream_index_from_arg(stream_index) channel_indexes = self._get_channel_indexes(stream_index, channel_indexes, channel_names, channel_ids) if channel_indexes is None: channel_indexes = slice(None) stream_id = self.header["signal_streams"][stream_index]["id"] mask = self.header["signal_channels"]["stream_id"] == stream_id channels = self.header["signal_channels"][mask] if channel_indexes is None: channel_indexes = slice(None) channels = channels[channel_indexes] float_signal = raw_signal.astype(dtype) if np.any(channels["gain"] != 1.0): float_signal *= channels["gain"] if np.any(channels["offset"] != 0.0): float_signal += channels["offset"] return float_signal # spiketrain and unit zone def spike_count(self, block_index: int = 0, seg_index: int = 0, spike_channel_index: int = 0): """ Returns the spike count for a given block, segment, and spike_channel_index Parameters ---------- block_index: int, default: 0 The block with the desired segment to assess seg_index: int, default: 0 The segment containing the desired section to assess spike_channel_index: int, default: 0 The spike_channel_index for assessing spike_count Returns ------- spike_count: int The number of spikes in the block and segment """ return self._spike_count(block_index, seg_index, spike_channel_index) def get_spike_timestamps( self, block_index: int = 0, seg_index: int = 0, spike_channel_index: int = 0, t_start: float | None = None, t_stop: float | None = None, ): """ Returns the spike_timestamps in samples (see note for dtype) Parameters ---------- block_index: int, default: 0 The block containing the section to get the spike timestamps seg_index: int, default: 0 The segment containing the section to get the spike timestamps spike_channel_index: int, default: 0 The channel in which to collect spike timestamps t_start: float | None, default: None The time in seconds for the start of the section to get spike timestamps None indicates to start at the beginning of the segment t_stop: float | None, default: None The time in seconds for the end of the section to get spike timestamps None indicates to end at the end of the segment Returns ------- timestamp: np.array The spike timestamps Notes ----- The timestamp datatype is as close to the format itself. Sometimes float/int32/int64. Sometimes it is the index on the signal but not always. The conversion to second or index_on_signal is done outside this method. Examples -------- # to look at block 1, segment 0, and channel 3 on a tetrode from 10 # seconds to 30 seconds we would do: >>> timestamps = rawio_reader.get_spike_timestamps(block_index=1, seg_index=0, spike_channel_index=3, t_start=10, t_stop=30) """ timestamp = self._get_spike_timestamps(block_index, seg_index, spike_channel_index, t_start, t_stop) return timestamp def rescale_spike_timestamp(self, spike_timestamps: np.ndarray, dtype: np.dtype = "float64"): """ Rescale spike timestamps from samples to seconds. Parameters ---------- spike_timestamps: np.ndarray The array containing the spike_timestamps to convert dtype: np.dtype, default: "float64" The dtype in which to convert the spike time in seconds. Must be accepted by the numpy.dtype constructor Returns ------- scaled_spike_timestamps: np.array The spiketimes in seconds Examples -------- # After running `get_spike_timestamps` and returning timestamps we can do the following: >>> scaled_spike_timestamps = rawio_reader.rescale_spike_timestamps(spike_timestamps=timestamps, dtype='float64') """ return self._rescale_spike_timestamp(spike_timestamps, dtype) # spiketrain waveform zone def get_spike_raw_waveforms( self, block_index: int = 0, seg_index: int = 0, spike_channel_index: int = 0, t_start: float | None = None, t_stop: float | None = None, ): """ Gets the waveforms for one channel within one segment of one block Parameters ---------- block_index: int, default: 0 The block containing the desired set of waveform data seg_index: int, default: 0 The segment containing the desired set of waveform data spike_channel_index: int, default: 0 The channel index on which to get waveform data t_start: float | None, default: None The time in seconds for the start of the section to get waveforms None indicates to start at the beginning of the segment t_stop: float | None, default: None The time in seconds for the end of the section to waveforms None indicates to end at the end of the segment Returns ------- wf: np.ndarray (nb_spike, nb_channel, nb_sample)) A NumPy array of spikes, channels and samples """ wf = self._get_spike_raw_waveforms(block_index, seg_index, spike_channel_index, t_start, t_stop) return wf def rescale_waveforms_to_float( self, raw_waveforms: np.ndarray, dtype: np.dtype = "float32", spike_channel_index: int = 0 ): """ Rescale waveforms to based on the rawio's waveform gain and waveform offset Parameters ---------- raw_waveforms: np.ndarray The array containing the spike_timestamps to convert dtype: np.dtype, default: "float64" The dtype in which to convert the spike time to. Must be accepted by the numpy.dtype constructor spike_channel_index: int, default: 0 The channel index of the desired channel to rescale Returns ------- float_waveforms: np.ndarray (nb_spikes, nb_channels, nb_samples) The scaled waveforms to the dtype specified by dtype """ wf_gain = self.header["spike_channels"]["wf_gain"][spike_channel_index] wf_offset = self.header["spike_channels"]["wf_offset"][spike_channel_index] float_waveforms = raw_waveforms.astype(dtype) if wf_gain != 1.0: float_waveforms *= wf_gain if wf_offset != 0.0: float_waveforms += wf_offset return float_waveforms # event and epoch zone def event_count(self, block_index: int = 0, seg_index: int = 0, event_channel_index: int = 0): """ Returns the count of events for a particular block, segment, and channel_index Parameters ---------- block_index: int, default: 0 The block in which to count the events seg_index: int, default: 0 The segment within the block given by block_index in which to count events event_channel_index: int, default: 0 The index of the channel in which to count events Returns ------- n_events: int The number of events in the given block, segment, and event_channel_index """ return self._event_count(block_index, seg_index, event_channel_index) def get_event_timestamps( self, block_index: int = 0, seg_index: int = 0, event_channel_index: int = 0, t_start: float | None = None, t_stop: float | None = None, ): """ Returns the event timestamps along with their labels and durations Parameters ---------- block_index: int, default: 0 The block in which to count the events seg_index: int, default: 0 The segment within the block given by block_index in which to count events event_channel_index: int, default: 0 The index of the channel in which to count events t_start: float | None, default: None The time in seconds for the start of the section to get waveforms None indicates to start at the beginning of the segment t_stop: float | None, default: None The time in seconds for the end of the section to waveforms None indicates to end at the end of the segment Returns ------- timestamp: np.array The timestamps of events (in samples) durations: np.array The durations of each event labels: np.array The labels of the events Notes ----- The timestamp datatype is as close to the format itself. Sometimes float/int32/int64. Sometimes it is the index on the signal but not always. The conversion to second or index_on_signal is done outside this method. Examples -------- # A given rawio reader that generates events data. For this example we will # look at Block 0, Segment 1, on Channel 1, with a start time at the beginning # of the segment and an end time of 5 minutes (300 s) >>> event_timestamps, durations, labels = rawio_reader.get_event_timestamps(block_index=0, seg_index=1, event_channel_index=1, t_start=None, t_stop=300) """ timestamp, durations, labels = self._get_event_timestamps( block_index, seg_index, event_channel_index, t_start, t_stop ) return timestamp, durations, labels def rescale_event_timestamp( self, event_timestamps: np.ndarray, dtype: np.dtype = "float64", event_channel_index: int = 0 ): """ Rescale event timestamps to seconds. Parameters ---------- event_timestamps: np.ndarray The array containing the event timestamps to convert dtype: np.dtype, default: "float64" The dtype in which to convert the event time in seconds. Must be accepted by the numpy.dtype constructor event_channel_index: int, default: 0 The channel index for scaling the events Returns ------- scaled_event_timestamps: np.array The scaled event timestamps in seconds Examples -------- # Using the event_timestamps from the `get_event_timestamps` function we can then scale from samples into # seconds using this `rescale_event_timestamp`. We use the same event_channel_index as used during the # `get_event_timestamps` >>> event_timestamps_seconds = rawio_reader.rescale_event_timestamp(event_timestamps=event_timestamps, dtype='float64', event_channel_index=1) """ return self._rescale_event_timestamp(event_timestamps, dtype, event_channel_index) def rescale_epoch_duration( self, raw_duration: np.ndarray, dtype: np.dtype = "float64", event_channel_index: int = 0 ): """ Rescales the epoch duration from samples to seconds Parameters ---------- raw_duration: np.ndarray The array containing the epoch times in samples dtype: np.dtype, default: "float64" The dtype in which to convert the spike time in seconds. Must be accepted by the numpy.dtype constructor event_channel_index: int, default: 0 The channel on which to index for scaling epochs Returns ------- scaled_epoch_durations: np.array The scaled epoch durations in seconds Examples -------- # In this example we use the durations obtained from running `get_event_timestamps` >>> duration_seconds = rawio_reader.rescale_epoch_duration(raw_durations=durations, dtype='float64', event_channel_index=0) """ return self._rescale_epoch_duration(raw_duration, dtype, event_channel_index) def setup_cache(self, cache_path: "home" | "same_as_resource", **init_kargs): try: import joblib except ImportError: raise ImportError("Using the RawIO cache needs joblib to be installed") if self.rawmode in ("one-file", "multi-file"): resource_name = self.filename elif self.rawmode == "one-dir": resource_name = self.dirname else: raise (NotImplementedError) if cache_path == "home": if sys.platform.startswith("win"): dirname = os.path.join(os.environ["APPDATA"], "neo_rawio_cache") elif sys.platform.startswith("darwin"): dirname = "~/Library/Application Support/neo_rawio_cache" else: dirname = os.path.expanduser("~/.config/neo_rawio_cache") dirname = os.path.join(dirname, self.__class__.__name__) if not os.path.exists(dirname): os.makedirs(dirname) elif cache_path == "same_as_resource": dirname = os.path.dirname(resource_name) else: if not os.path.exists(cache_path): raise ValueError("cache_path does not exist use 'home' or 'same_as_resource' to make this auto") # the hash of the resource (dir of file) is done with filename+datetime # TODO make something more sophisticated when rawmode='one-dir' that use all # filename and datetime d = dict(ressource_name=resource_name, mtime=os.path.getmtime(resource_name)) hash = joblib.hash(d, hash_name="md5") # name is constructed from the resource_name and the hash name = f"{os.path.basename(resource_name)}_{hash}" self.cache_filename = os.path.join(dirname, name) if os.path.exists(self.cache_filename): self.logger.warning(f"Use existing cache file {self.cache_filename}") self._cache = joblib.load(self.cache_filename) else: self.logger.warning(f"Create cache file {self.cache_filename}") self._cache = {} self.dump_cache() def add_in_cache(self, **kargs): if not self.use_cache: raise ValueError("Can not use add_in_cache if not using cache") self._cache.update(kargs) self.dump_cache() def dump_cache(self): if not self.use_cache: raise ValueError("Can not use dump_cache if not using cache") joblib.dump(self._cache, self.cache_filename) ################## # Functions to be implemented in IO below here def _parse_header(self): raise (NotImplementedError) # must call # self._generate_empty_annotations() def _source_name(self): raise (NotImplementedError) def _segment_t_start(self, block_index: int, seg_index: int): raise (NotImplementedError) def _segment_t_stop(self, block_index: int, seg_index: int): raise (NotImplementedError) ### # signal and channel zone def _get_signal_size(self, block_index: int, seg_index: int, stream_index: int): """ Return the size of a set of AnalogSignals indexed by channel_indexes. All channels indexed must have the same size and t_start. """ raise (NotImplementedError) def _get_signal_t_start(self, block_index: int, seg_index: int, stream_index: int): """ Return the t_start of a set of AnalogSignals indexed by channel_indexes. All channels indexed must have the same size and t_start. """ raise (NotImplementedError) def _get_analogsignal_chunk( self, block_index: int, seg_index: int, i_start: int | None, i_stop: int | None, stream_index: int, channel_indexes: list[int] | None, ): """ Return the samples from a set of AnalogSignals indexed by stream_index and channel_indexes (local index inner stream). RETURNS ------- array of samples, with each requested channel in a column """ raise (NotImplementedError) ### # spiketrain and unit zone def _spike_count(self, block_index: int, seg_index: int, spike_channel_index: int): raise (NotImplementedError) def _get_spike_timestamps( self, block_index: int, seg_index: int, spike_channel_index: int, t_start: float | None, t_stop: float | None ): raise (NotImplementedError) def _rescale_spike_timestamp(self, spike_timestamps: np.ndarray, dtype: np.dtype): raise (NotImplementedError) ### # spike waveforms zone def _get_spike_raw_waveforms( self, block_index: int, seg_index: int, spike_channel_index: int, t_start: float | None, t_stop: float | None ): raise (NotImplementedError) ### # event and epoch zone def _event_count(self, block_index: int, seg_index: int, event_channel_index: int): raise (NotImplementedError) def _get_event_timestamps( self, block_index: int, seg_index: int, event_channel_index: int, t_start: float | None, t_stop: float | None ): raise (NotImplementedError) def _rescale_event_timestamp(self, event_timestamps: np.ndarray, dtype: np.dtype): raise (NotImplementedError) def _rescale_epoch_duration(self, raw_duration: np.ndarray, dtype: np.dtype): raise (NotImplementedError) ### # buffer api zone # must be implemented if has_buffer_description_api=True def get_analogsignal_buffer_description(self, block_index: int = 0, seg_index: int = 0, buffer_id: str = None): if not self.has_buffer_description_api: raise ValueError("This reader do not support buffer_description API") descr = self._get_analogsignal_buffer_description(block_index, seg_index, buffer_id) return descr def _get_analogsignal_buffer_description(self, block_index, seg_index, buffer_id): raise (NotImplementedError) class BaseRawWithBufferApiIO(BaseRawIO): """ Generic class for reader that support "buffer api". In short reader that are internally based on: * np.memmap * hdf5 In theses cases _get_signal_size and _get_analogsignal_chunk are totaly generic and do not need to be implemented in the class. For this class sub classes must implements theses two dict: * self._buffer_descriptions[block_index][seg_index] = buffer_description * self._stream_buffer_slice[buffer_id] = None or slicer o indices """ def __init__(self, *arg, **kwargs): super().__init__(*arg, **kwargs) self._has_buffer_description_api = True def _get_signal_size(self, block_index, seg_index, stream_index): buffer_id = self.header["signal_streams"][stream_index]["buffer_id"] buffer_desc = self.get_analogsignal_buffer_description(block_index, seg_index, buffer_id) # some hdf5 revert teh buffer time_axis = buffer_desc.get("time_axis", 0) return buffer_desc["shape"][time_axis] def _get_analogsignal_chunk( self, block_index: int, seg_index: int, i_start: int | None, i_stop: int | None, stream_index: int, channel_indexes: list[int] | None, ): stream_id = self.header["signal_streams"][stream_index]["id"] buffer_id = self.header["signal_streams"][stream_index]["buffer_id"] buffer_slice = self._stream_buffer_slice[stream_id] buffer_desc = self.get_analogsignal_buffer_description(block_index, seg_index, buffer_id) i_start = i_start or 0 i_stop = i_stop or buffer_desc["shape"][0] if buffer_desc["type"] == "raw": # open files on demand and keep reference to opened file if not hasattr(self, "_memmap_analogsignal_buffers"): self._memmap_analogsignal_buffers = {} if block_index not in self._memmap_analogsignal_buffers: self._memmap_analogsignal_buffers[block_index] = {} if seg_index not in self._memmap_analogsignal_buffers[block_index]: self._memmap_analogsignal_buffers[block_index][seg_index] = {} if buffer_id not in self._memmap_analogsignal_buffers[block_index][seg_index]: fid = open(buffer_desc["file_path"], mode="rb") self._memmap_analogsignal_buffers[block_index][seg_index][buffer_id] = fid else: fid = self._memmap_analogsignal_buffers[block_index][seg_index][buffer_id] num_channels = buffer_desc["shape"][1] raw_sigs = get_memmap_chunk_from_opened_file( fid, num_channels, i_start, i_stop, np.dtype(buffer_desc["dtype"]), file_offset=buffer_desc["file_offset"], ) elif buffer_desc["type"] == "hdf5": # open files on demand and keep reference to opened file if not hasattr(self, "_hdf5_analogsignal_buffers"): self._hdf5_analogsignal_buffers = {} if block_index not in self._hdf5_analogsignal_buffers: self._hdf5_analogsignal_buffers[block_index] = {} if seg_index not in self._hdf5_analogsignal_buffers[block_index]: self._hdf5_analogsignal_buffers[block_index][seg_index] = {} if buffer_id not in self._hdf5_analogsignal_buffers[block_index][seg_index]: import h5py h5file = h5py.File(buffer_desc["file_path"], mode="r") self._hdf5_analogsignal_buffers[block_index][seg_index][buffer_id] = h5file else: h5file = self._hdf5_analogsignal_buffers[block_index][seg_index][buffer_id] hdf5_path = buffer_desc["hdf5_path"] full_raw_sigs = h5file[hdf5_path] time_axis = buffer_desc.get("time_axis", 0) if time_axis == 0: raw_sigs = full_raw_sigs[i_start:i_stop, :] elif time_axis == 1: raw_sigs = full_raw_sigs[:, i_start:i_stop].T else: raise RuntimeError("Should never happen") if buffer_slice is not None: raw_sigs = raw_sigs[:, buffer_slice] else: raise NotImplementedError() # this is a pre slicing when the stream do not contain all channels (for instance spikeglx when load_sync_channel=False) if buffer_slice is not None: raw_sigs = raw_sigs[:, buffer_slice] # channel slice requested if channel_indexes is not None: raw_sigs = raw_sigs[:, channel_indexes] return raw_sigs def __del__(self): if hasattr(self, "_memmap_analogsignal_buffers"): for block_index in self._memmap_analogsignal_buffers.keys(): for seg_index in self._memmap_analogsignal_buffers[block_index].keys(): for buffer_id, fid in self._memmap_analogsignal_buffers[block_index][seg_index].items(): fid.close() del self._memmap_analogsignal_buffers if hasattr(self, "_hdf5_analogsignal_buffers"): for block_index in self._hdf5_analogsignal_buffers.keys(): for seg_index in self._hdf5_analogsignal_buffers[block_index].keys(): for buffer_id, h5_file in self._hdf5_analogsignal_buffers[block_index][seg_index].items(): h5_file.close() del self._hdf5_analogsignal_buffers def pprint_vector(vector, lim: int = 8): vector = np.asarray(vector) if vector.ndim != 1: raise ValueError(f"`vector` must have a dimension of 1 and not {vector.ndim}") if len(vector) > lim: part1 = ", ".join(e for e in vector[: lim // 2]) part2 = " , ".join(e for e in vector[-lim // 2 :]) txt = f"[{part1} ... {part2}]" else: part1 = ", ".join(e for e in vector) txt = f"[{part1}]" return txt ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/bci2000rawio.py0000644000175100001660000004411714743453644016362 0ustar00runnerdocker""" BCI2000RawIO is a class to read BCI2000 .dat files. https://www.bci2000.org/mediawiki/index.php/Technical_Reference:BCI2000_File_Format Note : BCI2000RawIO cannot implemented using has_buffer_description_api because the buffer is not compact. The buffer of signals is not compact (has some interleaved state uint in between channels) """ import numpy as np import re try: from urllib.parse import unquote except ImportError: from urllib import url2pathname as unquote from .baserawio import ( BaseRawIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) from neo.core import NeoReadWriteError class BCI2000RawIO(BaseRawIO): """ Class for reading data from a BCI2000 .dat file, either version 1.0 or 1.1 Parameters ---------- filename: str, default: '' The *.dat recorded by BCI2000 """ extensions = ["dat"] rawmode = "one-file" def __init__(self, filename=""): BaseRawIO.__init__(self) self.filename = filename self._my_events = None def _source_name(self): return self.filename def _parse_header(self): file_info, state_defs, param_defs = parse_bci2000_header(self.filename) self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [1] # one unique stream but no buffer because channels are not compact stream_id = "0" buffer_id = "" signal_buffers = np.array([], dtype=_signal_buffer_dtype) signal_streams = np.array([("Signals", stream_id, buffer_id)], dtype=_signal_stream_dtype) self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams sig_channels = [] for chan_ix in range(file_info["SourceCh"]): if "ChannelNames" in param_defs and isinstance(param_defs["ChannelNames"]["value"], (list, tuple)): ch_name = param_defs["ChannelNames"]["value"][chan_ix] else: ch_name = "ch" + str(chan_ix) chan_id = str(chan_ix + 1) sr = param_defs["SamplingRate"]["value"] # Hz dtype = file_info["DataFormat"] units = "uV" gain = param_defs["SourceChGain"]["value"][chan_ix] if isinstance(gain, str): r = re.findall(r"(\d+)(\D+)", gain) # some files have strange units attached to gain # in that case it is ignored if len(r) == 1: gain = r[0][0] gain = float(gain) offset = param_defs["SourceChOffset"]["value"][chan_ix] if isinstance(offset, str): offset = float(offset) sig_channels.append((ch_name, chan_id, sr, dtype, units, gain, offset, stream_id, buffer_id)) self.header["signal_channels"] = np.array(sig_channels, dtype=_signal_channel_dtype) self.header["spike_channels"] = np.array([], dtype=_spike_channel_dtype) # creating event channel for each state variable event_channels = [] for st_ix, st_tup in enumerate(state_defs): event_channels.append((st_tup[0], "ev_" + str(st_ix), "event")) self.header["event_channels"] = np.array(event_channels, dtype=_event_channel_dtype) # Add annotations. # Generates basic annotations in nested dict self.raw_annotations self._generate_minimal_annotations() self.raw_annotations["blocks"][0].update({"file_info": file_info, "param_defs": param_defs}) event_annotations = self.raw_annotations["blocks"][0]["segments"][0]["events"] for ev_ix, ev_dict in enumerate(event_annotations): ev_dict.update( { "length": state_defs[ev_ix][1], "startVal": state_defs[ev_ix][2], "bytePos": state_defs[ev_ix][3], "bitPos": state_defs[ev_ix][4], } ) import time time_formats = ["%a %b %d %H:%M:%S %Y", "%Y-%m-%dT%H:%M:%S"] try: self._global_time = time.mktime(time.strptime(param_defs["StorageTime"]["value"], time_formats[0])) except: self._global_time = time.mktime(time.strptime(param_defs["StorageTime"]["value"], time_formats[1])) # Save variables to make it easier to load the binary data. self._read_info = { "header_len": file_info["HeaderLen"], "n_chans": file_info["SourceCh"], "sample_dtype": {"int16": np.int16, "int32": np.int32, "float32": np.float32}.get(file_info["DataFormat"]), "state_vec_len": file_info["StatevectorLen"], "sampling_rate": param_defs["SamplingRate"]["value"], } # Calculate the dtype for a single timestamp of data. This contains the data + statevector self._read_info["line_dtype"] = [ ("raw_vector", self._read_info["sample_dtype"], self._read_info["n_chans"]), ("state_vector", np.uint8, self._read_info["state_vec_len"]), ] import os self._read_info["n_samps"] = int( (os.stat(self.filename).st_size - file_info["HeaderLen"]) / np.dtype(self._read_info["line_dtype"]).itemsize ) # memmap is fast so we can get the data ready for reading now. self._memmap = np.memmap( self.filename, dtype=self._read_info["line_dtype"], offset=self._read_info["header_len"], mode="r" ) def _segment_t_start(self, block_index, seg_index): return 0.0 def _segment_t_stop(self, block_index, seg_index): return self._read_info["n_samps"] / self._read_info["sampling_rate"] def _get_signal_size(self, block_index, seg_index, stream_index): if stream_index != 0: raise ValueError("`stream_index` must be 0") return self._read_info["n_samps"] def _get_signal_t_start(self, block_index, seg_index, channel_indexes): return 0.0 def _get_analogsignal_chunk(self, block_index, seg_index, i_start, i_stop, stream_index, channel_indexes): if stream_index != 0: raise ValueError("`stream_index` must be 0") if i_start is None: i_start = 0 if i_stop is None: i_stop = self._read_info["n_samps"] if (i_start < 0) or (i_start > self._read_info["n_samps"]): raise ValueError("`i_start` is outside of data range") if (i_stop < 0) or (i_stop > self._read_info["n_samps"]): raise ValueError("`i_stop` is outside of data range") if channel_indexes is None: channel_indexes = np.arange(self.header["signal_channels"].size) return self._memmap["raw_vector"][i_start:i_stop, channel_indexes] def _spike_count(self, block_index, seg_index, unit_index): return 0 def _get_spike_timestamps(self, block_index, seg_index, unit_index, t_start, t_stop): return None def _rescale_spike_timestamp(self, spike_timestamps, dtype): return None def _get_spike_raw_waveforms(self, block_index, seg_index, unit_index, t_start, t_stop): return None def _event_count(self, block_index, seg_index, event_channel_index): return self._event_arrays_list[event_channel_index][0].shape[0] def _get_event_timestamps(self, block_index, seg_index, event_channel_index, t_start, t_stop): # Return 3 numpy arrays: timestamp, durations, labels # durations must be None for 'event' # label must a dtype ='U' ts, dur, labels = self._event_arrays_list[event_channel_index] # seg_t_start = self._segment_t_start(block_index, seg_index) keep = np.ones(ts.shape, dtype=bool) if t_start is not None: keep = np.logical_and(keep, ts >= t_start) if t_stop is not None: keep = np.logical_and(keep, ts <= t_stop) return ts[keep], dur[keep], labels[keep] def _rescale_event_timestamp(self, event_timestamps, dtype, event_channel_index): event_times = (event_timestamps / float(self._read_info["sampling_rate"])).astype(dtype) return event_times def _rescale_epoch_duration(self, raw_duration, dtype, event_channel_index): durations = (raw_duration / float(self._read_info["sampling_rate"])).astype(dtype) return durations @property def _event_arrays_list(self): if self._my_events is None: event_annotations = self.raw_annotations["blocks"][0]["segments"][0]["events"] self._my_events = [] for event_channel_index in range(self.event_channels_count()): sd = event_annotations[event_channel_index] ev_times = durs = vals = np.array([]) # Skip these big but mostly useless (?) states. if sd["name"] not in ["SourceTime", "StimulusTime"]: # Determine which bytes of self._memmap['state_vector'] are needed. nbytes = int(np.ceil((sd["bitPos"] + sd["length"]) / 8)) byte_slice = slice(sd["bytePos"], sd["bytePos"] + nbytes) # Then determine how to mask those bytes to get only the needed bits. bit_mask = np.array([255] * nbytes, dtype=np.uint8) bit_mask[0] &= 255 & (255 << sd["bitPos"]) # Fix the mask for the first byte extra_bits = 8 - (sd["bitPos"] + sd["length"]) % 8 bit_mask[-1] &= 255 & (255 >> extra_bits) # Fix the mask for the last byte # When converting to an int, we need to know which integer type it will become n_max_bytes = 1 << (nbytes - 1).bit_length() view_type = {1: np.int8, 2: np.int16, 4: np.int32, 8: np.int64}.get(n_max_bytes) # Slice and mask the data masked_byte_array = self._memmap["state_vector"][:, byte_slice] & bit_mask # Convert byte array to a vector of ints: # pad to give even columns then view as larger int type state_vec = np.pad(masked_byte_array, (0, n_max_bytes - nbytes), "constant").view(dtype=view_type) state_vec = np.right_shift(state_vec, sd["bitPos"])[:, 0] # In the state vector, find 'events' whenever the state changes st_ch_ix = np.where(np.hstack((0, np.diff(state_vec))) != 0)[0] # event inds if len(st_ch_ix) > 0: ev_times = st_ch_ix durs = np.asarray([None] * len(st_ch_ix)) # np.hstack((np.diff(st_ch_ix), len(state_vec) - st_ch_ix[-1])) vals = np.char.mod("%d", state_vec[st_ch_ix]) # event val, string'd self._my_events.append([ev_times, durs, vals.astype("U")]) return self._my_events def parse_bci2000_header(filename): # typically we want parameter values in Hz, seconds, or microvolts. scales_dict = { "hz": 1, "khz": 1000, "mhz": 1000000, "uv": 1, "muv": 1, "mv": 1000, "v": 1000000, "s": 1, "us": 0.000001, "mus": 0.000001, "ms": 0.001, "min": 60, "sec": 1, "usec": 0.000001, "musec": 0.000001, "msec": 0.001, } def rescale_value(param_val, data_type): unit_str = "" if param_val.lower().startswith("0x"): param_val = int(param_val, 16) elif data_type in ["int", "float"]: matches = re.match(r"(-*\d+)(\w*)", param_val) if matches is not None: # Can be None for % in def, min, max vals param_val, unit_str = matches.group(1), matches.group(2) param_val = int(param_val) if data_type == "int" else float(param_val) if len(unit_str) > 0: param_val *= scales_dict.get(unit_str.lower(), 1) else: param_val = unquote(param_val) return param_val, unit_str def parse_dimensions(param_list): num_els = param_list.pop(0) # Sometimes the number of elements isn't given, # but the list of element labels is wrapped with {} if num_els == "{": num_els = param_list.index("}") el_labels = [unquote(param_list.pop(0)) for x in range(num_els)] param_list.pop(0) # Remove the '}' else: num_els = int(num_els) el_labels = [str(ix) for ix in range(num_els)] return num_els, el_labels with open(filename, "rb") as fid: # Parse the file header (plain text) # The first line contains basic information which we store in a dictionary. temp = fid.readline().decode("utf8").split() keys = [k.rstrip("=") for k in temp[::2]] vals = temp[1::2] # Insert default version and format file_info = {"BCI2000V": 1.0, "DataFormat": "int16"} file_info.update(**dict(zip(keys, vals))) # From string to float/int file_info["BCI2000V"] = float(file_info["BCI2000V"]) for k in ["HeaderLen", "SourceCh", "StatevectorLen"]: if k in file_info: file_info[k] = int(file_info[k]) # The next lines contain state vector definitions. temp = fid.readline().decode("utf8").strip() if temp != "[ State Vector Definition ]": raise NeoReadWriteError(f"State definitions not found in header {filename}") state_defs = [] state_def_dtype = [("name", "a64"), ("length", int), ("startVal", int), ("bytePos", int), ("bitPos", int)] while True: temp = fid.readline().decode("utf8").strip() if len(temp) == 0 or temp[0] == "[": # Presence of '[' signifies new section. break temp = temp.split() state_defs.append((temp[0], int(temp[1]), int(temp[2]), int(temp[3]), int(temp[4]))) state_defs = np.array(state_defs, dtype=state_def_dtype) # The next lines contain parameter definitions. # There are many, and their formatting can be complicated. if temp != "[ Parameter Definition ]": raise NeoReadWriteError(f"Parameter definitions not found in header {filename}") param_defs = {} while True: temp = fid.readline().decode("utf8") if fid.tell() >= file_info["HeaderLen"]: # End of header. break if len(temp.strip()) == 0: continue # Skip empty lines # Everything after the '//' is a comment. temp = temp.strip().split("//", 1) param_def = {"comment": temp[1].strip() if len(temp) > 1 else ""} # Parse the parameter definition. Generally it is sec:cat:name dtype name param_value+ temp = temp[0].split() param_def.update({"section_category_name": [unquote(x) for x in temp.pop(0).split(":")]}) dtype = temp.pop(0) param_name = unquote(temp.pop(0).rstrip("=")) # Parse the rest. Parse method depends on the dtype param_value, units = None, None if dtype in ("int", "float"): param_value = temp.pop(0) if param_value == "auto": param_value = np.nan units = "" else: param_value, units = rescale_value(param_value, dtype) elif dtype in ("string", "variant"): param_value = unquote(temp.pop(0)) elif dtype.endswith("list"): # e.g., intlist, stringlist, floatlist, list dtype = dtype[:-4] # The list parameter values will begin with either # an int to specify the number of elements # or a list of labels surrounded by { }. num_elements, element_labels = parse_dimensions(temp) # This will pop off info. param_def.update({"element_labels": element_labels}) pv_un = [rescale_value(pv, dtype) for pv in temp[:num_elements]] if len(pv_un) > 0: param_value, units = zip(*pv_un) else: param_value, units = np.nan, "" temp = temp[num_elements:] # Sometimes an element list will be a list of ints even though # the element_type is '' (str)... # This usually happens for known parameters, such as SourceChOffset, # that can be dealt with explicitly later. elif dtype.endswith("matrix"): dtype = dtype[:-6] # The parameter values will be preceded by two dimension descriptors, # first rows then columns. Each dimension might be described by an # int or a list of labels surrounded by {} n_rows, row_labels = parse_dimensions(temp) n_cols, col_labels = parse_dimensions(temp) param_def.update({"row_labels": row_labels, "col_labels": col_labels}) param_value = [] units = [] for row_ix in range(n_rows): cols = [] for col_ix in range(n_cols): col_val, _units = rescale_value(temp[row_ix * n_cols + col_ix], dtype) cols.append(col_val) units.append(_units) param_value.append(cols) temp = temp[n_rows * n_cols :] param_def.update({"value": param_value, "units": units, "dtype": dtype}) # At the end of the parameter definition, we might get # default, min, max values for the parameter. temp.reverse() if len(temp): param_def.update({"max_val": rescale_value(temp.pop(0), dtype)}) if len(temp): param_def.update({"min_val": rescale_value(temp.pop(0), dtype)}) if len(temp): param_def.update({"default_val": rescale_value(temp.pop(0), dtype)}) param_defs.update({param_name: param_def}) # End parameter block # Outdent to close file return file_info, state_defs, param_defs ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/biocamrawio.py0000644000175100001660000002626714743453644016563 0ustar00runnerdocker""" Class for reading data from a 3-brain Biocam system. See: https://www.3brain.com/products/single-well/biocam-x Authors: Alessio Buccino, Robert Wolff """ import json import numpy as np from .baserawio import ( BaseRawIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) from neo.core import NeoReadWriteError class BiocamRawIO(BaseRawIO): """ Class for reading data from a Biocam h5 file. Parameters ---------- filename: str, default: '' The *.h5 file to be read Examples -------- >>> import neo.rawio >>> r = neo.rawio.BiocamRawIO(filename='biocam.h5') >>> r.parse_header() >>> print(r) >>> raw_chunk = r.get_analogsignal_chunk(block_index=0, seg_index=0, i_start=0, i_stop=1024, channel_names=channel_names) >>> float_chunk = r.rescale_signal_raw_to_float(raw_chunk, dtype='float64', channel_indexes=[0, 3, 6]) """ extensions = ["h5", "brw"] rawmode = "one-file" def __init__(self, filename=""): BaseRawIO.__init__(self) self.filename = filename def _source_name(self): return self.filename def _parse_header(self): self._header_dict = open_biocam_file_header(self.filename) self._num_channels = self._header_dict["num_channels"] self._num_frames = self._header_dict["num_frames"] self._sampling_rate = self._header_dict["sampling_rate"] self._filehandle = self._header_dict["file_handle"] self._read_function = self._header_dict["read_function"] self._channels = self._header_dict["channels"] gain = self._header_dict["gain"] offset = self._header_dict["offset"] # buffer concept cannot be used in this reader because of too complicated dtype across version signal_buffers = np.array([], dtype=_signal_stream_dtype) signal_streams = np.array([("Signals", "0", "")], dtype=_signal_stream_dtype) sig_channels = [] for c, chan in enumerate(self._channels): ch_name = f"ch{chan[0]}-{chan[1]}" chan_id = str(c + 1) sr = self._sampling_rate # Hz dtype = "uint16" units = "uV" gain = gain offset = offset stream_id = "0" buffer_id = "" sig_channels.append((ch_name, chan_id, sr, dtype, units, gain, offset, stream_id, buffer_id)) sig_channels = np.array(sig_channels, dtype=_signal_channel_dtype) # No events event_channels = [] event_channels = np.array(event_channels, dtype=_event_channel_dtype) # No spikes spike_channels = [] spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [1] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = sig_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels self._generate_minimal_annotations() def _segment_t_start(self, block_index, seg_index): all_starts = [[0.0]] return all_starts[block_index][seg_index] def _segment_t_stop(self, block_index, seg_index): t_stop = self._num_frames / self._sampling_rate all_stops = [[t_stop]] return all_stops[block_index][seg_index] def _get_signal_size(self, block_index, seg_index, stream_index): if stream_index != 0: raise ValueError("`stream_index` must be 0") return self._num_frames def _get_signal_t_start(self, block_index, seg_index, stream_index): if stream_index != 0: raise ValueError("`stream_index must be 0") return self._segment_t_start(block_index, seg_index) def _get_analogsignal_chunk(self, block_index, seg_index, i_start, i_stop, stream_index, channel_indexes): if i_start is None: i_start = 0 if i_stop is None: i_stop = self._num_frames # read functions are different based on the version of biocam data = self._read_function(self._filehandle, i_start, i_stop, self._num_channels) # older style data returns array of (n_samples, n_channels), should be a view # but if memory issues come up we should doublecheck out how the file is being stored if data.ndim > 1: if channel_indexes is None: channel_indexes = slice(None) sig_chunk = data[:, channel_indexes] # newer style data returns an initial flat array (n_samples * n_channels) # we iterate through channels rather than slicing # Due to the fact that Neo and SpikeInterface tend to prefer slices we need to add # some careful checks around slicing of None in the case we need to iterate through # channels. First check if None. Then check if slice and only if slice check that it is slice(None) else: if channel_indexes is None: channel_indexes = [ch for ch in range(self._num_channels)] elif isinstance(channel_indexes, slice): start = channel_indexes.start or 0 stop = channel_indexes.stop or self._num_channels step = channel_indexes.step or 1 channel_indexes = [ch for ch in range(start, stop, step)] sig_chunk = np.zeros((i_stop - i_start, len(channel_indexes)), dtype=data.dtype) # iterate through channels to prevent loading all channels into memory which can cause # memory exhaustion. See https://github.com/SpikeInterface/spikeinterface/issues/3303 for index, channel_index in enumerate(channel_indexes): sig_chunk[:, index] = data[channel_index :: self._num_channels] return sig_chunk def open_biocam_file_header(filename) -> dict: """Open a Biocam hdf5 file, read and return the recording info, pick the correct method to access raw data, and return this to the caller Parameters ---------- filename: str The file to be parsed Returns ------- dict The information necessary to read a biocam file (gain, n_samples, n_channels, etc).""" import h5py rf = h5py.File(filename, "r") if "3BRecInfo" in rf.keys(): # brw v3.x # Read recording variables rec_vars = rf.require_group("3BRecInfo/3BRecVars/") bit_depth = rec_vars["BitDepth"][0] max_uv = rec_vars["MaxVolt"][0] min_uv = rec_vars["MinVolt"][0] num_frames = rec_vars["NRecFrames"][0] sampling_rate = rec_vars["SamplingRate"][0] signal_inv = rec_vars["SignalInversion"][0] # Get the actual number of channels used in the recording file_format = rf["3BData"].attrs.get("Version", None) format_100 = False if file_format == 100: num_channels = len(rf["3BData/Raw"][0]) format_100 = True elif file_format in (101, 102) or file_format is None: num_channels = int(rf["3BData/Raw"].shape[0] / num_frames) else: raise NeoReadWriteError("Unknown data file format.") # get channels channels = rf["3BRecInfo/3BMeaStreams/Raw/Chs"][:] # determine correct function to read data if format_100: if signal_inv == 1: read_function = readHDF5t_100 elif signal_inv == -1: read_function = readHDF5t_100_i else: raise NeoReadWriteError("Unknown signal inversion") else: if signal_inv == 1: read_function = readHDF5t_101 elif signal_inv == -1: read_function = readHDF5t_101_i else: raise NeoReadWriteError("Unknown signal inversion") gain = (max_uv - min_uv) / (2**bit_depth) offset = min_uv return dict( file_handle=rf, num_frames=num_frames, sampling_rate=sampling_rate, num_channels=num_channels, channels=channels, file_format=file_format, signal_inv=signal_inv, read_function=read_function, gain=gain, offset=offset, ) else: # brw v4.x # Read recording variables experiment_settings = json.JSONDecoder().decode(rf["ExperimentSettings"][0].decode()) max_uv = experiment_settings["ValueConverter"]["MaxAnalogValue"] min_uv = experiment_settings["ValueConverter"]["MinAnalogValue"] max_digital = experiment_settings["ValueConverter"]["MaxDigitalValue"] min_digital = experiment_settings["ValueConverter"]["MinDigitalValue"] scale_factor = experiment_settings["ValueConverter"]["ScaleFactor"] sampling_rate = experiment_settings["TimeConverter"]["FrameRate"] num_channels = None for key in rf: if key[:5] == "Well_": num_channels = len(rf[key]["StoredChIdxs"]) if len(rf[key]["Raw"]) % num_channels: raise NeoReadWriteError(f"Length of raw data array is not multiple of channel number in {key}") num_frames = len(rf[key]["Raw"]) // num_channels break if num_channels is not None: num_channels_x = num_channels_y = int(np.sqrt(num_channels)) else: raise NeoReadWriteError("No Well found in the file") if num_channels_x * num_channels_y != num_channels: raise NeoReadWriteError(f"Cannot determine structure of the MEA plate with {num_channels} channels") channels = 1 + np.concatenate(np.transpose(np.meshgrid(range(num_channels_x), range(num_channels_y)))) gain = scale_factor * (max_uv - min_uv) / (max_digital - min_digital) offset = min_uv read_function = readHDF5t_brw4 return dict( file_handle=rf, num_frames=num_frames, sampling_rate=sampling_rate, num_channels=num_channels, channels=channels, read_function=read_function, gain=gain, offset=offset, ) ###################################################################### # Helper functions to obtain the raw data split by Biocam version. # return the full array for the old datasets def readHDF5t_100(rf, t0, t1, nch): return rf["3BData/Raw"][t0:t1] def readHDF5t_100_i(rf, t0, t1, nch): return 4096 - rf["3BData/Raw"][t0:t1] # return flat array that we will iterate through def readHDF5t_101(rf, t0, t1, nch): return rf["3BData/Raw"][nch * t0 : nch * t1] def readHDF5t_101_i(rf, t0, t1, nch): return 4096 - rf["3BData/Raw"][nch * t0 : nch * t1] def readHDF5t_brw4(rf, t0, t1, nch): for key in rf: if key[:5] == "Well_": return rf[key]["Raw"][nch * t0 : nch * t1] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/blackrockrawio.py0000644000175100001660000026376614743453644017273 0ustar00runnerdocker""" Module for reading data from files in the Blackrock in raw format. This work is based on: * Chris Rodgers - first version * Michael Denker, Lyuba Zehl - second version * Samuel Garcia - third version * Lyuba Zehl, Michael Denker - fourth version * Samuel Garcia, Julia Srenger - fifth version * Chadwick Boulay - FileSpec 3.0 and 3.0-PTP This IO supports reading only. This IO is able to read: * the nev file which contains spikes * ns1, ns2, .., ns6 files that contain signals at different sampling rates This IO can handle the following Blackrock file specifications: * 2.1 * 2.2 * 2.3 * 3.0 * 3.0 with PTP timestamps (Gemini systems) The neural data channels are 1 - 128. The analog inputs are 129 - 144. (129 - 137 AC coupled, 138 - 144 DC coupled) spike- and event-data; 30000 Hz in NEV file. "ns1": "analog data: 500 Hz", "ns2": "analog data: 1000 Hz", "ns3": "analog data: 2000 Hz", "ns4": "analog data: 10000 Hz", "ns5": "analog data: 30000 Hz", "ns6": "analog data: 30000 Hz (no digital filter)" The possible file extensions of the Cerebus system and their content: ns1: contains analog data; sampled at 500 Hz (+ digital filters) ns2: contains analog data; sampled at 1000 Hz (+ digital filters) ns3: contains analog data; sampled at 2000 Hz (+ digital filters) ns4: contains analog data; sampled at 10000 Hz (+ digital filters) ns5: contains analog data; sampled at 30000 Hz (+ digital filters) ns6: contains analog data; sampled at 30000 Hz (no digital filters) nev: contains spike- and event-data; sampled at 30000 Hz sif: contains institution and patient info (XML) ccf: contains Cerebus configurations TODO: * videosync events (file spec 2.3) * tracking events (file spec 2.3) * buttontrigger events (file spec 2.3) * config events (file spec 2.3) * check left sweep settings of Blackrock * check nsx offsets (file spec 2.1) * add info of nev ext header (NSASEXEX) to non-neural events (file spec 2.1 and 2.2) * read sif file information * read ccf file information * fix reading of periodic sampling events (non-neural event type) (file spec 2.1 and 2.2) """ import datetime import os import re import warnings import math import numpy as np import quantities as pq from .baserawio import ( BaseRawIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) from neo.core import NeoReadWriteError class BlackrockRawIO(BaseRawIO): """ Class for reading data in from a file set recorded by the Blackrock (Cerebus) recording system. Upon initialization, the class is linked to the available set of Blackrock files. Parameters ---------- filename: str, default: '' File name (without extension) of the set of Blackrock files to associate with. Any .nsX or .nev, .sif, or .ccf extensions are ignored when parsing this parameter. nsx_override: str | None, default: None File name of the .nsX files (without extension). If None, filename is used. nev_override: str | None, default: None File name of the .nev file (without extension). If None, filename is used. nsx_to_load: int | list | 'max' | 'all' | None, default: None IDs of nsX file from which to load data, e.g., if set to 5 only data from the ns5 file are loaded. If 'all', then all nsX will be loaded. Contrary to previous version of the IO (<0.7), nsx_to_load must be set at the init before parse_header(). load_nev: bool, default: True Load (or not) events/spikes by ignoring or not the nev file. Notes ----- * Note: This routine will handle files according to specification 2.1, 2.2, 2.3, 3.0 and 3.0-ptp. Recording pauses that may occur in file specifications 2.2 and 2.3 are automatically extracted and the data set is split into different segments. * The Blackrock data format consists not of a single file, but a set of different files. This constructor associates itself with a set of files that constitute a common data set. By default, all files belonging to the file set have the same base name, but different extensions. However, by using the override parameters, individual filenames can be set. Examples -------- >>> import neo.rawio >>> # Inspect a set of file consisting of files FileSpec2.3001.ns5 and FileSpec2.3001.nev >>> reader = neo.rawio.BlackrockRawIO(filename='FileSpec2.3001', nsx_to_load=5) >>> reader.parse_header() >>> print(reader) """ extensions = ["ns" + str(_) for _ in range(1, 7)] extensions.extend(["nev", "sif", "ccf"]) # 'sif', 'ccf' not yet supported rawmode = "multi-file" def __init__( self, filename=None, nsx_override=None, nev_override=None, nsx_to_load=None, load_nev=True, verbose=False ): """ Initialize the BlackrockIO class. """ BaseRawIO.__init__(self) self.filename = str(filename) # remove extension from base _filenames for ext in self.extensions: if self.filename.endswith(os.path.extsep + ext): self.filename = self.filename.replace(os.path.extsep + ext, "") self.nsx_to_load = nsx_to_load # remove extensions from overrides self._filenames = {} if nsx_override: self._filenames["nsx"] = re.sub(os.path.extsep + "ns[1,2,3,4,5,6]$", "", nsx_override) else: self._filenames["nsx"] = self.filename if nev_override: self._filenames["nev"] = re.sub(os.path.extsep + "nev$", "", nev_override) else: self._filenames["nev"] = self.filename self._filenames["sif"] = self.filename self._filenames["ccf"] = self.filename # check which files are available self._avail_files = dict.fromkeys(self.extensions, False) self._avail_nsx = [] for ext in self.extensions: if ext.startswith("ns"): file2check = "".join([self._filenames["nsx"], os.path.extsep, ext]) else: file2check = "".join([self._filenames[ext], os.path.extsep, ext]) if os.path.exists(file2check): self._avail_files[ext] = True if ext.startswith("ns"): self._avail_nsx.append(int(ext[-1])) if not load_nev: self._avail_files["nev"] = False if not self._avail_files["nev"] and not self._avail_nsx: raise IOError("No Blackrock files found in specified path") # These dictionaries are used internally to map the file specification # revision of the nsx and nev files to one of the reading routines # NSX self.__nsx_header_reader = { "2.1": self.__read_nsx_header_variant_a, "2.2": self.__read_nsx_header_variant_b, "2.3": self.__read_nsx_header_variant_b, "3.0": self.__read_nsx_header_variant_b, } self.__nsx_dataheader_reader = { "2.1": self.__read_nsx_dataheader_variant_a, "2.2": self.__read_nsx_dataheader_variant_b, "2.3": self.__read_nsx_dataheader_variant_b, "3.0": self.__read_nsx_dataheader_variant_b, "3.0-ptp": self.__read_nsx_dataheader_variant_c, } self.__nsx_data_reader = { "2.1": self.__read_nsx_data_variant_a, "2.2": self.__read_nsx_data_variant_b, "2.3": self.__read_nsx_data_variant_b, "3.0": self.__read_nsx_data_variant_b, "3.0-ptp": self.__read_nsx_data_variant_c, } self.__nsx_params = { "2.1": self.__get_nsx_param_variant_a, "2.2": self.__get_nsx_param_variant_b, "2.3": self.__get_nsx_param_variant_b, "3.0": self.__get_nsx_param_variant_b, } # NEV self.__nev_header_reader = { "2.1": self.__read_nev_header_variant_a, "2.2": self.__read_nev_header_variant_b, "2.3": self.__read_nev_header_variant_c, "3.0": self.__read_nev_header_variant_c, } self.__nev_data_reader = { "2.1": self.__read_nev_data_variant_a, "2.2": self.__read_nev_data_variant_a, "2.3": self.__read_nev_data_variant_b, "3.0": self.__read_nev_data_variant_c, } self.__waveform_size = { "2.1": self.__get_waveform_size_variant_a, "2.2": self.__get_waveform_size_variant_a, "2.3": self.__get_waveform_size_variant_b, "3.0": self.__get_waveform_size_variant_b, } self.__channel_labels = { "2.1": self.__get_channel_labels_variant_a, "2.2": self.__get_channel_labels_variant_b, "2.3": self.__get_channel_labels_variant_b, "3.0": self.__get_channel_labels_variant_b, } self.__nonneural_evdicts = { "2.1": self.__get_nonneural_evdicts_variant_a, "2.2": self.__get_nonneural_evdicts_variant_a, "2.3": self.__get_nonneural_evdicts_variant_b, "3.0": self.__get_nonneural_evdicts_variant_b, } self.__comment_evdict = { "2.1": self.__get_comment_evdict_variant_a, "2.2": self.__get_comment_evdict_variant_a, "2.3": self.__get_comment_evdict_variant_a, "3.0": self.__get_comment_evdict_variant_a, } def _parse_header(self): main_sampling_rate = 30000.0 event_channels = [] spike_channels = [] signal_buffers = [] signal_streams = [] signal_channels = [] # Step1 NEV file if self._avail_files["nev"]: # Load file spec and headers of available # read nev file specification self.__nev_spec = self.__extract_nev_file_spec() # read nev headers self.__nev_basic_header, self.__nev_ext_header = self.__nev_header_reader[self.__nev_spec]() self.nev_data = self.__nev_data_reader[self.__nev_spec]() spikes, spike_segment_ids = self.nev_data["Spikes"] # scan all channel to get number of Unit spike_channels = [] self.internal_unit_ids = [] # pair of chan['packet_id'], spikes['unit_class_nb'] for i in range(len(self.__nev_ext_header[b"NEUEVWAV"])): channel_id = self.__nev_ext_header[b"NEUEVWAV"]["electrode_id"][i] chan_mask = spikes["packet_id"] == channel_id chan_spikes = spikes[chan_mask] all_unit_id = np.unique(chan_spikes["unit_class_nb"]) for u, unit_id in enumerate(all_unit_id): self.internal_unit_ids.append((channel_id, unit_id)) name = f"ch{channel_id}#{unit_id}" _id = f"Unit {1000 * channel_id + unit_id}" wf_gain = self.__nev_params("digitization_factor")[channel_id] / 1000.0 wf_offset = 0.0 wf_units = "uV" # TODO: Double check if this is the correct assumption (10 samples) # default value: threshold crossing after 10 samples of waveform wf_left_sweep = 10 wf_sampling_rate = main_sampling_rate spike_channels.append((name, _id, wf_units, wf_gain, wf_offset, wf_left_sweep, wf_sampling_rate)) # scan events # NonNeural: serial and digital input events_data, event_segment_ids = self.nev_data["NonNeural"] ev_dict = self.__nonneural_evdicts[self.__nev_spec](events_data) if "Comments" in self.nev_data: comments_data, comments_segment_ids = self.nev_data["Comments"] ev_dict.update(self.__comment_evdict[self.__nev_spec](comments_data)) for ev_name in ev_dict: event_channels.append((ev_name, "", "event")) # TODO: TrackingEvents # TODO: ButtonTrigger # TODO: VideoSync # Step2 NSX file # Load file spec and headers of available nsx files self.__nsx_spec = {} self.__nsx_basic_header = {} self.__nsx_ext_header = {} self.__nsx_data_header = {} for nsx_nb in self._avail_nsx: spec = self.__nsx_spec[nsx_nb] = self.__extract_nsx_file_spec(nsx_nb) # read nsx headers self.__nsx_basic_header[nsx_nb], self.__nsx_ext_header[nsx_nb] = self.__nsx_header_reader[spec](nsx_nb) # The only way to know if it is the PTP-variant of file spec 3.0 # is to check for nanosecond timestamp resolution. if ( "timestamp_resolution" in self.__nsx_basic_header[nsx_nb].dtype.names and self.__nsx_basic_header[nsx_nb]["timestamp_resolution"] == 1_000_000_000 ): nsx_dataheader_reader = self.__nsx_dataheader_reader["3.0-ptp"] else: nsx_dataheader_reader = self.__nsx_dataheader_reader[spec] # for nsxdef get_analogsignal_shape(self, block_index, seg_index): self.__nsx_data_header[nsx_nb] = nsx_dataheader_reader(nsx_nb) # nsx_to_load can be either int, list, 'max', 'all' (aka None) # here make a list only if self.nsx_to_load is None or self.nsx_to_load == "all": self.nsx_to_load = list(self._avail_nsx) elif self.nsx_to_load == "max": if len(self._avail_nsx): self.nsx_to_load = [max(self._avail_nsx)] else: self.nsx_to_load = [] elif isinstance(self.nsx_to_load, int): self.nsx_to_load = [self.nsx_to_load] elif isinstance(self.nsx_to_load, list): pass else: raise (ValueError("nsx_to_load is wrong")) if not all(nsx_nb in self._avail_nsx for nsx_nb in self.nsx_to_load): raise FileNotFoundError(f"nsx_to_load does not match available nsx list") # check that all files come from the same specification all_spec = [self.__nsx_spec[nsx_nb] for nsx_nb in self.nsx_to_load] if self._avail_files["nev"]: all_spec.append(self.__nev_spec) if not all(all_spec[0] == spec for spec in all_spec): raise NeoReadWriteError("Files don't have the same internal version") if len(self.nsx_to_load) > 0 and self.__nsx_spec[self.nsx_to_load[0]] == "2.1" and not self._avail_files["nev"]: pass # Because rescaling to volts requires information from nev file (dig_factor) # Remove if raw loading becomes possible # raise IOError("For loading Blackrock file version 2.1 .nev files are required!") # This requires nsX to be parsed already # Needs to be called when no nsX are available as well in order to warn the user if self._avail_files["nev"]: for nsx_nb in self.nsx_to_load: self.__match_nsx_and_nev_segment_ids(nsx_nb) self.nsx_datas = {} self.sig_sampling_rates = {} if len(self.nsx_to_load) > 0: for nsx_nb in self.nsx_to_load: spec = self.__nsx_spec[nsx_nb] # The only way to know if it is the PTP-variant of file spec 3.0 # is to check for nanosecond timestamp resolution. if ( "timestamp_resolution" in self.__nsx_basic_header[nsx_nb].dtype.names and self.__nsx_basic_header[nsx_nb]["timestamp_resolution"] == 1_000_000_000 ): _data_reader_fun = self.__nsx_data_reader["3.0-ptp"] else: _data_reader_fun = self.__nsx_data_reader[spec] self.nsx_datas[nsx_nb] = _data_reader_fun(nsx_nb) sr = float(main_sampling_rate / self.__nsx_basic_header[nsx_nb]["period"]) self.sig_sampling_rates[nsx_nb] = sr if spec in ["2.2", "2.3", "3.0"]: ext_header = self.__nsx_ext_header[nsx_nb] elif spec == "2.1": ext_header = [] keys = ["labels", "units", "min_analog_val", "max_analog_val", "min_digital_val", "max_digital_val"] params = self.__nsx_params[spec](nsx_nb) for i in range(len(params["labels"])): d = {} for key in keys: d[key] = params[key][i] ext_header.append(d) if len(ext_header) > 0: # in blackrock : one stream per buffer so same id buffer_id = stream_id = str(nsx_nb) stream_name = f"nsx{nsx_nb}" signal_buffers.append((stream_name, buffer_id)) signal_streams.append((stream_name, stream_id, buffer_id)) for i, chan in enumerate(ext_header): if spec in ["2.2", "2.3", "3.0"]: ch_name = chan["electrode_label"].decode() ch_id = str(chan["electrode_id"]) units = chan["units"].decode() elif spec == "2.1": ch_name = chan["labels"] ch_id = str(self.__nsx_ext_header[nsx_nb][i]["electrode_id"]) units = chan["units"] sig_dtype = "int16" # max_analog_val/min_analog_val/max_digital_val/min_analog_val are int16!!!!! # dangerous situation so cast to float everyone if np.isnan(float(chan["min_analog_val"])): gain = 1 offset = 0 else: gain = (float(chan["max_analog_val"]) - float(chan["min_analog_val"])) / ( float(chan["max_digital_val"]) - float(chan["min_digital_val"]) ) offset = -float(chan["min_digital_val"]) * gain + float(chan["min_analog_val"]) buffer_id = stream_id = str(nsx_nb) signal_channels.append((ch_name, ch_id, sr, sig_dtype, units, gain, offset, stream_id, buffer_id)) # check nb segment per nsx nb_segments_for_nsx = [len(self.nsx_datas[nsx_nb]) for nsx_nb in self.nsx_to_load] if not all(nb == nb_segments_for_nsx[0] for nb in nb_segments_for_nsx): raise NeoReadWriteError("Segment nb not consistent across nsX files") self._nb_segment = nb_segments_for_nsx[0] self.__delete_empty_segments() # t_start/t_stop for segment are given by nsx limits or nev limits self._sigs_t_starts = {nsx_nb: [] for nsx_nb in self.nsx_to_load} self._seg_t_starts, self._seg_t_stops = [], [] for data_bl in range(self._nb_segment): t_stop = 0.0 for nsx_nb in self.nsx_to_load: spec = self.__nsx_spec[nsx_nb] if "timestamp_resolution" in self.__nsx_basic_header[nsx_nb].dtype.names: ts_res = self.__nsx_basic_header[nsx_nb]["timestamp_resolution"] elif spec == "2.1": ts_res = self.__nsx_params[spec](nsx_nb)["timestamp_resolution"] else: ts_res = 30_000 period = self.__nsx_basic_header[nsx_nb]["period"] sec_per_samp = period / 30_000 # Maybe 30_000 should be ['sample_resolution'] length = self.nsx_datas[nsx_nb][data_bl].shape[0] if self.__nsx_data_header[nsx_nb] is None: t_start = 0.0 t_stop = max(t_stop, length / self.sig_sampling_rates[nsx_nb]) else: timestamps = self.__nsx_data_header[nsx_nb][data_bl]["timestamp"] if hasattr(timestamps, "size") and timestamps.size == length: # FileSpec 3.0 with PTP -- use the per-sample timestamps t_start = timestamps[0] / ts_res t_stop = max(t_stop, timestamps[-1] / ts_res + sec_per_samp) else: t_start = timestamps / ts_res t_stop = max(t_stop, t_start + length / self.sig_sampling_rates[nsx_nb]) self._sigs_t_starts[nsx_nb].append(t_start) if self._avail_files["nev"]: max_nev_time = 0 for k, (data, ev_ids) in self.nev_data.items(): segment_mask = ev_ids == data_bl if data[segment_mask].size > 0: t = data[segment_mask][-1]["timestamp"] / self.__nev_basic_header["timestamp_resolution"] max_nev_time = max(max_nev_time, t) if max_nev_time > t_stop: t_stop = max_nev_time min_nev_time = max_nev_time for k, (data, ev_ids) in self.nev_data.items(): segment_mask = ev_ids == data_bl if data[segment_mask].size > 0: t = data[segment_mask][0]["timestamp"] / self.__nev_basic_header["timestamp_resolution"] min_nev_time = min(min_nev_time, t) if min_nev_time < t_start: t_start = min_nev_time self._seg_t_starts.append(t_start) self._seg_t_stops.append(float(t_stop)) else: # When only nev is available, only segments that are documented in nev can be detected max_nev_times = {} min_nev_times = {} # Find maximal and minimal time for each nev segment for k, (data, ev_ids) in self.nev_data.items(): for i in np.unique(ev_ids): curr_data = data[ev_ids == i] if curr_data.size > 0: if max(curr_data["timestamp"]) >= max_nev_times.get(i, 0): max_nev_times[i] = max(curr_data["timestamp"]) if min(curr_data["timestamp"]) <= min_nev_times.get(i, max_nev_times[i]): min_nev_times[i] = min(curr_data["timestamp"]) # Calculate t_start and t_stop for each segment in seconds resolution = self.__nev_basic_header["timestamp_resolution"] self._seg_t_starts = [v / float(resolution) for k, v in sorted(min_nev_times.items())] self._seg_t_stops = [v / float(resolution) for k, v in sorted(max_nev_times.items())] self._nb_segment = len(self._seg_t_starts) self._sigs_t_starts = [None] * self._nb_segment # finalize header spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) event_channels = np.array(event_channels, dtype=_event_channel_dtype) signal_channels = np.array(signal_channels, dtype=_signal_channel_dtype) signal_streams = np.array(signal_streams, dtype=_signal_stream_dtype) signal_buffers = np.array(signal_buffers, dtype=_signal_buffer_dtype) self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [self._nb_segment] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = signal_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels rec_datetime = self.__nev_params("rec_datetime") if self._avail_files["nev"] else None # Put annotations at some places for compatibility # with previous BlackrockIO version self._generate_minimal_annotations() block_ann = self.raw_annotations["blocks"][0] block_ann["description"] = "Block of data from Blackrock file set." block_ann["file_origin"] = self.filename block_ann["name"] = "Blackrock Data Block" block_ann["rec_datetime"] = rec_datetime block_ann["avail_file_set"] = [k for k, v in self._avail_files.items() if v] block_ann["avail_nsx"] = self._avail_nsx block_ann["avail_nev"] = self._avail_files["nev"] # 'sif' and 'ccf' files not yet supported # block_ann['avail_sif'] = self._avail_files['sif'] # block_ann['avail_ccf'] = self._avail_files['ccf'] block_ann["rec_pauses"] = False for seg_index in range(self._nb_segment): seg_ann = block_ann["segments"][seg_index] seg_ann["file_origin"] = self.filename seg_ann["name"] = f"Segment {seg_index}" seg_ann["description"] = "Segment containing data from t_start to t_stop" if seg_index == 0: # if more than 1 segment means pause # so datetime is valid only for seg_index=0 seg_ann["rec_datetime"] = rec_datetime for c in range(signal_streams.size): sig_ann = seg_ann["signals"][c] stream_id = signal_streams["id"][c] nsx_nb = int(stream_id) sig_ann["description"] = f"AnalogSignal from nsx{nsx_nb}" sig_ann["file_origin"] = self._filenames["nsx"] + ".ns" + str(nsx_nb) sig_ann["nsx"] = nsx_nb # handle signal array annotations from nsx header if self.__nsx_spec[nsx_nb] in ["2.2", "2.3"] and nsx_nb in self.__nsx_ext_header: mask = signal_channels["stream_id"] == stream_id channels = signal_channels[mask] nsx_header = self.__nsx_ext_header[nsx_nb] for key in ( "physical_connector", "connector_pin", "hi_freq_corner", "lo_freq_corner", "hi_freq_order", "lo_freq_order", "hi_freq_type", "lo_freq_type", ): values = [] for chan_id in channels["id"]: chan_id = int(chan_id) idx = list(nsx_header["electrode_id"]).index(chan_id) values.append(nsx_header[key][idx]) values = np.array(values) sig_ann["__array_annotations__"][key] = values for c in range(spike_channels.size): st_ann = seg_ann["spikes"][c] channel_id, unit_id = self.internal_unit_ids[c] unit_tag = {0: "unclassified", 255: "noise"}.get(unit_id, str(unit_id)) st_ann["channel_id"] = channel_id st_ann["unit_id"] = unit_id st_ann["unit_tag"] = unit_tag st_ann["description"] = f"SpikeTrain channel_id: {channel_id}, unit_id: {unit_id}" st_ann["file_origin"] = self._filenames["nev"] + ".nev" if self._avail_files["nev"]: ev_dict = self.__nonneural_evdicts[self.__nev_spec](events_data) if "Comments" in self.nev_data: ev_dict.update(self.__comment_evdict[self.__nev_spec](comments_data)) color_codes = ["#{:08X}".format(code) for code in comments_data["color"]] color_codes = np.array(color_codes, dtype="S9") for c in range(event_channels.size): # Next line makes ev_ann a reference to seg_ann['events'][c] ev_ann = seg_ann["events"][c] name = event_channels["name"][c] ev_ann["description"] = ev_dict[name]["desc"] ev_ann["file_origin"] = self._filenames["nev"] + ".nev" if name == "comments": ev_ann["color_codes"] = color_codes def _source_name(self): return self.filename def _segment_t_start(self, block_index, seg_index): return self._seg_t_starts[seg_index] def _segment_t_stop(self, block_index, seg_index): return self._seg_t_stops[seg_index] def _get_signal_size(self, block_index, seg_index, stream_index): stream_id = self.header["signal_streams"][stream_index]["id"] nsx_nb = int(stream_id) memmap_data = self.nsx_datas[nsx_nb][seg_index] return memmap_data.shape[0] def _get_signal_t_start(self, block_index, seg_index, stream_index): stream_id = self.header["signal_streams"][stream_index]["id"] nsx_nb = int(stream_id) return self._sigs_t_starts[nsx_nb][seg_index] def _get_analogsignal_chunk(self, block_index, seg_index, i_start, i_stop, stream_index, channel_indexes): stream_id = self.header["signal_streams"][stream_index]["id"] nsx_nb = int(stream_id) memmap_data = self.nsx_datas[nsx_nb][seg_index] if channel_indexes is None: channel_indexes = slice(None) sig_chunk = memmap_data[i_start:i_stop, channel_indexes] return sig_chunk def _spike_count(self, block_index, seg_index, unit_index): channel_id, unit_id = self.internal_unit_ids[unit_index] all_spikes = self.nev_data["Spikes"][0] mask = (all_spikes["packet_id"] == channel_id) & (all_spikes["unit_class_nb"] == unit_id) if self._nb_segment == 1: # very fast nb = int(np.sum(mask)) else: # must clip in time time range timestamp = all_spikes[mask]["timestamp"] sl = self._get_timestamp_slice(timestamp, seg_index, None, None) timestamp = timestamp[sl] nb = timestamp.size return nb def _get_spike_timestamps(self, block_index, seg_index, unit_index, t_start, t_stop): channel_id, unit_id = self.internal_unit_ids[unit_index] all_spikes, event_segment_ids = self.nev_data["Spikes"] # select by channel_id and unit_id mask = ( (all_spikes["packet_id"] == channel_id) & (all_spikes["unit_class_nb"] == unit_id) & (event_segment_ids == seg_index) ) unit_spikes = all_spikes[mask] timestamp = unit_spikes["timestamp"] sl = self._get_timestamp_slice(timestamp, seg_index, t_start, t_stop) timestamp = timestamp[sl] return timestamp def _get_timestamp_slice(self, timestamp, seg_index, t_start, t_stop): if self._nb_segment > 1: # we must clip event in seg time limits if t_start is None: t_start = self._seg_t_starts[seg_index] if t_stop is None: t_stop = self._seg_t_stops[seg_index] + 1 / float(self.__nev_basic_header["timestamp_resolution"]) if t_start is None: ind_start = None else: ts = math.ceil(t_start * self.__nev_basic_header["timestamp_resolution"]) ind_start = np.searchsorted(timestamp, ts) if t_stop is None: ind_stop = None else: ts = int(t_stop * self.__nev_basic_header["timestamp_resolution"]) ind_stop = np.searchsorted(timestamp, ts) # +1 sl = slice(ind_start, ind_stop) return sl def _rescale_spike_timestamp(self, spike_timestamps, dtype): spike_times = spike_timestamps.astype(dtype) spike_times /= self.__nev_basic_header["timestamp_resolution"] return spike_times def _get_spike_raw_waveforms(self, block_index, seg_index, unit_index, t_start, t_stop): channel_id, unit_id = self.internal_unit_ids[unit_index] all_spikes, event_segment_ids = self.nev_data["Spikes"] mask = ( (all_spikes["packet_id"] == channel_id) & (all_spikes["unit_class_nb"] == unit_id) & (event_segment_ids == seg_index) ) unit_spikes = all_spikes[mask] wf_dtype = self.__nev_params("waveform_dtypes")[channel_id] wf_size = self.__nev_params("waveform_size")[channel_id] wf_byte_size = np.dtype(wf_dtype).itemsize * wf_size dt1 = [ ("extra", "S{}".format(unit_spikes["waveform"].dtype.itemsize - wf_byte_size)), ("ch_waveform", "S{}".format(wf_byte_size)), ] waveforms = unit_spikes["waveform"].view(dt1)["ch_waveform"].flatten().view(wf_dtype) waveforms = waveforms.reshape(int(unit_spikes.size), 1, int(wf_size)) timestamp = unit_spikes["timestamp"] sl = self._get_timestamp_slice(timestamp, seg_index, t_start, t_stop) waveforms = waveforms[sl] return waveforms def _event_count(self, block_index, seg_index, event_channel_index): name = self.header["event_channels"]["name"][event_channel_index] if name == "comments": events_data, event_segment_ids = self.nev_data["Comments"] ev_dict = self.__comment_evdict[self.__nev_spec](events_data)[name] else: events_data, event_segment_ids = self.nev_data["NonNeural"] ev_dict = self.__nonneural_evdicts[self.__nev_spec](events_data)[name] mask = ev_dict["mask"] & (event_segment_ids == seg_index) if self._nb_segment == 1: # very fast nb = int(np.sum(mask)) else: # must clip in time time range timestamp = events_data[ev_dict["mask"]]["timestamp"] sl = self._get_timestamp_slice(timestamp, seg_index, None, None) timestamp = timestamp[sl] nb = timestamp.size return nb def _get_event_timestamps(self, block_index, seg_index, event_channel_index, t_start, t_stop): name = self.header["event_channels"]["name"][event_channel_index] if name == "comments": events_data, event_segment_ids = self.nev_data["Comments"] ev_dict = self.__comment_evdict[self.__nev_spec](events_data)[name] # If immediate decoding is desired: encoding = {0: "latin_1", 1: "utf_16", 255: "latin_1"} labels = [data[ev_dict["field"]].decode(encoding[data["char_set"]]) for data in events_data] labels = np.array(labels, dtype="U") else: events_data, event_segment_ids = self.nev_data["NonNeural"] ev_dict = self.__nonneural_evdicts[self.__nev_spec](events_data)[name] labels = events_data[ev_dict["field"]].astype("U") mask = ev_dict["mask"] & (event_segment_ids == seg_index) timestamp = events_data[mask]["timestamp"] labels = labels[mask] # time clip sl = self._get_timestamp_slice(timestamp, seg_index, t_start, t_stop) timestamp = timestamp[sl] labels = labels[sl] durations = None return timestamp, durations, labels def _rescale_event_timestamp(self, event_timestamps, dtype, event_channel_index): ev_times = event_timestamps.astype(dtype) ev_times /= self.__nev_basic_header["timestamp_resolution"] return ev_times ################################################### ################################################### # Above here code from Lyuba Zehl, Michael Denker # coming from previous BlackrockIO def __extract_nsx_file_spec(self, nsx_nb): """ Extract file specification from an .nsx file. """ filename = ".".join([self._filenames["nsx"], f"ns{nsx_nb}"]) # Header structure of files specification 2.2 and higher. For files 2.1 # and lower, the entries ver_major and ver_minor are not supported. dt0 = [("file_id", "S8"), ("ver_major", "uint8"), ("ver_minor", "uint8")] nsx_file_id = np.fromfile(filename, count=1, dtype=dt0)[0] if nsx_file_id["file_id"].decode() == "NEURALSG": spec = "2.1" elif nsx_file_id["file_id"].decode() in ["NEURALCD", "BRSMPGRP"]: spec = f"{nsx_file_id['ver_major']}.{nsx_file_id['ver_minor']}" else: raise IOError("Unsupported NSX file type.") return spec def __extract_nev_file_spec(self): """ Extract file specification from an .nev file """ filename = ".".join([self._filenames["nev"], "nev"]) # Header structure of files specification 2.2 and higher. For files 2.1 # and lower, the entries ver_major and ver_minor are not supported. dt0 = [("file_id", "S8"), ("ver_major", "uint8"), ("ver_minor", "uint8")] nev_file_id = np.fromfile(filename, count=1, dtype=dt0)[0] if nev_file_id["file_id"].decode() in ["NEURALEV", "BREVENTS"]: spec = f"{nev_file_id['ver_major']}.{nev_file_id['ver_minor']}" else: raise IOError(f"NEV file type {nev_file_id['file_id'].decode()} is not supported") return spec def __read_nsx_header_variant_a(self, nsx_nb): """ Extract nsx header information from a 2.1 .nsx file """ filename = ".".join([self._filenames["nsx"], f"ns{nsx_nb}"]) # basic header (file_id: NEURALCD) dt0 = [ ("file_id", "S8"), # label of sampling group (e.g. "1kS/s" or "LFP Low") ("label", "S16"), # number of 1/30000 seconds between data points # (e.g., if sampling rate "1 kS/s", period equals "30") ("period", "uint32"), ("channel_count", "uint32"), ] nsx_basic_header = np.fromfile(filename, count=1, dtype=dt0)[0] # Note: it is not possible to use recfunctions to append_fields of 'timestamp_resolution', # because the size of this object is used as the header size in later read operations. # "extended" header (last field of file_id: NEURALCD) # (to facilitate compatibility with higher file specs) offset_dt0 = np.dtype(dt0).itemsize shape = nsx_basic_header["channel_count"] # originally called channel_id in Blackrock user manual # (to facilitate compatibility with higher file specs) dt1 = [("electrode_id", "uint32")] nsx_ext_header = np.memmap(filename, shape=shape, offset=offset_dt0, dtype=dt1, mode="r") return nsx_basic_header, nsx_ext_header def __read_nsx_header_variant_b(self, nsx_nb): """ Extract nsx header information from a 2.2 or 2.3 .nsx file """ filename = ".".join([self._filenames["nsx"], f"ns{nsx_nb}"]) # basic header (file_id: NEURALCD) dt0 = [ ("file_id", "S8"), # achFileType # file specification split into major and minor version number ("ver_major", "uint8"), ("ver_minor", "uint8"), # bytes of basic & extended header ("bytes_in_headers", "uint32"), # label of the sampling group (e.g., "1 kS/s" or "LFP low") ("label", "S16"), ("comment", "S256"), ("period", "uint32"), ("timestamp_resolution", "uint32"), # time origin: 2byte uint16 values for ... ("year", "uint16"), ("month", "uint16"), ("weekday", "uint16"), ("day", "uint16"), ("hour", "uint16"), ("minute", "uint16"), ("second", "uint16"), ("millisecond", "uint16"), # number of channel_count match number of extended headers ("channel_count", "uint32"), ] nsx_basic_header = np.fromfile(filename, count=1, dtype=dt0)[0] # extended header (type: CC) offset_dt0 = np.dtype(dt0).itemsize shape = nsx_basic_header["channel_count"] dt1 = [ ("type", "S2"), ("electrode_id", "uint16"), ("electrode_label", "S16"), # used front-end amplifier bank (e.g., A, B, C, D) ("physical_connector", "uint8"), # used connector pin (e.g., 1-37 on bank A, B, C or D) ("connector_pin", "uint8"), # digital and analog value ranges of the signal ("min_digital_val", "int16"), ("max_digital_val", "int16"), ("min_analog_val", "int16"), ("max_analog_val", "int16"), # units of the analog range values ("mV" or "uV") ("units", "S16"), # filter settings used to create nsx from source signal ("hi_freq_corner", "uint32"), ("hi_freq_order", "uint32"), ("hi_freq_type", "uint16"), # 0=None, 1=Butterworth ("lo_freq_corner", "uint32"), ("lo_freq_order", "uint32"), ("lo_freq_type", "uint16"), ] # 0=None, 1=Butterworth nsx_ext_header = np.memmap(filename, shape=shape, offset=offset_dt0, dtype=dt1, mode="r") return nsx_basic_header, nsx_ext_header def __read_nsx_dataheader(self, nsx_nb, offset): """ Reads data header following the given offset of an nsx file. """ filename = ".".join([self._filenames["nsx"], f"ns{nsx_nb}"]) ts_size = "uint64" if self.__nsx_basic_header[nsx_nb]["ver_major"] >= 3 else "uint32" # dtypes data header dt2 = [("header", "uint8"), ("timestamp", ts_size), ("nb_data_points", "uint32")] return np.memmap(filename, dtype=dt2, shape=1, offset=offset, mode="r")[0] def __read_nsx_dataheader_variant_a(self, nsx_nb, filesize=None, offset=None): """ Reads None for the nsx data header of file spec 2.1. Introduced to facilitate compatibility with higher file spec. """ return None def __read_nsx_dataheader_variant_b( self, nsx_nb, filesize=None, offset=None, ): """ Reads the nsx data header for each data block following the offset of file spec 2.2, 2.3, and 3.0. """ filename = ".".join([self._filenames["nsx"], f"ns{nsx_nb}"]) filesize = self.__get_file_size(filename) data_header = {} index = 0 if offset is None: offset = self.__nsx_basic_header[nsx_nb]["bytes_in_headers"] while offset < filesize: dh = self.__read_nsx_dataheader(nsx_nb, offset) data_header[index] = { "header": dh["header"], "timestamp": dh["timestamp"], "nb_data_points": dh["nb_data_points"], "offset_to_data_block": offset + dh.dtype.itemsize, } # data size = number of data points * (2bytes * number of channels) # use of `int` avoids overflow problem data_size = int(dh["nb_data_points"]) * int(self.__nsx_basic_header[nsx_nb]["channel_count"]) * 2 # define new offset (to possible next data block) offset = data_header[index]["offset_to_data_block"] + data_size index += 1 return data_header def __read_nsx_dataheader_variant_c( self, nsx_nb, filesize=None, offset=None, ): """ Reads the nsx data header for each data block for file spec 3.0 with PTP timestamps """ filename = ".".join([self._filenames["nsx"], f"ns{nsx_nb}"]) filesize = self.__get_file_size(filename) data_header = {} index = 0 if offset is None: # This is read as an uint32 numpy scalar from the header so we transform it to python int offset = int(self.__nsx_basic_header[nsx_nb]["bytes_in_headers"]) ptp_dt = [ ("reserved", "uint8"), ("timestamps", "uint64"), ("num_data_points", "uint32"), ("samples", "int16", self.__nsx_basic_header[nsx_nb]["channel_count"]), ] npackets = int((filesize - offset) / np.dtype(ptp_dt).itemsize) struct_arr = np.memmap(filename, dtype=ptp_dt, shape=npackets, offset=offset, mode="r") if not np.all(struct_arr["num_data_points"] == 1): # some packets have more than 1 sample. Not actually ptp. Revert to non-ptp variant. return self.__read_nsx_dataheader_variant_b(nsx_nb, filesize=filesize, offset=offset) # It is still possible there was a data break and the file has multiple segments. # We can no longer rely on the presence of a header indicating a new segment, # so we look for timestamp differences greater than double the expected interval. _period = self.__nsx_basic_header[nsx_nb]["period"] # 30_000 ^-1 s per sample _nominal_rate = 30_000 / _period # samples per sec; maybe 30_000 should be ["sample_resolution"] _clock_rate = self.__nsx_basic_header[nsx_nb]["timestamp_resolution"] # clocks per sec clk_per_samp = _clock_rate / _nominal_rate # clk/sec / smp/sec = clk/smp seg_thresh_clk = int(2 * clk_per_samp) seg_starts = np.hstack((0, 1 + np.argwhere(np.diff(struct_arr["timestamps"]) > seg_thresh_clk).flatten())) for seg_ix, seg_start_idx in enumerate(seg_starts): if seg_ix < (len(seg_starts) - 1): seg_stop_idx = seg_starts[seg_ix + 1] else: seg_stop_idx = len(struct_arr) - 1 seg_offset = offset + seg_start_idx * struct_arr.dtype.itemsize num_data_pts = seg_stop_idx - seg_start_idx seg_struct_arr = np.memmap(filename, dtype=ptp_dt, shape=num_data_pts, offset=seg_offset, mode="r") data_header[seg_ix] = { "header": None, "timestamp": seg_struct_arr["timestamps"], # Note, this is an array, not a scalar "nb_data_points": num_data_pts, "offset_to_data_block": seg_offset, } return data_header def __read_nsx_data_variant_a(self, nsx_nb): """ Extract nsx data from a 2.1 .nsx file """ filename = ".".join([self._filenames["nsx"], f"ns{nsx_nb}"]) # get shape of data shape = (self.__nsx_params["2.1"](nsx_nb)["nb_data_points"], self.__nsx_basic_header[nsx_nb]["channel_count"]) offset = self.__nsx_params["2.1"](nsx_nb)["bytes_in_headers"] # read nsx data # store as dict for compatibility with higher file specs data = {0: np.memmap(filename, dtype="int16", shape=shape, offset=offset, mode="r")} return data def __read_nsx_data_variant_b(self, nsx_nb): """ Extract nsx data (blocks) from a 2.2, 2.3, or 3.0 .nsx file. Blocks can arise if the recording was paused by the user. """ filename = ".".join([self._filenames["nsx"], f"ns{nsx_nb}"]) data = {} for data_bl in self.__nsx_data_header[nsx_nb].keys(): # get shape and offset of data shape = ( self.__nsx_data_header[nsx_nb][data_bl]["nb_data_points"], self.__nsx_basic_header[nsx_nb]["channel_count"], ) offset = self.__nsx_data_header[nsx_nb][data_bl]["offset_to_data_block"] # read data data[data_bl] = np.memmap(filename, dtype="int16", shape=shape, offset=offset, mode="r") return data def __read_nsx_data_variant_c(self, nsx_nb): """ Extract nsx data (blocks) from a 3.0 .nsx file with PTP timestamps yielding a timestamp per sample. Blocks can arise if the recording was paused by the user. """ filename = ".".join([self._filenames["nsx"], f"ns{nsx_nb}"]) ptp_dt = [ ("reserved", "uint8"), ("timestamps", "uint64"), ("num_data_points", "uint32"), ("samples", "int16", self.__nsx_basic_header[nsx_nb]["channel_count"]), ] data = {} for bl_id, bl_header in self.__nsx_data_header[nsx_nb].items(): struct_arr = np.memmap( filename, dtype=ptp_dt, shape=bl_header["nb_data_points"], offset=bl_header["offset_to_data_block"], mode="r", ) # Does this concretize the data? # If yes then investigate np.ndarray with buffer=file, # offset=offset+13, and strides that skips 13-bytes per row. data[bl_id] = struct_arr["samples"] return data def __read_nev_header(self, ext_header_variants): """ Extract nev header information from a of specific .nsx header variant """ filename = ".".join([self._filenames["nev"], "nev"]) # basic header dt0 = [ # Set to "NEURALEV" ("file_type_id", "S8"), ("ver_major", "uint8"), ("ver_minor", "uint8"), # Flags ("additionnal_flags", "uint16"), # File index of first data sample ("bytes_in_headers", "uint32"), # Number of bytes per data packet (sample) ("bytes_in_data_packets", "uint32"), # Time resolution of time stamps in Hz ("timestamp_resolution", "uint32"), # Sampling frequency of waveforms in Hz ("sample_resolution", "uint32"), ("year", "uint16"), ("month", "uint16"), ("weekday", "uint16"), ("day", "uint16"), ("hour", "uint16"), ("minute", "uint16"), ("second", "uint16"), ("millisecond", "uint16"), ("application_to_create_file", "S32"), ("comment_field", "S256"), # Number of extended headers ("nb_ext_headers", "uint32"), ] nev_basic_header = np.fromfile(filename, count=1, dtype=dt0)[0] # extended header # this consist in N block with code 8bytes + 24 data bytes # the data bytes depend on the code and need to be converted # cafilename_nsx, segse by case shape = nev_basic_header["nb_ext_headers"] offset_dt0 = np.dtype(dt0).itemsize # This is the common structure of the beginning of extended headers dt1 = [("packet_id", "S8"), ("info_field", "S24")] raw_ext_header = np.memmap(filename, offset=offset_dt0, dtype=dt1, shape=shape, mode="r") nev_ext_header = {} for packet_id in ext_header_variants.keys(): mask = raw_ext_header["packet_id"] == packet_id dt2 = self.__nev_ext_header_types()[packet_id][ext_header_variants[packet_id]] nev_ext_header[packet_id] = raw_ext_header.view(dt2)[mask] return nev_basic_header, nev_ext_header def __read_nev_header_variant_a(self): """ Extract nev header information from a 2.1 .nev file """ ext_header_variants = { b"NEUEVWAV": "a", b"ARRAYNME": "a", b"ECOMMENT": "a", b"CCOMMENT": "a", b"MAPFILE": "a", b"NSASEXEV": "a", } return self.__read_nev_header(ext_header_variants) def __read_nev_header_variant_b(self): """ Extract nev header information from a 2.2 .nev file """ ext_header_variants = { b"NEUEVWAV": "b", b"ARRAYNME": "a", b"ECOMMENT": "a", b"CCOMMENT": "a", b"MAPFILE": "a", b"NEUEVLBL": "a", b"NEUEVFLT": "a", b"DIGLABEL": "a", b"NSASEXEV": "a", } return self.__read_nev_header(ext_header_variants) def __read_nev_header_variant_c(self): """ Extract nev header information from a 2.3 .nev file """ ext_header_variants = { b"NEUEVWAV": "b", b"ARRAYNME": "a", b"ECOMMENT": "a", b"CCOMMENT": "a", b"MAPFILE": "a", b"NEUEVLBL": "a", b"NEUEVFLT": "a", b"DIGLABEL": "a", b"VIDEOSYN": "a", b"TRACKOBJ": "a", } return self.__read_nev_header(ext_header_variants) def __read_nev_data(self, nev_data_masks, nev_data_types): """ Extract nev data from a 2.1 or 2.2 .nev file """ filename = ".".join([self._filenames["nev"], "nev"]) data_size = self.__nev_basic_header["bytes_in_data_packets"] header_size = self.__nev_basic_header["bytes_in_headers"] if self.__nev_basic_header["ver_major"] >= 3: ts_format = "uint64" header_skip = 10 else: ts_format = "uint32" header_skip = 6 # read all raw data packets and markers dt0 = [("timestamp", ts_format), ("packet_id", "uint16"), ("value", f"S{data_size - header_skip}")] raw_data = np.memmap(filename, offset=header_size, dtype=dt0, mode="r") masks = self.__nev_data_masks(raw_data["packet_id"]) types = self.__nev_data_types(data_size) event_segment_ids = self.__get_event_segment_ids(raw_data, masks, nev_data_masks) data = {} for k, v in nev_data_masks.items(): mask = masks[k][v] data[k] = (raw_data.view(types[k][nev_data_types[k]])[mask], event_segment_ids[mask]) return data def __get_reset_event_mask(self, raw_event_data, masks, nev_data_masks): """ Extract mask for reset comment events in 2.3 .nev file """ restart_mask = np.logical_and( masks["Comments"][nev_data_masks["Comments"]], raw_event_data["value"] == b"\x00\x00\x00\x00\x00\x00critical load restart", ) # TODO: Fix hardcoded number of bytes return restart_mask def __get_event_segment_ids(self, raw_event_data, masks, nev_data_masks): """ Construct array of corresponding segment ids for each event for nev version 2.3 """ if self.__nev_spec in ["2.1", "2.2"]: # No pause or reset mechanism present for file version 2.1 and 2.2 return np.zeros(len(raw_event_data), dtype=int) elif self.__nev_spec in ["2.3", "3.0"]: reset_ev_mask = self.__get_reset_event_mask(raw_event_data, masks, nev_data_masks) reset_ev_ids = np.where(reset_ev_mask)[0] # consistency check for monotone increasing time stamps # - Use logical comparator (instead of np.diff) to avoid unsigned dtype issues. # - Only consider handled/known event types. mask_handled = np.any([value[nev_data_masks[key]] for key, value in masks.items()], axis=0) jump_ids_handled = ( np.where( raw_event_data["timestamp"][mask_handled][1:] < raw_event_data["timestamp"][mask_handled][:-1] )[0] + 1 ) jump_ids = np.where(mask_handled)[0][jump_ids_handled] # jump ids in full set of events (incl. unhandled) overlap = np.isin(jump_ids, reset_ev_ids) if not all(overlap): # additional resets occurred without a reset event being stored additional_ids = jump_ids[np.invert(overlap)] warnings.warn( f"Detected {len(additional_ids)} undocumented segments within " f"nev data after timestamps {additional_ids}." "" ) reset_ev_ids = sorted(np.unique(np.concatenate((reset_ev_ids, jump_ids)))) event_segment_ids = np.zeros(len(raw_event_data), dtype=int) for reset_event_id in reset_ev_ids: event_segment_ids[reset_event_id:] += 1 self._nb_segment_nev = len(reset_ev_ids) + 1 return event_segment_ids else: raise ValueError(f"Unknown File Spec {self.__nev_spec}") def __match_nsx_and_nev_segment_ids(self, nsx_nb): """ Ensure matching ids of segments detected in nsx and nev file for version 2.3 """ # NSX required for matching, if not available, warn the user if not self._avail_nsx: warnings.warn( "No nsX available so it cannot be checked whether " "the segments in nev are all correct. Most importantly, " "recording pauses will not be detected", UserWarning, ) return # Only needs to be done for nev version 2.3 if self.__nev_spec == "2.3": nsx_offset = self.__nsx_data_header[nsx_nb][0]["timestamp"] # Multiples of 1/30.000s that pass between two nsX samples nsx_period = self.__nsx_basic_header[nsx_nb]["period"] # NSX segments needed as dict and list nonempty_nsx_segments = {} list_nonempty_nsx_segments = [] # Counts how many segments CAN be created from nev nb_possible_nev_segments = self._nb_segment_nev # Nonempty segments are those containing at least 2 samples # These have to be able to be mapped to nev for k, v in sorted(self.__nsx_data_header[nsx_nb].items()): if v["nb_data_points"] > 1: nonempty_nsx_segments[k] = v list_nonempty_nsx_segments.append(v) # Account for paused segments # This increases nev event segment ids if from the nsx an additional segment is found # If one new segment, i.e. that could not be determined from the nev was found, # all following ids need to be increased to account for the additional segment before for k, (data, ev_ids) in self.nev_data.items(): # Check all nonempty nsX segments for i, seg in enumerate(list_nonempty_nsx_segments[:]): # Last timestamp in this nsX segment # Not subtracting nsX offset from end because spike extraction might continue end_of_current_nsx_seg = ( seg["timestamp"] + seg["nb_data_points"] * self.__nsx_basic_header[nsx_nb]["period"] ) mask_after_seg = (ev_ids == i) & (data["timestamp"] > end_of_current_nsx_seg + nsx_period) # Show warning if spikes do not fit any segment (+- 1 sampling 'tick') # Spike should belong to segment before mask_outside = (ev_ids == i) & ( data["timestamp"] < int(seg["timestamp"]) - int(nsx_offset) - int(nsx_period) ) if len(data[mask_outside]) > 0: warnings.warn(f"Spikes outside any segment. Detected on segment #{i}") ev_ids[mask_outside] -= 1 # If some nev data are outside of this nsX segment, increase their segment ids # and the ids of all following segments. They are checked for the next nsX # segment then. If they do not fit any of them, # a warning will be shown, indicating how far outside the segment spikes are # If they fit the next segment, more segments are possible in nev, # because a new one has been discovered if len(data[mask_after_seg]) > 0: # Warning if spikes are after last segment if i == len(list_nonempty_nsx_segments) - 1: timestamp_resolution = self.__nsx_params[self.__nsx_spec[nsx_nb]]( "timestamp_resolution", nsx_nb ) time_after_seg = ( data[mask_after_seg]["timestamp"][-1] - end_of_current_nsx_seg ) / timestamp_resolution warnings.warn(f"Spikes {time_after_seg}s after last segment.") # Break out of loop because it's the last iteration # and the spikes should stay connected to last segment break # If reset and no segment detected in nev, then these segments cannot be # distinguished in nev, which is a big problem # XXX 96 is an arbitrary number based on observations in available files elif list_nonempty_nsx_segments[i + 1]["timestamp"] - nsx_offset <= 96: # If not all definitely belong to the next segment, # then it cannot be distinguished where some belong if len(data[ev_ids == i]) != len(data[mask_after_seg]): raise ValueError("Some segments in nsX cannot be detected in nev") # Actual processing if no problem has occurred nb_possible_nev_segments += 1 ev_ids[ev_ids > i] += 1 ev_ids[mask_after_seg] += 1 # consistency check: same number of segments for nsx and nev data if nb_possible_nev_segments != len(nonempty_nsx_segments): raise NeoReadWriteError( f"Inconsistent ns{nsx_nb} and nev file. {nb_possible_nev_segments} " f"segments present in .nev file, but {len(nonempty_nsx_segments)} in " f"ns{nsx_nb} file." ) new_nev_segment_id_mapping = dict(zip(range(nb_possible_nev_segments), sorted(list(nonempty_nsx_segments)))) # replacing event ids by matched event ids in place for k, (data, ev_ids) in self.nev_data.items(): if len(ev_ids): ev_ids[:] = np.vectorize(new_nev_segment_id_mapping.__getitem__)(ev_ids) def __read_nev_data_variant_a(self): """ Extract nev data from a 2.1 & 2.2 .nev file """ nev_data_masks = {"NonNeural": "a", "Spikes": "a"} nev_data_types = {"NonNeural": "a", "Spikes": "a"} return self.__read_nev_data(nev_data_masks, nev_data_types) def __read_nev_data_variant_b(self): """ Extract nev data from a 2.3 .nev file """ nev_data_masks = { "NonNeural": "a", "Spikes": "b", "Comments": "a", "VideoSync": "a", "TrackingEvents": "a", "ButtonTrigger": "a", "ConfigEvent": "a", } nev_data_types = { "NonNeural": "b", "Spikes": "a", "Comments": "a", "VideoSync": "a", "TrackingEvents": "a", "ButtonTrigger": "a", "ConfigEvent": "a", } return self.__read_nev_data(nev_data_masks, nev_data_types) def __read_nev_data_variant_c(self): """ Extract nev data from a 3.0 .nev file """ nev_data_masks = { "NonNeural": "a", "Spikes": "b", "Comments": "a", "VideoSync": "a", "TrackingEvents": "a", "ButtonTrigger": "a", "ConfigEvent": "a", } nev_data_types = { "NonNeural": "c", "Spikes": "b", "Comments": "b", "VideoSync": "b", "TrackingEvents": "b", "ButtonTrigger": "b", "ConfigEvent": "b", } return self.__read_nev_data(nev_data_masks, nev_data_types) def __nev_ext_header_types(self): """ Defines extended header types for different .nev file specifications. """ nev_ext_header_types = { b"NEUEVWAV": { # Version>=2.1 "a": [ ("packet_id", "S8"), ("electrode_id", "uint16"), ("physical_connector", "uint8"), ("connector_pin", "uint8"), ("digitization_factor", "uint16"), ("energy_threshold", "uint16"), ("hi_threshold", "int16"), ("lo_threshold", "int16"), ("nb_sorted_units", "uint8"), # number of bytes per waveform sample ("bytes_per_waveform", "uint8"), ("unused", "S10"), ], # Version>=2.3 "b": [ ("packet_id", "S8"), ("electrode_id", "uint16"), ("physical_connector", "uint8"), ("connector_pin", "uint8"), ("digitization_factor", "uint16"), ("energy_threshold", "uint16"), ("hi_threshold", "int16"), ("lo_threshold", "int16"), ("nb_sorted_units", "uint8"), # number of bytes per waveform sample ("bytes_per_waveform", "uint8"), # number of samples for each waveform ("spike_width", "uint16"), ("unused", "S8"), ], }, b"ARRAYNME": {"a": [("packet_id", "S8"), ("electrode_array_name", "S24")]}, b"ECOMMENT": {"a": [("packet_id", "S8"), ("extra_comment", "S24")]}, b"CCOMMENT": {"a": [("packet_id", "S8"), ("continued_comment", "S24")]}, b"MAPFILE": {"a": [("packet_id", "S8"), ("mapFile", "S24")]}, b"NEUEVLBL": { "a": [ ("packet_id", "S8"), ("electrode_id", "uint16"), # label of this electrode ("label", "S16"), ("unused", "S6"), ] }, b"NEUEVFLT": { "a": [ ("packet_id", "S8"), ("electrode_id", "uint16"), ("hi_freq_corner", "uint32"), ("hi_freq_order", "uint32"), # 0=None 1=Butterworth ("hi_freq_type", "uint16"), ("lo_freq_corner", "uint32"), ("lo_freq_order", "uint32"), # 0=None 1=Butterworth ("lo_freq_type", "uint16"), ("unused", "S2"), ] }, b"DIGLABEL": { "a": [ ("packet_id", "S8"), # Read name of digital ("label", "S16"), # 0=serial, 1=parallel ("mode", "uint8"), ("unused", "S7"), ] }, b"NSASEXEV": { "a": [ ("packet_id", "S8"), # Read frequency of periodic packet generation ("frequency", "uint16"), # Read if digital input triggers events ("digital_input_config", "uint8"), # Read if analog input triggers events ("analog_channel_1_config", "uint8"), ("analog_channel_1_edge_detec_val", "uint16"), ("analog_channel_2_config", "uint8"), ("analog_channel_2_edge_detec_val", "uint16"), ("analog_channel_3_config", "uint8"), ("analog_channel_3_edge_detec_val", "uint16"), ("analog_channel_4_config", "uint8"), ("analog_channel_4_edge_detec_val", "uint16"), ("analog_channel_5_config", "uint8"), ("analog_channel_5_edge_detec_val", "uint16"), ("unused", "S6"), ] }, b"VIDEOSYN": { "a": [ ("packet_id", "S8"), ("video_source_id", "uint16"), ("video_source", "S16"), ("frame_rate", "float32"), ("unused", "S2"), ] }, b"TRACKOBJ": { "a": [ ("packet_id", "S8"), ("trackable_type", "uint16"), ("trackable_id", "uint16"), ("point_count", "uint16"), ("video_source", "S16"), ("unused", "S2"), ] }, } return nev_ext_header_types def __nev_data_masks(self, packet_ids): """ Defines data masks for different .nev file specifications depending on the given packet identifiers. """ __nev_data_masks = { "NonNeural": {"a": (packet_ids == 0)}, "Spikes": { # Version 2.1 & 2.2 "a": (0 < packet_ids) & (packet_ids <= 255), # Version>=2.3 "b": (0 < packet_ids) & (packet_ids <= 2048), }, "Comments": {"a": (packet_ids == 0xFFFF)}, "VideoSync": {"a": (packet_ids == 0xFFFE)}, "TrackingEvents": {"a": (packet_ids == 0xFFFD)}, "ButtonTrigger": {"a": (packet_ids == 0xFFFC)}, "ConfigEvent": {"a": (packet_ids == 0xFFFB)}, } return __nev_data_masks def __nev_data_types(self, data_size): """ Defines data types for different .nev file specifications depending on the given packet identifiers. """ __nev_data_types = { "NonNeural": { # Version 2.1 & 2.2 "a": [ ("timestamp", "uint32"), ("packet_id", "uint16"), ("packet_insertion_reason", "uint8"), ("reserved", "uint8"), ("digital_input", "uint16"), ("analog_input_channel_1", "int16"), ("analog_input_channel_2", "int16"), ("analog_input_channel_3", "int16"), ("analog_input_channel_4", "int16"), ("analog_input_channel_5", "int16"), ("unused", f"S{data_size - 20}"), ], # Version=2.3 "b": [ ("timestamp", "uint32"), ("packet_id", "uint16"), ("packet_insertion_reason", "uint8"), ("reserved", "uint8"), ("digital_input", "uint16"), ("unused", f"S{data_size - 10}"), ], # Version >= 3.0 "c": [ ("timestamp", "uint64"), ("packet_id", "uint16"), ("packet_insertion_reason", "uint8"), ("dlen", "uint8"), ("digital_input", "uint16"), ("unused", f"S{data_size - 14}"), ], }, "Spikes": { "a": [ ("timestamp", "uint32"), ("packet_id", "uint16"), ("unit_class_nb", "uint8"), ("reserved", "uint8"), ("waveform", f"S{data_size - 8}"), ], "b": [ ("timestamp", "uint64"), ("packet_id", "uint16"), ("unit_class_nb", "uint8"), ("dlen", "uint8"), ("waveform", f"S{data_size - 12}"), ], }, "Comments": { "a": [ ("timestamp", "uint32"), ("packet_id", "uint16"), ("char_set", "uint8"), ("flag", "uint8"), ("color", "uint32"), ("comment", f"S{data_size - 12}"), ], "b": [ ("timestamp", "uint64"), ("packet_id", "uint16"), ("char_set", "uint8"), ("flag", "uint8"), ("color", "uint32"), ("comment", f"S{data_size - 16}"), ], }, "VideoSync": { "a": [ ("timestamp", "uint32"), ("packet_id", "uint16"), ("video_file_nb", "uint16"), ("video_frame_nb", "uint32"), ("video_elapsed_time", "uint32"), ("video_source_id", "uint32"), ("unused", "int8", (data_size - 20,)), ], "b": [ ("timestamp", "uint64"), ("packet_id", "uint16"), ("video_file_nb", "uint16"), ("video_frame_nb", "uint32"), ("video_elapsed_time", "uint32"), ("video_source_id", "uint32"), ("unused", "int8", (data_size - 24,)), ], }, "TrackingEvents": { "a": [ ("timestamp", "uint32"), ("packet_id", "uint16"), ("parent_id", "uint16"), ("node_id", "uint16"), ("node_count", "uint16"), ("point_count", "uint16"), ("tracking_points", "uint16", ((data_size - 14) // 2,)), ], "b": [ ("timestamp", "uint64"), ("packet_id", "uint16"), ("parent_id", "uint16"), ("node_id", "uint16"), ("node_count", "uint16"), ("point_count", "uint16"), ("tracking_points", "uint16", ((data_size - 18) // 2,)), ], }, "ButtonTrigger": { "a": [ ("timestamp", "uint32"), ("packet_id", "uint16"), ("trigger_type", "uint16"), ("unused", "int8", (data_size - 8,)), ], "b": [ ("timestamp", "uint64"), ("packet_id", "uint16"), ("trigger_type", "uint16"), ("unused", "int8", (data_size - 12,)), ], }, "ConfigEvent": { "a": [ ("timestamp", "uint32"), ("packet_id", "uint16"), ("config_change_type", "uint16"), ("config_changed", f"S{data_size - 8}"), ], "b": [ ("timestamp", "uint64"), ("packet_id", "uint16"), ("config_change_type", "uint16"), ("config_changed", f"S{data_size - 12}"), ], }, } return __nev_data_types def __nev_params(self, param_name): """ Returns wanted nev parameter. """ nev_parameters = { "bytes_in_data_packets": self.__nev_basic_header["bytes_in_data_packets"], "rec_datetime": datetime.datetime( year=self.__nev_basic_header["year"], month=self.__nev_basic_header["month"], day=self.__nev_basic_header["day"], hour=self.__nev_basic_header["hour"], minute=self.__nev_basic_header["minute"], second=self.__nev_basic_header["second"], microsecond=self.__nev_basic_header["millisecond"], ), "max_res": self.__nev_basic_header["timestamp_resolution"], "channel_ids": self.__nev_ext_header[b"NEUEVWAV"]["electrode_id"], "channel_labels": self.__channel_labels[self.__nev_spec](), "event_unit": pq.CompoundUnit(f"1.0/{self.__nev_basic_header['timestamp_resolution']} * s"), "nb_units": dict( zip( self.__nev_ext_header[b"NEUEVWAV"]["electrode_id"], self.__nev_ext_header[b"NEUEVWAV"]["nb_sorted_units"], ) ), "digitization_factor": dict( zip( self.__nev_ext_header[b"NEUEVWAV"]["electrode_id"], self.__nev_ext_header[b"NEUEVWAV"]["digitization_factor"], ) ), "data_size": self.__nev_basic_header["bytes_in_data_packets"], "waveform_size": self.__waveform_size[self.__nev_spec](), "waveform_dtypes": self.__get_waveforms_dtype(), "waveform_sampling_rate": self.__nev_basic_header["sample_resolution"] * pq.Hz, "waveform_time_unit": pq.CompoundUnit(f"1.0/{self.__nev_basic_header['sample_resolution']} * s"), "waveform_unit": pq.uV, } return nev_parameters[param_name] def __get_file_size(self, filename): """ Returns the file size in bytes for the given file. """ filebuf = open(filename, "rb") filebuf.seek(0, os.SEEK_END) file_size = filebuf.tell() filebuf.close() return file_size def __get_min_time(self): """ Returns the smallest time that can be determined from the recording for use as the lower bound n in an interval [n,m). """ tp = [] if self._avail_files["nev"]: tp.extend(self.__get_nev_rec_times()[0]) for nsx_i in self._avail_nsx: tp.extend(self.__nsx_rec_times[self.__nsx_spec[nsx_i]](nsx_i)[0]) return min(tp) def __get_max_time(self): """ Returns the largest time that can be determined from the recording for use as the upper bound m in an interval [n,m). """ tp = [] if self._avail_files["nev"]: tp.extend(self.__get_nev_rec_times()[1]) for nsx_i in self._avail_nsx: tp.extend(self.__nsx_rec_times[self.__nsx_spec[nsx_i]](nsx_i)[1]) return max(tp) def __get_nev_rec_times(self): """ Extracts minimum and maximum time points from a nev file. """ filename = ".".join([self._filenames["nev"], "nev"]) dt = [("timestamp", "uint32")] offset = self.__get_file_size(filename) - self.__nev_params("bytes_in_data_packets") last_data_packet = np.memmap(filename, offset=offset, dtype=dt, mode="r")[0] n_starts = [0 * self.__nev_params("event_unit")] n_stops = [last_data_packet["timestamp"] * self.__nev_params("event_unit")] return n_starts, n_stops def __get_waveforms_dtype(self): """ Extracts the actual waveform dtype set for each channel. """ # Blackrock code giving the appropriate dtype conv = {0: "int8", 1: "int8", 2: "int16", 4: "int32"} # get all electrode ids from nev ext header all_el_ids = self.__nev_ext_header[b"NEUEVWAV"]["electrode_id"] # get the dtype of waveform (this is stupidly complicated) if self.__is_set(np.array(self.__nev_basic_header["additionnal_flags"]), 0): dtype_waveforms = {k: "int16" for k in all_el_ids} else: # extract bytes per waveform waveform_bytes = self.__nev_ext_header[b"NEUEVWAV"]["bytes_per_waveform"] # extract dtype for waveforms fro each electrode dtype_waveforms = dict(zip(all_el_ids, conv[waveform_bytes])) return dtype_waveforms def __get_channel_labels_variant_a(self): """ Returns labels for all channels for file spec 2.1 """ elids = self.__nev_ext_header[b"NEUEVWAV"]["electrode_id"] labels = [] for elid in elids: if elid < 129: labels.append(f"chan{elid}") else: labels.append(f"ainp{(elid - 12 +1 )}") return dict(zip(elids, labels)) def __get_channel_labels_variant_b(self): """ Returns labels for all channels for file spec 2.2 and 2.3 """ elids = self.__nev_ext_header[b"NEUEVWAV"]["electrode_id"] labels = self.__nev_ext_header[b"NEUEVLBL"]["label"] return dict(zip(elids, labels)) if len(labels) > 0 else None def __get_waveform_size_variant_a(self): """ Returns waveform sizes for all channels for file spec 2.1 and 2.2 """ wf_dtypes = self.__get_waveforms_dtype() nb_bytes_wf = self.__nev_basic_header["bytes_in_data_packets"] - 8 wf_sizes = {ch: int(nb_bytes_wf / np.dtype(dt).itemsize) for ch, dt in wf_dtypes.items()} return wf_sizes def __get_waveform_size_variant_b(self): """ Returns waveform sizes for all channels for file spec 2.3 """ elids = self.__nev_ext_header[b"NEUEVWAV"]["electrode_id"] spike_widths = self.__nev_ext_header[b"NEUEVWAV"]["spike_width"] return dict(zip(elids, spike_widths)) def __get_left_sweep_waveforms(self): """ Returns left sweep of waveforms for each channel. Left sweep is defined as the time from the beginning of the waveform to the trigger time of the corresponding spike. """ # TODO: Double check if this is the actual setting for Blackrock wf_t_unit = self.__nev_params("waveform_time_unit") all_ch = self.__nev_params("channel_ids") # TODO: Double check if this is the correct assumption (10 samples) # default value: threshold crossing after 10 samples of waveform wf_left_sweep = {ch: 10 * wf_t_unit for ch in all_ch} # non-default: threshold crossing at center of waveform # wf_size = self.__nev_params('waveform_size') # wf_left_sweep = dict( # [(ch, (wf_size[ch] / 2) * wf_t_unit) for ch in all_ch]) return wf_left_sweep def __get_nsx_param_variant_a(self, nsx_nb): """ Returns parameter (param_name) for a given nsx (nsx_nb) for file spec 2.1. """ # Here, min/max_analog_val and min/max_digital_val are not available in # the nsx, so that we must estimate these parameters from the # digitization factor of the nev (information by Kian Torab, Blackrock # Microsystems). Here dig_factor=max_analog_val/max_digital_val. We set # max_digital_val to 1000, and max_analog_val=dig_factor. dig_factor is # given in nV by definition, so the units turn out to be uV. labels = [] dig_factor = [] for elid in self.__nsx_ext_header[nsx_nb]["electrode_id"]: if self._avail_files["nev"]: # This is a workaround for the DigitalFactor overflow in NEV # files recorded with buggy Cerebus system. # Fix taken from: NMPK toolbox by Blackrock, # file openNEV, line 464, # git rev. d0a25eac902704a3a29fa5dfd3aed0744f4733ed df = self.__nev_params("digitization_factor")[elid] if df == 21516: df = 152592.547 dig_factor.append(df) else: dig_factor.append(float("nan")) if elid < 129: labels.append(f"chan{elid}") else: labels.append(f"ainp{(elid - 129 + 1)}") filename = ".".join([self._filenames["nsx"], f"ns{nsx_nb}"]) bytes_in_headers = ( self.__nsx_basic_header[nsx_nb].dtype.itemsize + self.__nsx_ext_header[nsx_nb].dtype.itemsize * self.__nsx_basic_header[nsx_nb]["channel_count"] ) if np.isnan(dig_factor[0]): units = "" warnings.warn("Cannot rescale to voltage, raw data will be returned.", UserWarning) else: units = "uV" nsx_parameters = { "nb_data_points": int( (self.__get_file_size(filename) - bytes_in_headers) / (2 * self.__nsx_basic_header[nsx_nb]["channel_count"]) - 1 ), "labels": labels, "units": np.array([units] * self.__nsx_basic_header[nsx_nb]["channel_count"]), "min_analog_val": -1 * np.array(dig_factor, dtype="float"), "max_analog_val": np.array(dig_factor, dtype="float"), "min_digital_val": np.array([-1000] * self.__nsx_basic_header[nsx_nb]["channel_count"]), "max_digital_val": np.array([1000] * self.__nsx_basic_header[nsx_nb]["channel_count"]), "timestamp_resolution": 30000, "bytes_in_headers": bytes_in_headers, "sampling_rate": 30000 / self.__nsx_basic_header[nsx_nb]["period"] * pq.Hz, "time_unit": pq.CompoundUnit(f"1.0/{30000 / self.__nsx_basic_header[nsx_nb]['period']}*s"), } # Returns complete dictionary because then it does not need to be called so often return nsx_parameters def __get_nsx_param_variant_b(self, param_name, nsx_nb): """ Returns parameter (param_name) for a given nsx (nsx_nb) for file spec 2.2 and 2.3. """ nsx_parameters = { "labels": self.__nsx_ext_header[nsx_nb]["electrode_label"], "units": self.__nsx_ext_header[nsx_nb]["units"], "min_analog_val": self.__nsx_ext_header[nsx_nb]["min_analog_val"], "max_analog_val": self.__nsx_ext_header[nsx_nb]["max_analog_val"], "min_digital_val": self.__nsx_ext_header[nsx_nb]["min_digital_val"], "max_digital_val": self.__nsx_ext_header[nsx_nb]["max_digital_val"], "timestamp_resolution": self.__nsx_basic_header[nsx_nb]["timestamp_resolution"], "bytes_in_headers": self.__nsx_basic_header[nsx_nb]["bytes_in_headers"], "sampling_rate": self.__nsx_basic_header[nsx_nb]["timestamp_resolution"] / self.__nsx_basic_header[nsx_nb]["period"] * pq.Hz, "time_unit": pq.CompoundUnit( f"1.0/{self.__nsx_basic_header[nsx_nb]['timestamp_resolution'] / self.__nsx_basic_header[nsx_nb]['period']}*s" ), } return nsx_parameters[param_name] def __get_nonneural_evdicts_variant_a(self, data): """ Defines event types and the necessary parameters to extract them from a 2.1 and 2.2 nev file. """ # TODO: add annotations of nev ext header (NSASEXEX) to event types # digital events event_types = { "digital_input_port": { "name": "digital_input_port", "field": "digital_input", "mask": data["packet_insertion_reason"] == 1, "desc": "Events of the digital input port", }, "serial_input_port": { "name": "serial_input_port", "field": "digital_input", "mask": data["packet_insertion_reason"] == 129, "desc": "Events of the serial input port", }, } # analog input events via threshold crossings for ch in range(5): event_types.update( { f"analog_input_channel_{ch + 1}": { "name": f"analog_input_channel_{ch + 1}", "field": f"analog_input_channel_{ch + 1}", "mask": self.__is_set(data["packet_insertion_reason"], ch + 1), "desc": f"Values of analog input channel {ch + 1} in mV " "(+/- 5000)", } } ) # TODO: define field and desc event_types.update( { "periodic_sampling_events": { "name": "periodic_sampling_events", "field": "digital_input", "mask": self.__is_set(data["packet_insertion_reason"], 6), "desc": "Periodic sampling event of a certain frequency", } } ) return event_types def __delete_empty_segments(self): """ If there are empty segments (e.g. due to a reset or clock synchronization across two systems), these can be discarded. If this is done, all the data and data_headers need to be remapped to become a range starting from 0 again. Nev data are mapped accordingly to stay with their corresponding segment in the nsX data. """ # Discard empty segments removed_seg = [] for data_bl in range(self._nb_segment): keep_seg = True for nsx_nb in self.nsx_to_load: length = self.nsx_datas[nsx_nb][data_bl].shape[0] keep_seg = keep_seg and (length >= 2) if not keep_seg: removed_seg.append(data_bl) for nsx_nb in self.nsx_to_load: self.nsx_datas[nsx_nb].pop(data_bl) self.__nsx_data_header[nsx_nb].pop(data_bl) # Keys need to be increasing from 0 to maximum in steps of 1 # To ensure this after removing empty segments, some keys need to be re mapped for i in removed_seg[::-1]: for j in range(i + 1, self._nb_segment): # remap nsx seg index for nsx_nb in self.nsx_to_load: data = self.nsx_datas[nsx_nb].pop(j) self.nsx_datas[nsx_nb][j - 1] = data data_header = self.__nsx_data_header[nsx_nb].pop(j) self.__nsx_data_header[nsx_nb][j - 1] = data_header # Also remap nev data, ev_ids are the equivalent to keys above if self._avail_files["nev"]: for k, (data, ev_ids) in self.nev_data.items(): ev_ids[ev_ids == j] -= 1 self._nb_segment -= 1 def __get_nonneural_evdicts_variant_b(self, data): """ Defines event types and the necessary parameters to extract them from a 2.3 nev file. """ # digital events if not np.all(np.isin(data["packet_insertion_reason"], [1, 129])): # Blackrock spec gives reason==64 means PERIODIC, but never seen this live warnings.warn("Unknown event codes found", RuntimeWarning) event_types = { "digital_input_port": { "name": "digital_input_port", "field": "digital_input", "mask": self.__is_set(data["packet_insertion_reason"], 0) & ~self.__is_set(data["packet_insertion_reason"], 7), "desc": "Events of the digital input port", }, "serial_input_port": { "name": "serial_input_port", "field": "digital_input", "mask": self.__is_set(data["packet_insertion_reason"], 0) & self.__is_set(data["packet_insertion_reason"], 7), "desc": "Events of the serial input port", }, } return event_types def __get_comment_evdict_variant_a(self, data): return { "comments": {"name": "comments", "field": "comment", "mask": data["packet_id"] == 65535, "desc": "Comments"} } def __is_set(self, flag, pos): """ Checks if bit is set at the given position for flag. If flag is an array, an array will be returned. """ return flag & (1 << pos) > 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/brainvisionrawio.py0000644000175100001660000002107414743453644017643 0ustar00runnerdocker""" Class for reading data from BrainVision product. This code was originally made by L. Pezard (2010), modified B. Burle and S. More. Author: Samuel Garcia """ import os import re import numpy as np from .baserawio import ( BaseRawWithBufferApiIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) from .utils import get_memmap_shape from neo.core import NeoReadWriteError class BrainVisionRawIO(BaseRawWithBufferApiIO): """Class for reading BrainVision files Parameters ---------- filename: str, default: '' The *.vhdr file to load Examples -------- >>> import neo.rawio >>> reader = neo.rawio.BrainVisionRawIO(filename=data_filename) """ extensions = ["vhdr"] rawmode = "one-file" def __init__(self, filename=""): BaseRawWithBufferApiIO.__init__(self) self.filename = str(filename) def _parse_header(self): # Read header file (vhdr) vhdr_header = read_brainvsion_soup(self.filename) bname = os.path.basename(self.filename) marker_filename = self.filename.replace(bname, vhdr_header["Common Infos"]["MarkerFile"]) binary_filename = self.filename.replace(bname, vhdr_header["Common Infos"]["DataFile"]) if vhdr_header["Common Infos"]["DataFormat"] != "BINARY": raise NeoReadWriteError( f"Only `BINARY` format has been implemented. Current Data Format is {vhdr_header['Common Infos']['DataFormat']}" ) if vhdr_header["Common Infos"]["DataOrientation"] != "MULTIPLEXED": raise NeoReadWriteError( f"Only `MULTIPLEXED` is implemented. Current Orientation is {vhdr_header['Common Infos']['DataOrientation']}" ) nb_channel = int(vhdr_header["Common Infos"]["NumberOfChannels"]) sr = 1.0e6 / float(vhdr_header["Common Infos"]["SamplingInterval"]) self._sampling_rate = sr fmt = vhdr_header["Binary Infos"]["BinaryFormat"] fmts = { "INT_16": np.int16, "INT_32": np.int32, "IEEE_FLOAT_32": np.float32, } if fmt not in fmts: raise NeoReadWriteError(f"the fmt {fmt} is not implmented. Must be one of {fmts}") sig_dtype = np.dtype(fmts[fmt]) stream_id = "0" buffer_id = "0" self._buffer_descriptions = {0: {0: {}}} self._stream_buffer_slice = {} shape = get_memmap_shape(binary_filename, sig_dtype, num_channels=nb_channel, offset=0) self._buffer_descriptions[0][0][buffer_id] = { "type": "raw", "file_path": binary_filename, "dtype": str(sig_dtype), "order": "C", "file_offset": 0, "shape": shape, } self._stream_buffer_slice[stream_id] = None signal_buffers = np.array([("Signals", "0")], dtype=_signal_buffer_dtype) signal_streams = np.array([("Signals", "0", "0")], dtype=_signal_stream_dtype) sig_channels = [] channel_infos = vhdr_header["Channel Infos"] for c in range(nb_channel): try: channel_desc = channel_infos[f"Ch{c+1}"] except KeyError: channel_desc = channel_infos[f"ch{c + 1}"] # split up channel description, handling default values cds = channel_desc.split(",") name = cds[0] if len(cds) >= 2: ref = cds[1] else: ref = "" if len(cds) >= 3: res = cds[2] else: res = "1.0" if len(cds) == 4: units = cds[3] else: units = "u" units = units.replace("µ", "u") # Brainvision spec for specific unicode chan_id = str(c + 1) if sig_dtype == np.int16 or sig_dtype == np.int32: gain = float(res) else: gain = 1 offset = 0 stream_id = "0" buffer_id = "0" sig_channels.append( (name, chan_id, self._sampling_rate, sig_dtype, units, gain, offset, stream_id, buffer_id) ) sig_channels = np.array(sig_channels, dtype=_signal_channel_dtype) # No spikes spike_channels = [] spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) # read all markers in memory all_info = read_brainvsion_soup(marker_filename)["Marker Infos"] ev_types = [] ev_timestamps = [] ev_labels = [] for i in range(len(all_info)): ev_type, ev_label, pos, size, channel = all_info[f"Mk{i+1}"].split(",")[:5] ev_types.append(ev_type) ev_timestamps.append(int(pos)) ev_labels.append(ev_label) ev_types = np.array(ev_types) ev_timestamps = np.array(ev_timestamps) ev_labels = np.array(ev_labels, dtype="U") # group them by types self._raw_events = [] event_channels = [] for c, ev_type in enumerate(np.unique(ev_types)): ind = ev_types == ev_type event_channels.append((ev_type, "", "event")) self._raw_events.append((ev_timestamps[ind], ev_labels[ind])) event_channels = np.array(event_channels, dtype=_event_channel_dtype) # fille into header dict self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [1] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = sig_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels self._generate_minimal_annotations() if "Coordinates" in vhdr_header: sig_annotations = self.raw_annotations["blocks"][0]["segments"][0]["signals"][0] all_coords = [] for c in range(sig_channels.size): coords = vhdr_header["Coordinates"][f"Ch{c+1}"] all_coords.append([float(v) for v in coords.split(",")]) all_coords = np.array(all_coords) for dim in range(all_coords.shape[1]): sig_annotations["__array_annotations__"][f"coordinates_{dim}"] = all_coords[:, dim] def _source_name(self): return self.filename def _segment_t_start(self, block_index, seg_index): return 0.0 def _segment_t_stop(self, block_index, seg_index): sig_size = self.get_signal_size(block_index, seg_index, 0) t_stop = sig_size / self._sampling_rate return t_stop ### def _get_signal_t_start(self, block_index, seg_index, stream_index): return 0.0 ### def _spike_count(self, block_index, seg_index, unit_index): return 0 ### # event and epoch zone def _event_count(self, block_index, seg_index, event_channel_index): all_timestamps, all_label = self._raw_events[event_channel_index] return all_timestamps.size def _get_event_timestamps(self, block_index, seg_index, event_channel_index, t_start, t_stop): timestamps, labels = self._raw_events[event_channel_index] if t_start is not None: keep = timestamps >= int(t_start * self._sampling_rate) timestamps = timestamps[keep] labels = labels[keep] if t_stop is not None: keep = timestamps <= int(t_stop * self._sampling_rate) timestamps = timestamps[keep] labels = labels[keep] durations = None return timestamps, durations, labels raise (NotImplementedError) def _rescale_event_timestamp(self, event_timestamps, dtype, event_channel_index): event_times = event_timestamps.astype(dtype) / self._sampling_rate return event_times def _get_analogsignal_buffer_description(self, block_index, seg_index, buffer_id): return self._buffer_descriptions[block_index][seg_index][buffer_id] def read_brainvsion_soup(filename): with open(filename, "r", encoding="utf8") as f: section = None all_info = {} for line in f: line = line.strip("\n").strip("\r") if line.startswith("["): section = re.findall(r"\[([\S ]+)\]", line)[0] all_info[section] = {} continue if line.startswith(";"): continue if "=" in line and len(line.split("=")) == 2: k, v = line.split("=") all_info[section][k] = v return all_info ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/cedrawio.py0000644000175100001660000002207114743453644016051 0ustar00runnerdocker""" Class for reading data from CED (Cambridge Electronic Design) http://ced.co.uk/ This reads *.smrx (and *.smr) from spike2 and signal software. Note Spike2RawIO/Spike2IO is the old implementation in neo. It still works without any dependency and should be faster. Spike2IO only works for smr (32 bit) and not for smrx (64 bit) files. This implementation depends on the SONPY package: https://pypi.org/project/sonpy/ Please note that the SONPY package: * is NOT open source * internally uses a list instead of numpy.ndarray, potentially causing slow data reading * is maintained by CED Author : Samuel Garcia """ import numpy as np from .baserawio import ( BaseRawIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) class CedRawIO(BaseRawIO): """ Class for reading data from CED (Cambridge Electronic Design) spike2. Parameters ---------- filename: str, default: '' The .smr or .smrx file to load take_ideal_sampling_rate: bool, default: False If true use the `GetIdealRate` function from sonpy package Notes ----- * This internally uses the sonpy package which is closed source. * This IO reads smr and smrx files """ extensions = ["smr", "smrx"] rawmode = "one-file" def __init__( self, filename="", take_ideal_sampling_rate=False, ): BaseRawIO.__init__(self) self.filename = filename self.take_ideal_sampling_rate = take_ideal_sampling_rate def _source_name(self): return self.filename def _parse_header(self): import sonpy self.smrx_file = sonpy.lib.SonFile(sName=str(self.filename), bReadOnly=True) smrx = self.smrx_file self._time_base = smrx.GetTimeBase() channel_infos = [] signal_channels = [] spike_channels = [] self._all_spike_ticks = {} for chan_ind in range(smrx.MaxChannels()): chan_type = smrx.ChannelType(chan_ind) chan_id = str(chan_ind) if chan_type == sonpy.lib.DataType.Adc: physical_chan = smrx.PhysicalChannel(chan_ind) divide = smrx.ChannelDivide(chan_ind) if self.take_ideal_sampling_rate: sr = smrx.GetIdealRate(chan_ind) else: sr = 1.0 / (smrx.GetTimeBase() * divide) max_time = smrx.ChannelMaxTime(chan_ind) first_time = smrx.FirstTime(chan_ind, 0, max_time) # max_times is included so +1 time_size = (max_time - first_time) / divide + 1 channel_infos.append((first_time, max_time, divide, time_size, sr)) gain = smrx.GetChannelScale(chan_ind) / 6553.6 offset = smrx.GetChannelOffset(chan_ind) units = smrx.GetChannelUnits(chan_ind) ch_name = smrx.GetChannelTitle(chan_ind) dtype = "int16" # set later after grouping stream_id = "0" buffer_id = "" signal_channels.append((ch_name, chan_id, sr, dtype, units, gain, offset, stream_id, buffer_id)) elif chan_type == sonpy.lib.DataType.AdcMark: # spike and waveforms : only spike times is used here ch_name = smrx.GetChannelTitle(chan_ind) first_time = smrx.FirstTime(chan_ind, 0, max_time) max_time = smrx.ChannelMaxTime(chan_ind) divide = smrx.ChannelDivide(chan_ind) # here we don't use filter (sonpy.lib.MarkerFilter()) so we get all marker wave_marks = smrx.ReadWaveMarks(chan_ind, int(max_time / divide), 0, max_time) # here we load in memory all spike once because the access is really slow # with the ReadWaveMarks spike_ticks = np.array([t.Tick for t in wave_marks]) spike_codes = np.array([t.Code1 for t in wave_marks]) unit_ids = np.unique(spike_codes) for unit_id in unit_ids: name = f"{ch_name}#{unit_id}" spike_chan_id = f"ch{chan_id}#{unit_id}" spike_channels.append((name, spike_chan_id, "", 1, 0, 0, 0)) mask = spike_codes == unit_id self._all_spike_ticks[spike_chan_id] = spike_ticks[mask] signal_channels = np.array(signal_channels, dtype=_signal_channel_dtype) # channels are grouped into stream if they have a common start, stop, size, divide and sampling_rate channel_infos = np.array( channel_infos, dtype=[("first_time", "i8"), ("max_time", "i8"), ("divide", "i8"), ("size", "i8"), ("sampling_rate", "f8")], ) unique_info = np.unique(channel_infos) self.stream_info = unique_info signal_streams = [] for i, info in enumerate(unique_info): stream_id = str(i) mask = channel_infos == info signal_channels["stream_id"][mask] = stream_id num_chans = np.sum(mask) stream_name = f"{stream_id} {num_chans}chans" buffer_id = "" signal_streams.append((stream_name, stream_id, buffer_id)) signal_streams = np.array(signal_streams, dtype=_signal_stream_dtype) # buffer is unknown because using a close source API signal_buffers = np.array([], dtype=_signal_buffer_dtype) # spike channels not handled spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) # event channels not handled event_channels = [] event_channels = np.array(event_channels, dtype=_event_channel_dtype) self._seg_t_start = np.inf self._seg_t_stop = -np.inf for info in self.stream_info: self._seg_t_start = min(self._seg_t_start, info["first_time"] * self._time_base) self._seg_t_stop = max(self._seg_t_stop, info["max_time"] * self._time_base) self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [1] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = signal_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels self._generate_minimal_annotations() def _segment_t_start(self, block_index, seg_index): return self._seg_t_start def _segment_t_stop(self, block_index, seg_index): return self._seg_t_stop def _get_signal_size(self, block_index, seg_index, stream_index): size = self.stream_info[stream_index]["size"] return size def _get_signal_t_start(self, block_index, seg_index, stream_index): info = self.stream_info[stream_index] t_start = info["first_time"] * self._time_base return t_start def _get_analogsignal_chunk(self, block_index, seg_index, i_start, i_stop, stream_index, channel_indexes): if i_start is None: i_start = 0 if i_stop is None: i_stop = self.stream_info[stream_index]["size"] stream_id = self.header["signal_streams"]["id"][stream_index] signal_channels = self.header["signal_channels"] mask = signal_channels["stream_id"] == stream_id signal_channels = signal_channels[mask] if channel_indexes is not None: signal_channels = signal_channels[channel_indexes] num_chans = len(signal_channels) size = i_stop - i_start sigs = np.zeros((size, num_chans), dtype="int16") info = self.stream_info[stream_index] t_from = info["first_time"] + info["divide"] * i_start t_upto = info["first_time"] + info["divide"] * i_stop for i, chan_id in enumerate(signal_channels["id"]): chan_ind = int(chan_id) sig = self.smrx_file.ReadInts(chan=chan_ind, nMax=size, tFrom=t_from, tUpto=t_upto) sigs[:, i] = sig return sigs def _spike_count(self, block_index, seg_index, unit_index): unit_id = self.header["spike_channels"][unit_index]["id"] spike_ticks = self._all_spike_ticks[unit_id] return spike_ticks.size def _get_spike_timestamps(self, block_index, seg_index, unit_index, t_start, t_stop): unit_id = self.header["spike_channels"][unit_index]["id"] spike_ticks = self._all_spike_ticks[unit_id] if t_start is not None: tick_start = int(t_start / self._time_base) spike_ticks = spike_ticks[spike_ticks >= tick_start] if t_stop is not None: tick_stop = int(t_stop / self._time_base) spike_ticks = spike_ticks[spike_ticks <= tick_stop] return spike_ticks def _rescale_spike_timestamp(self, spike_timestamps, dtype): spike_times = spike_timestamps.astype(dtype) spike_times *= self._time_base return spike_times def _get_spike_raw_waveforms(self, block_index, seg_index, spike_channel_index, t_start, t_stop): return None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/edfrawio.py0000644000175100001660000002701014743453644016052 0ustar00runnerdocker""" RawIO for reading EDF and EDF+ files using pyedflib PyEDFLib https://pyedflib.readthedocs.io https://github.com/holgern/pyedflib EDF Format Specifications: https://www.edfplus.info/ Author: Julia Sprenger """ import numpy as np try: from pyedflib import EdfReader HAS_PYEDF = True except ImportError: HAS_PYEDF = False from .baserawio import ( BaseRawIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) class EDFRawIO(BaseRawIO): """ Class for reading European Data Format files (EDF and EDF+). Currently only continuous EDF+ files (EDF+C) and original EDF files (EDF) are supported Parameters ---------- filename: str, default: '' The EDF+C file or EDF file to be loaded Examples -------- >>> import neo.rawio >>> r = neo.rawio.EDFRawIO(filename='file.edf') >>> r.parse_header() >>> print(r) >>> raw_chunk = r.get_analogsignal_chunk(block_index=0, seg_index=0, i_start=0, i_stop=1024, stream_index=0, channel_indexes=range(10)) >>> float_chunk = reader.rescale_signal_raw_to_float(raw_chunk, dtype='float64', channel_indexes=[0, 3, 6]) """ extensions = ["edf"] rawmode = "one-file" def __init__(self, filename=""): if not HAS_PYEDF: raise ValueError("Requires pyedflib") BaseRawIO.__init__(self) # note that this filename is used in self._source_name self.filename = filename self.signal_headers = [] self.edf_header = {} def _source_name(self): return self.filename def _parse_header(self): # read basic header with open(self.filename, "rb") as f: f.seek(192) file_version_header = f.read(44).decode("ascii") # only accepting basic EDF files (no 'EDF+' in header) # or continuous EDF+ files ('EDF+C' in header) if ("EDF+" in file_version_header) and ("EDF+C" not in file_version_header): raise ValueError("Only continuous EDF+ files are currently supported.") self._open_reader() # load headers, signal information and self.edf_header = self.edf_reader.getHeader() self.signal_headers = self.edf_reader.getSignalHeaders() # add annotations to header self._edf_annotations = self.edf_reader.readAnnotations() self.signal_annotations = [[s, d, a] for s, d, a in zip(*self._edf_annotations)] # 1 stream = 1 sampling rate stream_characteristics = [] self.stream_idx_to_chidx = {} signal_channels = [] for ch_idx, sig_dict in enumerate(self.signal_headers): ch_name = sig_dict["label"] chan_id = ch_idx sr = sig_dict["sample_rate"] # Hz dtype = "int16" # assume general int16 based on edf documentation units = sig_dict["dimension"] physical_range = sig_dict["physical_max"] - sig_dict["physical_min"] # number of digital steps resolved (+1 to account for '0') digital_range = sig_dict["digital_max"] - sig_dict["digital_min"] + 1 gain = physical_range / digital_range offset = -1 * sig_dict["digital_min"] * gain + sig_dict["physical_min"] # identify corresponding stream based on sampling rate if (sr,) not in stream_characteristics: stream_characteristics += [(sr,)] stream_id = stream_characteristics.index((sr,)) self.stream_idx_to_chidx.setdefault(stream_id, []).append(ch_idx) buffer_id = "" signal_channels.append((ch_name, chan_id, sr, dtype, units, gain, offset, stream_id, buffer_id)) # convert channel index lists to arrays for indexing self.stream_idx_to_chidx = {k: np.asarray(v) for k, v in self.stream_idx_to_chidx.items()} signal_channels = np.array(signal_channels, dtype=_signal_channel_dtype) signal_streams = [(f"stream ({sr} Hz)", i, "") for i, sr in enumerate(stream_characteristics)] signal_streams = np.array(signal_streams, dtype=_signal_stream_dtype) # no buffer handling here signal_buffers = np.array([], dtype=_signal_buffer_dtype) # no unit/epoch information contained in edf spike_channels = [] spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) event_channels = [] event_channels.append(("Event", "event_channel", "event")) event_channels.append(("Epoch", "epoch_channel", "epoch")) event_channels = np.array(event_channels, dtype=_event_channel_dtype) self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [1] # we only accept continuous edf files self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = signal_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels self._generate_minimal_annotations() # Add custom annotations for neo objects bl_ann = self.raw_annotations["blocks"][0] bl_ann["name"] = "EDF Data Block" bl_ann.update(self.edf_header) seg_ann = bl_ann["segments"][0] seg_ann["name"] = "Seg #0 Block #0" # extract keys for array_annotations common to all signals and not already used ignore_annotations = [ "label", "dimension", "sample_rate", "physical_min", "physical_max", "digital_min", "digital_max", ] array_keys = [] for k in self.signal_headers[0]: if k not in ignore_annotations and all([k in h for h in self.signal_headers]): array_keys.append(k) for array_key in array_keys: array_anno = {array_key: [h[array_key] for h in self.signal_headers]} seg_ann["signals"].append({"__array_annotations__": array_anno}) # We store the following attributes for rapid access without needing the reader self._t_stop = self.edf_reader.datarecord_duration * self.edf_reader.datarecords_in_file # use sample count of first signal in stream self._stream_index_samples = { stream_index: self.edf_reader.getNSamples()[chidx][0] for stream_index, chidx in self.stream_idx_to_chidx.items() } self._number_of_events = len(self.edf_reader.readAnnotations()[0]) self.close() def _get_stream_channels(self, stream_index): return self.header["signal_channels"][self.stream_idx_to_chidx[stream_index]] def _segment_t_start(self, block_index, seg_index): # no time offset provided by EDF format return 0.0 # in seconds def _segment_t_stop(self, block_index, seg_index): # this must return an float scale in second return self._t_stop def _get_signal_size(self, block_index, seg_index, stream_index): return self._stream_index_samples[stream_index] def _get_signal_t_start(self, block_index, seg_index, stream_index): return 0.0 # EDF does not provide temporal offset information def _get_analogsignal_chunk(self, block_index, seg_index, i_start, i_stop, stream_index, channel_indexes): # only dealing with single block and segment edf files if block_index != 0: raise ValueError("`block_index` must be 0") if seg_index != 0: raise ValueError("`seg_index` must be 0") stream_channel_idxs = self.stream_idx_to_chidx[stream_index] # keep all channels of the stream if none are selected if channel_indexes is None: channel_indexes = slice(None) if i_start is None: i_start = 0 if i_stop is None: i_stop = self.get_signal_size(block_index=block_index, seg_index=seg_index, stream_index=stream_index) n = i_stop - i_start # raw_signals = self.edf_reader. am[channel_indexes, i_start:i_stop] selected_channel_idxs = stream_channel_idxs[channel_indexes] # load data into numpy array buffer data = [] self._open_reader() for i, channel_idx in enumerate(selected_channel_idxs): # use int32 for compatibility with pyedflib buffer = np.empty(n, dtype=np.int32) self.edf_reader.read_digital_signal(channel_idx, i_start, n, buffer) data.append(buffer) self._close_reader() # downgrade to int16 as this is what is used in the edf file format # use fortran (column major) order to be more efficient after transposing data = np.asarray(data, dtype=np.int16, order="F") # use dimensions (time, channel) data = data.T return data def _spike_count(self, block_index, seg_index, spike_channel_index): return None def _get_spike_timestamps(self, block_index, seg_index, spike_channel_index, t_start, t_stop): return None def _rescale_spike_timestamp(self, spike_timestamps, dtype): return None def _get_spike_raw_waveforms(self, block_index, seg_index, spike_channel_index, t_start, t_stop): return None def _event_count(self, block_index, seg_index, event_channel_index): return self._number_of_events def _get_event_timestamps(self, block_index, seg_index, event_channel_index, t_start, t_stop): # these time should be already in seconds timestamps, durations, labels = self._edf_annotations if t_start is None: t_start = self.segment_t_start(block_index, seg_index) if t_stop is None: t_stop = self.segment_t_stop(block_index, seg_index) # only consider events and epochs that overlap with t_start t_stop range time_mask = ((t_start < timestamps) & (timestamps < t_stop)) | ( (t_start < (timestamps + durations)) & ((timestamps + durations) < t_stop) ) # separate event from epoch times event_mask = durations[time_mask] == 0 if self.header["event_channels"]["type"][event_channel_index] == b"epoch": event_mask = ~event_mask durations = durations[time_mask][event_mask] elif self.header["event_channels"]["type"][event_channel_index] == b"event": durations = None times = timestamps[time_mask][event_mask] labels = np.asarray(labels[time_mask][event_mask], dtype="U") return times, durations, labels def _rescale_event_timestamp(self, event_timestamps, dtype, event_channel_index): return np.asarray(event_timestamps, dtype=dtype) def _rescale_epoch_duration(self, raw_duration, dtype, event_channel_index): return np.asarray(raw_duration, dtype=dtype) def _open_reader(self): self.edf_reader = EdfReader(self.filename) def __enter__(self): return self def __del__(self): self._close_reader() def __exit__(self, exc_type, exc_val, ex_tb): self._close_reader() def close(self): """ Closes the file handler """ self._close_reader() def _close_reader(self): if hasattr(self, "edf_reader"): self.edf_reader.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/elanrawio.py0000644000175100001660000002526514743453644016245 0ustar00runnerdocker""" Class for reading data from Elan. Elan is software for studying time-frequency maps of EEG data. Elan is developed in Lyon, France, at INSERM U821 https://elan.lyon.inserm.fr An Elan dataset is separated into 3 files : - .eeg raw data file - .eeg.ent header file - .eeg.pos event file Author: Samuel Garcia """ import datetime import re import pathlib import numpy as np from .baserawio import ( BaseRawWithBufferApiIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) from .utils import get_memmap_shape from neo.core import NeoReadWriteError class ElanRawIO(BaseRawWithBufferApiIO): """ Class for reading time-frequency EEG data maps from the Elan software Parameters ---------- filename: str | None, default: None The raw data to load (.eeg) entfile: str | None, default: None The header file to load (.eeg.ent) posfile: str | None, deafult: None The event file to load (.eeg.pos) Examples -------- >>> import neo.rawio >>> reader = neo.rawio.ElanRawIO(filename='data.eeg', entfile='header.eeg.ent', posfile='events.eeg.pos') >>> reader.parse_header() >>> print(reader) """ extensions = ["eeg"] rawmode = "one-file" def __init__(self, filename=None, entfile=None, posfile=None): BaseRawWithBufferApiIO.__init__(self) self.filename = pathlib.Path(filename) # check whether ent and pos files are defined # keep existing suffixes in the process of ent and pos filename # generation if entfile is None: entfile = self.filename.with_suffix(self.filename.suffix + ".ent") if posfile is None: posfile = self.filename.with_suffix(self.filename.suffix + ".pos") self.entfile = entfile self.posfile = posfile def _parse_header(self): with open(self.entfile, mode="rt", encoding="ascii", newline=None) as f: # version version = f.readline()[:-1] if version not in ["V2", "V3"]: raise NeoReadWriteError(f"Reading is only possible for V2 or V3 .eeg.ent files. But {version=}") # info info1 = f.readline()[:-1] info2 = f.readline()[:-1] # strange 2 line for datetime # line1 line = f.readline() r1 = re.findall(r"(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)", line) r2 = re.findall(r"(\d+):(\d+):(\d+)", line) r3 = re.findall(r"(\d+)-(\d+)-(\d+)", line) YY, MM, DD, hh, mm, ss = (None,) * 6 if len(r1) != 0: DD, MM, YY, hh, mm, ss = r1[0] elif len(r2) != 0: hh, mm, ss = r2[0] elif len(r3) != 0: DD, MM, YY = r3[0] # line2 line = f.readline() r1 = re.findall(r"(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)", line) r2 = re.findall(r"(\d+):(\d+):(\d+)", line) r3 = re.findall(r"(\d+)-(\d+)-(\d+)", line) if len(r1) != 0: DD, MM, YY, hh, mm, ss = r1[0] elif len(r2) != 0: hh, mm, ss = r2[0] elif len(r3) != 0: DD, MM, YY = r3[0] try: fulldatetime = datetime.datetime(int(YY), int(MM), int(DD), int(hh), int(mm), int(ss)) except: fulldatetime = None line = f.readline() line = f.readline() line = f.readline() # sampling rate sample line = f.readline() self._sampling_rate = 1.0 / float(line) # nb channel line = f.readline() nb_channel = int(line) - 2 channel_infos = [{} for c in range(nb_channel + 2)] # channel label for c in range(nb_channel + 2): channel_infos[c]["label"] = f.readline()[:-1] # channel kind for c in range(nb_channel + 2): channel_infos[c]["kind"] = f.readline()[:-1] # channel unit for c in range(nb_channel + 2): channel_infos[c]["units"] = f.readline()[:-1] # range for gain and offset for c in range(nb_channel + 2): channel_infos[c]["min_physic"] = float(f.readline()[:-1]) for c in range(nb_channel + 2): channel_infos[c]["max_physic"] = float(f.readline()[:-1]) for c in range(nb_channel + 2): channel_infos[c]["min_logic"] = float(f.readline()[:-1]) for c in range(nb_channel + 2): channel_infos[c]["max_logic"] = float(f.readline()[:-1]) # info filter info_filter = [] for c in range(nb_channel + 2): channel_infos[c]["info_filter"] = f.readline()[:-1] n = int(round(np.log(channel_infos[0]["max_logic"] - channel_infos[0]["min_logic"]) / np.log(2)) / 8) sig_dtype = np.dtype(">i" + str(n)) # unique buffer and stream stream_id = "0" buffer_id = "0" signal_buffers = np.array([("Signals", buffer_id)], dtype=_signal_buffer_dtype) signal_streams = np.array([("Signals", stream_id, buffer_id)], dtype=_signal_stream_dtype) sig_channels = [] for c, chan_info in enumerate(channel_infos): chan_name = chan_info["label"] chan_id = str(c) if c < len(channel_infos) - 2: # standard channels stream_id = "0" else: # last 2 channels are not included in the stream stream_id = "" gain = (chan_info["max_physic"] - chan_info["min_physic"]) / ( chan_info["max_logic"] - chan_info["min_logic"] ) offset = -chan_info["min_logic"] * gain + chan_info["min_physic"] sig_channels.append( ( chan_name, chan_id, self._sampling_rate, sig_dtype, chan_info["units"], gain, offset, stream_id, buffer_id, ) ) sig_channels = np.array(sig_channels, dtype=_signal_channel_dtype) # raw data self._buffer_descriptions = {0: {0: {}}} self._stream_buffer_slice = {} shape = get_memmap_shape(self.filename, sig_dtype, num_channels=nb_channel + 2, offset=0) self._buffer_descriptions[0][0][buffer_id] = { "type": "raw", "file_path": self.filename, "dtype": sig_dtype, "order": "C", "file_offset": 0, "shape": shape, } self._stream_buffer_slice["0"] = slice(0, -2) # triggers with open(self.posfile, mode="rt", encoding="ascii", newline=None) as f: self._raw_event_timestamps = [] self._event_labels = [] self._reject_codes = [] for line in f.readlines(): r = re.findall(r" *(\d+)\s* *(\d+)\s* *(\d+) *", line) self._raw_event_timestamps.append(int(r[0][0])) self._event_labels.append(str(r[0][1])) self._reject_codes.append(str(r[0][2])) self._raw_event_timestamps = np.array(self._raw_event_timestamps, dtype="int64") self._event_labels = np.array(self._event_labels, dtype="U") self._reject_codes = np.array(self._reject_codes, dtype="U") event_channels = [] event_channels.append(("Trigger", "", "event")) event_channels = np.array(event_channels, dtype=_event_channel_dtype) # No spikes spike_channels = [] spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) # fille into header dict self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [1] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = sig_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels # insert some annotation at some place self._generate_minimal_annotations() extra_info = dict(rec_datetime=fulldatetime, elan_version=version, info1=info1, info2=info2) block_annotations = self.raw_annotations["blocks"][0] block_annotations.update(extra_info) seg_annotations = self.raw_annotations["blocks"][0]["segments"][0] seg_annotations.update(extra_info) sig_annotations = self.raw_annotations["blocks"][0]["segments"][0]["signals"][0] for key in ("info_filter", "kind"): values = [channel_infos[c][key] for c in range(nb_channel)] sig_annotations["__array_annotations__"][key] = np.array(values) event_annotations = self.raw_annotations["blocks"][0]["segments"][0]["events"][0] event_annotations["__array_annotations__"]["reject_codes"] = self._reject_codes def _source_name(self): return self.filename def _segment_t_start(self, block_index, seg_index): return 0.0 def _segment_t_stop(self, block_index, seg_index): sig_size = self.get_signal_size(block_index, seg_index, 0) t_stop = sig_size / self._sampling_rate return t_stop def _get_signal_t_start(self, block_index, seg_index, stream_index): if stream_index != 0: raise ValueError("`stream_index` must be 0") return 0.0 def _spike_count(self, block_index, seg_index, unit_index): return 0 def _event_count(self, block_index, seg_index, event_channel_index): return self._raw_event_timestamps.size def _get_event_timestamps(self, block_index, seg_index, event_channel_index, t_start, t_stop): timestamp = self._raw_event_timestamps labels = self._event_labels durations = None if t_start is not None: keep = timestamp >= int(t_start * self._sampling_rate) timestamp = timestamp[keep] labels = labels[keep] if t_stop is not None: keep = timestamp <= int(t_stop * self._sampling_rate) timestamp = timestamp[keep] labels = labels[keep] return timestamp, durations, labels def _rescale_event_timestamp(self, event_timestamps, dtype, event_channel_index): event_times = event_timestamps.astype(dtype) / self._sampling_rate return event_times def _get_analogsignal_buffer_description(self, block_index, seg_index, buffer_id): return self._buffer_descriptions[block_index][seg_index][buffer_id] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/examplerawio.py0000644000175100001660000004633414743453644016761 0ustar00runnerdocker""" ExampleRawIO is a class of a fake example. This is to be used when coding a new RawIO. Rules for creating a new class: 1. Step 1: Create the main class * Create a file in **neo/rawio/** that ends with "rawio.py" * Create the class that inherits from BaseRawIO * copy/paste all methods that need to be implemented. * code hard! The main difficulty is `_parse_header()`. In short you have to create a mandatory dict that contains channel information:: self.header = {} self.header['nb_block'] = 2 self.header['nb_segment'] = [2, 3] self.header['signal_streams'] = signal_streams self.header['signal_channels'] = signal_channels self.header['spike_channels'] = spike_channels self.header['event_channels'] = event_channels 2. Step 2: RawIO test: * create a file in neo/rawio/tests with the same name with "test_" prefix * copy paste neo/rawio/tests/test_examplerawio.py and do the same 3. Step 3: Create the neo.io class with the wrapper * Create a file in neo/io/ that ends with "io.py" * Create a class that inherits both your RawIO class and the BaseFromRaw class * copy/paste from neo/io/exampleio.py 4.Step 4: IO test * create a file in neo/test/iotest with the same name as previously with "test_" prefix * copy/paste from neo/test/iotest/test_exampleio.py """ from __future__ import annotations import numpy as np from pathlib import Path from .baserawio import ( BaseRawIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) class ExampleRawIO(BaseRawIO): """ Class for "reading" fake data from an imaginary file. For the user, it gives access to raw data (signals, event, spikes) as they are in the (fake) file int16 and int64. For a developer, it is just an example showing guidelines for someone who wants to develop a new IO module. Two rules for developers: * Respect the :ref:`section-neo-rawio-API` * Follow the guidelines in :ref:`section-raw-io-recipe` This fake IO: * has 2 blocks * blocks have 2 and 3 segments * has 2 signals streams of 8 channels each (sample_rate = 10000) so 16 channels in total * has 3 spike_channels * has 2 event channels: one has *type=event*, the other has *type=epoch* Usage: >>> import neo.rawio >>> r = neo.rawio.ExampleRawIO(filename='itisafake.nof') >>> r.parse_header() >>> print(r) >>> raw_chunk = r.get_analogsignal_chunk(block_index=0, seg_index=0, i_start=0, i_stop=1024, channel_names=channel_names) >>> float_chunk = reader.rescale_signal_raw_to_float(raw_chunk, dtype='float64', channel_indexes=[0, 3, 6]) >>> spike_timestamp = reader.spike_timestamps(spike_channel_index=0, t_start=None, t_stop=None) >>> spike_times = reader.rescale_spike_timestamp(spike_timestamp, 'float64') >>> ev_timestamps, _, ev_labels = reader.event_timestamps(event_channel_index=0) """ extensions = ["fake"] rawmode = "one-file" def __init__(self, filename: str | Path = ""): BaseRawIO.__init__(self) # note that this filename is ued in self._source_name self.filename = filename def _source_name(self): # this function is used by __repr__ # for general cases self.filename is good # But for URL you could mask some part of the URL to keep # the main part. return self.filename def _parse_header(self): # This is the central part of a RawIO # we need to collect from the original format all # information required for fast access # at any place in the file # In short `_parse_header()` can be slow but # `_get_analogsignal_chunk()` needs to be as fast as possible # create simulated signal streams and buffer information # a buffer is a group of channels that are in the same IO buffer for instance hdf5 or binary that can mapped to with np.memmap : this is optional machinery but must be specified as an empty list if not present # a stream is a set channels that need to be grouped : this is mandatory # very often streams are similar to buffer signal_buffers = [] signal_streams = [] for c in range(2): stream_id = f"{c}" buffer_id = f"{c}" signal_buffers.append((f"buffer {c}", buffer_id)) signal_streams.append((f"stream {c}", stream_id, buffer_id)) signal_buffers = np.array(signal_buffers, dtype=_signal_buffer_dtype) signal_streams = np.array(signal_streams, dtype=_signal_stream_dtype) # create fake signal channels information # This is mandatory!!!! # gain/offset/units are really important because # the scaling to real value will be done with that # The real signal will be evaluated as `(raw_signal * gain + offset) * pq.Quantity(units)` signal_channels = [] for c in range(16): ch_name = f"ch{c}" # our channel id is c+1 just for fun # Note that chan_id should be related to # original channel id in the file format # so that the end user should not be confused when reading datasets chan_id = c + 1 sr = 10000.0 # Hz dtype = "int16" units = "uV" gain = 1000.0 / 2**16 offset = 0.0 # stream_id indicates how to group channels # channels inside a "stream" share the same characteristics # (sampling rate/dtype/t_start/units/...) stream_id = str(c // 8) # buffer_id indicates optionally if channels are in the same buffer # this is optional. In case the buffer concept does not apply then buffer_id must be "" buffer_id = str(c // 8) signal_channels.append((ch_name, chan_id, sr, dtype, units, gain, offset, stream_id, buffer_id)) signal_channels = np.array(signal_channels, dtype=_signal_channel_dtype) # A stream can contain signals with different physical units. # Here, the two last channels will have different units (pA) # Since AnalogSignals must have consistent units across channels, # this stream will be split in 2 parts on the neo.io level and finally 3 AnalogSignals # will be generated per Segment. signal_channels[-2:]["units"] = "pA" # create fake unit channels # This is mandatory!!!! # Note that if there is no waveform at all in the file # then wf_units/wf_gain/wf_offset/wf_left_sweep/wf_sampling_rate # can be set to any value because _spike_raw_waveforms # will return None spike_channels = [] for c in range(3): unit_name = f"unit{c}" unit_id = f"#{c}" wf_units = "uV" wf_gain = 1000.0 / 2**16 wf_offset = 0.0 wf_left_sweep = 20 wf_sampling_rate = 10000.0 spike_channels.append((unit_name, unit_id, wf_units, wf_gain, wf_offset, wf_left_sweep, wf_sampling_rate)) spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) # creating event/epoch channel # This is mandatory!!!! # In RawIO epoch and event are dealt with in the same way. event_channels = [] event_channels.append(("Some events", "ev_0", "event")) event_channels.append(("Some epochs", "ep_1", "epoch")) event_channels = np.array(event_channels, dtype=_event_channel_dtype) # fill information into the header dict # This is mandatory!!!!! self.header = {} self.header["nb_block"] = 2 self.header["nb_segment"] = [2, 3] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = signal_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels # insert some annotations/array_annotations at some place # at neo.io level. IOs can add annotations # to any object. To keep this functionality with the wrapper # BaseFromRaw you can add annotations in a nested dict. # `_generate_minimal_annotations()` must be called to generate the nested # dict of annotations/array_annotations self._generate_minimal_annotations() # this pprint lines really help with understanding the nested (and sometimes complicated) dict # from pprint import pprint # pprint(self.raw_annotations) # Until here all mandatory operations for setting up a rawio are implemented. # The following lines provide additional, recommended annotations for the # final neo objects. for block_index in range(2): bl_ann = self.raw_annotations["blocks"][block_index] bl_ann["name"] = f"Block #{block_index}" bl_ann["block_extra_info"] = f"This is the block {block_index}" for seg_index in range([2, 3][block_index]): seg_ann = bl_ann["segments"][seg_index] seg_ann["name"] = f"Seg #{seg_index} Block #{block_index}" seg_ann["seg_extra_info"] = f"This is the seg {seg_index} of block {block_index}" for c in range(2): sig_an = seg_ann["signals"][c]["nickname"] = f"This stream {c} is from a subdevice" # add some array annotations (8 channels) sig_an = seg_ann["signals"][c]["__array_annotations__"]["impedance"] = np.random.rand(8) * 10000 for c in range(3): spiketrain_an = seg_ann["spikes"][c] spiketrain_an["quality"] = "Good!!" # add some array annotations num_spikes = self.spike_count(block_index, seg_index, c) spiketrain_an["__array_annotations__"]["amplitudes"] = np.random.randn(num_spikes) for c in range(2): event_an = seg_ann["events"][c] if c == 0: event_an["nickname"] = "Miss Event 0" # add some array annotations num_ev = self.event_count(block_index, seg_index, c) event_an["__array_annotations__"]["button"] = ["A"] * num_ev elif c == 1: event_an["nickname"] = "MrEpoch 1" def _segment_t_start(self, block_index: int, seg_index: int): # this must return a float scaled in seconds # this t_start will be shared by all objects in the segment # except AnalogSignal all_starts = [[0.0, 15.0], [0.0, 20.0, 60.0]] return all_starts[block_index][seg_index] def _segment_t_stop(self, block_index: int, seg_index: int): # this must return a float scaled in seconds all_stops = [[10.0, 25.0], [10.0, 30.0, 70.0]] return all_stops[block_index][seg_index] def _get_signal_size(self, block_index: int, seg_index: int, stream_index: int): # We generate fake data in which the two stream signals have the same shape # across all segments (10.0 seconds) # This is not the case for real data, instead you should return the signal # size depending on the block_index and segment_index # this must return an int = the number of samples # Note that channel_indexes can be ignored for most cases # except for the case of several sampling rates. return 100000 def _get_signal_t_start(self, block_index: int, seg_index: int, stream_index: int): # This give the t_start of a signal. # Very often this is equal to _segment_t_start but not # always. # this must return a float scaled in seconds # Note that channel_indexes can be ignored for most cases # except for the case of several sampling rates. # Here this is the same. # this is not always the case return self._segment_t_start(block_index, seg_index) def _get_analogsignal_chunk( self, block_index: int, seg_index: int, i_start: int | None, i_stop: int | None, stream_index: int, channel_indexes: np.ndarray | list | slice | None, ): # this must return a signal chunk in a signal stream # limited with i_start/i_stop (can be None) # channel_indexes can be None (=all channel in the stream) or a list or numpy.array # This must return a numpy array 2D (even with one channel). # This must return the original dtype. No conversion here. # This must be as fast as possible. # To speed up this call all preparatory calculations should be implemented # in _parse_header(). # Here we are lucky: our signals are always zeros!! # it is not always the case :) # internally signals are int16 # conversion to real units is done with self.header['signal_channels'] if i_start is None: i_start = 0 if i_stop is None: i_stop = 100000 if i_start < 0 or i_stop > 100000: # some checks raise IndexError("I don't like your jokes") if channel_indexes is None: nb_chan = 8 elif isinstance(channel_indexes, slice): channel_indexes = np.arange(8, dtype="int")[channel_indexes] nb_chan = len(channel_indexes) else: channel_indexes = np.asarray(channel_indexes) if any(channel_indexes < 0): raise IndexError("bad boy") if any(channel_indexes >= 8): raise IndexError("big bad wolf") nb_chan = len(channel_indexes) raw_signals = np.zeros((i_stop - i_start, nb_chan), dtype="int16") return raw_signals def _spike_count(self, block_index: int, seg_index: int, spike_channel_index: int): # Must return the nb of spikes for given (block_index, seg_index, spike_channel_index) # we are lucky: our units have all the same nb of spikes!! # it is not always the case nb_spikes = 20 return nb_spikes def _get_spike_timestamps( self, block_index: int, seg_index: int, spike_channel_index: int, t_start: float | None, t_stop: float | None ): # In our IO, timestamp are internally coded 'int64' and they # represent the index of the signals 10kHz # we are lucky: spikes have the same discharge in all segments!! # incredible neuron!! This is not always the case # the same clip t_start/t_start must be used in _spike_raw_waveforms() ts_start = self._segment_t_start(block_index, seg_index) * 10000 spike_timestamps = np.arange(0, 10000, 500) + ts_start if t_start is not None or t_stop is not None: # restrict spikes to given limits (in seconds) lim0 = int(t_start * 10000) lim1 = int(t_stop * 10000) mask = (spike_timestamps >= lim0) & (spike_timestamps <= lim1) spike_timestamps = spike_timestamps[mask] return spike_timestamps def _rescale_spike_timestamp(self, spike_timestamps: np.ndarray, dtype: np.dtype): # must rescale to seconds, a particular spike_timestamps # with a fixed dtype so the user can choose the precision they want. spike_times = spike_timestamps.astype(dtype) spike_times /= 10000.0 # because 10kHz return spike_times def _get_spike_raw_waveforms( self, block_index: int, seg_index: int, spike_channel_index: int, t_start: float | None, t_stop: float | None ): # this must return a 3D numpy array (nb_spike, nb_channel, nb_sample) # in the original dtype # this must be as fast as possible. # the same clip t_start/t_start must be used in _spike_timestamps() # If there there is no waveform supported in the # IO them _spike_raw_waveforms must return None # In our IO waveforms come from all channels # they are int16 # conversion to real units is done with self.header['spike_channels'] # Here, we have a realistic case: all waveforms are only noise. # it is not always the case # we get 20 spikes with a sweep of 50 (5ms) # trick to get how many spike in the slice ts = self._get_spike_timestamps(block_index, seg_index, spike_channel_index, t_start, t_stop) nb_spike = ts.size np.random.seed(2205) # a magic number (my birthday) waveforms = np.random.randint(low=-(2**4), high=2**4, size=nb_spike * 50, dtype="int16") waveforms = waveforms.reshape(nb_spike, 1, 50) return waveforms def _event_count(self, block_index: int, seg_index: int, event_channel_index: int): # event and spike are very similar # we have 2 event channels if event_channel_index == 0: # event channel return 6 elif event_channel_index == 1: # epoch channel return 10 def _get_event_timestamps( self, block_index: int, seg_index: int, event_channel_index: int, t_start: float | None, t_stop: float | None ): # the main difference between spike channel and event channel # is that for event channels we have 3D numpy array (timestamp, durations, labels) where # durations must be None for 'event' # label must a dtype ='U' # in our IO events are directly coded in seconds seg_t_start = self._segment_t_start(block_index, seg_index) if event_channel_index == 0: timestamp = np.arange(0, 6, dtype="float64") + seg_t_start durations = None labels = np.array(["trigger_a", "trigger_b"] * 3, dtype="U12") elif event_channel_index == 1: timestamp = np.arange(0, 10, dtype="float64") + 0.5 + seg_t_start durations = np.ones((10), dtype="float64") * 0.25 labels = np.array(["zoneX"] * 5 + ["zoneZ"] * 5, dtype="U12") if t_start is not None: keep = timestamp >= t_start timestamp, labels = timestamp[keep], labels[keep] if durations is not None: durations = durations[keep] if t_stop is not None: keep = timestamp <= t_stop timestamp, labels = timestamp[keep], labels[keep] if durations is not None: durations = durations[keep] return timestamp, durations, labels def _rescale_event_timestamp(self, event_timestamps: np.ndarray, dtype: np.dtype, event_channel_index: int): # must rescale to seconds for a particular event_timestamps # with a fixed dtype so the user can choose the precision they want. # really easy here because in our case it is already in seconds event_times = event_timestamps.astype(dtype) return event_times def _rescale_epoch_duration(self, raw_duration: np.ndarray, dtype: np.dtype, event_channel_index: int): # really easy here because in our case it is already in seconds durations = raw_duration.astype(dtype) return durations ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/intanrawio.py0000644000175100001660000015342214743453644016434 0ustar00runnerdocker""" Support for intan tech rhd and rhs files. These 2 formats are more or less the same but: * some variance in headers. * rhs amplifier is more complex because the optional DC channel RHS supported version 1.0 RHD supported version 1.0 1.1 1.2 1.3 2.0 3.0, 3.1 RHD headerless binary support 3.x RHS headerless binary support 3.x See: * http://intantech.com/files/Intan_RHD2000_data_file_formats.pdf * http://intantech.com/files/Intan_RHS2000_data_file_formats.pdf Author: Samuel Garcia (Initial), Zach McKenzie & Heberto Mayorquin (Updates) """ from pathlib import Path from packaging.version import Version import warnings import numpy as np from neo.core import NeoReadWriteError from .baserawio import ( BaseRawIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) class IntanRawIO(BaseRawIO): """ Class for reading rhd and rhs Intan data Parameters ---------- filename: str, default: '' name of the 'rhd' or 'rhs' data/header file ignore_integrity_checks: bool, default: False If True, data that violates integrity assumptions will be loaded. At the moment the only integrity check we perform is that timestamps are continuous. Setting this to True will ignore this check and set the attribute `discontinuous_timestamps` to True if the timestamps are not continous. This attribute can be checked after parsing the header to see if the timestamps are continuous or not. Notes ----- * The Intan reader can handle two file formats 'rhd' and 'rhs'. It will automatically check for the file extension and will gather the header information based on the extension. Additionally it functions with RHS v 1.0 and v 3.x and RHD 1.0, 1.1, 1.2, 1.3, 2.0, 3.x files. * The Intan reader can also handle the headerless binary formats 'one-file-per-signal' and 'one-file-per-channel' which have a header file called 'info.rhd' or 'info.rhs' and a series of binary files with the '.dat' suffix * The reader can handle three file formats 'header-attached', 'one-file-per-signal' and 'one-file-per-channel'. * Intan files contain amplifier channels labeled 'A', 'B' 'C' or 'D' depending on the port in which they were recorded along with the following additional streams. 0: 'RHD2000' amplifier channel 1: 'RHD2000 auxiliary input channel', 2: 'RHD2000 supply voltage channel', 3: 'USB board ADC input channel', 4: 'USB board digital input channel', 5: 'USB board digital output channel' And for RHS: 0: 'RHS2000 amplfier channel' 3: 'USB board ADC input channel', 4: 'USB board ADC output channel', 5: 'USB board digital input channel', 6: 'USB board digital output channel', 10: 'DC Amplifier channel', 11: 'Stim channel', * For the "header-attached" and "one-file-per-signal" formats, the structure of the digital input and output channels is one long vector, which must be post-processed to extract individual digital channel information. See the intantech website for more information on performing this post-processing. Examples -------- >>> import neo.rawio >>> # for a header-attached file >>> reader = neo.rawio.IntanRawIO(filename='data.rhd') >>> # for the other formats we point to the info.rhd >>> reader = neo.rawioIntanRawIO(filename='info.rhd') >>> reader.parse_header() >>> raw_chunk = reader.get_analogsignal_chunk(block_index=0, seg_index=0 stream_index=0) >>> float_chunk = reader.rescale_signal_raw_to_float(raw_chunk, stream_index=0) """ extensions = ["rhd", "rhs", "dat"] rawmode = "one-file" def __init__(self, filename="", ignore_integrity_checks=False): BaseRawIO.__init__(self) self.filename = Path(filename) self.ignore_integrity_checks = ignore_integrity_checks self.discontinuous_timestamps = False def _source_name(self): return self.filename def _parse_header(self): self.filename = Path(self.filename) # Input checks if not self.filename.is_file(): raise FileNotFoundError(f"{self.filename} does not exist") if not self.filename.suffix in [".rhd", ".rhs"]: raise ValueError(f"{self.filename} is not a valid Intan file. Expected .rhd or .rhs extension") # see comment below for RHD which explains the division between file types if self.filename.suffix == ".rhs": if self.filename.name == "info.rhs": if any((self.filename.parent / file).exists() for file in stream_name_to_file_name_rhs.values()): self.file_format = "one-file-per-signal" raw_file_paths_dict = create_one_file_per_signal_dict_rhs(dirname=self.filename.parent) else: self.file_format = "one-file-per-channel" raw_file_paths_dict = create_one_file_per_channel_dict_rhs(dirname=self.filename.parent) else: self.file_format = "header-attached" ( self._global_info, self._ordered_channel_info, memmap_data_dtype, header_size, self._block_size, channel_number_dict, ) = read_rhs(self.filename, self.file_format) # 3 possibilities for rhd files, one combines the header and the data in the same file with suffix `rhd` while # the other two separates the data from the header which is always called `info.rhd` # attached to the actual binary file with data elif self.filename.suffix == ".rhd": if self.filename.name == "info.rhd": # first we have one-file-per-signal which is where one neo stream/file is saved as .dat files if any((self.filename.parent / file).exists() for file in stream_name_to_file_name_rhd.values()): self.file_format = "one-file-per-signal" raw_file_paths_dict = create_one_file_per_signal_dict_rhd(dirname=self.filename.parent) # then there is one-file-per-channel where each channel in a neo stream is in its own .dat file else: self.file_format = "one-file-per-channel" raw_file_paths_dict = create_one_file_per_channel_dict_rhd(dirname=self.filename.parent) # finally the format with the header-attached to the binary file as one giant file else: self.file_format = "header-attached" ( self._global_info, self._ordered_channel_info, memmap_data_dtype, header_size, self._block_size, channel_number_dict, ) = read_rhd(self.filename, self.file_format) ############################################# # memmap the raw data for each format type ############################################# # if header-attached there is one giant memory-map if self.file_format == "header-attached": self._raw_data = np.memmap(self.filename, dtype=memmap_data_dtype, mode="r", offset=header_size) # for 'one-file-per-signal' we have one memory map / neo stream # based on https://github.com/NeuralEnsemble/python-neo/issues/1556 bug in versions 0.13.1, .2, .3 elif self.file_format == "one-file-per-signal": self._raw_data = {} for stream_name, stream_dtype in memmap_data_dtype.items(): num_channels = channel_number_dict[stream_name] file_path = raw_file_paths_dict[stream_name] size_in_bytes = file_path.stat().st_size dtype_size = np.dtype(stream_dtype).itemsize n_samples = size_in_bytes // (dtype_size * num_channels) signal_stream_memmap = np.memmap( file_path, dtype=stream_dtype, mode="r", shape=(n_samples, num_channels), order="C", ) self._raw_data[stream_name] = signal_stream_memmap # for one-file-per-channel we have one memory map / channel stored as a list / neo stream elif self.file_format == "one-file-per-channel": self._raw_data = {} for stream_name, stream_dtype in memmap_data_dtype.items(): channel_file_paths = raw_file_paths_dict[stream_name] channel_memmap_list = [np.memmap(fp, dtype=stream_dtype, mode="r") for fp in channel_file_paths] self._raw_data[stream_name] = channel_memmap_list # Data Integrity checks # strictness of check is controlled by ignore_integrity_checks # which is set at __init__ self._assert_timestamp_continuity() # signals signal_channels = [] # This is used to calculate bit masks self.native_channel_order = {} for chan_info in self._ordered_channel_info: name = chan_info["custom_channel_name"] channel_id = chan_info["native_channel_name"] sig_dtype = chan_info["dtype"] stream_id = str(chan_info["signal_type"]) # buffer will be handled later bepending the format buffer_id = "" signal_channels.append( ( name, channel_id, chan_info["sampling_rate"], sig_dtype, chan_info["units"], chan_info["gain"], chan_info["offset"], stream_id, buffer_id, ) ) self.native_channel_order[channel_id] = chan_info["native_order"] signal_channels = np.array(signal_channels, dtype=_signal_channel_dtype) stream_ids = np.unique(signal_channels["stream_id"]) signal_streams = np.zeros(stream_ids.size, dtype=_signal_stream_dtype) buffer_ids = [] # we need to sort the data because the string of stream_index 10 is mis-sorted. signal_streams["id"] = sorted(stream_ids, key=lambda x: int(x)) for stream_index, stream_id in enumerate(signal_streams["id"]): if self.filename.suffix == ".rhd": name = stream_id_to_stream_name_rhd.get(stream_id, "") else: name = stream_id_to_stream_name_rhs.get(stream_id, "") signal_streams["name"][stream_index] = name # zach I need you help here if self.file_format == "header-attached": buffer_id = "" elif self.file_format == "one-file-per-signal": buffer_id = stream_id buffer_ids.append(buffer_id) elif self.file_format == "one-file-per-channel": buffer_id = "" signal_streams["buffer_id"][stream_index] = buffer_id # set buffer_id to channels if buffer_id != "": mask = signal_channels["stream_id"] == stream_id signal_channels["buffer_id"][mask] = buffer_id # depending the format we can have buffer_id or not signal_buffers = np.zeros(len(buffer_ids), dtype=_signal_buffer_dtype) signal_buffers["id"] = buffer_ids self._max_sampling_rate = np.max(signal_channels["sampling_rate"]) # if header is attached we need to incorporate our block size to get signal length if self.file_format == "header-attached": self._max_sigs_length = self._raw_data.size * self._block_size # for one-file-per-signal we just take the size which will give n_samples for each # signal stream and then we just take the longest one elif self.file_format == "one-file-per-signal": self._max_sigs_length = max([raw_data.size for raw_data in self._raw_data.values()]) # for one-file-per-channel we do the same as for one-file-per-signal, but since they # are in a list we just take the first channel in each list of channels else: self._max_sigs_length = max([raw_data[0].size for raw_data in self._raw_data.values()]) # No events event_channels = [] event_channels = np.array(event_channels, dtype=_event_channel_dtype) # No spikes spike_channels = [] spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) # fill into header dict self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [1] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = signal_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels # Extract annotations from the format self._generate_minimal_annotations() bl_annotations = self.raw_annotations["blocks"][0] seg_annotations = bl_annotations["segments"][0] for signal_annotation in seg_annotations["signals"]: # Add global annotations signal_annotation["intan_version"] = ( f"{self._global_info['major_version']}." f"{self._global_info['minor_version']}" ) global_keys_to_skip = [ "major_version", "minor_version", "sampling_rate", "magic_number", "reference_channel", ] global_keys_to_annotate = set(self._global_info.keys()) - set(global_keys_to_skip) for key in global_keys_to_annotate: signal_annotation[key] = self._global_info[key] reference_channel = self._global_info.get("reference_channel", None) # Following the pdf specification reference_channel = "hardware" if reference_channel == "n/a" else reference_channel # Add channel annotations array_annotations = signal_annotation["__array_annotations__"] channel_ids = array_annotations["channel_ids"] # TODO refactor ordered channel dict to make this easier # Use this to find which elements of the ordered channels correspond to the current signal signal_type = int(signal_annotation["stream_id"]) channel_info = next((info for info in self._ordered_channel_info if info["signal_type"] == signal_type)) channel_keys_to_skip = [ "signal_type", "custom_channel_name", "native_channel_name", "gain", "offset", "channel_enabled", "dtype", "units", "sampling_rate", ] channel_keys_to_annotate = set(channel_info.keys()) - set(channel_keys_to_skip) properties_dict = {key: [] for key in channel_keys_to_annotate} for channel_id in channel_ids: matching_info = next( info for info in self._ordered_channel_info if info["native_channel_name"] == channel_id ) for key in channel_keys_to_annotate: properties_dict[key].append(matching_info[key]) for key in channel_keys_to_annotate: array_annotations[key] = properties_dict[key] def _segment_t_start(self, block_index, seg_index): return 0.0 def _segment_t_stop(self, block_index, seg_index): t_stop = self._max_sigs_length / self._max_sampling_rate return t_stop def _get_signal_size(self, block_index, seg_index, stream_index): stream_name = self.header["signal_streams"][stream_index]["name"][:] if self.file_format == "header-attached": stream_id = self.header["signal_streams"][stream_index]["id"] mask = self.header["signal_channels"]["stream_id"] == stream_id signal_channels = self.header["signal_channels"][mask] channel_ids = signal_channels["id"] stream_is_digital = stream_name in digital_stream_names field_name = stream_name if stream_is_digital else channel_ids[0] size = self._raw_data[field_name].size # one-file-per-signal is (n_samples, n_channels) elif self.file_format == "one-file-per-signal": size = self._raw_data[stream_name].shape[0] # one-file-per-channel is (n_samples) so pull from list else: size = self._raw_data[stream_name][0].size return size def _get_signal_t_start(self, block_index, seg_index, stream_index): return 0.0 def _get_analogsignal_chunk(self, block_index, seg_index, i_start, i_stop, stream_index, channel_indexes): if i_start is None: i_start = 0 if i_stop is None: i_stop = self._get_signal_size(block_index, seg_index, stream_index) if channel_indexes is None: channel_indexes = slice(None) if self.file_format == "header-attached": sigs_chunk = self._get_analogsignal_chunk_header_attached( i_start, i_stop, stream_index, channel_indexes, ) elif self.file_format == "one-file-per-signal": sigs_chunk = self._get_analogsignal_chunk_one_file_per_signal( i_start, i_stop, stream_index, channel_indexes, ) else: sigs_chunk = self._get_analogsignal_chunk_one_file_per_channel( i_start, i_stop, stream_index, channel_indexes, ) return sigs_chunk def _get_analogsignal_chunk_header_attached(self, i_start, i_stop, stream_index, channel_indexes): stream_id = self.header["signal_streams"][stream_index]["id"] mask = self.header["signal_channels"]["stream_id"] == stream_id signal_channels = self.header["signal_channels"][mask] channel_ids = signal_channels["id"][channel_indexes] stream_name = self.header["signal_streams"][stream_index]["name"][:] stream_is_digital = stream_name in digital_stream_names field_name = stream_name if stream_is_digital else channel_ids[0] shape = self._raw_data[field_name].shape dtype = self._raw_data[field_name].dtype # This is False for Temperature and timestamps multiple_samples_per_block = len(shape) == 2 # In the header attached case the data for each channel comes interleaved in blocks # To avoid unecessary memory access we can calculate the blocks we need to access beforehand: if multiple_samples_per_block: block_size = shape[1] block_start = i_start // block_size block_stop = i_stop // block_size + 1 sl0 = i_start % block_size sl1 = sl0 + (i_stop - i_start) # For all streams raw_data is a structured memmap with a field for each channel_id if not stream_is_digital: sigs_chunk = np.zeros((i_stop - i_start, len(channel_ids)), dtype=dtype) for chunk_index, channel_id in enumerate(channel_ids): data_chan = self._raw_data[channel_id] if multiple_samples_per_block: sigs_chunk[:, chunk_index] = data_chan[block_start:block_stop].flatten()[sl0:sl1] else: sigs_chunk[:, chunk_index] = data_chan[i_start:i_stop] else: # For digital data the channels come interleaved in a single field so we need to demultiplex digital_raw_data = self._raw_data[field_name].flatten() sigs_chunk = self._demultiplex_digital_data(digital_raw_data, channel_ids, i_start, i_stop) return sigs_chunk def _get_analogsignal_chunk_one_file_per_channel(self, i_start, i_stop, stream_index, channel_indexes): stream_name = self.header["signal_streams"][stream_index]["name"][:] signal_data_memmap_list = self._raw_data[stream_name] channel_indexes_are_slice = isinstance(channel_indexes, slice) if channel_indexes_are_slice: num_channels = len(signal_data_memmap_list) start = channel_indexes.start or 0 stop = channel_indexes.stop or num_channels step = channel_indexes.step or 1 channel_indexes = range(start, stop, step) # We get the dtype from the first channel first_channel_index = channel_indexes[0] dtype = signal_data_memmap_list[first_channel_index].dtype sigs_chunk = np.zeros((i_stop - i_start, len(channel_indexes)), dtype=dtype) for chunk_index, channel_index in enumerate(channel_indexes): channel_memmap = signal_data_memmap_list[channel_index] sigs_chunk[:, chunk_index] = channel_memmap[i_start:i_stop] return sigs_chunk def _get_analogsignal_chunk_one_file_per_signal(self, i_start, i_stop, stream_index, channel_indexes): stream_name = self.header["signal_streams"][stream_index]["name"][:] raw_data = self._raw_data[stream_name] stream_is_digital = stream_name in digital_stream_names if stream_is_digital: stream_id = self.header["signal_streams"][stream_index]["id"] mask = self.header["signal_channels"]["stream_id"] == stream_id signal_channels = self.header["signal_channels"][mask] channel_ids = signal_channels["id"][channel_indexes] output = self._demultiplex_digital_data(raw_data, channel_ids, i_start, i_stop) else: output = raw_data[i_start:i_stop, channel_indexes] return output def _demultiplex_digital_data(self, raw_digital_data, channel_ids, i_start, i_stop): dtype = np.uint16 # We fix this to match the memmap dtype output = np.zeros((i_stop - i_start, len(channel_ids)), dtype=dtype) for channel_index, channel_id in enumerate(channel_ids): native_order = self.native_channel_order[channel_id] mask = 1 << native_order demultiplex_data = np.bitwise_and(raw_digital_data, mask) > 0 output[:, channel_index] = demultiplex_data[i_start:i_stop].flatten() return output def _assert_timestamp_continuity(self): """ Asserts the continuity of timestamps in the data. This method verifies that the timestamps in the raw data are sequential, indicating a continuous recording. If discontinuities are found, a flag is set to indicate potential data integrity issues, and an error is raised unless `ignore_integrity_checks` is True. Raises ------ NeoReadWriteError If timestamps are not continuous and `ignore_integrity_checks` is False. The error message includes a table detailing the discontinuities found. Notes ----- The method extracts timestamps from the raw data based on the file format: * **header-attached:** Timestamps are extracted from a 'timestamp' field in the raw data. * **one-file-per-signal:** Timestamps are taken from the last stream. * **one-file-per-channel:** Timestamps are retrieved from the first channel of the last stream. """ # check timestamp continuity if self.file_format == "header-attached": timestamp = self._raw_data["timestamp"].flatten() # timestamps are always last stream for headerless binary files elif self.file_format == "one-file-per-signal": timestamp = self._raw_data["timestamp"] elif self.file_format == "one-file-per-channel": timestamp = self._raw_data["timestamp"][0] discontinuous_timestamps = np.diff(timestamp) != 1 timestamps_are_not_contiguous = np.any(discontinuous_timestamps) if timestamps_are_not_contiguous: # Mark a flag that can be checked after parsing the header to see if the timestamps are continuous or not self.discontinuous_timestamps = True if not self.ignore_integrity_checks: error_msg = ( "\nTimestamps are not continuous, likely due to a corrupted file or inappropriate file merge.\n" "To open the file anyway, initialize the reader with `ignore_integrity_checks=True`.\n\n" "Discontinuities Found:\n" "+-----------------+-----------------+-----------------+-----------------------+\n" "| Discontinuity | Previous | Next | Time Difference |\n" "| Index | (Frames) | (Frames) | (Seconds) |\n" "+-----------------+-----------------+-----------------+-----------------------+\n" ) amplifier_sampling_rate = self._global_info["sampling_rate"] for discontinuity_index in np.where(discontinuous_timestamps)[0]: prev_ts = timestamp[discontinuity_index] next_ts = timestamp[discontinuity_index + 1] time_diff = (next_ts - prev_ts) / amplifier_sampling_rate error_msg += ( f"| {discontinuity_index + 1:>15,} | {prev_ts:>15,} | {next_ts:>15,} | {time_diff:>21.6f} |\n" ) error_msg += "+-----------------+-----------------+-----------------+-----------------------+\n" raise NeoReadWriteError(error_msg) ################################### # Header reading helper functions def read_qstring(f): """ Reads the optional notes included in the Intan RHX software Parameters ---------- f: BinaryIO The file object Returns ------- txt: str The string """ length = np.fromfile(f, dtype="uint32", count=1)[0] if length == 0xFFFFFFFF or length == 0: return "" txt = f.read(length).decode("utf-16") return txt def read_variable_header(f, header: list): """ Reads the information from the binary file for the header info dict Parameters ---------- f: BinaryIO The file object header: list[tuple] The list of header sections along with their associated dtype Returns ------- info: dict The dictionary containing the information contained in the header """ info = {} for field_name, field_type in header: if field_type == "QString": field_value = read_qstring(f) else: field_value = np.fromfile(f, dtype=field_type, count=1)[0] info[field_name] = field_value return info ############### # RHS ZONE rhs_global_header = [ ("magic_number", "uint32"), # 0xD69127AC ("major_version", "int16"), ("minor_version", "int16"), ("sampling_rate", "float32"), ("dsp_enabled", "int16"), ("actual_dsp_cutoff_frequency", "float32"), ("actual_lower_bandwidth", "float32"), ("actual_lower_settle_bandwidth", "float32"), ("actual_upper_bandwidth", "float32"), ("desired_dsp_cutoff_frequency", "float32"), ("desired_lower_bandwidth", "float32"), ("desired_lower_settle_bandwidth", "float32"), ("desired_upper_bandwidth", "float32"), ("notch_filter_mode", "int16"), ("desired_impedance_test_frequency", "float32"), ("actual_impedance_test_frequency", "float32"), ("amp_settle_mode", "int16"), ("charge_recovery_mode", "int16"), ("stim_step_size", "float32"), ("recovery_current_limit", "float32"), ("recovery_target_voltage", "float32"), ("note1", "QString"), ("note2", "QString"), ("note3", "QString"), ("dc_amplifier_data_saved", "int16"), ("board_mode", "int16"), ("ref_channel_name", "QString"), ("nb_signal_group", "int16"), ] rhs_signal_group_header = [ ("signal_group_name", "QString"), ("signal_group_prefix", "QString"), ("signal_group_enabled", "int16"), ("channel_num", "int16"), ("amplified_channel_num", "int16"), ] rhs_signal_channel_header = [ ("native_channel_name", "QString"), ("custom_channel_name", "QString"), ("native_order", "int16"), ("custom_order", "int16"), ("signal_type", "int16"), ("channel_enabled", "int16"), ("chip_channel_num", "int16"), ("command_stream", "int16"), ("board_stream_num", "int16"), ("spike_scope_trigger_mode", "int16"), ("spike_scope_voltage_thresh", "int16"), ("spike_scope_digital_trigger_channel", "int16"), ("spike_scope_digital_edge_polarity", "int16"), ("electrode_impedance_magnitude", "float32"), ("electrode_impedance_phase", "float32"), ] stream_id_to_stream_name_rhs = { "0": "RHS2000 amplifier channel", "3": "USB board ADC input channel", "4": "USB board ADC output channel", "5": "USB board digital input channel", "6": "USB board digital output channel", "10": "DC Amplifier channel", "11": "Stim channel", } def read_rhs(filename, file_format: str): BLOCK_SIZE = 128 # sample per block with open(filename, mode="rb") as f: global_info = read_variable_header(f, rhs_global_header) # We use signal_type in the header as stream_id in neo with the following # complications: for rhs files in the header-attaached stream_id 0 also # contains information for stream_id 10 and stream_id 11 so we need to # break these up. See notes throughout code base; for timestamps we always # force them to be the last stream_id. stream_names = stream_id_to_stream_name_rhs.values() stream_name_to_channel_info_list = {name: [] for name in stream_names} if not file_format == "header-attached": memmap_data_dtype = {name: [] for name in stream_names} for g in range(global_info["nb_signal_group"]): group_info = read_variable_header(f, rhs_signal_group_header) if bool(group_info["signal_group_enabled"]): for c in range(group_info["channel_num"]): chan_info = read_variable_header(f, rhs_signal_channel_header) if chan_info["signal_type"] in (1, 2): error_msg = ( "signal_type of 1 or 2 does not exist for rhs files. If you have an rhs file " "with these formats open an issue on the python-neo github page" ) raise NeoReadWriteError(error_msg) if bool(chan_info["channel_enabled"]): stream_id = str(chan_info["signal_type"]) stream_name = stream_id_to_stream_name_rhs[stream_id] stream_name_to_channel_info_list[stream_name].append(chan_info) # Build a dictionary with channel count special_cases_for_counting = [ "DC Amplifier channel", "Stim channel", ] names_to_count = [name for name in stream_names if name not in special_cases_for_counting] channel_number_dict = {name: len(stream_name_to_channel_info_list[name]) for name in names_to_count} # Both DC Amplifier and Stim streams have the same number of channels as the amplifier stream channel_number_dict["DC Amplifier channel"] = channel_number_dict["RHS2000 amplifier channel"] channel_number_dict["Stim channel"] = channel_number_dict["RHS2000 amplifier channel"] header_size = f.tell() sr = global_info["sampling_rate"] # construct dtype by re-ordering channels by types ordered_channel_info = [] if file_format == "header-attached": memmap_data_dtype = [("timestamp", "int32", BLOCK_SIZE)] else: memmap_data_dtype["timestamp"] = "int32" channel_number_dict["timestamp"] = 1 for chan_info in stream_name_to_channel_info_list["RHS2000 amplifier channel"]: chan_info["sampling_rate"] = sr chan_info["units"] = "uV" chan_info["gain"] = 0.195 if file_format == "header-attached": chan_info["offset"] = -32768 * 0.195 else: chan_info["offset"] = 0.0 if file_format == "header-attached": chan_info["dtype"] = "uint16" else: chan_info["dtype"] = "int16" ordered_channel_info.append(chan_info) if file_format == "header-attached": name = chan_info["native_channel_name"] memmap_data_dtype += [(name, "uint16", BLOCK_SIZE)] else: memmap_data_dtype["RHS2000 amplifier channel"] = "int16" if bool(global_info["dc_amplifier_data_saved"]): # if we have dc amp we need to grab the correct number of channels # the channel number is the same as the count for amplifier data for chan_info in stream_name_to_channel_info_list["RHS2000 amplifier channel"]: chan_info_dc = dict(chan_info) name = chan_info["native_channel_name"] chan_info_dc["native_channel_name"] = name + "_DC" chan_info_dc["sampling_rate"] = sr chan_info_dc["units"] = "mV" chan_info_dc["gain"] = 19.23 chan_info_dc["offset"] = -512 * 19.23 chan_info_dc["signal_type"] = 10 # put it in another group chan_info_dc["dtype"] = "uint16" ordered_channel_info.append(chan_info_dc) if file_format == "header-attached": memmap_data_dtype += [(name + "_DC", "uint16", BLOCK_SIZE)] else: memmap_data_dtype["DC Amplifier channel"] = "uint16" # I can't seem to get stim files to generate for one-file-per-channel # so let's skip for now and can be given on request if file_format != "one-file-per-channel": for chan_info in stream_name_to_channel_info_list["RHS2000 amplifier channel"]: chan_info_stim = dict(chan_info) name = chan_info["native_channel_name"] chan_info_stim["native_channel_name"] = name + "_STIM" chan_info_stim["sampling_rate"] = sr # stim channel are complicated because they are coded # with bits, they do not fit the gain/offset rawio strategy chan_info_stim["units"] = "" chan_info_stim["gain"] = 1.0 chan_info_stim["offset"] = 0.0 chan_info_stim["signal_type"] = 11 # put it in another group chan_info_stim["dtype"] = "uint16" ordered_channel_info.append(chan_info_stim) if file_format == "header-attached": memmap_data_dtype += [(name + "_STIM", "uint16", BLOCK_SIZE)] else: memmap_data_dtype["Stim channel"] = "uint16" else: warnings.warn("Stim not implemented for `one-file-per-channel` due to lack of test files") # No supply or aux for rhs files (ie no stream_id 1 and 2) # We have an error above that requests test files to help if the spec is changed # in the future. for stream_name in ["USB board ADC input channel", "USB board ADC output channel"]: for chan_info in stream_name_to_channel_info_list[stream_name]: chan_info["sampling_rate"] = sr chan_info["units"] = "V" chan_info["gain"] = 0.0003125 chan_info["offset"] = -32768 * 0.0003125 chan_info["dtype"] = "uint16" ordered_channel_info.append(chan_info) if file_format == "header-attached": name = chan_info["native_channel_name"] memmap_data_dtype += [(name, "uint16", BLOCK_SIZE)] else: memmap_data_dtype[stream_name] = "uint16" for stream_name in ["USB board digital input channel", "USB board digital output channel"]: for chan_info in stream_name_to_channel_info_list[stream_name]: chan_info["sampling_rate"] = sr # arbitrary units are used to indicate that Intan does not # store raw voltages but only the boolean TTL state chan_info["units"] = "a.u." chan_info["gain"] = 1.0 chan_info["offset"] = 0.0 chan_info["dtype"] = "uint16" ordered_channel_info.append(chan_info) # Note that all the channels are packed in one buffer, so the data type only needs to be added once if len(stream_name_to_channel_info_list[stream_name]) > 0: if file_format == "header-attached": memmap_data_dtype += [(stream_name, "uint16", BLOCK_SIZE)] elif file_format == "one-file-per-channel": memmap_data_dtype[stream_name] = "uint16" elif file_format == "one-file-per-signal": memmap_data_dtype[stream_name] = "uint16" # per discussion with Intan developers before version 3 of their software the 'notch_filter_mode' # was a request for postprocessing to be done in one of their scripts. From version 3+ the notch # filter is now applied to the data in realtime and only the post notched amplifier data is # saved. if global_info["notch_filter_mode"] == 2 and global_info["major_version"] >= 3: global_info["notch_filter"] = "60Hz" elif global_info["notch_filter_mode"] == 1 and global_info["major_version"] >= 3: global_info["notch_filter"] = "50Hz" else: global_info["notch_filter"] = False if not file_format == "header-attached": # filter out dtypes without any values memmap_data_dtype = {k: v for (k, v) in memmap_data_dtype.items() if len(v) > 0} channel_number_dict = {k: v for (k, v) in channel_number_dict.items() if v > 0} return global_info, ordered_channel_info, memmap_data_dtype, header_size, BLOCK_SIZE, channel_number_dict ############### # RHD ZONE rhd_global_header_base = [ ("magic_number", "uint32"), # 0xC6912702 ("major_version", "int16"), ("minor_version", "int16"), ] rhd_global_header_part1 = [ ("sampling_rate", "float32"), ("dsp_enabled", "int16"), ("actual_dsp_cutoff_frequency", "float32"), ("actual_lower_bandwidth", "float32"), ("actual_upper_bandwidth", "float32"), ("desired_dsp_cutoff_frequency", "float32"), ("desired_lower_bandwidth", "float32"), ("desired_upper_bandwidth", "float32"), ("notch_filter_mode", "int16"), ("desired_impedance_test_frequency", "float32"), ("actual_impedance_test_frequency", "float32"), ("note1", "QString"), ("note2", "QString"), ("note3", "QString"), ] rhd_global_header_v11 = [ ("num_temp_sensor_channels", "int16"), ] rhd_global_header_v13 = [ ("eval_board_mode", "int16"), ] rhd_global_header_v20 = [ ("reference_channel", "QString"), ] rhd_global_header_final = [ ("nb_signal_group", "int16"), ] rhd_signal_group_header = [ ("signal_group_name", "QString"), ("signal_group_prefix", "QString"), ("signal_group_enabled", "int16"), ("channel_num", "int16"), ("amplified_channel_num", "int16"), ] rhd_signal_channel_header = [ ("native_channel_name", "QString"), ("custom_channel_name", "QString"), ("native_order", "int16"), ("custom_order", "int16"), ("signal_type", "int16"), ("channel_enabled", "int16"), ("chip_channel_num", "int16"), ("board_stream_num", "int16"), ("spike_scope_trigger_mode", "int16"), ("spike_scope_voltage_thresh", "int16"), ("spike_scope_digital_trigger_channel", "int16"), ("spike_scope_digital_edge_polarity", "int16"), ("electrode_impedance_magnitude", "float32"), ("electrode_impedance_phase", "float32"), ] stream_id_to_stream_name_rhd = { "0": "RHD2000 amplifier channel", "1": "RHD2000 auxiliary input channel", "2": "RHD2000 supply voltage channel", "3": "USB board ADC input channel", "4": "USB board digital input channel", "5": "USB board digital output channel", } def read_rhd(filename, file_format: str): """Function for reading the rhd file header Parameters ---------- filename: str | Path The filename of the *.rhd file file_format: 'header-attached' | 'one-file-per-signal' | 'one-file-per-channel' Whether the header is included with the rest of the data ('header-attached') Or as a standalone file ('one-file-per-signal' or 'one-file-per-channel') """ with open(filename, mode="rb") as f: global_info = read_variable_header(f, rhd_global_header_base) version = Version(f"{global_info['major_version']}.{global_info['minor_version']}") # the header size depends on the version :-( header = list(rhd_global_header_part1) # make a copy if version >= Version("1.1"): header = header + rhd_global_header_v11 else: global_info["num_temp_sensor_channels"] = 0 if version >= Version("1.3"): header = header + rhd_global_header_v13 else: global_info["eval_board_mode"] = 0 if version >= Version("2.0"): header = header + rhd_global_header_v20 else: global_info["reference_channel"] = "" header = header + rhd_global_header_final global_info.update(read_variable_header(f, header)) # read channel group and channel header stream_names = stream_id_to_stream_name_rhd.values() stream_name_to_channel_info_list = {name: [] for name in stream_names} if not file_format == "header-attached": memmap_data_dtype = {name: [] for name in stream_names} memmap_data_dtype["timestamp"] = [] for g in range(global_info["nb_signal_group"]): group_info = read_variable_header(f, rhd_signal_group_header) if bool(group_info["signal_group_enabled"]): for c in range(group_info["channel_num"]): chan_info = read_variable_header(f, rhd_signal_channel_header) if bool(chan_info["channel_enabled"]): stream_id = str(chan_info["signal_type"]) stream_name = stream_id_to_stream_name_rhd[stream_id] stream_name_to_channel_info_list[stream_name].append(chan_info) channel_number_dict = {name: len(stream_name_to_channel_info_list[name]) for name in stream_names} header_size = f.tell() sr = global_info["sampling_rate"] # construct the data block dtype and reorder channels if version >= Version("2.0"): BLOCK_SIZE = 128 else: BLOCK_SIZE = 60 # 256 channels ordered_channel_info = [] if version >= Version("1.2"): if file_format == "header-attached": memmap_data_dtype = [("timestamp", "int32", BLOCK_SIZE)] else: memmap_data_dtype["timestamp"] = "int32" channel_number_dict["timestamp"] = 1 else: if file_format == "header-attached": memmap_data_dtype = [("timestamp", "uint32", BLOCK_SIZE)] else: memmap_data_dtype["timestamp"] = "uint32" channel_number_dict["timestamp"] = 1 for chan_info in stream_name_to_channel_info_list["RHD2000 amplifier channel"]: chan_info["sampling_rate"] = sr chan_info["units"] = "uV" chan_info["gain"] = 0.195 if file_format == "header-attached": chan_info["offset"] = -32768 * 0.195 chan_info["dtype"] = "uint16" else: chan_info["offset"] = 0.0 chan_info["dtype"] = "int16" ordered_channel_info.append(chan_info) if file_format == "header-attached": name = chan_info["native_channel_name"] memmap_data_dtype += [(name, "uint16", BLOCK_SIZE)] else: memmap_data_dtype["RHD2000 amplifier channel"] = "int16" for chan_info in stream_name_to_channel_info_list["RHD2000 auxiliary input channel"]: chan_info["sampling_rate"] = sr / 4.0 chan_info["units"] = "V" chan_info["gain"] = 0.0000374 chan_info["offset"] = 0.0 chan_info["dtype"] = "uint16" ordered_channel_info.append(chan_info) if file_format == "header-attached": name = chan_info["native_channel_name"] memmap_data_dtype += [(name, "uint16", BLOCK_SIZE // 4)] else: memmap_data_dtype["RHD2000 auxiliary input channel"] = "uint16" for chan_info in stream_name_to_channel_info_list["RHD2000 supply voltage channel"]: chan_info["sampling_rate"] = sr / BLOCK_SIZE chan_info["units"] = "V" chan_info["gain"] = 0.0000748 chan_info["offset"] = 0.0 chan_info["dtype"] = "uint16" ordered_channel_info.append(chan_info) if file_format == "header-attached": name = chan_info["native_channel_name"] memmap_data_dtype += [(name, "uint16")] else: memmap_data_dtype["RHD2000 supply voltage channel"] = "uint16" # temperature is not an official channel in the header for i in range(global_info["num_temp_sensor_channels"]): name = f"temperature_{i}" chan_info = {"native_channel_name": name, "signal_type": 20} chan_info["sampling_rate"] = sr / BLOCK_SIZE chan_info["units"] = "Celsius" chan_info["gain"] = 0.001 chan_info["offset"] = 0.0 chan_info["dtype"] = "int16" ordered_channel_info.append(chan_info) memmap_data_dtype += [(name, "int16")] # 3: USB board ADC input channel for chan_info in stream_name_to_channel_info_list["USB board ADC input channel"]: chan_info["sampling_rate"] = sr chan_info["units"] = "V" if global_info["eval_board_mode"] == 0: chan_info["gain"] = 0.000050354 chan_info["offset"] = 0.0 elif global_info["eval_board_mode"] == 1: chan_info["gain"] = 0.00015259 chan_info["offset"] = -32768 * 0.00015259 elif global_info["eval_board_mode"] == 13: chan_info["gain"] = 0.0003125 chan_info["offset"] = -32768 * 0.0003125 chan_info["dtype"] = "uint16" ordered_channel_info.append(chan_info) if file_format == "header-attached": name = chan_info["native_channel_name"] memmap_data_dtype += [(name, "uint16", BLOCK_SIZE)] else: memmap_data_dtype["USB board ADC input channel"] = "uint16" for stream_name in ["USB board digital input channel", "USB board digital output channel"]: for chan_info in stream_name_to_channel_info_list[stream_name]: chan_info["sampling_rate"] = sr # arbitrary units are used to indicate that Intan does not # store raw voltages but only the boolean TTL state chan_info["units"] = "a.u." chan_info["gain"] = 1.0 chan_info["offset"] = 0.0 chan_info["dtype"] = "uint16" ordered_channel_info.append(chan_info) # Note that all the channels are packed in one buffer, so the data type only needs to be added once if len(stream_name_to_channel_info_list[stream_name]) > 0: if file_format == "header-attached": memmap_data_dtype += [(stream_name, "uint16", BLOCK_SIZE)] elif file_format == "one-file-per-channel": memmap_data_dtype[stream_name] = "uint16" elif file_format == "one-file-per-signal": memmap_data_dtype[stream_name] = "uint16" # per discussion with Intan developers before version 3 of their software the 'notch_filter_mode' # was a request for postprocessing to be done in one of their scripts. From version 3+ the notch # filter is now applied to the data in realtime and only the post notched amplifier data is # saved. if global_info["notch_filter_mode"] == 2 and version >= Version("3.0"): global_info["notch_filter"] = "60Hz" elif global_info["notch_filter_mode"] == 1 and version >= Version("3.0"): global_info["notch_filter"] = "50Hz" else: global_info["notch_filter"] = False if not file_format == "header-attached": # filter out dtypes without any values memmap_data_dtype = {k: v for (k, v) in memmap_data_dtype.items() if len(v) > 0} channel_number_dict = {k: v for (k, v) in channel_number_dict.items() if v > 0} return global_info, ordered_channel_info, memmap_data_dtype, header_size, BLOCK_SIZE, channel_number_dict ########################################################################## # RHX Zone for Binary Files (note this is for version 3+ of Intan software) # This section provides all possible headerless binary files in both the rhs and rhd # formats. digital_stream_names = ["USB board digital input channel", "USB board digital output channel"] stream_name_to_file_name_rhd = { "RHD2000 amplifier channel": "amplifier.dat", "RHD2000 auxiliary input channel": "auxiliary.dat", "RHD2000 supply voltage channel": "supply.dat", "USB board ADC input channel": "analogin.dat", "USB board digital input channel": "digitalin.dat", "USB board digital output channel": "digitalout.dat", } def create_one_file_per_signal_dict_rhd(dirname): """Function for One File Per Signal Type Parameters ---------- dirname: pathlib.Path The folder to explore Returns ------- raw_files_paths_dict: dict A dict of all the file paths """ raw_file_paths_dict = {} for stream_name, file_name in stream_name_to_file_name_rhd.items(): if Path(dirname / file_name).is_file(): raw_file_paths_dict[stream_name] = Path(dirname / file_name) raw_file_paths_dict["timestamp"] = Path(dirname / "time.dat") return raw_file_paths_dict stream_name_to_file_name_rhs = { "RHS2000 amplifier channel": "amplifier.dat", "RHS2000 auxiliary input channel": "auxiliary.dat", "RHS2000 supply voltage channel": "supply.dat", "USB board ADC input channel": "analogin.dat", "USB board ADC output channel": "analogout.dat", "USB board digital input channel": "digitalin.dat", "USB board digital output channel": "digitalout.dat", } def create_one_file_per_signal_dict_rhs(dirname): """Function for One File Per Signal Type Parameters ---------- dirname: pathlib.Path The folder to explore Returns ------- raw_files_paths_dict: dict A dict of all the file paths """ raw_file_paths_dict = {} for stream_name, file_name in stream_name_to_file_name_rhs.items(): if Path(dirname / file_name).is_file(): raw_file_paths_dict[stream_name] = Path(dirname / file_name) raw_file_paths_dict["timestamp"] = Path(dirname / "time.dat") if Path(dirname / "dcamplifier.dat").is_file(): raw_file_paths_dict["DC Amplifier channel"] = Path(dirname / "dcamplifier.dat") if Path(dirname / "stim.dat").is_file(): raw_file_paths_dict["Stim channel"] = Path(dirname / "stim.dat") return raw_file_paths_dict # RHD Binary Files for One File Per Channel stream_name_to_file_prefix_rhd = { "RHD2000 amplifier channel": "amp", "RHD2000 auxiliary input channel": "aux", "RHD2000 supply voltage channel": "vdd", "USB board ADC input channel": "board-ANALOG-IN", "USB board digital input channel": "board-DIGITAL-IN", "USB board digital output channel": "board-DIGITAL-OUT", } def create_one_file_per_channel_dict_rhd(dirname): """Utility function for One File Per Channel Parameters ---------- dirname: pathlib.Path The folder to explore Returns ------- raw_files_paths_dict: dict A dict of all the file paths """ # Developer note, at the moment, the channels require to be n in order # See https://github.com/NeuralEnsemble/python-neo/issues/1599 fo file_names = dirname.glob("**/*.dat") files = [file for file in file_names if file.is_file()] raw_file_paths_dict = {} for stream_name, file_prefix in stream_name_to_file_prefix_rhd.items(): stream_files = [file for file in files if file_prefix in file.name] # Map file name to channel name amp-A-000.dat -> A-000 amp-B-006.dat -> B-006 etc file_path_to_channel_name = lambda x: "-".join(x.stem.split("-")[1:]) sorted_stream_files = sorted(stream_files, key=file_path_to_channel_name) raw_file_paths_dict[stream_name] = sorted_stream_files raw_file_paths_dict["timestamp"] = [Path(dirname / "time.dat")] return raw_file_paths_dict # RHS Binary Files for One File Per Channel stream_name_to_file_prefix_rhs = { "RHS2000 amplifier channel": "amp", "RHS2000 auxiliary input channel": "aux", "RHS2000 supply voltage channel": "vdd", "USB board ADC input channel": "board-ANALOG-IN", "USB board ADC output channel": "board-ANALOG-OUT", "USB board digital input channel": "board-DIGITAL-IN", "USB board digital output channel": "board-DIGITAL-OUT", } def create_one_file_per_channel_dict_rhs( dirname, ): """Utility function for One File Per Channel Parameters ---------- dirname: pathlib.Path The folder to explore Returns ------- raw_files_paths_dict: dict A dict of all the file paths """ file_names = dirname.glob("**/*.dat") files = [file for file in file_names if file.is_file()] raw_file_paths_dict = {} for stream_name, file_prefix in stream_name_to_file_prefix_rhs.items(): stream_files = [file for file in files if file_prefix in file.name] # Map file name to channel name amp-A-000.dat -> A-000 amp-B-006.dat -> B-006 etc file_path_to_channel_name = lambda x: "-".join(x.stem.split("-")[1:]) sorted_stream_files = sorted(stream_files, key=file_path_to_channel_name) raw_file_paths_dict[stream_name] = sorted_stream_files raw_file_paths_dict["timestamp"] = [Path(dirname / "time.dat")] raw_file_paths_dict["DC Amplifier channel"] = [file for file in files if "dc-" in file.name] # we can find the files, but I can see how to read them out of header # so for now we don't expose the stim files in one-file-per-channel raw_file_paths_dict["Stim channel"] = [file for file in files if "stim-" in file.name] return raw_file_paths_dict ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/maxwellrawio.py0000644000175100001660000002543014743453644016771 0ustar00runnerdocker""" Class for reading data from maxwell biosystem device: * MaxOne * MaxTwo https://www.mxwbio.com/resources/mea/ The implementation is a mix between: * the implementation in spikeextractors https://github.com/SpikeInterface/spikeextractors/blob/master/spikeextractors/extractors/maxwellextractors/maxwellextractors.py * the implementation in spyking-circus https://github.com/spyking-circus/spyking-circus/blob/master/circus/files/maxwell.py This implementation does not handle spikes at the moment. For maxtwo device, each well will be a different signal stream. Author : Samuel Garcia, Alessio Buccino, Pierre Yger """ import os from pathlib import Path import platform import warnings from urllib.request import urlopen import numpy as np from .baserawio import ( BaseRawWithBufferApiIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) from neo.core import NeoReadWriteError class MaxwellRawIO(BaseRawWithBufferApiIO): """ Class for reading MaxOne or MaxTwo files. Parameters ---------- filename: str, default: '' The .h5 file to be loaded rec_name: str | None, default: None If the file has multiple recordings, specify the one to read. For 24-well plates, the rec_name needs to be specified since different well rows generate different recording ids. E.g., rec0001, rec0002, etc. """ extensions = ["h5"] rawmode = "one-file" def __init__(self, filename="", rec_name=None): BaseRawWithBufferApiIO.__init__(self) self.filename = filename self.rec_name = rec_name def _source_name(self): return self.filename def _parse_header(self): import h5py h5file = h5py.File(self.filename, mode="r") self.h5_file = h5file version = h5file["version"][0].decode() # create signal stream # one stream per well signal_streams = [] if int(version) == 20160704: self._old_format = True signal_streams.append(("well000", "well000")) elif int(version) > 20160704: # multi stream stream (one well is one stream) self._old_format = False well_ids = list(h5file["wells"].keys()) unique_rec_names = [] for well_name in well_ids: rec_names = list(h5file["wells"][well_name].keys()) for rec_name in rec_names: unique_rec_names.append(rec_name) # check consistency of rec_names unique_rec_names = np.unique(unique_rec_names) if len(unique_rec_names) > 1: if self.rec_name is None: raise ValueError( f"Detected multiple recording IDs across wells. " f"Please select a single recording using the `rec_name` parameter. " f"Possible rec_names: {unique_rec_names}" ) else: if self.rec_name not in unique_rec_names: raise NeoReadWriteError(f"rec_name {self.rec_name} not found") else: self.rec_name = unique_rec_names[0] # add streams that contain the selected rec_name for well_name in well_ids: rec_names = list(h5file["wells"][well_name].keys()) if self.rec_name in rec_names: signal_streams.append((well_name, well_name, well_name)) else: raise NotImplementedError(f"This version {version} is not supported") signal_streams = np.array(signal_streams, dtype=_signal_stream_dtype) # one stream per buffer signal_buffers = np.zeros(signal_streams.size, dtype=_signal_buffer_dtype) signal_buffers["id"] = signal_streams["id"] signal_buffers["name"] = signal_streams["name"] # create signal channels max_sig_length = 0 self._buffer_descriptions = {0: {0: {}}} self._stream_buffer_slice = {} sig_channels = [] well_indices_to_remove = [] for stream_index, stream_id in enumerate(signal_streams["id"]): if int(version) == 20160704: sr = 20000.0 settings = h5file["settings"] if "lsb" in settings: gain_uV = settings["lsb"][0] * 1e6 else: if "gain" not in settings: print("'gain' amd 'lsb' not found in settings. " "Setting gain to 512 (default)") gain = 512 else: gain = settings["gain"][0] gain_uV = 3.3 / (1024 * gain) * 1e6 hdf5_path = "sig" mapping = h5file["mapping"] ids = np.array(mapping["channel"]) ids = ids[ids >= 0] self._stream_buffer_slice[stream_id] = ids elif int(version) > 20160704: settings = h5file["wells"][stream_id][self.rec_name]["settings"] sr = settings["sampling"][0] if "lsb" in settings: gain_uV = settings["lsb"][0] * 1e6 else: if "gain" not in settings: print("'gain' amd 'lsb' not found in settings. " "Setting gain to 512 (default)") gain = 512 else: gain = settings["gain"][0] gain_uV = 3.3 / (1024 * gain) * 1e6 mapping = settings["mapping"] if "routed" in h5file["wells"][stream_id][self.rec_name]["groups"]: hdf5_path = f"/wells/{stream_id}/{self.rec_name}/groups/routed/raw" else: warnings.warn(f"No 'routed' group found for well {stream_id}") well_indices_to_remove.append(stream_index) continue self._stream_buffer_slice[stream_id] = None buffer_id = stream_id shape = h5file[hdf5_path].shape self._buffer_descriptions[0][0][buffer_id] = { "type": "hdf5", "file_path": str(self.filename), "hdf5_path": hdf5_path, "shape": shape, "time_axis": 1, } self._stream_buffer_slice[stream_id] = slice(None) channel_ids = np.array(mapping["channel"]) electrode_ids = np.array(mapping["electrode"]) mask = channel_ids >= 0 channel_ids = channel_ids[mask] electrode_ids = electrode_ids[mask] for i, chan_id in enumerate(channel_ids): elec_id = electrode_ids[i] ch_name = f"ch{chan_id} elec{elec_id}" offset_uV = 0 buffer_id = stream_id sig_channels.append( (ch_name, str(chan_id), sr, "uint16", "uV", gain_uV, offset_uV, stream_id, buffer_id) ) max_sig_length = max(max_sig_length, shape[1]) self._t_stop = max_sig_length / sr if len(well_indices_to_remove) > 0: signal_streams = np.delete(signal_streams, np.array(well_indices_to_remove)) sig_channels = np.array(sig_channels, dtype=_signal_channel_dtype) spike_channels = [] spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) event_channels = [] event_channels = np.array(event_channels, dtype=_event_channel_dtype) self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [1] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = sig_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels self._generate_minimal_annotations() bl_ann = self.raw_annotations["blocks"][0] bl_ann["maxwell_version"] = version def _segment_t_start(self, block_index, seg_index): return 0.0 def _segment_t_stop(self, block_index, seg_index): return self._t_stop def _get_analogsignal_buffer_description(self, block_index, seg_index, buffer_id): return self._buffer_descriptions[block_index][seg_index][buffer_id] def _get_signal_t_start(self, block_index, seg_index, stream_index): return 0.0 def _get_analogsignal_chunk(self, block_index, seg_index, i_start, i_stop, stream_index, channel_indexes): try: return super()._get_analogsignal_chunk( block_index, seg_index, i_start, i_stop, stream_index, channel_indexes ) except OSError as e: print("*" * 10) print(_hdf_maxwell_error) print("*" * 10) raise (e) _hdf_maxwell_error = """Maxwell file format is based on HDF5. The internal compression requires a custom plugin!!! This is a big pain for the end user. You, as a end user, should ask Maxwell company to change this. Please visit this page and install the missing decompression libraries: https://share.mxwbio.com/d/4742248b2e674a85be97/ Then, link the decompression library by setting the `HDF5_PLUGIN_PATH` to your installation location, e.g. via os.environ['HDF5_PLUGIN_PATH'] = '/path/to/custom/hdf5/plugin/' Alternatively, you can use the auto_install_maxwell_hdf5_compression_plugin() below function that do it automagically. """ def auto_install_maxwell_hdf5_compression_plugin(hdf5_plugin_path=None, force_download=True): if hdf5_plugin_path is None: hdf5_plugin_path = os.getenv("HDF5_PLUGIN_PATH", None) if hdf5_plugin_path is None: hdf5_plugin_path = Path.home() / "hdf5_plugin_path_maxwell" os.environ["HDF5_PLUGIN_PATH"] = str(hdf5_plugin_path) hdf5_plugin_path = Path(hdf5_plugin_path) hdf5_plugin_path.mkdir(exist_ok=True) if platform.system() == "Linux": remote_lib = "https://share.mxwbio.com/d/4742248b2e674a85be97/files/?p=%2FLinux%2Flibcompression.so&dl=1" local_lib = hdf5_plugin_path / "libcompression.so" elif platform.system() == "Darwin": remote_lib = "https://share.mxwbio.com/d/4742248b2e674a85be97/files/?p=%2FMacOS%2Flibcompression.dylib&dl=1" local_lib = hdf5_plugin_path / "libcompression.dylib" elif platform.system() == "Windows": remote_lib = "https://share.mxwbio.com/d/4742248b2e674a85be97/files/?p=%2FWindows%2Fcompression.dll&dl=1" local_lib = hdf5_plugin_path / "compression.dll" if not force_download and local_lib.is_file(): print(f"The h5 compression library for Maxwell is already located in {local_lib}!") return dist = urlopen(remote_lib) with open(local_lib, "wb") as f: f.write(dist.read()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/mearecrawio.py0000644000175100001660000002001614743453644016547 0ustar00runnerdocker""" Class for reading data from a MEArec simulated data. See: https://mearec.readthedocs.io/en/latest/ https://github.com/alejoe91/MEArec https://link.springer.com/article/10.1007/s12021-020-09467-7 Author : Alessio Buccino """ from copy import deepcopy import numpy as np from .baserawio import ( BaseRawIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) class MEArecRawIO(BaseRawIO): """ Class for "reading" simulated data from a MEArec file. Parameters ---------- filename : str, default: '' The filename of the MEArec file to read. load_spiketrains : bool, default: True Whether or not to load spike train data. load_analogsignal : bool, default: True Whether or not to load continuous recording data. Examples -------- >>> import neo.rawio >>> r = neo.rawio.MEArecRawIO(filename='mearec.h5', load_spiketrains=True) >>> r.parse_header() >>> print(r) >>> raw_chunk = r.get_analogsignal_chunk(block_index=0, seg_index=0, i_start=0, i_stop=1024, channel_names=channel_names) >>> float_chunk = reader.rescale_signal_raw_to_float(raw_chunk, dtype='float64', channel_indexes=[0, 3, 6]) >>> spike_timestamp = reader.spike_timestamps(unit_index=0, t_start=None, t_stop=None) >>> spike_times = reader.rescale_spike_timestamp(spike_timestamp, 'float64') """ extensions = ["h5"] rawmode = "one-file" def __init__(self, filename="", load_spiketrains=True, load_analogsignal=True): BaseRawIO.__init__(self) self.filename = filename self.load_spiketrains = load_spiketrains self.load_analogsignal = load_analogsignal def _source_name(self): return self.filename def _parse_header(self): load = ["channel_positions"] if self.load_analogsignal: load.append("recordings") if self.load_spiketrains: load.append("spiketrains") import MEArec as mr self._recgen = mr.load_recordings( recordings=self.filename, return_h5_objects=True, check_suffix=False, load=load, load_waveforms=False ) self.info_dict = deepcopy(self._recgen.info) self.channel_positions = self._recgen.channel_positions if self.load_analogsignal: self._recordings = self._recgen.recordings if self.load_spiketrains: self._spiketrains = self._recgen.spiketrains self._sampling_rate = self.info_dict["recordings"]["fs"] self.duration_seconds = self.info_dict["recordings"]["duration"] self._num_frames = int(self._sampling_rate * self.duration_seconds) self._num_channels = self.channel_positions.shape[0] self._dtype = self.info_dict["recordings"]["dtype"] signal_buffers = [("Signals", "0")] if self.load_analogsignal else [] signal_streams = [("Signals", "0", "0")] if self.load_analogsignal else [] signal_streams = np.array(signal_streams, dtype=_signal_stream_dtype) signal_buffers = np.array(signal_buffers, dtype=_signal_buffer_dtype) sig_channels = [] if self.load_analogsignal: for c in range(self._num_channels): ch_name = f"ch{c}" chan_id = str(c + 1) sr = self._sampling_rate # Hz dtype = self._dtype units = "uV" gain = 1.0 offset = 0.0 stream_id = "0" buffer_id = "0" sig_channels.append((ch_name, chan_id, sr, dtype, units, gain, offset, stream_id, buffer_id)) sig_channels = np.array(sig_channels, dtype=_signal_channel_dtype) # creating units channels spike_channels = [] if self.load_spiketrains: for c in range(len(self._spiketrains)): unit_name = f"unit{c}" unit_id = f"#{c}" # if spiketrains[c].waveforms is not None: wf_units = "" wf_gain = 1.0 wf_offset = 0.0 wf_left_sweep = 0 wf_sampling_rate = self._sampling_rate spike_channels.append( (unit_name, unit_id, wf_units, wf_gain, wf_offset, wf_left_sweep, wf_sampling_rate) ) spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) event_channels = [] event_channels = np.array(event_channels, dtype=_event_channel_dtype) self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [1] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = sig_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels self._generate_minimal_annotations() for block_index in range(1): bl_ann = self.raw_annotations["blocks"][block_index] bl_ann["mearec_info"] = self.info_dict def _segment_t_start(self, block_index, seg_index): all_starts = [[0.0]] return all_starts[block_index][seg_index] def _segment_t_stop(self, block_index, seg_index): t_stop = self._num_frames / self._sampling_rate all_stops = [[t_stop]] return all_stops[block_index][seg_index] def _get_signal_size(self, block_index, seg_index, stream_index): if stream_index != 0: raise ValueError("`stream_index` must be 0") return self._num_frames def _get_signal_t_start(self, block_index, seg_index, stream_index): if stream_index != 0: raise ValueError("`stream_index` must be 0") return self._segment_t_start(block_index, seg_index) def _get_analogsignal_chunk(self, block_index, seg_index, i_start, i_stop, stream_index, channel_indexes): if not self.load_analogsignal: raise AttributeError("Recordings not loaded. Set load_analogsignal=True in MEArecRawIO constructor") if i_start is None: i_start = 0 if i_stop is None: i_stop = self._num_frames if channel_indexes is None: channel_indexes = slice(self._num_channels) if isinstance(channel_indexes, slice): raw_signals = self._recordings[i_start:i_stop, channel_indexes] else: # sort channels because h5py neeeds sorted indexes if np.any(np.diff(channel_indexes) < 0): sorted_channel_indexes = np.sort(channel_indexes) sorted_idx = np.array([list(sorted_channel_indexes).index(ch) for ch in channel_indexes]) raw_signals = self._recordings[i_start:i_stop, sorted_channel_indexes] raw_signals = raw_signals[:, sorted_idx] else: raw_signals = self._recordings[i_start:i_stop, channel_indexes] return raw_signals def _spike_count(self, block_index, seg_index, unit_index): return len(self._spiketrains[unit_index]) def _get_spike_timestamps(self, block_index, seg_index, unit_index, t_start, t_stop): spike_timestamps = self._spiketrains[unit_index].times.magnitude if t_start is None: t_start = self._segment_t_start(block_index, seg_index) if t_stop is None: t_stop = self._segment_t_stop(block_index, seg_index) timestamp_idxs = np.where((spike_timestamps >= t_start) & (spike_timestamps < t_stop)) return spike_timestamps[timestamp_idxs] def _rescale_spike_timestamp(self, spike_timestamps, dtype): return spike_timestamps.astype(dtype) def _get_spike_raw_waveforms(self, block_index, seg_index, spike_channel_index, t_start, t_stop): return None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/medrawio.py0000644000175100001660000003773614743453644016101 0ustar00runnerdocker""" Class for reading MED (Multiscale Electrophysiology Data) Format. Uses the dhn-med-py python package, created by Dark Horse Neuro, Inc. Authors: Dan Crepeau, Matt Stead """ import numpy as np from .baserawio import ( BaseRawIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) class MedRawIO(BaseRawIO): """ Class for reading MED (Multiscale Electrophysiology Data) Format. Uses the dhn-med-py MED python package (version >= 1.0.0), created by Dark Horse Neuro, Inc. and medformat.org. Parameters ---------- dirname: str | Path | None, default: None The folder containing the data files to load password: str | None, default: None The password for the Med session keep_original_times: bool, default: False If True UTC timestamps are used and returned as seconds referenced to midnight 1 Jan 1970 If False timestamps are referenced to the beginning of the session with the beginning being 0 Notes ----- Currently reads the entire MED session. Every discontinuity is considered to be a new segment. Channels are grouped by sampling frequency, to create streams. In MED all channels will line up time-wise, so streams will span the entire recording, and continuous sections of those streams are divided up into segments. """ extensions = ["medd", "rdat", "ridx"] rawmode = "one-dir" def __init__(self, dirname=None, password=None, keep_original_times=False, **kargs): BaseRawIO.__init__(self, **kargs) import dhn_med_py from dhn_med_py import MedSession self.dirname = str(dirname) self.password = password self.keep_original_times = keep_original_times def _source_name(self): return self.dirname def _parse_header(self): import dhn_med_py from dhn_med_py import MedSession # Set a default password to improve compatibility and ease-of-use. # This password will be ignored if an unencrypted MED dataset is being used. if self.password is None: self.password = "L2_password" # Open the MED session (open data file pointers and read metadata files) self.sess = MedSession(self.dirname, self.password) # set the matrix calls to be "sample_major" as opposed to "channel_major" self.sess.set_major_dimension("sample") # find number of segments sess_contigua = self.sess.session_info["contigua"] self._nb_segment = len(sess_contigua) # find overall session start time. self._session_start_time = sess_contigua[0]["start_time"] # keep track of offset from metadata, if we are keeping original times. if not self.keep_original_times: self._session_time_offset = 0 - self._session_start_time else: self._session_time_offset = self.sess.session_info["metadata"]["recording_time_offset"] # find start/stop times of each segment self._seg_t_starts = [] self._seg_t_stops = [] for seg_idx in range(self._nb_segment): self._seg_t_starts.append(sess_contigua[seg_idx]["start_time"]) self._seg_t_stops.append(sess_contigua[seg_idx]["end_time"]) # find number of streams per segment self._stream_info = [] self._num_stream_info = 0 for chan_idx, chan_info in enumerate(self.sess.session_info["channels"]): chan_freq = chan_info["metadata"]["sampling_frequency"] # set MED session reference channel to be this channel, so the correct contigua is returned self.sess.set_reference_channel(chan_info["metadata"]["channel_name"]) contigua = self.sess.find_discontinuities() # find total number of samples in this channel chan_num_samples = 0 for seg_idx in range(len(contigua)): chan_num_samples += (contigua[seg_idx]["end_index"] - contigua[seg_idx]["start_index"]) + 1 # see if we need a new stream, or add channel to existing stream add_to_existing_stream_info = False for stream_info in self._stream_info: if chan_freq == stream_info["sampling_frequency"] and chan_num_samples == stream_info["num_samples"]: # found a match, so add it! add_to_existing_stream_info = True stream_info["chan_list"].append((chan_idx, chan_info["metadata"]["channel_name"])) stream_info["raw_chans"].append(chan_info["metadata"]["channel_name"]) break if not add_to_existing_stream_info: self._num_stream_info += 1 new_stream_info = { "sampling_frequency": chan_info["metadata"]["sampling_frequency"], "chan_list": [(chan_idx, chan_info["metadata"]["channel_name"])], "contigua": contigua, "raw_chans": [chan_info["metadata"]["channel_name"]], "num_samples": chan_num_samples, } self._stream_info.append(new_stream_info) self.num_channels_in_session = len(self.sess.session_info["channels"]) self.num_streams_in_session = self._num_stream_info signal_streams = [] signal_channels = [] # fill in signal_streams and signal_channels info for signal_stream_counter, stream_info in enumerate(self._stream_info): # get the stream start time, which is the start time of the first continuous section stream_start_time = (stream_info["contigua"][0]["start_time"] + self._session_time_offset) / 1e6 # create stream name/id with info that we now have name = f'stream (rate,#sample,t0): ({stream_info["sampling_frequency"]}, {stream_info["num_samples"]}, {stream_start_time})' stream_id = signal_stream_counter buffer_id = "" signal_streams.append((name, stream_id, buffer_id)) # add entry for signal_channels for each channel in a stream for chan in stream_info["chan_list"]: signal_channels.append( (chan[1], chan[0], stream_info["sampling_frequency"], "int32", "uV", 1, 0, stream_id, buffer_id) ) # the MED format is one dir per channel and so no buffer concept signal_buffers = np.array([], dtype=_signal_buffer_dtype) signal_streams = np.array(signal_streams, dtype=_signal_stream_dtype) signal_channels = np.array(signal_channels, dtype=_signal_channel_dtype) # no unit/epoch information contained in MED spike_channels = [] spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) # Events event_channels = [] event_channels.append(("Event", "event_channel", "event")) event_channels.append(("Epoch", "epoch_channel", "epoch")) event_channels = np.array(event_channels, dtype=_event_channel_dtype) # Create Neo header structure self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [self._nb_segment] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = signal_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels # `_generate_minimal_annotations()` must be called to generate the nested # dict of annotations/array_annotations self._generate_minimal_annotations() # Add custom annotations for neo objects bl_ann = self.raw_annotations["blocks"][0] bl_ann["name"] = "MED Data Block" # The following adds all of the MED session_info to the block annotations, # which includes features like patient name, recording location, etc. bl_ann.update(self.sess.session_info) # Give segments unique names for i in range(self._nb_segment): seg_ann = bl_ann["segments"][i] seg_ann["name"] = "Seg #" + str(i) + " Block #0" # this pprint lines really help for understand the nested (and complicated sometimes) dict # from pprint import pprint # pprint(self.raw_annotations) def _segment_t_start(self, block_index, seg_index): return (self._seg_t_starts[seg_index] + self._session_time_offset) / 1e6 def _segment_t_stop(self, block_index, seg_index): return (self._seg_t_stops[seg_index] + self._session_time_offset) / 1e6 def _get_signal_size(self, block_index, seg_index, stream_index): stream_segment_contigua = self._stream_info[stream_index]["contigua"] return (stream_segment_contigua[seg_index]["end_index"] - stream_segment_contigua[seg_index]["start_index"]) + 1 def _get_signal_t_start(self, block_index, seg_index, stream_index): return (self._seg_t_starts[seg_index] + self._session_time_offset) / 1e6 def _get_analogsignal_chunk(self, block_index, seg_index, i_start, i_stop, stream_index, channel_indexes): import dhn_med_py from dhn_med_py import MedSession # Correct for None start/stop inputs if i_start is None: i_start = 0 if i_stop is None: i_stop = self.get_signal_size(block_index=block_index, seg_index=seg_index, stream_index=stream_index) # Check for invalid start/stop inputs if i_start < 0 or i_stop > self.get_signal_size( block_index=block_index, seg_index=seg_index, stream_index=stream_index ): raise IndexError("MED read error: Too many samples requested!") if i_start > i_stop: raise IndexError("MED read error: i_start (" + i_start + ") is greater than i_stop (" + i_stop + ")") num_channels = 0 if channel_indexes is None: self.sess.set_channel_inactive("all") self.sess.set_channel_active(self._stream_info[stream_index]["raw_chans"]) num_channels = len(self._stream_info[stream_index]["raw_chans"]) self.sess.set_reference_channel(self._stream_info[stream_index]["raw_chans"][0]) # in the case we have a slice or we give an ArrayLike we need to iterate through the channels # in order to activate them. else: if isinstance(channel_indexes, slice): start = channel_indexes.start or 0 stop = channel_indexes.stop or len(self._stream_info[stream_index]["raw_chans"]) step = channel_indexes.step or 1 channel_indexes = [ch for ch in range(start, stop, step)] else: if any(channel_indexes < 0): raise IndexError(f"Can not index negative channels: {channel_indexes}") # Set all channels to be inactive, then selectively set some of them to be active self.sess.set_channel_inactive("all") for i, channel_idx in enumerate(channel_indexes): num_channels += 1 self.sess.set_channel_active(self._stream_info[stream_index]["raw_chans"][channel_idx]) self.sess.set_reference_channel(self._stream_info[stream_index]["raw_chans"][channel_indexes[0]]) # Return empty dataset if start/stop samples are equal if i_start == i_stop: raw_signals = np.zeros((0, num_channels), dtype="int32") return raw_signals # Otherwise, return the matrix 2D array returned by the MED library start_sample_offset = self._stream_info[stream_index]["contigua"][seg_index]["start_index"] self.sess.read_by_index(i_start + start_sample_offset, i_stop + start_sample_offset) raw_signals = np.empty((i_stop - i_start, num_channels), dtype=np.int32) for i, chan in enumerate(self.sess.data["channels"]): raw_signals[:, i] = chan["data"] return raw_signals def _spike_count(self, block_index, seg_index, spike_channel_index): return None def _get_spike_timestamps(self, block_index, seg_index, spike_channel_index, t_start, t_stop): return None def _rescale_spike_timestamp(self, spike_timestamps, dtype): return None def _get_spike_raw_waveforms(self, block_index, seg_index, spike_channel_index, t_start, t_stop): return None def _event_count(self, block_index, seg_index, event_channel_index): # there are no epochs to consider for MED in this interface if self.header["event_channels"]["type"][event_channel_index] == b"epoch": return 0 records = self.sess.get_session_records() # Find segment boundaries ts0 = (self.segment_t_start(block_index, seg_index) * 1e6) - self._session_time_offset ts1 = (self.segment_t_stop(block_index, seg_index) * 1e6) - self._session_time_offset # Only count Note and Neuralynx type records. count = 0 for record in records: if (record["type_string"] == "Note" or record["type_string"] == "NlxP") and ( record["start_time"] >= ts0 and record["start_time"] < ts1 ): count += 1 return count def _get_event_timestamps(self, block_index, seg_index, event_channel_index, t_start, t_stop): # There are no epochs to consider for MED in this interface, # so just bail out if that's what's being asked for if self.header["event_channels"]["type"][event_channel_index] == b"epoch": return np.array([]), np.array([]), np.array([], dtype="U") if t_start is not None: start_time = (t_start * 1e6) - self._session_time_offset else: start_time = (self.segment_t_start(block_index, seg_index) * 1e6) - self._session_time_offset if t_stop is not None: end_time = (t_stop * 1e6) - self._session_time_offset else: end_time = (self.segment_t_stop(block_index, seg_index) * 1e6) - self._session_time_offset # Ask MED session for a list of events that match time parameters records = self.sess.get_session_records(start_time, end_time) # create a subset of only Note and Neuralynx type records records_subset = [] for record in records: if record["type_string"] == "Note" or record["type_string"] == "NlxP": records_subset.append(record) records = records_subset # if no records match our criteria, then we are done, output empty arrays if len(records) == 0: return np.array([]), np.array([]), np.array([], dtype="U") # inialize output arrays times = np.empty(shape=[len(records)]) durations = None labels = [] # populate output arrays of times and labels for i, record in enumerate(records): times[i] = (record["start_time"] + self._session_time_offset) / 1e6 if record["type_string"] == "Note": labels.append(record["text"]) elif record["type_string"] == "NlxP": labels.append("NlxP subport: " + str(record["subport"]) + " value: " + str(record["value"])) labels = np.asarray(labels, dtype="U") return times, durations, labels def _rescale_event_timestamp(self, event_timestamps, dtype, event_channel_index): return np.asarray(event_timestamps, dtype=dtype) def _rescale_epoch_duration(self, raw_duration, dtype, event_channel_index): return np.asarray(raw_duration, dtype=dtype) def __del__(self): try: # Important to make sure the session is closed, since the MED library only allows # one session to be open at a time. self.sess.close() del self.sess except Exception: pass def close(self): try: # Important to make sure the session is closed, since the MED library only allows # one session to be open at a time. self.sess.close() except Exception: pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/micromedrawio.py0000644000175100001660000002746714743453644017133 0ustar00runnerdocker""" Class for reading/writing data from micromed (.trc). Inspired by the Matlab code for EEGLAB from Rami K. Niazy. Completed with matlab Guillaume BECQ code. Author: Samuel Garcia """ import datetime import struct import io import numpy as np from .baserawio import ( BaseRawWithBufferApiIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) from .utils import get_memmap_shape from neo.core import NeoReadWriteError class StructFile(io.BufferedReader): def read_f(self, fmt, offset=None): if offset is not None: self.seek(offset) return struct.unpack(fmt, self.read(struct.calcsize(fmt))) class MicromedRawIO(BaseRawWithBufferApiIO): """ Class for reading data from micromed (.trc). Parameters ---------- filename: str, default: None The *.trc file to be loaded """ extensions = ["trc", "TRC"] rawmode = "one-file" def __init__(self, filename=""): BaseRawWithBufferApiIO.__init__(self) self.filename = filename def _parse_header(self): with open(self.filename, "rb") as fid: f = StructFile(fid) # Name f.seek(64) surname = f.read(22).strip(b" ") firstname = f.read(20).strip(b" ") # Date day, month, year, hour, minute, sec = f.read_f("bbbbbb", offset=128) rec_datetime = datetime.datetime(year + 1900, month, day, hour, minute, sec) Data_Start_Offset, Num_Chan, Multiplexer, Rate_Min, Bytes = f.read_f("IHHHH", offset=138) sig_dtype = "u" + str(Bytes) # header version (header_version,) = f.read_f("b", offset=175) if header_version != 4: raise NotImplementedError(f"`header_version {header_version} is not implemented in neo yet") # area f.seek(176) zone_names = [ "ORDER", "LABCOD", "NOTE", "FLAGS", "TRONCA", "IMPED_B", "IMPED_E", "MONTAGE", "COMPRESS", "AVERAGE", "HISTORY", "DVIDEO", "EVENT A", "EVENT B", "TRIGGER", ] zones = {} for zname in zone_names: zname2, pos, length = f.read_f("8sII") zones[zname] = zname2, pos, length if zname != zname2.decode("ascii").strip(" "): raise NeoReadWriteError("expected the zone name to match") # "TRONCA" zone define segments zname2, pos, length = zones["TRONCA"] f.seek(pos) # this number avoid a infinite loop in case of corrupted TRONCA zone (seg_start!=0 and trace_offset!=0) max_segments = 100 self.info_segments = [] for i in range(max_segments): # 4 bytes u4 each seg_start = int(np.frombuffer(f.read(4), dtype="u4")[0]) trace_offset = int(np.frombuffer(f.read(4), dtype="u4")[0]) if seg_start == 0 and trace_offset == 0: break else: self.info_segments.append((seg_start, trace_offset)) if len(self.info_segments) == 0: # one unique segment = general case self.info_segments.append((0, 0)) nb_segment = len(self.info_segments) # Reading Code Info zname2, pos, length = zones["ORDER"] f.seek(pos) code = np.frombuffer(f.read(Num_Chan * 2), dtype="u2") # unique stream and buffer buffer_id = "0" stream_id = "0" units_code = {-1: "nV", 0: "uV", 1: "mV", 2: 1, 100: "percent", 101: "dimensionless", 102: "dimensionless"} signal_channels = [] sig_grounds = [] for c in range(Num_Chan): zname2, pos, length = zones["LABCOD"] f.seek(pos + code[c] * 128 + 2, 0) chan_name = f.read(6).strip(b"\x00").decode("ascii") ground = f.read(6).strip(b"\x00").decode("ascii") sig_grounds.append(ground) logical_min, logical_max, logical_ground, physical_min, physical_max = f.read_f("iiiii") (k,) = f.read_f("h") units = units_code.get(k, "uV") factor = float(physical_max - physical_min) / float(logical_max - logical_min + 1) gain = factor offset = -logical_ground * factor f.seek(8, 1) (sampling_rate,) = f.read_f("H") sampling_rate *= Rate_Min chan_id = str(c) signal_channels.append( (chan_name, chan_id, sampling_rate, sig_dtype, units, gain, offset, stream_id, buffer_id) ) signal_channels = np.array(signal_channels, dtype=_signal_channel_dtype) self._stream_buffer_slice = {"0": slice(None)} signal_buffers = np.array([("Signals", buffer_id)], dtype=_signal_buffer_dtype) signal_streams = np.array([("Signals", stream_id, buffer_id)], dtype=_signal_stream_dtype) if np.unique(signal_channels["sampling_rate"]).size != 1: raise NeoReadWriteError("The sampling rates must be the same across signal channels") self._sampling_rate = float(np.unique(signal_channels["sampling_rate"])[0]) # memmap traces buffer full_signal_shape = get_memmap_shape( self.filename, sig_dtype, num_channels=Num_Chan, offset=Data_Start_Offset ) seg_limits = [trace_offset for seg_start, trace_offset in self.info_segments] + [full_signal_shape[0]] self._t_starts = [] self._buffer_descriptions = {0: {}} for seg_index in range(nb_segment): seg_start, trace_offset = self.info_segments[seg_index] self._t_starts.append(seg_start / self._sampling_rate) start = seg_limits[seg_index] stop = seg_limits[seg_index + 1] shape = (stop - start, Num_Chan) file_offset = Data_Start_Offset + (start * np.dtype(sig_dtype).itemsize * Num_Chan) self._buffer_descriptions[0][seg_index] = {} self._buffer_descriptions[0][seg_index][buffer_id] = { "type": "raw", "file_path": str(self.filename), "dtype": sig_dtype, "order": "C", "file_offset": file_offset, "shape": shape, } # Event channels event_channels = [] event_channels.append(("Trigger", "", "event")) event_channels.append(("Note", "", "event")) event_channels.append(("Event A", "", "epoch")) event_channels.append(("Event B", "", "epoch")) event_channels = np.array(event_channels, dtype=_event_channel_dtype) # Read trigger and notes self._raw_events = [] ev_dtypes = [ ("TRIGGER", [("start", "u4"), ("label", "u2")]), ("NOTE", [("start", "u4"), ("label", "S40")]), ("EVENT A", [("label", "u4"), ("start", "u4"), ("stop", "u4")]), ("EVENT B", [("label", "u4"), ("start", "u4"), ("stop", "u4")]), ] for zname, ev_dtype in ev_dtypes: zname2, pos, length = zones[zname] dtype = np.dtype(ev_dtype) rawevent = np.memmap(self.filename, dtype=dtype, mode="r", offset=pos, shape=length // dtype.itemsize) # important : all events timing are related to the first segment t_start self._raw_events.append([]) for seg_index in range(nb_segment): left_lim = seg_limits[seg_index] right_lim = seg_limits[seg_index + 1] keep = (rawevent["start"] >= left_lim) & (rawevent["start"] < right_lim) & (rawevent["start"] != 0) self._raw_events[-1].append(rawevent[keep]) # No spikes spike_channels = [] spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) # fille into header dict self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [nb_segment] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = signal_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels # insert some annotation at some place self._generate_minimal_annotations() bl_annotations = self.raw_annotations["blocks"][0] seg_annotations = bl_annotations["segments"][0] for d in (bl_annotations, seg_annotations): d["rec_datetime"] = rec_datetime d["firstname"] = firstname d["surname"] = surname d["header_version"] = header_version sig_annotations = self.raw_annotations["blocks"][0]["segments"][0]["signals"][0] sig_annotations["__array_annotations__"]["ground"] = np.array(sig_grounds) def _source_name(self): return self.filename def _segment_t_start(self, block_index, seg_index): return self._t_starts[seg_index] def _segment_t_stop(self, block_index, seg_index): duration = self.get_signal_size(block_index, seg_index, stream_index=0) / self._sampling_rate return duration + self.segment_t_start(block_index, seg_index) def _get_signal_t_start(self, block_index, seg_index, stream_index): assert stream_index == 0 return self._t_starts[seg_index] def _spike_count(self, block_index, seg_index, unit_index): return 0 def _event_count(self, block_index, seg_index, event_channel_index): n = self._raw_events[event_channel_index][seg_index].size return n def _get_event_timestamps(self, block_index, seg_index, event_channel_index, t_start, t_stop): raw_event = self._raw_events[event_channel_index][seg_index] # important : all events timing are related to the first segment t_start seg_start0, _ = self.info_segments[0] if t_start is not None: keep = raw_event["start"] + seg_start0 >= int(t_start * self._sampling_rate) raw_event = raw_event[keep] if t_stop is not None: keep = raw_event["start"] + seg_start0 <= int(t_stop * self._sampling_rate) raw_event = raw_event[keep] timestamp = raw_event["start"] + seg_start0 if event_channel_index < 2: durations = None else: durations = raw_event["stop"] - raw_event["start"] try: labels = raw_event["label"].astype("U") except UnicodeDecodeError: # sometimes the conversion do not work : here a simple fix labels = np.array([e.decode("cp1252") for e in raw_event["label"]], dtype="U") return timestamp, durations, labels def _rescale_event_timestamp(self, event_timestamps, dtype, event_channel_index): event_times = event_timestamps.astype(dtype) / self._sampling_rate return event_times def _rescale_epoch_duration(self, raw_duration, dtype, event_channel_index): durations = raw_duration.astype(dtype) / self._sampling_rate return durations def _get_analogsignal_buffer_description(self, block_index, seg_index, buffer_id): return self._buffer_descriptions[block_index][seg_index][buffer_id] ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1737381806.1534154 neo-0.14.0/neo/rawio/neuralynxrawio/0000755000175100001660000000000014743453656016772 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/neuralynxrawio/__init__.py0000644000175100001660000000053114743453644021077 0ustar00runnerdocker""" RawIO for reading data from Neuralynx files. This IO supports NCS, NEV, NSE and NTT file formats. NCS contains the sampled signal for one channel NEV contains events NSE contains spikes and waveforms for mono electrodes NTT contains spikes and waveforms for tetrodes """ from neo.rawio.neuralynxrawio.neuralynxrawio import NeuralynxRawIO ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/neuralynxrawio/ncssections.py0000644000175100001660000003474714743453644021713 0ustar00runnerdocker""" Objects to represent continguous sections of samples in a Neuralynx continuously sampled .Ncs file. These sections are considered contiguous in that they have a start time, a sampling rate, and a length. Defining these sections is complicated due to the physical structure of .Ncs files which contain both a header and a set of fixed length records, CscRecords. Each CscRecord has a start time in microseconds, a channel id (chan_id), a stated sampling frequency (sampFreq) which is rounded to the whole sample/s, and a number of valid samples (nb_valid), which may be less than the physical maximum of 512. In principle each of these parameters may vary in each record in the file; however, there are no known examples of .Ncs files where the chan_id or sampFreq varied from record to record. The header normally, though not always, contains a stated sampling frequency, which may be rounded to a whole number of samples per second or not. Finally, the actual sampling frequency used within a section may be slightly different than any of the two frequencies above (that in the records or that in the header). This often arises due to clock drift over the course of a longer recording combined with the fact that only whole microseconds are recorded in the CscRecords. This can easily be 0.01% amounting to 0.2 seconds over the course of a half hour recording. These files may often contain apparent gaps of time between the sequential CscRecords in a file. A gap is where the predicted time at the start of the next record, based on taking the start time of the record and then adding 1/sampling rate x nbValid, does not agree exactly with the start time given in the next record. These gaps vary from those of less than one microsecond, likely due to rounding of the start time, to gaps of many minutes, which may be introduced by the human operator stopping and starting recording during a recording session. The challenge addressed by the NcsSectionsFactory of this module is to separate those intended gaps from those introduced by a quirk of the hardware, recording software, or file format. """ import math import numpy as np class NcsSections: """ Contains information regarding the contiguous sections of records in an Ncs file. Methods of NcsSectionsFactory perform parsing of this information from an Ncs file and produce these where the sections are discontiguous in time and in temporal order. TODO: This class will likely need __ne__ to be useful in more sophisticated segment construction algorithms. """ def __init__(self): self.sects = [] self.sampFreqUsed = 0 # actual sampling frequency of samples self.microsPerSampUsed = 0 # microseconds per sample def __eq__(self, other): samp_eq = self.sampFreqUsed == other.sampFreqUsed micros_eq = self.microsPerSampUsed == other.microsPerSampUsed sects_eq = self.sects == other.sects return samp_eq and micros_eq and sects_eq def __hash__(self): return (f"{self.sampFreqUsed};{self.microsPerSampUsed};" f"{[s.__hash__() for s in self.sects]}").__hash__() def is_equivalent(self, other, rel_tol=0, abs_tol=0): if len(self.sects) != len(other.sects): return False else: # do not check for gaps if only a single section is present for sec_id in range(len(self.sects) - 1): if not self.sects[sec_id].is_equivalent(other.sects[sec_id], rel_tol=rel_tol, abs_tol=abs_tol): return False return True class NcsSection: """ Information regarding a single contiguous section or group of records in an Ncs file. Model is that times are closed on the left and open on the right. Record numbers are closed on both left and right, that is, inclusive of the last record. endTime should never be set less than startTime for comparison functions to work properly, though this is not enforced. """ _RECORD_SIZE = 512 # nb sample per signal record def __init__(self, startRec, startTime, endRec, endTime, n_samples): self.startRec = startRec # index of starting record self.startTime = startTime # starttime of first record self.endRec = endRec # index of last record (inclusive) self.endTime = endTime # end time of last record, that is, the end time of the last # sampling period contained in the last record of the section self.n_samples = n_samples # number of samples in record which are valid def __eq__(self, other): return ( self.startRec == other.startRec and self.startTime == other.startTime and self.endRec == other.endRec and self.endTime == other.endTime and self.n_samples == other.n_samples ) def __hash__(self): s = f"{self.startRec};{self.startTime};{self.endRec};{self.endTime};{self.n_samples}" return s.__hash__() def is_equivalent(self, other, rel_tol=0, abs_tol=0): eq_start = math.isclose(self.startTime, other.startTime, rel_tol=rel_tol, abs_tol=abs_tol) eq_end = math.isclose(self.endTime, other.endTime, rel_tol=rel_tol, abs_tol=abs_tol) return eq_start & eq_end def before_time(self, rhb): """ Determine if this section is completely before another section in time. """ return self.endTime < rhb.startTime def overlaps_time(self, rhb): """ Determine if this section overlaps another in time. """ return self.startTime <= rhb.endTime and self.endTime >= rhb.startTime def after_time(self, rhb): """ Determine if this section is completely after another section in time. """ return self.startTime >= rhb.endTime class NcsSectionsFactory: """ Class for factory methods which perform parsing of contiguous sections of records in Ncs files. Model for times is that times are rounded to nearest microsecond. Times from start of a sample until just before the next sample are included, that is, closed lower bound and open upper bound on intervals. A channel with no samples is empty and contains no time intervals. Moved here since algorithm covering all 3 header styles and types used is more complicated. """ _maxGapSampFrac = 0.2 # maximum fraction of a sampling interval between predicted # and actual record timestamps still considered within one section @staticmethod def get_freq_for_micros_per_samp(micros): """ Compute fractional sampling frequency, given microseconds per sample. """ return 1e6 / micros @staticmethod def get_micros_per_samp_for_freq(sampFr): """ Calculate fractional microseconds per sample, given the sampling frequency (Hz). """ return 1e6 / sampFr @staticmethod def calc_sample_time(sampFr, startTime, posn): """ Calculate time rounded to microseconds for sample given frequency, start time, and sample position. """ return round(startTime + NcsSectionsFactory.get_micros_per_samp_for_freq(sampFr) * posn) @staticmethod def _buildNcsSections(ncsMemMap, sampFreq, gapTolerance=0): """ Construct NcsSections with fast mode when no gaps or parsing the file to detect gaps. """ channel_id = ncsMemMap["channel_id"][0] ncsSects = NcsSections() # check if file is one block of records, which is often the case, and avoid full parse # need that last timestamp match the predicted one. predLastBlockStartTime = NcsSectionsFactory.calc_sample_time( sampFreq, ncsMemMap["timestamp"][0], NcsSection._RECORD_SIZE * (ncsMemMap.shape[0] - 1) ) if ( channel_id == ncsMemMap["channel_id"][-1] and ncsMemMap["sample_rate"][0] == ncsMemMap["sample_rate"][-1] and ncsMemMap["timestamp"][-1] == predLastBlockStartTime ): lastBlkEndTime = NcsSectionsFactory.calc_sample_time( sampFreq, ncsMemMap["timestamp"][-1], ncsMemMap["nb_valid"][-1] ) n_samples = NcsSection._RECORD_SIZE * (ncsMemMap.size - 1) + ncsMemMap["nb_valid"][-1] section0 = NcsSection( startRec=0, startTime=ncsMemMap["timestamp"][0], endRec=ncsMemMap.size - 1, endTime=lastBlkEndTime, n_samples=n_samples, ) ncsSects.sects.append(section0) else: # need to parse all data block to detect gaps # check when the predicted timestamp is outside the tolerance delta = (ncsMemMap["timestamp"][1:] - ncsMemMap["timestamp"][:-1]).astype(np.int64) delta_prediction = ((ncsMemMap["nb_valid"][:-1] / sampFreq) * 1e6).astype(np.int64) gap_inds = np.flatnonzero(np.abs(delta - delta_prediction) > gapTolerance) gap_inds += 1 sections_limits = [0] + gap_inds.tolist() + [len(ncsMemMap)] for i in range(len(gap_inds) + 1): start = sections_limits[i] stop = sections_limits[i + 1] duration = np.uint64(1e6 / sampFreq * ncsMemMap["nb_valid"][stop - 1]) ncsSects.sects.append( NcsSection( startRec=start, startTime=ncsMemMap["timestamp"][start], endRec=stop - 1, endTime=ncsMemMap["timestamp"][stop - 1] + duration, n_samples=np.sum(ncsMemMap["nb_valid"][start:stop]), ) ) return ncsSects @staticmethod def build_for_ncs_file(ncsMemMap, nlxHdr, gapTolerance=None, strict_gap_mode=True): """ Build an NcsSections object for an NcsFile, given as a memmap and NlxHeader, handling gap detection appropriately given the file type as specified by the header. Parameters ---------- ncsMemMap: memory map of file nlxHdr: NlxHeader from corresponding file. Returns ------- An NcsSections corresponding to the provided ncsMemMap and nlxHdr """ acqType = nlxHdr.type_of_recording() freq = nlxHdr["sampling_rate"] if acqType == "PRE4": # Old Neuralynx style with truncated whole microseconds for actual sampling. This # restriction arose from the sampling being based on a master 1 MHz clock. microsPerSampUsed = math.floor(NcsSectionsFactory.get_micros_per_samp_for_freq(freq)) sampFreqUsed = NcsSectionsFactory.get_freq_for_micros_per_samp(microsPerSampUsed) if gapTolerance is None: if strict_gap_mode: # this is the old behavior, maybe we could put 0.9 sample interval no ? gapTolerance = 0 else: gapTolerance = 0 ncsSects = NcsSectionsFactory._buildNcsSections(ncsMemMap, sampFreqUsed, gapTolerance=gapTolerance) ncsSects.sampFreqUsed = sampFreqUsed ncsSects.microsPerSampUsed = microsPerSampUsed elif acqType in ["DIGITALLYNX", "DIGITALLYNXSX", "CHEETAH64", "CHEETAH560", "RAWDATAFILE"]: # digital lynx style with fractional frequency and micros per samp determined from block times if gapTolerance is None: if strict_gap_mode: # this is the old behavior gapTolerance = round(NcsSectionsFactory._maxGapSampFrac * 1e6 / freq) else: # quarter of paquet size is tolerate gapTolerance = round(0.25 * NcsSection._RECORD_SIZE * 1e6 / freq) ncsSects = NcsSectionsFactory._buildNcsSections(ncsMemMap, freq, gapTolerance=gapTolerance) # take longer data block to compute reaal sampling rate # ind_max = np.argmax([section.n_samples for section in ncsSects.sects]) ind_max = np.argmax([section.endRec - section.startRec for section in ncsSects.sects]) section = ncsSects.sects[ind_max] if section.endRec != section.startRec: # need several data block sampFreqUsed = ( (section.n_samples - ncsMemMap["nb_valid"][section.endRec]) * 1e6 / (ncsMemMap["timestamp"][section.endRec] - section.startTime) ) else: sampFreqUsed = freq ncsSects.sampFreqUsed = sampFreqUsed ncsSects.microsPerSampUsed = NcsSectionsFactory.get_micros_per_samp_for_freq(sampFreqUsed) elif acqType == "BML" or acqType == "ATLAS": # BML & ATLAS style with fractional frequency and micros per samp if strict_gap_mode: # this is the old behavior, maybe we could put 0.9 sample interval no ? gapTolerance = 0 else: # quarter of paquet size is tolerate gapTolerance = round(0.25 * NcsSection._RECORD_SIZE * 1e6 / freq) ncsSects = NcsSectionsFactory._buildNcsSections(ncsMemMap, freq, gapTolerance=gapTolerance) ncsSects.sampFreqUsed = freq ncsSects.microsPerSampUsed = NcsSectionsFactory.get_micros_per_samp_for_freq(freq) else: raise TypeError("Unknown Ncs file type from header.") return ncsSects @staticmethod def _verifySectionsStructure(ncsMemMap, ncsSects): """ Check that the record structure and timestamps for the ncsMemMap agrees with that in ncsSects. Provides a more rapid verification of structure than building a new NcsSections and checking equality. Parameters ---------- ncsMemMap: memmap of file to be checked ncsSects existing block structure to be checked Returns ------- true if all timestamps and block record starts and stops agree, otherwise false. """ for blki in range(0, len(ncsSects.sects)): if ncsMemMap["timestamp"][ncsSects.sects[blki].startRec] != ncsSects.sects[blki].startTime: return False ets = ncsMemMap["timestamp"][ncsSects.sects[blki].endRec] enb = ncsMemMap["nb_valid"][ncsSects.sects[blki].endRec] endTime = NcsSectionsFactory.calc_sample_time(ncsSects.sampFreqUsed, ets, enb) if endTime != ncsSects.sects[blki].endTime: return False return True ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737381796.0 neo-0.14.0/neo/rawio/neuralynxrawio/neuralynxrawio.py0000644000175100001660000012023114743453644022427 0ustar00runnerdocker""" Class for reading data from Neuralynx files. This IO supports NCS, NEV, NSE and NTT file formats. NCS contains the sampled signal for one channel NEV contains events NSE contains spikes and waveforms for mono electrodes NTT contains spikes and waveforms for tetrodes All Neuralynx files contain a 16 kilobyte text header followed by 0 or more fixed length records. The format of the header has never been formally specified, however, the Neuralynx programs which write them have followed a set of conventions which have varied over the years. Additionally, other programs like Pegasus write files with somewhat varying headers. This variation requires parsing to determine the exact version and type which is handled within this RawIO by the NlxHeader class. Ncs files contain a series of 1044 byte records, each of which contains 512 16 byte samples and header information which includes a 64 bit timestamp in microseconds, a 16 bit channel number, the sampling frequency in integral Hz, and the number of the 512 samples which are considered valid samples (the remaining samples within the record are invalid). The Ncs file header usually contains a specification of the sampling frequency, which may be rounded to an integral number of Hz or may be fractional. The actual sampling frequency in terms of the underlying clock is physically determined by the spacing of the timestamps between records. These variations of header format and possible differences between the stated sampling frequency and actual sampling frequency can create apparent time discrepancies in .Ncs files. Additionally, the Neuralynx recording software can start and stop recording while continuing to write samples to a single .Ncs file, which creates larger gaps in the time sequences of the samples. This RawIO attempts to correct for these deviations where possible and present a single section of contiguous samples with one sampling frequency, t_start, and length for each .Ncs file. These sections are determined by the NcsSectionsFactory class. In the event the gaps are larger, this RawIO only provides the samples from the first section as belonging to one Segment. If .Ncs files are loaded these determine the Segments of data to be loaded. Events and spiking data outside of Segments defined by .Ncs files will be ignored. To access all time point data in a single Segment load a session excluding .Ncs files. Continuous data streams are ordered by descending sampling rate. This RawIO presents only a single Block. Author: Julia Sprenger, Carlos Canova, Samuel Garcia, Peter N. Steinmetz. """ from ..baserawio import ( BaseRawIO, _signal_channel_dtype, _signal_stream_dtype, _signal_buffer_dtype, _spike_channel_dtype, _event_channel_dtype, ) from operator import itemgetter import numpy as np import os import pathlib import copy import warnings from collections import namedtuple, OrderedDict from neo.rawio.neuralynxrawio.ncssections import NcsSection, NcsSectionsFactory from neo.rawio.neuralynxrawio.nlxheader import NlxHeader class NeuralynxRawIO(BaseRawIO): """ Class for reading datasets recorded by Neuralynx. This version works with rawmode of one-dir for a single directory of files or one-file for a single file. Parameters ---------- dirname: str, default: '' Name of directory containing all files for a dataset. If provided, filename is ignored. But one of either dirname or filename is required. include_filenames: str | list | None, default: None Name of a single ncs, nse, nev or ntt file or list of such files. Will only include file names in the list. This can be plain filenames or fullpath or path relative to dirname. All files should be in a single path. exclude_filenames: str | list | None, default: None Name of a single ncs, nse, nev or ntt file or list of such files. Expects plain filenames (without directory path). None will search for all file types keep_original_times: bool, default: False If True, keep original start time as in files, Otherwise set 0 of time to first time in dataset strict_gap_mode: bool, default: True Detect gaps using strict mode or not. * strict_gap_mode = True then a gap is consider when timstamp difference between two consequtive data packet is more than one sample interval. * strict_gap_mode = False then a gap has an increased tolerance. Some new system with different clock need this option otherwise, too many gaps are detected Notes ----- * This IO supports NCS, NEV, NSE and NTT file formats (not NVT or NRD yet) * These variations of header format and possible differences between the stated sampling frequency and actual sampling frequency can create apparent time discrepancies in .Ncs files. Additionally, the Neuralynx recording software can start and stop recording while continuing to write samples to a single .Ncs file, which creates larger gaps in the time sequences of the samples. * This RawIO attempts to correct for these deviations where possible and present a single section of contiguous samples with one sampling frequency, t_start, and length for each .Ncs file. These sections are determined by the NcsSectionsFactory class. In the event the gaps are larger, this RawIO only provides the samples from the first section as belonging to one Segment. Examples -------- >>> import neo.rawio >>> reader = neo.rawio.NeuralynxRawIO(dirname='Cheetah_v5.5.1/original_data') >>> reader.parse_header() Inspect all files in the directory. >>> print(reader) Display all information about signal channels, units, segment size.... """ extensions = ["nse", "ncs", "nev", "ntt", "nvt", "nrd"] # nvt and nrd are not yet supported rawmode = "one-dir" _ncs_dtype = [ ("timestamp", "uint64"), ("channel_id", "uint32"), ("sample_rate", "uint32"), ("nb_valid", "uint32"), ("samples", "int16", NcsSection._RECORD_SIZE), ] def __init__( self, dirname="", include_filenames=None, exclude_filenames=None, keep_original_times=False, strict_gap_mode=True, filename=None, exclude_filename=None, **kargs, ): if not dirname: raise ValueError("`dirname` cannot be empty.") if filename is not None: include_filenames = [filename] warnings.warn("`filename` is deprecated and will be removed. Please use `include_filenames` instead") if exclude_filename is not None: if isinstance(exclude_filename, str): exclude_filenames = [exclude_filename] else: exclude_filenames = exclude_filename warnings.warn( "`exclude_filename` is deprecated and will be removed. Please use `exclude_filenames` instead" ) if include_filenames is None: include_filenames = [] elif isinstance(include_filenames, str): include_filenames = [include_filenames] if exclude_filenames is None: exclude_filenames = [] elif isinstance(exclude_filenames, str): exclude_filenames = [exclude_filenames] if include_filenames: self.rawmode = "multiple-files" else: self.rawmode = "one-dir" self.dirname = dirname self.include_filenames = include_filenames self.exclude_filenames = exclude_filenames self.keep_original_times = keep_original_times self.strict_gap_mode = strict_gap_mode BaseRawIO.__init__(self, **kargs) def _source_name(self): return self.dirname def _parse_header(self): stream_channels = [] signal_channels = [] spike_channels = [] event_channels = [] self.ncs_filenames = OrderedDict() # (chan_name, chan_id): filename self.nse_ntt_filenames = OrderedDict() # (chan_name, chan_id): filename self.nev_filenames = OrderedDict() # chan_id: filename self.file_headers = OrderedDict() # filename: file header dict self._nev_memmap = {} self._spike_memmap = {} self.internal_unit_ids = [] # channel_index > ((channel_name, channel_id), unit_id) self.internal_event_ids = [] self._empty_ncs = [] # this list contains filenames of empty files self._empty_nev = [] self._empty_nse_ntt = [] # Explore the directory looking for ncs, nev, nse and ntt # and construct channels headers. signal_annotations = [] unit_annotations = [] event_annotations = [] if self.rawmode == "one-dir": filenames = sorted(os.listdir(self.dirname)) else: filenames = self.include_filenames filenames = [f for f in filenames if f not in self.exclude_filenames] full_filenames = [os.path.join(self.dirname, f) for f in filenames] for filename in full_filenames: if not os.path.isfile(filename): raise ValueError( f"Provided Filename is not a file: " f"{filename}. If you want to provide a " f"directory use the `dirname` keyword" ) stream_props = {} # {(sampling_rate, n_samples, t_start): {stream_id: [filenames]} for filename in full_filenames: _, ext = os.path.splitext(filename) ext = ext[1:] # remove dot ext = ext.lower() # make lower case for comparisons if ext not in self.extensions: continue # Skip Ncs files with only header. Other empty file types # will have an empty dataset constructed later. if (os.path.getsize(filename) <= NlxHeader.HEADER_SIZE) and ext in ["ncs"]: self._empty_ncs.append(filename) continue # All file have more or less the same header structure info = NlxHeader(filename) self.file_headers[filename] = info chan_names = info["channel_names"] chan_ids = info["channel_ids"] for idx, chan_id in enumerate(chan_ids): chan_name = chan_names[idx] chan_uid = (chan_name, str(chan_id)) if ext == "ncs": file_mmap = self._get_file_map(filename) n_packets = copy.copy(file_mmap.shape[0]) if n_packets: t_start = copy.copy(file_mmap[0][0]) else: # empty file t_start = 0 stream_prop = (info["sampling_rate"], n_packets, t_start) if stream_prop not in stream_props: stream_props[stream_prop] = {"stream_id": len(stream_props), "filenames": [filename]} else: stream_props[stream_prop]["filenames"].append(filename) stream_id = stream_props[stream_prop]["stream_id"] # @zach @ramon : we need to discuss this split by channel buffer buffer_id = "" # a sampled signal channel units = "uV" gain = info["bit_to_microVolt"][idx] if info.get("input_inverted", False): gain *= -1 offset = 0.0 signal_channels.append( ( chan_name, str(chan_id), info["sampling_rate"], "int16", units, gain, offset, stream_id, buffer_id, ) ) self.ncs_filenames[chan_uid] = filename keys = [ "DspFilterDelay_µs", "recording_opened", "FileType", "DspDelayCompensation", "recording_closed", "DspLowCutFilterType", "HardwareSubSystemName", "DspLowCutNumTaps", "DSPLowCutFilterEnabled", "HardwareSubSystemType", "DspHighCutNumTaps", "ADMaxValue", "DspLowCutFrequency", "DSPHighCutFilterEnabled", "RecordSize", "InputRange", "DspHighCutFrequency", "input_inverted", "NumADChannels", "DspHighCutFilterType", ] d = {k: info[k] for k in keys if k in info} signal_annotations.append(d) elif ext in ("nse", "ntt"): # nse and ntt are pretty similar except for the waveform shape. # A file can contain several unit_id (so several unit channel). assert chan_id not in self.nse_ntt_filenames, "Several nse or ntt files have the same unit_id!!!" self.nse_ntt_filenames[chan_uid] = filename data = self._get_file_map(filename) self._spike_memmap[chan_uid] = data unit_ids = np.unique(data["unit_id"]) for unit_id in unit_ids: # a spike channel for each (chan_id, unit_id) self.internal_unit_ids.append((chan_uid, unit_id)) unit_name = "ch{}#{}#{}".format(chan_name, chan_id, unit_id) unit_id = "{}".format(unit_id) wf_units = "uV" wf_gain = info["bit_to_microVolt"][idx] if info.get("input_inverted", False): wf_gain *= -1 wf_offset = 0.0 wf_left_sweep = -1 # NOT KNOWN wf_sampling_rate = info["sampling_rate"] spike_channels.append( ( unit_name, "{}".format(unit_id), wf_units, wf_gain, wf_offset, wf_left_sweep, wf_sampling_rate, ) ) unit_annotations.append(dict(file_origin=filename)) elif ext == "nev": # an event channel # each ('event_id', 'ttl_input') give a new event channel self.nev_filenames[chan_id] = filename if os.path.getsize(filename) <= NlxHeader.HEADER_SIZE: self._empty_nev.append(filename) data = np.zeros((0,), dtype=nev_dtype) internal_ids = [] else: data = self._get_file_map(filename) if data.shape[0] == 0: # empty file self._empty_nse_ntt.append(filename) internal_ids = np.unique(data[["event_id", "ttl_input"]]).tolist() for internal_event_id in internal_ids: if internal_event_id not in self.internal_event_ids: event_id, ttl_input = internal_event_id name = "{} event_id={} ttl={}".format(chan_name, event_id, ttl_input) event_channels.append((name, chan_id, "event")) self.internal_event_ids.append(internal_event_id) self._nev_memmap[chan_id] = data signal_channels = np.array(signal_channels, dtype=_signal_channel_dtype) spike_channels = np.array(spike_channels, dtype=_spike_channel_dtype) event_channels = np.array(event_channels, dtype=_event_channel_dtype) if signal_channels.size > 0: # ordering streams according from high to low sampling rates stream_props = {k: stream_props[k] for k in sorted(stream_props, reverse=True)} stream_names = [f"Stream (rate,#packet,t0): {sp}" for sp in stream_props] stream_ids = [stream_prop["stream_id"] for stream_prop in stream_props.values()] buffer_ids = ["" for sp in stream_props] signal_streams = list(zip(stream_names, stream_ids, buffer_ids)) else: signal_streams = [] signal_buffers = np.array([], dtype=_signal_buffer_dtype) signal_streams = np.array(signal_streams, dtype=_signal_stream_dtype) # set 2 attributes needed later for header in case there are no ncs files in dataset, # e.g. Pegasus self._timestamp_limits = None self._nb_segment = 1 stream_infos = {} # Read ncs files of each stream for gap detection and nb_segment computation. for stream_id in np.unique(signal_channels["stream_id"]): stream_channels = signal_channels[signal_channels["stream_id"] == stream_id] stream_chan_uids = zip(stream_channels["name"], stream_channels["id"]) stream_filenames = [self.ncs_filenames[chuid] for chuid in stream_chan_uids] _sigs_memmaps, ncsSegTimestampLimits, section_structure = self.scan_stream_ncs_files(stream_filenames) stream_infos[stream_id] = { "segment_sig_memmaps": _sigs_memmaps, "ncs_segment_infos": ncsSegTimestampLimits, "section_structure": section_structure, } # check if section structure across streams is compatible and merge infos ref_sec_structure = None for stream_id, stream_info in stream_infos.items(): ref_stream_id = list(stream_infos.keys())[0] ref_sec_structure = stream_infos[ref_stream_id]["section_structure"] sec_structure = stream_info["section_structure"] # check if section structure of streams are compatible # using tolerance of one data packet (512 samples) tolerance = 512 / min(ref_sec_structure.sampFreqUsed, sec_structure.sampFreqUsed) * 1e6 if not ref_sec_structure.is_equivalent(sec_structure, abs_tol=tolerance): ref_chan_ids = signal_channels[signal_channels["stream_id"] == ref_stream_id]["name"] chan_ids = signal_channels[signal_channels["stream_id"] == stream_id]["name"] raise ValueError( "Incompatible section structures across streams: " f"Stream id {ref_stream_id}:{ref_chan_ids} and " f"{stream_id}:{chan_ids}." ) if ref_sec_structure is not None: self._nb_segment = len(ref_sec_structure.sects) else: # Use only a single segment if no ncs data is present self._nb_segment = 1 def min_max_tuple(tuple1, tuple2): """Merge tuple by selecting min for first and max for 2nd entry""" mins, maxs = zip(tuple1, tuple2) result = (min(m for m in mins if m is not None), max(m for m in maxs if m is not None)) return result # merge stream mmemmaps since streams are compatible self._sigs_memmaps = [{} for seg_idx in range(self._nb_segment)] # time limits of integer timestamps in ncs files self._timestamp_limits = [(None, None) for seg_idx in range(self._nb_segment)] # time limits physical times in ncs files self._signal_limits = [(None, None) for seg_idx in range(self._nb_segment)] for stream_id, stream_info in stream_infos.items(): stream_mmaps = stream_info["segment_sig_memmaps"] for seg_idx, signal_dict in enumerate(stream_mmaps): self._sigs_memmaps[seg_idx].update(signal_dict) ncs_segment_info = stream_info["ncs_segment_infos"] for seg_idx, (t_start, t_stop) in enumerate(ncs_segment_info.timestamp_limits): self._timestamp_limits[seg_idx] = min_max_tuple(self._timestamp_limits[seg_idx], (t_start, t_stop)) for seg_idx in range(ncs_segment_info.nb_segment): t_start = ncs_segment_info.t_start[seg_idx] t_stop = ncs_segment_info.t_stop[seg_idx] self._signal_limits[seg_idx] = min_max_tuple(self._signal_limits[seg_idx], (t_start, t_stop)) # precompute signal lengths within segments self._sigs_length = [] if self._sigs_memmaps: for seg_idx, sig_container in enumerate(self._sigs_memmaps): self._sigs_length.append({}) for chan_uid, sig_infos in sig_container.items(): self._sigs_length[seg_idx][chan_uid] = int(sig_infos["nb_valid"].sum()) # Determine timestamp limits in nev, nse, ntt files by scanning them. ts0, ts1 = None, None for _data_memmap in (self._spike_memmap, self._nev_memmap): for _, data in _data_memmap.items(): ts = data["timestamp"] if ts.size == 0: continue if ts0 is None: ts0 = ts[0] ts1 = ts[-1] ts0 = min(ts0, ts[0]) ts1 = max(ts1, ts[-1]) # rescaling for comparison with signal times if ts0 is not None: timestamps_start, timestamps_stop = ts0 / 1e6, ts1 / 1e6 # decide on segment and global start and stop times based on files available if self._timestamp_limits is None: # case NO ncs but HAVE nev or nse -> single segment covering all spikes & events self._timestamp_limits = [(ts0, ts1)] self._seg_t_starts = [timestamps_start] self._seg_t_stops = [timestamps_stop] self.global_t_start = timestamps_start self.global_t_stop = timestamps_stop elif ts0 is not None: # case HAVE ncs AND HAVE nev or nse -> multi segments based on ncs segmentation # ignoring nev/nse/ntt time limits, loading only data within ncs segments global_events_limits = (timestamps_start, timestamps_stop) global_signal_limits = (self._signal_limits[0][0], self._signal_limits[-1][-1]) self.global_t_start, self.global_t_stop = min_max_tuple(global_events_limits, global_signal_limits) self._seg_t_starts = [limits[0] for limits in self._signal_limits] self._seg_t_stops = [limits[1] for limits in self._signal_limits] self._seg_t_starts[0] = self.global_t_start self._seg_t_stops[-1] = self.global_t_stop else: # case HAVE ncs but NO nev or nse -> self._seg_t_starts = [limits[0] for limits in self._signal_limits] self._seg_t_stops = [limits[1] for limits in self._signal_limits] self.global_t_start = self._signal_limits[0][0] self.global_t_stop = self._signal_limits[-1][-1] if self.keep_original_times: self.global_t_stop = self.global_t_stop - self.global_t_start self.global_t_start = 0 # fill header dictionary self.header = {} self.header["nb_block"] = 1 self.header["nb_segment"] = [self._nb_segment] self.header["signal_buffers"] = signal_buffers self.header["signal_streams"] = signal_streams self.header["signal_channels"] = signal_channels self.header["spike_channels"] = spike_channels self.header["event_channels"] = event_channels # Annotations self._generate_minimal_annotations() bl_annotations = self.raw_annotations["blocks"][0] for seg_index in range(self._nb_segment): seg_annotations = bl_annotations["segments"][seg_index] for stream_id in range(signal_streams.size): # one or no signal stream stream_ann = seg_annotations["signals"][stream_id] # handle array annotations for key in signal_annotations[0].keys(): values = [] # only collect values from channels belonging to current stream for d in np.where(signal_channels["stream_id"] == f"{stream_id}")[0]: value = signal_annotations[d][key] values.append(value) values = np.array(values) if values.ndim == 1: # 'InputRange': is 2D and make bugs stream_ann["__array_annotations__"][key] = values for c in range(spike_channels.size): unit_ann = seg_annotations["spikes"][c] unit_ann.update(unit_annotations[c]) for c in range(event_channels.size): # annotations for channel events event_id, ttl_input = self.internal_event_ids[c] chan_id = event_channels[c]["id"] ev_ann = seg_annotations["events"][c] ev_ann["file_origin"] = self.nev_filenames[chan_id] # ~ ev_ann['marker_id'] = # ~ ev_ann['nttl'] = # ~ ev_ann['digital_marker'] = # ~ ev_ann['analog_marker'] = @staticmethod def _get_file_map(filename): """ Create memory maps when needed see also https://github.com/numpy/numpy/issues/19340 """ filename = pathlib.Path(filename) suffix = filename.suffix.lower()[1:] if suffix == "ncs": return np.memmap(filename, dtype=NeuralynxRawIO._ncs_dtype, mode="r", offset=NlxHeader.HEADER_SIZE) elif suffix in ["nse", "ntt"]: info = NlxHeader(filename) dtype = get_nse_or_ntt_dtype(info, suffix) # return empty map if file does not contain data if os.path.getsize(filename) <= NlxHeader.HEADER_SIZE: return np.zeros((0,), dtype=dtype) return np.memmap(filename, dtype=dtype, mode="r", offset=NlxHeader.HEADER_SIZE) elif suffix == "nev": return np.memmap(filename, dtype=nev_dtype, mode="r", offset=NlxHeader.HEADER_SIZE) else: raise ValueError(f"Unknown file suffix {suffix}") # Accessors for segment times which are offset by appropriate global start time def _segment_t_start(self, block_index, seg_index): return self._seg_t_starts[seg_index] - self.global_t_start def _segment_t_stop(self, block_index, seg_index): return self._seg_t_stops[seg_index] - self.global_t_start def _get_signal_size(self, block_index, seg_index, stream_index): stream_id = self.header["signal_streams"][stream_index]["id"] stream_mask = self.header["signal_channels"]["stream_id"] == stream_id signals = self.header["signal_channels"][stream_mask] if len(signals): sig = signals[0] return self._sigs_length[seg_index][(sig["name"], sig["id"])] else: raise ValueError( f"No signals present for block {block_index}, segment {seg_index}," f" stream {stream_index}" ) def _get_signal_t_start(self, block_index, seg_index, stream_index): stream_id = self.header["signal_streams"][stream_index]["id"] stream_mask = self.header["signal_channels"]["stream_id"] == stream_id # use first channel of stream as all channels in stream have a common t_start channel = self.header["signal_channels"][stream_mask][0] data = self._sigs_memmaps[seg_index][(channel["name"], channel["id"])] absolute_t_start = data["timestamp"][0] return absolute_t_start / 1e6 - self.global_t_start def _get_analogsignal_chunk(self, block_index, seg_index, i_start, i_stop, stream_index, channel_indexes): """ Retrieve chunk of analog signal, a chunk being a set of contiguous samples. Parameters ---------- block_index: index of block in dataset, ignored as only 1 block in this implementation seg_index: index of segment to use i_start: sample index of first sample within segment to retrieve i_stop: sample index of last sample within segment to retrieve channel_indexes: list of channel indices to return data for Returns ------- array of samples, with each requested channel in a column """ if i_start is None: i_start = 0 if i_stop is None: i_stop = self.get_signal_size(block_index=block_index, seg_index=seg_index, stream_index=stream_index) block_start = i_start // NcsSection._RECORD_SIZE block_stop = i_stop // NcsSection._RECORD_SIZE + 1 sl0 = i_start % 512 sl1 = sl0 + (i_stop - i_start) if channel_indexes is None: channel_indexes = slice(None) stream_id = self.header["signal_streams"][stream_index]["id"] stream_mask = self.header["signal_channels"]["stream_id"] == stream_id channel_ids = self.header["signal_channels"][stream_mask][channel_indexes]["id"] channel_names = self.header["signal_channels"][stream_mask][channel_indexes]["name"] # create buffer for samples sigs_chunk = np.zeros((i_stop - i_start, len(channel_ids)), dtype="int16") for i, chan_uid in enumerate(zip(channel_names, channel_ids)): data = self._sigs_memmaps[seg_index][chan_uid] sub = data[block_start:block_stop] sigs_chunk[:, i] = sub["samples"].flatten()[sl0:sl1] return sigs_chunk def _spike_count(self, block_index, seg_index, unit_index): chan_uid, unit_id = self.internal_unit_ids[unit_index] data = self._spike_memmap[chan_uid] ts = data["timestamp"] ts0 = self.segment_t_start(block_index, seg_index) ts1 = self.segment_t_stop(block_index, seg_index) # rescale to integer sampling of time ts0 = int((ts0 + self.global_t_start) * 1e6) ts1 = int((ts1 + self.global_t_start) * 1e6) # only count spikes inside the timestamp limits, inclusive, and for the specified unit keep = (ts >= ts0) & (ts <= ts1) & (unit_id == data["unit_id"]) nb_spike = int(data[keep].size) return nb_spike def _get_spike_timestamps(self, block_index, seg_index, unit_index, t_start, t_stop): """ Extract timestamps within a Segment defined by ncs timestamps """ chan_uid, unit_id = self.internal_unit_ids[unit_index] data = self._spike_memmap[chan_uid] ts = data["timestamp"] ts0, ts1 = t_start, t_stop if ts0 is None: ts0 = self.segment_t_start(block_index, seg_index) if ts1 is None: ts1 = self.segment_t_stop(block_index, seg_index) # rescale to integer sampling of time ts0 = int((ts0 + self.global_t_start) * 1e6) ts1 = int((ts1 + self.global_t_start) * 1e6) keep = (ts >= ts0) & (ts <= ts1) & (unit_id == data["unit_id"]) timestamps = ts[keep] return timestamps def _rescale_spike_timestamp(self, spike_timestamps, dtype): spike_times = spike_timestamps.astype(dtype) spike_times /= 1e6 spike_times -= self.global_t_start return spike_times def _get_spike_raw_waveforms(self, block_index, seg_index, unit_index, t_start, t_stop): chan_uid, unit_id = self.internal_unit_ids[unit_index] data = self._spike_memmap[chan_uid] ts = data["timestamp"] ts0, ts1 = t_start, t_stop if ts0 is None: ts0 = self.segment_t_start(block_index, seg_index) if ts1 is None: ts1 = self.segment_t_stop(block_index, seg_index) # rescale to integer sampling of time ts0 = int((ts0 + self.global_t_start) * 1e6) ts1 = int((ts1 + self.global_t_start) * 1e6) keep = (ts >= ts0) & (ts <= ts1) & (unit_id == data["unit_id"]) wfs = data[keep]["samples"] if wfs.ndim == 2: # case for nse waveforms = wfs[:, None, :] else: # case for ntt change (n, 32, 4) to (n, 4, 32) waveforms = wfs.swapaxes(1, 2) return waveforms def _event_count(self, block_index, seg_index, event_channel_index): event_id, ttl_input = self.internal_event_ids[event_channel_index] chan_id = self.header["event_channels"][event_channel_index]["id"] data = self._nev_memmap[chan_id] ts0 = self.segment_t_start(block_index, seg_index) ts1 = self.segment_t_stop(block_index, seg_index) # rescale to integer sampling of time ts0 = int((ts0 + self.global_t_start) * 1e6) ts1 = int((ts1 + self.global_t_start) * 1e6) ts = data["timestamp"] keep = (ts >= ts0) & (ts <= ts1) & (data["event_id"] == event_id) & (data["ttl_input"] == ttl_input) nb_event = int(data[keep].size) return nb_event def _get_event_timestamps(self, block_index, seg_index, event_channel_index, t_start, t_stop): event_id, ttl_input = self.internal_event_ids[event_channel_index] chan_id = self.header["event_channels"][event_channel_index]["id"] data = self._nev_memmap[chan_id] ts0, ts1 = t_start, t_stop if ts0 is None: ts0 = self.segment_t_start(block_index, seg_index) if ts1 is None: ts1 = self.segment_t_stop(block_index, seg_index) # rescale to integer sampling of time ts0 = int((ts0 + self.global_t_start) * 1e6) ts1 = int((ts1 + self.global_t_start) * 1e6) ts = data["timestamp"] keep = (ts >= ts0) & (ts <= ts1) & (data["event_id"] == event_id) & (data["ttl_input"] == ttl_input) subdata = data[keep] timestamps = subdata["timestamp"] labels = subdata["event_string"].astype("U") durations = None return timestamps, durations, labels def _rescale_event_timestamp(self, event_timestamps, dtype, event_channel_index): event_times = event_timestamps.astype(dtype) event_times /= 1e6 event_times -= self.global_t_start return event_times def scan_stream_ncs_files(self, ncs_filenames): """ Given a list of ncs files, read their basic structure. Ncs files have to have common sampling_rate, number of packets and t_start (be part of a single stream) Parameters ---------- ncs_filenames: list List of ncs filenames to scan. Returns ------- memmaps [ {} for seg_index in range(self._nb_segment) ][chan_uid] seg_time_limits SegmentTimeLimits for sections in scanned Ncs files section_structure Section structure common to the ncs files Files will be scanned to determine the sections of records. If file is a single section of records, this scan is brief, otherwise it will check each record which may take some time. """ if len(ncs_filenames) == 0: return None, None, None # Build dictionary of chan_uid to associated NcsSections, memmap and NlxHeaders. Only # construct new NcsSections when it is different from that for the preceding file. chanSectMap = dict() sig_length = [] for ncs_filename in ncs_filenames: data = self._get_file_map(ncs_filename) nlxHeader = NlxHeader(ncs_filename) verify_sec_struct = NcsSectionsFactory._verifySectionsStructure if not chanSectMap or (not verify_sec_struct(data, chan_ncs_sections)): chan_ncs_sections = NcsSectionsFactory.build_for_ncs_file( data, nlxHeader, strict_gap_mode=self.strict_gap_mode ) # register file section structure for all contained channels for chan_uid in zip(nlxHeader["channel_names"], np.asarray(nlxHeader["channel_ids"], dtype=str)): chanSectMap[chan_uid] = [chan_ncs_sections, nlxHeader, ncs_filename] del data # Construct an inverse dictionary from NcsSections to list of associated chan_uids revSectMap = dict() for k, v in chanSectMap.items(): revSectMap.setdefault(v[0], []).append(k) # If there is only one NcsSections structure in the set of ncs files, there should only # be one entry. Otherwise this is presently unsupported. if len(revSectMap) > 1: raise IOError( f"ncs files have {len(revSectMap)} different sections " f"structures. Unsupported configuration to be handled with in a single " f"stream." ) seg_time_limits = SegmentTimeLimits( nb_segment=len(chan_ncs_sections.sects), t_start=[], t_stop=[], length=[], timestamp_limits=[] ) memmaps = [{} for seg_index in range(seg_time_limits.nb_segment)] # create segment with subdata block/t_start/t_stop/length for each channel for i, chan_uid in enumerate(chanSectMap.keys()): data = self._get_file_map(chanSectMap[chan_uid][2]) # create a memmap for each record section of the current file curSects = chanSectMap[chan_uid][0] for seg_index in range(len(curSects.sects)): curSect = curSects.sects[seg_index] subdata = data[curSect.startRec : (curSect.endRec + 1)] memmaps[seg_index][chan_uid] = subdata # create segment timestamp limits based on only NcsSections structure in use if i == 0: numSampsLastSect = subdata[-1]["nb_valid"] ts0 = subdata[0]["timestamp"] ts1 = NcsSectionsFactory.calc_sample_time( curSects.sampFreqUsed, subdata[-1]["timestamp"], numSampsLastSect ) seg_time_limits.timestamp_limits.append((ts0, ts1)) t_start = ts0 / 1e6 seg_time_limits.t_start.append(t_start) t_stop = ts1 / 1e6 seg_time_limits.t_stop.append(t_stop) # :NOTE: This should really be the total of nb_valid in records, but this # allows the last record of a section to be shorter, the most common case. # Have never seen a section of records with not full records before the last. length = (subdata.size - 1) * NcsSection._RECORD_SIZE + numSampsLastSect seg_time_limits.length.append(length) stream_section_structure = list(revSectMap.keys())[0] return memmaps, seg_time_limits, stream_section_structure # time limits for set of segments SegmentTimeLimits = namedtuple("SegmentTimeLimits", ["nb_segment", "t_start", "t_stop", "length", "timestamp_limits"]) nev_dtype = [ ("reserved", "\S+)" r" At Time: (?P